diff --git a/LICENSE b/LICENSE
--- a/LICENSE
+++ b/LICENSE
@@ -1,4 +1,4 @@
-Copyright (c) 2013-2015 Galois Inc.
+Copyright (c) 2013-2016 Galois Inc.
 All rights reserved.
 
 Redistribution and use in source and binary forms, with or without
diff --git a/LICENSE.rtf b/LICENSE.rtf
deleted file mode 100644
--- a/LICENSE.rtf
+++ /dev/null
@@ -1,37 +0,0 @@
-{\rtf1\ansi\ansicpg1252\cocoartf1265\cocoasubrtf190
-{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\margl1440\margr1440\vieww12600\viewh7800\viewkind0
-\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural
-
-\f0\fs24 \cf0 Copyright (c) 2013-2015 Galois Inc.\
-All rights reserved.\
-\
-Redistribution and use in source and binary forms, with or without\
-modification, are permitted provided that the following conditions\
-are met:\
-\
-  * Redistributions of source code must retain the above copyright\
-    notice, this list of conditions and the following disclaimer.\
-\
-  * Redistributions in binary form must reproduce the above copyright\
-    notice, this list of conditions and the following disclaimer in\
-    the documentation and/or other materials provided with the\
-    distribution.\
-\
-  * Neither the name of Galois, Inc. nor the names of its contributors\
-    may be used to endorse or promote products derived from this\
-    software without specific prior written permission.\
-\
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS\
-IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED\
-TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A\
-PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER\
-OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\
-EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\
-PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\
-PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\
-LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\
-NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\
-}
diff --git a/Setup.hs b/Setup.hs
--- a/Setup.hs
+++ b/Setup.hs
@@ -1,6 +1,6 @@
 -- |
 -- Module      :  $Header$
--- Copyright   :  (c) 2013-2015 Galois, Inc.
+-- Copyright   :  (c) 2013-2016 Galois, Inc.
 -- License     :  BSD3
 -- Maintainer  :  cryptol@galois.com
 -- Stability   :  provisional
diff --git a/bench/Main.hs b/bench/Main.hs
new file mode 100644
--- /dev/null
+++ b/bench/Main.hs
@@ -0,0 +1,135 @@
+-- |
+-- Module      :  $Header$
+-- Copyright   :  (c) 2015-2016 Galois, Inc.
+-- License     :  BSD3
+-- Maintainer  :  cryptol@galois.com
+-- Stability   :  provisional
+-- Portability :  portable
+
+{-# LANGUAGE OverloadedStrings #-}
+module Main where
+
+import qualified Data.Text.Lazy     as T
+import qualified Data.Text.Lazy.IO  as T
+
+import qualified Cryptol.ModuleSystem.Base      as M
+import qualified Cryptol.ModuleSystem.Env       as M
+import qualified Cryptol.ModuleSystem.Monad     as M
+import qualified Cryptol.ModuleSystem.NamingEnv as M
+
+import qualified Cryptol.Parser           as P
+import qualified Cryptol.Parser.AST       as P
+import qualified Cryptol.Parser.NoInclude as P
+
+import qualified Cryptol.Symbolic as S
+
+import qualified Cryptol.TypeCheck     as T
+import qualified Cryptol.TypeCheck.AST as T
+
+import qualified Cryptol.Utils.Ident as I
+
+import Criterion.Main
+
+main :: IO ()
+main = defaultMain [
+    bgroup "parser" [
+        parser "Prelude" "lib/Cryptol.cry"
+      , parser "BigSequence" "bench/data/BigSequence.cry"
+      , parser "BigSequenceHex" "bench/data/BigSequenceHex.cry"
+      , parser "AES" "bench/data/AES.cry"
+      , parser "SHA512" "bench/data/SHA512.cry"
+      ]
+  , bgroup "typechecker" [
+        tc "Prelude" "lib/Cryptol.cry"
+      , tc "BigSequence" "bench/data/BigSequence.cry"
+      , tc "BigSequenceHex" "bench/data/BigSequenceHex.cry"
+      , tc "AES" "bench/data/AES.cry"
+      , tc "SHA512" "bench/data/SHA512.cry"
+      ]
+  , bgroup "conc_eval" [
+        ceval "AES" "bench/data/AES.cry" "bench bench_data"
+      , ceval "SHA512" "bench/data/SHA512.cry" "testVector1 ()"
+      ]
+  , bgroup "sym_eval" [
+        seval "AES" "bench/data/AES.cry" "aesEncrypt (zero, zero)"
+      , seval "ZUC" "bench/data/ZUC.cry"
+          "ZUC_isResistantToCollisionAttack"
+      , seval "SHA512" "bench/data/SHA512.cry" "testVector1 ()"
+      ]
+  ]
+
+-- | Make a benchmark for parsing a Cryptol module
+parser :: String -> FilePath -> Benchmark
+parser name path =
+  env (T.readFile path) $ \(~bytes) ->
+    bench name $ nfIO $ do
+      let cfg = P.defaultConfig
+                { P.cfgSource  = path
+                , P.cfgPreProc = P.guessPreProc path
+                }
+      case P.parseModule cfg bytes of
+        Right pm -> return pm
+        Left err -> error (show err)
+
+-- | Make a benchmark for typechecking a Cryptol module. Does parsing
+-- in the setup phase in order to isolate typechecking
+tc :: String -> FilePath -> Benchmark
+tc name path =
+  let setup = do
+        bytes <- T.readFile path
+        let cfg = P.defaultConfig
+                { P.cfgSource  = path
+                , P.cfgPreProc = P.guessPreProc path
+                }
+            Right pm = P.parseModule cfg bytes
+        menv <- M.initialModuleEnv
+        (Right ((prims, scm, tcEnv), menv'), _) <- M.runModuleM menv $ do
+          -- code from `loadModule` and `checkModule` in
+          -- `Cryptol.ModuleSystem.Base`
+          let pm' = M.addPrelude pm
+          M.loadDeps pm'
+          Right nim <- M.io (P.removeIncludesModule path pm')
+          npm <- M.noPat nim
+          (tcEnv,declsEnv,scm) <- M.renameModule npm
+          prims <- if P.thing (P.mName pm) == I.preludeName
+                   then return (M.toPrimMap declsEnv)
+                   else M.getPrimMap
+          return (prims, scm, tcEnv)
+        return (prims, scm, tcEnv, menv')
+  in env setup $ \ ~(prims, scm, tcEnv, menv) ->
+    bench name $ nfIO $ M.runModuleM menv $ do
+      let act = M.TCAction { M.tcAction = T.tcModule
+                           , M.tcLinter = M.moduleLinter (P.thing (P.mName scm))
+                           , M.tcPrims  = prims
+                           }
+      M.typecheck act scm tcEnv
+
+ceval :: String -> FilePath -> T.Text -> Benchmark
+ceval name path expr =
+  let setup = do
+        menv <- M.initialModuleEnv
+        (Right (texpr, menv'), _) <- M.runModuleM menv $ do
+          m <- M.loadModuleByPath path
+          M.setFocusedModule (T.mName m)
+          let Right pexpr = P.parseExpr expr
+          (_, texpr, _) <- M.checkExpr pexpr
+          return texpr
+        return (texpr, menv')
+  in env setup $ \ ~(texpr, menv) ->
+    bench name $ nfIO $ M.runModuleM menv $ M.evalExpr texpr
+
+seval :: String -> FilePath -> T.Text -> Benchmark
+seval name path expr =
+  let setup = do
+        menv <- M.initialModuleEnv
+        (Right (texpr, menv'), _) <- M.runModuleM menv $ do
+          m <- M.loadModuleByPath path
+          M.setFocusedModule (T.mName m)
+          let Right pexpr = P.parseExpr expr
+          (_, texpr, _) <- M.checkExpr pexpr
+          return texpr
+        return (texpr, menv')
+  in env setup $ \ ~(texpr, menv) ->
+    bench name $ flip nf texpr $ \texpr' ->
+      let senv = S.evalDecls mempty (S.allDeclGroups menv)
+      in S.evalExpr senv texpr'
diff --git a/cryptol-server/Cryptol/Aeson.hs b/cryptol-server/Cryptol/Aeson.hs
new file mode 100644
--- /dev/null
+++ b/cryptol-server/Cryptol/Aeson.hs
@@ -0,0 +1,173 @@
+-- |
+-- Module      :  $Header$
+-- Copyright   :  (c) 2015-2016 Galois, Inc.
+-- License     :  BSD3
+-- Maintainer  :  cryptol@galois.com
+-- Stability   :  provisional
+-- Portability :  portable
+-- 
+-- Orphan 'FromJSON' and 'ToJSON' instances for certain Cryptol
+-- types. Since these are meant to be consumed over a wire, they are
+-- mostly focused on base values and interfaces rather than a full
+-- serialization of internal ASTs and such.
+
+{-# LANGUAGE ExtendedDefaultRules #-}
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# OPTIONS_GHC -Wall -fno-warn-orphans -fno-warn-type-defaults #-}
+module Cryptol.Aeson where
+
+import Control.Applicative
+import Control.Exception
+import Data.Aeson
+import Data.Aeson.TH
+import qualified Data.Text as T
+
+import qualified Cryptol.Eval.Error as E
+import qualified Cryptol.Eval.Value as E
+import qualified Cryptol.ModuleSystem as M
+import qualified Cryptol.ModuleSystem.Monad as M
+import qualified Cryptol.ModuleSystem.Renamer as M
+import Cryptol.ModuleSystem.Interface
+import Cryptol.ModuleSystem.Name
+import qualified Cryptol.Parser as P
+import qualified Cryptol.Parser.AST as P
+import qualified Cryptol.Parser.Lexer as P
+import qualified Cryptol.Parser.NoInclude as P
+import qualified Cryptol.Parser.NoPat as NoPat
+import qualified Cryptol.Parser.Position as P
+import Cryptol.REPL.Monad
+import qualified Cryptol.Testing.Concrete as Test
+import qualified Cryptol.TypeCheck.AST as T
+import qualified Cryptol.TypeCheck.InferTypes as T
+import Cryptol.Utils.PP hiding (empty)
+
+instance ToJSON Doc where
+  toJSON = String . T.pack . render
+
+instance ToJSON E.Value where
+  toJSON = \case
+    E.VRecord fs -> object
+      [ "record" .= fs ]
+    E.VTuple vs -> object
+      [ "tuple" .= vs ]
+    E.VBit b -> object
+      [ "bit" .= b ]
+    E.VSeq isWord xs -> object
+      [ "sequence" .= object [ "isWord" .= isWord, "elements" .= xs ] ]
+    E.VWord w -> object
+      [ "word" .= w ]
+    E.VStream _ -> object
+      [ "stream" .= object [ "@note" .= "streams not supported" ] ]
+    E.VFun _ -> object
+      [ "function" .= object [ "@note" .= "functions not supported" ] ]
+    E.VPoly _ -> object
+      [ "poly" .= object [ "@note" .= "polymorphic values not supported" ] ]
+
+instance FromJSON E.Value where
+  parseJSON = withObject "Value" $ \o ->
+        E.VRecord <$> o .: "record"
+    <|> E.VTuple <$> o .: "tuple"
+    <|> E.VBit <$> o .: "bit"
+    <|> do s <- o .: "sequence"
+           E.VSeq <$> s .: "isWord" <*> s .: "elements"
+    <|> E.VWord <$> o .: "word"
+    <|> error ("unexpected JSON value: " ++ show o)
+
+instance ToJSON P.Token where
+  toJSON = toJSON . pp
+
+instance ToJSON REPLException where
+  toJSON = \case
+    ParseError pe -> object
+      [ "ParseError" .= pe ]
+    FileNotFound fp -> object
+      [ "FileNotFound" .= fp ]
+    DirectoryNotFound fp -> object
+      [ "DirectoryNotFound" .= fp ]
+    NoPatError npe -> object
+      [ "NoPatError" .= npe ]
+    NoIncludeError nie -> object
+      [ "NoIncludeError" .= nie ]
+    EvalError ee -> object
+      [ "EvalError" .= ee ]
+    ModuleSystemError _nameDisp me -> object
+      [ "ModuleSystemError" .= me ]
+    EvalPolyError sch -> object
+      [ "EvalPolyError" .= sch ]
+    TypeNotTestable ty -> object
+      [ "TypeNotTestable" .= ty ]
+
+instance ToJSON IOException where
+  toJSON exn = object
+    [ "IOException" .= show exn ]
+
+instance ToJSON M.RenamerError where
+  toJSON err = object
+    [ "renamerError" .= pp err ]
+
+instance ToJSON T.Error where
+  toJSON err = object
+    [ "inferError" .= pp err ]
+
+instance ToJSON E.BV where
+  toJSON = \case
+    E.BV w v -> object
+      [ "bitvector" .= object [ "width" .= w, "value" .= v ] ]
+
+instance FromJSON E.BV where
+  parseJSON = withObject "BV" $ \o -> do
+    bv <- o .: "bitvector"
+    E.BV <$> bv .: "width" <*> bv .: "value"
+
+instance ToJSON Test.TestResult where
+  toJSON = \case
+    Test.Pass -> object [ "Pass" .= Null ]
+    Test.FailFalse args -> object [ "FailFalse" .= args ]
+    Test.FailError err args -> object
+      [ "FailError" .= show (pp err), "args" .= args ]
+
+$(deriveJSON defaultOptions { sumEncoding = ObjectWithSingleField } ''NameInfo)
+$(deriveToJSON defaultOptions { sumEncoding = ObjectWithSingleField } ''E.EvalError)
+$(deriveToJSON defaultOptions { sumEncoding = ObjectWithSingleField } ''P.ParseError)
+$(deriveJSON defaultOptions { sumEncoding = ObjectWithSingleField } ''P.Position)
+$(deriveToJSON defaultOptions { sumEncoding = ObjectWithSingleField } ''P.Located)
+$(deriveToJSON defaultOptions { sumEncoding = ObjectWithSingleField } ''P.IncludeError)
+$(deriveToJSON defaultOptions { sumEncoding = ObjectWithSingleField } ''P.Schema)
+$(deriveToJSON defaultOptions { sumEncoding = ObjectWithSingleField } ''P.Type)
+$(deriveToJSON defaultOptions { sumEncoding = ObjectWithSingleField } ''P.TParam)
+$(deriveToJSON defaultOptions { sumEncoding = ObjectWithSingleField } ''P.Prop)
+$(deriveToJSON defaultOptions { sumEncoding = ObjectWithSingleField } ''P.Named)
+$(deriveToJSON defaultOptions { sumEncoding = ObjectWithSingleField } ''P.Kind)
+$(deriveToJSON defaultOptions { sumEncoding = ObjectWithSingleField } ''NoPat.Error)
+$(deriveToJSON defaultOptions { sumEncoding = ObjectWithSingleField } ''M.ModuleError)
+$(deriveToJSON defaultOptions { sumEncoding = ObjectWithSingleField } ''M.ImportSource)
+$(deriveToJSON defaultOptions { sumEncoding = ObjectWithSingleField } ''T.Import)
+$(deriveToJSON defaultOptions { sumEncoding = ObjectWithSingleField } ''T.ImportSpec)
+$(deriveToJSON defaultOptions { sumEncoding = ObjectWithSingleField } ''T.Type)
+$(deriveToJSON defaultOptions { sumEncoding = ObjectWithSingleField } ''T.TParam)
+$(deriveToJSON defaultOptions { sumEncoding = ObjectWithSingleField } ''T.Kind)
+$(deriveToJSON defaultOptions { sumEncoding = ObjectWithSingleField } ''T.TVar)
+$(deriveToJSON defaultOptions { sumEncoding = ObjectWithSingleField } ''T.TCon)
+$(deriveToJSON defaultOptions { sumEncoding = ObjectWithSingleField } ''T.PC)
+$(deriveToJSON defaultOptions { sumEncoding = ObjectWithSingleField } ''T.TC)
+$(deriveToJSON defaultOptions { sumEncoding = ObjectWithSingleField } ''T.UserTC)
+$(deriveToJSON defaultOptions { sumEncoding = ObjectWithSingleField } ''T.Schema)
+$(deriveToJSON defaultOptions { sumEncoding = ObjectWithSingleField } ''T.TFun)
+$(deriveToJSON defaultOptions { sumEncoding = ObjectWithSingleField } ''T.Selector)
+$(deriveToJSON defaultOptions { sumEncoding = ObjectWithSingleField } { fieldLabelModifier = drop 1 } ''T.Fixity)
+$(deriveToJSON defaultOptions { sumEncoding = ObjectWithSingleField } ''T.Pragma)
+$(deriveToJSON defaultOptions { sumEncoding = ObjectWithSingleField } ''Assoc)
+$(deriveJSON defaultOptions { sumEncoding = ObjectWithSingleField } ''Name)
+$(deriveToJSON defaultOptions { sumEncoding = ObjectWithSingleField } ''IfaceDecl)
+$(deriveToJSON defaultOptions { sumEncoding = ObjectWithSingleField } ''T.Newtype)
+$(deriveToJSON defaultOptions { sumEncoding = ObjectWithSingleField } ''T.TySyn)
+$(deriveToJSON defaultOptions { sumEncoding = ObjectWithSingleField } ''IfaceDecls)
+$(deriveToJSON defaultOptions { sumEncoding = ObjectWithSingleField } ''Iface)
+$(deriveJSON defaultOptions { sumEncoding = ObjectWithSingleField } ''P.Ident)
+$(deriveJSON defaultOptions { sumEncoding = ObjectWithSingleField } ''P.Range)
+$(deriveToJSON defaultOptions { sumEncoding = ObjectWithSingleField } ''P.PName)
+$(deriveToJSON defaultOptions { sumEncoding = ObjectWithSingleField } ''P.Pass)
+$(deriveToJSON defaultOptions { sumEncoding = ObjectWithSingleField } ''Test.TestReport)
diff --git a/cryptol-server/Main.hs b/cryptol-server/Main.hs
new file mode 100644
--- /dev/null
+++ b/cryptol-server/Main.hs
@@ -0,0 +1,386 @@
+-- |
+-- Module      :  $Header$
+-- Copyright   :  (c) 2015-2016 Galois, Inc.
+-- License     :  BSD3
+-- Maintainer  :  cryptol@galois.com
+-- Stability   :  provisional
+-- Portability :  portable
+--
+-- Alpha version of a Cryptol server that communicates via JSON over
+-- ZeroMQ. This API is highly unstable and extremely likely to change
+-- in the near future.
+
+{-# LANGUAGE CPP #-}
+{-# LANGUAGE ExtendedDefaultRules #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# OPTIONS_GHC -Wall -fno-warn-type-defaults #-}
+module Main where
+
+import Control.Concurrent
+import Control.Monad
+import Control.Monad.IO.Class
+import Control.Monad.Trans.Control
+import qualified Control.Exception as X
+import Data.Aeson
+import Data.Aeson.Encode.Pretty
+import qualified Data.ByteString.Char8 as BS
+import qualified Data.ByteString.Lazy.Char8 as BSL
+import Data.Char
+import Data.IORef
+import Data.Map (Map)
+import qualified Data.Map as Map
+import Data.Text (Text)
+import qualified Data.Text as T
+import Data.Word
+import Options.Applicative
+import System.Environment
+import System.Exit
+import System.FilePath
+import System.Posix.Signals
+import System.ZMQ4
+import Text.Read
+
+import qualified Cryptol.Eval.Value as E
+import Cryptol.REPL.Command
+import Cryptol.REPL.Monad
+import Cryptol.Symbolic (ProverResult(..))
+import qualified Cryptol.Testing.Concrete as Test
+import qualified Cryptol.TypeCheck.AST as T
+import qualified Cryptol.ModuleSystem as M
+import Cryptol.Utils.PP hiding ((<>))
+
+import Cryptol.Aeson ()
+
+import Prelude ()
+import Prelude.Compat
+
+data RCommand
+  = RCEvalExpr Text
+  | RCApplyFun FunHandle E.Value
+  | RCTypeOf Text
+  | RCSetOpt Text Text
+  | RCCheck Text
+  | RCExhaust Text
+  | RCProve Text
+  | RCSat Text
+  | RCLoadPrelude
+  | RCLoadModule FilePath
+  | RCDecls
+  | RCUnknownCmd Text
+  | RCExit
+
+instance FromJSON RCommand where
+  parseJSON = withObject "RCommand" $ \o -> do
+    tag <- o .: "tag"
+    flip (withText "tag") tag $ \case
+      "evalExpr"    -> RCEvalExpr              <$> o .: "expr"
+      "applyFun"    -> RCApplyFun              <$> o .: "handle" <*> o .: "arg"
+      "typeOf"      -> RCTypeOf                <$> o .: "expr"
+      "setOpt"      -> RCSetOpt                <$> o .: "key" <*> o .: "value"
+      "check"       -> RCCheck                 <$> o .: "expr"
+      "exhaust"     -> RCExhaust               <$> o .: "expr"
+      "prove"       -> RCProve                 <$> o .: "expr"
+      "sat"         -> RCSat                   <$> o .: "expr"
+      "loadPrelude" -> return RCLoadPrelude
+      "loadModule"  -> RCLoadModule . T.unpack <$> o .: "filePath"
+      "browse"      -> return RCDecls
+      "exit"        -> return RCExit
+      unknown       -> return (RCUnknownCmd unknown)
+
+newtype FunHandle = FH Int
+  deriving (Eq, Ord, Enum, Bounded, Show)
+
+instance ToJSON FunHandle where
+  toJSON (FH i) = toJSON i
+
+instance FromJSON FunHandle where
+  parseJSON v = FH <$> parseJSON v
+
+data RResult
+  = RRValue E.Value
+  | RRFunValue FunHandle T.Type
+  | RRType T.Schema String -- pretty-printed type
+  | RRDecls M.IfaceDecls
+  | RRCheck [Test.TestReport]
+  | RRExhaust [Test.TestReport]
+  | RRSat [[E.Value]]
+    -- ^ A list of satisfying assignments. Empty list means unsat, max
+    -- length determined by @satNum@ interpreter option
+  | RRProve (Maybe [E.Value])
+    -- ^ Counterexample if invalid or 'Nothing' if valid
+  | RRProverError String
+  | RRInteractiveError REPLException String -- pretty-printed exception
+  | RRUnknownCmd Text
+  | RRBadMessage BS.ByteString String
+  | RROk
+  | RRInterrupted
+
+instance ToJSON RResult where
+  toJSON = \case
+    RRValue v -> object
+      [ "tag" .= "value", "value" .= v ]
+    RRFunValue fh t -> object
+      [ "tag" .= "funValue", "handle" .= fh, "type" .= t ]
+    RRType s pps -> object
+      [ "tag" .= "type", "value" .= s, "pp" .= pps ]
+    RRDecls ifds -> object
+      [ "tag" .= "decls", "decls" .= ifds ]
+    RRCheck out -> object
+      [ "tag" .= "check", "testReport" .= out ]
+    RRExhaust out -> object
+      [ "tag" .= "exhaust", "testReport" .= out ]
+    RRSat out -> object
+      [ "tag" .= "sat", "assignments" .= out ]
+    RRProve out -> object
+      [ "tag" .= "prove", "counterexample" .= out ]
+    RRProverError msg -> object
+      [ "tag" .= "proverError", "message" .= msg ]
+    RRInteractiveError err pps -> object
+      [ "tag" .= "interactiveError", "error" .= err, "pp" .= pps ]
+    RRUnknownCmd txt -> object
+      [ "tag" .= "unknownCommand", "command" .= txt ]
+    RRBadMessage msg err -> object
+      [ "tag" .= "badMessage", "message" .= BS.unpack msg, "error" .= err ]
+    RROk -> object
+      [ "tag" .= "ok" ]
+    RRInterrupted -> object
+      [ "tag" .= "interrupted" ]
+
+data ControlMsg
+  = CMConnect
+    -- ^ Request a new Cryptol context and connection
+  | CMInterrupt Word16
+    -- ^ Request an interrupt of all current Cryptol contexts
+  | CMExit
+    -- ^ Request that the entire server shut down
+  | CMUnknown Text
+    -- ^ Unknown message
+
+instance FromJSON ControlMsg where
+  parseJSON = withObject "ControlMsg" $ \o -> do
+    tag <- o .: "tag"
+    flip (withText "tag") tag $ \case
+      "connect" -> return CMConnect
+      "interrupt" -> CMInterrupt <$> o .: "port"
+      "exit" -> return CMExit
+      other -> return $ CMUnknown other
+
+data ControlReply
+  = CRConnect Word16
+    -- ^ Return the port for a new connection
+  | CRInterrupted
+    -- ^ Acknowledge receipt of an interrupt command
+  | CRExiting
+    -- ^ Acknowledge receipt of an exit command
+  | CRBadMessage BS.ByteString String
+    -- ^ Acknowledge receipt of an ill-formed control message
+
+instance ToJSON ControlReply where
+  toJSON = \case
+    CRConnect port -> object
+      [ "tag" .= "connect", "port" .= port ]
+    CRInterrupted -> object
+      [ "tag" .= "interrupted" ]
+    CRExiting -> object
+      [ "tag" .= "exiting" ]
+    CRBadMessage msg err -> object
+      [ "tag" .= "badMessage", "message" .= BS.unpack msg, "error" .= err ]
+
+server :: Word16 -> IO ()
+server port =
+  withContext $ \ctx ->
+  withSocket ctx Rep $ \rep -> do
+  let addr = "tcp://127.0.0.1:" ++ show port
+  putStrLn ("[cryptol-server] coming online at " ++ addr)
+  bind rep addr
+  workers <- newIORef Map.empty
+  let loop = do
+        msg <- receive rep
+        putStrLn "[cryptol-server] received message:"
+        case decodeStrict msg of
+          Nothing -> BS.putStrLn msg
+          Just js -> BSL.putStrLn (encodePretty (js :: Value))
+        case eitherDecodeStrict msg of
+          Left err -> reply rep $ CRBadMessage msg err
+          Right CMConnect -> do
+            putStrLn "[cryptol-server] handling new incoming connection"
+            newRep <- socket ctx Rep
+            bind newRep "tcp://127.0.0.1:*"
+            newAddr <- lastEndpoint newRep
+            let portStr = reverse . takeWhile isDigit . reverse $ newAddr
+                workerPort = read portStr
+            putStrLn ("[cryptol-server] starting worker on interface " ++ newAddr)
+            tid <- forkFinally (runRepl newRep) (removeWorker workers port)
+            addNewWorker workers workerPort tid
+            reply rep $ CRConnect workerPort
+          Right (CMInterrupt port') -> do
+            s <- readIORef workers
+            case Map.lookup port' s of
+              Nothing -> reply rep $ CRBadMessage msg "invalid worker port"
+              Just tid -> do
+                throwTo tid X.UserInterrupt
+                reply rep $ CRInterrupted
+          Right CMExit -> do
+            putStrLn "[cryptol-server] shutting down"
+            reply rep $ CRExiting
+            exitSuccess
+          Right (CMUnknown cmd) -> do
+            putStrLn ("[cryptol-server] unknown control command: " ++ T.unpack cmd)
+            reply rep $ CRBadMessage msg "unknown control command"
+        loop
+  loop
+
+reply :: (ToJSON a, MonadIO m) => Socket Rep -> a -> m ()
+reply rep msg = liftIO $ do
+  let bmsg = BS.concat . BSL.toChunks . encodePretty $ msg
+  putStrLn "[cryptol-server] sending response:"
+  BS.putStrLn bmsg
+  send rep [] bmsg
+
+addNewWorker :: IORef (Map Word16 ThreadId) -> Word16 -> ThreadId -> IO ()
+addNewWorker workers port tid =
+  atomicModifyIORef workers $ \s -> (Map.insert port tid s, ())
+
+removeWorker :: IORef (Map Word16 ThreadId) -> Word16 -> a -> IO ()
+removeWorker workers port _result =
+  atomicModifyIORef workers $ \s -> (Map.delete port s, ())
+
+runRepl :: Socket Rep -> IO ()
+runRepl rep = runREPL False $ do -- TODO: batch mode?
+  mCryptolPath <- io $ lookupEnv "CRYPTOLPATH"
+  case mCryptolPath of
+    Nothing -> return ()
+    Just path -> prependSearchPath path'
+#if defined(mingw32_HOST_OS) || defined(__MINGW32__)
+      -- Windows paths search from end to beginning
+      where path' = reverse (splitSearchPath path)
+#else
+      where path' = splitSearchPath path
+#endif
+  funHandles <- io $ newIORef (Map.empty, minBound :: FunHandle)
+  let handle err = reply rep (RRInteractiveError err (show (pp err)))
+      handleAsync :: X.AsyncException -> IO ()
+      handleAsync _int = reply rep RRInterrupted
+      loop = liftBaseWith $ \run -> X.handle handleAsync $ run $ do
+        msg <- io $ receive rep
+        io $ putStrLn "[cryptol-worker] received message:"
+        case decodeStrict msg of
+          Nothing -> io $ BS.putStrLn msg
+          Just js -> io $ BSL.putStrLn (encodePretty (js :: Value))
+        flip catch handle $ case eitherDecodeStrict msg of
+          Left cmdErr -> reply rep (RRBadMessage msg cmdErr)
+          Right rc -> case rc of
+            RCEvalExpr txt -> do
+              expr <- replParseExpr (T.unpack txt)
+              (val, ty) <- replEvalExpr expr
+              case val of
+                E.VFun f -> do
+                  fh <- io $ atomicModifyIORef' funHandles $ \(m, fh) ->
+                    let m' = Map.insert fh f m
+                        fh' = succ fh
+                    in ((m', fh'), fh)
+                  reply rep (RRFunValue fh ty)
+                _ -> reply rep (RRValue val)
+            RCApplyFun fh arg -> do
+              (m, _) <- io $ readIORef funHandles
+              case Map.lookup fh m of
+                Nothing -> reply rep (RRBadMessage "invalid function handle" (show fh))
+                Just f -> do
+                  case f arg of
+                    E.VFun g -> do
+                      gh <- io $ atomicModifyIORef' funHandles $ \(m', gh) ->
+                        let m'' = Map.insert gh g m'
+                            gh' = succ gh
+                        in ((m'', gh'), gh)
+                      -- TODO: bookkeeping to track the type of this value
+                      reply rep (RRFunValue gh T.tZero)
+                    val -> reply rep (RRValue val)
+            RCTypeOf txt -> do
+              expr <- replParseExpr (T.unpack txt)
+              (_expr, _def, sch) <- replCheckExpr expr
+              reply rep (RRType sch (show (pp sch)))
+            RCSetOpt key val -> do
+              setOptionCmd (T.unpack key ++ "=" ++ T.unpack val)
+              reply rep RROk
+            RCCheck expr -> do
+              reports <- qcCmd QCRandom (T.unpack expr)
+              reply rep (RRCheck reports)
+            RCExhaust expr -> do
+              reports <- qcCmd QCExhaust (T.unpack expr)
+              reply rep (RRExhaust reports)
+            RCProve expr -> do
+              result <- onlineProveSat False (T.unpack expr) Nothing
+              case result of
+                AllSatResult [cex] ->
+                  reply rep (RRProve (Just (map (\(_,_,v) -> v) cex)))
+                ThmResult _ ->
+                  reply rep (RRProve Nothing)
+                ProverError err ->
+                  reply rep (RRProverError err)
+                _ ->
+                  reply rep (RRProverError "unexpected prover result")
+            RCSat expr ->  do
+              result <- onlineProveSat True (T.unpack expr) Nothing
+              case result of
+                AllSatResult sas ->
+                  reply rep (RRSat (map (map (\(_,_,v) -> v)) sas))
+                ThmResult _ ->
+                  reply rep (RRSat [])
+                ProverError err ->
+                  reply rep (RRProverError err)
+                _ ->
+                  reply rep (RRProverError "unexpected prover result")
+            RCLoadPrelude -> do
+              loadPrelude
+              reply rep RROk
+            RCLoadModule fp -> do
+              loadCmd fp
+              reply rep RROk
+            RCDecls -> do
+              (decls, _namingEnv, _nameDisp) <- getFocusedEnv
+              reply rep (RRDecls decls)
+            RCUnknownCmd cmd -> reply rep (RRUnknownCmd cmd)
+            RCExit -> do
+              reply rep RROk
+              io $ close rep
+              io $ putStrLn "[cryptol-worker] shutting down"
+  void $ forever loop
+
+withCapturedOutput :: REPL a -> REPL (a, String)
+withCapturedOutput m = do
+  old <- getPutStr
+  buf <- io $ newIORef ""
+  setPutStr $ \s -> modifyIORef' buf (++ s)
+  x <- m
+  s <- io $ readIORef buf
+  setPutStr old
+  return (x, s)
+
+data Server = Server { serverPort :: Word16
+                     , serverMaskSIGINT :: Bool }
+  deriving Show
+
+main :: IO ()
+main = execParser opts >>= mainWith
+  where
+    opts =
+      info (helper <*> serverOpts)
+           ( fullDesc
+          <> progDesc "Run Cryptol as a server via ZeroMQ and JSON"
+          <> header "cryptol-server" )
+    serverOpts =
+      Server
+      <$> option auto
+         ( long "port"
+        <> short 'p'
+        <> metavar "PORT"
+        <> value 5555
+        <> help "TCP port to bind" )
+      <*> switch
+         ( long "mask-interrupts"
+        <> help "Suppress interrupt signals" )
+    mainWith Server {..} = do
+      when serverMaskSIGINT $ void $ installHandler sigINT Ignore Nothing
+      server serverPort
diff --git a/cryptol.cabal b/cryptol.cabal
--- a/cryptol.cabal
+++ b/cryptol.cabal
@@ -1,19 +1,19 @@
 Name:                cryptol
-Version:             2.2.6
+Version:             2.3.0
 Synopsis:            Cryptol: The Language of Cryptography
 Description: Cryptol is a domain-specific language for specifying cryptographic algorithms. A Cryptol implementation of an algorithm resembles its mathematical specification more closely than an implementation in a general purpose language. For more, see <http://www.cryptol.net/>.
 License:             BSD3
-License-files:       LICENSE, LICENSE.rtf
+License-file:        LICENSE
 Author:              Galois, Inc.
 Maintainer:          cryptol@galois.com
 Homepage:            http://www.cryptol.net/
 Bug-reports:         https://github.com/GaloisInc/cryptol/issues
-Copyright:           2013-2015 Galois Inc.
+Copyright:           2013-2016 Galois Inc.
 Category:            Language
 Build-type:          Simple
-Cabal-version:       >= 1.20
+Cabal-version:       >= 1.18
 
-data-files:          *.cry
+data-files:          *.cry Cryptol/*.cry
 data-dir:            lib
 
 source-repository head
@@ -23,7 +23,7 @@
 source-repository this
   type:     git
   location: https://github.com/GaloisInc/cryptol.git
-  tag:      v2.2.6
+  tag:      v2.3.0
 
 flag static
   default: False
@@ -33,60 +33,68 @@
   default: True
   description: Don't use the Cabal-provided data directory for looking up Cryptol libraries. This is useful when the data directory can't be known ahead of time, like for a relocatable distribution.
 
-flag self-contained
-  default: True
-  description: Compile the text of the Cryptol Prelude into the library
+flag server
+  default: False
+  description: Build with the ZeroMQ/JSON cryptol-server executable
 
 library
   Default-language:
     Haskell98
-  Build-depends:       base            >= 4.7 && < 5,
-                       base-compat     >= 0.6,
-                       array           >= 0.4,
-                       async           >= 2.0,
-                       containers      >= 0.5,
-                       deepseq         >= 1.3,
-                       directory       >= 1.2,
-                       filepath        >= 1.3,
-                       gitrev          >= 1.0,
-                       GraphSCC        >= 1.0.4,
-                       monadLib        >= 3.7.2,
-                       old-time        >= 1.1,
-                       presburger      >= 1.3,
-                       pretty          >= 1.1,
-                       process         >= 1.2,
-                       QuickCheck      >= 2.7,
-                       random          >= 1.0.1,
-                       sbv             >= 5.7,
-                       smtLib          >= 1.0.7,
-                       syb             >= 0.4,
-                       text            >= 1.1,
+  Build-depends:       base              >= 4.7 && < 5,
+                       base-compat       >= 0.6,
+                       bytestring        >= 0.10,
+                       array             >= 0.4,
+                       async             >= 2.0,
+                       containers        >= 0.5,
+                       deepseq           >= 1.3,
+                       deepseq-generics  >= 0.1 && < 0.2,
+                       directory         >= 1.2,
+                       filepath          >= 1.3,
+                       gitrev            >= 1.0,
+                       generic-trie      >= 0.3.0.1,
+                       GraphSCC          >= 1.0.4,
+                       heredoc           >= 0.2,
+                       monad-control     >= 1.0,
+                       monadLib          >= 3.7.2,
+                       old-time          >= 1.1,
+                       presburger        >= 1.3,
+                       pretty            >= 1.1,
+                       process           >= 1.2,
+                       QuickCheck        >= 2.7,
+                       random            >= 1.0.1,
+                       sbv               >= 5.7,
+                       smtLib            >= 1.0.7,
+                       simple-smt        >= 0.6.0,
+                       syb               >= 0.4,
+                       text              >= 1.1,
                        template-haskell,
-                       tf-random       >= 0.5,
-                       transformers    >= 0.3,
-                       utf8-string     >= 0.3
+                       tf-random         >= 0.5,
+                       transformers      >= 0.3,
+                       transformers-base >= 0.4,
+                       utf8-string       >= 0.3
 
   Build-tools:         alex, happy
   hs-source-dirs:      src
 
   Exposed-modules:     Cryptol.Prims.Syntax,
-                       Cryptol.Prims.Types,
                        Cryptol.Prims.Eval,
-                       Cryptol.Prims.Doc,
 
                        Cryptol.Parser,
                        Cryptol.Parser.Lexer,
                        Cryptol.Parser.AST,
                        Cryptol.Parser.Position,
                        Cryptol.Parser.Names,
+                       Cryptol.Parser.Name,
                        Cryptol.Parser.NoPat,
                        Cryptol.Parser.NoInclude,
                        Cryptol.Parser.Utils,
                        Cryptol.Parser.Unlit,
 
+                       Cryptol.Utils.Ident,
                        Cryptol.Utils.PP,
                        Cryptol.Utils.Panic,
                        Cryptol.Utils.Debug,
+                       Cryptol.Utils.Misc,
                        Cryptol.Version,
 
                        Cryptol.ModuleSystem,
@@ -94,6 +102,7 @@
                        Cryptol.ModuleSystem.Env,
                        Cryptol.ModuleSystem.Interface,
                        Cryptol.ModuleSystem.Monad,
+                       Cryptol.ModuleSystem.Name,
                        Cryptol.ModuleSystem.NamingEnv,
                        Cryptol.ModuleSystem.Renamer,
 
@@ -111,19 +120,26 @@
                        Cryptol.TypeCheck.Solve,
                        Cryptol.TypeCheck.TypeMap,
                        Cryptol.TypeCheck.TypeOf,
-                       Cryptol.TypeCheck.Defaulting,
+                       Cryptol.TypeCheck.Sanity,
 
-                       Cryptol.TypeCheck.Solver.Eval,
-                       Cryptol.TypeCheck.Solver.FinOrd,
                        Cryptol.TypeCheck.Solver.InfNat,
-                       Cryptol.TypeCheck.Solver.Interval,
-                       Cryptol.TypeCheck.Solver.Smtlib,
-                       Cryptol.TypeCheck.Solver.Numeric,
                        Cryptol.TypeCheck.Solver.Class,
                        Cryptol.TypeCheck.Solver.Selector,
-                       Cryptol.TypeCheck.Solver.CrySAT,
                        Cryptol.TypeCheck.Solver.Utils,
+                       Cryptol.TypeCheck.Solver.Simplify,
 
+                       Cryptol.TypeCheck.Solver.CrySAT,
+                       Cryptol.TypeCheck.Solver.Numeric.AST,
+                       Cryptol.TypeCheck.Solver.Numeric.ImportExport,
+                       Cryptol.TypeCheck.Solver.Numeric.Defined,
+                       Cryptol.TypeCheck.Solver.Numeric.Fin,
+                       Cryptol.TypeCheck.Solver.Numeric.Interval,
+                       Cryptol.TypeCheck.Solver.Numeric.Simplify,
+                       Cryptol.TypeCheck.Solver.Numeric.Simplify1,
+                       Cryptol.TypeCheck.Solver.Numeric.SimplifyExpr,
+                       Cryptol.TypeCheck.Solver.Numeric.NonLin,
+                       Cryptol.TypeCheck.Solver.Numeric.SMT,
+
                        Cryptol.Transform.MonoValues,
                        Cryptol.Transform.Specialize,
 
@@ -134,8 +150,7 @@
                        Cryptol.Eval.Type,
                        Cryptol.Eval.Value,
 
-                       Cryptol.Testing.Eval,
-                       Cryptol.Testing.Exhaust,
+                       Cryptol.Testing.Concrete,
                        Cryptol.Testing.Random,
 
                        Cryptol.Symbolic,
@@ -152,17 +167,14 @@
                        Paths_cryptol,
                        GitRev
 
-  default-extensions:  CPP
-  GHC-options:         -Wall -O2
+  GHC-options:         -Wall -O2 -fsimpl-tick-factor=140
+  -- the `fsimpl-tick-factor` is needed to finish optimizing the
+  -- generic trie.
   ghc-prof-options:    -fprof-auto -prof
 
   if flag(relocatable)
       cpp-options: -DRELOCATABLE
 
-  if flag(self-contained)
-    build-depends:     heredoc >= 0.2
-    cpp-options:       -DSELF_CONTAINED
-
 executable cryptol
   Default-language:
     Haskell98
@@ -174,6 +186,7 @@
                        Paths_cryptol
   build-depends:       ansi-terminal
                      , base
+                     , base-compat
                      , containers
                      , cryptol
                      , deepseq
@@ -181,14 +194,58 @@
                      , filepath
                      , haskeline
                      , monadLib
+                     , monad-control
                      , process
                      , random
                      , sbv
                      , tf-random
                      , transformers
-  default-extensions:  CPP
-  GHC-options:         -Wall -O2
+  GHC-options:         -Wall -O2 -threaded -rtsopts -with-rtsopts=-N
   ghc-prof-options:    -auto-all -prof -rtsopts
 
   if os(linux) && flag(static)
       ld-options:      -static -pthread
+
+executable cryptol-server
+  main-is:             Main.hs
+  hs-source-dirs:      cryptol-server
+  other-modules:       Cryptol.Aeson
+  default-language:    Haskell2010
+  default-extensions:  OverloadedStrings
+  GHC-options:         -Wall -O2 -threaded -rtsopts -with-rtsopts=-N
+  ghc-prof-options:    -auto-all -prof -rtsopts
+  if os(linux) && flag(static)
+      ld-options:      -static -pthread
+  if flag(server)
+     build-depends: aeson >= 0.10
+                  , aeson-pretty >= 0.7
+                  , base
+                  , base-compat
+                  , bytestring >= 0.10
+                  , containers
+                  , cryptol
+                  , filepath
+                  , monad-control
+                  , optparse-applicative >= 0.12
+                  , text
+                  , transformers
+                  , unix
+                  , unordered-containers >= 0.2
+                  , zeromq4-haskell >= 0.6
+  else
+      buildable: False
+
+benchmark cryptol-bench
+  type:                exitcode-stdio-1.0
+  main-is:             Main.hs
+  hs-source-dirs:      bench
+  default-language:    Haskell2010
+  GHC-options:         -Wall -O2 -threaded -rtsopts -with-rtsopts=-N
+  ghc-prof-options:    -auto-all -prof -rtsopts
+  if os(linux) && flag(static)
+      ld-options:      -static -pthread
+  build-depends:       base
+                     , criterion
+                     , cryptol
+                     , deepseq
+                     , text
diff --git a/cryptol/Main.hs b/cryptol/Main.hs
--- a/cryptol/Main.hs
+++ b/cryptol/Main.hs
@@ -1,6 +1,6 @@
 -- |
 -- Module      :  $Header$
--- Copyright   :  (c) 2013-2015 Galois, Inc.
+-- Copyright   :  (c) 2013-2016 Galois, Inc.
 -- License     :  BSD3
 -- Maintainer  :  cryptol@galois.com
 -- Stability   :  provisional
@@ -9,7 +9,6 @@
 {-# LANGUAGE CPP #-}
 {-# LANGUAGE GeneralizedNewtypeDeriving #-}
 {-# LANGUAGE OverloadedStrings #-}
-
 module Main where
 
 import OptParser
@@ -34,9 +33,8 @@
 import System.Exit (exitFailure)
 import System.FilePath (searchPathSeparator, splitSearchPath, takeDirectory)
 
-#if __GLASGOW_HASKELL__ < 710
-import Data.Monoid (mconcat)
-#endif
+import Prelude ()
+import Prelude.Compat
 
 data Options = Options
   { optLoad            :: [FilePath]
diff --git a/cryptol/OptParser.hs b/cryptol/OptParser.hs
--- a/cryptol/OptParser.hs
+++ b/cryptol/OptParser.hs
@@ -1,6 +1,6 @@
 -- |
 -- Module      :  $Header$
--- Copyright   :  (c) 2013-2015 Galois, Inc.
+-- Copyright   :  (c) 2013-2016 Galois, Inc.
 -- License     :  BSD3
 -- Maintainer  :  cryptol@galois.com
 -- Stability   :  provisional
@@ -11,9 +11,8 @@
 
 import Data.Monoid (Endo(..))
 
-#if __GLASGOW_HASKELL__ < 710
-import Data.Monoid (Monoid(..))
-#endif
+import Prelude ()
+import Prelude.Compat
 
 data OptParser opt
   = OptSuccess (Endo opt)
diff --git a/cryptol/REPL/Haskeline.hs b/cryptol/REPL/Haskeline.hs
--- a/cryptol/REPL/Haskeline.hs
+++ b/cryptol/REPL/Haskeline.hs
@@ -1,6 +1,6 @@
 -- |
 -- Module      :  $Header$
--- Copyright   :  (c) 2013-2015 Galois, Inc.
+-- Copyright   :  (c) 2013-2016 Galois, Inc.
 -- License     :  BSD3
 -- Maintainer  :  cryptol@galois.com
 -- Stability   :  provisional
@@ -18,9 +18,9 @@
 import           Cryptol.Utils.PP
 
 import qualified Control.Exception as X
-import           Control.Monad (guard, when)
-import qualified Control.Monad.IO.Class as MTL
+import           Control.Monad (guard, join, when)
 import qualified Control.Monad.Trans.Class as MTL
+import           Control.Monad.Trans.Control
 import           Data.Char (isAlphaNum, isSpace)
 import           Data.Function (on)
 import           Data.List (isPrefixOf,nub,sortBy)
@@ -31,6 +31,9 @@
                                   , getCurrentDirectory)
 import           System.FilePath ((</>))
 
+import           Prelude ()
+import           Prelude.Compat
+
 -- | Haskeline-specific repl implementation.
 repl :: Cryptolrc -> Maybe FilePath -> REPL () -> IO ()
 repl cryrc mbBatch begin =
@@ -133,15 +136,9 @@
 
 -- Utilities -------------------------------------------------------------------
 
-instance MTL.MonadIO REPL where
-  liftIO = io
-
 instance MonadException REPL where
-  controlIO branchIO = REPL $ \ ref -> do
-    runBody <- branchIO $ RunIO $ \ m -> do
-      a <- unREPL m ref
-      return (return a)
-    unREPL runBody ref
+  controlIO f = join $ liftBaseWith $ \f' ->
+    f $ RunIO $ \m -> restoreM <$> (f' m)
 
 -- Titles ----------------------------------------------------------------------
 
@@ -198,6 +195,7 @@
   ShellArg _    -> completeFilename cursor
   OptionArg _   -> completeOption cursor
   NoArg       _ -> return (l,[])
+  FileExprArg _ -> completeExpr cursor
 
 -- | Complete a name from the expression environment.
 completeExpr :: CompletionFunc REPL
diff --git a/cryptol/REPL/Logo.hs b/cryptol/REPL/Logo.hs
--- a/cryptol/REPL/Logo.hs
+++ b/cryptol/REPL/Logo.hs
@@ -1,6 +1,6 @@
 -- |
 -- Module      :  $Header$
--- Copyright   :  (c) 2013-2015 Galois, Inc.
+-- Copyright   :  (c) 2013-2016 Galois, Inc.
 -- License     :  BSD3
 -- Maintainer  :  cryptol@galois.com
 -- Stability   :  provisional
diff --git a/dist/build/Cryptol/Parser.hs b/dist/build/Cryptol/Parser.hs
--- a/dist/build/Cryptol/Parser.hs
+++ b/dist/build/Cryptol/Parser.hs
@@ -1,3740 +1,3206 @@
 {-# OPTIONS_GHC -w #-}
 {-# OPTIONS -fglasgow-exts -cpp #-}
-{-# LANGUAGE Trustworthy #-}
-module Cryptol.Parser
-  ( parseModule
-  , parseProgram, parseProgramWith
-  , parseExpr, parseExprWith
-  , parseDecl, parseDeclWith
-  , parseDecls, parseDeclsWith
-  , parseLetDecl, parseLetDeclWith
-  , parseRepl, parseReplWith
-  , parseSchema, parseSchemaWith
-  , parseModName
-  , ParseError(..), ppError
-  , Layout(..)
-  , Config(..), defaultConfig
-  , guessPreProc, PreProc(..)
-  ) where
-
-import Data.Maybe(fromMaybe)
-import Control.Monad(liftM2,msum)
-
-import Cryptol.Prims.Syntax
-import Cryptol.Parser.AST
-import Cryptol.Parser.Position
-import Cryptol.Parser.LexerUtils
-import Cryptol.Parser.ParserUtils
-import Cryptol.Parser.Unlit(PreProc(..), guessPreProc)
-
-import Paths_cryptol
-import qualified Data.Array as Happy_Data_Array
-import qualified GHC.Exts as Happy_GHC_Exts
-import Control.Applicative(Applicative(..))
-import Control.Monad (ap)
-
--- parser produced by Happy Version 1.19.5
-
-newtype HappyAbsSyn t55 = HappyAbsSyn HappyAny
-#if __GLASGOW_HASKELL__ >= 607
-type HappyAny = Happy_GHC_Exts.Any
-#else
-type HappyAny = forall a . a
-#endif
-happyIn14 :: (Module) -> (HappyAbsSyn t55)
-happyIn14 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn14 #-}
-happyOut14 :: (HappyAbsSyn t55) -> (Module)
-happyOut14 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut14 #-}
-happyIn15 :: (([Located Import], [TopDecl])) -> (HappyAbsSyn t55)
-happyIn15 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn15 #-}
-happyOut15 :: (HappyAbsSyn t55) -> (([Located Import], [TopDecl]))
-happyOut15 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut15 #-}
-happyIn16 :: ([Located Import]) -> (HappyAbsSyn t55)
-happyIn16 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn16 #-}
-happyOut16 :: (HappyAbsSyn t55) -> ([Located Import])
-happyOut16 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut16 #-}
-happyIn17 :: (Located Import) -> (HappyAbsSyn t55)
-happyIn17 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn17 #-}
-happyOut17 :: (HappyAbsSyn t55) -> (Located Import)
-happyOut17 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut17 #-}
-happyIn18 :: (Maybe (Located ModName)) -> (HappyAbsSyn t55)
-happyIn18 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn18 #-}
-happyOut18 :: (HappyAbsSyn t55) -> (Maybe (Located ModName))
-happyOut18 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut18 #-}
-happyIn19 :: (Maybe (Located ImportSpec)) -> (HappyAbsSyn t55)
-happyIn19 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn19 #-}
-happyOut19 :: (HappyAbsSyn t55) -> (Maybe (Located ImportSpec))
-happyOut19 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut19 #-}
-happyIn20 :: ([LName]) -> (HappyAbsSyn t55)
-happyIn20 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn20 #-}
-happyOut20 :: (HappyAbsSyn t55) -> ([LName])
-happyOut20 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut20 #-}
-happyIn21 :: ([Name] -> ImportSpec) -> (HappyAbsSyn t55)
-happyIn21 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn21 #-}
-happyOut21 :: (HappyAbsSyn t55) -> ([Name] -> ImportSpec)
-happyOut21 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut21 #-}
-happyIn22 :: (Program) -> (HappyAbsSyn t55)
-happyIn22 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn22 #-}
-happyOut22 :: (HappyAbsSyn t55) -> (Program)
-happyOut22 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut22 #-}
-happyIn23 :: (Program) -> (HappyAbsSyn t55)
-happyIn23 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn23 #-}
-happyOut23 :: (HappyAbsSyn t55) -> (Program)
-happyOut23 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut23 #-}
-happyIn24 :: ([TopDecl]) -> (HappyAbsSyn t55)
-happyIn24 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn24 #-}
-happyOut24 :: (HappyAbsSyn t55) -> ([TopDecl])
-happyOut24 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut24 #-}
-happyIn25 :: ([TopDecl]) -> (HappyAbsSyn t55)
-happyIn25 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn25 #-}
-happyOut25 :: (HappyAbsSyn t55) -> ([TopDecl])
-happyOut25 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut25 #-}
-happyIn26 :: ([TopDecl]) -> (HappyAbsSyn t55)
-happyIn26 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn26 #-}
-happyOut26 :: (HappyAbsSyn t55) -> ([TopDecl])
-happyOut26 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut26 #-}
-happyIn27 :: (TopDecl) -> (HappyAbsSyn t55)
-happyIn27 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn27 #-}
-happyOut27 :: (HappyAbsSyn t55) -> (TopDecl)
-happyOut27 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut27 #-}
-happyIn28 :: (Decl) -> (HappyAbsSyn t55)
-happyIn28 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn28 #-}
-happyOut28 :: (HappyAbsSyn t55) -> (Decl)
-happyOut28 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut28 #-}
-happyIn29 :: (Decl) -> (HappyAbsSyn t55)
-happyIn29 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn29 #-}
-happyOut29 :: (HappyAbsSyn t55) -> (Decl)
-happyOut29 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut29 #-}
-happyIn30 :: (Newtype) -> (HappyAbsSyn t55)
-happyIn30 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn30 #-}
-happyOut30 :: (HappyAbsSyn t55) -> (Newtype)
-happyOut30 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut30 #-}
-happyIn31 :: ([Named Type]) -> (HappyAbsSyn t55)
-happyIn31 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn31 #-}
-happyOut31 :: (HappyAbsSyn t55) -> ([Named Type])
-happyOut31 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut31 #-}
-happyIn32 :: ([ LName ]) -> (HappyAbsSyn t55)
-happyIn32 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn32 #-}
-happyOut32 :: (HappyAbsSyn t55) -> ([ LName ])
-happyOut32 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut32 #-}
-happyIn33 :: ([Pattern]) -> (HappyAbsSyn t55)
-happyIn33 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn33 #-}
-happyOut33 :: (HappyAbsSyn t55) -> ([Pattern])
-happyOut33 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut33 #-}
-happyIn34 :: ([Decl]) -> (HappyAbsSyn t55)
-happyIn34 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn34 #-}
-happyOut34 :: (HappyAbsSyn t55) -> ([Decl])
-happyOut34 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut34 #-}
-happyIn35 :: ([Decl]) -> (HappyAbsSyn t55)
-happyIn35 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn35 #-}
-happyOut35 :: (HappyAbsSyn t55) -> ([Decl])
-happyOut35 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut35 #-}
-happyIn36 :: ([Decl]) -> (HappyAbsSyn t55)
-happyIn36 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn36 #-}
-happyOut36 :: (HappyAbsSyn t55) -> ([Decl])
-happyOut36 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut36 #-}
-happyIn37 :: (ReplInput) -> (HappyAbsSyn t55)
-happyIn37 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn37 #-}
-happyOut37 :: (HappyAbsSyn t55) -> (ReplInput)
-happyOut37 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut37 #-}
-happyIn38 :: (Expr) -> (HappyAbsSyn t55)
-happyIn38 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn38 #-}
-happyOut38 :: (HappyAbsSyn t55) -> (Expr)
-happyOut38 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut38 #-}
-happyIn39 :: ([(Expr, Expr)]) -> (HappyAbsSyn t55)
-happyIn39 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn39 #-}
-happyOut39 :: (HappyAbsSyn t55) -> ([(Expr, Expr)])
-happyOut39 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut39 #-}
-happyIn40 :: ((Expr, Expr)) -> (HappyAbsSyn t55)
-happyIn40 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn40 #-}
-happyOut40 :: (HappyAbsSyn t55) -> ((Expr, Expr))
-happyOut40 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut40 #-}
-happyIn41 :: (Expr) -> (HappyAbsSyn t55)
-happyIn41 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn41 #-}
-happyOut41 :: (HappyAbsSyn t55) -> (Expr)
-happyOut41 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut41 #-}
-happyIn42 :: ([Expr]) -> (HappyAbsSyn t55)
-happyIn42 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn42 #-}
-happyOut42 :: (HappyAbsSyn t55) -> ([Expr])
-happyOut42 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut42 #-}
-happyIn43 :: (Expr) -> (HappyAbsSyn t55)
-happyIn43 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn43 #-}
-happyOut43 :: (HappyAbsSyn t55) -> (Expr)
-happyOut43 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut43 #-}
-happyIn44 :: ([(Bool, Integer)]) -> (HappyAbsSyn t55)
-happyIn44 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn44 #-}
-happyOut44 :: (HappyAbsSyn t55) -> ([(Bool, Integer)])
-happyOut44 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut44 #-}
-happyIn45 :: ((Bool, Integer)) -> (HappyAbsSyn t55)
-happyIn45 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn45 #-}
-happyOut45 :: (HappyAbsSyn t55) -> ((Bool, Integer))
-happyOut45 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut45 #-}
-happyIn46 :: (Located Selector) -> (HappyAbsSyn t55)
-happyIn46 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn46 #-}
-happyOut46 :: (HappyAbsSyn t55) -> (Located Selector)
-happyOut46 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut46 #-}
-happyIn47 :: ([Expr]) -> (HappyAbsSyn t55)
-happyIn47 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn47 #-}
-happyOut47 :: (HappyAbsSyn t55) -> ([Expr])
-happyOut47 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut47 #-}
-happyIn48 :: (Named Expr) -> (HappyAbsSyn t55)
-happyIn48 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn48 #-}
-happyOut48 :: (HappyAbsSyn t55) -> (Named Expr)
-happyOut48 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut48 #-}
-happyIn49 :: ([Named Expr]) -> (HappyAbsSyn t55)
-happyIn49 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn49 #-}
-happyOut49 :: (HappyAbsSyn t55) -> ([Named Expr])
-happyOut49 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut49 #-}
-happyIn50 :: (Expr) -> (HappyAbsSyn t55)
-happyIn50 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn50 #-}
-happyOut50 :: (HappyAbsSyn t55) -> (Expr)
-happyOut50 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut50 #-}
-happyIn51 :: ([[Match]]) -> (HappyAbsSyn t55)
-happyIn51 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn51 #-}
-happyOut51 :: (HappyAbsSyn t55) -> ([[Match]])
-happyOut51 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut51 #-}
-happyIn52 :: ([Match]) -> (HappyAbsSyn t55)
-happyIn52 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn52 #-}
-happyOut52 :: (HappyAbsSyn t55) -> ([Match])
-happyOut52 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut52 #-}
-happyIn53 :: (Match) -> (HappyAbsSyn t55)
-happyIn53 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn53 #-}
-happyOut53 :: (HappyAbsSyn t55) -> (Match)
-happyOut53 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut53 #-}
-happyIn54 :: (Pattern) -> (HappyAbsSyn t55)
-happyIn54 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn54 #-}
-happyOut54 :: (HappyAbsSyn t55) -> (Pattern)
-happyOut54 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut54 #-}
-happyIn55 :: t55 -> (HappyAbsSyn t55)
-happyIn55 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn55 #-}
-happyOut55 :: (HappyAbsSyn t55) -> t55
-happyOut55 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut55 #-}
-happyIn56 :: (Pattern) -> (HappyAbsSyn t55)
-happyIn56 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn56 #-}
-happyOut56 :: (HappyAbsSyn t55) -> (Pattern)
-happyOut56 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut56 #-}
-happyIn57 :: ([Pattern]) -> (HappyAbsSyn t55)
-happyIn57 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn57 #-}
-happyOut57 :: (HappyAbsSyn t55) -> ([Pattern])
-happyOut57 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut57 #-}
-happyIn58 :: (Named Pattern) -> (HappyAbsSyn t55)
-happyIn58 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn58 #-}
-happyOut58 :: (HappyAbsSyn t55) -> (Named Pattern)
-happyOut58 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut58 #-}
-happyIn59 :: ([Named Pattern]) -> (HappyAbsSyn t55)
-happyIn59 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn59 #-}
-happyOut59 :: (HappyAbsSyn t55) -> ([Named Pattern])
-happyOut59 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut59 #-}
-happyIn60 :: (Schema) -> (HappyAbsSyn t55)
-happyIn60 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn60 #-}
-happyOut60 :: (HappyAbsSyn t55) -> (Schema)
-happyOut60 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut60 #-}
-happyIn61 :: (Located [TParam]) -> (HappyAbsSyn t55)
-happyIn61 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn61 #-}
-happyOut61 :: (HappyAbsSyn t55) -> (Located [TParam])
-happyOut61 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut61 #-}
-happyIn62 :: (Located [Prop]) -> (HappyAbsSyn t55)
-happyIn62 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn62 #-}
-happyOut62 :: (HappyAbsSyn t55) -> (Located [Prop])
-happyOut62 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut62 #-}
-happyIn63 :: (Located Kind) -> (HappyAbsSyn t55)
-happyIn63 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn63 #-}
-happyOut63 :: (HappyAbsSyn t55) -> (Located Kind)
-happyOut63 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut63 #-}
-happyIn64 :: (TParam) -> (HappyAbsSyn t55)
-happyIn64 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn64 #-}
-happyOut64 :: (HappyAbsSyn t55) -> (TParam)
-happyOut64 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut64 #-}
-happyIn65 :: ([TParam]) -> (HappyAbsSyn t55)
-happyIn65 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn65 #-}
-happyOut65 :: (HappyAbsSyn t55) -> ([TParam])
-happyOut65 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut65 #-}
-happyIn66 :: (TParam) -> (HappyAbsSyn t55)
-happyIn66 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn66 #-}
-happyOut66 :: (HappyAbsSyn t55) -> (TParam)
-happyOut66 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut66 #-}
-happyIn67 :: ([TParam]) -> (HappyAbsSyn t55)
-happyIn67 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn67 #-}
-happyOut67 :: (HappyAbsSyn t55) -> ([TParam])
-happyOut67 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut67 #-}
-happyIn68 :: (Prop) -> (HappyAbsSyn t55)
-happyIn68 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn68 #-}
-happyOut68 :: (HappyAbsSyn t55) -> (Prop)
-happyOut68 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut68 #-}
-happyIn69 :: ([Prop]) -> (HappyAbsSyn t55)
-happyIn69 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn69 #-}
-happyOut69 :: (HappyAbsSyn t55) -> ([Prop])
-happyOut69 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut69 #-}
-happyIn70 :: (Type) -> (HappyAbsSyn t55)
-happyIn70 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn70 #-}
-happyOut70 :: (HappyAbsSyn t55) -> (Type)
-happyOut70 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut70 #-}
-happyIn71 :: (Type) -> (HappyAbsSyn t55)
-happyIn71 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn71 #-}
-happyOut71 :: (HappyAbsSyn t55) -> (Type)
-happyOut71 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut71 #-}
-happyIn72 :: (Type) -> (HappyAbsSyn t55)
-happyIn72 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn72 #-}
-happyOut72 :: (HappyAbsSyn t55) -> (Type)
-happyOut72 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut72 #-}
-happyIn73 :: ([ Type ]) -> (HappyAbsSyn t55)
-happyIn73 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn73 #-}
-happyOut73 :: (HappyAbsSyn t55) -> ([ Type ])
-happyOut73 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut73 #-}
-happyIn74 :: (Located [Type]) -> (HappyAbsSyn t55)
-happyIn74 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn74 #-}
-happyOut74 :: (HappyAbsSyn t55) -> (Located [Type])
-happyOut74 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut74 #-}
-happyIn75 :: ([Type]) -> (HappyAbsSyn t55)
-happyIn75 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn75 #-}
-happyOut75 :: (HappyAbsSyn t55) -> ([Type])
-happyOut75 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut75 #-}
-happyIn76 :: (Named Type) -> (HappyAbsSyn t55)
-happyIn76 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn76 #-}
-happyOut76 :: (HappyAbsSyn t55) -> (Named Type)
-happyOut76 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut76 #-}
-happyIn77 :: ([Named Type]) -> (HappyAbsSyn t55)
-happyIn77 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn77 #-}
-happyOut77 :: (HappyAbsSyn t55) -> ([Named Type])
-happyOut77 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut77 #-}
-happyIn78 :: ([LName]) -> (HappyAbsSyn t55)
-happyIn78 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn78 #-}
-happyOut78 :: (HappyAbsSyn t55) -> ([LName])
-happyOut78 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut78 #-}
-happyIn79 :: (LName) -> (HappyAbsSyn t55)
-happyIn79 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn79 #-}
-happyOut79 :: (HappyAbsSyn t55) -> (LName)
-happyOut79 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut79 #-}
-happyIn80 :: (Located ModName) -> (HappyAbsSyn t55)
-happyIn80 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn80 #-}
-happyOut80 :: (HappyAbsSyn t55) -> (Located ModName)
-happyOut80 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut80 #-}
-happyIn81 :: (Located QName) -> (HappyAbsSyn t55)
-happyIn81 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn81 #-}
-happyOut81 :: (HappyAbsSyn t55) -> (Located QName)
-happyOut81 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut81 #-}
-happyIn82 :: (Type) -> (HappyAbsSyn t55)
-happyIn82 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn82 #-}
-happyOut82 :: (HappyAbsSyn t55) -> (Type)
-happyOut82 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut82 #-}
-happyIn83 :: (Named Type) -> (HappyAbsSyn t55)
-happyIn83 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn83 #-}
-happyOut83 :: (HappyAbsSyn t55) -> (Named Type)
-happyOut83 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut83 #-}
-happyIn84 :: ([Named Type]) -> (HappyAbsSyn t55)
-happyIn84 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn84 #-}
-happyOut84 :: (HappyAbsSyn t55) -> ([Named Type])
-happyOut84 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut84 #-}
-happyInTok :: (Located Token) -> (HappyAbsSyn t55)
-happyInTok x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyInTok #-}
-happyOutTok :: (HappyAbsSyn t55) -> (Located Token)
-happyOutTok x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOutTok #-}
-
-
-happyActOffsets :: HappyAddr
-happyActOffsets = HappyA# "\xf6\xff\xed\x03\x48\x03\x68\x01\xcd\x04\xcd\x04\x46\x03\x6a\x03\x28\x01\xc9\x02\x08\x05\x68\x03\x08\x05\x2b\x03\x00\x00\x15\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x15\x03\xa3\x02\x2f\x03\x30\x03\xef\x07\x00\x00\x00\x00\x65\x03\x24\x03\x50\x03\x00\x00\x00\x00\x50\x03\x00\x00\x50\x03\x50\x03\x00\x00\x50\x03\x50\x03\x50\x03\x50\x03\x50\x03\x2f\x03\x31\x02\x72\x05\x00\x00\x00\x00\x04\x03\x42\x03\x13\x07\x1f\x05\x1e\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf3\x04\x68\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe7\x00\x01\x00\x6a\x05\x0a\x00\x4a\x02\xf3\x04\x68\x01\x68\x01\xef\x02\xef\x02\xf3\x01\x08\x03\xe2\x00\x63\x00\x01\x03\xbc\x04\x08\x05\xb3\x04\x9c\x04\x5f\x05\x00\x00\xdf\x02\x16\x00\xdf\x02\xe7\x01\xdf\x02\xed\x03\x00\x03\x00\x00\x36\x03\xd2\x02\xa3\x03\xec\x02\x80\x00\x00\x00\x5c\x00\x00\x00\x00\x00\x00\x00\x29\x03\x08\x05\xde\x02\x08\x05\x08\x05\x00\x00\x00\x00\xea\x02\x21\x01\x00\x00\x9e\x00\x00\x00\x50\x02\xe2\x02\x00\x00\x3c\x02\xd7\xff\x00\x00\x09\x02\x00\x00\x00\x00\x4e\x01\x33\x01\x00\x00\xff\x04\x87\x04\x00\x00\x68\x01\xe5\x02\x08\x05\x7d\x02\x00\x00\x00\x00\xf2\x00\x00\x00\x00\x00\x00\x00\x76\x04\x00\x00\x00\x00\x00\x00\x2f\x03\x0f\x03\xd6\xff\x00\x00\x00\x00\xa0\x02\x00\x00\x00\x00\x41\x02\x61\x04\x00\x00\xa8\x00\xd3\x01\x00\x00\xe3\x02\xa7\x00\xe0\x02\xdc\x02\xdb\x02\xd9\x02\xd4\x02\xd0\x02\xcf\x02\xc7\x02\xc1\x02\xbc\x02\xb4\x02\xb3\x02\xb1\x02\xaf\x02\xa1\x02\x9d\x02\x9a\x02\x96\x02\x91\x02\x8e\x02\x8d\x02\x77\x02\x74\x02\x6b\x02\x44\x04\x67\x02\x6d\x02\x00\x00\x07\x01\x65\x00\x00\x00\x3d\x02\xf3\x04\xda\x05\x25\x02\x2f\x03\x68\x01\x68\x01\x68\x01\x68\x01\x68\x01\x68\x01\x68\x01\x68\x01\x68\x01\x68\x01\x68\x01\x68\x01\x68\x01\x68\x01\x68\x01\x68\x01\x68\x01\x68\x01\x68\x01\x68\x01\x68\x01\x68\x01\x68\x01\x68\x01\x68\x01\x68\x01\x00\x00\x2a\x02\x00\x00\x16\x02\x0e\x02\x70\x05\x00\x00\xb8\x01\x56\x05\x96\x01\xe9\x02\x08\x02\x5c\x05\x47\x07\x50\x03\x00\x00\x2f\x03\x50\x03\x50\x03\x50\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x50\x03\x08\x05\x00\x00\x2f\x03\x2f\x03\x2f\x03\x2f\x03\x2f\x03\x2f\x03\x2f\x03\x2f\x03\x2f\x03\x2f\x03\x2f\x03\x00\x00\x7a\x08\x2f\x03\xef\x07\x14\x02\xff\x01\x7a\x08\x7a\x08\x7a\x08\x7a\x08\xe2\x01\xe2\x01\xe2\x01\xe2\x01\xc3\x05\xc3\x05\x7a\x08\x41\x07\x00\x00\x00\x00\x00\x00\x50\x03\x00\x00\x01\x07\x00\x00\x88\x01\xe9\x01\x00\x00\x00\x00\xdc\x07\x00\x00\x00\x00\x2f\x03\x00\x00\x2f\x03\xe3\x01\x57\x02\x60\x00\x08\x05\x00\x00\x08\x05\x00\x00\xba\x07\x00\x00\x00\x00\x00\x00\x00\x00\xc0\x07\xc0\x07\xc0\x07\xc0\x07\x9f\x07\x9f\x07\x9f\x07\x9f\x07\x84\x07\x84\x07\x84\x07\x84\x07\x69\x07\x4e\x07\xba\x07\x21\x03\x21\x03\x21\x03\x21\x03\x00\x08\x00\x08\x7a\x08\x00\x00\x00\x00\x00\x00\x50\x04\x68\x01\x68\x01\x68\x01\x68\x01\x00\x00\x68\x01\x68\x01\x00\x00\xf3\x04\x68\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x68\x01\x2a\x04\x68\x01\x08\x05\x00\x00\x19\x02\x00\x00\x19\x00\x08\x08\xf0\x01\xdb\x01\x00\x00\x8e\x01\x00\x00\xe2\x07\x00\x00\x68\x01\x20\x04\x00\x00\x20\x04\x00\x00\x00\x00\x00\x00\xfe\x01\x68\x01\x00\x00\xe3\x04\x00\x00\x08\x05\x2f\x03\x00\x00\xf3\x04\x00\x00\xf3\x04\x00\x00\x2f\x03\xf3\x04\x00\x00\xf3\x04\x08\x05\x00\x00\xd6\x03\xeb\x01\xba\x03\x00\x00\xba\x03\x00\x00\x65\x04\x13\x04\xba\x03\x04\x02\x00\x00\xa3\x03\xa3\x03\x00\x00\x00\x00\x5c\x00\x00\x00\x5c\x00\x69\x00\x08\x05\x5f\x00\x09\x04\x68\x01\x75\x01\xcc\x01\x00\x00\x00\x00\x54\x00\x00\x00\xd3\x03\x00\x00\x00\x00\x00\x00\xa1\x01\x7a\x08\x00\x00\x00\x00\x7a\x08\xa6\x01\x00\x00\x2f\x03\xa0\x01\x00\x00\x00\x00\x13\x07\x00\x00\x08\x05\x00\x00\x2f\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa0\x01\x68\x01\xa0\x01\x5e\x00\x9a\x01\x7d\x01\x00\x00\x7a\x01\x89\x01\x89\x01\x89\x01\x00\x00\x13\x07\x89\x01\x68\x01\x00\x00\x63\x01\x00\x00\x00\x00\x7a\x08\x00\x00\x00\x00\x00\x00\xef\x07\x00\x00\x7a\x08\x7a\x08\x2f\x03\x00\x00\x00\x00\x88\x01\xa3\x03\x5a\x01\xce\xff\x81\x01\x68\x01\xf3\x04\xf3\x04\x68\x01\x00\x00\x81\x01\x7a\x08\x5e\x01\x00\x00\x7a\x08\xce\xff\x00\x00\x00\x00\x00\x00\x39\x04\x4f\x01\x66\x01\x68\x01\x00\x00\x00\x00\x00\x00\x36\x01\x00\x00\x08\x05\x41\x01\x00\x00\x25\x01\x00\x00\x2b\x01\x3e\x01\x12\x01\x00\x00\x26\x01\x00\x00\x00\x00\x00\x00\x43\x01\x00\x00\x00\x00\x08\x05\x00\x00\x00\x00"#
-
-happyGotoOffsets :: HappyAddr
-happyGotoOffsets = HappyA# "\x37\x01\xf1\x00\x1b\x01\x23\x06\xab\x02\x5f\x02\x00\x01\xf5\x00\x6f\x05\x38\x08\xd6\x04\x00\x00\x58\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x46\x08\xad\x09\x00\x00\x00\x00\x00\x00\x00\x00\xc1\x09\x00\x00\xa7\x03\x00\x00\x00\x00\xbd\x09\x00\x00\xb9\x09\xb5\x09\x00\x00\xb1\x09\xfb\x06\x35\x05\xd2\x04\x70\x04\xa1\x09\x6f\x08\x7f\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfa\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3c\x00\xae\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe8\x02\xbf\x04\x59\x00\xb8\x00\x5e\x02\x31\x01\x14\x07\x00\x07\x00\x00\x00\x00\x13\x01\x00\x00\x00\x00\x85\x02\x00\x00\xed\x00\xbb\x00\xce\x01\x6c\x01\xb7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2a\x05\x00\x00\xab\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8c\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x53\x04\x00\x00\xa5\x00\x7d\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdf\x01\xdc\xff\x00\x00\x16\x06\x00\x00\x9d\x00\x29\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdc\xff\x00\x00\x00\x00\x00\x00\x95\x09\x5e\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x92\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf7\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5a\x00\xf0\xff\x00\x00\x89\x09\xf3\x06\xeb\x06\xe7\x06\xe3\x06\xdf\x06\xd7\x06\xca\x06\xb6\x06\xae\x06\xaa\x06\xa1\x06\x9d\x06\x99\x06\x95\x06\x8d\x06\x81\x06\x6c\x06\x64\x06\x60\x06\x58\x06\x54\x06\x50\x06\x4c\x06\x43\x06\x37\x06\x1a\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8d\x08\x00\x00\xb7\x02\x00\x00\xea\x03\x00\x00\x7d\x09\xc5\x03\xb7\x03\x52\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x31\x03\x9b\x00\x00\x00\x71\x09\x65\x09\x59\x09\x4d\x09\x41\x09\x35\x09\x29\x09\x1d\x09\x11\x09\x05\x09\xf9\x08\x00\x00\x00\x00\xed\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1c\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe1\x08\x00\x00\xd5\x08\x00\x00\x7b\x08\x52\x08\xfb\x00\x00\x00\x74\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdc\xff\x0e\x06\x9f\x02\x68\x04\x08\x06\x00\x00\x02\x06\xf9\x05\x00\x00\x22\x03\xec\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd8\x05\xdc\xff\xcf\x05\x22\x00\x00\x00\x00\x00\x00\x00\xa1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x39\x02\x0d\x02\x00\x00\x72\x01\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x05\x00\x00\x7d\x00\x00\x00\x7a\x00\xc9\x08\x00\x00\xfd\x02\x00\x00\x6c\x02\x00\x00\xbd\x08\x38\x01\x00\x00\x07\x02\x4e\x00\x00\x00\x2c\x01\x04\x00\x4d\x05\x00\x00\x3f\x05\x00\x00\xcf\x01\xf4\xff\xa5\x03\x8e\x00\x00\x00\xfc\x01\x75\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\xdf\x03\x00\x00\xdc\xff\xbc\x05\x7d\x00\x79\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb1\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfd\xff\x00\x00\xa5\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb6\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa5\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x99\x08\x00\x00\x00\x00\x00\x00\x77\x03\x00\x00\x3f\x00\x00\x00\xae\x04\x82\x01\x51\x07\x87\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0f\x00\x00\x00\x00\x00\x00\x00\x86\x02\x07\x00\x00\x00\xd9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc0\xff\x00\x00\x00\x00"#
-
-happyDefActions :: HappyAddr
-happyDefActions = HappyA# "\x00\x00\xdf\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdf\xfe\xe6\xfe\x00\x00\xe4\xfe\xe1\xfe\xe0\xfe\xe2\xfe\xe3\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x26\xff\x04\xff\xfc\xfe\x00\x00\xde\xfe\xfb\xfe\xf8\xfe\xf7\xfe\x00\x00\xfa\xfe\x00\x00\x00\x00\xf9\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf0\xfe\xb8\xff\x00\x00\xb9\xff\xb7\xff\xaf\xff\x8f\xff\x8d\xff\x85\xff\x84\xff\x83\xff\x82\xff\x81\xff\x80\xff\x8a\xff\x00\x00\x00\x00\x8c\xff\x8b\xff\x89\xff\x88\xff\x7f\xff\x87\xff\x86\xff\x7e\xff\x7d\xff\x7b\xff\x7c\xff\x7a\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc4\xff\x00\x00\x00\x00\x00\x00\x00\x00\x34\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe0\xff\x00\x00\xd1\xff\x00\x00\x00\x00\xee\xff\x00\x00\xf0\xff\xeb\xff\xef\xff\xda\xff\xd7\xff\xd2\xff\x00\x00\x00\x00\xe2\xfe\x00\x00\x00\x00\xd0\xff\xdc\xff\x00\x00\x00\x00\xdd\xff\x00\x00\x28\xff\x00\x00\x00\x00\x2d\xff\x00\x00\x38\xff\x36\xff\x00\x00\x35\xff\x33\xff\x00\x00\x00\x00\x30\xff\x00\x00\x00\x00\xc2\xff\x00\x00\x00\x00\x00\x00\x00\x00\xc0\xff\xbe\xff\x00\x00\xba\xff\x90\xff\x91\xff\x00\x00\xdd\xfe\x72\xff\xdc\xfe\x00\x00\x00\x00\x00\x00\x54\xff\x52\xff\x51\xff\x56\xff\x49\xff\x00\x00\x00\x00\x76\xff\x00\x00\x00\x00\x77\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x46\xff\x45\xff\x00\x00\x74\xff\x00\x00\x00\x00\xb2\xff\x00\x00\x35\xff\x00\x00\x8e\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x19\xff\x00\x00\xe8\xfe\x00\x00\x1b\xff\x22\xff\x0d\xff\x00\x00\x00\x00\x00\x00\x00\x00\xf4\xfe\x00\x00\x00\x00\x00\x00\xfb\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x03\xff\x10\xff\x0e\xff\x0f\xff\xef\xfe\xfd\xfe\x00\x00\xfe\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1f\xff\x24\xff\x00\x00\x25\xff\x00\x00\x00\x00\x23\xff\x11\xff\x12\xff\x13\xff\x06\xff\x05\xff\x07\xff\x08\xff\x09\xff\x0a\xff\x0b\xff\x00\x00\xe5\xfe\xee\xfe\x02\xff\x00\x00\x00\xff\x00\x00\xff\xfe\xed\xfe\x00\x00\xf2\xfe\x20\xff\x00\x00\xf4\xfe\xf3\xfe\x00\x00\xf5\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf1\xfe\x00\x00\x21\xff\xa7\xff\xa8\xff\xa9\xff\xaa\xff\xab\xff\x93\xff\x92\xff\x95\xff\x94\xff\x96\xff\x97\xff\x98\xff\x99\xff\x9b\xff\x9a\xff\x9d\xff\x9c\xff\x9e\xff\x9f\xff\xa0\xff\xa2\xff\xa1\xff\xa3\xff\xa4\xff\xa5\xff\xa6\xff\xae\xff\x71\xff\x4f\xff\x4e\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x73\xff\x00\x00\x44\xff\x40\xff\x00\x00\x00\x00\x6c\xff\x6d\xff\x6e\xff\x6f\xff\x70\xff\x58\xff\x57\xff\x5a\xff\x59\xff\x5b\xff\x5c\xff\x5d\xff\x5e\xff\x60\xff\x5f\xff\x62\xff\x61\xff\x63\xff\x64\xff\x65\xff\x67\xff\x66\xff\x68\xff\x69\xff\x6a\xff\x6b\xff\x78\xff\x79\xff\x00\x00\x00\x00\x00\x00\x00\x00\x75\xff\x00\x00\x55\xff\x00\x00\x00\x00\x00\x00\xe6\xfe\xd5\xfe\x00\x00\xda\xfe\x00\x00\xc1\xff\x00\x00\x00\x00\xbb\xff\x00\x00\xcf\xff\xc3\xff\xbf\xff\xce\xff\x00\x00\x15\xff\x00\x00\x17\xff\x00\x00\x00\x00\x2e\xff\x00\x00\x2f\xff\x00\x00\x31\xff\x00\x00\x00\x00\x32\xff\x00\x00\x00\x00\x2c\xff\x00\x00\x00\x00\x00\x00\xde\xff\x00\x00\xdb\xff\x00\x00\x00\x00\x00\x00\xe8\xff\xd5\xff\x00\x00\x00\x00\xf3\xff\xed\xff\xf2\xff\xec\xff\xf1\xff\xe1\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd9\xff\xd8\xff\x00\x00\xb4\xff\x00\x00\xb6\xff\x27\xff\x29\xff\x37\xff\x39\xff\x2b\xff\x2a\xff\xcc\xff\x00\x00\x14\xff\x00\x00\xcd\xff\xbd\xff\xbc\xff\xac\xff\xdb\xfe\x00\x00\xd9\xfe\x00\x00\xd7\xfe\xd8\xfe\x53\xff\x50\xff\x48\xff\x4b\xff\x00\x00\x4d\xff\x4d\xff\x47\xff\x3e\xff\x3c\xff\x00\x00\x43\xff\x4c\xff\xb0\xff\xb1\xff\xad\xff\xca\xff\x00\x00\x18\xff\x1b\xff\xe7\xfe\x1a\xff\xe9\xfe\x1c\xff\x1d\xff\x0c\xff\x00\x00\x1e\xff\xeb\xfe\xea\xfe\x00\x00\xf6\xfe\x01\xff\xec\xfe\xee\xff\x00\x00\x00\x00\xc9\xff\x00\x00\x00\x00\x00\x00\x42\xff\x3f\xff\x4a\xff\xd6\xfe\x00\x00\xd4\xfe\xcb\xff\x00\x00\xb5\xff\xb3\xff\xc8\xff\x00\x00\x00\x00\xd3\xff\x00\x00\xd6\xff\xe9\xff\xea\xff\x00\x00\xe2\xff\xe3\xff\xd4\xff\xc7\xff\x00\x00\xc6\xff\x00\x00\x41\xff\x3d\xff\x3b\xff\x3a\xff\xf4\xff\x16\xff\xc5\xff\x00\x00\xe4\xff\xe7\xff\x00\x00\xe5\xff"#
-
-happyCheck :: HappyAddr
-happyCheck = HappyA# "\xff\xff\x41\x00\x01\x00\x02\x00\x03\x00\x04\x00\x2a\x00\x13\x00\x07\x00\x08\x00\x09\x00\x01\x00\x0b\x00\x0c\x00\x18\x00\x39\x00\x20\x00\x10\x00\x0e\x00\x3c\x00\x13\x00\x47\x00\x12\x00\x1d\x00\x11\x00\x15\x00\x01\x00\x45\x00\x1b\x00\x41\x00\x2a\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x5f\x00\x2a\x00\x19\x00\x26\x00\x41\x00\x31\x00\x32\x00\x06\x00\x41\x00\x5f\x00\x36\x00\x42\x00\x38\x00\x40\x00\x41\x00\x3b\x00\x43\x00\x41\x00\x26\x00\x31\x00\x40\x00\x45\x00\x39\x00\x22\x00\x41\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x01\x00\x02\x00\x41\x00\x04\x00\x02\x00\x2a\x00\x07\x00\x08\x00\x09\x00\x07\x00\x08\x00\x09\x00\x13\x00\x0e\x00\x41\x00\x31\x00\x08\x00\x12\x00\x13\x00\x14\x00\x15\x00\x60\x00\x19\x00\x03\x00\x16\x00\x2c\x00\x22\x00\x23\x00\x41\x00\x1e\x00\x1f\x00\x0b\x00\x0c\x00\x1d\x00\x0e\x00\x2a\x00\x10\x00\x26\x00\x12\x00\x34\x00\x26\x00\x11\x00\x2b\x00\x2e\x00\x2f\x00\x2b\x00\x41\x00\x34\x00\x31\x00\x04\x00\x34\x00\x31\x00\x30\x00\x36\x00\x43\x00\x44\x00\x36\x00\x41\x00\x41\x00\x05\x00\x34\x00\x07\x00\x2a\x00\x44\x00\x41\x00\x43\x00\x44\x00\x41\x00\x13\x00\x32\x00\x47\x00\x01\x00\x02\x00\x03\x00\x04\x00\x43\x00\x44\x00\x07\x00\x08\x00\x09\x00\x34\x00\x0b\x00\x0c\x00\x34\x00\x41\x00\x41\x00\x10\x00\x0d\x00\x0e\x00\x13\x00\x41\x00\x2a\x00\x12\x00\x41\x00\x5f\x00\x1f\x00\x19\x00\x1b\x00\x60\x00\x44\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x41\x00\x36\x00\x2a\x00\x1e\x00\x1f\x00\x31\x00\x32\x00\x32\x00\x33\x00\x41\x00\x36\x00\x41\x00\x38\x00\x42\x00\x0e\x00\x3b\x00\x2c\x00\x2d\x00\x12\x00\x41\x00\x40\x00\x01\x00\x02\x00\x03\x00\x04\x00\x41\x00\x46\x00\x07\x00\x08\x00\x09\x00\x18\x00\x0b\x00\x0c\x00\x1b\x00\x1c\x00\x1d\x00\x10\x00\x41\x00\x08\x00\x13\x00\x0a\x00\x41\x00\x2a\x00\x0d\x00\x0e\x00\x13\x00\x5a\x00\x1b\x00\x12\x00\x0f\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x41\x00\x33\x00\x16\x00\x2a\x00\x31\x00\x40\x00\x41\x00\x2a\x00\x43\x00\x36\x00\x3c\x00\x38\x00\x19\x00\x0e\x00\x3b\x00\x1c\x00\x09\x00\x12\x00\x34\x00\x40\x00\x15\x00\x01\x00\x02\x00\x03\x00\x04\x00\x46\x00\x41\x00\x07\x00\x08\x00\x09\x00\x41\x00\x0b\x00\x0c\x00\x43\x00\x44\x00\x00\x00\x10\x00\x3e\x00\x0e\x00\x13\x00\x41\x00\x2a\x00\x12\x00\x19\x00\x14\x00\x5a\x00\x1a\x00\x1b\x00\x13\x00\x33\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x41\x00\x34\x00\x2a\x00\x19\x00\x33\x00\x31\x00\x19\x00\x2a\x00\x37\x00\x32\x00\x36\x00\x2c\x00\x38\x00\x29\x00\x2a\x00\x3b\x00\x43\x00\x44\x00\x33\x00\x31\x00\x40\x00\x01\x00\x02\x00\x03\x00\x04\x00\x41\x00\x46\x00\x07\x00\x08\x00\x09\x00\x41\x00\x0b\x00\x0c\x00\x32\x00\x33\x00\x02\x00\x10\x00\x41\x00\x2c\x00\x13\x00\x07\x00\x08\x00\x09\x00\x19\x00\x0e\x00\x33\x00\x5a\x00\x1b\x00\x12\x00\x36\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x3a\x00\x31\x00\x19\x00\x26\x00\x2a\x00\x43\x00\x36\x00\x3c\x00\x38\x00\x19\x00\x19\x00\x3b\x00\x1c\x00\x1d\x00\x31\x00\x2d\x00\x40\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x41\x00\x46\x00\x3a\x00\x33\x00\x32\x00\x33\x00\x41\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x19\x00\x32\x00\x33\x00\x34\x00\x3e\x00\x3f\x00\x37\x00\x41\x00\x33\x00\x5a\x00\x41\x00\x3c\x00\x37\x00\x3e\x00\x3f\x00\x32\x00\x33\x00\x30\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x3c\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x02\x00\x32\x00\x33\x00\x05\x00\x02\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x07\x00\x08\x00\x09\x00\x02\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x07\x00\x08\x00\x09\x00\x16\x00\x17\x00\x03\x00\x5f\x00\x16\x00\x36\x00\x34\x00\x35\x00\x32\x00\x33\x00\x0b\x00\x0c\x00\x16\x00\x0e\x00\x07\x00\x10\x00\x26\x00\x12\x00\x41\x00\x41\x00\x26\x00\x2b\x00\x34\x00\x35\x00\x3a\x00\x2b\x00\x19\x00\x31\x00\x26\x00\x01\x00\x0e\x00\x31\x00\x36\x00\x2b\x00\x12\x00\x41\x00\x36\x00\x3f\x00\x33\x00\x31\x00\x3c\x00\x2a\x00\x37\x00\x41\x00\x36\x00\x43\x00\x49\x00\x41\x00\x19\x00\x43\x00\x28\x00\x29\x00\x2a\x00\x01\x00\x02\x00\x41\x00\x04\x00\x43\x00\x2a\x00\x07\x00\x08\x00\x09\x00\x32\x00\x33\x00\x41\x00\x0d\x00\x0e\x00\x0f\x00\x42\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x3f\x00\x41\x00\x33\x00\x3c\x00\x01\x00\x02\x00\x37\x00\x41\x00\x1e\x00\x1f\x00\x07\x00\x08\x00\x09\x00\x1b\x00\x1c\x00\x1d\x00\x26\x00\x01\x00\x02\x00\x35\x00\x04\x00\x2b\x00\x33\x00\x07\x00\x08\x00\x09\x00\x37\x00\x31\x00\x32\x00\x0d\x00\x0e\x00\x0f\x00\x36\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x0e\x00\x32\x00\x33\x00\x26\x00\x12\x00\x41\x00\x14\x00\x33\x00\x1e\x00\x1f\x00\x3a\x00\x37\x00\x40\x00\x41\x00\x31\x00\x43\x00\x26\x00\x01\x00\x02\x00\x36\x00\x04\x00\x2b\x00\x33\x00\x07\x00\x08\x00\x09\x00\x37\x00\x31\x00\x2a\x00\x0d\x00\x0e\x00\x0f\x00\x36\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x0e\x00\x28\x00\x29\x00\x2a\x00\x12\x00\x41\x00\x2c\x00\x33\x00\x1e\x00\x1f\x00\x32\x00\x40\x00\x41\x00\x41\x00\x43\x00\x44\x00\x26\x00\x01\x00\x02\x00\x32\x00\x04\x00\x2b\x00\x32\x00\x07\x00\x08\x00\x09\x00\x41\x00\x31\x00\x2a\x00\x0d\x00\x0e\x00\x0f\x00\x36\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x0e\x00\x1b\x00\x1c\x00\x1d\x00\x12\x00\x41\x00\x32\x00\x32\x00\x1e\x00\x1f\x00\x32\x00\x3e\x00\x3f\x00\x41\x00\x41\x00\x32\x00\x26\x00\x01\x00\x02\x00\x32\x00\x04\x00\x2b\x00\x32\x00\x07\x00\x08\x00\x09\x00\x32\x00\x31\x00\x2a\x00\x0d\x00\x0e\x00\x0f\x00\x36\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x40\x00\x41\x00\x32\x00\x43\x00\x32\x00\x41\x00\x32\x00\x32\x00\x1e\x00\x1f\x00\x49\x00\x01\x00\x02\x00\x41\x00\x04\x00\x32\x00\x26\x00\x07\x00\x08\x00\x09\x00\x32\x00\x2b\x00\x3e\x00\x3f\x00\x0e\x00\x41\x00\x32\x00\x31\x00\x12\x00\x13\x00\x14\x00\x15\x00\x36\x00\x18\x00\x32\x00\x32\x00\x1b\x00\x1c\x00\x1d\x00\x32\x00\x1e\x00\x1f\x00\x21\x00\x41\x00\x32\x00\x24\x00\x32\x00\x32\x00\x26\x00\x01\x00\x02\x00\x32\x00\x04\x00\x2b\x00\x32\x00\x07\x00\x08\x00\x09\x00\x34\x00\x31\x00\x32\x00\x3a\x00\x0e\x00\x34\x00\x36\x00\x42\x00\x12\x00\x13\x00\x14\x00\x15\x00\x28\x00\x29\x00\x2a\x00\x40\x00\x41\x00\x41\x00\x43\x00\x03\x00\x1e\x00\x1f\x00\x43\x00\x01\x00\x02\x00\x60\x00\x04\x00\x34\x00\x26\x00\x07\x00\x08\x00\x09\x00\x03\x00\x2b\x00\x3a\x00\x34\x00\x0e\x00\x41\x00\x60\x00\x31\x00\x12\x00\x13\x00\x14\x00\x15\x00\x36\x00\x37\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x1e\x00\x1f\x00\x60\x00\x41\x00\x01\x00\x02\x00\x35\x00\x04\x00\x26\x00\x3a\x00\x07\x00\x08\x00\x09\x00\x2b\x00\x19\x00\x40\x00\x41\x00\x0e\x00\x43\x00\x31\x00\x3d\x00\x12\x00\x41\x00\x60\x00\x36\x00\x01\x00\x02\x00\x3d\x00\x04\x00\x49\x00\x3a\x00\x07\x00\x08\x00\x09\x00\x3f\x00\x41\x00\x40\x00\x41\x00\x0e\x00\x43\x00\x60\x00\x26\x00\x12\x00\x01\x00\x02\x00\x03\x00\x2b\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x18\x00\x31\x00\x0b\x00\x0c\x00\x1a\x00\x0e\x00\x36\x00\x10\x00\x42\x00\x12\x00\x42\x00\x26\x00\x3a\x00\x01\x00\x02\x00\x03\x00\x2b\x00\x41\x00\x40\x00\x41\x00\xff\xff\x43\x00\x31\x00\x0b\x00\x0c\x00\xff\xff\x0e\x00\x36\x00\x10\x00\xff\xff\x12\x00\x18\x00\xff\xff\x2a\x00\x1b\x00\x1c\x00\x1d\x00\x02\x00\x41\x00\xff\xff\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\xff\xff\xff\xff\x0b\x00\x0c\x00\xff\xff\x0e\x00\xff\xff\x10\x00\x2a\x00\x12\x00\x41\x00\x16\x00\x17\x00\xff\xff\x02\x00\x40\x00\x41\x00\x05\x00\x43\x00\x07\x00\x08\x00\x09\x00\x0a\x00\xff\xff\xff\xff\x40\x00\x41\x00\x26\x00\x43\x00\xff\xff\xff\xff\x41\x00\x2b\x00\x2a\x00\x16\x00\x17\x00\xff\xff\xff\xff\x31\x00\x02\x00\xff\xff\xff\xff\x02\x00\x36\x00\x07\x00\x08\x00\x09\x00\x07\x00\x08\x00\x09\x00\x26\x00\x3a\x00\x3b\x00\xff\xff\x41\x00\x2b\x00\x41\x00\x40\x00\x41\x00\x16\x00\x43\x00\x31\x00\x16\x00\xff\xff\xff\xff\x02\x00\x36\x00\x3a\x00\x05\x00\xff\xff\x07\x00\x08\x00\x09\x00\x40\x00\x41\x00\x26\x00\x43\x00\x41\x00\x26\x00\xff\xff\x2b\x00\x3a\x00\xff\xff\x2b\x00\xff\xff\x16\x00\x31\x00\x40\x00\x41\x00\x31\x00\x43\x00\x36\x00\x37\x00\x02\x00\x36\x00\x37\x00\xff\xff\xff\xff\x07\x00\x08\x00\x09\x00\x26\x00\x41\x00\x02\x00\xff\xff\x41\x00\x2b\x00\xff\xff\x07\x00\x08\x00\x09\x00\xff\xff\x31\x00\x40\x00\x41\x00\x42\x00\x02\x00\x36\x00\x3a\x00\xff\xff\xff\xff\x07\x00\x08\x00\x09\x00\x40\x00\x41\x00\x02\x00\x43\x00\x41\x00\x26\x00\xff\xff\x07\x00\x08\x00\x09\x00\x2b\x00\xff\xff\x16\x00\xff\xff\xff\xff\x26\x00\x31\x00\x02\x00\xff\xff\xff\xff\x2b\x00\x36\x00\x07\x00\x08\x00\x09\x00\x3a\x00\x31\x00\xff\xff\x26\x00\xff\xff\xff\xff\x36\x00\x41\x00\x2b\x00\xff\xff\x3a\x00\xff\xff\xff\xff\x26\x00\x31\x00\x02\x00\xff\xff\x41\x00\x2b\x00\x36\x00\x07\x00\x08\x00\x09\x00\xff\xff\x31\x00\xff\xff\x19\x00\xff\xff\x26\x00\x36\x00\x41\x00\xff\xff\x02\x00\x3a\x00\xff\xff\xff\xff\x02\x00\x07\x00\x08\x00\x09\x00\x41\x00\x07\x00\x08\x00\x09\x00\xff\xff\x37\x00\xff\xff\x2e\x00\x2f\x00\x30\x00\xff\xff\x26\x00\x33\x00\x02\x00\xff\xff\xff\xff\x2b\x00\xff\xff\x07\x00\x08\x00\x09\x00\x18\x00\x31\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x36\x00\x26\x00\xff\xff\x02\x00\x3a\x00\x26\x00\x2b\x00\xff\xff\x07\x00\x08\x00\x09\x00\x41\x00\x31\x00\x40\x00\x41\x00\x42\x00\x31\x00\x36\x00\x40\x00\x41\x00\x42\x00\x3a\x00\x26\x00\xff\xff\x02\x00\x3a\x00\xff\xff\x2b\x00\x41\x00\x07\x00\x08\x00\x09\x00\xff\xff\x31\x00\x40\x00\x41\x00\x3a\x00\x43\x00\x36\x00\x26\x00\xff\xff\xff\xff\x40\x00\x41\x00\x2b\x00\x43\x00\x3e\x00\x02\x00\xff\xff\x41\x00\x31\x00\xff\xff\x07\x00\x08\x00\x09\x00\x36\x00\x02\x00\xff\xff\xff\xff\x3a\x00\x26\x00\x07\x00\x08\x00\x09\x00\x18\x00\x2b\x00\x41\x00\x1b\x00\x1c\x00\x1d\x00\xff\xff\x31\x00\x32\x00\x02\x00\xff\xff\xff\xff\x36\x00\xff\xff\x07\x00\x08\x00\x09\x00\x18\x00\xff\xff\x26\x00\x1b\x00\x1c\x00\x1d\x00\x41\x00\x2b\x00\x2c\x00\x21\x00\xff\xff\x26\x00\x16\x00\x31\x00\x02\x00\xff\xff\x2b\x00\xff\xff\x36\x00\x07\x00\x08\x00\x09\x00\x31\x00\x40\x00\x41\x00\xff\xff\x43\x00\x36\x00\x26\x00\x41\x00\x02\x00\x3a\x00\xff\xff\x2b\x00\xff\xff\x07\x00\x08\x00\x09\x00\x41\x00\x31\x00\x40\x00\x41\x00\x02\x00\x43\x00\x36\x00\xff\xff\xff\xff\x07\x00\x08\x00\x09\x00\x26\x00\x02\x00\xff\xff\x3a\x00\xff\xff\x41\x00\x07\x00\x08\x00\x09\x00\x40\x00\x41\x00\x31\x00\x43\x00\x40\x00\x41\x00\x42\x00\x26\x00\xff\xff\xff\xff\xff\xff\x3a\x00\x2b\x00\xff\xff\x01\x00\x02\x00\x03\x00\x04\x00\x31\x00\x26\x00\x07\x00\x08\x00\x09\x00\x36\x00\x0b\x00\x0c\x00\xff\xff\xff\xff\x26\x00\x10\x00\x31\x00\xff\xff\x13\x00\xff\xff\x41\x00\x0b\x00\x0c\x00\xff\xff\x0e\x00\x3a\x00\x10\x00\xff\xff\x12\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x0c\x00\xff\xff\x0e\x00\xff\xff\x10\x00\x31\x00\x12\x00\xff\xff\xff\xff\x2a\x00\x36\x00\xff\xff\x38\x00\xff\xff\x0c\x00\x3b\x00\x0e\x00\xff\xff\x10\x00\x02\x00\x12\x00\xff\xff\x02\x00\xff\xff\x07\x00\x08\x00\x09\x00\x07\x00\x08\x00\x09\x00\x2a\x00\xff\xff\x41\x00\x02\x00\xff\xff\xff\xff\x3a\x00\xff\xff\x07\x00\x08\x00\x09\x00\x02\x00\x40\x00\x41\x00\x2a\x00\x43\x00\x07\x00\x08\x00\x09\x00\xff\xff\xff\xff\x0f\x00\xff\xff\x41\x00\xff\xff\x26\x00\xff\xff\xff\xff\x26\x00\x17\x00\x18\x00\x32\x00\x33\x00\x1b\x00\x1c\x00\x1d\x00\xff\xff\x41\x00\xff\xff\x26\x00\xff\xff\xff\xff\x37\x00\x3e\x00\xff\xff\x37\x00\xff\xff\x26\x00\xff\xff\xff\xff\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x37\x00\xff\xff\xff\xff\x34\x00\x4f\x00\xff\xff\xff\xff\xff\xff\x37\x00\x54\x00\x55\x00\xff\xff\xff\xff\x3e\x00\x40\x00\x41\x00\xff\xff\x43\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\xff\xff\xff\xff\x18\x00\xff\xff\x4f\x00\x1b\x00\x1c\x00\x1d\x00\xff\xff\x54\x00\x55\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\xff\xff\xff\xff\x18\x00\xff\xff\x60\x00\x1b\x00\x1c\x00\x1d\x00\x18\x00\xff\xff\xff\xff\x1b\x00\x1c\x00\x1d\x00\x18\x00\x01\x00\x02\x00\x1b\x00\x1c\x00\x1d\x00\xff\xff\x07\x00\x08\x00\x09\x00\xff\xff\x40\x00\x41\x00\x18\x00\x43\x00\xff\xff\x1b\x00\x1c\x00\x1d\x00\xff\xff\x40\x00\x41\x00\x18\x00\x43\x00\xff\xff\x1b\x00\x1c\x00\x1d\x00\x40\x00\x41\x00\xff\xff\x43\x00\xff\xff\xff\xff\x40\x00\x41\x00\xff\xff\x43\x00\x26\x00\xff\xff\x40\x00\x41\x00\x18\x00\x43\x00\xff\xff\x1b\x00\x1c\x00\x1d\x00\x47\x00\x48\x00\x49\x00\x4a\x00\xff\xff\x40\x00\x41\x00\x18\x00\x43\x00\xff\xff\x1b\x00\x1c\x00\x1d\x00\xff\xff\x40\x00\x41\x00\x18\x00\x43\x00\xff\xff\x1b\x00\x1c\x00\x1d\x00\x18\x00\xff\xff\xff\xff\x1b\x00\x1c\x00\x1d\x00\x18\x00\xff\xff\xff\xff\x1b\x00\x1c\x00\x1d\x00\x40\x00\x41\x00\x18\x00\x43\x00\xff\xff\x1b\x00\x1c\x00\x1d\x00\xff\xff\x1b\x00\x1c\x00\x1d\x00\xff\xff\x40\x00\x41\x00\x18\x00\x43\x00\xff\xff\x1b\x00\x1c\x00\x1d\x00\xff\xff\x40\x00\x41\x00\xff\xff\x43\x00\xff\xff\xff\xff\x40\x00\x41\x00\xff\xff\x43\x00\xff\xff\xff\xff\x40\x00\x41\x00\xff\xff\x43\x00\x1b\x00\x1c\x00\x1d\x00\xff\xff\x40\x00\x41\x00\xff\xff\x43\x00\x40\x00\x41\x00\xff\xff\x43\x00\x1b\x00\x1c\x00\x1d\x00\xff\xff\xff\xff\x40\x00\x41\x00\xff\xff\x43\x00\x1b\x00\x1c\x00\x1d\x00\xff\xff\x1b\x00\x1c\x00\x1d\x00\xff\xff\x1b\x00\x1c\x00\x1d\x00\xff\xff\x1b\x00\x1c\x00\x1d\x00\xff\xff\x40\x00\x41\x00\xff\xff\x43\x00\x1b\x00\x1c\x00\x1d\x00\xff\xff\x1b\x00\x1c\x00\x1d\x00\xff\xff\x40\x00\x41\x00\xff\xff\x43\x00\x1b\x00\x1c\x00\x1d\x00\xff\xff\xff\xff\x40\x00\x41\x00\xff\xff\x43\x00\x40\x00\x41\x00\xff\xff\x43\x00\x40\x00\x41\x00\xff\xff\x43\x00\x40\x00\x41\x00\xff\xff\x43\x00\x1b\x00\x1c\x00\x1d\x00\xff\xff\x40\x00\x41\x00\xff\xff\x43\x00\x40\x00\x41\x00\xff\xff\x43\x00\x1b\x00\x1c\x00\x1d\x00\xff\xff\x40\x00\x41\x00\xff\xff\x43\x00\x1b\x00\x1c\x00\x1d\x00\xff\xff\x1b\x00\x1c\x00\x1d\x00\xff\xff\x1b\x00\x1c\x00\x1d\x00\xff\xff\x1b\x00\x1c\x00\x1d\x00\xff\xff\xff\xff\x40\x00\x41\x00\xff\xff\x43\x00\x1b\x00\x1c\x00\x1d\x00\xff\xff\x1b\x00\x1c\x00\x1d\x00\xff\xff\x40\x00\x41\x00\xff\xff\x43\x00\x1b\x00\x1c\x00\x1d\x00\xff\xff\x40\x00\x41\x00\xff\xff\x43\x00\x40\x00\x41\x00\xff\xff\x43\x00\x40\x00\x41\x00\xff\xff\x43\x00\x40\x00\x41\x00\xff\xff\x43\x00\x1b\x00\x1c\x00\x1d\x00\xff\xff\xff\xff\x40\x00\x41\x00\xff\xff\x43\x00\x40\x00\x41\x00\xff\xff\x43\x00\x1b\x00\x1c\x00\x1d\x00\xff\xff\x40\x00\x41\x00\xff\xff\x43\x00\x1b\x00\x1c\x00\x1d\x00\xff\xff\x1b\x00\x1c\x00\x1d\x00\xff\xff\x1b\x00\x1c\x00\x1d\x00\xff\xff\x1b\x00\x1c\x00\x1d\x00\xff\xff\x40\x00\x41\x00\xff\xff\x43\x00\x1b\x00\x1c\x00\x1d\x00\xff\xff\x1b\x00\x1c\x00\x1d\x00\xff\xff\xff\xff\x40\x00\x41\x00\xff\xff\x43\x00\x1b\x00\x1c\x00\x1d\x00\xff\xff\x40\x00\x41\x00\xff\xff\x43\x00\x40\x00\x41\x00\xff\xff\x43\x00\x40\x00\x41\x00\xff\xff\x43\x00\x40\x00\x41\x00\x2c\x00\x43\x00\x1b\x00\x1c\x00\x1d\x00\xff\xff\x40\x00\x41\x00\x3a\x00\x43\x00\x40\x00\x41\x00\xff\xff\x43\x00\x40\x00\x41\x00\xff\xff\x43\x00\x3e\x00\x40\x00\x41\x00\xff\xff\x43\x00\xff\xff\xff\xff\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\xff\xff\xff\xff\xff\xff\x3c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x40\x00\x41\x00\xff\xff\x43\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x2c\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x2c\x00\xff\xff\xff\xff\xff\xff\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\xff\xff\xff\xff\xff\xff\x3e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3e\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x41\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\xff\xff\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\xff\xff\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\xff\xff\xff\xff\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\xff\xff\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\xff\xff\xff\xff\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\xff\xff\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\xff\xff\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\xff\xff\xff\xff\xff\xff\x32\x00\x33\x00\x56\x00\x57\x00\x58\x00\x59\x00\x32\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x3e\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\xff\xff\x3e\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x3e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\xff\xff\x33\x00\xff\xff\xff\xff\x4f\x00\x37\x00\xff\xff\xff\xff\xff\xff\x54\x00\x55\x00\xff\xff\x3e\x00\x47\x00\x48\x00\x49\x00\x4a\x00\xff\xff\xff\xff\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x2e\x00\x2f\x00\x30\x00\xff\xff\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x36\x00\xff\xff\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x2e\x00\x2f\x00\x30\x00\x40\x00\x41\x00\xff\xff\x43\x00\xff\xff\x36\x00\xff\xff\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\xff\xff\x30\x00\xff\xff\x40\x00\x41\x00\xff\xff\x43\x00\x36\x00\xff\xff\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x31\x00\xff\xff\xff\xff\x40\x00\x41\x00\xff\xff\x43\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\xff\xff\xff\xff\xff\xff\x40\x00\x41\x00\xff\xff\x43\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\xff\xff\xff\xff\x40\x00\x41\x00\xff\xff\x43\x00\xff\xff\x45\x00\x46\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\xff\xff\xff\xff\x40\x00\x41\x00\x36\x00\x43\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3e\x00\xff\xff\xff\xff\x40\x00\x41\x00\xff\xff\x43\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\xff\xff\xff\xff\x40\x00\x41\x00\xff\xff\x43\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\xff\xff\xff\xff\xff\xff\x40\x00\x41\x00\xff\xff\x43\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\xff\xff\xff\xff\xff\xff\x40\x00\x41\x00\xff\xff\x43\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\xff\xff\xff\xff\xff\xff\x40\x00\x41\x00\xff\xff\x43\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\xff\xff\xff\xff\xff\xff\x40\x00\x41\x00\xff\xff\x43\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\xff\xff\xff\xff\xff\xff\x40\x00\x41\x00\xff\xff\x43\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\xff\xff\xff\xff\xff\xff\x40\x00\x41\x00\xff\xff\x43\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\xff\xff\xff\xff\xff\xff\x40\x00\x41\x00\xff\xff\x43\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\xff\xff\xff\xff\xff\xff\x40\x00\x41\x00\xff\xff\x43\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\xff\xff\xff\xff\xff\xff\x40\x00\x41\x00\xff\xff\x43\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\xff\xff\xff\xff\xff\xff\x40\x00\x41\x00\xff\xff\x43\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\xff\xff\xff\xff\xff\xff\x40\x00\x41\x00\xff\xff\x43\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\xff\xff\xff\xff\xff\xff\x40\x00\x41\x00\xff\xff\x43\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\xff\xff\xff\xff\xff\xff\x40\x00\x41\x00\xff\xff\x43\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\xff\xff\xff\xff\xff\xff\x40\x00\x41\x00\xff\xff\x43\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\xff\xff\xff\xff\xff\xff\x40\x00\x41\x00\xff\xff\x43\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\xff\xff\xff\xff\xff\xff\x40\x00\x41\x00\xff\xff\x43\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\xff\xff\xff\xff\xff\xff\x40\x00\x41\x00\xff\xff\x43\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\xff\xff\xff\xff\xff\xff\x40\x00\x41\x00\xff\xff\x43\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\xff\xff\xff\xff\xff\xff\x40\x00\x41\x00\xff\xff\x43\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\xff\xff\xff\xff\xff\xff\x40\x00\x41\x00\xff\xff\x43\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\xff\xff\xff\xff\xff\xff\x40\x00\x41\x00\xff\xff\x43\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\xff\xff\xff\xff\xff\xff\x40\x00\x41\x00\xff\xff\x43\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\xff\xff\xff\xff\xff\xff\x40\x00\x41\x00\xff\xff\x43\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x3c\x00\xff\xff\x3a\x00\xff\xff\x40\x00\x41\x00\x3a\x00\x43\x00\x40\x00\x41\x00\x3a\x00\x43\x00\x40\x00\x41\x00\x3a\x00\x43\x00\x40\x00\x41\x00\x3a\x00\x43\x00\x40\x00\x41\x00\xff\xff\x43\x00\x40\x00\x41\x00\xff\xff\x43\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"#
-
-happyTable :: HappyAddr
-happyTable = HappyA# "\x00\x00\x29\x02\x37\x00\x11\x00\x38\x00\x39\x00\x8e\x01\xbd\x01\x12\x00\x13\x00\x14\x00\xa0\x00\x3a\x00\x3b\x00\x0d\x00\x86\x01\x55\x01\x3c\x00\x92\x00\xa3\x01\x3d\x00\xf3\x01\x57\x00\xcd\x00\x1a\x02\xc3\x01\xa0\x00\x87\x01\x3f\x00\x85\x00\x8c\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x15\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\xf4\x01\x59\x00\x7d\x00\xa1\x00\x56\x01\x4d\x00\xa9\x00\x25\x02\x85\x00\xa4\x01\x4e\x00\x6b\x00\x4f\x00\x1d\x00\x0e\x00\x50\x00\x35\x00\x08\x02\xa1\x00\x1d\x02\x51\x00\x09\x02\xa2\x00\xdd\x01\x5a\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\x53\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\x20\x00\x11\x00\xa4\x00\x21\x00\x11\x00\xca\x00\x12\x00\x13\x00\x14\x00\x12\x00\x13\x00\x14\x00\x58\x01\x23\x00\x26\x02\xf0\x01\x18\x02\x26\x00\x27\x00\x28\x00\x29\x00\xff\xff\x7d\x00\xb6\x01\x5c\x00\xc7\x01\xa2\x00\xa3\x00\xcb\x00\x2a\x00\x2b\x00\xb7\x01\x6f\x00\x5b\x01\x70\x00\x8c\x00\x71\x00\x15\x00\x57\x00\x91\x01\x15\x00\x0e\x02\x2c\x00\x05\x02\x06\x02\x5d\x00\x7f\x00\xab\x01\xf4\x00\xba\x01\xab\x01\x5e\x00\x5c\x01\xf6\x00\x0e\x02\x93\x01\x5f\x00\xa4\x00\x85\x00\x15\x02\xe6\xff\x16\x02\x59\x00\xad\x01\x2f\x00\x14\x02\xad\x01\x60\x00\x80\x01\xed\x01\xf3\x01\x37\x00\x11\x00\x38\x00\x39\x00\xe6\xff\xe6\xff\x12\x00\x13\x00\x14\x00\xcf\x01\x3a\x00\x3b\x00\xb4\x01\xee\x01\x5a\x00\x3c\x00\x79\x00\x67\x00\x3d\x00\xce\x01\x8c\x00\x57\x00\x9a\x01\xf4\x01\xdb\x01\x7d\x00\x3f\x00\xff\xff\xb5\x01\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x15\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x85\x00\xa9\x01\x59\x00\x9d\x00\x9e\x00\x4d\x00\x7c\x01\x7f\x01\x80\x01\x22\x01\x4e\x00\x94\x01\x4f\x00\xaa\x01\x8e\x00\x50\x00\x7d\x00\x7e\x00\x57\x00\xaf\x01\x51\x00\x37\x00\x11\x00\x38\x00\x39\x00\x5a\x00\x52\x00\x12\x00\x13\x00\x14\x00\x19\x02\x3a\x00\x3b\x00\x32\x00\x33\x00\x34\x00\x3c\x00\x7f\x00\x64\x00\x3d\x00\x65\x00\x8a\x00\x59\x00\x66\x00\x67\x00\x8b\x00\x53\x00\x3f\x00\x57\x00\x53\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x15\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\xc7\x00\x5a\x00\x90\x00\x54\x00\x8c\x00\x4d\x00\x1d\x00\x0e\x00\x59\x00\x35\x00\x4e\x00\x91\x00\x4f\x00\x7d\x00\x92\x00\x50\x00\x5d\x01\x62\x00\x57\x00\x91\x01\x51\x00\x93\x00\x37\x00\x11\x00\x38\x00\x39\x00\x52\x00\x85\x00\x12\x00\x13\x00\x14\x00\x5a\x00\x3a\x00\x3b\x00\x92\x01\x93\x01\x69\x00\x3c\x00\xef\x01\x56\x00\x3d\x00\x2a\x01\x59\x00\x57\x00\x7d\x00\xc5\x01\x53\x00\x3e\x00\x3f\x00\x97\x00\x03\x02\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x15\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x5a\x00\xab\x01\x59\x00\x7d\x00\x37\x01\x4d\x00\x7d\x00\x8c\x00\x25\x02\x24\x02\x4e\x00\x9e\x01\x4f\x00\xc9\x01\x83\x00\x50\x00\xac\x01\xad\x01\x9f\x01\x19\x02\x51\x00\x37\x00\x11\x00\x38\x00\x39\x00\x5a\x00\x52\x00\x12\x00\x13\x00\x14\x00\x85\x00\x3a\x00\x3b\x00\x28\x02\x29\x02\x11\x00\x3c\x00\x85\x00\xa0\x01\x3d\x00\x12\x00\x13\x00\x14\x00\x7d\x00\xd2\x01\xa1\x01\x53\x00\x3f\x00\x57\x00\x10\x02\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x15\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x81\x00\x82\x00\x83\x00\x84\x00\xd9\x01\x4d\x00\x7d\x00\x15\x00\x59\x00\x23\x02\x4e\x00\x00\x02\x4f\x00\xf6\xfe\x7d\x00\x50\x00\xf6\xfe\xf6\xfe\x9c\x01\x02\x02\x51\x00\x20\x02\xe5\x01\x82\x00\x83\x00\x85\x00\x52\x00\x11\x02\x03\x02\xe9\x00\xea\x00\x5a\x00\xf6\xfe\xf6\xfe\xf6\xfe\xf6\xfe\xf6\xfe\x7d\x00\xf6\xfe\xf6\xfe\xf6\xfe\xeb\x00\xec\x00\xf6\xfe\xed\x00\xd7\x01\x53\x00\x85\x00\xf6\xfe\xd8\x01\xf6\xfe\xf6\xfe\x30\x01\x31\x01\x04\x02\xf6\xfe\xf6\xfe\xf6\xfe\xf6\xfe\xf6\xfe\xf6\xfe\xf6\xfe\xf6\xfe\xf6\xfe\xf6\xfe\xf6\xfe\xf6\xfe\xf6\xfe\xf6\xfe\xf6\xfe\xf6\xfe\xf6\xfe\xf6\xfe\xf6\xfe\xf6\xfe\xf6\xfe\xf6\xfe\xf6\xfe\x0c\x02\xf6\xfe\xf6\xfe\xf6\xfe\xf6\xfe\xf6\xfe\xf6\xfe\x11\x00\x34\x01\x35\x01\x73\x00\x11\x00\x12\x00\x13\x00\x75\x00\x76\x00\x12\x00\x13\x00\x14\x00\x11\x00\x87\x00\x82\x00\x83\x00\x88\x00\x12\x00\x13\x00\x14\x00\x5c\x00\x77\x00\xb8\x01\xa4\x01\x5c\x00\x10\x02\x98\x01\xbf\x01\x7e\x01\x5f\x01\xb9\x01\x6f\x00\x5c\x00\x70\x00\xbc\x01\x71\x00\x15\x00\x57\x00\x85\x00\x9a\x01\x15\x00\x5d\x00\x98\x01\x99\x01\xd9\x01\x5d\x00\x7d\x00\x5e\x00\x15\x00\xdd\x01\xd3\x01\x5e\x00\x5f\x00\x5d\x00\x57\x00\x9a\x01\x5f\x00\xf7\x01\x31\x01\x5e\x00\xfa\x01\x59\x00\xda\x01\x60\x00\x5f\x00\x7c\x00\x0c\x01\x60\x00\x16\x01\xc5\x01\xc8\x01\x82\x00\x83\x00\x20\x00\x11\x00\x60\x00\x21\x00\x95\x00\x59\x00\x12\x00\x13\x00\x14\x00\xa2\x01\x9f\x01\x5a\x00\x22\x00\x23\x00\x24\x00\xfe\x01\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2d\x01\x85\x00\x37\x01\x36\x01\x9b\x00\x11\x00\x38\x01\x5a\x00\x2a\x00\x2b\x00\x12\x00\x13\x00\x14\x00\xd4\x01\x33\x00\x34\x00\x15\x00\x20\x00\x11\x00\xcd\x00\x21\x00\x2c\x00\x39\x01\x12\x00\x13\x00\x14\x00\x3a\x01\xf4\x00\xf5\x00\x22\x00\x23\x00\x24\x00\xf6\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x56\x00\xa5\x01\xa1\x01\x15\x00\x57\x00\x2f\x00\x58\x00\x83\x01\x2a\x00\x2b\x00\x5a\x01\x84\x01\x1d\x00\x0e\x00\x9c\x00\x35\x00\x15\x00\x20\x00\x11\x00\x9d\x00\x21\x00\x2c\x00\xa7\x01\x12\x00\x13\x00\x14\x00\xa8\x01\xf4\x00\x59\x00\x22\x00\x23\x00\x24\x00\xf6\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x8e\x00\xcb\x01\x82\x00\x83\x00\x57\x00\x2f\x00\x5e\x01\x5f\x01\x2a\x00\x2b\x00\x64\x01\x1d\x00\x0e\x00\x5a\x00\x98\x00\x99\x00\x15\x00\x20\x00\x11\x00\x65\x01\x21\x00\x2c\x00\x66\x01\x12\x00\x13\x00\x14\x00\x85\x00\x2d\x00\x59\x00\x22\x00\x23\x00\x24\x00\x2e\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x60\x00\xea\x01\x33\x00\x34\x00\x57\x00\x2f\x00\x67\x01\x68\x01\x2a\x00\x2b\x00\x69\x01\xeb\x00\x1b\x02\x5a\x00\x2a\x01\x6a\x01\x15\x00\x20\x00\x11\x00\x6b\x01\x21\x00\x2c\x00\x6c\x01\x12\x00\x13\x00\x14\x00\x6d\x01\x2d\x00\x59\x00\x22\x00\x23\x00\x24\x00\xf6\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x1d\x00\x0e\x00\x6e\x01\x35\x00\x6f\x01\x2f\x00\x70\x01\x71\x01\x2a\x00\x2b\x00\x85\x01\x20\x00\x11\x00\x5a\x00\x21\x00\x72\x01\x15\x00\x12\x00\x13\x00\x14\x00\x73\x01\x2c\x00\xeb\x00\xec\x00\x23\x00\x2a\x01\x74\x01\x2d\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2e\x00\xc3\x00\x75\x01\x76\x01\x32\x00\x33\x00\x34\x00\x77\x01\x2a\x00\x2b\x00\xc4\x00\x2f\x00\x78\x01\xc5\x00\x79\x01\x7a\x01\x15\x00\x20\x00\x11\x00\x7b\x01\x21\x00\x2c\x00\x7d\x01\x12\x00\x13\x00\x14\x00\x96\x01\xf4\x00\x2f\x01\xa6\x01\x23\x00\xae\x01\xf6\x00\xb1\x01\x26\x00\x27\x00\x28\x00\x29\x00\xcc\x01\x82\x00\x83\x00\x1d\x00\x0e\x00\x2f\x00\x35\x00\xb3\x01\x2a\x00\x2b\x00\xb6\x01\x20\x00\x11\x00\xff\xff\x21\x00\x79\x00\x15\x00\x12\x00\x13\x00\x14\x00\x78\x00\x2c\x00\x8e\x00\x92\x00\x23\x00\x85\x00\xff\xff\xf4\x00\x26\x00\x27\x00\x28\x00\x29\x00\xf6\x00\x8d\x01\xe2\x01\xe3\x01\xe4\x01\xe5\x01\x82\x00\x83\x00\x2a\x00\x2b\x00\xff\xff\x2f\x00\x20\x00\x11\x00\xcd\x00\x21\x00\x15\x00\xfb\x01\x12\x00\x13\x00\x14\x00\x2c\x00\x7d\x00\x1d\x00\x0e\x00\x23\x00\xf8\x00\xf4\x00\x04\x01\x26\x00\x85\x00\xff\xff\xf6\x00\x20\x00\x11\x00\x04\x01\x21\x00\xd4\x00\x23\x01\x12\x00\x13\x00\x14\x00\x11\x01\x2f\x00\x1d\x00\x0e\x00\x23\x00\xf8\x00\xff\xff\x15\x00\x26\x00\xfe\x01\x6c\x00\x6d\x00\xfa\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\x0d\x00\xf4\x00\x6e\x00\x6f\x00\x3e\x00\x70\x00\xf6\x00\x71\x00\x56\x00\x57\x00\x64\x00\x15\x00\x24\x01\x6b\x00\x6c\x00\x6d\x00\x06\x01\x2f\x00\x1d\x00\x0e\x00\x00\x00\xf8\x00\xf4\x00\x6e\x00\x6f\x00\x00\x00\x70\x00\xf6\x00\x71\x00\x00\x00\x57\x00\x1e\x02\x00\x00\x59\x00\x32\x00\x33\x00\x34\x00\x11\x00\x2f\x00\x00\x00\x73\x00\x74\x00\x12\x00\x13\x00\x75\x00\x76\x00\x00\x00\x00\x00\xbc\x01\x6f\x00\x00\x00\x70\x00\x00\x00\x71\x00\x59\x00\x57\x00\x5a\x00\x5c\x00\x77\x00\x00\x00\x11\x00\x1d\x00\x0e\x00\x73\x00\xae\x01\x12\x00\x13\x00\x75\x00\x76\x00\x00\x00\x00\x00\x1d\x00\x0e\x00\x15\x00\x35\x00\x00\x00\x00\x00\x5a\x00\x5d\x00\x59\x00\x5c\x00\x77\x00\x00\x00\x00\x00\x5e\x00\x11\x00\x00\x00\x00\x00\x11\x00\x5f\x00\x12\x00\x13\x00\x14\x00\x12\x00\x13\x00\x14\x00\x15\x00\x01\x01\x02\x01\x00\x00\x60\x00\x5d\x00\x5a\x00\x1d\x00\x0e\x00\x5c\x00\xf8\x00\x5e\x00\x5c\x00\x00\x00\x00\x00\x11\x00\x5f\x00\x25\x01\x69\x00\x00\x00\x12\x00\x13\x00\x14\x00\x1d\x00\x0e\x00\x15\x00\xf8\x00\x60\x00\x15\x00\x00\x00\x5d\x00\x26\x01\x00\x00\x5d\x00\x00\x00\x5c\x00\x5e\x00\x1d\x00\x0e\x00\x5e\x00\xf8\x00\x5f\x00\x0d\x02\x11\x00\x5f\x00\xc7\x01\x00\x00\x00\x00\x12\x00\x13\x00\x14\x00\x15\x00\x60\x00\x11\x00\x00\x00\x60\x00\x5d\x00\x00\x00\x12\x00\x13\x00\x14\x00\x00\x00\x5e\x00\x0d\x00\x0e\x00\x14\x02\x11\x00\x5f\x00\x28\x01\x00\x00\x00\x00\x12\x00\x13\x00\x14\x00\x1d\x00\x0e\x00\x11\x00\xf8\x00\x60\x00\x15\x00\x00\x00\x12\x00\x13\x00\x14\x00\x5d\x00\x00\x00\x5c\x00\x00\x00\x00\x00\x15\x00\x5e\x00\x11\x00\x00\x00\x00\x00\x5d\x00\x5f\x00\x12\x00\x13\x00\x14\x00\x13\x02\x5e\x00\x00\x00\x15\x00\x00\x00\x00\x00\x5f\x00\x60\x00\x5d\x00\x00\x00\xbf\x01\x00\x00\x00\x00\x15\x00\x5e\x00\x11\x00\x00\x00\x60\x00\x5d\x00\x5f\x00\x12\x00\x13\x00\x14\x00\x00\x00\x5e\x00\x00\x00\x7d\x00\x00\x00\x15\x00\x5f\x00\x60\x00\x00\x00\x11\x00\xe0\x01\x00\x00\x00\x00\x11\x00\x12\x00\x13\x00\x14\x00\x60\x00\x12\x00\x13\x00\x14\x00\x00\x00\x1d\x02\x00\x00\x60\x01\x61\x01\x62\x01\x00\x00\x15\x00\x63\x01\x11\x00\x00\x00\x00\x00\x5d\x00\x00\x00\x12\x00\x13\x00\x14\x00\xc7\x00\x5e\x00\xe9\x01\x32\x00\x33\x00\x34\x00\x5f\x00\x15\x00\x00\x00\x11\x00\xed\x01\x15\x00\x5d\x00\x00\x00\x12\x00\x13\x00\x14\x00\x60\x00\x5e\x00\x0d\x00\x0e\x00\xb1\x01\x9c\x01\x5f\x00\x0d\x00\x0e\x00\x14\x01\x82\x01\x15\x00\x00\x00\x11\x00\xc1\x01\x00\x00\x5d\x00\x60\x00\x12\x00\x13\x00\x14\x00\x00\x00\x5e\x00\x1d\x00\x0e\x00\xf7\x00\x35\x00\x5f\x00\x15\x00\x00\x00\x00\x00\x1d\x00\x0e\x00\x5d\x00\xf8\x00\x90\x01\x11\x00\x00\x00\x60\x00\x5e\x00\x00\x00\x12\x00\x13\x00\x14\x00\x5f\x00\x11\x00\x00\x00\x00\x00\x98\x01\x15\x00\x12\x00\x13\x00\x14\x00\x21\x02\x5d\x00\x60\x00\x32\x00\x33\x00\x34\x00\x00\x00\x5e\x00\x87\x00\x11\x00\x00\x00\x00\x00\x5f\x00\x00\x00\x12\x00\x13\x00\x14\x00\xa6\x00\x00\x00\x15\x00\x32\x00\x33\x00\x34\x00\x60\x00\x5d\x00\x8a\x00\xa7\x00\x00\x00\x15\x00\x5c\x00\x5e\x00\x11\x00\x00\x00\x5d\x00\x00\x00\x5f\x00\x12\x00\x13\x00\x14\x00\x5e\x00\x1d\x00\x0e\x00\x00\x00\x35\x00\x5f\x00\x15\x00\x60\x00\x11\x00\x35\xff\x00\x00\x5d\x00\x00\x00\x12\x00\x13\x00\x14\x00\x60\x00\x5e\x00\x1d\x00\x0e\x00\x11\x00\x35\x00\x5f\x00\x00\x00\x00\x00\x12\x00\x13\x00\x14\x00\x15\x00\x11\x00\x00\x00\xfa\x00\x00\x00\x60\x00\x12\x00\x13\x00\x14\x00\x1d\x00\x0e\x00\x9c\x01\xf8\x00\x0d\x00\x0e\x00\x0f\x00\x15\x00\x00\x00\x00\x00\x00\x00\xd1\x01\x5d\x00\x00\x00\x37\x00\x11\x00\x38\x00\x39\x00\x5e\x00\x15\x00\x12\x00\x13\x00\x14\x00\x5f\x00\x3a\x00\x3b\x00\x00\x00\x00\x00\x15\x00\x3c\x00\x9c\x01\x00\x00\x3d\x00\x00\x00\x60\x00\x7a\x00\x6f\x00\x00\x00\x70\x00\x9d\x01\x71\x00\x00\x00\x57\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x15\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\xc1\x01\x00\x00\x70\x00\x00\x00\x71\x00\x4d\x00\x57\x00\x00\x00\x00\x00\x59\x00\x4e\x00\x00\x00\x4f\x00\x00\x00\xc2\x01\x50\x00\x70\x00\x00\x00\x71\x00\x11\x00\x57\x00\x00\x00\x11\x00\x00\x00\x12\x00\x13\x00\x14\x00\x12\x00\x13\x00\x14\x00\x59\x00\x00\x00\x5a\x00\x11\x00\x00\x00\x00\x00\xfb\x00\x00\x00\x12\x00\x13\x00\x14\x00\x11\x00\x1d\x00\x0e\x00\x59\x00\xf8\x00\x12\x00\x13\x00\x14\x00\x00\x00\x00\x00\x2f\x00\x00\x00\x5a\x00\x00\x00\x15\x00\x00\x00\x00\x00\x15\x00\x30\x00\x31\x00\x32\x01\x33\x01\x32\x00\x33\x00\x34\x00\x00\x00\x5a\x00\x00\x00\x15\x00\x00\x00\x00\x00\x2c\x01\x07\x01\x00\x00\x81\x00\x00\x00\x15\x00\x00\x00\x00\x00\x08\x01\x09\x01\x0a\x01\x0b\x01\x0c\x01\x0d\x01\xa6\x00\x00\x00\x00\x00\xf2\xfe\x0e\x01\x00\x00\x00\x00\x00\x00\xef\x00\x0f\x01\x10\x01\x00\x00\x00\x00\xf2\xfe\x1d\x00\x0e\x00\x00\x00\x35\x00\xf2\xfe\xf2\xfe\xf2\xfe\xf2\xfe\xf2\xfe\xf2\xfe\xf2\xfe\xf2\xfe\x00\x00\x00\x00\x00\x02\x00\x00\xf2\xfe\x32\x00\x33\x00\x34\x00\x00\x00\xf2\xfe\xf2\xfe\xc7\x00\xc8\x00\xc9\x00\x32\x00\x33\x00\x34\x00\x00\x00\x00\x00\x06\x02\x00\x00\xf2\xfe\x32\x00\x33\x00\x34\x00\x11\x02\x00\x00\x00\x00\x32\x00\x33\x00\x34\x00\xd1\x01\x58\x01\x11\x00\x32\x00\x33\x00\x34\x00\x00\x00\x12\x00\x13\x00\x14\x00\x00\x00\x1d\x00\x0e\x00\xde\x01\x35\x00\x00\x00\x32\x00\x33\x00\x34\x00\x00\x00\x1d\x00\x0e\x00\xe0\x01\x35\x00\x00\x00\x32\x00\x33\x00\x34\x00\x1d\x00\x0e\x00\x00\x00\x35\x00\x00\x00\x00\x00\x1d\x00\x0e\x00\x00\x00\x35\x00\x15\x00\x00\x00\x1d\x00\x0e\x00\xe1\x01\x35\x00\x00\x00\x32\x00\x33\x00\x34\x00\x0a\x01\x0b\x01\x0c\x01\x0d\x01\x00\x00\x1d\x00\x0e\x00\xe6\x01\x35\x00\x00\x00\x32\x00\x33\x00\x34\x00\x00\x00\x1d\x00\x0e\x00\xe7\x01\x35\x00\x00\x00\x32\x00\x33\x00\x34\x00\xe8\x01\x00\x00\x00\x00\x32\x00\x33\x00\x34\x00\xeb\x01\x00\x00\x00\x00\x32\x00\x33\x00\x34\x00\x1d\x00\x0e\x00\x96\x01\x35\x00\x00\x00\x32\x00\x33\x00\x34\x00\x00\x00\x3a\x01\x33\x00\x34\x00\x00\x00\x1d\x00\x0e\x00\x61\x00\x35\x00\x00\x00\x32\x00\x33\x00\x34\x00\x00\x00\x1d\x00\x0e\x00\x00\x00\x35\x00\x00\x00\x00\x00\x1d\x00\x0e\x00\x00\x00\x35\x00\x00\x00\x00\x00\x1d\x00\x0e\x00\x00\x00\x35\x00\x3b\x01\x33\x00\x34\x00\x00\x00\x1d\x00\x0e\x00\x00\x00\x35\x00\x1d\x00\x0e\x00\x00\x00\x35\x00\x3c\x01\x33\x00\x34\x00\x00\x00\x00\x00\x1d\x00\x0e\x00\x00\x00\x35\x00\x3d\x01\x33\x00\x34\x00\x00\x00\x3e\x01\x33\x00\x34\x00\x00\x00\x3f\x01\x33\x00\x34\x00\x00\x00\x40\x01\x33\x00\x34\x00\x00\x00\x1d\x00\x0e\x00\x00\x00\x35\x00\x41\x01\x33\x00\x34\x00\x00\x00\x42\x01\x33\x00\x34\x00\x00\x00\x1d\x00\x0e\x00\x00\x00\x35\x00\x43\x01\x33\x00\x34\x00\x00\x00\x00\x00\x1d\x00\x0e\x00\x00\x00\x35\x00\x1d\x00\x0e\x00\x00\x00\x35\x00\x1d\x00\x0e\x00\x00\x00\x35\x00\x1d\x00\x0e\x00\x00\x00\x35\x00\x44\x01\x33\x00\x34\x00\x00\x00\x1d\x00\x0e\x00\x00\x00\x35\x00\x1d\x00\x0e\x00\x00\x00\x35\x00\x45\x01\x33\x00\x34\x00\x00\x00\x1d\x00\x0e\x00\x00\x00\x35\x00\x46\x01\x33\x00\x34\x00\x00\x00\x47\x01\x33\x00\x34\x00\x00\x00\x48\x01\x33\x00\x34\x00\x00\x00\x49\x01\x33\x00\x34\x00\x00\x00\x00\x00\x1d\x00\x0e\x00\x00\x00\x35\x00\x4a\x01\x33\x00\x34\x00\x00\x00\x4b\x01\x33\x00\x34\x00\x00\x00\x1d\x00\x0e\x00\x00\x00\x35\x00\x4c\x01\x33\x00\x34\x00\x00\x00\x1d\x00\x0e\x00\x00\x00\x35\x00\x1d\x00\x0e\x00\x00\x00\x35\x00\x1d\x00\x0e\x00\x00\x00\x35\x00\x1d\x00\x0e\x00\x00\x00\x35\x00\x4d\x01\x33\x00\x34\x00\x00\x00\x00\x00\x1d\x00\x0e\x00\x00\x00\x35\x00\x1d\x00\x0e\x00\x00\x00\x35\x00\x4e\x01\x33\x00\x34\x00\x00\x00\x1d\x00\x0e\x00\x00\x00\x35\x00\x4f\x01\x33\x00\x34\x00\x00\x00\x50\x01\x33\x00\x34\x00\x00\x00\x51\x01\x33\x00\x34\x00\x00\x00\x52\x01\x33\x00\x34\x00\x00\x00\x1d\x00\x0e\x00\x00\x00\x35\x00\x53\x01\x33\x00\x34\x00\x00\x00\x96\x00\x33\x00\x34\x00\x00\x00\x00\x00\x1d\x00\x0e\x00\x00\x00\x35\x00\x95\x00\x33\x00\x34\x00\x00\x00\x1d\x00\x0e\x00\x00\x00\x35\x00\x1d\x00\x0e\x00\x00\x00\x35\x00\x1d\x00\x0e\x00\x00\x00\x35\x00\x1d\x00\x0e\x00\xfb\x01\x35\x00\x96\x00\x33\x00\x34\x00\x00\x00\x1d\x00\x0e\x00\xfc\x00\x35\x00\x1d\x00\x0e\x00\x00\x00\x35\x00\x1d\x00\x0e\x00\x00\x00\xf8\x00\x07\x01\x1d\x00\x0e\x00\x00\x00\x35\x00\x00\x00\x00\x00\x08\x01\x09\x01\x0a\x01\x0b\x01\x0c\x01\x0d\x01\x00\x00\x00\x00\x00\x00\xcf\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1d\x00\x0e\x00\x00\x00\x35\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xfd\x01\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\x2a\x01\x00\x00\x00\x00\x00\x00\x1f\x02\xe4\x01\xe5\x01\x82\x00\x83\x00\x00\x00\x00\x00\x00\x00\x07\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x01\x08\x01\x09\x01\x0a\x01\x0b\x01\x0c\x01\x0d\x01\x08\x01\x09\x01\x0a\x01\x0b\x01\x0c\x01\x0d\x01\x85\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\x00\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\x00\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\x00\x00\x00\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\x00\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\x00\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\x00\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\x00\x00\x00\x00\x00\x00\x32\x01\x33\x01\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xd6\x01\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\x07\x01\xe5\x00\xe6\x00\xe7\x00\xe8\x00\x00\x00\x07\x01\x08\x01\x09\x01\x0a\x01\x0b\x01\x0c\x01\x0d\x01\x08\x01\x09\x01\x0a\x01\x0b\x01\x0c\x01\x0d\x01\x07\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x01\x09\x01\x0a\x01\x0b\x01\x0c\x01\x0d\x01\x00\x00\x33\x01\x00\x00\x00\x00\x0e\x01\xdb\x01\x00\x00\x00\x00\x00\x00\x0f\x01\x10\x01\x00\x00\x07\x01\xd2\x00\xd3\x00\xd4\x00\xd5\x00\x00\x00\x00\x00\x08\x01\x09\x01\x0a\x01\x0b\x01\x0c\x01\x0d\x01\x00\x00\x00\x00\x00\x00\x00\x00\x93\x01\x16\x00\x17\x00\x00\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\x18\x00\x00\x00\x19\x00\x1a\x00\x1b\x00\x00\x00\x1c\x00\x15\x00\x16\x00\x17\x00\x1d\x00\x0e\x00\x00\x00\x1e\x00\x00\x00\x18\x00\x00\x00\x19\x00\x1a\x00\x1b\x00\x00\x00\x1c\x00\x00\x00\x12\x01\x00\x00\x1d\x00\x0e\x00\x00\x00\x1e\x00\x18\x00\x00\x00\x13\x01\x1a\x00\x1b\x00\x00\x00\x1c\x00\xf0\x01\x00\x00\x00\x00\x1d\x00\x0e\x00\x00\x00\x1e\x00\xf1\x01\x1a\x00\x1b\x00\x00\x00\x1c\x00\x00\x00\x00\x00\x00\x00\x1d\x00\x0e\x00\x00\x00\x1e\x00\x87\x01\x1a\x00\x1b\x00\x00\x00\x1c\x00\x88\x01\x00\x00\x00\x00\x1d\x00\x89\x01\x00\x00\x1e\x00\x00\x00\x8a\x01\x8b\x01\xef\x00\xf0\x00\xf1\x00\x1a\x00\x1b\x00\x00\x00\x1c\x00\xf2\x00\x00\x00\x00\x00\x1d\x00\x0e\x00\xf4\x01\x1e\x00\xf5\x01\x1a\x00\x1b\x00\x00\x00\x1c\x00\x07\x01\x00\x00\x00\x00\x1d\x00\x0e\x00\x00\x00\x1e\x00\x08\x01\x09\x01\x0a\x01\x0b\x01\x0c\x01\x0d\x01\x2d\x01\x1a\x00\x1b\x00\x00\x00\x1c\x00\xf2\x00\x00\x00\x00\x00\x1d\x00\x0e\x00\x00\x00\x1e\x00\xf1\x01\x1a\x00\x1b\x00\x00\x00\x1c\x00\x00\x00\x00\x00\x00\x00\x1d\x00\x0e\x00\x00\x00\x1e\x00\x07\x02\x1a\x00\x1b\x00\x00\x00\x1c\x00\x00\x00\x00\x00\x00\x00\x1d\x00\x0e\x00\x00\x00\x1e\x00\x0a\x02\x1a\x00\x1b\x00\x00\x00\x1c\x00\x00\x00\x00\x00\x00\x00\x1d\x00\x0e\x00\x00\x00\x1e\x00\xca\x01\x1a\x00\x1b\x00\x00\x00\x1c\x00\x00\x00\x00\x00\x00\x00\x1d\x00\x0e\x00\x00\x00\x1e\x00\xcd\x01\x1a\x00\x1b\x00\x00\x00\x1c\x00\x00\x00\x00\x00\x00\x00\x1d\x00\x0e\x00\x00\x00\x1e\x00\xf7\x01\x1a\x00\x1b\x00\x00\x00\x1c\x00\x00\x00\x00\x00\x00\x00\x1d\x00\x0e\x00\x00\x00\x1e\x00\xf8\x01\x1a\x00\x1b\x00\x00\x00\x1c\x00\x00\x00\x00\x00\x00\x00\x1d\x00\x0e\x00\x00\x00\x1e\x00\x16\x01\x1a\x00\x1b\x00\x00\x00\x1c\x00\x00\x00\x00\x00\x00\x00\x1d\x00\x0e\x00\x00\x00\x1e\x00\x17\x01\x1a\x00\x1b\x00\x00\x00\x1c\x00\x00\x00\x00\x00\x00\x00\x1d\x00\x0e\x00\x00\x00\x1e\x00\x18\x01\x1a\x00\x1b\x00\x00\x00\x1c\x00\x00\x00\x00\x00\x00\x00\x1d\x00\x0e\x00\x00\x00\x1e\x00\x19\x01\x1a\x00\x1b\x00\x00\x00\x1c\x00\x00\x00\x00\x00\x00\x00\x1d\x00\x0e\x00\x00\x00\x1e\x00\x1a\x01\x1a\x00\x1b\x00\x00\x00\x1c\x00\x00\x00\x00\x00\x00\x00\x1d\x00\x0e\x00\x00\x00\x1e\x00\x1b\x01\x1a\x00\x1b\x00\x00\x00\x1c\x00\x00\x00\x00\x00\x00\x00\x1d\x00\x0e\x00\x00\x00\x1e\x00\x1c\x01\x1a\x00\x1b\x00\x00\x00\x1c\x00\x00\x00\x00\x00\x00\x00\x1d\x00\x0e\x00\x00\x00\x1e\x00\x1d\x01\x1a\x00\x1b\x00\x00\x00\x1c\x00\x00\x00\x00\x00\x00\x00\x1d\x00\x0e\x00\x00\x00\x1e\x00\x1e\x01\x1a\x00\x1b\x00\x00\x00\x1c\x00\x00\x00\x00\x00\x00\x00\x1d\x00\x0e\x00\x00\x00\x1e\x00\x1f\x01\x1a\x00\x1b\x00\x00\x00\x1c\x00\x00\x00\x00\x00\x00\x00\x1d\x00\x0e\x00\x00\x00\x1e\x00\x20\x01\x1a\x00\x1b\x00\x00\x00\x1c\x00\x00\x00\x00\x00\x00\x00\x1d\x00\x0e\x00\x00\x00\x1e\x00\x21\x01\x1a\x00\x1b\x00\x00\x00\x1c\x00\x00\x00\x00\x00\x00\x00\x1d\x00\x0e\x00\x00\x00\x1e\x00\x27\x01\x1a\x00\x1b\x00\x00\x00\x1c\x00\x00\x00\x00\x00\x00\x00\x1d\x00\x0e\x00\x00\x00\x1e\x00\x54\x01\x1a\x00\x1b\x00\x00\x00\x1c\x00\x00\x00\x00\x00\x00\x00\x1d\x00\x0e\x00\x00\x00\x1e\x00\x8d\x01\x1a\x00\x1b\x00\x00\x00\x1c\x00\x00\x00\x00\x00\x00\x00\x1d\x00\x0e\x00\x00\x00\x1e\x00\xf6\x00\x1a\x00\x1b\x00\x00\x00\x1c\x00\x00\x00\x00\x00\x00\x00\x1d\x00\x0e\x00\x00\x00\x1e\x00\x11\x01\x1a\x00\x1b\x00\x00\x00\x1c\x00\x00\x00\xfd\x00\x00\x00\x1d\x00\x0e\x00\xfe\x00\x1e\x00\x1d\x00\x0e\x00\xff\x00\xf8\x00\x1d\x00\x0e\x00\x00\x01\xf8\x00\x1d\x00\x0e\x00\x04\x01\xf8\x00\x1d\x00\x0e\x00\x00\x00\xf8\x00\x1d\x00\x0e\x00\x00\x00\xf8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"#
-
-happyReduceArr = Happy_Data_Array.array (11, 299) [
-	(11 , happyReduce_11),
-	(12 , happyReduce_12),
-	(13 , happyReduce_13),
-	(14 , happyReduce_14),
-	(15 , happyReduce_15),
-	(16 , happyReduce_16),
-	(17 , happyReduce_17),
-	(18 , happyReduce_18),
-	(19 , happyReduce_19),
-	(20 , happyReduce_20),
-	(21 , happyReduce_21),
-	(22 , happyReduce_22),
-	(23 , happyReduce_23),
-	(24 , happyReduce_24),
-	(25 , happyReduce_25),
-	(26 , happyReduce_26),
-	(27 , happyReduce_27),
-	(28 , happyReduce_28),
-	(29 , happyReduce_29),
-	(30 , happyReduce_30),
-	(31 , happyReduce_31),
-	(32 , happyReduce_32),
-	(33 , happyReduce_33),
-	(34 , happyReduce_34),
-	(35 , happyReduce_35),
-	(36 , happyReduce_36),
-	(37 , happyReduce_37),
-	(38 , happyReduce_38),
-	(39 , happyReduce_39),
-	(40 , happyReduce_40),
-	(41 , happyReduce_41),
-	(42 , happyReduce_42),
-	(43 , happyReduce_43),
-	(44 , happyReduce_44),
-	(45 , happyReduce_45),
-	(46 , happyReduce_46),
-	(47 , happyReduce_47),
-	(48 , happyReduce_48),
-	(49 , happyReduce_49),
-	(50 , happyReduce_50),
-	(51 , happyReduce_51),
-	(52 , happyReduce_52),
-	(53 , happyReduce_53),
-	(54 , happyReduce_54),
-	(55 , happyReduce_55),
-	(56 , happyReduce_56),
-	(57 , happyReduce_57),
-	(58 , happyReduce_58),
-	(59 , happyReduce_59),
-	(60 , happyReduce_60),
-	(61 , happyReduce_61),
-	(62 , happyReduce_62),
-	(63 , happyReduce_63),
-	(64 , happyReduce_64),
-	(65 , happyReduce_65),
-	(66 , happyReduce_66),
-	(67 , happyReduce_67),
-	(68 , happyReduce_68),
-	(69 , happyReduce_69),
-	(70 , happyReduce_70),
-	(71 , happyReduce_71),
-	(72 , happyReduce_72),
-	(73 , happyReduce_73),
-	(74 , happyReduce_74),
-	(75 , happyReduce_75),
-	(76 , happyReduce_76),
-	(77 , happyReduce_77),
-	(78 , happyReduce_78),
-	(79 , happyReduce_79),
-	(80 , happyReduce_80),
-	(81 , happyReduce_81),
-	(82 , happyReduce_82),
-	(83 , happyReduce_83),
-	(84 , happyReduce_84),
-	(85 , happyReduce_85),
-	(86 , happyReduce_86),
-	(87 , happyReduce_87),
-	(88 , happyReduce_88),
-	(89 , happyReduce_89),
-	(90 , happyReduce_90),
-	(91 , happyReduce_91),
-	(92 , happyReduce_92),
-	(93 , happyReduce_93),
-	(94 , happyReduce_94),
-	(95 , happyReduce_95),
-	(96 , happyReduce_96),
-	(97 , happyReduce_97),
-	(98 , happyReduce_98),
-	(99 , happyReduce_99),
-	(100 , happyReduce_100),
-	(101 , happyReduce_101),
-	(102 , happyReduce_102),
-	(103 , happyReduce_103),
-	(104 , happyReduce_104),
-	(105 , happyReduce_105),
-	(106 , happyReduce_106),
-	(107 , happyReduce_107),
-	(108 , happyReduce_108),
-	(109 , happyReduce_109),
-	(110 , happyReduce_110),
-	(111 , happyReduce_111),
-	(112 , happyReduce_112),
-	(113 , happyReduce_113),
-	(114 , happyReduce_114),
-	(115 , happyReduce_115),
-	(116 , happyReduce_116),
-	(117 , happyReduce_117),
-	(118 , happyReduce_118),
-	(119 , happyReduce_119),
-	(120 , happyReduce_120),
-	(121 , happyReduce_121),
-	(122 , happyReduce_122),
-	(123 , happyReduce_123),
-	(124 , happyReduce_124),
-	(125 , happyReduce_125),
-	(126 , happyReduce_126),
-	(127 , happyReduce_127),
-	(128 , happyReduce_128),
-	(129 , happyReduce_129),
-	(130 , happyReduce_130),
-	(131 , happyReduce_131),
-	(132 , happyReduce_132),
-	(133 , happyReduce_133),
-	(134 , happyReduce_134),
-	(135 , happyReduce_135),
-	(136 , happyReduce_136),
-	(137 , happyReduce_137),
-	(138 , happyReduce_138),
-	(139 , happyReduce_139),
-	(140 , happyReduce_140),
-	(141 , happyReduce_141),
-	(142 , happyReduce_142),
-	(143 , happyReduce_143),
-	(144 , happyReduce_144),
-	(145 , happyReduce_145),
-	(146 , happyReduce_146),
-	(147 , happyReduce_147),
-	(148 , happyReduce_148),
-	(149 , happyReduce_149),
-	(150 , happyReduce_150),
-	(151 , happyReduce_151),
-	(152 , happyReduce_152),
-	(153 , happyReduce_153),
-	(154 , happyReduce_154),
-	(155 , happyReduce_155),
-	(156 , happyReduce_156),
-	(157 , happyReduce_157),
-	(158 , happyReduce_158),
-	(159 , happyReduce_159),
-	(160 , happyReduce_160),
-	(161 , happyReduce_161),
-	(162 , happyReduce_162),
-	(163 , happyReduce_163),
-	(164 , happyReduce_164),
-	(165 , happyReduce_165),
-	(166 , happyReduce_166),
-	(167 , happyReduce_167),
-	(168 , happyReduce_168),
-	(169 , happyReduce_169),
-	(170 , happyReduce_170),
-	(171 , happyReduce_171),
-	(172 , happyReduce_172),
-	(173 , happyReduce_173),
-	(174 , happyReduce_174),
-	(175 , happyReduce_175),
-	(176 , happyReduce_176),
-	(177 , happyReduce_177),
-	(178 , happyReduce_178),
-	(179 , happyReduce_179),
-	(180 , happyReduce_180),
-	(181 , happyReduce_181),
-	(182 , happyReduce_182),
-	(183 , happyReduce_183),
-	(184 , happyReduce_184),
-	(185 , happyReduce_185),
-	(186 , happyReduce_186),
-	(187 , happyReduce_187),
-	(188 , happyReduce_188),
-	(189 , happyReduce_189),
-	(190 , happyReduce_190),
-	(191 , happyReduce_191),
-	(192 , happyReduce_192),
-	(193 , happyReduce_193),
-	(194 , happyReduce_194),
-	(195 , happyReduce_195),
-	(196 , happyReduce_196),
-	(197 , happyReduce_197),
-	(198 , happyReduce_198),
-	(199 , happyReduce_199),
-	(200 , happyReduce_200),
-	(201 , happyReduce_201),
-	(202 , happyReduce_202),
-	(203 , happyReduce_203),
-	(204 , happyReduce_204),
-	(205 , happyReduce_205),
-	(206 , happyReduce_206),
-	(207 , happyReduce_207),
-	(208 , happyReduce_208),
-	(209 , happyReduce_209),
-	(210 , happyReduce_210),
-	(211 , happyReduce_211),
-	(212 , happyReduce_212),
-	(213 , happyReduce_213),
-	(214 , happyReduce_214),
-	(215 , happyReduce_215),
-	(216 , happyReduce_216),
-	(217 , happyReduce_217),
-	(218 , happyReduce_218),
-	(219 , happyReduce_219),
-	(220 , happyReduce_220),
-	(221 , happyReduce_221),
-	(222 , happyReduce_222),
-	(223 , happyReduce_223),
-	(224 , happyReduce_224),
-	(225 , happyReduce_225),
-	(226 , happyReduce_226),
-	(227 , happyReduce_227),
-	(228 , happyReduce_228),
-	(229 , happyReduce_229),
-	(230 , happyReduce_230),
-	(231 , happyReduce_231),
-	(232 , happyReduce_232),
-	(233 , happyReduce_233),
-	(234 , happyReduce_234),
-	(235 , happyReduce_235),
-	(236 , happyReduce_236),
-	(237 , happyReduce_237),
-	(238 , happyReduce_238),
-	(239 , happyReduce_239),
-	(240 , happyReduce_240),
-	(241 , happyReduce_241),
-	(242 , happyReduce_242),
-	(243 , happyReduce_243),
-	(244 , happyReduce_244),
-	(245 , happyReduce_245),
-	(246 , happyReduce_246),
-	(247 , happyReduce_247),
-	(248 , happyReduce_248),
-	(249 , happyReduce_249),
-	(250 , happyReduce_250),
-	(251 , happyReduce_251),
-	(252 , happyReduce_252),
-	(253 , happyReduce_253),
-	(254 , happyReduce_254),
-	(255 , happyReduce_255),
-	(256 , happyReduce_256),
-	(257 , happyReduce_257),
-	(258 , happyReduce_258),
-	(259 , happyReduce_259),
-	(260 , happyReduce_260),
-	(261 , happyReduce_261),
-	(262 , happyReduce_262),
-	(263 , happyReduce_263),
-	(264 , happyReduce_264),
-	(265 , happyReduce_265),
-	(266 , happyReduce_266),
-	(267 , happyReduce_267),
-	(268 , happyReduce_268),
-	(269 , happyReduce_269),
-	(270 , happyReduce_270),
-	(271 , happyReduce_271),
-	(272 , happyReduce_272),
-	(273 , happyReduce_273),
-	(274 , happyReduce_274),
-	(275 , happyReduce_275),
-	(276 , happyReduce_276),
-	(277 , happyReduce_277),
-	(278 , happyReduce_278),
-	(279 , happyReduce_279),
-	(280 , happyReduce_280),
-	(281 , happyReduce_281),
-	(282 , happyReduce_282),
-	(283 , happyReduce_283),
-	(284 , happyReduce_284),
-	(285 , happyReduce_285),
-	(286 , happyReduce_286),
-	(287 , happyReduce_287),
-	(288 , happyReduce_288),
-	(289 , happyReduce_289),
-	(290 , happyReduce_290),
-	(291 , happyReduce_291),
-	(292 , happyReduce_292),
-	(293 , happyReduce_293),
-	(294 , happyReduce_294),
-	(295 , happyReduce_295),
-	(296 , happyReduce_296),
-	(297 , happyReduce_297),
-	(298 , happyReduce_298),
-	(299 , happyReduce_299)
-	]
-
-happy_n_terms = 97 :: Int
-happy_n_nonterms = 71 :: Int
-
-happyReduce_11 = happyReduce 6# 0# happyReduction_11
-happyReduction_11 (happy_x_6 `HappyStk`
-	happy_x_5 `HappyStk`
-	happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest)
-	 = case happyOut80 happy_x_2 of { happy_var_2 -> 
-	case happyOut15 happy_x_5 of { happy_var_5 -> 
-	happyIn14
-		 (let (is,ts) = happy_var_5 in Module happy_var_2 is ts
-	) `HappyStk` happyRest}}
-
-happyReduce_12 = happySpecReduce_3  0# happyReduction_12
-happyReduction_12 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut15 happy_x_2 of { happy_var_2 -> 
-	happyIn14
-		 (let { (is,ts) = happy_var_2
-            -- XXX make a location from is and ts
-          ; modName = Located { srcRange = emptyRange
-                              , thing    = ModName ["Main"]
-                              }
-          } in Module modName is ts
-	)}
-
-happyReduce_13 = happySpecReduce_3  1# happyReduction_13
-happyReduction_13 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut16 happy_x_1 of { happy_var_1 -> 
-	case happyOut25 happy_x_3 of { happy_var_3 -> 
-	happyIn15
-		 ((reverse happy_var_1, reverse happy_var_3)
-	)}}
-
-happyReduce_14 = happySpecReduce_3  1# happyReduction_14
-happyReduction_14 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut16 happy_x_1 of { happy_var_1 -> 
-	case happyOut25 happy_x_3 of { happy_var_3 -> 
-	happyIn15
-		 ((reverse happy_var_1, reverse happy_var_3)
-	)}}
-
-happyReduce_15 = happySpecReduce_1  1# happyReduction_15
-happyReduction_15 happy_x_1
-	 =  case happyOut16 happy_x_1 of { happy_var_1 -> 
-	happyIn15
-		 ((reverse happy_var_1, [])
-	)}
-
-happyReduce_16 = happySpecReduce_1  1# happyReduction_16
-happyReduction_16 happy_x_1
-	 =  case happyOut25 happy_x_1 of { happy_var_1 -> 
-	happyIn15
-		 (([], reverse happy_var_1)
-	)}
-
-happyReduce_17 = happySpecReduce_0  1# happyReduction_17
-happyReduction_17  =  happyIn15
-		 (([], [])
-	)
-
-happyReduce_18 = happySpecReduce_3  2# happyReduction_18
-happyReduction_18 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut16 happy_x_1 of { happy_var_1 -> 
-	case happyOut17 happy_x_3 of { happy_var_3 -> 
-	happyIn16
-		 (happy_var_3 : happy_var_1
-	)}}
-
-happyReduce_19 = happySpecReduce_3  2# happyReduction_19
-happyReduction_19 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut16 happy_x_1 of { happy_var_1 -> 
-	case happyOut17 happy_x_3 of { happy_var_3 -> 
-	happyIn16
-		 (happy_var_3 : happy_var_1
-	)}}
-
-happyReduce_20 = happySpecReduce_1  2# happyReduction_20
-happyReduction_20 happy_x_1
-	 =  case happyOut17 happy_x_1 of { happy_var_1 -> 
-	happyIn16
-		 ([happy_var_1]
-	)}
-
-happyReduce_21 = happyReduce 4# 3# happyReduction_21
-happyReduction_21 (happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest)
-	 = case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (KW KW_import)    _)) -> 
-	case happyOut80 happy_x_2 of { happy_var_2 -> 
-	case happyOut18 happy_x_3 of { happy_var_3 -> 
-	case happyOut19 happy_x_4 of { happy_var_4 -> 
-	happyIn17
-		 (Located { srcRange = rComb happy_var_1
-                                                   $ fromMaybe (srcRange happy_var_2)
-                                                   $ msum [ fmap srcRange happy_var_4
-                                                          , fmap srcRange happy_var_3
-                                                          ]
-                                        , thing    = Import
-                                          { iModule    = thing happy_var_2
-                                          , iAs        = fmap thing happy_var_3
-                                          , iSpec      = fmap thing happy_var_4
-                                          }
-                                        }
-	) `HappyStk` happyRest}}}}
-
-happyReduce_22 = happySpecReduce_2  4# happyReduction_22
-happyReduction_22 happy_x_2
-	happy_x_1
-	 =  case happyOut80 happy_x_2 of { happy_var_2 -> 
-	happyIn18
-		 (Just happy_var_2
-	)}
-
-happyReduce_23 = happySpecReduce_0  4# happyReduction_23
-happyReduction_23  =  happyIn18
-		 (Nothing
-	)
-
-happyReduce_24 = happyReduce 4# 5# happyReduction_24
-happyReduction_24 (happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest)
-	 = case happyOut21 happy_x_1 of { happy_var_1 -> 
-	case happyOut20 happy_x_3 of { happy_var_3 -> 
-	happyIn19
-		 (Just Located
-                                  { srcRange = case happy_var_3 of
-                                      { [] -> emptyRange
-                                      ; xs -> rCombs (map srcRange xs) }
-                                  , thing    = happy_var_1 (reverse (map thing happy_var_3))
-                                  }
-	) `HappyStk` happyRest}}
-
-happyReduce_25 = happySpecReduce_0  5# happyReduction_25
-happyReduction_25  =  happyIn19
-		 (Nothing
-	)
-
-happyReduce_26 = happySpecReduce_3  6# happyReduction_26
-happyReduction_26 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut20 happy_x_1 of { happy_var_1 -> 
-	case happyOut79 happy_x_3 of { happy_var_3 -> 
-	happyIn20
-		 (happy_var_3 : happy_var_1
-	)}}
-
-happyReduce_27 = happySpecReduce_1  6# happyReduction_27
-happyReduction_27 happy_x_1
-	 =  case happyOut79 happy_x_1 of { happy_var_1 -> 
-	happyIn20
-		 ([happy_var_1]
-	)}
-
-happyReduce_28 = happySpecReduce_0  6# happyReduction_28
-happyReduction_28  =  happyIn20
-		 ([]
-	)
-
-happyReduce_29 = happySpecReduce_1  7# happyReduction_29
-happyReduction_29 happy_x_1
-	 =  happyIn21
-		 (Hiding
-	)
-
-happyReduce_30 = happySpecReduce_0  7# happyReduction_30
-happyReduction_30  =  happyIn21
-		 (Only
-	)
-
-happyReduce_31 = happySpecReduce_1  8# happyReduction_31
-happyReduction_31 happy_x_1
-	 =  case happyOut24 happy_x_1 of { happy_var_1 -> 
-	happyIn22
-		 (Program (reverse happy_var_1)
-	)}
-
-happyReduce_32 = happySpecReduce_0  8# happyReduction_32
-happyReduction_32  =  happyIn22
-		 (Program []
-	)
-
-happyReduce_33 = happySpecReduce_3  9# happyReduction_33
-happyReduction_33 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut25 happy_x_2 of { happy_var_2 -> 
-	happyIn23
-		 (Program (reverse happy_var_2)
-	)}
-
-happyReduce_34 = happySpecReduce_2  9# happyReduction_34
-happyReduction_34 happy_x_2
-	happy_x_1
-	 =  happyIn23
-		 (Program []
-	)
-
-happyReduce_35 = happySpecReduce_2  10# happyReduction_35
-happyReduction_35 happy_x_2
-	happy_x_1
-	 =  case happyOut27 happy_x_1 of { happy_var_1 -> 
-	happyIn24
-		 ([happy_var_1]
-	)}
-
-happyReduce_36 = happySpecReduce_3  10# happyReduction_36
-happyReduction_36 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut24 happy_x_1 of { happy_var_1 -> 
-	case happyOut27 happy_x_2 of { happy_var_2 -> 
-	happyIn24
-		 (happy_var_2 : happy_var_1
-	)}}
-
-happyReduce_37 = happySpecReduce_1  11# happyReduction_37
-happyReduction_37 happy_x_1
-	 =  case happyOut26 happy_x_1 of { happy_var_1 -> 
-	happyIn25
-		 (happy_var_1
-	)}
-
-happyReduce_38 = happySpecReduce_3  11# happyReduction_38
-happyReduction_38 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut25 happy_x_1 of { happy_var_1 -> 
-	case happyOut26 happy_x_3 of { happy_var_3 -> 
-	happyIn25
-		 (happy_var_3 ++ happy_var_1
-	)}}
-
-happyReduce_39 = happySpecReduce_3  11# happyReduction_39
-happyReduction_39 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut25 happy_x_1 of { happy_var_1 -> 
-	case happyOut26 happy_x_3 of { happy_var_3 -> 
-	happyIn25
-		 (happy_var_3 ++ happy_var_1
-	)}}
-
-happyReduce_40 = happySpecReduce_1  12# happyReduction_40
-happyReduction_40 happy_x_1
-	 =  case happyOut28 happy_x_1 of { happy_var_1 -> 
-	happyIn26
-		 ([exportDecl Public happy_var_1]
-	)}
-
-happyReduce_41 = happyReduce 4# 12# happyReduction_41
-happyReduction_41 (happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest)
-	 = case happyOut25 happy_x_3 of { happy_var_3 -> 
-	happyIn26
-		 (changeExport Private (reverse happy_var_3)
-	) `HappyStk` happyRest}
-
-happyReduce_42 = happyMonadReduce 2# 12# happyReduction_42
-happyReduction_42 (happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest) tk
-	 = happyThen (case happyOutTok happy_x_2 of { (happy_var_2@(Located _ (Token (StrLit {}) _))) -> 
-	( (return . Include) `fmap` fromStrLit happy_var_2)}
-	) (\r -> happyReturn (happyIn26 r))
-
-happyReduce_43 = happyReduce 5# 12# happyReduction_43
-happyReduction_43 (happy_x_5 `HappyStk`
-	happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest)
-	 = case happyOut79 happy_x_2 of { happy_var_2 -> 
-	case happyOut33 happy_x_3 of { happy_var_3 -> 
-	case happyOut38 happy_x_5 of { happy_var_5 -> 
-	happyIn26
-		 ([exportDecl Public (mkProperty happy_var_2 happy_var_3 happy_var_5)]
-	) `HappyStk` happyRest}}}
-
-happyReduce_44 = happyReduce 4# 12# happyReduction_44
-happyReduction_44 (happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest)
-	 = case happyOut79 happy_x_2 of { happy_var_2 -> 
-	case happyOut38 happy_x_4 of { happy_var_4 -> 
-	happyIn26
-		 ([exportDecl Public (mkProperty happy_var_2 [] happy_var_4)]
-	) `HappyStk` happyRest}}
-
-happyReduce_45 = happySpecReduce_1  12# happyReduction_45
-happyReduction_45 happy_x_1
-	 =  case happyOut30 happy_x_1 of { happy_var_1 -> 
-	happyIn26
-		 ([exportNewtype Public happy_var_1]
-	)}
-
-happyReduce_46 = happySpecReduce_1  13# happyReduction_46
-happyReduction_46 happy_x_1
-	 =  case happyOut28 happy_x_1 of { happy_var_1 -> 
-	happyIn27
-		 (Decl (TopLevel {tlExport = Public, tlValue = happy_var_1})
-	)}
-
-happyReduce_47 = happyMonadReduce 2# 13# happyReduction_47
-happyReduction_47 (happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest) tk
-	 = happyThen (case happyOutTok happy_x_2 of { (happy_var_2@(Located _ (Token (StrLit {}) _))) -> 
-	( Include `fmap` fromStrLit happy_var_2)}
-	) (\r -> happyReturn (happyIn27 r))
-
-happyReduce_48 = happySpecReduce_3  14# happyReduction_48
-happyReduction_48 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut32 happy_x_1 of { happy_var_1 -> 
-	case happyOut60 happy_x_3 of { happy_var_3 -> 
-	happyIn28
-		 (at (head happy_var_1,happy_var_3) $ DSignature (map (fmap mkUnqual) (reverse happy_var_1)) happy_var_3
-	)}}
-
-happyReduce_49 = happySpecReduce_3  14# happyReduction_49
-happyReduction_49 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut56 happy_x_1 of { happy_var_1 -> 
-	case happyOut38 happy_x_3 of { happy_var_3 -> 
-	happyIn28
-		 (at (happy_var_1,happy_var_3) $ DPatBind happy_var_1 happy_var_3
-	)}}
-
-happyReduce_50 = happyReduce 4# 14# happyReduction_50
-happyReduction_50 (happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest)
-	 = case happyOut79 happy_x_1 of { happy_var_1 -> 
-	case happyOut33 happy_x_2 of { happy_var_2 -> 
-	case happyOut38 happy_x_4 of { happy_var_4 -> 
-	happyIn28
-		 (at (happy_var_1,happy_var_4) $
-                             DBind $ Bind { bName      = fmap mkUnqual happy_var_1
-                                          , bParams    = reverse happy_var_2
-                                          , bDef       = happy_var_4
-                                          , bSignature = Nothing
-                                          , bPragmas   = []
-                                          , bMono      = False
-                                          }
-	) `HappyStk` happyRest}}}
-
-happyReduce_51 = happyMonadReduce 4# 14# happyReduction_51
-happyReduction_51 (happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest) tk
-	 = happyThen (case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (KW KW_type   ) _)) -> 
-	case happyOut79 happy_x_2 of { happy_var_2 -> 
-	case happyOut70 happy_x_4 of { happy_var_4 -> 
-	( at (happy_var_1,happy_var_4) `fmap` mkTySyn happy_var_2 [] happy_var_4)}}}
-	) (\r -> happyReturn (happyIn28 r))
-
-happyReduce_52 = happyMonadReduce 5# 14# happyReduction_52
-happyReduction_52 (happy_x_5 `HappyStk`
-	happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest) tk
-	 = happyThen (case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (KW KW_type   ) _)) -> 
-	case happyOut79 happy_x_2 of { happy_var_2 -> 
-	case happyOut67 happy_x_3 of { happy_var_3 -> 
-	case happyOut70 happy_x_5 of { happy_var_5 -> 
-	( at (happy_var_1,happy_var_5) `fmap` mkTySyn happy_var_2 (reverse happy_var_3) happy_var_5)}}}}
-	) (\r -> happyReturn (happyIn28 r))
-
-happyReduce_53 = happyReduce 4# 15# happyReduction_53
-happyReduction_53 (happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest)
-	 = case happyOut56 happy_x_2 of { happy_var_2 -> 
-	case happyOut38 happy_x_4 of { happy_var_4 -> 
-	happyIn29
-		 (at (happy_var_2,happy_var_4) $ DPatBind happy_var_2 happy_var_4
-	) `HappyStk` happyRest}}
-
-happyReduce_54 = happyReduce 5# 15# happyReduction_54
-happyReduction_54 (happy_x_5 `HappyStk`
-	happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest)
-	 = case happyOut79 happy_x_2 of { happy_var_2 -> 
-	case happyOut33 happy_x_3 of { happy_var_3 -> 
-	case happyOut38 happy_x_5 of { happy_var_5 -> 
-	happyIn29
-		 (at (happy_var_2,happy_var_5) $
-                                   DBind $ Bind { bName      = fmap mkUnqual happy_var_2
-                                                , bParams    = reverse happy_var_3
-                                                , bDef       = happy_var_5
-                                                , bSignature = Nothing
-                                                , bPragmas   = []
-                                                , bMono      = False
-                                                }
-	) `HappyStk` happyRest}}}
-
-happyReduce_55 = happyReduce 4# 16# happyReduction_55
-happyReduction_55 (happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest)
-	 = case happyOut81 happy_x_2 of { happy_var_2 -> 
-	case happyOut31 happy_x_4 of { happy_var_4 -> 
-	happyIn30
-		 (Newtype { nName = happy_var_2, nParams = [], nBody = happy_var_4 }
-	) `HappyStk` happyRest}}
-
-happyReduce_56 = happyReduce 5# 16# happyReduction_56
-happyReduction_56 (happy_x_5 `HappyStk`
-	happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest)
-	 = case happyOut81 happy_x_2 of { happy_var_2 -> 
-	case happyOut67 happy_x_3 of { happy_var_3 -> 
-	case happyOut31 happy_x_5 of { happy_var_5 -> 
-	happyIn30
-		 (Newtype { nName = happy_var_2, nParams = happy_var_3, nBody = happy_var_5 }
-	) `HappyStk` happyRest}}}
-
-happyReduce_57 = happySpecReduce_2  17# happyReduction_57
-happyReduction_57 happy_x_2
-	happy_x_1
-	 =  happyIn31
-		 ([]
-	)
-
-happyReduce_58 = happySpecReduce_3  17# happyReduction_58
-happyReduction_58 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut77 happy_x_2 of { happy_var_2 -> 
-	happyIn31
-		 (happy_var_2
-	)}
-
-happyReduce_59 = happySpecReduce_1  18# happyReduction_59
-happyReduction_59 happy_x_1
-	 =  case happyOut79 happy_x_1 of { happy_var_1 -> 
-	happyIn32
-		 ([ happy_var_1]
-	)}
-
-happyReduce_60 = happySpecReduce_3  18# happyReduction_60
-happyReduction_60 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut32 happy_x_1 of { happy_var_1 -> 
-	case happyOut79 happy_x_3 of { happy_var_3 -> 
-	happyIn32
-		 (happy_var_3 : happy_var_1
-	)}}
-
-happyReduce_61 = happySpecReduce_1  19# happyReduction_61
-happyReduction_61 happy_x_1
-	 =  case happyOut56 happy_x_1 of { happy_var_1 -> 
-	happyIn33
-		 ([happy_var_1]
-	)}
-
-happyReduce_62 = happySpecReduce_2  19# happyReduction_62
-happyReduction_62 happy_x_2
-	happy_x_1
-	 =  case happyOut33 happy_x_1 of { happy_var_1 -> 
-	case happyOut56 happy_x_2 of { happy_var_2 -> 
-	happyIn33
-		 (happy_var_2 : happy_var_1
-	)}}
-
-happyReduce_63 = happySpecReduce_2  20# happyReduction_63
-happyReduction_63 happy_x_2
-	happy_x_1
-	 =  case happyOut28 happy_x_1 of { happy_var_1 -> 
-	happyIn34
-		 ([happy_var_1]
-	)}
-
-happyReduce_64 = happySpecReduce_3  20# happyReduction_64
-happyReduction_64 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut34 happy_x_1 of { happy_var_1 -> 
-	case happyOut28 happy_x_2 of { happy_var_2 -> 
-	happyIn34
-		 (happy_var_2 : happy_var_1
-	)}}
-
-happyReduce_65 = happySpecReduce_1  21# happyReduction_65
-happyReduction_65 happy_x_1
-	 =  case happyOut28 happy_x_1 of { happy_var_1 -> 
-	happyIn35
-		 ([happy_var_1]
-	)}
-
-happyReduce_66 = happySpecReduce_3  21# happyReduction_66
-happyReduction_66 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut35 happy_x_1 of { happy_var_1 -> 
-	case happyOut28 happy_x_3 of { happy_var_3 -> 
-	happyIn35
-		 (happy_var_3 : happy_var_1
-	)}}
-
-happyReduce_67 = happySpecReduce_3  21# happyReduction_67
-happyReduction_67 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut35 happy_x_1 of { happy_var_1 -> 
-	case happyOut28 happy_x_3 of { happy_var_3 -> 
-	happyIn35
-		 (happy_var_3 : happy_var_1
-	)}}
-
-happyReduce_68 = happySpecReduce_3  22# happyReduction_68
-happyReduction_68 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut35 happy_x_2 of { happy_var_2 -> 
-	happyIn36
-		 (happy_var_2
-	)}
-
-happyReduce_69 = happySpecReduce_2  22# happyReduction_69
-happyReduction_69 happy_x_2
-	happy_x_1
-	 =  happyIn36
-		 ([]
-	)
-
-happyReduce_70 = happySpecReduce_1  23# happyReduction_70
-happyReduction_70 happy_x_1
-	 =  case happyOut38 happy_x_1 of { happy_var_1 -> 
-	happyIn37
-		 (ExprInput happy_var_1
-	)}
-
-happyReduce_71 = happySpecReduce_1  23# happyReduction_71
-happyReduction_71 happy_x_1
-	 =  case happyOut29 happy_x_1 of { happy_var_1 -> 
-	happyIn37
-		 (LetInput happy_var_1
-	)}
-
-happyReduce_72 = happySpecReduce_1  24# happyReduction_72
-happyReduction_72 happy_x_1
-	 =  case happyOut41 happy_x_1 of { happy_var_1 -> 
-	happyIn38
-		 (happy_var_1
-	)}
-
-happyReduce_73 = happyReduce 4# 24# happyReduction_73
-happyReduction_73 (happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest)
-	 = case happyOut38 happy_x_1 of { happy_var_1 -> 
-	case happyOutTok happy_x_4 of { (Located happy_var_4 (Token (Sym CurlyR  ) _)) -> 
-	happyIn38
-		 (at (happy_var_1,happy_var_4) $ EWhere happy_var_1 []
-	) `HappyStk` happyRest}}
-
-happyReduce_74 = happyReduce 5# 24# happyReduction_74
-happyReduction_74 (happy_x_5 `HappyStk`
-	happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest)
-	 = case happyOut38 happy_x_1 of { happy_var_1 -> 
-	case happyOut34 happy_x_4 of { happy_var_4 -> 
-	case happyOutTok happy_x_5 of { (Located happy_var_5 (Token (Sym CurlyR  ) _)) -> 
-	happyIn38
-		 (at (happy_var_1,happy_var_5) $ EWhere happy_var_1 (reverse happy_var_4)
-	) `HappyStk` happyRest}}}
-
-happyReduce_75 = happyReduce 4# 24# happyReduction_75
-happyReduction_75 (happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest)
-	 = case happyOut38 happy_x_1 of { happy_var_1 -> 
-	case happyOutTok happy_x_2 of { (Located happy_var_2 (Token (KW KW_where  ) _)) -> 
-	happyIn38
-		 (at (happy_var_1,happy_var_2) $ EWhere happy_var_1 []
-	) `HappyStk` happyRest}}
-
-happyReduce_76 = happyReduce 5# 24# happyReduction_76
-happyReduction_76 (happy_x_5 `HappyStk`
-	happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest)
-	 = case happyOut38 happy_x_1 of { happy_var_1 -> 
-	case happyOut35 happy_x_4 of { happy_var_4 -> 
-	happyIn38
-		 (at (happy_var_1,happy_var_4) $ EWhere happy_var_1 (reverse happy_var_4)
-	) `HappyStk` happyRest}}
-
-happyReduce_77 = happySpecReduce_1  25# happyReduction_77
-happyReduction_77 happy_x_1
-	 =  case happyOut40 happy_x_1 of { happy_var_1 -> 
-	happyIn39
-		 ([happy_var_1]
-	)}
-
-happyReduce_78 = happySpecReduce_3  25# happyReduction_78
-happyReduction_78 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut39 happy_x_1 of { happy_var_1 -> 
-	case happyOut40 happy_x_3 of { happy_var_3 -> 
-	happyIn39
-		 (happy_var_3 : happy_var_1
-	)}}
-
-happyReduce_79 = happySpecReduce_3  26# happyReduction_79
-happyReduction_79 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut38 happy_x_1 of { happy_var_1 -> 
-	case happyOut38 happy_x_3 of { happy_var_3 -> 
-	happyIn40
-		 ((happy_var_1, happy_var_3)
-	)}}
-
-happyReduce_80 = happySpecReduce_1  27# happyReduction_80
-happyReduction_80 happy_x_1
-	 =  case happyOut42 happy_x_1 of { happy_var_1 -> 
-	happyIn41
-		 (mkEApp happy_var_1
-	)}
-
-happyReduce_81 = happySpecReduce_3  27# happyReduction_81
-happyReduction_81 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut41 happy_x_1 of { happy_var_1 -> 
-	case happyOut70 happy_x_3 of { happy_var_3 -> 
-	happyIn41
-		 (at (happy_var_1,happy_var_3) $ ETyped happy_var_1 happy_var_3
-	)}}
-
-happyReduce_82 = happyReduce 4# 27# happyReduction_82
-happyReduction_82 (happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest)
-	 = case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (KW KW_if     ) _)) -> 
-	case happyOut39 happy_x_2 of { happy_var_2 -> 
-	case happyOut41 happy_x_4 of { happy_var_4 -> 
-	happyIn41
-		 (at (happy_var_1,happy_var_4) $ mkIf happy_var_2 happy_var_4
-	) `HappyStk` happyRest}}}
-
-happyReduce_83 = happyReduce 4# 27# happyReduction_83
-happyReduction_83 (happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest)
-	 = case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym Lambda  ) _)) -> 
-	case happyOut33 happy_x_2 of { happy_var_2 -> 
-	case happyOut41 happy_x_4 of { happy_var_4 -> 
-	happyIn41
-		 (at (happy_var_1,happy_var_4) $ EFun (reverse happy_var_2) happy_var_4
-	) `HappyStk` happyRest}}}
-
-happyReduce_84 = happySpecReduce_3  27# happyReduction_84
-happyReduction_84 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut41 happy_x_1 of { happy_var_1 -> 
-	case happyOutTok happy_x_2 of { (Located happy_var_2 (Token (Op At          ) _)) -> 
-	case happyOut41 happy_x_3 of { happy_var_3 -> 
-	happyIn41
-		 (binOp happy_var_1 (op ECAt          happy_var_2) happy_var_3
-	)}}}
-
-happyReduce_85 = happySpecReduce_3  27# happyReduction_85
-happyReduction_85 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut41 happy_x_1 of { happy_var_1 -> 
-	case happyOutTok happy_x_2 of { (Located happy_var_2 (Token (Op AtAt        ) _)) -> 
-	case happyOut41 happy_x_3 of { happy_var_3 -> 
-	happyIn41
-		 (binOp happy_var_1 (op ECAtRange     happy_var_2) happy_var_3
-	)}}}
-
-happyReduce_86 = happySpecReduce_3  27# happyReduction_86
-happyReduction_86 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut41 happy_x_1 of { happy_var_1 -> 
-	case happyOutTok happy_x_2 of { (Located happy_var_2 (Token (Op Bang        ) _)) -> 
-	case happyOut41 happy_x_3 of { happy_var_3 -> 
-	happyIn41
-		 (binOp happy_var_1 (op ECAtBack      happy_var_2) happy_var_3
-	)}}}
-
-happyReduce_87 = happySpecReduce_3  27# happyReduction_87
-happyReduction_87 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut41 happy_x_1 of { happy_var_1 -> 
-	case happyOutTok happy_x_2 of { (Located happy_var_2 (Token (Op BangBang    ) _)) -> 
-	case happyOut41 happy_x_3 of { happy_var_3 -> 
-	happyIn41
-		 (binOp happy_var_1 (op ECAtRangeBack happy_var_2) happy_var_3
-	)}}}
-
-happyReduce_88 = happySpecReduce_3  27# happyReduction_88
-happyReduction_88 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut41 happy_x_1 of { happy_var_1 -> 
-	case happyOutTok happy_x_2 of { (Located happy_var_2 (Token (Op Hash        ) _)) -> 
-	case happyOut41 happy_x_3 of { happy_var_3 -> 
-	happyIn41
-		 (binOp happy_var_1 (op ECCat         happy_var_2) happy_var_3
-	)}}}
-
-happyReduce_89 = happySpecReduce_3  27# happyReduction_89
-happyReduction_89 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut41 happy_x_1 of { happy_var_1 -> 
-	case happyOutTok happy_x_2 of { (Located happy_var_2 (Token (Op Plus        ) _)) -> 
-	case happyOut41 happy_x_3 of { happy_var_3 -> 
-	happyIn41
-		 (binOp happy_var_1 (op ECPlus        happy_var_2) happy_var_3
-	)}}}
-
-happyReduce_90 = happySpecReduce_3  27# happyReduction_90
-happyReduction_90 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut41 happy_x_1 of { happy_var_1 -> 
-	case happyOutTok happy_x_2 of { (Located happy_var_2 (Token (Op Minus       ) _)) -> 
-	case happyOut41 happy_x_3 of { happy_var_3 -> 
-	happyIn41
-		 (binOp happy_var_1 (op ECMinus       happy_var_2) happy_var_3
-	)}}}
-
-happyReduce_91 = happySpecReduce_3  27# happyReduction_91
-happyReduction_91 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut41 happy_x_1 of { happy_var_1 -> 
-	case happyOutTok happy_x_2 of { (Located happy_var_2 (Token (Op Mul         ) _)) -> 
-	case happyOut41 happy_x_3 of { happy_var_3 -> 
-	happyIn41
-		 (binOp happy_var_1 (op ECMul         happy_var_2) happy_var_3
-	)}}}
-
-happyReduce_92 = happySpecReduce_3  27# happyReduction_92
-happyReduction_92 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut41 happy_x_1 of { happy_var_1 -> 
-	case happyOutTok happy_x_2 of { (Located happy_var_2 (Token (Op Div         ) _)) -> 
-	case happyOut41 happy_x_3 of { happy_var_3 -> 
-	happyIn41
-		 (binOp happy_var_1 (op ECDiv         happy_var_2) happy_var_3
-	)}}}
-
-happyReduce_93 = happySpecReduce_3  27# happyReduction_93
-happyReduction_93 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut41 happy_x_1 of { happy_var_1 -> 
-	case happyOutTok happy_x_2 of { (Located happy_var_2 (Token (Op Mod         ) _)) -> 
-	case happyOut41 happy_x_3 of { happy_var_3 -> 
-	happyIn41
-		 (binOp happy_var_1 (op ECMod         happy_var_2) happy_var_3
-	)}}}
-
-happyReduce_94 = happySpecReduce_3  27# happyReduction_94
-happyReduction_94 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut41 happy_x_1 of { happy_var_1 -> 
-	case happyOutTok happy_x_2 of { (Located happy_var_2 (Token (Op Exp         ) _)) -> 
-	case happyOut41 happy_x_3 of { happy_var_3 -> 
-	happyIn41
-		 (binOp happy_var_1 (op ECExp         happy_var_2) happy_var_3
-	)}}}
-
-happyReduce_95 = happySpecReduce_3  27# happyReduction_95
-happyReduction_95 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut41 happy_x_1 of { happy_var_1 -> 
-	case happyOutTok happy_x_2 of { (Located happy_var_2 (Token (Op Xor         ) _)) -> 
-	case happyOut41 happy_x_3 of { happy_var_3 -> 
-	happyIn41
-		 (binOp happy_var_1 (op ECXor         happy_var_2) happy_var_3
-	)}}}
-
-happyReduce_96 = happySpecReduce_3  27# happyReduction_96
-happyReduction_96 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut41 happy_x_1 of { happy_var_1 -> 
-	case happyOutTok happy_x_2 of { (Located happy_var_2 (Token (Op Disj        ) _)) -> 
-	case happyOut41 happy_x_3 of { happy_var_3 -> 
-	happyIn41
-		 (binOp happy_var_1 (op ECOr          happy_var_2) happy_var_3
-	)}}}
-
-happyReduce_97 = happySpecReduce_3  27# happyReduction_97
-happyReduction_97 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut41 happy_x_1 of { happy_var_1 -> 
-	case happyOutTok happy_x_2 of { (Located happy_var_2 (Token (Op Conj        ) _)) -> 
-	case happyOut41 happy_x_3 of { happy_var_3 -> 
-	happyIn41
-		 (binOp happy_var_1 (op ECAnd         happy_var_2) happy_var_3
-	)}}}
-
-happyReduce_98 = happySpecReduce_3  27# happyReduction_98
-happyReduction_98 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut41 happy_x_1 of { happy_var_1 -> 
-	case happyOutTok happy_x_2 of { (Located happy_var_2 (Token (Op Equal       ) _)) -> 
-	case happyOut41 happy_x_3 of { happy_var_3 -> 
-	happyIn41
-		 (binOp happy_var_1 (op ECEq          happy_var_2) happy_var_3
-	)}}}
-
-happyReduce_99 = happySpecReduce_3  27# happyReduction_99
-happyReduction_99 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut41 happy_x_1 of { happy_var_1 -> 
-	case happyOutTok happy_x_2 of { (Located happy_var_2 (Token (Op NotEqual    ) _)) -> 
-	case happyOut41 happy_x_3 of { happy_var_3 -> 
-	happyIn41
-		 (binOp happy_var_1 (op ECNotEq       happy_var_2) happy_var_3
-	)}}}
-
-happyReduce_100 = happySpecReduce_3  27# happyReduction_100
-happyReduction_100 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut41 happy_x_1 of { happy_var_1 -> 
-	case happyOutTok happy_x_2 of { (Located happy_var_2 (Token (Op EqualFun    ) _)) -> 
-	case happyOut41 happy_x_3 of { happy_var_3 -> 
-	happyIn41
-		 (binOp happy_var_1 (op ECFunEq       happy_var_2) happy_var_3
-	)}}}
-
-happyReduce_101 = happySpecReduce_3  27# happyReduction_101
-happyReduction_101 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut41 happy_x_1 of { happy_var_1 -> 
-	case happyOutTok happy_x_2 of { (Located happy_var_2 (Token (Op NotEqualFun ) _)) -> 
-	case happyOut41 happy_x_3 of { happy_var_3 -> 
-	happyIn41
-		 (binOp happy_var_1 (op ECFunNotEq    happy_var_2) happy_var_3
-	)}}}
-
-happyReduce_102 = happySpecReduce_3  27# happyReduction_102
-happyReduction_102 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut41 happy_x_1 of { happy_var_1 -> 
-	case happyOutTok happy_x_2 of { (Located happy_var_2 (Token (Op GreaterThan ) _)) -> 
-	case happyOut41 happy_x_3 of { happy_var_3 -> 
-	happyIn41
-		 (binOp happy_var_1 (op ECGt          happy_var_2) happy_var_3
-	)}}}
-
-happyReduce_103 = happySpecReduce_3  27# happyReduction_103
-happyReduction_103 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut41 happy_x_1 of { happy_var_1 -> 
-	case happyOutTok happy_x_2 of { (Located happy_var_2 (Token (Op LessThan    ) _)) -> 
-	case happyOut41 happy_x_3 of { happy_var_3 -> 
-	happyIn41
-		 (binOp happy_var_1 (op ECLt          happy_var_2) happy_var_3
-	)}}}
-
-happyReduce_104 = happySpecReduce_3  27# happyReduction_104
-happyReduction_104 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut41 happy_x_1 of { happy_var_1 -> 
-	case happyOutTok happy_x_2 of { (Located happy_var_2 (Token (Op LEQ         ) _)) -> 
-	case happyOut41 happy_x_3 of { happy_var_3 -> 
-	happyIn41
-		 (binOp happy_var_1 (op ECLtEq        happy_var_2) happy_var_3
-	)}}}
-
-happyReduce_105 = happySpecReduce_3  27# happyReduction_105
-happyReduction_105 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut41 happy_x_1 of { happy_var_1 -> 
-	case happyOutTok happy_x_2 of { (Located happy_var_2 (Token (Op GEQ         ) _)) -> 
-	case happyOut41 happy_x_3 of { happy_var_3 -> 
-	happyIn41
-		 (binOp happy_var_1 (op ECGtEq        happy_var_2) happy_var_3
-	)}}}
-
-happyReduce_106 = happySpecReduce_3  27# happyReduction_106
-happyReduction_106 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut41 happy_x_1 of { happy_var_1 -> 
-	case happyOutTok happy_x_2 of { (Located happy_var_2 (Token (Op ShiftL      ) _)) -> 
-	case happyOut41 happy_x_3 of { happy_var_3 -> 
-	happyIn41
-		 (binOp happy_var_1 (op ECShiftL      happy_var_2) happy_var_3
-	)}}}
-
-happyReduce_107 = happySpecReduce_3  27# happyReduction_107
-happyReduction_107 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut41 happy_x_1 of { happy_var_1 -> 
-	case happyOutTok happy_x_2 of { (Located happy_var_2 (Token (Op ShiftR      ) _)) -> 
-	case happyOut41 happy_x_3 of { happy_var_3 -> 
-	happyIn41
-		 (binOp happy_var_1 (op ECShiftR      happy_var_2) happy_var_3
-	)}}}
-
-happyReduce_108 = happySpecReduce_3  27# happyReduction_108
-happyReduction_108 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut41 happy_x_1 of { happy_var_1 -> 
-	case happyOutTok happy_x_2 of { (Located happy_var_2 (Token (Op RotL        ) _)) -> 
-	case happyOut41 happy_x_3 of { happy_var_3 -> 
-	happyIn41
-		 (binOp happy_var_1 (op ECRotL        happy_var_2) happy_var_3
-	)}}}
-
-happyReduce_109 = happySpecReduce_3  27# happyReduction_109
-happyReduction_109 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut41 happy_x_1 of { happy_var_1 -> 
-	case happyOutTok happy_x_2 of { (Located happy_var_2 (Token (Op RotR        ) _)) -> 
-	case happyOut41 happy_x_3 of { happy_var_3 -> 
-	happyIn41
-		 (binOp happy_var_1 (op ECRotR        happy_var_2) happy_var_3
-	)}}}
-
-happyReduce_110 = happySpecReduce_2  27# happyReduction_110
-happyReduction_110 happy_x_2
-	happy_x_1
-	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Op Minus       ) _)) -> 
-	case happyOut41 happy_x_2 of { happy_var_2 -> 
-	happyIn41
-		 (unOp     (op ECNeg         happy_var_1) happy_var_2
-	)}}
-
-happyReduce_111 = happySpecReduce_2  27# happyReduction_111
-happyReduction_111 happy_x_2
-	happy_x_1
-	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Op Complement  ) _)) -> 
-	case happyOut41 happy_x_2 of { happy_var_2 -> 
-	happyIn41
-		 (unOp     (op ECCompl       happy_var_1) happy_var_2
-	)}}
-
-happyReduce_112 = happySpecReduce_1  28# happyReduction_112
-happyReduction_112 happy_x_1
-	 =  case happyOut43 happy_x_1 of { happy_var_1 -> 
-	happyIn42
-		 ([happy_var_1]
-	)}
-
-happyReduce_113 = happySpecReduce_2  28# happyReduction_113
-happyReduction_113 happy_x_2
-	happy_x_1
-	 =  case happyOut42 happy_x_1 of { happy_var_1 -> 
-	case happyOut43 happy_x_2 of { happy_var_2 -> 
-	happyIn42
-		 (happy_var_2 : happy_var_1
-	)}}
-
-happyReduce_114 = happySpecReduce_1  29# happyReduction_114
-happyReduction_114 happy_x_1
-	 =  case happyOut81 happy_x_1 of { happy_var_1 -> 
-	happyIn43
-		 (at happy_var_1 $ EVar (thing happy_var_1)
-	)}
-
-happyReduce_115 = happySpecReduce_1  29# happyReduction_115
-happyReduction_115 happy_x_1
-	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (KW KW_min    ) _)) -> 
-	happyIn43
-		 (at happy_var_1 $ ECon ECMin
-	)}
-
-happyReduce_116 = happySpecReduce_1  29# happyReduction_116
-happyReduction_116 happy_x_1
-	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (KW KW_max    ) _)) -> 
-	happyIn43
-		 (at happy_var_1 $ ECon ECMax
-	)}
-
-happyReduce_117 = happySpecReduce_1  29# happyReduction_117
-happyReduction_117 happy_x_1
-	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (KW KW_lg2    ) _)) -> 
-	happyIn43
-		 (at happy_var_1 $ ECon ECLg2
-	)}
-
-happyReduce_118 = happySpecReduce_1  29# happyReduction_118
-happyReduction_118 happy_x_1
-	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (KW KW_zero   ) _)) -> 
-	happyIn43
-		 (at happy_var_1 $ ECon ECZero
-	)}
-
-happyReduce_119 = happySpecReduce_1  29# happyReduction_119
-happyReduction_119 happy_x_1
-	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (KW KW_join   ) _)) -> 
-	happyIn43
-		 (at happy_var_1 $ ECon ECJoin
-	)}
-
-happyReduce_120 = happySpecReduce_1  29# happyReduction_120
-happyReduction_120 happy_x_1
-	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (KW KW_split  ) _)) -> 
-	happyIn43
-		 (at happy_var_1 $ ECon ECSplit
-	)}
-
-happyReduce_121 = happySpecReduce_1  29# happyReduction_121
-happyReduction_121 happy_x_1
-	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (KW KW_splitAt) _)) -> 
-	happyIn43
-		 (at happy_var_1 $ ECon ECSplitAt
-	)}
-
-happyReduce_122 = happySpecReduce_1  29# happyReduction_122
-happyReduction_122 happy_x_1
-	 =  case happyOutTok happy_x_1 of { (happy_var_1@(Located _ (Token (Num   {}) _))) -> 
-	happyIn43
-		 (at happy_var_1 $ numLit (tokenType (thing happy_var_1))
-	)}
-
-happyReduce_123 = happySpecReduce_1  29# happyReduction_123
-happyReduction_123 happy_x_1
-	 =  case happyOutTok happy_x_1 of { (happy_var_1@(Located _ (Token (StrLit {}) _))) -> 
-	happyIn43
-		 (at happy_var_1 $ ELit $ ECString $ getStr happy_var_1
-	)}
-
-happyReduce_124 = happySpecReduce_1  29# happyReduction_124
-happyReduction_124 happy_x_1
-	 =  case happyOutTok happy_x_1 of { (happy_var_1@(Located _ (Token (ChrLit {}) _))) -> 
-	happyIn43
-		 (at happy_var_1 $ ELit $ ECNum (getNum happy_var_1) CharLit
-	)}
-
-happyReduce_125 = happySpecReduce_1  29# happyReduction_125
-happyReduction_125 happy_x_1
-	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (KW KW_False  ) _)) -> 
-	happyIn43
-		 (at happy_var_1 $ ECon ECFalse
-	)}
-
-happyReduce_126 = happySpecReduce_1  29# happyReduction_126
-happyReduction_126 happy_x_1
-	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (KW KW_True   ) _)) -> 
-	happyIn43
-		 (at happy_var_1 $ ECon ECTrue
-	)}
-
-happyReduce_127 = happySpecReduce_1  29# happyReduction_127
-happyReduction_127 happy_x_1
-	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (KW KW_error  ) _)) -> 
-	happyIn43
-		 (at happy_var_1 $ ECon ECError
-	)}
-
-happyReduce_128 = happySpecReduce_1  29# happyReduction_128
-happyReduction_128 happy_x_1
-	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (KW KW_reverse) _)) -> 
-	happyIn43
-		 (at happy_var_1 $ ECon ECReverse
-	)}
-
-happyReduce_129 = happySpecReduce_1  29# happyReduction_129
-happyReduction_129 happy_x_1
-	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (KW KW_transpose) _)) -> 
-	happyIn43
-		 (at happy_var_1 $ ECon ECTranspose
-	)}
-
-happyReduce_130 = happySpecReduce_1  29# happyReduction_130
-happyReduction_130 happy_x_1
-	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (KW KW_pmult)   _)) -> 
-	happyIn43
-		 (at happy_var_1 $ ECon ECPMul
-	)}
-
-happyReduce_131 = happySpecReduce_1  29# happyReduction_131
-happyReduction_131 happy_x_1
-	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (KW KW_pdiv)    _)) -> 
-	happyIn43
-		 (at happy_var_1 $ ECon ECPDiv
-	)}
-
-happyReduce_132 = happySpecReduce_1  29# happyReduction_132
-happyReduction_132 happy_x_1
-	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (KW KW_pmod)    _)) -> 
-	happyIn43
-		 (at happy_var_1 $ ECon ECPMod
-	)}
-
-happyReduce_133 = happySpecReduce_1  29# happyReduction_133
-happyReduction_133 happy_x_1
-	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (KW KW_random)  _)) -> 
-	happyIn43
-		 (at happy_var_1 $ ECon ECRandom
-	)}
-
-happyReduce_134 = happySpecReduce_3  29# happyReduction_134
-happyReduction_134 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym ParenL  ) _)) -> 
-	case happyOut38 happy_x_2 of { happy_var_2 -> 
-	case happyOutTok happy_x_3 of { (Located happy_var_3 (Token (Sym ParenR  ) _)) -> 
-	happyIn43
-		 (at (happy_var_1,happy_var_3) happy_var_2
-	)}}}
-
-happyReduce_135 = happySpecReduce_3  29# happyReduction_135
-happyReduction_135 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym ParenL  ) _)) -> 
-	case happyOut47 happy_x_2 of { happy_var_2 -> 
-	case happyOutTok happy_x_3 of { (Located happy_var_3 (Token (Sym ParenR  ) _)) -> 
-	happyIn43
-		 (at (happy_var_1,happy_var_3) $ ETuple (reverse happy_var_2)
-	)}}}
-
-happyReduce_136 = happySpecReduce_2  29# happyReduction_136
-happyReduction_136 happy_x_2
-	happy_x_1
-	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym ParenL  ) _)) -> 
-	case happyOutTok happy_x_2 of { (Located happy_var_2 (Token (Sym ParenR  ) _)) -> 
-	happyIn43
-		 (at (happy_var_1,happy_var_2) $ ETuple []
-	)}}
-
-happyReduce_137 = happySpecReduce_2  29# happyReduction_137
-happyReduction_137 happy_x_2
-	happy_x_1
-	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym CurlyL  ) _)) -> 
-	case happyOutTok happy_x_2 of { (Located happy_var_2 (Token (Sym CurlyR  ) _)) -> 
-	happyIn43
-		 (at (happy_var_1,happy_var_2) $ ERecord []
-	)}}
-
-happyReduce_138 = happySpecReduce_3  29# happyReduction_138
-happyReduction_138 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym CurlyL  ) _)) -> 
-	case happyOut49 happy_x_2 of { happy_var_2 -> 
-	case happyOutTok happy_x_3 of { (Located happy_var_3 (Token (Sym CurlyR  ) _)) -> 
-	happyIn43
-		 (at (happy_var_1,happy_var_3) $ ERecord (reverse happy_var_2)
-	)}}}
-
-happyReduce_139 = happySpecReduce_2  29# happyReduction_139
-happyReduction_139 happy_x_2
-	happy_x_1
-	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym BracketL) _)) -> 
-	case happyOutTok happy_x_2 of { (Located happy_var_2 (Token (Sym BracketR) _)) -> 
-	happyIn43
-		 (at (happy_var_1,happy_var_2) $ EList []
-	)}}
-
-happyReduce_140 = happySpecReduce_3  29# happyReduction_140
-happyReduction_140 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym BracketL) _)) -> 
-	case happyOut50 happy_x_2 of { happy_var_2 -> 
-	case happyOutTok happy_x_3 of { (Located happy_var_3 (Token (Sym BracketR) _)) -> 
-	happyIn43
-		 (at (happy_var_1,happy_var_3) happy_var_2
-	)}}}
-
-happyReduce_141 = happySpecReduce_2  29# happyReduction_141
-happyReduction_141 happy_x_2
-	happy_x_1
-	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym BackTick) _)) -> 
-	case happyOut82 happy_x_2 of { happy_var_2 -> 
-	happyIn43
-		 (at (happy_var_1,happy_var_2) $ ETypeVal happy_var_2
-	)}}
-
-happyReduce_142 = happySpecReduce_3  29# happyReduction_142
-happyReduction_142 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut43 happy_x_1 of { happy_var_1 -> 
-	case happyOut46 happy_x_3 of { happy_var_3 -> 
-	happyIn43
-		 (at (happy_var_1,happy_var_3) $ ESel happy_var_1 (thing happy_var_3)
-	)}}
-
-happyReduce_143 = happySpecReduce_3  29# happyReduction_143
-happyReduction_143 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym ParenL  ) _)) -> 
-	case happyOutTok happy_x_3 of { (Located happy_var_3 (Token (Sym ParenR  ) _)) -> 
-	happyIn43
-		 (at (happy_var_1,happy_var_3) $ ECon ECAt
-	)}}
-
-happyReduce_144 = happySpecReduce_3  29# happyReduction_144
-happyReduction_144 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym ParenL  ) _)) -> 
-	case happyOutTok happy_x_3 of { (Located happy_var_3 (Token (Sym ParenR  ) _)) -> 
-	happyIn43
-		 (at (happy_var_1,happy_var_3) $ ECon ECAtRange
-	)}}
-
-happyReduce_145 = happySpecReduce_3  29# happyReduction_145
-happyReduction_145 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym ParenL  ) _)) -> 
-	case happyOutTok happy_x_3 of { (Located happy_var_3 (Token (Sym ParenR  ) _)) -> 
-	happyIn43
-		 (at (happy_var_1,happy_var_3) $ ECon ECAtBack
-	)}}
-
-happyReduce_146 = happySpecReduce_3  29# happyReduction_146
-happyReduction_146 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym ParenL  ) _)) -> 
-	case happyOutTok happy_x_3 of { (Located happy_var_3 (Token (Sym ParenR  ) _)) -> 
-	happyIn43
-		 (at (happy_var_1,happy_var_3) $ ECon ECAtRangeBack
-	)}}
-
-happyReduce_147 = happySpecReduce_3  29# happyReduction_147
-happyReduction_147 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym ParenL  ) _)) -> 
-	case happyOutTok happy_x_3 of { (Located happy_var_3 (Token (Sym ParenR  ) _)) -> 
-	happyIn43
-		 (at (happy_var_1,happy_var_3) $ ECon ECCat
-	)}}
-
-happyReduce_148 = happySpecReduce_3  29# happyReduction_148
-happyReduction_148 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym ParenL  ) _)) -> 
-	case happyOutTok happy_x_3 of { (Located happy_var_3 (Token (Sym ParenR  ) _)) -> 
-	happyIn43
-		 (at (happy_var_1,happy_var_3) $ ECon ECPlus
-	)}}
-
-happyReduce_149 = happySpecReduce_3  29# happyReduction_149
-happyReduction_149 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym ParenL  ) _)) -> 
-	case happyOutTok happy_x_3 of { (Located happy_var_3 (Token (Sym ParenR  ) _)) -> 
-	happyIn43
-		 (at (happy_var_1,happy_var_3) $ ECon ECMinus
-	)}}
-
-happyReduce_150 = happySpecReduce_3  29# happyReduction_150
-happyReduction_150 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym ParenL  ) _)) -> 
-	case happyOutTok happy_x_3 of { (Located happy_var_3 (Token (Sym ParenR  ) _)) -> 
-	happyIn43
-		 (at (happy_var_1,happy_var_3) $ ECon ECMul
-	)}}
-
-happyReduce_151 = happySpecReduce_3  29# happyReduction_151
-happyReduction_151 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym ParenL  ) _)) -> 
-	case happyOutTok happy_x_3 of { (Located happy_var_3 (Token (Sym ParenR  ) _)) -> 
-	happyIn43
-		 (at (happy_var_1,happy_var_3) $ ECon ECDiv
-	)}}
-
-happyReduce_152 = happySpecReduce_3  29# happyReduction_152
-happyReduction_152 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym ParenL  ) _)) -> 
-	case happyOutTok happy_x_3 of { (Located happy_var_3 (Token (Sym ParenR  ) _)) -> 
-	happyIn43
-		 (at (happy_var_1,happy_var_3) $ ECon ECMod
-	)}}
-
-happyReduce_153 = happySpecReduce_3  29# happyReduction_153
-happyReduction_153 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym ParenL  ) _)) -> 
-	case happyOutTok happy_x_3 of { (Located happy_var_3 (Token (Sym ParenR  ) _)) -> 
-	happyIn43
-		 (at (happy_var_1,happy_var_3) $ ECon ECExp
-	)}}
-
-happyReduce_154 = happySpecReduce_3  29# happyReduction_154
-happyReduction_154 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym ParenL  ) _)) -> 
-	case happyOutTok happy_x_3 of { (Located happy_var_3 (Token (Sym ParenR  ) _)) -> 
-	happyIn43
-		 (at (happy_var_1,happy_var_3) $ ECon ECXor
-	)}}
-
-happyReduce_155 = happySpecReduce_3  29# happyReduction_155
-happyReduction_155 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym ParenL  ) _)) -> 
-	case happyOutTok happy_x_3 of { (Located happy_var_3 (Token (Sym ParenR  ) _)) -> 
-	happyIn43
-		 (at (happy_var_1,happy_var_3) $ ECon ECOr
-	)}}
-
-happyReduce_156 = happySpecReduce_3  29# happyReduction_156
-happyReduction_156 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym ParenL  ) _)) -> 
-	case happyOutTok happy_x_3 of { (Located happy_var_3 (Token (Sym ParenR  ) _)) -> 
-	happyIn43
-		 (at (happy_var_1,happy_var_3) $ ECon ECAnd
-	)}}
-
-happyReduce_157 = happySpecReduce_3  29# happyReduction_157
-happyReduction_157 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym ParenL  ) _)) -> 
-	case happyOutTok happy_x_3 of { (Located happy_var_3 (Token (Sym ParenR  ) _)) -> 
-	happyIn43
-		 (at (happy_var_1,happy_var_3) $ ECon ECEq
-	)}}
-
-happyReduce_158 = happySpecReduce_3  29# happyReduction_158
-happyReduction_158 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym ParenL  ) _)) -> 
-	case happyOutTok happy_x_3 of { (Located happy_var_3 (Token (Sym ParenR  ) _)) -> 
-	happyIn43
-		 (at (happy_var_1,happy_var_3) $ ECon ECNotEq
-	)}}
-
-happyReduce_159 = happySpecReduce_3  29# happyReduction_159
-happyReduction_159 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym ParenL  ) _)) -> 
-	case happyOutTok happy_x_3 of { (Located happy_var_3 (Token (Sym ParenR  ) _)) -> 
-	happyIn43
-		 (at (happy_var_1,happy_var_3) $ ECon ECFunEq
-	)}}
-
-happyReduce_160 = happySpecReduce_3  29# happyReduction_160
-happyReduction_160 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym ParenL  ) _)) -> 
-	case happyOutTok happy_x_3 of { (Located happy_var_3 (Token (Sym ParenR  ) _)) -> 
-	happyIn43
-		 (at (happy_var_1,happy_var_3) $ ECon ECFunNotEq
-	)}}
-
-happyReduce_161 = happySpecReduce_3  29# happyReduction_161
-happyReduction_161 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym ParenL  ) _)) -> 
-	case happyOutTok happy_x_3 of { (Located happy_var_3 (Token (Sym ParenR  ) _)) -> 
-	happyIn43
-		 (at (happy_var_1,happy_var_3) $ ECon ECGt
-	)}}
-
-happyReduce_162 = happySpecReduce_3  29# happyReduction_162
-happyReduction_162 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym ParenL  ) _)) -> 
-	case happyOutTok happy_x_3 of { (Located happy_var_3 (Token (Sym ParenR  ) _)) -> 
-	happyIn43
-		 (at (happy_var_1,happy_var_3) $ ECon ECLt
-	)}}
-
-happyReduce_163 = happySpecReduce_3  29# happyReduction_163
-happyReduction_163 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym ParenL  ) _)) -> 
-	case happyOutTok happy_x_3 of { (Located happy_var_3 (Token (Sym ParenR  ) _)) -> 
-	happyIn43
-		 (at (happy_var_1,happy_var_3) $ ECon ECLtEq
-	)}}
-
-happyReduce_164 = happySpecReduce_3  29# happyReduction_164
-happyReduction_164 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym ParenL  ) _)) -> 
-	case happyOutTok happy_x_3 of { (Located happy_var_3 (Token (Sym ParenR  ) _)) -> 
-	happyIn43
-		 (at (happy_var_1,happy_var_3) $ ECon ECGtEq
-	)}}
-
-happyReduce_165 = happySpecReduce_3  29# happyReduction_165
-happyReduction_165 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym ParenL  ) _)) -> 
-	case happyOutTok happy_x_3 of { (Located happy_var_3 (Token (Sym ParenR  ) _)) -> 
-	happyIn43
-		 (at (happy_var_1,happy_var_3) $ ECon ECShiftL
-	)}}
-
-happyReduce_166 = happySpecReduce_3  29# happyReduction_166
-happyReduction_166 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym ParenL  ) _)) -> 
-	case happyOutTok happy_x_3 of { (Located happy_var_3 (Token (Sym ParenR  ) _)) -> 
-	happyIn43
-		 (at (happy_var_1,happy_var_3) $ ECon ECShiftR
-	)}}
-
-happyReduce_167 = happySpecReduce_3  29# happyReduction_167
-happyReduction_167 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym ParenL  ) _)) -> 
-	case happyOutTok happy_x_3 of { (Located happy_var_3 (Token (Sym ParenR  ) _)) -> 
-	happyIn43
-		 (at (happy_var_1,happy_var_3) $ ECon ECRotL
-	)}}
-
-happyReduce_168 = happySpecReduce_3  29# happyReduction_168
-happyReduction_168 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym ParenL  ) _)) -> 
-	case happyOutTok happy_x_3 of { (Located happy_var_3 (Token (Sym ParenR  ) _)) -> 
-	happyIn43
-		 (at (happy_var_1,happy_var_3) $ ECon ECRotR
-	)}}
-
-happyReduce_169 = happyMonadReduce 2# 29# happyReduction_169
-happyReduction_169 (happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest) tk
-	 = happyThen (case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym TriL    ) _)) -> 
-	case happyOutTok happy_x_2 of { (Located happy_var_2 (Token (Sym TriR    ) _)) -> 
-	( mkPoly (rComb happy_var_1 happy_var_2) [])}}
-	) (\r -> happyReturn (happyIn43 r))
-
-happyReduce_170 = happyMonadReduce 3# 29# happyReduction_170
-happyReduction_170 (happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest) tk
-	 = happyThen (case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym TriL    ) _)) -> 
-	case happyOut44 happy_x_2 of { happy_var_2 -> 
-	case happyOutTok happy_x_3 of { (Located happy_var_3 (Token (Sym TriR    ) _)) -> 
-	( mkPoly (rComb happy_var_1 happy_var_3) happy_var_2)}}}
-	) (\r -> happyReturn (happyIn43 r))
-
-happyReduce_171 = happySpecReduce_1  30# happyReduction_171
-happyReduction_171 happy_x_1
-	 =  case happyOut45 happy_x_1 of { happy_var_1 -> 
-	happyIn44
-		 ([happy_var_1]
-	)}
-
-happyReduce_172 = happySpecReduce_3  30# happyReduction_172
-happyReduction_172 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut44 happy_x_1 of { happy_var_1 -> 
-	case happyOut45 happy_x_3 of { happy_var_3 -> 
-	happyIn44
-		 (happy_var_3 : happy_var_1
-	)}}
-
-happyReduce_173 = happyMonadReduce 1# 31# happyReduction_173
-happyReduction_173 (happy_x_1 `HappyStk`
-	happyRest) tk
-	 = happyThen (case happyOutTok happy_x_1 of { (happy_var_1@(Located _ (Token (Num   {}) _))) -> 
-	( polyTerm (srcRange happy_var_1) (getNum happy_var_1) 0)}
-	) (\r -> happyReturn (happyIn45 r))
-
-happyReduce_174 = happyMonadReduce 1# 31# happyReduction_174
-happyReduction_174 (happy_x_1 `HappyStk`
-	happyRest) tk
-	 = happyThen (case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (KW KW_x)       _)) -> 
-	( polyTerm happy_var_1 1 1)}
-	) (\r -> happyReturn (happyIn45 r))
-
-happyReduce_175 = happyMonadReduce 3# 31# happyReduction_175
-happyReduction_175 (happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest) tk
-	 = happyThen (case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (KW KW_x)       _)) -> 
-	case happyOutTok happy_x_3 of { (happy_var_3@(Located _ (Token (Num   {}) _))) -> 
-	( polyTerm (rComb happy_var_1 (srcRange happy_var_3))
-                                                            1 (getNum happy_var_3))}}
-	) (\r -> happyReturn (happyIn45 r))
-
-happyReduce_176 = happySpecReduce_1  32# happyReduction_176
-happyReduction_176 happy_x_1
-	 =  case happyOut79 happy_x_1 of { happy_var_1 -> 
-	happyIn46
-		 (fmap (`RecordSel` Nothing) happy_var_1
-	)}
-
-happyReduce_177 = happyMonadReduce 1# 32# happyReduction_177
-happyReduction_177 (happy_x_1 `HappyStk`
-	happyRest) tk
-	 = happyThen (case happyOutTok happy_x_1 of { (happy_var_1@(Located _ (Token (Num   {}) _))) -> 
-	( mkTupleSel (srcRange happy_var_1) (getNum happy_var_1))}
-	) (\r -> happyReturn (happyIn46 r))
-
-happyReduce_178 = happySpecReduce_3  33# happyReduction_178
-happyReduction_178 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut38 happy_x_1 of { happy_var_1 -> 
-	case happyOut38 happy_x_3 of { happy_var_3 -> 
-	happyIn47
-		 ([ happy_var_3, happy_var_1]
-	)}}
-
-happyReduce_179 = happySpecReduce_3  33# happyReduction_179
-happyReduction_179 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut47 happy_x_1 of { happy_var_1 -> 
-	case happyOut38 happy_x_3 of { happy_var_3 -> 
-	happyIn47
-		 (happy_var_3 : happy_var_1
-	)}}
-
-happyReduce_180 = happySpecReduce_3  34# happyReduction_180
-happyReduction_180 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut79 happy_x_1 of { happy_var_1 -> 
-	case happyOut38 happy_x_3 of { happy_var_3 -> 
-	happyIn48
-		 (Named { name = happy_var_1, value = happy_var_3 }
-	)}}
-
-happyReduce_181 = happyReduce 4# 34# happyReduction_181
-happyReduction_181 (happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest)
-	 = case happyOut79 happy_x_1 of { happy_var_1 -> 
-	case happyOut33 happy_x_2 of { happy_var_2 -> 
-	case happyOut38 happy_x_4 of { happy_var_4 -> 
-	happyIn48
-		 (Named { name = happy_var_1, value = EFun (reverse happy_var_2) happy_var_4 }
-	) `HappyStk` happyRest}}}
-
-happyReduce_182 = happySpecReduce_1  35# happyReduction_182
-happyReduction_182 happy_x_1
-	 =  case happyOut48 happy_x_1 of { happy_var_1 -> 
-	happyIn49
-		 ([happy_var_1]
-	)}
-
-happyReduce_183 = happySpecReduce_3  35# happyReduction_183
-happyReduction_183 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut49 happy_x_1 of { happy_var_1 -> 
-	case happyOut48 happy_x_3 of { happy_var_3 -> 
-	happyIn49
-		 (happy_var_3 : happy_var_1
-	)}}
-
-happyReduce_184 = happySpecReduce_3  36# happyReduction_184
-happyReduction_184 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut38 happy_x_1 of { happy_var_1 -> 
-	case happyOut51 happy_x_3 of { happy_var_3 -> 
-	happyIn50
-		 (EComp happy_var_1 (reverse happy_var_3)
-	)}}
-
-happyReduce_185 = happySpecReduce_1  36# happyReduction_185
-happyReduction_185 happy_x_1
-	 =  case happyOut38 happy_x_1 of { happy_var_1 -> 
-	happyIn50
-		 (EList [happy_var_1]
-	)}
-
-happyReduce_186 = happySpecReduce_1  36# happyReduction_186
-happyReduction_186 happy_x_1
-	 =  case happyOut47 happy_x_1 of { happy_var_1 -> 
-	happyIn50
-		 (EList (reverse happy_var_1)
-	)}
-
-happyReduce_187 = happyMonadReduce 2# 36# happyReduction_187
-happyReduction_187 (happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest) tk
-	 = happyThen (case happyOut38 happy_x_1 of { happy_var_1 -> 
-	case happyOutTok happy_x_2 of { (Located happy_var_2 (Token (Sym DotDot  ) _)) -> 
-	( eFromTo happy_var_2 happy_var_1 Nothing   Nothing)}}
-	) (\r -> happyReturn (happyIn50 r))
-
-happyReduce_188 = happyMonadReduce 3# 36# happyReduction_188
-happyReduction_188 (happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest) tk
-	 = happyThen (case happyOut38 happy_x_1 of { happy_var_1 -> 
-	case happyOutTok happy_x_2 of { (Located happy_var_2 (Token (Sym DotDot  ) _)) -> 
-	case happyOut38 happy_x_3 of { happy_var_3 -> 
-	( eFromTo happy_var_2 happy_var_1 Nothing   (Just happy_var_3))}}}
-	) (\r -> happyReturn (happyIn50 r))
-
-happyReduce_189 = happyMonadReduce 4# 36# happyReduction_189
-happyReduction_189 (happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest) tk
-	 = happyThen (case happyOut38 happy_x_1 of { happy_var_1 -> 
-	case happyOut38 happy_x_3 of { happy_var_3 -> 
-	case happyOutTok happy_x_4 of { (Located happy_var_4 (Token (Sym DotDot  ) _)) -> 
-	( eFromTo happy_var_4 happy_var_1 (Just happy_var_3) Nothing)}}}
-	) (\r -> happyReturn (happyIn50 r))
-
-happyReduce_190 = happyMonadReduce 5# 36# happyReduction_190
-happyReduction_190 (happy_x_5 `HappyStk`
-	happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest) tk
-	 = happyThen (case happyOut38 happy_x_1 of { happy_var_1 -> 
-	case happyOut38 happy_x_3 of { happy_var_3 -> 
-	case happyOutTok happy_x_4 of { (Located happy_var_4 (Token (Sym DotDot  ) _)) -> 
-	case happyOut38 happy_x_5 of { happy_var_5 -> 
-	( eFromTo happy_var_4 happy_var_1 (Just happy_var_3) (Just happy_var_5))}}}}
-	) (\r -> happyReturn (happyIn50 r))
-
-happyReduce_191 = happySpecReduce_2  36# happyReduction_191
-happyReduction_191 happy_x_2
-	happy_x_1
-	 =  case happyOut38 happy_x_1 of { happy_var_1 -> 
-	happyIn50
-		 (EInfFrom happy_var_1 Nothing
-	)}
-
-happyReduce_192 = happyReduce 4# 36# happyReduction_192
-happyReduction_192 (happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest)
-	 = case happyOut38 happy_x_1 of { happy_var_1 -> 
-	case happyOut38 happy_x_3 of { happy_var_3 -> 
-	happyIn50
-		 (EInfFrom happy_var_1 (Just happy_var_3)
-	) `HappyStk` happyRest}}
-
-happyReduce_193 = happySpecReduce_1  37# happyReduction_193
-happyReduction_193 happy_x_1
-	 =  case happyOut52 happy_x_1 of { happy_var_1 -> 
-	happyIn51
-		 ([ reverse happy_var_1 ]
-	)}
-
-happyReduce_194 = happySpecReduce_3  37# happyReduction_194
-happyReduction_194 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut51 happy_x_1 of { happy_var_1 -> 
-	case happyOut52 happy_x_3 of { happy_var_3 -> 
-	happyIn51
-		 (reverse happy_var_3 : happy_var_1
-	)}}
-
-happyReduce_195 = happySpecReduce_1  38# happyReduction_195
-happyReduction_195 happy_x_1
-	 =  case happyOut53 happy_x_1 of { happy_var_1 -> 
-	happyIn52
-		 ([happy_var_1]
-	)}
-
-happyReduce_196 = happySpecReduce_3  38# happyReduction_196
-happyReduction_196 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut52 happy_x_1 of { happy_var_1 -> 
-	case happyOut53 happy_x_3 of { happy_var_3 -> 
-	happyIn52
-		 (happy_var_3 : happy_var_1
-	)}}
-
-happyReduce_197 = happySpecReduce_3  39# happyReduction_197
-happyReduction_197 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut54 happy_x_1 of { happy_var_1 -> 
-	case happyOut38 happy_x_3 of { happy_var_3 -> 
-	happyIn53
-		 (Match happy_var_1 happy_var_3
-	)}}
-
-happyReduce_198 = happySpecReduce_3  40# happyReduction_198
-happyReduction_198 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut55 happy_x_1 of { happy_var_1 -> 
-	case happyOut70 happy_x_3 of { happy_var_3 -> 
-	happyIn54
-		 (at (happy_var_1,happy_var_3) $ PTyped happy_var_1 happy_var_3
-	)}}
-
-happyReduce_199 = happySpecReduce_1  40# happyReduction_199
-happyReduction_199 happy_x_1
-	 =  case happyOut55 happy_x_1 of { happy_var_1 -> 
-	happyIn54
-		 (happy_var_1
-	)}
-
-happyReduce_200 = happySpecReduce_3  41# happyReduction_200
-happyReduction_200 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut55 happy_x_1 of { happy_var_1 -> 
-	case happyOut55 happy_x_3 of { happy_var_3 -> 
-	happyIn55
-		 (at (happy_var_1,happy_var_3) $ PSplit happy_var_1 happy_var_3
-	)}}
-
-happyReduce_201 = happySpecReduce_1  41# happyReduction_201
-happyReduction_201 happy_x_1
-	 =  case happyOut56 happy_x_1 of { happy_var_1 -> 
-	happyIn55
-		 (happy_var_1
-	)}
-
-happyReduce_202 = happySpecReduce_1  42# happyReduction_202
-happyReduction_202 happy_x_1
-	 =  case happyOut79 happy_x_1 of { happy_var_1 -> 
-	happyIn56
-		 (PVar happy_var_1
-	)}
-
-happyReduce_203 = happySpecReduce_1  42# happyReduction_203
-happyReduction_203 happy_x_1
-	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym Underscore ) _)) -> 
-	happyIn56
-		 (at happy_var_1       $ PWild
-	)}
-
-happyReduce_204 = happySpecReduce_2  42# happyReduction_204
-happyReduction_204 happy_x_2
-	happy_x_1
-	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym ParenL  ) _)) -> 
-	case happyOutTok happy_x_2 of { (Located happy_var_2 (Token (Sym ParenR  ) _)) -> 
-	happyIn56
-		 (at (happy_var_1,happy_var_2) $ PTuple []
-	)}}
-
-happyReduce_205 = happySpecReduce_3  42# happyReduction_205
-happyReduction_205 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym ParenL  ) _)) -> 
-	case happyOut54 happy_x_2 of { happy_var_2 -> 
-	case happyOutTok happy_x_3 of { (Located happy_var_3 (Token (Sym ParenR  ) _)) -> 
-	happyIn56
-		 (at (happy_var_1,happy_var_3)   happy_var_2
-	)}}}
-
-happyReduce_206 = happySpecReduce_3  42# happyReduction_206
-happyReduction_206 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym ParenL  ) _)) -> 
-	case happyOut57 happy_x_2 of { happy_var_2 -> 
-	case happyOutTok happy_x_3 of { (Located happy_var_3 (Token (Sym ParenR  ) _)) -> 
-	happyIn56
-		 (at (happy_var_1,happy_var_3) $ PTuple (reverse happy_var_2)
-	)}}}
-
-happyReduce_207 = happySpecReduce_2  42# happyReduction_207
-happyReduction_207 happy_x_2
-	happy_x_1
-	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym BracketL) _)) -> 
-	case happyOutTok happy_x_2 of { (Located happy_var_2 (Token (Sym BracketR) _)) -> 
-	happyIn56
-		 (at (happy_var_1,happy_var_2) $ PList []
-	)}}
-
-happyReduce_208 = happySpecReduce_3  42# happyReduction_208
-happyReduction_208 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym BracketL) _)) -> 
-	case happyOut54 happy_x_2 of { happy_var_2 -> 
-	case happyOutTok happy_x_3 of { (Located happy_var_3 (Token (Sym BracketR) _)) -> 
-	happyIn56
-		 (at (happy_var_1,happy_var_3) $ PList [happy_var_2]
-	)}}}
-
-happyReduce_209 = happySpecReduce_3  42# happyReduction_209
-happyReduction_209 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym BracketL) _)) -> 
-	case happyOut57 happy_x_2 of { happy_var_2 -> 
-	case happyOutTok happy_x_3 of { (Located happy_var_3 (Token (Sym BracketR) _)) -> 
-	happyIn56
-		 (at (happy_var_1,happy_var_3) $ PList (reverse happy_var_2)
-	)}}}
-
-happyReduce_210 = happySpecReduce_2  42# happyReduction_210
-happyReduction_210 happy_x_2
-	happy_x_1
-	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym CurlyL  ) _)) -> 
-	case happyOutTok happy_x_2 of { (Located happy_var_2 (Token (Sym CurlyR  ) _)) -> 
-	happyIn56
-		 (at (happy_var_1,happy_var_2) $ PRecord []
-	)}}
-
-happyReduce_211 = happySpecReduce_3  42# happyReduction_211
-happyReduction_211 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym CurlyL  ) _)) -> 
-	case happyOut59 happy_x_2 of { happy_var_2 -> 
-	case happyOutTok happy_x_3 of { (Located happy_var_3 (Token (Sym CurlyR  ) _)) -> 
-	happyIn56
-		 (at (happy_var_1,happy_var_3) $ PRecord (reverse happy_var_2)
-	)}}}
-
-happyReduce_212 = happySpecReduce_3  43# happyReduction_212
-happyReduction_212 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut54 happy_x_1 of { happy_var_1 -> 
-	case happyOut54 happy_x_3 of { happy_var_3 -> 
-	happyIn57
-		 ([happy_var_3, happy_var_1]
-	)}}
-
-happyReduce_213 = happySpecReduce_3  43# happyReduction_213
-happyReduction_213 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut57 happy_x_1 of { happy_var_1 -> 
-	case happyOut54 happy_x_3 of { happy_var_3 -> 
-	happyIn57
-		 (happy_var_3 : happy_var_1
-	)}}
-
-happyReduce_214 = happySpecReduce_3  44# happyReduction_214
-happyReduction_214 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut79 happy_x_1 of { happy_var_1 -> 
-	case happyOut54 happy_x_3 of { happy_var_3 -> 
-	happyIn58
-		 (Named { name = happy_var_1, value = happy_var_3 }
-	)}}
-
-happyReduce_215 = happySpecReduce_1  45# happyReduction_215
-happyReduction_215 happy_x_1
-	 =  case happyOut58 happy_x_1 of { happy_var_1 -> 
-	happyIn59
-		 ([happy_var_1]
-	)}
-
-happyReduce_216 = happySpecReduce_3  45# happyReduction_216
-happyReduction_216 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut59 happy_x_1 of { happy_var_1 -> 
-	case happyOut58 happy_x_3 of { happy_var_3 -> 
-	happyIn59
-		 (happy_var_3 : happy_var_1
-	)}}
-
-happyReduce_217 = happySpecReduce_1  46# happyReduction_217
-happyReduction_217 happy_x_1
-	 =  case happyOut70 happy_x_1 of { happy_var_1 -> 
-	happyIn60
-		 (at happy_var_1 $ mkSchema [] [] happy_var_1
-	)}
-
-happyReduce_218 = happySpecReduce_2  46# happyReduction_218
-happyReduction_218 happy_x_2
-	happy_x_1
-	 =  case happyOut61 happy_x_1 of { happy_var_1 -> 
-	case happyOut70 happy_x_2 of { happy_var_2 -> 
-	happyIn60
-		 (at (happy_var_1,happy_var_2) $ mkSchema (thing happy_var_1) [] happy_var_2
-	)}}
-
-happyReduce_219 = happySpecReduce_2  46# happyReduction_219
-happyReduction_219 happy_x_2
-	happy_x_1
-	 =  case happyOut62 happy_x_1 of { happy_var_1 -> 
-	case happyOut70 happy_x_2 of { happy_var_2 -> 
-	happyIn60
-		 (at (happy_var_1,happy_var_2) $ mkSchema [] (thing happy_var_1) happy_var_2
-	)}}
-
-happyReduce_220 = happySpecReduce_3  46# happyReduction_220
-happyReduction_220 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut61 happy_x_1 of { happy_var_1 -> 
-	case happyOut62 happy_x_2 of { happy_var_2 -> 
-	case happyOut70 happy_x_3 of { happy_var_3 -> 
-	happyIn60
-		 (at (happy_var_1,happy_var_3) $ mkSchema (thing happy_var_1)
-                                                          (thing happy_var_2) happy_var_3
-	)}}}
-
-happyReduce_221 = happySpecReduce_2  47# happyReduction_221
-happyReduction_221 happy_x_2
-	happy_x_1
-	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym CurlyL  ) _)) -> 
-	case happyOutTok happy_x_2 of { (Located happy_var_2 (Token (Sym CurlyR  ) _)) -> 
-	happyIn61
-		 (Located (rComb happy_var_1 happy_var_2) []
-	)}}
-
-happyReduce_222 = happySpecReduce_3  47# happyReduction_222
-happyReduction_222 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym CurlyL  ) _)) -> 
-	case happyOut65 happy_x_2 of { happy_var_2 -> 
-	case happyOutTok happy_x_3 of { (Located happy_var_3 (Token (Sym CurlyR  ) _)) -> 
-	happyIn61
-		 (Located (rComb happy_var_1 happy_var_3) (reverse happy_var_2)
-	)}}}
-
-happyReduce_223 = happySpecReduce_3  48# happyReduction_223
-happyReduction_223 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym ParenL  ) _)) -> 
-	case happyOutTok happy_x_3 of { (Located happy_var_3 (Token (Sym FatArrR ) _)) -> 
-	happyIn62
-		 (Located (rComb happy_var_1 happy_var_3) []
-	)}}
-
-happyReduce_224 = happySpecReduce_2  48# happyReduction_224
-happyReduction_224 happy_x_2
-	happy_x_1
-	 =  case happyOut68 happy_x_1 of { happy_var_1 -> 
-	case happyOutTok happy_x_2 of { (Located happy_var_2 (Token (Sym FatArrR ) _)) -> 
-	happyIn62
-		 (Located
-                                    (rComb (fromMaybe happy_var_2 (getLoc happy_var_1)) happy_var_2) [happy_var_1]
-	)}}
-
-happyReduce_225 = happyReduce 4# 48# happyReduction_225
-happyReduction_225 (happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest)
-	 = case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym ParenL  ) _)) -> 
-	case happyOut69 happy_x_2 of { happy_var_2 -> 
-	case happyOutTok happy_x_4 of { (Located happy_var_4 (Token (Sym FatArrR ) _)) -> 
-	happyIn62
-		 (Located (rComb happy_var_1 happy_var_4) (reverse happy_var_2)
-	) `HappyStk` happyRest}}}
-
-happyReduce_226 = happySpecReduce_1  49# happyReduction_226
-happyReduction_226 happy_x_1
-	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Op Hash        ) _)) -> 
-	happyIn63
-		 (Located happy_var_1 KNum
-	)}
-
-happyReduce_227 = happySpecReduce_1  49# happyReduction_227
-happyReduction_227 happy_x_1
-	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Op Mul         ) _)) -> 
-	happyIn63
-		 (Located happy_var_1 KType
-	)}
-
-happyReduce_228 = happyMonadReduce 1# 50# happyReduction_228
-happyReduction_228 (happy_x_1 `HappyStk`
-	happyRest) tk
-	 = happyThen (case happyOut79 happy_x_1 of { happy_var_1 -> 
-	( mkTParam happy_var_1 Nothing)}
-	) (\r -> happyReturn (happyIn64 r))
-
-happyReduce_229 = happyMonadReduce 3# 50# happyReduction_229
-happyReduction_229 (happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest) tk
-	 = happyThen (case happyOut79 happy_x_1 of { happy_var_1 -> 
-	case happyOut63 happy_x_3 of { happy_var_3 -> 
-	( mkTParam (at (happy_var_1,happy_var_3) happy_var_1) (Just (thing happy_var_3)))}}
-	) (\r -> happyReturn (happyIn64 r))
-
-happyReduce_230 = happySpecReduce_1  51# happyReduction_230
-happyReduction_230 happy_x_1
-	 =  case happyOut64 happy_x_1 of { happy_var_1 -> 
-	happyIn65
-		 ([happy_var_1]
-	)}
-
-happyReduce_231 = happySpecReduce_3  51# happyReduction_231
-happyReduction_231 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut65 happy_x_1 of { happy_var_1 -> 
-	case happyOut64 happy_x_3 of { happy_var_3 -> 
-	happyIn65
-		 (happy_var_3 : happy_var_1
-	)}}
-
-happyReduce_232 = happyMonadReduce 1# 52# happyReduction_232
-happyReduction_232 (happy_x_1 `HappyStk`
-	happyRest) tk
-	 = happyThen (case happyOut79 happy_x_1 of { happy_var_1 -> 
-	( mkTParam happy_var_1 Nothing)}
-	) (\r -> happyReturn (happyIn66 r))
-
-happyReduce_233 = happyMonadReduce 5# 52# happyReduction_233
-happyReduction_233 (happy_x_5 `HappyStk`
-	happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest) tk
-	 = happyThen (case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym ParenL  ) _)) -> 
-	case happyOut79 happy_x_2 of { happy_var_2 -> 
-	case happyOut63 happy_x_4 of { happy_var_4 -> 
-	case happyOutTok happy_x_5 of { (Located happy_var_5 (Token (Sym ParenR  ) _)) -> 
-	( mkTParam (at (happy_var_1,happy_var_5) happy_var_2) (Just (thing happy_var_4)))}}}}
-	) (\r -> happyReturn (happyIn66 r))
-
-happyReduce_234 = happySpecReduce_1  53# happyReduction_234
-happyReduction_234 happy_x_1
-	 =  case happyOut66 happy_x_1 of { happy_var_1 -> 
-	happyIn67
-		 ([happy_var_1]
-	)}
-
-happyReduce_235 = happySpecReduce_2  53# happyReduction_235
-happyReduction_235 happy_x_2
-	happy_x_1
-	 =  case happyOut67 happy_x_1 of { happy_var_1 -> 
-	case happyOut66 happy_x_2 of { happy_var_2 -> 
-	happyIn67
-		 (happy_var_2 : happy_var_1
-	)}}
-
-happyReduce_236 = happySpecReduce_3  54# happyReduction_236
-happyReduction_236 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut70 happy_x_1 of { happy_var_1 -> 
-	case happyOut70 happy_x_3 of { happy_var_3 -> 
-	happyIn68
-		 (at (happy_var_1,happy_var_3) $ CEqual  happy_var_1 happy_var_3
-	)}}
-
-happyReduce_237 = happySpecReduce_3  54# happyReduction_237
-happyReduction_237 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut70 happy_x_1 of { happy_var_1 -> 
-	case happyOut70 happy_x_3 of { happy_var_3 -> 
-	happyIn68
-		 (at (happy_var_1,happy_var_3) $ CGeq happy_var_3 happy_var_1
-	)}}
-
-happyReduce_238 = happySpecReduce_3  54# happyReduction_238
-happyReduction_238 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut70 happy_x_1 of { happy_var_1 -> 
-	case happyOut70 happy_x_3 of { happy_var_3 -> 
-	happyIn68
-		 (at (happy_var_1,happy_var_3) $ CGeq happy_var_1 happy_var_3
-	)}}
-
-happyReduce_239 = happySpecReduce_2  54# happyReduction_239
-happyReduction_239 happy_x_2
-	happy_x_1
-	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (KW KW_fin    ) _)) -> 
-	case happyOut72 happy_x_2 of { happy_var_2 -> 
-	happyIn68
-		 (at (happy_var_1,happy_var_2) $ CFin happy_var_2
-	)}}
-
-happyReduce_240 = happySpecReduce_2  54# happyReduction_240
-happyReduction_240 happy_x_2
-	happy_x_1
-	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (KW KW_Arith  ) _)) -> 
-	case happyOut72 happy_x_2 of { happy_var_2 -> 
-	happyIn68
-		 (at (happy_var_1,happy_var_2) $ CArith happy_var_2
-	)}}
-
-happyReduce_241 = happySpecReduce_2  54# happyReduction_241
-happyReduction_241 happy_x_2
-	happy_x_1
-	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (KW KW_Cmp    ) _)) -> 
-	case happyOut72 happy_x_2 of { happy_var_2 -> 
-	happyIn68
-		 (at (happy_var_1,happy_var_2) $ CCmp   happy_var_2
-	)}}
-
-happyReduce_242 = happySpecReduce_1  55# happyReduction_242
-happyReduction_242 happy_x_1
-	 =  case happyOut68 happy_x_1 of { happy_var_1 -> 
-	happyIn69
-		 ([happy_var_1]
-	)}
-
-happyReduce_243 = happySpecReduce_3  55# happyReduction_243
-happyReduction_243 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut69 happy_x_1 of { happy_var_1 -> 
-	case happyOut68 happy_x_3 of { happy_var_3 -> 
-	happyIn69
-		 (happy_var_3 : happy_var_1
-	)}}
-
-happyReduce_244 = happySpecReduce_3  56# happyReduction_244
-happyReduction_244 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut70 happy_x_1 of { happy_var_1 -> 
-	case happyOut70 happy_x_3 of { happy_var_3 -> 
-	happyIn70
-		 (at (happy_var_1,happy_var_3) $ TFun happy_var_1 happy_var_3
-	)}}
-
-happyReduce_245 = happySpecReduce_3  56# happyReduction_245
-happyReduction_245 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut70 happy_x_1 of { happy_var_1 -> 
-	case happyOut70 happy_x_3 of { happy_var_3 -> 
-	happyIn70
-		 (at (happy_var_1,happy_var_3) $ TApp TCAdd [happy_var_1, happy_var_3]
-	)}}
-
-happyReduce_246 = happySpecReduce_3  56# happyReduction_246
-happyReduction_246 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut70 happy_x_1 of { happy_var_1 -> 
-	case happyOut70 happy_x_3 of { happy_var_3 -> 
-	happyIn70
-		 (at (happy_var_1,happy_var_3) $ TApp TCSub [happy_var_1, happy_var_3]
-	)}}
-
-happyReduce_247 = happySpecReduce_3  56# happyReduction_247
-happyReduction_247 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut70 happy_x_1 of { happy_var_1 -> 
-	case happyOut70 happy_x_3 of { happy_var_3 -> 
-	happyIn70
-		 (at (happy_var_1,happy_var_3) $ TApp TCMul [happy_var_1, happy_var_3]
-	)}}
-
-happyReduce_248 = happySpecReduce_3  56# happyReduction_248
-happyReduction_248 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut70 happy_x_1 of { happy_var_1 -> 
-	case happyOut70 happy_x_3 of { happy_var_3 -> 
-	happyIn70
-		 (at (happy_var_1,happy_var_3) $ TApp TCDiv [happy_var_1, happy_var_3]
-	)}}
-
-happyReduce_249 = happySpecReduce_3  56# happyReduction_249
-happyReduction_249 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut70 happy_x_1 of { happy_var_1 -> 
-	case happyOut70 happy_x_3 of { happy_var_3 -> 
-	happyIn70
-		 (at (happy_var_1,happy_var_3) $ TApp TCMod [happy_var_1, happy_var_3]
-	)}}
-
-happyReduce_250 = happySpecReduce_3  56# happyReduction_250
-happyReduction_250 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut70 happy_x_1 of { happy_var_1 -> 
-	case happyOut70 happy_x_3 of { happy_var_3 -> 
-	happyIn70
-		 (at (happy_var_1,happy_var_3) $ TApp TCExp [happy_var_1, happy_var_3]
-	)}}
-
-happyReduce_251 = happySpecReduce_1  56# happyReduction_251
-happyReduction_251 happy_x_1
-	 =  case happyOut71 happy_x_1 of { happy_var_1 -> 
-	happyIn70
-		 (happy_var_1
-	)}
-
-happyReduce_252 = happySpecReduce_2  57# happyReduction_252
-happyReduction_252 happy_x_2
-	happy_x_1
-	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (KW KW_lg2    ) _)) -> 
-	case happyOut72 happy_x_2 of { happy_var_2 -> 
-	happyIn71
-		 (at (happy_var_1,happy_var_2) $ TApp TCLg2   [happy_var_2]
-	)}}
-
-happyReduce_253 = happySpecReduce_3  57# happyReduction_253
-happyReduction_253 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (KW KW_lengthFromThen) _)) -> 
-	case happyOut72 happy_x_2 of { happy_var_2 -> 
-	case happyOut72 happy_x_3 of { happy_var_3 -> 
-	happyIn71
-		 (at (happy_var_1,happy_var_3) $ TApp TCLenFromThen [happy_var_2,happy_var_3]
-	)}}}
-
-happyReduce_254 = happyReduce 4# 57# happyReduction_254
-happyReduction_254 (happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest)
-	 = case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (KW KW_lengthFromThenTo) _)) -> 
-	case happyOut72 happy_x_2 of { happy_var_2 -> 
-	case happyOut72 happy_x_3 of { happy_var_3 -> 
-	case happyOut72 happy_x_4 of { happy_var_4 -> 
-	happyIn71
-		 (at (happy_var_1,happy_var_4) $ TApp TCLenFromThen [happy_var_2,happy_var_3,happy_var_4]
-	) `HappyStk` happyRest}}}}
-
-happyReduce_255 = happySpecReduce_3  57# happyReduction_255
-happyReduction_255 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (KW KW_min    ) _)) -> 
-	case happyOut72 happy_x_2 of { happy_var_2 -> 
-	case happyOut72 happy_x_3 of { happy_var_3 -> 
-	happyIn71
-		 (at (happy_var_1,happy_var_3) $ TApp TCMin   [happy_var_2,happy_var_3]
-	)}}}
-
-happyReduce_256 = happySpecReduce_3  57# happyReduction_256
-happyReduction_256 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (KW KW_max    ) _)) -> 
-	case happyOut72 happy_x_2 of { happy_var_2 -> 
-	case happyOut72 happy_x_3 of { happy_var_3 -> 
-	happyIn71
-		 (at (happy_var_1,happy_var_3) $ TApp TCMax   [happy_var_2,happy_var_3]
-	)}}}
-
-happyReduce_257 = happySpecReduce_2  57# happyReduction_257
-happyReduction_257 happy_x_2
-	happy_x_1
-	 =  case happyOut74 happy_x_1 of { happy_var_1 -> 
-	case happyOut72 happy_x_2 of { happy_var_2 -> 
-	happyIn71
-		 (at (happy_var_1,happy_var_2) $ foldr TSeq happy_var_2 (reverse (thing happy_var_1))
-	)}}
-
-happyReduce_258 = happySpecReduce_2  57# happyReduction_258
-happyReduction_258 happy_x_2
-	happy_x_1
-	 =  case happyOut81 happy_x_1 of { happy_var_1 -> 
-	case happyOut73 happy_x_2 of { happy_var_2 -> 
-	happyIn71
-		 (at (happy_var_1,head happy_var_2)
-                                     $ TUser (thing happy_var_1) (reverse happy_var_2)
-	)}}
-
-happyReduce_259 = happySpecReduce_1  57# happyReduction_259
-happyReduction_259 happy_x_1
-	 =  case happyOut72 happy_x_1 of { happy_var_1 -> 
-	happyIn71
-		 (happy_var_1
-	)}
-
-happyReduce_260 = happySpecReduce_1  58# happyReduction_260
-happyReduction_260 happy_x_1
-	 =  case happyOut81 happy_x_1 of { happy_var_1 -> 
-	happyIn72
-		 (at happy_var_1 $ TUser (thing happy_var_1) []
-	)}
-
-happyReduce_261 = happySpecReduce_1  58# happyReduction_261
-happyReduction_261 happy_x_1
-	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (KW KW_Bit    ) _)) -> 
-	happyIn72
-		 (at happy_var_1 $ TBit
-	)}
-
-happyReduce_262 = happySpecReduce_1  58# happyReduction_262
-happyReduction_262 happy_x_1
-	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (KW KW_inf    ) _)) -> 
-	happyIn72
-		 (at happy_var_1 $ TInf
-	)}
-
-happyReduce_263 = happySpecReduce_1  58# happyReduction_263
-happyReduction_263 happy_x_1
-	 =  case happyOutTok happy_x_1 of { (happy_var_1@(Located _ (Token (Num   {}) _))) -> 
-	happyIn72
-		 (at happy_var_1 $ TNum  (getNum happy_var_1)
-	)}
-
-happyReduce_264 = happySpecReduce_1  58# happyReduction_264
-happyReduction_264 happy_x_1
-	 =  case happyOutTok happy_x_1 of { (happy_var_1@(Located _ (Token (ChrLit {}) _))) -> 
-	happyIn72
-		 (at happy_var_1 $ TChar (toEnum $ fromInteger
-                                                          $ getNum happy_var_1)
-	)}
-
-happyReduce_265 = happySpecReduce_3  58# happyReduction_265
-happyReduction_265 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym BracketL) _)) -> 
-	case happyOut70 happy_x_2 of { happy_var_2 -> 
-	case happyOutTok happy_x_3 of { (Located happy_var_3 (Token (Sym BracketR) _)) -> 
-	happyIn72
-		 (at (happy_var_1,happy_var_3) $ TSeq happy_var_2 TBit
-	)}}}
-
-happyReduce_266 = happySpecReduce_3  58# happyReduction_266
-happyReduction_266 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym ParenL  ) _)) -> 
-	case happyOut70 happy_x_2 of { happy_var_2 -> 
-	case happyOutTok happy_x_3 of { (Located happy_var_3 (Token (Sym ParenR  ) _)) -> 
-	happyIn72
-		 (at (happy_var_1,happy_var_3) happy_var_2
-	)}}}
-
-happyReduce_267 = happySpecReduce_2  58# happyReduction_267
-happyReduction_267 happy_x_2
-	happy_x_1
-	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym ParenL  ) _)) -> 
-	case happyOutTok happy_x_2 of { (Located happy_var_2 (Token (Sym ParenR  ) _)) -> 
-	happyIn72
-		 (at (happy_var_1,happy_var_2) $ TTuple []
-	)}}
-
-happyReduce_268 = happySpecReduce_3  58# happyReduction_268
-happyReduction_268 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym ParenL  ) _)) -> 
-	case happyOut75 happy_x_2 of { happy_var_2 -> 
-	case happyOutTok happy_x_3 of { (Located happy_var_3 (Token (Sym ParenR  ) _)) -> 
-	happyIn72
-		 (at (happy_var_1,happy_var_3) $ TTuple  (reverse happy_var_2)
-	)}}}
-
-happyReduce_269 = happySpecReduce_2  58# happyReduction_269
-happyReduction_269 happy_x_2
-	happy_x_1
-	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym CurlyL  ) _)) -> 
-	case happyOutTok happy_x_2 of { (Located happy_var_2 (Token (Sym CurlyR  ) _)) -> 
-	happyIn72
-		 (at (happy_var_1,happy_var_2) $ TRecord []
-	)}}
-
-happyReduce_270 = happySpecReduce_3  58# happyReduction_270
-happyReduction_270 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym CurlyL  ) _)) -> 
-	case happyOut77 happy_x_2 of { happy_var_2 -> 
-	case happyOutTok happy_x_3 of { (Located happy_var_3 (Token (Sym CurlyR  ) _)) -> 
-	happyIn72
-		 (at (happy_var_1,happy_var_3) $ TRecord (reverse happy_var_2)
-	)}}}
-
-happyReduce_271 = happySpecReduce_1  58# happyReduction_271
-happyReduction_271 happy_x_1
-	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym Underscore ) _)) -> 
-	happyIn72
-		 (at happy_var_1 TWild
-	)}
-
-happyReduce_272 = happySpecReduce_1  59# happyReduction_272
-happyReduction_272 happy_x_1
-	 =  case happyOut72 happy_x_1 of { happy_var_1 -> 
-	happyIn73
-		 ([ happy_var_1 ]
-	)}
-
-happyReduce_273 = happySpecReduce_2  59# happyReduction_273
-happyReduction_273 happy_x_2
-	happy_x_1
-	 =  case happyOut73 happy_x_1 of { happy_var_1 -> 
-	case happyOut72 happy_x_2 of { happy_var_2 -> 
-	happyIn73
-		 (happy_var_2 : happy_var_1
-	)}}
-
-happyReduce_274 = happySpecReduce_3  60# happyReduction_274
-happyReduction_274 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym BracketL) _)) -> 
-	case happyOut70 happy_x_2 of { happy_var_2 -> 
-	case happyOutTok happy_x_3 of { (Located happy_var_3 (Token (Sym BracketR) _)) -> 
-	happyIn74
-		 (Located (rComb happy_var_1 happy_var_3) [ happy_var_2 ]
-	)}}}
-
-happyReduce_275 = happyReduce 4# 60# happyReduction_275
-happyReduction_275 (happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest)
-	 = case happyOut74 happy_x_1 of { happy_var_1 -> 
-	case happyOut70 happy_x_3 of { happy_var_3 -> 
-	case happyOutTok happy_x_4 of { (Located happy_var_4 (Token (Sym BracketR) _)) -> 
-	happyIn74
-		 (at (happy_var_1,happy_var_4) (fmap (happy_var_3 :) happy_var_1)
-	) `HappyStk` happyRest}}}
-
-happyReduce_276 = happySpecReduce_3  61# happyReduction_276
-happyReduction_276 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut70 happy_x_1 of { happy_var_1 -> 
-	case happyOut70 happy_x_3 of { happy_var_3 -> 
-	happyIn75
-		 ([ happy_var_3, happy_var_1]
-	)}}
-
-happyReduce_277 = happySpecReduce_3  61# happyReduction_277
-happyReduction_277 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut75 happy_x_1 of { happy_var_1 -> 
-	case happyOut70 happy_x_3 of { happy_var_3 -> 
-	happyIn75
-		 (happy_var_3 : happy_var_1
-	)}}
-
-happyReduce_278 = happySpecReduce_3  62# happyReduction_278
-happyReduction_278 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut79 happy_x_1 of { happy_var_1 -> 
-	case happyOut70 happy_x_3 of { happy_var_3 -> 
-	happyIn76
-		 (Named { name = happy_var_1, value = happy_var_3 }
-	)}}
-
-happyReduce_279 = happySpecReduce_1  63# happyReduction_279
-happyReduction_279 happy_x_1
-	 =  case happyOut76 happy_x_1 of { happy_var_1 -> 
-	happyIn77
-		 ([happy_var_1]
-	)}
-
-happyReduce_280 = happySpecReduce_3  63# happyReduction_280
-happyReduction_280 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut77 happy_x_1 of { happy_var_1 -> 
-	case happyOut76 happy_x_3 of { happy_var_3 -> 
-	happyIn77
-		 (happy_var_3 : happy_var_1
-	)}}
-
-happyReduce_281 = happySpecReduce_1  64# happyReduction_281
-happyReduction_281 happy_x_1
-	 =  case happyOut79 happy_x_1 of { happy_var_1 -> 
-	happyIn78
-		 ([happy_var_1]
-	)}
-
-happyReduce_282 = happySpecReduce_3  64# happyReduction_282
-happyReduction_282 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut78 happy_x_1 of { happy_var_1 -> 
-	case happyOut79 happy_x_3 of { happy_var_3 -> 
-	happyIn78
-		 (happy_var_3 : happy_var_1
-	)}}
-
-happyReduce_283 = happySpecReduce_1  65# happyReduction_283
-happyReduction_283 happy_x_1
-	 =  case happyOutTok happy_x_1 of { (happy_var_1@(Located _ (Token (Ident {}) _))) -> 
-	happyIn79
-		 (happy_var_1 { thing = getName happy_var_1 }
-	)}
-
-happyReduce_284 = happySpecReduce_1  65# happyReduction_284
-happyReduction_284 happy_x_1
-	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (KW KW_x)       _)) -> 
-	happyIn79
-		 (Located { srcRange = happy_var_1, thing = Name "x" }
-	)}
-
-happyReduce_285 = happySpecReduce_1  65# happyReduction_285
-happyReduction_285 happy_x_1
-	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (KW KW_private)   _)) -> 
-	happyIn79
-		 (Located { srcRange = happy_var_1, thing = Name "private" }
-	)}
-
-happyReduce_286 = happySpecReduce_1  65# happyReduction_286
-happyReduction_286 happy_x_1
-	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (KW KW_as)        _)) -> 
-	happyIn79
-		 (Located { srcRange = happy_var_1, thing = Name "as" }
-	)}
-
-happyReduce_287 = happySpecReduce_1  65# happyReduction_287
-happyReduction_287 happy_x_1
-	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (KW KW_hiding)    _)) -> 
-	happyIn79
-		 (Located { srcRange = happy_var_1, thing = Name "hiding" }
-	)}
-
-happyReduce_288 = happySpecReduce_1  66# happyReduction_288
-happyReduction_288 happy_x_1
-	 =  case happyOut78 happy_x_1 of { happy_var_1 -> 
-	happyIn80
-		 (mkModName happy_var_1
-	)}
-
-happyReduce_289 = happySpecReduce_1  67# happyReduction_289
-happyReduction_289 happy_x_1
-	 =  case happyOut78 happy_x_1 of { happy_var_1 -> 
-	happyIn81
-		 (mkQName happy_var_1
-	)}
-
-happyReduce_290 = happySpecReduce_1  68# happyReduction_290
-happyReduction_290 happy_x_1
-	 =  case happyOut81 happy_x_1 of { happy_var_1 -> 
-	happyIn82
-		 (at happy_var_1 $ TUser (thing happy_var_1) []
-	)}
-
-happyReduce_291 = happySpecReduce_1  68# happyReduction_291
-happyReduction_291 happy_x_1
-	 =  case happyOutTok happy_x_1 of { (happy_var_1@(Located _ (Token (Num   {}) _))) -> 
-	happyIn82
-		 (at happy_var_1 $ TNum  (getNum happy_var_1)
-	)}
-
-happyReduce_292 = happyMonadReduce 3# 68# happyReduction_292
-happyReduction_292 (happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest) tk
-	 = happyThen (case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym ParenL  ) _)) -> 
-	case happyOut70 happy_x_2 of { happy_var_2 -> 
-	case happyOutTok happy_x_3 of { (Located happy_var_3 (Token (Sym ParenR  ) _)) -> 
-	( validDemotedType (rComb happy_var_1 happy_var_3) happy_var_2)}}}
-	) (\r -> happyReturn (happyIn82 r))
-
-happyReduce_293 = happySpecReduce_2  68# happyReduction_293
-happyReduction_293 happy_x_2
-	happy_x_1
-	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym CurlyL  ) _)) -> 
-	case happyOutTok happy_x_2 of { (Located happy_var_2 (Token (Sym CurlyR  ) _)) -> 
-	happyIn82
-		 (at (happy_var_1,happy_var_2) (TRecord [])
-	)}}
-
-happyReduce_294 = happySpecReduce_3  68# happyReduction_294
-happyReduction_294 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym CurlyL  ) _)) -> 
-	case happyOut84 happy_x_2 of { happy_var_2 -> 
-	case happyOutTok happy_x_3 of { (Located happy_var_3 (Token (Sym CurlyR  ) _)) -> 
-	happyIn82
-		 (at (happy_var_1,happy_var_3) (TRecord (reverse happy_var_2))
-	)}}}
-
-happyReduce_295 = happySpecReduce_3  68# happyReduction_295
-happyReduction_295 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym CurlyL  ) _)) -> 
-	case happyOut70 happy_x_2 of { happy_var_2 -> 
-	case happyOutTok happy_x_3 of { (Located happy_var_3 (Token (Sym CurlyR  ) _)) -> 
-	happyIn82
-		 (anonRecord (getLoc (happy_var_1,happy_var_3)) [happy_var_2]
-	)}}}
-
-happyReduce_296 = happySpecReduce_3  68# happyReduction_296
-happyReduction_296 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym CurlyL  ) _)) -> 
-	case happyOut75 happy_x_2 of { happy_var_2 -> 
-	case happyOutTok happy_x_3 of { (Located happy_var_3 (Token (Sym CurlyR  ) _)) -> 
-	happyIn82
-		 (anonRecord (getLoc (happy_var_1,happy_var_3)) (reverse happy_var_2)
-	)}}}
-
-happyReduce_297 = happySpecReduce_3  69# happyReduction_297
-happyReduction_297 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut79 happy_x_1 of { happy_var_1 -> 
-	case happyOut70 happy_x_3 of { happy_var_3 -> 
-	happyIn83
-		 (Named { name = happy_var_1, value = happy_var_3 }
-	)}}
-
-happyReduce_298 = happySpecReduce_1  70# happyReduction_298
-happyReduction_298 happy_x_1
-	 =  case happyOut83 happy_x_1 of { happy_var_1 -> 
-	happyIn84
-		 ([happy_var_1]
-	)}
-
-happyReduce_299 = happySpecReduce_3  70# happyReduction_299
-happyReduction_299 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut84 happy_x_1 of { happy_var_1 -> 
-	case happyOut83 happy_x_3 of { happy_var_3 -> 
-	happyIn84
-		 (happy_var_3 : happy_var_1
-	)}}
-
-happyNewToken action sts stk
-	= lexerP(\tk -> 
-	let cont i = happyDoAction i tk action sts stk in
-	case tk of {
-	Located _ (Token EOF _) -> happyDoAction 96# tk action sts stk;
-	happy_dollar_dollar@(Located _ (Token (Num   {}) _)) -> cont 1#;
-	happy_dollar_dollar@(Located _ (Token (Ident {}) _)) -> cont 2#;
-	happy_dollar_dollar@(Located _ (Token (StrLit {}) _)) -> cont 3#;
-	happy_dollar_dollar@(Located _ (Token (ChrLit {}) _)) -> cont 4#;
-	Located happy_dollar_dollar (Token (KW KW_include)   _) -> cont 5#;
-	Located happy_dollar_dollar (Token (KW KW_import)    _) -> cont 6#;
-	Located happy_dollar_dollar (Token (KW KW_as)        _) -> cont 7#;
-	Located happy_dollar_dollar (Token (KW KW_hiding)    _) -> cont 8#;
-	Located happy_dollar_dollar (Token (KW KW_private)   _) -> cont 9#;
-	Located happy_dollar_dollar (Token (KW KW_property)  _) -> cont 10#;
-	Located happy_dollar_dollar (Token (KW KW_False  ) _) -> cont 11#;
-	Located happy_dollar_dollar (Token (KW KW_True   ) _) -> cont 12#;
-	Located happy_dollar_dollar (Token (KW KW_Arith  ) _) -> cont 13#;
-	Located happy_dollar_dollar (Token (KW KW_Bit    ) _) -> cont 14#;
-	Located happy_dollar_dollar (Token (KW KW_Cmp    ) _) -> cont 15#;
-	Located happy_dollar_dollar (Token (KW KW_error  ) _) -> cont 16#;
-	Located happy_dollar_dollar (Token (KW KW_fin    ) _) -> cont 17#;
-	Located happy_dollar_dollar (Token (KW KW_inf    ) _) -> cont 18#;
-	Located happy_dollar_dollar (Token (KW KW_lg2    ) _) -> cont 19#;
-	Located happy_dollar_dollar (Token (KW KW_lengthFromThen) _) -> cont 20#;
-	Located happy_dollar_dollar (Token (KW KW_lengthFromThenTo) _) -> cont 21#;
-	Located happy_dollar_dollar (Token (KW KW_type   ) _) -> cont 22#;
-	Located happy_dollar_dollar (Token (KW KW_newtype) _) -> cont 23#;
-	Located happy_dollar_dollar (Token (KW KW_module ) _) -> cont 24#;
-	Located happy_dollar_dollar (Token (KW KW_where  ) _) -> cont 25#;
-	Located happy_dollar_dollar (Token (KW KW_let    ) _) -> cont 26#;
-	Located happy_dollar_dollar (Token (KW KW_if     ) _) -> cont 27#;
-	Located happy_dollar_dollar (Token (KW KW_then   ) _) -> cont 28#;
-	Located happy_dollar_dollar (Token (KW KW_else   ) _) -> cont 29#;
-	Located happy_dollar_dollar (Token (KW KW_min    ) _) -> cont 30#;
-	Located happy_dollar_dollar (Token (KW KW_max    ) _) -> cont 31#;
-	Located happy_dollar_dollar (Token (KW KW_zero   ) _) -> cont 32#;
-	Located happy_dollar_dollar (Token (KW KW_join   ) _) -> cont 33#;
-	Located happy_dollar_dollar (Token (KW KW_reverse) _) -> cont 34#;
-	Located happy_dollar_dollar (Token (KW KW_split  ) _) -> cont 35#;
-	Located happy_dollar_dollar (Token (KW KW_splitAt) _) -> cont 36#;
-	Located happy_dollar_dollar (Token (KW KW_transpose) _) -> cont 37#;
-	Located happy_dollar_dollar (Token (KW KW_x)       _) -> cont 38#;
-	Located happy_dollar_dollar (Token (KW KW_pmult)   _) -> cont 39#;
-	Located happy_dollar_dollar (Token (KW KW_pmod)    _) -> cont 40#;
-	Located happy_dollar_dollar (Token (KW KW_pdiv)    _) -> cont 41#;
-	Located happy_dollar_dollar (Token (KW KW_random)  _) -> cont 42#;
-	Located happy_dollar_dollar (Token (Sym BracketL) _) -> cont 43#;
-	Located happy_dollar_dollar (Token (Sym BracketR) _) -> cont 44#;
-	Located happy_dollar_dollar (Token (Sym ArrL    ) _) -> cont 45#;
-	Located happy_dollar_dollar (Token (Sym DotDot  ) _) -> cont 46#;
-	Located happy_dollar_dollar (Token (Sym DotDotDot) _) -> cont 47#;
-	Located happy_dollar_dollar (Token (Sym Bar     ) _) -> cont 48#;
-	Located happy_dollar_dollar (Token (Sym ParenL  ) _) -> cont 49#;
-	Located happy_dollar_dollar (Token (Sym ParenR  ) _) -> cont 50#;
-	Located happy_dollar_dollar (Token (Sym Comma   ) _) -> cont 51#;
-	Located happy_dollar_dollar (Token (Sym Semi    ) _) -> cont 52#;
-	Located happy_dollar_dollar (Token (Sym Dot     ) _) -> cont 53#;
-	Located happy_dollar_dollar (Token (Sym CurlyL  ) _) -> cont 54#;
-	Located happy_dollar_dollar (Token (Sym CurlyR  ) _) -> cont 55#;
-	Located happy_dollar_dollar (Token (Sym TriL    ) _) -> cont 56#;
-	Located happy_dollar_dollar (Token (Sym TriR    ) _) -> cont 57#;
-	Located happy_dollar_dollar (Token (Sym EqDef   ) _) -> cont 58#;
-	Located happy_dollar_dollar (Token (Sym BackTick) _) -> cont 59#;
-	Located happy_dollar_dollar (Token (Sym Colon   ) _) -> cont 60#;
-	Located happy_dollar_dollar (Token (Sym ColonColon) _) -> cont 61#;
-	Located happy_dollar_dollar (Token (Sym ArrR    ) _) -> cont 62#;
-	Located happy_dollar_dollar (Token (Sym FatArrR ) _) -> cont 63#;
-	Located happy_dollar_dollar (Token (Sym Lambda  ) _) -> cont 64#;
-	Located happy_dollar_dollar (Token (Sym Underscore ) _) -> cont 65#;
-	Located happy_dollar_dollar (Token (Virt VCurlyL)  _) -> cont 66#;
-	Located happy_dollar_dollar (Token (Virt VCurlyR)  _) -> cont 67#;
-	Located happy_dollar_dollar (Token (Virt VSemi)    _) -> cont 68#;
-	Located happy_dollar_dollar (Token (Op Plus        ) _) -> cont 69#;
-	Located happy_dollar_dollar (Token (Op Minus       ) _) -> cont 70#;
-	Located happy_dollar_dollar (Token (Op Mul         ) _) -> cont 71#;
-	Located happy_dollar_dollar (Token (Op Div         ) _) -> cont 72#;
-	Located happy_dollar_dollar (Token (Op Exp         ) _) -> cont 73#;
-	Located happy_dollar_dollar (Token (Op Mod         ) _) -> cont 74#;
-	Located happy_dollar_dollar (Token (Op Xor         ) _) -> cont 75#;
-	Located happy_dollar_dollar (Token (Op Disj        ) _) -> cont 76#;
-	Located happy_dollar_dollar (Token (Op Conj        ) _) -> cont 77#;
-	Located happy_dollar_dollar (Token (Op NotEqual    ) _) -> cont 78#;
-	Located happy_dollar_dollar (Token (Op Equal       ) _) -> cont 79#;
-	Located happy_dollar_dollar (Token (Op NotEqualFun ) _) -> cont 80#;
-	Located happy_dollar_dollar (Token (Op EqualFun    ) _) -> cont 81#;
-	Located happy_dollar_dollar (Token (Op GreaterThan ) _) -> cont 82#;
-	Located happy_dollar_dollar (Token (Op LessThan    ) _) -> cont 83#;
-	Located happy_dollar_dollar (Token (Op LEQ         ) _) -> cont 84#;
-	Located happy_dollar_dollar (Token (Op GEQ         ) _) -> cont 85#;
-	Located happy_dollar_dollar (Token (Op ShiftR      ) _) -> cont 86#;
-	Located happy_dollar_dollar (Token (Op ShiftL      ) _) -> cont 87#;
-	Located happy_dollar_dollar (Token (Op RotR        ) _) -> cont 88#;
-	Located happy_dollar_dollar (Token (Op RotL        ) _) -> cont 89#;
-	Located happy_dollar_dollar (Token (Op Complement  ) _) -> cont 90#;
-	Located happy_dollar_dollar (Token (Op At          ) _) -> cont 91#;
-	Located happy_dollar_dollar (Token (Op AtAt        ) _) -> cont 92#;
-	Located happy_dollar_dollar (Token (Op Bang        ) _) -> cont 93#;
-	Located happy_dollar_dollar (Token (Op BangBang    ) _) -> cont 94#;
-	Located happy_dollar_dollar (Token (Op Hash        ) _) -> cont 95#;
-	_ -> happyError' tk
-	})
-
-happyError_ 96# tk = happyError' tk
-happyError_ _ tk = happyError' tk
-
-happyThen :: () => ParseM a -> (a -> ParseM b) -> ParseM b
-happyThen = (>>=)
-happyReturn :: () => a -> ParseM a
-happyReturn = (return)
-happyThen1 = happyThen
-happyReturn1 :: () => a -> ParseM a
-happyReturn1 = happyReturn
-happyError' :: () => (Located Token) -> ParseM a
-happyError' tk = (\token -> happyError) tk
-
-vmodule = happySomeParser where
-  happySomeParser = happyThen (happyParse 0#) (\x -> happyReturn (happyOut14 x))
-
-program = happySomeParser where
-  happySomeParser = happyThen (happyParse 1#) (\x -> happyReturn (happyOut22 x))
-
-programLayout = happySomeParser where
-  happySomeParser = happyThen (happyParse 2#) (\x -> happyReturn (happyOut23 x))
-
-expr = happySomeParser where
-  happySomeParser = happyThen (happyParse 3#) (\x -> happyReturn (happyOut38 x))
-
-decl = happySomeParser where
-  happySomeParser = happyThen (happyParse 4#) (\x -> happyReturn (happyOut28 x))
-
-decls = happySomeParser where
-  happySomeParser = happyThen (happyParse 5#) (\x -> happyReturn (happyOut34 x))
-
-declsLayout = happySomeParser where
-  happySomeParser = happyThen (happyParse 6#) (\x -> happyReturn (happyOut36 x))
-
-letDecl = happySomeParser where
-  happySomeParser = happyThen (happyParse 7#) (\x -> happyReturn (happyOut29 x))
-
-repl = happySomeParser where
-  happySomeParser = happyThen (happyParse 8#) (\x -> happyReturn (happyOut37 x))
-
-schema = happySomeParser where
-  happySomeParser = happyThen (happyParse 9#) (\x -> happyReturn (happyOut60 x))
-
-modName = happySomeParser where
-  happySomeParser = happyThen (happyParse 10#) (\x -> happyReturn (happyOut80 x))
-
-happySeq = happyDontSeq
-
-
-parseModName :: String -> Maybe ModName
-parseModName txt =
-  case parse defaultConfig { cfgModuleScope = False } modName txt of
-    Right a -> Just (thing a)
-    Left _  -> Nothing
-
-addImplicitIncludes :: Config -> Program -> Program
-addImplicitIncludes cfg (Program ds) =
-  Program $ map path (cfgAutoInclude cfg) ++ ds
-  where path p = Include Located { srcRange = rng, thing = p }
-        rng    = Range { source = cfgSource cfg, from = start, to = start }
-
-
-parseProgramWith :: Config -> String -> Either ParseError Program
-parseProgramWith cfg s = case res s of
-                          Left err -> Left err
-                          Right a  -> Right (addImplicitIncludes cfg a)
-  where
-  res = parse cfg $ case cfgLayout cfg of
-                      Layout   -> programLayout
-                      NoLayout -> program
-
-parseModule :: Config -> String -> Either ParseError Module
-parseModule cfg = parse cfg { cfgModuleScope = True } vmodule
-
-parseProgram :: Layout -> String -> Either ParseError Program
-parseProgram l = parseProgramWith defaultConfig { cfgLayout = l }
-
-parseExprWith :: Config -> String -> Either ParseError Expr
-parseExprWith cfg = parse cfg { cfgModuleScope = False } expr
-
-parseExpr :: String -> Either ParseError Expr
-parseExpr = parseExprWith defaultConfig
-
-parseDeclWith :: Config -> String -> Either ParseError Decl
-parseDeclWith cfg = parse cfg { cfgModuleScope = False } decl
-
-parseDecl :: String -> Either ParseError Decl
-parseDecl = parseDeclWith defaultConfig
-
-parseDeclsWith :: Config -> String -> Either ParseError [Decl]
-parseDeclsWith cfg = parse cfg { cfgModuleScope = ms } decls'
-  where (ms, decls') = case cfgLayout cfg of
-                         Layout   -> (True, declsLayout)
-                         NoLayout -> (False, decls)
-
-parseDecls :: String -> Either ParseError [Decl]
-parseDecls = parseDeclsWith defaultConfig
-
-parseLetDeclWith :: Config -> String -> Either ParseError Decl
-parseLetDeclWith cfg = parse cfg { cfgModuleScope = False } letDecl
-
-parseLetDecl :: String -> Either ParseError Decl
-parseLetDecl = parseLetDeclWith defaultConfig
-
-parseReplWith :: Config -> String -> Either ParseError ReplInput
-parseReplWith cfg = parse cfg { cfgModuleScope = False } repl
-
-parseRepl :: String -> Either ParseError ReplInput
-parseRepl = parseReplWith defaultConfig
-
-parseSchemaWith :: Config -> String -> Either ParseError Schema
-parseSchemaWith cfg = parse cfg { cfgModuleScope = False } schema
-
-parseSchema :: String -> Either ParseError Schema
-parseSchema = parseSchemaWith defaultConfig
-
--- vim: ft=haskell
-{-# LINE 1 "templates/GenericTemplate.hs" #-}
-{-# LINE 1 "templates/GenericTemplate.hs" #-}
-{-# LINE 1 "<built-in>" #-}
+-- |
+-- Module      :  $Header$
+-- Copyright   :  (c) 2013-2016 Galois, Inc.
+-- License     :  BSD3
+-- Maintainer  :  cryptol@galois.com
+-- Stability   :  provisional
+-- Portability :  portable
+
+{-# LANGUAGE Trustworthy #-}
+module Cryptol.Parser
+  ( parseModule
+  , parseProgram, parseProgramWith
+  , parseExpr, parseExprWith
+  , parseDecl, parseDeclWith
+  , parseDecls, parseDeclsWith
+  , parseLetDecl, parseLetDeclWith
+  , parseRepl, parseReplWith
+  , parseSchema, parseSchemaWith
+  , parseModName, parseHelpName
+  , ParseError(..), ppError
+  , Layout(..)
+  , Config(..), defaultConfig
+  , guessPreProc, PreProc(..)
+  ) where
+
+import           Control.Applicative as A
+import           Data.Maybe(fromMaybe)
+import           Data.Text.Lazy (Text)
+import qualified Data.Text.Lazy as T
+import qualified Data.Text as ST
+import           Control.Monad(liftM2,msum)
+
+import Cryptol.Prims.Syntax
+import Cryptol.Parser.AST
+import Cryptol.Parser.Position
+import Cryptol.Parser.LexerUtils
+import Cryptol.Parser.ParserUtils
+import Cryptol.Parser.Unlit(PreProc(..), guessPreProc)
+import Cryptol.Utils.Ident (packIdent,packInfix)
+
+import Paths_cryptol
+import qualified Data.Array as Happy_Data_Array
+import qualified GHC.Exts as Happy_GHC_Exts
+import Control.Applicative(Applicative(..))
+import Control.Monad (ap)
+
+-- parser produced by Happy Version 1.19.5
+
+newtype HappyAbsSyn t67 = HappyAbsSyn HappyAny
+#if __GLASGOW_HASKELL__ >= 607
+type HappyAny = Happy_GHC_Exts.Any
+#else
+type HappyAny = forall a . a
+#endif
+happyIn15 :: (Module PName) -> (HappyAbsSyn t67)
+happyIn15 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn15 #-}
+happyOut15 :: (HappyAbsSyn t67) -> (Module PName)
+happyOut15 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut15 #-}
+happyIn16 :: (([Located Import], [TopDecl PName])) -> (HappyAbsSyn t67)
+happyIn16 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn16 #-}
+happyOut16 :: (HappyAbsSyn t67) -> (([Located Import], [TopDecl PName]))
+happyOut16 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut16 #-}
+happyIn17 :: ([Located Import]) -> (HappyAbsSyn t67)
+happyIn17 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn17 #-}
+happyOut17 :: (HappyAbsSyn t67) -> ([Located Import])
+happyOut17 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut17 #-}
+happyIn18 :: (Located Import) -> (HappyAbsSyn t67)
+happyIn18 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn18 #-}
+happyOut18 :: (HappyAbsSyn t67) -> (Located Import)
+happyOut18 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut18 #-}
+happyIn19 :: (Maybe (Located ModName)) -> (HappyAbsSyn t67)
+happyIn19 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn19 #-}
+happyOut19 :: (HappyAbsSyn t67) -> (Maybe (Located ModName))
+happyOut19 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut19 #-}
+happyIn20 :: (Maybe (Located ImportSpec)) -> (HappyAbsSyn t67)
+happyIn20 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn20 #-}
+happyOut20 :: (HappyAbsSyn t67) -> (Maybe (Located ImportSpec))
+happyOut20 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut20 #-}
+happyIn21 :: ([LIdent]) -> (HappyAbsSyn t67)
+happyIn21 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn21 #-}
+happyOut21 :: (HappyAbsSyn t67) -> ([LIdent])
+happyOut21 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut21 #-}
+happyIn22 :: ([Ident] -> ImportSpec) -> (HappyAbsSyn t67)
+happyIn22 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn22 #-}
+happyOut22 :: (HappyAbsSyn t67) -> ([Ident] -> ImportSpec)
+happyOut22 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut22 #-}
+happyIn23 :: (Program PName) -> (HappyAbsSyn t67)
+happyIn23 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn23 #-}
+happyOut23 :: (HappyAbsSyn t67) -> (Program PName)
+happyOut23 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut23 #-}
+happyIn24 :: (Program PName) -> (HappyAbsSyn t67)
+happyIn24 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn24 #-}
+happyOut24 :: (HappyAbsSyn t67) -> (Program PName)
+happyOut24 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut24 #-}
+happyIn25 :: ([TopDecl PName]) -> (HappyAbsSyn t67)
+happyIn25 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn25 #-}
+happyOut25 :: (HappyAbsSyn t67) -> ([TopDecl PName])
+happyOut25 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut25 #-}
+happyIn26 :: ([TopDecl PName]) -> (HappyAbsSyn t67)
+happyIn26 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn26 #-}
+happyOut26 :: (HappyAbsSyn t67) -> ([TopDecl PName])
+happyOut26 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut26 #-}
+happyIn27 :: ([TopDecl PName]) -> (HappyAbsSyn t67)
+happyIn27 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn27 #-}
+happyOut27 :: (HappyAbsSyn t67) -> ([TopDecl PName])
+happyOut27 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut27 #-}
+happyIn28 :: ([TopDecl PName]) -> (HappyAbsSyn t67)
+happyIn28 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn28 #-}
+happyOut28 :: (HappyAbsSyn t67) -> ([TopDecl PName])
+happyOut28 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut28 #-}
+happyIn29 :: ([TopDecl PName]) -> (HappyAbsSyn t67)
+happyIn29 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn29 #-}
+happyOut29 :: (HappyAbsSyn t67) -> ([TopDecl PName])
+happyOut29 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut29 #-}
+happyIn30 :: ([TopDecl PName]) -> (HappyAbsSyn t67)
+happyIn30 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn30 #-}
+happyOut30 :: (HappyAbsSyn t67) -> ([TopDecl PName])
+happyOut30 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut30 #-}
+happyIn31 :: (Located String) -> (HappyAbsSyn t67)
+happyIn31 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn31 #-}
+happyOut31 :: (HappyAbsSyn t67) -> (Located String)
+happyOut31 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut31 #-}
+happyIn32 :: (Maybe (Located String)) -> (HappyAbsSyn t67)
+happyIn32 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn32 #-}
+happyOut32 :: (HappyAbsSyn t67) -> (Maybe (Located String))
+happyOut32 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut32 #-}
+happyIn33 :: (Decl PName) -> (HappyAbsSyn t67)
+happyIn33 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn33 #-}
+happyOut33 :: (HappyAbsSyn t67) -> (Decl PName)
+happyOut33 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut33 #-}
+happyIn34 :: (Decl PName) -> (HappyAbsSyn t67)
+happyIn34 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn34 #-}
+happyOut34 :: (HappyAbsSyn t67) -> (Decl PName)
+happyOut34 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut34 #-}
+happyIn35 :: (Newtype PName) -> (HappyAbsSyn t67)
+happyIn35 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn35 #-}
+happyOut35 :: (HappyAbsSyn t67) -> (Newtype PName)
+happyOut35 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut35 #-}
+happyIn36 :: ([Named (Type PName)]) -> (HappyAbsSyn t67)
+happyIn36 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn36 #-}
+happyOut36 :: (HappyAbsSyn t67) -> ([Named (Type PName)])
+happyOut36 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut36 #-}
+happyIn37 :: ([ LPName ]) -> (HappyAbsSyn t67)
+happyIn37 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn37 #-}
+happyOut37 :: (HappyAbsSyn t67) -> ([ LPName ])
+happyOut37 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut37 #-}
+happyIn38 :: (LPName) -> (HappyAbsSyn t67)
+happyIn38 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn38 #-}
+happyOut38 :: (HappyAbsSyn t67) -> (LPName)
+happyOut38 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut38 #-}
+happyIn39 :: ([Pattern PName]) -> (HappyAbsSyn t67)
+happyIn39 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn39 #-}
+happyOut39 :: (HappyAbsSyn t67) -> ([Pattern PName])
+happyOut39 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut39 #-}
+happyIn40 :: ([Decl PName]) -> (HappyAbsSyn t67)
+happyIn40 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn40 #-}
+happyOut40 :: (HappyAbsSyn t67) -> ([Decl PName])
+happyOut40 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut40 #-}
+happyIn41 :: ([Decl PName]) -> (HappyAbsSyn t67)
+happyIn41 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn41 #-}
+happyOut41 :: (HappyAbsSyn t67) -> ([Decl PName])
+happyOut41 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut41 #-}
+happyIn42 :: ([Decl PName]) -> (HappyAbsSyn t67)
+happyIn42 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn42 #-}
+happyOut42 :: (HappyAbsSyn t67) -> ([Decl PName])
+happyOut42 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut42 #-}
+happyIn43 :: (ReplInput PName) -> (HappyAbsSyn t67)
+happyIn43 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn43 #-}
+happyOut43 :: (HappyAbsSyn t67) -> (ReplInput PName)
+happyOut43 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut43 #-}
+happyIn44 :: (Expr PName) -> (HappyAbsSyn t67)
+happyIn44 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn44 #-}
+happyOut44 :: (HappyAbsSyn t67) -> (Expr PName)
+happyOut44 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut44 #-}
+happyIn45 :: ([(Expr PName, Expr PName)]) -> (HappyAbsSyn t67)
+happyIn45 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn45 #-}
+happyOut45 :: (HappyAbsSyn t67) -> ([(Expr PName, Expr PName)])
+happyOut45 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut45 #-}
+happyIn46 :: ((Expr PName, Expr PName)) -> (HappyAbsSyn t67)
+happyIn46 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn46 #-}
+happyOut46 :: (HappyAbsSyn t67) -> ((Expr PName, Expr PName))
+happyOut46 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut46 #-}
+happyIn47 :: (Expr PName) -> (HappyAbsSyn t67)
+happyIn47 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn47 #-}
+happyOut47 :: (HappyAbsSyn t67) -> (Expr PName)
+happyOut47 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut47 #-}
+happyIn48 :: (Expr PName) -> (HappyAbsSyn t67)
+happyIn48 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn48 #-}
+happyOut48 :: (HappyAbsSyn t67) -> (Expr PName)
+happyOut48 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut48 #-}
+happyIn49 :: (Expr PName) -> (HappyAbsSyn t67)
+happyIn49 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn49 #-}
+happyOut49 :: (HappyAbsSyn t67) -> (Expr PName)
+happyOut49 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut49 #-}
+happyIn50 :: (Expr PName) -> (HappyAbsSyn t67)
+happyIn50 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn50 #-}
+happyOut50 :: (HappyAbsSyn t67) -> (Expr PName)
+happyOut50 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut50 #-}
+happyIn51 :: (LPName) -> (HappyAbsSyn t67)
+happyIn51 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn51 #-}
+happyOut51 :: (HappyAbsSyn t67) -> (LPName)
+happyOut51 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut51 #-}
+happyIn52 :: (LPName) -> (HappyAbsSyn t67)
+happyIn52 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn52 #-}
+happyOut52 :: (HappyAbsSyn t67) -> (LPName)
+happyOut52 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut52 #-}
+happyIn53 :: ([LPName]) -> (HappyAbsSyn t67)
+happyIn53 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn53 #-}
+happyOut53 :: (HappyAbsSyn t67) -> ([LPName])
+happyOut53 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut53 #-}
+happyIn54 :: ([Expr PName]) -> (HappyAbsSyn t67)
+happyIn54 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn54 #-}
+happyOut54 :: (HappyAbsSyn t67) -> ([Expr PName])
+happyOut54 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut54 #-}
+happyIn55 :: (Expr PName) -> (HappyAbsSyn t67)
+happyIn55 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn55 #-}
+happyOut55 :: (HappyAbsSyn t67) -> (Expr PName)
+happyOut55 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut55 #-}
+happyIn56 :: ([(Bool, Integer)]) -> (HappyAbsSyn t67)
+happyIn56 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn56 #-}
+happyOut56 :: (HappyAbsSyn t67) -> ([(Bool, Integer)])
+happyOut56 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut56 #-}
+happyIn57 :: ((Bool, Integer)) -> (HappyAbsSyn t67)
+happyIn57 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn57 #-}
+happyOut57 :: (HappyAbsSyn t67) -> ((Bool, Integer))
+happyOut57 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut57 #-}
+happyIn58 :: (Located Selector) -> (HappyAbsSyn t67)
+happyIn58 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn58 #-}
+happyOut58 :: (HappyAbsSyn t67) -> (Located Selector)
+happyOut58 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut58 #-}
+happyIn59 :: ([Expr PName]) -> (HappyAbsSyn t67)
+happyIn59 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn59 #-}
+happyOut59 :: (HappyAbsSyn t67) -> ([Expr PName])
+happyOut59 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut59 #-}
+happyIn60 :: (Named (Expr PName)) -> (HappyAbsSyn t67)
+happyIn60 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn60 #-}
+happyOut60 :: (HappyAbsSyn t67) -> (Named (Expr PName))
+happyOut60 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut60 #-}
+happyIn61 :: ([Named (Expr PName)]) -> (HappyAbsSyn t67)
+happyIn61 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn61 #-}
+happyOut61 :: (HappyAbsSyn t67) -> ([Named (Expr PName)])
+happyOut61 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut61 #-}
+happyIn62 :: (Expr PName) -> (HappyAbsSyn t67)
+happyIn62 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn62 #-}
+happyOut62 :: (HappyAbsSyn t67) -> (Expr PName)
+happyOut62 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut62 #-}
+happyIn63 :: ([[Match PName]]) -> (HappyAbsSyn t67)
+happyIn63 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn63 #-}
+happyOut63 :: (HappyAbsSyn t67) -> ([[Match PName]])
+happyOut63 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut63 #-}
+happyIn64 :: ([Match PName]) -> (HappyAbsSyn t67)
+happyIn64 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn64 #-}
+happyOut64 :: (HappyAbsSyn t67) -> ([Match PName])
+happyOut64 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut64 #-}
+happyIn65 :: (Match PName) -> (HappyAbsSyn t67)
+happyIn65 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn65 #-}
+happyOut65 :: (HappyAbsSyn t67) -> (Match PName)
+happyOut65 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut65 #-}
+happyIn66 :: (Pattern PName) -> (HappyAbsSyn t67)
+happyIn66 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn66 #-}
+happyOut66 :: (HappyAbsSyn t67) -> (Pattern PName)
+happyOut66 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut66 #-}
+happyIn67 :: t67 -> (HappyAbsSyn t67)
+happyIn67 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn67 #-}
+happyOut67 :: (HappyAbsSyn t67) -> t67
+happyOut67 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut67 #-}
+happyIn68 :: (Pattern PName) -> (HappyAbsSyn t67)
+happyIn68 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn68 #-}
+happyOut68 :: (HappyAbsSyn t67) -> (Pattern PName)
+happyOut68 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut68 #-}
+happyIn69 :: ([Pattern PName]) -> (HappyAbsSyn t67)
+happyIn69 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn69 #-}
+happyOut69 :: (HappyAbsSyn t67) -> ([Pattern PName])
+happyOut69 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut69 #-}
+happyIn70 :: (Named (Pattern PName)) -> (HappyAbsSyn t67)
+happyIn70 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn70 #-}
+happyOut70 :: (HappyAbsSyn t67) -> (Named (Pattern PName))
+happyOut70 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut70 #-}
+happyIn71 :: ([Named (Pattern PName)]) -> (HappyAbsSyn t67)
+happyIn71 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn71 #-}
+happyOut71 :: (HappyAbsSyn t67) -> ([Named (Pattern PName)])
+happyOut71 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut71 #-}
+happyIn72 :: (Schema PName) -> (HappyAbsSyn t67)
+happyIn72 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn72 #-}
+happyOut72 :: (HappyAbsSyn t67) -> (Schema PName)
+happyOut72 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut72 #-}
+happyIn73 :: (Located [TParam PName]) -> (HappyAbsSyn t67)
+happyIn73 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn73 #-}
+happyOut73 :: (HappyAbsSyn t67) -> (Located [TParam PName])
+happyOut73 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut73 #-}
+happyIn74 :: (Located [Prop PName]) -> (HappyAbsSyn t67)
+happyIn74 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn74 #-}
+happyOut74 :: (HappyAbsSyn t67) -> (Located [Prop PName])
+happyOut74 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut74 #-}
+happyIn75 :: (Located Kind) -> (HappyAbsSyn t67)
+happyIn75 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn75 #-}
+happyOut75 :: (HappyAbsSyn t67) -> (Located Kind)
+happyOut75 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut75 #-}
+happyIn76 :: (TParam PName) -> (HappyAbsSyn t67)
+happyIn76 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn76 #-}
+happyOut76 :: (HappyAbsSyn t67) -> (TParam PName)
+happyOut76 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut76 #-}
+happyIn77 :: ([TParam PName]) -> (HappyAbsSyn t67)
+happyIn77 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn77 #-}
+happyOut77 :: (HappyAbsSyn t67) -> ([TParam PName])
+happyOut77 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut77 #-}
+happyIn78 :: (TParam PName) -> (HappyAbsSyn t67)
+happyIn78 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn78 #-}
+happyOut78 :: (HappyAbsSyn t67) -> (TParam PName)
+happyOut78 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut78 #-}
+happyIn79 :: ([TParam PName]) -> (HappyAbsSyn t67)
+happyIn79 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn79 #-}
+happyOut79 :: (HappyAbsSyn t67) -> ([TParam PName])
+happyOut79 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut79 #-}
+happyIn80 :: (Type PName) -> (HappyAbsSyn t67)
+happyIn80 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn80 #-}
+happyOut80 :: (HappyAbsSyn t67) -> (Type PName)
+happyOut80 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut80 #-}
+happyIn81 :: (Type PName) -> (HappyAbsSyn t67)
+happyIn81 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn81 #-}
+happyOut81 :: (HappyAbsSyn t67) -> (Type PName)
+happyOut81 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut81 #-}
+happyIn82 :: (Type PName) -> (HappyAbsSyn t67)
+happyIn82 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn82 #-}
+happyOut82 :: (HappyAbsSyn t67) -> (Type PName)
+happyOut82 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut82 #-}
+happyIn83 :: ([ Type PName ]) -> (HappyAbsSyn t67)
+happyIn83 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn83 #-}
+happyOut83 :: (HappyAbsSyn t67) -> ([ Type PName ])
+happyOut83 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut83 #-}
+happyIn84 :: (Located [Type PName]) -> (HappyAbsSyn t67)
+happyIn84 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn84 #-}
+happyOut84 :: (HappyAbsSyn t67) -> (Located [Type PName])
+happyOut84 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut84 #-}
+happyIn85 :: ([Type PName]) -> (HappyAbsSyn t67)
+happyIn85 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn85 #-}
+happyOut85 :: (HappyAbsSyn t67) -> ([Type PName])
+happyOut85 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut85 #-}
+happyIn86 :: (Named (Type PName)) -> (HappyAbsSyn t67)
+happyIn86 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn86 #-}
+happyOut86 :: (HappyAbsSyn t67) -> (Named (Type PName))
+happyOut86 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut86 #-}
+happyIn87 :: ([Named (Type PName)]) -> (HappyAbsSyn t67)
+happyIn87 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn87 #-}
+happyOut87 :: (HappyAbsSyn t67) -> ([Named (Type PName)])
+happyOut87 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut87 #-}
+happyIn88 :: (Located Ident) -> (HappyAbsSyn t67)
+happyIn88 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn88 #-}
+happyOut88 :: (HappyAbsSyn t67) -> (Located Ident)
+happyOut88 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut88 #-}
+happyIn89 :: (LPName) -> (HappyAbsSyn t67)
+happyIn89 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn89 #-}
+happyOut89 :: (HappyAbsSyn t67) -> (LPName)
+happyOut89 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut89 #-}
+happyIn90 :: (Located ModName) -> (HappyAbsSyn t67)
+happyIn90 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn90 #-}
+happyOut90 :: (HappyAbsSyn t67) -> (Located ModName)
+happyOut90 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut90 #-}
+happyIn91 :: (Located PName) -> (HappyAbsSyn t67)
+happyIn91 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn91 #-}
+happyOut91 :: (HappyAbsSyn t67) -> (Located PName)
+happyOut91 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut91 #-}
+happyIn92 :: (Located PName) -> (HappyAbsSyn t67)
+happyIn92 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn92 #-}
+happyOut92 :: (HappyAbsSyn t67) -> (Located PName)
+happyOut92 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut92 #-}
+happyIn93 :: (Type PName) -> (HappyAbsSyn t67)
+happyIn93 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn93 #-}
+happyOut93 :: (HappyAbsSyn t67) -> (Type PName)
+happyOut93 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut93 #-}
+happyIn94 :: (Named (Type PName)) -> (HappyAbsSyn t67)
+happyIn94 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn94 #-}
+happyOut94 :: (HappyAbsSyn t67) -> (Named (Type PName))
+happyOut94 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut94 #-}
+happyIn95 :: ([Named (Type PName)]) -> (HappyAbsSyn t67)
+happyIn95 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyIn95 #-}
+happyOut95 :: (HappyAbsSyn t67) -> ([Named (Type PName)])
+happyOut95 x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOut95 #-}
+happyInTok :: (Located Token) -> (HappyAbsSyn t67)
+happyInTok x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyInTok #-}
+happyOutTok :: (HappyAbsSyn t67) -> (Located Token)
+happyOutTok x = Happy_GHC_Exts.unsafeCoerce# x
+{-# INLINE happyOutTok #-}
+
+
+happyActOffsets :: HappyAddr
+happyActOffsets = HappyA# "\xf9\xff\x8d\x01\x9a\x03\x95\x02\xa4\x06\xa4\x06\x99\x03\xb4\x03\x66\x02\xe6\x05\xfd\x06\xd1\x02\xb1\x03\xfd\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x82\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xea\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x82\x03\x00\x00\x82\x03\xcd\x05\xcd\x05\x18\x08\x8c\x03\x00\x00\xb4\x05\x9b\x05\x00\x00\x00\x00\x82\x05\xba\x04\xc2\x06\x00\x00\x00\x00\x6e\x03\x9d\x03\x00\x00\x00\x00\x0a\x08\x00\x00\x81\x07\x7b\x03\x00\x00\x00\x00\x00\x00\x00\x00\x47\x07\x95\x02\x37\x02\xf9\x00\x2a\x04\x05\x00\x9a\x07\x47\x07\xae\x02\xae\x02\x5f\x03\x5f\x03\x0e\x06\x72\x03\x8c\x00\x00\x00\xa1\x01\x46\x06\x12\x03\x98\x03\x8e\x03\x84\x03\x52\x07\x3e\x07\xdd\x02\xfc\x03\x00\x00\x4e\x03\xf5\xff\x4e\x03\xf0\x01\x4e\x03\x79\x01\x64\x03\x00\x00\x00\x00\x63\x03\x00\x00\x74\x03\x00\x00\x39\x03\xb5\x01\x45\x03\x40\x00\x00\x00\x25\x00\x00\x00\x00\x00\x00\x00\x90\x06\xd4\x01\x00\x00\xfd\x06\x41\x03\x00\x00\xa4\x05\x00\x00\x4a\x03\x15\x02\x00\x00\x82\x00\x00\x00\xe5\x01\x43\x03\x00\x00\x34\x03\x42\x03\xe4\xff\x00\x00\x2c\x03\x00\x00\x25\x07\x00\x00\xa3\x00\x36\x00\x00\x00\x0e\x05\x2c\x05\x2c\x05\x2c\x05\x11\x07\x00\x00\x47\x07\x95\x02\x13\x03\x8b\x05\x69\x05\x00\x00\x00\x00\xf4\x01\x00\x00\x00\x00\x00\x00\x08\x07\x00\x00\x00\x00\x00\x00\x50\x05\xa1\x04\x7a\x00\x00\x00\x00\x00\xf6\x02\x00\x00\x00\x00\xcd\x01\xf4\x06\x00\x00\xe1\x01\x0d\x03\x21\x03\x00\x00\xae\x02\xae\x02\x36\x02\x02\x03\xe8\x02\x00\x00\xf4\x00\xc3\x00\x00\x00\xf8\x02\x47\x07\xcb\x07\xce\x02\xae\x02\x50\x05\x00\x00\xc6\x01\x00\x00\xbc\x01\xbf\x02\x90\x07\xa7\x05\x1e\x03\x00\x00\x97\x03\x43\x05\x00\x00\x37\x05\x00\x00\x1e\x05\x00\x00\x1e\x05\x1e\x05\x1e\x05\x00\x00\x2c\x05\x1e\x05\x18\x08\xde\x02\xda\x02\xb3\x02\x00\x00\x2c\x05\x00\x00\x2c\x05\x11\x05\x40\x02\x00\x00\x5c\x07\xb6\x02\x00\x00\x00\x00\x1e\x05\x00\x00\x1e\x05\x2b\x02\x52\x07\x00\x00\x52\x07\x00\x00\x2c\x05\x00\x00\x00\x00\x00\x00\x00\x00\xe0\x06\x95\x02\x95\x02\x95\x02\x95\x02\x00\x00\x95\x02\x95\x02\x00\x00\x47\x07\x95\x02\x00\x00\x00\x00\x00\x00\x95\x02\xcc\x06\x95\x02\x52\x07\x00\x00\xd7\x02\x00\x00\x48\x00\xa8\x07\xa5\x01\xa7\x02\x00\x00\x5f\x01\x00\x00\xc0\x05\x00\x00\x95\x02\x7c\x06\x00\x00\x7c\x06\x00\x00\x00\x00\x00\x00\x2c\x05\x00\x00\xba\x02\x97\x02\x95\x02\x00\x00\x9b\x02\x9b\x02\x9b\x02\x00\x00\xf5\x04\x00\x00\x52\x07\x1e\x05\x00\x00\x47\x07\x00\x00\x47\x07\x00\x00\x1e\x05\x47\x07\x00\x00\x00\x00\x47\x07\x52\x07\x00\x00\x68\x06\xfa\x05\x04\x02\x00\x00\x04\x02\x00\x00\x7a\x02\x2c\x05\x04\x02\x8d\x02\x00\x00\x8c\x02\x52\x07\xe9\x06\x00\x00\x51\x02\xc9\x01\xc9\x01\x00\x00\x00\x00\x25\x00\x00\x00\x25\x00\x04\x02\xdc\x04\xb8\x06\x00\x00\x86\x01\x4d\x06\xb9\x01\x43\x02\x05\x05\x00\x00\x00\x00\xde\x00\x00\x00\x41\x06\x00\x00\x00\x00\x00\x00\x2a\x02\x2c\x05\x00\x00\x00\x00\x2c\x05\x35\x02\x00\x00\xec\x04\x2c\x05\x4a\x02\x95\x02\x00\x00\x00\x00\x00\x00\x00\x00\x52\x07\x00\x00\xec\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4a\x02\x95\x02\x4a\x02\x5f\x02\x3a\x02\x34\x02\x00\x00\x22\x02\x31\x02\x31\x02\x31\x02\x00\x00\x00\x00\x31\x02\x95\x02\x00\x00\x0c\x02\x00\x00\x00\x00\x2c\x05\x00\x00\x00\x00\x2c\x05\x2c\x05\xec\x04\x00\x00\x5c\x07\xb5\x01\x01\x02\x2c\x01\x0a\x02\x95\x02\x47\x07\x47\x07\x95\x02\x00\x00\x0a\x02\x2c\x05\xfa\x01\x00\x00\x07\x02\x00\x00\x2c\x05\x2c\x01\x00\x00\x00\x00\x00\x00\xeb\x01\x00\x00\x00\x00\x00\x00\xec\x01\x00\x00\x15\x03\x95\x02\x9e\x02\xc2\x01\x1c\x00\x00\x00\x00\x00\x69\x03\xc2\x01\xe9\x01\x95\x02\x52\x07\xd3\x04\xd0\x01\xcc\x01\x94\x01\x00\x00\xa0\x01\x00\x00\x00\x00\x00\x00\x17\x03\x00\x00\xa0\x01\x00\x00\x5e\x00\x00\x00\x00\x00\x00\x00\x52\x07\x00\x00\x00\x00"#
+
+happyGotoOffsets :: HappyAddr
+happyGotoOffsets = HappyA# "\xa3\x01\x59\x00\x8b\x01\x6d\x04\x32\x01\x05\x01\x85\x01\x76\x01\xca\x00\xd1\x07\xfe\x01\x55\x01\x00\x00\xe2\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0e\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6b\x07\xc4\x08\x53\x01\x00\x00\x00\x00\x77\x02\x4e\x04\x00\x00\x00\x00\xb8\x08\x10\x08\x44\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf3\x02\x00\x00\x92\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe0\x00\x3e\x03\x61\x02\x2e\x03\x37\x00\x5d\x02\x57\x02\x2d\x01\x80\x04\xa1\x02\x00\x00\x00\x00\x2b\x00\x00\x00\x00\x00\x00\x00\x29\x01\x4a\x01\x24\x01\x00\x00\x00\x00\x00\x00\x1c\x02\xf2\x02\xa9\x02\xe2\xff\x00\x00\x00\x00\x00\x00\x00\x00\x86\x00\x00\x00\xaf\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x13\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x27\x01\x58\x01\x00\x00\xd6\x01\x00\x00\x00\x00\xf8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17\x01\x00\x00\x00\x00\x00\x00\x00\x00\x35\x01\x0a\x03\xc9\x02\x27\x02\x6f\x00\x00\x00\x69\x00\x64\x04\x00\x00\xee\xff\xc4\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x51\x00\x00\x00\x00\x00\x00\x00\xac\x08\xe9\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1c\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdd\x01\xce\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbe\x00\xde\xff\x00\x00\x41\x01\xa0\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x30\x01\x00\x00\x00\x00\x10\x03\x30\x01\x00\x00\x48\x02\x00\x00\x94\x08\x00\x00\x88\x08\x7c\x08\xcf\x08\x00\x00\x30\x01\x70\x08\x30\x01\x00\x00\x00\x00\x00\x00\x00\x00\x30\x01\x00\x00\x30\x01\x30\x01\x30\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\x08\x00\x00\x58\x08\xdd\x07\x82\x01\x00\x00\x1e\x00\x00\x00\x30\x01\x00\x00\x00\x00\x00\x00\x00\x00\x51\x00\x54\x04\x1f\x06\xd8\x02\x36\x04\x00\x00\x26\x04\x1d\x04\x00\x00\x9c\x03\x08\x04\x00\x00\x00\x00\x00\x00\xef\x03\x51\x00\xda\x03\xf3\xff\x00\x00\x00\x00\x00\x00\x1d\x01\xfc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfc\x00\x00\x00\x13\x06\x21\x01\x00\x00\x11\x01\x00\x00\x00\x00\x00\x00\xf5\x00\x00\x00\x00\x00\x00\x00\xd1\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa6\x00\x00\x00\xc8\x00\x4c\x08\x00\x00\x7e\x04\x00\x00\x02\x04\x00\x00\x40\x08\xab\x00\x00\x00\x00\x00\x6f\x03\xd4\xff\x00\x00\xc1\x00\x29\x00\xbb\x00\x00\x00\x99\x00\x00\x00\x00\x00\xe7\x00\x79\x00\xc4\x00\x00\x00\x00\x00\xec\x00\x87\x02\x00\x00\x00\x00\x43\x00\x23\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6b\x00\x14\x01\x9f\x00\x00\x00\x87\x01\x07\x01\x00\x00\x00\x00\xb7\x07\x00\x00\x00\x00\x00\x00\x00\x00\x0e\x01\x00\x00\x00\x00\x00\x00\x00\x00\xda\x00\x00\x00\x00\x00\xda\x00\x00\x00\x00\x00\x34\x08\xd2\x00\x00\x00\xc1\x03\x00\x00\x00\x00\x00\x00\x00\x00\x4a\x00\x00\x00\x28\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x93\x03\x00\x00\x00\x00\x00\x00\x00\x00\xc9\x00\x00\x00\x00\x00\xc9\x00\xc9\x00\x1c\x08\x00\x00\x00\x00\x01\x00\x00\x00\x42\x00\x00\x00\x8a\x03\xd9\x05\x2f\x04\x75\x03\x00\x00\x00\x00\xb0\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb0\x00\x32\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x51\x00\x5c\x03\xa6\x00\x8a\x00\x00\x00\x00\x00\x00\x00\xc5\x02\x18\x00\x00\x00\x47\x03\xfb\xff\xaa\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbf\xff\x00\x00\x00\x00"#
+
+happyDefActions :: HappyAddr
+happyDefActions = HappyA# "\x00\x00\xc5\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x14\xff\x94\xff\x1a\xff\x17\xff\x15\xff\x00\x00\x1f\xff\x16\xff\x1c\xff\x1b\xff\x1d\xff\x1e\xff\x00\x00\x90\xff\x91\xff\x8d\xff\x8f\xff\x8e\xff\x8c\xff\x92\xff\x93\xff\x19\xff\x00\x00\x18\xff\x00\x00\x00\x00\x00\x00\x49\xff\x36\xff\x33\xff\x00\x00\x32\xff\x31\xff\x30\xff\x00\x00\x00\x00\x00\x00\x29\xff\xa7\xff\x00\x00\xa8\xff\xa6\xff\x9e\xff\x9b\xff\x99\xff\x97\xff\x89\xff\x87\xff\x86\xff\x85\xff\x84\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb5\xff\x00\x00\x00\x00\xb3\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x57\xff\x00\x00\x00\x00\x00\x00\xc5\xff\x00\x00\xc5\xff\x00\x00\xcc\xff\xc6\xff\x00\x00\xce\xff\x00\x00\xc7\xff\x00\x00\xc5\xff\x00\x00\xef\xff\xea\xff\xee\xff\xd9\xff\xcf\xff\xd0\xff\xc6\xff\x00\x00\xd6\xff\x00\x00\x1d\xff\xcd\xff\x00\x00\xdb\xff\x00\x00\x00\x00\xdc\xff\x00\x00\x4b\xff\x00\x00\x00\x00\x50\xff\x00\x00\x00\x00\x5b\xff\x59\xff\x00\x00\x58\xff\x00\x00\x56\xff\x00\x00\x00\x00\x53\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb1\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xaf\xff\xad\xff\x00\x00\xa9\xff\x95\xff\x96\xff\x00\x00\x12\xff\x7c\xff\x11\xff\x00\x00\x00\x00\x00\x00\x77\xff\x75\xff\x74\xff\x79\xff\x6c\xff\x00\x00\x00\x00\x80\xff\x00\x00\x00\x00\x00\x00\x81\xff\x8f\xff\x8e\xff\x69\xff\x68\xff\x00\x00\x7e\xff\x00\x00\x00\x00\xa1\xff\x00\x00\x58\xff\x00\x00\x88\xff\x00\x00\x00\x00\x3e\xff\x00\x00\x21\xff\x00\x00\x40\xff\x45\xff\x00\x00\x00\x00\x2d\xff\x00\x00\x00\x00\x28\xff\x34\xff\x32\xff\x00\x00\x35\xff\x00\x00\x00\x00\x00\x00\x43\xff\x47\xff\x00\x00\x48\xff\x00\x00\x00\x00\x00\x00\x13\xff\x46\xff\x37\xff\x38\xff\x00\x00\x00\x00\x27\xff\x26\xff\x00\x00\x2b\xff\x2c\xff\x00\x00\x2e\xff\x00\x00\x00\x00\x00\x00\x2a\xff\x00\x00\x44\xff\x9a\xff\x98\xff\x7b\xff\x72\xff\x71\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7d\xff\x00\x00\x67\xff\x63\xff\x00\x00\x00\x00\x82\xff\x7a\xff\x83\xff\x00\x00\x00\x00\x00\x00\x00\x00\x7f\xff\x00\x00\x78\xff\x00\x00\x00\x00\x00\x00\x1a\xff\x0a\xff\x00\x00\x0f\xff\x00\x00\xb0\xff\x00\x00\x00\x00\xaa\xff\x00\x00\xc4\xff\xb4\xff\xb3\xff\x00\x00\xae\xff\xc3\xff\x00\x00\x00\x00\x8b\xff\xbc\xff\xbe\xff\xbd\xff\x3a\xff\x00\x00\x3c\xff\x00\x00\x00\x00\x51\xff\x00\x00\x52\xff\x00\x00\x54\xff\x00\x00\x00\x00\x55\xff\xb2\xff\x00\x00\x00\x00\x4f\xff\x00\x00\x00\x00\xc5\xff\xdd\xff\xc5\xff\xda\xff\x00\x00\x00\x00\xc5\xff\xe7\xff\xd1\xff\x00\x00\x00\x00\x00\x00\xd5\xff\x1d\xff\xc5\xff\xc5\xff\xf2\xff\xec\xff\xf1\xff\xeb\xff\xf0\xff\xc5\xff\x00\x00\x00\x00\xd4\xff\xe0\xff\x00\x00\x00\x00\x00\x00\x00\x00\xd8\xff\xd7\xff\x00\x00\xa3\xff\x00\x00\xa5\xff\x4a\xff\x4c\xff\x5a\xff\x5c\xff\x4e\xff\x4d\xff\xc0\xff\x00\x00\x39\xff\x00\x00\x00\x00\xc2\xff\x00\x00\xac\xff\xab\xff\x9c\xff\x10\xff\x00\x00\x0e\xff\x00\x00\x0c\xff\x0d\xff\x76\xff\x73\xff\x6b\xff\x6e\xff\x00\x00\x70\xff\x70\xff\x6a\xff\x61\xff\x5f\xff\x00\x00\x66\xff\x6f\xff\x9f\xff\xa0\xff\x9d\xff\xbb\xff\x00\x00\x3d\xff\x40\xff\x20\xff\x3f\xff\x22\xff\x41\xff\x42\xff\x24\xff\x23\xff\x00\x00\x2f\xff\x25\xff\xc5\xff\x00\x00\x00\x00\xba\xff\x00\x00\x00\x00\x00\x00\x65\xff\x62\xff\x6d\xff\x0b\xff\x00\x00\x09\xff\xc1\xff\x8a\xff\xbf\xff\x00\x00\xa4\xff\xa2\xff\xc9\xff\x00\x00\xcb\xff\xe8\xff\xe9\xff\x00\x00\xe1\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xca\xff\xb9\xff\x00\x00\x00\x00\xd2\xff\x00\x00\xe2\xff\x00\x00\x00\x00\x64\xff\x60\xff\x5e\xff\x5d\xff\xf3\xff\x3b\xff\xc8\xff\x00\x00\xe3\xff\xd3\xff\xb8\xff\x00\x00\xb7\xff\xb6\xff\xe6\xff\x00\x00\xe4\xff"#
+
+happyCheck :: HappyAddr
+happyCheck = HappyA# "\xff\xff\x06\x00\x01\x00\x02\x00\x03\x00\x17\x00\x01\x00\x12\x00\x49\x00\x2b\x00\x11\x00\x37\x00\x0b\x00\x0c\x00\x2a\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x01\x00\x02\x00\x03\x00\x16\x00\x17\x00\x37\x00\x38\x00\x37\x00\x17\x00\x49\x00\x0b\x00\x0c\x00\x2d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x03\x00\x49\x00\x2f\x00\x16\x00\x17\x00\x49\x00\x27\x00\x15\x00\x0b\x00\x0c\x00\x3b\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x35\x00\x49\x00\x4a\x00\x16\x00\x17\x00\x12\x00\x49\x00\x12\x00\x22\x00\x16\x00\x17\x00\x16\x00\x17\x00\x1a\x00\x49\x00\x1a\x00\x03\x00\x22\x00\x35\x00\x01\x00\x49\x00\x4a\x00\x30\x00\x31\x00\x0b\x00\x0c\x00\x1a\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x31\x00\x21\x00\x35\x00\x16\x00\x17\x00\x3d\x00\x49\x00\x4a\x00\x35\x00\x17\x00\x35\x00\x08\x00\x22\x00\x0a\x00\x2d\x00\x2e\x00\x0d\x00\x49\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x49\x00\x4a\x00\x3c\x00\x16\x00\x17\x00\x31\x00\x49\x00\x4a\x00\x49\x00\x4a\x00\x0b\x00\x0c\x00\x35\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x3c\x00\x21\x00\x49\x00\x16\x00\x17\x00\x25\x00\x0b\x00\x0c\x00\x35\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x49\x00\x4a\x00\x35\x00\x16\x00\x17\x00\x0b\x00\x0c\x00\x49\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x4f\x00\x49\x00\x4a\x00\x16\x00\x17\x00\x35\x00\x15\x00\x35\x00\x27\x00\x49\x00\x4a\x00\x35\x00\x0c\x00\x24\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x32\x00\x21\x00\x35\x00\x16\x00\x17\x00\x2f\x00\x49\x00\x4a\x00\x49\x00\x4a\x00\x2a\x00\x18\x00\x49\x00\x4a\x00\x28\x00\x35\x00\x0d\x00\x1a\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x49\x00\x4a\x00\x21\x00\x16\x00\x17\x00\x0c\x00\x04\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x35\x00\x49\x00\x4a\x00\x16\x00\x17\x00\x12\x00\x35\x00\x25\x00\x18\x00\x16\x00\x17\x00\x16\x00\x19\x00\x49\x00\x4a\x00\x13\x00\x4c\x00\x34\x00\x35\x00\x1e\x00\x49\x00\x4a\x00\x35\x00\x3f\x00\x1c\x00\x1d\x00\x49\x00\x4a\x00\x20\x00\x21\x00\x22\x00\x23\x00\x25\x00\x49\x00\x35\x00\x27\x00\x28\x00\x35\x00\x49\x00\x4a\x00\x35\x00\x25\x00\x49\x00\x4a\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x25\x00\x22\x00\x08\x00\x09\x00\x0a\x00\x49\x00\x4a\x00\x12\x00\x49\x00\x4a\x00\x15\x00\x49\x00\x4a\x00\x25\x00\x14\x00\x30\x00\x31\x00\x17\x00\x49\x00\x19\x00\x49\x00\x4a\x00\x35\x00\x4c\x00\x12\x00\x1f\x00\x20\x00\x25\x00\x16\x00\x17\x00\x24\x00\x19\x00\x26\x00\x12\x00\x25\x00\x29\x00\x12\x00\x16\x00\x17\x00\x2d\x00\x16\x00\x17\x00\x49\x00\x4a\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x12\x00\x18\x00\x49\x00\x4a\x00\x16\x00\x17\x00\x12\x00\x35\x00\x12\x00\x18\x00\x16\x00\x17\x00\x16\x00\x17\x00\x49\x00\x4a\x00\x35\x00\x12\x00\x18\x00\x35\x00\x2a\x00\x16\x00\x17\x00\x33\x00\x34\x00\x35\x00\x36\x00\x49\x00\x4a\x00\x49\x00\x35\x00\x4b\x00\x3f\x00\x40\x00\x25\x00\x35\x00\x49\x00\x4a\x00\x35\x00\x49\x00\x4a\x00\x35\x00\x49\x00\x35\x00\x33\x00\x49\x00\x4a\x00\x35\x00\x37\x00\x23\x00\x49\x00\x4a\x00\x35\x00\x27\x00\x28\x00\x49\x00\x4a\x00\x14\x00\x49\x00\x4a\x00\x25\x00\x49\x00\x4a\x00\x49\x00\x4a\x00\x3f\x00\x40\x00\x49\x00\x4a\x00\x25\x00\x24\x00\x25\x00\x49\x00\x4a\x00\x04\x00\x49\x00\x06\x00\x21\x00\x08\x00\x09\x00\x0a\x00\x25\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x13\x00\x49\x00\x4a\x00\x05\x00\x4c\x00\x07\x00\x09\x00\x17\x00\x04\x00\x19\x00\x06\x00\x09\x00\x08\x00\x09\x00\x0a\x00\x1f\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x24\x00\x49\x00\x4a\x00\x1b\x00\x4c\x00\x4d\x00\x00\x00\x17\x00\x04\x00\x19\x00\x2e\x00\x22\x00\x08\x00\x09\x00\x0a\x00\x1f\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x24\x00\x12\x00\x3a\x00\x3b\x00\x21\x00\x30\x00\x31\x00\x17\x00\x04\x00\x19\x00\x2e\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x1f\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x24\x00\x21\x00\x3a\x00\x3b\x00\x47\x00\x25\x00\x49\x00\x17\x00\x04\x00\x19\x00\x2e\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x1f\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x24\x00\x06\x00\x22\x00\x3b\x00\x21\x00\x12\x00\x0b\x00\x17\x00\x25\x00\x19\x00\x2e\x00\x10\x00\x30\x00\x24\x00\x21\x00\x1f\x00\x30\x00\x31\x00\x25\x00\x18\x00\x24\x00\x21\x00\x3a\x00\x20\x00\x23\x00\x25\x00\x12\x00\x04\x00\x27\x00\x28\x00\x2e\x00\x08\x00\x09\x00\x0a\x00\x12\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x23\x00\x20\x00\x21\x00\x3a\x00\x27\x00\x28\x00\x21\x00\x17\x00\x04\x00\x19\x00\x25\x00\x1f\x00\x08\x00\x09\x00\x0a\x00\x1f\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x24\x00\x2a\x00\x22\x00\x49\x00\x4a\x00\x12\x00\x4c\x00\x17\x00\x12\x00\x19\x00\x2e\x00\x49\x00\x30\x00\x4b\x00\x28\x00\x1f\x00\x30\x00\x31\x00\x49\x00\x4a\x00\x24\x00\x4c\x00\x3a\x00\x49\x00\x01\x00\x4b\x00\x03\x00\x04\x00\x05\x00\x30\x00\x2e\x00\x08\x00\x09\x00\x0a\x00\x2a\x00\x22\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x1b\x00\x3a\x00\x08\x00\x09\x00\x0a\x00\x17\x00\x12\x00\x19\x00\x30\x00\x31\x00\x49\x00\x12\x00\x4b\x00\x1f\x00\x14\x00\x25\x00\x26\x00\x17\x00\x24\x00\x19\x00\x1a\x00\x1c\x00\x1d\x00\x1e\x00\x21\x00\x1f\x00\x21\x00\x1e\x00\x2e\x00\x1a\x00\x24\x00\x12\x00\x26\x00\x33\x00\x2a\x00\x29\x00\x37\x00\x37\x00\x20\x00\x2d\x00\x49\x00\x4a\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x35\x00\x36\x00\x08\x00\x09\x00\x0a\x00\x12\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x13\x00\x14\x00\x1c\x00\x1d\x00\x17\x00\x1d\x00\x19\x00\x2f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x1f\x00\x29\x00\x2a\x00\x27\x00\x28\x00\x24\x00\x43\x00\x26\x00\x2c\x00\x02\x00\x29\x00\x2f\x00\x49\x00\x4a\x00\x2d\x00\x4c\x00\x08\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x35\x00\x36\x00\x08\x00\x09\x00\x0a\x00\x49\x00\x4a\x00\x04\x00\x4c\x00\x2a\x00\x4e\x00\x08\x00\x09\x00\x0a\x00\x14\x00\x49\x00\x4a\x00\x17\x00\x4c\x00\x19\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x1f\x00\x17\x00\x08\x00\x09\x00\x0a\x00\x24\x00\x43\x00\x26\x00\x21\x00\x1f\x00\x29\x00\x28\x00\x49\x00\x4a\x00\x2d\x00\x4c\x00\x23\x00\x17\x00\x28\x00\x19\x00\x27\x00\x28\x00\x35\x00\x36\x00\x12\x00\x1f\x00\x25\x00\x28\x00\x49\x00\x4a\x00\x24\x00\x4c\x00\x26\x00\x04\x00\x05\x00\x29\x00\x01\x00\x08\x00\x09\x00\x0a\x00\x33\x00\x34\x00\x35\x00\x36\x00\x2a\x00\x04\x00\x2f\x00\x35\x00\x36\x00\x08\x00\x09\x00\x0a\x00\x17\x00\x2a\x00\x49\x00\x4a\x00\x12\x00\x4c\x00\x25\x00\x26\x00\x1f\x00\x23\x00\x49\x00\x4a\x00\x17\x00\x1d\x00\x19\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x1f\x00\x20\x00\x20\x00\x27\x00\x28\x00\x24\x00\x1a\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x2e\x00\x47\x00\x48\x00\x49\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x04\x00\x24\x00\x25\x00\x04\x00\x08\x00\x09\x00\x0a\x00\x08\x00\x09\x00\x0a\x00\x28\x00\x49\x00\x4a\x00\x21\x00\x4c\x00\x33\x00\x34\x00\x35\x00\x36\x00\x17\x00\x34\x00\x19\x00\x17\x00\x20\x00\x19\x00\x25\x00\x26\x00\x1f\x00\x24\x00\x25\x00\x1f\x00\x22\x00\x24\x00\x20\x00\x21\x00\x24\x00\x28\x00\x49\x00\x4a\x00\x28\x00\x20\x00\x21\x00\x2e\x00\x20\x00\x21\x00\x2e\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x1d\x00\x20\x00\x21\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x20\x00\x27\x00\x28\x00\x47\x00\x48\x00\x49\x00\x2c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x20\x00\x21\x00\x1d\x00\x27\x00\x28\x00\x20\x00\x21\x00\x22\x00\x23\x00\x28\x00\x22\x00\x04\x00\x27\x00\x28\x00\x2f\x00\x08\x00\x09\x00\x0a\x00\x3b\x00\x30\x00\x02\x00\x49\x00\x4a\x00\x1d\x00\x4c\x00\x18\x00\x20\x00\x21\x00\x22\x00\x23\x00\x17\x00\x3d\x00\x3e\x00\x27\x00\x28\x00\x01\x00\x22\x00\x49\x00\x4a\x00\x3b\x00\x4c\x00\x47\x00\x48\x00\x49\x00\x25\x00\x01\x00\x49\x00\x4a\x00\x1d\x00\x4c\x00\x22\x00\x20\x00\x21\x00\x22\x00\x23\x00\x01\x00\x3b\x00\x04\x00\x27\x00\x28\x00\x23\x00\x08\x00\x09\x00\x0a\x00\x33\x00\x34\x00\x35\x00\x49\x00\x4a\x00\x1d\x00\x4c\x00\x3b\x00\x20\x00\x21\x00\x22\x00\x23\x00\x17\x00\x12\x00\x1d\x00\x27\x00\x28\x00\x20\x00\x21\x00\x22\x00\x23\x00\x2b\x00\x49\x00\x4a\x00\x27\x00\x28\x00\x25\x00\x3b\x00\x49\x00\x4a\x00\x1d\x00\x4c\x00\x11\x00\x20\x00\x21\x00\x22\x00\x23\x00\x13\x00\x2f\x00\x2f\x00\x27\x00\x28\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\xff\xff\x49\x00\x4a\x00\xff\xff\x4c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x49\x00\x4a\x00\x1d\x00\x4c\x00\xff\xff\x20\x00\x21\x00\x22\x00\x23\x00\x49\x00\x4a\x00\xff\xff\x27\x00\x28\x00\xff\xff\xff\xff\x49\x00\x4a\x00\x1d\x00\x4c\x00\xff\xff\x20\x00\x21\x00\x22\x00\x23\x00\xff\xff\xff\xff\x1d\x00\x27\x00\x28\x00\x20\x00\x21\x00\x22\x00\x23\x00\xff\xff\xff\xff\x04\x00\x27\x00\x28\x00\xff\xff\x08\x00\x09\x00\x0a\x00\xff\xff\xff\xff\xff\xff\x49\x00\x4a\x00\x1d\x00\x4c\x00\xff\xff\x20\x00\x21\x00\x22\x00\x23\x00\x17\x00\xff\xff\xff\xff\x27\x00\x28\x00\xff\xff\xff\xff\x49\x00\x4a\x00\xff\xff\x4c\x00\xff\xff\xff\xff\xff\xff\x25\x00\xff\xff\x49\x00\x4a\x00\x1d\x00\x4c\x00\xff\xff\x20\x00\x21\x00\x22\x00\x23\x00\xff\xff\xff\xff\x04\x00\x27\x00\x28\x00\xff\xff\x08\x00\x09\x00\x0a\x00\x33\x00\x34\x00\x35\x00\x49\x00\x4a\x00\x1d\x00\x4c\x00\xff\xff\x20\x00\x21\x00\x22\x00\x23\x00\x17\x00\xff\xff\x1d\x00\x27\x00\x28\x00\x20\x00\x21\x00\x22\x00\x23\x00\xff\xff\x49\x00\x4a\x00\x27\x00\x28\x00\x25\x00\xff\xff\x49\x00\x4a\x00\x1d\x00\x4c\x00\xff\xff\x20\x00\x21\x00\x22\x00\x23\x00\xff\xff\xff\xff\xff\xff\x27\x00\x28\x00\xff\xff\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\xff\xff\x49\x00\x4a\x00\xff\xff\x4c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x49\x00\x4a\x00\x1d\x00\x4c\x00\xff\xff\x20\x00\x21\x00\x22\x00\x23\x00\x49\x00\x4a\x00\xff\xff\x27\x00\x28\x00\xff\xff\xff\xff\x49\x00\x4a\x00\x1d\x00\x4c\x00\xff\xff\x20\x00\x21\x00\x22\x00\x23\x00\xff\xff\xff\xff\x1d\x00\x27\x00\x28\x00\x20\x00\x21\x00\x22\x00\x23\x00\x43\x00\x44\x00\xff\xff\x27\x00\x28\x00\xff\xff\x49\x00\x4a\x00\xff\xff\x4c\x00\xff\xff\xff\xff\x49\x00\x4a\x00\xff\xff\x4c\x00\xff\xff\x01\x00\x23\x00\x03\x00\x04\x00\x05\x00\x27\x00\x28\x00\x08\x00\x09\x00\x0a\x00\xff\xff\x49\x00\x4a\x00\xff\xff\x4c\x00\x33\x00\x34\x00\x35\x00\xff\xff\xff\xff\x49\x00\x4a\x00\x17\x00\x4c\x00\x19\x00\x01\x00\xff\xff\x03\x00\x04\x00\x05\x00\x1f\x00\xff\xff\x08\x00\x09\x00\x0a\x00\x24\x00\x25\x00\x49\x00\x4a\x00\x49\x00\x4a\x00\xff\xff\x4c\x00\xff\xff\xff\xff\x2e\x00\xff\xff\x17\x00\xff\xff\x19\x00\x01\x00\xff\xff\x03\x00\x04\x00\x05\x00\x1f\x00\x20\x00\x08\x00\x09\x00\x0a\x00\x24\x00\xff\xff\x04\x00\xff\xff\xff\xff\xff\xff\x08\x00\x09\x00\x0a\x00\xff\xff\x2e\x00\xff\xff\x17\x00\xff\xff\x19\x00\x01\x00\xff\xff\x03\x00\x04\x00\x05\x00\x1f\x00\x17\x00\x08\x00\x09\x00\x0a\x00\x24\x00\xff\xff\x04\x00\xff\xff\x1f\x00\xff\xff\x08\x00\x09\x00\x0a\x00\xff\xff\x2e\x00\xff\xff\x17\x00\x28\x00\x19\x00\x01\x00\xff\xff\x03\x00\x04\x00\x05\x00\x1f\x00\x17\x00\x08\x00\x09\x00\x0a\x00\x24\x00\xff\xff\x04\x00\xff\xff\x1f\x00\xff\xff\x08\x00\x09\x00\x0a\x00\xff\xff\x2e\x00\xff\xff\x17\x00\x28\x00\x19\x00\x01\x00\xff\xff\x03\x00\x04\x00\x05\x00\x1f\x00\x17\x00\x08\x00\x09\x00\x0a\x00\x24\x00\xff\xff\x1a\x00\xff\xff\x1f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2e\x00\xff\xff\x17\x00\x28\x00\x19\x00\x01\x00\xff\xff\x03\x00\x04\x00\x05\x00\x1f\x00\xff\xff\x08\x00\x09\x00\x0a\x00\x24\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\xff\xff\xff\xff\x2e\x00\xff\xff\x17\x00\xff\xff\x19\x00\x01\x00\xff\xff\x03\x00\x04\x00\x05\x00\x1f\x00\xff\xff\x08\x00\x09\x00\x0a\x00\x24\x00\xff\xff\x1a\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x2e\x00\xff\xff\x17\x00\xff\xff\x19\x00\x01\x00\xff\xff\x03\x00\x04\x00\x05\x00\x1f\x00\xff\xff\x08\x00\x09\x00\x0a\x00\x24\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\xff\xff\xff\xff\x2e\x00\xff\xff\x17\x00\xff\xff\x19\x00\x01\x00\xff\xff\x03\x00\x04\x00\x05\x00\x1f\x00\xff\xff\x08\x00\x09\x00\x0a\x00\x24\x00\xff\xff\x04\x00\xff\xff\xff\xff\xff\xff\x08\x00\x09\x00\x0a\x00\xff\xff\x2e\x00\xff\xff\x17\x00\xff\xff\x19\x00\x01\x00\xff\xff\x03\x00\x04\x00\x05\x00\x1f\x00\x17\x00\x08\x00\x09\x00\x0a\x00\x24\x00\xff\xff\x04\x00\xff\xff\x1f\x00\xff\xff\x08\x00\x09\x00\x0a\x00\xff\xff\x2e\x00\xff\xff\x17\x00\xff\xff\x19\x00\x01\x00\xff\xff\x03\x00\x04\x00\x05\x00\x1f\x00\x17\x00\x08\x00\x09\x00\x0a\x00\x24\x00\xff\xff\xff\xff\xff\xff\x1f\x00\xff\xff\xff\xff\xff\xff\x20\x00\x21\x00\x2e\x00\xff\xff\x17\x00\xff\xff\x19\x00\x01\x00\xff\xff\x03\x00\x04\x00\x05\x00\x1f\x00\xff\xff\x08\x00\x09\x00\x0a\x00\x24\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x20\x00\xff\xff\x2e\x00\xff\xff\x17\x00\xff\xff\x19\x00\x01\x00\xff\xff\x03\x00\x04\x00\x05\x00\x1f\x00\xff\xff\x08\x00\x09\x00\x0a\x00\x24\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\xff\xff\xff\xff\x2e\x00\xff\xff\x17\x00\x04\x00\x19\x00\xff\xff\xff\xff\x08\x00\x09\x00\x0a\x00\x1f\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x24\x00\x32\x00\x33\x00\x34\x00\x35\x00\xff\xff\xff\xff\x17\x00\x04\x00\x19\x00\x2e\x00\xff\xff\x08\x00\x09\x00\x0a\x00\x1f\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x24\x00\xff\xff\xff\xff\xff\xff\x49\x00\x4a\x00\xff\xff\x17\x00\xff\xff\x19\x00\x2e\x00\xff\xff\x30\x00\xff\xff\xff\xff\x1f\x00\xff\xff\xff\xff\xff\xff\xff\xff\x24\x00\x20\x00\x21\x00\x22\x00\x23\x00\xff\xff\xff\xff\xff\xff\x27\x00\x28\x00\x2e\x00\xff\xff\x30\x00\x20\x00\x21\x00\x22\x00\x23\x00\xff\xff\xff\xff\x04\x00\x27\x00\x28\x00\xff\xff\x08\x00\x09\x00\x0a\x00\xff\xff\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x04\x00\x05\x00\xff\xff\xff\xff\x08\x00\x09\x00\x0a\x00\x17\x00\xff\xff\x19\x00\xff\xff\x49\x00\x4a\x00\xff\xff\x4c\x00\x1f\x00\xff\xff\xff\xff\xff\xff\x17\x00\x24\x00\x25\x00\xff\xff\x49\x00\x4a\x00\xff\xff\x4c\x00\x04\x00\xff\xff\x28\x00\x2e\x00\x08\x00\x09\x00\x0a\x00\xff\xff\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x17\x00\x04\x00\x19\x00\xff\xff\xff\xff\x08\x00\x09\x00\x0a\x00\x1f\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x24\x00\x25\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x17\x00\x04\x00\x19\x00\x2e\x00\xff\xff\x08\x00\x09\x00\x0a\x00\x1f\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x24\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x17\x00\x04\x00\x19\x00\x2e\x00\xff\xff\x08\x00\x09\x00\x0a\x00\x1f\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x24\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x17\x00\x04\x00\x19\x00\x2e\x00\xff\xff\x08\x00\x09\x00\x0a\x00\x1f\x00\xff\xff\xff\xff\x04\x00\xff\xff\x24\x00\xff\xff\x08\x00\x09\x00\x0a\x00\xff\xff\xff\xff\x17\x00\x04\x00\x19\x00\x2e\x00\xff\xff\x08\x00\x09\x00\x0a\x00\x1f\x00\xff\xff\x17\x00\xff\xff\xff\xff\x24\x00\xff\xff\xff\xff\xff\xff\x28\x00\xff\xff\xff\xff\x17\x00\x04\x00\x19\x00\x2e\x00\x25\x00\x08\x00\x09\x00\x0a\x00\x1f\x00\xff\xff\x04\x00\x05\x00\xff\xff\x24\x00\x08\x00\x09\x00\x0a\x00\x28\x00\xff\xff\xff\xff\x17\x00\x04\x00\x19\x00\x2e\x00\xff\xff\x08\x00\x09\x00\x0a\x00\x1f\x00\x17\x00\x04\x00\x05\x00\xff\xff\x24\x00\x08\x00\x09\x00\x0a\x00\x28\x00\xff\xff\xff\xff\x17\x00\x04\x00\x19\x00\x2e\x00\xff\xff\x08\x00\x09\x00\x0a\x00\x1f\x00\x17\x00\x04\x00\xff\xff\xff\xff\x24\x00\x08\x00\x09\x00\x0a\x00\x28\x00\xff\xff\xff\xff\x17\x00\xff\xff\x19\x00\x2e\x00\xff\xff\xff\xff\xff\xff\xff\xff\x1f\x00\x17\x00\x04\x00\x19\x00\xff\xff\x24\x00\x08\x00\x09\x00\x0a\x00\x1f\x00\xff\xff\xff\xff\x2b\x00\xff\xff\x24\x00\x2e\x00\xff\xff\xff\xff\x28\x00\xff\xff\xff\xff\x17\x00\xff\xff\x19\x00\x2e\x00\xff\xff\xff\xff\x04\x00\xff\xff\x1f\x00\x20\x00\x08\x00\x09\x00\x0a\x00\x24\x00\xff\xff\x04\x00\xff\xff\xff\xff\xff\xff\x08\x00\x09\x00\x0a\x00\xff\xff\x2e\x00\xff\xff\x17\x00\x04\x00\x19\x00\x1a\x00\xff\xff\x08\x00\x09\x00\x0a\x00\x1f\x00\x17\x00\xff\xff\x19\x00\xff\xff\x24\x00\xff\xff\xff\xff\xff\xff\x1f\x00\xff\xff\xff\xff\x17\x00\xff\xff\x24\x00\x2e\x00\xff\xff\x12\x00\xff\xff\xff\xff\x15\x00\x16\x00\xff\xff\xff\xff\x2e\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\xff\xff\x20\x00\x21\x00\x22\x00\xff\xff\xff\xff\x25\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x2b\x00\x2c\x00\x08\x00\x09\x00\x0a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\xff\xff\xff\xff\x3b\x00\x17\x00\xff\xff\x19\x00\x01\x00\xff\xff\xff\xff\x04\x00\x05\x00\x1f\x00\xff\xff\x08\x00\x09\x00\x0a\x00\x24\x00\x3b\x00\x26\x00\xff\xff\xff\xff\x29\x00\xff\xff\x41\x00\x42\x00\x43\x00\xff\xff\x45\x00\x17\x00\x22\x00\xff\xff\x49\x00\x4a\x00\xff\xff\x4c\x00\xff\xff\x1f\x00\xff\xff\x2b\x00\x2c\x00\xff\xff\x24\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x21\x00\xff\xff\x3b\x00\x01\x00\x25\x00\xff\xff\x04\x00\xff\xff\xff\xff\xff\xff\x08\x00\x09\x00\x0a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\xff\xff\x17\x00\x39\x00\x3a\x00\x3b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\xff\xff\x45\x00\x39\x00\x3a\x00\x3b\x00\x49\x00\x4a\x00\xff\xff\x4c\x00\xff\xff\x41\x00\x42\x00\x43\x00\xff\xff\x45\x00\x39\x00\x3a\x00\x3b\x00\x49\x00\x4a\x00\xff\xff\x4c\x00\xff\xff\x41\x00\x42\x00\x43\x00\xff\xff\x45\x00\x39\x00\x3a\x00\x3b\x00\x49\x00\x4a\x00\xff\xff\x4c\x00\xff\xff\x41\x00\x42\x00\x43\x00\xff\xff\x45\x00\xff\xff\xff\xff\x3c\x00\x49\x00\x4a\x00\xff\xff\x4c\x00\x41\x00\x42\x00\x43\x00\xff\xff\x45\x00\xff\xff\xff\xff\xff\xff\x49\x00\x4a\x00\xff\xff\x4c\x00\x41\x00\x42\x00\x43\x00\xff\xff\x45\x00\x46\x00\xff\xff\xff\xff\x49\x00\x4a\x00\x2a\x00\x4c\x00\xff\xff\xff\xff\x4f\x00\x50\x00\xff\xff\xff\xff\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x2c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x41\x00\x42\x00\x43\x00\xff\xff\x45\x00\x46\x00\xff\xff\xff\xff\x49\x00\x4a\x00\xff\xff\x4c\x00\x41\x00\x42\x00\x43\x00\xff\xff\x45\x00\xff\xff\xff\xff\xff\xff\x49\x00\x4a\x00\xff\xff\x4c\x00\x41\x00\x42\x00\x43\x00\xff\xff\x45\x00\xff\xff\xff\xff\xff\xff\x49\x00\x4a\x00\xff\xff\x4c\x00\x41\x00\x42\x00\x43\x00\xff\xff\x45\x00\xff\xff\xff\xff\xff\xff\x49\x00\x4a\x00\xff\xff\x4c\x00\x41\x00\x42\x00\x43\x00\xff\xff\x45\x00\xff\xff\xff\xff\xff\xff\x49\x00\x4a\x00\xff\xff\x4c\x00\x41\x00\x42\x00\x43\x00\xff\xff\x45\x00\xff\xff\xff\xff\xff\xff\x49\x00\x4a\x00\xff\xff\x4c\x00\x41\x00\x42\x00\x43\x00\xff\xff\x45\x00\xff\xff\xff\xff\xff\xff\x49\x00\x4a\x00\xff\xff\x4c\x00\x41\x00\x42\x00\x43\x00\xff\xff\x45\x00\xff\xff\xff\xff\xff\xff\x49\x00\x4a\x00\xff\xff\x4c\x00\x41\x00\x42\x00\x43\x00\xff\xff\x45\x00\xff\xff\xff\xff\xff\xff\x49\x00\x4a\x00\xff\xff\x4c\x00\x41\x00\x42\x00\x43\x00\xff\xff\x45\x00\xff\xff\xff\xff\xff\xff\x49\x00\x4a\x00\xff\xff\x4c\x00\x41\x00\x42\x00\x43\x00\xff\xff\x45\x00\xff\xff\xff\xff\xff\xff\x49\x00\x4a\x00\xff\xff\x4c\x00\x41\x00\x42\x00\x43\x00\xff\xff\x45\x00\xff\xff\xff\xff\xff\xff\x49\x00\x4a\x00\xff\xff\x4c\x00\x41\x00\x42\x00\x43\x00\xff\xff\x45\x00\xff\xff\xff\xff\xff\xff\x49\x00\x4a\x00\xff\xff\x4c\x00\x41\x00\x42\x00\x43\x00\xff\xff\x45\x00\xff\xff\xff\xff\xff\xff\x49\x00\x4a\x00\xff\xff\x4c\x00\x41\x00\x42\x00\x43\x00\xff\xff\x45\x00\xff\xff\xff\xff\xff\xff\x49\x00\x4a\x00\xff\xff\x4c\x00\x41\x00\x42\x00\x43\x00\xff\xff\x45\x00\xff\xff\xff\xff\xff\xff\x49\x00\x4a\x00\xff\xff\x4c\x00\x42\x00\x43\x00\xff\xff\x45\x00\xff\xff\xff\xff\xff\xff\x49\x00\x4a\x00\xff\xff\x4c\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"#
+
+happyTable :: HappyAddr
+happyTable = HappyA# "\x00\x00\xba\x01\x8c\x01\x6c\x00\x6d\x00\x15\x01\xa7\x00\x7e\x00\xc3\x01\xef\x00\x0e\x00\x57\x01\x6e\x00\x6f\x00\x2b\x01\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x6b\x00\x6c\x00\x6d\x00\x4f\x00\x50\x00\x7e\x00\x7f\x00\x2c\x01\xa8\x00\x80\x00\x6e\x00\x6f\x00\x6f\x01\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x44\x01\xf0\x00\x6b\x00\x4f\x00\x50\x00\x80\x00\xa9\x00\xbd\x01\x45\x01\x6f\x00\xff\xff\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x52\x00\x10\x00\x16\x01\x4f\x00\x50\x00\x99\x00\xab\x00\x99\x00\x34\x01\x4f\x00\x50\x00\x4f\x00\x50\x00\x53\x01\xbb\x01\x9a\x00\x46\x01\x34\x01\x52\x00\xa7\x00\x10\x00\x53\x00\xab\x01\x36\x01\x47\x01\x6f\x00\x26\x01\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x36\x01\x27\x01\x52\x00\x4f\x00\x50\x00\x7f\x01\x10\x00\x53\x00\x52\x00\xa8\x00\x52\x00\x60\x00\x42\x01\x61\x00\xa9\x00\xaa\x00\x62\x00\x80\x01\x63\x00\x64\x00\x65\x00\x66\x00\x10\x00\x53\x00\xb2\x01\x4f\x00\x50\x00\x43\x01\x10\x00\x53\x00\x10\x00\x53\x00\xa9\x01\x6f\x00\x52\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x82\x01\xea\x00\xab\x00\x4f\x00\x50\x00\xc1\x01\x4e\x01\x6f\x00\x0f\x01\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x10\x00\x53\x00\x52\x00\x4f\x00\x50\x00\x7b\x00\x6f\x00\x96\x01\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x97\x01\x10\x00\x87\x00\x4f\x00\x50\x00\x1a\x01\xab\x01\x52\x00\x07\x01\x10\x00\x53\x00\x0f\x01\x51\x01\x32\x01\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x08\x01\x97\x00\x52\x00\x4f\x00\x50\x00\x33\x01\x10\x00\x87\x00\x10\x00\x53\x00\x98\x00\xa5\x01\x10\x00\x87\x00\xbd\x00\x52\x00\x7a\x00\x28\x01\x63\x00\x64\x00\x65\x00\x66\x00\x10\x00\x53\x00\x29\x01\x4f\x00\x50\x00\x52\x01\x4c\x01\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x52\x00\x10\x00\x53\x00\x4f\x00\x50\x00\x4e\x00\x92\x00\xd2\x00\xf2\x00\x4f\x00\x50\x00\xf5\x00\x55\x01\x10\x00\x11\x00\x34\x00\x3d\x00\x59\x01\x85\x00\xf6\x00\x10\x00\x53\x00\x52\x00\x5f\x01\x35\x00\x36\x00\x10\x00\x87\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xd2\x00\x22\x01\x52\x00\x3b\x00\x3c\x00\x92\x00\x10\x00\x87\x00\x52\x00\x99\x01\x10\x00\x53\x00\x3f\x00\x40\x00\x41\x00\x15\x00\x16\x00\xd2\x00\x12\x01\x17\x00\x18\x00\x19\x00\x10\x00\x53\x00\x7e\x00\x10\x00\x87\x00\xf7\x00\x10\x00\x53\x00\x4f\x01\x43\x00\x9e\x01\x14\x01\x1a\x00\x5e\x01\x44\x00\x10\x00\x11\x00\xba\x00\x3d\x00\x4e\x00\x45\x00\xb1\x00\x82\x00\x4f\x00\x50\x00\x46\x00\x51\x00\x47\x00\x95\x00\xd2\x00\x48\x00\x64\x01\x4f\x00\x50\x00\x49\x00\x4f\x00\x50\x00\x10\x00\xbb\x00\x1c\x00\x1d\x00\x1e\x00\xb2\x00\xb3\x00\x21\x00\x22\x00\x23\x00\x65\x01\x01\x01\x10\x00\x4a\x01\x4f\x00\x50\x00\x3f\x01\x52\x00\x95\x00\x91\x00\x4f\x00\x50\x00\x4f\x00\x50\x00\x10\x00\x37\x01\x52\x00\x5c\x00\x9e\x00\x52\x00\x6d\x01\x4f\x00\x50\x00\x83\x00\x84\x00\x85\x00\x86\x00\x10\x00\x53\x00\x23\x00\x92\x00\xa1\x01\x20\x01\xa7\x01\xd2\x00\x52\x00\x10\x00\x53\x00\x92\x00\x10\x00\x53\x00\x52\x00\x22\x01\x52\x00\x85\x01\x10\x00\x87\x00\x92\x00\x86\x01\xee\x00\x10\x00\x87\x00\x52\x00\x3b\x00\x3c\x00\x10\x00\x53\x00\x3b\x01\x10\x00\x87\x00\x93\x00\x10\x00\x53\x00\x10\x00\x53\x00\x20\x01\x21\x01\x10\x00\x87\x00\xd2\x00\x0e\x00\x0f\x00\x10\x00\x53\x00\x15\x00\x22\x01\x68\x00\x69\x01\x17\x00\x18\x00\x19\x00\x6a\x01\x55\x00\x56\x00\x57\x00\x58\x00\x4b\x00\x10\x00\x11\x00\xa2\x01\x3d\x00\xa3\x01\xa5\x01\x1a\x00\x15\x00\x59\x00\x68\x00\x5e\x00\x17\x00\x18\x00\x19\x00\x5a\x00\x55\x00\x56\x00\x57\x00\x58\x00\x5b\x00\x10\x00\x11\x00\x4c\x00\x12\x00\x13\x00\x69\x00\x1a\x00\x15\x00\x59\x00\x5c\x00\xe5\xff\x17\x00\x18\x00\x19\x00\x5a\x00\x55\x00\x56\x00\x57\x00\x58\x00\x5b\x00\x7e\x00\x69\x00\xdf\xff\x91\x01\xe5\xff\xe5\xff\x1a\x00\x15\x00\x59\x00\x5c\x00\x76\x00\x17\x00\x18\x00\x77\x00\x5a\x00\x55\x00\x56\x00\x57\x00\x58\x00\x5b\x00\xe6\x00\x69\x00\xde\xff\x81\x01\x6c\x01\xe2\x00\x1a\x00\x15\x00\x59\x00\x5c\x00\x76\x00\x17\x00\x18\x00\x77\x00\x5a\x00\x55\x00\x56\x00\x57\x00\x58\x00\x5b\x00\x3d\x01\x34\x01\xff\xff\xea\x00\x7e\x00\x3e\x01\x1a\x00\xeb\x00\x59\x00\x5c\x00\x3f\x01\xed\xff\xad\x01\xec\x00\x5a\x00\xa1\x01\x36\x01\xed\x00\x79\x00\x5b\x00\x04\x01\x69\x00\xb9\x01\x9c\x00\x05\x01\x7e\x00\x15\x00\x3b\x00\x3c\x00\x5c\x00\x17\x00\x18\x00\x77\x00\x7e\x00\x55\x00\x56\x00\x57\x00\x58\x00\x9d\x00\x00\x01\x01\x01\x69\x00\x3b\x00\x3c\x00\x30\x01\x1a\x00\x15\x00\x59\x00\x31\x01\xb1\x01\x17\x00\x18\x00\x77\x00\x5a\x00\x55\x00\x56\x00\x57\x00\x58\x00\x5b\x00\xb2\x01\x12\x01\x10\x00\x11\x00\x7e\x00\x3d\x00\x1a\x00\x7e\x00\x59\x00\x5c\x00\x23\x00\x7d\x00\x3a\x01\x6b\x01\x5a\x00\x13\x01\x14\x01\x10\x00\x11\x00\x5b\x00\x3d\x00\x69\x00\x23\x00\x2f\x00\xd8\x00\x30\x00\x15\x00\x16\x00\xb8\x01\x5c\x00\x17\x00\x18\x00\x19\x00\x8e\x01\x34\x01\x3f\x00\x40\x00\x41\x00\x15\x00\x16\x00\x90\x01\x69\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x7e\x00\x31\x00\x35\x01\x36\x01\x23\x00\x7e\x00\x24\x00\x32\x00\x43\x00\x1c\x01\x1d\x01\x1a\x00\xca\x00\x44\x00\xb7\x00\xfa\x00\xfb\x00\xfc\x00\x91\x01\x45\x00\xfd\x00\x92\x01\x34\x00\x8a\x01\x46\x00\x7e\x00\x47\x00\x85\x01\x9c\x01\x48\x00\x2c\x01\x86\x01\xa0\x01\x49\x00\x10\x00\x8d\x00\x3f\x00\x40\x00\x41\x00\x15\x00\x16\x00\x4a\x00\x4b\x00\x17\x00\x18\x00\x19\x00\x7e\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x42\x00\x43\x00\x93\x01\x94\x01\x1a\x00\xb3\x00\x44\x00\x49\x01\x37\x00\x38\x00\x39\x00\x3a\x00\x45\x00\xa4\x00\xa5\x00\x3b\x00\x3c\x00\x46\x00\xe0\x00\x47\x00\xb4\x00\x4c\x01\x48\x00\xb5\x00\x10\x00\x11\x00\x49\x00\xcd\x00\x4e\x01\x3f\x00\x40\x00\x41\x00\x15\x00\x16\x00\x4a\x00\x4b\x00\x17\x00\x18\x00\x19\x00\x10\x00\x11\x00\x15\x00\x9f\x00\x51\x01\xa0\x00\x17\x00\x18\x00\x19\x00\x43\x00\x10\x00\x11\x00\x1a\x00\x3d\x00\x44\x00\x3f\x00\x40\x00\x41\x00\x15\x00\x16\x00\x45\x00\x1a\x00\x17\x00\x18\x00\x19\x00\x46\x00\xcf\x00\x47\x00\x62\x01\x24\x01\x48\x00\x64\x01\x10\x00\x11\x00\x49\x00\xcd\x00\x9c\x00\x1a\x00\xae\x01\x44\x00\x3b\x00\x3c\x00\x4a\x00\x4b\x00\x7e\x00\x45\x00\x82\x00\x6b\x01\x10\x00\x11\x00\x46\x00\x49\x01\x47\x00\x15\x00\x16\x00\x48\x00\x6f\x01\x17\x00\x18\x00\x19\x00\x83\x00\x84\x00\x85\x00\x86\x00\x89\x01\x15\x00\x8c\x01\x4a\x00\x4b\x00\x17\x00\x18\x00\x19\x00\x1a\x00\xe9\x00\x10\x00\x11\x00\xda\x00\x3d\x00\x1c\x01\x1e\x01\x1b\x00\xbd\x00\x10\x00\x87\x00\x1a\x00\xb7\x00\x59\x00\x7b\x01\x37\x00\x38\x00\x39\x00\x3a\x00\x89\x00\x8a\x00\xdb\x00\x3b\x00\x3c\x00\x5b\x00\xf8\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x5c\x00\xc2\x00\xbe\x01\xe2\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x15\x00\xbe\x00\x0f\x00\x15\x00\x17\x00\x18\x00\x19\x00\x17\x00\x18\x00\x19\x00\xf4\x00\x10\x00\x11\x00\xf9\x00\x3d\x00\x8a\x00\x84\x00\x85\x00\x8b\x00\x1a\x00\x06\x01\x59\x00\x1a\x00\xff\x00\x59\x00\x1c\x01\x1f\x01\x89\x00\xd7\x00\x0f\x00\x89\x00\x19\x01\x5b\x00\xc2\x01\xc3\x01\x5b\x00\x58\xff\x10\x00\x87\x00\xb0\x01\xe5\x00\xe6\x00\x5c\x00\xfe\x00\xf9\x00\x5c\x00\x58\xff\x58\xff\x58\xff\x58\xff\x58\xff\x58\xff\x58\xff\xad\x00\x2a\x01\x27\x01\x37\x00\x38\x00\x39\x00\x3a\x00\xae\x00\x0f\x00\x2e\x01\x3b\x00\x3c\x00\xc2\x00\xc3\x00\xe2\x00\xaf\x00\xb7\x00\xb8\x00\xb9\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x2d\x01\x29\x01\xbc\x01\x3b\x00\x3c\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x2f\x01\x37\x01\x15\x00\x3b\x00\x3c\x00\x3a\x01\x17\x00\x18\x00\x19\x00\xff\xff\x44\x01\x78\x00\x10\x00\x11\x00\xae\x01\x3d\x00\x79\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x1a\x00\xc0\x00\xc1\x00\x3b\x00\x3c\x00\x8f\x00\x7a\x00\x10\x00\x11\x00\xff\xff\x3d\x00\xc2\x00\xc3\x00\xc4\x00\xc0\x01\x90\x00\x10\x00\x11\x00\xb3\x01\x3d\x00\x99\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x91\x00\xff\xff\x15\x00\x3b\x00\x3c\x00\xbd\x00\x17\x00\x18\x00\x19\x00\x58\x01\x84\x00\x85\x00\x10\x00\x11\x00\xb6\x01\x3d\x00\xff\xff\x37\x00\x38\x00\x39\x00\x3a\x00\x1a\x00\x7e\x00\x8e\x01\x3b\x00\x3c\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xd2\x00\x10\x00\x87\x00\x3b\x00\x3c\x00\xe4\x00\xff\xff\x10\x00\x11\x00\x94\x01\x3d\x00\x0e\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x42\x00\x4e\x00\x60\x00\x3b\x00\x3c\x00\x74\x01\x75\x01\x76\x01\x77\x01\x84\x00\x85\x00\x00\x00\x10\x00\x11\x00\x00\x00\x3d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x11\x00\x98\x01\x3d\x00\x00\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x10\x00\x87\x00\x00\x00\x3b\x00\x3c\x00\x00\x00\x00\x00\x10\x00\x11\x00\x62\x01\x3d\x00\x00\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x00\x00\x00\x00\x70\x01\x3b\x00\x3c\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x00\x00\x00\x00\x15\x00\x3b\x00\x3c\x00\x00\x00\x17\x00\x18\x00\x19\x00\x00\x00\x00\x00\x00\x00\x10\x00\x11\x00\x72\x01\x3d\x00\x00\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x1a\x00\x00\x00\x00\x00\x3b\x00\x3c\x00\x00\x00\x00\x00\x10\x00\x11\x00\x00\x00\x3d\x00\x00\x00\x00\x00\x00\x00\x82\x00\x00\x00\x10\x00\x11\x00\x73\x01\x3d\x00\x00\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x00\x00\x00\x00\x15\x00\x3b\x00\x3c\x00\x00\x00\x17\x00\x18\x00\x19\x00\x5b\x01\x84\x00\x85\x00\x10\x00\x11\x00\x78\x01\x3d\x00\x00\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x1a\x00\x00\x00\x79\x01\x3b\x00\x3c\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x00\x00\x10\x00\x87\x00\x3b\x00\x3c\x00\xad\x00\x00\x00\x10\x00\x11\x00\x7a\x01\x3d\x00\x00\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x00\x00\x00\x00\x00\x00\x3b\x00\x3c\x00\x00\x00\xb4\x01\x76\x01\x77\x01\x84\x00\x85\x00\x00\x00\x10\x00\x11\x00\x00\x00\x3d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x11\x00\x7d\x01\x3d\x00\x00\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x10\x00\x87\x00\x00\x00\x3b\x00\x3c\x00\x00\x00\x00\x00\x10\x00\x11\x00\x19\x01\x3d\x00\x00\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x00\x00\x00\x00\x5d\x00\x3b\x00\x3c\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xcb\x00\xcc\x00\x00\x00\x3b\x00\x3c\x00\x00\x00\x10\x00\x11\x00\x00\x00\xcd\x00\x00\x00\x00\x00\x10\x00\x11\x00\x00\x00\x3d\x00\x00\x00\x2f\x00\x9d\x00\x30\x00\x15\x00\x16\x00\x3b\x00\x3c\x00\x17\x00\x18\x00\x19\x00\x00\x00\x10\x00\x11\x00\x00\x00\x3d\x00\x5c\x01\x84\x00\x85\x00\x00\x00\x00\x00\x10\x00\x11\x00\x1a\x00\x3d\x00\x31\x00\x2f\x00\x00\x00\x30\x00\x15\x00\x16\x00\x32\x00\x00\x00\x17\x00\x18\x00\x19\x00\xca\x00\x0e\x01\x10\x00\x87\x00\x10\x00\x11\x00\x00\x00\x3d\x00\x00\x00\x00\x00\x34\x00\x00\x00\x1a\x00\x00\x00\x31\x00\x2f\x00\x00\x00\x30\x00\x15\x00\x16\x00\x32\x00\xc9\x00\x17\x00\x18\x00\x19\x00\xca\x00\x00\x00\x15\x00\x00\x00\x00\x00\x00\x00\x17\x00\x18\x00\x19\x00\x00\x00\x34\x00\x00\x00\x1a\x00\x00\x00\x31\x00\x2f\x00\x00\x00\x30\x00\x15\x00\x16\x00\x32\x00\x1a\x00\x17\x00\x18\x00\x19\x00\x33\x00\x00\x00\x15\x00\x00\x00\x24\x01\x00\x00\x17\x00\x18\x00\x19\x00\x00\x00\x34\x00\x00\x00\x1a\x00\xa9\x01\x31\x00\x2f\x00\x00\x00\x30\x00\x15\x00\x16\x00\x32\x00\x1a\x00\x17\x00\x18\x00\x19\x00\xca\x00\x00\x00\x15\x00\x00\x00\x24\x01\x00\x00\x17\x00\x18\x00\x19\x00\x00\x00\x34\x00\x00\x00\x1a\x00\x61\x01\x31\x00\x2f\x00\x00\x00\x30\x00\x15\x00\x16\x00\x32\x00\x1a\x00\x17\x00\x18\x00\x19\x00\x33\x00\x00\x00\x8b\x01\x00\x00\x24\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x34\x00\x00\x00\x1a\x00\x25\x01\x31\x00\x2f\x00\x00\x00\x30\x00\x15\x00\x16\x00\x32\x00\x00\x00\x17\x00\x18\x00\x19\x00\xca\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x00\x00\x00\x00\x34\x00\x00\x00\x1a\x00\x00\x00\xcf\x00\x2f\x00\x00\x00\x30\x00\x15\x00\x16\x00\x32\x00\x00\x00\x17\x00\x18\x00\x19\x00\xca\x00\x00\x00\xe2\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x34\x00\x00\x00\x1a\x00\x00\x00\x31\x00\x2f\x00\x00\x00\x30\x00\x15\x00\x16\x00\x32\x00\x00\x00\x17\x00\x18\x00\x19\x00\xca\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x00\x00\x00\x00\x34\x00\x00\x00\x1a\x00\x00\x00\x31\x00\x2f\x00\x00\x00\x30\x00\x15\x00\x16\x00\x32\x00\x00\x00\x17\x00\x18\x00\x19\x00\x33\x00\x00\x00\x15\x00\x00\x00\x00\x00\x00\x00\x17\x00\x18\x00\x19\x00\x00\x00\x34\x00\x00\x00\x1a\x00\x00\x00\x31\x00\x2f\x00\x00\x00\x30\x00\x15\x00\x16\x00\x32\x00\x1a\x00\x17\x00\x18\x00\x19\x00\xca\x00\x00\x00\x15\x00\x00\x00\x18\x01\x00\x00\x17\x00\x18\x00\x19\x00\x00\x00\x34\x00\x00\x00\x1a\x00\x00\x00\xcf\x00\x2f\x00\x00\x00\x30\x00\x15\x00\x16\x00\x32\x00\x1a\x00\x17\x00\x18\x00\x19\x00\xca\x00\x00\x00\x00\x00\x00\x00\x39\x01\x00\x00\x00\x00\x00\x00\xe7\x00\xe8\x00\x34\x00\x00\x00\x1a\x00\x00\x00\xd1\x00\x2f\x00\x00\x00\x30\x00\x15\x00\x16\x00\x32\x00\x00\x00\x17\x00\x18\x00\x19\x00\xca\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x68\x01\x00\x00\x34\x00\x00\x00\x1a\x00\x00\x00\x31\x00\x2f\x00\x00\x00\x30\x00\x15\x00\x16\x00\x32\x00\x00\x00\x17\x00\x18\x00\x19\x00\xca\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x00\x00\x00\x00\x34\x00\x00\x00\x1a\x00\x15\x00\x31\x00\x00\x00\x00\x00\x17\x00\x18\x00\x19\x00\x32\x00\x55\x00\x56\x00\x57\x00\x58\x00\x33\x00\xb5\x01\x77\x01\x84\x00\x85\x00\x00\x00\x00\x00\x1a\x00\x15\x00\x59\x00\x34\x00\x00\x00\x17\x00\x18\x00\x19\x00\x5a\x00\x55\x00\x56\x00\x57\x00\x58\x00\x5b\x00\x00\x00\x00\x00\x00\x00\x10\x00\x87\x00\x00\x00\x1a\x00\x00\x00\x59\x00\x5c\x00\x00\x00\x55\x01\x00\x00\x00\x00\x5a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5b\x00\x66\x01\x38\x00\x39\x00\x3a\x00\x00\x00\x00\x00\x00\x00\x3b\x00\x3c\x00\x5c\x00\x00\x00\x9c\x00\x7c\x01\x38\x00\x39\x00\x3a\x00\x00\x00\x00\x00\x15\x00\x3b\x00\x3c\x00\x00\x00\x17\x00\x18\x00\x19\x00\x00\x00\x55\x00\x56\x00\x57\x00\x58\x00\x15\x00\x26\x00\x00\x00\x00\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x00\x00\x59\x00\x00\x00\x10\x00\x11\x00\x00\x00\x3d\x00\x5a\x00\x00\x00\x00\x00\x00\x00\x1a\x00\x5b\x00\x9d\x01\x00\x00\x10\x00\x11\x00\x00\x00\x3d\x00\x15\x00\x00\x00\x95\x00\x5c\x00\x17\x00\x18\x00\x19\x00\x00\x00\x55\x00\x56\x00\x57\x00\x58\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x1a\x00\x15\x00\x59\x00\x00\x00\x00\x00\x17\x00\x18\x00\x19\x00\x5a\x00\x55\x00\x56\x00\x57\x00\x58\x00\x5b\x00\x57\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x00\x15\x00\x59\x00\x5c\x00\x00\x00\x17\x00\x18\x00\x41\x01\x5a\x00\x55\x00\x56\x00\x57\x00\x58\x00\x5b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x00\x15\x00\x59\x00\x5c\x00\x00\x00\x17\x00\x18\x00\x19\x00\x5a\x00\x55\x00\x56\x00\x57\x00\x58\x00\x5b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x00\x15\x00\x59\x00\x5c\x00\x00\x00\x17\x00\x18\x00\x19\x00\x5a\x00\x00\x00\x00\x00\x15\x00\x00\x00\x5b\x00\x00\x00\x17\x00\x18\x00\x19\x00\x00\x00\x00\x00\x1a\x00\x15\x00\x59\x00\x5c\x00\x00\x00\x17\x00\x18\x00\x19\x00\x89\x00\x00\x00\x1a\x00\x00\x00\x00\x00\x5b\x00\x00\x00\x00\x00\x00\x00\xa7\x01\x00\x00\x00\x00\x1a\x00\x15\x00\x59\x00\x5c\x00\xc6\x00\x17\x00\x18\x00\x19\x00\x89\x00\x00\x00\x15\x00\x16\x00\x00\x00\x5b\x00\x17\x00\x18\x00\x19\x00\x72\x01\x00\x00\x00\x00\x1a\x00\x15\x00\x59\x00\x5c\x00\x00\x00\x17\x00\x18\x00\x19\x00\x89\x00\x1a\x00\x15\x00\x26\x00\x00\x00\x5b\x00\x17\x00\x18\x00\x19\x00\x7f\x01\x00\x00\x00\x00\x1a\x00\x15\x00\x59\x00\x5c\x00\x00\x00\x17\x00\x18\x00\x19\x00\x89\x00\x1a\x00\x15\x00\x00\x00\x00\x00\x5b\x00\x17\x00\x18\x00\x19\x00\x03\x01\x00\x00\x00\x00\x1a\x00\x00\x00\x59\x00\x5c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x89\x00\x1a\x00\x15\x00\x59\x00\x00\x00\x5b\x00\x17\x00\x18\x00\x19\x00\x89\x00\x00\x00\x00\x00\x11\x01\x00\x00\x5b\x00\x5c\x00\x00\x00\x00\x00\x1c\x01\x00\x00\x00\x00\x1a\x00\x00\x00\x59\x00\x5c\x00\x00\x00\x00\x00\x15\x00\x00\x00\x89\x00\x8a\x00\x17\x00\x18\x00\x19\x00\x5b\x00\x00\x00\x15\x00\x00\x00\x00\x00\x00\x00\x17\x00\x18\x00\x19\x00\x00\x00\x5c\x00\x00\x00\x1a\x00\x15\x00\x59\x00\x8d\x00\x00\x00\x17\x00\x18\x00\x19\x00\x89\x00\x1a\x00\x00\x00\x59\x00\x00\x00\x5b\x00\x00\x00\x00\x00\x00\x00\x89\x00\x00\x00\x00\x00\x1a\x00\x00\x00\x5b\x00\x5c\x00\x00\x00\x2f\xff\x00\x00\x00\x00\x2f\xff\x2f\xff\x00\x00\x00\x00\x5c\x00\x2f\xff\x2f\xff\x2f\xff\x2f\xff\x2f\xff\x00\x00\x2f\xff\x2f\xff\x2f\xff\x00\x00\x00\x00\x2f\xff\x3f\x00\x40\x00\x41\x00\x15\x00\x16\x00\x2f\xff\x2f\xff\x17\x00\x18\x00\x19\x00\x2f\xff\x2f\xff\x2f\xff\x2f\xff\x2f\xff\x2f\xff\x2f\xff\x2f\xff\x2f\xff\x00\x00\x00\x00\x2f\xff\x1a\x00\x00\x00\x44\x00\xa2\x00\x00\x00\x00\x00\x15\x00\x16\x00\x45\x00\x00\x00\x17\x00\x18\x00\x19\x00\x46\x00\xd5\x00\x47\x00\x00\x00\x00\x00\x48\x00\x00\x00\xd6\x00\x2a\x00\x2b\x00\x00\x00\x2c\x00\x1a\x00\x2b\xff\x00\x00\x10\x00\x11\x00\x00\x00\x2d\x00\x00\x00\xa3\x00\x00\x00\x2b\xff\x2b\xff\x00\x00\xa4\x00\x00\x00\x2b\xff\x2b\xff\x2b\xff\x2b\xff\x2b\xff\x2b\xff\x2b\xff\x2b\xff\x2b\xff\xe8\x00\x00\x00\x2b\xff\xf2\x00\x6d\x01\x00\x00\x15\x00\x00\x00\x00\x00\x00\x00\x17\x00\x18\x00\x19\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x00\x00\x1a\x00\xb9\x01\x27\x00\x28\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x29\x00\x2a\x00\x2b\x00\x00\x00\x2c\x00\x9e\x01\x27\x00\x28\x00\x10\x00\x11\x00\x00\x00\x2d\x00\x00\x00\x29\x00\x2a\x00\x2b\x00\x00\x00\x2c\x00\x14\x01\x27\x00\x28\x00\x10\x00\x11\x00\x00\x00\x2d\x00\x00\x00\x29\x00\x2a\x00\x2b\x00\x00\x00\x2c\x00\x26\x00\x27\x00\x28\x00\x10\x00\x11\x00\x00\x00\x2d\x00\x00\x00\x29\x00\x2a\x00\x2b\x00\x00\x00\x2c\x00\x00\x00\x00\x00\x82\x01\x10\x00\x11\x00\x00\x00\x2d\x00\x83\x01\x2a\x00\x2b\x00\x00\x00\x2c\x00\x00\x00\x00\x00\x00\x00\x10\x00\x11\x00\x00\x00\x2d\x00\x08\x01\x2a\x00\x2b\x00\x00\x00\x2c\x00\x09\x01\x00\x00\x00\x00\x0a\x01\x11\x00\xc0\x00\x2d\x00\x00\x00\x00\x00\x0b\x01\x0c\x01\x00\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\xd4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\xc6\x00\x2a\x00\x2b\x00\x00\x00\x2c\x00\xc7\x00\x00\x00\x00\x00\x10\x00\x11\x00\x00\x00\x2d\x00\x83\x01\x2a\x00\x2b\x00\x00\x00\x2c\x00\x00\x00\x00\x00\x00\x00\x10\x00\x11\x00\x00\x00\x2d\x00\x95\x01\x2a\x00\x2b\x00\x00\x00\x2c\x00\x00\x00\x00\x00\x00\x00\x10\x00\x11\x00\x00\x00\x2d\x00\x9a\x01\x2a\x00\x2b\x00\x00\x00\x2c\x00\x00\x00\x00\x00\x00\x00\x10\x00\x11\x00\x00\x00\x2d\x00\x5a\x01\x2a\x00\x2b\x00\x00\x00\x2c\x00\x00\x00\x00\x00\x00\x00\x10\x00\x11\x00\x00\x00\x2d\x00\x5d\x01\x2a\x00\x2b\x00\x00\x00\x2c\x00\x00\x00\x00\x00\x00\x00\x10\x00\x11\x00\x00\x00\x2d\x00\x86\x01\x2a\x00\x2b\x00\x00\x00\x2c\x00\x00\x00\x00\x00\x00\x00\x10\x00\x11\x00\x00\x00\x2d\x00\x87\x01\x2a\x00\x2b\x00\x00\x00\x2c\x00\x00\x00\x00\x00\x00\x00\x10\x00\x11\x00\x00\x00\x2d\x00\xdb\x00\x2a\x00\x2b\x00\x00\x00\x2c\x00\x00\x00\x00\x00\x00\x00\x10\x00\x11\x00\x00\x00\x2d\x00\xdd\x00\x2a\x00\x2b\x00\x00\x00\x2c\x00\x00\x00\x00\x00\x00\x00\x10\x00\x11\x00\x00\x00\x2d\x00\xde\x00\x2a\x00\x2b\x00\x00\x00\x2c\x00\x00\x00\x00\x00\x00\x00\x10\x00\x11\x00\x00\x00\x2d\x00\xdf\x00\x2a\x00\x2b\x00\x00\x00\x2c\x00\x00\x00\x00\x00\x00\x00\x10\x00\x11\x00\x00\x00\x2d\x00\xed\x00\x2a\x00\x2b\x00\x00\x00\x2c\x00\x00\x00\x00\x00\x00\x00\x10\x00\x11\x00\x00\x00\x2d\x00\x0e\x01\x2a\x00\x2b\x00\x00\x00\x2c\x00\x00\x00\x00\x00\x00\x00\x10\x00\x11\x00\x00\x00\x2d\x00\xca\x00\x2a\x00\x2b\x00\x00\x00\x2c\x00\x00\x00\x00\x00\x00\x00\x10\x00\x11\x00\x00\x00\x2d\x00\xd4\x00\x2a\x00\x2b\x00\x00\x00\x2c\x00\x00\x00\x00\x00\x00\x00\x10\x00\x11\x00\x00\x00\x2d\x00\xdc\x00\x2b\x00\x00\x00\x2c\x00\x00\x00\x00\x00\x00\x00\x10\x00\x11\x00\x00\x00\x2d\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"#
+
+happyReduceArr = Happy_Data_Array.array (12, 246) [
+	(12 , happyReduce_12),
+	(13 , happyReduce_13),
+	(14 , happyReduce_14),
+	(15 , happyReduce_15),
+	(16 , happyReduce_16),
+	(17 , happyReduce_17),
+	(18 , happyReduce_18),
+	(19 , happyReduce_19),
+	(20 , happyReduce_20),
+	(21 , happyReduce_21),
+	(22 , happyReduce_22),
+	(23 , happyReduce_23),
+	(24 , happyReduce_24),
+	(25 , happyReduce_25),
+	(26 , happyReduce_26),
+	(27 , happyReduce_27),
+	(28 , happyReduce_28),
+	(29 , happyReduce_29),
+	(30 , happyReduce_30),
+	(31 , happyReduce_31),
+	(32 , happyReduce_32),
+	(33 , happyReduce_33),
+	(34 , happyReduce_34),
+	(35 , happyReduce_35),
+	(36 , happyReduce_36),
+	(37 , happyReduce_37),
+	(38 , happyReduce_38),
+	(39 , happyReduce_39),
+	(40 , happyReduce_40),
+	(41 , happyReduce_41),
+	(42 , happyReduce_42),
+	(43 , happyReduce_43),
+	(44 , happyReduce_44),
+	(45 , happyReduce_45),
+	(46 , happyReduce_46),
+	(47 , happyReduce_47),
+	(48 , happyReduce_48),
+	(49 , happyReduce_49),
+	(50 , happyReduce_50),
+	(51 , happyReduce_51),
+	(52 , happyReduce_52),
+	(53 , happyReduce_53),
+	(54 , happyReduce_54),
+	(55 , happyReduce_55),
+	(56 , happyReduce_56),
+	(57 , happyReduce_57),
+	(58 , happyReduce_58),
+	(59 , happyReduce_59),
+	(60 , happyReduce_60),
+	(61 , happyReduce_61),
+	(62 , happyReduce_62),
+	(63 , happyReduce_63),
+	(64 , happyReduce_64),
+	(65 , happyReduce_65),
+	(66 , happyReduce_66),
+	(67 , happyReduce_67),
+	(68 , happyReduce_68),
+	(69 , happyReduce_69),
+	(70 , happyReduce_70),
+	(71 , happyReduce_71),
+	(72 , happyReduce_72),
+	(73 , happyReduce_73),
+	(74 , happyReduce_74),
+	(75 , happyReduce_75),
+	(76 , happyReduce_76),
+	(77 , happyReduce_77),
+	(78 , happyReduce_78),
+	(79 , happyReduce_79),
+	(80 , happyReduce_80),
+	(81 , happyReduce_81),
+	(82 , happyReduce_82),
+	(83 , happyReduce_83),
+	(84 , happyReduce_84),
+	(85 , happyReduce_85),
+	(86 , happyReduce_86),
+	(87 , happyReduce_87),
+	(88 , happyReduce_88),
+	(89 , happyReduce_89),
+	(90 , happyReduce_90),
+	(91 , happyReduce_91),
+	(92 , happyReduce_92),
+	(93 , happyReduce_93),
+	(94 , happyReduce_94),
+	(95 , happyReduce_95),
+	(96 , happyReduce_96),
+	(97 , happyReduce_97),
+	(98 , happyReduce_98),
+	(99 , happyReduce_99),
+	(100 , happyReduce_100),
+	(101 , happyReduce_101),
+	(102 , happyReduce_102),
+	(103 , happyReduce_103),
+	(104 , happyReduce_104),
+	(105 , happyReduce_105),
+	(106 , happyReduce_106),
+	(107 , happyReduce_107),
+	(108 , happyReduce_108),
+	(109 , happyReduce_109),
+	(110 , happyReduce_110),
+	(111 , happyReduce_111),
+	(112 , happyReduce_112),
+	(113 , happyReduce_113),
+	(114 , happyReduce_114),
+	(115 , happyReduce_115),
+	(116 , happyReduce_116),
+	(117 , happyReduce_117),
+	(118 , happyReduce_118),
+	(119 , happyReduce_119),
+	(120 , happyReduce_120),
+	(121 , happyReduce_121),
+	(122 , happyReduce_122),
+	(123 , happyReduce_123),
+	(124 , happyReduce_124),
+	(125 , happyReduce_125),
+	(126 , happyReduce_126),
+	(127 , happyReduce_127),
+	(128 , happyReduce_128),
+	(129 , happyReduce_129),
+	(130 , happyReduce_130),
+	(131 , happyReduce_131),
+	(132 , happyReduce_132),
+	(133 , happyReduce_133),
+	(134 , happyReduce_134),
+	(135 , happyReduce_135),
+	(136 , happyReduce_136),
+	(137 , happyReduce_137),
+	(138 , happyReduce_138),
+	(139 , happyReduce_139),
+	(140 , happyReduce_140),
+	(141 , happyReduce_141),
+	(142 , happyReduce_142),
+	(143 , happyReduce_143),
+	(144 , happyReduce_144),
+	(145 , happyReduce_145),
+	(146 , happyReduce_146),
+	(147 , happyReduce_147),
+	(148 , happyReduce_148),
+	(149 , happyReduce_149),
+	(150 , happyReduce_150),
+	(151 , happyReduce_151),
+	(152 , happyReduce_152),
+	(153 , happyReduce_153),
+	(154 , happyReduce_154),
+	(155 , happyReduce_155),
+	(156 , happyReduce_156),
+	(157 , happyReduce_157),
+	(158 , happyReduce_158),
+	(159 , happyReduce_159),
+	(160 , happyReduce_160),
+	(161 , happyReduce_161),
+	(162 , happyReduce_162),
+	(163 , happyReduce_163),
+	(164 , happyReduce_164),
+	(165 , happyReduce_165),
+	(166 , happyReduce_166),
+	(167 , happyReduce_167),
+	(168 , happyReduce_168),
+	(169 , happyReduce_169),
+	(170 , happyReduce_170),
+	(171 , happyReduce_171),
+	(172 , happyReduce_172),
+	(173 , happyReduce_173),
+	(174 , happyReduce_174),
+	(175 , happyReduce_175),
+	(176 , happyReduce_176),
+	(177 , happyReduce_177),
+	(178 , happyReduce_178),
+	(179 , happyReduce_179),
+	(180 , happyReduce_180),
+	(181 , happyReduce_181),
+	(182 , happyReduce_182),
+	(183 , happyReduce_183),
+	(184 , happyReduce_184),
+	(185 , happyReduce_185),
+	(186 , happyReduce_186),
+	(187 , happyReduce_187),
+	(188 , happyReduce_188),
+	(189 , happyReduce_189),
+	(190 , happyReduce_190),
+	(191 , happyReduce_191),
+	(192 , happyReduce_192),
+	(193 , happyReduce_193),
+	(194 , happyReduce_194),
+	(195 , happyReduce_195),
+	(196 , happyReduce_196),
+	(197 , happyReduce_197),
+	(198 , happyReduce_198),
+	(199 , happyReduce_199),
+	(200 , happyReduce_200),
+	(201 , happyReduce_201),
+	(202 , happyReduce_202),
+	(203 , happyReduce_203),
+	(204 , happyReduce_204),
+	(205 , happyReduce_205),
+	(206 , happyReduce_206),
+	(207 , happyReduce_207),
+	(208 , happyReduce_208),
+	(209 , happyReduce_209),
+	(210 , happyReduce_210),
+	(211 , happyReduce_211),
+	(212 , happyReduce_212),
+	(213 , happyReduce_213),
+	(214 , happyReduce_214),
+	(215 , happyReduce_215),
+	(216 , happyReduce_216),
+	(217 , happyReduce_217),
+	(218 , happyReduce_218),
+	(219 , happyReduce_219),
+	(220 , happyReduce_220),
+	(221 , happyReduce_221),
+	(222 , happyReduce_222),
+	(223 , happyReduce_223),
+	(224 , happyReduce_224),
+	(225 , happyReduce_225),
+	(226 , happyReduce_226),
+	(227 , happyReduce_227),
+	(228 , happyReduce_228),
+	(229 , happyReduce_229),
+	(230 , happyReduce_230),
+	(231 , happyReduce_231),
+	(232 , happyReduce_232),
+	(233 , happyReduce_233),
+	(234 , happyReduce_234),
+	(235 , happyReduce_235),
+	(236 , happyReduce_236),
+	(237 , happyReduce_237),
+	(238 , happyReduce_238),
+	(239 , happyReduce_239),
+	(240 , happyReduce_240),
+	(241 , happyReduce_241),
+	(242 , happyReduce_242),
+	(243 , happyReduce_243),
+	(244 , happyReduce_244),
+	(245 , happyReduce_245),
+	(246 , happyReduce_246)
+	]
+
+happy_n_terms = 60 :: Int
+happy_n_nonterms = 81 :: Int
+
+happyReduce_12 = happyReduce 6# 0# happyReduction_12
+happyReduction_12 (happy_x_6 `HappyStk`
+	happy_x_5 `HappyStk`
+	happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOut90 happy_x_2 of { happy_var_2 -> 
+	case happyOut16 happy_x_5 of { happy_var_5 -> 
+	happyIn15
+		 (let (is,ts) = happy_var_5 in Module happy_var_2 is ts
+	) `HappyStk` happyRest}}
+
+happyReduce_13 = happySpecReduce_3  0# happyReduction_13
+happyReduction_13 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut16 happy_x_2 of { happy_var_2 -> 
+	happyIn15
+		 (let { (is,ts) = happy_var_2
+            -- XXX make a location from is and ts
+          ; modName = Located { srcRange = emptyRange
+                              , thing    = mkModName ["Main"]
+                              }
+          } in Module modName is ts
+	)}
+
+happyReduce_14 = happySpecReduce_3  1# happyReduction_14
+happyReduction_14 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut17 happy_x_1 of { happy_var_1 -> 
+	case happyOut26 happy_x_3 of { happy_var_3 -> 
+	happyIn16
+		 ((reverse happy_var_1, reverse happy_var_3)
+	)}}
+
+happyReduce_15 = happySpecReduce_3  1# happyReduction_15
+happyReduction_15 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut17 happy_x_1 of { happy_var_1 -> 
+	case happyOut26 happy_x_3 of { happy_var_3 -> 
+	happyIn16
+		 ((reverse happy_var_1, reverse happy_var_3)
+	)}}
+
+happyReduce_16 = happySpecReduce_1  1# happyReduction_16
+happyReduction_16 happy_x_1
+	 =  case happyOut17 happy_x_1 of { happy_var_1 -> 
+	happyIn16
+		 ((reverse happy_var_1, [])
+	)}
+
+happyReduce_17 = happySpecReduce_1  1# happyReduction_17
+happyReduction_17 happy_x_1
+	 =  case happyOut26 happy_x_1 of { happy_var_1 -> 
+	happyIn16
+		 (([], reverse happy_var_1)
+	)}
+
+happyReduce_18 = happySpecReduce_0  1# happyReduction_18
+happyReduction_18  =  happyIn16
+		 (([], [])
+	)
+
+happyReduce_19 = happySpecReduce_3  2# happyReduction_19
+happyReduction_19 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut17 happy_x_1 of { happy_var_1 -> 
+	case happyOut18 happy_x_3 of { happy_var_3 -> 
+	happyIn17
+		 (happy_var_3 : happy_var_1
+	)}}
+
+happyReduce_20 = happySpecReduce_3  2# happyReduction_20
+happyReduction_20 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut17 happy_x_1 of { happy_var_1 -> 
+	case happyOut18 happy_x_3 of { happy_var_3 -> 
+	happyIn17
+		 (happy_var_3 : happy_var_1
+	)}}
+
+happyReduce_21 = happySpecReduce_1  2# happyReduction_21
+happyReduction_21 happy_x_1
+	 =  case happyOut18 happy_x_1 of { happy_var_1 -> 
+	happyIn17
+		 ([happy_var_1]
+	)}
+
+happyReduce_22 = happyReduce 4# 3# happyReduction_22
+happyReduction_22 (happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (KW KW_import)    _)) -> 
+	case happyOut90 happy_x_2 of { happy_var_2 -> 
+	case happyOut19 happy_x_3 of { happy_var_3 -> 
+	case happyOut20 happy_x_4 of { happy_var_4 -> 
+	happyIn18
+		 (Located { srcRange = rComb happy_var_1
+                                                   $ fromMaybe (srcRange happy_var_2)
+                                                   $ msum [ fmap srcRange happy_var_4
+                                                          , fmap srcRange happy_var_3
+                                                          ]
+                                        , thing    = Import
+                                          { iModule    = thing happy_var_2
+                                          , iAs        = fmap thing happy_var_3
+                                          , iSpec      = fmap thing happy_var_4
+                                          }
+                                        }
+	) `HappyStk` happyRest}}}}
+
+happyReduce_23 = happySpecReduce_2  4# happyReduction_23
+happyReduction_23 happy_x_2
+	happy_x_1
+	 =  case happyOut90 happy_x_2 of { happy_var_2 -> 
+	happyIn19
+		 (Just happy_var_2
+	)}
+
+happyReduce_24 = happySpecReduce_0  4# happyReduction_24
+happyReduction_24  =  happyIn19
+		 (Nothing
+	)
+
+happyReduce_25 = happyReduce 4# 5# happyReduction_25
+happyReduction_25 (happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOut22 happy_x_1 of { happy_var_1 -> 
+	case happyOut21 happy_x_3 of { happy_var_3 -> 
+	happyIn20
+		 (Just Located
+                                  { srcRange = case happy_var_3 of
+                                      { [] -> emptyRange
+                                      ; xs -> rCombs (map srcRange xs) }
+                                  , thing    = happy_var_1 (reverse (map thing happy_var_3))
+                                  }
+	) `HappyStk` happyRest}}
+
+happyReduce_26 = happySpecReduce_0  5# happyReduction_26
+happyReduction_26  =  happyIn20
+		 (Nothing
+	)
+
+happyReduce_27 = happySpecReduce_3  6# happyReduction_27
+happyReduction_27 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut21 happy_x_1 of { happy_var_1 -> 
+	case happyOut88 happy_x_3 of { happy_var_3 -> 
+	happyIn21
+		 (happy_var_3 : happy_var_1
+	)}}
+
+happyReduce_28 = happySpecReduce_1  6# happyReduction_28
+happyReduction_28 happy_x_1
+	 =  case happyOut88 happy_x_1 of { happy_var_1 -> 
+	happyIn21
+		 ([happy_var_1]
+	)}
+
+happyReduce_29 = happySpecReduce_0  6# happyReduction_29
+happyReduction_29  =  happyIn21
+		 ([]
+	)
+
+happyReduce_30 = happySpecReduce_1  7# happyReduction_30
+happyReduction_30 happy_x_1
+	 =  happyIn22
+		 (Hiding
+	)
+
+happyReduce_31 = happySpecReduce_0  7# happyReduction_31
+happyReduction_31  =  happyIn22
+		 (Only
+	)
+
+happyReduce_32 = happySpecReduce_1  8# happyReduction_32
+happyReduction_32 happy_x_1
+	 =  case happyOut25 happy_x_1 of { happy_var_1 -> 
+	happyIn23
+		 (Program (reverse happy_var_1)
+	)}
+
+happyReduce_33 = happySpecReduce_0  8# happyReduction_33
+happyReduction_33  =  happyIn23
+		 (Program []
+	)
+
+happyReduce_34 = happySpecReduce_3  9# happyReduction_34
+happyReduction_34 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut26 happy_x_2 of { happy_var_2 -> 
+	happyIn24
+		 (Program (reverse happy_var_2)
+	)}
+
+happyReduce_35 = happySpecReduce_2  9# happyReduction_35
+happyReduction_35 happy_x_2
+	happy_x_1
+	 =  happyIn24
+		 (Program []
+	)
+
+happyReduce_36 = happySpecReduce_2  10# happyReduction_36
+happyReduction_36 happy_x_2
+	happy_x_1
+	 =  case happyOut28 happy_x_1 of { happy_var_1 -> 
+	happyIn25
+		 (happy_var_1
+	)}
+
+happyReduce_37 = happySpecReduce_3  10# happyReduction_37
+happyReduction_37 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut25 happy_x_1 of { happy_var_1 -> 
+	case happyOut28 happy_x_2 of { happy_var_2 -> 
+	happyIn25
+		 (happy_var_2 ++ happy_var_1
+	)}}
+
+happyReduce_38 = happySpecReduce_1  11# happyReduction_38
+happyReduction_38 happy_x_1
+	 =  case happyOut27 happy_x_1 of { happy_var_1 -> 
+	happyIn26
+		 (happy_var_1
+	)}
+
+happyReduce_39 = happySpecReduce_3  11# happyReduction_39
+happyReduction_39 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut26 happy_x_1 of { happy_var_1 -> 
+	case happyOut27 happy_x_3 of { happy_var_3 -> 
+	happyIn26
+		 (happy_var_3 ++ happy_var_1
+	)}}
+
+happyReduce_40 = happySpecReduce_3  11# happyReduction_40
+happyReduction_40 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut26 happy_x_1 of { happy_var_1 -> 
+	case happyOut27 happy_x_3 of { happy_var_3 -> 
+	happyIn26
+		 (happy_var_3 ++ happy_var_1
+	)}}
+
+happyReduce_41 = happySpecReduce_1  12# happyReduction_41
+happyReduction_41 happy_x_1
+	 =  case happyOut33 happy_x_1 of { happy_var_1 -> 
+	happyIn27
+		 ([exportDecl Nothing   Public happy_var_1]
+	)}
+
+happyReduce_42 = happySpecReduce_2  12# happyReduction_42
+happyReduction_42 happy_x_2
+	happy_x_1
+	 =  case happyOut31 happy_x_1 of { happy_var_1 -> 
+	case happyOut33 happy_x_2 of { happy_var_2 -> 
+	happyIn27
+		 ([exportDecl (Just happy_var_1) Public happy_var_2]
+	)}}
+
+happyReduce_43 = happyMonadReduce 3# 12# happyReduction_43
+happyReduction_43 (happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_3 of { (happy_var_3@(Located _ (Token (StrLit {}) _))) -> 
+	( (return . Include) `fmap` fromStrLit happy_var_3)}
+	) (\r -> happyReturn (happyIn27 r))
+
+happyReduce_44 = happyReduce 6# 12# happyReduction_44
+happyReduction_44 (happy_x_6 `HappyStk`
+	happy_x_5 `HappyStk`
+	happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOut32 happy_x_1 of { happy_var_1 -> 
+	case happyOut89 happy_x_3 of { happy_var_3 -> 
+	case happyOut39 happy_x_4 of { happy_var_4 -> 
+	case happyOut44 happy_x_6 of { happy_var_6 -> 
+	happyIn27
+		 ([exportDecl happy_var_1 Public (mkProperty happy_var_3 happy_var_4 happy_var_6)]
+	) `HappyStk` happyRest}}}}
+
+happyReduce_45 = happyReduce 5# 12# happyReduction_45
+happyReduction_45 (happy_x_5 `HappyStk`
+	happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOut32 happy_x_1 of { happy_var_1 -> 
+	case happyOut89 happy_x_3 of { happy_var_3 -> 
+	case happyOut44 happy_x_5 of { happy_var_5 -> 
+	happyIn27
+		 ([exportDecl happy_var_1 Public (mkProperty happy_var_3 [] happy_var_5)]
+	) `HappyStk` happyRest}}}
+
+happyReduce_46 = happySpecReduce_2  12# happyReduction_46
+happyReduction_46 happy_x_2
+	happy_x_1
+	 =  case happyOut35 happy_x_2 of { happy_var_2 -> 
+	happyIn27
+		 ([exportNewtype Public happy_var_2]
+	)}
+
+happyReduce_47 = happySpecReduce_1  12# happyReduction_47
+happyReduction_47 happy_x_1
+	 =  case happyOut30 happy_x_1 of { happy_var_1 -> 
+	happyIn27
+		 (happy_var_1
+	)}
+
+happyReduce_48 = happySpecReduce_1  12# happyReduction_48
+happyReduction_48 happy_x_1
+	 =  case happyOut29 happy_x_1 of { happy_var_1 -> 
+	happyIn27
+		 (happy_var_1
+	)}
+
+happyReduce_49 = happySpecReduce_1  13# happyReduction_49
+happyReduction_49 happy_x_1
+	 =  case happyOut33 happy_x_1 of { happy_var_1 -> 
+	happyIn28
+		 ([Decl (TopLevel {tlExport = Public, tlValue = happy_var_1 })]
+	)}
+
+happyReduce_50 = happyMonadReduce 2# 13# happyReduction_50
+happyReduction_50 (happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_2 of { (happy_var_2@(Located _ (Token (StrLit {}) _))) -> 
+	( (return . Include) `fmap` fromStrLit happy_var_2)}
+	) (\r -> happyReturn (happyIn28 r))
+
+happyReduce_51 = happySpecReduce_1  13# happyReduction_51
+happyReduction_51 happy_x_1
+	 =  case happyOut30 happy_x_1 of { happy_var_1 -> 
+	happyIn28
+		 (happy_var_1
+	)}
+
+happyReduce_52 = happyReduce 4# 14# happyReduction_52
+happyReduction_52 (happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOut26 happy_x_3 of { happy_var_3 -> 
+	happyIn29
+		 (changeExport Private (reverse happy_var_3)
+	) `HappyStk` happyRest}
+
+happyReduce_53 = happyReduce 5# 14# happyReduction_53
+happyReduction_53 (happy_x_5 `HappyStk`
+	happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOut26 happy_x_4 of { happy_var_4 -> 
+	happyIn29
+		 (changeExport Private (reverse happy_var_4)
+	) `HappyStk` happyRest}
+
+happyReduce_54 = happyReduce 5# 15# happyReduction_54
+happyReduction_54 (happy_x_5 `HappyStk`
+	happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOut32 happy_x_1 of { happy_var_1 -> 
+	case happyOut89 happy_x_3 of { happy_var_3 -> 
+	case happyOut72 happy_x_5 of { happy_var_5 -> 
+	happyIn30
+		 (mkPrimDecl happy_var_1 happy_var_3 happy_var_5
+	) `HappyStk` happyRest}}}
+
+happyReduce_55 = happyReduce 7# 15# happyReduction_55
+happyReduction_55 (happy_x_7 `HappyStk`
+	happy_x_6 `HappyStk`
+	happy_x_5 `HappyStk`
+	happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOut32 happy_x_1 of { happy_var_1 -> 
+	case happyOut52 happy_x_4 of { happy_var_4 -> 
+	case happyOut72 happy_x_7 of { happy_var_7 -> 
+	happyIn30
+		 (mkPrimDecl happy_var_1 happy_var_4 happy_var_7
+	) `HappyStk` happyRest}}}
+
+happyReduce_56 = happySpecReduce_1  16# happyReduction_56
+happyReduction_56 happy_x_1
+	 =  case happyOutTok happy_x_1 of { (happy_var_1@(Located _ (Token (White DocStr) _))) -> 
+	happyIn31
+		 (mkDoc (fmap tokenText happy_var_1)
+	)}
+
+happyReduce_57 = happySpecReduce_1  17# happyReduction_57
+happyReduction_57 happy_x_1
+	 =  case happyOut31 happy_x_1 of { happy_var_1 -> 
+	happyIn32
+		 (Just happy_var_1
+	)}
+
+happyReduce_58 = happySpecReduce_0  17# happyReduction_58
+happyReduction_58  =  happyIn32
+		 (Nothing
+	)
+
+happyReduce_59 = happySpecReduce_3  18# happyReduction_59
+happyReduction_59 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut37 happy_x_1 of { happy_var_1 -> 
+	case happyOut72 happy_x_3 of { happy_var_3 -> 
+	happyIn33
+		 (at (head happy_var_1,happy_var_3) $ DSignature (reverse happy_var_1) happy_var_3
+	)}}
+
+happyReduce_60 = happySpecReduce_3  18# happyReduction_60
+happyReduction_60 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut68 happy_x_1 of { happy_var_1 -> 
+	case happyOut44 happy_x_3 of { happy_var_3 -> 
+	happyIn33
+		 (at (happy_var_1,happy_var_3) $ DPatBind happy_var_1 happy_var_3
+	)}}
+
+happyReduce_61 = happyReduce 4# 18# happyReduction_61
+happyReduction_61 (happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOut89 happy_x_1 of { happy_var_1 -> 
+	case happyOut39 happy_x_2 of { happy_var_2 -> 
+	case happyOut44 happy_x_4 of { happy_var_4 -> 
+	happyIn33
+		 (at (happy_var_1,happy_var_4) $
+                             DBind $ Bind { bName      = happy_var_1
+                                          , bParams    = reverse happy_var_2
+                                          , bDef       = at happy_var_4 (Located emptyRange (DExpr happy_var_4))
+                                          , bSignature = Nothing
+                                          , bPragmas   = []
+                                          , bMono      = False
+                                          , bInfix     = False
+                                          , bFixity    = Nothing
+                                          , bDoc       = Nothing
+                                          }
+	) `HappyStk` happyRest}}}
+
+happyReduce_62 = happyReduce 5# 18# happyReduction_62
+happyReduction_62 (happy_x_5 `HappyStk`
+	happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOut68 happy_x_1 of { happy_var_1 -> 
+	case happyOut52 happy_x_2 of { happy_var_2 -> 
+	case happyOut68 happy_x_3 of { happy_var_3 -> 
+	case happyOut44 happy_x_5 of { happy_var_5 -> 
+	happyIn33
+		 (at (happy_var_1,happy_var_5) $
+                             DBind $ Bind { bName      = happy_var_2
+                                          , bParams    = [happy_var_1,happy_var_3]
+                                          , bDef       = at happy_var_5 (Located emptyRange (DExpr happy_var_5))
+                                          , bSignature = Nothing
+                                          , bPragmas   = []
+                                          , bMono      = False
+                                          , bInfix     = True
+                                          , bFixity    = Nothing
+                                          , bDoc       = Nothing
+                                          }
+	) `HappyStk` happyRest}}}}
+
+happyReduce_63 = happyMonadReduce 4# 18# happyReduction_63
+happyReduction_63 (happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (KW KW_type   ) _)) -> 
+	case happyOut89 happy_x_2 of { happy_var_2 -> 
+	case happyOut80 happy_x_4 of { happy_var_4 -> 
+	( at (happy_var_1,happy_var_4) `fmap` mkTySyn happy_var_2 [] happy_var_4)}}}
+	) (\r -> happyReturn (happyIn33 r))
+
+happyReduce_64 = happyMonadReduce 5# 18# happyReduction_64
+happyReduction_64 (happy_x_5 `HappyStk`
+	happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (KW KW_type   ) _)) -> 
+	case happyOut89 happy_x_2 of { happy_var_2 -> 
+	case happyOut79 happy_x_3 of { happy_var_3 -> 
+	case happyOut80 happy_x_5 of { happy_var_5 -> 
+	( at (happy_var_1,happy_var_5) `fmap` mkTySyn happy_var_2 (reverse happy_var_3) happy_var_5)}}}}
+	) (\r -> happyReturn (happyIn33 r))
+
+happyReduce_65 = happyMonadReduce 3# 18# happyReduction_65
+happyReduction_65 (happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_2 of { (happy_var_2@(Located _ (Token (Num   {}) _))) -> 
+	case happyOut53 happy_x_3 of { happy_var_3 -> 
+	( mkFixity LeftAssoc  happy_var_2 (reverse happy_var_3))}}
+	) (\r -> happyReturn (happyIn33 r))
+
+happyReduce_66 = happyMonadReduce 3# 18# happyReduction_66
+happyReduction_66 (happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_2 of { (happy_var_2@(Located _ (Token (Num   {}) _))) -> 
+	case happyOut53 happy_x_3 of { happy_var_3 -> 
+	( mkFixity RightAssoc happy_var_2 (reverse happy_var_3))}}
+	) (\r -> happyReturn (happyIn33 r))
+
+happyReduce_67 = happyMonadReduce 3# 18# happyReduction_67
+happyReduction_67 (happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_2 of { (happy_var_2@(Located _ (Token (Num   {}) _))) -> 
+	case happyOut53 happy_x_3 of { happy_var_3 -> 
+	( mkFixity NonAssoc   happy_var_2 (reverse happy_var_3))}}
+	) (\r -> happyReturn (happyIn33 r))
+
+happyReduce_68 = happyReduce 4# 19# happyReduction_68
+happyReduction_68 (happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOut68 happy_x_2 of { happy_var_2 -> 
+	case happyOut44 happy_x_4 of { happy_var_4 -> 
+	happyIn34
+		 (at (happy_var_2,happy_var_4) $ DPatBind happy_var_2 happy_var_4
+	) `HappyStk` happyRest}}
+
+happyReduce_69 = happyReduce 5# 19# happyReduction_69
+happyReduction_69 (happy_x_5 `HappyStk`
+	happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOut89 happy_x_2 of { happy_var_2 -> 
+	case happyOut39 happy_x_3 of { happy_var_3 -> 
+	case happyOut44 happy_x_5 of { happy_var_5 -> 
+	happyIn34
+		 (at (happy_var_2,happy_var_5) $
+                                   DBind $ Bind { bName      = happy_var_2
+                                                , bParams    = reverse happy_var_3
+                                                , bDef       = at happy_var_5 (Located emptyRange (DExpr happy_var_5))
+                                                , bSignature = Nothing
+                                                , bPragmas   = []
+                                                , bMono      = False
+                                                , bInfix     = False
+                                                , bFixity    = Nothing
+                                                , bDoc       = Nothing
+                                                }
+	) `HappyStk` happyRest}}}
+
+happyReduce_70 = happyReduce 4# 20# happyReduction_70
+happyReduction_70 (happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOut91 happy_x_2 of { happy_var_2 -> 
+	case happyOut36 happy_x_4 of { happy_var_4 -> 
+	happyIn35
+		 (Newtype { nName = happy_var_2, nParams = [], nBody = happy_var_4 }
+	) `HappyStk` happyRest}}
+
+happyReduce_71 = happyReduce 5# 20# happyReduction_71
+happyReduction_71 (happy_x_5 `HappyStk`
+	happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOut91 happy_x_2 of { happy_var_2 -> 
+	case happyOut79 happy_x_3 of { happy_var_3 -> 
+	case happyOut36 happy_x_5 of { happy_var_5 -> 
+	happyIn35
+		 (Newtype { nName = happy_var_2, nParams = happy_var_3, nBody = happy_var_5 }
+	) `HappyStk` happyRest}}}
+
+happyReduce_72 = happySpecReduce_2  21# happyReduction_72
+happyReduction_72 happy_x_2
+	happy_x_1
+	 =  happyIn36
+		 ([]
+	)
+
+happyReduce_73 = happySpecReduce_3  21# happyReduction_73
+happyReduction_73 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut87 happy_x_2 of { happy_var_2 -> 
+	happyIn36
+		 (happy_var_2
+	)}
+
+happyReduce_74 = happySpecReduce_1  22# happyReduction_74
+happyReduction_74 happy_x_1
+	 =  case happyOut38 happy_x_1 of { happy_var_1 -> 
+	happyIn37
+		 ([ happy_var_1]
+	)}
+
+happyReduce_75 = happySpecReduce_3  22# happyReduction_75
+happyReduction_75 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut37 happy_x_1 of { happy_var_1 -> 
+	case happyOut38 happy_x_3 of { happy_var_3 -> 
+	happyIn37
+		 (happy_var_3 : happy_var_1
+	)}}
+
+happyReduce_76 = happySpecReduce_1  23# happyReduction_76
+happyReduction_76 happy_x_1
+	 =  case happyOut89 happy_x_1 of { happy_var_1 -> 
+	happyIn38
+		 (happy_var_1
+	)}
+
+happyReduce_77 = happySpecReduce_3  23# happyReduction_77
+happyReduction_77 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut52 happy_x_2 of { happy_var_2 -> 
+	happyIn38
+		 (happy_var_2
+	)}
+
+happyReduce_78 = happySpecReduce_1  24# happyReduction_78
+happyReduction_78 happy_x_1
+	 =  case happyOut68 happy_x_1 of { happy_var_1 -> 
+	happyIn39
+		 ([happy_var_1]
+	)}
+
+happyReduce_79 = happySpecReduce_2  24# happyReduction_79
+happyReduction_79 happy_x_2
+	happy_x_1
+	 =  case happyOut39 happy_x_1 of { happy_var_1 -> 
+	case happyOut68 happy_x_2 of { happy_var_2 -> 
+	happyIn39
+		 (happy_var_2 : happy_var_1
+	)}}
+
+happyReduce_80 = happySpecReduce_2  25# happyReduction_80
+happyReduction_80 happy_x_2
+	happy_x_1
+	 =  case happyOut33 happy_x_1 of { happy_var_1 -> 
+	happyIn40
+		 ([happy_var_1]
+	)}
+
+happyReduce_81 = happySpecReduce_3  25# happyReduction_81
+happyReduction_81 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut40 happy_x_1 of { happy_var_1 -> 
+	case happyOut33 happy_x_2 of { happy_var_2 -> 
+	happyIn40
+		 (happy_var_2 : happy_var_1
+	)}}
+
+happyReduce_82 = happySpecReduce_1  26# happyReduction_82
+happyReduction_82 happy_x_1
+	 =  case happyOut33 happy_x_1 of { happy_var_1 -> 
+	happyIn41
+		 ([happy_var_1]
+	)}
+
+happyReduce_83 = happySpecReduce_3  26# happyReduction_83
+happyReduction_83 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut41 happy_x_1 of { happy_var_1 -> 
+	case happyOut33 happy_x_3 of { happy_var_3 -> 
+	happyIn41
+		 (happy_var_3 : happy_var_1
+	)}}
+
+happyReduce_84 = happySpecReduce_3  26# happyReduction_84
+happyReduction_84 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut41 happy_x_1 of { happy_var_1 -> 
+	case happyOut33 happy_x_3 of { happy_var_3 -> 
+	happyIn41
+		 (happy_var_3 : happy_var_1
+	)}}
+
+happyReduce_85 = happySpecReduce_3  27# happyReduction_85
+happyReduction_85 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut41 happy_x_2 of { happy_var_2 -> 
+	happyIn42
+		 (happy_var_2
+	)}
+
+happyReduce_86 = happySpecReduce_2  27# happyReduction_86
+happyReduction_86 happy_x_2
+	happy_x_1
+	 =  happyIn42
+		 ([]
+	)
+
+happyReduce_87 = happySpecReduce_1  28# happyReduction_87
+happyReduction_87 happy_x_1
+	 =  case happyOut44 happy_x_1 of { happy_var_1 -> 
+	happyIn43
+		 (ExprInput happy_var_1
+	)}
+
+happyReduce_88 = happySpecReduce_1  28# happyReduction_88
+happyReduction_88 happy_x_1
+	 =  case happyOut34 happy_x_1 of { happy_var_1 -> 
+	happyIn43
+		 (LetInput happy_var_1
+	)}
+
+happyReduce_89 = happySpecReduce_1  29# happyReduction_89
+happyReduction_89 happy_x_1
+	 =  case happyOut47 happy_x_1 of { happy_var_1 -> 
+	happyIn44
+		 (happy_var_1
+	)}
+
+happyReduce_90 = happyReduce 4# 29# happyReduction_90
+happyReduction_90 (happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOut44 happy_x_1 of { happy_var_1 -> 
+	case happyOutTok happy_x_4 of { (Located happy_var_4 (Token (Sym CurlyR  ) _)) -> 
+	happyIn44
+		 (at (happy_var_1,happy_var_4) $ EWhere happy_var_1 []
+	) `HappyStk` happyRest}}
+
+happyReduce_91 = happyReduce 5# 29# happyReduction_91
+happyReduction_91 (happy_x_5 `HappyStk`
+	happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOut44 happy_x_1 of { happy_var_1 -> 
+	case happyOut40 happy_x_4 of { happy_var_4 -> 
+	case happyOutTok happy_x_5 of { (Located happy_var_5 (Token (Sym CurlyR  ) _)) -> 
+	happyIn44
+		 (at (happy_var_1,happy_var_5) $ EWhere happy_var_1 (reverse happy_var_4)
+	) `HappyStk` happyRest}}}
+
+happyReduce_92 = happyReduce 4# 29# happyReduction_92
+happyReduction_92 (happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOut44 happy_x_1 of { happy_var_1 -> 
+	case happyOutTok happy_x_2 of { (Located happy_var_2 (Token (KW KW_where  ) _)) -> 
+	happyIn44
+		 (at (happy_var_1,happy_var_2) $ EWhere happy_var_1 []
+	) `HappyStk` happyRest}}
+
+happyReduce_93 = happyReduce 5# 29# happyReduction_93
+happyReduction_93 (happy_x_5 `HappyStk`
+	happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOut44 happy_x_1 of { happy_var_1 -> 
+	case happyOut41 happy_x_4 of { happy_var_4 -> 
+	happyIn44
+		 (at (happy_var_1,happy_var_4) $ EWhere happy_var_1 (reverse happy_var_4)
+	) `HappyStk` happyRest}}
+
+happyReduce_94 = happySpecReduce_1  30# happyReduction_94
+happyReduction_94 happy_x_1
+	 =  case happyOut46 happy_x_1 of { happy_var_1 -> 
+	happyIn45
+		 ([happy_var_1]
+	)}
+
+happyReduce_95 = happySpecReduce_3  30# happyReduction_95
+happyReduction_95 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut45 happy_x_1 of { happy_var_1 -> 
+	case happyOut46 happy_x_3 of { happy_var_3 -> 
+	happyIn45
+		 (happy_var_3 : happy_var_1
+	)}}
+
+happyReduce_96 = happySpecReduce_3  31# happyReduction_96
+happyReduction_96 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut44 happy_x_1 of { happy_var_1 -> 
+	case happyOut44 happy_x_3 of { happy_var_3 -> 
+	happyIn46
+		 ((happy_var_1, happy_var_3)
+	)}}
+
+happyReduce_97 = happySpecReduce_1  32# happyReduction_97
+happyReduction_97 happy_x_1
+	 =  case happyOut48 happy_x_1 of { happy_var_1 -> 
+	happyIn47
+		 (happy_var_1
+	)}
+
+happyReduce_98 = happyReduce 4# 32# happyReduction_98
+happyReduction_98 (happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (KW KW_if     ) _)) -> 
+	case happyOut45 happy_x_2 of { happy_var_2 -> 
+	case happyOut47 happy_x_4 of { happy_var_4 -> 
+	happyIn47
+		 (at (happy_var_1,happy_var_4) $ mkIf (reverse happy_var_2) happy_var_4
+	) `HappyStk` happyRest}}}
+
+happyReduce_99 = happyReduce 4# 32# happyReduction_99
+happyReduction_99 (happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym Lambda  ) _)) -> 
+	case happyOut39 happy_x_2 of { happy_var_2 -> 
+	case happyOut47 happy_x_4 of { happy_var_4 -> 
+	happyIn47
+		 (at (happy_var_1,happy_var_4) $ EFun (reverse happy_var_2) happy_var_4
+	) `HappyStk` happyRest}}}
+
+happyReduce_100 = happySpecReduce_1  33# happyReduction_100
+happyReduction_100 happy_x_1
+	 =  case happyOut49 happy_x_1 of { happy_var_1 -> 
+	happyIn48
+		 (happy_var_1
+	)}
+
+happyReduce_101 = happySpecReduce_3  33# happyReduction_101
+happyReduction_101 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut49 happy_x_1 of { happy_var_1 -> 
+	case happyOut80 happy_x_3 of { happy_var_3 -> 
+	happyIn48
+		 (at (happy_var_1,happy_var_3) $ ETyped happy_var_1 happy_var_3
+	)}}
+
+happyReduce_102 = happySpecReduce_1  34# happyReduction_102
+happyReduction_102 happy_x_1
+	 =  case happyOut50 happy_x_1 of { happy_var_1 -> 
+	happyIn49
+		 (happy_var_1
+	)}
+
+happyReduce_103 = happySpecReduce_3  34# happyReduction_103
+happyReduction_103 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut49 happy_x_1 of { happy_var_1 -> 
+	case happyOut51 happy_x_2 of { happy_var_2 -> 
+	case happyOut50 happy_x_3 of { happy_var_3 -> 
+	happyIn49
+		 (binOp happy_var_1 happy_var_2 happy_var_3
+	)}}}
+
+happyReduce_104 = happySpecReduce_1  35# happyReduction_104
+happyReduction_104 happy_x_1
+	 =  case happyOut54 happy_x_1 of { happy_var_1 -> 
+	happyIn50
+		 (mkEApp happy_var_1
+	)}
+
+happyReduce_105 = happySpecReduce_2  35# happyReduction_105
+happyReduction_105 happy_x_2
+	happy_x_1
+	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Op Minus) _)) -> 
+	case happyOut50 happy_x_2 of { happy_var_2 -> 
+	happyIn50
+		 (at (happy_var_1,happy_var_2) $ EApp (at happy_var_1 (EVar (mkUnqual (packIdent "negate")))) happy_var_2
+	)}}
+
+happyReduce_106 = happySpecReduce_2  35# happyReduction_106
+happyReduction_106 happy_x_2
+	happy_x_1
+	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Op Complement) _)) -> 
+	case happyOut50 happy_x_2 of { happy_var_2 -> 
+	happyIn50
+		 (at (happy_var_1,happy_var_2) $ EApp (at happy_var_1 (EVar (mkUnqual (packIdent "complement")))) happy_var_2
+	)}}
+
+happyReduce_107 = happySpecReduce_1  36# happyReduction_107
+happyReduction_107 happy_x_1
+	 =  case happyOut52 happy_x_1 of { happy_var_1 -> 
+	happyIn51
+		 (happy_var_1
+	)}
+
+happyReduce_108 = happySpecReduce_1  36# happyReduction_108
+happyReduction_108 happy_x_1
+	 =  case happyOutTok happy_x_1 of { (happy_var_1@(Located _ (Token (Op  Other{}   )  _))) -> 
+	happyIn51
+		 (let Token (Op (Other ns i)) _ = thing happy_var_1
+                                       in mkQual (mkModName ns) (packInfix i) A.<$ happy_var_1
+	)}
+
+happyReduce_109 = happySpecReduce_1  37# happyReduction_109
+happyReduction_109 happy_x_1
+	 =  case happyOutTok happy_x_1 of { (happy_var_1@(Located _ (Token (Op (Other [] _)) _))) -> 
+	happyIn52
+		 (let Token (Op (Other [] str)) _ = thing happy_var_1
+                                       in mkUnqual (packInfix str) A.<$ happy_var_1
+	)}
+
+happyReduce_110 = happySpecReduce_1  37# happyReduction_110
+happyReduction_110 happy_x_1
+	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Op Mul)   _)) -> 
+	happyIn52
+		 (Located happy_var_1 $ mkUnqual $ packInfix "*"
+	)}
+
+happyReduce_111 = happySpecReduce_1  37# happyReduction_111
+happyReduction_111 happy_x_1
+	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Op Plus)  _)) -> 
+	happyIn52
+		 (Located happy_var_1 $ mkUnqual $ packInfix "+"
+	)}
+
+happyReduce_112 = happySpecReduce_1  37# happyReduction_112
+happyReduction_112 happy_x_1
+	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Op Minus) _)) -> 
+	happyIn52
+		 (Located happy_var_1 $ mkUnqual $ packInfix "-"
+	)}
+
+happyReduce_113 = happySpecReduce_1  37# happyReduction_113
+happyReduction_113 happy_x_1
+	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Op Complement) _)) -> 
+	happyIn52
+		 (Located happy_var_1 $ mkUnqual $ packInfix "~"
+	)}
+
+happyReduce_114 = happySpecReduce_1  37# happyReduction_114
+happyReduction_114 happy_x_1
+	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Op Exp)   _)) -> 
+	happyIn52
+		 (Located happy_var_1 $ mkUnqual $ packInfix "^^"
+	)}
+
+happyReduce_115 = happySpecReduce_1  37# happyReduction_115
+happyReduction_115 happy_x_1
+	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Op Hash) _)) -> 
+	happyIn52
+		 (Located happy_var_1 $ mkUnqual $ packInfix "#"
+	)}
+
+happyReduce_116 = happySpecReduce_1  38# happyReduction_116
+happyReduction_116 happy_x_1
+	 =  case happyOut52 happy_x_1 of { happy_var_1 -> 
+	happyIn53
+		 ([happy_var_1]
+	)}
+
+happyReduce_117 = happySpecReduce_3  38# happyReduction_117
+happyReduction_117 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut53 happy_x_1 of { happy_var_1 -> 
+	case happyOut52 happy_x_3 of { happy_var_3 -> 
+	happyIn53
+		 (happy_var_3 : happy_var_1
+	)}}
+
+happyReduce_118 = happySpecReduce_1  39# happyReduction_118
+happyReduction_118 happy_x_1
+	 =  case happyOut55 happy_x_1 of { happy_var_1 -> 
+	happyIn54
+		 ([happy_var_1]
+	)}
+
+happyReduce_119 = happySpecReduce_2  39# happyReduction_119
+happyReduction_119 happy_x_2
+	happy_x_1
+	 =  case happyOut54 happy_x_1 of { happy_var_1 -> 
+	case happyOut55 happy_x_2 of { happy_var_2 -> 
+	happyIn54
+		 (happy_var_2 : happy_var_1
+	)}}
+
+happyReduce_120 = happySpecReduce_1  40# happyReduction_120
+happyReduction_120 happy_x_1
+	 =  case happyOut91 happy_x_1 of { happy_var_1 -> 
+	happyIn55
+		 (at happy_var_1 $ EVar (thing happy_var_1)
+	)}
+
+happyReduce_121 = happySpecReduce_1  40# happyReduction_121
+happyReduction_121 happy_x_1
+	 =  case happyOutTok happy_x_1 of { (happy_var_1@(Located _ (Token (Num   {}) _))) -> 
+	happyIn55
+		 (at happy_var_1 $ numLit (tokenType (thing happy_var_1))
+	)}
+
+happyReduce_122 = happySpecReduce_1  40# happyReduction_122
+happyReduction_122 happy_x_1
+	 =  case happyOutTok happy_x_1 of { (happy_var_1@(Located _ (Token (StrLit {}) _))) -> 
+	happyIn55
+		 (at happy_var_1 $ ELit $ ECString $ getStr happy_var_1
+	)}
+
+happyReduce_123 = happySpecReduce_1  40# happyReduction_123
+happyReduction_123 happy_x_1
+	 =  case happyOutTok happy_x_1 of { (happy_var_1@(Located _ (Token (ChrLit {}) _))) -> 
+	happyIn55
+		 (at happy_var_1 $ ELit $ ECNum (getNum happy_var_1) CharLit
+	)}
+
+happyReduce_124 = happySpecReduce_3  40# happyReduction_124
+happyReduction_124 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym ParenL  ) _)) -> 
+	case happyOut44 happy_x_2 of { happy_var_2 -> 
+	case happyOutTok happy_x_3 of { (Located happy_var_3 (Token (Sym ParenR  ) _)) -> 
+	happyIn55
+		 (at (happy_var_1,happy_var_3) $ EParens happy_var_2
+	)}}}
+
+happyReduce_125 = happySpecReduce_3  40# happyReduction_125
+happyReduction_125 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym ParenL  ) _)) -> 
+	case happyOut59 happy_x_2 of { happy_var_2 -> 
+	case happyOutTok happy_x_3 of { (Located happy_var_3 (Token (Sym ParenR  ) _)) -> 
+	happyIn55
+		 (at (happy_var_1,happy_var_3) $ ETuple (reverse happy_var_2)
+	)}}}
+
+happyReduce_126 = happySpecReduce_2  40# happyReduction_126
+happyReduction_126 happy_x_2
+	happy_x_1
+	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym ParenL  ) _)) -> 
+	case happyOutTok happy_x_2 of { (Located happy_var_2 (Token (Sym ParenR  ) _)) -> 
+	happyIn55
+		 (at (happy_var_1,happy_var_2) $ ETuple []
+	)}}
+
+happyReduce_127 = happySpecReduce_2  40# happyReduction_127
+happyReduction_127 happy_x_2
+	happy_x_1
+	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym CurlyL  ) _)) -> 
+	case happyOutTok happy_x_2 of { (Located happy_var_2 (Token (Sym CurlyR  ) _)) -> 
+	happyIn55
+		 (at (happy_var_1,happy_var_2) $ ERecord []
+	)}}
+
+happyReduce_128 = happySpecReduce_3  40# happyReduction_128
+happyReduction_128 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym CurlyL  ) _)) -> 
+	case happyOut61 happy_x_2 of { happy_var_2 -> 
+	case happyOutTok happy_x_3 of { (Located happy_var_3 (Token (Sym CurlyR  ) _)) -> 
+	happyIn55
+		 (at (happy_var_1,happy_var_3) $ ERecord (reverse happy_var_2)
+	)}}}
+
+happyReduce_129 = happySpecReduce_2  40# happyReduction_129
+happyReduction_129 happy_x_2
+	happy_x_1
+	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym BracketL) _)) -> 
+	case happyOutTok happy_x_2 of { (Located happy_var_2 (Token (Sym BracketR) _)) -> 
+	happyIn55
+		 (at (happy_var_1,happy_var_2) $ EList []
+	)}}
+
+happyReduce_130 = happySpecReduce_3  40# happyReduction_130
+happyReduction_130 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym BracketL) _)) -> 
+	case happyOut62 happy_x_2 of { happy_var_2 -> 
+	case happyOutTok happy_x_3 of { (Located happy_var_3 (Token (Sym BracketR) _)) -> 
+	happyIn55
+		 (at (happy_var_1,happy_var_3) happy_var_2
+	)}}}
+
+happyReduce_131 = happySpecReduce_2  40# happyReduction_131
+happyReduction_131 happy_x_2
+	happy_x_1
+	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym BackTick) _)) -> 
+	case happyOut93 happy_x_2 of { happy_var_2 -> 
+	happyIn55
+		 (at (happy_var_1,happy_var_2) $ ETypeVal happy_var_2
+	)}}
+
+happyReduce_132 = happySpecReduce_3  40# happyReduction_132
+happyReduction_132 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut55 happy_x_1 of { happy_var_1 -> 
+	case happyOut58 happy_x_3 of { happy_var_3 -> 
+	happyIn55
+		 (at (happy_var_1,happy_var_3) $ ESel happy_var_1 (thing happy_var_3)
+	)}}
+
+happyReduce_133 = happySpecReduce_3  40# happyReduction_133
+happyReduction_133 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym ParenL  ) _)) -> 
+	case happyOut51 happy_x_2 of { happy_var_2 -> 
+	case happyOutTok happy_x_3 of { (Located happy_var_3 (Token (Sym ParenR  ) _)) -> 
+	happyIn55
+		 (at (happy_var_1,happy_var_3) $ EVar $ thing happy_var_2
+	)}}}
+
+happyReduce_134 = happyMonadReduce 2# 40# happyReduction_134
+happyReduction_134 (happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym TriL    ) _)) -> 
+	case happyOutTok happy_x_2 of { (Located happy_var_2 (Token (Sym TriR    ) _)) -> 
+	( mkPoly (rComb happy_var_1 happy_var_2) [])}}
+	) (\r -> happyReturn (happyIn55 r))
+
+happyReduce_135 = happyMonadReduce 3# 40# happyReduction_135
+happyReduction_135 (happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym TriL    ) _)) -> 
+	case happyOut56 happy_x_2 of { happy_var_2 -> 
+	case happyOutTok happy_x_3 of { (Located happy_var_3 (Token (Sym TriR    ) _)) -> 
+	( mkPoly (rComb happy_var_1 happy_var_3) happy_var_2)}}}
+	) (\r -> happyReturn (happyIn55 r))
+
+happyReduce_136 = happySpecReduce_1  41# happyReduction_136
+happyReduction_136 happy_x_1
+	 =  case happyOut57 happy_x_1 of { happy_var_1 -> 
+	happyIn56
+		 ([happy_var_1]
+	)}
+
+happyReduce_137 = happySpecReduce_3  41# happyReduction_137
+happyReduction_137 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut56 happy_x_1 of { happy_var_1 -> 
+	case happyOut57 happy_x_3 of { happy_var_3 -> 
+	happyIn56
+		 (happy_var_3 : happy_var_1
+	)}}
+
+happyReduce_138 = happyMonadReduce 1# 42# happyReduction_138
+happyReduction_138 (happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { (happy_var_1@(Located _ (Token (Num   {}) _))) -> 
+	( polyTerm (srcRange happy_var_1) (getNum happy_var_1) 0)}
+	) (\r -> happyReturn (happyIn57 r))
+
+happyReduce_139 = happyMonadReduce 1# 42# happyReduction_139
+happyReduction_139 (happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (KW KW_x)       _)) -> 
+	( polyTerm happy_var_1 1 1)}
+	) (\r -> happyReturn (happyIn57 r))
+
+happyReduce_140 = happyMonadReduce 3# 42# happyReduction_140
+happyReduction_140 (happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (KW KW_x)       _)) -> 
+	case happyOutTok happy_x_3 of { (happy_var_3@(Located _ (Token (Num   {}) _))) -> 
+	( polyTerm (rComb happy_var_1 (srcRange happy_var_3))
+                                                            1 (getNum happy_var_3))}}
+	) (\r -> happyReturn (happyIn57 r))
+
+happyReduce_141 = happySpecReduce_1  43# happyReduction_141
+happyReduction_141 happy_x_1
+	 =  case happyOut88 happy_x_1 of { happy_var_1 -> 
+	happyIn58
+		 (fmap (`RecordSel` Nothing) happy_var_1
+	)}
+
+happyReduce_142 = happyMonadReduce 1# 43# happyReduction_142
+happyReduction_142 (happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { (happy_var_1@(Located _ (Token (Num   {}) _))) -> 
+	( mkTupleSel (srcRange happy_var_1) (getNum happy_var_1))}
+	) (\r -> happyReturn (happyIn58 r))
+
+happyReduce_143 = happySpecReduce_3  44# happyReduction_143
+happyReduction_143 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut44 happy_x_1 of { happy_var_1 -> 
+	case happyOut44 happy_x_3 of { happy_var_3 -> 
+	happyIn59
+		 ([ happy_var_3, happy_var_1]
+	)}}
+
+happyReduce_144 = happySpecReduce_3  44# happyReduction_144
+happyReduction_144 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut59 happy_x_1 of { happy_var_1 -> 
+	case happyOut44 happy_x_3 of { happy_var_3 -> 
+	happyIn59
+		 (happy_var_3 : happy_var_1
+	)}}
+
+happyReduce_145 = happySpecReduce_3  45# happyReduction_145
+happyReduction_145 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut88 happy_x_1 of { happy_var_1 -> 
+	case happyOut44 happy_x_3 of { happy_var_3 -> 
+	happyIn60
+		 (Named { name = happy_var_1, value = happy_var_3 }
+	)}}
+
+happyReduce_146 = happyReduce 4# 45# happyReduction_146
+happyReduction_146 (happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOut88 happy_x_1 of { happy_var_1 -> 
+	case happyOut39 happy_x_2 of { happy_var_2 -> 
+	case happyOut44 happy_x_4 of { happy_var_4 -> 
+	happyIn60
+		 (Named { name = happy_var_1, value = EFun (reverse happy_var_2) happy_var_4 }
+	) `HappyStk` happyRest}}}
+
+happyReduce_147 = happySpecReduce_1  46# happyReduction_147
+happyReduction_147 happy_x_1
+	 =  case happyOut60 happy_x_1 of { happy_var_1 -> 
+	happyIn61
+		 ([happy_var_1]
+	)}
+
+happyReduce_148 = happySpecReduce_3  46# happyReduction_148
+happyReduction_148 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut61 happy_x_1 of { happy_var_1 -> 
+	case happyOut60 happy_x_3 of { happy_var_3 -> 
+	happyIn61
+		 (happy_var_3 : happy_var_1
+	)}}
+
+happyReduce_149 = happySpecReduce_3  47# happyReduction_149
+happyReduction_149 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut44 happy_x_1 of { happy_var_1 -> 
+	case happyOut63 happy_x_3 of { happy_var_3 -> 
+	happyIn62
+		 (EComp happy_var_1 (reverse happy_var_3)
+	)}}
+
+happyReduce_150 = happySpecReduce_1  47# happyReduction_150
+happyReduction_150 happy_x_1
+	 =  case happyOut44 happy_x_1 of { happy_var_1 -> 
+	happyIn62
+		 (EList [happy_var_1]
+	)}
+
+happyReduce_151 = happySpecReduce_1  47# happyReduction_151
+happyReduction_151 happy_x_1
+	 =  case happyOut59 happy_x_1 of { happy_var_1 -> 
+	happyIn62
+		 (EList (reverse happy_var_1)
+	)}
+
+happyReduce_152 = happyMonadReduce 2# 47# happyReduction_152
+happyReduction_152 (happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOut44 happy_x_1 of { happy_var_1 -> 
+	case happyOutTok happy_x_2 of { (Located happy_var_2 (Token (Sym DotDot  ) _)) -> 
+	( eFromTo happy_var_2 happy_var_1 Nothing   Nothing)}}
+	) (\r -> happyReturn (happyIn62 r))
+
+happyReduce_153 = happyMonadReduce 3# 47# happyReduction_153
+happyReduction_153 (happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOut44 happy_x_1 of { happy_var_1 -> 
+	case happyOutTok happy_x_2 of { (Located happy_var_2 (Token (Sym DotDot  ) _)) -> 
+	case happyOut44 happy_x_3 of { happy_var_3 -> 
+	( eFromTo happy_var_2 happy_var_1 Nothing   (Just happy_var_3))}}}
+	) (\r -> happyReturn (happyIn62 r))
+
+happyReduce_154 = happyMonadReduce 4# 47# happyReduction_154
+happyReduction_154 (happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOut44 happy_x_1 of { happy_var_1 -> 
+	case happyOut44 happy_x_3 of { happy_var_3 -> 
+	case happyOutTok happy_x_4 of { (Located happy_var_4 (Token (Sym DotDot  ) _)) -> 
+	( eFromTo happy_var_4 happy_var_1 (Just happy_var_3) Nothing)}}}
+	) (\r -> happyReturn (happyIn62 r))
+
+happyReduce_155 = happyMonadReduce 5# 47# happyReduction_155
+happyReduction_155 (happy_x_5 `HappyStk`
+	happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOut44 happy_x_1 of { happy_var_1 -> 
+	case happyOut44 happy_x_3 of { happy_var_3 -> 
+	case happyOutTok happy_x_4 of { (Located happy_var_4 (Token (Sym DotDot  ) _)) -> 
+	case happyOut44 happy_x_5 of { happy_var_5 -> 
+	( eFromTo happy_var_4 happy_var_1 (Just happy_var_3) (Just happy_var_5))}}}}
+	) (\r -> happyReturn (happyIn62 r))
+
+happyReduce_156 = happySpecReduce_2  47# happyReduction_156
+happyReduction_156 happy_x_2
+	happy_x_1
+	 =  case happyOut44 happy_x_1 of { happy_var_1 -> 
+	happyIn62
+		 (EInfFrom happy_var_1 Nothing
+	)}
+
+happyReduce_157 = happyReduce 4# 47# happyReduction_157
+happyReduction_157 (happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOut44 happy_x_1 of { happy_var_1 -> 
+	case happyOut44 happy_x_3 of { happy_var_3 -> 
+	happyIn62
+		 (EInfFrom happy_var_1 (Just happy_var_3)
+	) `HappyStk` happyRest}}
+
+happyReduce_158 = happySpecReduce_1  48# happyReduction_158
+happyReduction_158 happy_x_1
+	 =  case happyOut64 happy_x_1 of { happy_var_1 -> 
+	happyIn63
+		 ([ reverse happy_var_1 ]
+	)}
+
+happyReduce_159 = happySpecReduce_3  48# happyReduction_159
+happyReduction_159 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut63 happy_x_1 of { happy_var_1 -> 
+	case happyOut64 happy_x_3 of { happy_var_3 -> 
+	happyIn63
+		 (reverse happy_var_3 : happy_var_1
+	)}}
+
+happyReduce_160 = happySpecReduce_1  49# happyReduction_160
+happyReduction_160 happy_x_1
+	 =  case happyOut65 happy_x_1 of { happy_var_1 -> 
+	happyIn64
+		 ([happy_var_1]
+	)}
+
+happyReduce_161 = happySpecReduce_3  49# happyReduction_161
+happyReduction_161 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut64 happy_x_1 of { happy_var_1 -> 
+	case happyOut65 happy_x_3 of { happy_var_3 -> 
+	happyIn64
+		 (happy_var_3 : happy_var_1
+	)}}
+
+happyReduce_162 = happySpecReduce_3  50# happyReduction_162
+happyReduction_162 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut66 happy_x_1 of { happy_var_1 -> 
+	case happyOut44 happy_x_3 of { happy_var_3 -> 
+	happyIn65
+		 (Match happy_var_1 happy_var_3
+	)}}
+
+happyReduce_163 = happySpecReduce_3  51# happyReduction_163
+happyReduction_163 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut67 happy_x_1 of { happy_var_1 -> 
+	case happyOut80 happy_x_3 of { happy_var_3 -> 
+	happyIn66
+		 (at (happy_var_1,happy_var_3) $ PTyped happy_var_1 happy_var_3
+	)}}
+
+happyReduce_164 = happySpecReduce_1  51# happyReduction_164
+happyReduction_164 happy_x_1
+	 =  case happyOut67 happy_x_1 of { happy_var_1 -> 
+	happyIn66
+		 (happy_var_1
+	)}
+
+happyReduce_165 = happySpecReduce_3  52# happyReduction_165
+happyReduction_165 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut67 happy_x_1 of { happy_var_1 -> 
+	case happyOut67 happy_x_3 of { happy_var_3 -> 
+	happyIn67
+		 (at (happy_var_1,happy_var_3) $ PSplit happy_var_1 happy_var_3
+	)}}
+
+happyReduce_166 = happySpecReduce_1  52# happyReduction_166
+happyReduction_166 happy_x_1
+	 =  case happyOut68 happy_x_1 of { happy_var_1 -> 
+	happyIn67
+		 (happy_var_1
+	)}
+
+happyReduce_167 = happySpecReduce_1  53# happyReduction_167
+happyReduction_167 happy_x_1
+	 =  case happyOut89 happy_x_1 of { happy_var_1 -> 
+	happyIn68
+		 (PVar happy_var_1
+	)}
+
+happyReduce_168 = happySpecReduce_1  53# happyReduction_168
+happyReduction_168 happy_x_1
+	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym Underscore ) _)) -> 
+	happyIn68
+		 (at happy_var_1       $ PWild
+	)}
+
+happyReduce_169 = happySpecReduce_2  53# happyReduction_169
+happyReduction_169 happy_x_2
+	happy_x_1
+	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym ParenL  ) _)) -> 
+	case happyOutTok happy_x_2 of { (Located happy_var_2 (Token (Sym ParenR  ) _)) -> 
+	happyIn68
+		 (at (happy_var_1,happy_var_2) $ PTuple []
+	)}}
+
+happyReduce_170 = happySpecReduce_3  53# happyReduction_170
+happyReduction_170 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym ParenL  ) _)) -> 
+	case happyOut66 happy_x_2 of { happy_var_2 -> 
+	case happyOutTok happy_x_3 of { (Located happy_var_3 (Token (Sym ParenR  ) _)) -> 
+	happyIn68
+		 (at (happy_var_1,happy_var_3)   happy_var_2
+	)}}}
+
+happyReduce_171 = happySpecReduce_3  53# happyReduction_171
+happyReduction_171 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym ParenL  ) _)) -> 
+	case happyOut69 happy_x_2 of { happy_var_2 -> 
+	case happyOutTok happy_x_3 of { (Located happy_var_3 (Token (Sym ParenR  ) _)) -> 
+	happyIn68
+		 (at (happy_var_1,happy_var_3) $ PTuple (reverse happy_var_2)
+	)}}}
+
+happyReduce_172 = happySpecReduce_2  53# happyReduction_172
+happyReduction_172 happy_x_2
+	happy_x_1
+	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym BracketL) _)) -> 
+	case happyOutTok happy_x_2 of { (Located happy_var_2 (Token (Sym BracketR) _)) -> 
+	happyIn68
+		 (at (happy_var_1,happy_var_2) $ PList []
+	)}}
+
+happyReduce_173 = happySpecReduce_3  53# happyReduction_173
+happyReduction_173 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym BracketL) _)) -> 
+	case happyOut66 happy_x_2 of { happy_var_2 -> 
+	case happyOutTok happy_x_3 of { (Located happy_var_3 (Token (Sym BracketR) _)) -> 
+	happyIn68
+		 (at (happy_var_1,happy_var_3) $ PList [happy_var_2]
+	)}}}
+
+happyReduce_174 = happySpecReduce_3  53# happyReduction_174
+happyReduction_174 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym BracketL) _)) -> 
+	case happyOut69 happy_x_2 of { happy_var_2 -> 
+	case happyOutTok happy_x_3 of { (Located happy_var_3 (Token (Sym BracketR) _)) -> 
+	happyIn68
+		 (at (happy_var_1,happy_var_3) $ PList (reverse happy_var_2)
+	)}}}
+
+happyReduce_175 = happySpecReduce_2  53# happyReduction_175
+happyReduction_175 happy_x_2
+	happy_x_1
+	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym CurlyL  ) _)) -> 
+	case happyOutTok happy_x_2 of { (Located happy_var_2 (Token (Sym CurlyR  ) _)) -> 
+	happyIn68
+		 (at (happy_var_1,happy_var_2) $ PRecord []
+	)}}
+
+happyReduce_176 = happySpecReduce_3  53# happyReduction_176
+happyReduction_176 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym CurlyL  ) _)) -> 
+	case happyOut71 happy_x_2 of { happy_var_2 -> 
+	case happyOutTok happy_x_3 of { (Located happy_var_3 (Token (Sym CurlyR  ) _)) -> 
+	happyIn68
+		 (at (happy_var_1,happy_var_3) $ PRecord (reverse happy_var_2)
+	)}}}
+
+happyReduce_177 = happySpecReduce_3  54# happyReduction_177
+happyReduction_177 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut66 happy_x_1 of { happy_var_1 -> 
+	case happyOut66 happy_x_3 of { happy_var_3 -> 
+	happyIn69
+		 ([happy_var_3, happy_var_1]
+	)}}
+
+happyReduce_178 = happySpecReduce_3  54# happyReduction_178
+happyReduction_178 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut69 happy_x_1 of { happy_var_1 -> 
+	case happyOut66 happy_x_3 of { happy_var_3 -> 
+	happyIn69
+		 (happy_var_3 : happy_var_1
+	)}}
+
+happyReduce_179 = happySpecReduce_3  55# happyReduction_179
+happyReduction_179 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut88 happy_x_1 of { happy_var_1 -> 
+	case happyOut66 happy_x_3 of { happy_var_3 -> 
+	happyIn70
+		 (Named { name = happy_var_1, value = happy_var_3 }
+	)}}
+
+happyReduce_180 = happySpecReduce_1  56# happyReduction_180
+happyReduction_180 happy_x_1
+	 =  case happyOut70 happy_x_1 of { happy_var_1 -> 
+	happyIn71
+		 ([happy_var_1]
+	)}
+
+happyReduce_181 = happySpecReduce_3  56# happyReduction_181
+happyReduction_181 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut71 happy_x_1 of { happy_var_1 -> 
+	case happyOut70 happy_x_3 of { happy_var_3 -> 
+	happyIn71
+		 (happy_var_3 : happy_var_1
+	)}}
+
+happyReduce_182 = happySpecReduce_1  57# happyReduction_182
+happyReduction_182 happy_x_1
+	 =  case happyOut80 happy_x_1 of { happy_var_1 -> 
+	happyIn72
+		 (at happy_var_1 $ mkSchema [] [] happy_var_1
+	)}
+
+happyReduce_183 = happySpecReduce_2  57# happyReduction_183
+happyReduction_183 happy_x_2
+	happy_x_1
+	 =  case happyOut73 happy_x_1 of { happy_var_1 -> 
+	case happyOut80 happy_x_2 of { happy_var_2 -> 
+	happyIn72
+		 (at (happy_var_1,happy_var_2) $ mkSchema (thing happy_var_1) [] happy_var_2
+	)}}
+
+happyReduce_184 = happySpecReduce_2  57# happyReduction_184
+happyReduction_184 happy_x_2
+	happy_x_1
+	 =  case happyOut74 happy_x_1 of { happy_var_1 -> 
+	case happyOut80 happy_x_2 of { happy_var_2 -> 
+	happyIn72
+		 (at (happy_var_1,happy_var_2) $ mkSchema [] (thing happy_var_1) happy_var_2
+	)}}
+
+happyReduce_185 = happySpecReduce_3  57# happyReduction_185
+happyReduction_185 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut73 happy_x_1 of { happy_var_1 -> 
+	case happyOut74 happy_x_2 of { happy_var_2 -> 
+	case happyOut80 happy_x_3 of { happy_var_3 -> 
+	happyIn72
+		 (at (happy_var_1,happy_var_3) $ mkSchema (thing happy_var_1)
+                                                          (thing happy_var_2) happy_var_3
+	)}}}
+
+happyReduce_186 = happySpecReduce_2  58# happyReduction_186
+happyReduction_186 happy_x_2
+	happy_x_1
+	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym CurlyL  ) _)) -> 
+	case happyOutTok happy_x_2 of { (Located happy_var_2 (Token (Sym CurlyR  ) _)) -> 
+	happyIn73
+		 (Located (rComb happy_var_1 happy_var_2) []
+	)}}
+
+happyReduce_187 = happySpecReduce_3  58# happyReduction_187
+happyReduction_187 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym CurlyL  ) _)) -> 
+	case happyOut77 happy_x_2 of { happy_var_2 -> 
+	case happyOutTok happy_x_3 of { (Located happy_var_3 (Token (Sym CurlyR  ) _)) -> 
+	happyIn73
+		 (Located (rComb happy_var_1 happy_var_3) (reverse happy_var_2)
+	)}}}
+
+happyReduce_188 = happyMonadReduce 2# 59# happyReduction_188
+happyReduction_188 (happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOut80 happy_x_1 of { happy_var_1 -> 
+	case happyOutTok happy_x_2 of { (Located happy_var_2 (Token (Sym FatArrR ) _)) -> 
+	( fmap (\x -> at (x,happy_var_2) x) (mkProp happy_var_1))}}
+	) (\r -> happyReturn (happyIn74 r))
+
+happyReduce_189 = happySpecReduce_1  60# happyReduction_189
+happyReduction_189 happy_x_1
+	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Op Hash) _)) -> 
+	happyIn75
+		 (Located happy_var_1 KNum
+	)}
+
+happyReduce_190 = happySpecReduce_1  60# happyReduction_190
+happyReduction_190 happy_x_1
+	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Op Mul)   _)) -> 
+	happyIn75
+		 (Located happy_var_1 KType
+	)}
+
+happyReduce_191 = happyMonadReduce 1# 61# happyReduction_191
+happyReduction_191 (happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOut88 happy_x_1 of { happy_var_1 -> 
+	( mkTParam happy_var_1 Nothing)}
+	) (\r -> happyReturn (happyIn76 r))
+
+happyReduce_192 = happyMonadReduce 3# 61# happyReduction_192
+happyReduction_192 (happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOut88 happy_x_1 of { happy_var_1 -> 
+	case happyOut75 happy_x_3 of { happy_var_3 -> 
+	( mkTParam (at (happy_var_1,happy_var_3) happy_var_1) (Just (thing happy_var_3)))}}
+	) (\r -> happyReturn (happyIn76 r))
+
+happyReduce_193 = happySpecReduce_1  62# happyReduction_193
+happyReduction_193 happy_x_1
+	 =  case happyOut76 happy_x_1 of { happy_var_1 -> 
+	happyIn77
+		 ([happy_var_1]
+	)}
+
+happyReduce_194 = happySpecReduce_3  62# happyReduction_194
+happyReduction_194 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut77 happy_x_1 of { happy_var_1 -> 
+	case happyOut76 happy_x_3 of { happy_var_3 -> 
+	happyIn77
+		 (happy_var_3 : happy_var_1
+	)}}
+
+happyReduce_195 = happyMonadReduce 1# 63# happyReduction_195
+happyReduction_195 (happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOut88 happy_x_1 of { happy_var_1 -> 
+	( mkTParam happy_var_1 Nothing)}
+	) (\r -> happyReturn (happyIn78 r))
+
+happyReduce_196 = happyMonadReduce 5# 63# happyReduction_196
+happyReduction_196 (happy_x_5 `HappyStk`
+	happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym ParenL  ) _)) -> 
+	case happyOut88 happy_x_2 of { happy_var_2 -> 
+	case happyOut75 happy_x_4 of { happy_var_4 -> 
+	case happyOutTok happy_x_5 of { (Located happy_var_5 (Token (Sym ParenR  ) _)) -> 
+	( mkTParam (at (happy_var_1,happy_var_5) happy_var_2) (Just (thing happy_var_4)))}}}}
+	) (\r -> happyReturn (happyIn78 r))
+
+happyReduce_197 = happySpecReduce_1  64# happyReduction_197
+happyReduction_197 happy_x_1
+	 =  case happyOut78 happy_x_1 of { happy_var_1 -> 
+	happyIn79
+		 ([happy_var_1]
+	)}
+
+happyReduce_198 = happySpecReduce_2  64# happyReduction_198
+happyReduction_198 happy_x_2
+	happy_x_1
+	 =  case happyOut79 happy_x_1 of { happy_var_1 -> 
+	case happyOut78 happy_x_2 of { happy_var_2 -> 
+	happyIn79
+		 (happy_var_2 : happy_var_1
+	)}}
+
+happyReduce_199 = happySpecReduce_3  65# happyReduction_199
+happyReduction_199 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut81 happy_x_1 of { happy_var_1 -> 
+	case happyOut80 happy_x_3 of { happy_var_3 -> 
+	happyIn80
+		 (at (happy_var_1,happy_var_3) $ TFun happy_var_1 happy_var_3
+	)}}
+
+happyReduce_200 = happySpecReduce_3  65# happyReduction_200
+happyReduction_200 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut80 happy_x_1 of { happy_var_1 -> 
+	case happyOut52 happy_x_2 of { happy_var_2 -> 
+	case happyOut81 happy_x_3 of { happy_var_3 -> 
+	happyIn80
+		 (at (happy_var_1,happy_var_3) $ TInfix happy_var_1 happy_var_2 defaultFixity happy_var_3
+	)}}}
+
+happyReduce_201 = happySpecReduce_1  65# happyReduction_201
+happyReduction_201 happy_x_1
+	 =  case happyOut81 happy_x_1 of { happy_var_1 -> 
+	happyIn80
+		 (happy_var_1
+	)}
+
+happyReduce_202 = happySpecReduce_2  66# happyReduction_202
+happyReduction_202 happy_x_2
+	happy_x_1
+	 =  case happyOut84 happy_x_1 of { happy_var_1 -> 
+	case happyOut82 happy_x_2 of { happy_var_2 -> 
+	happyIn81
+		 (at (happy_var_1,happy_var_2) $ foldr TSeq happy_var_2 (reverse (thing happy_var_1))
+	)}}
+
+happyReduce_203 = happySpecReduce_2  66# happyReduction_203
+happyReduction_203 happy_x_2
+	happy_x_1
+	 =  case happyOut91 happy_x_1 of { happy_var_1 -> 
+	case happyOut83 happy_x_2 of { happy_var_2 -> 
+	happyIn81
+		 (at (happy_var_1,head happy_var_2)
+                                     $ TUser (thing happy_var_1) (reverse happy_var_2)
+	)}}
+
+happyReduce_204 = happySpecReduce_1  66# happyReduction_204
+happyReduction_204 happy_x_1
+	 =  case happyOut82 happy_x_1 of { happy_var_1 -> 
+	happyIn81
+		 (happy_var_1
+	)}
+
+happyReduce_205 = happySpecReduce_1  67# happyReduction_205
+happyReduction_205 happy_x_1
+	 =  case happyOut91 happy_x_1 of { happy_var_1 -> 
+	happyIn82
+		 (at happy_var_1 $ TUser (thing happy_var_1) []
+	)}
+
+happyReduce_206 = happySpecReduce_1  67# happyReduction_206
+happyReduction_206 happy_x_1
+	 =  case happyOutTok happy_x_1 of { (happy_var_1@(Located _ (Token (Num   {}) _))) -> 
+	happyIn82
+		 (at happy_var_1 $ TNum  (getNum happy_var_1)
+	)}
+
+happyReduce_207 = happySpecReduce_1  67# happyReduction_207
+happyReduction_207 happy_x_1
+	 =  case happyOutTok happy_x_1 of { (happy_var_1@(Located _ (Token (ChrLit {}) _))) -> 
+	happyIn82
+		 (at happy_var_1 $ TChar (toEnum $ fromInteger
+                                                          $ getNum happy_var_1)
+	)}
+
+happyReduce_208 = happySpecReduce_3  67# happyReduction_208
+happyReduction_208 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym BracketL) _)) -> 
+	case happyOut80 happy_x_2 of { happy_var_2 -> 
+	case happyOutTok happy_x_3 of { (Located happy_var_3 (Token (Sym BracketR) _)) -> 
+	happyIn82
+		 (at (happy_var_1,happy_var_3) $ TSeq happy_var_2 TBit
+	)}}}
+
+happyReduce_209 = happySpecReduce_3  67# happyReduction_209
+happyReduction_209 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym ParenL  ) _)) -> 
+	case happyOut80 happy_x_2 of { happy_var_2 -> 
+	case happyOutTok happy_x_3 of { (Located happy_var_3 (Token (Sym ParenR  ) _)) -> 
+	happyIn82
+		 (at (happy_var_1,happy_var_3) $ TParens happy_var_2
+	)}}}
+
+happyReduce_210 = happySpecReduce_2  67# happyReduction_210
+happyReduction_210 happy_x_2
+	happy_x_1
+	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym ParenL  ) _)) -> 
+	case happyOutTok happy_x_2 of { (Located happy_var_2 (Token (Sym ParenR  ) _)) -> 
+	happyIn82
+		 (at (happy_var_1,happy_var_2) $ TTuple []
+	)}}
+
+happyReduce_211 = happySpecReduce_3  67# happyReduction_211
+happyReduction_211 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym ParenL  ) _)) -> 
+	case happyOut85 happy_x_2 of { happy_var_2 -> 
+	case happyOutTok happy_x_3 of { (Located happy_var_3 (Token (Sym ParenR  ) _)) -> 
+	happyIn82
+		 (at (happy_var_1,happy_var_3) $ TTuple  (reverse happy_var_2)
+	)}}}
+
+happyReduce_212 = happySpecReduce_2  67# happyReduction_212
+happyReduction_212 happy_x_2
+	happy_x_1
+	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym CurlyL  ) _)) -> 
+	case happyOutTok happy_x_2 of { (Located happy_var_2 (Token (Sym CurlyR  ) _)) -> 
+	happyIn82
+		 (at (happy_var_1,happy_var_2) $ TRecord []
+	)}}
+
+happyReduce_213 = happySpecReduce_3  67# happyReduction_213
+happyReduction_213 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym CurlyL  ) _)) -> 
+	case happyOut87 happy_x_2 of { happy_var_2 -> 
+	case happyOutTok happy_x_3 of { (Located happy_var_3 (Token (Sym CurlyR  ) _)) -> 
+	happyIn82
+		 (at (happy_var_1,happy_var_3) $ TRecord (reverse happy_var_2)
+	)}}}
+
+happyReduce_214 = happySpecReduce_1  67# happyReduction_214
+happyReduction_214 happy_x_1
+	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym Underscore ) _)) -> 
+	happyIn82
+		 (at happy_var_1 TWild
+	)}
+
+happyReduce_215 = happySpecReduce_1  68# happyReduction_215
+happyReduction_215 happy_x_1
+	 =  case happyOut82 happy_x_1 of { happy_var_1 -> 
+	happyIn83
+		 ([ happy_var_1 ]
+	)}
+
+happyReduce_216 = happySpecReduce_2  68# happyReduction_216
+happyReduction_216 happy_x_2
+	happy_x_1
+	 =  case happyOut83 happy_x_1 of { happy_var_1 -> 
+	case happyOut82 happy_x_2 of { happy_var_2 -> 
+	happyIn83
+		 (happy_var_2 : happy_var_1
+	)}}
+
+happyReduce_217 = happySpecReduce_3  69# happyReduction_217
+happyReduction_217 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym BracketL) _)) -> 
+	case happyOut80 happy_x_2 of { happy_var_2 -> 
+	case happyOutTok happy_x_3 of { (Located happy_var_3 (Token (Sym BracketR) _)) -> 
+	happyIn84
+		 (Located (rComb happy_var_1 happy_var_3) [ happy_var_2 ]
+	)}}}
+
+happyReduce_218 = happyReduce 4# 69# happyReduction_218
+happyReduction_218 (happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOut84 happy_x_1 of { happy_var_1 -> 
+	case happyOut80 happy_x_3 of { happy_var_3 -> 
+	case happyOutTok happy_x_4 of { (Located happy_var_4 (Token (Sym BracketR) _)) -> 
+	happyIn84
+		 (at (happy_var_1,happy_var_4) (fmap (happy_var_3 :) happy_var_1)
+	) `HappyStk` happyRest}}}
+
+happyReduce_219 = happySpecReduce_3  70# happyReduction_219
+happyReduction_219 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut80 happy_x_1 of { happy_var_1 -> 
+	case happyOut80 happy_x_3 of { happy_var_3 -> 
+	happyIn85
+		 ([ happy_var_3, happy_var_1]
+	)}}
+
+happyReduce_220 = happySpecReduce_3  70# happyReduction_220
+happyReduction_220 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut85 happy_x_1 of { happy_var_1 -> 
+	case happyOut80 happy_x_3 of { happy_var_3 -> 
+	happyIn85
+		 (happy_var_3 : happy_var_1
+	)}}
+
+happyReduce_221 = happySpecReduce_3  71# happyReduction_221
+happyReduction_221 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut88 happy_x_1 of { happy_var_1 -> 
+	case happyOut80 happy_x_3 of { happy_var_3 -> 
+	happyIn86
+		 (Named { name = happy_var_1, value = happy_var_3 }
+	)}}
+
+happyReduce_222 = happySpecReduce_1  72# happyReduction_222
+happyReduction_222 happy_x_1
+	 =  case happyOut86 happy_x_1 of { happy_var_1 -> 
+	happyIn87
+		 ([happy_var_1]
+	)}
+
+happyReduce_223 = happySpecReduce_3  72# happyReduction_223
+happyReduction_223 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut87 happy_x_1 of { happy_var_1 -> 
+	case happyOut86 happy_x_3 of { happy_var_3 -> 
+	happyIn87
+		 (happy_var_3 : happy_var_1
+	)}}
+
+happyReduce_224 = happySpecReduce_1  73# happyReduction_224
+happyReduction_224 happy_x_1
+	 =  case happyOutTok happy_x_1 of { (happy_var_1@(Located _ (Token (Ident [] _) _))) -> 
+	happyIn88
+		 (let Token (Ident _ str) _ = thing happy_var_1
+                         in happy_var_1 { thing = packIdent str }
+	)}
+
+happyReduce_225 = happySpecReduce_1  73# happyReduction_225
+happyReduction_225 happy_x_1
+	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (KW KW_x)       _)) -> 
+	happyIn88
+		 (Located { srcRange = happy_var_1, thing = packIdent "x" }
+	)}
+
+happyReduce_226 = happySpecReduce_1  73# happyReduction_226
+happyReduction_226 happy_x_1
+	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (KW KW_private)   _)) -> 
+	happyIn88
+		 (Located { srcRange = happy_var_1, thing = packIdent "private" }
+	)}
+
+happyReduce_227 = happySpecReduce_1  73# happyReduction_227
+happyReduction_227 happy_x_1
+	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (KW KW_as)        _)) -> 
+	happyIn88
+		 (Located { srcRange = happy_var_1, thing = packIdent "as" }
+	)}
+
+happyReduce_228 = happySpecReduce_1  73# happyReduction_228
+happyReduction_228 happy_x_1
+	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (KW KW_hiding)    _)) -> 
+	happyIn88
+		 (Located { srcRange = happy_var_1, thing = packIdent "hiding" }
+	)}
+
+happyReduce_229 = happySpecReduce_1  74# happyReduction_229
+happyReduction_229 happy_x_1
+	 =  case happyOut88 happy_x_1 of { happy_var_1 -> 
+	happyIn89
+		 (fmap mkUnqual happy_var_1
+	)}
+
+happyReduce_230 = happySpecReduce_1  75# happyReduction_230
+happyReduction_230 happy_x_1
+	 =  case happyOut88 happy_x_1 of { happy_var_1 -> 
+	happyIn90
+		 (fmap identText happy_var_1
+	)}
+
+happyReduce_231 = happySpecReduce_1  75# happyReduction_231
+happyReduction_231 happy_x_1
+	 =  case happyOutTok happy_x_1 of { (happy_var_1@(Located _ (Token  Ident{}     _))) -> 
+	happyIn90
+		 (let Token (Ident ns i) _ = thing happy_var_1
+                                     in mkModName (ns ++ [i]) A.<$ happy_var_1
+	)}
+
+happyReduce_232 = happySpecReduce_1  76# happyReduction_232
+happyReduction_232 happy_x_1
+	 =  case happyOut89 happy_x_1 of { happy_var_1 -> 
+	happyIn91
+		 (happy_var_1
+	)}
+
+happyReduce_233 = happySpecReduce_1  76# happyReduction_233
+happyReduction_233 happy_x_1
+	 =  case happyOutTok happy_x_1 of { (happy_var_1@(Located _ (Token  Ident{}     _))) -> 
+	happyIn91
+		 (let Token (Ident ns i) _ = thing happy_var_1
+                                     in mkQual (mkModName ns) (packIdent i) A.<$ happy_var_1
+	)}
+
+happyReduce_234 = happySpecReduce_1  77# happyReduction_234
+happyReduction_234 happy_x_1
+	 =  case happyOut91 happy_x_1 of { happy_var_1 -> 
+	happyIn92
+		 (happy_var_1
+	)}
+
+happyReduce_235 = happySpecReduce_1  77# happyReduction_235
+happyReduction_235 happy_x_1
+	 =  case happyOut51 happy_x_1 of { happy_var_1 -> 
+	happyIn92
+		 (happy_var_1
+	)}
+
+happyReduce_236 = happySpecReduce_3  77# happyReduction_236
+happyReduction_236 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut51 happy_x_2 of { happy_var_2 -> 
+	happyIn92
+		 (happy_var_2
+	)}
+
+happyReduce_237 = happySpecReduce_1  78# happyReduction_237
+happyReduction_237 happy_x_1
+	 =  case happyOut91 happy_x_1 of { happy_var_1 -> 
+	happyIn93
+		 (at happy_var_1 $ TUser (thing happy_var_1) []
+	)}
+
+happyReduce_238 = happySpecReduce_1  78# happyReduction_238
+happyReduction_238 happy_x_1
+	 =  case happyOutTok happy_x_1 of { (happy_var_1@(Located _ (Token (Num   {}) _))) -> 
+	happyIn93
+		 (at happy_var_1 $ TNum  (getNum happy_var_1)
+	)}
+
+happyReduce_239 = happyMonadReduce 3# 78# happyReduction_239
+happyReduction_239 (happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym ParenL  ) _)) -> 
+	case happyOut80 happy_x_2 of { happy_var_2 -> 
+	case happyOutTok happy_x_3 of { (Located happy_var_3 (Token (Sym ParenR  ) _)) -> 
+	( validDemotedType (rComb happy_var_1 happy_var_3) happy_var_2)}}}
+	) (\r -> happyReturn (happyIn93 r))
+
+happyReduce_240 = happySpecReduce_2  78# happyReduction_240
+happyReduction_240 happy_x_2
+	happy_x_1
+	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym CurlyL  ) _)) -> 
+	case happyOutTok happy_x_2 of { (Located happy_var_2 (Token (Sym CurlyR  ) _)) -> 
+	happyIn93
+		 (at (happy_var_1,happy_var_2) (TRecord [])
+	)}}
+
+happyReduce_241 = happySpecReduce_3  78# happyReduction_241
+happyReduction_241 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym CurlyL  ) _)) -> 
+	case happyOut95 happy_x_2 of { happy_var_2 -> 
+	case happyOutTok happy_x_3 of { (Located happy_var_3 (Token (Sym CurlyR  ) _)) -> 
+	happyIn93
+		 (at (happy_var_1,happy_var_3) (TRecord (reverse happy_var_2))
+	)}}}
+
+happyReduce_242 = happySpecReduce_3  78# happyReduction_242
+happyReduction_242 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym CurlyL  ) _)) -> 
+	case happyOut80 happy_x_2 of { happy_var_2 -> 
+	case happyOutTok happy_x_3 of { (Located happy_var_3 (Token (Sym CurlyR  ) _)) -> 
+	happyIn93
+		 (anonRecord (getLoc (happy_var_1,happy_var_3)) [happy_var_2]
+	)}}}
+
+happyReduce_243 = happySpecReduce_3  78# happyReduction_243
+happyReduction_243 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOutTok happy_x_1 of { (Located happy_var_1 (Token (Sym CurlyL  ) _)) -> 
+	case happyOut85 happy_x_2 of { happy_var_2 -> 
+	case happyOutTok happy_x_3 of { (Located happy_var_3 (Token (Sym CurlyR  ) _)) -> 
+	happyIn93
+		 (anonRecord (getLoc (happy_var_1,happy_var_3)) (reverse happy_var_2)
+	)}}}
+
+happyReduce_244 = happySpecReduce_3  79# happyReduction_244
+happyReduction_244 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut88 happy_x_1 of { happy_var_1 -> 
+	case happyOut80 happy_x_3 of { happy_var_3 -> 
+	happyIn94
+		 (Named { name = happy_var_1, value = happy_var_3 }
+	)}}
+
+happyReduce_245 = happySpecReduce_1  80# happyReduction_245
+happyReduction_245 happy_x_1
+	 =  case happyOut94 happy_x_1 of { happy_var_1 -> 
+	happyIn95
+		 ([happy_var_1]
+	)}
+
+happyReduce_246 = happySpecReduce_3  80# happyReduction_246
+happyReduction_246 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut95 happy_x_1 of { happy_var_1 -> 
+	case happyOut94 happy_x_3 of { happy_var_3 -> 
+	happyIn95
+		 (happy_var_3 : happy_var_1
+	)}}
+
+happyNewToken action sts stk
+	= lexerP(\tk -> 
+	let cont i = happyDoAction i tk action sts stk in
+	case tk of {
+	Located _ (Token EOF _) -> happyDoAction 59# tk action sts stk;
+	happy_dollar_dollar@(Located _ (Token (Num   {}) _)) -> cont 1#;
+	happy_dollar_dollar@(Located _ (Token (StrLit {}) _)) -> cont 2#;
+	happy_dollar_dollar@(Located _ (Token (ChrLit {}) _)) -> cont 3#;
+	happy_dollar_dollar@(Located _ (Token (Ident [] _) _)) -> cont 4#;
+	happy_dollar_dollar@(Located _ (Token  Ident{}     _)) -> cont 5#;
+	Located happy_dollar_dollar (Token (KW KW_include)   _) -> cont 6#;
+	Located happy_dollar_dollar (Token (KW KW_import)    _) -> cont 7#;
+	Located happy_dollar_dollar (Token (KW KW_as)        _) -> cont 8#;
+	Located happy_dollar_dollar (Token (KW KW_hiding)    _) -> cont 9#;
+	Located happy_dollar_dollar (Token (KW KW_private)   _) -> cont 10#;
+	Located happy_dollar_dollar (Token (KW KW_property)  _) -> cont 11#;
+	Located happy_dollar_dollar (Token (KW KW_infix)     _) -> cont 12#;
+	Located happy_dollar_dollar (Token (KW KW_infixl)    _) -> cont 13#;
+	Located happy_dollar_dollar (Token (KW KW_infixr)    _) -> cont 14#;
+	Located happy_dollar_dollar (Token (KW KW_type   ) _) -> cont 15#;
+	Located happy_dollar_dollar (Token (KW KW_newtype) _) -> cont 16#;
+	Located happy_dollar_dollar (Token (KW KW_module ) _) -> cont 17#;
+	Located happy_dollar_dollar (Token (KW KW_where  ) _) -> cont 18#;
+	Located happy_dollar_dollar (Token (KW KW_let    ) _) -> cont 19#;
+	Located happy_dollar_dollar (Token (KW KW_if     ) _) -> cont 20#;
+	Located happy_dollar_dollar (Token (KW KW_then   ) _) -> cont 21#;
+	Located happy_dollar_dollar (Token (KW KW_else   ) _) -> cont 22#;
+	Located happy_dollar_dollar (Token (KW KW_x)       _) -> cont 23#;
+	Located happy_dollar_dollar (Token (KW KW_primitive) _) -> cont 24#;
+	Located happy_dollar_dollar (Token (Sym BracketL) _) -> cont 25#;
+	Located happy_dollar_dollar (Token (Sym BracketR) _) -> cont 26#;
+	Located happy_dollar_dollar (Token (Sym ArrL    ) _) -> cont 27#;
+	Located happy_dollar_dollar (Token (Sym DotDot  ) _) -> cont 28#;
+	Located happy_dollar_dollar (Token (Sym DotDotDot) _) -> cont 29#;
+	Located happy_dollar_dollar (Token (Sym Bar     ) _) -> cont 30#;
+	Located happy_dollar_dollar (Token (Sym ParenL  ) _) -> cont 31#;
+	Located happy_dollar_dollar (Token (Sym ParenR  ) _) -> cont 32#;
+	Located happy_dollar_dollar (Token (Sym Comma   ) _) -> cont 33#;
+	Located happy_dollar_dollar (Token (Sym Semi    ) _) -> cont 34#;
+	Located happy_dollar_dollar (Token (Sym Dot     ) _) -> cont 35#;
+	Located happy_dollar_dollar (Token (Sym CurlyL  ) _) -> cont 36#;
+	Located happy_dollar_dollar (Token (Sym CurlyR  ) _) -> cont 37#;
+	Located happy_dollar_dollar (Token (Sym TriL    ) _) -> cont 38#;
+	Located happy_dollar_dollar (Token (Sym TriR    ) _) -> cont 39#;
+	Located happy_dollar_dollar (Token (Sym EqDef   ) _) -> cont 40#;
+	Located happy_dollar_dollar (Token (Sym BackTick) _) -> cont 41#;
+	Located happy_dollar_dollar (Token (Sym Colon   ) _) -> cont 42#;
+	Located happy_dollar_dollar (Token (Sym ArrR    ) _) -> cont 43#;
+	Located happy_dollar_dollar (Token (Sym FatArrR ) _) -> cont 44#;
+	Located happy_dollar_dollar (Token (Sym Lambda  ) _) -> cont 45#;
+	Located happy_dollar_dollar (Token (Sym Underscore ) _) -> cont 46#;
+	Located happy_dollar_dollar (Token (Virt VCurlyL)  _) -> cont 47#;
+	Located happy_dollar_dollar (Token (Virt VCurlyR)  _) -> cont 48#;
+	Located happy_dollar_dollar (Token (Virt VSemi)    _) -> cont 49#;
+	Located happy_dollar_dollar (Token (Op Plus)  _) -> cont 50#;
+	Located happy_dollar_dollar (Token (Op Mul)   _) -> cont 51#;
+	Located happy_dollar_dollar (Token (Op Exp)   _) -> cont 52#;
+	Located happy_dollar_dollar (Token (Op Minus) _) -> cont 53#;
+	Located happy_dollar_dollar (Token (Op Complement) _) -> cont 54#;
+	Located happy_dollar_dollar (Token (Op Hash) _) -> cont 55#;
+	happy_dollar_dollar@(Located _ (Token (Op (Other [] _)) _)) -> cont 56#;
+	happy_dollar_dollar@(Located _ (Token (Op  Other{}   )  _)) -> cont 57#;
+	happy_dollar_dollar@(Located _ (Token (White DocStr) _)) -> cont 58#;
+	_ -> happyError' tk
+	})
+
+happyError_ 59# tk = happyError' tk
+happyError_ _ tk = happyError' tk
+
+happyThen :: () => ParseM a -> (a -> ParseM b) -> ParseM b
+happyThen = (>>=)
+happyReturn :: () => a -> ParseM a
+happyReturn = (return)
+happyThen1 = happyThen
+happyReturn1 :: () => a -> ParseM a
+happyReturn1 = happyReturn
+happyError' :: () => (Located Token) -> ParseM a
+happyError' tk = (\token -> happyError) tk
+
+vmodule = happySomeParser where
+  happySomeParser = happyThen (happyParse 0#) (\x -> happyReturn (happyOut15 x))
+
+program = happySomeParser where
+  happySomeParser = happyThen (happyParse 1#) (\x -> happyReturn (happyOut23 x))
+
+programLayout = happySomeParser where
+  happySomeParser = happyThen (happyParse 2#) (\x -> happyReturn (happyOut24 x))
+
+expr = happySomeParser where
+  happySomeParser = happyThen (happyParse 3#) (\x -> happyReturn (happyOut44 x))
+
+decl = happySomeParser where
+  happySomeParser = happyThen (happyParse 4#) (\x -> happyReturn (happyOut33 x))
+
+decls = happySomeParser where
+  happySomeParser = happyThen (happyParse 5#) (\x -> happyReturn (happyOut40 x))
+
+declsLayout = happySomeParser where
+  happySomeParser = happyThen (happyParse 6#) (\x -> happyReturn (happyOut42 x))
+
+letDecl = happySomeParser where
+  happySomeParser = happyThen (happyParse 7#) (\x -> happyReturn (happyOut34 x))
+
+repl = happySomeParser where
+  happySomeParser = happyThen (happyParse 8#) (\x -> happyReturn (happyOut43 x))
+
+schema = happySomeParser where
+  happySomeParser = happyThen (happyParse 9#) (\x -> happyReturn (happyOut72 x))
+
+modName = happySomeParser where
+  happySomeParser = happyThen (happyParse 10#) (\x -> happyReturn (happyOut90 x))
+
+helpName = happySomeParser where
+  happySomeParser = happyThen (happyParse 11#) (\x -> happyReturn (happyOut92 x))
+
+happySeq = happyDontSeq
+
+
+parseModName :: String -> Maybe ModName
+parseModName txt =
+  case parseString defaultConfig { cfgModuleScope = False } modName txt of
+    Right a -> Just (thing a)
+    Left _  -> Nothing
+
+parseHelpName :: String -> Maybe PName
+parseHelpName txt =
+  case parseString defaultConfig { cfgModuleScope = False } helpName txt of
+    Right a -> Just (thing a)
+    Left _  -> Nothing
+
+addImplicitIncludes :: Config -> Program PName -> Program PName
+addImplicitIncludes cfg (Program ds) =
+  Program $ map path (cfgAutoInclude cfg) ++ ds
+  where path p = Include Located { srcRange = rng, thing = p }
+        rng    = Range { source = cfgSource cfg, from = start, to = start }
+
+
+parseProgramWith :: Config -> Text -> Either ParseError (Program PName)
+parseProgramWith cfg s = case res s of
+                          Left err -> Left err
+                          Right a  -> Right (addImplicitIncludes cfg a)
+  where
+  res = parse cfg $ case cfgLayout cfg of
+                      Layout   -> programLayout
+                      NoLayout -> program
+
+parseModule :: Config -> Text -> Either ParseError (Module PName)
+parseModule cfg = parse cfg { cfgModuleScope = True } vmodule
+
+parseProgram :: Layout -> Text -> Either ParseError (Program PName)
+parseProgram l = parseProgramWith defaultConfig { cfgLayout = l }
+
+parseExprWith :: Config -> Text -> Either ParseError (Expr PName)
+parseExprWith cfg = parse cfg { cfgModuleScope = False } expr
+
+parseExpr :: Text -> Either ParseError (Expr PName)
+parseExpr = parseExprWith defaultConfig
+
+parseDeclWith :: Config -> Text -> Either ParseError (Decl PName)
+parseDeclWith cfg = parse cfg { cfgModuleScope = False } decl
+
+parseDecl :: Text -> Either ParseError (Decl PName)
+parseDecl = parseDeclWith defaultConfig
+
+parseDeclsWith :: Config -> Text -> Either ParseError [Decl PName]
+parseDeclsWith cfg = parse cfg { cfgModuleScope = ms } decls'
+  where (ms, decls') = case cfgLayout cfg of
+                         Layout   -> (True, declsLayout)
+                         NoLayout -> (False, decls)
+
+parseDecls :: Text -> Either ParseError [Decl PName]
+parseDecls = parseDeclsWith defaultConfig
+
+parseLetDeclWith :: Config -> Text -> Either ParseError (Decl PName)
+parseLetDeclWith cfg = parse cfg { cfgModuleScope = False } letDecl
+
+parseLetDecl :: Text -> Either ParseError (Decl PName)
+parseLetDecl = parseLetDeclWith defaultConfig
+
+parseReplWith :: Config -> Text -> Either ParseError (ReplInput PName)
+parseReplWith cfg = parse cfg { cfgModuleScope = False } repl
+
+parseRepl :: Text -> Either ParseError (ReplInput PName)
+parseRepl = parseReplWith defaultConfig
+
+parseSchemaWith :: Config -> Text -> Either ParseError (Schema PName)
+parseSchemaWith cfg = parse cfg { cfgModuleScope = False } schema
+
+parseSchema :: Text -> Either ParseError (Schema PName)
+parseSchema = parseSchemaWith defaultConfig
+
+-- vim: ft=haskell
+{-# LINE 1 "templates/GenericTemplate.hs" #-}
+{-# LINE 1 "templates/GenericTemplate.hs" #-}
+{-# LINE 1 "<built-in>" #-}
+{-# LINE 19 "<built-in>" #-}
+{-# LINE 1 "/usr/local/Cellar/ghc/7.10.3a/lib/ghc-7.10.3/include/ghcversion.h" #-}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+{-# LINE 20 "<built-in>" #-}
 {-# LINE 1 "templates/GenericTemplate.hs" #-}
 -- Id: GenericTemplate.hs,v 1.26 2005/01/14 14:47:22 simonmar Exp 
 
diff --git a/dist/build/Cryptol/Parser/Lexer.hs b/dist/build/Cryptol/Parser/Lexer.hs
--- a/dist/build/Cryptol/Parser/Lexer.hs
+++ b/dist/build/Cryptol/Parser/Lexer.hs
@@ -1,14 +1,22 @@
-{-# OPTIONS_GHC -fno-warn-unused-binds -fno-warn-missing-signatures #-}
 {-# LANGUAGE CPP,MagicHash #-}
 {-# LINE 1 "src/Cryptol/Parser/Lexer.x" #-}
 
+-- |
+-- Module      :  $Header$
+-- Copyright   :  (c) 2013-2016 Galois, Inc.
+-- License     :  BSD3
+-- Maintainer  :  cryptol@galois.com
+-- Stability   :  provisional
+-- Portability :  portable
+-- 
 -- At present Alex generates code with too many warnings.
 {-# LANGUAGE Trustworthy #-}
+{-# LANGUAGE OverloadedStrings #-}
 {-# OPTIONS_GHC -w #-}
 module Cryptol.Parser.Lexer
   ( primLexer, lexer, Layout(..)
   , Token(..), TokenT(..)
-  , TokenV(..), TokenKW(..), TokenErr(..), TokenOp(..), TokenSym(..), TokenW(..)
+  , TokenV(..), TokenKW(..), TokenErr(..), TokenSym(..), TokenW(..)
   , Located(..)
   , Config(..)
   , defaultConfig
@@ -17,6 +25,7 @@
 import Cryptol.Parser.Position
 import Cryptol.Parser.LexerUtils
 import Cryptol.Parser.Unlit(unLit)
+import Data.Text.Lazy (Text)
 import qualified Data.Text.Lazy as Text
 
 #if __GLASGOW_HASKELL__ >= 603
@@ -26,31 +35,31 @@
 #endif
 #if __GLASGOW_HASKELL__ >= 503
 import Data.Array
+import Data.Char (ord)
 import Data.Array.Base (unsafeAt)
 #else
 import Array
+import Char (ord)
 #endif
 #if __GLASGOW_HASKELL__ >= 503
 import GHC.Exts
 #else
 import GlaExts
 #endif
-alex_tab_size :: Int
-alex_tab_size = 8
 alex_base :: AlexAddr
-alex_base = AlexA# "\xf8\xff\xff\xff\x6d\x00\x00\x00\x63\x01\x00\x00\x59\x02\x00\x00\xe2\x00\x00\x00\xd9\x02\x00\x00\x59\x03\x00\x00\xd9\x03\x00\x00\x59\x04\x00\x00\xd9\x04\x00\x00\x59\x05\x00\x00\xd9\x05\x00\x00\x59\x06\x00\x00\xd9\x06\x00\x00\x59\x07\x00\x00\xd9\x07\x00\x00\x59\x08\x00\x00\x00\x00\x00\x00\xca\x08\x00\x00\x00\x00\x00\x00\x3b\x09\x00\x00\x00\x00\x00\x00\xac\x09\x00\x00\x00\x00\x00\x00\x1d\x0a\x00\x00\x00\x00\x00\x00\x8e\x0a\x00\x00\x00\x00\x00\x00\xff\x0a\x00\x00\x00\x00\x00\x00\x40\x0b\x00\x00\x00\x00\x00\x00\x81\x0b\x00\x00\x00\x00\x00\x00\xc2\x0b\x00\x00\x00\x00\x00\x00\x03\x0c\x00\x00\x00\x00\x00\x00\x44\x0c\x00\x00\x00\x00\x00\x00\x85\x0c\x00\x00\xe0\xff\xff\xff\xfb\x0c\x00\x00\x48\x00\x00\x00\xd7\xff\xff\xff\xdf\xff\xff\xff\xfb\x0d\x00\x00\xbb\x0d\x00\x00\x00\x00\x00\x00\xbb\x0e\x00\x00\x31\x0f\x00\x00\x7c\x0e\x00\x00\x00\x00\x00\x00\x31\x10\x00\x00\xf1\x0f\x00\x00\x00\x00\x00\x00\xf1\x10\x00\x00\x67\x11\x00\x00\xb2\x10\x00\x00\x00\x00\x00\x00\x67\x12\x00\x00\x27\x12\x00\x00\x00\x00\x00\x00\x27\x13\x00\x00\xe7\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe2\xff\xff\xff\x00\x00\x00\x00\xe8\xff\xff\xff\x00\x00\x00\x00\xdd\x13\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd3\x14\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x79\x00\x00\x00\xc9\x15\x00\x00\xa2\x16\x00\x00\x13\x17\x00\x00\x84\x17\x00\x00\xf5\x17\x00\x00\x66\x18\x00\x00\xd7\x18\x00\x00\x48\x19\x00\x00\xb9\x19\x00\x00\x2a\x1a\x00\x00\x9b\x1a\x00\x00\x0c\x1b\x00\x00\x7d\x1b\x00\x00\xee\x1b\x00\x00\x5f\x1c\x00\x00\xd0\x1c\x00\x00\x41\x1d\x00\x00\xb2\x1d\x00\x00\x23\x1e\x00\x00\x94\x1e\x00\x00\x05\x1f\x00\x00\x76\x1f\x00\x00\xe7\x1f\x00\x00\x58\x20\x00\x00\xc9\x20\x00\x00\x3a\x21\x00\x00\xab\x21\x00\x00\x1c\x22\x00\x00\x8d\x22\x00\x00\xfe\x22\x00\x00\x6f\x23\x00\x00\xe0\x23\x00\x00\x51\x24\x00\x00\xc2\x24\x00\x00\x33\x25\x00\x00\xa4\x25\x00\x00\x15\x26\x00\x00\x86\x26\x00\x00\xf7\x26\x00\x00\x68\x27\x00\x00\xd9\x27\x00\x00\x4a\x28\x00\x00\xbb\x28\x00\x00\xe3\xff\xff\xff\x6a\x00\x00\x00\x7f\x00\x00\x00\x34\x02\x00\x00\x4c\x02\x00\x00\x2c\x29\x00\x00\x9d\x29\x00\x00\x0e\x2a\x00\x00\x7f\x2a\x00\x00\xf0\x2a\x00\x00\x61\x2b\x00\x00\xd2\x2b\x00\x00\x43\x2c\x00\x00\xb4\x2c\x00\x00\x25\x2d\x00\x00\x96\x2d\x00\x00\x07\x2e\x00\x00\x78\x2e\x00\x00\xe9\x2e\x00\x00\x5a\x2f\x00\x00\xcb\x2f\x00\x00\x3c\x30\x00\x00\xad\x30\x00\x00\x1e\x31\x00\x00\x8f\x31\x00\x00\x00\x32\x00\x00\x71\x32\x00\x00\xe2\x32\x00\x00\x53\x33\x00\x00\xc4\x33\x00\x00\x35\x34\x00\x00\xa6\x34\x00\x00\x17\x35\x00\x00\x88\x35\x00\x00\xf9\x35\x00\x00\x6a\x36\x00\x00\xdb\x36\x00\x00\x4c\x37\x00\x00\xbd\x37\x00\x00\x2e\x38\x00\x00\x9f\x38\x00\x00\x10\x39\x00\x00\x81\x39\x00\x00\xf2\x39\x00\x00\x63\x3a\x00\x00\xd4\x3a\x00\x00\x45\x3b\x00\x00\xb6\x3b\x00\x00\x27\x3c\x00\x00\x98\x3c\x00\x00\x09\x3d\x00\x00\x7a\x3d\x00\x00\xeb\x3d\x00\x00\x5c\x3e\x00\x00\xcd\x3e\x00\x00\x3e\x3f\x00\x00\xaf\x3f\x00\x00\x20\x40\x00\x00\x91\x40\x00\x00\x02\x41\x00\x00\x73\x41\x00\x00\xe4\x41\x00\x00\x55\x42\x00\x00\xc6\x42\x00\x00\x37\x43\x00\x00\xa8\x43\x00\x00\x19\x44\x00\x00\x8a\x44\x00\x00\xfb\x44\x00\x00\x6c\x45\x00\x00\xdd\x45\x00\x00\x4e\x46\x00\x00\xbf\x46\x00\x00\x30\x47\x00\x00\xa1\x47\x00\x00\x12\x48\x00\x00\x83\x48\x00\x00\xf4\x48\x00\x00\x65\x49\x00\x00\xd6\x49\x00\x00\x47\x4a\x00\x00\xb8\x4a\x00\x00\x29\x4b\x00\x00\x9a\x4b\x00\x00\x0b\x4c\x00\x00\x7c\x4c\x00\x00\xed\x4c\x00\x00\x5e\x4d\x00\x00\xcf\x4d\x00\x00\x40\x4e\x00\x00\xb1\x4e\x00\x00\x22\x4f\x00\x00\x93\x4f\x00\x00\x04\x50\x00\x00\x75\x50\x00\x00\xe6\x50\x00\x00\x57\x51\x00\x00\xc8\x51\x00\x00\x39\x52\x00\x00\xaa\x52\x00\x00\x1b\x53\x00\x00\x8c\x53\x00\x00\xfd\x53\x00\x00\x6e\x54\x00\x00\xdf\x54\x00\x00\x50\x55\x00\x00\xc1\x55\x00\x00\x32\x56\x00\x00\xa3\x56\x00\x00\x14\x57\x00\x00\x85\x57\x00\x00\xf6\x57\x00\x00\x67\x58\x00\x00\xd8\x58\x00\x00\x49\x59\x00\x00\xba\x59\x00\x00\x2b\x5a\x00\x00\x9c\x5a\x00\x00\x0d\x5b\x00\x00\x7e\x5b\x00\x00\xef\x5b\x00\x00\x60\x5c\x00\x00\xd1\x5c\x00\x00\x42\x5d\x00\x00\xb3\x5d\x00\x00\x24\x5e\x00\x00\x95\x5e\x00\x00\x06\x5f\x00\x00\x77\x5f\x00\x00\xe8\x5f\x00\x00\x59\x60\x00\x00\xca\x60\x00\x00\x3b\x61\x00\x00\xac\x61\x00\x00\x1d\x62\x00\x00\x8e\x62\x00\x00\xff\x62\x00\x00\x70\x63\x00\x00\x00\x00\x00\x00\xd8\xff\xff\xff\x00\x00\x00\x00\xed\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xfa\xff\xff\xff\x4a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x52\x00\x00\x00\x5b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x53\x00\x00\x00\xd9\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x81\x00\x00\x00\x00\x00\x00\x00\x55\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x66\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x65\x00\x00\x00\x5c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x77\x00\x00\x00\x00\x00\x00\x00\x68\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"#
+alex_base = AlexA# "\x01\x00\x00\x00\x76\x00\x00\x00\x6c\x01\x00\x00\x62\x02\x00\x00\xd7\xff\xff\xff\x61\x03\x00\x00\x60\x03\x00\x00\xe0\x03\x00\x00\x60\x04\x00\x00\xe0\x04\x00\x00\x60\x05\x00\x00\xe0\x05\x00\x00\x60\x06\x00\x00\xe0\x06\x00\x00\x60\x07\x00\x00\xe0\x07\x00\x00\x60\x08\x00\x00\xe0\x08\x00\x00\x78\x00\x00\x00\x00\x00\x00\x00\x51\x09\x00\x00\x00\x00\x00\x00\xc2\x09\x00\x00\x00\x00\x00\x00\x33\x0a\x00\x00\x00\x00\x00\x00\xa4\x0a\x00\x00\x00\x00\x00\x00\x15\x0b\x00\x00\x00\x00\x00\x00\x86\x0b\x00\x00\xca\xff\xff\xff\x00\x00\x00\x00\xdd\x00\x00\x00\x00\x00\x00\x00\xc7\x0b\x00\x00\x00\x00\x00\x00\x08\x0c\x00\x00\x00\x00\x00\x00\x49\x0c\x00\x00\x00\x00\x00\x00\x8a\x0c\x00\x00\x00\x00\x00\x00\xcb\x0c\x00\x00\x5d\x00\x00\x00\xdf\xff\xff\xff\xd8\xff\xff\xff\xcb\x0d\x00\x00\x8b\x0d\x00\x00\x00\x00\x00\x00\x8b\x0e\x00\x00\x01\x0f\x00\x00\x4c\x0e\x00\x00\x00\x00\x00\x00\x01\x10\x00\x00\xc1\x0f\x00\x00\x00\x00\x00\x00\xc1\x10\x00\x00\x37\x11\x00\x00\x82\x10\x00\x00\x00\x00\x00\x00\x37\x12\x00\x00\xf7\x11\x00\x00\x00\x00\x00\x00\xf7\x12\x00\x00\xb7\x12\x00\x00\x00\x00\x00\x00\xed\xff\xff\xff\xb3\x13\x00\x00\xee\xff\xff\xff\xd6\x13\x00\x00\x00\x00\x00\x00\xf9\x13\x00\x00\x00\x00\x00\x00\xf8\x13\x00\x00\xee\x14\x00\x00\xef\xff\xff\xff\x00\x00\x00\x00\xe4\x15\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xda\x16\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9b\x00\x00\x00\xd0\x17\x00\x00\xcf\x18\x00\x00\x29\x19\x00\x00\x69\x19\x00\x00\xe3\x19\x00\x00\x5d\x1a\x00\x00\xd7\x1a\x00\x00\x51\x1b\x00\x00\xcb\x1b\x00\x00\x45\x1c\x00\x00\xbf\x1c\x00\x00\x39\x1d\x00\x00\xb3\x1d\x00\x00\x2d\x1e\x00\x00\xa7\x1e\x00\x00\x21\x1f\x00\x00\x9b\x1f\x00\x00\x15\x20\x00\x00\x8f\x20\x00\x00\x09\x21\x00\x00\x83\x21\x00\x00\xfd\x21\x00\x00\x77\x22\x00\x00\xf1\x22\x00\x00\xea\xff\xff\xff\x79\x00\x00\x00\x94\x00\x00\x00\x3d\x02\x00\x00\x55\x02\x00\x00\x6b\x23\x00\x00\xe5\x23\x00\x00\x5f\x24\x00\x00\xd9\x24\x00\x00\x53\x25\x00\x00\xcd\x25\x00\x00\x47\x26\x00\x00\xc1\x26\x00\x00\x3b\x27\x00\x00\xb5\x27\x00\x00\x2f\x28\x00\x00\xa9\x28\x00\x00\x23\x29\x00\x00\x9d\x29\x00\x00\x17\x2a\x00\x00\x91\x2a\x00\x00\x0b\x2b\x00\x00\x85\x2b\x00\x00\xff\x2b\x00\x00\x79\x2c\x00\x00\xf3\x2c\x00\x00\x6d\x2d\x00\x00\xe7\x2d\x00\x00\x61\x2e\x00\x00\xdb\x2e\x00\x00\x55\x2f\x00\x00\xcf\x2f\x00\x00\x49\x30\x00\x00\xc3\x30\x00\x00\x3d\x31\x00\x00\xb7\x31\x00\x00\x31\x32\x00\x00\xab\x32\x00\x00\x25\x33\x00\x00\x9f\x33\x00\x00\x19\x34\x00\x00\x93\x34\x00\x00\x0d\x35\x00\x00\x87\x35\x00\x00\x01\x36\x00\x00\x7b\x36\x00\x00\xf5\x36\x00\x00\x6f\x37\x00\x00\xe9\x37\x00\x00\x63\x38\x00\x00\xdd\x38\x00\x00\x57\x39\x00\x00\xd1\x39\x00\x00\x4b\x3a\x00\x00\xc5\x3a\x00\x00\x3f\x3b\x00\x00\xb9\x3b\x00\x00\x33\x3c\x00\x00\xad\x3c\x00\x00\x27\x3d\x00\x00\xa1\x3d\x00\x00\x1b\x3e\x00\x00\x95\x3e\x00\x00\x0f\x3f\x00\x00\x89\x3f\x00\x00\x03\x40\x00\x00\x7d\x40\x00\x00\xf7\x40\x00\x00\x71\x41\x00\x00\xeb\x41\x00\x00\x65\x42\x00\x00\xdf\x42\x00\x00\x59\x43\x00\x00\xb3\x43\x00\x00\xd6\x43\x00\x00\xf9\x43\x00\x00\x1c\x44\x00\x00\x3f\x44\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd9\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xf1\xff\xff\xff\x00\x00\x00\x00\x62\x44\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x85\x44\x00\x00\xa8\x44\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xcb\x44\x00\x00\xee\x44\x00\x00\x11\x45\x00\x00\x34\x45\x00\x00\x57\x45\x00\x00\x7a\x45\x00\x00\x9d\x45\x00\x00\xc0\x45\x00\x00\xe3\x45\x00\x00\x06\x46\x00\x00"#
 
 alex_table :: AlexAddr
-alex_table = AlexA# "\x00\x00\x50\x00\x50\x00\x50\x00\x50\x00\x50\x00\x1b\x01\x7d\x00\x7d\x00\x7d\x00\x7d\x00\x7d\x00\x7d\x00\x7d\x00\x7d\x00\x7c\x00\x7c\x00\x43\x00\x42\x00\x7c\x00\x7c\x00\x17\x01\x22\x01\x42\x00\x50\x00\x1c\x01\x37\x01\x20\x01\x51\x00\x0a\x01\x29\x00\x38\x01\x2f\x01\x30\x01\x08\x01\x06\x01\x26\x01\x07\x01\x28\x01\x09\x01\x7f\x00\x7e\x00\x7e\x00\x7e\x00\x7e\x00\x7e\x00\x7e\x00\x7e\x00\x7e\x00\x7e\x00\x29\x01\x27\x01\x11\x01\x25\x01\x10\x01\x0f\x01\x1e\x01\xd6\x00\x95\x00\x96\x00\xc2\x00\x85\x00\xb5\x00\xc2\x00\xc2\x00\xee\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xe0\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x31\x01\x21\x01\x32\x01\x19\x01\x81\x00\x2b\x01\x93\x00\xc2\x00\xc2\x00\xc2\x00\xdf\x00\x9b\x00\xc2\x00\xbd\x00\xfe\x00\xab\x00\xc2\x00\x9d\x00\x9f\x00\xbf\x00\xc2\x00\xdb\x00\xc2\x00\xbb\x00\xce\x00\xd7\x00\xc2\x00\xc2\x00\xcc\x00\x77\x00\xc2\x00\xb2\x00\x33\x01\x2e\x01\x34\x01\x18\x01\x4f\x00\x80\x00\x80\x00\x80\x00\x80\x00\x80\x00\x80\x00\x80\x00\x80\x00\x80\x00\x80\x00\x50\x00\x50\x00\x50\x00\x50\x00\x50\x00\x0e\x01\x23\x01\x80\x00\x80\x00\x80\x00\x80\x00\x80\x00\x80\x00\x13\x01\x14\x01\x16\x01\x0b\x01\x2c\x01\x4d\x00\x1f\x01\x2a\x01\x15\x01\x12\x01\x50\x00\x7d\x00\x7d\x00\x7d\x00\x7d\x00\x7d\x00\x7d\x00\x7d\x00\x7d\x00\x1d\x01\x0d\x01\x24\x01\x2d\x01\x36\x01\x00\x00\x00\x00\x80\x00\x80\x00\x80\x00\x80\x00\x80\x00\x80\x00\x7e\x00\x7e\x00\x7e\x00\x7e\x00\x7e\x00\x7e\x00\x7e\x00\x7e\x00\x7e\x00\x7e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0c\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x2a\x00\x00\x00\x32\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x35\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x35\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x36\x00\x08\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x0e\x00\x15\x00\x15\x00\x15\x00\x16\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x47\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x44\x00\x00\x00\x00\x00\x00\x00\x00\x00\x46\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3f\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x40\x00\x05\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x28\x00\x0b\x00\x1b\x00\x1b\x00\x1b\x00\x1c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x4b\x00\x7e\x00\x7e\x00\x7e\x00\x7e\x00\x7e\x00\x7e\x00\x7e\x00\x7e\x00\x7e\x00\x7e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x49\x00\x80\x00\x80\x00\x80\x00\x80\x00\x80\x00\x80\x00\x80\x00\x80\x00\x80\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x80\x00\x80\x00\x80\x00\x80\x00\x80\x00\x00\x00\x00\x00\x00\x00\x2d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2b\x00\x80\x00\x80\x00\x80\x00\x80\x00\x80\x00\x80\x00\x00\x00\x00\x00\x39\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3c\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3d\x00\x06\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x26\x00\x0c\x00\x19\x00\x19\x00\x19\x00\x1a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3f\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x3c\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x38\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x35\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x31\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x2e\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x05\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x06\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x07\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x08\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x09\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x0a\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x22\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x24\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x26\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x28\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x33\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x36\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x40\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x31\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x33\x00\x09\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x20\x00\x0f\x00\x13\x00\x13\x00\x13\x00\x14\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x38\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3a\x00\x07\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x24\x00\x0d\x00\x17\x00\x17\x00\x17\x00\x18\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3c\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3d\x00\x06\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x26\x00\x0c\x00\x19\x00\x19\x00\x19\x00\x1a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x35\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x36\x00\x08\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x22\x00\x0e\x00\x15\x00\x15\x00\x15\x00\x16\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2e\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x2f\x00\x0a\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1e\x00\x10\x00\x11\x00\x11\x00\x11\x00\x12\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x88\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf3\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x55\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x57\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x58\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x59\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x5e\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x60\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x64\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x67\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x68\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\x69\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x6a\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x6e\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x6f\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x73\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x74\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x75\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x78\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x7a\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x7b\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x04\x01\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x03\x01\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x82\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x83\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x84\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x01\x01\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xff\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xfd\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xf1\x00\xc2\x00\xfb\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xfa\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xf9\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xf8\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xd1\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x8b\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xf6\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xf5\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xe7\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x8d\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x8e\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xf4\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xf2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x8f\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xef\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xed\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xec\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x9c\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xeb\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xea\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xe9\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xa0\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xa7\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xe5\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xe4\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xe3\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xe2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xe1\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xaf\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xd4\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc9\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xdc\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xd9\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xd2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xd0\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xcf\x00\xc2\x00\xc2\x00\xc2\x00\xc8\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xcd\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xca\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xb9\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xba\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc7\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc3\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc4\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc5\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc6\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xbe\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xbc\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xb8\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xb7\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xb4\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xb3\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xb1\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xb0\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xd8\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xda\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xae\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xad\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xdd\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xac\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xaa\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xa9\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xa8\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xa6\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc0\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xe6\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xa5\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xa4\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xa3\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xa1\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xa2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xb6\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xe8\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x9e\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x9a\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x99\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xde\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xd5\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x98\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x97\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x94\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xf0\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x92\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x91\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x90\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xf7\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x8c\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x8a\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x89\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\x87\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x86\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x01\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x02\x01\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x05\x01\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x79\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc1\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x76\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x72\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x71\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x70\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\x6d\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x6c\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x6b\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x66\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x65\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x63\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\x62\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xd3\x00\xc2\x00\xc2\x00\x61\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x5f\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x5d\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xcb\x00\xfc\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x5c\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x5b\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x5a\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x56\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x54\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x53\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x04\x00\x2a\x00\xc2\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x52\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x2a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"#
+alex_table = AlexA# "\x00\x00\x04\x00\x97\x00\x97\x00\x05\x00\xd6\x00\x49\x00\xc2\x00\x6f\x00\x6f\x00\x56\x00\x56\x00\x56\x00\x56\x00\x56\x00\x70\x00\x70\x00\x70\x00\x70\x00\x70\x00\x70\x00\x70\x00\x70\x00\x45\x00\x45\x00\x04\x00\x6f\x00\x6f\x00\x47\x00\x47\x00\x49\x00\xc3\x00\x00\x00\x56\x00\xd6\x00\xcd\x00\xd3\x00\xd6\x00\xd6\x00\xd6\x00\xce\x00\xc5\x00\xc6\x00\xd1\x00\xcf\x00\xbd\x00\xd0\x00\xbf\x00\xd8\x00\x72\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\xc0\x00\xbe\x00\xd5\x00\xbc\x00\xd6\x00\xd6\x00\xd6\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\xc7\x00\xb8\x00\xc8\x00\xd7\x00\x74\x00\xc1\x00\x7e\x00\x97\x00\x97\x00\x97\x00\xa6\x00\x97\x00\x97\x00\x94\x00\xb6\x00\x97\x00\x97\x00\x84\x00\x92\x00\x96\x00\x97\x00\x99\x00\x97\x00\x97\x00\x97\x00\xa4\x00\x97\x00\x97\x00\x9d\x00\x67\x00\x97\x00\x97\x00\xc9\x00\xc4\x00\xca\x00\xd4\x00\x55\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x53\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x56\x00\x56\x00\x56\x00\x56\x00\x56\x00\x70\x00\x70\x00\x70\x00\x70\x00\x70\x00\x70\x00\x70\x00\x70\x00\x00\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x56\x00\x00\x00\x00\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x00\x00\x00\x00\x00\x00\x00\x00\x33\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x36\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x37\x00\x09\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x25\x00\x0f\x00\x17\x00\x17\x00\x17\x00\x18\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x4d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4b\x00\x30\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x40\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x41\x00\x06\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2b\x00\x0c\x00\x1d\x00\x1d\x00\x1d\x00\x1e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x51\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4f\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x00\x00\x00\x00\x00\x00\x2e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2c\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x00\x00\x00\x00\x3a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3d\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3e\x00\x07\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x29\x00\x0d\x00\x1b\x00\x1b\x00\x1b\x00\x1c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x58\x00\x58\x00\x00\x00\x59\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x59\x00\x00\x00\x59\x00\x59\x00\x59\x00\x59\x00\x00\x00\x00\x00\x00\x00\x59\x00\x59\x00\x00\x00\x59\x00\x00\x00\x59\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x59\x00\x59\x00\x59\x00\x59\x00\x59\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x00\x00\x59\x00\x00\x00\x59\x00\x58\x00\x00\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x00\x00\x59\x00\x00\x00\x59\x00\x40\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x3d\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x39\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x36\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x32\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x2f\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x06\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x07\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x08\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x09\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x0a\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x0b\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x21\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x23\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x25\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x29\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x34\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x37\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x32\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x35\x00\x34\x00\x0a\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x23\x00\x10\x00\x15\x00\x15\x00\x15\x00\x16\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x39\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3b\x00\x08\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x27\x00\x0e\x00\x19\x00\x19\x00\x19\x00\x1a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xd6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\x46\x00\xd6\x00\x00\x00\xd6\x00\x00\x00\x48\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\x46\x00\xd6\x00\xff\xff\xd6\x00\x00\x00\x48\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\xff\xff\xd6\x00\xd6\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\x00\x00\xd6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x40\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x41\x00\x06\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2b\x00\x0c\x00\x1d\x00\x1d\x00\x1d\x00\x1e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x43\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x40\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x41\x00\x06\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2b\x00\x0c\x00\x1d\x00\x1d\x00\x1d\x00\x1e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3d\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3e\x00\x07\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x29\x00\x0d\x00\x1b\x00\x1b\x00\x1b\x00\x1c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x36\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x37\x00\x09\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x25\x00\x0f\x00\x17\x00\x17\x00\x17\x00\x18\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2f\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x30\x00\x0b\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x21\x00\x11\x00\x13\x00\x13\x00\x13\x00\x14\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x58\x00\x58\x00\x58\x00\x00\x00\x00\x00\x00\x00\x58\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x58\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x00\x00\x00\x00\x00\x00\x59\x00\x58\x00\x00\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x58\x00\x59\x00\x00\x00\x59\x00\x59\x00\x59\x00\x59\x00\x00\x00\x00\x00\x00\x00\x59\x00\x59\x00\x00\x00\x59\x00\x00\x00\x59\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x59\x00\x59\x00\x59\x00\x59\x00\x59\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x59\x00\x00\x00\x59\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x59\x00\x00\x00\x59\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x6b\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x6c\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x5a\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x5d\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x5e\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x5f\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x60\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x61\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x62\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x64\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x65\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x69\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x6a\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x6e\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x75\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x7a\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\xb5\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\xb4\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\xb2\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\xb1\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\xb0\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\xaf\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\xae\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\xad\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x82\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\xaa\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\xa9\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\xa8\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\xa7\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x8b\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\xa1\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x98\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\xa5\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x9f\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x9e\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x9b\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x9a\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x93\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x91\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x90\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x8f\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x8e\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x8d\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x8c\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x8a\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x89\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x88\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x95\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x87\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x86\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\xa0\x00\x97\x00\x97\x00\x85\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x83\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\xab\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\xac\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x81\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\xa2\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x80\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x7f\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\xb3\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x7d\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x7c\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x7b\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x79\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x78\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x77\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x76\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\xb7\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x6d\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x68\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x66\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x63\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x5c\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x9c\x00\xa3\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x97\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x5b\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\xd6\x00\xd6\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\xd6\x00\xd6\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\xd6\x00\xd6\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\xd6\x00\xd6\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\xd6\x00\xd6\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xbb\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\xd6\x00\xd6\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xcc\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\xd6\x00\xd6\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\xd6\x00\xd6\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\xd6\x00\xd6\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\xd6\x00\xd6\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xb9\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\xd6\x00\xd6\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\xd6\x00\xd6\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\xd6\x00\xd6\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\xd6\x00\xd6\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\xd6\x00\xd6\x00\x00\x00\xba\x00\x00\x00\xd6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\xd6\x00\xd6\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\xd6\x00\xd6\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xcb\x00\x00\x00\xd6\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\x00\x00\x44\x00\xd6\x00\x00\x00\xd6\x00\x00\x00\x57\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\x00\x00\xd2\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\xd6\x00\x00\x00\xd6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x00\x00\xd6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"#
 
 alex_check :: AlexAddr
-alex_check = AlexA# "\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x26\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x30\x00\x31\x00\x2f\x00\x2a\x00\x30\x00\x31\x00\x3c\x00\x3e\x00\x2a\x00\x20\x00\x21\x00\x22\x00\x23\x00\x2f\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3d\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x0a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x3d\x00\x2d\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x3d\x00\x3e\x00\x3e\x00\x5e\x00\x2e\x00\x27\x00\x40\x00\x3a\x00\x3c\x00\x3d\x00\x20\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x21\x00\x3d\x00\x3e\x00\x2e\x00\x3e\x00\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xce\x00\xcf\x00\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x0a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xff\xff\x2a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x2f\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x0a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x22\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\x62\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x6f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x78\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\x0a\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\x0a\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x0a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x22\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x0a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x0a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xce\x00\xcf\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xce\x00\xcf\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"#
+alex_check = AlexA# "\xff\xff\x2a\x00\x01\x00\x02\x00\x3a\x00\x04\x00\x2f\x00\x2e\x00\x30\x00\x31\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x2a\x00\x2a\x00\x2a\x00\x30\x00\x31\x00\x2f\x00\x2f\x00\x2f\x00\x2e\x00\xff\xff\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x0a\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x0a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x2f\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x0a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x22\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\x62\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x6f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x78\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x01\x00\x02\x00\xff\xff\x04\x00\xff\xff\xff\xff\xff\xff\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\xff\xff\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\xff\xff\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x7c\x00\xff\xff\x7e\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\x0a\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\x0a\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x04\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x04\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\xff\xff\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x04\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x0a\x00\x2d\x00\xff\xff\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\x5e\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\xff\xff\xff\xff\x2a\x00\x2a\x00\x2b\x00\xff\xff\x2d\x00\xff\xff\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7c\x00\xff\xff\x7e\x00\x5c\x00\xff\xff\x5e\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7c\x00\xff\xff\x7e\x00\x5c\x00\xff\xff\x5e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7c\x00\xff\xff\x7e\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x0a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x0a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x22\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x0a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x0a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\x04\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\xff\xff\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\xff\xff\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\x5e\x00\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x7c\x00\xff\xff\x7e\x00\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x07\x00\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\x04\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x04\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\xff\xff\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x04\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\xff\xff\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\x5e\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x04\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\xff\xff\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7c\x00\xff\xff\x7e\x00\x5c\x00\xff\xff\x5e\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x04\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\xff\xff\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7c\x00\xff\xff\x7e\x00\x5c\x00\xff\xff\x5e\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x04\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\xff\xff\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7c\x00\xff\xff\x7e\x00\x5c\x00\xff\xff\x5e\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x04\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\xff\xff\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7c\x00\xff\xff\x7e\x00\x5c\x00\xff\xff\x5e\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x04\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\xff\xff\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7c\x00\xff\xff\x7e\x00\x5c\x00\xff\xff\x5e\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x04\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\xff\xff\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7c\x00\xff\xff\x7e\x00\x5c\x00\xff\xff\x5e\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x04\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\xff\xff\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7c\x00\xff\xff\x7e\x00\x5c\x00\xff\xff\x5e\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x04\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\xff\xff\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7c\x00\xff\xff\x7e\x00\x5c\x00\xff\xff\x5e\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x04\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\xff\xff\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7c\x00\xff\xff\x7e\x00\x5c\x00\xff\xff\x5e\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x04\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\xff\xff\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7c\x00\xff\xff\x7e\x00\x5c\x00\xff\xff\x5e\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x04\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\xff\xff\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7c\x00\xff\xff\x7e\x00\x5c\x00\xff\xff\x5e\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x04\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\xff\xff\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7c\x00\xff\xff\x7e\x00\x5c\x00\xff\xff\x5e\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x04\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\xff\xff\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7c\x00\xff\xff\x7e\x00\x5c\x00\xff\xff\x5e\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x04\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\xff\xff\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7c\x00\xff\xff\x7e\x00\x5c\x00\xff\xff\x5e\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x04\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\xff\xff\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7c\x00\xff\xff\x7e\x00\x5c\x00\xff\xff\x5e\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\xff\xff\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\xff\xff\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7c\x00\xff\xff\x7e\x00\x5c\x00\xff\xff\x5e\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7c\x00\xff\xff\x7e\x00\x5c\x00\xff\xff\x5e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7c\x00\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"#
 
 alex_deflt :: AlexAddr
-alex_deflt = AlexA# "\xff\xff\x4c\x00\x45\x00\x48\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1d\x00\x1d\x00\x1f\x00\x1f\x00\x21\x00\x21\x00\x23\x00\x23\x00\x25\x00\x25\x00\x27\x00\x27\x00\x30\x00\x30\x00\x34\x00\x34\x00\x37\x00\x37\x00\x3b\x00\x3b\x00\x3e\x00\x3e\x00\x41\x00\x41\x00\xff\xff\xc2\x00\xff\xff\xff\xff\xff\xff\x51\x00\x51\x00\x51\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4c\x00\x4c\x00\x4c\x00\x4a\x00\x4a\x00\x4a\x00\x4a\x00\x48\x00\x48\x00\x48\x00\x45\x00\x45\x00\x45\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x48\x00\xff\xff\xff\xff\xff\xff\x4c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x51\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"#
+alex_deflt = AlexA# "\xff\xff\x52\x00\x4a\x00\x4e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\x20\x00\x22\x00\x22\x00\x24\x00\x24\x00\x26\x00\x26\x00\x28\x00\x28\x00\x2a\x00\x2a\x00\xff\xff\x31\x00\x31\x00\x35\x00\x35\x00\x38\x00\x38\x00\x3c\x00\x3c\x00\x3f\x00\x3f\x00\x42\x00\x42\x00\xff\xff\xff\xff\xff\xff\x57\x00\x57\x00\x57\x00\x54\x00\x54\x00\x54\x00\x54\x00\x52\x00\x52\x00\x52\x00\x50\x00\x50\x00\x50\x00\x50\x00\x4e\x00\x4e\x00\x4e\x00\x4a\x00\x4a\x00\x4a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x4a\x00\x4a\x00\xff\xff\xff\xff\x4e\x00\xff\xff\xff\xff\xff\xff\x52\x00\xff\xff\xff\xff\xff\xff\xff\xff\x57\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"#
 
-alex_accept = listArray (0::Int,312) [AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAcc (alex_action_0),AlexAcc (alex_action_1),AlexAcc (alex_action_2),AlexAcc (alex_action_2),AlexAcc (alex_action_2),AlexAcc (alex_action_3),AlexAcc (alex_action_4),AlexAcc (alex_action_5),AlexAcc (alex_action_6),AlexAcc (alex_action_7),AlexAcc (alex_action_8),AlexAcc (alex_action_9),AlexAcc (alex_action_10),AlexAcc (alex_action_11),AlexAcc (alex_action_12),AlexAcc (alex_action_13),AlexAcc (alex_action_14),AlexAcc (alex_action_15),AlexAcc (alex_action_16),AlexAcc (alex_action_17),AlexAcc (alex_action_18),AlexAcc (alex_action_19),AlexAcc (alex_action_20),AlexAcc (alex_action_21),AlexAcc (alex_action_22),AlexAcc (alex_action_23),AlexAcc (alex_action_24),AlexAcc (alex_action_25),AlexAcc (alex_action_26),AlexAcc (alex_action_27),AlexAcc (alex_action_28),AlexAcc (alex_action_29),AlexAcc (alex_action_30),AlexAcc (alex_action_31),AlexAcc (alex_action_32),AlexAcc (alex_action_33),AlexAcc (alex_action_34),AlexAcc (alex_action_35),AlexAcc (alex_action_36),AlexAcc (alex_action_37),AlexAcc (alex_action_38),AlexAcc (alex_action_39),AlexAcc (alex_action_40),AlexAcc (alex_action_41),AlexAcc (alex_action_42),AlexAcc (alex_action_43),AlexAcc (alex_action_44),AlexAcc (alex_action_45),AlexAcc (alex_action_46),AlexAcc (alex_action_47),AlexAcc (alex_action_48),AlexAcc (alex_action_49),AlexAcc (alex_action_50),AlexAcc (alex_action_51),AlexAcc (alex_action_52),AlexAcc (alex_action_53),AlexAcc (alex_action_54),AlexAcc (alex_action_55),AlexAcc (alex_action_57),AlexAcc (alex_action_58),AlexAcc (alex_action_59),AlexAcc (alex_action_59),AlexAcc (alex_action_60),AlexAcc (alex_action_61),AlexAcc (alex_action_62),AlexAcc (alex_action_62),AlexAcc (alex_action_62),AlexAcc (alex_action_62),AlexAcc (alex_action_62),AlexAcc (alex_action_62),AlexAcc (alex_action_62),AlexAcc (alex_action_62),AlexAcc (alex_action_62),AlexAcc (alex_action_62),AlexAcc (alex_action_62),AlexAcc (alex_action_62),AlexAcc (alex_action_62),AlexAcc (alex_action_62),AlexAcc (alex_action_62),AlexAcc (alex_action_62),AlexAcc (alex_action_62),AlexAcc (alex_action_62),AlexAcc (alex_action_62),AlexAcc (alex_action_62),AlexAcc (alex_action_62),AlexAcc (alex_action_62),AlexAcc (alex_action_62),AlexAcc (alex_action_62),AlexAcc (alex_action_62),AlexAcc (alex_action_62),AlexAcc (alex_action_62),AlexAcc (alex_action_62),AlexAcc (alex_action_62),AlexAcc (alex_action_62),AlexAcc (alex_action_62),AlexAcc (alex_action_62),AlexAcc (alex_action_62),AlexAcc (alex_action_62),AlexAcc (alex_action_62),AlexAcc (alex_action_62),AlexAcc (alex_action_62),AlexAcc (alex_action_62),AlexAcc (alex_action_62),AlexAcc (alex_action_62),AlexAcc (alex_action_62),AlexAcc (alex_action_62),AlexAcc (alex_action_62),AlexAcc (alex_action_62),AlexAcc (alex_action_62),AlexAcc (alex_action_62),AlexAcc (alex_action_62),AlexAcc (alex_action_62),AlexAcc (alex_action_62),AlexAcc (alex_action_62),AlexAcc (alex_action_62),AlexAcc (alex_action_62),AlexAcc (alex_action_62),AlexAcc (alex_action_62),AlexAcc (alex_action_62),AlexAcc (alex_action_62),AlexAcc (alex_action_62),AlexAcc (alex_action_62),AlexAcc (alex_action_62),AlexAcc (alex_action_62),AlexAcc (alex_action_62),AlexAcc (alex_action_62),AlexAcc (alex_action_62),AlexAcc (alex_action_62),AlexAcc (alex_action_62),AlexAcc (alex_action_62),AlexAcc (alex_action_62),AlexAcc (alex_action_62),AlexAcc (alex_action_62),AlexAcc (alex_action_62),AlexAcc (alex_action_62),AlexAcc (alex_action_62),AlexAcc (alex_action_62),AlexAcc (alex_action_62),AlexAcc (alex_action_62),AlexAcc (alex_action_62),AlexAcc (alex_action_62),AlexAcc (alex_action_62),AlexAcc (alex_action_62),AlexAcc (alex_action_62),AlexAcc (alex_action_62),AlexAcc (alex_action_62),AlexAcc (alex_action_62),AlexAcc (alex_action_62),AlexAcc (alex_action_62),AlexAcc (alex_action_62),AlexAcc (alex_action_62),AlexAcc (alex_action_62),AlexAcc (alex_action_62),AlexAcc (alex_action_62),AlexAcc (alex_action_62),AlexAcc (alex_action_62),AlexAcc (alex_action_62),AlexAcc (alex_action_62),AlexAcc (alex_action_62),AlexAcc (alex_action_62),AlexAcc (alex_action_62),AlexAcc (alex_action_62),AlexAcc (alex_action_62),AlexAcc (alex_action_62),AlexAcc (alex_action_62),AlexAcc (alex_action_62),AlexAcc (alex_action_62),AlexAcc (alex_action_62),AlexAcc (alex_action_62),AlexAcc (alex_action_62),AlexAcc (alex_action_62),AlexAcc (alex_action_62),AlexAcc (alex_action_62),AlexAcc (alex_action_62),AlexAcc (alex_action_62),AlexAcc (alex_action_62),AlexAcc (alex_action_62),AlexAcc (alex_action_62),AlexAcc (alex_action_62),AlexAcc (alex_action_62),AlexAcc (alex_action_62),AlexAcc (alex_action_62),AlexAcc (alex_action_62),AlexAcc (alex_action_62),AlexAcc (alex_action_62),AlexAcc (alex_action_62),AlexAcc (alex_action_62),AlexAcc (alex_action_62),AlexAcc (alex_action_62),AlexAcc (alex_action_62),AlexAcc (alex_action_62),AlexAcc (alex_action_62),AlexAcc (alex_action_62),AlexAcc (alex_action_62),AlexAcc (alex_action_62),AlexAcc (alex_action_62),AlexAcc (alex_action_63),AlexAcc (alex_action_64),AlexAcc (alex_action_65),AlexAcc (alex_action_66),AlexAcc (alex_action_67),AlexAcc (alex_action_68),AlexAcc (alex_action_69),AlexAcc (alex_action_70),AlexAcc (alex_action_71),AlexAcc (alex_action_72),AlexAcc (alex_action_73),AlexAcc (alex_action_74),AlexAcc (alex_action_75),AlexAcc (alex_action_76),AlexAcc (alex_action_77),AlexAcc (alex_action_78),AlexAcc (alex_action_79),AlexAcc (alex_action_80),AlexAcc (alex_action_81),AlexAcc (alex_action_82),AlexAcc (alex_action_83),AlexAcc (alex_action_84),AlexAcc (alex_action_85),AlexAcc (alex_action_86),AlexAcc (alex_action_87),AlexAcc (alex_action_88),AlexAcc (alex_action_89),AlexAcc (alex_action_90),AlexAcc (alex_action_91),AlexAcc (alex_action_92),AlexAcc (alex_action_93),AlexAcc (alex_action_94),AlexAcc (alex_action_95),AlexAcc (alex_action_96),AlexAcc (alex_action_97),AlexAcc (alex_action_98),AlexAcc (alex_action_99),AlexAcc (alex_action_100),AlexAcc (alex_action_101),AlexAcc (alex_action_102),AlexAcc (alex_action_103),AlexAcc (alex_action_104),AlexAcc (alex_action_105),AlexAcc (alex_action_106),AlexAcc (alex_action_107),AlexAcc (alex_action_108),AlexAcc (alex_action_109),AlexAcc (alex_action_110),AlexAcc (alex_action_111),AlexAcc (alex_action_112),AlexAcc (alex_action_113)]
-{-# LINE 176 "src/Cryptol/Parser/Lexer.x" #-}
+alex_accept = listArray (0::Int,216) [AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAcc (alex_action_0),AlexAcc (alex_action_0),AlexAcc (alex_action_1),AlexAcc (alex_action_1),AlexAcc (alex_action_2),AlexAcc (alex_action_2),AlexAcc (alex_action_3),AlexAcc (alex_action_4),AlexAcc (alex_action_4),AlexAcc (alex_action_5),AlexAcc (alex_action_6),AlexAcc (alex_action_7),AlexAcc (alex_action_8),AlexAcc (alex_action_9),AlexAcc (alex_action_10),AlexAcc (alex_action_11),AlexAcc (alex_action_12),AlexAcc (alex_action_13),AlexAcc (alex_action_14),AlexAcc (alex_action_15),AlexAcc (alex_action_16),AlexAcc (alex_action_17),AlexAcc (alex_action_18),AlexAcc (alex_action_19),AlexAcc (alex_action_20),AlexAcc (alex_action_21),AlexAcc (alex_action_22),AlexAcc (alex_action_23),AlexAcc (alex_action_24),AlexAcc (alex_action_25),AlexAcc (alex_action_26),AlexAcc (alex_action_27),AlexAcc (alex_action_28),AlexAcc (alex_action_29),AlexAcc (alex_action_30),AlexAcc (alex_action_31),AlexAcc (alex_action_32),AlexAcc (alex_action_33),AlexAcc (alex_action_34),AlexAcc (alex_action_35),AlexAcc (alex_action_37),AlexAcc (alex_action_38),AlexAcc (alex_action_39),AlexAcc (alex_action_40),AlexAcc (alex_action_41),AlexAcc (alex_action_42),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_44),AlexAcc (alex_action_45),AlexAcc (alex_action_46),AlexAcc (alex_action_46),AlexAcc (alex_action_46),AlexAcc (alex_action_46),AlexAcc (alex_action_46),AlexAcc (alex_action_46),AlexAcc (alex_action_46),AlexAcc (alex_action_46),AlexAcc (alex_action_46),AlexAcc (alex_action_46),AlexAcc (alex_action_46),AlexAcc (alex_action_46),AlexAcc (alex_action_46),AlexAcc (alex_action_46),AlexAcc (alex_action_46),AlexAcc (alex_action_46),AlexAcc (alex_action_46),AlexAcc (alex_action_46),AlexAcc (alex_action_46),AlexAcc (alex_action_46),AlexAcc (alex_action_46),AlexAcc (alex_action_46),AlexAcc (alex_action_46),AlexAcc (alex_action_46),AlexAcc (alex_action_46),AlexAcc (alex_action_46),AlexAcc (alex_action_46),AlexAcc (alex_action_46),AlexAcc (alex_action_46),AlexAcc (alex_action_46),AlexAcc (alex_action_46),AlexAcc (alex_action_46),AlexAcc (alex_action_46),AlexAcc (alex_action_46),AlexAcc (alex_action_46),AlexAcc (alex_action_46),AlexAcc (alex_action_46),AlexAcc (alex_action_46),AlexAcc (alex_action_46),AlexAcc (alex_action_46),AlexAcc (alex_action_46),AlexAcc (alex_action_46),AlexAcc (alex_action_46),AlexAcc (alex_action_46),AlexAcc (alex_action_46),AlexAcc (alex_action_46),AlexAcc (alex_action_46),AlexAcc (alex_action_46),AlexAcc (alex_action_46),AlexAcc (alex_action_46),AlexAcc (alex_action_46),AlexAcc (alex_action_46),AlexAcc (alex_action_46),AlexAcc (alex_action_46),AlexAcc (alex_action_46),AlexAcc (alex_action_46),AlexAcc (alex_action_46),AlexAcc (alex_action_46),AlexAcc (alex_action_46),AlexAcc (alex_action_46),AlexAcc (alex_action_46),AlexAcc (alex_action_46),AlexAcc (alex_action_46),AlexAcc (alex_action_46),AlexAcc (alex_action_46),AlexAcc (alex_action_46),AlexAcc (alex_action_46),AlexAcc (alex_action_47),AlexAcc (alex_action_48),AlexAcc (alex_action_49),AlexAcc (alex_action_50),AlexAcc (alex_action_51),AlexAcc (alex_action_52),AlexAcc (alex_action_53),AlexAcc (alex_action_54),AlexAcc (alex_action_55),AlexAcc (alex_action_56),AlexAcc (alex_action_57),AlexAcc (alex_action_58),AlexAcc (alex_action_59),AlexAcc (alex_action_60),AlexAcc (alex_action_61),AlexAcc (alex_action_62),AlexAcc (alex_action_63),AlexAcc (alex_action_64),AlexAcc (alex_action_65),AlexAcc (alex_action_66),AlexAcc (alex_action_67),AlexAcc (alex_action_68),AlexAcc (alex_action_69),AlexAcc (alex_action_70),AlexAcc (alex_action_71),AlexAcc (alex_action_72),AlexAcc (alex_action_73),AlexAcc (alex_action_74),AlexAcc (alex_action_75),AlexAcc (alex_action_76),AlexAcc (alex_action_76),AlexAcc (alex_action_76),AlexAcc (alex_action_76)]
+{-# LINE 171 "src/Cryptol/Parser/Lexer.x" #-}
 
 -- This code is here because it depends on `comment`, which is defined
 -- in this file.
@@ -64,7 +73,7 @@
 -- | Returns the tokens in the last position of the input that we processed.
 -- White space is removed, and layout processing is done as requested.
 -- This stream is fed to the parser.
-lexer :: Config -> String -> ([Located Token], Position)
+lexer :: Config -> Text -> ([Located Token], Position)
 lexer cfg cs = ( case cfgLayout cfg of
                    Layout   -> layout cfg lexemes
                    NoLayout -> lexemes
@@ -75,15 +84,12 @@
 
 -- | Returns the tokens and the last position of the input that we processed.
 -- The tokens include whte space tokens.
-primLexer :: Config -> String -> ([Located Token], Position)
+primLexer :: Config -> Text -> ([Located Token], Position)
 primLexer cfg cs = run inp Normal
   where
   inp = Inp { alexPos           = start
             , alexInputPrevChar = '\n'
-            , input             = Text.unpack      -- XXX: Use Text
-                                $ unLit (cfgPreProc cfg)
-                                $ Text.pack cs
-            , moreBytes = [] }
+            , input             = unLit (cfgPreProc cfg) cs }
 
   singleR p = Range p p (cfgSource cfg)
 
@@ -98,7 +104,7 @@
           Normal        -> ([ Located (eofR $ alexPos i) (Token EOF "end of file") ]
                            , alexPos i
                            )
-          InComment p _ _ ->
+          InComment _ p _ _ ->
               ( [ Located (singleR p)
                 $ Token (Err UnterminatedComment) "unterminated comment"
                 ]
@@ -115,19 +121,14 @@
               , alexPos i)
 
       AlexError i'  ->
-          let p1 = alexPos i
-              p2 = alexPos i'
-              inp = input i
-              bad = if line p1 == line p2
-                      then take (col p2 - col p1) inp
-                      else takeWhile (/= '\n')    inp
+          let bad = Text.take 1 (input i)
           in
           ( [ Located (Range (alexPos i) (alexPos i') (cfgSource cfg))
                $ Token (Err LexicalError) bad ]
           , alexPos i')
       AlexSkip i' _ -> run i' s
       AlexToken i' l act ->
-        let txt         = take l (input i)
+        let txt         = Text.take (fromIntegral l) (input i)
             (mtok,s')   = act cfg (alexPos i) txt s
             (rest,pos)  = run i' $! s'
         in case mtok of
@@ -141,123 +142,107 @@
 char = 1
 comment = 2
 string = 3
-alex_action_0 =  startComment 
-alex_action_1 =  endComent 
-alex_action_2 =  addToComment 
-alex_action_3 =  addToComment 
-alex_action_4 =  addToString 
-alex_action_5 =  endString 
-alex_action_6 =  addToString 
-alex_action_7 =  endString 
-alex_action_8 =  addToChar 
-alex_action_9 =  endChar   
-alex_action_10 =  addToChar 
-alex_action_11 =  endChar   
-alex_action_12 =  emit $ White Space 
-alex_action_13 =  emit $ White LineComment 
-alex_action_14 =  emit $ KW KW_Arith 
-alex_action_15 =  emit $ KW KW_Bit 
-alex_action_16 =  emit $ KW KW_Cmp 
-alex_action_17 =  emit $ KW KW_False 
-alex_action_18 =  emit $ KW KW_inf 
-alex_action_19 =  emit $ KW KW_True 
-alex_action_20 =  emit $ KW KW_else 
-alex_action_21 =  emit $ KW KW_Eq 
-alex_action_22 =  emit $ KW KW_error 
-alex_action_23 =  emit $ KW KW_extern 
-alex_action_24 =  emit $ KW KW_fin 
-alex_action_25 =  emit $ KW KW_if 
-alex_action_26 =  emit $ KW KW_private 
-alex_action_27 =  emit $ KW KW_join 
-alex_action_28 =  emit $ KW KW_include 
-alex_action_29 =  emit $ KW KW_inf 
-alex_action_30 =  emit $ KW KW_lg2 
-alex_action_31 =  emit $ KW KW_lengthFromThen 
-alex_action_32 =  emit $ KW KW_lengthFromThenTo 
-alex_action_33 =  emit $ KW KW_max 
-alex_action_34 =  emit $ KW KW_min 
-alex_action_35 =  emit $ KW KW_module 
+alex_action_0 =  startComment False 
+alex_action_1 =  startComment True  
+alex_action_2 =  startEndComment    
+alex_action_3 =  endComent 
+alex_action_4 =  addToComment 
+alex_action_5 =  addToComment 
+alex_action_6 =  addToComment 
+alex_action_7 =  addToString 
+alex_action_8 =  endString 
+alex_action_9 =  addToString 
+alex_action_10 =  endString 
+alex_action_11 =  addToChar 
+alex_action_12 =  endChar   
+alex_action_13 =  addToChar 
+alex_action_14 =  endChar   
+alex_action_15 =  emit $ White Space 
+alex_action_16 =  emit $ White LineComment 
+alex_action_17 =  mkQualIdent 
+alex_action_18 =  mkQualOp 
+alex_action_19 =  emit $ KW KW_else 
+alex_action_20 =  emit $ KW KW_extern 
+alex_action_21 =  emit $ KW KW_if 
+alex_action_22 =  emit $ KW KW_private 
+alex_action_23 =  emit $ KW KW_include 
+alex_action_24 =  emit $ KW KW_module 
+alex_action_25 =  emit $ KW KW_newtype 
+alex_action_26 =  emit $ KW KW_pragma 
+alex_action_27 =  emit $ KW KW_property 
+alex_action_28 =  emit $ KW KW_then 
+alex_action_29 =  emit $ KW KW_type  
+alex_action_30 =  emit $ KW KW_where 
+alex_action_31 =  emit $ KW KW_let 
+alex_action_32 =  emit $ KW KW_x 
+alex_action_33 =  emit $ KW KW_import 
+alex_action_34 =  emit $ KW KW_as 
+alex_action_35 =  emit $ KW KW_hiding 
 alex_action_36 =  emit $ KW KW_newtype 
-alex_action_37 =  emit $ KW KW_pragma 
-alex_action_38 =  emit $ KW KW_property 
-alex_action_39 =  emit $ KW KW_pmult 
-alex_action_40 =  emit $ KW KW_pdiv 
-alex_action_41 =  emit $ KW KW_pmod 
-alex_action_42 =  emit $ KW KW_random 
-alex_action_43 =  emit $ KW KW_reverse 
-alex_action_44 =  emit $ KW KW_split 
-alex_action_45 =  emit $ KW KW_splitAt 
-alex_action_46 =  emit $ KW KW_then 
-alex_action_47 =  emit $ KW KW_transpose 
-alex_action_48 =  emit $ KW KW_type  
-alex_action_49 =  emit $ KW KW_where 
-alex_action_50 =  emit $ KW KW_let 
-alex_action_51 =  emit $ KW KW_x 
-alex_action_52 =  emit $ KW KW_zero 
-alex_action_53 =  emit $ KW KW_import 
-alex_action_54 =  emit $ KW KW_as 
-alex_action_55 =  emit $ KW KW_hiding 
-alex_action_56 =  emit $ KW KW_newtype 
-alex_action_57 =  emitS (numToken 2  . drop 2) 
-alex_action_58 =  emitS (numToken 8  . drop 2) 
-alex_action_59 =  emitS (numToken 10 . drop 0) 
-alex_action_60 =  emitS (numToken 16 . drop 2) 
-alex_action_61 =  emit $ Sym Underscore 
-alex_action_62 =  mkIdent 
-alex_action_63 =  emit $ Op Plus 
-alex_action_64 =  emit $ Op Minus 
-alex_action_65 =  emit $ Op Mul 
-alex_action_66 =  emit $ Op Div 
-alex_action_67 =  emit $ Op Mod 
-alex_action_68 =  emit $ Op Exp 
-alex_action_69 =  emit $ Op NotEqual 
-alex_action_70 =  emit $ Op Equal 
-alex_action_71 =  emit $ Op EqualFun 
-alex_action_72 =  emit $ Op NotEqualFun 
-alex_action_73 =  emit $ Op GreaterThan 
-alex_action_74 =  emit $ Op LessThan 
-alex_action_75 =  emit $ Op LEQ 
-alex_action_76 =  emit $ Op GEQ 
-alex_action_77 =  emit $ Op ShiftR 
-alex_action_78 =  emit $ Op ShiftL 
-alex_action_79 =  emit $ Op RotR 
-alex_action_80 =  emit $ Op RotL 
-alex_action_81 =  emit $ Op Complement 
-alex_action_82 =  emit $ Op Xor  
-alex_action_83 =  emit $ Op Disj 
-alex_action_84 =  emit $ Op Conj 
-alex_action_85 =  emit $ Op Bang 
-alex_action_86 =  emit $ Op BangBang 
-alex_action_87 =  emit $ Op At 
-alex_action_88 =  emit $ Op AtAt 
-alex_action_89 =  emit $ Op Hash 
-alex_action_90 =  emit $ Sym Lambda 
-alex_action_91 =  emit $ Sym ArrR 
-alex_action_92 =  emit $ Sym ArrL 
-alex_action_93 =  emit $ Sym FatArrR 
-alex_action_94 =  emit $ Sym EqDef 
-alex_action_95 =  emit $ Sym Comma 
-alex_action_96 =  emit $ Sym Semi 
-alex_action_97 =  emit $ Sym Dot 
-alex_action_98 =  emit $ Sym Colon 
-alex_action_99 =  emit $ Sym ColonColon 
-alex_action_100 =  emit $ Sym BackTick 
-alex_action_101 =  emit $ Sym DotDot 
-alex_action_102 =  emit $ Sym DotDotDot 
-alex_action_103 =  emit $ Sym Bar 
-alex_action_104 =  emit $ Sym ParenL 
-alex_action_105 =  emit $ Sym ParenR 
-alex_action_106 =  emit $ Sym BracketL 
-alex_action_107 =  emit $ Sym BracketR 
-alex_action_108 =  emit $ Sym CurlyL 
-alex_action_109 =  emit $ Sym CurlyR 
-alex_action_110 =  emit $ Sym TriL 
-alex_action_111 =  emit $ Sym TriR 
-alex_action_112 =  startString 
-alex_action_113 =  startChar 
+alex_action_37 =  emit $ KW KW_infixl 
+alex_action_38 =  emit $ KW KW_infixr 
+alex_action_39 =  emit $ KW KW_infix  
+alex_action_40 =  emit $ KW KW_primitive 
+alex_action_41 =  emitS (numToken 2  . drop 2) 
+alex_action_42 =  emitS (numToken 8  . drop 2) 
+alex_action_43 =  emitS (numToken 10 . drop 0) 
+alex_action_44 =  emitS (numToken 16 . drop 2) 
+alex_action_45 =  emit $ Sym Underscore 
+alex_action_46 =  mkIdent 
+alex_action_47 =  emit $ Sym Lambda 
+alex_action_48 =  emit $ Sym ArrR 
+alex_action_49 =  emit $ Sym ArrL 
+alex_action_50 =  emit $ Sym FatArrR 
+alex_action_51 =  emit $ Sym EqDef 
+alex_action_52 =  emit $ Sym Comma 
+alex_action_53 =  emit $ Sym Semi 
+alex_action_54 =  emit $ Sym Dot 
+alex_action_55 =  emit $ Sym Colon 
+alex_action_56 =  emit $ Sym BackTick 
+alex_action_57 =  emit $ Sym DotDot 
+alex_action_58 =  emit $ Sym DotDotDot 
+alex_action_59 =  emit $ Sym Bar 
+alex_action_60 =  emit $ Sym ParenL 
+alex_action_61 =  emit $ Sym ParenR 
+alex_action_62 =  emit $ Sym BracketL 
+alex_action_63 =  emit $ Sym BracketR 
+alex_action_64 =  emit $ Sym CurlyL 
+alex_action_65 =  emit $ Sym CurlyR 
+alex_action_66 =  emit $ Sym TriL 
+alex_action_67 =  emit $ Sym TriR 
+alex_action_68 =  startString 
+alex_action_69 =  startChar 
+alex_action_70 =  emit  (Op   Plus ) 
+alex_action_71 =  emit  (Op   Minus) 
+alex_action_72 =  emit  (Op   Mul  ) 
+alex_action_73 =  emit  (Op   Exp  ) 
+alex_action_74 =  emit  (Op   Hash ) 
+alex_action_75 =  emit  (Op   Complement) 
+alex_action_76 =  emitS (Op . Other []) 
 {-# LINE 1 "templates/GenericTemplate.hs" #-}
 {-# LINE 1 "templates/GenericTemplate.hs" #-}
 {-# LINE 1 "<built-in>" #-}
+{-# LINE 18 "<built-in>" #-}
+{-# LINE 1 "/usr/local/Cellar/ghc/7.10.3a/lib/ghc-7.10.3/include/ghcversion.h" #-}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+{-# LINE 19 "<built-in>" #-}
 {-# LINE 1 "templates/GenericTemplate.hs" #-}
 -- -----------------------------------------------------------------------------
 -- ALEX TEMPLATE
@@ -316,8 +301,8 @@
   narrow32Int# i
   where
    i    = word2Int# ((b3 `uncheckedShiftL#` 24#) `or#`
-                     (b2 `uncheckedShiftL#` 16#) `or#`
-                     (b1 `uncheckedShiftL#` 8#) `or#` b0)
+		     (b2 `uncheckedShiftL#` 16#) `or#`
+		     (b1 `uncheckedShiftL#` 8#) `or#` b0)
    b3   = int2Word# (ord# (indexCharOffAddr# arr (off' +# 3#)))
    b2   = int2Word# (ord# (indexCharOffAddr# arr (off' +# 2#)))
    b1   = int2Word# (ord# (indexCharOffAddr# arr (off' +# 1#)))
@@ -357,30 +342,30 @@
 
 alexScanUser user input (I# (sc))
   = case alex_scan_tkn user input 0# input sc AlexNone of
-        (AlexNone, input') ->
-                case alexGetByte input of
-                        Nothing -> 
+	(AlexNone, input') ->
+		case alexGetByte input of
+			Nothing -> 
 
 
 
-                                   AlexEOF
-                        Just _ ->
+				   AlexEOF
+			Just _ ->
 
 
 
-                                   AlexError input'
+				   AlexError input'
 
-        (AlexLastSkip input'' len, _) ->
+	(AlexLastSkip input'' len, _) ->
 
 
 
-                AlexSkip input'' len
+		AlexSkip input'' len
 
-        (AlexLastAcc k input''' len, _) ->
+	(AlexLastAcc k input''' len, _) ->
 
 
 
-                AlexToken input''' len k
+		AlexToken input''' len k
 
 
 -- Push the input through the DFA, remembering the most recent accepting
@@ -389,7 +374,7 @@
 alex_scan_tkn user orig_input len input s last_acc =
   input `seq` -- strict in the input
   let 
-        new_acc = (check_accs (alex_accept `quickIndex` (I# (s))))
+	new_acc = (check_accs (alex_accept `quickIndex` (I# (s))))
   in
   new_acc `seq`
   case alexGetByte input of
@@ -403,23 +388,23 @@
                 base   = alexIndexInt32OffAddr alex_base s
                 offset = (base +# ord_c)
                 check  = alexIndexInt16OffAddr alex_check offset
-                
+		
                 new_s = if GTE(offset,0#) && EQ(check,ord_c)
-                          then alexIndexInt16OffAddr alex_table offset
-                          else alexIndexInt16OffAddr alex_deflt s
-        in
+			  then alexIndexInt16OffAddr alex_table offset
+			  else alexIndexInt16OffAddr alex_deflt s
+	in
         case new_s of
-            -1# -> (new_acc, input)
-                -- on an error, we want to keep the input *before* the
-                -- character that failed, not after.
-            _ -> alex_scan_tkn user orig_input (if c < 0x80 || c >= 0xC0 then (len +# 1#) else len)
+	    -1# -> (new_acc, input)
+		-- on an error, we want to keep the input *before* the
+		-- character that failed, not after.
+    	    _ -> alex_scan_tkn user orig_input (if c < 0x80 || c >= 0xC0 then (len +# 1#) else len)
                                                 -- note that the length is increased ONLY if this is the 1st byte in a char encoding)
-                        new_input new_s new_acc
+			new_input new_s new_acc
       }
   where
-        check_accs (AlexAccNone) = last_acc
-        check_accs (AlexAcc a  ) = AlexLastAcc a input (I# (len))
-        check_accs (AlexAccSkip) = AlexLastSkip  input (I# (len))
+	check_accs (AlexAccNone) = last_acc
+	check_accs (AlexAcc a  ) = AlexLastAcc a input (I# (len))
+	check_accs (AlexAccSkip) = AlexLastSkip  input (I# (len))
 
 {-# LINE 198 "templates/GenericTemplate.hs" #-}
 
@@ -429,12 +414,17 @@
   | AlexLastSkip  !AlexInput !Int
 
 instance Functor AlexLastAcc where
-    fmap _ AlexNone = AlexNone
+    fmap f AlexNone = AlexNone
     fmap f (AlexLastAcc x y z) = AlexLastAcc (f x) y z
-    fmap _ (AlexLastSkip x y) = AlexLastSkip x y
+    fmap f (AlexLastSkip x y) = AlexLastSkip x y
 
 data AlexAcc a user
   = AlexAccNone
   | AlexAcc a
   | AlexAccSkip
+
+{-# LINE 242 "templates/GenericTemplate.hs" #-}
+
+-- used by wrappers
+iUnbox (I# (i)) = i
 
diff --git a/lib/Cryptol.cry b/lib/Cryptol.cry
--- a/lib/Cryptol.cry
+++ b/lib/Cryptol.cry
@@ -1,11 +1,300 @@
 /*
- * Copyright (c) 2013-2015 Galois, Inc.
+ * Copyright (c) 2013-2016 Galois, Inc.
  * Distributed under the terms of the BSD3 license (see LICENSE file)
  */
 
 module Cryptol where
 
+/**
+ * The value corresponding to a numeric type.
+ */
+primitive demote : {val, bits} (fin val, fin bits, bits >= width val) => [bits]
+
+infixr 10 ||
+infixr 20 &&
+infix  30 ==, ===, !=, !==
+infix  40 >, >=, <, <=
+infixl 50 ^
+infixr 60 #
+infixl 70 <<, <<<, >>, >>>
+infixl 80 +, -
+infixl 90 *, /
+infixr 95 ^^
+infixl 100 @, @@, !, !!
+
+/**
+ * Add two values.
+ *  * For words, addition uses modulo arithmetic.
+ *  * Structured values are added element-wise.
+ */
+primitive (+) : {a} (Arith a) => a -> a -> a
+
+/**
+ * For words, subtraction uses modulo arithmetic.
+ * Structured values are subtracted element-wise. Defined as:
+ * a - b = a + negate b
+ * See also: `negate'.
+ */
+primitive (-) : {a} (Arith a) => a -> a -> a
+
+/**
+ * For words, multiplies two words, modulus 2^^a.
+ * Structured values are multiplied element-wise.
+ */
+primitive (*) : {a} (Arith a) => a -> a -> a
+
+/**
+ * For words, divides two words, modulus 2^^a.
+ * Structured values are divided element-wise.
+ */
+primitive (/) : {a} (Arith a) => a -> a -> a
+
+/**
+ * For words, takes the modulus of two words, modulus 2^^a.
+ * Over structured values, operates element-wise.
+ * Be careful, as this will often give unexpected results due to interaction of
+ * the two moduli.
+ */
+primitive (%) : {a} (Arith a) => a -> a -> a
+
+/**
+ * For words, takes the exponent of two words, modulus 2^^a.
+ * Over structured values, operates element-wise.
+ * Be careful, due to its fast-growing nature, exponentiation is prone to
+ * interacting poorly with defaulting.
+ */
+primitive (^^) : {a} (Arith a) => a -> a -> a
+
+/**
+ * Log base two.
+ *
+ * For words, computes the ceiling of log, base 2, of a number.
+ * Over structured values, operates element-wise.
+ */
+primitive lg2 : {a} (Arith a) => a -> a
+
+
 type Bool = Bit
+
+/**
+ * The constant True. Corresponds to the bit value 1.
+ */
+primitive True  : Bit
+
+/**
+ * The constant False. Corresponds to the bit value 0.
+ */
+primitive False : Bit
+
+/**
+ * Returns the twos complement of its argument.
+ * Over structured values, operates element-wise.
+ * negate a = ~a + 1
+ */
+primitive negate : {a} (Arith a) => a -> a
+
+/**
+ * Binary complement
+ */
+primitive complement : {a} a -> a
+
+/**
+ * Less-than. Only works on comparable arguments.
+ */
+primitive (<) : {a} (Cmp a) => a -> a -> Bit
+
+/**
+ * Greater-than of two comparable arguments.
+ */
+primitive (>) : {a} (Cmp a) => a -> a -> Bit
+
+/**
+ * Less-than or equal of two comparable arguments.
+ */
+primitive (<=) : {a} (Cmp a) => a -> a -> Bit
+
+/**
+ * Greater-than or equal of two comparable arguments.
+ */
+primitive (>=) : {a} (Cmp a) => a -> a -> Bit
+
+/**
+ * Compares any two values of the same type for equality.
+ */
+primitive (==) : {a} (Cmp a) => a -> a -> Bit
+
+/**
+ * Compares any two values of the same type for inequality.
+ */
+primitive (!=) : {a} (Cmp a) => a -> a -> Bit
+
+/**
+ * Compare the outputs of two functions for equality
+ */
+(===) : {a,b} (Cmp b) => (a -> b) -> (a -> b) -> (a -> Bit)
+f === g = \ x -> f x == g x
+
+/**
+ * Compare the outputs of two functions for inequality
+ */
+(!==) : {a,b} (Cmp b) => (a -> b) -> (a -> b) -> (a -> Bit)
+f !== g = \x -> f x != g x
+
+/**
+ * Returns the smaller of two comparable arguments.
+ */
+min : {a} (Cmp a) => a -> a -> a
+min x y = if x < y then x else y
+
+/**
+ * Returns the greater of two comparable arguments.
+ */
+max : {a} (Cmp a) => a -> a -> a
+max x y = if x > y then x else y
+
+/**
+ * Logical `and' over bits. Extends element-wise over sequences, tuples.
+ */
+primitive (&&) : {a} a -> a -> a
+
+/**
+ * Logical `or' over bits. Extends element-wise over sequences, tuples.
+ */
+primitive (||) : {a} a -> a -> a
+
+/**
+ * Logical `exclusive or' over bits. Extends element-wise over sequences, tuples.
+ */
+primitive (^) : {a} a -> a -> a
+
+/**
+ * Gives an arbitrary shaped value whose bits are all False.
+ * ~zero likewise gives an arbitrary shaped value whose bits are all True.
+ */
+primitive zero : {a} a
+
+/**
+ * Left shift.  The first argument is the sequence to shift, the second is the
+ * number of positions to shift by.
+*/
+primitive (<<) : {a, b, c} (fin b) => [a]c -> [b] -> [a]c
+
+/**
+ * Right shift.  The first argument is the sequence to shift, the second is the
+ * number of positions to shift by.
+ */
+primitive (>>) : {a, b, c} (fin b) => [a]c -> [b] -> [a]c
+
+/**
+ * Left rotate.  The first argument is the sequence to rotate, the second is the
+ * number of positions to rotate by.
+ */
+primitive (<<<) : {a, b, c} (fin a, fin b) => [a]c -> [b] -> [a]c
+
+/**
+ * Right rotate.  The first argument is the sequence to rotate, the second is
+ * the number of positions to rotate by.
+ */
+primitive (>>>) : {a, b, c} (fin a, fin b) => [a]c -> [b] -> [a]c
+
+primitive (#) : {front, back, a} (fin front) => [front]a -> [back]a
+                                             -> [front + back] a
+
+
+/**
+ * Split a sequence into a tuple of sequences.
+ */
+primitive splitAt : {front, back, a} (fin front) => [front + back]a
+                                                 -> ([front]a, [back]a)
+
+/**
+ * Joins sequences.
+ */
+primitive join : {parts, each, a} (fin each) => [parts][each]a
+                                             -> [parts * each]a
+
+/**
+ * Splits a sequence into 'parts' groups with 'each' elements.
+ */
+primitive split : {parts, each, a} (fin each) => [parts * each]a
+                                              -> [parts][each]a
+
+/**
+ * Reverses the elements in a sequence.
+ */
+primitive reverse : {a, b} (fin a) => [a]b -> [a]b
+
+/**
+ * Transposes an [a][b] matrix into a [b][a] matrix.
+ */
+primitive transpose : {a, b, c} [a][b]c -> [b][a]c
+
+/**
+ * Index operator.  The first argument is a sequence.  The second argument is
+ * the zero-based index of the element to select from the sequence.
+ */
+primitive (@) : {a, b, c} (fin c) => [a]b -> [c] -> b
+
+/**
+ * Bulk index operator.  The first argument is a sequence.  The second argument
+ * is a sequence of the zero-based indices of the elements to select.
+ */
+primitive (@@) : {a, b, c, d} (fin d) => [a]b -> [c][d] -> [c]b
+
+/**
+ * Reverse index operator.  The first argument is a finite sequence.  The second
+ * argument is the zero-based index of the element to select, starting from the
+ * end of the sequence.
+ */
+primitive (!) : {a, b, c} (fin a, fin c) => [a]b -> [c] -> b
+
+/**
+ * Bulk reverse index operator.  The first argument is a finite sequence.  The
+ * second argument is a sequence of the zero-based indices of the elements to
+ * select, starting from the end of the sequence.
+ */
+primitive (!!) : {a, b, c, d} (fin a, fin d) => [a]b -> [c][d] -> [c]b
+
+primitive fromThen : {first, next, bits, len}
+                     ( fin first, fin next, fin bits
+                     , bits >= width first, bits >= width next
+                     , lengthFromThen first next bits == len) => [len][bits]
+
+primitive fromTo : {first, last, bits} (fin last, fin bits, last >= first,
+                              bits >= width last) => [1 + (last - first)][bits]
+
+primitive fromThenTo : {first, next, last, bits, len} (fin first, fin next,
+                        fin last, fin bits, bits >= width first,
+                        bits >= width next, bits >= width last,
+                        lengthFromThenTo first next last == len) => [len][bits]
+
+primitive infFrom : {bits} (fin bits) => [bits] -> [inf][bits]
+
+primitive infFromThen : {bits} (fin bits) => [bits] -> [bits] -> [inf][bits]
+
+primitive error : {at, len} (fin len) => [len][8] -> at
+
+/**
+ * Performs multiplication of polynomials over GF(2).
+ */
+primitive pmult : {a, b} (fin a, fin b) => [a] -> [b] -> [max 1 (a + b) - 1]
+
+/**
+ * Performs division of polynomials over GF(2).
+ */
+primitive pdiv : {a, b} (fin a, fin b) => [a] -> [b] -> [a]
+
+/**
+ * Performs modulus of polynomials over GF(2).
+ */
+primitive pmod : {a, b} (fin a, fin b) => [a] -> [1 + b] -> [b]
+
+/**
+ * Generates random values from a seed.  When called with a function, currently
+ * generates a function that always returns zero.
+ */
+primitive random : {a} [256] -> a
+
 type String n = [n][8]
 type Word n = [n]
 type Char   = [8]
@@ -32,4 +321,3 @@
 groupBy : {each,parts,elem} (fin each) =>
   [parts * each] elem -> [parts][each]elem
 groupBy = split`{parts=parts}
-
diff --git a/lib/Cryptol/Extras.cry b/lib/Cryptol/Extras.cry
new file mode 100644
--- /dev/null
+++ b/lib/Cryptol/Extras.cry
@@ -0,0 +1,143 @@
+/*
+ * Copyright (c) 2016 Galois, Inc.
+ * Distributed under the terms of the BSD3 license (see LICENSE file)
+ *
+ * This module contains definitions that we wish to eventually promote
+ * into the Prelude, but which currently cause typechecking of the
+ * Prelude to take too long (see #299)
+ */
+
+module Cryptol::Extras where
+
+infixr 5 ==>
+
+/**
+ * Logical implication
+ */
+(==>) : Bit -> Bit -> Bit
+a ==> b = if a then b else True
+
+/**
+ * Logical negation
+ */
+not : {a} a -> a
+not a = ~ a
+
+/**
+ * Conjunction
+ */
+and : {n} (fin n) => [n]Bit -> Bit
+and xs = ~zero == xs
+
+/**
+ * Disjunction
+ */
+or : {n} (fin n) => [n]Bit -> Bit
+or xs = zero != xs
+
+/**
+ * Conjunction after applying a predicate to all elements.
+ */
+all : {a,n} (fin n) => (a -> Bit) -> [n]a -> Bit
+all f xs = and (map f xs)
+
+/**
+ * Disjunction after applying a predicate to all elements.
+ */
+any : {a,n} (fin n) => (a -> Bit) -> [n]a -> Bit
+any f xs = or (map f xs)
+
+/**
+ * Map a function over an array.
+ */
+map : {a, b, n} (a -> b) -> [n]a -> [n]b
+map f xs = [f x | x <- xs]
+
+/**
+ * Functional left fold.
+ *
+ * foldl (+) 0 [1,2,3] = ((0 + 1) + 2) + 3
+ */
+foldl : {a, b, n} (fin n) => (a -> b -> a) -> a -> [n]b -> a
+foldl f acc xs = ys ! 0
+ where ys = [acc] # [f a x | a <- ys | x <- xs]
+
+/**
+ * Functional right fold.
+ *
+ * foldr (-) 0 [1,2,3] = 0 - (1 - (2 - 3))
+ */
+foldr : {a,b,n} (fin n) => (a -> b -> b) -> b -> [n]a -> b
+foldr f acc xs = ys ! 0
+ where ys = [acc] # [f x a | a <- ys | x <- reverse xs]
+
+/**
+ * Compute the sum of the words in the array.
+ */
+sum : {a,n} (fin n, Arith a) => [n]a -> a
+sum xs = foldl (+) zero xs
+
+/**
+ * Scan left is like a fold that emits the intermediate values.
+ */
+scanl : {b, a, n}  (b -> a -> b) -> b -> [n]a -> [n+1]b
+scanl f acc xs = ys
+ where
+  ys = [acc] # [f a x | a <- ys | x <- xs]
+
+/**
+ * Scan right
+ */
+scanr : {a,b,n} (fin n) => (a -> b -> b) -> b -> [n]a -> [n+1]b
+scanr f acc xs = reverse ys
+    where
+     ys = [acc] # [f x a | a <- ys | x <- reverse xs]
+
+/**
+ * Zero extension
+ */
+extend : {total,n} (fin total, fin n, total >= n) => [n]Bit -> [total]Bit
+extend n = zero # n
+
+/**
+ * Signed extension. `extendSigned 0bwxyz : [8] == 0bwwwwwxyz`.
+ */
+extendSigned : {total,n} (fin total, fin n, n >= 1, total >= n+1) => [n]Bit -> [total]Bit
+extendSigned  xs = repeat (xs @ 0) # xs
+
+/**
+ * Repeat a value.
+ */
+repeat : {n, a} a -> [n]a
+repeat x = [ x | _ <- zero ]
+
+/**
+ * `elem x xs` Returns true if x is equal to a value in xs.
+ */
+elem : {n,a} (fin n, Cmp a) => a -> [n]a -> Bit
+elem a xs = any (\x -> x == a) xs
+
+/**
+ * Create a list of tuples from two lists.
+ */
+zip : {a,b,n} [n]a -> [n]b -> [n](a,b)
+zip xs ys = [(x,y) | x <- xs | y <- ys]
+
+/**
+ * Create a list by applying the function to each pair of elements in the input.
+ * lists
+ */
+zipWith : {a,b,c,n} (a -> b -> c) -> [n]a -> [n]b -> [n]c
+zipWith f xs ys = [f x y | x <- xs | y <- ys]
+
+/**
+ * Transform a function into uncurried form.
+ */
+uncurry : {a,b,c} (a -> b -> c) -> (a,b) -> c
+uncurry f = \(a,b) -> f a b
+
+/**
+ * Transform a function into curried form.
+ */
+curry : {a,b,c} ((a, b) -> c) -> a -> b -> c
+curry f = \a b -> f (a,b)
diff --git a/src/Cryptol/Eval.hs b/src/Cryptol/Eval.hs
--- a/src/Cryptol/Eval.hs
+++ b/src/Cryptol/Eval.hs
@@ -1,6 +1,6 @@
 -- |
 -- Module      :  $Header$
--- Copyright   :  (c) 2013-2015 Galois, Inc.
+-- Copyright   :  (c) 2013-2016 Galois, Inc.
 -- License     :  BSD3
 -- Maintainer  :  cryptol@galois.com
 -- Stability   :  provisional
@@ -23,17 +23,16 @@
 import Cryptol.Eval.Env
 import Cryptol.Eval.Type
 import Cryptol.Eval.Value
+import Cryptol.ModuleSystem.Name
 import Cryptol.TypeCheck.AST
 import Cryptol.Utils.Panic (panic)
 import Cryptol.Utils.PP
 import Cryptol.Prims.Eval
 
-import Data.List (transpose)
 import qualified Data.Map as Map
 
-#if __GLASGOW_HASKELL__ < 710
-import Data.Monoid (Monoid(..),mconcat)
-#endif
+import Prelude ()
+import Prelude.Compat
 
 -- Expression Evaluation -------------------------------------------------------
 
@@ -43,8 +42,6 @@
 evalExpr :: EvalEnv -> Expr -> Value
 evalExpr env expr = case expr of
 
-  ECon con -> evalECon con
-
   EList es ty -> VSeq (isTBit (evalType env ty)) (map (evalExpr env) es)
 
   ETuple es -> VTuple (map eval es)
@@ -97,7 +94,7 @@
 
 -- Newtypes --------------------------------------------------------------------
 
-evalNewtypes :: Map.Map QName Newtype -> EvalEnv -> EvalEnv
+evalNewtypes :: Map.Map Name Newtype -> EvalEnv -> EvalEnv
 evalNewtypes nts env = Map.foldl (flip evalNewtype) env nts
 
 -- | Introduce the constructor function for a newtype.
@@ -123,7 +120,11 @@
     NonRecursive d -> evalDecl env d env
 
 evalDecl :: ReadEnv -> Decl -> EvalEnv -> EvalEnv
-evalDecl renv d = bindVar (dName d) (evalExpr renv (dDefinition d))
+evalDecl renv d =
+  bindVar (dName d) $
+    case dDefinition d of
+      DPrim   -> evalPrim d
+      DExpr e -> evalExpr renv e
 
 
 -- Selectors -------------------------------------------------------------------
@@ -163,6 +164,71 @@
 
 
 
+-- List Comprehension Environments ---------------------------------------------
+
+-- | A variation of the ZipList type from Control.Applicative, with a
+-- separate constructor for pure values. This datatype is used to
+-- represent the list of values that each variable takes on within a
+-- list comprehension. The @Zip@ constructor is for bindings that take
+-- different values at different positions in the list, while the
+-- @Pure@ constructor is for bindings originating outside the list
+-- comprehension, which have the same value for all list positions.
+data ZList a = Pure a | Zip [a]
+
+getZList :: ZList a -> [a]
+getZList (Pure x) = repeat x
+getZList (Zip xs) = xs
+
+instance Functor ZList where
+  fmap f (Pure x) = Pure (f x)
+  fmap f (Zip xs) = Zip (map f xs)
+
+instance Applicative ZList where
+  pure x = Pure x
+  Pure f <*> Pure x = Pure (f x)
+  Pure f <*> Zip xs = Zip (map f xs)
+  Zip fs <*> Pure x = Zip (map ($ x) fs)
+  Zip fs <*> Zip xs = Zip (zipWith ($) fs xs)
+
+-- | Evaluation environments for list comprehensions: Each variable
+-- name is bound to a list of values, one for each element in the list
+-- comprehension.
+data ListEnv = ListEnv
+  { leVars :: Map.Map Name (ZList Value)
+  , leTypes :: Map.Map TVar TValue
+  }
+
+instance Monoid ListEnv where
+  mempty = ListEnv
+    { leVars  = Map.empty
+    , leTypes = Map.empty
+    }
+
+  mappend l r = ListEnv
+    { leVars  = Map.union (leVars  l) (leVars  r)
+    , leTypes = Map.union (leTypes l) (leTypes r)
+    }
+
+toListEnv :: EvalEnv -> ListEnv
+toListEnv e =
+  ListEnv
+  { leVars = fmap Pure (envVars e)
+  , leTypes = envTypes e
+  }
+
+-- | Take parallel slices of the list environment. If some names are
+-- bound to longer lists of values (e.g. if they come from a different
+-- parallel branch of a comprehension) then the last elements will be
+-- dropped as the lists are zipped together.
+zipListEnv :: ListEnv -> [EvalEnv]
+zipListEnv (ListEnv vm tm) =
+  [ EvalEnv { envVars = v, envTypes = tm }
+  | v <- getZList (sequenceA vm) ]
+
+bindVarList :: Name -> [Value] -> ListEnv -> ListEnv
+bindVarList n vs lenv = lenv { leVars = Map.insert n (Zip vs) (leVars lenv) }
+
+
 -- List Comprehensions ---------------------------------------------------------
 
 -- | Evaluate a comprehension.
@@ -176,37 +242,35 @@
   -- XXX we could potentially print this as a number if the type was available.
   where
   -- generate a new environment for each iteration of each parallel branch
-  benvs = map (branchEnvs env) ms
-
-  -- take parallel slices of each environment.  when the length of the list
-  -- drops below the number of branches, one branch has terminated.
-  allBranches es = length es == length ms
-  slices         = takeWhile allBranches (transpose benvs)
+  benvs :: [ListEnv]
+  benvs = map (branchEnvs (toListEnv env)) ms
 
   -- join environments to produce environments at each step through the process.
-  envs = map mconcat slices
+  envs :: [EvalEnv]
+  envs = zipListEnv (mconcat benvs)
 
 -- | Turn a list of matches into the final environments for each iteration of
 -- the branch.
-branchEnvs :: ReadEnv -> [Match] -> [EvalEnv]
-branchEnvs env matches = case matches of
-
-  m:ms -> do
-    env' <- evalMatch env m
-    branchEnvs env' ms
-
-  [] -> return env
+branchEnvs :: ListEnv -> [Match] -> ListEnv
+branchEnvs env matches = foldl evalMatch env matches
 
 -- | Turn a match into the list of environments it represents.
-evalMatch :: EvalEnv -> Match -> [EvalEnv]
-evalMatch env m = case m of
+evalMatch :: ListEnv -> Match -> ListEnv
+evalMatch lenv m = case m of
 
   -- many envs
-  From n _ty expr -> do
-    e <- fromSeq (evalExpr env expr)
-    return (bindVar n e env)
+  From n _ty expr -> bindVarList n (concat vss) lenv'
+    where
+      vss = [ fromSeq (evalExpr env expr) | env <- zipListEnv lenv ]
+      stutter (Pure x) = Pure x
+      stutter (Zip xs) = Zip [ x | (x, vs) <- zip xs vss, _ <- vs ]
+      lenv' = lenv { leVars = fmap stutter (leVars lenv) }
 
   -- XXX we don't currently evaluate these as though they could be recursive, as
-  -- they are typechecked that way; the read environment to evalDecl is the same
+  -- they are typechecked that way; the read environment to evalExpr is the same
   -- as the environment to bind a new name in.
-  Let d -> [evalDecl env d env]
+  Let d -> bindVarList (dName d) (map f (zipListEnv lenv)) lenv
+    where f env =
+            case dDefinition d of
+              DPrim   -> evalPrim d
+              DExpr e -> evalExpr env e
diff --git a/src/Cryptol/Eval/Arch.hs b/src/Cryptol/Eval/Arch.hs
--- a/src/Cryptol/Eval/Arch.hs
+++ b/src/Cryptol/Eval/Arch.hs
@@ -1,6 +1,6 @@
 -- |
 -- Module      :  $Header$
--- Copyright   :  (c) 2014-2015 Galois, Inc.
+-- Copyright   :  (c) 2014-2016 Galois, Inc.
 -- License     :  BSD3
 -- Maintainer  :  cryptol@galois.com
 -- Stability   :  provisional
diff --git a/src/Cryptol/Eval/Env.hs b/src/Cryptol/Eval/Env.hs
--- a/src/Cryptol/Eval/Env.hs
+++ b/src/Cryptol/Eval/Env.hs
@@ -1,6 +1,6 @@
 -- |
 -- Module      :  $Header$
--- Copyright   :  (c) 2013-2015 Galois, Inc.
+-- Copyright   :  (c) 2013-2016 Galois, Inc.
 -- License     :  BSD3
 -- Maintainer  :  cryptol@galois.com
 -- Stability   :  provisional
@@ -8,28 +8,34 @@
 
 {-# LANGUAGE FlexibleInstances #-}
 {-# LANGUAGE Safe #-}
-
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE CPP #-}
 module Cryptol.Eval.Env where
 
 import Cryptol.Eval.Value
+import Cryptol.ModuleSystem.Name
 import Cryptol.TypeCheck.AST
 import Cryptol.Utils.PP
 
 import qualified Data.Map as Map
 
-#if __GLASGOW_HASKELL__ < 710
-import           Data.Monoid (Monoid(..))
-#endif
+import GHC.Generics (Generic)
+import Control.DeepSeq.Generics
 
+import Prelude ()
+import Prelude.Compat
+
 -- Evaluation Environment ------------------------------------------------------
 
 type ReadEnv = EvalEnv
 
 data EvalEnv = EvalEnv
-  { envVars       :: Map.Map QName Value
+  { envVars       :: Map.Map Name Value
   , envTypes      :: Map.Map TVar TValue
-  }
+  } deriving (Generic)
 
+instance NFData EvalEnv where rnf = genericRnf
+
 instance Monoid EvalEnv where
   mempty = EvalEnv
     { envVars       = Map.empty
@@ -50,11 +56,11 @@
 emptyEnv  = mempty
 
 -- | Bind a variable in the evaluation environment.
-bindVar :: QName -> Value -> EvalEnv -> EvalEnv
+bindVar :: Name -> Value -> EvalEnv -> EvalEnv
 bindVar n val env = env { envVars = Map.insert n val (envVars env) }
 
 -- | Lookup a variable in the environment.
-lookupVar :: QName -> EvalEnv -> Maybe Value
+lookupVar :: Name -> EvalEnv -> Maybe Value
 lookupVar n env = Map.lookup n (envVars env)
 
 -- | Bind a type variable of kind *.
diff --git a/src/Cryptol/Eval/Error.hs b/src/Cryptol/Eval/Error.hs
--- a/src/Cryptol/Eval/Error.hs
+++ b/src/Cryptol/Eval/Error.hs
@@ -1,6 +1,6 @@
 -- |
 -- Module      :  $Header$
--- Copyright   :  (c) 2013-2015 Galois, Inc.
+-- Copyright   :  (c) 2013-2016 Galois, Inc.
 -- License     :  BSD3
 -- Maintainer  :  cryptol@galois.com
 -- Stability   :  provisional
diff --git a/src/Cryptol/Eval/Type.hs b/src/Cryptol/Eval/Type.hs
--- a/src/Cryptol/Eval/Type.hs
+++ b/src/Cryptol/Eval/Type.hs
@@ -1,6 +1,6 @@
 -- |
 -- Module      :  $Header$
--- Copyright   :  (c) 2013-2015 Galois, Inc.
+-- Copyright   :  (c) 2013-2016 Galois, Inc.
 -- License     :  BSD3
 -- Maintainer  :  cryptol@galois.com
 -- Stability   :  provisional
@@ -49,7 +49,6 @@
   | TCMul           <- f, [x,y]   <- vs  =      nMul x y
   | TCDiv           <- f, [x,y]   <- vs  = mb $ nDiv x y
   | TCMod           <- f, [x,y]   <- vs  = mb $ nMod x y
-  | TCLg2           <- f, [x]     <- vs  =      nLg2 x
   | TCWidth         <- f, [x]     <- vs  =      nWidth x
   | TCExp           <- f, [x,y]   <- vs  =      nExp x y
   | TCMin           <- f, [x,y]   <- vs  =      nMin x y
diff --git a/src/Cryptol/Eval/Value.hs b/src/Cryptol/Eval/Value.hs
--- a/src/Cryptol/Eval/Value.hs
+++ b/src/Cryptol/Eval/Value.hs
@@ -1,6 +1,6 @@
 -- |
 -- Module      :  $Header$
--- Copyright   :  (c) 2013-2015 Galois, Inc.
+-- Copyright   :  (c) 2013-2016 Galois, Inc.
 -- License     :  BSD3
 -- Maintainer  :  cryptol@galois.com
 -- Stability   :  provisional
@@ -11,22 +11,25 @@
 {-# LANGUAGE FlexibleInstances #-}
 {-# LANGUAGE MultiParamTypeClasses #-}
 {-# LANGUAGE Safe #-}
-
+{-# LANGUAGE DeriveGeneric #-}
 module Cryptol.Eval.Value where
 
 import qualified Cryptol.Eval.Arch as Arch
 import Cryptol.Eval.Error
-import Cryptol.Prims.Syntax (ECon(..))
 import Cryptol.TypeCheck.AST
 import Cryptol.TypeCheck.Solver.InfNat(Nat'(..))
+import Cryptol.Utils.Ident (Ident,mkIdent)
 import Cryptol.Utils.PP
 import Cryptol.Utils.Panic(panic)
 
 import Control.Monad (guard, zipWithM)
 import Data.List(genericTake)
 import Data.Bits (setBit,testBit,(.&.),shiftL)
+import qualified Data.Text as T
 import Numeric (showIntAtBase)
 
+import GHC.Generics (Generic)
+import Control.DeepSeq.Generics
 
 -- Utilities -------------------------------------------------------------------
 
@@ -47,7 +50,7 @@
 isTTuple (TValue (TCon (TC (TCTuple n)) ts)) = Just (n, map TValue ts)
 isTTuple _ = Nothing
 
-isTRec :: TValue -> Maybe [(Name, TValue)]
+isTRec :: TValue -> Maybe [(Ident, TValue)]
 isTRec (TValue (TRec fs)) = Just [ (x, TValue t) | (x,t) <- fs ]
 isTRec _ = Nothing
 
@@ -76,17 +79,19 @@
 
 -- Values ----------------------------------------------------------------------
 
-data BV = BV !Integer !Integer -- ^ width, value
-                               -- The value may contain junk bits
+-- | width, value
+-- Invariant: The value must be within the range 0 .. 2^width-1
+data BV = BV !Integer !Integer deriving (Generic)
 
+instance NFData BV where rnf = genericRnf
+
 -- | Smart constructor for 'BV's that checks for the width limit
 mkBv :: Integer -> Integer -> BV
-mkBv w i | w >= Arch.maxBigIntWidth = wordTooWide w
-         | otherwise = BV w i
+mkBv w i = BV w (mask w i)
 
 -- | Generic value type, parameterized by bit and word types.
 data GenValue b w
-  = VRecord [(Name, GenValue b w)]      -- @ { .. } @
+  = VRecord [(Ident, GenValue b w)]     -- @ { .. } @
   | VTuple [GenValue b w]               -- @ ( .. ) @
   | VBit b                              -- @ Bit    @
   | VSeq Bool [GenValue b w]            -- @ [n]a   @
@@ -96,13 +101,18 @@
   | VStream [GenValue b w]              -- @ [inf]a @
   | VFun (GenValue b w -> GenValue b w) -- functions
   | VPoly (TValue -> GenValue b w)      -- polymorphic values (kind *)
+  deriving (Generic)
 
+instance (NFData b, NFData w) => NFData (GenValue b w) where rnf = genericRnf
+
 type Value = GenValue Bool BV
 
 -- | An evaluated type.
 -- These types do not contain type variables, type synonyms, or type functions.
-newtype TValue = TValue { tValTy :: Type }
+newtype TValue = TValue { tValTy :: Type } deriving (Generic)
 
+instance NFData TValue where rnf = genericRnf
+
 instance Show TValue where
   showsPrec p (TValue v) = showsPrec p v
 
@@ -131,7 +141,7 @@
     VSeq isWord vals
        | isWord        -> ppWord opts (fromVWord val)
        | otherwise     -> ppWordSeq vals
-    VWord (BV w i)     -> ppWord opts (BV w (mask w i))
+    VWord (BV w i)     -> ppWord opts (BV w i)
     VStream vals       -> brackets $ fsep
                                    $ punctuate comma
                                    ( take (useInfLength opts) (map loop vals)
@@ -227,7 +237,7 @@
 
 -- | Create a packed word of n bits.
 word :: Integer -> Integer -> Value
-word n i = VWord (mkBv n (mask n i))
+word n i = VWord (mkBv n i)
 
 lam :: (GenValue b w -> GenValue b w) -> GenValue b w
 lam  = VFun
@@ -292,7 +302,6 @@
 fromStr = map (toEnum . fromInteger . fromWord) . fromSeq
 
 -- | Extract a packed word.
--- Note that this does not clean-up any junk bits in the word.
 fromVWord :: BitWord b w => GenValue b w -> w
 fromVWord val = case val of
   VWord bv                -> bv -- this should always mask
@@ -308,9 +317,8 @@
 
 -- | Turn a value into an integer represented by w bits.
 fromWord :: Value -> Integer
-fromWord val = mask w a
-  where
-  BV w a = fromVWord val
+fromWord val = a
+  where BV _ a = fromVWord val
 
 -- | Extract a function from a value.
 fromVFun :: GenValue b w -> (GenValue b w -> GenValue b w)
@@ -331,13 +339,13 @@
   _         -> evalPanic "fromVTuple" ["not a tuple"]
 
 -- | Extract a record from a value.
-fromVRecord :: GenValue b w -> [(Name, GenValue b w)]
+fromVRecord :: GenValue b w -> [(Ident, GenValue b w)]
 fromVRecord val = case val of
   VRecord fs -> fs
   _          -> evalPanic "fromVRecord" ["not a record"]
 
 -- | Lookup a field in a record.
-lookupRecord :: Name -> GenValue b w -> GenValue b w
+lookupRecord :: Ident -> GenValue b w -> GenValue b w
 lookupRecord f rec = case lookup f (fromVRecord rec) of
   Just val -> val
   Nothing  -> evalPanic "lookupRecord" ["malformed record"]
@@ -348,33 +356,38 @@
 -- this value, if we can determine it.
 --
 -- XXX: View patterns would probably clean up this definition a lot.
-toExpr :: Type -> Value -> Maybe Expr
-toExpr ty val = case (ty, val) of
-  (TRec tfs, VRecord vfs) -> do
-    let fns = map fst vfs
-    guard (map fst tfs == fns)
-    fes <- zipWithM toExpr (map snd tfs) (map snd vfs)
-    return $ ERec (zip fns fes)
-  (TCon (TC (TCTuple tl)) ts, VTuple tvs) -> do
-    guard (tl == (length tvs))
-    ETuple `fmap` zipWithM toExpr ts tvs
-  (TCon (TC TCBit) [], VBit True ) -> return $ ECon ECTrue
-  (TCon (TC TCBit) [], VBit False) -> return $ ECon ECFalse
-  (TCon (TC TCSeq) [a,b], VSeq _ []) -> do
-    guard (a == tZero)
-    return $ EList [] b
-  (TCon (TC TCSeq) [a,b], VSeq _ svs) -> do
-    guard (a == tNum (length svs))
-    ses <- mapM (toExpr b) svs
-    return $ EList ses b
-  (TCon (TC TCSeq) [a,(TCon (TC TCBit) [])], VWord (BV w v)) -> do
-    guard (a == tNum w)
-    return $ ETApp (ETApp (ECon ECDemote) (tNum v)) (tNum w)
-  (_, VStream _) -> fail "cannot construct infinite expressions"
-  (_, VFun    _) -> fail "cannot convert function values to expressions"
-  (_, VPoly   _) -> fail "cannot convert polymorphic values to expressions"
-  _ -> panic "Cryptol.Eval.Value.toExpr"
-         ["type mismatch:"
-         , pretty ty
-         , render (ppValue defaultPPOpts val)
-         ]
+toExpr :: PrimMap -> Type -> Value -> Maybe Expr
+toExpr prims = go
+  where
+
+  prim n = ePrim prims (mkIdent (T.pack n))
+
+  go ty val = case (ty, val) of
+    (TRec tfs, VRecord vfs) -> do
+      let fns = map fst vfs
+      guard (map fst tfs == fns)
+      fes <- zipWithM go (map snd tfs) (map snd vfs)
+      return $ ERec (zip fns fes)
+    (TCon (TC (TCTuple tl)) ts, VTuple tvs) -> do
+      guard (tl == (length tvs))
+      ETuple `fmap` zipWithM go ts tvs
+    (TCon (TC TCBit) [], VBit True ) -> return (prim "True")
+    (TCon (TC TCBit) [], VBit False) -> return (prim "False")
+    (TCon (TC TCSeq) [a,b], VSeq _ []) -> do
+      guard (a == tZero)
+      return $ EList [] b
+    (TCon (TC TCSeq) [a,b], VSeq _ svs) -> do
+      guard (a == tNum (length svs))
+      ses <- mapM (go b) svs
+      return $ EList ses b
+    (TCon (TC TCSeq) [a,(TCon (TC TCBit) [])], VWord (BV w v)) -> do
+      guard (a == tNum w)
+      return $ ETApp (ETApp (prim "demote") (tNum v)) (tNum w)
+    (_, VStream _) -> fail "cannot construct infinite expressions"
+    (_, VFun    _) -> fail "cannot convert function values to expressions"
+    (_, VPoly   _) -> fail "cannot convert polymorphic values to expressions"
+    _ -> panic "Cryptol.Eval.Value.toExpr"
+           ["type mismatch:"
+           , pretty ty
+           , render (ppValue defaultPPOpts val)
+           ]
diff --git a/src/Cryptol/ModuleSystem.hs b/src/Cryptol/ModuleSystem.hs
--- a/src/Cryptol/ModuleSystem.hs
+++ b/src/Cryptol/ModuleSystem.hs
@@ -1,11 +1,13 @@
 -- |
 -- Module      :  $Header$
--- Copyright   :  (c) 2013-2015 Galois, Inc.
+-- Copyright   :  (c) 2013-2016 Galois, Inc.
 -- License     :  BSD3
 -- Maintainer  :  cryptol@galois.com
 -- Stability   :  provisional
 -- Portability :  portable
 
+{-# LANGUAGE FlexibleContexts #-}
+
 module Cryptol.ModuleSystem (
     -- * Module System
     ModuleEnv(..), initialModuleEnv
@@ -21,6 +23,9 @@
   , evalDecls
   , noPat
   , focusedEnv
+  , getPrimMap
+  , renameVar
+  , renameType
 
     -- * Interfaces
   , Iface(..), IfaceDecls(..), genIface
@@ -31,13 +36,14 @@
 import           Cryptol.ModuleSystem.Env
 import           Cryptol.ModuleSystem.Interface
 import           Cryptol.ModuleSystem.Monad
-import           Cryptol.ModuleSystem.Renamer (Rename)
+import           Cryptol.ModuleSystem.Name (Name,PrimMap)
+import qualified Cryptol.ModuleSystem.Renamer as R
 import qualified Cryptol.ModuleSystem.Base as Base
 import qualified Cryptol.Parser.AST        as P
+import           Cryptol.Parser.Name (PName)
 import           Cryptol.Parser.NoPat (RemovePatterns)
-import           Cryptol.Parser.Position (HasLoc)
 import qualified Cryptol.TypeCheck.AST     as T
-import qualified Cryptol.TypeCheck.Depends as T
+import qualified Cryptol.Utils.Ident as M
 
 
 -- Public Interface ------------------------------------------------------------
@@ -46,6 +52,9 @@
 
 type ModuleRes a = (Either ModuleError (a,ModuleEnv), [ModuleWarning])
 
+getPrimMap :: ModuleCmd PrimMap
+getPrimMap me = runModuleM me Base.getPrimMap
+
 -- | Find the file associated with a module name in the module search path.
 findModule :: P.ModName -> ModuleCmd FilePath
 findModule n env = runModuleM env (Base.findModule n)
@@ -61,7 +70,7 @@
   return m
 
 -- | Load the given parsed module.
-loadModule :: FilePath -> P.Module -> ModuleCmd T.Module
+loadModule :: FilePath -> P.Module PName -> ModuleCmd T.Module
 loadModule path m env = runModuleM env $ do
   -- unload the module if it already exists
   unloadModule path
@@ -77,17 +86,20 @@
 -- they allow for expressions to be evaluated in an environment that
 -- can extend dynamically outside of the context of a module.
 
--- | Check the type of an expression.
-checkExpr :: P.Expr -> ModuleCmd (T.Expr,T.Schema)
+-- | Check the type of an expression.  Give back the renamed expression, the
+-- core expression, and its type schema.
+checkExpr :: P.Expr PName -> ModuleCmd (P.Expr Name,T.Expr,T.Schema)
 checkExpr e env = runModuleM env (interactive (Base.checkExpr e))
 
 -- | Evaluate an expression.
 evalExpr :: T.Expr -> ModuleCmd E.Value
 evalExpr e env = runModuleM env (interactive (Base.evalExpr e))
 
--- | Typecheck declarations.
-checkDecls :: (HasLoc d, Rename d, T.FromDecl d) => [d] -> ModuleCmd [T.DeclGroup]
-checkDecls ds env = runModuleM env (interactive (Base.checkDecls ds))
+-- | Typecheck top-level declarations.
+checkDecls :: [P.TopDecl PName] -> ModuleCmd (R.NamingEnv,[T.DeclGroup])
+checkDecls ds env = runModuleM env
+                  $ interactive
+                  $ Base.checkDecls ds
 
 -- | Evaluate declarations and add them to the extended environment.
 evalDecls :: [T.DeclGroup] -> ModuleCmd ()
@@ -95,3 +107,11 @@
 
 noPat :: RemovePatterns a => a -> ModuleCmd a
 noPat a env = runModuleM env (interactive (Base.noPat a))
+
+renameVar :: R.NamingEnv -> PName -> ModuleCmd Name
+renameVar names n env = runModuleM env $ interactive $
+  Base.rename M.interactiveName names (R.renameVar n)
+
+renameType :: R.NamingEnv -> PName -> ModuleCmd Name
+renameType names n env = runModuleM env $ interactive $
+  Base.rename M.interactiveName names (R.renameType n)
diff --git a/src/Cryptol/ModuleSystem/Base.hs b/src/Cryptol/ModuleSystem/Base.hs
--- a/src/Cryptol/ModuleSystem/Base.hs
+++ b/src/Cryptol/ModuleSystem/Base.hs
@@ -1,19 +1,25 @@
 -- |
 -- Module      :  $Header$
--- Copyright   :  (c) 2013-2015 Galois, Inc.
+-- Copyright   :  (c) 2013-2016 Galois, Inc.
 -- License     :  BSD3
 -- Maintainer  :  cryptol@galois.com
 -- Stability   :  provisional
 -- Portability :  portable
 
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE FlexibleContexts #-}
+
 module Cryptol.ModuleSystem.Base where
 
 import Cryptol.ModuleSystem.Env (DynamicEnv(..), deIfaceDecls)
 import Cryptol.ModuleSystem.Interface
 import Cryptol.ModuleSystem.Monad
-import Cryptol.ModuleSystem.Env (lookupModule, LoadedModule(..))
+import Cryptol.ModuleSystem.Name (Name,liftSupply,PrimMap)
+import Cryptol.ModuleSystem.Env (lookupModule, LoadedModule(..)
+                                , meCoreLint, CoreLint(..))
 import qualified Cryptol.Eval                 as E
 import qualified Cryptol.Eval.Value           as E
+import qualified Cryptol.ModuleSystem.NamingEnv as R
 import qualified Cryptol.ModuleSystem.Renamer as R
 import qualified Cryptol.Parser               as P
 import qualified Cryptol.Parser.Unlit         as P
@@ -23,20 +29,25 @@
 import Cryptol.Parser.Position (HasLoc(..), Range, emptyRange)
 import qualified Cryptol.TypeCheck     as T
 import qualified Cryptol.TypeCheck.AST as T
-import qualified Cryptol.TypeCheck.Depends as T
+import qualified Cryptol.TypeCheck.PP as T
+import qualified Cryptol.TypeCheck.Sanity as TcSanity
+import Cryptol.Utils.Ident (preludeName,interactiveName,unpackModName)
 import Cryptol.Utils.PP (pretty)
+import Cryptol.Utils.Panic (panic)
 
 import Cryptol.Prelude (writePreludeContents)
 
-import Cryptol.Transform.MonoValues
+import Cryptol.Transform.MonoValues (rewModule)
 
 import Control.DeepSeq
 import qualified Control.Exception as X
 import Control.Monad (unless)
 import Data.Function (on)
 import Data.List (nubBy)
-import Data.Maybe (mapMaybe,fromMaybe)
+import Data.Maybe (fromMaybe)
 import Data.Monoid ((<>))
+import           Data.Text.Lazy (Text)
+import qualified Data.Text.Lazy.IO as T
 import System.Directory (doesFileExist)
 import System.FilePath ( addExtension
                        , isAbsolute
@@ -48,49 +59,38 @@
 import qualified System.IO.Error as IOE
 import qualified Data.Map as Map
 
-#if __GLASGOW_HASKELL__ < 710
-import Data.Foldable (foldMap)
-#endif
+import Prelude ()
+import Prelude.Compat
 
+
 -- Renaming --------------------------------------------------------------------
 
-rename :: R.Rename a => R.NamingEnv -> a -> ModuleM a
-rename env a = do
+rename :: ModName -> R.NamingEnv -> R.RenameM a -> ModuleM a
+rename modName env m = do
+  (res,ws) <- liftSupply $ \ supply ->
+    case R.runRenamer supply modName env m of
+      (Right (a,supply'),ws) -> ((Right a,ws),supply')
+      (Left errs,ws)         -> ((Left errs,ws),supply)
+
   renamerWarnings ws
   case res of
     Right r   -> return r
     Left errs -> renamerErrors errs
-  where
-  (res,ws) = R.runRenamer env (R.rename a)
 
 -- | Rename a module in the context of its imported modules.
-renameModule :: P.Module -> ModuleM P.Module
+renameModule :: P.Module PName
+             -> ModuleM (IfaceDecls,R.NamingEnv,P.Module Name)
 renameModule m = do
-  iface <- importIfaces (map thing (P.mImports m))
-
-  let menv    = R.namingEnv m
-      (es,ws) = R.checkNamingEnv menv
+  (decls,menv) <- importIfaces (map thing (P.mImports m))
+  let (es,ws) = R.checkNamingEnv menv
 
   renamerWarnings ws
   unless (null es) (renamerErrors es)
 
-  -- explicitly shadow the imported environment with the local environment
-  rename (menv `R.shadowing` R.namingEnv iface) m
+  (declsEnv,rm) <- rename (thing (mName m)) menv (R.renameModule m)
+  return (decls,declsEnv,rm)
 
--- | Rename an expression in the context of the focused module.
-renameExpr :: P.Expr -> ModuleM P.Expr
-renameExpr e = do
-  env <- getFocusedEnv
-  denv <- getDynEnv
-  rename (deNames denv `R.shadowing` R.namingEnv env) e
 
--- | Rename declarations in the context of the focused module.
-renameDecls :: (R.Rename d, T.FromDecl d) => [d] -> ModuleM [d]
-renameDecls ds = do
-  env <- getFocusedEnv
-  denv <- getDynEnv
-  rename (deNames denv `R.shadowing` R.namingEnv env) ds
-
 -- NoPat -----------------------------------------------------------------------
 
 -- | Run the noPat pass.
@@ -103,13 +103,13 @@
 
 -- Parsing ---------------------------------------------------------------------
 
-parseModule :: FilePath -> ModuleM P.Module
+parseModule :: FilePath -> ModuleM (P.Module PName)
 parseModule path = do
 
   e <- io $ X.try $ do
-    bytes <- readFile path
+    bytes <- T.readFile path
     return $!! bytes
-  bytes <- case (e :: Either X.IOException String) of
+  bytes <- case (e :: Either X.IOException Text) of
     Right bytes -> return bytes
     Left exn | IOE.isDoesNotExistError exn -> cantFindFile path
              | otherwise                   -> otherIOError path exn
@@ -164,7 +164,7 @@
          return ()
 
 -- | Load dependencies, typecheck, and add to the eval environment.
-loadModule :: FilePath -> P.Module -> ModuleM T.Module
+loadModule :: FilePath -> P.Module PName -> ModuleM T.Module
 loadModule path pm = do
 
   let pm' = addPrelude pm
@@ -173,7 +173,7 @@
   -- XXX make it possible to configure output
   io (putStrLn ("Loading module " ++ pretty (P.thing (P.mName pm'))))
 
-  tcm <- checkModule pm'
+  tcm <- checkModule path pm'
 
   -- extend the eval env
   modifyEvalEnv (E.moduleEnv tcm)
@@ -189,16 +189,19 @@
 fullyQualified :: P.Import -> P.Import
 fullyQualified i = i { iAs = Just (iModule i) }
 
--- | Process the interface specified by an import.
-importIface :: P.Import -> ModuleM Iface
-importIface i = interpImport i `fmap` getIface (T.iModule i)
+-- | Find the interface referenced by an import, and generate the naming
+-- environment that it describes.
+importIface :: P.Import -> ModuleM (IfaceDecls,R.NamingEnv)
+importIface imp =
+  do Iface { .. } <- getIface (T.iModule imp)
+     return (ifPublic, R.interpImport imp ifPublic)
 
 -- | Load a series of interfaces, merging their public interfaces.
-importIfaces :: [P.Import] -> ModuleM IfaceDecls
-importIfaces is = foldMap ifPublic `fmap` mapM importIface is
+importIfaces :: [P.Import] -> ModuleM (IfaceDecls,R.NamingEnv)
+importIfaces is = mconcat `fmap` mapM importIface is
 
 moduleFile :: ModName -> String -> FilePath
-moduleFile (ModName ns) = addExtension (joinPath ns)
+moduleFile n = addExtension (joinPath (unpackModName n))
 
 -- | Discover a module.
 findModule :: ModName -> ModuleM FilePath
@@ -243,11 +246,8 @@
     [] -> cantFindFile path
   possibleFiles paths = map (</> path) paths
 
-preludeName :: P.ModName
-preludeName  = P.ModName ["Cryptol"]
-
 -- | Add the prelude to the import list if it's not already mentioned.
-addPrelude :: P.Module -> P.Module
+addPrelude :: P.Module PName -> P.Module PName
 addPrelude m
   | preludeName == P.thing (P.mName m) = m
   | preludeName `elem` importedMods    = m
@@ -264,7 +264,7 @@
     }
 
 -- | Load the dependencies of a module into the environment.
-loadDeps :: Module -> ModuleM ()
+loadDeps :: P.Module name -> ModuleM ()
 loadDeps m
   | null needed = return ()
   | otherwise   = mapM_ load needed
@@ -275,31 +275,70 @@
 
 -- Type Checking ---------------------------------------------------------------
 
--- | Typecheck a single expression.
-checkExpr :: P.Expr -> ModuleM (T.Expr,T.Schema)
+-- | Load the local environment, which consists of the environment for the
+-- currently opened module, shadowed by the dynamic environment.
+getLocalEnv :: ModuleM (IfaceDecls,R.NamingEnv)
+getLocalEnv  =
+  do (decls,fNames,_) <- getFocusedEnv
+     denv             <- getDynEnv
+     let dynDecls = deIfaceDecls denv
+     return (dynDecls `mappend` decls, deNames denv `R.shadowing` fNames)
+
+-- | Typecheck a single expression, yielding a renamed parsed expression,
+-- typechecked core expression, and a type schema.
+checkExpr :: P.Expr PName -> ModuleM (P.Expr Name,T.Expr,T.Schema)
 checkExpr e = do
+
+  (decls,names) <- getLocalEnv
+
+  -- run NoPat
   npe <- noPat e
-  denv <- getDynEnv
-  re  <- renameExpr npe
-  env <- getQualifiedEnv
-  let env' = env <> deIfaceDecls denv
-  typecheck T.tcExpr re env'
 
+  -- rename the expression with dynamic names shadowing the opened environment
+  re  <- rename interactiveName names (R.rename npe)
+
+  -- merge the dynamic and opened environments for typechecking
+  prims <- getPrimMap
+  let act  = TCAction { tcAction = T.tcExpr, tcLinter = exprLinter
+                      , tcPrims = prims }
+  (te,s) <- typecheck act re decls
+
+  return (re,te,s)
+
 -- | Typecheck a group of declarations.
-checkDecls :: (HasLoc d, R.Rename d, T.FromDecl d) => [d] -> ModuleM [T.DeclGroup]
+--
+-- INVARIANT: This assumes that NoPat has already been run on the declarations.
+checkDecls :: [P.TopDecl PName] -> ModuleM (R.NamingEnv,[T.DeclGroup])
 checkDecls ds = do
-  -- nopat must already be run
-  rds <- renameDecls ds
-  denv <- getDynEnv
-  env <- getQualifiedEnv
-  let env' = env <> deIfaceDecls denv
-  typecheck T.tcDecls rds env'
+  (decls,names) <- getLocalEnv
 
+  -- introduce names for the declarations before renaming them
+  declsEnv <- liftSupply (R.namingEnv' (map (R.InModule interactiveName) ds))
+  rds <- rename interactiveName (declsEnv `R.shadowing` names)
+             (traverse R.rename ds)
+
+  prims <- getPrimMap
+  let act  = TCAction { tcAction = T.tcDecls, tcLinter = declsLinter
+                      , tcPrims = prims }
+  ds' <- typecheck act rds decls
+  return (declsEnv,ds')
+
+-- | Generate the primitive map. If the prelude is currently being loaded, this
+-- should be generated directly from the naming environment given to the renamer
+-- instead.
+getPrimMap :: ModuleM PrimMap
+getPrimMap  =
+  do env <- getModuleEnv
+     case lookupModule preludeName env of
+       Just lm -> return (ifacePrimMap (lmInterface lm))
+       Nothing -> panic "Cryptol.ModuleSystem.Base.getPrimMap"
+                  [ "Unable to find the prelude" ]
+
 -- | Typecheck a module.
-checkModule :: P.Module -> ModuleM T.Module
-checkModule m = do
+checkModule :: FilePath -> P.Module PName -> ModuleM T.Module
+checkModule path m = do
   -- remove includes first
-  e   <- io (removeIncludesModule m)
+  e   <- io (removeIncludesModule path m)
   nim <- case e of
            Right nim  -> return nim
            Left ierrs -> noIncludeErrors ierrs
@@ -308,68 +347,110 @@
   npm <- noPat nim
 
   -- rename everything
-  scm <- renameModule npm
+  (tcEnv,declsEnv,scm) <- renameModule npm
 
+  -- when generating the prim map for the typechecker, if we're checking the
+  -- prelude, we have to generate the map from the renaming environment, as we
+  -- don't have the interface yet.
+  prims <- if thing (mName m) == preludeName
+              then return (R.toPrimMap declsEnv)
+              else getPrimMap
+
   -- typecheck
-  tcm <- typecheck T.tcModule scm =<< importIfacesTc (map thing (P.mImports scm))
+  let act = TCAction { tcAction = T.tcModule
+                     , tcLinter = moduleLinter (P.thing (P.mName m))
+                     , tcPrims  = prims }
+  tcm <- typecheck act scm tcEnv
 
-  return (Cryptol.Transform.MonoValues.rewModule tcm)
+  liftSupply (`rewModule` tcm)
 
+data TCLinter o = TCLinter
+  { lintCheck ::
+      o -> T.InferInput -> Either TcSanity.Error [TcSanity.ProofObligation]
+  , lintModule :: Maybe P.ModName
+  }
 
-type TCAction i o = i -> T.InferInput -> IO (T.InferOutput o)
 
-typecheck :: HasLoc i => TCAction i o -> i -> IfaceDecls -> ModuleM o
-typecheck action i env = do
+exprLinter :: TCLinter (T.Expr, T.Schema)
+exprLinter = TCLinter
+  { lintCheck = \(e',s) i ->
+      case TcSanity.tcExpr (T.inpVars i) e' of
+        Left err     -> Left err
+        Right (s1,os)
+          | TcSanity.same s s1  -> Right os
+          | otherwise -> Left (TcSanity.TypeMismatch s s1)
+  , lintModule = Nothing
+  }
 
+declsLinter :: TCLinter [ T.DeclGroup ]
+declsLinter = TCLinter
+  { lintCheck = \ds' i -> case TcSanity.tcDecls (T.inpVars i) ds' of
+                            Left err -> Left err
+                            Right os -> Right os
+
+  , lintModule = Nothing
+  }
+
+moduleLinter :: P.ModName -> TCLinter T.Module
+moduleLinter m = TCLinter
+  { lintCheck   = \m' i -> case TcSanity.tcModule (T.inpVars i) m' of
+                            Left err -> Left err
+                            Right os -> Right os
+  , lintModule  = Just m
+  }
+
+
+data TCAction i o = TCAction
+  { tcAction :: i -> T.InferInput -> IO (T.InferOutput o)
+  , tcLinter :: TCLinter o
+  , tcPrims  :: PrimMap
+  }
+
+typecheck :: (Show i, Show o, HasLoc i) => TCAction i o -> i -> IfaceDecls -> ModuleM o
+typecheck act i env = do
+
   let range = fromMaybe emptyRange (getLoc i)
-  input <- genInferInput range env
-  out   <- io (action i input)
+  input <- genInferInput range (tcPrims act) env
+  out   <- io (tcAction act i input)
 
   case out of
 
-    T.InferOK warns seeds o ->
+    T.InferOK warns seeds supply' o ->
       do setNameSeeds seeds
+         setSupply supply'
          typeCheckWarnings warns
+         menv <- getModuleEnv
+         case meCoreLint menv of
+           NoCoreLint -> return ()
+           CoreLint   -> case lintCheck (tcLinter act) o input of
+                           Right as -> io $ mapM_ (print . T.pp) as
+                           Left err -> panic "Core lint failed:" [show err]
          return o
 
     T.InferFailed warns errs ->
       do typeCheckWarnings warns
          typeCheckingFailed errs
 
--- | Process a list of imports, producing an aggregate interface suitable for use
--- when typechecking.
-importIfacesTc :: [P.Import] -> ModuleM IfaceDecls
-importIfacesTc is =
-  mergePublic `fmap` mapM (importIface . fullyQualified) is
-  where
-  mergePublic = foldMap ifPublic
-
 -- | Generate input for the typechecker.
-genInferInput :: Range -> IfaceDecls -> ModuleM T.InferInput
-genInferInput r env = do
+genInferInput :: Range -> PrimMap -> IfaceDecls -> ModuleM T.InferInput
+genInferInput r prims env = do
   seeds <- getNameSeeds
   monoBinds <- getMonoBinds
+  cfg <- getSolverConfig
+  supply <- getSupply
 
   -- TODO: include the environment needed by the module
   return T.InferInput
     { T.inpRange     = r
-    , T.inpVars      = Map.map ifDeclSig (filterEnv ifDecls)
-    , T.inpTSyns     =                    filterEnv ifTySyns
-    , T.inpNewtypes  =                    filterEnv ifNewtypes
+    , T.inpVars      = Map.map ifDeclSig (ifDecls env)
+    , T.inpTSyns     = ifTySyns env
+    , T.inpNewtypes  = ifNewtypes env
     , T.inpNameSeeds = seeds
     , T.inpMonoBinds = monoBinds
+    , T.inpSolverConfig = cfg
+    , T.inpSupply    = supply
+    , T.inpPrimNames = prims
     }
-  where
-  -- at this point, the names used in the aggregate interface should be
-  -- unique
-  keepOne :: (QName,[a]) -> Maybe (QName,a)
-  keepOne (qn,syns) = case syns of
-    [syn] -> Just (qn,syn)
-    _     -> Nothing
-
-  -- keep symbols without duplicates.  the renamer would have caught
-  -- duplication already, so this is safe.
-  filterEnv p = Map.fromList (mapMaybe keepOne (Map.toList (p env)))
 
 
 -- Evaluation ------------------------------------------------------------------
diff --git a/src/Cryptol/ModuleSystem/Env.hs b/src/Cryptol/ModuleSystem/Env.hs
--- a/src/Cryptol/ModuleSystem/Env.hs
+++ b/src/Cryptol/ModuleSystem/Env.hs
@@ -1,6 +1,6 @@
 -- |
 -- Module      :  $Header$
--- Copyright   :  (c) 2013-2015 Galois, Inc.
+-- Copyright   :  (c) 2013-2016 Galois, Inc.
 -- License     :  BSD3
 -- Maintainer  :  cryptol@galois.com
 -- Stability   :  provisional
@@ -8,6 +8,8 @@
 
 {-# LANGUAGE CPP #-}
 {-# LANGUAGE PatternGuards #-}
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE RecordWildCards #-}
 
 module Cryptol.ModuleSystem.Env where
 
@@ -17,12 +19,15 @@
 
 import Cryptol.Eval (EvalEnv)
 import Cryptol.ModuleSystem.Interface
+import Cryptol.ModuleSystem.Name (Supply,emptySupply)
 import qualified Cryptol.ModuleSystem.NamingEnv as R
 import Cryptol.Parser.AST
 import qualified Cryptol.TypeCheck as T
 import qualified Cryptol.TypeCheck.AST as T
+import Cryptol.Utils.PP (NameDisp)
 
 import Control.Monad (guard)
+import qualified Control.Exception as X
 import Data.Foldable (fold)
 import Data.Function (on)
 import qualified Data.Map as Map
@@ -32,10 +37,12 @@
 import System.FilePath ((</>), normalise, joinPath, splitPath, takeDirectory)
 import qualified Data.List as List
 
-#if __GLASGOW_HASKELL__ < 710
-import Data.Monoid (Monoid(..))
-#endif
+import GHC.Generics (Generic)
+import Control.DeepSeq.Generics
 
+import Prelude ()
+import Prelude.Compat
+
 -- Module Environment ----------------------------------------------------------
 
 data ModuleEnv = ModuleEnv
@@ -46,8 +53,19 @@
   , meSearchPath    :: [FilePath]
   , meDynEnv        :: DynamicEnv
   , meMonoBinds     :: !Bool
-  }
+  , meSolverConfig  :: T.SolverConfig
+  , meCoreLint      :: CoreLint
+  , meSupply        :: !Supply
+  } deriving (Generic)
 
+instance NFData ModuleEnv where rnf = genericRnf
+
+data CoreLint = NoCoreLint        -- ^ Don't run core lint
+              | CoreLint          -- ^ Run core lint
+  deriving (Generic)
+
+instance NFData CoreLint where rnf = genericRnf
+
 resetModuleEnv :: ModuleEnv -> ModuleEnv
 resetModuleEnv env = env
   { meLoadedModules = mempty
@@ -65,7 +83,11 @@
 #endif
   binDir <- takeDirectory `fmap` getExecutablePath
   let instDir = normalise . joinPath . init . splitPath $ binDir
-  userDir <- getAppUserDataDirectory "cryptol"
+  -- looking up this directory can fail if no HOME is set, as in some
+  -- CI settings
+  let handle :: X.IOException -> IO String
+      handle _e = return ""
+  userDir <- X.catch (getAppUserDataDirectory "cryptol") handle
   return ModuleEnv
     { meLoadedModules = mempty
     , meNameSeeds     = T.nameSeeds
@@ -93,6 +115,13 @@
                         ]
     , meDynEnv        = mempty
     , meMonoBinds     = True
+    , meSolverConfig  = T.SolverConfig
+                          { T.solverPath = "z3"
+                          , T.solverArgs = [ "-smt2", "-in" ]
+                          , T.solverVerbose = 0
+                          }
+    , meCoreLint      = NoCoreLint
+    , meSupply        = emptySupply
     }
 
 -- | Try to focus a loaded module in the module environment.
@@ -107,43 +136,61 @@
 loadedModules = map lmModule . getLoadedModules . meLoadedModules
 
 -- | Produce an ifaceDecls that represents the focused environment of the module
--- system.
+-- system, as well as a 'NameDisp' for pretty-printing names according to the
+-- imports.
 --
--- This could really do with some better error handling, just returning mempty
--- when one of the imports fails isn't really desirable.
-focusedEnv :: ModuleEnv -> IfaceDecls
-focusedEnv me = fold $ do
-  (iface,imports) <- loadModuleEnv interpImport me
-  let local = unqualified (ifPublic iface `mappend` ifPrivate iface)
-  return (local `shadowing` imports)
+-- XXX This could really do with some better error handling, just returning
+-- mempty when one of the imports fails isn't really desirable.
+focusedEnv :: ModuleEnv -> (IfaceDecls,R.NamingEnv,NameDisp)
+focusedEnv me = fold $
+  do fm   <- meFocusedModule me
+     lm   <- lookupModule fm me
+     deps <- mapM loadImport (T.mImports (lmModule lm))
+     let (ifaces,names) = unzip deps
+         Iface { .. }   = lmInterface lm
+         localDecls     = ifPublic `mappend` ifPrivate
+         localNames     = R.unqualifiedEnv localDecls
+         namingEnv      = localNames `R.shadowing` mconcat names
 
--- | Produce an ifaceDecls that represents the internal environment of the
--- module, used for typechecking.
-qualifiedEnv :: ModuleEnv -> IfaceDecls
-qualifiedEnv me = fold $ do
-  (iface,imports) <- loadModuleEnv (\ _ iface -> iface) me
-  return (mconcat [ ifPublic iface, ifPrivate iface, imports ])
+     return (mconcat (localDecls:ifaces), namingEnv, R.toNameDisp namingEnv)
+  where
+  loadImport imp =
+    do lm <- lookupModule (iModule imp) me
+       let decls = ifPublic (lmInterface lm)
+       return (decls,R.interpImport imp decls)
 
-loadModuleEnv :: (Import -> Iface -> Iface) -> ModuleEnv
-              -> Maybe (Iface,IfaceDecls)
-loadModuleEnv processIface me = do
-  fm      <- meFocusedModule me
-  lm      <- lookupModule fm me
-  imports <- mapM loadImport (T.mImports (lmModule lm))
-  return (lmInterface lm, mconcat imports)
+-- | The unqualified declarations and name environment for the dynamic
+-- environment.
+dynamicEnv :: ModuleEnv -> (IfaceDecls,R.NamingEnv,NameDisp)
+dynamicEnv me = (decls,names,R.toNameDisp names)
   where
-  loadImport i = do
-    lm <- lookupModule (iModule i) me
-    return (ifPublic (processIface i (lmInterface lm)))
+  decls = deIfaceDecls (meDynEnv me)
+  names = R.unqualifiedEnv decls
 
+-- | Retrieve all 'IfaceDecls' referenced by a module, as well as all of its
+-- public and private declarations, checking expressions
+qualifiedEnv :: ModuleEnv -> IfaceDecls
+qualifiedEnv me = fold $
+  do fm   <- meFocusedModule me
+     lm   <- lookupModule fm me
+     deps <- mapM loadImport (T.mImports (lmModule lm))
+     let Iface { .. } = lmInterface lm
+     return (mconcat (ifPublic : ifPrivate : deps))
+  where
+  loadImport imp =
+    do lm <- lookupModule (iModule imp) me
+       return (ifPublic (lmInterface lm))
 
+
 -- Loaded Modules --------------------------------------------------------------
 
 newtype LoadedModules = LoadedModules
   { getLoadedModules :: [LoadedModule]
-  } deriving (Show)
+  } deriving (Show, Generic)
 -- ^ Invariant: All the dependencies of any module `m` must precede `m` in the list.
 
+instance NFData LoadedModules where rnf = genericRnf
+
 instance Monoid LoadedModules where
   mempty        = LoadedModules []
   mappend l r   = LoadedModules
@@ -154,8 +201,10 @@
   , lmFilePath  :: FilePath
   , lmInterface :: Iface
   , lmModule    :: T.Module
-  } deriving (Show)
+  } deriving (Show, Generic)
 
+instance NFData LoadedModule where rnf = genericRnf
+
 isLoaded :: ModName -> LoadedModules -> Bool
 isLoaded mn lm = any ((mn ==) . lmName) (getLoadedModules lm)
 
@@ -195,8 +244,10 @@
   { deNames :: R.NamingEnv
   , deDecls :: [T.DeclGroup]
   , deEnv   :: EvalEnv
-  }
+  } deriving (Generic)
 
+instance NFData DynamicEnv where rnf = genericRnf
+
 instance Monoid DynamicEnv where
   mempty = DEnv
     { deNames = mempty
@@ -219,7 +270,7 @@
   mconcat [ IfaceDecls
             { ifTySyns   = Map.empty
             , ifNewtypes = Map.empty
-            , ifDecls    = Map.singleton (ifDeclName ifd) [ifd]
+            , ifDecls    = Map.singleton (ifDeclName ifd) ifd
             }
           | decl <- concatMap T.groupDecls dgs
           , let ifd = mkIfaceDecl decl
diff --git a/src/Cryptol/ModuleSystem/Interface.hs b/src/Cryptol/ModuleSystem/Interface.hs
--- a/src/Cryptol/ModuleSystem/Interface.hs
+++ b/src/Cryptol/ModuleSystem/Interface.hs
@@ -1,12 +1,15 @@
 -- |
 -- Module      :  $Header$
--- Copyright   :  (c) 2013-2015 Galois, Inc.
+-- Copyright   :  (c) 2013-2016 Galois, Inc.
 -- License     :  BSD3
 -- Maintainer  :  cryptol@galois.com
 -- Stability   :  provisional
 -- Portability :  portable
 
 {-# LANGUAGE PatternGuards #-}
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE CPP #-}
+{-# LANGUAGE RecordWildCards #-}
 module Cryptol.ModuleSystem.Interface (
     Iface(..)
   , IfaceDecls(..)
@@ -14,101 +17,81 @@
   , IfaceNewtype
   , IfaceDecl(..), mkIfaceDecl
 
-  , shadowing
-  , interpImport
-  , unqualified
   , genIface
+  , ifacePrimMap
   ) where
 
-import           Cryptol.Parser.AST (mkQual)
+import           Cryptol.ModuleSystem.Name
 import           Cryptol.TypeCheck.AST
+import           Cryptol.Utils.Ident (ModName)
 
 import qualified Data.Map as Map
 
-#if __GLASGOW_HASKELL__ < 710
-import           Data.Monoid (Monoid(..))
-#endif
+import GHC.Generics (Generic)
+import Control.DeepSeq.Generics
 
+import Prelude ()
+import Prelude.Compat
+
+
 -- | The resulting interface generated by a module that has been typechecked.
 data Iface = Iface
-  { ifModName :: ModName
+  { ifModName :: !ModName
   , ifPublic  :: IfaceDecls
   , ifPrivate :: IfaceDecls
-  } deriving (Show)
+  } deriving (Show, Generic)
 
+instance NFData Iface where rnf = genericRnf
+
 data IfaceDecls = IfaceDecls
-  { ifTySyns :: Map.Map QName    [IfaceTySyn]
-  , ifNewtypes  :: Map.Map QName [IfaceNewtype]
-  , ifDecls  :: Map.Map QName    [IfaceDecl]
-  } deriving (Show)
+  { ifTySyns   :: Map.Map Name IfaceTySyn
+  , ifNewtypes :: Map.Map Name IfaceNewtype
+  , ifDecls    :: Map.Map Name IfaceDecl
+  } deriving (Show, Generic)
 
+instance NFData IfaceDecls where rnf = genericRnf
+
 instance Monoid IfaceDecls where
   mempty      = IfaceDecls Map.empty Map.empty Map.empty
   mappend l r = IfaceDecls
-    { ifTySyns   = Map.unionWith (mergeByName ifTySynName) (ifTySyns l)   (ifTySyns r)
-    , ifNewtypes = Map.unionWith (mergeByName ntName)      (ifNewtypes l) (ifNewtypes r)
-    , ifDecls    = Map.unionWith (mergeByName ifDeclName)  (ifDecls l)    (ifDecls r)
+    { ifTySyns   = Map.union (ifTySyns l)   (ifTySyns r)
+    , ifNewtypes = Map.union (ifNewtypes l) (ifNewtypes r)
+    , ifDecls    = Map.union (ifDecls l)    (ifDecls r)
     }
   mconcat ds  = IfaceDecls
-    { ifTySyns   = Map.unionsWith (mergeByName ifTySynName) (map ifTySyns ds)
-    , ifNewtypes = Map.unionsWith (mergeByName ntName)      (map ifNewtypes ds)
-    , ifDecls    = Map.unionsWith (mergeByName ifDeclName)  (map ifDecls  ds)
+    { ifTySyns   = Map.unions (map ifTySyns   ds)
+    , ifNewtypes = Map.unions (map ifNewtypes ds)
+    , ifDecls    = Map.unions (map ifDecls    ds)
     }
 
--- | Merge the entries in the simple case.
-mergeByName :: (a -> QName) -> [a] -> [a] -> [a]
-mergeByName f ls rs
-  | [l] <- ls, [r] <- rs, f l == f r = ls
-  | otherwise                        = ls ++ rs
-
--- | Like mappend for IfaceDecls, but preferring entries on the left.
-shadowing :: IfaceDecls -> IfaceDecls -> IfaceDecls
-shadowing l r = IfaceDecls
-  { ifTySyns = Map.union (ifTySyns l) (ifTySyns r)
-  , ifNewtypes = Map.union (ifNewtypes l) (ifNewtypes r)
-  , ifDecls  = Map.union (ifDecls  l) (ifDecls  r)
-  }
-
 type IfaceTySyn = TySyn
 
-ifTySynName :: TySyn -> QName
+ifTySynName :: TySyn -> Name
 ifTySynName = tsName
 
 type IfaceNewtype = Newtype
 
 data IfaceDecl = IfaceDecl
-  { ifDeclName    :: QName
+  { ifDeclName    :: !Name
   , ifDeclSig     :: Schema
   , ifDeclPragmas :: [Pragma]
-  } deriving (Show)
+  , ifDeclInfix   :: Bool
+  , ifDeclFixity  :: Maybe Fixity
+  , ifDeclDoc     :: Maybe String
+  } deriving (Show, Generic)
 
+instance NFData IfaceDecl where rnf = genericRnf
+
 mkIfaceDecl :: Decl -> IfaceDecl
 mkIfaceDecl d = IfaceDecl
   { ifDeclName    = dName d
   , ifDeclSig     = dSignature d
   , ifDeclPragmas = dPragmas d
-  }
-
-mapIfaceDecls :: (QName -> QName) -> IfaceDecls -> IfaceDecls
-mapIfaceDecls f decls = IfaceDecls
-  { ifTySyns = Map.mapKeys f (ifTySyns decls)
-  , ifNewtypes = Map.mapKeys f (ifNewtypes decls)
-  , ifDecls  = Map.mapKeys f (ifDecls decls)
+  , ifDeclInfix   = dInfix d
+  , ifDeclFixity  = dFixity d
+  , ifDeclDoc     = dDoc d
   }
 
-filterIfaceDecls :: (QName -> Bool) -> IfaceDecls -> IfaceDecls
-filterIfaceDecls p decls = IfaceDecls
-  { ifTySyns = Map.filterWithKey check (ifTySyns decls)
-  , ifNewtypes = Map.filterWithKey check (ifNewtypes decls)
-  , ifDecls  = Map.filterWithKey check (ifDecls decls)
-  }
-  where
-  check :: QName -> a -> Bool
-  check k _ = p k
-
-unqualified :: IfaceDecls -> IfaceDecls
-unqualified  = mapIfaceDecls (mkUnqual . unqual)
-
 -- | Generate an Iface from a typechecked module.
 genIface :: Module -> Iface
 genIface m = Iface
@@ -127,46 +110,37 @@
   where
 
   (tsPub,tsPriv) =
-      Map.partitionWithKey (\ qn _ -> qn `isExportedType` mExports m )
-      $ fmap return (mTySyns m)
-
+      Map.partitionWithKey (\ qn _ -> qn `isExportedType` mExports m ) (mTySyns m)
   (ntPub,ntPriv) =
-      Map.partitionWithKey (\ qn _ -> qn `isExportedType` mExports m )
-      $ fmap return (mNewtypes m)
+      Map.partitionWithKey (\ qn _ -> qn `isExportedType` mExports m ) (mNewtypes m)
 
   (dPub,dPriv) =
       Map.partitionWithKey (\ qn _ -> qn `isExportedBind` mExports m)
-      $ Map.fromList [ (qn,[mkIfaceDecl d]) | dg <- mDecls m
-                                            , d  <- groupDecls dg
-                                            , let qn = dName d
-                                            ]
+      $ Map.fromList [ (qn,mkIfaceDecl d) | dg <- mDecls m
+                                          , d  <- groupDecls dg
+                                          , let qn = dName d
+                                          ]
 
--- | Interpret an import declaration in the scope of the interface it targets.
-interpImport :: Import -> Iface -> Iface
-interpImport i iface = Iface
-  { ifModName = ifModName iface
-  , ifPublic  = qualify restricted
-  , ifPrivate = mempty
-  }
-  where
-  -- the initial set of names is {unqualified => qualified}
-  public = unqualified (ifPublic iface)
 
-  -- qualify imported names
-  qualify | Just n <- iAs i = \ names -> qualifyNames n names
-          | otherwise       = id
-
-  -- interpret an import spec to quotient a naming map
-  restricted
-    | Just (Hiding names) <- iSpec i =
-      let qnames = map mkUnqual names
-       in filterIfaceDecls (\qn -> not (qn `elem` qnames)) public
-
-    | Just (Only names) <- iSpec i =
-      let qnames = map mkUnqual names
-       in filterIfaceDecls (\qn -> qn `elem` qnames) public
+-- | Produce a PrimMap from an interface.
+--
+-- NOTE: the map will expose /both/ public and private names.
+ifacePrimMap :: Iface -> PrimMap
+ifacePrimMap Iface { .. } =
+  PrimMap { primDecls = merge primDecls
+          , primTypes = merge primTypes }
+  where
+  merge f = Map.union (f public) (f private)
 
-    | otherwise = public
+  public  = ifaceDeclsPrimMap ifPublic
+  private = ifaceDeclsPrimMap ifPrivate
 
-  -- this assumes that it's getting a list of _only_ unqualified names
-  qualifyNames pfx = mapIfaceDecls (\ n -> mkQual pfx (unqual n))
+ifaceDeclsPrimMap :: IfaceDecls -> PrimMap
+ifaceDeclsPrimMap IfaceDecls { .. } =
+  PrimMap { primDecls = Map.fromList (newtypes ++ exprs)
+          , primTypes = Map.fromList (newtypes ++ types)
+          }
+  where
+  exprs    = [ (nameIdent n, n) | n <- Map.keys ifDecls    ]
+  newtypes = [ (nameIdent n, n) | n <- Map.keys ifNewtypes ]
+  types    = [ (nameIdent n, n) | n <- Map.keys ifTySyns   ]
diff --git a/src/Cryptol/ModuleSystem/Monad.hs b/src/Cryptol/ModuleSystem/Monad.hs
--- a/src/Cryptol/ModuleSystem/Monad.hs
+++ b/src/Cryptol/ModuleSystem/Monad.hs
@@ -1,19 +1,21 @@
 -- |
 -- Module      :  $Header$
--- Copyright   :  (c) 2013-2015 Galois, Inc.
+-- Copyright   :  (c) 2013-2016 Galois, Inc.
 -- License     :  BSD3
 -- Maintainer  :  cryptol@galois.com
 -- Stability   :  provisional
 -- Portability :  portable
 
 {-# LANGUAGE FlexibleContexts #-}
-
+{-# LANGUAGE DeriveGeneric #-}
 module Cryptol.ModuleSystem.Monad where
 
 import           Cryptol.Eval.Env (EvalEnv)
 import           Cryptol.ModuleSystem.Env
 import           Cryptol.ModuleSystem.Interface
-import           Cryptol.ModuleSystem.Renamer (RenamerError(),RenamerWarning())
+import           Cryptol.ModuleSystem.Name (FreshM(..),Supply)
+import           Cryptol.ModuleSystem.Renamer
+                     (RenamerError(),RenamerWarning(),NamingEnv)
 import qualified Cryptol.Parser     as Parser
 import qualified Cryptol.Parser.AST as P
 import           Cryptol.Parser.Position (Located)
@@ -23,6 +25,7 @@
 import qualified Cryptol.TypeCheck as T
 import qualified Cryptol.TypeCheck.AST as T
 import           Cryptol.Parser.Position (Range)
+import           Cryptol.Utils.Ident (interactiveName)
 import           Cryptol.Utils.PP
 
 import Control.Exception (IOException)
@@ -30,17 +33,21 @@
 import Data.Maybe (isJust)
 import MonadLib
 
-#if __GLASGOW_HASKELL__ < 710
-import Control.Applicative (Applicative(..))
-#endif
+import GHC.Generics (Generic)
+import Control.DeepSeq.Generics
 
+import Prelude ()
+import Prelude.Compat
+
 -- Errors ----------------------------------------------------------------------
 
 data ImportSource
   = FromModule P.ModName
   | FromImport (Located P.Import)
-    deriving (Show)
+    deriving (Show,Generic)
 
+instance NFData ImportSource where rnf = genericRnf
+
 instance Eq ImportSource where
   (==) = (==) `on` importedModule
 
@@ -82,6 +89,23 @@
     -- ^ Two modules loaded from different files have the same module name
     deriving (Show)
 
+instance NFData ModuleError where
+  rnf e = case e of
+    ModuleNotFound src path              -> src `deepseq` path `deepseq` ()
+    CantFindFile path                    -> path `deepseq` ()
+    OtherIOError path exn                -> path `deepseq` exn `seq` ()
+    ModuleParseError source err          -> source `deepseq` err `deepseq` ()
+    RecursiveModules mods                -> mods `deepseq` ()
+    RenamerErrors src errs               -> src `deepseq` errs `deepseq` ()
+    NoPatErrors src errs                 -> src `deepseq` errs `deepseq` ()
+    NoIncludeErrors src errs             -> src `deepseq` errs `deepseq` ()
+    TypeCheckingFailed src errs          -> src `deepseq` errs `deepseq` ()
+    ModuleNameMismatch expected found    ->
+      expected `deepseq` found `deepseq` ()
+    DuplicateModuleName name path1 path2 ->
+      name `deepseq` path1 `deepseq` path2 `deepseq` ()
+    OtherFailure x                       -> x `deepseq` ()
+
 instance PP ModuleError where
   ppPrec _ e = case e of
 
@@ -184,8 +208,10 @@
 data ModuleWarning
   = TypeCheckWarnings [(Range,T.Warning)]
   | RenamerWarnings [RenamerWarning]
-    deriving (Show)
+    deriving (Show,Generic)
 
+instance NFData ModuleWarning where rnf = genericRnf
+
 instance PP ModuleWarning where
   ppPrec _ w = case w of
     TypeCheckWarnings ws -> vcat (map T.ppWarning ws)
@@ -243,6 +269,13 @@
   {-# INLINE lift #-}
   lift = ModuleT . lift . lift . lift . lift
 
+instance Monad m => FreshM (ModuleT m) where
+  liftSupply f = ModuleT $
+    do me <- get
+       let (a,s') = f (meSupply me)
+       set $! me { meSupply = s' }
+       return a
+
 runModuleT :: Monad m
            => ModuleEnv
            -> ModuleT m a
@@ -292,7 +325,7 @@
 -- | Push an "interactive" context onto the loading stack.  A bit of a hack, as
 -- it uses a faked module name
 interactive :: ModuleM a -> ModuleM a
-interactive  = loadingModule (P.ModName ["<interactive>"])
+interactive  = loadingModule interactiveName
 
 loading :: ImportSource -> ModuleM a -> ModuleM a
 loading src m = ModuleT $ do
@@ -323,6 +356,9 @@
 getNameSeeds :: ModuleM T.NameSeeds
 getNameSeeds  = ModuleT (meNameSeeds `fmap` get)
 
+getSupply :: ModuleM Supply
+getSupply  = ModuleT (meSupply `fmap` get)
+
 getMonoBinds :: ModuleM Bool
 getMonoBinds  = ModuleT (meMonoBinds `fmap` get)
 
@@ -336,6 +372,11 @@
   env <- get
   set $! env { meNameSeeds = seeds }
 
+setSupply :: Supply -> ModuleM ()
+setSupply supply = ModuleT $
+  do env <- get
+     set $! env { meSupply = supply }
+
 -- | Remove a module from the set of loaded module, by its path.
 unloadModule :: FilePath -> ModuleM ()
 unloadModule path = ModuleT $ do
@@ -380,7 +421,7 @@
   return x
 
 -- XXX improve error handling here
-getFocusedEnv :: ModuleM IfaceDecls
+getFocusedEnv :: ModuleM (IfaceDecls,NamingEnv,NameDisp)
 getFocusedEnv  = ModuleT (focusedEnv `fmap` get)
 
 getQualifiedEnv :: ModuleM IfaceDecls
@@ -393,3 +434,15 @@
 setDynEnv denv = ModuleT $ do
   me <- get
   set $! me { meDynEnv = denv }
+
+setSolver :: T.SolverConfig -> ModuleM ()
+setSolver cfg = ModuleT $ do
+  me <- get
+  set $! me { meSolverConfig = cfg }
+
+getSolverConfig :: ModuleM T.SolverConfig
+getSolverConfig  = ModuleT $ do
+  me <- get
+  return (meSolverConfig me)
+
+
diff --git a/src/Cryptol/ModuleSystem/Name.hs b/src/Cryptol/ModuleSystem/Name.hs
new file mode 100644
--- /dev/null
+++ b/src/Cryptol/ModuleSystem/Name.hs
@@ -0,0 +1,337 @@
+-- |
+-- Module      :  $Header$
+-- Copyright   :  (c) 2015-2016 Galois, Inc.
+-- License     :  BSD3
+-- Maintainer  :  cryptol@galois.com
+-- Stability   :  provisional
+-- Portability :  portable
+
+{-# LANGUAGE Trustworthy #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE FlexibleInstances #-}
+-- for the instances of RunM and BaseM
+{-# LANGUAGE UndecidableInstances #-}
+
+module Cryptol.ModuleSystem.Name (
+    -- * Names
+    Name(), NameInfo(..)
+  , nameUnique
+  , nameIdent
+  , nameInfo
+  , nameLoc
+  , asPrim
+  , cmpNameLexical
+  , cmpNameDisplay
+  , ppLocName
+
+    -- ** Creation
+  , mkDeclared
+  , mkParameter
+
+    -- ** Unique Supply
+  , FreshM(..), nextUniqueM
+  , SupplyT(), runSupplyT
+  , SupplyM(), runSupplyM
+  , Supply(), emptySupply, nextUnique
+
+    -- ** PrimMap
+  , PrimMap(..)
+  , lookupPrimDecl
+  , lookupPrimType
+  ) where
+
+import           Cryptol.Parser.Position (Range,Located(..))
+import           Cryptol.Utils.Ident
+import           Cryptol.Utils.Panic
+import           Cryptol.Utils.PP
+
+import           Control.DeepSeq.Generics
+import           Control.Monad.Fix (MonadFix(mfix))
+import qualified Data.Map as Map
+import qualified Data.Monoid as M
+import           Data.Ord (comparing)
+import           GHC.Generics (Generic)
+import           MonadLib
+import           Prelude ()
+import           Prelude.Compat
+
+
+-- Names -----------------------------------------------------------------------
+-- | Information about the binding site of the name.
+data NameInfo = Declared !ModName
+                -- ^ This name refers to a declaration from this module
+              | Parameter
+                -- ^ This name is a parameter (function or type)
+                deriving (Eq,Show,Generic)
+
+data Name = Name { nUnique :: {-# UNPACK #-} !Int
+                   -- ^ INVARIANT: this field uniquely identifies a name for one
+                   -- session with the Cryptol library. Names are unique to
+                   -- their binding site.
+
+                 , nInfo :: !NameInfo
+                   -- ^ Information about the origin of this name.
+
+                 , nIdent :: !Ident
+                   -- ^ The name of the identifier
+
+                 , nLoc :: !Range
+                   -- ^ Where this name was defined
+                 } deriving (Show,Generic)
+
+instance Eq Name where
+  a == b = compare a b == EQ
+  a /= b = compare a b /= EQ
+
+instance Ord Name where
+  compare a b = compare (nUnique a) (nUnique b)
+
+instance NFData NameInfo where rnf = genericRnf
+instance NFData Name where rnf = genericRnf
+
+-- | Compare two names lexically.
+cmpNameLexical :: Name -> Name -> Ordering
+cmpNameLexical l r =
+  case (nameInfo l, nameInfo r) of
+
+    (Declared nsl,Declared nsr) ->
+      case compare nsl nsr of
+        EQ  -> comparing nameIdent l r
+        cmp -> cmp
+
+    (Parameter,Parameter) -> comparing nameIdent l r
+
+    (Declared nsl,Parameter) -> compare nsl (identText (nameIdent r))
+    (Parameter,Declared nsr) -> compare (identText (nameIdent l)) nsr
+
+
+-- | Compare two names by the way they would be displayed.
+cmpNameDisplay :: NameDisp -> Name -> Name -> Ordering
+cmpNameDisplay disp l r =
+  case (nameInfo l, nameInfo r) of
+
+    (Declared nsl, Declared nsr) ->
+      let pfxl = fmtModName nsl (getNameFormat nsl (nameIdent l) disp)
+          pfxr = fmtModName nsr (getNameFormat nsr (nameIdent r) disp)
+       in case compare pfxl pfxr of
+            EQ  -> compare (nameIdent l) (nameIdent r)
+            cmp -> cmp
+
+    (Parameter,Parameter) ->
+      compare (nameIdent l) (nameIdent r)
+
+    (Declared nsl,Parameter) ->
+      let pfxl = fmtModName nsl (getNameFormat nsl (nameIdent l) disp)
+       in case compare pfxl (identText (nameIdent r)) of
+            EQ  -> GT
+            cmp -> cmp
+
+    (Parameter,Declared nsr) ->
+      let pfxr = fmtModName nsr (getNameFormat nsr (nameIdent r) disp)
+       in case compare (identText (nameIdent l)) pfxr of
+            EQ  -> LT
+            cmp -> cmp
+
+
+-- | Figure out how the name should be displayed, by referencing the display
+-- function in the environment. NOTE: this function doesn't take into account
+-- the need for parenthesis.
+ppName :: Name -> Doc
+ppName Name { .. } =
+  case nInfo of
+
+    Declared m -> withNameDisp $ \disp ->
+      case getNameFormat m nIdent disp of
+        Qualified m' -> pp m' <> text "::" <> pp nIdent
+        UnQualified  ->                       pp nIdent
+        NotInScope   -> pp m  <> text "::" <> pp nIdent
+
+    Parameter -> pp nIdent
+
+instance PP Name where
+  ppPrec _ = ppPrefixName
+
+instance PPName Name where
+  ppInfixName n @ Name { .. }
+    | isInfixIdent nIdent = ppName n
+    | otherwise           = panic "Name" [ "Non-infix name used infix"
+                                         , show nIdent ]
+
+  ppPrefixName n @ Name { .. } = optParens (isInfixIdent nIdent) (ppName n)
+
+-- | Pretty-print a name with its source location information.
+ppLocName :: Name -> Doc
+ppLocName n = pp Located { srcRange = nameLoc n, thing = n }
+
+nameUnique :: Name -> Int
+nameUnique  = nUnique
+
+nameIdent :: Name -> Ident
+nameIdent  = nIdent
+
+nameInfo :: Name -> NameInfo
+nameInfo  = nInfo
+
+nameLoc :: Name -> Range
+nameLoc  = nLoc
+
+asPrim :: Name -> Maybe Ident
+asPrim Name { .. }
+  | nInfo == Declared preludeName = Just nIdent
+  | otherwise                     = Nothing
+
+
+-- Name Supply -----------------------------------------------------------------
+
+class Monad m => FreshM m where
+  liftSupply :: (Supply -> (a,Supply)) -> m a
+
+instance FreshM m => FreshM (ExceptionT i m) where
+  liftSupply f = lift (liftSupply f)
+
+instance (M.Monoid i, FreshM m) => FreshM (WriterT i m) where
+  liftSupply f = lift (liftSupply f)
+
+instance FreshM m => FreshM (ReaderT i m) where
+  liftSupply f = lift (liftSupply f)
+
+instance FreshM m => FreshM (StateT i m) where
+  liftSupply f = lift (liftSupply f)
+
+instance FreshM SupplyM where
+  liftSupply f = SupplyM (liftSupply f)
+
+instance Monad m => FreshM (SupplyT m) where
+  liftSupply f = SupplyT $
+    do s <- get
+       let (a,s') = f s
+       set $! s'
+       return a
+
+-- | A monad for easing the use of the supply.
+newtype SupplyT m a = SupplyT { unSupply :: StateT Supply m a }
+
+runSupplyT :: Monad m => Supply -> SupplyT m a -> m (a,Supply)
+runSupplyT s (SupplyT m) = runStateT s m
+
+instance Monad m => Functor (SupplyT m) where
+  fmap f (SupplyT m) = SupplyT (fmap f m)
+  {-# INLINE fmap #-}
+
+instance Monad m => Applicative (SupplyT m) where
+  pure x = SupplyT (pure x)
+  {-# INLINE pure #-}
+
+  f <*> g = SupplyT (unSupply f <*> unSupply g)
+  {-# INLINE (<*>) #-}
+
+instance Monad m => Monad (SupplyT m) where
+  return = pure
+  {-# INLINE return #-}
+
+  m >>= f = SupplyT (unSupply m >>= unSupply . f)
+  {-# INLINE (>>=) #-}
+
+instance MonadT SupplyT where
+  lift m = SupplyT (lift m)
+
+instance BaseM m n => BaseM (SupplyT m) n where
+  inBase m = SupplyT (inBase m)
+  {-# INLINE inBase #-}
+
+instance RunM m (a,Supply) r => RunM (SupplyT m) a (Supply -> r) where
+  runM (SupplyT m) s = runM m s
+  {-# INLINE runM #-}
+
+instance MonadFix m => MonadFix (SupplyT m) where
+  mfix f = SupplyT (mfix (unSupply . f))
+
+
+newtype SupplyM a = SupplyM (SupplyT Id a)
+                    deriving (Functor,Applicative,Monad,MonadFix)
+
+runSupplyM :: Supply -> SupplyM a -> (a,Supply)
+runSupplyM s m = runM m s
+
+instance RunM SupplyM a (Supply -> (a,Supply)) where
+  runM (SupplyM m) s = runM m s
+  {-# INLINE runM #-}
+
+instance BaseM SupplyM SupplyM where
+  inBase = id
+  {-# INLINE inBase #-}
+
+instance M.Monoid a => M.Monoid (SupplyM a) where
+  mempty      = return mempty
+  mappend a b = do x <- a
+                   y <- b
+                   return (mappend x y)
+
+-- | Retrieve the next unique from the supply.
+nextUniqueM :: FreshM m => m Int
+nextUniqueM  = liftSupply nextUnique
+
+
+data Supply = Supply !Int
+              deriving (Show,Generic)
+
+instance NFData Supply where rnf = genericRnf
+
+-- | This should only be used once at library initialization, and threaded
+-- through the rest of the session.  The supply is started at 0x1000 to leave us
+-- plenty of room for names that the compiler needs to know about (wired-in
+-- constants).
+emptySupply :: Supply
+emptySupply  = Supply 0
+
+nextUnique :: Supply -> (Int,Supply)
+nextUnique (Supply n) = s' `seq` (n,s')
+  where
+  s' = Supply (n + 1)
+
+
+-- Name Construction -----------------------------------------------------------
+
+-- | Make a new name for a declaration.
+mkDeclared :: ModName -> Ident -> Range -> Supply -> (Name,Supply)
+mkDeclared m nIdent nLoc s =
+  let (nUnique,s') = nextUnique s
+      nInfo        = Declared m
+   in (Name { .. }, s')
+
+-- | Make a new parameter name.
+mkParameter :: Ident -> Range -> Supply -> (Name,Supply)
+mkParameter nIdent nLoc s =
+  let (nUnique,s') = nextUnique s
+   in (Name { nInfo = Parameter, .. }, s')
+
+
+-- Prim Maps -------------------------------------------------------------------
+
+-- | A mapping from an identifier defined in some module to its real name.
+data PrimMap = PrimMap { primDecls :: Map.Map Ident Name
+                       , primTypes :: Map.Map Ident Name
+                       } deriving (Show, Generic)
+
+instance NFData PrimMap where rnf = genericRnf
+
+lookupPrimDecl, lookupPrimType :: Ident -> PrimMap -> Name
+
+-- | It's assumed that we're looking things up that we know already exist, so
+-- this will panic if it doesn't find the name.
+lookupPrimDecl name PrimMap { .. } = Map.findWithDefault err name primDecls
+  where
+  err = panic "Cryptol.ModuleSystem.Name.lookupPrimDecl"
+        [ "Unknown declaration: " ++ show name
+        , show primDecls ]
+
+-- | It's assumed that we're looking things up that we know already exist, so
+-- this will panic if it doesn't find the name.
+lookupPrimType name PrimMap { .. } = Map.findWithDefault err name primTypes
+  where
+  err = panic "Cryptol.ModuleSystem.Name.lookupPrimType"
+        [ "Unknown type: " ++ show name
+        , show primTypes ]
diff --git a/src/Cryptol/ModuleSystem/NamingEnv.hs b/src/Cryptol/ModuleSystem/NamingEnv.hs
--- a/src/Cryptol/ModuleSystem/NamingEnv.hs
+++ b/src/Cryptol/ModuleSystem/NamingEnv.hs
@@ -1,145 +1,183 @@
 -- |
 -- Module      :  $Header$
--- Copyright   :  (c) 2013-2015 Galois, Inc.
+-- Copyright   :  (c) 2013-2016 Galois, Inc.
 -- License     :  BSD3
 -- Maintainer  :  cryptol@galois.com
 -- Stability   :  provisional
 -- Portability :  portable
 
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE DeriveTraversable #-}
+{-# LANGUAGE DeriveFoldable #-}
+{-# LANGUAGE DeriveFunctor #-}
+{-# LANGUAGE PatternGuards #-}
+
 module Cryptol.ModuleSystem.NamingEnv where
 
 import Cryptol.ModuleSystem.Interface
+import Cryptol.ModuleSystem.Name
 import Cryptol.Parser.AST
-import Cryptol.Parser.Names (namesP)
 import Cryptol.Parser.Position
-import qualified Cryptol.TypeCheck.AST as T
 import Cryptol.Utils.PP
 import Cryptol.Utils.Panic (panic)
 
+import Data.List (nub)
+import Data.Maybe (catMaybes,fromMaybe)
 import qualified Data.Map as Map
+import qualified Data.Set as Set
 
-#if __GLASGOW_HASKELL__ < 710
-import Control.Applicative (Applicative, (<$>), (<*>))
-import Data.Monoid (Monoid(..))
-import Data.Foldable (foldMap)
-import Data.Traversable (traverse)
-#endif
+import GHC.Generics (Generic)
+import Control.DeepSeq.Generics
 
--- Name Locations --------------------------------------------------------------
+import Prelude ()
+import Prelude.Compat
 
-data NameOrigin = Local (Located QName)
-                | Imported QName
-                  deriving (Show)
 
-instance PP NameOrigin where
-  ppPrec _ o = case o of
-    Local lqn            -> pp lqn
-    Imported (QName m n) -> pp n <+> trailer
-      where
-      trailer = case m of
-        Just mn -> text "from module" <+> pp mn
-        _       -> empty
+-- Naming Environment ----------------------------------------------------------
 
+-- XXX The fixity environment should be removed, and Name should include fixity
+-- information.
+data NamingEnv = NamingEnv { neExprs :: Map.Map PName [Name]
+                             -- ^ Expr renaming environment
+                           , neTypes :: Map.Map PName [Name]
+                             -- ^ Type renaming environment
+                           , neFixity:: Map.Map Name Fixity
+                             -- ^ Expression-level fixity environment
+                           } deriving (Show, Generic)
 
--- Names -----------------------------------------------------------------------
+instance NFData NamingEnv where rnf = genericRnf
 
-data EName = EFromBind (Located QName)
-           | EFromNewtype (Located QName)
-           | EFromMod QName
-             deriving (Show)
+instance Monoid NamingEnv where
+  mempty        =
+    NamingEnv { neExprs  = Map.empty
+              , neTypes  = Map.empty
+              , neFixity = Map.empty }
 
-data TName = TFromParam QName
-           | TFromSyn (Located QName)
-           | TFromNewtype (Located QName)
-           | TFromMod QName
-             deriving (Show)
+  -- NOTE: merging the fixity maps is a special case that just prefers the left
+  -- entry, as they're already keyed by a name with a unique
+  mappend l r   =
+    NamingEnv { neExprs  = Map.unionWith merge (neExprs  l) (neExprs  r)
+              , neTypes  = Map.unionWith merge (neTypes  l) (neTypes  r)
+              , neFixity = Map.union           (neFixity l) (neFixity r) }
 
-class HasQName a where
-  qname  :: a -> QName
-  origin :: a -> NameOrigin
+  mconcat envs  =
+    NamingEnv { neExprs  = Map.unionsWith merge (map neExprs  envs)
+              , neTypes  = Map.unionsWith merge (map neTypes  envs)
+              , neFixity = Map.unions           (map neFixity envs) }
 
-instance HasQName TName where
-  qname tn = case tn of
-    TFromParam qn    -> qn
-    TFromSyn lqn     -> thing lqn
-    TFromNewtype lqn -> thing lqn
-    TFromMod qn      -> qn
+-- | Merge two name maps, collapsing cases where the entries are the same, and
+-- producing conflicts otherwise.
+merge :: [Name] -> [Name] -> [Name]
+merge xs ys | xs == ys  = xs
+            | otherwise = nub (xs ++ ys)
 
-  origin tn = case tn of
-    TFromParam qn    -> Local Located { srcRange = emptyRange, thing = qn }
-    TFromSyn lqn     -> Local lqn
-    TFromNewtype lqn -> Local lqn
-    TFromMod qn      -> Imported qn
+-- | Generate a mapping from 'Ident' to 'Name' for a given naming environment.
+toPrimMap :: NamingEnv -> PrimMap
+toPrimMap NamingEnv { .. } = PrimMap { .. }
+  where
+  primDecls = Map.fromList [ (nameIdent n,n) | ns <- Map.elems neExprs
+                                             , n  <- ns ]
+  primTypes = Map.fromList [ (nameIdent n,n) | ns <- Map.elems neTypes
+                                             , n  <- ns ]
 
-instance HasQName EName where
-  qname en = case en of
-    EFromBind lqn    -> thing lqn
-    EFromNewtype lqn -> thing lqn
-    EFromMod qn      -> qn
+-- | Generate a display format based on a naming environment.
+toNameDisp :: NamingEnv -> NameDisp
+toNameDisp NamingEnv { .. } = NameDisp display
+  where
+  display mn ident = Map.lookup (mn,ident) names
 
-  origin en = case en of
-    EFromBind lqn    -> Local lqn
-    EFromNewtype lqn -> Local lqn
-    EFromMod qn      -> Imported qn
+  -- only format declared names, as parameters don't need any special
+  -- formatting.
+  names = Map.fromList
+     $ [ mkEntry pn mn (nameIdent n) | (pn,ns)     <- Map.toList neExprs
+                                     , n           <- ns
+                                     , Declared mn <- [nameInfo n] ]
 
+    ++ [ mkEntry pn mn (nameIdent n) | (pn,ns)     <- Map.toList neTypes
+                                     , n           <- ns
+                                     , Declared mn <- [nameInfo n] ]
 
--- Naming Environment ----------------------------------------------------------
+  mkEntry pn mn i = ((mn,i),fmt)
+    where
+    fmt = case getModName pn of
+            Just ns -> Qualified ns
+            Nothing -> UnQualified
 
-data NamingEnv = NamingEnv { neExprs :: Map.Map QName [EName]
-                             -- ^ Expr renaming environment
-                           , neTypes :: Map.Map QName [TName]
-                             -- ^ Type renaming environment
-                           } deriving (Show)
 
-instance Monoid NamingEnv where
-  mempty        =
-    NamingEnv { neExprs = Map.empty
-              , neTypes = Map.empty }
+-- | Produce sets of visible names for types and declarations.
+--
+-- NOTE: if entries in the NamingEnv would have produced a name clash, they will
+-- be omitted from the resulting sets.
+visibleNames :: NamingEnv -> ({- types -} Set.Set Name
+                             ,{- decls -} Set.Set Name)
 
-  mappend l r   =
-    NamingEnv { neExprs = Map.unionWith (++) (neExprs l) (neExprs r)
-              , neTypes = Map.unionWith (++) (neTypes l) (neTypes r) }
+visibleNames NamingEnv { .. } = (types,decls)
+  where
+  types = Set.fromList [ n | [n] <- Map.elems neTypes ]
+  decls = Set.fromList [ n | [n] <- Map.elems neExprs ]
 
-  mconcat envs  =
-    NamingEnv { neExprs = Map.unionsWith (++) (map neExprs envs)
-              , neTypes = Map.unionsWith (++) (map neTypes envs) }
+-- | Qualify all symbols in a 'NamingEnv' with the given prefix.
+qualify :: ModName -> NamingEnv -> NamingEnv
+qualify pfx NamingEnv { .. } =
+  NamingEnv { neExprs = Map.mapKeys toQual neExprs
+            , neTypes = Map.mapKeys toQual neTypes
+            , .. }
 
+  where
+  -- XXX we don't currently qualify fresh names
+  toQual (Qual _ n)  = Qual pfx n
+  toQual (UnQual n)  = Qual pfx n
+  toQual n@NewName{} = n
+
+filterNames :: (PName -> Bool) -> NamingEnv -> NamingEnv
+filterNames p NamingEnv { .. } =
+  NamingEnv { neExprs = Map.filterWithKey check neExprs
+            , neTypes = Map.filterWithKey check neTypes
+            , .. }
+  where
+  check :: PName -> a -> Bool
+  check n _ = p n
+
+
 -- | Singleton type renaming environment.
-singletonT :: QName -> TName -> NamingEnv
+singletonT :: PName -> Name -> NamingEnv
 singletonT qn tn = mempty { neTypes = Map.singleton qn [tn] }
 
 -- | Singleton expression renaming environment.
-singletonE :: QName -> EName -> NamingEnv
+singletonE :: PName -> Name -> NamingEnv
 singletonE qn en = mempty { neExprs = Map.singleton qn [en] }
 
 -- | Like mappend, but when merging, prefer values on the lhs.
 shadowing :: NamingEnv -> NamingEnv -> NamingEnv
 shadowing l r = NamingEnv
-  { neExprs = Map.union (neExprs l) (neExprs r)
-  , neTypes = Map.union (neTypes l) (neTypes r) }
+  { neExprs  = Map.union (neExprs  l) (neExprs  r)
+  , neTypes  = Map.union (neTypes  l) (neTypes  r)
+  , neFixity = Map.union (neFixity l) (neFixity r) }
 
-travNamingEnv :: Applicative f => (QName -> f QName) -> NamingEnv -> f NamingEnv
-travNamingEnv f ne = NamingEnv <$> neExprs' <*> neTypes'
+travNamingEnv :: Applicative f => (Name -> f Name) -> NamingEnv -> f NamingEnv
+travNamingEnv f ne = NamingEnv <$> neExprs' <*> neTypes' <*> pure (neFixity ne)
   where
-    neExprs' = traverse (traverse travE) (neExprs ne)
-    neTypes' = traverse (traverse travT) (neTypes ne)
-    travE en = case en of
-      EFromBind lqn    -> EFromBind    <$> travLoc lqn
-      EFromNewtype lqn -> EFromNewtype <$> travLoc lqn
-      EFromMod qn      -> EFromMod     <$> f qn
-    travT tn = case tn of
-      TFromParam qn    -> TFromParam   <$> f qn
-      TFromSyn lqn     -> TFromSyn     <$> travLoc lqn
-      TFromNewtype lqn -> TFromNewtype <$> travLoc lqn
-      TFromMod qn      -> TFromMod     <$> f qn
-    travLoc loc = Located (srcRange loc) <$> f (thing loc)
+    neExprs' = traverse (traverse f) (neExprs ne)
+    neTypes' = traverse (traverse f) (neTypes ne)
 
+
+data InModule a = InModule !ModName a
+                  deriving (Functor,Traversable,Foldable,Show)
+
+
+-- | Generate a 'NamingEnv' using an explicit supply.
+namingEnv' :: BindsNames a => a -> Supply -> (NamingEnv,Supply)
+namingEnv' a supply = runSupplyM supply (namingEnv a)
+
 -- | Things that define exported names.
 class BindsNames a where
-  namingEnv :: a -> NamingEnv
+  namingEnv :: a -> SupplyM NamingEnv
 
 instance BindsNames NamingEnv where
-  namingEnv = id
+  namingEnv = return
 
 instance BindsNames a => BindsNames (Maybe a) where
   namingEnv = foldMap namingEnv
@@ -149,99 +187,130 @@
 
 -- | Generate a type renaming environment from the parameters that are bound by
 -- this schema.
-instance BindsNames Schema where
+instance BindsNames (Schema PName) where
   namingEnv (Forall ps _ _ _) = foldMap namingEnv ps
 
--- | Produce a naming environment from an interface file, that contains a
--- mapping only from unqualified names to qualified ones.
-instance BindsNames Iface where
-  namingEnv = namingEnv . ifPublic
 
--- | Translate a set of declarations from an interface into a naming
--- environment.
-instance BindsNames IfaceDecls where
-  namingEnv binds = mconcat [ types, newtypes, vars ]
-    where
+-- | Interpret an import in the context of an interface, to produce a name
+-- environment for the renamer, and a 'NameDisp' for pretty-printing.
+interpImport :: Import -> IfaceDecls -> NamingEnv
+interpImport imp publicDecls = qualified
+  where
 
-    types = mempty
-      { neTypes = Map.map (map (TFromMod . ifTySynName)) (ifTySyns binds)
-      }
+  -- optionally qualify names based on the import
+  qualified | Just pfx <- iAs imp = qualify pfx restricted
+            | otherwise           =             restricted
 
-    newtypes = mempty
-      { neTypes = Map.map (map (TFromMod . T.ntName)) (ifNewtypes binds)
-      , neExprs = Map.map (map (EFromMod . T.ntName)) (ifNewtypes binds)
-      }
+  -- restrict or hide imported symbols
+  restricted
+    | Just (Hiding ns) <- iSpec imp =
+       filterNames (\qn -> not (getIdent qn `elem` ns)) public
 
-    vars = mempty
-      { neExprs = Map.map (map (EFromMod . ifDeclName)) (ifDecls binds)
-      }
+    | Just (Only ns) <- iSpec imp =
+       filterNames (\qn -> getIdent qn `elem` ns) public
 
+    | otherwise = public
 
--- | Translate names bound by the patterns of a match into a renaming
--- environment.
-instance BindsNames Match where
-  namingEnv m = case m of
-    Match p _  -> namingEnv p
-    MatchLet b -> namingEnv b
+  -- generate the initial environment from the public interface, where no names
+  -- are qualified
+  public = unqualifiedEnv publicDecls
 
-instance BindsNames Bind where
-  namingEnv b = singletonE (thing qn) (EFromBind qn)
-    where
-    qn = bName b
 
--- | Generate the naming environment for a type parameter.
-instance BindsNames TParam where
-  namingEnv p = singletonT qn (TFromParam qn)
-    where
-    qn = mkUnqual (tpName p)
+-- | Generate a naming environment from a declaration interface, where none of
+-- the names are qualified.
+unqualifiedEnv :: IfaceDecls -> NamingEnv
+unqualifiedEnv IfaceDecls { .. } =
+  mconcat [ exprs, tySyns, ntTypes, ntExprs
+          , mempty { neFixity = Map.fromList fixity } ]
+  where
+  toPName n = mkUnqual (nameIdent n)
 
--- | Generate an expression renaming environment from a pattern.  This ignores
--- type parameters that can be bound by the pattern.
-instance BindsNames Pattern where
-  namingEnv p = foldMap unqualBind (namesP p)
-    where
-    unqualBind qn = singletonE (thing qn) (EFromBind qn)
+  exprs   = mconcat [ singletonE (toPName n) n | n <- Map.keys ifDecls ]
+  tySyns  = mconcat [ singletonT (toPName n) n | n <- Map.keys ifTySyns ]
+  ntTypes = mconcat [ singletonT (toPName n) n | n <- Map.keys ifNewtypes ]
+  ntExprs = mconcat [ singletonE (toPName n) n | n <- Map.keys ifNewtypes ]
 
+  fixity =
+    catMaybes [ do f <- ifDeclFixity d; return (ifDeclName d,f)
+              | d    <- Map.elems ifDecls ]
+
+
+data ImportIface = ImportIface Import Iface
+
+-- | Produce a naming environment from an interface file, that contains a
+-- mapping only from unqualified names to qualified ones.
+instance BindsNames ImportIface where
+  namingEnv (ImportIface imp Iface { .. }) =
+    return (interpImport imp ifPublic)
+
+-- | Introduce the name 
+instance BindsNames (InModule (Bind PName)) where
+  namingEnv (InModule ns b) =
+    do let Located { .. } = bName b
+       n <- liftSupply (mkDeclared ns (getIdent thing) srcRange)
+
+       let fixity = case bFixity b of
+             Just f  -> mempty { neFixity = Map.singleton n f }
+             Nothing -> mempty
+
+       return (singletonE thing n `mappend` fixity)
+
+-- | Generate the naming environment for a type parameter.
+instance BindsNames (TParam PName) where
+  namingEnv TParam { .. } =
+    do let range = fromMaybe emptyRange tpRange
+       n <- liftSupply (mkParameter (getIdent tpName) range)
+       return (singletonT tpName n)
+
 -- | The naming environment for a single module.  This is the mapping from
--- unqualified internal names to fully qualified names.
-instance BindsNames Module where
-  namingEnv m = foldMap topDeclEnv (mDecls m)
+-- unqualified names to fully qualified names with uniques.
+instance BindsNames (Module PName) where
+  namingEnv Module { .. } = foldMap (namingEnv . InModule ns) mDecls
     where
-    topDeclEnv td = case td of
-      Decl d      -> declEnv (tlValue d)
-      TDNewtype n -> newtypeEnv (tlValue n)
-      Include _   -> mempty
-
-    qual = fmap (\qn -> mkQual (thing (mName m)) (unqual qn))
+    ns = thing mName
 
-    qualBind ln = singletonE (thing ln) (EFromBind (qual ln))
-    qualType ln = singletonT (thing ln) (TFromSyn (qual ln))
+instance BindsNames (InModule (TopDecl PName)) where
+  namingEnv (InModule ns td) =
+    case td of
+      Decl d      -> namingEnv (InModule ns (tlValue d))
+      TDNewtype d -> namingEnv (InModule ns (tlValue d))
+      Include _   -> return mempty
 
-    declEnv d = case d of
-      DSignature ns _sig    -> foldMap qualBind ns
-      DPragma ns _p         -> foldMap qualBind ns
-      DBind b               -> qualBind (bName b)
-      DPatBind _pat _e      -> panic "ModuleSystem" ["Unexpected pattern binding"]
-      DType (TySyn lqn _ _) -> qualType lqn
-      DLocated d' _         -> declEnv d'
+instance BindsNames (InModule (Newtype PName)) where
+  namingEnv (InModule ns Newtype { .. }) =
+    do let Located { .. } = nName
+       tyName <- liftSupply (mkDeclared ns (getIdent thing) srcRange)
+       eName  <- liftSupply (mkDeclared ns (getIdent thing) srcRange)
+       return (singletonT thing tyName `mappend` singletonE thing eName)
 
-    newtypeEnv n = singletonT (thing qn) (TFromNewtype (qual qn))
-         `mappend` singletonE (thing qn) (EFromNewtype (qual qn))
-      where
-      qn = nName n
+-- | The naming environment for a single declaration.
+instance BindsNames (InModule (Decl PName)) where
+  namingEnv (InModule pfx d) = case d of
+    DBind b ->
+      do n <- mkName (bName b)
+         return (singletonE (thing (bName b)) n `mappend` fixity n b)
 
--- | The naming environment for a single declaration, unqualified.  This is
--- meanat to be used for things like where clauses.
-instance BindsNames Decl where
-  namingEnv d = case d of
     DSignature ns _sig    -> foldMap qualBind ns
     DPragma ns _p         -> foldMap qualBind ns
-    DBind b               -> qualBind (bName b)
-    DPatBind _pat _e      -> panic "ModuleSystem" ["Unexpected pattern binding"]
     DType (TySyn lqn _ _) -> qualType lqn
-    DLocated d' _         -> namingEnv d'
+    DLocated d' _         -> namingEnv (InModule pfx d')
+    DPatBind _pat _e      -> panic "ModuleSystem" ["Unexpected pattern binding"]
+    DFixity{}             -> panic "ModuleSystem" ["Unexpected fixity declaration"]
+
     where
-    qualBind ln = singletonE (thing ln) (EFromBind ln)
-    qualType ln = singletonT (thing ln) (TFromSyn ln)
 
+    mkName ln =
+      liftSupply (mkDeclared pfx (getIdent (thing ln)) (srcRange ln))
 
+    qualBind ln =
+      do n <- mkName ln
+         return (singletonE (thing ln) n)
+
+    qualType ln =
+      do n <- mkName ln
+         return (singletonT (thing ln) n)
+
+    fixity n b =
+      case bFixity b of
+        Just f  -> mempty { neFixity = Map.singleton n f }
+        Nothing -> mempty
diff --git a/src/Cryptol/ModuleSystem/Renamer.hs b/src/Cryptol/ModuleSystem/Renamer.hs
--- a/src/Cryptol/ModuleSystem/Renamer.hs
+++ b/src/Cryptol/ModuleSystem/Renamer.hs
@@ -1,6 +1,6 @@
 -- |
 -- Module      :  $Header$
--- Copyright   :  (c) 2013-2015 Galois, Inc.
+-- Copyright   :  (c) 2013-2016 Galois, Inc.
 -- License     :  BSD3
 -- Maintainer  :  cryptol@galois.com
 -- Stability   :  provisional
@@ -8,117 +8,155 @@
 
 {-# LANGUAGE PatternGuards #-}
 {-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE MultiWayIf #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE CPP #-}
 
 module Cryptol.ModuleSystem.Renamer (
     NamingEnv(), shadowing
-  , BindsNames(..)
+  , BindsNames(..), InModule(..), namingEnv'
   , checkNamingEnv
-  , Rename(..), runRenamer
+  , shadowNames
+  , Rename(..), runRenamer, RenameM()
   , RenamerError(..)
   , RenamerWarning(..)
+  , renameVar
+  , renameType
+  , renameModule
   ) where
 
+import Cryptol.ModuleSystem.Name
 import Cryptol.ModuleSystem.NamingEnv
 import Cryptol.Prims.Syntax
 import Cryptol.Parser.AST
-import Cryptol.Parser.Names (tnamesP)
 import Cryptol.Parser.Position
+import Cryptol.Utils.Ident (packIdent,packInfix)
 import Cryptol.Utils.Panic (panic)
 import Cryptol.Utils.PP
 
-import MonadLib
+import MonadLib hiding (mapM)
 import qualified Data.Map as Map
 
-#if __GLASGOW_HASKELL__ < 710
-import Control.Applicative(Applicative(..),(<$>))
-import Data.Foldable (foldMap)
-import Data.Monoid (Monoid(..))
-import Data.Traversable (traverse)
-#endif
+import GHC.Generics (Generic)
+import Control.DeepSeq.Generics
 
+import Prelude ()
+import Prelude.Compat
+
 -- Errors ----------------------------------------------------------------------
 
 data RenamerError
-  = MultipleSyms (Located QName) [NameOrigin]
+  = MultipleSyms (Located PName) [Name] NameDisp
     -- ^ Multiple imported symbols contain this name
 
-  | UnboundExpr (Located QName)
+  | UnboundExpr (Located PName) NameDisp
     -- ^ Expression name is not bound to any definition
 
-  | UnboundType (Located QName)
+  | UnboundType (Located PName) NameDisp
     -- ^ Type name is not bound to any definition
 
-  | OverlappingSyms [NameOrigin]
+  | OverlappingSyms [Name] NameDisp
     -- ^ An environment has produced multiple overlapping symbols
 
-  | ExpectedValue (Located QName)
+  | ExpectedValue (Located PName) NameDisp
     -- ^ When a value is expected from the naming environment, but one or more
     -- types exist instead.
 
-  | ExpectedType (Located QName)
+  | ExpectedType (Located PName) NameDisp
     -- ^ When a type is missing from the naming environment, but one or more
     -- values exist with the same name.
-    deriving (Show)
 
+  | FixityError (Located Name) (Located Name) NameDisp
+    -- ^ When the fixity of two operators conflict
+
+  | InvalidConstraint (Type PName) NameDisp
+    -- ^ When it's not possible to produce a Prop from a Type.
+
+  | MalformedConstraint (Located (Type PName)) NameDisp
+    -- ^ When a constraint appears within another constraint
+    deriving (Show,Generic)
+
+instance NFData RenamerError where rnf = genericRnf
+
 instance PP RenamerError where
   ppPrec _ e = case e of
 
-    MultipleSyms lqn qns ->
+    MultipleSyms lqn qns disp -> fixNameDisp disp $
       hang (text "[error] at" <+> pp (srcRange lqn))
          4 $ (text "Multiple definitions for symbol:" <+> pp (thing lqn))
-          $$ vcat (map pp qns)
+          $$ vcat (map ppLocName qns)
 
-    UnboundExpr lqn ->
+    UnboundExpr lqn disp -> fixNameDisp disp $
       hang (text "[error] at" <+> pp (srcRange lqn))
          4 (text "Value not in scope:" <+> pp (thing lqn))
 
-    UnboundType lqn ->
+    UnboundType lqn disp -> fixNameDisp disp $
       hang (text "[error] at" <+> pp (srcRange lqn))
          4 (text "Type not in scope:" <+> pp (thing lqn))
 
-    OverlappingSyms qns ->
+    OverlappingSyms qns disp -> fixNameDisp disp $
       hang (text "[error]")
          4 $ text "Overlapping symbols defined:"
-          $$ vcat (map pp qns)
+          $$ vcat (map ppLocName qns)
 
-    ExpectedValue lqn ->
+    ExpectedValue lqn disp -> fixNameDisp disp $
       hang (text "[error] at" <+> pp (srcRange lqn))
          4 (fsep [ text "Expected a value named", quotes (pp (thing lqn))
                  , text "but found a type instead"
                  , text "Did you mean `(" <> pp (thing lqn) <> text")?" ])
 
-    ExpectedType lqn ->
+    ExpectedType lqn disp -> fixNameDisp disp $
       hang (text "[error] at" <+> pp (srcRange lqn))
          4 (fsep [ text "Expected a type named", quotes (pp (thing lqn))
                  , text "but found a value instead" ])
 
+    FixityError o1 o2 disp -> fixNameDisp disp $
+      hang (text "[error]")
+         4 (fsep [ text "The fixities of", pp o1, text "and", pp o2
+                 , text "are not compatible.  "
+                 , text "You may use explicit parenthesis to disambiguate" ])
+
+    InvalidConstraint ty disp -> fixNameDisp disp $
+      hang (text "[error]" <+> maybe empty (\r -> text "at" <+> pp r) (getLoc ty))
+         4 (fsep [ pp ty, text "is not a valid constraint" ])
+
+    MalformedConstraint t disp -> fixNameDisp disp $
+      hang (text "[error] at" <+> pp (srcRange t))
+         4 (sep [ quotes (pp (thing t))
+                , text "is not a valid argument to a constraint" ])
+
 -- Warnings --------------------------------------------------------------------
 
 data RenamerWarning
-  = SymbolShadowed NameOrigin [NameOrigin]
-    deriving (Show)
+  = SymbolShadowed Name [Name] NameDisp
+    deriving (Show,Generic)
 
+instance NFData RenamerWarning where rnf = genericRnf
+
 instance PP RenamerWarning where
-  ppPrec _ (SymbolShadowed new originals) =
+  ppPrec _ (SymbolShadowed new originals disp) = fixNameDisp disp $
     hang (text "[warning] at" <+> loc)
        4 $ fsep [ text "This binding for" <+> sym
-                , text "shadows the existing binding" <> plural <+> text "from" ]
-        $$ vcat (map pp originals)
+                , (text "shadows the existing binding" <> plural) <+> text "from" ]
+        $$ vcat (map ppLocName originals)
 
     where
     plural | length originals > 1 = char 's'
            | otherwise            = empty
 
-    (loc,sym) = case new of
-                  Local lqn   -> (pp (srcRange lqn), pp (thing lqn))
-                  Imported qn -> (empty, pp qn)
+    loc = pp (nameLoc new)
+    sym = pp new
 
 
 -- Renaming Monad --------------------------------------------------------------
 
 data RO = RO
   { roLoc   :: Range
+  , roMod   :: !ModName
   , roNames :: NamingEnv
+  , roDisp  :: !NameDisp
   }
 
 data Out = Out
@@ -132,8 +170,18 @@
                     (oErrors   l `mappend` oErrors   r)
 
 newtype RenameM a = RenameM
-  { unRenameM :: ReaderT RO (WriterT Out Id) a }
+  { unRenameM :: ReaderT RO (WriterT Out SupplyM) a }
 
+instance Monoid a => Monoid (RenameM a) where
+  {-# INLINE mempty #-}
+  mempty = return mempty
+
+  {-# INLINE mappend #-}
+  mappend a b =
+    do x <- a
+       y <- b
+       return (mappend x y)
+
 instance Functor RenameM where
   {-# INLINE fmap #-}
   fmap f m      = RenameM (fmap f (unRenameM m))
@@ -152,26 +200,33 @@
   {-# INLINE (>>=) #-}
   m >>= k       = RenameM (unRenameM m >>= unRenameM . k)
 
-runRenamer :: NamingEnv -> RenameM a
-           -> (Either [RenamerError] a,[RenamerWarning])
-runRenamer env m = (res,oWarnings out)
+runRenamer :: Supply -> ModName -> NamingEnv -> RenameM a
+           -> (Either [RenamerError] (a,Supply),[RenamerWarning])
+runRenamer s ns env m = (res,oWarnings out)
   where
 
-  (a,out) = runM (unRenameM m) RO { roLoc = emptyRange, roNames = env }
+  ((a,out),s') = runM (unRenameM m) RO { roLoc = emptyRange
+                                       , roNames = env
+                                       , roMod = ns
+                                       , roDisp = neverQualifyMod ns
+                                           `mappend` toNameDisp env
+                                       } s
 
-  res | null (oErrors out) = Right a
+  res | null (oErrors out) = Right (a,s')
       | otherwise          = Left (oErrors out)
 
-record :: RenamerError -> RenameM ()
-record err = records [err]
+record :: (NameDisp -> RenamerError) -> RenameM ()
+record f = RenameM $
+  do RO { .. } <- ask
+     put mempty { oErrors = [f roDisp] }
 
-records :: [RenamerError] -> RenameM ()
-records errs = RenameM (put mempty { oErrors = errs })
+curLoc :: RenameM Range
+curLoc  = RenameM (roLoc `fmap` ask)
 
 located :: a -> RenameM (Located a)
-located a = RenameM $ do
-  ro <- ask
-  return Located { srcRange = roLoc ro, thing = a }
+located thing =
+  do srcRange <- curLoc
+     return Located { .. }
 
 withLoc :: HasLoc loc => loc -> RenameM a -> RenameM a
 withLoc loc m = RenameM $ case getLoc loc of
@@ -182,35 +237,61 @@
 
   Nothing -> unRenameM m
 
+-- | Retrieve the name of the current module.
+getNS :: RenameM ModName
+getNS  = RenameM (roMod `fmap` ask)
+
 -- | Shadow the current naming environment with some more names.
 shadowNames :: BindsNames env => env -> RenameM a -> RenameM a
-shadowNames names m = RenameM $ do
-  let env = namingEnv names
-  ro <- ask
-  put (checkEnv env (roNames ro))
+shadowNames  = shadowNames' CheckAll
+
+data EnvCheck = CheckAll     -- ^ Check for overlap and shadowing
+              | CheckOverlap -- ^ Only check for overlap
+              | CheckNone    -- ^ Don't check the environment
+                deriving (Eq,Show)
+
+-- | Shadow the current naming environment with some more names. The boolean
+-- parameter indicates whether or not to check for shadowing.
+shadowNames' :: BindsNames env => EnvCheck -> env -> RenameM a -> RenameM a
+shadowNames' check names m = RenameM $ do
+  env <- inBase (namingEnv names)
+  ro  <- ask
+  put (checkEnv (roDisp ro) check env (roNames ro))
   let ro' = ro { roNames = env `shadowing` roNames ro }
   local ro' (unRenameM m)
 
+shadowNamesNS :: BindsNames (InModule env) => env -> RenameM a -> RenameM a
+shadowNamesNS names m =
+  do ns <- getNS
+     shadowNames (InModule ns names) m
+
+
 -- | Generate warnings when the left environment shadows things defined in
 -- the right.  Additionally, generate errors when two names overlap in the
 -- left environment.
-checkEnv :: NamingEnv -> NamingEnv -> Out
-checkEnv l r = Map.foldlWithKey (step neExprs) mempty (neExprs l)
-     `mappend` Map.foldlWithKey (step neTypes) mempty (neTypes l)
+checkEnv :: NameDisp -> EnvCheck -> NamingEnv -> NamingEnv -> Out
+checkEnv _    CheckNone _ _ = mempty
+checkEnv disp check     l r = Map.foldlWithKey (step neExprs) mempty (neExprs l)
+                    `mappend` Map.foldlWithKey (step neTypes) mempty (neTypes l)
+
   where
 
   step prj acc k ns = acc `mappend` mempty
-    { oWarnings = case Map.lookup k (prj r) of
-        Nothing -> []
-        Just os -> [SymbolShadowed (origin (head ns)) (map origin os)]
-    , oErrors   = containsOverlap ns
+    { oWarnings =
+        if check == CheckAll
+           then case Map.lookup k (prj r) of
+                  Nothing -> []
+                  Just os -> [SymbolShadowed (head ns) os disp]
+
+           else []
+    , oErrors   = containsOverlap disp ns
     }
 
 -- | Check the RHS of a single name rewrite for conflicting sources.
-containsOverlap :: HasQName a => [a] -> [RenamerError]
-containsOverlap [_] = []
-containsOverlap []  = panic "Renamer" ["Invalid naming environment"]
-containsOverlap ns  = [OverlappingSyms (map origin ns)]
+containsOverlap :: NameDisp -> [Name] -> [RenamerError]
+containsOverlap _    [_] = []
+containsOverlap _    []  = panic "Renamer" ["Invalid naming environment"]
+containsOverlap disp ns  = [OverlappingSyms ns disp]
 
 -- | Throw errors for any names that overlap in a rewrite environment.
 checkNamingEnv :: NamingEnv -> ([RenamerError],[RenamerWarning])
@@ -219,75 +300,79 @@
   out    = Map.foldr check outTys (neExprs env)
   outTys = Map.foldr check mempty (neTypes env)
 
-  check ns acc = containsOverlap ns ++ acc
+  disp   = toNameDisp env
 
+  check ns acc = containsOverlap disp ns ++ acc
 
--- Renaming --------------------------------------------------------------------
+supply :: SupplyM a -> RenameM a
+supply m = RenameM (inBase m)
 
-class Rename a where
-  rename :: a -> RenameM a
 
-instance Rename a => Rename [a] where
-  rename        = traverse rename
-
-instance Rename a => Rename (Maybe a) where
-  rename        = traverse rename
-
-instance Rename a => Rename (Located a) where
-  rename loc    = withLoc loc $ do
-    a' <- rename (thing loc)
-    return loc { thing = a' }
+-- Renaming --------------------------------------------------------------------
 
-instance Rename a => Rename (Named a) where
-  rename n      = do
-    a' <-rename (value n)
-    return n { value = a' }
+class Rename f where
+  rename :: f PName -> RenameM (f Name)
 
-instance Rename Module where
-  rename m      = do
-    decls' <- rename (mDecls m)
-    return m { mDecls = decls' }
+renameModule :: Module PName -> RenameM (NamingEnv,Module Name)
+renameModule m =
+  do env    <- supply (namingEnv m)
+     -- NOTE: we explicitly hide shadowing errors here, by using shadowNames'
+     decls' <-  shadowNames' CheckOverlap env (traverse rename (mDecls m))
+     return (env,m { mDecls = decls' })
 
 instance Rename TopDecl where
   rename td     = case td of
-    Decl d      -> Decl      <$> rename d
-    TDNewtype n -> TDNewtype <$> rename n
-    Include{}   -> return td
+    Decl d      -> Decl      <$> traverse rename d
+    TDNewtype n -> TDNewtype <$> traverse rename n
+    Include n   -> return (Include n)
 
-instance Rename a => Rename (TopLevel a) where
-  rename tl     = do
-    a' <- rename (tlValue tl)
-    return tl { tlValue = a' }
+rnLocated :: (a -> RenameM b) -> Located a -> RenameM (Located b)
+rnLocated f loc = withLoc loc $
+  do a' <- f (thing loc)
+     return loc { thing = a' }
 
 instance Rename Decl where
   rename d      = case d of
-    DSignature ns sig -> DSignature ns <$> rename sig
-    DPragma ns p      -> DPragma ns    <$> rename p
+    DSignature ns sig -> DSignature    <$> traverse (rnLocated renameVar) ns
+                                       <*> rename sig
+    DPragma ns p      -> DPragma       <$> traverse (rnLocated renameVar) ns
+                                       <*> pure p
     DBind b           -> DBind         <$> rename b
-    DPatBind pat e    -> DPatBind pat  <$> shadowNames (namingEnv pat) (rename e)
+
+    -- XXX we probably shouldn't see these at this point...
+    DPatBind pat e    -> do (pe,[pat']) <- renamePats [pat]
+                            shadowNames pe (DPatBind pat' <$> rename e)
+
     DType syn         -> DType         <$> rename syn
     DLocated d' r     -> withLoc r
                        $ DLocated      <$> rename d'  <*> pure r
+    DFixity{}         -> panic "Renamer" ["Unexpected fixity declaration"
+                                         , show d]
 
 instance Rename Newtype where
   rename n      = do
-    name' <- renameLoc renameType (nName n)
-    body' <- shadowNames (nParams n) (rename (nBody n))
-    return Newtype { nName   = name'
-                   , nParams = nParams n
-                   , nBody   = body' }
+    name' <- rnLocated renameType (nName n)
+    shadowNames (nParams n) $
+      do ps'   <- traverse rename (nParams n)
+         body' <- traverse (rnNamed rename) (nBody n)
+         return Newtype { nName   = name'
+                        , nParams = ps'
+                        , nBody   = body' }
 
-renameExpr :: QName -> RenameM QName
-renameExpr qn = do
+renameVar :: PName -> RenameM Name
+renameVar qn = do
   ro <- RenameM ask
   case Map.lookup qn (neExprs (roNames ro)) of
-    Just [en] -> return (qname en)
+    Just [n]  -> return n
     Just []   -> panic "Renamer" ["Invalid expression renaming environment"]
     Just syms ->
       do n <- located qn
-         record (MultipleSyms n (map origin syms))
-         return qn
-    Nothing   ->
+         record (MultipleSyms n syms)
+         return (head syms)
+
+    -- This is an unbound value. Record an error and invent a bogus real name
+    -- for it.
+    Nothing ->
       do n <- located qn
 
          case Map.lookup qn (neTypes (roNames ro)) of
@@ -296,42 +381,74 @@
 
            -- the value is just missing
            Nothing -> record (UnboundExpr n)
-         return qn
 
-renameType :: QName -> RenameM QName
-renameType qn = do
-  ro <- RenameM ask
-  case Map.lookup qn (neTypes (roNames ro)) of
-    Just [tn] -> return (qname tn)
-    Just []   -> panic "Renamer" ["Invalid type renaming environment"]
-    Just syms ->
-      do n <- located qn
-         record (MultipleSyms n (map origin syms))
-         return qn
-    Nothing   ->
-      do n <- located qn
+         mkFakeName qn
 
-         case Map.lookup qn (neExprs (roNames ro)) of
+-- | Produce a name if one exists. Note that this includes situations where
+-- overlap exists, as it's just a query about anything being in scope. In the
+-- event that overlap does exist, an error will be recorded.
+typeExists :: PName -> RenameM (Maybe Name)
+typeExists pn =
+  do ro <- RenameM ask
+     case Map.lookup pn (neTypes (roNames ro)) of
+       Just [n]  -> return (Just n)
+       Just []   -> panic "Renamer" ["Invalid type renaming environment"]
+       Just syms -> do n <- located pn
+                       record (MultipleSyms n syms)
+                       return (Just (head syms))
+       Nothing -> return Nothing
 
-           -- values exist with the same name, so throw a different error
-           Just _ -> record (ExpectedType n)
+renameType :: PName -> RenameM Name
+renameType pn =
+  do mb <- typeExists pn
+     case mb of
+       Just n -> return n
 
-           -- no terms with the same name, so the type is just unbound
-           Nothing -> record (UnboundType n)
+       -- This is an unbound value. Record an error and invent a bogus real name
+       -- for it.
+       Nothing ->
+         do ro <- RenameM ask
+            let n = Located { srcRange = roLoc ro, thing = pn }
 
-         return qn
+            case Map.lookup pn (neExprs (roNames ro)) of
 
+              -- values exist with the same name, so throw a different error
+              Just _ -> record (ExpectedType n)
+
+              -- no terms with the same name, so the type is just unbound
+              Nothing -> record (UnboundType n)
+
+            mkFakeName pn
+
+-- | Assuming an error has been recorded already, construct a fake name that's
+-- not expected to make it out of the renamer.
+mkFakeName :: PName -> RenameM Name
+mkFakeName pn = RenameM $
+  do ro <- ask
+     inBase (liftSupply (mkParameter (getIdent pn) (roLoc ro)))
+
 -- | Rename a schema, assuming that none of its type variables are already in
 -- scope.
 instance Rename Schema where
-  rename s@(Forall ps _ _ _) = shadowNames ps (renameSchema s)
+  rename s = snd `fmap` renameSchema s
 
 -- | Rename a schema, assuming that the type variables have already been brought
 -- into scope.
-renameSchema :: Schema -> RenameM Schema
-renameSchema (Forall ps p ty loc) = Forall ps <$> rename p <*> rename ty
-                                              <*> pure loc
+renameSchema :: Schema PName -> RenameM (NamingEnv,Schema Name)
+renameSchema (Forall ps p ty loc) =
+  do env <- supply (namingEnv ps)
+     s'  <- shadowNames env $ Forall <$> traverse rename ps
+                                     <*> traverse rename p
+                                     <*> rename ty
+                                     <*> pure loc
 
+     return (env,s')
+
+instance Rename TParam where
+  rename TParam { .. } =
+    do n <- renameType tpName
+       return TParam { tpName = n, .. }
+
 instance Rename Prop where
   rename p      = case p of
     CFin t        -> CFin     <$> rename t
@@ -342,71 +459,188 @@
     CLocated p' r -> withLoc r
                    $ CLocated <$> rename p' <*> pure r
 
+    -- here, we rename the type and then require that it produces something that
+    -- looks like a Prop
+    CType t -> translateProp =<< resolveTypeFixity t
+
+translateProp :: Type PName -> RenameM (Prop Name)
+translateProp ty = go ty
+  where
+  go t = case t of
+
+    TLocated t' r -> (`CLocated` r) <$> go t'
+
+    -- these are the only cases that will produce valid props.
+    TUser n [l,r]
+      | i == packIdent "==" -> CEqual <$> rename l <*> rename r
+      | i == packIdent ">=" -> CGeq   <$> rename l <*> rename r
+      | i == packIdent "<=" -> CGeq   <$> rename r <*> rename l
+      where
+      i = getIdent n
+
+    -- record an error, but continue renaming to gather any other errors
+    _ ->
+      do record (InvalidConstraint ty)
+         CType <$> rename t
+
+
+-- | Resolve fixity, then rename the resulting type.
 instance Rename Type where
-  rename t      = case t of
-    TFun a b     -> TFun     <$> rename a  <*> rename b
-    TSeq n a     -> TSeq     <$> rename n  <*> rename a
+  rename ty0 = go =<< resolveTypeFixity ty0
+    where
+    go :: Type PName -> RenameM (Type Name)
+    go (TFun a b)    = TFun     <$> go a  <*> go b
+    go (TSeq n a)    = TSeq     <$> go n  <*> go a
+    go  TBit         = return TBit
+    go (TNum c)      = return (TNum c)
+    go (TChar c)     = return (TChar c)
+    go  TInf         = return TInf
+
+    go (TUser pn ps)
+      | i == packIdent "inf", null ps     = return TInf
+      | i == packIdent "Bit", null ps     = return TBit
+
+      | i == packIdent "min"              = TApp TCMin           <$> traverse go ps
+      | i == packIdent "max"              = TApp TCMax           <$> traverse go ps
+      | i == packIdent "lengthFromThen"   = TApp TCLenFromThen   <$> traverse go ps
+      | i == packIdent "lengthFromThenTo" = TApp TCLenFromThenTo <$> traverse go ps
+      | i == packIdent "width"            = TApp TCWidth         <$> traverse go ps
+
+      where
+      i = getIdent pn
+
+    go (TUser qn ps)   = TUser    <$> renameType qn <*> traverse go ps
+    go (TApp f xs)     = TApp f   <$> traverse go xs
+    go (TRecord fs)    = TRecord  <$> traverse (rnNamed go) fs
+    go (TTuple fs)     = TTuple   <$> traverse go fs
+    go  TWild          = return TWild
+    go (TLocated t' r) = withLoc r (TLocated <$> go t' <*> pure r)
+
+    go (TParens t')    = TParens <$> go t'
+
+    -- at this point, the fixity is correct, and we just need to perform
+    -- renaming.
+    go (TInfix a o f b) = TInfix <$> rename a
+                                 <*> rnLocated renameType o
+                                 <*> pure f
+                                 <*> rename b
+
+
+resolveTypeFixity :: Type PName -> RenameM (Type PName)
+resolveTypeFixity  = go
+  where
+  go t = case t of
+    TFun a b     -> TFun     <$> go a  <*> go b
+    TSeq n a     -> TSeq     <$> go n  <*> go a
+    TUser pn ps  -> TUser pn <$> traverse go ps
+    TApp f xs    -> TApp f   <$> traverse go xs
+    TRecord fs   -> TRecord  <$> traverse (traverse go) fs
+    TTuple fs    -> TTuple   <$> traverse go fs
+
+    TLocated t' r-> withLoc r (TLocated <$> go t' <*> pure r)
+
+    TParens t'   -> TParens <$> go t'
+
+    TInfix a o _ b ->
+      do let op = lookupFixity o
+         a' <- go a
+         b' <- go b
+         mkTInfix a' op b'
+
     TBit         -> return t
     TNum _       -> return t
     TChar _      -> return t
     TInf         -> return t
+    TWild        -> return t
 
-    TUser (QName Nothing (Name "width")) ps
-                 -> TApp TCWidth <$> rename ps
 
-    TUser qn ps  -> TUser    <$> renameType qn <*> rename ps
-    TApp f xs    -> TApp f   <$> rename xs
-    TRecord fs   -> TRecord  <$> rename fs
-    TTuple fs    -> TTuple   <$> rename fs
-    TWild        -> return t
-    TLocated t' r -> withLoc r
-                 $ TLocated <$> rename t' <*> pure r
+type TOp = Type PName -> Type PName -> Type PName
 
-instance Rename Pragma where
-  rename p      = case p of
-    PragmaNote _   -> return p
-    PragmaProperty -> return p
+infixProps :: [PName]
+infixProps  = map (mkUnqual . packInfix) [ "==", ">=", "<=" ]
 
--- | The type renaming environment generated by a binding.
-bindingTypeEnv :: Bind -> NamingEnv
-bindingTypeEnv b = patParams `shadowing` sigParams
-  where
-  -- type parameters
-  sigParams = namingEnv (bSignature b)
+mkTInfix :: Type PName -> (TOp,Fixity) -> Type PName -> RenameM (Type PName)
 
-  -- pattern type parameters
-  patParams   = foldMap (foldMap qualType . tnamesP) (bParams b)
-  qualType qn = singletonT qn (TFromParam qn)
+-- only if the function is one of props
+mkTInfix t@(TUser o1 [x,y]) op@(o2,f2) z
+  | o1 `elem` infixProps =
+    do let f1 = Fixity NonAssoc 0
+       case compareFixity f1 f2 of
+         FCLeft  -> return (o2 t z)
+         FCRight -> do r <- mkTInfix y op z
+                       return (TUser o1 [x,r])
 
+         -- Just reconstruct with the TUser part being an application. If this was
+         -- a real error, it will be caught during renaming.
+         FCError -> return (o2 t z)
+
+-- In this case, we know the fixities of both sides.
+mkTInfix t@(TApp o1 [x,y]) op@(o2,f2) z
+  | Just (a1,p1) <- Map.lookup o1 tBinOpPrec =
+     case compareFixity (Fixity a1 p1) f2 of
+       FCLeft  -> return (o2 t z)
+       FCRight -> do r <- mkTInfix y op z
+                     return (TApp o1 [x,r])
+
+       -- As the fixity table is known, and this is a case where the fixity came
+       -- from that table, it's a real error if the fixities didn't work out.
+       FCError -> panic "Renamer" [ "fixity problem for type operators"
+                                  , show (o2 t z) ]
+
+mkTInfix (TLocated t _) op z =
+     mkTInfix t op z
+
+mkTInfix t (op,_) z =
+     return (op t z)
+
+
+-- | When possible, rewrite the type operator to a known constructor, otherwise
+-- return a 'TOp' that reconstructs the original term, and a default fixity.
+lookupFixity :: Located PName -> (TOp,Fixity)
+lookupFixity op =
+  case lkp of
+    Just (p,f) -> (\x y -> TApp p [x,y], f)
+
+    -- unknown type operator, just use default fixity
+    -- NOTE: this works for the props defined above, as all other operators
+    -- are defined with a higher precedence.
+    Nothing    -> (\x y -> TUser sym [x,y], Fixity NonAssoc 0)
+
+  where
+  sym = thing op
+  lkp = do n               <- Map.lookup (thing op) tfunNames
+           (fAssoc,fLevel) <- Map.lookup n tBinOpPrec
+           return (n,Fixity { .. })
+
 -- | Rename a binding.
---
--- NOTE: this does not bind its own name into the naming context of its body.
--- The assumption here is that this has been done by the enclosing environment,
--- to allow for top-level renaming
 instance Rename Bind where
   rename b      = do
-    n' <- renameLoc renameExpr (bName b)
-    shadowNames (bindingTypeEnv b) $ do
-      (patenv,pats') <- renamePats (bParams b)
-      sig'           <- traverse renameSchema (bSignature b)
-      shadowNames patenv $
-        do e'   <- rename (bDef b)
-           p'   <- rename (bPragmas b)
-           return b { bName      = n'
-                    , bParams    = pats'
-                    , bDef       = e'
-                    , bSignature = sig'
-                    , bPragmas   = p'
-                    }
+    n'    <- rnLocated renameVar (bName b)
+    mbSig <- traverse renameSchema (bSignature b)
+    shadowNames (fst `fmap` mbSig) $
+      do (patEnv,pats') <- renamePats (bParams b)
+         -- NOTE: renamePats will generate warnings, so we don't need to trigger
+         -- them again here.
+         e'             <- shadowNames' CheckNone patEnv (rnLocated rename (bDef b))
+         return b { bName      = n'
+                  , bParams    = pats'
+                  , bDef       = e'
+                  , bSignature = snd `fmap` mbSig
+                  , bPragmas   = bPragmas b
+                  }
 
+instance Rename BindDef where
+  rename DPrim     = return DPrim
+  rename (DExpr e) = DExpr <$> rename e
+
 -- NOTE: this only renames types within the pattern.
 instance Rename Pattern where
   rename p      = case p of
-    PVar _          -> pure p
-    PWild           -> pure p
-    PTuple ps       -> PTuple   <$> rename ps
-    PRecord nps     -> PRecord  <$> rename nps
-    PList elems     -> PList    <$> rename elems
+    PVar lv         -> PVar <$> rnLocated renameVar lv
+    PWild           -> pure PWild
+    PTuple ps       -> PTuple   <$> traverse rename ps
+    PRecord nps     -> PRecord  <$> traverse (rnNamed rename) nps
+    PList elems     -> PList    <$> traverse rename elems
     PTyped p' t     -> PTyped   <$> rename p'    <*> rename t
     PSplit l r      -> PSplit   <$> rename l     <*> rename r
     PLocated p' loc -> withLoc loc
@@ -414,68 +648,189 @@
 
 instance Rename Expr where
   rename e = case e of
-    EVar n        -> EVar    <$> renameExpr n
-    ECon _        -> return e
-    ELit _        -> return e
-    ETuple es     -> ETuple  <$> rename es
-    ERecord fs    -> ERecord <$> rename fs
+    EVar n        -> EVar <$> renameVar n
+    ELit l        -> return (ELit l)
+    ETuple es     -> ETuple  <$> traverse rename es
+    ERecord fs    -> ERecord <$> traverse (rnNamed rename) fs
     ESel e' s     -> ESel    <$> rename e' <*> pure s
-    EList es      -> EList   <$> rename es
-    EFromTo s n e'-> EFromTo <$> rename s  <*> rename n  <*> rename e'
-    EInfFrom a b  -> EInfFrom<$> rename a  <*> rename b
-    EComp e' bs   -> do bs' <- mapM renameMatch bs
-                        shadowNames (namingEnv bs')
-                            (EComp <$> rename e' <*> pure bs')
+    EList es      -> EList   <$> traverse rename es
+    EFromTo s n e'-> EFromTo <$> rename s
+                             <*> traverse rename n
+                             <*> traverse rename e'
+    EInfFrom a b  -> EInfFrom<$> rename a  <*> traverse rename b
+    EComp e' bs   -> do arms' <- traverse renameArm bs
+                        let (envs,bs') = unzip arms'
+                        shadowNames envs (EComp <$> rename e' <*> pure bs')
     EApp f x      -> EApp    <$> rename f  <*> rename x
-    EAppT f ti    -> EAppT   <$> rename f  <*> rename ti
+    EAppT f ti    -> EAppT   <$> rename f  <*> traverse rename ti
     EIf b t f     -> EIf     <$> rename b  <*> rename t  <*> rename f
-    EWhere e' ds  -> shadowNames ds (EWhere <$> rename e' <*> rename ds)
+    EWhere e' ds  -> do ns <- getNS
+                        shadowNames (map (InModule ns) ds) $
+                          EWhere <$> rename e' <*> traverse rename ds
     ETyped e' ty  -> ETyped  <$> rename e' <*> rename ty
     ETypeVal ty   -> ETypeVal<$> rename ty
-    EFun ps e'    -> do ps' <- rename ps
-                        shadowNames ps' (EFun ps' <$> rename e')
+    EFun ps e'    -> do (env,ps') <- renamePats ps
+                        -- NOTE: renamePats will generate warnings, so we don't
+                        -- need to duplicate them here
+                        shadowNames' CheckNone env (EFun ps' <$> rename e')
     ELocated e' r -> withLoc r
                    $ ELocated <$> rename e' <*> pure r
 
+    EParens p     -> EParens <$> rename p
+    EInfix x y _ z-> do op <- renameOp y
+                        x' <- rename x
+                        z' <- rename z
+                        mkEInfix x' op z'
+
+mkEInfix :: Expr Name             -- ^ May contain infix expressions
+         -> (Located Name,Fixity) -- ^ The operator to use
+         -> Expr Name             -- ^ Will not contain infix expressions
+         -> RenameM (Expr Name)
+
+mkEInfix e@(EInfix x o1 f1 y) op@(o2,f2) z =
+  case compareFixity f1 f2 of
+    FCLeft  -> return (EInfix e o2 f2 z)
+
+    FCRight -> do r <- mkEInfix y op z
+                  return (EInfix x o1 f1 r)
+
+    FCError -> do record (FixityError o1 o2)
+                  return (EInfix e o2 f2 z)
+
+mkEInfix (ELocated e' _) op z =
+     mkEInfix e' op z
+
+mkEInfix e (o,f) z =
+     return (EInfix e o f z)
+
+
+renameOp :: Located PName -> RenameM (Located Name,Fixity)
+renameOp ln = withLoc ln $
+  do n  <- renameVar (thing ln)
+     ro <- RenameM ask
+     case Map.lookup n (neFixity (roNames ro)) of
+       Just fixity -> return (ln { thing = n },fixity)
+       Nothing     -> return (ln { thing = n },defaultFixity)
+
+
 instance Rename TypeInst where
   rename ti = case ti of
-    NamedInst nty -> NamedInst <$> rename nty
+    NamedInst nty -> NamedInst <$> traverse rename nty
     PosInst ty    -> PosInst   <$> rename ty
 
-renameMatch :: [Match] -> RenameM [Match]
-renameMatch  = loop
-  where
-  loop ms = case ms of
+renameArm :: [Match PName] -> RenameM (NamingEnv,[Match Name])
 
-    m:rest -> do
-      m' <- rename m
-      (m':) <$> shadowNames m' (loop rest)
+renameArm (m:ms) =
+  do (me,m') <- renameMatch m
+     shadowNames me $
+       do (env,rest) <- renameArm ms
 
-    [] -> return []
+          -- NOTE: the inner environment shadows the outer one, for examples
+          -- like this:
+          --
+          -- [ x | x <- xs, let x = 10 ]
+          return (env `shadowing` me, m':rest)
 
-renamePats :: [Pattern] -> RenameM (NamingEnv,[Pattern])
+renameArm [] =
+     return (mempty,[])
+
+-- | The name environment generated by a single match.
+renameMatch :: Match PName -> RenameM (NamingEnv,Match Name)
+
+renameMatch (Match p e) =
+  do (pe,[p']) <- renamePats [p]
+     e'        <- rename e
+     return (pe,Match p' e')
+
+renameMatch (MatchLet b) =
+  do ns <- getNS
+     be <- supply (namingEnv (InModule ns b))
+     b' <- shadowNames be (rename b)
+     return (be,MatchLet b')
+
+-- | Rename patterns, and collect the new environment that they introduce.
+renamePats :: [Pattern PName] -> RenameM (NamingEnv,[Pattern Name])
 renamePats  = loop
   where
   loop ps = case ps of
 
     p:rest -> do
-      p' <- rename p
-      let pe = namingEnv p'
-      (env',rest') <- loop rest
-      return (pe `mappend` env', p':rest')
+      pe <- patternEnv p
+      shadowNames pe $
+        do p'           <- rename p
+           (env',rest') <- loop rest
+           return (pe `mappend` env', p':rest')
 
     [] -> return (mempty, [])
 
+patternEnv :: Pattern PName -> RenameM NamingEnv
+patternEnv p0 = go p0
+  where
+  go (PVar Located { .. }) =
+    do n <- supply (liftSupply (mkParameter (getIdent thing) srcRange))
+       return (singletonE thing n)
+
+  go PWild            = return mempty
+  go (PTuple ps)      = foldMap go ps
+  go (PRecord fs)     = foldMap (foldMap go) fs
+  go (PList ps)       = foldMap go ps
+  go (PTyped p ty)    = go p `mappend` typeEnv ty
+  go (PSplit a b)     = go a `mappend` go b
+  go (PLocated p loc) = withLoc loc (go p)
+
+  typeEnv (TFun a b) = typeEnv a `mappend` typeEnv b
+  typeEnv (TSeq a b) = typeEnv a `mappend` typeEnv b
+
+  typeEnv TBit       = return mempty
+  typeEnv TNum{}     = return mempty
+  typeEnv TChar{}    = return mempty
+  typeEnv TInf       = return mempty
+
+  typeEnv (TUser pn ps) =
+    do mb <- typeExists pn
+       case mb of
+
+         -- The type is already bound, don't introduce anything.
+         Just _ -> foldMap typeEnv ps
+
+         Nothing
+           -- The type isn't bound, and has no parameters, so it names a portion
+           -- of the type of the pattern.
+           | null ps ->
+             do loc <- curLoc
+                n   <- supply (liftSupply (mkParameter (getIdent pn) loc))
+                return (singletonT pn n)
+
+           -- This references a type synonym that's not in scope. Record an
+           -- error and continue with a made up name.
+           | otherwise ->
+             do loc <- curLoc
+                record (UnboundType (Located loc pn))
+                n   <- supply (liftSupply (mkParameter (getIdent pn) loc))
+                return (singletonT pn n)
+
+  typeEnv (TApp _ ts)       = foldMap typeEnv ts
+  typeEnv (TRecord fs)      = foldMap (foldMap typeEnv) fs
+  typeEnv (TTuple ts)       = foldMap typeEnv ts
+  typeEnv TWild             = return mempty
+  typeEnv (TLocated ty loc) = withLoc loc (typeEnv ty)
+  typeEnv (TParens ty)      = typeEnv ty
+  typeEnv (TInfix a _ _ b)  = typeEnv a `mappend` typeEnv b
+
 instance Rename Match where
   rename m = case m of
-    Match p e  ->                Match    <$> rename p <*> rename e
-    MatchLet b -> shadowNames b (MatchLet <$> rename b)
+    Match p e  ->                  Match    <$> rename p <*> rename e
+    MatchLet b -> shadowNamesNS b (MatchLet <$> rename b)
 
 instance Rename TySyn where
   rename (TySyn n ps ty) =
-     shadowNames ps (TySyn <$> renameLoc renameType n <*> pure ps <*> rename ty)
+     shadowNames ps $ TySyn <$> rnLocated renameType n
+                            <*> traverse rename ps
+                            <*> rename ty
 
-renameLoc :: (a -> RenameM a) -> Located a -> RenameM (Located a)
-renameLoc by loc = do
-  a' <- by (thing loc)
-  return loc { thing = a' }
+
+-- Utilities -------------------------------------------------------------------
+
+rnNamed :: (a -> RenameM b) -> Named a -> RenameM (Named b)
+rnNamed  = traverse
+{-# INLINE rnNamed #-}
diff --git a/src/Cryptol/Parser.y b/src/Cryptol/Parser.y
--- a/src/Cryptol/Parser.y
+++ b/src/Cryptol/Parser.y
@@ -1,4 +1,12 @@
 {
+-- |
+-- Module      :  $Header$
+-- Copyright   :  (c) 2013-2016 Galois, Inc.
+-- License     :  BSD3
+-- Maintainer  :  cryptol@galois.com
+-- Stability   :  provisional
+-- Portability :  portable
+
 {-# LANGUAGE Trustworthy #-}
 module Cryptol.Parser
   ( parseModule
@@ -9,15 +17,19 @@
   , parseLetDecl, parseLetDeclWith
   , parseRepl, parseReplWith
   , parseSchema, parseSchemaWith
-  , parseModName
+  , parseModName, parseHelpName
   , ParseError(..), ppError
   , Layout(..)
   , Config(..), defaultConfig
   , guessPreProc, PreProc(..)
   ) where
 
-import Data.Maybe(fromMaybe)
-import Control.Monad(liftM2,msum)
+import           Control.Applicative as A
+import           Data.Maybe(fromMaybe)
+import           Data.Text.Lazy (Text)
+import qualified Data.Text.Lazy as T
+import qualified Data.Text as ST
+import           Control.Monad(liftM2,msum)
 
 import Cryptol.Prims.Syntax
 import Cryptol.Parser.AST
@@ -25,6 +37,7 @@
 import Cryptol.Parser.LexerUtils
 import Cryptol.Parser.ParserUtils
 import Cryptol.Parser.Unlit(PreProc(..), guessPreProc)
+import Cryptol.Utils.Ident (packIdent,packInfix)
 
 import Paths_cryptol
 }
@@ -32,28 +45,22 @@
 
 %token
   NUM         { $$@(Located _ (Token (Num   {}) _))}
-  IDENT       { $$@(Located _ (Token (Ident {}) _))}
   STRLIT      { $$@(Located _ (Token (StrLit {}) _))}
   CHARLIT     { $$@(Located _ (Token (ChrLit {}) _))}
 
+  IDENT       { $$@(Located _ (Token (Ident [] _) _))}
+  QIDENT      { $$@(Located _ (Token  Ident{}     _))}
+
   'include'   { Located $$ (Token (KW KW_include)   _)}
   'import'    { Located $$ (Token (KW KW_import)    _)}
   'as'        { Located $$ (Token (KW KW_as)        _)}
   'hiding'    { Located $$ (Token (KW KW_hiding)    _)}
   'private'   { Located $$ (Token (KW KW_private)   _)}
   'property'  { Located $$ (Token (KW KW_property)  _)}
+  'infix'     { Located $$ (Token (KW KW_infix)     _)}
+  'infixl'    { Located $$ (Token (KW KW_infixl)    _)}
+  'infixr'    { Located $$ (Token (KW KW_infixr)    _)}
 
-  'False'     { Located $$ (Token (KW KW_False  ) _)}
-  'True'      { Located $$ (Token (KW KW_True   ) _)}
-  'Arith'     { Located $$ (Token (KW KW_Arith  ) _)}
-  'Bit'       { Located $$ (Token (KW KW_Bit    ) _)}
-  'Cmp'       { Located $$ (Token (KW KW_Cmp    ) _)}
-  'error'     { Located $$ (Token (KW KW_error  ) _)}
-  'fin'       { Located $$ (Token (KW KW_fin    ) _)}
-  'inf'       { Located $$ (Token (KW KW_inf    ) _)}
-  'lg2'       { Located $$ (Token (KW KW_lg2    ) _)}
-  'lengthFromThen'   { Located $$ (Token (KW KW_lengthFromThen) _)}
-  'lengthFromThenTo' { Located $$ (Token (KW KW_lengthFromThenTo) _)}
   'type'      { Located $$ (Token (KW KW_type   ) _)}
   'newtype'   { Located $$ (Token (KW KW_newtype) _)}
   'module'    { Located $$ (Token (KW KW_module ) _)}
@@ -62,20 +69,10 @@
   'if'        { Located $$ (Token (KW KW_if     ) _)}
   'then'      { Located $$ (Token (KW KW_then   ) _)}
   'else'      { Located $$ (Token (KW KW_else   ) _)}
-  'min'       { Located $$ (Token (KW KW_min    ) _)}
-  'max'       { Located $$ (Token (KW KW_max    ) _)}
-  'zero'      { Located $$ (Token (KW KW_zero   ) _)}
-  'join'      { Located $$ (Token (KW KW_join   ) _)}
-  'reverse'   { Located $$ (Token (KW KW_reverse) _)}
-  'split'     { Located $$ (Token (KW KW_split  ) _)}
-  'splitAt'   { Located $$ (Token (KW KW_splitAt) _)}
-  'transpose' { Located $$ (Token (KW KW_transpose) _)}
   'x'         { Located $$ (Token (KW KW_x)       _)}
-  'pmult'     { Located $$ (Token (KW KW_pmult)   _)}
-  'pmod'      { Located $$ (Token (KW KW_pmod)    _)}
-  'pdiv'      { Located $$ (Token (KW KW_pdiv)    _)}
-  'random'    { Located $$ (Token (KW KW_random)  _)}
 
+  'primitive' { Located $$ (Token (KW KW_primitive) _)}
+
   '['         { Located $$ (Token (Sym BracketL) _)}
   ']'         { Located $$ (Token (Sym BracketR) _)}
   '<-'        { Located $$ (Token (Sym ArrL    ) _)}
@@ -95,7 +92,6 @@
   '='         { Located $$ (Token (Sym EqDef   ) _)}
   '`'         { Located $$ (Token (Sym BackTick) _)}
   ':'         { Located $$ (Token (Sym Colon   ) _)}
-  '::'        { Located $$ (Token (Sym ColonColon) _)}
   '->'        { Located $$ (Token (Sym ArrR    ) _)}
   '=>'        { Located $$ (Token (Sym FatArrR ) _)}
   '\\'        { Located $$ (Token (Sym Lambda  ) _)}
@@ -106,39 +102,19 @@
   'v}'        { Located $$ (Token (Virt VCurlyR)  _)}
   'v;'        { Located $$ (Token (Virt VSemi)    _)}
 
-  '+'         { Located $$ (Token (Op Plus        ) _)}
-  '-'         { Located $$ (Token (Op Minus       ) _)}
-  '*'         { Located $$ (Token (Op Mul         ) _)}
-  '/'         { Located $$ (Token (Op Div         ) _)}
-  '^^'        { Located $$ (Token (Op Exp         ) _)}
-  '%'         { Located $$ (Token (Op Mod         ) _)}
-
-  '^'         { Located $$ (Token (Op Xor         ) _)}
-  '||'        { Located $$ (Token (Op Disj        ) _)}
-  '&&'        { Located $$ (Token (Op Conj        ) _)}
-
-  '!='        { Located $$ (Token (Op NotEqual    ) _)}
-  '=='        { Located $$ (Token (Op Equal       ) _)}
-  '!=='       { Located $$ (Token (Op NotEqualFun ) _)}
-  '==='       { Located $$ (Token (Op EqualFun    ) _)}
-  '>'         { Located $$ (Token (Op GreaterThan ) _)}
-  '<'         { Located $$ (Token (Op LessThan    ) _)}
-  '<='        { Located $$ (Token (Op LEQ         ) _)}
-  '>='        { Located $$ (Token (Op GEQ         ) _)}
+  '+'         { Located $$ (Token (Op Plus)  _)}
+  '*'         { Located $$ (Token (Op Mul)   _)}
+  '^^'        { Located $$ (Token (Op Exp)   _)}
 
-  '>>'        { Located $$ (Token (Op ShiftR      ) _)}
-  '<<'        { Located $$ (Token (Op ShiftL      ) _)}
-  '>>>'       { Located $$ (Token (Op RotR        ) _)}
-  '<<<'       { Located $$ (Token (Op RotL        ) _)}
+  '-'         { Located $$ (Token (Op Minus) _)}
+  '~'         { Located $$ (Token (Op Complement) _)}
 
-  '~'         { Located $$ (Token (Op Complement  ) _)}
+  '#'         { Located $$ (Token (Op Hash) _)}
 
-  '@'         { Located $$ (Token (Op At          ) _)}
-  '@@'        { Located $$ (Token (Op AtAt        ) _)}
-  '!'         { Located $$ (Token (Op Bang        ) _)}
-  '!!'        { Located $$ (Token (Op BangBang    ) _)}
-  '#'         { Located $$ (Token (Op Hash        ) _)}
+  OP          { $$@(Located _ (Token (Op (Other [] _)) _))}
+  QOP         { $$@(Located _ (Token (Op  Other{}   )  _))}
 
+  DOC         { $$@(Located _ (Token (White DocStr) _)) }
 
 %name vmodule vmodule
 %name program program
@@ -151,6 +127,7 @@
 %name repl    repl
 %name schema  schema
 %name modName modName
+%name helpName help_name
 %tokentype { Located Token }
 %monad { ParseM }
 %lexer { lexerP } { Located _ (Token EOF _) }
@@ -163,22 +140,18 @@
 %left     'where'
 %nonassoc 'then' 'else'
 %nonassoc ':'
-%left '||'
-%left '&&'
-%nonassoc '==' '!=' '===' '!=='
-%nonassoc '<' '>' '<=' '>='
-%left '^'
+%nonassoc '=='
+%nonassoc '<=' '>='
 %right '#'
-%left  '<<' '>>' '<<<' '>>>'
 %left  '+' '-'
 %left  '*' '/' '%'
 %right '^^'
-%left  '@' '@@' '!' '!!'
 %right NEG '~'
+%left OP QOP
 %%
 
 
-vmodule                    :: { Module }
+vmodule                    :: { Module PName }
   : 'module' modName 'where' 'v{' vmod_body 'v}'
                               { let (is,ts) = $5 in Module $2 is ts }
 
@@ -186,11 +159,11 @@
     { let { (is,ts) = $2
             -- XXX make a location from is and ts
           ; modName = Located { srcRange = emptyRange
-                              , thing    = ModName ["Main"]
+                              , thing    = mkModName ["Main"]
                               }
           } in Module modName is ts }
 
-vmod_body                  :: { ([Located Import], [TopDecl]) }
+vmod_body                  :: { ([Located Import], [TopDecl PName]) }
   : vimports 'v;' vtop_decls  { (reverse $1, reverse $3) }
   | vimports ';'  vtop_decls  { (reverse $1, reverse $3) }
   | vimports                  { (reverse $1, [])         }
@@ -230,102 +203,152 @@
                                   } }
   | {- empty -}               { Nothing }
 
-name_list                  :: { [LName] }
-  : name_list ',' name        { $3 : $1 }
-  | name                      { [$1]    }
+name_list                  :: { [LIdent] }
+  : name_list ',' ident       { $3 : $1 }
+  | ident                     { [$1]    }
   | {- empty -}               { []      }
 
-mbHiding                   :: { [Name] -> ImportSpec }
+mbHiding                   :: { [Ident] -> ImportSpec }
   : 'hiding'                  { Hiding }
   | {- empty -}               { Only   }
 
-program                    :: { Program }
+program                    :: { Program PName }
   : top_decls                 { Program (reverse $1) }
   | {- empty -}               { Program [] }
 
-program_layout             :: { Program }
+program_layout             :: { Program PName }
   : 'v{' vtop_decls 'v}'      { Program (reverse $2) }
   | 'v{''v}'                  { Program []           }
 
-top_decls                  :: { [TopDecl]  }
-  : top_decl ';'              { [$1]       }
-  | top_decls top_decl ';'    { $2 : $1    }
+top_decls                  :: { [TopDecl PName]  }
+  : top_decl ';'              { $1         }
+  | top_decls top_decl ';'    { $2 ++ $1   }
 
-vtop_decls                 :: { [TopDecl]  }
+vtop_decls                 :: { [TopDecl PName]  }
   : vtop_decl                 { $1       }
   | vtop_decls 'v;' vtop_decl { $3 ++ $1 }
   | vtop_decls ';'  vtop_decl { $3 ++ $1 }
 
-vtop_decl               :: { [TopDecl] }
-  : decl                           { [exportDecl Public $1]                   }
-  | 'private' 'v{' vtop_decls 'v}' { changeExport Private (reverse $3)        }
-  | 'include' STRLIT               {% (return . Include) `fmap` fromStrLit $2 }
-  | 'property' name apats '=' expr { [exportDecl Public (mkProperty $2 $3 $5)]}
-  | 'property' name       '=' expr { [exportDecl Public (mkProperty $2 [] $4)]}
-  | newtype                        { [exportNewtype Public $1]                }
+vtop_decl               :: { [TopDecl PName] }
+  : decl                   { [exportDecl Nothing   Public $1]                 }
+  | doc decl               { [exportDecl (Just $1) Public $2]                 }
+  | mbDoc 'include' STRLIT {% (return . Include) `fmap` fromStrLit $3         }
+  | mbDoc 'property' name apats '=' expr
+                           { [exportDecl $1 Public (mkProperty $3 $4 $6)]     }
+  | mbDoc 'property' name       '=' expr
+                           { [exportDecl $1 Public (mkProperty $3 [] $5)]     }
+  | mbDoc newtype          { [exportNewtype Public $2]                        }
+  | prim_bind              { $1                                               }
+  | private_decls          { $1                                               }
 
-top_decl                :: { TopDecl }
-  : decl                   { Decl (TopLevel {tlExport = Public, tlValue = $1}) }
-  | 'include' STRLIT       {% Include `fmap` fromStrLit $2 }
+top_decl                :: { [TopDecl PName] }
+  : decl                   { [Decl (TopLevel {tlExport = Public, tlValue = $1 })] }
+  | 'include' STRLIT       {% (return . Include) `fmap` fromStrLit $2             }
+  | prim_bind              { $1                                                   }
 
-decl                    :: { Decl }
-  : vars_comma ':' schema  { at (head $1,$3) $ DSignature (map (fmap mkUnqual) (reverse $1)) $3   }
+private_decls           :: { [TopDecl PName] }
+  : 'private' 'v{' vtop_decls 'v}'
+                           { changeExport Private (reverse $3)                }
+  | doc 'private' 'v{' vtop_decls 'v}'
+                           { changeExport Private (reverse $4)                }
+
+prim_bind               :: { [TopDecl PName] }
+  : mbDoc 'primitive' name  ':' schema       { mkPrimDecl $1 $3 $5 }
+  | mbDoc 'primitive' '(' op ')' ':' schema  { mkPrimDecl $1 $4 $7 }
+
+doc                     :: { Located String }
+  : DOC                    { mkDoc (fmap tokenText $1) }
+
+mbDoc                   :: { Maybe (Located String) }
+  : doc                    { Just $1 }
+  | {- empty -}            { Nothing }
+
+
+decl                    :: { Decl PName }
+  : vars_comma ':' schema  { at (head $1,$3) $ DSignature (reverse $1) $3   }
   | apat '=' expr          { at ($1,$3) $ DPatBind $1 $3                    }
   | name apats '=' expr    { at ($1,$4) $
-                             DBind $ Bind { bName      = fmap mkUnqual $1
+                             DBind $ Bind { bName      = $1
                                           , bParams    = reverse $2
-                                          , bDef       = $4
+                                          , bDef       = at $4 (Located emptyRange (DExpr $4))
                                           , bSignature = Nothing
                                           , bPragmas   = []
                                           , bMono      = False
+                                          , bInfix     = False
+                                          , bFixity    = Nothing
+                                          , bDoc       = Nothing
                                           } }
+
+  | apat op apat '=' expr  { at ($1,$5) $
+                             DBind $ Bind { bName      = $2
+                                          , bParams    = [$1,$3]
+                                          , bDef       = at $5 (Located emptyRange (DExpr $5))
+                                          , bSignature = Nothing
+                                          , bPragmas   = []
+                                          , bMono      = False
+                                          , bInfix     = True
+                                          , bFixity    = Nothing
+                                          , bDoc       = Nothing
+                                          } }
+
   | 'type' name '=' type   {% at ($1,$4) `fmap` mkTySyn $2 [] $4 }
   | 'type' name tysyn_params '=' type
                            {% at ($1,$5) `fmap` mkTySyn $2 (reverse $3) $5  }
 
-let_decl                :: { Decl }
+  | 'infixl' NUM ops       {% mkFixity LeftAssoc  $2 (reverse $3) }
+  | 'infixr' NUM ops       {% mkFixity RightAssoc $2 (reverse $3) }
+  | 'infix'  NUM ops       {% mkFixity NonAssoc   $2 (reverse $3) }
+
+let_decl                :: { Decl PName }
   : 'let' apat '=' expr          { at ($2,$4) $ DPatBind $2 $4                    }
   | 'let' name apats '=' expr    { at ($2,$5) $
-                                   DBind $ Bind { bName      = fmap mkUnqual $2
+                                   DBind $ Bind { bName      = $2
                                                 , bParams    = reverse $3
-                                                , bDef       = $5
+                                                , bDef       = at $5 (Located emptyRange (DExpr $5))
                                                 , bSignature = Nothing
                                                 , bPragmas   = []
                                                 , bMono      = False
+                                                , bInfix     = False
+                                                , bFixity    = Nothing
+                                                , bDoc       = Nothing
                                                 } }
 
-newtype                 :: { Newtype }
+newtype                 :: { Newtype PName }
   : 'newtype' qname '=' newtype_body
                            { Newtype { nName = $2, nParams = [], nBody = $4 } }
   | 'newtype' qname tysyn_params '=' newtype_body
                            { Newtype { nName = $2, nParams = $3, nBody = $5 } }
 
-newtype_body            :: { [Named Type] }
+newtype_body            :: { [Named (Type PName)] }
   : '{' '}'                { [] }
   | '{' field_types '}'    { $2 }
 
-vars_comma              :: { [ LName ]  }
-  : name                   { [ $1]      }
-  | vars_comma ',' name    { $3 : $1    }
+vars_comma                 :: { [ LPName ]  }
+  : var                       { [ $1]      }
+  | vars_comma ',' var        { $3 : $1    }
 
-apats                   :: { [Pattern]  }
+var                        :: { LPName }
+  : name                      { $1 }
+  | '(' op ')'                { $2 }
+
+apats                   :: { [Pattern PName]  }
   : apat                   { [$1]       }
   | apats apat             { $2 : $1    }
 
-decls                   :: { [Decl] }
+decls                   :: { [Decl PName] }
   : decl ';'               { [$1] }
   | decls decl ';'         { $2 : $1 }
 
-vdecls                  :: { [Decl] }
+vdecls                  :: { [Decl PName] }
   : decl                   { [$1] }
   | vdecls 'v;' decl       { $3 : $1 }
   | vdecls ';'  decl       { $3 : $1 }
 
-decls_layout            :: { [Decl] }
+decls_layout            :: { [Decl PName] }
   : 'v{' vdecls 'v}'       { $2 }
   | 'v{' 'v}'              { [] }
 
-repl                    :: { ReplInput }
+repl                    :: { ReplInput PName }
   : expr                   { ExprInput $1 }
   | let_decl               { LetInput $1 }
 
@@ -333,97 +356,72 @@
 -- if a then b else c : [10]
 
 
-expr                             :: { Expr }
-  : iexpr                           { $1 }
+expr                             :: { Expr PName }
+  : cexpr                           { $1 }
   | expr 'where' '{' '}'            { at ($1,$4) $ EWhere $1 []           }
   | expr 'where' '{' decls '}'      { at ($1,$5) $ EWhere $1 (reverse $4) }
   | expr 'where' 'v{' 'v}'          { at ($1,$2) $ EWhere $1 []           }
   | expr 'where' 'v{' vdecls 'v}'   { at ($1,$4) $ EWhere $1 (reverse $4) }
 
-ifBranches                       :: { [(Expr, Expr)] }
+ifBranches                       :: { [(Expr PName, Expr PName)] }
   : ifBranch                        { [$1] }
   | ifBranches '|' ifBranch         { $3 : $1 }
 
-ifBranch                         :: { (Expr, Expr) }
+ifBranch                         :: { (Expr PName, Expr PName) }
   : expr 'then' expr                { ($1, $3) }
 
-iexpr                            :: { Expr }
-  : aexprs                          { mkEApp $1 }
+cexpr                            :: { Expr PName }
+  : sig_expr                        { $1 }
+  | 'if' ifBranches 'else' cexpr    { at ($1,$4) $ mkIf (reverse $2) $4 }
+  | '\\' apats '->' cexpr           { at ($1,$4) $ EFun (reverse $2) $4 }
 
+sig_expr                         :: { Expr PName }
+  : iexpr                           { $1 }
   | iexpr ':' type                  { at ($1,$3) $ ETyped $1 $3 }
-  | 'if' ifBranches 'else' iexpr    { at ($1,$4) $ mkIf $2 $4 }
-  | '\\' apats '->' iexpr           { at ($1,$4) $ EFun (reverse $2) $4 }
 
-  | iexpr '@'  iexpr                { binOp $1 (op ECAt          $2) $3 }
-  | iexpr '@@' iexpr                { binOp $1 (op ECAtRange     $2) $3 }
-  | iexpr '!'  iexpr                { binOp $1 (op ECAtBack      $2) $3 }
-  | iexpr '!!' iexpr                { binOp $1 (op ECAtRangeBack $2) $3 }
-  | iexpr '#'  iexpr                { binOp $1 (op ECCat         $2) $3 }
-
-  | iexpr '+' iexpr                 { binOp $1 (op ECPlus        $2) $3 }
-  | iexpr '-' iexpr                 { binOp $1 (op ECMinus       $2) $3 }
-  | iexpr '*' iexpr                 { binOp $1 (op ECMul         $2) $3 }
-  | iexpr '/' iexpr                 { binOp $1 (op ECDiv         $2) $3 }
-  | iexpr '%' iexpr                 { binOp $1 (op ECMod         $2) $3 }
-  | iexpr '^^' iexpr                { binOp $1 (op ECExp         $2) $3 }
+iexpr                            :: { Expr PName }
+  : expr10                          { $1 }
+  | iexpr qop expr10                { binOp $1 $2 $3 }
 
-  | iexpr '^'  iexpr                { binOp $1 (op ECXor         $2) $3 }
-  | iexpr '||' iexpr                { binOp $1 (op ECOr          $2) $3 }
-  | iexpr '&&' iexpr                { binOp $1 (op ECAnd         $2) $3 }
+expr10                           :: { Expr PName }
+  : aexprs                          { mkEApp $1 }
 
-  | iexpr '==' iexpr                { binOp $1 (op ECEq          $2) $3 }
-  | iexpr '!=' iexpr                { binOp $1 (op ECNotEq       $2) $3 }
-  | iexpr '===' iexpr               { binOp $1 (op ECFunEq       $2) $3 }
-  | iexpr '!==' iexpr               { binOp $1 (op ECFunNotEq    $2) $3 }
-  | iexpr '>' iexpr                 { binOp $1 (op ECGt          $2) $3 }
-  | iexpr '<' iexpr                 { binOp $1 (op ECLt          $2) $3 }
-  | iexpr '<=' iexpr                { binOp $1 (op ECLtEq        $2) $3 }
-  | iexpr '>=' iexpr                { binOp $1 (op ECGtEq        $2) $3 }
+  | '-' expr10 %prec NEG            { at ($1,$2) $ EApp (at $1 (EVar (mkUnqual (packIdent "negate")))) $2 }
+  | '~' expr10                      { at ($1,$2) $ EApp (at $1 (EVar (mkUnqual (packIdent "complement")))) $2 }
 
-  | iexpr '<<' iexpr                { binOp $1 (op ECShiftL      $2) $3 }
-  | iexpr '>>' iexpr                { binOp $1 (op ECShiftR      $2) $3 }
-  | iexpr '<<<' iexpr               { binOp $1 (op ECRotL        $2) $3 }
-  | iexpr '>>>' iexpr               { binOp $1 (op ECRotR        $2) $3 }
-  | '-' iexpr %prec NEG             { unOp     (op ECNeg         $1) $2 }
-  | '~' iexpr                       { unOp     (op ECCompl       $1) $2 }
+qop                              :: { LPName }
+  : op                              { $1 }
+  | QOP                             { let Token (Op (Other ns i)) _ = thing $1
+                                       in mkQual (mkModName ns) (packInfix i) A.<$ $1 }
 
+op                               :: { LPName }
+  : OP                              { let Token (Op (Other [] str)) _ = thing $1
+                                       in mkUnqual (packInfix str) A.<$ $1 }
 
+    -- special cases for operators that are re-used elsewhere
+  | '*'                             { Located $1 $ mkUnqual $ packInfix "*" }
+  | '+'                             { Located $1 $ mkUnqual $ packInfix "+" }
+  | '-'                             { Located $1 $ mkUnqual $ packInfix "-" }
+  | '~'                             { Located $1 $ mkUnqual $ packInfix "~" }
+  | '^^'                            { Located $1 $ mkUnqual $ packInfix "^^" }
+  | '#'                             { Located $1 $ mkUnqual $ packInfix "#" }
 
+ops                     :: { [LPName] }
+  : op                     { [$1] }
+  | ops ',' op             { $3 : $1 }
 
-aexprs                         :: { [Expr]  }
+aexprs                         :: { [Expr PName] }
   : aexpr                         { [$1]    }
   | aexprs aexpr                  { $2 : $1 }
 
-aexpr                          :: { Expr                                   }
+aexpr                          :: { Expr PName                             }
   : qname                         { at $1 $ EVar (thing $1)                }
 
-  | 'min'                         { at $1 $ ECon ECMin                     }
-  | 'max'                         { at $1 $ ECon ECMax                     }
-  | 'lg2'                         { at $1 $ ECon ECLg2                     }
-
-  | 'zero'                        { at $1 $ ECon ECZero                    }
-  | 'join'                        { at $1 $ ECon ECJoin                    }
-  | 'split'                       { at $1 $ ECon ECSplit                   }
-  | 'splitAt'                     { at $1 $ ECon ECSplitAt                 }
-
   | NUM                           { at $1 $ numLit (tokenType (thing $1))  }
   | STRLIT                        { at $1 $ ELit $ ECString $ getStr $1    }
   | CHARLIT                       { at $1 $ ELit $ ECNum (getNum $1) CharLit }
-  | 'False'                       { at $1 $ ECon ECFalse                   }
-  | 'True'                        { at $1 $ ECon ECTrue                    }
 
-  | 'error'                       { at $1 $ ECon ECError                   }
-
-  | 'reverse'                     { at $1 $ ECon ECReverse                 }
-  | 'transpose'                   { at $1 $ ECon ECTranspose               }
-
-  | 'pmult'                       { at $1 $ ECon ECPMul                    }
-  | 'pdiv'                        { at $1 $ ECon ECPDiv                    }
-  | 'pmod'                        { at $1 $ ECon ECPMod                    }
-
-  | 'random'                      { at $1 $ ECon ECRandom                  }
-
-  | '(' expr ')'                  { at ($1,$3) $2                          }
+  | '(' expr ')'                  { at ($1,$3) $ EParens $2                }
   | '(' tuple_exprs ')'           { at ($1,$3) $ ETuple (reverse $2)       }
   | '(' ')'                       { at ($1,$2) $ ETuple []                 }
   | '{' '}'                       { at ($1,$2) $ ERecord []                }
@@ -433,36 +431,7 @@
   | '`' tick_ty                   { at ($1,$2) $ ETypeVal $2               }
   | aexpr '.' selector            { at ($1,$3) $ ESel $1 (thing $3)        }
 
-  | '(' '@'    ')'                { at ($1,$3) $ ECon ECAt          }
-  | '(' '@@'   ')'                { at ($1,$3) $ ECon ECAtRange     }
-  | '(' '!'    ')'                { at ($1,$3) $ ECon ECAtBack      }
-  | '(' '!!'   ')'                { at ($1,$3) $ ECon ECAtRangeBack }
-  | '(' '#'    ')'                { at ($1,$3) $ ECon ECCat         }
-
-  | '(' '+'    ')'                { at ($1,$3) $ ECon ECPlus        }
-  | '(' '-'    ')'                { at ($1,$3) $ ECon ECMinus       }
-  | '(' '*'    ')'                { at ($1,$3) $ ECon ECMul         }
-  | '(' '/'    ')'                { at ($1,$3) $ ECon ECDiv         }
-  | '(' '%'    ')'                { at ($1,$3) $ ECon ECMod         }
-  | '(' '^^'   ')'                { at ($1,$3) $ ECon ECExp         }
-
-  | '(' '^'    ')'                { at ($1,$3) $ ECon ECXor         }
-  | '(' '||'   ')'                { at ($1,$3) $ ECon ECOr          }
-  | '(' '&&'   ')'                { at ($1,$3) $ ECon ECAnd         }
-
-  | '(' '=='   ')'                { at ($1,$3) $ ECon ECEq          }
-  | '(' '!='   ')'                { at ($1,$3) $ ECon ECNotEq       }
-  | '(' '==='  ')'                { at ($1,$3) $ ECon ECFunEq       }
-  | '(' '!=='  ')'                { at ($1,$3) $ ECon ECFunNotEq    }
-  | '(' '>'    ')'                { at ($1,$3) $ ECon ECGt          }
-  | '(' '<'    ')'                { at ($1,$3) $ ECon ECLt          }
-  | '(' '<='   ')'                { at ($1,$3) $ ECon ECLtEq        }
-  | '(' '>='   ')'                { at ($1,$3) $ ECon ECGtEq        }
-
-  | '(' '<<'   ')'                { at ($1,$3) $ ECon ECShiftL      }
-  | '(' '>>'   ')'                { at ($1,$3) $ ECon ECShiftR      }
-  | '(' '<<<'  ')'                { at ($1,$3) $ ECon ECRotL        }
-  | '(' '>>>'  ')'                { at ($1,$3) $ ECon ECRotR        }
+  | '(' qop ')'                   { at ($1,$3) $ EVar $ thing $2           }
 
   | '<|'            '|>'          {% mkPoly (rComb $1 $2) [] }
   | '<|' poly_terms '|>'          {% mkPoly (rComb $1 $3) $2 }
@@ -481,22 +450,22 @@
                                                             1 (getNum $3) }
 
 selector                       :: { Located Selector }
-  : name                          { fmap (`RecordSel` Nothing) $1 }
+  : ident                         { fmap (`RecordSel` Nothing) $1 }
   | NUM                           {% mkTupleSel (srcRange $1) (getNum $1) }
 
-tuple_exprs                    :: { [Expr] }
+tuple_exprs                    :: { [Expr PName] }
   : expr ',' expr                 { [ $3, $1] }
   | tuple_exprs ',' expr          { $3 : $1   }
 
-field_expr             :: { Named Expr }
-  : name '=' expr         { Named { name = $1, value = $3 } }
-  | name apats '=' expr   { Named { name = $1, value = EFun (reverse $2) $4 } }
+field_expr             :: { Named (Expr PName) }
+  : ident '=' expr        { Named { name = $1, value = $3 } }
+  | ident apats '=' expr  { Named { name = $1, value = EFun (reverse $2) $4 } }
 
-field_exprs                    :: { [Named Expr] }
+field_exprs                    :: { [Named (Expr PName)] }
   : field_expr                    { [$1]    }
   | field_exprs ',' field_expr    { $3 : $1 }
 
-list_expr                      :: { Expr }
+list_expr                      :: { Expr PName }
   : expr '|' list_alts            { EComp $1 (reverse $3)    }
   | expr                          { EList [$1]               }
   | tuple_exprs                   { EList (reverse $1)       }
@@ -516,20 +485,20 @@
   | expr ',' expr '...'           { EInfFrom $1 (Just $3)               }
 
 
-list_alts                      :: { [[Match]] }
+list_alts                      :: { [[Match PName]] }
   : matches                       { [ reverse $1 ] }
   | list_alts '|' matches         { reverse $3 : $1 }
 
-matches                        :: { [Match] }
+matches                        :: { [Match PName] }
   : match                         { [$1] }
   | matches ',' match             { $3 : $1 }
 
-match                          :: { Match }
+match                          :: { Match PName }
   : pat '<-' expr                 { Match $1 $3 }
 
 
 --------------------------------------------------------------------------------
-pat                            :: { Pattern  }
+pat                            :: { Pattern PName }
   : ipat ':' type                 { at ($1,$3) $ PTyped $1 $3 }
   | ipat                          { $1                        }
 
@@ -537,7 +506,7 @@
   : ipat '#' ipat                 { at ($1,$3) $ PSplit $1 $3 }
   | apat                          { $1                        }
 
-apat                           :: { Pattern }
+apat                           :: { Pattern PName }
   : name                          { PVar $1                           }
   | '_'                           { at $1       $ PWild               }
   | '(' ')'                       { at ($1,$2) $ PTuple []            }
@@ -549,150 +518,137 @@
   | '{' '}'                       { at ($1,$2) $ PRecord []           }
   | '{' field_pats '}'            { at ($1,$3) $ PRecord (reverse $2) }
 
-tuple_pats                     :: { [Pattern] }
+tuple_pats                     :: { [Pattern PName] }
   : pat ',' pat                   { [$3, $1] }
   | tuple_pats ',' pat            { $3 : $1   }
 
-field_pat                      :: { Named Pattern }
-  : name '=' pat                  { Named { name = $1, value = $3 } }
+field_pat                      :: { Named (Pattern PName) }
+  : ident '=' pat                 { Named { name = $1, value = $3 } }
 
-field_pats                     :: { [Named Pattern] }
+field_pats                     :: { [Named (Pattern PName)] }
   : field_pat                     { [$1]    }
   | field_pats ',' field_pat      { $3 : $1 }
 
 --------------------------------------------------------------------------------
 
-schema                         :: { Schema }
+schema                         :: { Schema PName }
   : type                          { at $1 $ mkSchema [] [] $1      }
   | schema_vars type              { at ($1,$2) $ mkSchema (thing $1) [] $2 }
   | schema_quals type             { at ($1,$2) $ mkSchema [] (thing $1) $2 }
   | schema_vars schema_quals type { at ($1,$3) $ mkSchema (thing $1)
                                                           (thing $2) $3 }
 
-schema_vars                    :: { Located [TParam] }
+schema_vars                    :: { Located [TParam PName] }
   : '{' '}'                       { Located (rComb $1 $2) [] }
   | '{' schema_params '}'         { Located (rComb $1 $3) (reverse $2) }
 
-schema_quals                   :: { Located [Prop] }
-  : '(' ')' '=>'                  { Located (rComb $1 $3) []           }
-  | prop '=>'                     { Located
-                                    (rComb (fromMaybe $2 (getLoc $1)) $2) [$1] }
-  | '(' props ')' '=>'            { Located (rComb $1 $4) (reverse $2) }
-
+schema_quals                   :: { Located [Prop PName] }
+  : type '=>'                     {% fmap (\x -> at (x,$2) x) (mkProp $1) }
 
 kind                             :: { Located Kind      }
   : '#'                             { Located $1 KNum   }
   | '*'                             { Located $1 KType  }
 
-schema_param                   :: { TParam }
-  : name                          {% mkTParam $1 Nothing           }
-  | name ':' kind                 {% mkTParam (at ($1,$3) $1) (Just (thing $3)) }
+schema_param                   :: { TParam PName }
+  : ident                         {% mkTParam $1 Nothing           }
+  | ident ':' kind                {% mkTParam (at ($1,$3) $1) (Just (thing $3)) }
 
-schema_params                    :: { [TParam] }
+schema_params                    :: { [TParam PName] }
   : schema_param                    { [$1] }
   | schema_params ',' schema_param  { $3 : $1 }
 
-tysyn_param                   :: { TParam }
-  : name                         {% mkTParam $1 Nothing }
-  | '(' name ':' kind ')'        {% mkTParam (at ($1,$5) $2) (Just (thing $4)) }
+tysyn_param                   :: { TParam PName }
+  : ident                        {% mkTParam $1 Nothing }
+  | '(' ident ':' kind ')'       {% mkTParam (at ($1,$5) $2) (Just (thing $4)) }
 
-tysyn_params                  :: { [TParam]  }
+tysyn_params                  :: { [TParam PName]  }
   : tysyn_param                  { [$1]      }
   | tysyn_params tysyn_param     { $2 : $1   }
 
-
-prop                           :: { Prop }
-  : type '==' type                { at ($1,$3) $ CEqual  $1 $3 }
-  | type '<=' type                { at ($1,$3) $ CGeq $3 $1 }
-  | type '>=' type                { at ($1,$3) $ CGeq $1 $3 }
-  | 'fin' atype                   { at ($1,$2) $ CFin $2    }
-  | 'Arith' atype                 { at ($1,$2) $ CArith $2  }
-  | 'Cmp' atype                   { at ($1,$2) $ CCmp   $2  }
-
-props                          :: { [Prop]                  }
-  : prop                          { [$1]                    }
-  | props ',' prop                { $3 : $1                 }
-
-type                           :: { Type                             }
-  : type '->' type                { at ($1,$3) $ TFun $1 $3          }
-  | type '+'  type                { at ($1,$3) $ TApp TCAdd [$1, $3] }
-  | type '-'  type                { at ($1,$3) $ TApp TCSub [$1, $3] }
-  | type '*'  type                { at ($1,$3) $ TApp TCMul [$1, $3] }
-  | type '/'  type                { at ($1,$3) $ TApp TCDiv [$1, $3] }
-  | type '%'  type                { at ($1,$3) $ TApp TCMod [$1, $3] }
-  | type '^^' type                { at ($1,$3) $ TApp TCExp [$1, $3] }
-  | app_type                      { $1                               }
+type                           :: { Type PName                                                 }
+  : app_type '->' type            { at ($1,$3) $ TFun $1 $3                                    }
+  | type op app_type              { at ($1,$3) $ TInfix $1 $2 defaultFixity $3 }
+  | app_type                      { $1                                                         }
 
-app_type                       :: { Type }
-  : 'lg2'   atype                 { at ($1,$2) $ TApp TCLg2   [$2]    }
-  | 'lengthFromThen' atype atype  { at ($1,$3) $ TApp TCLenFromThen [$2,$3] }
-  | 'lengthFromThenTo' atype atype
-                       atype      { at ($1,$4) $ TApp TCLenFromThen [$2,$3,$4] }
-  | 'min'   atype atype           { at ($1,$3) $ TApp TCMin   [$2,$3] }
-  | 'max'   atype atype           { at ($1,$3) $ TApp TCMax   [$2,$3] }
+app_type                       :: { Type PName }
+  -- : 'lg2'   atype                 { at ($1,$2) $ TApp TCLg2   [$2]    }
+  -- | 'lengthFromThen' atype atype  { at ($1,$3) $ TApp TCLenFromThen [$2,$3] }
+  -- | 'lengthFromThenTo' atype atype
+  --                      atype      { at ($1,$4) $ TApp TCLenFromThen [$2,$3,$4] }
+  -- | 'min'   atype atype           { at ($1,$3) $ TApp TCMin   [$2,$3] }
+  -- | 'max'   atype atype           { at ($1,$3) $ TApp TCMax   [$2,$3] }
 
-  | dimensions atype              { at ($1,$2) $ foldr TSeq $2 (reverse (thing $1)) }
+  : dimensions atype              { at ($1,$2) $ foldr TSeq $2 (reverse (thing $1)) }
   | qname atypes                  { at ($1,head $2)
                                      $ TUser (thing $1) (reverse $2) }
   | atype                         { $1                    }
 
-atype                          :: { Type }
+atype                          :: { Type PName }
   : qname                         { at $1 $ TUser (thing $1) []        }
-  | 'Bit'                         { at $1 $ TBit                       }
-  | 'inf'                         { at $1 $ TInf                       }
   | NUM                           { at $1 $ TNum  (getNum $1)          }
   | CHARLIT                       { at $1 $ TChar (toEnum $ fromInteger
                                                           $ getNum $1) }
   | '[' type ']'                  { at ($1,$3) $ TSeq $2 TBit          }
-  | '(' type ')'                  { at ($1,$3) $2                      }
+  | '(' type ')'                  { at ($1,$3) $ TParens $2            }
   | '(' ')'                       { at ($1,$2) $ TTuple []             }
   | '(' tuple_types ')'           { at ($1,$3) $ TTuple  (reverse $2)  }
   | '{' '}'                       { at ($1,$2) $ TRecord []            }
   | '{' field_types '}'           { at ($1,$3) $ TRecord (reverse $2)  }
   | '_'                           { at $1 TWild                        }
 
-atypes                         :: { [ Type ] }
+atypes                         :: { [ Type PName ] }
   : atype                         { [ $1 ]    }
   | atypes atype                  { $2 : $1   }
 
-dimensions                     :: { Located [Type]  }
+dimensions                     :: { Located [Type PName]  }
   : '[' type ']'                  { Located (rComb $1 $3) [ $2 ] }
   | dimensions '[' type ']'       { at ($1,$4) (fmap ($3 :) $1)  }
 
-tuple_types                    :: { [Type] }
+tuple_types                    :: { [Type PName] }
   : type ',' type                 { [ $3, $1] }
   | tuple_types ',' type          { $3 : $1   }
 
-field_type                     :: { Named Type }
-  : name ':' type                 { Named { name = $1, value = $3 } }
+field_type                     :: { Named (Type PName) }
+  : ident ':' type                { Named { name = $1, value = $3 } }
 
-field_types                    :: { [Named Type] }
+field_types                    :: { [Named (Type PName)] }
   : field_type                    { [$1]    }
   | field_types ',' field_type    { $3 : $1 }
 
 
-qname_parts                       :: { [LName] } -- Reversed!
-  : name                          { [$1] }
-  | qname_parts '::' name         { $3 : $1 }
+ident              :: { Located Ident }
+  : IDENT             { let Token (Ident _ str) _ = thing $1
+                         in $1 { thing = packIdent str } }
+  | 'x'               { Located { srcRange = $1, thing = packIdent "x" }}
+  | 'private'         { Located { srcRange = $1, thing = packIdent "private" } }
+  | 'as'              { Located { srcRange = $1, thing = packIdent "as" } }
+  | 'hiding'          { Located { srcRange = $1, thing = packIdent "hiding" } }
 
-name               :: { LName }
-  : IDENT             { $1 { thing = getName $1 } }
-  | 'x'               { Located { srcRange = $1, thing = Name "x" }}
-  | 'private'         { Located { srcRange = $1, thing = Name "private" } }
-  | 'as'              { Located { srcRange = $1, thing = Name "as" } }
-  | 'hiding'          { Located { srcRange = $1, thing = Name "hiding" } }
 
+name               :: { LPName }
+  : ident             { fmap mkUnqual $1 }
 
+
 modName                        :: { Located ModName }
-  : qname_parts                   { mkModName $1 }
+  : ident                         { fmap identText $1 }
+  | QIDENT                        { let Token (Ident ns i) _ = thing $1
+                                     in mkModName (ns ++ [i]) A.<$ $1 }
 
-qname                          :: { Located QName }
-  : qname_parts                   { mkQName $1 }
 
+qname                          :: { Located PName }
+  : name                          { $1 }
+  | QIDENT                        { let Token (Ident ns i) _ = thing $1
+                                     in mkQual (mkModName ns) (packIdent i) A.<$ $1 }
+
+help_name                      :: { Located PName    }
+  : qname                         { $1               }
+  | qop                           { $1               }
+  | '(' qop ')'                   { $2               }
+
 {- The types that can come after a back-tick: either a type demotion,
 or an explicit type application.  Explicit type applications are converted
 to records, which cannot be demoted. -}
-tick_ty                        :: { Type }
+tick_ty                        :: { Type PName }
   : qname                         { at $1 $ TUser (thing $1) []      }
   | NUM                           { at $1 $ TNum  (getNum $1)          }
   | '(' type ')'                  {% validDemotedType (rComb $1 $3) $2 }
@@ -702,10 +658,10 @@
   | '{' tuple_types '}'           { anonRecord (getLoc ($1,$3)) (reverse $2) }
 
 -- This for explicit type applications (e.g., f ` { front = 3 })
-field_ty_val                   :: { Named Type                    }
-  : name '=' type                 { Named { name = $1, value = $3 } }
+field_ty_val                   :: { Named (Type PName)              }
+  : ident '=' type                { Named { name = $1, value = $3 } }
 
-field_ty_vals                  :: { [Named Type] }
+field_ty_vals                  :: { [Named (Type PName)] }
   : field_ty_val                    { [$1]       }
   | field_ty_vals ',' field_ty_val  { $3 : $1    }
 
@@ -716,18 +672,24 @@
 
 parseModName :: String -> Maybe ModName
 parseModName txt =
-  case parse defaultConfig { cfgModuleScope = False } modName txt of
+  case parseString defaultConfig { cfgModuleScope = False } modName txt of
     Right a -> Just (thing a)
     Left _  -> Nothing
 
-addImplicitIncludes :: Config -> Program -> Program
+parseHelpName :: String -> Maybe PName
+parseHelpName txt =
+  case parseString defaultConfig { cfgModuleScope = False } helpName txt of
+    Right a -> Just (thing a)
+    Left _  -> Nothing
+
+addImplicitIncludes :: Config -> Program PName -> Program PName
 addImplicitIncludes cfg (Program ds) =
   Program $ map path (cfgAutoInclude cfg) ++ ds
   where path p = Include Located { srcRange = rng, thing = p }
         rng    = Range { source = cfgSource cfg, from = start, to = start }
 
 
-parseProgramWith :: Config -> String -> Either ParseError Program
+parseProgramWith :: Config -> Text -> Either ParseError (Program PName)
 parseProgramWith cfg s = case res s of
                           Left err -> Left err
                           Right a  -> Right (addImplicitIncludes cfg a)
@@ -736,49 +698,49 @@
                       Layout   -> programLayout
                       NoLayout -> program
 
-parseModule :: Config -> String -> Either ParseError Module
+parseModule :: Config -> Text -> Either ParseError (Module PName)
 parseModule cfg = parse cfg { cfgModuleScope = True } vmodule
 
-parseProgram :: Layout -> String -> Either ParseError Program
+parseProgram :: Layout -> Text -> Either ParseError (Program PName)
 parseProgram l = parseProgramWith defaultConfig { cfgLayout = l }
 
-parseExprWith :: Config -> String -> Either ParseError Expr
+parseExprWith :: Config -> Text -> Either ParseError (Expr PName)
 parseExprWith cfg = parse cfg { cfgModuleScope = False } expr
 
-parseExpr :: String -> Either ParseError Expr
+parseExpr :: Text -> Either ParseError (Expr PName)
 parseExpr = parseExprWith defaultConfig
 
-parseDeclWith :: Config -> String -> Either ParseError Decl
+parseDeclWith :: Config -> Text -> Either ParseError (Decl PName)
 parseDeclWith cfg = parse cfg { cfgModuleScope = False } decl
 
-parseDecl :: String -> Either ParseError Decl
+parseDecl :: Text -> Either ParseError (Decl PName)
 parseDecl = parseDeclWith defaultConfig
 
-parseDeclsWith :: Config -> String -> Either ParseError [Decl]
+parseDeclsWith :: Config -> Text -> Either ParseError [Decl PName]
 parseDeclsWith cfg = parse cfg { cfgModuleScope = ms } decls'
   where (ms, decls') = case cfgLayout cfg of
                          Layout   -> (True, declsLayout)
                          NoLayout -> (False, decls)
 
-parseDecls :: String -> Either ParseError [Decl]
+parseDecls :: Text -> Either ParseError [Decl PName]
 parseDecls = parseDeclsWith defaultConfig
 
-parseLetDeclWith :: Config -> String -> Either ParseError Decl
+parseLetDeclWith :: Config -> Text -> Either ParseError (Decl PName)
 parseLetDeclWith cfg = parse cfg { cfgModuleScope = False } letDecl
 
-parseLetDecl :: String -> Either ParseError Decl
+parseLetDecl :: Text -> Either ParseError (Decl PName)
 parseLetDecl = parseLetDeclWith defaultConfig
 
-parseReplWith :: Config -> String -> Either ParseError ReplInput
+parseReplWith :: Config -> Text -> Either ParseError (ReplInput PName)
 parseReplWith cfg = parse cfg { cfgModuleScope = False } repl
 
-parseRepl :: String -> Either ParseError ReplInput
+parseRepl :: Text -> Either ParseError (ReplInput PName)
 parseRepl = parseReplWith defaultConfig
 
-parseSchemaWith :: Config -> String -> Either ParseError Schema
+parseSchemaWith :: Config -> Text -> Either ParseError (Schema PName)
 parseSchemaWith cfg = parse cfg { cfgModuleScope = False } schema
 
-parseSchema :: String -> Either ParseError Schema
+parseSchema :: Text -> Either ParseError (Schema PName)
 parseSchema = parseSchemaWith defaultConfig
 
 -- vim: ft=haskell
diff --git a/src/Cryptol/Parser/AST.hs b/src/Cryptol/Parser/AST.hs
--- a/src/Cryptol/Parser/AST.hs
+++ b/src/Cryptol/Parser/AST.hs
@@ -1,6 +1,6 @@
 -- |
 -- Module      :  $Header$
--- Copyright   :  (c) 2013-2015 Galois, Inc.
+-- Copyright   :  (c) 2013-2016 Galois, Inc.
 -- License     :  BSD3
 -- Maintainer  :  cryptol@galois.com
 -- Stability   :  provisional
@@ -9,17 +9,22 @@
 {-# LANGUAGE Safe #-}
 {-# LANGUAGE PatternGuards   #-}
 {-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE DeriveFoldable #-}
+{-# LANGUAGE DeriveTraversable #-}
+{-# LANGUAGE DeriveFunctor #-}
+{-# LANGUAGE DeriveGeneric #-}
 module Cryptol.Parser.AST
   ( -- * Names
-    ModName(..), {-splitNamespace, parseModName, nsChar,-} modRange
-  , QName(..), mkQual, mkUnqual, unqual
-  , Name(..)
+    Ident, mkIdent, mkInfix, isInfixIdent, nullIdent, identText
+  , ModName, modRange
+  , PName(..), getModName, getIdent, mkUnqual, mkQual
   , Named(..)
   , Pass(..)
+  , Assoc(..)
 
     -- * Types
   , Schema(..)
-  , TParam(..), tpQName
+  , TParam(..)
   , Kind(..)
   , Type(..)
   , Prop(..)
@@ -29,8 +34,11 @@
   , Program(..)
   , TopDecl(..)
   , Decl(..)
+  , Fixity(..), defaultFixity
+  , FixityCmp(..), compareFixity
   , TySyn(..)
   , Bind(..)
+  , BindDef(..), LBindDef
   , Pragma(..)
   , ExportType(..)
   , ExportSpec(..), exportBind, exportType
@@ -52,72 +60,55 @@
 
     -- * Positions
   , Located(..)
-  , LName, LQName, LString
+  , LPName, LString, LIdent
   , NoPos(..)
 
     -- * Pretty-printing
   , cppKind, ppSelector
   ) where
 
+import Cryptol.Parser.Name
 import Cryptol.Parser.Position
-import Cryptol.Prims.Syntax
+import Cryptol.Prims.Syntax (TFun(..))
+import Cryptol.Utils.Ident
 import Cryptol.Utils.PP
+import Cryptol.Utils.Panic (panic)
 
-import qualified Data.Map as Map
 import qualified Data.Set as Set
 import           Data.List(intersperse)
 import           Data.Bits(shiftR)
 import           Data.Maybe (catMaybes)
 import           Numeric(showIntAtBase)
 
-#if __GLASGOW_HASKELL__ < 710
-import           Data.Monoid (Monoid(..))
-#endif
-
--- | Module names are just namespaces.
---
--- INVARIANT: the list of strings should never be empty in a valid module name.
-newtype ModName = ModName [String]
-                  deriving (Eq,Ord,Show)
-
-data Name     = Name String
-              | NewName Pass Int
-               deriving (Eq,Ord,Show)
-
-data QName    = QName (Maybe ModName) Name
-               deriving (Eq,Ord,Show)
-
-mkQual :: ModName -> Name -> QName
-mkQual  = QName . Just
-
-mkUnqual :: Name -> QName
-mkUnqual  = QName Nothing
-
-unqual :: QName -> Name
-unqual (QName _ n) = n
+import GHC.Generics (Generic)
+import Control.DeepSeq.Generics
 
+import Prelude ()
+import Prelude.Compat
 
-data Pass     = NoPat | MonoValues
-               deriving (Eq,Ord,Show)
+-- AST -------------------------------------------------------------------------
 
 -- | A name with location information.
-type LName    = Located Name
+type LPName    = Located PName
 
--- | A qualified name with location information.
-type LQName   = Located QName
+-- | An identifier with location information.
+type LIdent    = Located Ident
 
 -- | A string with location information.
 type LString  = Located String
 
-newtype Program = Program [TopDecl]
-                  deriving (Eq,Show)
 
-data Module = Module { mName    :: Located ModName
-                     , mImports :: [Located Import]
-                     , mDecls   :: [TopDecl]
-                     } deriving (Eq,Show)
+newtype Program name = Program [TopDecl name]
+                       deriving (Show)
 
-modRange :: Module -> Range
+data Module name = Module { mName    :: Located ModName
+                          , mImports :: [Located Import]
+                          , mDecls   :: [TopDecl name]
+                          } deriving (Show, Generic)
+
+instance NFData name => NFData (Module name) where rnf = genericRnf
+
+modRange :: Module name -> Range
 modRange m = rCombs $ catMaybes
     [ getLoc (mName m)
     , getLoc (mImports m)
@@ -126,37 +117,48 @@
     ]
 
 
-data TopDecl  = Decl (TopLevel Decl)
-              | TDNewtype (TopLevel Newtype)
-              | Include (Located FilePath)
-                deriving (Eq,Show)
+data TopDecl name = Decl (TopLevel (Decl name))
+                  | TDNewtype (TopLevel (Newtype name))
+                  | Include (Located FilePath)
+                    deriving (Show,Generic)
 
-data Decl     = DSignature [LQName] Schema
-              | DPragma [LQName] Pragma
-              | DBind Bind
-              | DPatBind Pattern Expr
-              | DType TySyn
-              | DLocated Decl Range
-                deriving (Eq,Show)
+instance NFData name => NFData (TopDecl name) where rnf = genericRnf
 
+data Decl name = DSignature [Located name] (Schema name)
+               | DFixity !Fixity [Located name]
+               | DPragma [Located name] Pragma
+               | DBind (Bind name)
+               | DPatBind (Pattern name) (Expr name)
+               | DType (TySyn name)
+               | DLocated (Decl name) Range
+                 deriving (Eq,Show,Generic)
+
+instance NFData name => NFData (Decl name) where rnf = genericRnf
+
 -- | An import declaration.
-data Import = Import { iModule    :: ModName
+data Import = Import { iModule    :: !ModName
                      , iAs        :: Maybe ModName
                      , iSpec      :: Maybe ImportSpec
-                     } deriving (Eq,Show)
+                     } deriving (Eq,Show,Generic)
 
+instance NFData Import where rnf = genericRnf
+
 -- | The list of names following an import.
 --
 -- INVARIANT: All of the 'Name' entries in the list are expected to be
 -- unqualified names; the 'QName' or 'NewName' constructors should not be
 -- present.
-data ImportSpec = Hiding [Name]
-                | Only   [Name]
-                  deriving (Eq,Show)
+data ImportSpec = Hiding [Ident]
+                | Only   [Ident]
+                  deriving (Eq,Show,Generic)
 
-data TySyn    = TySyn LQName [TParam] Type
-                deriving (Eq,Show)
+instance NFData ImportSpec where rnf = genericRnf
 
+data TySyn n  = TySyn (Located n) [TParam n] (Type n)
+                deriving (Eq,Show,Generic)
+
+instance NFData name => NFData (TySyn name) where rnf = genericRnf
+
 {- | Bindings.  Notes:
 
     * The parser does not associate type signatures and pragmas with
@@ -169,69 +171,115 @@
       by the type checker.  However, they are useful when de-sugaring
       patterns.
 -}
-data Bind     = Bind { bName      :: LQName       -- ^ Defined thing
-                     , bParams    :: [Pattern]    -- ^ Parameters
-                     , bDef       :: Expr         -- ^ Definition
-                     , bSignature :: Maybe Schema -- ^ Optional type sig
-                     , bPragmas   :: [Pragma]     -- ^ Optional pragmas
-                     , bMono      :: Bool  -- ^ Is this a monomorphic binding
-                     } deriving (Eq,Show)
+data Bind name = Bind { bName      :: Located name -- ^ Defined thing
+                      , bParams    :: [Pattern name]-- ^ Parameters
+                      , bDef       :: Located (BindDef name) -- ^ Definition
+                      , bSignature :: Maybe (Schema name) -- ^ Optional type sig
+                      , bInfix     :: Bool         -- ^ Infix operator?
+                      , bFixity    :: Maybe Fixity -- ^ Optional fixity info
+                      , bPragmas   :: [Pragma]     -- ^ Optional pragmas
+                      , bMono      :: Bool         -- ^ Is this a monomorphic binding
+                      , bDoc       :: Maybe String -- ^ Optional doc string
+                      } deriving (Eq,Show,Generic)
 
+instance NFData name => NFData (Bind name) where rnf = genericRnf
+
+type LBindDef = Located (BindDef PName)
+
+data BindDef name = DPrim
+                  | DExpr (Expr name)
+                    deriving (Eq,Show,Generic)
+
+instance NFData name => NFData (BindDef name) where rnf = genericRnf
+
+data Fixity   = Fixity { fAssoc :: !Assoc
+                       , fLevel :: !Int
+                       } deriving (Eq,Show,Generic)
+
+instance NFData Fixity where rnf = genericRnf
+
+data FixityCmp = FCError
+               | FCLeft
+               | FCRight
+                 deriving (Show,Eq)
+
+compareFixity :: Fixity -> Fixity -> FixityCmp
+compareFixity (Fixity a1 p1) (Fixity a2 p2) =
+  case compare p1 p2 of
+    GT -> FCLeft
+    LT -> FCRight
+    EQ -> case (a1,a2) of
+            (LeftAssoc,LeftAssoc)   -> FCLeft
+            (RightAssoc,RightAssoc) -> FCRight
+            _                       -> FCError
+
+-- | The fixity used when none is provided.
+defaultFixity :: Fixity
+defaultFixity  = Fixity LeftAssoc 100
+
 data Pragma   = PragmaNote String
               | PragmaProperty
-                deriving (Eq,Show)
+                deriving (Eq,Show,Generic)
 
-data Newtype  = Newtype { nName   :: LQName       -- ^ Type name
-                        , nParams :: [TParam]     -- ^ Type params
-                        , nBody   :: [Named Type] -- ^ Constructor
-                        } deriving (Eq,Show)
+instance NFData Pragma where rnf = genericRnf
 
+data Newtype name = Newtype { nName   :: Located name        -- ^ Type name
+                            , nParams :: [TParam name]       -- ^ Type params
+                            , nBody   :: [Named (Type name)] -- ^ Constructor
+                            } deriving (Eq,Show,Generic)
+
+instance NFData name => NFData (Newtype name) where rnf = genericRnf
+
 -- | Input at the REPL, which can either be an expression or a @let@
 -- statement.
-data ReplInput = ExprInput Expr
-               | LetInput Decl
-                 deriving (Eq, Show)
+data ReplInput name = ExprInput (Expr name)
+                    | LetInput (Decl name)
+                      deriving (Eq, Show)
 
 -- | Export information for a declaration.
 data ExportType = Public
                 | Private
-                  deriving (Eq,Show,Ord)
+                  deriving (Eq,Show,Ord,Generic)
 
+instance NFData ExportType where rnf = genericRnf
+
 data TopLevel a = TopLevel { tlExport :: ExportType
+                           , tlDoc    :: Maybe (Located String)
                            , tlValue  :: a
-                           } deriving (Show,Eq,Ord)
+                           } deriving (Show,Generic,Functor,Foldable,Traversable)
 
-instance Functor TopLevel where
-  fmap f tl = tl { tlValue = f (tlValue tl) }
+instance NFData a => NFData (TopLevel a) where rnf = genericRnf
 
-data ExportSpec = ExportSpec { eTypes  :: Set.Set QName
-                             , eBinds  :: Set.Set QName
-                             } deriving (Show)
+data ExportSpec name = ExportSpec { eTypes  :: Set.Set name
+                                  , eBinds  :: Set.Set name
+                                  } deriving (Show,Generic)
 
-instance Monoid ExportSpec where
+instance NFData name => NFData (ExportSpec name) where rnf = genericRnf
+
+instance Ord name => Monoid (ExportSpec name) where
   mempty      = ExportSpec { eTypes = mempty, eBinds = mempty }
   mappend l r = ExportSpec { eTypes = mappend (eTypes l) (eTypes r)
                            , eBinds  = mappend (eBinds  l) (eBinds  r)
                            }
 
 -- | Add a binding name to the export list, if it should be exported.
-exportBind :: TopLevel QName -> ExportSpec
+exportBind :: Ord name => TopLevel name -> ExportSpec name
 exportBind n
   | tlExport n == Public = mempty { eBinds = Set.singleton (tlValue n) }
   | otherwise            = mempty
 
 -- | Check to see if a binding is exported.
-isExportedBind :: QName -> ExportSpec -> Bool
+isExportedBind :: Ord name => name -> ExportSpec name -> Bool
 isExportedBind n = Set.member n . eBinds
 
 -- | Add a type synonym name to the export list, if it should be exported.
-exportType :: TopLevel QName -> ExportSpec
+exportType :: Ord name => TopLevel name -> ExportSpec name
 exportType n
   | tlExport n == Public = mempty { eTypes = Set.singleton (tlValue n) }
   | otherwise            = mempty
 
 -- | Check to see if a type synonym is exported.
-isExportedType :: QName -> ExportSpec -> Bool
+isExportedType :: Ord name => name -> ExportSpec name -> Bool
 isExportedType n = Set.member n . eTypes
 
 -- | Infromation about the representation of a numeric constant.
@@ -241,38 +289,47 @@
               | HexLit Int                      -- ^ n-digit hex literal
               | CharLit                         -- ^ character literal
               | PolyLit Int                     -- ^ polynomial literal
-                deriving (Eq,Show)
+                deriving (Eq,Show,Generic)
 
+instance NFData NumInfo where rnf = genericRnf
+
 -- | Literals.
 data Literal  = ECNum Integer NumInfo           -- ^ @0x10@  (HexLit 2)
               | ECString String                 -- ^ @\"hello\"@
-                deriving (Eq,Show)
+                deriving (Eq,Show,Generic)
 
-data Expr     = EVar QName                      -- ^ @ x @
-              | ECon ECon                       -- ^ @ split @
+instance NFData Literal where rnf = genericRnf
+
+data Expr n   = EVar n                          -- ^ @ x @
               | ELit Literal                    -- ^ @ 0x10 @
-              | ETuple [Expr]                   -- ^ @ (1,2,3) @
-              | ERecord [Named Expr]            -- ^ @ { x = 1, y = 2 } @
-              | ESel Expr Selector              -- ^ @ e.l @
-              | EList [Expr]                    -- ^ @ [1,2,3] @
-              | EFromTo Type (Maybe Type) (Maybe Type)   -- ^ @[1, 5 ..  117 ] @
-              | EInfFrom Expr (Maybe Expr)      -- ^ @ [1, 3 ...] @
-              | EComp Expr [[Match]]            -- ^ @ [ 1 | x <- xs ] @
-              | EApp Expr Expr                  -- ^ @ f x @
-              | EAppT Expr [TypeInst]           -- ^ @ f `{x = 8}, f`{8} @
-              | EIf Expr Expr Expr              -- ^ @ if ok then e1 else e2 @
-              | EWhere Expr [Decl]              -- ^ @ 1 + x where { x = 2 } @
-              | ETyped Expr Type                -- ^ @ 1 : [8] @
-              | ETypeVal Type                   -- ^ @ `(x + 1)@, @x@ is a type
-              | EFun [Pattern] Expr             -- ^ @ \\x y -> x @
-              | ELocated Expr Range             -- ^ position annotation
-                deriving (Eq,Show)
+              | ETuple [Expr n]                 -- ^ @ (1,2,3) @
+              | ERecord [Named (Expr n)]        -- ^ @ { x = 1, y = 2 } @
+              | ESel (Expr n) Selector          -- ^ @ e.l @
+              | EList [Expr n]                  -- ^ @ [1,2,3] @
+              | EFromTo (Type n) (Maybe (Type n)) (Maybe (Type n)) -- ^ @[1, 5 ..  117 ] @
+              | EInfFrom (Expr n) (Maybe (Expr n))-- ^ @ [1, 3 ...] @
+              | EComp (Expr n) [[Match n]]      -- ^ @ [ 1 | x <- xs ] @
+              | EApp (Expr n) (Expr n)          -- ^ @ f x @
+              | EAppT (Expr n) [(TypeInst n)]   -- ^ @ f `{x = 8}, f`{8} @
+              | EIf (Expr n) (Expr n) (Expr n)  -- ^ @ if ok then e1 else e2 @
+              | EWhere (Expr n) [Decl n]        -- ^ @ 1 + x where { x = 2 } @
+              | ETyped (Expr n) (Type n)        -- ^ @ 1 : [8] @
+              | ETypeVal (Type n)               -- ^ @ `(x + 1)@, @x@ is a type
+              | EFun [Pattern n] (Expr n)       -- ^ @ \\x y -> x @
+              | ELocated (Expr n) Range         -- ^ position annotation
 
-data TypeInst = NamedInst (Named Type)
-              | PosInst Type
-                deriving (Eq,Show)
+              | EParens (Expr n)                -- ^ @ (e)   @ (Removed by Fixity)
+              | EInfix (Expr n) (Located n) Fixity (Expr n)-- ^ @ a + b @ (Removed by Fixity)
+                deriving (Eq,Show,Generic)
 
+instance NFData name => NFData (Expr name) where rnf = genericRnf
 
+data TypeInst name = NamedInst (Named (Type name))
+                   | PosInst (Type name)
+                     deriving (Eq,Show,Generic)
+
+instance NFData name => NFData (TypeInst name) where rnf = genericRnf
+
 {- | Selectors are used for projecting from various components.
 Each selector has an option spec to specify the shape of the thing
 that is being selected.  Currently, there is no surface syntax for
@@ -283,150 +340,162 @@
                 -- ^ Zero-based tuple selection.
                 -- Optionally specifies the shape of the tuple (one-based).
 
-              | RecordSel Name (Maybe [Name])
+              | RecordSel Ident (Maybe [Ident])
                 -- ^ Record selection.
                 -- Optionally specifies the shape of the record.
 
               | ListSel Int    (Maybe Int)
                 -- ^ List selection.
                 -- Optionally specifies the length of the list.
-                deriving (Eq,Show,Ord)
+                deriving (Eq,Show,Ord,Generic)
 
-data Match    = Match Pattern Expr              -- ^ p <- e
-              | MatchLet Bind
-                deriving (Eq,Show)
+instance NFData Selector where rnf = genericRnf
 
-data Pattern  = PVar LName                    -- ^ @ x @
-              | PWild                         -- ^ @ _ @
-              | PTuple [Pattern]              -- ^ @ (x,y,z) @
-              | PRecord [ Named Pattern ]     -- ^ @ { x = (a,b,c), y = z } @
-              | PList [ Pattern ]             -- ^ @ [ x, y, z ] @
-              | PTyped Pattern Type           -- ^ @ x : [8] @
-              | PSplit Pattern Pattern        -- ^ @ (x # y) @
-              | PLocated Pattern Range        -- ^ Location information
-                deriving (Eq,Show)
+data Match name = Match (Pattern name) (Expr name)              -- ^ p <- e
+                | MatchLet (Bind name)
+                  deriving (Eq,Show,Generic)
 
+instance NFData name => NFData (Match name) where rnf = genericRnf
 
-data Named a  = Named { name :: Located Name, value :: a }
-                deriving (Eq,Show)
+data Pattern n = PVar (Located n)              -- ^ @ x @
+               | PWild                         -- ^ @ _ @
+               | PTuple [Pattern n]            -- ^ @ (x,y,z) @
+               | PRecord [ Named (Pattern n) ] -- ^ @ { x = (a,b,c), y = z } @
+               | PList [ Pattern n ]           -- ^ @ [ x, y, z ] @
+               | PTyped (Pattern n) (Type n)   -- ^ @ x : [8] @
+               | PSplit (Pattern n) (Pattern n)-- ^ @ (x # y) @
+               | PLocated (Pattern n) Range    -- ^ Location information
+                 deriving (Eq,Show,Generic)
 
-instance Functor Named where
-  fmap f x = x { value = f (value x) }
+instance NFData name => NFData (Pattern name) where rnf = genericRnf
 
+data Named a = Named { name :: Located Ident, value :: a }
+               deriving (Eq,Show,Foldable,Traversable,Generic,Functor)
 
-data Schema   = Forall [TParam] [Prop] Type (Maybe Range)
-                deriving (Eq,Show)
+instance NFData a => NFData (Named a) where rnf = genericRnf
 
+data Schema n = Forall [TParam n] [Prop n] (Type n) (Maybe Range)
+                deriving (Eq,Show,Generic)
+
+instance NFData name => NFData (Schema name) where rnf = genericRnf
+
 data Kind     = KNum | KType
-                deriving (Eq,Show)
+                deriving (Eq,Show,Generic)
 
-data TParam   = TParam { tpName  :: Name
+instance NFData Kind where rnf = genericRnf
+
+data TParam n = TParam { tpName  :: n
                        , tpKind  :: Maybe Kind
                        , tpRange :: Maybe Range
                        }
-                deriving (Eq,Show)
-
-tpQName :: TParam -> QName
-tpQName  = mkUnqual . tpName
+                deriving (Eq,Show,Generic)
 
+instance NFData name => NFData (TParam name) where rnf = genericRnf
 
-data Type     = TFun Type Type          -- ^ @[8] -> [8]@
-              | TSeq Type Type          -- ^ @[8] a@
+data Type n   = TFun (Type n) (Type n)  -- ^ @[8] -> [8]@
+              | TSeq (Type n) (Type n)  -- ^ @[8] a@
               | TBit                    -- ^ @Bit@
               | TNum Integer            -- ^ @10@
               | TChar Char              -- ^ @'a'@
               | TInf                    -- ^ @inf@
-              | TUser QName [Type]      -- ^ A type variable or synonym
-              | TApp TFun [Type]        -- ^ @2 + x@
-              | TRecord [Named Type]    -- ^ @{ x : [8], y : [32] }@
-              | TTuple [Type]           -- ^ @([8], [32])@
+              | TUser n [Type n]        -- ^ A type variable or synonym
+              | TApp TFun [Type n]      -- ^ @2 + x@
+              | TRecord [Named (Type n)]-- ^ @{ x : [8], y : [32] }@
+              | TTuple [Type n]         -- ^ @([8], [32])@
               | TWild                   -- ^ @_@, just some type.
-              | TLocated Type Range     -- ^ Location information
-                deriving (Eq,Show)
+              | TLocated (Type n) Range -- ^ Location information
+              | TParens (Type n)        -- ^ @ (ty) @
+              | TInfix (Type n) (Located n) Fixity (Type n) -- ^ @ ty + ty @
+                deriving (Eq,Show,Generic)
 
-data Prop     = CFin Type             -- ^ @ fin x   @
-              | CEqual Type Type      -- ^ @ x == 10 @
-              | CGeq Type Type        -- ^ @ x >= 10 @
-              | CArith Type           -- ^ @ Arith a @
-              | CCmp Type             -- ^ @ Cmp a @
-              | CLocated Prop Range   -- ^ Location information
-                deriving (Eq,Show)
+instance NFData name => NFData (Type name) where rnf = genericRnf
 
+data Prop n   = CFin (Type n)             -- ^ @ fin x   @
+              | CEqual (Type n) (Type n)  -- ^ @ x == 10 @
+              | CGeq (Type n) (Type n)    -- ^ @ x >= 10 @
+              | CArith (Type n)           -- ^ @ Arith a @
+              | CCmp (Type n)             -- ^ @ Cmp a @
+              | CLocated (Prop n) Range   -- ^ Location information
 
+              | CType (Type n)            -- ^ After parsing
+                deriving (Eq,Show,Generic)
+
+instance NFData name => NFData (Prop name) where rnf = genericRnf
+
 --------------------------------------------------------------------------------
 -- Note: When an explicit location is missing, we could use the sub-components
 -- to try to estimate a location...
 
 
-instance AddLoc Expr where
+instance AddLoc (Expr n) where
   addLoc = ELocated
 
   dropLoc (ELocated e _) = dropLoc e
   dropLoc e              = e
 
-instance HasLoc Expr where
+instance HasLoc (Expr name) where
   getLoc (ELocated _ r) = Just r
   getLoc _              = Nothing
 
-instance HasLoc TParam where
+instance HasLoc (TParam name) where
   getLoc (TParam _ _ r) = r
 
-instance AddLoc TParam where
+instance AddLoc (TParam name) where
   addLoc (TParam a b _) l = TParam a b (Just l)
   dropLoc (TParam a b _)  = TParam a b Nothing
 
-instance HasLoc Type where
+instance HasLoc (Type name) where
   getLoc (TLocated _ r) = Just r
   getLoc _              = Nothing
 
-instance AddLoc Type where
+instance AddLoc (Type name) where
   addLoc = TLocated
 
   dropLoc (TLocated e _) = dropLoc e
   dropLoc e              = e
 
-instance HasLoc Prop where
+instance HasLoc (Prop name) where
   getLoc (CLocated _ r) = Just r
   getLoc _              = Nothing
 
-instance AddLoc Prop where
+instance AddLoc (Prop name) where
   addLoc = CLocated
 
   dropLoc (CLocated e _) = dropLoc e
   dropLoc e              = e
 
-instance AddLoc Pattern where
+instance AddLoc (Pattern name) where
   addLoc = PLocated
 
   dropLoc (PLocated e _) = dropLoc e
   dropLoc e              = e
 
-instance HasLoc Pattern where
+instance HasLoc (Pattern name) where
   getLoc (PLocated _ r) = Just r
   getLoc _              = Nothing
 
-instance HasLoc Bind where
+instance HasLoc (Bind name) where
   getLoc b = getLoc (bName b, bDef b)
 
-instance HasLoc Match where
+instance HasLoc (Match name) where
   getLoc (Match p e)    = getLoc (p,e)
   getLoc (MatchLet b)   = getLoc b
 
 instance HasLoc a => HasLoc (Named a) where
   getLoc l = getLoc (name l, value l)
 
-instance HasLoc Schema where
+instance HasLoc (Schema name) where
   getLoc (Forall _ _ _ r) = r
 
-instance AddLoc Schema where
+instance AddLoc (Schema name) where
   addLoc  (Forall xs ps t _) r = Forall xs ps t (Just r)
   dropLoc (Forall xs ps t _)   = Forall xs ps t Nothing
 
-instance HasLoc Decl where
+instance HasLoc (Decl name) where
   getLoc (DLocated _ r) = Just r
   getLoc _              = Nothing
 
-instance AddLoc Decl where
+instance AddLoc (Decl name) where
   addLoc d r             = DLocated d r
 
   dropLoc (DLocated d _) = dropLoc d
@@ -435,13 +504,13 @@
 instance HasLoc a => HasLoc (TopLevel a) where
   getLoc = getLoc . tlValue
 
-instance HasLoc TopDecl where
+instance HasLoc (TopDecl name) where
   getLoc td = case td of
     Decl tld    -> getLoc tld
     TDNewtype n -> getLoc n
     Include lfp -> getLoc lfp
 
-instance HasLoc Module where
+instance HasLoc (Module name) where
   getLoc m
     | null locs = Nothing
     | otherwise = Just (rCombs locs)
@@ -451,7 +520,7 @@
                      , getLoc (mDecls m)
                      ]
 
-instance HasLoc Newtype where
+instance HasLoc (Newtype name) where
   getLoc n
     | null locs = Nothing
     | otherwise = Just (rCombs locs)
@@ -476,32 +545,38 @@
 ppNamed s x = ppL (name x) <+> text s <+> pp (value x)
 
 
-instance PP Module where
+instance (Show name, PPName name) => PP (Module name) where
   ppPrec _ m = text "module" <+> ppL (mName m) <+> text "where"
             $$ vcat (map ppL (mImports m))
             $$ vcat (map pp (mDecls m))
 
-instance PP Program where
+instance (Show name, PPName name) => PP (Program name) where
   ppPrec _ (Program ds) = vcat (map pp ds)
 
-instance PP TopDecl where
+instance (Show name, PPName name) => PP (TopDecl name) where
   ppPrec _ top_decl =
     case top_decl of
       Decl    d   -> pp d
       TDNewtype n -> pp n
       Include l   -> text "include" <+> text (show (thing l))
 
-instance PP Decl where
+instance (Show name, PPName name) => PP (Decl name) where
   ppPrec n decl =
     case decl of
       DSignature xs s -> commaSep (map ppL xs) <+> text ":" <+> pp s
       DPatBind p e    -> pp p <+> text "=" <+> pp e
       DBind b         -> ppPrec n b
+      DFixity f ns    -> ppFixity f ns
       DPragma xs p    -> ppPragma xs p
       DType ts        -> ppPrec n ts
       DLocated d _    -> ppPrec n d
 
-instance PP Newtype where
+ppFixity :: PPName name => Fixity -> [Located name] -> Doc
+ppFixity (Fixity LeftAssoc  i) ns = text "infixl" <+> int i <+> commaSep (map pp ns)
+ppFixity (Fixity RightAssoc i) ns = text "infixr" <+> int i <+> commaSep (map pp ns)
+ppFixity (Fixity NonAssoc   i) ns = text "infix"  <+> int i <+> commaSep (map pp ns)
+
+instance PPName name => PP (Newtype name) where
   ppPrec _ nt = hsep
     [ text "newtype", ppL (nName nt), hsep (map pp (nParams nt)), char '='
     , braces (commaSep (map (ppNamed ":") (nBody nt))) ]
@@ -527,45 +602,36 @@
   ppPrec _ (PragmaNote x) = text x
   ppPrec _ PragmaProperty = text "property"
 
-ppPragma :: [LQName] -> Pragma -> Doc
+ppPragma :: PPName name => [Located name] -> Pragma -> Doc
 ppPragma xs p =
   text "/*" <+> text "pragma" <+> commaSep (map ppL xs) <+> text ":" <+> pp p
   <+> text "*/"
 
-instance PP Bind where
+instance (Show name, PPName name) => PP (Bind name) where
   ppPrec _ b = sig $$ vcat [ ppPragma [f] p | p <- bPragmas b ] $$
-               hang (lhs <+> eq) 4 (pp (bDef b))
-    where f = bName b
+               hang (def <+> eq) 4 (pp (thing (bDef b)))
+    where def | bInfix b  = lhsOp
+              | otherwise = lhs
+          f = bName b
           sig = case bSignature b of
                   Nothing -> empty
                   Just s  -> pp (DSignature [f] s)
           eq  = if bMono b then text ":=" else text "="
           lhs = ppL f <+> fsep (map (ppPrec 3) (bParams b))
 
+          lhsOp = case bParams b of
+                    [x,y] -> pp x <+> ppL f <+> pp y
+                    _     -> panic "AST" [ "Malformed infix operator", show b ]
 
-instance PP TySyn where
-  ppPrec _ (TySyn x xs t) = text "type" <+> ppL x <+> fsep (map (ppPrec 1) xs)
-                                        <+> text "=" <+> pp t
 
-instance PP ModName where
-  ppPrec _ (ModName ns) = hcat (punctuate (text "::") (map text ns))
+instance (Show name, PPName name) => PP (BindDef name) where
+  ppPrec _ DPrim     = text "<primitive>"
+  ppPrec p (DExpr e) = ppPrec p e
 
-instance PP QName where
-  ppPrec _ (QName mb n) = mbNs <> pp n
-    where
-    mbNs = maybe empty (\ mn -> pp mn <> text "::") mb
 
-instance PP Name where
-  ppPrec _ (Name x)       = text x
-  -- XXX: This may clash with user-specified names.
-  ppPrec _ (NewName p x)  = text "__" <> passName p <> int x
-
-passName :: Pass -> Doc
-passName pass =
-  case pass of
-    NoPat       -> text "p"
-    MonoValues  -> text "mv"
-
+instance PPName name => PP (TySyn name) where
+  ppPrec _ (TySyn x xs t) = text "type" <+> ppL x <+> fsep (map (ppPrec 1) xs)
+                                        <+> text "=" <+> pp t
 instance PP Literal where
   ppPrec _ lit =
     case lit of
@@ -608,44 +674,18 @@
 wrap :: Int -> Int -> Doc -> Doc
 wrap contextPrec myPrec doc = if myPrec < contextPrec then parens doc else doc
 
--- | Succeeds if the expression is an infix operator.
-isInfixOp :: Expr -> Maybe (ECon, Assoc, Int)
-isInfixOp (ELocated e _)  = isInfixOp e
-isInfixOp (ECon x)        = do (a,p) <- Map.lookup x eBinOpPrec
-                               return (x,a,p)
-isInfixOp _               = Nothing
-
-isPrefixOp :: Expr -> Maybe ECon
-isPrefixOp (ELocated e _)                        = isPrefixOp e
-isPrefixOp (ECon x) | x == ECNeg || x == ECCompl = Just x
-isPrefixOp _                                     = Nothing
-
-isEApp :: Expr -> Maybe (Expr, Expr)
+isEApp :: Expr n -> Maybe (Expr n, Expr n)
 isEApp (ELocated e _)     = isEApp e
 isEApp (EApp e1 e2)       = Just (e1,e2)
 isEApp _                  = Nothing
 
-asEApps :: Expr -> (Expr, [Expr])
+asEApps :: Expr n -> (Expr n, [Expr n])
 asEApps expr = go expr []
     where go e es = case isEApp e of
                       Nothing       -> (e, es)
                       Just (e1, e2) -> go e1 (e2 : es)
 
-isEInfix :: Expr -> Maybe (Infix ECon Expr)
-isEInfix e =
-  do (e1,ieRight) <- isEApp e
-     (f,ieLeft)   <- isEApp e1
-     (ieOp,ieAssoc,iePrec) <- isInfixOp f
-     return Infix { .. }
-
-isTInfix :: Type -> Maybe (Infix TFun Type)
-isTInfix (TLocated t _)  = isTInfix t
-isTInfix (TApp ieOp [ieLeft,ieRight]) =
-  do (ieAssoc,iePrec) <- Map.lookup ieOp tBinOpPrec
-     return Infix { .. }
-isTInfix _               = Nothing
-
-instance PP TypeInst where
+instance PPName name => PP (TypeInst name) where
   ppPrec _ (PosInst t)   = pp t
   ppPrec _ (NamedInst x) = ppNamed "=" x
 
@@ -654,14 +694,13 @@
 2: infix expression   (separate precedence table)
 3: application, prefix expressions
 -}
-instance PP Expr where
+instance (Show name, PPName name) => PP (Expr name) where
   -- Wrap if top level operator in expression is less than `n`
   ppPrec n expr =
     case expr of
 
       -- atoms
-      EVar x        -> pp x
-      ECon x        -> ppPrefix x
+      EVar x        -> ppPrefixName x
       ELit x        -> pp x
       ETuple es     -> parens (commaSep (map pp es))
       ERecord fs    -> braces (commaSep (map (ppNamed "=") fs))
@@ -678,7 +717,7 @@
       ESel    e l   -> ppPrec 4 e <> text "." <> pp l
 
       -- low prec
-      EFun xs e     -> wrap n 0 (text "\\" <> hsep (map (ppPrec 3) xs) <+>
+      EFun xs e     -> wrap n 0 ((text "\\" <> hsep (map (ppPrec 3) xs)) <+>
                                  text "->" <+> pp e)
 
       EIf e1 e2 e3  -> wrap n 0 $ sep [ text "if"   <+> pp e1
@@ -692,20 +731,23 @@
                                 $$ nest 2 (vcat (map pp ds))
                                 $$ text "")
 
-
-      -- applications
-      _ | Just einf <- isEInfix expr
-                    -> optParens (n>2) $ ppInfix 2 isEInfix einf
-
-      EApp e1 e2
-        | Just op <- isPrefixOp e1
-                    -> wrap n 3 (pp op <> ppPrec 3 e2)
+      -- infix applications
+      -- XXX why did we need this case?
+      -- EApp (EApp (EVar f) x) y ->
+      --   wrap n 3 $ withNameEnv $ \ env ->
+      --     let NameInfo qn isInfix = getNameInfo f env
+      --      in if isInfix then ppPrec 3 x <+> ppQName qn <+> ppPrec 3 y
+      --                    else ppQName qn <+> ppPrec 3 x <+> ppPrec 3 y
 
       EApp _ _      -> let (e, es) = asEApps expr in
                        wrap n 3 (ppPrec 3 e <+> fsep (map (ppPrec 4) es))
 
       ELocated e _  -> ppPrec n e
 
+      EParens e -> parens (pp e)
+
+      EInfix e1 op _ e2 -> wrap n 0 (pp e1 <+> ppInfixName (thing op) <+> pp e2)
+
 instance PP Selector where
   ppPrec _ sel =
     case sel of
@@ -731,7 +773,7 @@
 
 
 
-instance PP Pattern where
+instance PPName name => PP (Pattern name) where
   ppPrec n pat =
     case pat of
       PVar x        -> pp (thing x)
@@ -743,12 +785,12 @@
       PSplit p1 p2  -> wrap n 1 (ppPrec 1 p1 <+> text "#" <+> ppPrec 1 p2)
       PLocated p _  -> ppPrec n p
 
-instance PP Match where
+instance (Show name, PPName name) => PP (Match name) where
   ppPrec _ (Match p e)  = pp p <+> text "<-" <+> pp e
   ppPrec _ (MatchLet b) = pp b
 
 
-instance PP Schema where
+instance PPName name => PP (Schema name) where
   ppPrec _ (Forall xs ps t _) = sep [vars <+> preds, pp t]
     where vars = case xs of
                    [] -> empty
@@ -766,7 +808,7 @@
 cppKind KType = text "a value type"
 cppKind KNum  = text "a numeric type"
 
-instance PP TParam where
+instance PPName name => PP (TParam name) where
   ppPrec n (TParam p Nothing _)   = ppPrec n p
   ppPrec n (TParam p (Just k) _)  = wrap n 1 (pp p <+> text ":" <+> pp k)
 
@@ -774,7 +816,7 @@
 -- 3: wrap application
 -- 2: wrap function
 -- 1:
-instance PP Type where
+instance PPName name => PP (Type name) where
   ppPrec n ty =
     case ty of
       TWild          -> text "_"
@@ -788,10 +830,10 @@
       TSeq t1 t2     -> optParens (n > 3)
                       $ brackets (pp t1) <> ppPrec 3 t2
 
-      TApp _ [_,_]
-        | Just tinf <- isTInfix ty
-                     -> optParens (n > 2)
-                      $ ppInfix 2 isTInfix tinf
+      -- TApp _ [_,_]
+      --   | Just tinf <- isTInfix ty
+      --                -> optParens (n > 2)
+      --                 $ ppInfix 2 isTInfix tinf
 
       TApp f ts      -> optParens (n > 2)
                       $ pp f <+> fsep (map (ppPrec 4) ts)
@@ -806,7 +848,12 @@
 
       TLocated t _   -> ppPrec n t
 
-instance PP Prop where
+      TParens t      -> parens (pp t)
+
+      TInfix t1 o _ t2 -> optParens (n > 0)
+                        $ sep [ppPrec 2 t1 <+> pp o, ppPrec 1 t2]
+
+instance PPName name => PP (Prop name) where
   ppPrec n prop =
     case prop of
       CFin t       -> text "fin"   <+> ppPrec 4 t
@@ -816,7 +863,9 @@
       CGeq t1 t2   -> ppPrec 2 t1 <+> text ">=" <+> ppPrec 2 t2
       CLocated c _ -> ppPrec n c
 
+      CType t      -> ppPrec n t
 
+
 --------------------------------------------------------------------------------
 -- Drop all position information, so equality reflects program structure
 
@@ -834,16 +883,16 @@
 instance NoPos t => NoPos [t]       where noPos = fmap noPos
 instance NoPos t => NoPos (Maybe t) where noPos = fmap noPos
 
-instance NoPos Program where
+instance NoPos (Program name) where
   noPos (Program x) = Program (noPos x)
 
-instance NoPos Module where
+instance NoPos (Module name) where
   noPos m = Module { mName    = mName m
                    , mImports = noPos (mImports m)
                    , mDecls   = noPos (mDecls m)
                    }
 
-instance NoPos TopDecl where
+instance NoPos (TopDecl name) where
   noPos decl =
     case decl of
       Decl    x   -> Decl     (noPos x)
@@ -853,29 +902,33 @@
 instance NoPos a => NoPos (TopLevel a) where
   noPos tl = tl { tlValue = noPos (tlValue tl) }
 
-instance NoPos Decl where
+instance NoPos (Decl name) where
   noPos decl =
     case decl of
       DSignature x y   -> DSignature (noPos x) (noPos y)
       DPragma    x y   -> DPragma    (noPos x) (noPos y)
       DPatBind   x y   -> DPatBind   (noPos x) (noPos y)
+      DFixity f ns     -> DFixity f (noPos ns)
       DBind      x     -> DBind      (noPos x)
       DType      x     -> DType      (noPos x)
       DLocated   x _   -> noPos x
 
-instance NoPos Newtype where
+instance NoPos (Newtype name) where
   noPos n = Newtype { nName   = noPos (nName n)
                     , nParams = nParams n
                     , nBody   = noPos (nBody n)
                     }
 
-instance NoPos Bind where
+instance NoPos (Bind name) where
   noPos x = Bind { bName      = noPos (bName      x)
                  , bParams    = noPos (bParams    x)
                  , bDef       = noPos (bDef       x)
                  , bSignature = noPos (bSignature x)
+                 , bInfix     = bInfix x
+                 , bFixity    = bFixity x
                  , bPragmas   = noPos (bPragmas   x)
                  , bMono      = bMono x
+                 , bDoc       = bDoc x
                  }
 
 instance NoPos Pragma where
@@ -885,14 +938,13 @@
 
 
 
-instance NoPos TySyn where
+instance NoPos (TySyn name) where
   noPos (TySyn x y z) = TySyn (noPos x) (noPos y) (noPos z)
 
-instance NoPos Expr where
+instance NoPos (Expr name) where
   noPos expr =
     case expr of
       EVar x        -> EVar     x
-      ECon x        -> ECon     x
       ELit x        -> ELit     x
       ETuple x      -> ETuple   (noPos x)
       ERecord x     -> ERecord  (noPos x)
@@ -910,15 +962,18 @@
       EFun x y      -> EFun     (noPos x) (noPos y)
       ELocated x _  -> noPos x
 
-instance NoPos TypeInst where
+      EParens e     -> EParens (noPos e)
+      EInfix x y f z-> EInfix (noPos x) y f (noPos z)
+
+instance NoPos (TypeInst name) where
   noPos (PosInst ts)   = PosInst (noPos ts)
   noPos (NamedInst fs) = NamedInst (noPos fs)
 
-instance NoPos Match where
+instance NoPos (Match name) where
   noPos (Match x y)  = Match (noPos x) (noPos y)
   noPos (MatchLet b) = MatchLet (noPos b)
 
-instance NoPos Pattern where
+instance NoPos (Pattern name) where
   noPos pat =
     case pat of
       PVar x       -> PVar    (noPos x)
@@ -930,13 +985,13 @@
       PSplit x y   -> PSplit  (noPos x) (noPos y)
       PLocated x _ -> noPos x
 
-instance NoPos Schema where
+instance NoPos (Schema name) where
   noPos (Forall x y z _) = Forall (noPos x) (noPos y) (noPos z) Nothing
 
-instance NoPos TParam where
+instance NoPos (TParam name) where
   noPos (TParam x y _)  = TParam x y Nothing
 
-instance NoPos Type where
+instance NoPos (Type name) where
   noPos ty =
     case ty of
       TWild         -> TWild
@@ -951,8 +1006,10 @@
       TNum n        -> TNum n
       TChar n       -> TChar n
       TLocated x _  -> noPos x
+      TParens x     -> TParens (noPos x)
+      TInfix x y f z-> TInfix (noPos x) y f (noPos z)
 
-instance NoPos Prop where
+instance NoPos (Prop name) where
   noPos prop =
     case prop of
       CEqual  x y   -> CEqual  (noPos x) (noPos y)
@@ -961,5 +1018,6 @@
       CArith x      -> CArith (noPos x)
       CCmp x        -> CCmp   (noPos x)
       CLocated c _  -> noPos c
+      CType t       -> CType (noPos t)
 
 
diff --git a/src/Cryptol/Parser/Lexer.x b/src/Cryptol/Parser/Lexer.x
--- a/src/Cryptol/Parser/Lexer.x
+++ b/src/Cryptol/Parser/Lexer.x
@@ -1,11 +1,20 @@
 {
+-- |
+-- Module      :  $Header$
+-- Copyright   :  (c) 2013-2016 Galois, Inc.
+-- License     :  BSD3
+-- Maintainer  :  cryptol@galois.com
+-- Stability   :  provisional
+-- Portability :  portable
+-- 
 -- At present Alex generates code with too many warnings.
 {-# LANGUAGE Trustworthy #-}
+{-# LANGUAGE OverloadedStrings #-}
 {-# OPTIONS_GHC -w #-}
 module Cryptol.Parser.Lexer
   ( primLexer, lexer, Layout(..)
   , Token(..), TokenT(..)
-  , TokenV(..), TokenKW(..), TokenErr(..), TokenOp(..), TokenSym(..), TokenW(..)
+  , TokenV(..), TokenKW(..), TokenErr(..), TokenSym(..), TokenW(..)
   , Located(..)
   , Config(..)
   , defaultConfig
@@ -14,12 +23,28 @@
 import Cryptol.Parser.Position
 import Cryptol.Parser.LexerUtils
 import Cryptol.Parser.Unlit(unLit)
+import Data.Text.Lazy (Text)
 import qualified Data.Text.Lazy as Text
 }
 
-$id_first     = [a-zA-Z_α-ωΑ-Ω]
-$id_next      = [a-zA-Z0-9_'α-ωΑ-Ω]
+$uniupper       = \x1
+$unilower       = \x2
+$unidigit       = \x3
+$unisymbol      = \x4
+$unispace       = \x5
+$uniother       = \x6
+$unitick        = \x7
 
+@id_first     = [a-zA-Z_] | $unilower | $uniupper
+@id_next      = [a-zA-Z0-9_'] | $unilower | $uniupper | $unidigit | $unitick
+
+@id           = @id_first @id_next*
+@op           = ([\!\@\#\$\%\^\&\*\~\>\<\?\+\=\|\/\\\-] | $unisymbol)+
+
+@qual         = (@id $white* :: $white*)+
+@qual_id      = @qual @id
+@qual_op      = @qual @op
+
 @num2         = "0b" [0-1]+
 @num8         = "0o" [0-7]+
 @num10        = [0-9]+
@@ -30,11 +55,16 @@
 
 :-
 
-<0,comment> "/*"          { startComment }
+<0,comment> {
+\/\*                     { startComment False }
+\/\*\*+                  { startComment True  }
+\/\*+\/                  { startEndComment    }
+}
 
 <comment> {
-"*/"                      { endComent }
-.                         { addToComment }
+\*+\/                     { endComent }
+[^\*]+                    { addToComment }
+\*                        { addToComment }
 \n                        { addToComment }
 }
 
@@ -58,91 +88,42 @@
 $white+                   { emit $ White Space }
 "//" .*                   { emit $ White LineComment }
 
+@qual_id                  { mkQualIdent }
+@qual_op                  { mkQualOp }
+
 -- Please update the docs, if you add new entries.
-"Arith"                   { emit $ KW KW_Arith }
-"Bit"                     { emit $ KW KW_Bit }
-"Cmp"                     { emit $ KW KW_Cmp }
-"False"                   { emit $ KW KW_False }
-"Inf"                     { emit $ KW KW_inf }
-"True"                    { emit $ KW KW_True }
 "else"                    { emit $ KW KW_else }
-"Eq"                      { emit $ KW KW_Eq }
-"error"                   { emit $ KW KW_error }
 "extern"                  { emit $ KW KW_extern }
-"fin"                     { emit $ KW KW_fin }
 "if"                      { emit $ KW KW_if }
 "private"                 { emit $ KW KW_private }
-"join"                    { emit $ KW KW_join }
 "include"                 { emit $ KW KW_include }
-"inf"                     { emit $ KW KW_inf }
-"lg2"                     { emit $ KW KW_lg2 }
-"lengthFromThen"          { emit $ KW KW_lengthFromThen }
-"lengthFromThenTo"        { emit $ KW KW_lengthFromThenTo }
-"max"                     { emit $ KW KW_max }
-"min"                     { emit $ KW KW_min }
 "module"                  { emit $ KW KW_module }
 "newtype"                 { emit $ KW KW_newtype }
 "pragma"                  { emit $ KW KW_pragma }
 "property"                { emit $ KW KW_property }
-"pmult"                   { emit $ KW KW_pmult }
-"pdiv"                    { emit $ KW KW_pdiv }
-"pmod"                    { emit $ KW KW_pmod }
-"random"                  { emit $ KW KW_random }
-"reverse"                 { emit $ KW KW_reverse }
-"split"                   { emit $ KW KW_split }
-"splitAt"                 { emit $ KW KW_splitAt }
 "then"                    { emit $ KW KW_then }
-"transpose"               { emit $ KW KW_transpose }
 "type"                    { emit $ KW KW_type  }
 "where"                   { emit $ KW KW_where }
 "let"                     { emit $ KW KW_let }
 "x"                       { emit $ KW KW_x }
-"zero"                    { emit $ KW KW_zero }
 "import"                  { emit $ KW KW_import }
 "as"                      { emit $ KW KW_as }
 "hiding"                  { emit $ KW KW_hiding }
 "newtype"                 { emit $ KW KW_newtype }
 
+"infixl"                  { emit $ KW KW_infixl }
+"infixr"                  { emit $ KW KW_infixr }
+"infix"                   { emit $ KW KW_infix  }
+
+"primitive"               { emit $ KW KW_primitive }
+
 @num2                     { emitS (numToken 2  . drop 2) }
 @num8                     { emitS (numToken 8  . drop 2) }
 @num10                    { emitS (numToken 10 . drop 0) }
 @num16                    { emitS (numToken 16 . drop 2) }
 
 "_"                       { emit $ Sym Underscore }
-$id_first $id_next*       { mkIdent }
-
-"+"                       { emit $ Op Plus }
-"-"                       { emit $ Op Minus }
-"*"                       { emit $ Op Mul }
-"/"                       { emit $ Op Div }
-"%"                       { emit $ Op Mod }
-"^^"                      { emit $ Op Exp }
-
-"!="                      { emit $ Op NotEqual }
-"=="                      { emit $ Op Equal }
-"==="                     { emit $ Op EqualFun }
-"!=="                     { emit $ Op NotEqualFun }
-">"                       { emit $ Op GreaterThan }
-"<"                       { emit $ Op LessThan }
-"<="                      { emit $ Op LEQ }
-">="                      { emit $ Op GEQ }
-
-">>"                      { emit $ Op ShiftR }
-"<<"                      { emit $ Op ShiftL }
-">>>"                     { emit $ Op RotR }
-"<<<"                     { emit $ Op RotL }
-
-"~"                       { emit $ Op Complement }
-
-"^"                       { emit $ Op Xor  }
-"||"                      { emit $ Op Disj }
-"&&"                      { emit $ Op Conj }
-
-"!"                       { emit $ Op Bang }
-"!!"                      { emit $ Op BangBang }
-"@"                       { emit $ Op At }
-"@@"                      { emit $ Op AtAt }
-"#"                       { emit $ Op Hash }
+@id                       { mkIdent }
 
 "\"                       { emit $ Sym Lambda }
 "->"                      { emit $ Sym ArrR }
@@ -154,7 +135,6 @@
 ";"                       { emit $ Sym Semi }
 "."                       { emit $ Sym Dot }
 ":"                       { emit $ Sym Colon }
-"::"                      { emit $ Sym ColonColon }
 "`"                       { emit $ Sym BackTick }
 ".."                      { emit $ Sym DotDot }
 "..."                     { emit $ Sym DotDotDot }
@@ -170,6 +150,21 @@
 
 \"                        { startString }
 \'                        { startChar }
+
+-- special cases for types and kinds
+"+"                       { emit  (Op   Plus ) }
+"-"                       { emit  (Op   Minus) }
+"*"                       { emit  (Op   Mul  ) }
+"^^"                      { emit  (Op   Exp  ) }
+
+-- hash is used as a kind, and as a pattern
+"#"                       { emit  (Op   Hash ) }
+
+-- ~ is used for unary complement
+"~"                       { emit  (Op   Complement) }
+
+-- all other operators
+@op                       { emitS (Op . Other []) }
 }
 
 
@@ -186,7 +181,7 @@
 -- | Returns the tokens in the last position of the input that we processed.
 -- White space is removed, and layout processing is done as requested.
 -- This stream is fed to the parser.
-lexer :: Config -> String -> ([Located Token], Position)
+lexer :: Config -> Text -> ([Located Token], Position)
 lexer cfg cs = ( case cfgLayout cfg of
                    Layout   -> layout cfg lexemes
                    NoLayout -> lexemes
@@ -197,15 +192,12 @@
 
 -- | Returns the tokens and the last position of the input that we processed.
 -- The tokens include whte space tokens.
-primLexer :: Config -> String -> ([Located Token], Position)
+primLexer :: Config -> Text -> ([Located Token], Position)
 primLexer cfg cs = run inp Normal
   where
   inp = Inp { alexPos           = start
             , alexInputPrevChar = '\n'
-            , input             = Text.unpack      -- XXX: Use Text
-                                $ unLit (cfgPreProc cfg)
-                                $ Text.pack cs
-            , moreBytes = [] }
+            , input             = unLit (cfgPreProc cfg) cs }
 
   singleR p = Range p p (cfgSource cfg)
 
@@ -220,7 +212,7 @@
           Normal        -> ([ Located (eofR $ alexPos i) (Token EOF "end of file") ]
                            , alexPos i
                            )
-          InComment p _ _ ->
+          InComment _ p _ _ ->
               ( [ Located (singleR p)
                 $ Token (Err UnterminatedComment) "unterminated comment"
                 ]
@@ -237,19 +229,14 @@
               , alexPos i)
 
       AlexError i'  ->
-          let p1 = alexPos i
-              p2 = alexPos i'
-              inp = input i
-              bad = if line p1 == line p2
-                      then take (col p2 - col p1) inp
-                      else takeWhile (/= '\n')    inp
+          let bad = Text.take 1 (input i)
           in
           ( [ Located (Range (alexPos i) (alexPos i') (cfgSource cfg))
                $ Token (Err LexicalError) bad ]
           , alexPos i')
       AlexSkip i' _ -> run i' s
       AlexToken i' l act ->
-        let txt         = take l (input i)
+        let txt         = Text.take (fromIntegral l) (input i)
             (mtok,s')   = act cfg (alexPos i) txt s
             (rest,pos)  = run i' $! s'
         in case mtok of
diff --git a/src/Cryptol/Parser/LexerUtils.hs b/src/Cryptol/Parser/LexerUtils.hs
--- a/src/Cryptol/Parser/LexerUtils.hs
+++ b/src/Cryptol/Parser/LexerUtils.hs
@@ -1,12 +1,14 @@
 -- |
 -- Module      :  $Header$
--- Copyright   :  (c) 2013-2015 Galois, Inc.
+-- Copyright   :  (c) 2013-2016 Galois, Inc.
 -- License     :  BSD3
 -- Maintainer  :  cryptol@galois.com
 -- Stability   :  provisional
 -- Portability :  portable
 
+{-# LANGUAGE OverloadedStrings #-}
 {-# LANGUAGE PatternGuards #-}
+{-# LANGUAGE DeriveGeneric #-}
 module Cryptol.Parser.LexerUtils where
 
 import Cryptol.Parser.Position
@@ -14,11 +16,15 @@
 import Cryptol.Utils.PP
 import Cryptol.Utils.Panic
 
-import Data.Char(toLower)
-import Data.List(foldl')
-import Data.Word(Word8)
-import Codec.Binary.UTF8.String(encodeChar)
+import           Data.Char(toLower,generalCategory,isAscii,ord,isSpace)
+import qualified Data.Char as Char
+import           Data.List(foldl')
+import           Data.Text.Lazy (Text)
+import qualified Data.Text.Lazy as T
+import           Data.Word(Word8)
 
+import GHC.Generics (Generic)
+import Control.DeepSeq.Generics
 
 data Config = Config
   { cfgSource      :: !FilePath     -- ^ File that we are working on
@@ -40,42 +46,58 @@
   }
 
 
-type Action = Config -> Position -> String -> LexS
+type Action = Config -> Position -> Text -> LexS
            -> (Maybe (Located Token), LexS)
 
 data LexS   = Normal
-            | InComment Position ![Position] [String]
-            | InString Position String
-            | InChar   Position String
+            | InComment Bool Position ![Position] [Text]
+            | InString Position Text
+            | InChar   Position Text
 
 
-startComment :: Action
-startComment _ p txt s = (Nothing, InComment p stack chunks)
-  where (stack,chunks) = case s of
-                           Normal            -> ([], [txt])
-                           InComment q qs cs -> (q : qs, txt : cs)
-                           _                 -> panic "[Lexer] startComment" ["in a string"]
+startComment :: Bool -> Action
+startComment isDoc _ p txt s = (Nothing, InComment d p stack chunks)
+  where (d,stack,chunks) = case s of
+                           Normal                -> (isDoc, [], [txt])
+                           InComment doc q qs cs -> (doc, q : qs, txt : cs)
+                           _                     -> panic "[Lexer] startComment" ["in a string"]
 
 endComent :: Action
 endComent cfg p txt s =
   case s of
-    InComment f [] cs     -> (Just (mkToken f cs), Normal)
-    InComment _ (q:qs) cs -> (Nothing, InComment q qs (txt : cs))
-    _                     -> panic "[Lexer] endComment" ["outside commend"]
+    InComment d f [] cs     -> (Just (mkToken d f cs), Normal)
+    InComment d _ (q:qs) cs -> (Nothing, InComment d q qs (txt : cs))
+    _                     -> panic "[Lexer] endComment" ["outside comment"]
   where
-  mkToken f cs =
+  mkToken isDoc f cs =
     let r   = Range { from = f, to = moves p txt, source = cfgSource cfg }
-        str = concat $ reverse $ txt : cs
-    in Located { srcRange = r, thing = Token (White BlockComment) str }
+        str = T.concat $ reverse $ txt : cs
 
+        tok = if isDoc then DocStr else BlockComment
+    in Located { srcRange = r, thing = Token (White tok) str }
+
 addToComment :: Action
-addToComment _ _ txt s = (Nothing, InComment p stack (txt : chunks))
+addToComment _ _ txt s = (Nothing, InComment doc p stack (txt : chunks))
   where
-  (p, stack, chunks) =
+  (doc, p, stack, chunks) =
      case s of
-       InComment q qs cs -> (q,qs,cs)
-       _                 -> panic "[Lexer] addToComment" ["outside comment"]
+       InComment d q qs cs -> (d,q,qs,cs)
+       _                   -> panic "[Lexer] addToComment" ["outside comment"]
 
+startEndComment :: Action
+startEndComment cfg p txt s =
+  case s of
+    Normal -> (Just tok, Normal)
+      where tok = Located
+                    { srcRange = Range { from   = p
+                                       , to     = moves p txt
+                                       , source = cfgSource cfg
+                                       }
+                    , thing = Token (White BlockComment) txt
+                    }
+    InComment d p1 ps cs -> (Nothing, InComment d p1 ps (txt : cs))
+    _ -> panic "[Lexer] startEndComment" ["in string or char?"]
+
 startString :: Action
 startString _ p txt _ = (Nothing,InString p txt)
 
@@ -87,20 +109,24 @@
   parseStr s1 = case reads s1 of
                   [(cs, "")] -> StrLit cs
                   _          -> Err InvalidString
+
   mkToken ps str = Located { srcRange = Range
                                { from   = ps
                                , to     = moves pe txt
                                , source = cfgSource cfg
                                }
                            , thing    = Token
-                               { tokenType = parseStr (str ++ txt)
-                               , tokenText = str ++ txt
+                               { tokenType = parseStr (T.unpack tokStr)
+                               , tokenText = tokStr
                                }
                            }
+    where
+    tokStr = str `T.append` txt
 
+
 addToString :: Action
 addToString _ _ txt s = case s of
-  InString p str -> (Nothing,InString p (str ++ txt))
+  InString p str -> (Nothing,InString p (str `T.append` txt))
   _              -> panic "[Lexer] addToString" ["outside string"]
 
 
@@ -124,16 +150,18 @@
                                , source = cfgSource cfg
                                }
                            , thing    = Token
-                               { tokenType = parseChar (str ++ txt)
-                               , tokenText = str ++ txt
+                               { tokenType = parseChar (T.unpack tokStr)
+                               , tokenText = tokStr
                                }
                            }
+    where
+    tokStr = str `T.append` txt
 
 
 
 addToChar :: Action
 addToChar _ _ txt s = case s of
-  InChar p str -> (Nothing,InChar p (str ++ txt))
+  InChar p str -> (Nothing,InChar p (str `T.append` txt))
   _              -> panic "[Lexer] addToChar" ["outside character"]
 
 
@@ -141,18 +169,49 @@
 mkIdent cfg p s z = (Just Located { srcRange = r, thing = Token t s }, z)
   where
   r = Range { from = p, to = moves p s, source = cfgSource cfg }
-  t = Ident s
+  t = Ident [] (T.unpack s)
 
+mkQualIdent :: Action
+mkQualIdent cfg p s z = (Just Located { srcRange = r, thing = Token t s}, z)
+  where
+  r = Range { from = p, to = moves p s, source = cfgSource cfg }
+  t = Ident (map T.unpack ns) (T.unpack i)
+  (ns,i) = splitQual s
+
+mkQualOp :: Action
+mkQualOp cfg p s z = (Just Located { srcRange = r, thing = Token t s}, z)
+  where
+  r = Range { from = p, to = moves p s, source = cfgSource cfg }
+  t = Op (Other (map T.unpack ns) (T.unpack i))
+  (ns,i) = splitQual s
+
 emit :: TokenT -> Action
 emit t cfg p s z  = (Just Located { srcRange = r, thing = Token t s }, z)
   where r = Range { from = p, to = moves p s, source = cfgSource cfg }
 
 
 emitS :: (String -> TokenT) -> Action
-emitS t cfg p s z  = emit (t s) cfg p s z
+emitS t cfg p s z  = emit (t (T.unpack s)) cfg p s z
 
 
+-- | Split out the prefix and name part of an identifier/operator.
+splitQual :: T.Text -> ([T.Text], T.Text)
+splitQual t =
+  case splitNS (T.filter (not . isSpace) t) of
+    []  -> panic "[Lexer] mkQualIdent" ["invalid qualified name", show t]
+    [i] -> ([], i)
+    xs  -> (init xs, last xs)
 
+  where
+
+  -- split on the namespace separator, `::`
+  splitNS s =
+    case T.breakOn "::" s of
+      (l,r) | T.null r  -> [l]
+            | otherwise -> l : splitNS (T.drop 2 r)
+
+
+
 --------------------------------------------------------------------------------
 numToken :: Integer -> String -> TokenT
 numToken rad ds = Num (toVal ds) (fromInteger rad) (length ds)
@@ -175,22 +234,15 @@
 
 data AlexInput            = Inp { alexPos           :: !Position
                                 , alexInputPrevChar :: !Char
-                                , input             :: !String
-                                , moreBytes         :: ![Word8]
+                                , input             :: !Text
                                 } deriving Show
 
 alexGetByte :: AlexInput -> Maybe (Word8, AlexInput)
 alexGetByte i =
-  case moreBytes i of
-    b : bs -> Just (b, i { moreBytes = bs })
-    [] ->
-      case input i of
-        c:cs -> alexGetByte Inp { alexPos = move (alexPos i) c
-                                , alexInputPrevChar = c
-                                , input             = cs
-                                , moreBytes         = encodeChar c
-                                }
-        []   -> Nothing
+  do (c,rest) <- T.uncons (input i)
+     let i' = i { alexPos = move (alexPos i) c, input = rest }
+         b  = byteForChar c
+     return (b,i')
 
 data Layout = Layout | NoLayout
 
@@ -200,7 +252,7 @@
 -- | Drop white-space tokens from the input.
 dropWhite :: [Located Token] -> [Located Token]
 dropWhite = filter (notWhite . tokenType . thing)
-  where notWhite (White _) = False
+  where notWhite (White w) = w == DocStr
         notWhite _         = True
 
 
@@ -220,7 +272,7 @@
 
 -- Add separators computed from layout
 layout :: Config -> [Located Token] -> [Located Token]
-layout cfg ts0 = loop implicitScope [] ts0
+layout cfg ts0 = loop False implicitScope [] ts0
   where
 
   (_pos0,implicitScope) = case ts0 of
@@ -228,20 +280,23 @@
     _     -> (start,False)
 
 
-  loop :: Bool -> [Block] -> [Located Token] -> [Located Token]
-  loop startBlock stack (t : ts)
-    | startsLayout ty    = toks ++ loop True                             stack'  ts
-    | Sym ParenL   <- ty = toks ++ loop False (Explicit (Sym ParenR)   : stack') ts
-    | Sym CurlyL   <- ty = toks ++ loop False (Explicit (Sym CurlyR)   : stack') ts
-    | Sym BracketL <- ty = toks ++ loop False (Explicit (Sym BracketR) : stack') ts
+  loop :: Bool -> Bool -> [Block] -> [Located Token] -> [Located Token]
+  loop afterDoc startBlock stack (t : ts)
+    | startsLayout ty    = toks ++ loop False True                             stack'  ts
+    | Sym ParenL   <- ty = toks ++ loop False False (Explicit (Sym ParenR)   : stack') ts
+    | Sym CurlyL   <- ty = toks ++ loop False False (Explicit (Sym CurlyR)   : stack') ts
+    | Sym BracketL <- ty = toks ++ loop False False (Explicit (Sym BracketR) : stack') ts
     | EOF          <- ty = toks
-    | otherwise          = toks ++ loop False                            stack'  ts
+    | White DocStr <- ty = toks ++ loop True  False                            stack'  ts
+    | otherwise          = toks ++ loop False False                            stack'  ts
 
     where
     ty  = tokenType (thing t)
     pos = srcRange t
 
-    (toks,offStack) = offsides startToks t stack
+    (toks,offStack)
+      | afterDoc  = ([t], stack)
+      | otherwise = offsides startToks t stack
 
     -- add any block start tokens, and push a level on the stack
     (startToks,stack')
@@ -251,7 +306,7 @@
       | startBlock = ( [ virt cfg (to pos) VCurlyL ], Virtual (col (from pos)) : offStack )
       | otherwise  = ( [], offStack )
 
-  loop _ _ [] = panic "[Lexer] layout" ["Missing EOF token"]
+  loop _ _ _ [] = panic "[Lexer] layout" ["Missing EOF token"]
 
 
   offsides :: [Located Token] -> Located Token -> [Block] -> ([Located Token], [Block])
@@ -299,31 +354,33 @@
 
 --------------------------------------------------------------------------------
 
-data Token    = Token { tokenType :: TokenT, tokenText :: String }
-                deriving Show
+data Token    = Token { tokenType :: TokenT, tokenText :: Text }
+                deriving (Show, Generic)
 
+instance NFData Token where rnf = genericRnf
+
 -- | Virtual tokens, inserted by layout processing.
 data TokenV   = VCurlyL| VCurlyR | VSemi
-                deriving (Eq,Show)
+                deriving (Eq,Show,Generic)
 
-data TokenW   = BlockComment | LineComment | Space
-                deriving (Eq,Show)
+instance NFData TokenV where rnf = genericRnf
 
+data TokenW   = BlockComment | LineComment | Space | DocStr
+                deriving (Eq,Show,Generic)
+
+instance NFData TokenW where rnf = genericRnf
+
 data TokenKW  = KW_Arith
               | KW_Bit
               | KW_Cmp
-              | KW_False
-              | KW_True
               | KW_else
               | KW_Eq
-              | KW_error
               | KW_extern
               | KW_fin
               | KW_if
               | KW_private
               | KW_include
               | KW_inf
-              | KW_join
               | KW_lg2
               | KW_lengthFromThen
               | KW_lengthFromThenTo
@@ -332,35 +389,33 @@
               | KW_module
               | KW_newtype
               | KW_pragma
-              | KW_pmult
-              | KW_pdiv
-              | KW_pmod
               | KW_property
-              | KW_random
-              | KW_reverse
-              | KW_split
-              | KW_splitAt
               | KW_then
-              | KW_transpose
               | KW_type
               | KW_where
               | KW_let
               | KW_x
-              | KW_zero
               | KW_import
               | KW_as
               | KW_hiding
-                deriving (Eq,Show)
+              | KW_infixl
+              | KW_infixr
+              | KW_infix
+              | KW_primitive
+                deriving (Eq,Show,Generic)
 
+instance NFData TokenKW where rnf = genericRnf
+
+-- | The named operators are a special case for parsing types, and 'Other' is
+-- used for all other cases that lexed as an operator.
 data TokenOp  = Plus | Minus | Mul | Div | Exp | Mod
-              | NotEqual | Equal | LessThan | GreaterThan | LEQ | GEQ
-              | EqualFun | NotEqualFun
-              | ShiftL | ShiftR | RotL | RotR
-              | Conj | Disj | Xor
-              | Complement
-              | Bang | BangBang | At | AtAt | Hash
-                deriving (Eq,Show)
+              | Equal | LEQ | GEQ
+              | Complement | Hash
+              | Other [String] String
+                deriving (Eq,Show,Generic)
 
+instance NFData TokenOp where rnf = genericRnf
+
 data TokenSym = Bar
               | ArrL | ArrR | FatArrR
               | Lambda
@@ -371,26 +426,29 @@
               | DotDot
               | DotDotDot
               | Colon
-              | ColonColon
               | BackTick
               | ParenL   | ParenR
               | BracketL | BracketR
               | CurlyL   | CurlyR
               | TriL     | TriR
               | Underscore
-                deriving (Eq,Show)
+                deriving (Eq,Show,Generic)
 
+instance NFData TokenSym where rnf = genericRnf
+
 data TokenErr = UnterminatedComment
               | UnterminatedString
               | UnterminatedChar
               | InvalidString
               | InvalidChar
               | LexicalError
-                deriving (Eq,Show)
+                deriving (Eq,Show,Generic)
 
+instance NFData TokenErr where rnf = genericRnf
+
 data TokenT   = Num Integer Int Int   -- ^ value, base, number of digits
               | ChrLit  Char          -- ^ character literal
-              | Ident String          -- ^ identifier
+              | Ident [String] String -- ^ (qualified) identifier
               | StrLit String         -- ^ string literal
               | KW    TokenKW         -- ^ keyword
               | Op    TokenOp         -- ^ operator
@@ -399,9 +457,57 @@
               | White TokenW          -- ^ white space token
               | Err   TokenErr        -- ^ error token
               | EOF
-                deriving (Eq,Show)
+                deriving (Eq,Show,Generic)
 
+instance NFData TokenT where rnf = genericRnf
+
 instance PP Token where
-  ppPrec _ (Token _ s) = text s
+  ppPrec _ (Token _ s) = text (T.unpack s)
 
 
+-- | Collapse characters into a single Word8, identifying ASCII, and classes of
+-- unicode.  This came from:
+--
+-- https://github.com/glguy/config-value/blob/master/src/Config/LexerUtils.hs
+--
+-- Which adapted:
+--
+-- https://github.com/ghc/ghc/blob/master/compiler/parser/Lexer.x
+byteForChar :: Char -> Word8
+byteForChar c
+  | c <= '\6' = non_graphic
+  | isAscii c = fromIntegral (ord c)
+  | otherwise = case generalCategory c of
+                  Char.LowercaseLetter       -> lower
+                  Char.OtherLetter           -> lower
+                  Char.UppercaseLetter       -> upper
+                  Char.TitlecaseLetter       -> upper
+                  Char.DecimalNumber         -> digit
+                  Char.OtherNumber           -> digit
+                  Char.ConnectorPunctuation  -> symbol
+                  Char.DashPunctuation       -> symbol
+                  Char.OtherPunctuation      -> symbol
+                  Char.MathSymbol            -> symbol
+                  Char.CurrencySymbol        -> symbol
+                  Char.ModifierSymbol        -> symbol
+                  Char.OtherSymbol           -> symbol
+                  Char.Space                 -> sp
+                  Char.ModifierLetter        -> other
+                  Char.NonSpacingMark        -> other
+                  Char.SpacingCombiningMark  -> other
+                  Char.EnclosingMark         -> other
+                  Char.LetterNumber          -> other
+                  Char.OpenPunctuation       -> other
+                  Char.ClosePunctuation      -> other
+                  Char.InitialQuote          -> other
+                  Char.FinalQuote            -> tick
+                  _                          -> non_graphic
+  where
+  non_graphic     = 0
+  upper           = 1
+  lower           = 2
+  digit           = 3
+  symbol          = 4
+  sp              = 5
+  other           = 6
+  tick            = 7
diff --git a/src/Cryptol/Parser/Name.hs b/src/Cryptol/Parser/Name.hs
new file mode 100644
--- /dev/null
+++ b/src/Cryptol/Parser/Name.hs
@@ -0,0 +1,78 @@
+-- |
+-- Module      :  $Header$
+-- Copyright   :  (c) 2015-2016 Galois, Inc.
+-- License     :  BSD3
+-- Maintainer  :  cryptol@galois.com
+-- Stability   :  provisional
+-- Portability :  portable
+
+{-# LANGUAGE DeriveGeneric #-}
+
+module Cryptol.Parser.Name where
+
+import Cryptol.Utils.Ident
+import Cryptol.Utils.PP
+import Cryptol.Utils.Panic (panic)
+
+import           Control.DeepSeq
+import qualified Data.Text as T
+import           GHC.Generics (Generic)
+
+
+-- Names -----------------------------------------------------------------------
+
+-- | Names that originate in the parser.
+data PName = UnQual !Ident
+             -- ^ Unqualified names like @x@, @Foo@, or @+@.
+           | Qual !ModName !Ident
+             -- ^ Qualified names like @Foo::bar@ or @module::!@.
+           | NewName !Pass !Int
+             -- ^ Fresh names generated by a pass.
+             deriving (Eq,Ord,Show,Generic)
+
+-- | Passes that can generate fresh names.
+data Pass = NoPat
+          | MonoValues
+            deriving (Eq,Ord,Show,Generic)
+
+instance NFData PName
+instance NFData Pass
+
+mkUnqual :: Ident -> PName
+mkUnqual  = UnQual
+
+mkQual :: ModName -> Ident -> PName
+mkQual  = Qual
+
+getModName :: PName -> Maybe ModName
+getModName (Qual ns _) = Just ns
+getModName _           = Nothing
+
+getIdent :: PName -> Ident
+getIdent (UnQual n)    = n
+getIdent (Qual _ n)    = n
+getIdent (NewName p i) = Ident False (T.pack ("__" ++ pass ++ show i))
+  where
+  pass = case p of
+           NoPat      -> "p"
+           MonoValues -> "mv"
+
+instance PP PName where
+  ppPrec _ = ppPrefixName
+
+instance PPName PName where
+  ppPrefixName n = optParens (isInfixIdent i) (pfx <> pp i)
+    where
+    i   = getIdent n
+    pfx = case getModName n of
+            Just ns -> pp ns <> text "::"
+            Nothing -> empty
+
+  ppInfixName n
+    | isInfixIdent i = pfx <> pp i
+    | otherwise      = panic "AST" [ "non-symbol infix name:" ++ show n ]
+    where
+    i   = getIdent n
+    pfx = case getModName n of
+            Just ns -> pp ns <> text "::"
+            Nothing -> empty
diff --git a/src/Cryptol/Parser/Names.hs b/src/Cryptol/Parser/Names.hs
--- a/src/Cryptol/Parser/Names.hs
+++ b/src/Cryptol/Parser/Names.hs
@@ -1,6 +1,6 @@
 -- |
 -- Module      :  $Header$
--- Copyright   :  (c) 2013-2015 Galois, Inc.
+-- Copyright   :  (c) 2013-2016 Galois, Inc.
 -- License     :  BSD3
 -- Maintainer  :  cryptol@galois.com
 -- Stability   :  provisional
@@ -18,7 +18,7 @@
 import           Data.Foldable (fold)
 
 
-modExports :: Module -> ExportSpec
+modExports :: Ord name => Module name -> ExportSpec name
 modExports m = fold (concat [ exportedNames d | d <- mDecls m ])
   where
   names by td = [ td { tlValue = thing n } | n <- fst (by (tlValue td)) ]
@@ -29,23 +29,24 @@
   exportedNames (Include {})  = []
 
 -- | The names defined by a newtype.
-tnamesNT :: Newtype -> ([Located QName], ())
+tnamesNT :: Newtype name -> ([Located name], ())
 tnamesNT x = ([ nName x ], ())
 
 -- | The names defined and used by a group of mutually recursive declarations.
-namesDs :: [Decl] -> ([Located QName], Set QName)
+namesDs :: Ord name => [Decl name] -> ([Located name], Set name)
 namesDs ds = (defs, boundNames defs (Set.unions frees))
   where
   defs          = concat defss
   (defss,frees) = unzip (map namesD ds)
 
 -- | The names defined and used by a single declarations.
-namesD :: Decl -> ([Located QName], Set QName)
+namesD :: Ord name => Decl name -> ([Located name], Set name)
 namesD decl =
   case decl of
     DBind b       -> namesB b
     DPatBind p e  -> (namesP p, namesE e)
     DSignature {} -> ([],Set.empty)
+    DFixity{}     -> ([],Set.empty)
     DPragma {}    -> ([],Set.empty)
     DType {}      -> ([],Set.empty)
     DLocated d _  -> namesD d
@@ -54,30 +55,35 @@
 -- that they cannot be duplicated in a file. For example, it is fine
 -- to use @x@ on the RHS of two bindings, but not on the LHS of two
 -- type signatures.
-allNamesD :: Decl -> [Located QName]
+allNamesD :: Ord name => Decl name -> [Located name]
 allNamesD decl =
   case decl of
     DBind b         -> fst (namesB b)
     DPatBind p _    -> namesP p
     DSignature ns _ -> ns
+    DFixity _ ns    -> ns
     DPragma ns _    -> ns
     DType ts        -> [tsName ts]
     DLocated d _    -> allNamesD d
 
-tsName :: TySyn -> Located QName
+tsName :: TySyn name -> Located name
 tsName (TySyn lqn _ _) = lqn
 
 -- | The names defined and used by a single binding.
-namesB :: Bind -> ([Located QName], Set QName)
-namesB b = ([bName b], boundNames (namesPs (bParams b)) (namesE (bDef b)))
+namesB :: Ord name => Bind name -> ([Located name], Set name)
+namesB b = ([bName b], boundNames (namesPs (bParams b)) (namesDef (thing (bDef b))))
 
 
+namesDef :: Ord name => BindDef name -> Set name
+namesDef DPrim     = Set.empty
+namesDef (DExpr e) = namesE e
+
+
 -- | The names used by an expression.
-namesE :: Expr -> Set QName
+namesE :: Ord name => Expr name -> Set name
 namesE expr =
   case expr of
     EVar x        -> Set.singleton x
-    ECon _        -> Set.empty
     ELit _        -> Set.empty
     ETuple es     -> Set.unions (map namesE es)
     ERecord fs    -> Set.unions (map (namesE . value) fs)
@@ -98,15 +104,18 @@
     EFun ps e     -> boundNames (namesPs ps) (namesE e)
     ELocated e _  -> namesE e
 
+    EParens e     -> namesE e
+    EInfix a o _ b-> Set.insert (thing o) (Set.union (namesE a) (namesE b))
+
 -- | The names defined by a group of patterns.
-namesPs :: [Pattern] -> [Located QName]
+namesPs :: [Pattern name] -> [Located name]
 namesPs = concatMap namesP
 
 -- | The names defined by a pattern.  These will always be unqualified names.
-namesP :: Pattern -> [Located QName]
+namesP :: Pattern name -> [Located name]
 namesP pat =
   case pat of
-    PVar x        -> [fmap mkUnqual x]
+    PVar x        -> [x]
     PWild         -> []
     PTuple ps     -> namesPs ps
     PRecord fs    -> namesPs (map value fs)
@@ -116,12 +125,12 @@
     PLocated p _  -> namesP p
 
 -- | The names defined and used by a match.
-namesM :: Match -> ([Located QName], Set QName)
+namesM :: Ord name => Match name -> ([Located name], Set name)
 namesM (Match p e)  = (namesP p, namesE e)
 namesM (MatchLet b) = namesB b
 
 -- | The names defined and used by an arm of alist comprehension.
-namesArm :: [Match] -> ([Located QName], Set QName)
+namesArm :: Ord name => [Match name] -> ([Located name], Set name)
 namesArm = foldr combine ([],Set.empty) . map namesM
   where combine (ds1,fs1) (ds2,fs2) =
           ( filter ((`notElem` map thing ds2) . thing) ds1 ++ ds2
@@ -129,13 +138,13 @@
           )
 
 -- | Remove some defined variables from a set of free variables.
-boundNames :: [Located QName] -> Set QName -> Set QName
+boundNames :: Ord name => [Located name] -> Set name -> Set name
 boundNames bs xs = Set.difference xs (Set.fromList (map thing bs))
 
 
 -- | Given the set of type variables that are in scope,
 -- compute the type synonyms used by a type.
-namesT :: Set QName -> Type -> Set QName
+namesT :: Ord name => Set name -> Type name -> Set name
 namesT vs = go
   where
   go ty =
@@ -155,39 +164,46 @@
                     -> Set.empty
       TUser x ts    -> Set.insert x (Set.unions (map go ts))
 
+      TParens t     -> namesT vs t
+      TInfix a _ _ b-> Set.union (namesT vs a) (namesT vs b)
 
+
 -- | The type names defined and used by a group of mutually recursive declarations.
-tnamesDs :: [Decl] -> ([Located QName], Set QName)
+tnamesDs :: Ord name => [Decl name] -> ([Located name], Set name)
 tnamesDs ds = (defs, boundNames defs (Set.unions frees))
   where
   defs          = concat defss
   (defss,frees) = unzip (map tnamesD ds)
 
 -- | The type names defined and used by a single declaration.
-tnamesD :: Decl -> ([Located QName], Set QName)
+tnamesD :: Ord name => Decl name -> ([Located name], Set name)
 tnamesD decl =
   case decl of
     DSignature _ s       -> ([], tnamesS s)
+    DFixity {}           -> ([], Set.empty)
     DPragma {}           -> ([], Set.empty)
     DBind b              -> ([], tnamesB b)
     DPatBind _ e         -> ([], tnamesE e)
     DLocated d _         -> tnamesD d
-    DType (TySyn n ps t) -> ([n], Set.difference (tnamesT t) (Set.fromList (map tpQName ps)))
+    DType (TySyn n ps t) -> ([n], Set.difference (tnamesT t) (Set.fromList (map tpName ps)))
 
 -- | The type names used by a single binding.
-tnamesB :: Bind -> Set QName
+tnamesB :: Ord name => Bind name -> Set name
 tnamesB b = Set.unions [setS, setP, setE]
   where
     setS = maybe Set.empty tnamesS (bSignature b)
     setP = Set.unions (map tnamesP (bParams b))
-    setE = tnamesE (bDef b)
+    setE = tnamesDef (thing (bDef b))
 
+tnamesDef :: Ord name => BindDef name -> Set name
+tnamesDef DPrim     = Set.empty
+tnamesDef (DExpr e) = tnamesE e
+
 -- | The type names used by an expression.
-tnamesE :: Expr -> Set QName
+tnamesE :: Ord name => Expr name -> Set name
 tnamesE expr =
   case expr of
     EVar _        -> Set.empty
-    ECon _        -> Set.empty
     ELit _        -> Set.empty
     ETuple es     -> Set.unions (map tnamesE es)
     ERecord fs    -> Set.unions (map (tnamesE . value) fs)
@@ -207,12 +223,15 @@
     EFun ps e     -> Set.union (Set.unions (map tnamesP ps)) (tnamesE e)
     ELocated e _  -> tnamesE e
 
-tnamesTI :: TypeInst -> Set QName
+    EParens e     -> tnamesE e
+    EInfix a _ _ b-> Set.union (tnamesE a) (tnamesE b)
+
+tnamesTI :: Ord name => TypeInst name -> Set name
 tnamesTI (NamedInst f)  = tnamesT (value f)
 tnamesTI (PosInst t)    = tnamesT t
 
 -- | The type names used by a pattern.
-tnamesP :: Pattern -> Set QName
+tnamesP :: Ord name => Pattern name -> Set name
 tnamesP pat =
   case pat of
     PVar _        -> Set.empty
@@ -225,18 +244,18 @@
     PLocated p _  -> tnamesP p
 
 -- | The type names used by a match.
-tnamesM :: Match -> Set QName
+tnamesM :: Ord name => Match name -> Set name
 tnamesM (Match p e)  = Set.union (tnamesP p) (tnamesE e)
 tnamesM (MatchLet b) = tnamesB b
 
 -- | The type names used by a type schema.
-tnamesS :: Schema -> Set QName
+tnamesS :: Ord name => Schema name -> Set name
 tnamesS (Forall params props ty _) =
     Set.difference (Set.union (Set.unions (map tnamesC props)) (tnamesT ty))
-        (Set.fromList (map tpQName params))
+        (Set.fromList (map tpName params))
 
 -- | The type names used by a prop.
-tnamesC :: Prop -> Set QName
+tnamesC :: Ord name => Prop name -> Set name
 tnamesC prop =
   case prop of
     CFin t       -> tnamesT t
@@ -245,9 +264,10 @@
     CArith t     -> tnamesT t
     CCmp t       -> tnamesT t
     CLocated p _ -> tnamesC p
+    CType t      -> tnamesT t
 
 -- | Compute the type synonyms/type variables used by a type.
-tnamesT :: Type -> Set QName
+tnamesT :: Ord name => Type name -> Set name
 tnamesT ty =
   case ty of
     TWild         -> Set.empty
@@ -262,3 +282,5 @@
     TRecord fs    -> Set.unions (map (tnamesT . value) fs)
     TLocated t _  -> tnamesT t
     TUser x ts    -> Set.insert x (Set.unions (map tnamesT ts))
+    TParens t     -> tnamesT t
+    TInfix a _ _ c-> Set.union (tnamesT a) (tnamesT c)
diff --git a/src/Cryptol/Parser/NoInclude.hs b/src/Cryptol/Parser/NoInclude.hs
--- a/src/Cryptol/Parser/NoInclude.hs
+++ b/src/Cryptol/Parser/NoInclude.hs
@@ -1,15 +1,21 @@
 -- |
 -- Module      :  $Header$
--- Copyright   :  (c) 2013-2015 Galois, Inc.
+-- Copyright   :  (c) 2013-2016 Galois, Inc.
 -- License     :  BSD3
 -- Maintainer  :  cryptol@galois.com
 -- Stability   :  provisional
 -- Portability :  portable
 
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE CPP #-}
 
+#ifndef MIN_VERSION_directory
+#define MIN_VERSION_directory(a,b,c) 0
+#endif
+
 module Cryptol.Parser.NoInclude
-  ( removeIncludes
-  , removeIncludesModule
+  ( removeIncludesModule
   , IncludeError(..), ppIncludeError
   ) where
 
@@ -18,26 +24,42 @@
 import Cryptol.Parser.LexerUtils (Config(..),defaultConfig)
 import Cryptol.Parser.ParserUtils
 import Cryptol.Utils.PP
+import Cryptol.Parser.Unlit (guessPreProc)
 import qualified Control.Applicative as A
+import           Data.Text.Lazy (Text)
+import qualified Data.Text.Lazy.IO as T
 
 import Data.Either (partitionEithers)
 import MonadLib
 import qualified Control.Exception as X
+import           System.FilePath (takeDirectory,(</>),isAbsolute)
 
+import GHC.Generics (Generic)
+import Control.DeepSeq.Generics
 
-removeIncludes :: Program -> IO (Either [IncludeError] Program)
-removeIncludes prog = runNoIncM (noIncludeProgram prog)
+import System.Directory (getCurrentDirectory)
+import System.FilePath (isRelative, normalise)
 
-removeIncludesModule :: Module -> IO (Either [IncludeError] Module)
-removeIncludesModule m = runNoIncM (noIncludeModule m)
+-- from the source of directory-1.2.2.1; included to maintain
+-- backwards compatibility
+makeAbsolute :: FilePath -> IO FilePath
+makeAbsolute = fmap normalise . absolutize
+  where absolutize path
+          | isRelative path = fmap (</> path) getCurrentDirectory
+          | otherwise       = return path
 
+removeIncludesModule :: FilePath -> Module PName -> IO (Either [IncludeError] (Module PName))
+removeIncludesModule modPath m = runNoIncM modPath (noIncludeModule m)
 
+
 data IncludeError
   = IncludeFailed (Located FilePath)
   | IncludeParseError ParseError
   | IncludeCycle [Located FilePath]
-    deriving (Show)
+    deriving (Show,Generic)
 
+instance NFData IncludeError where rnf = genericRnf
+
 ppIncludeError :: IncludeError -> Doc
 ppIncludeError ie = case ie of
 
@@ -53,14 +75,44 @@
 
 
 newtype NoIncM a = M
-  { unM :: ReaderT [Located FilePath] (ExceptionT [IncludeError] IO) a }
+  { unM :: ReaderT Env (ExceptionT [IncludeError] IO) a }
 
-runNoIncM :: NoIncM a -> IO (Either [IncludeError] a)
-runNoIncM m = runM (unM m) []
+data Env = Env { envSeen    :: [Located FilePath]
+                 -- ^ Files that have been loaded
+               , envIncPath :: FilePath
+                 -- ^ The path that includes are relative to
+               }
 
+runNoIncM :: FilePath -> NoIncM a -> IO (Either [IncludeError] a)
+runNoIncM sourcePath m =
+  do incPath <- getIncPath sourcePath
+     runM (unM m) Env { envSeen = [], envIncPath = incPath }
+
 tryNoIncM :: NoIncM a -> NoIncM (Either [IncludeError] a)
 tryNoIncM m = M (try (unM m))
 
+-- | Get the absolute directory name of a file that contains cryptol source.
+getIncPath :: FilePath -> IO FilePath
+getIncPath file = makeAbsolute (takeDirectory file)
+
+-- | Run a 'NoIncM' action with a different include path.  The argument is
+-- expected to be the path of a file that contains cryptol source, and will be
+-- adjusted with getIncPath.
+withIncPath :: FilePath -> NoIncM a -> NoIncM a
+withIncPath path (M body) = M $
+  do incPath <- inBase (getIncPath path)
+     env     <- ask
+     local env { envIncPath = incPath } body
+
+-- | Adjust an included file with the current include path.
+fromIncPath :: FilePath -> NoIncM FilePath
+fromIncPath path
+  | isAbsolute path = return path
+  | otherwise       = M $
+    do Env { .. } <- ask
+       return (envIncPath </> path)
+
+
 instance Functor NoIncM where
   fmap = liftM
 
@@ -82,10 +134,10 @@
 -- raised.
 pushPath :: Located FilePath -> NoIncM a -> NoIncM a
 pushPath path m = M $ do
-  seen <- ask
+  Env { .. } <- ask
   let alreadyIncluded l = thing path == thing l
-  when (any alreadyIncluded seen) (raise [IncludeCycle seen])
-  local (path:seen) (unM m)
+  when (any alreadyIncluded envSeen) (raise [IncludeCycle envSeen])
+  local Env { envSeen = path:envSeen, .. } (unM m)
 
 -- | Lift an IO operation, with a way to handle the exception that it might
 -- throw.
@@ -107,19 +159,19 @@
   return rs
 
 -- | Remove includes from a module.
-noIncludeModule :: Module -> NoIncM Module
+noIncludeModule :: Module PName -> NoIncM (Module PName)
 noIncludeModule m = update `fmap` collectErrors noIncTopDecl (mDecls m)
   where
   update tds = m { mDecls = concat tds }
 
 -- | Remove includes from a program.
-noIncludeProgram :: Program -> NoIncM Program
+noIncludeProgram :: Program PName -> NoIncM (Program PName)
 noIncludeProgram (Program tds) =
   (Program . concat) `fmap` collectErrors noIncTopDecl tds
 
 -- | Substitute top-level includes with the declarations from the files they
 -- reference.
-noIncTopDecl :: TopDecl -> NoIncM [TopDecl]
+noIncTopDecl :: TopDecl PName -> NoIncM [TopDecl PName]
 noIncTopDecl td = case td of
   Decl _     -> return [td]
   TDNewtype _-> return [td]
@@ -127,21 +179,22 @@
 
 -- | Resolve the file referenced by a include into a list of top-level
 -- declarations.
-resolveInclude :: Located FilePath -> NoIncM [TopDecl]
+resolveInclude :: Located FilePath -> NoIncM [TopDecl PName]
 resolveInclude lf = pushPath lf $ do
   source <- readInclude lf
-  case parseProgramWith (defaultConfig { cfgSource = thing lf }) source of
+  case parseProgramWith (defaultConfig { cfgSource = thing lf, cfgPreProc = guessPreProc (thing lf) }) source of
 
     Right prog -> do
-      Program ds <- noIncludeProgram prog
+      Program ds <- withIncPath (thing lf) (noIncludeProgram prog)
       return ds
 
     Left err -> M (raise [IncludeParseError err])
 
 -- | Read a file referenced by an include.
-readInclude :: Located FilePath -> NoIncM String
+readInclude :: Located FilePath -> NoIncM Text
 readInclude path = do
-  source <- readFile (thing path) `failsWith` handler
+  file   <- fromIncPath (thing path)
+  source <- T.readFile file `failsWith` handler
   return source
   where
   handler :: X.IOException -> NoIncM a
diff --git a/src/Cryptol/Parser/NoPat.hs b/src/Cryptol/Parser/NoPat.hs
--- a/src/Cryptol/Parser/NoPat.hs
+++ b/src/Cryptol/Parser/NoPat.hs
@@ -1,6 +1,6 @@
 -- |
 -- Module      :  $Header$
--- Copyright   :  (c) 2013-2015 Galois, Inc.
+-- Copyright   :  (c) 2013-2016 Galois, Inc.
 -- License     :  BSD3
 -- Maintainer  :  cryptol@galois.com
 -- Stability   :  provisional
@@ -10,49 +10,56 @@
 -- patterns.  It also eliminates pattern bindings by de-sugaring them
 -- into `Bind`.  Furthermore, here we associate signatures and pragmas
 -- with the names to which they belong.
+{-# LANGUAGE PatternGuards #-}
 {-# LANGUAGE FlexibleInstances #-}
 {-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE CPP #-}
+{-# LANGUAGE OverloadedStrings #-}
 module Cryptol.Parser.NoPat (RemovePatterns(..),Error(..)) where
 
-import Cryptol.Prims.Syntax
 import Cryptol.Parser.AST
-import Cryptol.Parser.Position(Range(..),start)
+import Cryptol.Parser.Position(Range(..),emptyRange,start,at)
+import Cryptol.Parser.Names (namesP)
 import Cryptol.Utils.PP
 import Cryptol.Utils.Panic(panic)
 
-import           MonadLib
+import           MonadLib hiding (mapM)
 import           Data.Maybe(maybeToList)
 import           Data.Either(partitionEithers)
 import qualified Data.Map as Map
 
-#if __GLASGOW_HASKELL__ < 710
-import           Control.Applicative(Applicative(..),(<$>))
-import           Data.Traversable(traverse)
-#endif
+import GHC.Generics (Generic)
+import Control.DeepSeq.Generics
 
+import Prelude ()
+import Prelude.Compat
+
 class RemovePatterns t where
   -- | Eliminate all patterns in a program.
   removePatterns :: t -> (t, [Error])
 
-instance RemovePatterns Program where
+instance RemovePatterns (Program PName) where
   removePatterns p = runNoPatM (noPatProg p)
 
-instance RemovePatterns Expr where
+instance RemovePatterns (Expr PName) where
   removePatterns e = runNoPatM (noPatE e)
 
-instance RemovePatterns Module where
+instance RemovePatterns (Module PName) where
   removePatterns m = runNoPatM (noPatModule m)
 
-instance RemovePatterns [Decl] where
+instance RemovePatterns [Decl PName] where
   removePatterns ds = runNoPatM (noPatDs ds)
 
-simpleBind :: Located QName -> Expr -> Bind
-simpleBind x e = Bind { bName = x, bParams = [], bDef = e
+simpleBind :: Located PName -> Expr PName -> Bind PName
+simpleBind x e = Bind { bName = x, bParams = []
+                      , bDef = at e (Located emptyRange (DExpr e))
                       , bSignature = Nothing, bPragmas = []
-                      , bMono = True
+                      , bMono = True, bInfix = False, bFixity = Nothing
+                      , bDoc = Nothing
                       }
 
-sel :: Pattern -> QName -> Selector -> Bind
+sel :: Pattern PName -> PName -> Selector -> Bind PName
 sel p x s = let (a,ts) = splitSimpleP p
             in simpleBind a (foldl ETyped (ESel (EVar x) s) ts)
 
@@ -60,7 +67,7 @@
 -- Simple patterns may only contain variables and type annotations.
 
 -- XXX: We can replace the types in the selcetors with annotations on the bindings.
-noPat :: Pattern -> NoPatM (Pattern, [Bind])
+noPat :: Pattern PName -> NoPatM (Pattern PName, [Bind PName])
 noPat pat =
   case pat of
     PVar x -> return (PVar x, [])
@@ -74,10 +81,9 @@
       do (as,dss) <- unzip `fmap` mapM noPat ps
          x <- newName
          r <- getRange
-         let qx       = mkUnqual x
          let len      = length ps
              ty       = TTuple (replicate len TWild)
-             getN a n = sel a qx (TupleSel n (Just len))
+             getN a n = sel a x (TupleSel n (Just len))
          return (pTy r x ty, zipWith getN as [0..] ++ concat dss)
 
     PList [] ->
@@ -89,20 +95,18 @@
       do (as,dss) <- unzip `fmap` mapM noPat ps
          x <- newName
          r <- getRange
-         let qx       = mkUnqual x
-             len      = length ps
+         let len      = length ps
              ty       = TSeq (TNum (fromIntegral len)) TWild
-             getN a n = sel a qx (ListSel n (Just len))
+             getN a n = sel a x (ListSel n (Just len))
          return (pTy r x ty, zipWith getN as [0..] ++ concat dss)
 
     PRecord fs ->
       do (as,dss) <- unzip `fmap` mapM (noPat . value) fs
          x <- newName
          r <- getRange
-         let qx       = mkUnqual x
-             shape    = map (thing . name) fs
+         let shape    = map (thing . name) fs
              ty       = TRecord (map (fmap (\_ -> TWild)) fs)
-             getN a n = sel a qx (RecordSel n (Just shape))
+             getN a n = sel a x (RecordSel n (Just shape))
          return (pTy r x ty, zipWith getN as shape ++ concat dss)
 
     PTyped p t ->
@@ -116,11 +120,10 @@
          x <- newName
          tmp <- newName
          r <- getRange
-         let qx   = mkUnqual x
-             qtmp = mkUnqual tmp
-             bTmp = simpleBind (Located r qtmp) (EApp (ECon ECSplitAt) (EVar qx))
-             b1   = sel a1 qtmp (TupleSel 0 (Just 2))
-             b2   = sel a2 qtmp (TupleSel 1 (Just 2))
+         let prim = EVar (mkUnqual (mkIdent "splitAt"))
+             bTmp = simpleBind (Located r tmp) (EApp prim (EVar x))
+             b1   = sel a1 tmp (TupleSel 0 (Just 2))
+             b2   = sel a2 tmp (TupleSel 1 (Just 2))
          return (pVar r x, bTmp : b1 : b2 : ds1 ++ ds2)
 
     PLocated p r1 -> inRange r1 (noPat p)
@@ -130,8 +133,8 @@
   pTy  r x t = PTyped (PVar (Located r x)) t
 
 
-splitSimpleP :: Pattern -> (Located QName, [Type])
-splitSimpleP (PVar x)     = (fmap mkUnqual x, [])
+splitSimpleP :: Pattern PName -> (Located PName, [Type PName])
+splitSimpleP (PVar x)     = (x, [])
 splitSimpleP (PTyped p t) = let (x,ts) = splitSimpleP p
                             in (x, t:ts)
 splitSimpleP p            = panic "splitSimpleP"
@@ -139,11 +142,10 @@
 
 --------------------------------------------------------------------------------
 
-noPatE :: Expr -> NoPatM Expr
+noPatE :: Expr PName -> NoPatM (Expr PName)
 noPatE expr =
   case expr of
     EVar {}       -> return expr
-    ECon {}       -> return expr
     ELit {}       -> return expr
     ETuple es     -> ETuple  <$> mapM noPatE es
     ERecord es    -> ERecord <$> mapM noPatF es
@@ -162,10 +164,13 @@
                         return (EFun ps1 e1)
     ELocated e r1 -> ELocated <$> inRange r1 (noPatE e) <*> return r1
 
+    EParens e     -> EParens <$> noPatE e
+    EInfix x y f z-> EInfix  <$> noPatE x <*> pure y <*> pure f <*> noPatE z
+
   where noPatF x = do e <- noPatE (value x)
                       return x { value = e }
 
-noPatFun :: [Pattern] -> Expr -> NoPatM ([Pattern], Expr)
+noPatFun :: [Pattern PName] -> Expr PName -> NoPatM ([Pattern PName], Expr PName)
 noPatFun ps e =
   do (xs,bs) <- unzip <$> mapM noPat ps
      e1 <- noPatE e
@@ -175,26 +180,34 @@
      return (xs, body)
 
 
-noPatArm :: [Match] -> NoPatM [Match]
+noPatArm :: [Match PName] -> NoPatM [Match PName]
 noPatArm ms = concat <$> mapM noPatM ms
 
-noPatM :: Match -> NoPatM [Match]
+noPatM :: Match PName -> NoPatM [Match PName]
 noPatM (Match p e) =
   do (x,bs) <- noPat p
      e1     <- noPatE e
      return (Match x e1 : map MatchLet bs)
 noPatM (MatchLet b) = (return . MatchLet) <$> noMatchB b
 
-noMatchB :: Bind -> NoPatM Bind
+noMatchB :: Bind PName -> NoPatM (Bind PName)
 noMatchB b =
-  do (ps,e) <- noPatFun (bParams b) (bDef b)
-     return b { bParams = ps, bDef = e }
+  case thing (bDef b) of
 
-noMatchD :: Decl -> NoPatM [Decl]
+    DPrim | null (bParams b) -> return b
+          | otherwise        -> panic "NoPat" [ "noMatchB: primitive with params"
+                                              , show b ]
+
+    DExpr e ->
+      do (ps,e') <- noPatFun (bParams b) e
+         return b { bParams = ps, bDef = DExpr e' <$ bDef b }
+
+noMatchD :: Decl PName -> NoPatM [Decl PName]
 noMatchD decl =
   case decl of
     DSignature {}   -> return [decl]
     DPragma {}      -> return [decl]
+    DFixity{}       -> return [decl]
 
     DBind b         -> do b1 <- noMatchB b
                           return [DBind b1]
@@ -205,22 +218,27 @@
                           let e2 = foldl ETyped e1 ts
                           return $ DBind Bind { bName = x
                                               , bParams = []
-                                              , bDef = e2
+                                              , bDef = at e (Located emptyRange (DExpr e2))
                                               , bSignature = Nothing
                                               , bPragmas = []
                                               , bMono = False
+                                              , bInfix = False
+                                              , bFixity = Nothing
+                                              , bDoc = Nothing
                                               } : map DBind bs
     DType {}        -> return [decl]
 
     DLocated d r1   -> do bs <- inRange r1 $ noMatchD d
                           return $ map (`DLocated` r1) bs
 
-noPatDs :: [Decl] -> NoPatM [Decl]
+noPatDs :: [Decl PName] -> NoPatM [Decl PName]
 noPatDs ds =
   do ds1 <- concat <$> mapM noMatchD ds
      let pragmaMap = Map.fromListWith (++) $ concatMap toPragma ds1
          sigMap    = Map.fromListWith (++) $ concatMap toSig ds1
-     (ds2, (pMap,sMap)) <- runStateT (pragmaMap, sigMap) $ annotDs ds1
+         fixMap    = Map.fromListWith (++) $ concatMap toFixity ds1
+     (ds2, (pMap,sMap,fMap,_)) <- runStateT (pragmaMap, sigMap, fixMap, Map.empty)
+                                            (annotDs ds1)
 
      forM_ (Map.toList pMap) $ \(n,ps) ->
        forM_ ps $ \p -> recordError $ PragmaNoBind (p { thing = n }) (thing p)
@@ -230,18 +248,24 @@
           forM_ ss $ \s -> recordError $ SignatureNoBind (s { thing = n })
                                                          (thing s)
 
+     forM_ (Map.toList fMap) $ \(n,fs) ->
+       forM_ fs $ \f -> recordError $ FixityNoBind f { thing = n }
+
      return ds2
 
-noPatTopDs :: [TopLevel Decl] -> NoPatM [TopLevel Decl]
+noPatTopDs :: [TopLevel (Decl PName)] -> NoPatM [TopLevel (Decl PName)]
 noPatTopDs tds =
   do noPatGroups <- mapM (noMatchD . tlValue) tds
 
      let allDecls  = concat noPatGroups
          pragmaMap = Map.fromListWith (++) $ concatMap toPragma allDecls
          sigMap    = Map.fromListWith (++) $ concatMap toSig    allDecls
+         fixMap    = Map.fromListWith (++) $ concatMap toFixity allDecls
+         docMap    = Map.fromListWith (++) $ concatMap toDocs   tds
 
      let exportGroups = zipWith (\ td ds -> td { tlValue = ds }) tds noPatGroups
-     (tds', (pMap,sMap)) <- runStateT (pragmaMap,sigMap) (annotTopDs exportGroups)
+     (tds', (pMap,sMap,fMap,_)) <- runStateT (pragmaMap,sigMap,fixMap,docMap)
+                                             (annotTopDs exportGroups)
 
      forM_ (Map.toList pMap) $ \(n,ps) ->
        forM_ ps $ \p -> recordError $ PragmaNoBind (p { thing = n }) (thing p)
@@ -251,10 +275,13 @@
           forM_ ss $ \s -> recordError $ SignatureNoBind (s { thing = n })
                                                          (thing s)
 
+     forM_ (Map.toList fMap) $ \(n,fs) ->
+       forM_ fs $ \f -> recordError $ FixityNoBind f { thing = n }
+
      return tds'
 
 
-noPatProg :: Program -> NoPatM Program
+noPatProg :: Program PName -> NoPatM (Program PName)
 noPatProg (Program topDs) =
   do let (ds, others) = partitionEithers (map isDecl topDs)
      ds1 <- noPatTopDs ds
@@ -264,7 +291,7 @@
   isDecl (Decl d) = Left d
   isDecl d        = Right d
 
-noPatModule :: Module -> NoPatM Module
+noPatModule :: Module PName -> NoPatM (Module PName)
 noPatModule m =
   do let (ds, others) = partitionEithers (map isDecl (mDecls m))
      ds1 <- noPatTopDs ds
@@ -277,8 +304,10 @@
 
 --------------------------------------------------------------------------------
 
-type AnnotMap = ( Map.Map QName [Located Pragma]
-                , Map.Map QName [Located Schema]
+type AnnotMap = ( Map.Map PName [Located  Pragma       ]
+                , Map.Map PName [Located (Schema PName)]
+                , Map.Map PName [Located  Fixity       ]
+                , Map.Map PName [Located  String       ]
                 )
 
 -- | Add annotations to exported declaration groups.
@@ -287,7 +316,8 @@
 -- export specifications, this will favor the specification of the binding.
 -- This is most likely the intended behavior, so it's probably fine, but it does
 -- smell a bit.
-annotTopDs :: [TopLevel [Decl]] -> StateT AnnotMap NoPatM [TopLevel Decl]
+annotTopDs :: [TopLevel [Decl PName]]
+           -> StateT AnnotMap NoPatM [TopLevel (Decl PName)]
 annotTopDs tds =
   case tds of
 
@@ -302,7 +332,7 @@
 
 
 -- | Add annotations, keeping track of which annotation are not yet used up.
-annotDs :: [Decl] -> StateT AnnotMap NoPatM [Decl]
+annotDs :: [Decl PName] -> StateT AnnotMap NoPatM [Decl PName]
 annotDs (d : ds) =
   do ignore <- runExceptionT (annotD d)
      case ignore of
@@ -312,66 +342,113 @@
 
 -- | Add annotations, keeping track of which annotation are not yet used up.
 -- The exception indicates which declarations are no longer needed.
-annotD :: Decl -> ExceptionT () (StateT AnnotMap NoPatM) Decl
+annotD :: Decl PName -> ExceptionT () (StateT AnnotMap NoPatM) (Decl PName)
 annotD decl =
   case decl of
     DBind b       -> DBind <$> lift (annotB b)
     DSignature {} -> raise ()
+    DFixity{}     -> raise ()
     DPragma {}    -> raise ()
     DPatBind {}   -> raise ()
     DType {}      -> return decl
     DLocated d r  -> (`DLocated` r) <$> annotD d
 
 -- | Add pragma/signature annotations to a binding.
-annotB :: Bind -> StateT AnnotMap NoPatM Bind
+annotB :: Bind PName -> StateT AnnotMap NoPatM (Bind PName)
 annotB Bind { .. } =
-  do (ps,ss) <- get
-     let name = thing bName
-     case ( Map.updateLookupWithKey (\_ _ -> Nothing) name ps
-          , Map.updateLookupWithKey (\_ _ -> Nothing) name ss
+  do (ps,ss,fs,ds) <- get
+     let name       = thing bName
+         remove _ _ = Nothing
+     case ( Map.updateLookupWithKey remove name ps
+          , Map.updateLookupWithKey remove name ss
+          , Map.updateLookupWithKey remove name fs
+          , Map.updateLookupWithKey remove name ds
           ) of
-           ( (thisPs, pragmas1) , (thisSigs, sigs1)) ->
+           ( (thisPs, pragmas1), (thisSigs, sigs1), (thisFixes, fixes1), (thisDocs, docs1)) ->
                 do s <- lift $ checkSigs name (jn thisSigs)
-                   set (pragmas1,sigs1)
+                   f <- lift $ checkFixs name (jn thisFixes)
+                   d <- lift $ checkDocs name (jn thisDocs)
+                   set (pragmas1,sigs1,fixes1,docs1)
                    return Bind { bSignature = s
                                , bPragmas = map thing (jn thisPs) ++ bPragmas
+                               , bFixity = f
+                               , bDoc = d
                                , ..
                                }
   where jn x = concat (maybeToList x)
 
 -- | Check for multiple signatures.
-checkSigs :: QName -> [Located Schema] -> NoPatM (Maybe Schema)
+checkSigs :: PName -> [Located (Schema PName)] -> NoPatM (Maybe (Schema PName))
 checkSigs _ []             = return Nothing
 checkSigs _ [s]            = return (Just (thing s))
 checkSigs f xs@(s : _ : _) = do recordError $ MultipleSignatures f xs
                                 return (Just (thing s))
 
+checkFixs :: PName -> [Located Fixity] -> NoPatM (Maybe Fixity)
+checkFixs _ []       = return Nothing
+checkFixs _ [f]      = return (Just (thing f))
+checkFixs f fs@(x:_) = do recordError $ MultipleFixities f $ map srcRange fs
+                          return (Just (thing x))
 
+
+checkDocs :: PName -> [Located String] -> NoPatM (Maybe String)
+checkDocs _ []       = return Nothing
+checkDocs _ [d]      = return (Just (thing d))
+checkDocs f ds@(d:_) = do recordError $ MultipleDocs f (map srcRange ds)
+                          return (Just (thing d))
+
+
 -- | Does this declaration provide some signatures?
-toSig :: Decl -> [(QName, [Located Schema])]
+toSig :: Decl PName -> [(PName, [Located (Schema PName)])]
 toSig (DLocated d _)      = toSig d
 toSig (DSignature xs s)   = [ (thing x,[Located (srcRange x) s]) | x <- xs ]
 toSig _                   = []
 
 -- | Does this declaration provide some signatures?
-toPragma :: Decl -> [(QName, [Located Pragma])]
+toPragma :: Decl PName -> [(PName, [Located Pragma])]
 toPragma (DLocated d _)   = toPragma d
 toPragma (DPragma xs s)   = [ (thing x,[Located (srcRange x) s]) | x <- xs ]
 toPragma _                = []
 
+-- | Does this declaration provide fixity information?
+toFixity :: Decl PName -> [(PName, [Located Fixity])]
+toFixity (DFixity f ns) = [ (thing n, [Located (srcRange n) f]) | n <- ns ]
+toFixity _              = []
 
+-- | Does this top-level declaration provide a documentation string?
+toDocs :: TopLevel (Decl PName) -> [(PName, [Located String])]
+toDocs TopLevel { .. }
+  | Just txt <- tlDoc = go txt tlValue
+  | otherwise = []
+  where
+  go txt decl =
+    case decl of
+      DSignature ns _ -> [ (thing n, [txt]) | n <- ns ]
+      DFixity _ ns    -> [ (thing n, [txt]) | n <- ns ]
+      DBind b         -> [ (thing (bName b), [txt]) ]
+      DLocated d _    -> go txt d
+      DPatBind p _    -> [ (thing n, [txt]) | n <- namesP p ]
 
+      -- XXX revisit these
+      DPragma _ _     -> []
+      DType _         -> []
 
+
 --------------------------------------------------------------------------------
 newtype NoPatM a = M { unM :: ReaderT Range (StateT RW Id) a }
 
 data RW     = RW { names :: !Int, errors :: [Error] }
 
-data Error  = MultipleSignatures QName [Located Schema]
-            | SignatureNoBind (Located QName) Schema
-            | PragmaNoBind (Located QName) Pragma
-              deriving (Show)
+data Error  = MultipleSignatures PName [Located (Schema PName)]
+            | SignatureNoBind (Located PName) (Schema PName)
+            | PragmaNoBind (Located PName) Pragma
+            | MultipleFixities PName [Range]
+            | FixityNoBind (Located PName)
+            | MultipleDocs PName [Range]
+              deriving (Show,Generic)
 
+instance NFData Error where rnf = genericRnf
+
 instance Functor NoPatM where fmap = liftM
 instance Applicative NoPatM where pure = return; (<*>) = ap
 instance Monad NoPatM where
@@ -381,7 +458,7 @@
 
 
 -- | Pick a new name, to be used when desugaring patterns.
-newName :: NoPatM Name
+newName :: NoPatM PName
 newName = M $ sets $ \s -> let x = names s
                            in (NewName NoPat x, s { names = x + 1 })
 
@@ -424,5 +501,16 @@
         text "Pragma without a matching binding:"
          $$ nest 2 (pp s)
 
+      MultipleFixities n locs ->
+        text "Multiple fixity declarations for" <+> quotes (pp n)
+        $$ nest 2 (vcat (map pp locs))
 
+      FixityNoBind n ->
+        text "At" <+> pp (srcRange n) <> colon <+>
+        text "Fixity declaration without a matching binding for:" <+>
+         pp (thing n)
+
+      MultipleDocs n locs ->
+        text "Multiple documentation blocks given for:" <+> pp n
+        $$ nest 2 (vcat (map pp locs))
 
diff --git a/src/Cryptol/Parser/ParserUtils.hs b/src/Cryptol/Parser/ParserUtils.hs
--- a/src/Cryptol/Parser/ParserUtils.hs
+++ b/src/Cryptol/Parser/ParserUtils.hs
@@ -1,33 +1,42 @@
 -- |
 -- Module      :  $Header$
--- Copyright   :  (c) 2013-2015 Galois, Inc.
+-- Copyright   :  (c) 2013-2016 Galois, Inc.
 -- License     :  BSD3
 -- Maintainer  :  cryptol@galois.com
 -- Stability   :  provisional
 -- Portability :  portable
 
 {-# LANGUAGE Safe, PatternGuards #-}
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE CPP #-}
 module Cryptol.Parser.ParserUtils where
 
 import Cryptol.Parser.AST
 import Cryptol.Parser.Lexer
 import Cryptol.Parser.Position
-import Cryptol.Prims.Syntax
-import Cryptol.Parser.Utils (translateExprToNumT)
+import Cryptol.Parser.Utils (translateExprToNumT,widthIdent)
 import Cryptol.Utils.PP
 import Cryptol.Utils.Panic
 
 import Data.Maybe(listToMaybe,fromMaybe)
 import Data.Bits(testBit,setBit)
-import Control.Monad(liftM,ap)
+import Data.List (intercalate)
+import Control.Monad(liftM,ap,unless)
+import qualified Data.Text as S
+import           Data.Text.Lazy (Text)
+import qualified Data.Text.Lazy as T
 
-#if __GLASGOW_HASKELL__ < 710
-import Control.Applicative ((<$>),Applicative(..))
-import Data.Traversable (mapM)
-import Prelude hiding (mapM)
-#endif
 
-parse :: Config -> ParseM a -> String -> Either ParseError a
+import GHC.Generics (Generic)
+import Control.DeepSeq.Generics
+
+import Prelude ()
+import Prelude.Compat
+
+parseString :: Config -> ParseM a -> String -> Either ParseError a
+parseString cfg p cs = parse cfg p (T.pack cs)
+
+parse :: Config -> ParseM a -> Text -> Either ParseError a
 parse cfg p cs    = case unP p cfg eofPos (S toks) of
                       Left err    -> Left err
                       Right (a,_) -> Right a
@@ -47,9 +56,9 @@
            UnterminatedComment -> "unterminated comment"
            UnterminatedString  -> "unterminated string"
            UnterminatedChar    -> "unterminated character"
-           InvalidString       -> "invalid string literal: " ++ tokenText it
-           InvalidChar         -> "invalid character literal: " ++ tokenText it
-           LexicalError        -> "lexical error: " ++ tokenText it
+           InvalidString       -> "invalid string literal: " ++ T.unpack (tokenText it)
+           InvalidChar         -> "invalid character literal: " ++ T.unpack (tokenText it)
+           LexicalError        -> "unrecognized character: " ++ T.unpack (tokenText it)
       where it = thing t
 
     t : more -> unP (k t) cfg p (S more)
@@ -57,8 +66,10 @@
 
 data ParseError = HappyError FilePath Position (Maybe Token)
                 | HappyErrorMsg Range String
-                  deriving Show
+                  deriving (Show, Generic)
 
+instance NFData ParseError where rnf = genericRnf
+
 newtype S = S [Located Token]
 
 instance PP ParseError where
@@ -104,29 +115,16 @@
 customError :: String -> Located Token -> ParseM a
 customError x t = P $ \_ _ _ -> Left (HappyErrorMsg (srcRange t) x)
 
-mkModName :: {-reversed-} [LName] -> Located ModName
-mkModName xs = Located { srcRange = rComb (srcRange f) (srcRange l)
-                       , thing    = ModName [ x | Name x <- map thing ns ]
-                       }
-  where l : _       = xs
-        ns@(f : _)  = reverse xs
-
-mkQName :: {-reversed-} [LName] -> Located QName
-mkQName [x] = fmap mkUnqual x
-mkQName xs =
-  Located { srcRange = rComb (srcRange f) (srcRange l)
-          , thing    = mkQual (ModName [ x | Name x <- map thing ns ]) (thing l)
-          }
-  where l : ls      = xs
-        ns@(f : _)  = reverse ls
+mkModName :: [String] -> ModName
+mkModName strs = S.pack (intercalate "::" strs)
 
 -- Note that type variables are not resolved at this point: they are tcons.
-mkSchema :: [TParam] -> [Prop] -> Type -> Schema
+mkSchema :: [TParam PName] -> [Prop PName] -> Type PName -> Schema PName
 mkSchema xs ps t = Forall xs ps t Nothing
 
-getName :: Located Token -> Name
+getName :: Located Token -> PName
 getName l = case thing l of
-              Token (Ident x) _ -> Name x
+              Token (Ident [] x) _ -> mkUnqual (mkIdent (S.pack x))
               _ -> panic "[Parser] getName" ["not an Ident:", show l]
 
 getNum :: Located Token -> Integer
@@ -140,7 +138,7 @@
              Token (StrLit x) _ -> x
              _ -> panic "[Parser] getStr" ["not a string:", show l]
 
-numLit :: TokenT -> Expr
+numLit :: TokenT -> Expr PName
 numLit (Num x base digs)
   | base == 2   = ELit $ ECNum x (BinLit digs)
   | base == 8   = ELit $ ECNum x (OctLit digs)
@@ -149,7 +147,19 @@
 
 numLit x = panic "[Parser] numLit" ["invalid numeric literal", show x]
 
+intVal :: Located Token -> ParseM Integer
+intVal tok =
+  case tokenType (thing tok) of
+    Num x _ _ -> return x
+    _         -> errorMessage (srcRange tok) "Expected an integer"
 
+mkFixity :: Assoc -> Located Token -> [LPName] -> ParseM (Decl PName)
+mkFixity assoc tok qns =
+  do l <- intVal tok
+     unless (l >= 1 && l <= 100)
+          (errorMessage (srcRange tok) "Fixity levels must be between 0 and 20")
+     return (DFixity (Fixity assoc (fromInteger l)) qns)
+
 mkTupleSel :: Range -> Integer -> ParseM (Located Selector)
 mkTupleSel pos n
   | n < 0 = errorMessage pos
@@ -164,7 +174,7 @@
   _          -> errorMessage (srcRange loc) "Expected a string literal"
 
 
-validDemotedType :: Range -> Type -> ParseM Type
+validDemotedType :: Range -> Type PName -> ParseM (Type PName)
 validDemotedType rng ty =
   case ty of
     TLocated t r -> validDemotedType r t
@@ -180,10 +190,13 @@
     TUser {}     -> ok
     TApp {}      -> ok
 
+    TParens t    -> validDemotedType rng t
+    TInfix{}     -> ok
+
   where bad x = errorMessage rng (x ++ " cannot be demoted.")
         ok    = return $ at rng ty
 
-mkEApp :: [Expr] -> Expr
+mkEApp :: [Expr PName] -> Expr PName
 mkEApp es@(eLast : _) = at (eFirst,eLast) $ foldl EApp f xs
   where
   eFirst : rest = reverse es
@@ -213,20 +226,18 @@
 mkEApp es        = panic "[Parser] mkEApp" ["Unexpected:", show es]
 
 
-op :: ECon -> Range -> Expr
-op s r = at r (ECon s)
-
-unOp :: Expr -> Expr -> Expr
+unOp :: Expr PName -> Expr PName -> Expr PName
 unOp f x = at (f,x) $ EApp f x
 
-binOp :: Expr -> Expr -> Expr -> Expr
-binOp x f y = at (x,y) $ EApp (EApp f x) y
+-- Use defaultFixity as a placeholder, it will be fixed during renaming.
+binOp :: Expr PName -> Located PName -> Expr PName -> Expr PName
+binOp x f y = at (x,y) $ EInfix x f defaultFixity y
 
-eFromTo :: Range -> Expr -> Maybe Expr -> Maybe Expr -> ParseM Expr
+eFromTo :: Range -> Expr PName -> Maybe (Expr PName) -> Maybe (Expr PName) -> ParseM (Expr PName)
 eFromTo r e1 e2 e3 = EFromTo <$> exprToNumT r e1
                              <*> mapM (exprToNumT r) e2
                              <*> mapM (exprToNumT r) e3
-exprToNumT :: Range -> Expr -> ParseM Type
+exprToNumT :: Range -> Expr PName -> ParseM (Type PName)
 exprToNumT r expr =
   case translateExprToNumT expr of
     Just t -> return t
@@ -244,45 +255,53 @@
 
 -- | WARNING: This is a bit of a hack.
 -- It is used to represent anonymous type applications.
-anonRecord :: Maybe Range -> [Type] -> Type
+anonRecord :: Maybe Range -> [Type PName] -> Type PName
 anonRecord ~(Just r) ts = TRecord (map toField ts)
-  where noName    = Located { srcRange = r, thing = Name "" }
+  where noName    = Located { srcRange = r, thing = mkIdent (S.pack "") }
         toField t = Named { name = noName, value = t }
 
-exportDecl :: ExportType -> Decl -> TopDecl
-exportDecl e d = Decl TopLevel { tlExport = e, tlValue = d }
+exportDecl :: Maybe (Located String) -> ExportType -> Decl PName -> TopDecl PName
+exportDecl mbDoc e d = Decl TopLevel { tlExport = e
+                                     , tlDoc    = mbDoc
+                                     , tlValue  = d }
 
-exportNewtype :: ExportType -> Newtype -> TopDecl
-exportNewtype e n = TDNewtype TopLevel { tlExport = e, tlValue = n }
+exportNewtype :: ExportType -> Newtype PName -> TopDecl PName
+exportNewtype e n = TDNewtype TopLevel { tlExport = e
+                                       , tlDoc    = Nothing
+                                       , tlValue  = n }
 
-changeExport :: ExportType -> [TopDecl] -> [TopDecl]
-changeExport e = map $ \ td -> case td of
-  Decl d      -> Decl      d { tlExport = e }
-  TDNewtype n -> TDNewtype n { tlExport = e }
-  Include _   -> td
+changeExport :: ExportType -> [TopDecl PName] -> [TopDecl PName]
+changeExport e = map change
+  where
+  change (Decl d)      = Decl      d { tlExport = e }
+  change (TDNewtype n) = TDNewtype n { tlExport = e }
+  change td@Include{}  = td
 
-mkTypeInst :: Named Type -> TypeInst
-mkTypeInst x | thing (name x) == Name "" = PosInst (value x)
-             | otherwise                 = NamedInst x
+mkTypeInst :: Named (Type PName) -> TypeInst PName
+mkTypeInst x | nullIdent (thing (name x)) = PosInst (value x)
+             | otherwise                  = NamedInst x
 
 
-mkTParam :: Located Name -> Maybe Kind -> ParseM TParam
+mkTParam :: Located Ident -> Maybe Kind -> ParseM (TParam PName)
 mkTParam Located { srcRange = rng, thing = n } k
-  | Name "width" <- n = errorMessage rng "`width` is not a valid type parameter name."
-  | otherwise = return (TParam n k (Just rng))
+  | n == widthIdent = errorMessage rng "`width` is not a valid type parameter name."
+  | otherwise       = return (TParam (mkUnqual n) k (Just rng))
 
-mkTySyn :: Located Name -> [TParam] -> Type -> ParseM Decl
-mkTySyn n ps b
-  | Name "width" <- thing n = errorMessage (srcRange n) "`width` is not a valid type synonym name."
-  | otherwise = return $ DType $ TySyn (fmap mkUnqual n) ps b
+mkTySyn :: Located PName -> [TParam PName] -> Type PName -> ParseM (Decl PName)
+mkTySyn ln ps b
+  | getIdent (thing ln) == widthIdent =
+    errorMessage (srcRange ln) "`width` is not a valid type synonym name."
 
+  | otherwise =
+    return $ DType $ TySyn ln ps b
+
 polyTerm :: Range -> Integer -> Integer -> ParseM (Bool, Integer)
 polyTerm rng k p
   | k == 0          = return (False, p)
   | k == 1          = return (True, p)
   | otherwise       = errorMessage rng "Invalid polynomial coefficient"
 
-mkPoly :: Range -> [ (Bool,Integer) ] -> ParseM Expr
+mkPoly :: Range -> [ (Bool,Integer) ] -> ParseM (Expr PName)
 mkPoly rng terms = mk 0 (map fromInteger bits)
   where
   w    = case terms of
@@ -299,16 +318,124 @@
 
 
 -- NOTE: The list of patterns is reversed!
-mkProperty :: LName -> [Pattern] -> Expr -> Decl
-mkProperty f ps e = DBind Bind { bName       = fmap mkUnqual f
+mkProperty :: LPName -> [Pattern PName] -> Expr PName -> Decl PName
+mkProperty f ps e = DBind Bind { bName       = f
                                , bParams     = reverse ps
-                               , bDef        = ETyped e TBit
+                               , bDef        = at e (Located emptyRange (DExpr (ETyped e TBit)))
                                , bSignature  = Nothing
                                , bPragmas    = [PragmaProperty]
                                , bMono       = False
+                               , bInfix      = False
+                               , bFixity     = Nothing
+                               , bDoc        = Nothing
                                }
 
-mkIf :: [(Expr, Expr)] -> Expr -> Expr
+mkIf :: [(Expr PName, Expr PName)] -> Expr PName -> Expr PName
 mkIf ifThens theElse = foldr addIfThen theElse ifThens
     where
     addIfThen (cond, doexpr) elseExpr = EIf cond doexpr elseExpr
+
+-- | Generate a signature and a primitive binding.  The reason for generating
+-- both instead of just adding the signature at this point is that it means the
+-- primitive declarations don't need to be treated differently in the noPat
+-- pass.  This is also the reason we add the doc to the TopLevel constructor,
+-- instead of just place it on the binding directly.  A better solution might be
+-- to just have a different constructor for primitives.
+mkPrimDecl :: Maybe (Located String) -> LPName -> Schema PName -> [TopDecl PName]
+mkPrimDecl mbDoc ln sig =
+  [ exportDecl mbDoc Public
+    $ DBind Bind { bName      = ln
+                 , bParams    = []
+                 , bDef       = at sig (Located emptyRange DPrim)
+                 , bSignature = Nothing
+                 , bPragmas   = []
+                 , bMono      = False
+                 , bInfix     = isInfixIdent (getIdent (thing ln))
+                 , bFixity    = Nothing
+                 , bDoc       = Nothing
+                 }
+  , exportDecl Nothing Public
+    $ DSignature [ln] sig
+  ]
+
+-- | Fix-up the documentation strings by removing the comment delimiters on each
+-- end, and stripping out common prefixes on all the remaining lines.
+mkDoc :: Located Text -> Located String
+mkDoc ltxt = ltxt { thing = docStr }
+  where
+
+  docStr = unlines
+         $ map T.unpack
+         $ dropPrefix
+         $ trimFront
+         $ T.lines
+         $ T.dropWhileEnd (`elem` "/* \r\n\t")
+         $ thing ltxt
+
+  trimFront []                     = []
+  trimFront (l:ls)
+    | T.all (`elem` "/* \r\n\t") l = ls
+    | otherwise                    = T.dropWhile (`elem` "/* ") l : ls
+
+  dropPrefix []        = []
+  dropPrefix [t]       = [T.dropWhile (`elem` "/* ") t]
+  dropPrefix ts@(l:ls) =
+    case T.uncons l of
+      Just (c,_) | all (commonPrefix c) ls -> dropPrefix (map (T.drop 1) ts)
+      _                                    -> ts
+
+    where
+    commonPrefix c t =
+      case T.uncons t of
+        Just (c',_) -> c == c'
+        Nothing     -> False
+
+
+mkProp :: Type PName -> ParseM (Located [Prop PName])
+mkProp ty =
+  case ty of
+    TLocated t r -> Located r `fmap` props r t
+    _            -> panic "Parser" [ "Invalid type given to mkProp"
+                                   , "expected a location"
+                                   , show ty ]
+
+  where
+
+  props r t =
+    case t of
+      TInfix{}       -> infixProp t
+      TUser f xs     -> prefixProp r f xs
+      TTuple ts      -> concat `fmap` mapM (props r) ts
+      TParens t'     -> props r  t'
+      TLocated t' r' -> props r' t'
+
+      TApp{}    -> err
+      TFun{}    -> err
+      TSeq{}    -> err
+      TBit{}    -> err
+      TNum{}    -> err
+      TChar{}   -> err
+      TInf{}    -> err
+      TWild     -> err
+      TRecord{} -> err
+
+    where
+    err = errorMessage r "Invalid constraint"
+
+  -- we have to delay these until renaming, when we have the fixity table
+  -- present
+  infixProp t = return [CType t]
+
+  -- these can be translated right away
+  prefixProp r f xs
+    | i == arithIdent, [x] <- xs = return [CLocated (CArith x) r]
+    | i == finIdent,   [x] <- xs = return [CLocated (CFin x) r]
+    | i == cmpIdent,   [x] <- xs = return [CLocated (CCmp x) r]
+    | otherwise                  = errorMessage r "Invalid constraint"
+    where
+    i = getIdent f
+
+arithIdent, finIdent, cmpIdent :: Ident
+arithIdent = mkIdent (S.pack "Arith")
+finIdent   = mkIdent (S.pack "fin")
+cmpIdent   = mkIdent (S.pack "Cmp")
diff --git a/src/Cryptol/Parser/Position.hs b/src/Cryptol/Parser/Position.hs
--- a/src/Cryptol/Parser/Position.hs
+++ b/src/Cryptol/Parser/Position.hs
@@ -1,29 +1,42 @@
 -- |
 -- Module      :  $Header$
--- Copyright   :  (c) 2013-2015 Galois, Inc.
+-- Copyright   :  (c) 2013-2016 Galois, Inc.
 -- License     :  BSD3
 -- Maintainer  :  cryptol@galois.com
 -- Stability   :  provisional
 -- Portability :  portable
 
 {-# LANGUAGE Safe #-}
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE RecordWildCards #-}
+
 module Cryptol.Parser.Position where
 
-import Data.List(foldl')
+import           Data.Text.Lazy (Text)
+import qualified Data.Text.Lazy as T
 
+import GHC.Generics (Generic)
+import Control.DeepSeq.Generics
+
 import Cryptol.Utils.PP
 
 data Located a  = Located { srcRange :: !Range, thing :: a }
-                  deriving (Eq,Show)
+                  deriving (Eq,Show,Generic)
 
+instance NFData a => NFData (Located a) where rnf = genericRnf
+
 data Position   = Position { line :: !Int, col :: !Int }
-                  deriving (Eq,Ord,Show)
+                  deriving (Eq,Ord,Show,Generic)
 
+instance NFData Position where rnf = genericRnf
+
 data Range      = Range { from   :: !Position
                         , to     :: !Position
                         , source :: FilePath }
-                  deriving (Eq,Show)
+                  deriving (Eq,Show,Generic)
 
+instance NFData Range where rnf = genericRnf
+
 -- | An empty range.
 --
 -- Caution: using this on the LHS of a use of rComb will cause the empty source
@@ -40,8 +53,8 @@
             '\n' -> p { col = 1, line = 1 + line p }
             _    -> p { col = 1 + col p }
 
-moves :: Position -> String -> Position
-moves p cs = foldl' move p cs
+moves :: Position -> Text -> Position
+moves p cs = T.foldl' move p cs
 
 rComb :: Range -> Range -> Range
 rComb r1 r2  = Range { from = rFrom, to = rTo, source = source r1 }
@@ -65,6 +78,10 @@
 
 instance PP a => PP (Located a) where
   ppPrec _ l = parens (text "at" <+> pp (srcRange l) <> comma <+> pp (thing l))
+
+instance PPName a => PPName (Located a) where
+  ppPrefixName Located { .. } = ppPrefixName thing
+  ppInfixName  Located { .. } = ppInfixName  thing
 
 
 
diff --git a/src/Cryptol/Parser/Unlit.hs b/src/Cryptol/Parser/Unlit.hs
--- a/src/Cryptol/Parser/Unlit.hs
+++ b/src/Cryptol/Parser/Unlit.hs
@@ -1,6 +1,6 @@
 -- |
 -- Module      :  $Header$
--- Copyright   :  (c) 2013-2015 Galois, Inc.
+-- Copyright   :  (c) 2013-2016 Galois, Inc.
 -- License     :  BSD3
 -- Maintainer  :  cryptol@galois.com
 -- Stability   :  provisional
diff --git a/src/Cryptol/Parser/Utils.hs b/src/Cryptol/Parser/Utils.hs
--- a/src/Cryptol/Parser/Utils.hs
+++ b/src/Cryptol/Parser/Utils.hs
@@ -1,6 +1,6 @@
 -- |
 -- Module      :  $Header$
--- Copyright   :  (c) 2013-2015 Galois, Inc.
+-- Copyright   :  (c) 2013-2016 Galois, Inc.
 -- License     :  BSD3
 -- Maintainer  :  cryptol@galois.com
 -- Stability   :  provisional
@@ -9,24 +9,37 @@
 -- Utility functions that are also useful for translating programs
 -- from previous Cryptol versions.
 
+{-# LANGUAGE OverloadedStrings #-}
+
 module Cryptol.Parser.Utils
   ( translateExprToNumT
+  , widthIdent
   ) where
 
 import Cryptol.Parser.AST
 import Cryptol.Prims.Syntax
 
-translateExprToNumT :: Expr -> Maybe Type
+
+widthIdent :: Ident
+widthIdent  = mkIdent "width"
+
+translateExprToNumT :: Expr PName -> Maybe (Type PName)
 translateExprToNumT expr =
   case expr of
     ELocated e r -> (`TLocated` r) `fmap` translateExprToNumT e
-    EVar (QName Nothing (Name "width")) -> mkFun TCWidth
+    EVar n | getIdent n == widthIdent -> mkFun TCWidth
     EVar x       -> return (TUser x [])
-    ECon x       -> cvtCon x
     ELit x       -> cvtLit x
     EApp e1 e2   -> do t1 <- translateExprToNumT e1
                        t2 <- translateExprToNumT e2
                        tApp t1 t2
+
+    EInfix a o f b -> do e1 <- translateExprToNumT a
+                         e2 <- translateExprToNumT b
+                         return (TInfix e1 o f e2)
+
+    EParens e    -> translateExprToNumT e
+
     _            -> Nothing
 
   where
@@ -42,16 +55,3 @@
   cvtLit (ECNum n CharLit)  = return (TChar $ toEnum $ fromInteger n)
   cvtLit (ECNum n _)        = return (TNum n)
   cvtLit (ECString _)       = Nothing
-
-  cvtCon c =
-    case c of
-      ECPlus        -> mkFun TCAdd
-      ECMinus       -> mkFun TCSub
-      ECMul         -> mkFun TCMul
-      ECDiv         -> mkFun TCDiv
-      ECMod         -> mkFun TCMod
-      ECExp         -> mkFun TCExp
-      ECLg2         -> mkFun TCLg2
-      ECMin         -> mkFun TCMin
-      ECMax         -> mkFun TCMax
-      _             -> Nothing
diff --git a/src/Cryptol/Prelude.hs b/src/Cryptol/Prelude.hs
--- a/src/Cryptol/Prelude.hs
+++ b/src/Cryptol/Prelude.hs
@@ -1,22 +1,21 @@
 -- |
 -- Module      :  $Header$
--- Copyright   :  (c) 2015 Galois, Inc.
+-- Copyright   :  (c) 2015-2016 Galois, Inc.
 -- License     :  BSD3
 -- Maintainer  :  cryptol@galois.com
 -- Stability   :  provisional
 -- Portability :  portable
 --
--- Include the prelude when building with -fself-contained
+-- Compile the prelude into the executable as a last resort
 
 {-# LANGUAGE CPP #-}
 {-# LANGUAGE QuasiQuotes #-}
+{-# LANGUAGE OverloadedStrings #-}
 
 module Cryptol.Prelude (writePreludeContents) where
 
 import Cryptol.ModuleSystem.Monad
 
-#ifdef SELF_CONTAINED
-
 import System.Directory (getTemporaryDirectory)
 import System.IO (hClose, hPutStr, openTempFile)
 import Text.Heredoc (there)
@@ -33,13 +32,3 @@
   hPutStr h preludeContents
   hClose h
   return path
-
-#else
-
-import Cryptol.Parser.AST as P
-
--- | If we're not self-contained, the Prelude is just missing
-writePreludeContents :: ModuleM FilePath
-writePreludeContents = moduleNotFound (P.ModName ["Cryptol"]) =<< getSearchPath
-
-#endif
diff --git a/src/Cryptol/Prims/Doc.hs b/src/Cryptol/Prims/Doc.hs
deleted file mode 100644
--- a/src/Cryptol/Prims/Doc.hs
+++ /dev/null
@@ -1,225 +0,0 @@
--- |
--- Module      :  $Header$
--- Copyright   :  (c) 2013-2015 Galois, Inc.
--- License     :  BSD3
--- Maintainer  :  cryptol@galois.com
--- Stability   :  provisional
--- Portability :  portable
-
-module Cryptol.Prims.Doc
-  ( helpDoc
-  , description
-  ) where
-
-import Cryptol.Prims.Syntax
-import Cryptol.Prims.Types(typeOf)
-import Cryptol.Utils.PP
-
-helpDoc :: ECon -> Doc
-helpDoc prim =
-  vcat [ text "Description"
-       , text "-----------"
-       , text ""
-       , text "    "
-                   <> ppPrefix prim <+> text ":" <+> pp ty
-       , text ""
-       , description prim
-       ]
-  where ty = typeOf prim
-
-method :: String -> [Doc] -> [String] -> Doc
-method txt _is notes =
-  hang (text txt) 2 (vcat [ text "*" <+> text i | i <- notes ])
-  -- XXX: Display what instances are supported.
-
-noDoc :: Doc
-noDoc = text "No documentation is available."
-
-dBits, dWords, dSeqs, dTuples, dRecords, dFuns, dFinSeqs :: Doc
-dCmps, dAriths, dEverything :: [Doc]
-dBits       = text "bits"
-dWords      = text "words"
-dSeqs       = text "sequences"
-dFinSeqs    = text "finite sequences"
-dTuples     = text "tuples"
-dRecords    = text "records"
-dFuns       = text "functions"
-dCmps       = [ dBits, dWords, dSeqs, dTuples, dRecords ]
-dAriths     = [ dWords, dSeqs, dTuples, dRecords, dFuns ]
-dEverything = [ dBits, dWords, dSeqs, dTuples, dRecords, dFuns ]
-
-description :: ECon -> Doc
-description prim =
-  case prim of
-    ECTrue    -> text "The constant True. Corresponds to the bit value 1."
-    ECFalse   -> text "The constant False. Corresponds to the bit value 0."
-
-    ECDemote  -> text "The value corresponding to a numeric type."
-
-    ECPlus    -> method "Add two values."
-                    dAriths
-                    [ "For words, addition uses modulo arithmetic."
-                    , "Structured values are added element-wise."
-                    ]
-
-    ECMinus           -> method "Infix subtraction."
-                    dAriths
-                    [ "For words, subtraction uses modulo arithmetic."
-                    , "Structured values are subtracted element-wise. Defined as:"
-                    , "a - b = a + negate b"
-                    , "See also: `negate'."
-                    ]
-    ECMul             -> method "Multiplies two values."
-                    dAriths
-                    [ "For words, multiplies two words, modulus 2^^a."
-                    , "Structured values are multiplied element-wise."
-                    ]
-    ECDiv             -> method "Divides two values."
-                    dAriths
-                    [ "For words, divides two words, modulus 2^^a."
-                    , "Structured values are divided element-wise."
-                    ]
-    ECMod             -> method "Infix modulus."
-                    dAriths
-                    [ "For words, takes the modulus of two words, modulus 2^^a."
-                    , "Over structured values, operates element-wise."
-                    , "Be careful, as this will often give unexpected results due to interaction of the two moduli."
-                    ]
-    ECExp             -> method "Exponentiation."
-                    dAriths
-                    [ "For words, takes the exponent of two words, modulus 2^^a."
-                    , "Over structured values, operates element-wise."
-                    , "Be careful, due to its fast-growing nature, exponentiation is prone to interacting poorly with defaulting."
-                    ]
-    ECLg2             -> method "Log base two"
-                    dAriths
-                    [ "For words, computes the ceiling of log, base 2, of a number."
-                    , "Over structured values, operates element-wise."
-                    ]
-    ECNeg             -> method "Unary negation"
-                    dAriths
-                    [ "Returns the twos complement of its argument."
-                    , "Over structured values, operates element-wise."
-                    , "negate a = ~a + 1" -- is this right?
-                    ]
-    ECLt              -> method "Less than comparison"
-                    dCmps 
-                    [ "Less-than. Only works on comparable arguments." ]
-    ECGt              -> method "Greater than comparison"
-                    dCmps
-                    [ "Greater-than of two comparable arguments." ]
-    ECLtEq            -> method "Less than or equal comparison"
-                    dCmps
-                    [ "Less-than or equal of two comparable arguments." ]
-    ECGtEq            -> method "Greater than or equal comparison"
-                    dCmps
-                    [ "Greater-than or equal of two comparable arguments." ]
-    ECEq              -> method "Equality test"
-                    dEverything
-                    [ "Compares any two values of the same type for equality." ]
-    ECNotEq           -> method "Not-equals test"
-                    dEverything
-                    [ "Compares any two values of the same type for inequality." ]
-
-    ECFunEq           -> noDoc
-    ECFunNotEq        -> noDoc
-    ECMin             -> method "Minimum of two arguments"
-                    dCmps
-                    [ "Returns the smaller of two comparable arguments." ]
-    ECMax             -> method "Maximum of two arguments"
-                    dCmps
-                    [ "Returns the greater of two comparable arguments." ]
-
-    ECAnd             -> method "Logical and"
-                    dEverything
-                    [ "Logical `and' over bits. Extends element-wise over sequences, tuples." ]
-    ECOr              -> method "Logical or"
-                    dEverything
-                    [ "Logical `or' over bits. Extends element-wise over sequences, tuples." ]
-    ECXor             -> method "Logical exclusive-or"
-                    dEverything
-                    [ "Logical `exclusive or' over bits. Extends element-wise over sequences, tuples." ]
-    ECCompl           -> method "Logical complement"
-                    dEverything
-                    [ "Bitwise complement. Extends element-wise over sequences, tuples." ]
-    ECZero            -> method "Polymorphic zero"
-                    dEverything -- uh, no arguments?
-                    [ "Gives an arbitrary shaped value whose bits are all False."
-                    , "~zero likewise gives an arbitrary shaped value whose bits are all True."
-                    ]
-
-    ECShiftL          -> method "Left shift"
-                    [ dFinSeqs ]
-                    [ "Left shift.  The first argument is the sequence to shift, the second is the number of positions to shift by."  ]
-    ECShiftR          -> method "Right shift"
-                    [ dFinSeqs ]
-                    [ "Right shift.  The first argument is the sequence to shift, the second is the number of positions to shift by."  ]
-    ECRotL            -> method "Left rotate"
-                    [ dFinSeqs ]
-                    [ "Left rotate.  The first argument is the sequence to rotate, the second is the number of positions to rotate by."  ]
-    ECRotR            -> method "Right rotate"
-                    [ dFinSeqs ]
-                    [ "Right rotate.  The first argument is the sequence to rotate, the second is the number of positions to rotate by."  ]
-
-    ECCat             -> noDoc
-    ECSplitAt         -> method "Two-way split operator"
-                    [ dSeqs ]
-                    [ "Split a sequence into a tuple of sequences" ]
-    ECJoin            -> method "Join sequences"
-                    [ dSeqs ]
-                    [ "Joins sequences" ]
-    ECSplit           -> method "Polymorphic split operator"
-                    [ dSeqs ]
-                    [ "Splits a sequence into 'parts' groups with 'each' elements." ]
-    ECReverse         -> method "Reverse a sequence"
-                    [ dSeqs ]
-                    [ "Reverses the elements in a sequence." ]
-    ECTranspose       -> method "Matrix transposition"
-                    [ dSeqs ]
-                    [ "Transposes an [a][b] matrix into a [b][a] matrix." ]
-
-    ECAt              -> method "Index select operator"
-                    [ dSeqs ]
-                    [ "Index operator.  The first argument is a sequence."
-                      ,"The second argument is the zero-based index of the element to select from the sequence."
-                    ]
-    ECAtRange         -> method "Bulk index operator"
-                    [ dSeqs ]
-                    [ "Bulk index operator.  The first argument is a sequence."
-                      ,"The second argument is a sequence of the zero-based indices of the elements to select."
-                    ]
-    ECAtBack          -> method "Reverse index select operator"
-                    [ dFinSeqs ]
-                    [ "Reverse index operator.  The first argument is a finite sequence."
-                      ,"The second argument is the zero-based index of the element to select, starting from the end of the sequence."
-                    ]
-    ECAtRangeBack     -> method "Bulk reverse index operator"
-                    [ dFinSeqs ]
-                    [ "Bulk reverse index operator.  The first argument is a finite sequence."
-                      ,"The second argument is a sequence of the zero-based indices of the elements to select, starting from the end of the sequence."
-                    ]
-
-    ECFromThen        -> noDoc
-    ECFromTo          -> noDoc
-    ECFromThenTo      -> noDoc
-
-    ECInfFrom         -> noDoc
-    ECInfFromThen     -> noDoc
-
-    ECError           -> noDoc
-
-    ECPMul            -> method "Polynomial multiplication"
-                    [ dWords ]
-                    [ "Performs multiplication of GF2^^8 polynomials." ]
-    ECPDiv            -> method "Polynomial division"
-                    [ dWords ]
-                    [ "Performs division of GF2^^8 polynomials." ]
-    ECPMod            -> method "Polynomial modulus"
-                    [ dWords ]
-                    [ "Performs modulus of GF2^^8 polynomials." ]
-
-    ECRandom          -> method "Random value generation"
-                    dCmps
-                    [ "Generates random values from a seed."
-                      ,"When called with a function, currently generates a function that always returns zero."
-                    ]
diff --git a/src/Cryptol/Prims/Eval.hs b/src/Cryptol/Prims/Eval.hs
--- a/src/Cryptol/Prims/Eval.hs
+++ b/src/Cryptol/Prims/Eval.hs
@@ -1,23 +1,20 @@
 -- |
 -- Module      :  $Header$
--- Copyright   :  (c) 2013-2015 Galois, Inc.
+-- Copyright   :  (c) 2013-2016 Galois, Inc.
 -- License     :  BSD3
 -- Maintainer  :  cryptol@galois.com
 -- Stability   :  provisional
 -- Portability :  portable
 
-{-# LANGUAGE CPP #-}
 {-# LANGUAGE Trustworthy #-}
 {-# LANGUAGE TupleSections #-}
+{-# LANGUAGE RecordWildCards #-}
 {-# LANGUAGE Rank2Types #-}
 {-# LANGUAGE PatternGuards #-}
 {-# LANGUAGE ViewPatterns #-}
 {-# LANGUAGE BangPatterns #-}
-{-# OPTIONS_GHC -fno-warn-orphans #-}
-
 module Cryptol.Prims.Eval where
 
-import Cryptol.Prims.Syntax (ECon(..))
 import Cryptol.TypeCheck.AST
 import Cryptol.TypeCheck.Solver.InfNat (Nat'(..),fromNat,genLog, nMul)
 import qualified Cryptol.Eval.Arch as Arch
@@ -26,182 +23,135 @@
 import Cryptol.Eval.Value
 import Cryptol.Testing.Random (randomValue)
 import Cryptol.Utils.Panic (panic)
+import Cryptol.ModuleSystem.Name (asPrim)
+import Cryptol.Utils.Ident (Ident,mkIdent)
 
 import Data.List (sortBy,transpose,genericTake,genericReplicate,genericSplitAt,genericIndex)
 import Data.Ord (comparing)
 import Data.Bits (Bits(..))
 
-import System.Random.TF (mkTFGen)
-
-
--- Utilities -------------------------------------------------------------------
-
-#if __GLASGOW_HASKELL__ < 706
-noNum = panic "Cryptol.Prims.Eval"
-          [ "Num instance for Bool shouldn't be used." ]
-instance Num Bool where
-  _ + _         = noNum
-  _ * _         = noNum
-  _ - _         = noNum
-  negate _      = noNum
-  abs _         = noNum
-  signum _      = noNum
-  fromInteger _ = noNum
-#endif
-
-#if __GLASGOW_HASKELL__ < 708
-instance Bits Bool where
-  (.&.) = (&&)
-
-  (.|.) = (||)
-
-  xor = (/=)
-
-  complement = not
-
-  shift a 0 = a
-  shift _ _ = False
-
-  rotate a _ = a
-
-  bitSize _ = 1
-
-  isSigned _ = False
-
-  testBit a 1 = a
-  testBit _ _ = False
-
-  bit 0 = True
-  bit _ = False
-
-  popCount a = if a then 1 else 0
-#endif
+import qualified Data.Map.Strict as Map
+import qualified Data.Text as T
 
+import System.Random.TF.Gen (seedTFGen)
 
 -- Primitives ------------------------------------------------------------------
 
-evalECon :: ECon -> Value
-evalECon ec = case ec of
+evalPrim :: Decl -> Value
+evalPrim Decl { dName = n, .. }
+  | Just prim <- asPrim n, Just val <- Map.lookup prim primTable = val
 
-  ECFalse       -> VBit False
-  ECTrue        -> VBit True
-  ECPlus        -> binary (arithBinary (liftBinArith (+)))
-  ECMinus       -> binary (arithBinary (liftBinArith (-)))
-  ECMul         -> binary (arithBinary (liftBinArith (*)))
-  ECDiv         -> binary (arithBinary (liftBinArith divWrap))
-  ECMod         -> binary (arithBinary (liftBinArith modWrap))
-  ECExp         -> binary (arithBinary modExp)
-  ECLg2         -> unary  (arithUnary lg2)
-  ECNeg         -> unary  (arithUnary negate)
-  ECLt          -> binary (cmpOrder (\o -> o == LT           ))
-  ECGt          -> binary (cmpOrder (\o -> o == GT           ))
-  ECLtEq        -> binary (cmpOrder (\o -> o == LT || o == EQ))
-  ECGtEq        -> binary (cmpOrder (\o -> o == GT || o == EQ))
-  ECEq          -> binary (cmpOrder (\o ->            o == EQ))
-  ECNotEq       -> binary (cmpOrder (\o ->            o /= EQ))
-  ECMin         -> binary (withOrder minV)
-  ECMax         -> binary (withOrder maxV)
-  ECAnd         -> binary (logicBinary (.&.))
-  ECOr          -> binary (logicBinary (.|.))
-  ECXor         -> binary (logicBinary xor)
-  ECCompl       -> unary  (logicUnary complement)
-  ECShiftL      -> logicShift shiftLW shiftLS
-  ECShiftR      -> logicShift shiftRW shiftRS
-  ECRotL        -> logicShift rotateLW rotateLS
-  ECRotR        -> logicShift rotateRW rotateRS
+evalPrim Decl { .. } =
+    panic "Eval" [ "Unimplemented primitive", show dName ]
 
-  ECDemote -> ecDemoteV
+primTable :: Map.Map Ident Value
+primTable = Map.fromList $ map (\(n, v) -> (mkIdent (T.pack n), v))
+  [ ("+"          , binary (arithBinary (liftBinArith (+))))
+  , ("-"          , binary (arithBinary (liftBinArith (-))))
+  , ("*"          , binary (arithBinary (liftBinArith (*))))
+  , ("/"          , binary (arithBinary (liftBinArith divWrap)))
+  , ("%"          , binary (arithBinary (liftBinArith modWrap)))
+  , ("^^"         , binary (arithBinary modExp))
+  , ("lg2"        , unary  (arithUnary lg2))
+  , ("negate"     , unary  (arithUnary negate))
+  , ("<"          , binary (cmpOrder (\o -> o == LT           )))
+  , (">"          , binary (cmpOrder (\o -> o == GT           )))
+  , ("<="         , binary (cmpOrder (\o -> o == LT || o == EQ)))
+  , (">="         , binary (cmpOrder (\o -> o == GT || o == EQ)))
+  , ("=="         , binary (cmpOrder (\o ->            o == EQ)))
+  , ("!="         , binary (cmpOrder (\o ->            o /= EQ)))
+  , ("&&"         , binary (logicBinary (.&.)))
+  , ("||"         , binary (logicBinary (.|.)))
+  , ("^"          , binary (logicBinary xor))
+  , ("complement" , unary  (logicUnary complement))
+  , ("<<"         , logicShift shiftLW shiftLS)
+  , (">>"         , logicShift shiftRW shiftRS)
+  , ("<<<"        , logicShift rotateLW rotateLS)
+  , (">>>"        , logicShift rotateRW rotateRS)
+  , ("True"       , VBit True)
+  , ("False"      , VBit False)
 
-  ECCat -> tlam $ \ front ->
-           tlam $ \ back  ->
-           tlam $ \ elty  ->
-            lam  $ \ l     ->
-            lam  $ \ r     -> ccatV front back elty l r
+  , ("demote"     , ecDemoteV)
 
-  ECAt          -> indexPrimOne  indexFront
-  ECAtRange     -> indexPrimMany indexFrontRange
-  ECAtBack      -> indexPrimOne  indexBack
-  ECAtRangeBack -> indexPrimMany indexBackRange
+  , ("#"          , tlam $ \ front ->
+                    tlam $ \ back  ->
+                    tlam $ \ elty  ->
+                    lam  $ \ l     ->
+                    lam  $ \ r     -> ccatV front back elty l r)
 
-  ECFunEq    -> funCmp (== EQ)
-  ECFunNotEq -> funCmp (/= EQ)
+  , ("@"          , indexPrimOne  indexFront)
+  , ("@@"         , indexPrimMany indexFrontRange)
+  , ("!"          , indexPrimOne  indexBack)
+  , ("!!"         , indexPrimMany indexBackRange)
 
-  ECZero        -> tlam zeroV
+  , ("zero"       , tlam zeroV)
 
-  ECJoin -> tlam $ \ parts ->
-            tlam $ \ each  ->
-            tlam $ \ a     -> lam (joinV parts each a)
+  , ("join"       , tlam $ \ parts ->
+                    tlam $ \ each  ->
+                    tlam $ \ a     -> lam (joinV parts each a))
 
-  ECSplit -> ecSplitV
-  ECSplitAt -> tlam $ \ front ->
-               tlam $ \ back  ->
-               tlam $ \ a     -> lam (splitAtV front back a)
+  , ("split"      , ecSplitV)
 
-  ECFromThen   -> fromThenV
-  ECFromTo     -> fromToV
-  ECFromThenTo -> fromThenToV
+  , ("splitAt"    , tlam $ \ front ->
+                    tlam $ \ back  ->
+                    tlam $ \ a     -> lam (splitAtV front back a))
 
-  ECInfFrom    ->
-    tlam $ \(finTValue -> bits)  ->
-     lam $ \(fromWord  -> first) ->
-    toStream (map (word bits) [ first .. ])
+  , ("fromThen"   , fromThenV)
+  , ("fromTo"     , fromToV)
+  , ("fromThenTo" , fromThenToV)
 
-  ECInfFromThen ->
-    tlam $ \(finTValue -> bits)  ->
-     lam $ \(fromWord  -> first) ->
-     lam $ \(fromWord  -> next)  ->
-    toStream [ word bits n | n <- [ first, next .. ] ]
+  , ("infFrom"    , tlam $ \(finTValue -> bits)  ->
+                     lam $ \(fromWord  -> first) ->
+                    toStream (map (word bits) [ first .. ]))
 
-  ECError ->
-    tlam $ \_              ->
-    tlam $ \_              ->
-     lam $ \(fromStr -> s) -> cryUserError s
+  , ("infFromThen", tlam $ \(finTValue -> bits)  ->
+                     lam $ \(fromWord  -> first) ->
+                     lam $ \(fromWord  -> next)  ->
+                    toStream [ word bits n | n <- [ first, next .. ] ])
 
-  ECReverse ->
-    tlam $ \a ->
-    tlam $ \b ->
-     lam $ \(fromSeq -> xs) -> toSeq a b (reverse xs)
+  , ("error"      , tlam $ \_              ->
+                    tlam $ \_              ->
+                     lam $ \(fromStr -> s) -> cryUserError s)
 
-  ECTranspose ->
-    tlam $ \a ->
-    tlam $ \b ->
-    tlam $ \c ->
-     lam $ \((map fromSeq . fromSeq) -> xs) ->
-        case numTValue a of
-           Nat 0 ->
-             let val = toSeq a c []
-             in case numTValue b of
-                  Nat n -> toSeq b (tvSeq a c) $ genericReplicate n val
-                  Inf   -> VStream $ repeat val
-           _ -> toSeq b (tvSeq a c) $ map (toSeq a c) $ transpose xs
+  , ("reverse"    , tlam $ \a ->
+                    tlam $ \b ->
+                     lam $ \(fromSeq -> xs) -> toSeq a b (reverse xs))
 
-  ECPMul ->
-    tlam $ \(finTValue -> a) ->
-    tlam $ \(finTValue -> b) ->
-     lam $ \(fromWord  -> x) ->
-     lam $ \(fromWord  -> y) -> word (max 1 (a + b) - 1) (mul 0 x y b)
-     where
-     mul !res !_ !_ 0 = res
-     mul  res bs as n = mul (if even as then res else xor res bs)
-                            (bs `shiftL` 1) (as `shiftR` 1) (n-1)
+  , ("transpose"  , tlam $ \a ->
+                    tlam $ \b ->
+                    tlam $ \c ->
+                     lam $ \((map fromSeq . fromSeq) -> xs) ->
+                        case numTValue a of
+                           Nat 0 ->
+                             let val = toSeq a c []
+                             in case numTValue b of
+                                  Nat n -> toSeq b (tvSeq a c) $ genericReplicate n val
+                                  Inf   -> VStream $ repeat val
+                           _ -> toSeq b (tvSeq a c) $ map (toSeq a c) $ transpose xs)
 
-  ECPDiv ->
-    tlam $ \(fromInteger . finTValue -> a) ->
-    tlam $ \(fromInteger . finTValue -> b) ->
-     lam $ \(fromWord  -> x) ->
-     lam $ \(fromWord  -> y) -> word (toInteger a)
-                                     (fst (divModPoly x a y b))
+  , ("pmult"       ,
+    let mul !res !_ !_ 0 = res
+        mul  res bs as n = mul (if even as then res else xor res bs)
+                               (bs `shiftL` 1) (as `shiftR` 1) (n-1)
+     in tlam $ \(finTValue -> a) ->
+        tlam $ \(finTValue -> b) ->
+         lam $ \(fromWord  -> x) ->
+         lam $ \(fromWord  -> y) -> word (max 1 (a + b) - 1) (mul 0 x y b))
 
-  ECPMod ->
-    tlam $ \(fromInteger . finTValue -> a) ->
-    tlam $ \(fromInteger . finTValue -> b) ->
-     lam $ \(fromWord  -> x) ->
-     lam $ \(fromWord  -> y) -> word (toInteger b)
-                                     (snd (divModPoly x a y (b+1)))
+  , ("pdiv"        , tlam $ \(fromInteger . finTValue -> a) ->
+                     tlam $ \(fromInteger . finTValue -> b) ->
+                      lam $ \(fromWord  -> x) ->
+                      lam $ \(fromWord  -> y) -> word (toInteger a)
+                                                      (fst (divModPoly x a y b)))
 
-  ECRandom ->
-    tlam $ \a ->
-     lam $ \(fromWord -> x) -> randomV a x
+  , ("pmod"        , tlam $ \(fromInteger . finTValue -> a) ->
+                     tlam $ \(fromInteger . finTValue -> b) ->
+                      lam $ \(fromWord  -> x) ->
+                      lam $ \(fromWord  -> y) -> word (toInteger b)
+                                                      (snd (divModPoly x a y (b+1))))
+  , ("random"      , tlam $ \a ->
+                      lam $ \(fromWord -> x) -> randomV a x)
+  ]
 
 
 -- | Make a numeric constant.
@@ -481,15 +431,14 @@
 splitAtV front back a val =
   case numTValue back of
 
-    -- remember that words are big-endian in cryptol, so the masked portion
-    -- needs to be first, assuming that we're on a little-endian machine.
-    Nat rightWidth | aBit ->
-      let i          = fromWord val
-       in VTuple [ word leftWidth (i `shiftR` fromInteger rightWidth)
-                 , word rightWidth i ]
+    -- Remember that words are big-endian in cryptol, so the first component
+    -- needs to be shifted, and the second component just needs to be masked.
+    Nat rightWidth | aBit, VWord (BV _ i) <- val ->
+          VTuple [ VWord (BV leftWidth (i `shiftR` fromInteger rightWidth))
+                 , VWord (mkBv rightWidth i) ]
 
     _ ->
-      let (ls,rs) = splitAt (fromInteger leftWidth) (fromSeq val)
+      let (ls,rs) = genericSplitAt leftWidth (fromSeq val)
        in VTuple [VSeq aBit ls, toSeq back a rs]
 
   where
@@ -527,6 +476,8 @@
 
 
 ccatV :: TValue -> TValue -> TValue -> Value -> Value -> Value
+ccatV _front _back (isTBit -> True) (VWord (BV i x)) (VWord (BV j y)) =
+  VWord (BV (i + j) (shiftL x (fromInteger j) + y))
 ccatV front back elty l r =
   toSeq (evalTF TCAdd [front,back]) elty (fromSeq l ++ fromSeq r)
 
@@ -541,7 +492,8 @@
       case numTValue len of
 
          -- words or finite sequences
-         Nat w | isTBit aty -> VWord (mkBv w (op (fromWord l) (fromWord r)))
+         Nat w | isTBit aty -> VWord (BV w (op (fromWord l) (fromWord r)))
+                               -- We assume that bitwise ops do not need re-masking
                | otherwise -> VSeq False (zipWith (loop aty) (fromSeq l)
                                                              (fromSeq r))
 
@@ -595,8 +547,8 @@
 
 
 logicShift :: (Integer -> Integer -> Int -> Integer)
-              -- ^ the Integer value (argument 2) may contain junk bits, but the
-              -- Int (argument 3) will always be clean
+              -- ^ The function may assume its arguments are masked.
+              -- It is responsible for masking its result if needed.
            -> (TValue -> TValue -> [Value] -> Int -> [Value])
            -> Value
 logicShift opW opS
@@ -616,7 +568,7 @@
 shiftLW :: Integer -> Integer -> Int -> Integer
 shiftLW w ival by
   | toInteger by >= w = 0
-  | otherwise         = shiftL ival by
+  | otherwise         = mask w (shiftL ival by)
 
 shiftLS :: TValue -> TValue -> [Value] -> Int -> [Value]
 shiftLS w ety vs by =
@@ -629,7 +581,7 @@
 shiftRW :: Integer -> Integer -> Int -> Integer
 shiftRW w i by
   | toInteger by >= w = 0
-  | otherwise         = shiftR (mask w i) by
+  | otherwise         = shiftR i by
 
 shiftRS :: TValue -> TValue -> [Value] -> Int -> [Value]
 shiftRS w ety vs by =
@@ -642,7 +594,7 @@
 -- XXX integer doesn't implement rotateL, as there's no bit bound
 rotateLW :: Integer -> Integer -> Int -> Integer
 rotateLW 0 i _  = i
-rotateLW w i by = (i `shiftL` b) .|. (mask w i `shiftR` (fromInteger w - b))
+rotateLW w i by = mask w $ (i `shiftL` b) .|. (i `shiftR` (fromInteger w - b))
   where b = by `mod` fromInteger w
 
 
@@ -657,7 +609,7 @@
 -- XXX integer doesn't implement rotateR, as there's no bit bound
 rotateRW :: Integer -> Integer -> Int -> Integer
 rotateRW 0 i _  = i
-rotateRW w i by = (mask w i `shiftR` b) .|. (i `shiftL` (fromInteger w - b))
+rotateRW w i by = mask w $ (i `shiftR` b) .|. (i `shiftL` (fromInteger w - b))
   where b = by `mod` fromInteger w
 
 rotateRS :: TValue -> TValue -> [Value] -> Int -> [Value]
@@ -773,8 +725,12 @@
 randomV ty seed =
   case randomValue (tValTy ty) of
     Nothing -> zeroV ty
-    Just gen -> fst $ gen 100 $ mkTFGen (fromIntegral seed)
-
+    Just gen ->
+      -- unpack the seed into four Word64s
+      let mask64 = 0xFFFFFFFFFFFFFFFF
+          unpack s = fromIntegral (s .&. mask64) : unpack (s `shiftR` 64)
+          [a, b, c, d] = take 4 (unpack seed)
+      in fst $ gen 100 $ seedTFGen (a, b, c, d)
 
 -- Miscellaneous ---------------------------------------------------------------
 
diff --git a/src/Cryptol/Prims/Syntax.hs b/src/Cryptol/Prims/Syntax.hs
--- a/src/Cryptol/Prims/Syntax.hs
+++ b/src/Cryptol/Prims/Syntax.hs
@@ -1,22 +1,25 @@
 -- |
 -- Module      :  $Header$
--- Copyright   :  (c) 2013-2015 Galois, Inc.
+-- Copyright   :  (c) 2013-2016 Galois, Inc.
 -- License     :  BSD3
 -- Maintainer  :  cryptol@galois.com
 -- Stability   :  provisional
 -- Portability :  portable
 
+{-# LANGUAGE DeriveGeneric #-}
+
 module Cryptol.Prims.Syntax
-  ( TFun(..)
-  , ECon(..)
-  , eBinOpPrec
-  , tBinOpPrec
-  , ppPrefix
+  ( TFun(..), tBinOpPrec, tfunNames
   ) where
 
+import           Cryptol.Parser.Name (PName,mkUnqual)
+import           Cryptol.Utils.Ident (packIdent,packInfix)
 import           Cryptol.Utils.PP
 import qualified Data.Map as Map
 
+import GHC.Generics (Generic)
+import Control.DeepSeq.Generics
+
 -- | Built-in types.
 data TFun
 
@@ -25,7 +28,6 @@
   | TCMul                 -- ^ @ : Num -> Num -> Num @
   | TCDiv                 -- ^ @ : Num -> Num -> Num @
   | TCMod                 -- ^ @ : Num -> Num -> Num @
-  | TCLg2                 -- ^ @ : Num -> Num @
   | TCExp                 -- ^ @ : Num -> Num -> Num @
   | TCWidth               -- ^ @ : Num -> Num @
   | TCMin                 -- ^ @ : Num -> Num -> Num @
@@ -38,88 +40,41 @@
   | TCLenFromThenTo       -- ^ @ : Num -> Num -> Num -> Num@
     -- Example: @[ 1, 5 .. 9 ] :: [lengthFromThenTo 1 5 9][b]@
 
-    deriving (Show, Eq, Ord, Bounded, Enum)
-
-
-
--- | Built-in constants.
-data ECon
-
-  = ECTrue
-  | ECFalse
-
-  | ECDemote -- ^ Converts a numeric type into its corresponding value.
-
-  -- Arith
-  | ECPlus | ECMinus | ECMul | ECDiv | ECMod
-  | ECExp | ECLg2 | ECNeg
-
-  -- Cmp
-  | ECLt | ECGt | ECLtEq | ECGtEq | ECEq | ECNotEq
-  | ECFunEq | ECFunNotEq
-  | ECMin | ECMax
-
-  -- Logic
-  | ECAnd | ECOr | ECXor | ECCompl | ECZero
-  | ECShiftL | ECShiftR | ECRotL | ECRotR
-
-  -- Sequences
-  | ECCat  | ECSplitAt
-  | ECJoin | ECSplit
-  | ECReverse | ECTranspose
-
-  | ECAt | ECAtRange | ECAtBack | ECAtRangeBack
-
-  -- Static word sequences
-  | ECFromThen | ECFromTo | ECFromThenTo
-
-  -- Infinite word sequences
-  | ECInfFrom | ECInfFromThen
-
-  -- Run-time error
-  | ECError
-
-  -- Polynomials
-  | ECPMul | ECPDiv | ECPMod
-
-  -- Random values
-  | ECRandom
-    deriving (Eq,Ord,Show,Bounded,Enum)
-
+    deriving (Show, Eq, Ord, Bounded, Enum, Generic)
 
-eBinOpPrec :: Map.Map ECon  (Assoc,Int)
-tBinOpPrec :: Map.Map TFun  (Assoc,Int)
+instance NFData TFun where rnf = genericRnf
 
-(eBinOpPrec, tBinOpPrec) = (mkMap e_table, mkMap t_table)
+tBinOpPrec :: Map.Map TFun (Assoc,Int)
+tBinOpPrec  = mkMap t_table
   where
-  mkMap t = Map.fromList [ (op,(a,n)) | ((a,ops),n) <- zip t [0..] , op <- ops ]
+  mkMap t = Map.fromList [ (op,(a,n)) | ((a,ops),n) <- zip t [1..] , op <- ops ]
 
   -- lowest to highest
-  e_table =
-    [ (LeftAssoc,  [ ECOr  ])
-    , (LeftAssoc,  [ ECXor ])
-    , (LeftAssoc,  [ ECAnd ])
-
-    , (NonAssoc,   [ ECEq, ECNotEq, ECFunEq, ECFunNotEq ])
-    , (NonAssoc,   [ ECLt, ECGt, ECLtEq, ECGtEq ])
-
-    , (RightAssoc, [ ECCat ])
-    , (LeftAssoc,  [ ECShiftL, ECShiftR, ECRotL, ECRotR ])
-
-    , (LeftAssoc,  [ ECPlus, ECMinus ])
-    , (LeftAssoc,  [ ECMul, ECDiv, ECMod ])
-    , (RightAssoc, [ ECExp ])
-
-    , (LeftAssoc,  [ ECAt, ECAtRange, ECAtBack, ECAtRangeBack ])
-    ]
-
   t_table =
     [ (LeftAssoc,   [ TCAdd, TCSub ])
     , (LeftAssoc,   [ TCMul, TCDiv, TCMod ])
     , (RightAssoc,  [ TCExp ])
     ]
 
+tfunNames :: Map.Map PName TFun
+tfunNames  = Map.fromList
+  [ tinfix  "+"                TCAdd
+  , tinfix  "-"                TCSub
+  , tinfix  "*"                TCMul
+  , tinfix  "/"                TCDiv
+  , tinfix  "%"                TCMod
+  , tinfix  "^^"               TCExp
+  , tprefix "width"            TCWidth
+  , tprefix "min"              TCMin
+  , tprefix "max"              TCMax
+  , tprefix "lengthFromThen"   TCLenFromThen
+  , tprefix "lengthFromThenTo" TCLenFromThenTo
+  ]
+  where
 
+  tprefix n p = (mkUnqual (packIdent n), p)
+  tinfix  n p = (mkUnqual (packInfix n), p)
+
 instance PP TFun where
   ppPrec _ tcon =
     case tcon of
@@ -128,7 +83,6 @@
       TCMul             -> text "*"
       TCDiv             -> text "/"
       TCMod             -> text "%"
-      TCLg2             -> text "lg2"
       TCExp             -> text "^^"
       TCWidth           -> text "width"
       TCMin             -> text "min"
@@ -136,71 +90,3 @@
 
       TCLenFromThen     -> text "lengthFromThen"
       TCLenFromThenTo   -> text "lengthFromThenTo"
-
-
-
-instance PP ECon where
-  ppPrec _ con =
-    case con of
-      ECTrue        -> text "True"
-      ECFalse       -> text "False"
-      ECPlus        -> text "+"
-      ECMinus       -> text "-"
-      ECMul         -> text "*"
-      ECDiv         -> text "/"
-      ECMod         -> text "%"
-      ECExp         -> text "^^"
-      ECLg2         -> text "lg2"
-      ECNeg         -> text "-"
-      ECLt          -> text "<"
-      ECGt          -> text ">"
-      ECLtEq        -> text "<="
-      ECGtEq        -> text ">="
-      ECEq          -> text "=="
-      ECNotEq       -> text "!="
-      ECFunEq       -> text "==="
-      ECFunNotEq    -> text "!=="
-      ECAnd         -> text "&&"
-      ECOr          -> text "||"
-      ECXor         -> text "^"
-      ECCompl       -> text "~"
-      ECShiftL      -> text "<<"
-      ECShiftR      -> text ">>"
-      ECRotL        -> text "<<<"
-      ECRotR        -> text ">>>"
-      ECCat         -> text "#"
-      ECAt          -> text "@"
-      ECAtRange     -> text "@@"
-      ECAtBack      -> text "!"
-      ECAtRangeBack -> text "!!"
-      ECMin         -> text "min"
-      ECMax         -> text "max"
-
-      ECSplitAt     -> text "splitAt"
-      ECZero        -> text "zero"
-      ECJoin        -> text "join"
-      ECSplit       -> text "split"
-      ECReverse     -> text "reverse"
-      ECTranspose   -> text "transpose"
-
-      ECDemote      -> text "demote"
-
-      ECFromThen    -> text "fromThen"
-      ECFromTo      -> text "fromTo"
-      ECFromThenTo  -> text "fromThenTo"
-
-      ECInfFrom     -> text "infFrom"
-      ECInfFromThen -> text "infFromThen"
-
-      ECError       -> text "error"
-
-      ECPMul        -> text "pmult"
-      ECPDiv        -> text "pdiv"
-      ECPMod        -> text "pmod"
-
-      ECRandom      -> text "random"
-
-ppPrefix :: ECon -> Doc
-ppPrefix con = optParens (Map.member con eBinOpPrec) (pp con)
-
-
diff --git a/src/Cryptol/Prims/Types.hs b/src/Cryptol/Prims/Types.hs
deleted file mode 100644
--- a/src/Cryptol/Prims/Types.hs
+++ /dev/null
@@ -1,335 +0,0 @@
--- |
--- Module      :  $Header$
--- Copyright   :  (c) 2013-2015 Galois, Inc.
--- License     :  BSD3
--- Maintainer  :  cryptol@galois.com
--- Stability   :  provisional
--- Portability :  portable
-
-module Cryptol.Prims.Types (typeOf) where
-
-import Cryptol.Prims.Syntax
-import Cryptol.TypeCheck.AST
-import Cryptol.Utils.Panic(panic)
-
--- | Types of built-in constants.
-typeOf :: ECon -> Schema
-typeOf econ =
-  case econ of
-
-    ECTrue  -> Forall [] [] tBit
-    ECFalse -> Forall [] [] tBit
-
-    -- {at,len} (fin len) => [len][8] -> at
-    ECError ->
-      let aT  = var 0 KType
-          len = var 1 KNum
-      in forAllNamed [ (Just "at", aT), (Just "len",len) ]
-                     [ pFin len ]
-                     (tSeq len (tWord (tNum (8::Int))) `tFun` aT)
-
-    -- Infinite word sequences
-    -- {a} (fin a) => [a] -> [inf][a]
-    ECInfFrom ->
-      let bits = var 0 KNum
-      in forAllNamed [ (Just "bits", bits) ]
-                     [ pFin bits ]
-                     (tWord bits `tFun` tSeq tInf (tWord bits))
-
-    -- {a} (fin a) => [a] -> [a] -> [inf][a]
-    ECInfFromThen ->
-      let bits = var 0 KNum
-      in forAllNamed [ (Just "bits", bits) ]
-                     [ pFin bits ]
-                    (tWord bits `tFun` tWord bits `tFun` tSeq tInf (tWord bits))
-
-    -- Static word sequences
-    -- fromThen : {first,next,bits}
-    --             ( fin first, fin next, fin bits
-    --             , bits >= width first, bits >= width next
-    --             , lengthFromThen first next bits == len
-    --             )
-    --          => [len] [bits]
-    ECFromThen ->
-      let first = var 0 KNum
-          next  = var 1 KNum
-          bits  = var 3 KNum
-          len   = var 4 KNum
-      in forAllNamed [ (Just "first", first)
-                     , (Just "next", next)
-                     , (Just "bits", bits)
-                     , (Just "len", len)
-                     ]
-        [ pFin first, pFin next, pFin bits
-        , bits >== tWidth first, bits >== tWidth next
-        , tLenFromThen first next bits =#= len
-        ]
-        (tSeq len (tWord bits))
-
-    {- { first, last, bits }
-          (fin last, fin bits, last >= first, bits >= width last)
-        => [1 + (last - first)] [bits]
-    -}
-    ECFromTo ->
-      let first = var 0 KNum
-          lst   = var 1 KNum
-          bits  = var 3 KNum
-      in forAllNamed [ (Just "first", first)
-                     , (Just "last", lst)
-                     , (Just "bits", bits)
-                     ]
-        [ pFin lst, pFin bits, lst >== first, bits >== tWidth lst ]
-        (tSeq (tNum (1 :: Int) .+. (lst .-. first)) (tWord bits))
-
-    ECFromThenTo ->
-      let first = var 0 KNum
-          next  = var 1 KNum
-          lst   = var 2 KNum
-          bits  = var 4 KNum
-          len   = var 5 KNum
-      in forAllNamed [ (Just "first", first)
-                     , (Just "next", next)
-                     , (Just "last", lst)
-                     , (Just "bits", bits)
-                     , (Just "len", len)
-                     ]
-        [ pFin first, pFin next, pFin lst, pFin bits
-        , bits >== tWidth first, bits >== tWidth next, bits >== tWidth lst
-        , tLenFromThenTo first next lst =#= len
-        ]
-        (tSeq len (tWord bits))
-
-
-
-    -- { val, bits } (fin val, fin bits, bits >= width val) => [bits]
-    ECDemote ->
-      let val  = var 0 KNum
-          bits = var 1 KNum
-      in forAllNamed [ (Just "val", val), (Just "bits", bits) ]
-                     [ pFin val, pFin bits, bits >== tWidth val ] (tWord bits)
-
-    -- Polynomials
-
-    -- {a,b} (fin a, fin b) => [a] -> [b] -> [max 1 (a + b) - 1]
-    ECPMul ->
-      let a = var 0 KNum
-          b = var 1 KNum
-      in forAllNamed [ (Nothing, a), (Nothing, b) ]
-                     [ pFin a, pFin b ]
-                     $ tWord a `tFun` tWord b `tFun`
-                       tWord (tMax (tNum (1::Int)) (a .+. b) .-. tNum (1::Int))
-
-    -- {a,b} (fin a, fin b) => [a] -> [b] -> [a]
-    ECPDiv ->
-      let a = var 0 KNum
-          b = var 1 KNum
-      in forAllNamed [ (Nothing, a), (Nothing, b) ]
-                     [ pFin a, pFin b ]
-                     $ tWord a `tFun` tWord b `tFun` tWord a
-
-    -- {a,b} (fin a, fin b) => [a] -> [b+1] -> [b]
-    ECPMod ->
-      let a = var 0 KNum
-          b = var 1 KNum
-      in forAllNamed [ (Nothing, a), (Nothing, b) ]
-                     [ pFin a, pFin b ]
-                     $ tWord a `tFun` tWord (tNum (1::Int) .+. b) `tFun` tWord b
-
-
-
-    -- Arith
-    ECPlus        -> arith2
-    ECMinus       -> arith2
-    ECMul         -> arith2
-    ECDiv         -> arith2
-    ECMod         -> arith2
-    ECExp         -> arith2
-    ECLg2         -> arith1
-    ECNeg         -> arith1
-
-    -- Cmp
-    ECLt          -> rel2
-    ECGt          -> rel2
-    ECLtEq        -> rel2
-    ECGtEq        -> rel2
-    ECEq          -> rel2
-    ECNotEq       -> rel2
-    ECFunEq       -> cmpFun
-    ECFunNotEq    -> cmpFun
-    ECMin         -> cmp2
-    ECMax         -> cmp2
-
-    -- Logic
-    ECAnd         -> logic2
-    ECOr          -> logic2
-    ECXor         -> logic2
-    ECCompl       -> logic1
-    ECZero        -> logic0
-
-    ECShiftL      -> logicShift
-    ECShiftR      -> logicShift
-    ECRotL        -> logicRot
-    ECRotR        -> logicRot
-
-    -- {a,b,c} (fin b) => [a][b]c -> [a * b]c
-    ECJoin        ->
-      let parts = var 0 KNum
-          each  = var 1 KNum
-          a     = var 2 KType
-       in forAllNamed
-          [ (Just "parts", parts)
-          , (Just "each", each)
-          , (Nothing, a)
-          ]
-          [ pFin each ]
-        $ tSeq parts (tSeq each a) `tFun` tSeq (parts .*. each) a
-
-    -- {a,b,c} (fin b) => [a * b] c -> [a][b] c
-    ECSplit       ->
-      let parts = var 0 KNum
-          each  = var 1 KNum
-          a     = var 2 KType
-       in forAllNamed
-          [ (Just "parts", parts)
-          , (Just "each", each)
-          , (Nothing, a)
-          ]
-          [ pFin each ]
-        $ tSeq (parts .*. each) a `tFun` tSeq parts (tSeq each a)
-
-    -- {a,b} (fin a) => [a] b -> [a] b
-    ECReverse ->
-      let a = var 0 KNum
-          b = var 1 KType
-      in forAllNamed [ (Nothing, a), (Nothing, b) ]
-                     [ pFin a ]
-                     (tSeq a b `tFun` tSeq a b)
-
-    -- {a,b,c} [a][b]c -> [b][a]c
-    ECTranspose ->
-      let a = var 0 KNum
-          b = var 1 KNum
-          c = var 2 KType
-      in forAllNamed [ (Nothing, a), (Nothing, b), (Nothing, c) ]
-                     []
-                     (tSeq a (tSeq b c) `tFun` tSeq b (tSeq a c))
-
-    -- Sequence selectors
-    ECAt ->
-      let n = var 0 KNum
-          a = var 1 KType
-          i = var 2 KNum
-      in forAll [n,a,i] [ pFin i ] (tSeq n a `tFun` tWord i `tFun` a)
-
-    ECAtRange ->
-      let n = var 0 KNum
-          a = var 1 KType
-          m = var 2 KNum
-          i = var 3 KNum
-      in forAll [n,a,m,i] [ pFin i ]
-         (tSeq n a `tFun` tSeq m (tWord i) `tFun` tSeq m a)
-
-    ECAtBack ->
-      let n = var 0 KNum
-          a = var 1 KType
-          i = var 2 KNum
-      in forAll [n,a,i] [ pFin n, pFin i ] (tSeq n a `tFun` tWord i `tFun` a)
-
-    ECAtRangeBack ->
-      let n = var 0 KNum
-          a = var 1 KType
-          m = var 2 KNum
-          i = var 3 KNum
-      in forAll [n,a,m,i] [ pFin n, pFin i ]
-          (tSeq n a `tFun` tSeq m (tWord i) `tFun` tSeq m a)
-
-    -- {a,b,c} (fin a) => [a+b] c -> ([a]c,[b]c)
-    ECSplitAt ->
-      let front = var 0 KNum
-          back  = var 1 KNum
-          a     = var 2 KType
-       in forAllNamed
-          [ (Just "front", front)
-          , (Just "back", back)
-          , (Nothing, a)
-          ] [ pFin front ]
-        $ tSeq (front .+. back) a `tFun` tTuple [tSeq front a, tSeq back a]
-
-    -- {a,b,d} (fin a) => [a] d -> [b] d -> [a + b] d
-    ECCat ->
-      let a = var 0 KNum
-          b = var 1 KNum
-          d = var 3 KType
-      in forAllNamed [ (Just "front", a)
-                     , (Just "back" , b)
-                     , (Nothing,d)
-                     ] [ pFin a ]
-                     $ tSeq a d `tFun` tSeq b d `tFun` tSeq (a .+. b) d
-
-    -- {a} => [32] -> a
-    ECRandom ->
-      let a = var 0 KType
-      in forAll [a] [] (tWord (tNum (32 :: Int)) `tFun` a)
-  where
-  var x k         = TVar (TVBound x k)
-
-  toTP (mb,TVar (TVBound x k)) = TParam { tpName = fmap (mkUnqual . Name) mb
-                                          , tpUnique = x, tpKind = k }
-  toTP (_,x)         = panic "Cryptol.Prims.Types.typeOf"
-                            [ "Not TBound", show x ]
-
-
-  forAllNamed xs ys p  = Forall (map toTP xs) ys p
-
-  forAll xs = forAllNamed (zip (repeat Nothing) xs)
-
-
-  -- {a} (Arith a) => a -> a -> a
-  arith2 = let a = var 0 KType
-           in forAll [a] [ pArith a ] $ a `tFun` a `tFun` a
-
-
-  -- {a} (Arith a) => a -> a
-  arith1 = let a = var 0 KType
-           in forAll [a] [ pArith a ] $ a `tFun` a
-
-  -- {a} (Cmp a) => a -> a -> Bit
-  rel2 = let a = var 0 KType
-         in forAll [a] [ pCmp a ] $ a `tFun` a `tFun` tBit
-
-  -- {a} (Cmp a) => a -> a -> a
-  cmp2 = let a = var 0 KType
-         in forAll [a] [ pCmp a ] $ a `tFun` a `tFun` a
-
-  -- {a b} (Cmp b) => (a -> b) -> (a -> b) -> a -> Bit
-  cmpFun = let a = var 0 KType
-               b = var 1 KType
-           in forAll [a,b] [ pCmp b ]
-            $ (a `tFun` b) `tFun` (a `tFun` b) `tFun` a `tFun` tBit
-
-  -- {a} a
-  logic0 = let a = var 0 KType
-           in forAll [a] [] a
-
-  -- {a} a -> a
-  logic1 = let a = var 0 KType
-           in forAll [a] [] (a `tFun` a)
-
-  -- {a} a -> a -> a
-  logic2 = let a = var 0 KType
-           in forAll [a] [] (a `tFun` a `tFun` a)
-
-
-  -- {m,n,a} (fin n) => [m] a -> [n] -> [m] a
-  logicShift = let m = var 0 KNum
-                   n = var 1 KNum
-                   a = var 2 KType
-               in forAll [m,n,a] [pFin n]
-                $ tSeq m a `tFun` tWord n `tFun` tSeq m a
-
-  -- {m,n,a} (fin n, fin m) => [m] a -> [n] -> [m] a
-  logicRot = let m = var 0 KNum
-                 n = var 1 KNum
-                 a = var 2 KType
-             in forAll [m,n,a] [pFin m, pFin n]
-              $ tSeq m a `tFun` tWord n `tFun` tSeq m a
diff --git a/src/Cryptol/REPL/Command.hs b/src/Cryptol/REPL/Command.hs
--- a/src/Cryptol/REPL/Command.hs
+++ b/src/Cryptol/REPL/Command.hs
@@ -1,12 +1,15 @@
 -- |
 -- Module      :  $Header$
--- Copyright   :  (c) 2013-2015 Galois, Inc.
+-- Copyright   :  (c) 2013-2016 Galois, Inc.
 -- License     :  BSD3
 -- Maintainer  :  cryptol@galois.com
 -- Stability   :  provisional
 -- Portability :  portable
 
-{-# LANGUAGE CPP, PatternGuards, FlexibleContexts #-}
+{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternGuards #-}
+{-# LANGUAGE RecordWildCards #-}
 module Cryptol.REPL.Command (
     -- * Commands
     Command(..), CommandDescr(..), CommandBody(..)
@@ -17,8 +20,23 @@
   , findCommandExact
   , findNbCommand
 
-  , moduleCmd, loadCmd, loadPrelude
+  , moduleCmd, loadCmd, loadPrelude, setOptionCmd
 
+    -- Parsing
+  , interactiveConfig
+  , replParseExpr
+
+    -- Evaluation and Typechecking
+  , replEvalExpr
+  , replCheckExpr
+
+    -- Check, SAT, and prove
+  , qcCmd, QCMode(..)
+  , satCmd
+  , proveCmd
+  , onlineProveSat
+  , offlineProveSat
+
     -- Misc utilities
   , handleCtrlC
   , sanitize
@@ -33,36 +51,38 @@
 import Cryptol.REPL.Trie
 
 import qualified Cryptol.ModuleSystem as M
-import qualified Cryptol.ModuleSystem.Base as M (preludeName)
+import qualified Cryptol.ModuleSystem.Name as M
 import qualified Cryptol.ModuleSystem.NamingEnv as M
 import qualified Cryptol.ModuleSystem.Renamer as M (RenamerWarning(SymbolShadowed))
+import qualified Cryptol.Utils.Ident as M
 
 import qualified Cryptol.Eval.Value as E
-import qualified Cryptol.Testing.Eval    as Test
+import Cryptol.Testing.Concrete
 import qualified Cryptol.Testing.Random  as TestR
-import qualified Cryptol.Testing.Exhaust as TestX
 import Cryptol.Parser
-    (parseExprWith,parseReplWith,ParseError(),Config(..),defaultConfig,parseModName)
-import Cryptol.Parser.Position (emptyRange,getLoc)
+    (parseExprWith,parseReplWith,ParseError(),Config(..),defaultConfig
+    ,parseModName,parseHelpName)
 import qualified Cryptol.TypeCheck.AST as T
 import qualified Cryptol.TypeCheck.Subst as T
 import qualified Cryptol.TypeCheck.InferTypes as T
+import           Cryptol.TypeCheck.Solve(defaultReplExpr)
+import qualified Cryptol.TypeCheck.Solver.CrySAT as CrySAT
 import Cryptol.TypeCheck.PP (dump,ppWithNames)
-import Cryptol.TypeCheck.Defaulting(defaultExpr)
 import Cryptol.Utils.PP
 import Cryptol.Utils.Panic(panic)
 import qualified Cryptol.Parser.AST as P
-import Cryptol.Prims.Doc(helpDoc)
 import qualified Cryptol.Transform.Specialize as S
 import Cryptol.Symbolic (ProverCommand(..), QueryType(..), SatNum(..))
 import qualified Cryptol.Symbolic as Symbolic
 
 import Control.DeepSeq
 import qualified Control.Exception as X
-import Control.Monad (guard,unless,forM_,when)
+import Control.Monad hiding (mapM, mapM_)
+import qualified Data.ByteString as BS
+import Data.Bits ((.&.))
 import Data.Char (isSpace,isPunctuation,isSymbol)
 import Data.Function (on)
-import Data.List (intercalate,isPrefixOf,nub)
+import Data.List (intercalate,nub,sortBy,partition)
 import Data.Maybe (fromMaybe,mapMaybe)
 import System.Environment (lookupEnv)
 import System.Exit (ExitCode(ExitSuccess))
@@ -71,15 +91,16 @@
 import System.FilePath((</>), isPathSeparator)
 import System.Directory(getHomeDirectory,setCurrentDirectory,doesDirectoryExist)
 import qualified Data.Map as Map
+import qualified Data.Set as Set
 import qualified Data.IntMap as IntMap
 import System.IO(hFlush,stdout)
 import System.Random.TF(newTFGen)
 import Numeric (showFFloat)
+import qualified Data.Text as ST
+import qualified Data.Text.Lazy as T
 
-#if __GLASGOW_HASKELL__ < 710
-import Control.Applicative ((<$>))
-import Data.Monoid (mempty)
-#endif
+import Prelude ()
+import Prelude.Compat
 
 -- Commands --------------------------------------------------------------------
 
@@ -108,6 +129,7 @@
 
 data CommandBody
   = ExprArg     (String   -> REPL ())
+  | FileExprArg (FilePath -> String -> REPL ())
   | DeclsArg    (String   -> REPL ())
   | ExprTypeArg (String   -> REPL ())
   | FilenameArg (FilePath -> REPL ())
@@ -138,12 +160,12 @@
   , CommandDescr [ ":b", ":browse" ] (ExprTypeArg browseCmd)
     "display the current environment"
   , CommandDescr [ ":?", ":help" ] (ExprArg helpCmd)
-    "display a brief description about a built-in operator"
+    "display a brief description about a function"
   , CommandDescr [ ":s", ":set" ] (OptionArg setOptionCmd)
     "set an environmental option (:set on its own displays current values)"
-  , CommandDescr [ ":check" ] (ExprArg (qcCmd QCRandom))
+  , CommandDescr [ ":check" ] (ExprArg (void . qcCmd QCRandom))
     "use random testing to check that the argument always returns true (if no argument, check all properties)"
-  , CommandDescr [ ":exhaust" ] (ExprArg (qcCmd QCExhaust))
+  , CommandDescr [ ":exhaust" ] (ExprArg (void . qcCmd QCExhaust))
     "use exhaustive testing to prove that the argument always returns true (if no argument, check all properties)"
   , CommandDescr [ ":prove" ] (ExprArg proveCmd)
     "use an external solver to prove that the argument always returns true (if no argument, check all properties)"
@@ -170,6 +192,10 @@
     "set the current working directory"
   , CommandDescr [ ":m", ":module" ] (FilenameArg moduleCmd)
     "load a module"
+  , CommandDescr [ ":w", ":writeByteArray" ] (FileExprArg writeFileCmd)
+    "write data of type `fin n => [n][8]` to a file"
+  , CommandDescr [ ":readByteArray" ] (FilenameArg readFileCmd)
+    "read data from a file as type `fin n => [n][8]`, binding the value to variable `it`"
   ]
 
 genHelp :: [CommandDescr] -> [String]
@@ -236,58 +262,90 @@
 -- | Randomly test a property, or exhaustively check it if the number
 -- of values in the type under test is smaller than the @tests@
 -- environment variable, or we specify exhaustive testing.
-qcCmd :: QCMode -> String -> REPL ()
+qcCmd :: QCMode -> String -> REPL [TestReport]
 qcCmd qcMode "" =
-  do xs <- getPropertyNames
+  do (xs,disp) <- getPropertyNames
+     let nameStr x = show (fixNameDisp disp (pp x))
      if null xs
-        then rPutStrLn "There are no properties in scope."
-        else forM_ xs $ \x ->
-               do rPutStr $ "property " ++ x ++ " "
-                  qcCmd qcMode x
+        then rPutStrLn "There are no properties in scope." *> return []
+        else concat <$> (forM xs $ \x ->
+               do let str = nameStr x
+                  rPutStr $ "property " ++ str ++ " "
+                  qcCmd qcMode str)
 
 qcCmd qcMode str =
   do expr <- replParseExpr str
      (val,ty) <- replEvalExpr expr
      EnvNum testNum  <- getUser "tests"
-     case TestX.testableType ty of
-       Just (sz,vss) | qcMode == QCExhaust || sz <= toInteger testNum ->
-         do rPutStrLn "Using exhaustive testing."
-            let doTest _ [] = panic "We've unexpectedly run out of test cases"
-                                    []
-                doTest _ (vs : vss1) = do
-                  result <- TestX.runOneTest val vs
+     case testableType ty of
+       Just (sz,vss) | qcMode == QCExhaust || sz <= toInteger testNum -> do
+            rPutStrLn "Using exhaustive testing."
+            let f _ [] = panic "Cryptol.REPL.Command"
+                                    ["Exhaustive testing ran out of test cases"]
+                f _ (vs : vss1) = do
+                  result <- io $ runOneTest val vs
                   return (result, vss1)
-            ok <- go doTest sz 0 vss
-            when ok $ rPutStrLn "Q.E.D."
+                testSpec = TestSpec {
+                    testFn = f
+                  , testProp = str
+                  , testTotal = sz
+                  , testPossible = sz
+                  , testRptProgress = ppProgress
+                  , testClrProgress = delProgress
+                  , testRptFailure = ppFailure
+                  , testRptSuccess = do
+                      delTesting
+                      prtLn $ "passed " ++ show sz ++ " tests."
+                      rPutStrLn "Q.E.D."
+                  }
+            prt testingMsg
+            report <- runTests testSpec vss
+            return [report]
 
-       n -> case TestR.testableType ty of
+       Just (sz,_) -> case TestR.testableType ty of
               Nothing   -> raise (TypeNotTestable ty)
-              Just gens ->
-                do rPutStrLn "Using random testing."
-                   prt testingMsg
-                   g <- io newTFGen
-                   ok <- go (TestR.runOneTest val gens) testNum 0 g
-                   when ok $
-                     case n of
-                       Just (valNum,_) ->
-                         do let valNumD = fromIntegral valNum :: Double
-                                percent = fromIntegral (testNum * 100)
-                                        / valNumD
-                                showValNum
-                                   | valNum > 2 ^ (20::Integer) =
-                                       "2^^" ++ show (round $ logBase 2 valNumD :: Integer)
-                                   | otherwise = show valNum
-                            rPutStrLn $ "Coverage: "
-                                         ++ showFFloat (Just 2) percent "% ("
-                                         ++ show testNum ++ " of "
-                                         ++ showValNum ++ " values)"
-                       Nothing -> return ()
+              Just gens -> do
+                rPutStrLn "Using random testing."
+                let testSpec = TestSpec {
+                        testFn = \sz' g -> io $ TestR.runOneTest val gens sz' g
+                      , testProp = str
+                      , testTotal = toInteger testNum
+                      , testPossible = sz
+                      , testRptProgress = ppProgress
+                      , testClrProgress = delProgress
+                      , testRptFailure = ppFailure
+                      , testRptSuccess = do
+                          delTesting
+                          prtLn $ "passed " ++ show testNum ++ " tests."
+                      }
+                prt testingMsg
+                g <- io newTFGen
+                report <- runTests testSpec g
+                when (isPass (reportResult report)) $ do
+                  let szD = fromIntegral sz :: Double
+                      percent = fromIntegral (testNum * 100) / szD
+                      showValNum
+                        | sz > 2 ^ (20::Integer) =
+                          "2^^" ++ show (lg2 sz)
+                        | otherwise = show sz
+                  rPutStrLn $ "Coverage: "
+                    ++ showFFloat (Just 2) percent "% ("
+                    ++ show testNum ++ " of "
+                    ++ showValNum ++ " values)"
+                return [report]
+       Nothing -> return []
 
   where
   testingMsg = "testing..."
 
   totProgressWidth = 4    -- 100%
 
+  lg2 :: Integer -> Integer
+  lg2 x | x >= 2^(1024::Int) = 1024 + lg2 (x `div` 2^(1024::Int))
+        | x == 0       = 0
+        | otherwise    = let valNumD = fromIntegral x :: Double
+                         in round $ logBase 2 valNumD :: Integer
+
   prt msg   = rPutStr msg >> io (hFlush stdout)
   prtLn msg = rPutStrLn msg >> io (hFlush stdout)
 
@@ -301,37 +359,23 @@
   delTesting  = del (length testingMsg)
   delProgress = del totProgressWidth
 
-  go _ totNum testNum _
-     | testNum >= totNum =
-         do delTesting
-            prtLn $ "passed " ++ show totNum ++ " tests."
-            return True
-
-  go doTest totNum testNum st =
-     do ppProgress testNum totNum
-        res <- io $ doTest (div (100 * (1 + testNum)) totNum) st
-        opts <- getPPValOpts
-        delProgress
-        case res of
-          (Test.Pass, st1) -> do delProgress
-                                 go doTest totNum (testNum + 1) st1
-          (failure, _g1) -> do
-            delTesting
-            case failure of
-              Test.FailFalse [] -> do
-                prtLn "FAILED"
-              Test.FailFalse vs -> do
-                prtLn "FAILED for the following inputs:"
-                mapM_ (rPrint . pp . E.WithBase opts) vs
-              Test.FailError err [] -> do
-                prtLn "ERROR"
-                rPrint (pp err)
-              Test.FailError err vs -> do
-                prtLn "ERROR for the following inputs:"
-                mapM_ (rPrint . pp . E.WithBase opts) vs
-                rPrint (pp err)
-              Test.Pass -> panic "Cryptol.REPL.Command" ["unexpected Test.Pass"]
-            return False
+  ppFailure failure = do
+    delTesting
+    opts <- getPPValOpts
+    case failure of
+      FailFalse [] -> do
+        prtLn "FAILED"
+      FailFalse vs -> do
+        prtLn "FAILED for the following inputs:"
+        mapM_ (rPrint . pp . E.WithBase opts) vs
+      FailError err [] -> do
+        prtLn "ERROR"
+        rPrint (pp err)
+      FailError err vs -> do
+        prtLn "ERROR for the following inputs:"
+        mapM_ (rPrint . pp . E.WithBase opts) vs
+        rPrint (pp err)
+      Pass -> panic "Cryptol.REPL.Command" ["unexpected Test.Pass"]
 
 satCmd, proveCmd :: String -> REPL ()
 satCmd = cmdProveSat True
@@ -343,14 +387,16 @@
 -- design.
 cmdProveSat :: Bool -> String -> REPL ()
 cmdProveSat isSat "" =
-  do xs <- getPropertyNames
+  do (xs,disp) <- getPropertyNames
+     let nameStr x = show (fixNameDisp disp (pp x))
      if null xs
         then rPutStrLn "There are no properties in scope."
         else forM_ xs $ \x ->
-               do if isSat
-                     then rPutStr $ ":sat "   ++ x ++ "\n\t"
-                     else rPutStr $ ":prove " ++ x ++ "\n\t"
-                  cmdProveSat isSat x
+               do let str = nameStr x
+                  if isSat
+                     then rPutStr $ ":sat "   ++ str ++ "\n\t"
+                     else rPutStr $ ":prove " ++ str ++ "\n\t"
+                  cmdProveSat isSat str
 cmdProveSat isSat expr = do
   let cexStr | isSat = "satisfying assignment"
              | otherwise = "counterexample"
@@ -375,7 +421,7 @@
             Just path -> io $ writeFile path smtlib
             Nothing -> rPutStr smtlib
     _ -> do
-      result <- onlineProveSat isSat expr proverName mfile
+      result <- onlineProveSat isSat expr mfile
       ppOpts <- getPPValOpts
       case result of
         Symbolic.EmptyResult         ->
@@ -383,7 +429,7 @@
         Symbolic.ProverError msg     -> rPutStrLn msg
         Symbolic.ThmResult ts        -> do
           rPutStrLn (if isSat then "Unsatisfiable" else "Q.E.D.")
-          let (t, e) = mkSolverResult cexStr (not isSat) (Left ts)
+          (t, e) <- mkSolverResult cexStr (not isSat) (Left ts)
           bindItVariable t e
         Symbolic.AllSatResult tevss -> do
           let tess = map (map $ \(t,e,_) -> (t,e)) tevss
@@ -395,8 +441,8 @@
                     doc = ppPrec 3 parseExpr
                 rPrint $ hsep (doc : docs) <+>
                   text (if isSat then "= True" else "= False")
-              resultRecs = map (mkSolverResult cexStr isSat . Right) tess
-              collectTes tes = (t, es)
+          resultRecs <- mapM (mkSolverResult cexStr isSat . Right) tess
+          let collectTes tes = (t, es)
                 where
                   (ts, es) = unzip tes
                   t = case nub ts of
@@ -415,12 +461,13 @@
             (t, es ) -> bindItVariables t es
 
 onlineProveSat :: Bool
-               -> String -> String -> Maybe FilePath -> REPL Symbolic.ProverResult
-onlineProveSat isSat str proverName mfile = do
+               -> String -> Maybe FilePath -> REPL Symbolic.ProverResult
+onlineProveSat isSat str mfile = do
+  EnvString proverName <- getUser "prover"
   EnvBool verbose <- getUser "debug"
   satNum <- getUserSatNum
   parseExpr <- replParseExpr str
-  (expr, schema) <- replCheckExpr parseExpr
+  (_, expr, schema) <- replCheckExpr parseExpr
   decls <- fmap M.deDecls getDynEnv
   let cmd = Symbolic.ProverCommand {
           pcQueryType    = if isSat then SatQuery satNum else ProveQuery
@@ -437,7 +484,7 @@
 offlineProveSat isSat str mfile = do
   EnvBool verbose <- getUser "debug"
   parseExpr <- replParseExpr str
-  (expr, schema) <- replCheckExpr parseExpr
+  (_, expr, schema) <- replCheckExpr parseExpr
   decls <- fmap M.deDecls getDynEnv
   let cmd = Symbolic.ProverCommand {
           pcQueryType    = if isSat then SatQuery (SomeSat 0) else ProveQuery
@@ -450,32 +497,42 @@
         }
   liftModuleCmd $ Symbolic.satProveOffline cmd
 
+rIdent :: M.Ident
+rIdent  = M.packIdent "result"
+
 -- | Make a type/expression pair that is suitable for binding to @it@
 -- after running @:sat@ or @:prove@
 mkSolverResult :: String
                -> Bool
                -> Either [T.Type] [(T.Type, T.Expr)]
-               -> (T.Type, T.Expr)
-mkSolverResult thing result earg = (rty, re)
+               -> REPL (T.Type, T.Expr)
+mkSolverResult thing result earg =
+  do prims <- getPrimMap
+     let addError t = (t, T.eError prims t ("no " ++ thing ++ " available"))
+
+         argF = case earg of
+                  Left ts   -> mkArgs (map addError ts)
+                  Right tes -> mkArgs tes
+
+         eTrue  = T.ePrim prims (M.packIdent "True")
+         eFalse = T.ePrim prims (M.packIdent "False")
+         resultE = if result then eTrue else eFalse
+
+         rty = T.TRec $ [(rIdent, T.tBit )] ++ map fst argF
+         re  = T.ERec $ [(rIdent, resultE)] ++ map snd argF
+
+     return (rty, re)
   where
-    rName = T.Name "result"
-    rty = T.TRec $ [(rName, T.tBit )] ++ map fst argF
-    re  = T.ERec $ [(rName, resultE)] ++ map snd argF
-    resultE = if result then T.eTrue else T.eFalse
-    mkArgs tes = reverse (go tes [] (1 :: Int))
-      where
-        go [] fs _ = fs
-        go ((t, e):tes') fs n = go tes' (((argName, t), (argName, e)):fs) (n+1)
-          where argName = T.Name ("arg" ++ show n)
-    argF = case earg of
-      Left ts -> mkArgs $ (map addError) ts
-        where addError t = (t, T.eError t ("no " ++ thing ++ " available"))
-      Right tes -> mkArgs tes
+  mkArgs tes = zipWith mkArg [1 :: Int ..] tes
+    where
+    mkArg n (t,e) =
+      let argName = M.packIdent ("arg" ++ show n)
+       in ((argName,t),(argName,e))
 
 specializeCmd :: String -> REPL ()
 specializeCmd str = do
   parseExpr <- replParseExpr str
-  (expr, schema) <- replCheckExpr parseExpr
+  (_, expr, schema) <- replCheckExpr parseExpr
   spexpr <- replSpecExpr expr
   rPutStrLn  "Expression type:"
   rPrint    $ pp schema
@@ -486,14 +543,50 @@
 
 typeOfCmd :: String -> REPL ()
 typeOfCmd str = do
-  expr      <- replParseExpr str
-  (def,sig) <- replCheckExpr expr
 
+  expr         <- replParseExpr str
+  (re,def,sig) <- replCheckExpr expr
+
   -- XXX need more warnings from the module system
   --io (mapM_ printWarning ws)
   whenDebug (rPutStrLn (dump def))
-  rPrint $ pp expr <+> text ":" <+> pp sig
+  (_,_,names) <- getFocusedEnv
+  rPrint $ runDoc names $ pp re <+> text ":" <+> pp sig
 
+readFileCmd :: FilePath -> REPL ()
+readFileCmd fp = do
+  bytes <- replReadFile fp (\err -> rPutStrLn (show err) >> return Nothing)
+  case bytes of
+      Nothing -> return ()
+      Just bs ->
+        do pm <- getPrimMap
+           let expr = T.eString pm (map (toEnum . fromIntegral) (BS.unpack bs))
+               ty   = T.tString (BS.length bs)
+           bindItVariable ty expr
+
+writeFileCmd :: FilePath -> String -> REPL ()
+writeFileCmd file str = do
+  expr         <- replParseExpr str
+  (val,ty)     <- replEvalExpr expr
+  if not (tIsByteSeq ty)
+   then rPrint $  "Cannot write expression of types other than [n][8]."
+              <+> "Type was: " <+> pp ty
+   else wf file =<< serializeValue val
+ where
+  wf fp bytes = replWriteFile fp bytes (rPutStrLn . show)
+  tIsByteSeq x = maybe False
+                       (tIsByte . snd)
+                       (T.tIsSeq x)
+  tIsByte    x = maybe False
+                       (\(n,b) -> T.tIsBit b && T.tIsNum n == Just 8)
+                       (T.tIsSeq x)
+  serializeValue (E.VSeq _ vs) =
+    return $ BS.pack $ map (serializeByte . E.fromVWord) vs
+  serializeValue _             =
+    panic "Cryptol.REPL.Command.writeFileCmd"
+      ["Impossible: Non-VSeq value of type [n][8]."]
+  serializeByte (E.BV _ v) = fromIntegral (v .&. 0xFF)
+
 reloadCmd :: REPL ()
 reloadCmd  = do
   mb <- getLoadedMod
@@ -559,56 +652,61 @@
 
 browseCmd :: String -> REPL ()
 browseCmd pfx = do
-  browseTSyns pfx
-  browseNewtypes pfx
-  browseVars pfx
+  (iface,names,disp) <- getFocusedEnv
+  let (visibleTypes,visibleDecls) = M.visibleNames names
 
-browseTSyns :: String -> REPL ()
-browseTSyns pfx = do
-  tsyns <- getTSyns
-  let tsyns' = Map.filterWithKey (\k _ -> pfx `isNamePrefix` k) tsyns
-  unless (Map.null tsyns') $ do
+      (visibleType,visibleDecl)
+        | null pfx  =
+          ((`Set.member` visibleTypes)
+          ,(`Set.member` visibleDecls))
+
+        | otherwise =
+          (\n -> n `Set.member` visibleTypes && pfx `isNamePrefix` n
+          ,\n -> n `Set.member` visibleDecls && pfx `isNamePrefix` n)
+
+  browseTSyns    visibleType iface disp
+  browseNewtypes visibleType iface disp
+  browseVars     visibleDecl iface disp
+
+browseTSyns :: (M.Name -> Bool) -> M.IfaceDecls -> NameDisp -> REPL ()
+browseTSyns isVisible M.IfaceDecls { .. } names = do
+  let tsyns = sortBy (M.cmpNameDisplay names `on` T.tsName)
+              [ ts | ts <- Map.elems ifTySyns, isVisible (T.tsName ts) ]
+  unless (null tsyns) $ do
     rPutStrLn "Type Synonyms"
     rPutStrLn "============="
-    let ppSyn (qn,T.TySyn _ ps cs ty) = pp (T.TySyn qn ps cs ty)
-    rPrint (nest 4 (vcat (map ppSyn (Map.toList tsyns'))))
+    rPrint (runDoc names (nest 4 (vcat (map pp tsyns))))
     rPutStrLn ""
 
-browseNewtypes :: String -> REPL ()
-browseNewtypes pfx = do
-  nts <- getNewtypes
-  let nts' = Map.filterWithKey (\k _ -> pfx `isNamePrefix` k) nts
-  unless (Map.null nts') $ do
+browseNewtypes :: (M.Name -> Bool) -> M.IfaceDecls -> NameDisp -> REPL ()
+browseNewtypes isVisible M.IfaceDecls { .. } names = do
+  let nts = sortBy (M.cmpNameDisplay names `on` T.ntName)
+            [ nt | nt <- Map.elems ifNewtypes, isVisible (T.ntName nt) ]
+  unless (null nts) $ do
     rPutStrLn "Newtypes"
     rPutStrLn "========"
-    let ppNT (qn,nt) = T.ppNewtypeShort (nt { T.ntName = qn })
-    rPrint (nest 4 (vcat (map ppNT (Map.toList nts'))))
+    rPrint (runDoc names (nest 4 (vcat (map T.ppNewtypeShort nts))))
     rPutStrLn ""
 
-browseVars :: String -> REPL ()
-browseVars pfx = do
-  vars <- getVars
-  let allNames = vars
-          {- This shows the built-ins as well:
-             Map.union vars
-                  (Map.fromList [ (Name x,t) | (x,(_,t)) <- builtIns ]) -}
-      vars' = Map.filterWithKey (\k _ -> pfx `isNamePrefix` k) allNames
+browseVars :: (M.Name -> Bool) -> M.IfaceDecls -> NameDisp -> REPL ()
+browseVars isVisible M.IfaceDecls { .. } names = do
+  let vars = sortBy (M.cmpNameDisplay names `on` M.ifDeclName)
+             [ d | d <- Map.elems ifDecls, isVisible (M.ifDeclName d) ]
 
-      isProp p     = T.PragmaProperty `elem` (M.ifDeclPragmas p)
-      (props,syms) = Map.partition isProp vars'
 
+  let isProp p     = T.PragmaProperty `elem` (M.ifDeclPragmas p)
+      (props,syms) = partition isProp vars
+
   ppBlock "Properties" props
-  ppBlock "Symbols" syms
+  ppBlock "Symbols"    syms
 
   where
-  ppBlock name xs =
-    unless (Map.null xs) $ do
-      rPutStrLn name
-      rPutStrLn (replicate (length name) '=')
-      let step k d acc =
-              pp k <+> char ':' <+> pp (M.ifDeclSig d) : acc
-      rPrint (nest 4 (vcat (Map.foldrWithKey step [] xs)))
-      rPutStrLn ""
+  ppBlock name xs = unless (null xs) $
+    do rPutStrLn name
+       rPutStrLn (replicate (length name) '=')
+       let ppVar M.IfaceDecl { .. } = pp ifDeclName <+> char ':' <+> pp ifDeclSig
+       rPrint (runDoc names (nest 4 (vcat (map ppVar xs))))
+       rPutStrLn ""
 
 
 
@@ -628,6 +726,7 @@
     ev <- tryGetUser k
     case ev of
       Just (EnvString s)   -> rPutStrLn (k ++ " = " ++ s)
+      Just (EnvProg p as)  -> rPutStrLn (k ++ " = " ++ intercalate " " (p:as))
       Just (EnvNum n)      -> rPutStrLn (k ++ " = " ++ show n)
       Just (EnvBool True)  -> rPutStrLn (k ++ " = on")
       Just (EnvBool False) -> rPutStrLn (k ++ " = off")
@@ -637,15 +736,39 @@
                                    rPutStrLn ("Did you mean: `:set " ++ k1 ++ " =" ++ k2 ++ "`?")
 
 
+-- XXX at the moment, this can only look at declarations.
 helpCmd :: String -> REPL ()
 helpCmd cmd
-  | null cmd = mapM_ rPutStrLn (genHelp commandList)
-  | Just (ec,_) <- lookup cmd builtIns =
-                rPrint $ helpDoc ec
-  | otherwise = do rPutStrLn $ "// No documentation is available."
-                   typeOfCmd cmd
+  | null cmd  = mapM_ rPutStrLn (genHelp commandList)
+  | otherwise =
+    case parseHelpName cmd of
+      Just qname ->
+        do (env,rnEnv,nameEnv) <- getFocusedEnv
+           name <- liftModuleCmd (M.renameVar rnEnv qname)
+           case Map.lookup name (M.ifDecls env) of
+             Just M.IfaceDecl { .. } ->
+               do rPutStrLn ""
 
+                  let property
+                        | P.PragmaProperty `elem` ifDeclPragmas = text "property"
+                        | otherwise                             = empty
+                  rPrint $ runDoc nameEnv
+                         $ nest 4
+                         $ property
+                           <+> pp qname
+                           <+> colon
+                           <+> pp (ifDeclSig)
 
+                  case ifDeclDoc of
+                    Just str -> rPutStrLn ('\n' : str)
+                    Nothing  -> return ()
+
+             Nothing -> rPutStrLn "// No documentation is available."
+
+      Nothing ->
+           rPutStrLn ("Unable to parse name: " ++ cmd)
+
+
 runShellCmd :: String -> REPL ()
 runShellCmd cmd
   = io $ do h <- Process.runCommand cmd
@@ -669,11 +792,14 @@
 
 -- Utilities -------------------------------------------------------------------
 
-isNamePrefix :: String -> P.QName -> Bool
-isNamePrefix pfx n = case n of
-  P.QName _ (P.Name _) -> pfx `isPrefixOf` pretty n
-  _                    -> False
+isNamePrefix :: String -> M.Name -> Bool
+isNamePrefix pfx =
+  let pfx' = ST.pack pfx
+   in \n -> case M.nameInfo n of
+              M.Declared _ -> pfx' `ST.isPrefixOf` M.identText (M.nameIdent n)
+              M.Parameter  -> False
 
+
 {-
 printWarning :: (Range,Warning) -> IO ()
 printWarning = print . ppWarning
@@ -688,15 +814,18 @@
   Right a -> return a
   Left e  -> raise (ParseError e)
 
-replParseInput :: String -> REPL P.ReplInput
-replParseInput = replParse $ parseReplWith interactiveConfig
+replParseInput :: String -> REPL (P.ReplInput P.PName)
+replParseInput = replParse (parseReplWith interactiveConfig . T.pack)
 
-replParseExpr :: String -> REPL P.Expr
-replParseExpr = replParse $ parseExprWith interactiveConfig
+replParseExpr :: String -> REPL (P.Expr P.PName)
+replParseExpr = replParse (parseExprWith interactiveConfig . T.pack)
 
 interactiveConfig :: Config
 interactiveConfig = defaultConfig { cfgSource = "<interactive>" }
 
+getPrimMap :: REPL M.PrimMap
+getPrimMap  = liftModuleCmd M.getPrimMap
+
 liftModuleCmd :: M.ModuleCmd a -> REPL a
 liftModuleCmd cmd = moduleCmdResult =<< io . cmd =<< getModuleEnv
 
@@ -715,7 +844,7 @@
           ys -> Just (M.TypeCheckWarnings ys)
       filterDefaults w = Just w
 
-      isShadowWarn (M.SymbolShadowed _ _) = True
+      isShadowWarn (M.SymbolShadowed _ _ _) = True
 
       filterShadowing w | warnShadowing = Just w
       filterShadowing (M.RenamerWarnings xs) =
@@ -725,41 +854,46 @@
       filterShadowing w = Just w
 
   let ws = mapMaybe filterDefaults . mapMaybe filterShadowing $ ws0
-  mapM_ (rPrint . pp) ws
+  (_,_,names) <- getFocusedEnv
+  mapM_ (rPrint . runDoc names . pp) ws
   case res of
     Right (a,me') -> setModuleEnv me' >> return a
-    Left err      -> raise (ModuleSystemError err)
+    Left err      -> raise (ModuleSystemError names err)
 
-replCheckExpr :: P.Expr -> REPL (T.Expr,T.Schema)
+replCheckExpr :: P.Expr P.PName -> REPL (P.Expr M.Name,T.Expr,T.Schema)
 replCheckExpr e = liftModuleCmd $ M.checkExpr e
 
 -- | Check declarations as though they were defined at the top-level.
-replCheckDecls :: [P.Decl] -> REPL [T.DeclGroup]
+replCheckDecls :: [P.Decl P.PName] -> REPL [T.DeclGroup]
 replCheckDecls ds = do
-  npds <- liftModuleCmd $ M.noPat ds
-  denv <- getDynEnv
-  let dnames = M.namingEnv npds
-  ne' <- M.travNamingEnv uniqify dnames
-  let denv' = denv { M.deNames = ne' `M.shadowing` M.deNames denv }
-      undo exn = do
-        -- if typechecking fails, we want to revert changes to the
-        -- dynamic environment and reraise
-        setDynEnv denv
-        raise exn
-  setDynEnv denv'
-  let topDecls = [ P.Decl (P.TopLevel P.Public d) | d <- npds ]
-  catch (liftModuleCmd $ M.checkDecls topDecls) undo
 
+  -- check the decls
+  npds        <- liftModuleCmd (M.noPat ds)
+
+  let mkTop d = P.Decl P.TopLevel { P.tlExport = P.Public
+                                  , P.tlDoc    = Nothing
+                                  , P.tlValue  = d }
+  (names,ds') <- liftModuleCmd (M.checkDecls (map mkTop npds))
+
+  -- extend the naming env
+  denv        <- getDynEnv
+  setDynEnv denv { M.deNames = names `M.shadowing` M.deNames denv }
+
+  return ds'
+
 replSpecExpr :: T.Expr -> REPL T.Expr
 replSpecExpr e = liftModuleCmd $ S.specialize e
 
-replEvalExpr :: P.Expr -> REPL (E.Value, T.Type)
+replEvalExpr :: P.Expr P.PName -> REPL (E.Value, T.Type)
 replEvalExpr expr =
-  do (def,sig) <- replCheckExpr expr
+  do (_,def,sig) <- replCheckExpr expr
 
-     let range = fromMaybe emptyRange (getLoc expr)
+     me <- getModuleEnv
+     let cfg = M.meSolverConfig me
+     mbDef <- io $ CrySAT.withSolver cfg (\s -> defaultReplExpr s def sig)
+
      (def1,ty) <-
-        case defaultExpr range def sig of
+        case mbDef of
           Nothing -> raise (EvalPolyError sig)
           Just (tys,def1) ->
             do let nms = T.addTNames (T.sVars sig) IntMap.empty
@@ -777,26 +911,40 @@
   warnDefault ns (x,t) =
         rPrint $ text "Assuming" <+> ppWithNames ns x <+> text "=" <+> pp t
 
+itIdent :: M.Ident
+itIdent  = M.packIdent "it"
+
+replWriteFile :: FilePath -> BS.ByteString -> (X.SomeException -> REPL ()) -> REPL ()
+replWriteFile fp bytes handler =
+ do x <- io $ X.catch (BS.writeFile fp bytes >> return Nothing) (return . Just)
+    maybe (return ()) handler x
+
+replReadFile :: FilePath -> (X.SomeException -> REPL (Maybe BS.ByteString)) -> REPL (Maybe BS.ByteString)
+replReadFile fp handler =
+ do x <- io $ X.catch (Right `fmap` BS.readFile fp) (\e -> return $ Left e)
+    either handler (return . Just) x
+
 -- | Creates a fresh binding of "it" to the expression given, and adds
 -- it to the current dynamic environment
 bindItVariable :: T.Type -> T.Expr -> REPL ()
 bindItVariable ty expr = do
-  let it = T.QName Nothing (P.Name "it")
-  freshIt <- uniqify it
-  let dg = T.NonRecursive decl
-      schema = T.Forall { T.sVars  = []
+  freshIt <- freshName itIdent
+  let schema = T.Forall { T.sVars  = []
                         , T.sProps = []
                         , T.sType  = ty
                         }
       decl = T.Decl { T.dName       = freshIt
                     , T.dSignature  = schema
-                    , T.dDefinition = expr
+                    , T.dDefinition = T.DExpr expr
                     , T.dPragmas    = []
+                    , T.dInfix      = False
+                    , T.dFixity     = Nothing
+                    , T.dDoc        = Nothing
                     }
-  liftModuleCmd (M.evalDecls [dg])
+  liftModuleCmd (M.evalDecls [T.NonRecursive decl])
   denv <- getDynEnv
-  let en = M.EFromBind (P.Located emptyRange freshIt)
-      nenv' = M.singletonE it en `M.shadowing` M.deNames denv
+  let nenv' = M.singletonE (P.UnQual itIdent) freshIt
+                           `M.shadowing` M.deNames denv
   setDynEnv $ denv { M.deNames = nenv' }
 
 -- | Creates a fresh binding of "it" to a finite sequence of
@@ -809,7 +957,7 @@
     seqTy = T.tSeq (T.tNum len) ty
     seqExpr = T.EList exprs ty
 
-replEvalDecl :: P.Decl -> REPL ()
+replEvalDecl :: P.Decl P.PName -> REPL ()
 replEvalDecl decl = do
   dgs <- replCheckDecls [decl]
   whenDebug (mapM_ (\dg -> (rPutStrLn (dump dg))) dgs)
@@ -889,7 +1037,10 @@
       OptionArg   body -> Just (Command (body args'))
       ShellArg    body -> Just (Command (body args'))
       NoArg       body -> Just (Command  body)
-
+      FileExprArg body ->
+        case extractFilePath args' of
+           Just (fp,expr) -> Just (Command (expandHome fp >>= flip body expr))
+           Nothing        -> Nothing
     [] -> case uncons cmd of
       Just (':',_) -> Just (Unknown cmd)
       Just _       -> Just (Command (evalCmd line))
@@ -903,3 +1054,11 @@
       '~' : c : more | isPathSeparator c -> do dir <- io getHomeDirectory
                                                return (dir </> more)
       _ -> return path
+
+  extractFilePath ipt =
+    let quoted q = (\(a,b) -> (a, drop 1 b)) . break (== q)
+    in case ipt of
+        ""        -> Nothing
+        '\'':rest -> Just $ quoted '\'' rest
+        '"':rest  -> Just $ quoted '"' rest
+        _         -> Just $ break isSpace ipt
diff --git a/src/Cryptol/REPL/Monad.hs b/src/Cryptol/REPL/Monad.hs
--- a/src/Cryptol/REPL/Monad.hs
+++ b/src/Cryptol/REPL/Monad.hs
@@ -1,15 +1,18 @@
 -- |
 -- Module      :  $Header$
--- Copyright   :  (c) 2013-2015 Galois, Inc.
+-- Copyright   :  (c) 2013-2016 Galois, Inc.
 -- License     :  BSD3
 -- Maintainer  :  cryptol@galois.com
 -- Stability   :  provisional
 -- Portability :  portable
 
-{-# LANGUAGE PatternGuards #-}
 {-# LANGUAGE DeriveDataTypeable #-}
-{-# LANGUAGE RecordWildCards #-}
 {-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE PatternGuards #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE ViewPatterns #-}
 
 module Cryptol.REPL.Monad (
     -- * REPL Monad
@@ -27,9 +30,10 @@
   , rethrowEvalError
 
     -- ** Environment
+  , getFocusedEnv
   , getModuleEnv, setModuleEnv
   , getDynEnv, setDynEnv
-  , uniqify
+  , uniqify, freshName
   , getTSyns, getNewtypes, getVars
   , whenDebug
   , getExprNames
@@ -37,7 +41,6 @@
   , getPropertyNames
   , LoadedModule(..), getLoadedMod, setLoadedMod
   , setSearchPath, prependSearchPath
-  , builtIns
   , getPrompt
   , shouldContinue
   , unlessBatch
@@ -67,25 +70,31 @@
 
 import Cryptol.REPL.Trie
 
-import Cryptol.Prims.Types(typeOf)
-import Cryptol.Prims.Syntax(ECon(..),ppPrefix)
 import Cryptol.Eval (EvalError)
 import qualified Cryptol.ModuleSystem as M
 import qualified Cryptol.ModuleSystem.Env as M
+import qualified Cryptol.ModuleSystem.Name as M
 import qualified Cryptol.ModuleSystem.NamingEnv as M
 import Cryptol.Parser (ParseError,ppError)
 import Cryptol.Parser.NoInclude (IncludeError,ppIncludeError)
 import Cryptol.Parser.NoPat (Error)
+import Cryptol.Parser.Position (emptyRange)
 import qualified Cryptol.TypeCheck.AST as T
+import qualified Cryptol.TypeCheck as T
+import qualified Cryptol.Utils.Ident as I
 import Cryptol.Utils.PP
 import Cryptol.Utils.Panic (panic)
 import qualified Cryptol.Parser.AST as P
 import Cryptol.Symbolic (proverNames, lookupProver, SatNum(..))
 
 import Control.Monad (ap,unless,when)
+import Control.Monad.Base
+import Control.Monad.IO.Class
+import Control.Monad.Trans.Control
+import Data.Char (isSpace)
 import Data.IORef
-    (IORef,newIORef,readIORef,modifyIORef)
-import Data.List (intercalate, isPrefixOf)
+    (IORef,newIORef,readIORef,modifyIORef,atomicModifyIORef)
+import Data.List (intercalate, isPrefixOf, unfoldr, sortBy)
 import Data.Maybe (catMaybes)
 import Data.Typeable (Typeable)
 import System.Directory (findExecutable)
@@ -95,10 +104,8 @@
 
 import Data.SBV.Dynamic (sbvCheckSolverInstallation)
 
-#if __GLASGOW_HASKELL__ < 710
-import Control.Applicative ((<$>), Applicative(..))
-import Data.Monoid (Monoid(..))
-#endif
+import Prelude ()
+import Prelude.Compat
 
 -- REPL Environment ------------------------------------------------------------
 
@@ -113,7 +120,6 @@
   , eContinue    :: Bool
   , eIsBatch     :: Bool
   , eModuleEnv   :: M.ModuleEnv
-  , eNameSupply  :: Int
   , eUserEnv     :: UserEnv
   , ePutStr      :: String -> IO ()
   , eLetEnabled  :: Bool
@@ -129,7 +135,6 @@
     , eContinue    = True
     , eIsBatch     = isBatch
     , eModuleEnv   = env
-    , eNameSupply  = 0
     , eUserEnv     = mkUserEnv userOptions
     , ePutStr      = putStr
     , eLetEnabled  = True
@@ -172,7 +177,23 @@
     x <- unREPL m ref
     unREPL (f x) ref
 
+instance MonadIO REPL where
+  liftIO = io
 
+instance MonadBase IO REPL where
+  liftBase = liftIO
+
+instance MonadBaseControl IO REPL where
+  type StM REPL a = a
+  liftBaseWith f = REPL $ \ref ->
+    f $ \m -> unREPL m ref
+  restoreM x = return x
+
+instance M.FreshM REPL where
+  liftSupply f = modifyRW $ \ RW { .. } ->
+    let (a,s') = f (M.meSupply eModuleEnv)
+     in (RW { eModuleEnv = eModuleEnv { M.meSupply = s' }, .. },a)
+
 -- Exceptions ------------------------------------------------------------------
 
 -- | REPL exceptions.
@@ -183,7 +204,7 @@
   | NoPatError [Error]
   | NoIncludeError [IncludeError]
   | EvalError EvalError
-  | ModuleSystemError M.ModuleError
+  | ModuleSystemError NameDisp M.ModuleError
   | EvalPolyError T.Schema
   | TypeNotTestable T.Type
     deriving (Show,Typeable)
@@ -203,7 +224,7 @@
                                   ]
     NoPatError es        -> vcat (map pp es)
     NoIncludeError es    -> vcat (map ppIncludeError es)
-    ModuleSystemError me -> pp me
+    ModuleSystemError ns me -> fixNameDisp ns (pp me)
     EvalError e          -> pp e
     EvalPolyError s      -> text "Cannot evaluate polymorphic value."
                          $$ text "Type:" <+> pp s
@@ -239,6 +260,9 @@
 getRW :: REPL RW
 getRW  = REPL readIORef
 
+modifyRW :: (RW -> (RW,a)) -> REPL a
+modifyRW f = REPL (\ ref -> atomicModifyIORef ref f)
+
 modifyRW_ :: (RW -> RW) -> REPL ()
 modifyRW_ f = REPL (\ ref -> modifyIORef ref f)
 
@@ -329,57 +353,56 @@
 rPrint :: Show a => a -> REPL ()
 rPrint x = rPutStrLn (show x)
 
-builtIns :: [(String,(ECon,T.Schema))]
-builtIns = map mk [ minBound .. maxBound :: ECon ]
-  where mk x = (show (ppPrefix x), (x, typeOf x))
+getFocusedEnv :: REPL (M.IfaceDecls,M.NamingEnv,NameDisp)
+getFocusedEnv  = do
+  me <- getModuleEnv
+  -- dyNames is a NameEnv that removes the #Uniq prefix from interactively-bound
+  -- variables.
+  let (dyDecls,dyNames,dyDisp) = M.dynamicEnv me
+  let (fDecls,fNames,fDisp) = M.focusedEnv me
+  return ( dyDecls `mappend` fDecls
+         , dyNames `M.shadowing` fNames
+         , dyDisp `mappend` fDisp)
 
--- | Only meant for use with one of getVars or getTSyns.
-keepOne :: String -> [a] -> a
-keepOne src as = case as of
-  [a] -> a
-  _   -> panic ("REPL: " ++ src) ["name clash in interface file"]
+  -- -- the subtle part here is removing the #Uniq prefix from
+  -- -- interactively-bound variables, and also excluding any that are
+  -- -- shadowed and thus can no longer be referenced
+  -- let (fDecls,fNames,fDisp) = M.focusedEnv me
+  --     edecls = M.ifDecls dyDecls
+  --     -- is this QName something the user might actually type?
+  --     isShadowed (qn@(P.QName (Just (P.unModName -> ['#':_])) name), _) =
+  --         case Map.lookup localName neExprs of
+  --           Nothing -> False
+  --           Just uniqueNames -> isNamed uniqueNames
+  --       where localName = P.QName Nothing name
+  --             isNamed us = any (== qn) (map M.qname us)
+  --             neExprs = M.neExprs (M.deNames (M.meDynEnv me))
+  --     isShadowed _ = False
+  --     unqual ((P.QName _ name), ifds) = (P.QName Nothing name, ifds)
+  --     edecls' = Map.fromList
+  --             . map unqual
+  --             . filter isShadowed
+  --             $ Map.toList edecls
+  -- return (decls `mappend` mempty { M.ifDecls = edecls' }, names `mappend` dyNames)
 
-getVars :: REPL (Map.Map P.QName M.IfaceDecl)
+getVars :: REPL (Map.Map M.Name M.IfaceDecl)
 getVars  = do
-  me <- getModuleEnv
-  denv <- getDynEnv
-  -- the subtle part here is removing the #Uniq prefix from
-  -- interactively-bound variables, and also excluding any that are
-  -- shadowed and thus can no longer be referenced
-  let decls = M.focusedEnv me
-      edecls = M.ifDecls (M.deIfaceDecls denv)
-      -- is this QName something the user might actually type?
-      isShadowed (qn@(P.QName (Just (P.ModName ['#':_])) name), _) =
-          case Map.lookup localName neExprs of
-            Nothing -> False
-            Just uniqueNames -> isNamed uniqueNames
-        where localName = P.QName Nothing name
-              isNamed us = any (== qn) (map M.qname us)
-              neExprs = M.neExprs (M.deNames denv)
-      isShadowed _ = False
-      unqual ((P.QName _ name), ifds) = (P.QName Nothing name, ifds)
-      edecls' = Map.fromList
-              . map unqual
-              . filter isShadowed
-              $ Map.toList edecls
-  return (keepOne "getVars" `fmap` (M.ifDecls decls `mappend` edecls'))
+  (decls,_,_) <- getFocusedEnv
+  return (M.ifDecls decls)
 
-getTSyns :: REPL (Map.Map P.QName T.TySyn)
+getTSyns :: REPL (Map.Map M.Name T.TySyn)
 getTSyns  = do
-  me <- getModuleEnv
-  let decls = M.focusedEnv me
-  return (keepOne "getTSyns" `fmap` M.ifTySyns decls)
+  (decls,_,_) <- getFocusedEnv
+  return (M.ifTySyns decls)
 
-getNewtypes :: REPL (Map.Map P.QName T.Newtype)
+getNewtypes :: REPL (Map.Map M.Name T.Newtype)
 getNewtypes = do
-  me <- getModuleEnv
-  let decls = M.focusedEnv me
-  return (keepOne "getNewtypes" `fmap` M.ifNewtypes decls)
+  (decls,_,_) <- getFocusedEnv
+  return (M.ifNewtypes decls)
 
 -- | Get visible variable names.
 getExprNames :: REPL [String]
-getExprNames  = do as <- (map getName . Map.keys) `fmap` getVars
-                   return (map fst builtIns ++ as)
+getExprNames  = (map getName . Map.keys) `fmap` getVars
 
 -- | Get visible type signature names.
 getTypeNames :: REPL [String]
@@ -388,13 +411,20 @@
      nts <- getNewtypes
      return $ map getName $ Map.keys tss ++ Map.keys nts
 
-getPropertyNames :: REPL [String]
+-- | Return a list of property names.
+--
+-- NOTE: we sort by displayed name here, but it would be just as easy to sort by
+-- the position in the file, using nameLoc.
+getPropertyNames :: REPL ([M.Name],NameDisp)
 getPropertyNames =
-  do xs <- getVars
-     return [ getName x | (x,d) <- Map.toList xs,
-                T.PragmaProperty `elem` M.ifDeclPragmas d ]
+  do (decls,_,names) <- getFocusedEnv
+     let xs = M.ifDecls decls
+         ps = sortBy (M.cmpNameDisplay names)
+            $ [ x | (x,d) <- Map.toList xs, T.PragmaProperty `elem` M.ifDeclPragmas d ]
 
-getName :: P.QName -> String
+     return (ps, names)
+
+getName :: M.Name -> String
 getName  = show . pp
 
 getModuleEnv :: REPL M.ModuleEnv
@@ -414,15 +444,33 @@
 -- | Given an existing qualified name, prefix it with a
 -- relatively-unique string. We make it unique by prefixing with a
 -- character @#@ that is not lexically valid in a module name.
-uniqify :: P.QName -> REPL P.QName
-uniqify (P.QName Nothing name) = do
-  i <- eNameSupply `fmap` getRW
-  modifyRW_ (\rw -> rw { eNameSupply = i+1 })
-  let modname' = P.ModName [ '#' : ("Uniq_" ++ show i) ]
-  return (P.QName (Just modname') name)
-uniqify qn =
-  panic "[REPL] uniqify" ["tried to uniqify a qualified name: " ++ pretty qn]
+uniqify :: M.Name -> REPL M.Name
 
+uniqify name =
+  case M.nameInfo name of
+    M.Declared ns ->
+      M.liftSupply (M.mkDeclared ns (M.nameIdent name) (M.nameLoc name))
+
+    M.Parameter ->
+      panic "[REPL] uniqify" ["tried to uniqify a parameter: " ++ pretty name]
+
+
+-- uniqify (P.QName Nothing name) = do
+--   i <- eNameSupply `fmap` getRW
+--   modifyRW_ (\rw -> rw { eNameSupply = i+1 })
+--   let modname' = P.mkModName [ '#' : ("Uniq_" ++ show i) ]
+--   return (P.QName (Just modname') name)
+
+-- uniqify qn =
+--   panic "[REPL] uniqify" ["tried to uniqify a qualified name: " ++ pretty qn]
+
+
+-- | Generate a fresh name using the given index. The name will reside within
+-- the "<interactive>" namespace.
+freshName :: I.Ident -> REPL M.Name
+freshName i = M.liftSupply (M.mkDeclared I.interactiveName i emptyRange)
+
+
 -- User Environment Interaction ------------------------------------------------
 
 -- | User modifiable environment, for things like numeric base.
@@ -430,6 +478,7 @@
 
 data EnvVal
   = EnvString String
+  | EnvProg   String [String]
   | EnvNum    !Int
   | EnvBool   Bool
     deriving (Show)
@@ -455,6 +504,14 @@
                         Just err -> io (putStrLn err)
                         Nothing  -> writeEnv (EnvString val)
 
+    EnvProg _ _ ->
+      case splitOptArgs val of
+        prog:args -> do r <- io (optCheck opt (EnvProg prog args))
+                        case r of
+                          Just err -> io (putStrLn err)
+                          Nothing  -> writeEnv (EnvProg prog args)
+        []        -> io (putStrLn ("Failed to parse command for field, `" ++ name ++ "`"))
+
     EnvNum _ -> case reads val of
       [(x,_)] -> do r <- io (optCheck opt (EnvNum x))
                     case r of
@@ -476,6 +533,27 @@
       do optEff opt ev
          modifyRW_ (\rw -> rw { eUserEnv = Map.insert name ev (eUserEnv rw) })
 
+splitOptArgs :: String -> [String]
+splitOptArgs  = unfoldr (parse "")
+  where
+
+  parse acc (c:cs) | isQuote c       = quoted (c:acc) cs
+                   | not (isSpace c) = parse (c:acc) cs
+                   | otherwise       = result acc cs
+  parse acc []                       = result acc []
+
+  quoted acc (c:cs) | isQuote c      = parse  (c:acc) cs
+                    | otherwise      = quoted (c:acc) cs
+  quoted acc []                      = result acc []
+
+  result []  [] = Nothing
+  result []  cs = parse [] (dropWhile isSpace cs)
+  result acc cs = Just (reverse acc, dropWhile isSpace cs)
+
+  isQuote :: Char -> Bool
+  isQuote c = c `elem` ("'\"" :: String)
+
+
 -- | Get a user option, using Maybe for failure.
 tryGetUser :: String -> REPL (Maybe EnvVal)
 tryGetUser name = do
@@ -540,6 +618,32 @@
     \case EnvBool b -> do me <- getModuleEnv
                           setModuleEnv me { M.meMonoBinds = b }
           _         -> return ()
+
+  , OptionDescr "tc-solver" (EnvProg "z3" [ "-smt2", "-in" ])
+    (const (return Nothing)) -- TODO: check for the program in the path
+    "The solver that will be used by the type checker" $
+    \case EnvProg prog args -> do me <- getModuleEnv
+                                  let cfg = M.meSolverConfig me
+                                  setModuleEnv me { M.meSolverConfig =
+                                                      cfg { T.solverPath = prog
+                                                          , T.solverArgs = args } }
+          _                 -> return ()
+
+  , OptionDescr "tc-debug" (EnvNum 0)
+    (const (return Nothing))
+    "Enable type-checker debugging output" $
+    \case EnvNum n -> do me <- getModuleEnv
+                         let cfg = M.meSolverConfig me
+                         setModuleEnv me { M.meSolverConfig = cfg{ T.solverVerbose = fromIntegral n } }
+          _        -> return ()
+  , OptionDescr "core-lint" (EnvBool False)
+    (const (return Nothing))
+    "Enable sanity checking of type-checker" $
+      let setIt x = do me <- getModuleEnv
+                       setModuleEnv me { M.meCoreLint = x }
+      in \case EnvBool True  -> setIt M.CoreLint
+               EnvBool False -> setIt M.NoCoreLint
+               _             -> return ()
   ]
 
 -- | Check the value to the `base` option.
@@ -625,3 +729,6 @@
   case mPath of
     Nothing -> return (Just Z3NotFound)
     Just _  -> return Nothing
+
+
+
diff --git a/src/Cryptol/REPL/Trie.hs b/src/Cryptol/REPL/Trie.hs
--- a/src/Cryptol/REPL/Trie.hs
+++ b/src/Cryptol/REPL/Trie.hs
@@ -1,6 +1,6 @@
 -- |
 -- Module      :  $Header$
--- Copyright   :  (c) 2013-2015 Galois, Inc.
+-- Copyright   :  (c) 2013-2016 Galois, Inc.
 -- License     :  BSD3
 -- Maintainer  :  cryptol@galois.com
 -- Stability   :  provisional
diff --git a/src/Cryptol/Symbolic.hs b/src/Cryptol/Symbolic.hs
--- a/src/Cryptol/Symbolic.hs
+++ b/src/Cryptol/Symbolic.hs
@@ -1,6 +1,6 @@
 -- |
 -- Module      :  $Header$
--- Copyright   :  (c) 2013-2015 Galois, Inc.
+-- Copyright   :  (c) 2013-2016 Galois, Inc.
 -- License     :  BSD3
 -- Maintainer  :  cryptol@galois.com
 -- Stability   :  provisional
@@ -11,6 +11,7 @@
 {-# LANGUAGE RecordWildCards #-}
 {-# LANGUAGE ScopedTypeVariables #-}
 {-# LANGUAGE TupleSections #-}
+{-# LANGUAGE FlexibleContexts #-}
 
 module Cryptol.Symbolic where
 
@@ -21,8 +22,9 @@
 
 import qualified Data.SBV.Dynamic as SBV
 
-import qualified Cryptol.ModuleSystem as M
+import qualified Cryptol.ModuleSystem as M hiding (getPrimMap)
 import qualified Cryptol.ModuleSystem.Env as M
+import qualified Cryptol.ModuleSystem.Base as M
 import qualified Cryptol.ModuleSystem.Monad as M
 
 import Cryptol.Symbolic.Prims
@@ -33,22 +35,12 @@
 import qualified Cryptol.Eval.Env (EvalEnv(..))
 import Cryptol.TypeCheck.AST
 import Cryptol.TypeCheck.Solver.InfNat (Nat'(..))
+import Cryptol.Utils.Ident (Ident)
 import Cryptol.Utils.PP
 import Cryptol.Utils.Panic(panic)
 
-#if __GLASGOW_HASKELL__ < 710
-import Control.Applicative
-import Data.Monoid (Monoid(..))
-import Data.Traversable (traverse)
-#endif
-
-#if MIN_VERSION_sbv(5,1,0)
-smtMode :: SBV.SMTLibVersion
-smtMode = SBV.SMTLib2
-#else
-smtMode :: Bool
-smtMode = True
-#endif
+import Prelude ()
+import Prelude.Compat
 
 -- External interface ----------------------------------------------------------
 
@@ -153,7 +145,7 @@
         when pcVerbose $ M.io $
           putStrLn $ "Trying proof with " ++
                      intercalate ", " (map show provers)
-        (firstProver, res) <- M.io $ fn provers' e
+        (firstProver, res) <- M.io (fn provers' e)
         when pcVerbose $ M.io $
           putStrLn $ "Got result from " ++ show firstProver
         return (tag res)
@@ -167,6 +159,7 @@
     Right ts -> do when pcVerbose $ M.io $ putStrLn "Simulating..."
                    let env = evalDecls mempty extDgs
                    let v = evalExpr env pcExpr
+                   prims <- M.getPrimMap
                    results' <- runFn $ do
                                  args <- mapM tyFn ts
                                  b <- return $! fromVBit (foldl fromVFun v args)
@@ -183,7 +176,7 @@
                            let Right (_, cws) = SBV.getModel result
                                (vs, _) = parseValues ts cws
                                sattys = unFinType <$> ts
-                               satexprs = zipWithM Eval.toExpr sattys vs
+                               satexprs = zipWithM (Eval.toExpr prims) sattys vs
                            in case zip3 sattys <$> satexprs <*> pure vs of
                              Nothing ->
                                panic "Cryptol.Symbolic.sat"
@@ -262,7 +255,7 @@
     = FTBit
     | FTSeq Int FinType
     | FTTuple [FinType]
-    | FTRecord [(Name, FinType)]
+    | FTRecord [(Ident, FinType)]
 
 numType :: Type -> Maybe Int
 numType (TCon (TC (TCNum n)) [])
@@ -327,7 +320,7 @@
 -- Simulation environment ------------------------------------------------------
 
 data Env = Env
-  { envVars :: Map.Map QName Value
+  { envVars :: Map.Map Name Value
   , envTypes :: Map.Map TVar TValue
   }
 
@@ -342,15 +335,12 @@
     , envTypes = Map.union (envTypes l) (envTypes r)
     }
 
-emptyEnv :: Env
-emptyEnv = mempty
-
 -- | Bind a variable in the evaluation environment.
-bindVar :: (QName, Value) -> Env -> Env
+bindVar :: (Name, Value) -> Env -> Env
 bindVar (n, thunk) env = env { envVars = Map.insert n thunk (envVars env) }
 
 -- | Lookup a variable in the environment.
-lookupVar :: QName -> Env -> Maybe Value
+lookupVar :: Name -> Env -> Maybe Value
 lookupVar n env = Map.lookup n (envVars env)
 
 -- | Bind a type variable of kind *.
@@ -366,7 +356,6 @@
 evalExpr :: Env -> Expr -> Value
 evalExpr env expr =
   case expr of
-    ECon econ         -> evalECon econ
     EList es ty       -> VSeq (tIsBit ty) (map eval es)
     ETuple es         -> VTuple (map eval es)
     ERec fields       -> VRecord [ (f, eval e) | (f, e) <- fields ]
@@ -434,8 +423,12 @@
                                          | (d, (qname, v)) <- zip ds bindings ]
                       in env'
 
-evalDecl :: Env -> Decl -> (QName, Value)
-evalDecl env d = (dName d, evalExpr env (dDefinition d))
+evalDecl :: Env -> Decl -> (Name, Value)
+evalDecl env d = (dName d, body)
+  where
+  body = case dDefinition d of
+           DExpr e -> evalExpr env e
+           DPrim   -> evalPrim d
 
 -- | Make a copy of the given value, building the spine based only on
 -- the type without forcing the value argument. This lets us avoid
diff --git a/src/Cryptol/Symbolic/Prims.hs b/src/Cryptol/Symbolic/Prims.hs
--- a/src/Cryptol/Symbolic/Prims.hs
+++ b/src/Cryptol/Symbolic/Prims.hs
@@ -1,29 +1,33 @@
 -- |
 -- Module      :  $Header$
--- Copyright   :  (c) 2013-2015 Galois, Inc.
+-- Copyright   :  (c) 2013-2016 Galois, Inc.
 -- License     :  BSD3
 -- Maintainer  :  cryptol@galois.com
 -- Stability   :  provisional
 -- Portability :  portable
 
+{-# LANGUAGE RecordWildCards #-}
 {-# LANGUAGE PatternGuards #-}
 {-# LANGUAGE ViewPatterns #-}
 {-# LANGUAGE FlexibleContexts #-}
 module Cryptol.Symbolic.Prims where
 
-import Data.Bits ()
 import Data.List (genericDrop, genericReplicate, genericSplitAt, genericTake, sortBy, transpose)
 import Data.Ord (comparing)
 
 import Cryptol.Eval.Value (BitWord(..))
 import Cryptol.Prims.Eval (binary, unary, tlamN)
-import Cryptol.Prims.Syntax (ECon(..))
 import Cryptol.Symbolic.Value
-import Cryptol.TypeCheck.AST (Name)
+import Cryptol.TypeCheck.AST (Decl(..))
 import Cryptol.TypeCheck.Solver.InfNat(Nat'(..), nMul)
 import Cryptol.Utils.Panic
+import Cryptol.ModuleSystem.Name (asPrim)
+import Cryptol.Utils.Ident (Ident,mkIdent)
 
+import qualified Data.SBV         as SBV
 import qualified Data.SBV.Dynamic as SBV
+import qualified Data.Map as Map
+import qualified Data.Text as T
 
 import Prelude ()
 import Prelude.Compat
@@ -33,66 +37,43 @@
 
 -- Primitives ------------------------------------------------------------------
 
--- See also Cryptol.Prims.Eval.evalECon
-evalECon :: ECon -> Value
-evalECon econ =
-  case econ of
-    ECTrue        -> VBit SBV.svTrue
-    ECFalse       -> VBit SBV.svFalse
-    ECDemote      -> ecDemoteV -- Converts a numeric type into its corresponding value.
-                               -- { val, bits } (fin val, fin bits, bits >= width val) => [bits]
-    ECPlus        -> binary (arithBinary SBV.svPlus) -- {a} (Arith a) => a -> a -> a
-    ECMinus       -> binary (arithBinary SBV.svMinus) -- {a} (Arith a) => a -> a -> a
-    ECMul         -> binary (arithBinary SBV.svTimes) -- {a} (Arith a) => a -> a -> a
-    ECDiv         -> binary (arithBinary SBV.svQuot) -- {a} (Arith a) => a -> a -> a
-    ECMod         -> binary (arithBinary SBV.svRem) -- {a} (Arith a) => a -> a -> a
-    ECExp         -> binary (arithBinary sExp) -- {a} (Arith a) => a -> a -> a
-    ECLg2         -> unary (arithUnary sLg2) -- {a} (Arith a) => a -> a
-    ECNeg         -> unary (arithUnary SBV.svUNeg)
-
-    ECLt          -> binary (cmpBinary cmpLt cmpLt SBV.svFalse)
-    ECGt          -> binary (cmpBinary cmpGt cmpGt SBV.svFalse)
-    ECLtEq        -> binary (cmpBinary cmpLtEq cmpLtEq SBV.svTrue)
-    ECGtEq        -> binary (cmpBinary cmpGtEq cmpGtEq SBV.svTrue)
-    ECEq          -> binary (cmpBinary cmpEq cmpEq SBV.svTrue)
-    ECNotEq       -> binary (cmpBinary cmpNotEq cmpNotEq SBV.svFalse)
-
-    -- FIXME: the next 4 "primitives" should be defined in the Cryptol prelude.
-    ECFunEq       -> -- {a b} (Cmp b) => (a -> b) -> (a -> b) -> a -> Bit
-      -- (f === g) x = (f x == g x)
-      tlam $ \_ ->
-      tlam $ \b ->
-      VFun $ \f ->
-      VFun $ \g ->
-      VFun $ \x -> cmpBinary cmpEq cmpEq SBV.svTrue b (fromVFun f x) (fromVFun g x)
+evalPrim :: Decl -> Value
+evalPrim Decl { dName = n, .. }
+  | Just prim <- asPrim n, Just val <- Map.lookup prim primTable = val
 
-    ECFunNotEq    -> -- {a b} (Cmp b) => (a -> b) -> (a -> b) -> a -> Bit
-      -- (f !== g) x = (f x != g x)
-      tlam $ \_ ->
-      tlam $ \b ->
-      VFun $ \f ->
-      VFun $ \g ->
-      VFun $ \x -> cmpBinary cmpNotEq cmpNotEq SBV.svFalse b (fromVFun f x) (fromVFun g x)
+evalPrim Decl { .. } =
+    panic "Eval" [ "Unimplemented primitive", show dName ]
 
-    ECMin         -> -- {a} (Cmp a) => a -> a -> a
-      -- min x y = if x <= y then x else y
-      binary $ \a x y ->
-        let c = cmpBinary cmpLtEq cmpLtEq SBV.svFalse a x y
-        in iteValue (fromVBit c) x y
+-- See also Cryptol.Prims.Eval.primTable
+primTable :: Map.Map Ident Value
+primTable  = Map.fromList $ map (\(n, v) -> (mkIdent (T.pack n), v))
+  [ ("True"        , VBit SBV.svTrue)
+  , ("False"       , VBit SBV.svFalse)
+  , ("demote"      , ecDemoteV) -- Converts a numeric type into its corresponding value.
+                                -- { val, bits } (fin val, fin bits, bits >= width val) => [bits]
+  , ("+"           , binary (arithBinary SBV.svPlus)) -- {a} (Arith a) => a -> a -> a
+  , ("-"           , binary (arithBinary SBV.svMinus)) -- {a} (Arith a) => a -> a -> a
+  , ("*"           , binary (arithBinary SBV.svTimes)) -- {a} (Arith a) => a -> a -> a
+  , ("/"           , binary (arithBinary SBV.svQuot)) -- {a} (Arith a) => a -> a -> a
+  , ("%"           , binary (arithBinary SBV.svRem)) -- {a} (Arith a) => a -> a -> a
+  , ("^^"          , binary (arithBinary sExp)) -- {a} (Arith a) => a -> a -> a
+  , ("lg2"         , unary (arithUnary sLg2)) -- {a} (Arith a) => a -> a
+  , ("negate"      , unary (arithUnary SBV.svUNeg))
 
-    ECMax         -> -- {a} (Cmp a) => a -> a -> a
-      -- max x y = if y <= x then x else y
-      binary $ \a x y ->
-        let c = cmpBinary cmpLtEq cmpLtEq SBV.svFalse a y x
-        in iteValue (fromVBit c) x y
+  , ("<"           , binary (cmpBinary cmpLt cmpLt SBV.svFalse))
+  , (">"           , binary (cmpBinary cmpGt cmpGt SBV.svFalse))
+  , ("<="          , binary (cmpBinary cmpLtEq cmpLtEq SBV.svTrue))
+  , (">="          , binary (cmpBinary cmpGtEq cmpGtEq SBV.svTrue))
+  , ("=="          , binary (cmpBinary cmpEq cmpEq SBV.svTrue))
+  , ("!="          , binary (cmpBinary cmpNotEq cmpNotEq SBV.svFalse))
 
-    ECAnd         -> binary (logicBinary SBV.svAnd SBV.svAnd)
-    ECOr          -> binary (logicBinary SBV.svOr SBV.svOr)
-    ECXor         -> binary (logicBinary SBV.svXOr SBV.svXOr)
-    ECCompl       -> unary (logicUnary SBV.svNot SBV.svNot)
-    ECZero        -> VPoly zeroV
+  , ("&&"          , binary (logicBinary SBV.svAnd SBV.svAnd))
+  , ("||"          , binary (logicBinary SBV.svOr SBV.svOr))
+  , ("^"           , binary (logicBinary SBV.svXOr SBV.svXOr))
+  , ("complement"  , unary (logicUnary SBV.svNot SBV.svNot))
+  , ("zero"        , VPoly zeroV)
 
-    ECShiftL      -> -- {m,n,a} (fin n) => [m] a -> [n] -> [m] a
+  , ("<<"          ,  -- {m,n,a} (fin n) => [m] a -> [n] -> [m] a
       tlam $ \m ->
       tlam $ \_ ->
       tlam $ \a ->
@@ -100,16 +81,17 @@
       VFun $ \y ->
         case xs of
           VWord x -> VWord (SBV.svShiftLeft x (fromVWord y))
-          _ -> selectV shl y
-            where
-              shl :: Integer -> Value
-              shl i =
-                case numTValue m of
-                  Inf               -> dropV i xs
-                  Nat j | i >= j    -> replicateV j a (zeroV a)
-                        | otherwise -> catV (dropV i xs) (replicateV i a (zeroV a))
+          _ ->
+            let shl :: Integer -> Value
+                shl i =
+                  case numTValue m of
+                    Inf               -> dropV i xs
+                    Nat j | i >= j    -> replicateV j a (zeroV a)
+                          | otherwise -> catV (dropV i xs) (replicateV i a (zeroV a))
 
-    ECShiftR      -> -- {m,n,a} (fin n) => [m] a -> [n] -> [m] a
+             in selectV shl y)
+
+  , (">>"          , -- {m,n,a} (fin n) => [m] a -> [n] -> [m] a
       tlam $ \m ->
       tlam $ \_ ->
       tlam $ \a ->
@@ -117,16 +99,16 @@
       VFun $ \y ->
         case xs of
           VWord x -> VWord (SBV.svShiftRight x (fromVWord y))
-          _ -> selectV shr y
-            where
-              shr :: Integer -> Value
-              shr i =
-                case numTValue m of
-                  Inf               -> catV (replicateV i a (zeroV a)) xs
-                  Nat j | i >= j    -> replicateV j a (zeroV a)
-                        | otherwise -> catV (replicateV i a (zeroV a)) (takeV (j - i) xs)
+          _ ->
+           let shr :: Integer -> Value
+               shr i =
+                 case numTValue m of
+                   Inf               -> catV (replicateV i a (zeroV a)) xs
+                   Nat j | i >= j    -> replicateV j a (zeroV a)
+                         | otherwise -> catV (replicateV i a (zeroV a)) (takeV (j - i) xs)
+             in selectV shr y)
 
-    ECRotL        -> -- {m,n,a} (fin m, fin n) => [m] a -> [n] -> [m] a
+  , ("<<<"         , -- {m,n,a} (fin m, fin n) => [m] a -> [n] -> [m] a
       tlam $ \m ->
       tlam $ \_ ->
       tlam $ \_ ->
@@ -134,13 +116,12 @@
       VFun $ \y ->
         case xs of
           VWord x -> VWord (SBV.svRotateLeft x (fromVWord y))
-          _ -> selectV rol y
-            where
-              rol :: Integer -> Value
-              rol i = catV (dropV k xs) (takeV k xs)
-                where k = i `mod` finTValue m
+          _ -> let rol :: Integer -> Value
+                   rol i = catV (dropV k xs) (takeV k xs)
+                     where k = i `mod` finTValue m
+                in selectV rol y)
 
-    ECRotR        -> -- {m,n,a} (fin m, fin n) => [m] a -> [n] -> [m] a
+  , (">>>"         , -- {m,n,a} (fin m, fin n) => [m] a -> [n] -> [m] a
       tlam $ \m ->
       tlam $ \_ ->
       tlam $ \_ ->
@@ -148,37 +129,37 @@
       VFun $ \y ->
         case xs of
           VWord x -> VWord (SBV.svRotateRight x (fromVWord y))
-          _ -> selectV ror y
-            where
-              ror :: Integer -> Value
-              ror i = catV (dropV k xs) (takeV k xs)
-                where k = (- i) `mod` finTValue m
+          _ ->
+            let ror :: Integer -> Value
+                ror i = catV (dropV k xs) (takeV k xs)
+                  where k = (- i) `mod` finTValue m
+             in selectV ror y)
 
-    ECCat         -> -- {a,b,d} (fin a) => [a] d -> [b] d -> [a + b] d
+  , ("#"           , -- {a,b,d} (fin a) => [a] d -> [b] d -> [a + b] d
       tlam $ \_ ->
       tlam $ \_ ->
       tlam $ \_ ->
       VFun $ \v1 ->
-      VFun $ \v2 -> catV v1 v2
+      VFun $ \v2 -> catV v1 v2)
 
-    ECSplitAt     -> -- {a,b,c} (fin a) => [a+b] c -> ([a]c,[b]c)
+  , ("splitAt"     , -- {a,b,c} (fin a) => [a+b] c -> ([a]c,[b]c)
       tlam $ \(finTValue -> a) ->
       tlam $ \_ ->
       tlam $ \_ ->
-      VFun $ \v -> VTuple [takeV a v, dropV a v]
+      VFun $ \v -> VTuple [takeV a v, dropV a v])
 
-    ECJoin -> tlam $ \ parts ->
-              tlam $ \ each  ->
-              tlam $ \ a     -> lam (joinV parts each a)
+  , ("join"        , tlam $ \ parts ->
+                     tlam $ \ each  ->
+                     tlam $ \ a     -> lam (joinV parts each a))
 
-    ECSplit -> ecSplitV
+  , ("split"       , ecSplitV)
 
-    ECReverse ->
+  , ("reverse"     ,
       tlam $ \a ->
       tlam $ \b ->
-       lam $ \(fromSeq -> xs) -> toSeq a b (reverse xs)
+       lam $ \(fromSeq -> xs) -> toSeq a b (reverse xs))
 
-    ECTranspose ->
+  , ("transpose"    ,
       tlam $ \a ->
       tlam $ \b ->
       tlam $ \c ->
@@ -189,68 +170,68 @@
                in case numTValue b of
                     Nat n -> toSeq b (tvSeq a c) $ genericReplicate n v
                     Inf   -> VStream $ repeat v
-             _ -> toSeq b (tvSeq a c) $ map (toSeq a c) $ transpose xs
+             _ -> toSeq b (tvSeq a c) $ map (toSeq a c) $ transpose xs)
 
-    ECAt          -> -- {n,a,i} (fin i) => [n]a -> [i] -> a
+  , ("@"           , -- {n,a,i} (fin i) => [n]a -> [i] -> a
       tlam $ \_ ->
       tlam $ \a ->
       tlam $ \_ ->
-      VFun $ \xs ->
+      VFun $ \(fromSeq -> xs) ->
       VFun $ \y ->
         let err = zeroV a -- default for out-of-bounds accesses
-        in selectV (\i -> nthV err xs i) y
+        in atV err xs y)
 
-    ECAtRange     -> -- {n,a,m,i} (fin i) => [n]a -> [m][i] -> [m]a
+  , ("@@"          , -- {n,a,m,i} (fin i) => [n]a -> [m][i] -> [m]a
       tlam $ \_ ->
       tlam $ \a ->
       tlam $ \_ ->
       tlam $ \_ ->
-      VFun $ \xs ->
+      VFun $ \(fromSeq -> xs) ->
       VFun $ \ys ->
         let err = zeroV a -- default for out-of-bounds accesses
-        in mapV (isTBit a) (selectV (\i -> nthV err xs i)) ys
+        in mapV (isTBit a) (atV err xs) ys)
 
-    ECAtBack      -> -- {n,a,i} (fin n, fin i) => [n]a -> [i] -> a
-      tlam $ \(finTValue -> n) ->
+  , ("!"           , -- {n,a,i} (fin n, fin i) => [n]a -> [i] -> a
+      tlam $ \_ ->
       tlam $ \a ->
       tlam $ \_ ->
-      VFun $ \xs ->
+      VFun $ \(fromSeq -> xs) ->
       VFun $ \y ->
         let err = zeroV a -- default for out-of-bounds accesses
-        in selectV (\i -> nthV err xs (n - 1 - i)) y
+        in atV err (reverse xs) y)
 
-    ECAtRangeBack -> -- {n,a,m,i} (fin n, fin i) => [n]a -> [m][i] -> [m]a
-      tlam $ \(finTValue -> n) ->
+  , ("!!"          , -- {n,a,m,i} (fin n, fin i) => [n]a -> [m][i] -> [m]a
+      tlam $ \_ ->
       tlam $ \a ->
       tlam $ \_ ->
       tlam $ \_ ->
-      VFun $ \xs ->
+      VFun $ \(fromSeq -> xs) ->
       VFun $ \ys ->
         let err = zeroV a -- default for out-of-bounds accesses
-        in mapV (isTBit a) (selectV (\i -> nthV err xs (n - 1 - i))) ys
+        in mapV (isTBit a) (atV err (reverse xs)) ys)
 
-    ECFromThen   -> fromThenV
-    ECFromTo     -> fromToV
-    ECFromThenTo -> fromThenToV
+  , ("fromThen"    , fromThenV)
+  , ("fromTo"      , fromToV)
+  , ("fromThenTo"  , fromThenToV)
 
-    ECInfFrom    ->
+  , ("infFrom"     ,
       tlam $ \(finTValue -> bits)  ->
        lam $ \(fromVWord  -> first) ->
-      toStream [ VWord (SBV.svPlus first (literalSWord (fromInteger bits) i)) | i <- [0 ..] ]
+      toStream [ VWord (SBV.svPlus first (literalSWord (fromInteger bits) i)) | i <- [0 ..] ])
 
-    ECInfFromThen -> -- {a} (fin a) => [a] -> [a] -> [inf][a]
+  , ("infFromThen" , -- {a} (fin a) => [a] -> [a] -> [inf][a]
       tlam $ \_ ->
        lam $ \(fromVWord -> first) ->
        lam $ \(fromVWord -> next) ->
-      toStream (map VWord (iterate (SBV.svPlus (SBV.svMinus next first)) first))
+      toStream (map VWord (iterate (SBV.svPlus (SBV.svMinus next first)) first)))
 
     -- {at,len} (fin len) => [len][8] -> at
-    ECError ->
+  , ("error"       ,
       tlam $ \at ->
       tlam $ \(finTValue -> _len) ->
-      VFun $ \_msg -> zeroV at -- error/undefined, is arbitrarily translated to 0
+      VFun $ \_msg -> zeroV at) -- error/undefined, is arbitrarily translated to 0
 
-    ECPMul        -> -- {a,b} (fin a, fin b) => [a] -> [b] -> [max 1 (a + b) - 1]
+  , ("pmult"       , -- {a,b} (fin a, fin b) => [a] -> [b] -> [max 1 (a + b) - 1]
       tlam $ \(finTValue -> i) ->
       tlam $ \(finTValue -> j) ->
       VFun $ \v1 ->
@@ -261,9 +242,9 @@
             xs = map fromVBit (fromSeq v1)
             ys = map fromVBit (fromSeq v2)
             zs = take (fromInteger k) (mul xs ys [] ++ repeat SBV.svFalse)
-        in VSeq True (map VBit zs)
+        in VSeq True (map VBit zs))
 
-    ECPDiv        -> -- {a,b} (fin a, fin b) => [a] -> [b] -> [a]
+  , ("pdiv"        , -- {a,b} (fin a, fin b) => [a] -> [b] -> [a]
       tlam $ \(finTValue -> i) ->
       tlam $ \_ ->
       VFun $ \v1 ->
@@ -271,9 +252,9 @@
         let xs = map fromVBit (fromSeq v1)
             ys = map fromVBit (fromSeq v2)
             zs = take (fromInteger i) (fst (mdp (reverse xs) (reverse ys)) ++ repeat SBV.svFalse)
-        in VSeq True (map VBit (reverse zs))
+        in VSeq True (map VBit (reverse zs)))
 
-    ECPMod        -> -- {a,b} (fin a, fin b) => [a] -> [b+1] -> [b]
+  , ("pmod"        , -- {a,b} (fin a, fin b) => [a] -> [b+1] -> [b]
       tlam $ \_ ->
       tlam $ \(finTValue -> j) ->
       VFun $ \v1 ->
@@ -281,10 +262,11 @@
         let xs = map fromVBit (fromSeq v1)
             ys = map fromVBit (fromSeq v2)
             zs = take (fromInteger j) (snd (mdp (reverse xs) (reverse ys)) ++ repeat SBV.svFalse)
-        in VSeq True (map VBit (reverse zs))
+        in VSeq True (map VBit (reverse zs)))
 
-    ECRandom      -> panic "Cryptol.Symbolic.Prims.evalECon"
-                       [ "can't symbolically evaluae ECRandom" ]
+  , ("random"      , panic "Cryptol.Symbolic.Prims.evalECon"
+                       [ "can't symbolically evaluae ECRandom" ])
+  ]
 
 
 selectV :: (Integer -> Value) -> Value -> Value
@@ -298,6 +280,24 @@
       where m1 = sel (offset + 2 ^ length bs) bs
             m2 = sel offset bs
 
+atV :: Value -> [Value] -> Value -> Value
+atV def vs i =
+  case i of
+    VSeq True (map fromVBit -> bits) -> -- index bits in big-endian order
+      case foldr weave vs bits of
+        [] -> def
+        y : _ -> y
+    VWord x -> foldr f def (zip [0 .. 2 ^ SBV.intSizeOf x - 1] vs)
+      where
+        k = SBV.kindOf x
+        f (n, v) y = iteValue (SBV.svEqual x (SBV.svInteger k n)) v y
+    _ -> evalPanic "Cryptol.Symbolic.Prims.selectV" ["Invalid index argument"]
+  where
+    weave :: SBool -> [Value] -> [Value]
+    weave _ [] = []
+    weave b [x1] = [iteValue b def x1]
+    weave b (x1 : x2 : xs) = iteValue b x2 x1 : weave b xs
+
 replicateV :: Integer -- ^ number of elements
            -> TValue  -- ^ type of element
            -> Value   -- ^ element
@@ -375,7 +375,7 @@
   | TVSeq Int TypeVal
   | TVStream TypeVal
   | TVTuple [TypeVal]
-  | TVRecord [(Name, TypeVal)]
+  | TVRecord [(Ident, TypeVal)]
   | TVFun TypeVal TypeVal
 
 toTypeVal :: TValue -> TypeVal
diff --git a/src/Cryptol/Symbolic/Value.hs b/src/Cryptol/Symbolic/Value.hs
--- a/src/Cryptol/Symbolic/Value.hs
+++ b/src/Cryptol/Symbolic/Value.hs
@@ -1,6 +1,6 @@
 -- |
 -- Module      :  $Header$
--- Copyright   :  (c) 2013-2015 Galois, Inc.
+-- Copyright   :  (c) 2013-2016 Galois, Inc.
 -- License     :  BSD3
 -- Maintainer  :  cryptol@galois.com
 -- Stability   :  provisional
diff --git a/src/Cryptol/Testing/Concrete.hs b/src/Cryptol/Testing/Concrete.hs
new file mode 100644
--- /dev/null
+++ b/src/Cryptol/Testing/Concrete.hs
@@ -0,0 +1,166 @@
+-- |
+-- Module      :  $Header$
+-- Copyright   :  (c) 2013-2016 Galois, Inc.
+-- License     :  BSD3
+-- Maintainer  :  cryptol@galois.com
+-- Stability   :  provisional
+-- Portability :  portable
+
+{-# LANGUAGE RecordWildCards #-}
+module Cryptol.Testing.Concrete where
+
+import Cryptol.Eval.Error
+import Cryptol.Eval.Value
+import Cryptol.TypeCheck.AST
+import Cryptol.Utils.Panic (panic)
+
+import qualified Control.Exception as X
+import Data.List(genericReplicate)
+
+import Prelude ()
+import Prelude.Compat
+
+-- | A test result is either a pass, a failure due to evaluating to
+-- @False@, or a failure due to an exception raised during evaluation
+data TestResult
+  = Pass
+  | FailFalse [Value]
+  | FailError EvalError [Value]
+
+isPass :: TestResult -> Bool
+isPass Pass = True
+isPass _    = False
+
+-- | Apply a testable value to some arguments.
+-- Note that this function assumes that the values come from a call to
+-- `testableType` (i.e., things are type-correct). We run in the IO
+-- monad in order to catch any @EvalError@s.
+runOneTest :: Value -> [Value] -> IO TestResult
+runOneTest v0 vs0 = run `X.catch` handle
+  where
+    run = do
+      result <- X.evaluate (go v0 vs0)
+      if result
+        then return Pass
+        else return (FailFalse vs0)
+    handle e = return (FailError e vs0)
+
+    go :: Value -> [Value] -> Bool
+    go (VFun f) (v : vs) = go (f v) vs
+    go (VFun _) []       = panic "Not enough arguments while applying function"
+                           []
+    go (VBit b) []       = b
+    go v vs              = panic "Type error while running test" $
+                           [ "Function:"
+                           , show $ ppValue defaultPPOpts v
+                           , "Arguments:"
+                           ] ++ map (show . ppValue defaultPPOpts) vs
+
+{- | Given a (function) type, compute all possible inputs for it.
+We also return the total number of test (i.e., the length of the outer list. -}
+testableType :: Type -> Maybe (Integer, [[Value]])
+testableType ty =
+  case tNoUser ty of
+    TCon (TC TCFun) [t1,t2] ->
+      do sz        <- typeSize t1
+         (tot,vss) <- testableType t2
+         return (sz * tot, [ v : vs | v <- typeValues t1, vs <- vss ])
+    TCon (TC TCBit) [] -> return (1, [[]])
+    _ -> Nothing
+
+{- | Given a fully-evaluated type, try to compute the number of values in it.
+Returns `Nothing` for infinite types, user-defined types, polymorhic types,
+and, currently, function spaces.  Of course, we can easily compute the
+sizes of function spaces, but we can't easily enumerate their inhabitants. -}
+typeSize :: Type -> Maybe Integer
+typeSize ty =
+  case ty of
+    TVar _      -> Nothing
+    TUser _ _ t -> typeSize t
+    TRec fs     -> product <$> mapM (typeSize . snd) fs
+    TCon (TC tc) ts ->
+      case (tc, ts) of
+        (TCNum _, _)     -> Nothing
+        (TCInf, _)       -> Nothing
+        (TCBit, _)       -> Just 2
+        (TCSeq, [sz,el]) -> case tNoUser sz of
+                              TCon (TC (TCNum n)) _ -> (^ n) <$> typeSize el
+                              _                     -> Nothing
+        (TCSeq, _)       -> Nothing
+        (TCFun, _)       -> Nothing
+        (TCTuple _, els) -> product <$> mapM typeSize els
+        (TCNewtype _, _) -> Nothing
+
+    TCon _ _ -> Nothing
+
+
+{- | Returns all the values in a type.  Returns an empty list of values,
+for types where 'typeSize' returned 'Nothing'. -}
+typeValues :: Type -> [Value]
+typeValues ty =
+  case ty of
+    TVar _      -> []
+    TUser _ _ t -> typeValues t
+    TRec fs     -> [ VRecord xs
+                   | xs <- sequence [ [ (f,v) | v <- typeValues t ]
+                                    | (f,t) <- fs ]
+                   ]
+    TCon (TC tc) ts ->
+      case (tc, ts) of
+        (TCNum _, _)     -> []
+        (TCInf, _)       -> []
+        (TCBit, _)       -> [ VBit False, VBit True ]
+        (TCSeq, ts1)     ->
+            case map tNoUser ts1 of
+              [ TCon (TC (TCNum n)) _, TCon (TC TCBit) [] ] ->
+                  [ VWord (BV n x) | x <- [ 0 .. 2^n - 1 ] ]
+
+              [ TCon (TC (TCNum n)) _, t ] ->
+                  [ VSeq False xs | xs <- sequence $ genericReplicate n
+                                                   $ typeValues t ]
+              _ -> []
+
+
+        (TCFun, _)       -> []  -- We don't generate function values.
+        (TCTuple _, els) -> [ VTuple xs | xs <- sequence (map typeValues els)]
+        (TCNewtype _, _) -> []
+
+    TCon _ _ -> []
+
+--------------------------------------------------------------------------------
+-- Driver function
+
+data TestSpec m s = TestSpec {
+    testFn :: Integer -> s -> m (TestResult, s)
+  , testProp :: String -- ^ The property as entered by the user
+  , testTotal :: Integer
+  , testPossible :: Integer
+  , testRptProgress :: Integer -> Integer -> m ()
+  , testClrProgress :: m ()
+  , testRptFailure :: TestResult -> m ()
+  , testRptSuccess :: m ()
+  }
+
+data TestReport = TestReport {
+    reportResult :: TestResult
+  , reportProp :: String -- ^ The property as entered by the user
+  , reportTestsRun :: Integer
+  , reportTestsPossible :: Integer
+  }
+
+runTests :: Monad m => TestSpec m s -> s -> m TestReport
+runTests TestSpec {..} st0 = go 0 st0
+  where
+  go testNum _ | testNum >= testTotal = do
+    testRptSuccess
+    return $ TestReport Pass testProp testNum testPossible
+  go testNum st =
+   do testRptProgress testNum testTotal
+      res <- testFn (div (100 * (1 + testNum)) testTotal) st
+      testClrProgress
+      case res of
+        (Pass, st') -> do -- delProgress -- unnecessary?
+          go (testNum + 1) st'
+        (failure, _st') -> do
+          testRptFailure failure
+          return $ TestReport failure testProp testNum testPossible
diff --git a/src/Cryptol/Testing/Eval.hs b/src/Cryptol/Testing/Eval.hs
deleted file mode 100644
--- a/src/Cryptol/Testing/Eval.hs
+++ /dev/null
@@ -1,50 +0,0 @@
-{-# LANGUAGE TupleSections #-}
--- |
--- Module      :  $Header$
--- Copyright   :  (c) 2013-2015 Galois, Inc.
--- License     :  BSD3
--- Maintainer  :  cryptol@galois.com
--- Stability   :  provisional
--- Portability :  portable
---
--- Evaluate test cases and handle exceptions appropriately
-
-module Cryptol.Testing.Eval where
-
-import Cryptol.Eval.Error
-import Cryptol.Eval.Value
-import Cryptol.Utils.Panic (panic)
-
-import qualified Control.Exception as X
-
--- | A test result is either a pass, a failure due to evaluating to
--- @False@, or a failure due to an exception raised during evaluation
-data TestResult
-  = Pass
-  | FailFalse [Value]
-  | FailError EvalError [Value]
-
--- | Apply a testable value to some arguments.
--- Note that this function assumes that the values come from a call to
--- `testableType` (i.e., things are type-correct). We run in the IO
--- monad in order to catch any @EvalError@s.
-runOneTest :: Value -> [Value] -> IO TestResult
-runOneTest v0 vs0 = run `X.catch` handle
-  where
-    run = do
-      result <- X.evaluate (go v0 vs0)
-      if result
-        then return Pass
-        else return (FailFalse vs0)
-    handle e = return (FailError e vs0)
-
-    go :: Value -> [Value] -> Bool
-    go (VFun f) (v : vs) = go (f v) vs
-    go (VFun _) []       = panic "Not enough arguments while applying function"
-                           []
-    go (VBit b) []       = b
-    go v vs              = panic "Type error while running test" $
-                           [ "Function:"
-                           , show $ ppValue defaultPPOpts v
-                           , "Arguments:"
-                           ] ++ map (show . ppValue defaultPPOpts) vs
diff --git a/src/Cryptol/Testing/Exhaust.hs b/src/Cryptol/Testing/Exhaust.hs
deleted file mode 100644
--- a/src/Cryptol/Testing/Exhaust.hs
+++ /dev/null
@@ -1,99 +0,0 @@
--- |
--- Module      :  $Header$
--- Copyright   :  (c) 2013-2015 Galois, Inc.
--- License     :  BSD3
--- Maintainer  :  cryptol@galois.com
--- Stability   :  provisional
--- Portability :  portable
-
-module Cryptol.Testing.Exhaust where
-
-import qualified Cryptol.Testing.Eval as Eval
-import Cryptol.TypeCheck.AST
-import Cryptol.Eval.Value
-
-import Data.List(genericReplicate)
-
-#if __GLASGOW_HASKELL__ < 710
-import Control.Applicative((<$>))
-#endif
-
-{- | Given a (function) type, compute all possible inputs for it.
-We also return the total number of test (i.e., the length of the outer list. -}
-testableType :: Type -> Maybe (Integer, [[Value]])
-testableType ty =
-  case tNoUser ty of
-    TCon (TC TCFun) [t1,t2] ->
-      do sz        <- typeSize t1
-         (tot,vss) <- testableType t2
-         return (sz * tot, [ v : vs | v <- typeValues t1, vs <- vss ])
-    TCon (TC TCBit) [] -> return (1, [[]])
-    _ -> Nothing
-
-{- | Apply a testable value to some arguments.
-    Please note that this function assumes that the values come from
-    a call to `testableType` (i.e., things are type-correct)
- -}
-runOneTest :: Value -> [Value] -> IO Eval.TestResult
-runOneTest = Eval.runOneTest
-
-{- | Given a fully-evaluated type, try to compute the number of values in it.
-Returns `Nothing` for infinite types, user-defined types, polymorhic types,
-and, currently, function spaces.  Of course, we can easily compute the
-sizes of function spaces, but we can't easily enumerate their inhabitants. -}
-typeSize :: Type -> Maybe Integer
-typeSize ty =
-  case ty of
-    TVar _      -> Nothing
-    TUser _ _ t -> typeSize t
-    TRec fs     -> product <$> mapM (typeSize . snd) fs
-    TCon (TC tc) ts ->
-      case (tc, ts) of
-        (TCNum _, _)     -> Nothing
-        (TCInf, _)       -> Nothing
-        (TCBit, _)       -> Just 2
-        (TCSeq, [sz,el]) -> case tNoUser sz of
-                              TCon (TC (TCNum n)) _ -> (^ n) <$> typeSize el
-                              _                     -> Nothing
-        (TCSeq, _)       -> Nothing
-        (TCFun, _)       -> Nothing
-        (TCTuple _, els) -> product <$> mapM typeSize els
-        (TCNewtype _, _) -> Nothing
-
-    TCon _ _ -> Nothing
-
-
-{- | Returns all the values in a type.  Returns an empty list of values,
-for types where 'typeSize' returned 'Nothing'. -}
-typeValues :: Type -> [Value]
-typeValues ty =
-  case ty of
-    TVar _      -> []
-    TUser _ _ t -> typeValues t
-    TRec fs     -> [ VRecord xs
-                   | xs <- sequence [ [ (f,v) | v <- typeValues t ]
-                                    | (f,t) <- fs ]
-                   ]
-    TCon (TC tc) ts ->
-      case (tc, ts) of
-        (TCNum _, _)     -> []
-        (TCInf, _)       -> []
-        (TCBit, _)       -> [ VBit False, VBit True ]
-        (TCSeq, ts1)     ->
-            case map tNoUser ts1 of
-              [ TCon (TC (TCNum n)) _, TCon (TC TCBit) [] ] ->
-                  [ VWord (BV n x) | x <- [ 0 .. 2^n - 1 ] ]
-
-              [ TCon (TC (TCNum n)) _, t ] ->
-                  [ VSeq False xs | xs <- sequence $ genericReplicate n
-                                                   $ typeValues t ]
-              _ -> []
-
-
-        (TCFun, _)       -> []  -- We don't generate function values.
-        (TCTuple _, els) -> [ VTuple xs | xs <- sequence (map typeValues els)]
-        (TCNewtype _, _) -> []
-
-    TCon _ _ -> []
-
-
diff --git a/src/Cryptol/Testing/Random.hs b/src/Cryptol/Testing/Random.hs
--- a/src/Cryptol/Testing/Random.hs
+++ b/src/Cryptol/Testing/Random.hs
@@ -1,6 +1,6 @@
 -- |
 -- Module      :  $Header$
--- Copyright   :  (c) 2013-2015 Galois, Inc.
+-- Copyright   :  (c) 2013-2016 Galois, Inc.
 -- License     :  BSD3
 -- Maintainer  :  cryptol@galois.com
 -- Stability   :  provisional
@@ -12,14 +12,15 @@
 module Cryptol.Testing.Random where
 
 import Cryptol.Eval.Value     (BV(..),Value,GenValue(..))
-import qualified Cryptol.Testing.Eval as Eval
-import Cryptol.TypeCheck.AST  (Name,Type(..),TCon(..),TC(..),tNoUser)
+import qualified Cryptol.Testing.Concrete as Conc
+import Cryptol.TypeCheck.AST  (Type(..),TCon(..),TC(..),tNoUser)
+import Cryptol.Utils.Ident    (Ident)
 
 import Control.Monad          (forM)
 import Data.List              (unfoldr, genericTake)
 import System.Random          (RandomGen, split, random, randomR)
 
-type Gen g = Int -> g -> (Value, g)
+type Gen g = Integer -> g -> (Value, g)
 
 
 {- | Apply a testable value to some randomly-generated arguments.
@@ -32,13 +33,13 @@
 runOneTest :: RandomGen g
         => Value   -- ^ Function under test
         -> [Gen g] -- ^ Argument generators
-        -> Int     -- ^ Size
+        -> Integer -- ^ Size
         -> g
-        -> IO (Eval.TestResult, g)
+        -> IO (Conc.TestResult, g)
 runOneTest fun argGens sz g0 = do
   let (args, g1) = foldr mkArg ([], g0) argGens
       mkArg argGen (as, g) = let (a, g') = argGen sz g in (a:as, g')
-  result <- Eval.runOneTest fun args
+  result <- Conc.runOneTest fun args
   return (result, g1)
 
 {- | Given a (function) type, compute generators for
@@ -125,7 +126,7 @@
     in go (v : els) more g1
 
 -- | Generate a random record value.
-randomRecord :: RandomGen g => [(Name, Gen g)] -> Gen g
+randomRecord :: RandomGen g => [(Ident, Gen g)] -> Gen g
 randomRecord gens sz = go [] gens
   where
   go els [] g = (VRecord (reverse els), g)
diff --git a/src/Cryptol/Transform/MonoValues.hs b/src/Cryptol/Transform/MonoValues.hs
--- a/src/Cryptol/Transform/MonoValues.hs
+++ b/src/Cryptol/Transform/MonoValues.hs
@@ -1,6 +1,6 @@
 -- |
 -- Module      :  $Header$
--- Copyright   :  (c) 2013-2015 Galois, Inc.
+-- Copyright   :  (c) 2013-2016 Galois, Inc.
 -- License     :  BSD3
 -- Maintainer  :  cryptol@galois.com
 -- Stability   :  provisional
@@ -74,26 +74,29 @@
 
 {-# LANGUAGE PatternGuards, FlexibleInstances, MultiParamTypeClasses #-}
 {-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE CPP #-}
+{-# LANGUAGE OverloadedStrings #-}
 module Cryptol.Transform.MonoValues (rewModule) where
 
-import Cryptol.Parser.AST (Pass(MonoValues))
+import Cryptol.ModuleSystem.Name (SupplyM,liftSupply,Supply,mkDeclared)
+import Cryptol.Parser.Position (emptyRange)
 import Cryptol.TypeCheck.AST
 import Cryptol.TypeCheck.TypeMap
+import Cryptol.Utils.Ident (ModName)
 import Data.List(sortBy,groupBy)
 import Data.Either(partitionEithers)
 import Data.Map (Map)
-import MonadLib
+import MonadLib hiding (mapM)
 
-#if __GLASGOW_HASKELL__ < 710
-import Control.Applicative
-#endif
+import Prelude ()
+import Prelude.Compat
 
 {- (f,t,n) |--> x  means that when we spot instantiations of `f` with `ts` and
 `n` proof argument, we should replace them with `Var x` -}
-newtype RewMap' a = RM (Map QName (TypesMap (Map Int a)))
-type RewMap = RewMap' QName
+newtype RewMap' a = RM (Map Name (TypesMap (Map Int a)))
+type RewMap = RewMap' Name
 
-instance TrieMap RewMap' (QName,[Type],Int) where
+instance TrieMap RewMap' (Name,[Type],Int) where
   emptyTM  = RM emptyTM
 
   nullTM (RM m) = nullTM m
@@ -127,34 +130,30 @@
 
 -- | Note that this assumes that this pass will be run only once for each
 -- module, otherwise we will get name collisions.
-rewModule :: Module -> Module
-rewModule m = fst
-            $ runId
-            $ runStateT 0
-            $ runReaderT (Just (mName m))
-            $ do ds <- mapM (rewDeclGroup emptyTM) (mDecls m)
-                 return m { mDecls = ds }
+rewModule :: Supply -> Module -> (Module,Supply)
+rewModule s m = runM body (mName m) s
+  where
+  body = do ds <- mapM (rewDeclGroup emptyTM) (mDecls m)
+            return m { mDecls = ds }
 
 --------------------------------------------------------------------------------
 
-type M      = ReaderT RO (StateT RW Id)
-
-type RO = Maybe ModName   -- are we at the top level?
-type RW = Int             -- to generate names
+type M  = ReaderT RO SupplyM
+type RO = ModName
 
-newName :: M QName
-newName =
-  do n  <- sets $ \s -> (s, s + 1)
-     seq n $ return (QName Nothing (NewName MonoValues n))
+-- | Produce a fresh top-level name.
+newName :: M Name
+newName  =
+  do ns <- ask
+     liftSupply (mkDeclared ns "$mono" emptyRange)
 
-newTopOrLocalName :: M QName
-newTopOrLocalName =
-  do mb <- ask
-     n  <- sets $ \s -> (s, s + 1)
-     seq n $ return (QName mb (NewName MonoValues n))
+newTopOrLocalName :: M Name
+newTopOrLocalName  = newName
 
+-- | Not really any distinction between global and local, all names get the
+-- module prefix added, and a unique id.
 inLocal :: M a -> M a
-inLocal = local Nothing
+inLocal  = id
 
 
 
@@ -179,7 +178,6 @@
                           Nothing  -> EProofApp <$> go e
                           Just yes -> return yes
 
-      ECon {}         -> return expr
       EList es t      -> EList   <$> mapM go es <*> return t
       ETuple es       -> ETuple  <$> mapM go es
       ERec fs         -> ERec    <$> (forM fs $ \(f,e) -> do e1 <- go e
@@ -212,9 +210,13 @@
 
 
 rewD :: RewMap -> Decl -> M Decl
-rewD rews d = do e <- rewE rews (dDefinition d)
+rewD rews d = do e <- rewDef rews (dDefinition d)
                  return d { dDefinition = e }
 
+rewDef :: RewMap -> DeclDef -> M DeclDef
+rewDef rews (DExpr e) = DExpr <$> rewE rews e
+rewDef _    DPrim     = return DPrim
+
 rewDeclGroup :: RewMap -> DeclGroup -> M DeclGroup
 rewDeclGroup rews dg =
   case dg of
@@ -231,9 +233,12 @@
   sameTParams    (_,tps1,x,_) (_,tps2,y,_) = tps1 == tps2 && x == y
   compareTParams (_,tps1,x,_) (_,tps2,y,_) = compare (x,tps1) (y,tps2)
 
-  consider d   = let (tps,props,e) = splitTParams (dDefinition d)
-                 in if not (null tps) && notFun e
-                     then Right (d, tps, props, e)
+  consider d   =
+    case dDefinition d of
+      DPrim   -> Left d
+      DExpr e -> let (tps,props,e') = splitTParams e
+                 in if not (null tps) && notFun e'
+                     then Right (d, tps, props, e')
                      else Left d
 
   rewSame ds =
@@ -252,7 +257,7 @@
                              , d { dName        = newN
                                  , dSignature   = (dSignature d)
                                          { sVars = [], sProps = [] }
-                                 , dDefinition  = e1
+                                 , dDefinition  = DExpr e1
                                  }
                              )
 
@@ -262,7 +267,7 @@
                                 let newBody = EVar (dName f')
                                     newE = EWhere newBody
                                               [ Recursive [f'] ]
-                                in foldr ETAbs
+                                in DExpr $ foldr ETAbs
                                    (foldr EProofAbs newE props) tps
                             }
                       ]
@@ -285,11 +290,16 @@
                                     (map (sType . dSignature) monoDs)
 
                         , dDefinition =
+                            DExpr  $
                             addTPs $
                             EWhere (ETuple [ EVar (dName d) | d <- monoDs ])
                                    [ Recursive monoDs ]
 
                         , dPragmas    = [] -- ?
+
+                        , dInfix = False
+                        , dFixity = Nothing
+                        , dDoc = Nothing
                         }
 
                       mkProof e _ = EProofApp e
@@ -298,6 +308,7 @@
 
                       mkFunDef n f =
                         f { dDefinition =
+                              DExpr  $
                               addTPs $ ESel ( flip (foldl mkProof) props
                                             $ flip (foldl ETApp) tys
                                             $ EVar tupName
diff --git a/src/Cryptol/Transform/Specialize.hs b/src/Cryptol/Transform/Specialize.hs
--- a/src/Cryptol/Transform/Specialize.hs
+++ b/src/Cryptol/Transform/Specialize.hs
@@ -1,6 +1,6 @@
 -- |
 -- Module      :  $Header$
--- Copyright   :  (c) 2013-2015 Galois, Inc.
+-- Copyright   :  (c) 2013-2016 Galois, Inc.
 -- License     :  BSD3
 -- Maintainer  :  cryptol@galois.com
 -- Stability   :  provisional
@@ -15,24 +15,22 @@
 import qualified Cryptol.ModuleSystem as M
 import qualified Cryptol.ModuleSystem.Env as M
 import qualified Cryptol.ModuleSystem.Monad as M
+import Cryptol.ModuleSystem.Name
 
-import Data.List (intercalate)
 import           Data.Map (Map)
 import qualified Data.Map as Map
 import Data.Maybe (catMaybes)
 
-import MonadLib
+import MonadLib hiding (mapM)
 
-#if __GLASGOW_HASKELL__ < 710
-import Control.Applicative
-import Data.Traversable (traverse)
-#endif
+import Prelude ()
+import Prelude.Compat
 
 -- Specializer Monad -----------------------------------------------------------
 
--- | A QName should have an entry in the SpecCache iff it is
--- specializable. Each QName starts out with an empty TypesMap.
-type SpecCache = Map QName (Decl, TypesMap (QName, Maybe Decl))
+-- | A Name should have an entry in the SpecCache iff it is
+-- specializable. Each Name starts out with an empty TypesMap.
+type SpecCache = Map Name (Decl, TypesMap (Name, Maybe Decl))
 
 -- | The specializer monad.
 type SpecT m a = StateT SpecCache (M.ModuleT m) a
@@ -75,7 +73,6 @@
 specializeExpr :: Expr -> SpecM Expr
 specializeExpr expr =
   case expr of
-    ECon _econ    -> pure expr
     EList es t    -> EList <$> traverse specializeExpr es <*> pure t
     ETuple es     -> ETuple <$> traverse specializeExpr es
     ERec fs       -> ERec <$> traverse (traverseSnd specializeExpr) fs
@@ -119,12 +116,14 @@
 -- SpecCache state. Return the result along with the declarations and
 -- a table of names of specialized bindings.
 withDeclGroups :: [DeclGroup] -> SpecM a
-                  -> SpecM (a, [DeclGroup], Map QName (TypesMap QName))
+                  -> SpecM (a, [DeclGroup], Map Name (TypesMap Name))
 withDeclGroups dgs action = do
+  origCache <- getSpecCache
   let decls = concatMap groupDecls dgs
   let newCache = Map.fromList [ (dName d, (d, emptyTM)) | d <- decls ]
+  let savedCache = Map.intersection origCache newCache
   -- We assume that the names bound in dgs are disjoint from the other names in scope.
-  modifySpecCache (Map.union newCache)
+  setSpecCache (Map.union newCache origCache)
   result <- action
   -- Then reassemble the DeclGroups.
   let splitDecl :: Decl -> SpecM [Decl]
@@ -143,7 +142,7 @@
   newCache' <- flip Map.intersection newCache <$> getSpecCache
   let nameTable = fmap (fmap fst . snd) newCache'
   -- Remove local definitions from the cache.
-  modifySpecCache (flip Map.difference newCache)
+  modifySpecCache (Map.union savedCache . flip Map.difference newCache)
   return (result, dgs', nameTable)
 
 -- | Compute the specialization of `EWhere e dgs`. A decl within `dgs`
@@ -163,7 +162,7 @@
 -- versions of polymorphic decls that are referenced by the
 -- monomorphic bindings. We also return a map relating generated names
 -- to the names from the original declarations.
-specializeDeclGroups :: [DeclGroup] -> SpecM ([DeclGroup], Map QName (TypesMap QName))
+specializeDeclGroups :: [DeclGroup] -> SpecM ([DeclGroup], Map Name (TypesMap Name))
 specializeDeclGroups dgs = do
   let decls = concatMap groupDecls dgs
   let isMono s = null (sVars s) && null (sProps s)
@@ -187,7 +186,10 @@
                  qname' <- freshName qname ts -- New type instance, record new name
                  sig' <- instantiateSchema ts n (dSignature decl)
                  modifySpecCache (Map.adjust (fmap (insertTM ts (qname', Nothing))) qname)
-                 rhs' <- specializeExpr =<< instantiateExpr ts n (dDefinition decl)
+                 rhs' <- case dDefinition decl of
+                           DExpr e -> do e' <- specializeExpr =<< instantiateExpr ts n e
+                                         return (DExpr e')
+                           DPrim   -> return DPrim
                  let decl' = decl { dName = qname', dSignature = sig', dDefinition = rhs' }
                  modifySpecCache (Map.adjust (fmap (insertTM ts (qname', Just decl'))) qname)
                  return (EVar qname')
@@ -220,91 +222,100 @@
     go ts (ETAbs t e) = go (t : ts) e
     go ts e           = (ts, e)
 
--- Any top-level declarations in the current module can be found in the 
---  ModuleEnv's LoadedModules, and so we can count of freshName to avoid collisions with them.
--- Additionally, decls in 'where' clauses can only (currently) be parsed with unqualified names.
---  Any generated name for a specialized function will be qualified with the current @ModName@,
---  so genned names will not collide with local decls either.
-freshName :: QName -> [Type] -> SpecM QName
-freshName qn [] = return qn
-freshName (QName m name) tys = do
-  let name' = reifyName name tys
-  bNames <- matchingBoundNames m
-  let loop i = let nm = name' ++ "_" ++ show i
-                 in if nm `elem` bNames
-                      then loop $ i + 1
-                      else nm
-  let go = if name' `elem` bNames
-               then loop (1 :: Integer)
-               else name'
-  return $ QName m (Name go)
-
-matchingBoundNames :: (Maybe ModName) -> SpecM [String]
-matchingBoundNames m = do
-  qns <- allPublicQNames <$> liftSpecT M.getModuleEnv
-  return [ n | QName m' (Name n) <- qns , m == m' ]
+-- Any top-level declarations in the current module can be found in the
+-- ModuleEnv's LoadedModules, and so we can count of freshName to avoid
+-- collisions with them.  Any generated name for a
+-- specialized function will be qualified with the current @ModName@, so genned
+-- names will not collide with local decls either.
+-- freshName :: Name -> [Type] -> SpecM Name
+-- freshName n [] = return n
+-- freshName (QName m name) tys = do
+--   let name' = reifyName name tys
+--   bNames <- matchingBoundNames m
+--   let loop i = let nm = name' ++ "_" ++ show i
+--                  in if nm `elem` bNames
+--                       then loop $ i + 1
+--                       else nm
+--   let go = if name' `elem` bNames
+--                then loop (1 :: Integer)
+--                else name'
+--   return $ QName m (mkName go)
 
-reifyName :: Name -> [Type] -> String
-reifyName name tys = intercalate "_" (showName name : concatMap showT tys)
+-- | Freshen a name by giving it a new unique.
+freshName :: Name -> [Type] -> SpecM Name
+freshName n _ =
+  case nameInfo n of
+    Declared ns -> liftSupply (mkDeclared ns ident loc)
+    Parameter   -> liftSupply (mkParameter ident loc)
   where
-    tvInt (TVFree i _ _ _) = i
-    tvInt (TVBound i _) = i
-    showT typ =
-      case typ of
-        TCon tc ts  -> showTCon tc : concatMap showT ts
-        TUser _ _ t -> showT t
-        TVar tv     -> [ "a" ++ show (tvInt tv) ]
-        TRec tr     -> "rec" : concatMap showRecFld tr
-    showTCon tCon =
-      case tCon of
-        TC tc -> showTC tc
-        PC pc -> showPC pc
-        TF tf -> showTF tf
-    showPC pc =
-      case pc of
-        PEqual   -> "eq"
-        PNeq     -> "neq"
-        PGeq     -> "geq"
-        PFin     -> "fin"
-        PHas sel -> "sel_" ++ showSel sel
-        PArith   -> "arith"
-        PCmp     -> "cmp"
-    showTC tc =
-      case tc of
-        TCNum n     -> show n
-        TCInf       -> "inf"
-        TCBit       -> "bit"
-        TCSeq       -> "seq"
-        TCFun       -> "fun"
-        TCTuple n   -> "t" ++ show n
-        TCNewtype _ -> "user"
-    showSel sel = intercalate "_" $
-      case sel of
-        TupleSel  _ sig -> "tup"  : maybe [] ((:[]) . show) sig
-        RecordSel x sig -> "rec"  : showName x : map showName (maybe [] id sig)
-        ListSel   _ sig -> "list" : maybe [] ((:[]) . show) sig
-    showName nm = 
-      case nm of
-        Name s       -> s
-        NewName _ n -> "x" ++ show n
-    showTF tf =
-      case tf of
-        TCAdd           -> "add"
-        TCSub           -> "sub"
-        TCMul           -> "mul"
-        TCDiv           -> "div"
-        TCMod           -> "mod"
-        TCLg2           -> "lg2"
-        TCExp           -> "exp"
-        TCWidth         -> "width"
-        TCMin           -> "min"
-        TCMax           -> "max"
-        TCLenFromThen   -> "len_from_then"
-        TCLenFromThenTo -> "len_from_then_to"
-    showRecFld (nm,t) = showName nm : showT t
+  ident = nameIdent n
+  loc   = nameLoc n
 
+-- matchingBoundNames :: (Maybe ModName) -> SpecM [String]
+-- matchingBoundNames m = do
+--   qns <- allPublicNames <$> liftSpecT M.getModuleEnv
+--   return [ unpack n | QName m' (Name n) <- qns , m == m' ]
 
+-- reifyName :: Name -> [Type] -> String
+-- reifyName name tys = intercalate "_" (showName name : concatMap showT tys)
+--   where
+--     tvInt (TVFree i _ _ _) = i
+--     tvInt (TVBound i _) = i
+--     showT typ =
+--       case typ of
+--         TCon tc ts  -> showTCon tc : concatMap showT ts
+--         TUser _ _ t -> showT t
+--         TVar tv     -> [ "a" ++ show (tvInt tv) ]
+--         TRec tr     -> "rec" : concatMap showRecFld tr
+--     showTCon tCon =
+--       case tCon of
+--         TC tc -> showTC tc
+--         PC pc -> showPC pc
+--         TF tf -> showTF tf
+--     showPC pc =
+--       case pc of
+--         PEqual   -> "eq"
+--         PNeq     -> "neq"
+--         PGeq     -> "geq"
+--         PFin     -> "fin"
+--         PHas sel -> "sel_" ++ showSel sel
+--         PArith   -> "arith"
+--         PCmp     -> "cmp"
+--     showTC tc =
+--       case tc of
+--         TCNum n     -> show n
+--         TCInf       -> "inf"
+--         TCBit       -> "bit"
+--         TCSeq       -> "seq"
+--         TCFun       -> "fun"
+--         TCTuple n   -> "t" ++ show n
+--         TCNewtype _ -> "user"
+--     showSel sel = intercalate "_" $
+--       case sel of
+--         TupleSel  _ sig -> "tup"  : maybe [] ((:[]) . show) sig
+--         RecordSel x sig -> "rec"  : showName x : map showName (maybe [] id sig)
+--         ListSel   _ sig -> "list" : maybe [] ((:[]) . show) sig
+--     showName nm =
+--       case nm of
+--         Name s       -> unpack s
+--         NewName _ n -> "x" ++ show n
+--     showTF tf =
+--       case tf of
+--         TCAdd           -> "add"
+--         TCSub           -> "sub"
+--         TCMul           -> "mul"
+--         TCDiv           -> "div"
+--         TCMod           -> "mod"
+--         TCExp           -> "exp"
+--         TCWidth         -> "width"
+--         TCMin           -> "min"
+--         TCMax           -> "max"
+--         TCLenFromThen   -> "len_from_then"
+--         TCLenFromThenTo -> "len_from_then_to"
+--     showRecFld (nm,t) = showName nm : showT t
 
+
+
 instantiateSchema :: [Type] -> Int -> Schema -> SpecM Schema
 instantiateSchema ts n (Forall params props ty)
   | length params /= length ts = fail "instantiateSchema: wrong number of type arguments"
@@ -332,8 +343,8 @@
     M.getLoadedModules
   . M.meLoadedModules
 
-allPublicQNames :: M.ModuleEnv -> [QName]
-allPublicQNames =
+allPublicNames :: M.ModuleEnv -> [Name]
+allPublicNames =
     concatMap
       ( Map.keys
       . M.ifDecls
diff --git a/src/Cryptol/TypeCheck.hs b/src/Cryptol/TypeCheck.hs
--- a/src/Cryptol/TypeCheck.hs
+++ b/src/Cryptol/TypeCheck.hs
@@ -1,10 +1,11 @@
 -- |
 -- Module      :  $Header$
--- Copyright   :  (c) 2013-2015 Galois, Inc.
+-- Copyright   :  (c) 2013-2016 Galois, Inc.
 -- License     :  BSD3
 -- Maintainer  :  cryptol@galois.com
 -- Stability   :  provisional
 -- Portability :  portable
+{-# LANGUAGE PatternGuards #-}
 
 module Cryptol.TypeCheck
   ( tcModule
@@ -12,6 +13,7 @@
   , tcDecls
   , InferInput(..)
   , InferOutput(..)
+  , SolverConfig(..)
   , NameSeeds
   , nameSeeds
   , Error(..)
@@ -20,8 +22,9 @@
   , ppError
   ) where
 
+import           Cryptol.ModuleSystem.Name (liftSupply,mkDeclared)
 import qualified Cryptol.Parser.AST as P
-import           Cryptol.Parser.Position(Range)
+import           Cryptol.Parser.Position(Range,emptyRange)
 import           Cryptol.TypeCheck.AST
 import           Cryptol.TypeCheck.Depends (FromDecl)
 import           Cryptol.TypeCheck.Monad
@@ -32,30 +35,29 @@
                    , nameSeeds
                    , lookupVar
                    )
-import           Cryptol.Prims.Types(typeOf)
 import           Cryptol.TypeCheck.Infer (inferModule, inferBinds, inferDs)
-import           Cryptol.TypeCheck.InferTypes(Error(..),Warning(..),VarType(..))
+import           Cryptol.TypeCheck.InferTypes(Error(..),Warning(..),VarType(..), SolverConfig(..))
 import           Cryptol.TypeCheck.Solve(simplifyAllConstraints)
+import           Cryptol.Utils.Ident (packModName,packIdent)
 import           Cryptol.Utils.PP
 import           Cryptol.Utils.Panic(panic)
 
-tcModule :: P.Module -> InferInput -> IO (InferOutput Module)
+tcModule :: P.Module Name -> InferInput -> IO (InferOutput Module)
 tcModule m inp = runInferM inp
                $ do x <- inferModule m
                     simplifyAllConstraints
                     return x
 
-tcExpr :: P.Expr -> InferInput -> IO (InferOutput (Expr,Schema))
+tcExpr :: P.Expr Name -> InferInput -> IO (InferOutput (Expr,Schema))
 tcExpr e0 inp = runInferM inp
-                $ do x <- go e0
+                $ do x <- go emptyRange e0
                      simplifyAllConstraints
                      return x
 
   where
-  go expr =
+  go loc expr =
     case expr of
-      P.ELocated e _ -> go e
-      P.ECon ec -> return (ECon ec, typeOf ec)
+      P.ELocated e loc' -> go loc' e
       P.EVar x  ->
         do res <- lookupVar x
            case res of
@@ -65,19 +67,27 @@
                              , show e'
                              , show t
                              ]
-      _ -> do res <- inferBinds True False
+      _ -> do fresh <- liftSupply (mkDeclared (packModName ["<expr>"]) (packIdent "(expression)") loc)
+              res   <- inferBinds True False
                 [ P.Bind
-                    { P.bName      = P.Located (inpRange inp)
-                                   $ mkUnqual (P.Name "(expression)")
+                    { P.bName      = P.Located { P.srcRange = loc, P.thing = fresh }
                     , P.bParams    = []
-                    , P.bDef       = expr
+                    , P.bDef       = P.Located (inpRange inp) (P.DExpr expr)
                     , P.bPragmas   = []
                     , P.bSignature = Nothing
                     , P.bMono      = False
+                    , P.bInfix     = False
+                    , P.bFixity    = Nothing
+                    , P.bDoc       = Nothing
                     } ]
 
               case res of
-                [d] -> return (dDefinition d, dSignature d)
+                [d] | DExpr e <- dDefinition d -> return (e, dSignature d)
+                    | otherwise                ->
+                       panic "Cryptol.TypeCheck.tcExpr"
+                          [ "Expected an expression in definition"
+                          , show d ]
+
                 _   -> panic "Cryptol.TypeCheck.tcExpr"
                           ( "Multiple declarations when check expression:"
                           : map show res
diff --git a/src/Cryptol/TypeCheck/AST.hs b/src/Cryptol/TypeCheck/AST.hs
--- a/src/Cryptol/TypeCheck/AST.hs
+++ b/src/Cryptol/TypeCheck/AST.hs
@@ -1,6 +1,6 @@
 -- |
 -- Module      :  $Header$
--- Copyright   :  (c) 2013-2015 Galois, Inc.
+-- Copyright   :  (c) 2013-2016 Galois, Inc.
 -- License     :  BSD3
 -- Maintainer  :  cryptol@galois.com
 -- Stability   :  provisional
@@ -10,27 +10,35 @@
 {-# LANGUAGE RecordWildCards                     #-}
 {-# LANGUAGE PatternGuards                       #-}
 {-# LANGUAGE FlexibleInstances, FlexibleContexts #-}
+{-# LANGUAGE DeriveGeneric                       #-}
 module Cryptol.TypeCheck.AST
   ( module Cryptol.TypeCheck.AST
+  , Name()
   , TFun(..)
-  , Name(..), QName(..), mkUnqual, unqual
-  , ModName(..)
   , Selector(..)
   , Import(..)
   , ImportSpec(..)
   , ExportType(..)
   , ExportSpec(..), isExportedBind, isExportedType
   , Pragma(..)
+  , Fixity(..)
+  , PrimMap(..)
   ) where
 
+import Cryptol.ModuleSystem.Name
 import Cryptol.Prims.Syntax
-import Cryptol.Parser.AST ( Name(..), Selector(..),Pragma(..), ppSelector
+import Cryptol.Parser.AST ( Selector(..),Pragma(..), ppSelector
                           , Import(..), ImportSpec(..), ExportType(..)
-                          , ExportSpec(..), ModName(..), isExportedBind
-                          , isExportedType, QName(..), mkUnqual, unqual )
+                          , ExportSpec(..), isExportedBind
+                          , isExportedType, Fixity(..) )
+import Cryptol.Utils.Ident (Ident,isInfixIdent,ModName,packIdent)
 import Cryptol.Utils.Panic(panic)
 import Cryptol.TypeCheck.PP
+import Cryptol.TypeCheck.Solver.InfNat
 
+import GHC.Generics (Generic)
+import Control.DeepSeq.Generics
+
 import           Data.Map    (Map)
 import qualified Data.Map as Map
 import qualified Data.IntMap as IntMap
@@ -38,50 +46,61 @@
 
 {- | A Cryptol module.
 -}
-data Module = Module { mName     :: ModName
-                     , mExports  :: ExportSpec
+data Module = Module { mName     :: !ModName
+                     , mExports  :: ExportSpec Name
                      , mImports  :: [Import]
-                     , mTySyns   :: Map QName TySyn
-                     , mNewtypes :: Map QName Newtype
+                     , mTySyns   :: Map Name TySyn
+                     , mNewtypes :: Map Name Newtype
                      , mDecls    :: [DeclGroup]
-                     } deriving Show
+                     } deriving (Show, Generic)
 
+instance NFData Module where rnf = genericRnf
 
 -- | Kinds, classify types.
 data Kind   = KType
             | KNum
             | KProp
             | Kind :-> Kind
-              deriving (Eq,Show)
+              deriving (Eq, Show, Generic)
 infixr 5 :->
 
+instance NFData Kind where rnf = genericRnf
 
+
 -- | The types of polymorphic values.
 data Schema = Forall { sVars :: [TParam], sProps :: [Prop], sType :: Type }
-              deriving (Eq, Show)
+              deriving (Eq, Show, Generic)
 
+instance NFData Schema where rnf = genericRnf
+
 -- | Type synonym.
-data TySyn  = TySyn { tsName        :: QName      -- ^ Name
+data TySyn  = TySyn { tsName        :: Name       -- ^ Name
                     , tsParams      :: [TParam]   -- ^ Parameters
                     , tsConstraints :: [Prop]     -- ^ Ensure body is OK
                     , tsDef         :: Type       -- ^ Definition
                     }
-              deriving (Eq, Show)
+              deriving (Eq, Show, Generic)
 
+instance NFData TySyn where rnf = genericRnf
+
 -- | Named records
-data Newtype  = Newtype { ntName   :: QName
+data Newtype  = Newtype { ntName   :: Name
                         , ntParams :: [TParam]
                         , ntConstraints :: [Prop]
-                        , ntFields :: [(Name,Type)]
-                        } deriving (Show)
+                        , ntFields :: [(Ident,Type)]
+                        } deriving (Show, Generic)
 
+instance NFData Newtype where rnf = genericRnf
+
 -- | Type parameters.
 data TParam = TParam { tpUnique :: !Int       -- ^ Parameter identifier
                      , tpKind   :: Kind       -- ^ Kind of parameter
-                     , tpName   :: Maybe QName-- ^ Name from source, if any.
+                     , tpName   :: Maybe Name -- ^ Name from source, if any.
                      }
-              deriving (Show)
+              deriving (Show, Generic)
 
+instance NFData TParam where rnf = genericRnf
+
 instance Eq TParam where
   x == y = tpUnique x == tpUnique y
 
@@ -99,18 +118,20 @@
             | TVar TVar
               -- ^ Type variable (free or bound)
 
-            | TUser QName [Type] Type
+            | TUser Name [Type] Type
               {- ^ This is just a type annotation, for a type that
               was written as a type synonym.  It is useful so that we
               can use it to report nicer errors.
               Example: `TUser T ts t` is really just the type `t` that
               was written as `T ts` by the user. -}
 
-            | TRec [(Name,Type)]
+            | TRec [(Ident,Type)]
               -- ^ Record type
 
-              deriving (Show,Eq,Ord)
+              deriving (Show,Eq,Ord,Generic)
 
+instance NFData Type where rnf = genericRnf
+
 -- | The type is supposed to be of kind `KProp`
 type Prop   = Type
 
@@ -125,12 +146,16 @@
 
 
             | TVBound !Int Kind
-              deriving Show
+              deriving (Show,Generic)
 
+instance NFData TVar where rnf = genericRnf
+
 -- | Type constants.
 data TCon   = TC TC | PC PC | TF TFun
-              deriving (Show,Eq,Ord)
+              deriving (Show,Eq,Ord,Generic)
 
+instance NFData TCon where rnf = genericRnf
+
 -- | Built-in type constants.
 
 -- | Predicate symbols.
@@ -143,8 +168,10 @@
             | PHas Selector -- ^ @Has sel type field@ does not appear in schemas
             | PArith        -- ^ @Arith _@
             | PCmp          -- ^ @Cmp _@
-              deriving (Show,Eq,Ord)
+              deriving (Show,Eq,Ord,Generic)
 
+instance NFData PC where rnf = genericRnf
+
 -- | 1-1 constants.
 data TC     = TCNum Integer            -- ^ Numbers
             | TCInf                    -- ^ Inf
@@ -153,11 +180,15 @@
             | TCFun                    -- ^ @_ -> _@
             | TCTuple Int              -- ^ @(_, _, _)@
             | TCNewtype UserTC         -- ^ user-defined, @T@
-              deriving (Show,Eq,Ord)
+              deriving (Show,Eq,Ord,Generic)
 
-data UserTC = UserTC QName Kind
-                deriving Show
+instance NFData TC where rnf = genericRnf
 
+data UserTC = UserTC Name Kind
+              deriving (Show,Generic)
+
+instance NFData UserTC where rnf = genericRnf
+
 instance Eq UserTC where
   UserTC x _ == UserTC y _ = x == y
 
@@ -178,11 +209,9 @@
 
 
 
-data Expr   = ECon ECon                 -- ^ Built-in constant
-
-            | EList [Expr] Type         -- ^ List value (with type of elements)
+data Expr   = EList [Expr] Type         -- ^ List value (with type of elements)
             | ETuple [Expr]             -- ^ Tuple value
-            | ERec [(Name,Expr)]        -- ^ Record value
+            | ERec [(Ident,Expr)]       -- ^ Record value
             | ESel Expr Selector        -- ^ Elimination for tuple/record/list
 
             | EIf Expr Expr Expr        -- ^ If-then-else
@@ -190,13 +219,13 @@
                                         --   The type caches the type of the
                                         --   expr.
 
-            | EVar QName                -- ^ Use of a bound variable
+            | EVar Name                 -- ^ Use of a bound variable
 
             | ETAbs TParam Expr         -- ^ Function Value
             | ETApp Expr Type           -- ^ Type application
 
             | EApp Expr Expr            -- ^ Function application
-            | EAbs QName Type Expr      -- ^ Function value
+            | EAbs Name Type Expr       -- ^ Function value
 
 
             {- | Proof abstraction.  Because we don't keep proofs around
@@ -235,33 +264,46 @@
 
             | EWhere Expr [DeclGroup]
 
-              deriving Show
+              deriving (Show, Generic)
 
+instance NFData Expr where rnf = genericRnf
 
-data Match  = From QName Type Expr-- ^ do we need this type?  it seems like it
+
+data Match  = From Name Type Expr -- ^ do we need this type?  it seems like it
                                   --   can be computed from the expr
             | Let Decl
-              deriving Show
-
+              deriving (Show, Generic)
 
+instance NFData Match where rnf = genericRnf
 
 data DeclGroup  = Recursive   [Decl]    -- ^ Mutually recursive declarations
                 | NonRecursive Decl     -- ^ Non-recursive declaration
-                  deriving Show
+                  deriving (Show,Generic)
 
+instance NFData DeclGroup where rnf = genericRnf
+
 groupDecls :: DeclGroup -> [Decl]
 groupDecls dg = case dg of
   Recursive ds   -> ds
   NonRecursive d -> [d]
 
-data Decl       = Decl { dName        :: QName
+data Decl       = Decl { dName        :: !Name
                        , dSignature   :: Schema
-                       , dDefinition  :: Expr
+                       , dDefinition  :: DeclDef
                        , dPragmas     :: [Pragma]
-                       } deriving (Show)
+                       , dInfix       :: !Bool
+                       , dFixity      :: Maybe Fixity
+                       , dDoc         :: Maybe String
+                       } deriving (Show,Generic)
 
+instance NFData Decl where rnf = genericRnf
 
+data DeclDef    = DPrim
+                | DExpr Expr
+                  deriving (Show,Generic)
 
+instance NFData DeclDef where rnf = genericRnf
+
 --------------------------------------------------------------------------------
 
 
@@ -275,15 +317,20 @@
 
 
 --------------------------------------------------------------------------------
+
+tIsNat' :: Type -> Maybe Nat'
+tIsNat' ty =
+  case tNoUser ty of
+    TCon (TC (TCNum x)) [] -> Just (Nat x)
+    TCon (TC TCInf)     [] -> Just Inf
+    _                      -> Nothing
+
 tIsNum :: Type -> Maybe Integer
-tIsNum ty = case tNoUser ty of
-              TCon (TC (TCNum x)) [] -> Just x
-              _                      -> Nothing
+tIsNum ty = do Nat x <- tIsNat' ty
+               return x
 
 tIsInf :: Type -> Bool
-tIsInf ty = case tNoUser ty of
-              TCon (TC TCInf) [] -> True
-              _                  -> False
+tIsInf ty = tIsNat' ty == Just Inf
 
 tIsVar :: Type -> Maybe TVar
 tIsVar ty = case tNoUser ty of
@@ -310,6 +357,19 @@
                 TCon (TC (TCTuple _)) ts -> Just ts
                 _                        -> Nothing
 
+tIsBinFun :: TFun -> Type -> Maybe (Type,Type)
+tIsBinFun f ty = case tNoUser ty of
+                   TCon (TF g) [a,b] | f == g -> Just (a,b)
+                   _                          -> Nothing
+
+-- | Split up repeated occurances of the given binary type-level function.
+tSplitFun :: TFun -> Type -> [Type]
+tSplitFun f t0 = go t0 []
+  where go ty xs = case tIsBinFun f ty of
+                     Just (a,b) -> go a (go b xs)
+                     Nothing    -> ty : xs
+
+
 pIsFin :: Prop -> Maybe Type
 pIsFin ty = case tNoUser ty of
               TCon (PC PFin) [t1] -> Just t1
@@ -365,15 +425,14 @@
 tInf     :: Type
 tInf      = TCon (TC TCInf) []
 
+tNat'    :: Nat' -> Type
+tNat' n'  = case n' of
+              Inf   -> tInf
+              Nat n -> tNum n
+
 tBit     :: Type
 tBit      = TCon (TC TCBit) []
 
-eTrue    :: Expr
-eTrue     = ECon ECTrue
-
-eFalse   :: Expr
-eFalse    = ECon ECFalse
-
 tWord    :: Type -> Type
 tWord a   = tSeq a tBit
 
@@ -383,24 +442,10 @@
 tChar :: Type
 tChar = tWord (tNum (8 :: Int))
 
-eChar :: Char -> Expr
-eChar c = ETApp (ETApp (ECon ECDemote) (tNum v)) (tNum w)
-  where v = fromEnum c
-        w = 8 :: Int
-
 tString :: Int -> Type
 tString len = tSeq (tNum len) tChar
 
-eString :: String -> Expr
-eString str = EList (map eChar str) tChar
-
--- | Make an expression that is `error` pre-applied to a type and a
--- message.
-eError :: Type -> String -> Expr
-eError t str =
-  EApp (ETApp (ETApp (ECon ECError) t) (tNum (length str))) (eString str)
-
-tRec     :: [(Name,Type)] -> Type
+tRec     :: [(Ident,Type)] -> Type
 tRec      = TRec
 
 tTuple   :: [Type] -> Type
@@ -413,7 +458,7 @@
 tFun     :: Type -> Type -> Type
 tFun a b  = TCon (TC TCFun) [a,b]
 
--- | Eliminate type synonyms.
+-- | Eliminate outermost type synonyms.
 tNoUser  :: Type -> Type
 tNoUser t = case t of
               TUser _ _ a -> tNoUser a
@@ -496,6 +541,28 @@
   where
   as = ntParams nt
 
+
+
+-- | Construct a primitive, given a map to the unique names of the Cryptol
+-- module.
+ePrim :: PrimMap -> Ident -> Expr
+ePrim pm n = EVar (lookupPrimDecl n pm)
+
+-- | Make an expression that is `error` pre-applied to a type and a message.
+eError :: PrimMap -> Type -> String -> Expr
+eError prims t str =
+  EApp (ETApp (ETApp (ePrim prims (packIdent "error")) t)
+              (tNum (length str))) (eString prims str)
+
+eString :: PrimMap -> String -> Expr
+eString prims str = EList (map (eChar prims) str) tChar
+
+eChar :: PrimMap -> Char -> Expr
+eChar prims c = ETApp (ETApp (ePrim prims (packIdent "demote")) (tNum v)) (tNum w)
+  where v = fromEnum c
+        w = 8 :: Int
+
+
 --------------------------------------------------------------------------------
 
 class HasKind t where
@@ -539,7 +606,6 @@
   kindOf tfun =
     case tfun of
       TCWidth  -> KNum :-> KNum
-      TCLg2    -> KNum :-> KNum
 
       TCAdd    -> KNum :-> KNum :-> KNum
       TCSub    -> KNum :-> KNum :-> KNum
@@ -595,6 +661,9 @@
   ppPrec _ (WithNames (TVFree x _ _ _) _) =
     char '?' <> text (intToName x)
 
+instance PP TVar where
+  ppPrec = ppWithNamesPrec IntMap.empty
+
 instance PP TParam where
   ppPrec = ppWithNamesPrec IntMap.empty
 
@@ -739,8 +808,6 @@
 instance PP (WithNames Expr) where
   ppPrec prec (WithNames expr nm) =
     case expr of
-      ECon c        -> ppPrefix c
-
       EList [] t    -> optParens (prec > 0)
                     $ text "[]" <+> colon <+> ppWP prec t
 
@@ -761,7 +828,7 @@
       EComp _ e mss -> let arm ms = text "|" <+> commaSep (map ppW ms)
                        in brackets $ ppW e <+> vcat (map arm mss)
 
-      EVar x        -> pp x
+      EVar x        -> ppPrefixName x
 
       EAbs {}       -> let (xs,e) = splitWhile splitAbs expr
                        in ppLam nm prec [] [] xs e
@@ -775,6 +842,14 @@
                            (xs,e3) = splitWhile splitAbs      e2
                        in ppLam nm prec ts ps xs e3
 
+      -- infix applications
+      EApp (EApp (EVar o) a) b
+        | isInfixIdent (nameIdent o) ->
+          ppPrec 3 a <+> ppInfixName o <+> ppPrec 3 b
+
+        | otherwise ->
+          ppPrefixName o <+> ppPrec 3 a <+> ppPrec 3 b
+
       EApp e1 e2    -> optParens (prec > 3)
                     $  ppWP 3 e1 <+> ppWP 4 e2
 
@@ -796,7 +871,7 @@
     ppW x   = ppWithNames nm x
     ppWP x  = ppWithNamesPrec nm x
 
-ppLam :: NameMap -> Int -> [TParam] -> [Prop] -> [(QName,Type)] -> Expr -> Doc
+ppLam :: NameMap -> Int -> [TParam] -> [Prop] -> [(Name,Type)] -> Expr -> Doc
 ppLam nm prec [] [] [] e = ppWithNamesPrec nm prec e
 ppLam nm prec ts ps xs e =
   optParens (prec > 0) $
@@ -821,7 +896,7 @@
                    Just (x,e1) -> let (xs,e2) = splitWhile f e1
                                   in (x:xs,e2)
 
-splitAbs :: Expr -> Maybe ((QName,Type), Expr)
+splitAbs :: Expr -> Maybe ((Name,Type), Expr)
 splitAbs (EAbs x t e)         = Just ((x,t), e)
 splitAbs _                    = Nothing
 
@@ -867,6 +942,10 @@
         else text "pragmas" <+> pp dName <+> sep (map pp dPragmas)
     ) $$
     pp dName <+> text "=" <+> ppWithNames nm dDefinition
+
+instance PP (WithNames DeclDef) where
+  ppPrec _ (WithNames DPrim _)      = text "<primitive>"
+  ppPrec _ (WithNames (DExpr e) nm) = ppWithNames nm e
 
 instance PP Decl where
   ppPrec = ppWithNamesPrec IntMap.empty
diff --git a/src/Cryptol/TypeCheck/Defaulting.hs b/src/Cryptol/TypeCheck/Defaulting.hs
deleted file mode 100644
--- a/src/Cryptol/TypeCheck/Defaulting.hs
+++ /dev/null
@@ -1,220 +0,0 @@
--- |
--- Module      :  $Header$
--- Copyright   :  (c) 2013-2015 Galois, Inc.
--- License     :  BSD3
--- Maintainer  :  cryptol@galois.com
--- Stability   :  provisional
--- Portability :  portable
-
-{-# LANGUAGE RecordWildCards #-}
-{-# LANGUAGE PatternGuards #-}
-{-# LANGUAGE BangPatterns #-}
-{-# LANGUAGE Safe #-}
-module Cryptol.TypeCheck.Defaulting where
-
-import Cryptol.Parser.Position(Range)
-import Cryptol.TypeCheck.AST
-import Cryptol.TypeCheck.InferTypes
-          (Solved(..),Goal(..),ConstraintSource(..), Warning(..))
-import Cryptol.TypeCheck.Solver.Eval (assumedOrderModel,simpType)
-import Cryptol.TypeCheck.Solver.FinOrd(noFacts,OrdFacts,ordFactsToGoals)
-import Cryptol.TypeCheck.Solver.Numeric(numericStep,goalOrderModel)
-import Cryptol.TypeCheck.Subst
-  (Subst,apSubst,listSubst,fvs,emptySubst,singleSubst)
-import Cryptol.Utils.Panic(panic)
-
-import Control.Monad(guard,msum)
-import qualified Data.Map as Map
-import qualified Data.Set as Set
-import Data.List(nubBy)
-import Data.Maybe(fromMaybe)
-
-
-
---------------------------------------------------------------------------------
--- This is what we use to avoid ambiguity when generalizing.
-
-{- If a variable, `a`, is:
-    1. Of kind KNum
-    2. Generic (i.e., does not appear in the environment)
-    3. It appears only in constraints but not in the resulting type
-       (i.e., it is not on the RHS of =>)
-    4. It (say, the variable 'a') appears only in constraints like this:
-        3.1 `a >= t` with (`a` not in `fvs t`)
-        3.2 in the `s` of `fin s`
-
-  Then we replace `a` with `max(t1 .. tn)` where the `ts`
-  are from the constraints `a >= t`.
-
-  If `t1 .. tn` is empty, then we replace `a` with 0.
-
-  This function assumes that 1-3 have been checked, and implements the rest.
-  So, given some variables and constraints that are about to be generalized,
-  we return:
-      1. a new (same or smaller) set of variables to quantify,
-      2. a new set of constraints,
-      3. a substitution which indicates what got defaulted.
--}
-
-tryDefault :: [TVar] -> [Goal] -> ([TVar], [Goal], Subst, [Warning])
-tryDefault = tryDefaultWith noFacts
-
-tryDefaultWith :: OrdFacts -> [TVar] -> [Goal] ->
-                                          ([TVar], [Goal], Subst, [Warning])
-tryDefaultWith ordM0 as ps =
-  classify (Map.fromList [ (a,([],Set.empty)) | a <- as ]) [] [] ps
-
-  where
-  -- leq: candidate definitions (i.e. of the form x >= t, x `notElem` fvs t)
-  --      for each of these, we keep the list of `t`, and the free vars in them.
-  -- fins: all `fin` constraints
-  -- others: any other constraints
-  classify leqs fins others [] =
-    let -- First, we use the `leqs` to choose some definitions.
-       (defs, newOthers)  = select [] [] (fvs others) (Map.toList leqs)
-       su                 = listSubst defs
-
-       -- Do this to simplify the instantiated "fin" constraints.
-       (m, bad, oth)      = goalOrderModel ordM0
-                                  (newOthers ++ others ++ apSubst su fins)
-    in case bad of
-         -- All good.
-         [] ->
-            let warn (x,t) =
-                  case x of
-                    TVFree _ _ _ d -> DefaultingTo d t
-                    TVBound {} -> panic "Crypto.TypeCheck.Infer"
-                      [ "tryDefault attempted to default a quantified variable."
-                      ]
-
-            in ( [ a | a <- as, a `notElem` map fst defs ]
-               , ordFactsToGoals m ++ nubBy (\x y -> goal x == goal y) oth
-               , su
-               , map warn defs
-               )
-
-
-         -- Something went wrong, don't default.
-         _  -> (as,ps,emptySubst,[])
-
-
-
-  classify leqs fins others (prop : more) =
-      case tNoUser (goal prop) of
-        TCon (PC PFin) [ _ ] -> classify leqs (prop : fins) others more
-
-        -- Things of the form: x >= T(x) are not defaulted.
-        TCon (PC PGeq) [ TVar x, t ]
-          | x `elem` as && x `Set.notMember` freeRHS ->
-           classify leqs' fins others more
-           where freeRHS = fvs t
-                 add (xs1,vs1) (xs2,vs2) = (xs1 ++ xs2, Set.union vs1 vs2)
-                 leqs' = Map.insertWith add x ([(t,prop)],freeRHS) leqs
-
-        _ -> classify leqs fins (prop : others) more
-
-
-  -- Pickout which variables may be defaulted and how.
-  select yes no _ [] = ([ (x, simpType noFacts t) | (x,t) <- yes ] ,no)
-  select yes no otherFree ((x,(rhsG,vs)) : more) =
-    select newYes newNo newFree newMore
-
-    where
-    (ts,gs) = unzip rhsG
-
-    -- `x` selected only if appears nowehere else.
-    -- this includes other candidates for defaulting.
-    (newYes,newNo,newFree,newMore)
-
-        -- Mentioned in other constraints, definately not defaultable.
-        | x `Set.member` otherFree = noDefaulting
-
-        | otherwise =
-            let deps = [ y | (y,(_,yvs)) <- more, x `Set.member` yvs ]
-                recs = filter (`Set.member` vs) deps
-            in if not (null recs) || isBoundTV x -- x >= S(y), y >= T(x)
-                                 then noDefaulting
-
-                                  -- x >= S,    y >= T(x)   or
-                                  -- x >= S(y), y >= S
-                                  else yesDefaulting
-
-        where
-        noDefaulting = ( yes, gs ++ no, vs `Set.union` otherFree, more )
-
-        yesDefaulting =
-          let ty  = case ts of
-                      [] -> tNum (0::Int)
-                      _  -> foldr1 tMax ts
-              su1 = singleSubst x ty
-          in ( (x,ty) : [ (y,apSubst su1 t) | (y,t) <- yes ]
-             , no         -- We know that `x` does not appear here
-             , otherFree  -- We know that `x` did not appear here either
-
-             -- No need to update the `vs` because we've already
-             -- checked that there are no recursive dependencies.
-             , [ (y, (apSubst su1 ts1, vs1)) | (y,(ts1,vs1)) <- more ]
-             )
-
-
-
---------------------------------------------------------------------------------
--- This is used when we just want to instantiate things in the REPL.
-
--- | Try to pick a reasonable instantiation for an expression, with
--- the given type.  This is useful when we do evaluation at the REPL.
--- The resaulting types should satisfy the constraints of the schema.
-defaultExpr :: Range -> Expr -> Schema -> Maybe ([(TParam,Type)], Expr)
-defaultExpr r e s =
-  do let vs = sVars s
-     guard $ all (\v -> kindOf v == KNum) vs  -- only defautl numerics.
-     ps <- simplify [] $ map toGoal $ sProps s
-     soln <- go [] vs ps
-     tys  <- mapM (`lookup` soln) vs
-     return (soln, foldl (\e1 _ -> EProofApp e1) (foldl ETApp e tys) (sProps s))
-
-  where
-  candidate :: Goal -> Maybe (TVar,Integer)
-  candidate p = do (t1,t2) <- pIsGeq $ simpType noFacts $ goal p
-                   a <- tIsVar t1
-                   n <- tIsNum t2
-                   return (a,n)
-
-  go done [] [] = return done
-  go done ts [] = return (done ++ [ (tp, tNum (0::Integer)) | tp <- ts ])
-  go _    [] _  = Nothing
-
-  go done as@(tp0:_) ps =
-    do let (a,n) = fromMaybe (tpVar tp0, 0) $ msum (map candidate ps)
-       -- If no candidate works, we try to set the variable to 0
-       -- This handles a case when all we have letft are fin constraints.
-
-       (tp,tps) <- getParam a as
-       let ty = tNum n
-           su = singleSubst a ty
-       ps1 <- simplify [] (apSubst su ps)
-       go ((tp,ty) : done) tps ps1
-
-  getParam _ [] = Nothing
-  getParam v (tp : tps)
-    | tpVar tp == v = Just (tp,tps)
-    | otherwise     = do (a,more) <- getParam v tps
-                         return (a,tp:more)
-
-  simplify done [] = return done
-  simplify done (p : ps) =
-    case assumedOrderModel noFacts $ map goal (done ++ ps) of
-      Left _      -> Nothing
-      Right (m,_) ->
-        case numericStep m p of
-          Solved Nothing ps1   -> simplify done (ps1 ++ ps)
-          Solved (Just su) ps1 ->
-            simplify [] (ps1 ++ apSubst su done ++ apSubst su ps)
-          Unsolved -> simplify (p : done) ps
-          Unsolvable -> Nothing
-
-  toGoal p = Goal { goal       = p
-                  , goalSource = CtDefaulting
-                  , goalRange  = r
-                  }
-
diff --git a/src/Cryptol/TypeCheck/Depends.hs b/src/Cryptol/TypeCheck/Depends.hs
--- a/src/Cryptol/TypeCheck/Depends.hs
+++ b/src/Cryptol/TypeCheck/Depends.hs
@@ -1,17 +1,18 @@
 -- |
 -- Module      :  $Header$
--- Copyright   :  (c) 2013-2015 Galois, Inc.
+-- Copyright   :  (c) 2013-2016 Galois, Inc.
 -- License     :  BSD3
 -- Maintainer  :  cryptol@galois.com
 -- Stability   :  provisional
 -- Portability :  portable
 
 {-# LANGUAGE Safe #-}
+{-# LANGUAGE FlexibleInstances #-}
 module Cryptol.TypeCheck.Depends where
 
+import           Cryptol.ModuleSystem.Name (Name)
 import qualified Cryptol.Parser.AST as P
 import           Cryptol.Parser.Position(Range, Located(..), thing)
-import           Cryptol.TypeCheck.AST(QName)
 import           Cryptol.Parser.Names (namesB, namesT)
 import           Cryptol.TypeCheck.Monad( InferM, recordError, getTVars
                                         , Error(..))
@@ -25,7 +26,7 @@
 import qualified Data.Map as Map
 import qualified Data.Set as Set
 
-data TyDecl = TS P.TySyn | NT P.Newtype
+data TyDecl = TS (P.TySyn Name) | NT (P.Newtype Name)
 
 -- | Check for duplicate and recursive type synonyms.
 -- Returns the type-synonyms in dependecy order.
@@ -43,7 +44,7 @@
     , x { thing = (ty, Set.toList $
                        Set.difference
                          (Set.unions (map (namesT vs . P.value) fs))
-                         (Set.fromList (map P.tpQName as))
+                         (Set.fromList (map P.tpName as))
                   )
         }
     )
@@ -52,12 +53,12 @@
         (thing x
         , x { thing = (ty, Set.toList $
                            Set.difference (namesT vs t)
-                                          (Set.fromList (map P.tpQName as)))
+                                          (Set.fromList (map P.tpName as)))
              }
         )
 
-  getN (TS (P.TySyn x _ _)) = x
-  getN (NT x)               = P.nName x
+  getN (TS (P.TySyn x _ _)) = thing x
+  getN (NT x)               = thing (P.nName x)
 
   check (AcyclicSCC x) = return [x]
 
@@ -72,18 +73,18 @@
 
 
 -- | Associate type signatures with bindings and order bindings by dependency.
-orderBinds :: [P.Bind] -> [SCC P.Bind]
+orderBinds :: [P.Bind Name] -> [SCC (P.Bind Name)]
 orderBinds bs = mkScc [ (b, map thing defs, Set.toList uses)
                       | b <- bs
                       , let (defs,uses) = namesB b
                       ]
 
 class FromDecl d where
-  toBind    :: d -> Maybe P.Bind
+  toBind    :: d -> Maybe (P.Bind Name)
   toTyDecl  :: d -> Maybe TyDecl
   isTopDecl :: d -> Bool
 
-instance FromDecl P.TopDecl where
+instance FromDecl (P.TopDecl Name) where
   toBind (P.Decl x)         = toBind (P.tlValue x)
   toBind _                  = Nothing
 
@@ -93,7 +94,7 @@
 
   isTopDecl _               = True
 
-instance FromDecl P.Decl where
+instance FromDecl (P.Decl Name) where
   toBind (P.DLocated d _) = toBind d
   toBind (P.DBind b)      = return b
   toBind _                = Nothing
@@ -107,7 +108,7 @@
 {- | Given a list of declarations, annoted with (i) the names that they
 define, and (ii) the names that they use, we compute a list of strongly
 connected components of the declarations.  The SCCs are in dependency order. -}
-mkScc :: [(a,[QName],[QName])] -> [SCC a]
+mkScc :: [(a,[Name],[Name])] -> [SCC a]
 mkScc ents = stronglyConnComp $ zipWith mkGr keys ents
   where
   keys                    = [ 0 :: Integer .. ]
@@ -120,7 +121,7 @@
 
 {- | Combine a bunch of definitions into a single map.  Here we check
 that each name is defined only onces. -}
-combineMaps :: [Map QName (Located a)] -> InferM (Map QName (Located a))
+combineMaps :: [Map Name (Located a)] -> InferM (Map Name (Located a))
 combineMaps ms  =
    do mapM_ recordError $
         do m <- ms
@@ -130,7 +131,7 @@
 
 {- | Combine a bunch of definitions into a single map.  Here we check
 that each name is defined only onces. -}
-combine :: [(QName, Located a)] -> InferM (Map QName (Located a))
+combine :: [(Name, Located a)] -> InferM (Map Name (Located a))
 combine m =
   do mapM_ recordError $
       do (x,rs) <- duplicates [ a { thing = x } | (x,a) <- m ]
diff --git a/src/Cryptol/TypeCheck/Infer.hs b/src/Cryptol/TypeCheck/Infer.hs
--- a/src/Cryptol/TypeCheck/Infer.hs
+++ b/src/Cryptol/TypeCheck/Infer.hs
@@ -1,6 +1,6 @@
 -- |
 -- Module      :  $Header$
--- Copyright   :  (c) 2013-2015 Galois, Inc.
+-- Copyright   :  (c) 2013-2016 Galois, Inc.
 -- License     :  BSD3
 -- Maintainer  :  cryptol@galois.com
 -- Stability   :  provisional
@@ -8,20 +8,14 @@
 --
 -- Assumes that the `NoPat` pass has been run.
 
-{-# LANGUAGE CPP #-}
 {-# LANGUAGE RecordWildCards #-}
 {-# LANGUAGE PatternGuards #-}
 {-# LANGUAGE ViewPatterns #-}
-#if __GLASGOW_HASKELL__ >= 706
 {-# LANGUAGE RecursiveDo #-}
-#else
-{-# LANGUAGE DoRec, RecursiveDo #-}
-#endif
 {-# LANGUAGE Safe #-}
 module Cryptol.TypeCheck.Infer where
 
-import           Cryptol.Prims.Syntax(ECon(..))
-import           Cryptol.Prims.Types(typeOf)
+import           Cryptol.ModuleSystem.Name (asPrim,lookupPrimDecl)
 import           Cryptol.Parser.Position
 import qualified Cryptol.Parser.AST as P
 import qualified Cryptol.Parser.Names as P
@@ -33,10 +27,8 @@
 import           Cryptol.TypeCheck.Instantiate
 import           Cryptol.TypeCheck.Depends
 import           Cryptol.TypeCheck.Subst (listSubst,apSubst,fvs,(@@))
-import           Cryptol.TypeCheck.Solver.FinOrd(noFacts,OrdFacts)
-import           Cryptol.TypeCheck.Solver.Eval(simpType)
 import           Cryptol.TypeCheck.Solver.InfNat(genLog)
-import           Cryptol.TypeCheck.Defaulting(tryDefault)
+import           Cryptol.Utils.Ident
 import           Cryptol.Utils.Panic(panic)
 import           Cryptol.Utils.PP
 
@@ -52,7 +44,7 @@
 
 -- import Cryptol.Utils.Debug
 
-inferModule :: P.Module -> InferM Module
+inferModule :: P.Module Name -> InferM Module
 inferModule m =
   inferDs (P.mDecls m) $ \ds1 ->
     do simplifyAllConstraints
@@ -69,12 +61,20 @@
   onlyLocal (IsLocal, x)    = Just x
   onlyLocal (IsExternal, _) = Nothing
 
-desugarLiteral :: Bool -> P.Literal -> InferM P.Expr
+
+-- | Construct a primitive in the parsed AST.
+mkPrim :: String -> InferM (P.Expr Name)
+mkPrim str =
+  do prims <- getPrimMap
+     return (P.EVar (lookupPrimDecl (packIdent str) prims))
+
+desugarLiteral :: Bool -> P.Literal -> InferM (P.Expr Name)
 desugarLiteral fixDec lit =
   do l <- curRange
+     demotePrim <- mkPrim "demote"
      let named (x,y)  = P.NamedInst
-                        P.Named { name = Located l (Name x), value = P.TNum y }
-         demote fs    = P.EAppT (P.ECon ECDemote) (map named fs)
+                        P.Named { name = Located l (packIdent x), value = P.TNum y }
+         demote fs    = P.EAppT demotePrim (map named fs)
 
      return $ case lit of
 
@@ -100,7 +100,7 @@
 
 
 -- | Infer the type of an expression with an explicit instantiation.
-appTys :: P.Expr -> [Located (Maybe QName,Type)] -> Type -> InferM Expr
+appTys :: P.Expr Name -> [Located (Maybe Ident,Type)] -> Type -> InferM Expr
 appTys expr ts tGoal =
   case expr of
     P.EVar x ->
@@ -114,10 +114,6 @@
     P.ELit l -> do e <- desugarLiteral False l
                    appTys e ts tGoal
 
-    P.ECon ec -> do let s1 = typeOf ec
-                    (e',t) <- instantiateWith (ECon ec) s1 ts
-                    checkHasType e' t tGoal
-
     P.EAppT e fs ->
       do ps <- mapM inferTyParam fs
          appTys e (ps ++ ts) tGoal
@@ -144,6 +140,8 @@
     P.ETyped    {} -> mono
     P.ETypeVal  {} -> mono
     P.EFun      {} -> mono
+    P.EParens   {} -> tcPanic "appTys" [ "Unexpected EParens" ]
+    P.EInfix    {} -> tcPanic "appTys" [ "Unexpected EInfix" ]
 
   where mono = do e'     <- checkE expr tGoal
                   (ie,t) <- instantiateWith e' (Forall [] [] tGoal) ts
@@ -152,11 +150,11 @@
                   checkHasType ie t tGoal
 
 
-inferTyParam :: P.TypeInst -> InferM (Located (Maybe QName, Type))
+inferTyParam :: P.TypeInst Name -> InferM (Located (Maybe Ident, Type))
 inferTyParam (P.NamedInst param) =
   do let loc = srcRange (P.name param)
      t <- inRange loc $ checkType (P.value param) Nothing
-     return $ Located loc (Just (mkUnqual (thing (P.name param))), t)
+     return $ Located loc (Just (thing (P.name param)), t)
 
 inferTyParam (P.PosInst param) =
   do t   <- checkType param Nothing
@@ -165,13 +163,13 @@
               Just r  -> return r
      return Located { srcRange = rng, thing = (Nothing, t) }
 
-checkTypeOfKind :: P.Type -> Kind -> InferM Type
+checkTypeOfKind :: P.Type Name -> Kind -> InferM Type
 checkTypeOfKind ty k = checkType ty (Just k)
 
 
 -- | We use this when we want to ensure that the expr has exactly
 -- (syntactically) the given type.
-inferE :: Doc -> P.Expr -> InferM (Expr, Type)
+inferE :: Doc -> P.Expr Name -> InferM (Expr, Type)
 inferE desc expr =
   do t  <- newType desc KType
      e1 <- checkE expr t
@@ -179,7 +177,7 @@
 
 -- | Infer the type of an expression, and translate it to a fully elaborated
 -- core term.
-checkE :: P.Expr -> Type -> InferM Expr
+checkE :: P.Expr Name -> Type -> InferM Expr
 checkE expr tGoal =
   case expr of
     P.EVar x ->
@@ -192,11 +190,6 @@
 
     P.ELit l -> (`checkE` tGoal) =<< desugarLiteral False l
 
-    P.ECon ec ->
-      do let s1 = typeOf ec
-         (e',t) <- instantiateWith (ECon ec) s1 []
-         checkHasType e' t tGoal
-
     P.ETuple es ->
       do etys <- expectTuple (length es) tGoal
          es'  <- zipWithM checkE es etys
@@ -234,8 +227,9 @@
          let totLen = tNum (2::Int) .^. bit
              lstT   = totLen .-. tNum (1::Int)
 
-         appTys (P.ECon ECFromTo)
-           [ Located rng (Just (mkUnqual (Name x)), y)
+         fromToPrim <- mkPrim "fromTo"
+         appTys fromToPrim
+           [ Located rng (Just (packIdent x), y)
            | (x,y) <- [ ("first",fstT), ("last", lstT), ("bits", bit) ]
            ] tGoal
 
@@ -247,26 +241,29 @@
                  (Nothing, Nothing) -> tcPanic "checkE"
                                         [ "EFromTo _ Nothing Nothing" ]
                  (Just t2, Nothing) ->
-                    (ECFromThen, [ ("next", t2) ])
+                    ("fromThen", [ ("next", t2) ])
 
                  (Nothing, Just t3) ->
-                    (ECFromTo, [ ("last", t3) ])
+                    ("fromTo", [ ("last", t3) ])
 
                  (Just t2, Just t3) ->
-                    (ECFromThenTo, [ ("next",t2), ("last",t3) ])
+                    ("fromThenTo", [ ("next",t2), ("last",t3) ])
 
-         let e' = P.EAppT (P.ECon c)
-                  [ P.NamedInst P.Named { name = Located l (Name x), value = y }
+         prim <- mkPrim c
+         let e' = P.EAppT prim
+                  [ P.NamedInst P.Named { name = Located l (packIdent x), value = y }
                   | (x,y) <- ("first",t1) : fs
                   ]
 
          checkE e' tGoal
 
     P.EInfFrom e1 Nothing ->
-      checkE (P.EApp (P.ECon ECInfFrom) e1) tGoal
+      do prim <- mkPrim "infFrom"
+         checkE (P.EApp prim e1) tGoal
 
     P.EInfFrom e1 (Just e2) ->
-      checkE (P.EApp (P.EApp (P.ECon ECInfFromThen) e1) e2) tGoal
+      do prim <- mkPrim "infFromThen"
+         checkE (P.EApp (P.EApp prim e1) e2) tGoal
 
     P.EComp e mss ->
       do (mss', dss, ts) <- unzip3 `fmap` zipWithM inferCArm [ 1 .. ] mss
@@ -282,9 +279,10 @@
       do ts <- mapM inferTyParam fs
          appTys e ts tGoal
 
-    P.EApp fun@(dropLoc -> P.EApp (dropLoc -> P.ECon c) _)
+    P.EApp fun@(dropLoc -> P.EApp (dropLoc -> P.EVar c) _)
            arg@(dropLoc -> P.ELit l)
-      | c `elem` [ ECShiftL, ECShiftR, ECRotL, ECRotR, ECAt, ECAtBack ] ->
+      | Just n <- asPrim c
+      , n `elem` map packIdent [ "<<", ">>", "<<<", ">>>" , "@", "!" ] ->
         do newArg <- do l1 <- desugarLiteral True l
                         return $ case arg of
                                    P.ELocated _ pos -> P.ELocated l1 pos
@@ -314,15 +312,20 @@
 
     P.ETypeVal t ->
       do l <- curRange
-         checkE (P.EAppT (P.ECon ECDemote)
+         prim <- mkPrim "demote"
+         checkE (P.EAppT prim
                   [P.NamedInst
-                   P.Named { name = Located l (Name "val"), value = t }]) tGoal
+                   P.Named { name = Located l (packIdent "val"), value = t }]) tGoal
 
     P.EFun ps e -> checkFun (text "anonymous function") ps e tGoal
 
     P.ELocated e r  -> inRange r (checkE e tGoal)
 
+    P.EInfix a op _ b -> checkE (P.EVar (thing op) `P.EApp` a `P.EApp` b) tGoal
 
+    P.EParens e -> checkE e tGoal
+
+
 expectSeq :: Type -> InferM (Type,Type)
 expectSeq ty =
   case ty of
@@ -376,7 +379,7 @@
                      <+> text "tuple field"
                in newType desc KType
 
-expectRec :: [P.Named a] -> Type -> InferM [(Name,a,Type)]
+expectRec :: [P.Named a] -> Type -> InferM [(Ident,a,Type)]
 expectRec fs ty =
   case ty of
 
@@ -463,7 +466,7 @@
        _  -> newGoals CtExactType ps >> return (ECast e givenType)
 
 
-checkFun :: Doc -> [P.Pattern] -> P.Expr -> Type -> InferM Expr
+checkFun :: Doc -> [P.Pattern Name] -> P.Expr Name -> Type -> InferM Expr
 checkFun _    [] e tGoal = checkE e tGoal
 checkFun desc ps e tGoal =
   inNewScope $
@@ -488,7 +491,7 @@
                    return a
 
 
-checkP :: Doc -> P.Pattern -> Type -> InferM (Located QName)
+checkP :: Doc -> P.Pattern Name -> Type -> InferM (Located Name)
 checkP desc p tGoal =
   do (x, t) <- inferP desc p
      ps <- unify tGoal (thing t)
@@ -498,14 +501,13 @@
 
 {-| Infer the type of a pattern.  Assumes that the pattern will be just
 a variable. -}
-inferP :: Doc -> P.Pattern -> InferM (QName, Located Type)
+inferP :: Doc -> P.Pattern Name -> InferM (Name, Located Type)
 inferP desc pat =
   case pat of
 
     P.PVar x0 ->
       do a   <- newType desc KType
-         let x = thing x0
-         return (mkUnqual x, x0 { thing = a })
+         return (thing x0, x0 { thing = a })
 
     P.PTyped p t ->
       do tSig <- checkTypeOfKind t KType
@@ -517,7 +519,7 @@
 
 
 -- | Infer the type of one match in a list comprehension.
-inferMatch :: P.Match -> InferM (Match, QName, Located Type, Type)
+inferMatch :: P.Match Name -> InferM (Match, Name, Located Type, Type)
 inferMatch (P.Match p e) =
   do (x,t) <- inferP (text "XXX:MATCH") p
      n     <- newType (text "sequence length of comprehension match") KNum
@@ -534,10 +536,10 @@
                       [ "Unexpected polymorphic match let:", show b ]
 
 -- | Infer the type of one arm of a list comprehension.
-inferCArm :: Int -> [P.Match] -> InferM
+inferCArm :: Int -> [P.Match Name] -> InferM
               ( [Match]
-              , Map QName (Located Type)-- defined vars
-              , Type                    -- length of sequence
+              , Map Name (Located Type)-- defined vars
+              , Type                   -- length of sequence
               )
 
 inferCArm _ [] = do n <- newType (text "lenght of empty comprehension") KNum
@@ -563,9 +565,12 @@
 -- false, and the mono-binds flag is enabled, no bindings without type
 -- signatures will be generalized, but bindings with signatures will
 -- be unaffected.
-inferBinds :: Bool -> Bool -> [P.Bind] -> InferM [Decl]
+inferBinds :: Bool -> Bool -> [P.Bind Name] -> InferM [Decl]
 inferBinds isTopLevel isRec binds =
-  mdo let exprMap = Map.fromList [ (x,inst (EVar x) (dDefinition b))
+  mdo let dExpr (DExpr e) = e
+          dExpr DPrim     = panic "[TypeCheck]" [ "primitive in a recursive group" ]
+  
+          exprMap = Map.fromList [ (x,inst (EVar x) (dExpr (dDefinition b)))
                                  | b <- genBs, let x = dName b ] -- REC.
 
           inst e (ETAbs x e1)     = inst (ETApp e (TVar (tpVar x))) e1
@@ -608,8 +613,8 @@
      The `exprMap` is a thunk where we can lookup the final expressions
      and we should be careful not to force it.
 -}
-guessType :: Map QName Expr -> P.Bind ->
-              InferM ( (QName, VarType)
+guessType :: Map Name Expr -> P.Bind Name ->
+              InferM ( (Name, VarType)
                      , Either (InferM Decl)    -- no generalization
                               (InferM Decl)    -- generalize these
                      )
@@ -637,19 +642,28 @@
   where
   name = thing bName
 
-
--- | Try to evaluate the inferred type of a mono-binding
-simpMonoBind :: OrdFacts -> Decl -> Decl
-simpMonoBind m d =
+-- | Try to evaluate the inferred type in a binding.
+simpBind :: Decl -> Decl
+simpBind d =
   case dSignature d of
-    Forall [] [] t ->
-      let t1 = simpType m t
-      in if t == t1 then d else d { dSignature  = Forall [] [] t1
-                                  , dDefinition = ECast (dDefinition d) t1
-                                  }
-    _ -> d
+    Forall as qs t ->
+      case simpTypeMaybe t of
+        Nothing -> d
+        Just t1 -> d { dSignature  = Forall as qs t1
+                     , dDefinition = case dDefinition d of
+                                       DPrim   -> DPrim
+                                       DExpr e -> DExpr (castUnder t1 e)
+                     }
+  where
+  -- Assumes the quantifiers match
+  castUnder t (ETAbs a e)     = ETAbs a (castUnder t e)
+  castUnder t (EProofAbs p e) = EProofAbs p (castUnder t e)
+  castUnder t e               = ECast e t
 
 
+
+
+
 -- | The inputs should be declarations with monomorphic types
 -- (i.e., of the form `Forall [] [] t`).
 generalize :: [Decl] -> [Goal] -> InferM [Decl]
@@ -669,21 +683,13 @@
      bs1 <- forM bs0 $ \b -> do s <- applySubst (dSignature b)
                                 return b { dSignature = s }
 
-     ordM <- case assumedOrderModel noFacts (map goal gs) of
-                Left (ordModel,p) ->
-                  do mapM_ recordError
-                            [ UnusableFunction n p | n <- map dName bs1]
-                     return ordModel
-                Right (ordModel,_) -> return ordModel
-
-     let bs = map (simpMonoBind ordM) bs1
+     let bs = map simpBind bs1
 
      let goalFVS g  = Set.filter isFreeTV $ fvs $ goal g
          inGoals    = Set.unions $ map goalFVS gs
          inSigs     = Set.filter isFreeTV $ fvs $ map dSignature bs
          candidates = Set.union inGoals inSigs
 
-
      asmpVs <- varsWithAsmps
 
 
@@ -692,19 +698,21 @@
          stays g       = any (`Set.member` gen0) $ Set.toList $ goalFVS g
          (here0,later) = partition stays gs
 
-     -- Figure our what might be ambigious
+     -- Figure out what might be ambigious
      let (maybeAmbig, ambig) = partition ((KNum ==) . kindOf)
                              $ Set.toList
                              $ Set.difference gen0 inSigs
 
      when (not (null ambig)) $ recordError $ AmbiguousType $ map dName bs
 
-     let (as0,here1,defSu,ws) = tryDefault maybeAmbig here0
+
+     solver <- getSolver
+     (as0,here1,defSu,ws) <- io $ improveByDefaultingWith solver maybeAmbig here0
      mapM_ recordWarning ws
      let here = map goal here1
 
-     let as     = as0 ++ Set.toList (Set.difference inSigs asmpVs)
-         asPs   = [ TParam { tpUnique = x, tpKind = k, tpName = Nothing }
+     let as   = as0 ++ Set.toList (Set.difference inSigs asmpVs)
+         asPs = [ TParam { tpUnique = x, tpKind = k, tpName = Nothing }
                                                    | TVFree x k _ _ <- as ]
      totSu <- getSubst
      let
@@ -712,35 +720,65 @@
          qs     = map (apSubst su) here
 
          genE e = foldr ETAbs (foldr EProofAbs (apSubst su e) qs) asPs
-         genB d = d { dDefinition = genE (dDefinition d)
+         genB d = d { dDefinition = case dDefinition d of
+                                      DExpr e -> DExpr (genE e)
+                                      DPrim   -> DPrim
                     , dSignature  = Forall asPs qs
                                   $ apSubst su $ sType $ dSignature d
                     }
 
      addGoals later
-     return (map genB bs)
-
+     return (map (simpBind . genB) bs)
 
 
 
-checkMonoB :: P.Bind -> Type -> InferM Decl
+checkMonoB :: P.Bind Name -> Type -> InferM Decl
 checkMonoB b t =
   inRangeMb (getLoc b) $
-  do e1 <- checkFun (pp (thing (P.bName b))) (P.bParams b) (P.bDef b) t
-     let f = thing (P.bName b)
-     return Decl { dName = f
-                 , dSignature = Forall [] [] t
-                 , dDefinition = e1
-                 , dPragmas = P.bPragmas b
-                 }
+  case thing (P.bDef b) of
 
+    P.DPrim ->
+         return Decl { dName = thing (P.bName b)
+                     , dSignature = Forall [] [] t
+                     , dDefinition = DPrim
+                     , dPragmas = P.bPragmas b
+                     , dInfix = P.bInfix b
+                     , dFixity = P.bFixity b
+                     , dDoc = P.bDoc b
+                     }
+
+    P.DExpr e ->
+      do e1 <- checkFun (pp (thing (P.bName b))) (P.bParams b) e t
+         let f = thing (P.bName b)
+         return Decl { dName = f
+                     , dSignature = Forall [] [] t
+                     , dDefinition = DExpr e1
+                     , dPragmas = P.bPragmas b
+                     , dInfix = P.bInfix b
+                     , dFixity = P.bFixity b
+                     , dDoc = P.bDoc b
+                     }
+
 -- XXX: Do we really need to do the defaulting business in two different places?
-checkSigB :: P.Bind -> (Schema,[Goal]) -> InferM Decl
-checkSigB b (Forall as asmps0 t0, validSchema) =
+checkSigB :: P.Bind Name -> (Schema,[Goal]) -> InferM Decl
+checkSigB b (Forall as asmps0 t0, validSchema) = case thing (P.bDef b) of
+
+ -- XXX what should we do with validSchema in this case?
+ P.DPrim ->
+   do return Decl { dName       = thing (P.bName b)
+                  , dSignature  = Forall as asmps0 t0
+                  , dDefinition = DPrim
+                  , dPragmas    = P.bPragmas b
+                  , dInfix      = P.bInfix b
+                  , dFixity     = P.bFixity b
+                  , dDoc        = P.bDoc b
+                  }
+
+ P.DExpr e0 ->
   inRangeMb (getLoc b) $
   withTParams as $
   do (e1,cs0) <- collectGoals $
-                do e1 <- checkFun (pp (thing (P.bName b))) (P.bParams b) (P.bDef b) t0
+                do e1 <- checkFun (pp (thing (P.bName b))) (P.bParams b) e0 t0
                    () <- simplifyAllConstraints  -- XXX: using `asmps` also...
                    return e1
      cs <- applySubst cs0
@@ -757,7 +795,7 @@
 
      asmps1 <- applySubst asmps0
 
-     defSu1 <- proveImplication (P.bName b) as asmps1 (validSchema ++ now)
+     defSu1 <- proveImplication (thing (P.bName b)) as asmps1 (validSchema ++ now)
      let later = apSubst defSu1 later0
          asmps = apSubst defSu1 asmps1
 
@@ -772,7 +810,8 @@
         when (not (null ambig)) $ recordError
                                 $ AmbiguousType [ thing (P.bName b) ]
 
-        let (_,_,defSu2,ws) = tryDefault maybeAmbig later
+        solver <- getSolver
+        (_,_,defSu2,ws) <- io $ improveByDefaultingWith solver maybeAmbig later
         mapM_ recordWarning ws
         extendSubst defSu2
 
@@ -786,8 +825,11 @@
      return Decl
         { dName       = thing (P.bName b)
         , dSignature  = Forall as asmps t
-        , dDefinition = foldr ETAbs (foldr EProofAbs e2 asmps) as
+        , dDefinition = DExpr (foldr ETAbs (foldr EProofAbs e2 asmps) as)
         , dPragmas    = P.bPragmas b
+        , dInfix      = P.bInfix b
+        , dFixity     = P.bFixity b
+        , dDoc        = P.bDoc b
         }
 
 inferDs :: FromDecl d => [d] -> ([DeclGroup] -> InferM a) -> InferM a
diff --git a/src/Cryptol/TypeCheck/InferTypes.hs b/src/Cryptol/TypeCheck/InferTypes.hs
--- a/src/Cryptol/TypeCheck/InferTypes.hs
+++ b/src/Cryptol/TypeCheck/InferTypes.hs
@@ -1,6 +1,6 @@
 -- |
 -- Module      :  $Header$
--- Copyright   :  (c) 2013-2015 Galois, Inc.
+-- Copyright   :  (c) 2013-2016 Galois, Inc.
 -- License     :  BSD3
 -- Maintainer  :  cryptol@galois.com
 -- Stability   :  provisional
@@ -10,7 +10,9 @@
 
 {-# LANGUAGE Safe #-}
 {-# LANGUAGE FlexibleInstances, FlexibleContexts #-}
-
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE ViewPatterns #-}
+{-# LANGUAGE OverloadedStrings #-}
 module Cryptol.TypeCheck.InferTypes where
 
 import           Cryptol.TypeCheck.AST
@@ -18,16 +20,27 @@
 import           Cryptol.TypeCheck.TypeMap
 import           Cryptol.Parser.Position
 import qualified Cryptol.Parser.AST as P
-import           Cryptol.Parser.AST(LQName)
-import           Cryptol.Prims.Syntax(ECon(..))
 import           Cryptol.Utils.PP
+import           Cryptol.ModuleSystem.Name (asPrim,nameLoc)
 import           Cryptol.TypeCheck.PP
+import           Cryptol.Utils.Ident (Ident,identText)
 import           Cryptol.Utils.Panic(panic)
 
 import qualified Data.Set as Set
 import qualified Data.Map as Map
 import qualified Data.IntMap as IntMap
 
+import GHC.Generics (Generic)
+import Control.DeepSeq.Generics
+
+data SolverConfig = SolverConfig
+  { solverPath    :: FilePath   -- ^ The SMT solver to invoke
+  , solverArgs    :: [String]   -- ^ Additional arguments to pass to the solver
+  , solverVerbose :: Int        -- ^ How verbose to be when type-checking
+  } deriving (Show, Generic)
+
+instance NFData SolverConfig where rnf = genericRnf
+
 -- | The types of variables in the environment.
 data VarType = ExtVar Schema      -- ^ Known type
              | CurSCC Expr Type   -- ^ Part of current SCC
@@ -52,8 +65,10 @@
   { goalSource :: ConstraintSource  -- ^ With it is about
   , goalRange  :: Range             -- ^ Part of source code that caused goal
   , goal       :: Prop              -- ^ What needs to be proved
-  } deriving Show
+  } deriving (Show,Generic)
 
+instance NFData Goal where rnf = genericRnf
+
 data HasGoal = HasGoal
   { hasName :: !Int
   , hasGoal :: Goal
@@ -61,22 +76,26 @@
 
 -- | Delayed implication constraints, arising from user-specified type sigs.
 data DelayedCt = DelayedCt
-  { dctSource :: LQName   -- ^ Signature that gave rise to this constraint
+  { dctSource :: Name   -- ^ Signature that gave rise to this constraint
   , dctForall :: [TParam]
   , dctAsmps  :: [Prop]
   , dctGoals  :: [Goal]
-  } deriving Show
+  } deriving (Show,Generic)
 
-data Solved = Solved (Maybe Subst) [Goal] -- ^ Solved, assumeing the sub-goals.
+instance NFData DelayedCt where rnf = genericRnf
+
+data Solved = Solved (Maybe Subst) [Goal] -- ^ Solved, assuming the sub-goals.
             | Unsolved                    -- ^ We could not solved the goal.
             | Unsolvable                  -- ^ The goal can never be solved
               deriving (Show)
 
-data Warning  = DefaultingKind P.TParam P.Kind
+data Warning  = DefaultingKind (P.TParam Name) P.Kind
               | DefaultingWildType P.Kind
               | DefaultingTo Doc Type
-                deriving Show
+                deriving (Show,Generic)
 
+instance NFData Warning where rnf = genericRnf
+
 -- | Various errors that might happen during type checking/inference
 data Error    = ErrorMsg Doc
                 -- ^ Just say this
@@ -88,31 +107,31 @@
                 -- ^ Number of extra parameters, kind of resut
                 -- (which should not be of the form @_ -> _@)
 
-              | TooManyTySynParams QName Int
+              | TooManyTySynParams Name Int
                 -- ^ Type-synonym, number of extra params
 
-              | TooFewTySynParams QName Int
+              | TooFewTySynParams Name Int
                 -- ^ Type-synonym, number of missing params
 
-              | RepeatedTyParams [P.TParam]
+              | RepeatedTyParams [P.TParam Name]
                 -- ^ Type parameters with the same name (in definition)
 
-              | RepeatedDefinitions QName [Range]
+              | RepeatedDefinitions Name [Range]
                 -- ^ Multiple definitions for the same name
 
-              | RecursiveTypeDecls [LQName]
+              | RecursiveTypeDecls [Name]
                 -- ^ The type synonym declarations are recursive
 
-              | UndefinedTypeSynonym QName
+              | UndefinedTypeSynonym Name
                 -- ^ Use of a type synonym that was not defined
 
-              | UndefinedVariable QName
+              | UndefinedVariable Name
                 -- ^ Use of a variable that was not defined
 
-              | UndefinedTypeParam QName
+              | UndefinedTypeParam (Located Ident)
                 -- ^ Attempt to explicitly instantiate a non-existent param.
 
-              | MultipleTypeParamDefs QName [Range]
+              | MultipleTypeParamDefs Ident [Range]
                 -- ^ Multiple definitions for the same type parameter
 
               | TypeMismatch Type Type
@@ -121,8 +140,10 @@
               | RecursiveType Type Type
                 -- ^ Unification results in a recursive type
 
-              | UnsolvedGoal Goal
+              | UnsolvedGoal Bool Goal
                 -- ^ A constraint that we could not solve
+                -- The boolean indicates if we know that this constraint
+                -- is impossible.
 
               | UnsolvedDelcayedCt DelayedCt
                 -- ^ A constraint (with context) that we could not solve
@@ -139,8 +160,8 @@
                 -- ^ Quantified type variables (of kind *) needs to
                 -- match the given type, so it does not work for all types.
 
-              | UnusableFunction QName Prop
-                -- ^ The given constraint causes the signature of the
+              | UnusableFunction Name [Prop]
+                -- ^ The given constraints causes the signature of the
                 -- function to be not-satisfiable.
 
               | TooManyPositionalTypeParams
@@ -149,27 +170,34 @@
 
               | CannotMixPositionalAndNamedTypeParams
 
-              | AmbiguousType [QName]
+              | AmbiguousType [Name]
 
 
-                deriving Show
+                deriving (Show,Generic)
 
+instance NFData Error where rnf = genericRnf
+
 -- | Information about how a constraint came to be, used in error reporting.
 data ConstraintSource
   = CtComprehension       -- ^ Computing shape of list comprehension
   | CtSplitPat            -- ^ Use of a split pattern
   | CtTypeSig             -- ^ A type signature in a pattern or expression
-  | CtInst Expr           -- ^ Instantiation of this expreesion
+  | CtInst Expr           -- ^ Instantiation of this expression
   | CtSelector
   | CtExactType
   | CtEnumeration
   | CtDefaulting          -- ^ Just defaulting on the command line
   | CtPartialTypeFun TyFunName -- ^ Use of a partial type function.
-    deriving Show
+  | CtImprovement
+    deriving (Show,Generic)
 
-data TyFunName = UserTyFun QName | BuiltInTyFun TFun
-                deriving Show
+instance NFData ConstraintSource where rnf = genericRnf
 
+data TyFunName = UserTyFun Name | BuiltInTyFun TFun
+                deriving (Show,Generic)
+
+instance NFData TyFunName where rnf = genericRnf
+
 instance PP TyFunName where
   ppPrec c (UserTyFun x)    = ppPrec c x
   ppPrec c (BuiltInTyFun x) = ppPrec c x
@@ -186,6 +214,7 @@
       CtEnumeration   -> src
       CtDefaulting    -> src
       CtPartialTypeFun _ -> src
+      CtImprovement    -> src
 
 instance TVars Warning where
   apSubst su warn =
@@ -220,12 +249,12 @@
       MultipleTypeParamDefs {}  -> err
       TypeMismatch t1 t2        -> TypeMismatch (apSubst su t1) (apSubst su t2)
       RecursiveType t1 t2       -> RecursiveType (apSubst su t1) (apSubst su t2)
-      UnsolvedGoal g            -> UnsolvedGoal (apSubst su g)
+      UnsolvedGoal x g          -> UnsolvedGoal x (apSubst su g)
       UnsolvedDelcayedCt g      -> UnsolvedDelcayedCt (apSubst su g)
       UnexpectedTypeWildCard    -> err
       TypeVariableEscaped t xs  -> TypeVariableEscaped (apSubst su t) xs
       NotForAll x t             -> NotForAll x (apSubst su t)
-      UnusableFunction f p      -> UnusableFunction f (apSubst su p)
+      UnusableFunction f ps      -> UnusableFunction f (apSubst su ps)
       TooManyPositionalTypeParams -> err
       CannotMixPositionalAndNamedTypeParams -> err
       AmbiguousType _           -> err
@@ -247,7 +276,7 @@
       MultipleTypeParamDefs {}  -> Set.empty
       TypeMismatch t1 t2        -> fvs (t1,t2)
       RecursiveType t1 t2       -> fvs (t1,t2)
-      UnsolvedGoal g            -> fvs g
+      UnsolvedGoal _ g          -> fvs g
       UnsolvedDelcayedCt g      -> fvs g
       UnexpectedTypeWildCard    -> Set.empty
       TypeVariableEscaped t _   -> fvs t
@@ -424,8 +453,9 @@
           (text "Expected type:" <+> ppWithNames names t1 $$
            text "Inferred type:" <+> ppWithNames names t2)
 
-      UnsolvedGoal g ->
-        nested (text "Unsolved constraint:") (ppWithNames names g)
+      UnsolvedGoal imp g ->
+        nested (word <+> text "constraint:") (ppWithNames names g)
+        where word = if imp then text "Unsolvable" else text "Unsolved"
 
       UnsolvedDelcayedCt g ->
         nested (text "Failed to validate user-specified signature.")
@@ -442,10 +472,11 @@
           (text "Quantified variable:" <+> ppWithNames names x $$
            text "cannot match type:"   <+> ppWithNames names t)
 
-      UnusableFunction f p ->
+      UnusableFunction f ps ->
         nested (text "The constraints in the type signature of"
                 <+> quotes (pp f) <+> text "are unsolvable.")
-          (text "Detected while analyzing constraint:" $$ ppWithNames names p)
+               (text "Detected while analyzing constraints:"
+                $$ vcat (map (ppWithNames names) ps))
 
       TooManyPositionalTypeParams ->
         text "Too many positional type-parameters in explicit type application"
@@ -486,17 +517,19 @@
       CtEnumeration   -> text "list enumeration"
       CtDefaulting    -> text "defaulting"
       CtPartialTypeFun f -> text "use of partial type function" <+> pp f
+      CtImprovement   -> text "examination of collected goals"
 
 ppUse :: Expr -> Doc
 ppUse expr =
   case expr of
-    ECon ECDemote       -> text "literal or demoted expression"
-    ECon ECInfFrom      -> text "infinite enumeration"
-    ECon ECInfFromThen  -> text "infinite enumeration (with step)"
-    ECon ECFromThen     -> text "finite enumeration"
-    ECon ECFromTo       -> text "finite enumeration"
-    ECon ECFromThenTo   -> text "finite enumeration"
-    _                   -> text "expression" <+> pp expr
+    EVar (asPrim -> Just prim)
+      | identText prim == "demote"       -> text "literal or demoted expression"
+      | identText prim == "infFrom"      -> text "infinite enumeration"
+      | identText prim == "infFromThen"  -> text "infinite enumeration (with step)"
+      | identText prim == "fromThen"     -> text "finite enumeration"
+      | identText prim == "fromTo"       -> text "finite enumeration"
+      | identText prim == "fromThenTo"   -> text "finite enumeration"
+    _                          -> text "expression" <+> pp expr
 
 instance PP (WithNames Goal) where
   ppPrec _ (WithNames g names) =
@@ -509,8 +542,8 @@
   ppPrec _ (WithNames d names) =
     sig $$ nest 2 (vars $$ asmps $$ vcat (map (ppWithNames ns1) (dctGoals d)))
     where
-    sig = text "In the definition of" <+> quotes (pp (thing name)) <>
-          comma <+> text "at" <+> pp (srcRange name) <> colon
+    sig = text "In the definition of" <+> quotes (pp name) <>
+          comma <+> text "at" <+> pp (nameLoc name) <> colon
 
     name  = dctSource d
     vars = case dctForall d of
diff --git a/src/Cryptol/TypeCheck/Instantiate.hs b/src/Cryptol/TypeCheck/Instantiate.hs
--- a/src/Cryptol/TypeCheck/Instantiate.hs
+++ b/src/Cryptol/TypeCheck/Instantiate.hs
@@ -1,6 +1,6 @@
 -- |
 -- Module      :  $Header$
--- Copyright   :  (c) 2013-2015 Galois, Inc.
+-- Copyright   :  (c) 2013-2016 Galois, Inc.
 -- License     :  BSD3
 -- Maintainer  :  cryptol@galois.com
 -- Stability   :  provisional
@@ -8,10 +8,12 @@
 
 module Cryptol.TypeCheck.Instantiate (instantiateWith) where
 
+import Cryptol.ModuleSystem.Name (nameIdent)
 import Cryptol.TypeCheck.AST
 import Cryptol.TypeCheck.Monad
 import Cryptol.TypeCheck.Subst (listSubst,apSubst)
 import Cryptol.Parser.Position (Located(..))
+import Cryptol.Utils.Ident (Ident)
 import Cryptol.Utils.PP
 
 import Data.Function (on)
@@ -21,7 +23,7 @@
 import MonadLib
 
 
-instantiateWith :: Expr -> Schema -> [Located (Maybe QName,Type)]
+instantiateWith :: Expr -> Schema -> [Located (Maybe Ident,Type)]
                 -> InferM (Expr,Type)
 instantiateWith e s ts
   | null named      = instantiateWithPos e s positional
@@ -83,7 +85,7 @@
   - there will be one `EProofApp` for each constraint on the schema;
   - there will be `ECast` if we had equality constraints from normalization.
 -}
-instantiateWithNames :: Expr -> Schema -> [Located (QName,Type)]
+instantiateWithNames :: Expr -> Schema -> [Located (Ident,Type)]
                      -> InferM (Expr,Type)
 instantiateWithNames e (Forall as ps t) xs =
   do sequence_ repeatedParams
@@ -95,7 +97,10 @@
   paramInst x     =
     do let v = tpVar x
            k = kindOf v
-           lkp name = find (\th -> fst (thing th) == name) xs
+
+           -- We just use nameIdent for comparison here, as all parameter names
+           -- should have a NameInfo of Parameter.
+           lkp name = find (\th -> fst (thing th) == nameIdent name) xs
            src r = text "type parameter" <+> (case tpName x of
                                                Just n -> quotes (pp n)
                                                Nothing -> empty)
@@ -124,12 +129,15 @@
   isRepeated _               = Nothing
 
 
+  paramIdents = [ nameIdent n | Just n <- map tpName as ]
+
   -- Errors from parameters that are defined, but do not exist in the schema.
   undefParams     = do x <- xs
                        let name = pName x
-                       guard (name `notElem` mapMaybe tpName as)
+                       guard (name `notElem` paramIdents)
                        return $ inRange (srcRange x)
-                              $ recordError $ UndefinedTypeParam name
+                              $ recordError
+                              $ UndefinedTypeParam x { thing = name }
 
   pName = fst . thing
 
diff --git a/src/Cryptol/TypeCheck/Kind.hs b/src/Cryptol/TypeCheck/Kind.hs
--- a/src/Cryptol/TypeCheck/Kind.hs
+++ b/src/Cryptol/TypeCheck/Kind.hs
@@ -1,17 +1,12 @@
 -- |
 -- Module      :  $Header$
--- Copyright   :  (c) 2013-2015 Galois, Inc.
+-- Copyright   :  (c) 2013-2016 Galois, Inc.
 -- License     :  BSD3
 -- Maintainer  :  cryptol@galois.com
 -- Stability   :  provisional
 -- Portability :  portable
 
-{-# LANGUAGE CPP #-}
-#if __GLASGOW_HASKELL__ >= 706
 {-# LANGUAGE RecursiveDo #-}
-#else
-{-# LANGUAGE DoRec, RecursiveDo #-}
-#endif
 {-# LANGUAGE Safe #-}
 module Cryptol.TypeCheck.Kind
   ( checkType
@@ -26,8 +21,9 @@
 import           Cryptol.TypeCheck.AST
 import           Cryptol.TypeCheck.Monad hiding (withTParams)
 import           Cryptol.TypeCheck.Solve (simplifyAllConstraints
-                                         ,checkTypeFunction)
+                                         ,wfTypeFunction)
 import           Cryptol.Utils.PP
+import           Cryptol.Utils.Panic (panic)
 
 import qualified Data.Map as Map
 import           Data.List(sortBy,groupBy)
@@ -38,7 +34,7 @@
 
 
 -- | Check a type signature.
-checkSchema :: P.Schema -> InferM (Schema, [Goal])
+checkSchema :: P.Schema Name -> InferM (Schema, [Goal])
 checkSchema (P.Forall xs ps t mb) =
   do ((xs1,(ps1,t1)), gs) <-
         collectGoals $
@@ -54,7 +50,7 @@
           Just r  -> inRange r
 
 -- | Check a type-synonym declaration.
-checkTySyn :: P.TySyn -> InferM TySyn
+checkTySyn :: P.TySyn Name -> InferM TySyn
 checkTySyn (P.TySyn x as t) =
   do ((as1,t1),gs) <- collectGoals
                     $ inRange (srcRange x)
@@ -69,7 +65,7 @@
 
 -- | Check a newtype declaration.
 -- XXX: Do something with constraints.
-checkNewtype :: P.Newtype -> InferM Newtype
+checkNewtype :: P.Newtype Name -> InferM Newtype
 checkNewtype (P.Newtype x as fs) =
   do ((as1,fs1),gs) <- collectGoals $
        inRange (srcRange x) $
@@ -90,7 +86,7 @@
 
 
 
-checkType :: P.Type -> Maybe Kind -> InferM Type
+checkType :: P.Type Name -> Maybe Kind -> InferM Type
 checkType t k =
   do (_, t1) <- withTParams True [] $ doCheckType t k
      return t1
@@ -124,7 +120,7 @@
      annotation) in the rest.
 -}
 
-withTParams :: Bool -> [P.TParam] -> KindM a -> InferM ([TParam], a)
+withTParams :: Bool -> [P.TParam Name] -> KindM a -> InferM ([TParam], a)
 withTParams allowWildCards xs m =
   mdo mapM_ recordError duplicates
       (a, vars) <- runKindM allowWildCards (zip' xs ts) m
@@ -132,13 +128,13 @@
       return (as,a)
   where
   getKind vs tp =
-    case Map.lookup (P.tpQName tp) vs of
+    case Map.lookup (P.tpName tp) vs of
       Just k  -> return k
       Nothing -> do recordWarning (DefaultingKind tp P.KNum)
                     return KNum
 
   newTP vs tp = do k <- getKind vs tp
-                   n <- newTParam (Just (mkUnqual (P.tpName tp))) k
+                   n <- newTParam (Just (P.tpName tp)) k
                    return (n, TVar (tpVar n))
 
 
@@ -146,7 +142,7 @@
   This is needed to make the monadic recursion work correctly,
   because the data dependency is only on the part that is known. -}
   zip' [] _           = []
-  zip' (a:as) ~(t:ts) = (mkUnqual (P.tpName a), fmap cvtK (P.tpKind a), t) : zip' as ts
+  zip' (a:as) ~(t:ts) = (P.tpName a, fmap cvtK (P.tpKind a), t) : zip' as ts
 
   cvtK P.KNum  = KNum
   cvtK P.KType = KType
@@ -157,7 +153,7 @@
 
 -- | Check an application of a type constant.
 tcon :: TCon            -- ^ Type constant being applied
-     -> [P.Type]        -- ^ Type parameters
+     -> [P.Type Name]   -- ^ Type parameters
      -> Maybe Kind      -- ^ Expected kind
      -> KindM Type      -- ^ Resulting type
 tcon tc ts0 k =
@@ -166,8 +162,8 @@
 
 -- | Check a use of a type-synonym, newtype, or scoped-type variable.
 tySyn :: Bool         -- ^ Should we check for scoped type vars.
-      -> QName        -- ^ Name of type sysnonym
-      -> [P.Type]     -- ^ Type synonym parameters
+      -> Name         -- ^ Name of type sysnonym
+      -> [P.Type Name]-- ^ Type synonym parameters
       -> Maybe Kind   -- ^ Expected kind
       -> KindM Type   -- ^ Resulting type
 tySyn scoped x ts k =
@@ -214,7 +210,7 @@
 
 
 -- | Check a type-application.
-appTy :: [P.Type]             -- ^ Parameters to type function
+appTy :: [P.Type Name]        -- ^ Parameters to type function
       -> Kind                 -- ^ Kind of type function
       -> KindM ([Type], Kind) -- ^ Validated parameters, resulting kind
 appTy [] k1 = return ([],k1)
@@ -230,7 +226,7 @@
 
 
 -- | Validate a parsed type.
-doCheckType :: P.Type         -- ^ Type that needs to be checked
+doCheckType :: P.Type Name  -- ^ Type that needs to be checked
           -> Maybe Kind     -- ^ Expected kind (if any)
           -> KindM Type     -- ^ Checked type
 doCheckType ty k =
@@ -257,7 +253,7 @@
          -- constraints.
          case it of
            TCon (TF f) ts' ->
-              case checkTypeFunction f ts' of
+              case wfTypeFunction f ts' of
                  [] -> return ()
                  ps -> kNewGoals (CtPartialTypeFun (BuiltInTyFun f)) ps
            _ -> return ()
@@ -272,6 +268,12 @@
     P.TUser x []    -> checkTyThing x k
     P.TUser x ts    -> tySyn False x ts k
 
+    P.TParens t     -> doCheckType t k
+
+    P.TInfix{}      -> panic "KindCheck"
+                       [ "TInfix not removed by the renamer", show ty ]
+
+
   where
   checkF f = do t <- kInRange (srcRange (name f))
                    $ doCheckType (value f) (Just KType)
@@ -280,7 +282,7 @@
 
 
 -- | Check a type-variable or type-synonym.
-checkTyThing :: QName         -- ^ Name of thing that needs checking
+checkTyThing :: Name          -- ^ Name of thing that needs checking
              -> Maybe Kind    -- ^ Expected kind
              -> KindM Type
 checkTyThing x k =
@@ -299,7 +301,7 @@
 
 
 -- | Validate a parsed proposition.
-checkProp :: P.Prop           -- ^ Proposition that need to be checked
+checkProp :: P.Prop Name      -- ^ Proposition that need to be checked
           -> KindM Type       -- ^ Checked representation
 checkProp prop =
   case prop of
@@ -309,6 +311,7 @@
     P.CArith t1     -> tcon (PC PArith)         [t1]    (Just KProp)
     P.CCmp t1       -> tcon (PC PCmp)           [t1]    (Just KProp)
     P.CLocated p r1 -> kInRange r1 (checkProp p)
+    P.CType _       -> panic "checkProp" [ "Unexpected CType", show prop ]
 
 
 -- | Check that a type has the expected kind.
diff --git a/src/Cryptol/TypeCheck/Monad.hs b/src/Cryptol/TypeCheck/Monad.hs
--- a/src/Cryptol/TypeCheck/Monad.hs
+++ b/src/Cryptol/TypeCheck/Monad.hs
@@ -1,54 +1,64 @@
 -- |
 -- Module      :  $Header$
--- Copyright   :  (c) 2013-2015 Galois, Inc.
+-- Copyright   :  (c) 2013-2016 Galois, Inc.
 -- License     :  BSD3
 -- Maintainer  :  cryptol@galois.com
 -- Stability   :  provisional
 -- Portability :  portable
-
-{-# LANGUAGE RecordWildCards, CPP, Safe #-}
-#if __GLASGOW_HASKELL__ >= 706
+{-# LANGUAGE RecordWildCards, Safe #-}
 {-# LANGUAGE RecursiveDo #-}
-#else
-{-# LANGUAGE DoRec #-}
-#endif
+{-# LANGUAGE DeriveGeneric #-}
 module Cryptol.TypeCheck.Monad
   ( module Cryptol.TypeCheck.Monad
   , module Cryptol.TypeCheck.InferTypes
   ) where
 
+import           Cryptol.ModuleSystem.Name (SupplyT,runSupplyT,FreshM(..),Supply)
 import           Cryptol.Parser.Position
 import qualified Cryptol.Parser.AST as P
 import           Cryptol.TypeCheck.AST
 import           Cryptol.TypeCheck.Subst
 import           Cryptol.TypeCheck.Unify(mgu, Result(..), UnificationError(..))
 import           Cryptol.TypeCheck.InferTypes
+import qualified Cryptol.TypeCheck.Solver.CrySAT as CrySAT
 import           Cryptol.Utils.PP(pp, (<+>), Doc, text, quotes)
 import           Cryptol.Utils.Panic(panic)
 
+import qualified Control.Applicative as A
+import           Control.Monad.Fix(MonadFix(..))
 import qualified Data.Map as Map
 import qualified Data.Set as Set
 import           Data.Map (Map)
 import           Data.Set (Set)
-import           Data.List(find)
+import           Data.List(find, minimumBy, groupBy, sortBy)
 import           Data.Maybe(mapMaybe)
-import           MonadLib
-import qualified Control.Applicative as A
-import           Control.Monad.Fix(MonadFix(..))
+import           Data.Function(on)
+import           MonadLib hiding (mapM)
 
-#if __GLASGOW_HASKELL__ < 710
-import           Data.Functor
-#endif
+import GHC.Generics (Generic)
+import Control.DeepSeq.Generics
 
+import Prelude ()
+import Prelude.Compat
+
+
 -- | Information needed for type inference.
 data InferInput = InferInput
   { inpRange     :: Range             -- ^ Location of program source
-  , inpVars      :: Map QName Schema  -- ^ Variables that are in scope
-  , inpTSyns     :: Map QName TySyn   -- ^ Type synonyms that are in scope
-  , inpNewtypes  :: Map QName Newtype -- ^ Newtypes in scope
+  , inpVars      :: Map Name Schema   -- ^ Variables that are in scope
+  , inpTSyns     :: Map Name TySyn    -- ^ Type synonyms that are in scope
+  , inpNewtypes  :: Map Name Newtype  -- ^ Newtypes in scope
   , inpNameSeeds :: NameSeeds         -- ^ Private state of type-checker
   , inpMonoBinds :: Bool              -- ^ Should local bindings without
                                       --   signatures be monomorphized?
+
+  , inpSolverConfig :: SolverConfig   -- ^ Options for the constraint solver
+
+  , inpPrimNames :: !PrimMap          -- ^ The mapping from 'Ident' to 'Name',
+                                      -- for names that the typechecker
+                                      -- needs to refer to.
+
+  , inpSupply :: !Supply              -- ^ The supply for fresh name generation
   } deriving Show
 
 
@@ -56,8 +66,10 @@
 data NameSeeds = NameSeeds
   { seedTVar    :: !Int
   , seedGoal    :: !Int
-  } deriving Show
+  } deriving (Show, Generic)
 
+instance NFData NameSeeds where rnf = genericRnf
+
 -- | The initial seeds, used when checking a fresh program.
 nameSeeds :: NameSeeds
 nameSeeds = NameSeeds { seedTVar = 10, seedGoal = 0 }
@@ -68,14 +80,14 @@
   = InferFailed [(Range,Warning)] [(Range,Error)]
     -- ^ We found some errors
 
-  | InferOK [(Range,Warning)] NameSeeds a
+  | InferOK [(Range,Warning)] NameSeeds Supply a
     -- ^ Type inference was successful.
 
 
     deriving Show
 
 runInferM :: TVars a => InferInput -> InferM a -> IO (InferOutput a)
-runInferM info (IM m) =
+runInferM info (IM m) = CrySAT.withSolver (inpSolverConfig info) $ \solver ->
   do rec ro <- return RO { iRange     = inpRange info
                      , iVars          = Map.map ExtVar (inpVars info)
                      , iTVars         = []
@@ -83,9 +95,13 @@
                      , iNewtypes      = fmap mkExternal (inpNewtypes info)
                      , iSolvedHasLazy = iSolvedHas finalRW     -- RECURSION
                      , iMonoBinds     = inpMonoBinds info
+                     , iSolver        = solver
+                     , iPrimNames     = inpPrimNames info
                      }
 
-         (result, finalRW) <- runStateT rw $ runReaderT ro m  -- RECURSION
+         ((result, finalRW),supply') <-
+             runSupplyT (inpSupply info) $ runStateT rw
+                                         $ runReaderT ro m  -- RECURSION
 
      let theSu    = iSubst finalRW
          defSu    = defaultingSubst theSu
@@ -98,13 +114,17 @@
              | nullGoals cts
                    -> return $ InferOK warns
                                   (iNameSeeds finalRW)
+                                  supply'
                                   (apSubst defSu result)
            (cts,has) -> return $ InferFailed warns
+                $ dropErrorsFromSameLoc
                 [ ( goalRange g
-                  , UnsolvedGoal (apSubst theSu g)
+                  , UnsolvedGoal False (apSubst theSu g)
                   ) | g <- fromGoals cts ++ map hasGoal has
                 ]
-       errs -> return $ InferFailed warns [(r,apSubst theSu e) | (r,e) <- errs]
+       errs -> return $ InferFailed warns
+                      $ dropErrorsFromSameLoc
+                                  [(r,apSubst theSu e) | (r,e) <- errs]
 
   where
   mkExternal x = (IsExternal, x)
@@ -120,23 +140,34 @@
           , iSolvedHas  = Map.empty
           }
 
+  dropErrorsFromSameLoc = map chooseBestError . groupBy ((==)    `on` fst)
+                                              . sortBy  (cmpRange `on` fst)
 
-newtype InferM a = IM { unIM :: ReaderT RO (StateT RW IO) a }
+  addErrorSize (r,e) = (length (show (pp e)), (r,e))
+  chooseBestError    = snd . minimumBy (compare `on` fst) . map addErrorSize
 
+  -- The actual order does not matter
+  cmpRange (Range x y z) (Range a b c) = compare (x,y,z) (a,b,c)
+
+
+
+
+newtype InferM a = IM { unIM :: ReaderT RO (StateT RW (SupplyT IO)) a }
+
 data DefLoc = IsLocal | IsExternal
 
 -- | Read-only component of the monad.
 data RO = RO
   { iRange    :: Range                  -- ^ Source code being analysed
-  , iVars     :: Map QName VarType      -- ^ Type of variable that are in scope
+  , iVars     :: Map Name VarType      -- ^ Type of variable that are in scope
 
   {- NOTE: We assume no shadowing between these two, so it does not matter
   where we look first. Similarly, we assume no shadowing with
   the existential type variable (in RW).  See `checkTShadowing`. -}
 
   , iTVars    :: [TParam]                  -- ^ Type variable that are in scope
-  , iTSyns    :: Map QName (DefLoc, TySyn) -- ^ Type synonyms that are in scope
-  , iNewtypes :: Map QName (DefLoc, Newtype)
+  , iTSyns    :: Map Name (DefLoc, TySyn) -- ^ Type synonyms that are in scope
+  , iNewtypes :: Map Name (DefLoc, Newtype)
    -- ^ Newtype declarations in scope
    --
    -- NOTE: type synonyms take precedence over newtype.  The reason is
@@ -156,6 +187,10 @@
     -- ^ When this flag is set to true, bindings that lack signatures
     -- in where-blocks will never be generalized. Bindings with type
     -- signatures, and all bindings at top level are unaffected.
+
+  , iSolver :: CrySAT.Solver
+
+  , iPrimNames :: !PrimMap
   }
 
 -- | Read-write component of the monad.
@@ -164,7 +199,7 @@
   , iWarnings :: ![(Range,Warning)]     -- ^ Collected warnings
   , iSubst    :: !Subst                 -- ^ Accumulated substitution
 
-  , iExistTVars  :: [Map QName Type]
+  , iExistTVars  :: [Map Name Type]
     -- ^ These keeps track of what existential type variables are available.
     -- When we start checking a function, we push a new scope for
     -- its arguments, and we pop it when we are done checking the function
@@ -205,7 +240,10 @@
 instance MonadFix InferM where
   mfix f        = IM (mfix (unIM . f))
 
+instance FreshM InferM where
+  liftSupply f = IM (liftSupply f)
 
+
 io :: IO a -> InferM a
 io m = IM $ inBase m
 
@@ -233,6 +271,18 @@
   do r <- curRange
      IM $ sets_ $ \s -> s { iWarnings = (r,w) : iWarnings s }
 
+getSolver :: InferM CrySAT.Solver
+getSolver =
+  do RO { .. } <- IM ask
+     return iSolver
+
+-- | Retrieve the mapping between identifiers and declarations in the prelude.
+getPrimMap :: InferM PrimMap
+getPrimMap  =
+  do RO { .. } <- IM ask
+     return iPrimNames
+
+
 --------------------------------------------------------------------------------
 newGoal :: ConstraintSource -> Prop -> InferM Goal
 newGoal goalSource goal =
@@ -337,7 +387,7 @@
 
 
 -- | Generate a new free type variable.
-newTParam :: Maybe QName -> Kind -> InferM TParam
+newTParam :: Maybe Name -> Kind -> InferM TParam
 newTParam nm k = newName $ \s -> let x = seedTVar s
                                  in (TParam { tpUnique = x
                                             , tpKind   = k
@@ -412,7 +462,7 @@
 
 
 -- | Lookup the type of a variable.
-lookupVar :: QName -> InferM VarType
+lookupVar :: Name -> InferM VarType
 lookupVar x =
   do mb <- IM $ asks $ Map.lookup x . iVars
      case mb of
@@ -427,23 +477,23 @@
 
 -- | Lookup a type variable.  Return `Nothing` if there is no such variable
 -- in scope, in which case we must be dealing with a type constant.
-lookupTVar :: QName -> InferM (Maybe Type)
+lookupTVar :: Name -> InferM (Maybe Type)
 lookupTVar x = IM $ asks $ fmap (TVar . tpVar) . find this . iTVars
   where this tp = tpName tp == Just x
 
 -- | Lookup the definition of a type synonym.
-lookupTSyn :: QName -> InferM (Maybe TySyn)
+lookupTSyn :: Name -> InferM (Maybe TySyn)
 lookupTSyn x = fmap (fmap snd . Map.lookup x) getTSyns
 
 -- | Lookup the definition of a newtype
-lookupNewtype :: QName -> InferM (Maybe Newtype)
+lookupNewtype :: Name -> InferM (Maybe Newtype)
 lookupNewtype x = fmap (fmap snd . Map.lookup x) getNewtypes
 
 -- | Check if we already have a name for this existential type variable and,
 -- if so, return the definition.  If not, try to create a new definition,
 -- if this is allowed.  If not, returns nothing.
 
-existVar :: QName -> Kind -> InferM Type
+existVar :: Name -> Kind -> InferM Type
 existVar x k =
   do scopes <- iExistTVars <$> IM get
      case msum (map (Map.lookup x) scopes) of
@@ -464,15 +514,15 @@
 
 
 -- | Returns the type synonyms that are currently in scope.
-getTSyns :: InferM (Map QName (DefLoc,TySyn))
+getTSyns :: InferM (Map Name (DefLoc,TySyn))
 getTSyns = IM $ asks iTSyns
 
 -- | Returns the newtype declarations that are in scope.
-getNewtypes :: InferM (Map QName (DefLoc,Newtype))
+getNewtypes :: InferM (Map Name (DefLoc,Newtype))
 getNewtypes = IM $ asks iNewtypes
 
 -- | Get the set of bound type variables that are in scope.
-getTVars :: InferM (Set QName)
+getTVars :: InferM (Set Name)
 getTVars = IM $ asks $ Set.fromList . mapMaybe tpName . iTVars
 
 -- | Return the keys of the bound variables that are in scope.
@@ -488,7 +538,7 @@
 need to worry about where we lookup things (i.e., in the variable or
 type synonym environment. -}
 
-checkTShadowing :: String -> QName -> InferM ()
+checkTShadowing :: String -> Name -> InferM ()
 checkTShadowing this new =
   do ro <- IM ask
      rw <- IM get
@@ -537,28 +587,28 @@
                                                      (iNewtypes r) }) m
 
 -- | The sub-computation is performed with the given variable in scope.
-withVarType :: QName -> VarType -> InferM a -> InferM a
+withVarType :: Name -> VarType -> InferM a -> InferM a
 withVarType x s (IM m) =
   IM $ mapReader (\r -> r { iVars = Map.insert x s (iVars r) }) m
 
-withVarTypes :: [(QName,VarType)] -> InferM a -> InferM a
+withVarTypes :: [(Name,VarType)] -> InferM a -> InferM a
 withVarTypes xs m = foldr (uncurry withVarType) m xs
 
-withVar :: QName -> Schema -> InferM a -> InferM a
+withVar :: Name -> Schema -> InferM a -> InferM a
 withVar x s = withVarType x (ExtVar s)
 
 
 -- | The sub-computation is performed with the given variables in scope.
-withMonoType :: (QName,Located Type) -> InferM a -> InferM a
+withMonoType :: (Name,Located Type) -> InferM a -> InferM a
 withMonoType (x,lt) = withVar x (Forall [] [] (thing lt))
 
 -- | The sub-computation is performed with the given variables in scope.
-withMonoTypes :: Map QName (Located Type) -> InferM a -> InferM a
+withMonoTypes :: Map Name (Located Type) -> InferM a -> InferM a
 withMonoTypes xs m = foldr withMonoType m (Map.toList xs)
 
 -- | The sub-computation is performed with the given type synonyms
 -- and variables in scope.
-withDecls :: ([TySyn], Map QName Schema) -> InferM a -> InferM a
+withDecls :: ([TySyn], Map Name Schema) -> InferM a -> InferM a
 withDecls (ts,vs) m = foldr withTySyn (foldr add m (Map.toList vs)) ts
   where
   add (x,t) = withVar x t
@@ -581,11 +631,11 @@
 
 newtype KindM a = KM { unKM :: ReaderT KRO (StateT KRW InferM)  a }
 
-data KRO = KRO { lazyTVars  :: Map QName Type -- ^ lazy map, with tyvars.
+data KRO = KRO { lazyTVars  :: Map Name Type -- ^ lazy map, with tyvars.
                , allowWild  :: Bool           -- ^ are type-wild cards allowed?
                }
 
-data KRW = KRW { typeParams :: Map QName Kind -- ^ kinds of (known) vars.
+data KRW = KRW { typeParams :: Map Name Kind -- ^ kinds of (known) vars.
                }
 
 instance Functor KindM where
@@ -611,8 +661,8 @@
 As a result we return the value of the sub-computation and the computed
 kinds of the type parameters. -}
 runKindM :: Bool                          -- Are type-wild cards allowed?
-         -> [(QName, Maybe Kind, Type)]   -- ^ See comment
-         -> KindM a -> InferM (a, Map QName Kind)
+         -> [(Name, Maybe Kind, Type)]   -- ^ See comment
+         -> KindM a -> InferM (a, Map Name Kind)
 runKindM wildOK vs (KM m) =
   do (a,kw) <- runStateT krw (runReaderT kro m)
      return (a, typeParams kw)
@@ -626,7 +676,7 @@
               | TOuterVar Type              -- ^ An outer binding.
 
 -- | Check if a name refers to a type variable.
-kLookupTyVar :: QName -> KindM (Maybe LkpTyVar)
+kLookupTyVar :: Name -> KindM (Maybe LkpTyVar)
 kLookupTyVar x = KM $
   do vs <- lazyTVars `fmap` ask
      ss <- get
@@ -654,14 +704,14 @@
      kInInferM $ TVar `fmap` newTVar' src tps k
 
 -- | Lookup the definition of a type synonym.
-kLookupTSyn :: QName -> KindM (Maybe TySyn)
+kLookupTSyn :: Name -> KindM (Maybe TySyn)
 kLookupTSyn x = kInInferM $ lookupTSyn x
 
 -- | Lookup the definition of a newtype.
-kLookupNewtype :: QName -> KindM (Maybe Newtype)
+kLookupNewtype :: Name -> KindM (Maybe Newtype)
 kLookupNewtype x = kInInferM $ lookupNewtype x
 
-kExistTVar :: QName -> Kind -> KindM Type
+kExistTVar :: Name -> Kind -> KindM Type
 kExistTVar x k = kInInferM $ existVar x k
 
 -- | Replace the given bound variables with concrete types.
@@ -672,7 +722,7 @@
 {- | Record the kind for a local type variable.
 This assumes that we already checked that there was no other valid
 kind for the variable (if there was one, it gets over-written). -}
-kSetKind :: QName -> Kind -> KindM ()
+kSetKind :: Name -> Kind -> KindM ()
 kSetKind v k = KM $ sets_ $ \s -> s{ typeParams = Map.insert v k (typeParams s)}
 
 -- | The sub-computation is about the given range of the source code.
diff --git a/src/Cryptol/TypeCheck/PP.hs b/src/Cryptol/TypeCheck/PP.hs
--- a/src/Cryptol/TypeCheck/PP.hs
+++ b/src/Cryptol/TypeCheck/PP.hs
@@ -1,6 +1,6 @@
 -- |
 -- Module      :  $Header$
--- Copyright   :  (c) 2013-2015 Galois, Inc.
+-- Copyright   :  (c) 2013-2016 Galois, Inc.
 -- License     :  BSD3
 -- Maintainer  :  cryptol@galois.com
 -- Stability   :  provisional
diff --git a/src/Cryptol/TypeCheck/Sanity.hs b/src/Cryptol/TypeCheck/Sanity.hs
new file mode 100644
--- /dev/null
+++ b/src/Cryptol/TypeCheck/Sanity.hs
@@ -0,0 +1,537 @@
+-- |
+-- Module      :  $Header$
+-- Copyright   :  (c) 2015-2016 Galois, Inc.
+-- License     :  BSD3
+-- Maintainer  :  cryptol@galois.com
+-- Stability   :  provisional
+-- Portability :  portable
+module Cryptol.TypeCheck.Sanity
+  ( tcExpr
+  , tcDecls
+  , tcModule
+  , ProofObligation
+  , Error(..)
+  , same
+  ) where
+
+
+import Cryptol.TypeCheck.AST
+import Cryptol.TypeCheck.Subst(apSubst, fvs, singleSubst)
+import Cryptol.Utils.Ident
+
+import qualified Data.Set as Set
+import Data.List(sort, sortBy)
+import Data.Function (on)
+import MonadLib
+import qualified Control.Applicative as A
+
+import           Data.Map ( Map )
+import qualified Data.Map as Map
+
+
+tcExpr :: Map Name Schema -> Expr -> Either Error (Schema, [ ProofObligation ])
+tcExpr env e = runTcM env (exprSchema e)
+
+tcDecls :: Map Name Schema -> [DeclGroup] -> Either Error [ ProofObligation ]
+tcDecls env ds0 = case runTcM env (go ds0) of
+                    Left err     -> Left err
+                    Right (_,ps) -> Right ps
+  where
+  go []       = return ()
+  go (d : ds) = do xs <- checkDeclGroup d
+                   withVars xs (go ds)
+
+tcModule :: Map Name Schema -> Module -> Either Error [ ProofObligation ]
+tcModule env m = tcDecls env (mDecls m)
+
+
+--------------------------------------------------------------------------------
+tMono :: Type -> Schema
+tMono = Forall [] []
+
+isMono :: Schema -> Maybe Type
+isMono s =
+  case s of
+    Forall [] [] t -> Just t
+    _              -> Nothing
+
+
+--------------------------------------------------------------------------------
+
+-- | Validate a type, returning its kind.
+checkType :: Type -> TcM Kind
+checkType ty =
+  case ty of
+    TUser _ _ t -> checkType t    -- Maybe check synonym too?
+
+    TCon tc ts ->
+      do ks <- mapM checkType ts
+         checkKind (kindOf tc) ks
+
+    TVar tv -> lookupTVar tv
+
+    TRec fs ->
+      do forM_ fs $ \(_,t) ->
+           do k <- checkType t
+              unless (k == KType) $ reportError $ KindMismatch KType k
+         return KType
+
+
+  where
+  checkKind k [] = case k of
+                     _ :-> _  -> reportError $ NotEnoughArgumentsInKind k
+                     KProp    -> return k
+                     KNum     -> return k
+                     KType    -> return k
+
+  checkKind (k1 :-> k2) (k : ks)
+    | k == k1   = checkKind k2 ks
+    | otherwise = reportError $ KindMismatch k1 k
+
+  checkKind k ks = reportError $ BadTypeApplication k ks
+
+
+-- | Check that the type is valid, and it has the given kind.
+checkTypeIs :: Kind -> Type -> TcM ()
+checkTypeIs k ty =
+  do k1 <- checkType ty
+     unless (k == k1) $ reportError $ KindMismatch k k1
+
+-- | Check that this is a valid schema.
+checkSchema :: Schema -> TcM ()
+checkSchema (Forall as ps t) = foldr withTVar check as
+  where check = do mapM_ (checkTypeIs KProp) ps
+                   checkTypeIs KType t
+
+
+class Same a where
+  same :: a -> a -> Bool
+
+instance Same a => Same [a] where
+  same [] [] = True
+  same (x : xs) (y : ys) = same x y && same xs ys
+  same _ _ = False
+
+instance Same Type where
+  same t1 t2 = tNoUser t1 == tNoUser t2
+
+instance Same Schema where
+  same (Forall xs ps s) (Forall ys qs t) = same xs ys && same ps qs && same s t
+
+instance Same TParam where
+  same x y = tpName x == tpName y && tpKind x == tpKind y
+
+
+
+
+
+--------------------------------------------------------------------------------
+
+
+-- | Check that the expression is well-formed, and compute its type.
+-- Reports an error if the expression is not of a mono type.
+exprType :: Expr -> TcM Type
+exprType expr =
+  do s <- exprSchema expr
+     case isMono s of
+       Just t  -> return t
+       Nothing -> reportError (ExpectedMono s)
+
+
+-- | Check that the expression is well-formed, and compute its schema.
+exprSchema :: Expr -> TcM Schema
+exprSchema expr =
+  case expr of
+
+    EList es t ->
+      do checkTypeIs KType t
+         forM_ es $ \e ->
+           do t1 <- exprType e
+              unless (same t1 t) $
+                reportError $ TypeMismatch (tMono t) (tMono t1)
+
+         return $ tMono $ tSeq (tNum (length es)) t
+
+    ETuple es ->
+      fmap (tMono . tTuple) (mapM exprType es)
+
+    ERec fs ->
+      do fs1 <- forM fs $ \(f,e) -> do t <- exprType e
+                                       return (f,t)
+         return $ tMono $ TRec fs1
+
+    ESel e sel ->
+      do t <- exprType e
+         case sel of
+
+           TupleSel n mb ->
+              case tNoUser t of
+                TCon (TC (TCTuple sz)) ts ->
+
+                   do case mb of
+                        Just sz1 -> when (sz /= sz1) $
+                                      reportError (UnexpectedTupleShape sz1 sz)
+                        Nothing  -> return ()
+
+                      unless (n < sz) $
+                        reportError (TupleSelectorOutOfRange n sz)
+
+                      return $ tMono $ ts !! n
+
+                _ -> reportError $ BadSelector sel t
+
+
+           RecordSel f mb ->
+             case tNoUser t of
+               TRec fs ->
+
+                 do case mb of
+                      Nothing -> return ()
+                      Just fs1 ->
+                        do let ns  = sort (map fst fs)
+                               ns1 = sort fs1
+                           unless (ns == ns1) $
+                             reportError $ UnexpectedRecordShape ns1 ns
+
+                    case lookup f fs of
+                      Nothing -> reportError $ MissingField f $ map fst fs
+                      Just ft -> return $ tMono ft
+
+               _ -> reportError $ BadSelector sel t
+
+
+           ListSel _ mb ->
+             case tNoUser t of
+               TCon (TC TCSeq) [ n, elT ] ->
+
+                 do case mb of
+                      Nothing  -> return ()
+                      Just len ->
+                        case tNoUser n of
+                          TCon (TC (TCNum m)) []
+                            | m == fromIntegral len -> return ()
+                          _ -> reportError $ UnexpectedSequenceShape len n
+
+                    return $ tMono elT
+
+               _ -> reportError $ BadSelector sel t
+
+
+    EIf e1 e2 e3 ->
+      do ty <- exprType e1
+         unless (same tBit ty) $
+           reportError $ TypeMismatch (tMono tBit) (tMono ty)
+
+         t1 <- exprType e2
+         t2 <- exprType e3
+         unless (same t1 t2) $
+           reportError $ TypeMismatch (tMono t1) (tMono t2)
+
+         return $ tMono t1
+
+    EComp t e mss ->
+      do checkTypeIs KType t
+
+         (xs,ls) <- unzip `fmap` mapM checkArm mss
+         -- XXX: check no duplicates
+         elT <- withVars (concat xs) $ exprType e
+
+         case ls of
+           [] -> return ()
+           _  -> convertible t (tSeq (foldr1 tMin ls) elT)
+
+         return (tMono t)
+
+
+    EVar x -> lookupVar x
+
+    ETAbs a e     ->
+      do Forall as p t <- withTVar a (exprSchema e)
+         when (any (== a) as) $
+           reportError $ RepeatedVariableInForall a
+
+         return (Forall (a : as) p t)
+
+    ETApp e t ->
+      do k <- checkType t
+         s <- exprSchema e
+         case s of
+           Forall (a : as) ps t1 ->
+             do let vs = fvs t
+
+                forM_ (map tpVar as) $ \b ->
+                  when (b `Set.member` vs) $ reportError $ Captured b
+
+                let k' = kindOf a
+                unless (k == k') $ reportError $ KindMismatch k' k
+
+                let su = singleSubst (tpVar a) t
+                return $ Forall as (apSubst su ps) (apSubst su t1)
+
+           Forall [] _ _ -> reportError BadInstantiation
+
+    EApp e1 e2 ->
+      do t1 <- exprType e1
+         t2 <- exprType e2
+
+         case tNoUser t1 of
+           TCon (TC TCFun) [ a, b ]
+              | same a t2 -> return (tMono b)
+           tf -> reportError (BadApplication tf t1)
+
+
+    EAbs x t e    ->
+      do checkTypeIs KType t
+         res <- withVar x t (exprType e)
+         return $ tMono $ tFun t res
+
+
+    EProofAbs p e ->
+      do checkTypeIs KProp p
+         withAsmp p $ do Forall as ps t <- exprSchema e
+                         return $ Forall as (p : ps) t
+
+    EProofApp e ->
+      do Forall as ps t <- exprSchema e
+         case (as,ps) of
+           ([], p:qs) -> do proofObligation p
+                            return (Forall [] qs t)
+           ([], _)    -> reportError BadProofNoAbs
+           (_,_)      -> reportError (BadProofTyVars as)
+
+
+    ECast e t ->
+      do checkTypeIs KType t
+         t1 <- exprType e
+         convertible t t1
+         return (tMono t)
+
+    -- XXX: Check that defined things are disitnct?
+    EWhere e dgs ->
+      let go []       = exprSchema e
+          go (d : ds) = do xs <- checkDeclGroup d
+                           withVars xs (go ds)
+      in go dgs
+
+
+-- | Check if the one type is convertible to the other.
+convertible :: Type -> Type -> TcM ()
+convertible t1 t2
+  | k1 /= k2    = reportError (KindMismatch k1 k2)
+  | k1 == KNum  = proofObligation (t1 =#= t2)
+  where
+  k1 = kindOf t1
+  k2 = kindOf t2
+
+convertible t1 t2 = go t1 t2
+  where
+  go ty1 ty2 =
+    let err   = reportError $ TypeMismatch (tMono ty1) (tMono ty2)  
+        other = tNoUser ty2
+
+        goMany [] []             = return ()
+        goMany (x : xs) (y : ys) = convertible x y >> goMany xs ys
+        goMany _ _               = err
+
+    in case ty1 of
+         TUser _ _ s   -> go s ty2
+
+         TVar x        -> case other of
+                            TVar y | x == y  -> return ()
+                            _                -> err
+
+         TCon tc1 ts1  -> case other of
+                            TCon tc2 ts2
+                               | tc1 == tc2 -> goMany ts1 ts2
+                            _ -> err
+
+         TRec fs ->
+           case other of
+             TRec gs ->
+               do let order = sortBy (compare `on` fst)
+                      fs1   = order fs
+                      gs1   = order gs
+                  unless (map fst fs1 == map fst gs1) err
+                  goMany (map snd fs1) (map snd gs1)
+             _ -> err
+
+
+--------------------------------------------------------------------------------
+
+-- | Check a declaration. The boolean indicates if we should check the siganture
+checkDecl :: Bool -> Decl -> TcM (Name, Schema)
+checkDecl checkSig d =
+  case dDefinition d of
+
+    DPrim ->
+      do when checkSig $ checkSchema $ dSignature d
+         return (dName d, dSignature d)
+
+    DExpr e ->
+      do let s = dSignature d
+         when checkSig $ checkSchema s
+         s1 <- exprSchema e
+         unless (same s s1) $
+           reportError $ TypeMismatch s s1
+         return (dName d, s)
+
+checkDeclGroup :: DeclGroup -> TcM [(Name, Schema)]
+checkDeclGroup dg =
+  case dg of
+    NonRecursive d -> do x <- checkDecl True d
+                         return [x]
+    Recursive ds ->
+      do xs <- forM ds $ \d ->
+                  do checkSchema (dSignature d)
+                     return (dName d, dSignature d)
+         withVars xs $ mapM (checkDecl False) ds
+
+
+checkMatch :: Match -> TcM ((Name, Schema), Type)
+checkMatch ma =
+  case ma of
+    From x t e ->
+      do checkTypeIs KType t
+         t1 <- exprType e
+         case tNoUser t1 of
+           TCon (TC TCSeq) [ l, el ]
+             | same t el -> return ((x, tMono t), l)
+             | otherwise -> reportError $ TypeMismatch (tMono t) (tMono el)
+
+
+           _ -> reportError $ BadMatch t1
+
+    Let d -> do x <- checkDecl True d
+                return (x, tNum (1 :: Int))
+
+checkArm :: [Match] -> TcM ([(Name, Schema)], Type)
+checkArm []   = reportError EmptyArm
+checkArm [m]  = do (x,l) <- checkMatch m
+                   return ([x], l)
+checkArm (m : ms) =
+  do (x, l)   <- checkMatch m
+     (xs, l1) <- withVars [x] $ checkArm ms
+     let newLen = l .*. l1
+     return $ if fst x `elem` map fst xs
+                 then (xs, newLen)
+                 else (x : xs, newLen)
+
+
+
+
+--------------------------------------------------------------------------------
+
+data RO = RO
+  { roTVars   :: Map Int TParam
+  , roAsmps   :: [Prop]
+  , roVars    :: Map Name Schema
+  }
+
+type ProofObligation = Schema -- but the type is of kind Prop
+
+data RW = RW
+  { woProofObligations :: [ProofObligation]
+  }
+
+newtype TcM a = TcM (ReaderT RO (ExceptionT Error (StateT RW Id)) a)
+
+instance Functor TcM where
+  fmap = liftM
+
+instance A.Applicative TcM where
+  pure  = return
+  (<*>) = ap
+
+instance Monad TcM where
+  return a    = TcM (return a)
+  fail x      = TcM (fail x)
+  TcM m >>= f = TcM (do a <- m
+                        let TcM m1 = f a
+                        m1)
+
+runTcM :: Map Name Schema -> TcM a -> Either Error (a, [ProofObligation])
+runTcM env (TcM m) =
+  case runM m ro rw of
+    (Left err, _) -> Left err
+    (Right a, s)  -> Right (a, woProofObligations s)
+  where
+  ro = RO { roTVars = Map.empty
+          , roAsmps = []
+          , roVars  = env
+          }
+  rw = RW { woProofObligations = [] }
+
+
+data Error =
+    TypeMismatch Schema Schema    -- ^ expected, actual
+  | ExpectedMono Schema           -- ^ expected a mono type, got this
+  | TupleSelectorOutOfRange Int Int
+  | MissingField Ident [Ident]
+  | UnexpectedTupleShape Int Int
+  | UnexpectedRecordShape [Ident] [Ident]
+  | UnexpectedSequenceShape Int Type
+  | BadSelector Selector Type
+  | BadInstantiation
+  | Captured TVar
+  | BadProofNoAbs
+  | BadProofTyVars [TParam]
+  | KindMismatch Kind Kind
+  | NotEnoughArgumentsInKind Kind
+  | BadApplication Type Type
+  | FreeTypeVariable TVar
+  | BadTypeApplication Kind [Kind]
+  | RepeatedVariableInForall TParam
+  | BadMatch Type
+  | EmptyArm
+  | UndefinedTypeVaraible TVar
+  | UndefinedVariable Name
+    deriving Show
+
+reportError :: Error -> TcM a
+reportError e = TcM (raise e)
+
+withTVar :: TParam -> TcM a -> TcM a
+withTVar a (TcM m) = TcM $
+  do ro <- ask
+     local ro { roTVars = Map.insert (tpUnique a) a (roTVars ro) } m
+
+withAsmp :: Prop -> TcM a -> TcM a
+withAsmp p (TcM m) = TcM $
+  do ro <- ask
+     local ro { roAsmps = p : roAsmps ro } m
+
+withVar :: Name -> Type -> TcM a -> TcM a
+withVar x t = withVars [(x,tMono t)]
+
+withVars :: [(Name, Schema)] -> TcM a -> TcM a
+withVars xs (TcM m) = TcM $
+  do ro <- ask
+     local ro { roVars = Map.union (Map.fromList xs) (roVars ro) } m
+
+proofObligation :: Prop -> TcM ()
+proofObligation p = TcM $
+  do ro <- ask
+     sets_ $ \rw -> rw { woProofObligations =
+                             Forall (Map.elems (roTVars ro)) (roAsmps ro) p
+                           : woProofObligations rw }
+
+lookupTVar :: TVar -> TcM Kind
+lookupTVar x =
+  case x of
+    TVFree {} -> reportError (FreeTypeVariable x)
+    TVBound u k ->
+       do ro <- TcM ask
+          case Map.lookup u (roTVars ro) of
+            Just tp
+              | kindOf tp == k  -> return k
+              | otherwise       -> reportError $ KindMismatch (kindOf tp) k
+            Nothing  -> reportError $ UndefinedTypeVaraible x
+
+lookupVar :: Name -> TcM Schema
+lookupVar x =
+  do ro <- TcM ask
+     case Map.lookup x (roVars ro) of
+       Just s -> return s
+       Nothing -> reportError $ UndefinedVariable x
+
+
diff --git a/src/Cryptol/TypeCheck/Solve.hs b/src/Cryptol/TypeCheck/Solve.hs
--- a/src/Cryptol/TypeCheck/Solve.hs
+++ b/src/Cryptol/TypeCheck/Solve.hs
@@ -1,126 +1,652 @@
 -- |
 -- Module      :  $Header$
--- Copyright   :  (c) 2013-2015 Galois, Inc.
+-- Copyright   :  (c) 2013-2016 Galois, Inc.
 -- License     :  BSD3
 -- Maintainer  :  cryptol@galois.com
 -- Stability   :  provisional
 -- Portability :  portable
 
-{-# LANGUAGE PatternGuards, BangPatterns #-}
+{-# LANGUAGE PatternGuards, BangPatterns, RecordWildCards #-}
 {-# LANGUAGE Safe #-}
 module Cryptol.TypeCheck.Solve
   ( simplifyAllConstraints
   , proveImplication
-  , assumedOrderModel
-  , checkTypeFunction
+  , wfType
+  , wfTypeFunction
+  , improveByDefaultingWith
+  , defaultReplExpr
+  , simpType
+  , simpTypeMaybe
   ) where
 
-import           Cryptol.Parser.AST(LQName,thing)
+import           Cryptol.Parser.Position (emptyRange)
+import           Cryptol.TypeCheck.PP(pp)
 import           Cryptol.TypeCheck.AST
 import           Cryptol.TypeCheck.Monad
-import           Cryptol.TypeCheck.Subst(apSubst,fvs,emptySubst,Subst)
-import           Cryptol.TypeCheck.Solver.Eval
-import           Cryptol.TypeCheck.Solver.FinOrd
-import           Cryptol.TypeCheck.Solver.Numeric
+import           Cryptol.TypeCheck.Subst
+                    (apSubst,fvs,singleSubst,substToList, isEmptySubst,
+                          emptySubst,Subst,listSubst, (@@), Subst,
+                           apSubstMaybe)
 import           Cryptol.TypeCheck.Solver.Class
 import           Cryptol.TypeCheck.Solver.Selector(tryHasGoal)
-import qualified Cryptol.TypeCheck.Solver.Smtlib as SMT
-import           Cryptol.TypeCheck.Defaulting(tryDefaultWith)
+import qualified Cryptol.TypeCheck.Solver.Numeric.AST as Num
+import qualified Cryptol.TypeCheck.Solver.Numeric.ImportExport as Num
+import           Cryptol.TypeCheck.Solver.Numeric.Interval (Interval)
+import qualified Cryptol.TypeCheck.Solver.Numeric.Simplify1 as Num
+import qualified Cryptol.TypeCheck.Solver.Numeric.SimplifyExpr as Num
+import qualified Cryptol.TypeCheck.Solver.CrySAT as Num
+import           Cryptol.TypeCheck.Solver.CrySAT (debugBlock, DebugLog(..))
+import           Cryptol.TypeCheck.Solver.Simplify (tryRewritePropAsSubst)
+import           Cryptol.Utils.PP (text)
+import           Cryptol.Utils.Panic(panic)
+import           Cryptol.Utils.Misc(anyJust)
 
-import           Control.Monad(unless)
-import           Data.List(partition)
+import           Control.Monad (unless, guard)
+import           Data.Either(partitionEithers)
+import           Data.Maybe(catMaybes, fromMaybe, mapMaybe)
+import           Data.Map ( Map )
+import qualified Data.Map as Map
+import           Data.Set ( Set )
 import qualified Data.Set as Set
 
--- Add additional constraints that ensure validity of type function.
-checkTypeFunction :: TFun -> [Type] -> [Prop]
-checkTypeFunction TCSub [a,b]             = [ a >== b, pFin b]
-checkTypeFunction TCDiv [a,b]             = [ b >== tOne, pFin a ]
-checkTypeFunction TCMod [a,b]             = [ b >== tOne, pFin a ]
-checkTypeFunction TCLenFromThen   [a,b,c] = [ pFin a, pFin b, pFin c, a =/= b ]
-checkTypeFunction TCLenFromThenTo [a,b,c] = [ pFin a, pFin b, pFin c, a =/= b ]
-checkTypeFunction _ _                     = []
 
--- XXX at the moment, we try to solve class constraints before solving fin
--- constraints, as they could yield fin constraints.  At some point, it would
--- probably be good to try solving all of these in one big loop.
+{- | Add additional constraints that ensure validity of type function.
+Note that these constraints do not introduce additional malformed types,
+so the well-formedness constraints are guaranteed to be well-formed.
+This assumes that the parameters are well-formed. -}
+wfTypeFunction :: TFun -> [Type] -> [Prop]
+wfTypeFunction TCSub [a,b]             = [ a >== b, pFin b]
+wfTypeFunction TCDiv [a,b]             = [ b >== tOne, pFin a ]
+wfTypeFunction TCMod [a,b]             = [ b >== tOne, pFin a ]
+wfTypeFunction TCLenFromThen   [a,b,w] =
+         [ pFin a, pFin b, pFin w, a =/= b, w >== tWidth a ]
+wfTypeFunction TCLenFromThenTo [a,b,c] = [ pFin a, pFin b, pFin c, a =/= b ]
+wfTypeFunction _ _                     = []
+
+-- | Add additional constraints that ensure the validity of a type.
+wfType :: Type -> [Prop]
+wfType t =
+  case t of
+    TCon c ts ->
+      let ps = concatMap wfType ts
+      in case c of
+           TF f -> wfTypeFunction f ts ++ ps
+           _    -> ps
+
+    TVar _      -> []
+    TUser _ _ s -> wfType s
+    TRec fs     -> concatMap (wfType . snd) fs
+
+
+
+
+--------------------------------------------------------------------------------
+
 simplifyAllConstraints :: InferM ()
 simplifyAllConstraints =
-  do mapM_  tryHasGoal     =<< getHasGoals
-     simplifyGoals noFacts =<< getGoals
+  do mapM_  tryHasGoal =<< getHasGoals
+     gs <- getGoals
+     solver <- getSolver
+     (mb,su) <- io (simpGoals' solver gs)
+     extendSubst su
+     case mb of
+       Right gs1  -> addGoals gs1
+       Left badGs -> mapM_ (recordError . UnsolvedGoal True) badGs
 
 
-proveImplication :: LQName -> [TParam] -> [Prop] -> [Goal] -> InferM Subst
-proveImplication lname as asmps0 goals =
-  case assumedOrderModel noFacts (concatMap expandProp asmps0) of
-    Left (_m,p) -> do recordError (UnusableFunction (thing lname) p)
-                      return emptySubst
-    Right (m,asmps) ->
-      do let gs = [ g { goal = q } | g <- goals
-                                   , let p = goal g
-                                         q = simpType m p
-                                   , p `notElem` asmps
-                                   , q `notElem` asmps
-                  ]
+proveImplication :: Name -> [TParam] -> [Prop] -> [Goal] -> InferM Subst
+proveImplication lnam as ps gs =
+  do evars <- varsWithAsmps
+     solver <- getSolver
+     (mbErr,su) <- io (proveImplicationIO solver lnam evars as ps gs)
+     case mbErr of
+       Right ws -> mapM_ recordWarning ws
+       Left err -> recordError err
+     return su
 
-         (_,gs1) <- collectGoals (simplifyGoals m gs)
 
-         let numAsmps = filter pIsNumeric asmps
-             (numGs,otherGs) = partition (pIsNumeric . goal) gs1
+proveImplicationIO :: Num.Solver
+                   -> Name     -- ^ Checking this function
+                   -> Set TVar -- ^ These appear in the env., and we should
+                               -- not try to default the
+                   -> [TParam] -- ^ Type parameters
+                   -> [Prop]   -- ^ Assumed constraint
+                   -> [Goal]   -- ^ Collected constraints
+                   -> IO (Either Error [Warning], Subst)
+proveImplicationIO _   _     _         _  [] [] = return (Right [], emptySubst)
+proveImplicationIO s lname varsInEnv as ps gs =
+  debugBlock s "proveImplicationIO" $
 
-         gs2 <- io $ SMT.simpDelayed as m numAsmps numGs
-         case otherGs ++ gs2 of
-           [] -> return emptySubst
-           unsolved ->
-            -- Last resort, let's try to default something.
-             do let vs = Set.filter isFreeTV $ fvs $ map goal unsolved
-                evars <- varsWithAsmps
-                let candidates = vs `Set.difference` evars
-                if Set.null vs
-                  then reportErr unsolved >> return emptySubst
-                  else do let (_,uns,su,ws) =
-                               tryDefaultWith m (Set.toList candidates) unsolved
-                          mapM_ recordWarning ws
-                          unless (null uns) (reportErr uns)
-                          return su
+  do debugBlock s "assumes" (debugLog s ps)
+     debugBlock s "shows"   (debugLog s gs)
+     debugLog s "1. ------------------"
 
+
+     _simpPs <- Num.assumeProps s ps
+
+     mbImps <- Num.check s
+     debugLog s "2. ------------------"
+
+
+     case mbImps of
+
+       Nothing ->
+         do debugLog s "(contradiction in assumptions)"
+            return (Left $ UnusableFunction lname ps, emptySubst)
+
+       Just (imps,extra) ->
+         do let su  = importImps imps
+                gs0 = apSubst su gs
+
+            debugBlock s "improvement from assumptions:" $ debugLog s su
+
+            let (scs,invalid) = importSideConds extra
+            unless (null invalid) $
+              panic "proveImplicationIO" ( "Unable to import all side conditions:"
+                                              : map (show . Num.ppProp) invalid )
+
+            let gs1 = filter ((`notElem` ps) . goal) gs0
+
+            debugLog s "3. ---------------------"
+            (mb,su1) <- simpGoals' s (scs ++ gs1)
+
+            case mb of
+              Left badGs  -> reportUnsolved badGs (su1 @@ su)
+              Right []    -> return (Right [], su1 @@ su)
+
+              Right us ->
+                 -- Last hope: try to default stuff
+                 do let vs    = Set.filter isFreeTV $ fvs $ map goal us
+                        dVars = Set.toList (vs `Set.difference` varsInEnv)
+                    (_,us1,su2,ws) <- improveByDefaultingWith s dVars us
+                    case us1 of
+                       [] -> return (Right ws, su2 @@ su1 @@ su)
+                       _  -> reportUnsolved us1 (su2 @@ su1 @@ su)
   where
-  reportErr us = recordError $ UnsolvedDelcayedCt
-                               DelayedCt { dctSource = lname
-                                         , dctForall = as
-                                         , dctAsmps  = asmps0
-                                         , dctGoals  = us
-                                         }
+  reportUnsolved us su =
+    return ( Left $ UnsolvedDelcayedCt
+                  $ DelayedCt { dctSource = lname
+                              , dctForall = as
+                              , dctAsmps  = ps
+                              , dctGoals  = us
+                              }, su)
 
 
 
--- | Assumes that the substitution has been applied to the goals
-simplifyGoals :: OrdFacts -> [Goal] -> InferM ()
-simplifyGoals initOrd gs1 = solveSomeGoals [] False gs1
+
+
+{- Constraints and satisfiability:
+
+  1. [Satisfiable] A collection of constraints is _satisfiable_, if there is an
+     assignment for the variables that make all constraints true.
+
+  2. [Valid] If a constraint is satisfiable for any assignment of its free
+     variables, then it is _valid_, and may be ommited.
+
+  3. [Partial] A constraint may _partial_, which means that under some
+     assignment it is neither true nor false.  For example:
+     `x - y > 5` is true for `{ x = 15, y = 3 }`, it is false for
+     `{ x = 5, y = 4 }`, and it is neither for `{ x = 1, y = 2 }`.
+
+     Note that constraints that are always true or undefined are NOT
+     valid, as there are assignemntes for which they are not true.
+     An example of such constraint is `x - y >= 0`.
+
+  4. [Provability] Instead of thinking of three possible values for
+     satisfiability (i.e., true, false, and unknown), we could instead
+     think of asking: "Is constraint C provable".  This essentailly
+     maps "true" to "true", and "false,unknown" to "false", if we
+     treat constraints with malformed parameters as unprovable.
+-}
+
+
+{-
+The plan:
+  1. Start with a set of constraints, CS
+  2. Compute its well-defined closure, DS.
+  3. Simplify constraints: evaluate terms in constraints as much as possible
+  4. Solve: eliminate constraints that are true
+  5. Check for consistency
+  6. Compute improvements
+  7. For each type in the improvements, add well-defined constraints
+  8. Instantiate constraints with substitution
+  9. Goto 3
+-}
+
+simpGoals' :: Num.Solver -> [Goal] -> IO (Either [Goal] [Goal], Subst)
+simpGoals' s gs0 = go emptySubst [] (wellFormed gs0 ++ gs0)
   where
-  solveSomeGoals others !changes [] =
-    if changes
-      then solveSomeGoals [] False others
-      else addGoals others
+  -- Assumes that the well-formed constraints are themselves well-formed.
+  wellFormed gs = [ g { goal = p } | g <- gs, p <- wfType (goal g) ]
 
-  solveSomeGoals others !changes (g : gs) =
-    do let (m, bad, _) = goalOrderModel initOrd (others ++ gs)
+  go su old [] = return (Right old, su)
+  go su old gs =
+    do gs1  <- simplifyConstraintTerms s gs
+       res  <- solveConstraints s old gs1
+       case res of
+         Left err -> return (Left err, su)
+         Right gs2 ->
+           do let gs3 = gs2 ++ old
+              mb <- computeImprovements s gs3
+              case mb of
+                Left err -> return (Left err, su)
+                Right impSu ->
+                  let (unchanged,changed) =
+                                    partitionEithers (map (applyImp impSu) gs3)
+                      new = wellFormed changed
+                  in go (impSu @@ su) unchanged (new ++ changed)
 
-       if not (null bad)
-         then mapM_ (recordError . UnsolvedGoal) bad
-         else
-           case makeStep m g of
-             Unsolved -> solveSomeGoals (g : others) changes gs
-             Unsolvable ->
-               do recordError (UnsolvedGoal g)
-                  solveSomeGoals others changes gs
+  applyImp su g = case apSubstMaybe su (goal g) of
+                    Nothing -> Left g
+                    Just p  -> Right g { goal = p }
 
-             Solved Nothing []     -> solveSomeGoals others changes gs
-             Solved Nothing subs   -> solveSomeGoals others True (subs ++ gs)
-             Solved (Just su) subs ->
-               do extendSubst su
-                  solveSomeGoals (apSubst su others) True
-                                            (subs ++ apSubst su gs)
 
-  makeStep m g = case numericStep m g of
-                   Unsolved -> classStep g
-                   x        -> x
+{- Note:
+It is good to consider the other goals when evaluating terms.
+For example, consider the constraints:
+
+    P (x * inf), x >= 1
+
+We cannot simplify `x * inf` on its own, because we do not know if `x`
+might be 0.  However, in the contxt of `x >= 1`, we know that this is
+impossible, and we can simplify the constraints to:
+
+    P inf, x >= 1
+
+However, we should be careful to avoid circular reasoning, as we wouldn't
+want to use the fact that `x >= 1` to simplify `x >= 1` to true.
+-}
+
+-- XXX: currently simplify individually
+simplifyConstraintTerms :: Num.Solver -> [Goal] -> IO [Goal]
+simplifyConstraintTerms s gs =
+  debugBlock s "Simplifying terms" $ return (map simpGoal gs)
+  where simpGoal g = g { goal = simpProp (goal g) }
+
+
+solveConstraints :: Num.Solver ->
+                    [Goal] {- We may use these, but don't try to solve,
+                              we already tried and failed. -} ->
+                    [Goal] {- Need to solve these -} ->
+                    IO (Either [Goal] [Goal])
+                    -- ^ Left: contradiciting goals,
+                    --   Right: goals that were not solved, or sub-goals
+                    --          for solved goals.  Does not include "old"
+solveConstraints s otherGs gs0 =
+  debugBlock s "Solving constraints" $ solveClassCts [] [] gs0
+
+  where
+  otherNumerics = [ g | Right g <- map Num.numericRight otherGs ]
+
+  solveClassCts unsolvedClass numerics [] =
+    do unsolvedNum <- solveNumerics s otherNumerics numerics
+       return (Right (unsolvedClass ++ unsolvedNum))
+
+  solveClassCts unsolved numerics (g : gs) =
+    case Num.numericRight g of
+      Right n -> solveClassCts unsolved (n : numerics) gs
+      Left c  ->
+        case classStep c of
+          Unsolvable          -> return (Left [g])
+          Unsolved            -> solveClassCts (g : unsolved) numerics gs
+          Solved Nothing subs -> solveClassCts unsolved numerics (subs ++ gs)
+          Solved (Just su) _  -> panic "solveClassCts"
+                                          [ "Unexpected substituion", show su ]
+
+
+solveNumerics :: Num.Solver ->
+                 [(Goal,Num.Prop)] {- ^ Consult these -} ->
+                 [(Goal,Num.Prop)] {- ^ Solve these -}   ->
+                 IO [Goal]
+solveNumerics s consultGs solveGs =
+  Num.withScope s $
+    do _   <- Num.assumeProps s (map (goal . fst) consultGs)
+       Num.simplifyProps s (map Num.knownDefined solveGs)
+
+
+computeImprovements :: Num.Solver -> [Goal] -> IO (Either [Goal] Subst)
+computeImprovements s gs =
+  debugBlock s "Computing improvements" $
+  do let nums = [ g | Right g <- map Num.numericRight gs ]
+     res <- Num.withScope s $
+        do _  <- Num.assumeProps s (map (goal . fst) nums)
+           mb <- Num.check s
+           case mb of
+             Nothing       -> return Nothing
+             Just (suish,_ps1) ->
+               do let (su,_ps2) = importSplitImps suish
+                  -- Num.check has already checked that the intervals are sane,
+                  -- so we don't need to check for a broken interval here
+                  Right ints <- Num.getIntervals s
+                  return (Just (ints,su))
+     case res of
+       Just (ints,su)
+         | isEmptySubst su
+         , (x,t) : _ <- mapMaybe (improveByDefn ints) gs ->
+           do let su' = singleSubst x t
+              debugLog s ("Improve by definition: " ++ show (pp su'))
+              return (Right su')
+
+         | otherwise -> return (Right su)
+
+       Nothing ->
+         do bad <- Num.minimizeContradictionSimpDef s
+                                                (map Num.knownDefined nums)
+            return (Left bad)
+
+
+improveByDefn :: Map TVar Interval -> Goal -> Maybe (TVar,Type)
+improveByDefn ints Goal { .. } =
+  do (var,ty) <- tryRewritePropAsSubst ints goal
+     return (var,simpType ty)
+
+
+
+-- | Import an improving substitutin (i.e., a bunch of equations)
+-- into a Cryptol substitution (which is idempotent).
+-- The substitution will contain only unification variables.
+-- "Improvements" on skolem variables become additional constraints.
+importSplitImps :: Map Num.Name Num.Expr -> (Subst, [Prop])
+importSplitImps = mk . partitionEithers . map imp . Map.toList
+  where
+  mk (uni,props) = (listSubst (catMaybes uni), props)
+
+  imp (x,e) = case (x, Num.importType e) of
+                (Num.UserName tv, Just ty) ->
+                  case tv of
+                    TVFree {}  -> Left (Just (tv,ty))
+                    TVBound {} -> Right (TVar tv =#= ty)
+
+                {- This may happen if we are working on an implication,
+                and we have an improvement about a variable in the
+                assumptions that is not in any og the goals.
+                XXX: Perhaps, we should mark these variable, so we don't waste
+                time to "improve" them. -}
+
+                _ -> Left Nothing
+
+
+
+-- | Import an improving substitution into a Cryptol substitution.
+-- The substitution will contain both unification and skolem variables,
+-- so this should be used when processing *givens*.
+importImps :: Map Num.Name Num.Expr -> Subst
+importImps = listSubst . map imp . Map.toList
+  where
+  imp (x,e) = case (x, Num.importType e) of
+                (Num.UserName tv, Just ty) -> (tv,ty)
+                _ -> panic "importImps" [ "Failed to import:", show x, show e ]
+
+
+
+importSideConds :: [Num.Prop] -> ([Goal],[Num.Prop])
+importSideConds = go [] []
+  where
+  go ok bad []     = ([ Goal CtImprovement emptyRange g | g <- ok], bad)
+  go ok bad (p:ps) = case Num.importProp p of
+                       Just p' -> go (p' ++ ok)    bad  ps
+                       Nothing -> go        ok  (p:bad) ps
+
+
+
+
+
+
+--------------------------------------------------------------------------------
+
+-- This is what we use to avoid ambiguity when generalizing.
+
+{- If a variable, `a`, is:
+    1. Of kind KNum
+    2. Generic (i.e., does not appear in the environment)
+    3. It appears only in constraints but not in the resulting type
+       (i.e., it is not on the RHS of =>)
+    4. It (say, the variable 'a') appears only in constraints like this:
+        3.1 `a >= t` with (`a` not in `fvs t`)
+        3.2 in the `s` of `fin s`
+
+  Then we replace `a` with `max(t1 .. tn)` where the `ts`
+  are from the constraints `a >= t`.
+
+  If `t1 .. tn` is empty, then we replace `a` with 0.
+
+  This function assumes that 1-3 have been checked, and implements the rest.
+  So, given some variables and constraints that are about to be generalized,
+  we return:
+      1. a new (same or smaller) set of variables to quantify,
+      2. a new set of constraints,
+      3. a substitution which indicates what got defaulted.
+-}
+
+improveByDefaultingWith ::
+  Num.Solver ->
+  [TVar] ->   -- candidates for defaulting
+  [Goal] ->   -- constraints
+    IO  ( [TVar]    -- non-defaulted
+        , [Goal]    -- new constraints
+        , Subst     -- improvements from defaulting
+        , [Warning] -- warnings about defaulting
+        )
+improveByDefaultingWith s as ps =
+  classify (Map.fromList [ (a,([],Set.empty)) | a <- as ]) [] [] ps
+
+  where
+  -- leq: candidate definitions (i.e. of the form x >= t, x `notElem` fvs t)
+  --      for each of these, we keep the list of `t`, and the free vars in them.
+  -- fins: all `fin` constraints
+  -- others: any other constraints
+  classify leqs fins others [] =
+    do let -- First, we use the `leqs` to choose some definitions.
+           (defs, newOthers)  = select [] [] (fvs others) (Map.toList leqs)
+           su                 = listSubst defs
+
+       -- Do this to simplify the instantiated "fin" constraints.
+       (mb,su1) <- simpGoals' s (newOthers ++ others ++ apSubst su fins)
+       case mb of
+         Right gs1 ->
+           let warn (x,t) =
+                 case x of
+                   TVFree _ _ _ d -> DefaultingTo d t
+                   TVBound {} -> panic "Crypto.TypeCheck.Infer"
+                     [ "tryDefault attempted to default a quantified variable."
+                     ]
+
+               newSu = su1 @@ su     -- XXX: is that right?
+               names = Set.fromList $ map fst $ fromMaybe [] $ substToList newSu
+
+            in return ( [ a | a <- as, not (a `Set.member` names) ]
+                      , gs1
+                      , newSu
+                      , map warn defs
+                      )
+
+
+
+         -- Something went wrong, don't default.
+         Left _ -> return (as,ps,su1 @@ su,[])
+
+
+  classify leqs fins others (prop : more) =
+      case tNoUser (goal prop) of
+
+        -- We found a `fin` constraint.
+        TCon (PC PFin) [ _ ] -> classify leqs (prop : fins) others more
+
+        -- Things of the form: x >= T(x) are not defaulted.
+        TCon (PC PGeq) [ TVar x, t ]
+          | x `elem` as && x `Set.notMember` freeRHS ->
+           classify leqs' fins others more
+           where freeRHS = fvs t
+                 add (xs1,vs1) (xs2,vs2) = (xs1 ++ xs2, Set.union vs1 vs2)
+                 leqs' = Map.insertWith add x ([(t,prop)],freeRHS) leqs
+
+        _ -> classify leqs fins (prop : others) more
+
+
+  -- Pickout which variables may be defaulted and how.
+    -- XXX: simpType t
+  select yes no _ [] = ([ (x, t) | (x,t) <- yes ] ,no)
+  select yes no otherFree ((x,(rhsG,vs)) : more) =
+    select newYes newNo newFree newMore
+
+    where
+    (ts,gs) = unzip rhsG
+
+    -- `x` selected only if appears nowehere else.
+    -- this includes other candidates for defaulting.
+    (newYes,newNo,newFree,newMore)
+
+        -- Mentioned in other constraints, definately not defaultable.
+        | x `Set.member` otherFree = noDefaulting
+
+        | otherwise =
+            let deps = [ y | (y,(_,yvs)) <- more, x `Set.member` yvs ]
+                recs = filter (`Set.member` vs) deps
+            in if not (null recs) || isBoundTV x -- x >= S(y), y >= T(x)
+                                 then noDefaulting
+
+                                  -- x >= S,    y >= T(x)   or
+                                  -- x >= S(y), y >= S
+                                  else yesDefaulting
+
+        where
+        noDefaulting = ( yes, gs ++ no, vs `Set.union` otherFree, more )
+
+        yesDefaulting =
+          let ty  = case ts of
+                      [] -> tNum (0::Int)
+                      _  -> foldr1 tMax ts
+              su1 = singleSubst x ty
+          in ( (x,ty) : [ (y,apSubst su1 t) | (y,t) <- yes ]
+             , no         -- We know that `x` does not appear here
+             , otherFree  -- We know that `x` did not appear here either
+
+             -- No need to update the `vs` because we've already
+             -- checked that there are no recursive dependencies.
+             , [ (y, (apSubst su1 ts1, vs1)) | (y,(ts1,vs1)) <- more ]
+             )
+
+
+-- | Try to pick a reasonable instantiation for an expression, with
+-- the given type.  This is useful when we do evaluation at the REPL.
+-- The resulting types should satisfy the constraints of the schema.
+defaultReplExpr :: Num.Solver -> Expr -> Schema
+             -> IO (Maybe ([(TParam,Type)], Expr))
+defaultReplExpr so e s =
+  if all (\v -> kindOf v == KNum) (sVars s)
+     then do let params = map tpVar (sVars s)
+             mbSubst <- tryGetModel so params (sProps s)
+             case mbSubst of
+               Just su ->
+                 do (res,su1) <- simpGoals' so (map (makeGoal su) (sProps s))
+                    return $
+                      case res of
+                        Right [] | isEmptySubst su1 ->
+                         do tys <- mapM (bindParam su) params
+                            return (zip (sVars s) tys, appExpr tys)
+                        _ -> Nothing
+               _ -> return Nothing
+
+     else return Nothing
+  where
+  makeGoal su p = Goal { goalSource = error "goal source"
+                       , goalRange  = error "goal range"
+                       , goal       = apSubst su p
+                       }
+
+  bindParam su tp =
+    do let ty  = TVar tp
+           ty' = apSubst su ty
+       guard (ty /= ty')
+       return ty'
+
+  appExpr tys = foldl (\e1 _ -> EProofApp e1) (foldl ETApp e tys) (sProps s)
+
+
+
+-- | Attempt to default the given constraints by asserting them in the SMT
+-- solver, and asking it for a model.
+tryGetModel ::
+  Num.Solver ->
+  [TVar] ->   -- variables to try defaulting
+  [Prop] ->   -- constraints
+    IO (Maybe Subst)
+tryGetModel s xs ps =
+  -- We are only interested in finite instantiations
+  Num.getModel s (map (pFin . TVar) xs ++ ps)
+
+--------------------------------------------------------------------------------
+
+simpType :: Type -> Type
+simpType ty = fromMaybe ty (simpTypeMaybe ty)
+
+simpProp :: Prop -> Prop
+simpProp p = case p of
+              TUser f ts q -> TUser f (map simpType ts) (simpProp q)
+              TCon c ts    -> TCon c (map simpType ts)
+              TVar {}      -> panic "simpProp" ["variable", show p]
+              TRec {}      -> panic "simpProp" ["record", show p]
+
+
+
+
+simpTypeMaybe :: Type -> Maybe Type
+simpTypeMaybe ty =
+  case ty of
+    TCon c ts ->
+      case c of
+        TF {}    -> do e  <- Num.exportType ty
+                       e1 <- Num.crySimpExprMaybe e
+                       Num.importType e1
+
+        _        -> TCon c `fmap` anyJust simpTypeMaybe ts
+
+    TVar _       -> Nothing
+    TUser x ts t -> TUser x ts `fmap` simpTypeMaybe t
+    TRec fs      ->
+      do let (ls,ts) = unzip fs
+         ts' <- anyJust simpTypeMaybe ts
+         return (TRec (zip ls ts'))
+
+
+
+--------------------------------------------------------------------------------
+_testSimpGoals :: IO ()
+_testSimpGoals = Num.withSolver cfg $ \s ->
+  do mapM_ dump asmps
+     mapM_ (dump .goal) gs
+
+     _ <- Num.assumeProps s asmps
+     _mbImps <- Num.check s
+
+
+     (mb,_) <- simpGoals' s gs
+     case mb of
+       Right _  -> debugLog s "End of test"
+       Left _   -> debugLog s "Impossible"
+  where
+  cfg = SolverConfig { solverPath = "z3"
+                     , solverArgs = [ "-smt2", "-in" ]
+                     , solverVerbose = 1
+                     }
+
+  asmps = []
+
+  gs    = map fakeGoal [ tv 0 =#= tMin (num 10) (tv 1)
+                       , tv 1 =#= num 10
+                       ]
+
+
+  fakeGoal p = Goal { goalSource = undefined, goalRange = undefined, goal = p }
+  tv n  = TVar (TVFree n KNum Set.empty (text "test var"))
+  _btv n = TVar (TVBound n KNum)
+  num x = tNum (x :: Int)
+
+  dump a = do putStrLn "-------------------_"
+              case Num.exportProp a of
+                Just b     -> do print $ Num.ppProp' $ Num.propToProp' b
+                                 putStrLn "-------------------"
+                Nothing    -> print "can't export"
+
+
+
diff --git a/src/Cryptol/TypeCheck/Solver/Class.hs b/src/Cryptol/TypeCheck/Solver/Class.hs
--- a/src/Cryptol/TypeCheck/Solver/Class.hs
+++ b/src/Cryptol/TypeCheck/Solver/Class.hs
@@ -1,6 +1,6 @@
 -- |
 -- Module      :  $Header$
--- Copyright   :  (c) 2013-2015 Galois, Inc.
+-- Copyright   :  (c) 2013-2016 Galois, Inc.
 -- License     :  BSD3
 -- Maintainer  :  cryptol@galois.com
 -- Stability   :  provisional
@@ -9,13 +9,17 @@
 -- Solving class constraints.
 
 {-# LANGUAGE PatternGuards #-}
-module Cryptol.TypeCheck.Solver.Class (classStep, expandProp) where
+module Cryptol.TypeCheck.Solver.Class
+  ( classStep
+  , expandProp
+  ) where
 
 import Cryptol.TypeCheck.AST
 import Cryptol.TypeCheck.InferTypes(Goal(..), Solved(..))
 
-
 -- | Solve class constraints.
+-- If not, then we return 'Nothing'.
+-- If solved, ther we return 'Just' a list of sub-goals.
 classStep :: Goal -> Solved
 classStep g = case goal g of
   TCon (PC PArith) [ty] -> solveArithInst g (tNoUser ty)
@@ -39,6 +43,9 @@
   -- (Arith a, Arith b) => Arith (a,b)
   TCon (TC (TCTuple _)) es -> solved g [ pArith e | e <- es ]
 
+  -- Arith Bit fails
+  TCon (TC TCBit) [] -> Unsolvable
+
   -- (Arith a, Arith b) => Arith { x1 : a, x2 : b }
   TRec fs -> solved g [ pArith ety | (_,ety) <- fs ]
 
@@ -71,6 +78,9 @@
 
   -- (Cmp a, Cmp b) => Cmp (a,b)
   TCon (TC (TCTuple _)) es -> solved g (map pCmp es)
+
+  -- Cmp (a -> b) fails
+  TCon (TC TCFun) [_,_] -> Unsolvable
 
   -- (Cmp a, Cmp b) => Cmp { x:a, y:b }
   TRec fs -> solved g [ pCmp e | (_,e) <- fs ]
diff --git a/src/Cryptol/TypeCheck/Solver/CrySAT.hs b/src/Cryptol/TypeCheck/Solver/CrySAT.hs
--- a/src/Cryptol/TypeCheck/Solver/CrySAT.hs
+++ b/src/Cryptol/TypeCheck/Solver/CrySAT.hs
@@ -1,660 +1,669 @@
 -- |
 -- Module      :  $Header$
--- Copyright   :  (c) 2013-2015 Galois, Inc.
--- License     :  BSD3
--- Maintainer  :  cryptol@galois.com
--- Stability   :  provisional
--- Portability :  portable
-
-{-# LANGUAGE Safe, PatternGuards #-}
-module Cryptol.TypeCheck.Solver.CrySAT
-  (debug
-  , Prop(..)
-  , Expr(..)
-  , PropSet
-  , noProps
-  , assert
-  , checkSat
-  , Result(..)
-  , InfNat(..)
-  , Name
-  , toName
-  , fromName
-  ) where
-
-import qualified Data.Integer.SAT as SAT
-import           Data.Set(Set)
-import qualified Data.Set as Set
-import           Data.Either (partitionEithers)
-import           MonadLib
-import           Control.Applicative
-
-import           Cryptol.Utils.Panic
-
-infixr 2 :||
-infixr 3 :&&
-infix  4 :==, :>, :>=
-infixl 6 :+, :-
-infixl 7 :*
-
-
-data Name = UserName Int | SysName Int
-            deriving (Show,Eq,Ord)
-
-toName :: Int -> Name
-toName = UserName
-
-fromName :: Name -> Maybe Int
-fromName (UserName x) = Just x
-fromName (SysName _)  = Nothing
-
-
-exportName :: Name -> SAT.Name
-exportName n = SAT.toName $ case n of
-                              UserName i -> 2 * i
-                              SysName i  -> 2 * i + 1
-
-satVar :: Name -> SAT.Expr
-satVar = SAT.Var . exportName
-
-importName :: Int -> Name
-importName x = case divMod x 2 of
-                 (q,r) | r == 0     -> UserName q
-                       | otherwise  -> SysName q
-
-satCheckSat :: SAT.PropSet -> Maybe [ (Name,Integer) ]
-satCheckSat =  fmap (map imp) . SAT.checkSat
-  where imp (x,v) = (importName x, v)
-
-
-data Prop = Fin Expr
-          | Expr :== Expr | Expr :/= Expr
-          | Expr :>= Expr | Expr :> Expr
-          | Prop :&& Prop | Prop :|| Prop
-          | Not Prop
-            deriving Show
-
-data Expr = K InfNat
-          | Var Name
-          | Expr :+ Expr
-          | Expr :- Expr
-          | Expr :* Expr
-          | Div Expr Expr
-          | Mod Expr Expr
-          | Expr :^^ Expr
-          | Min Expr Expr
-          | Max Expr Expr
-          | Lg2 Expr
-          | Width Expr
-          | LenFromThen   Expr Expr Expr
-          | LenFromThenTo Expr Expr Expr
-            deriving Show
-
-debug :: PropSet -> [S]
-debug (PS m) = runId $ findAll m
-
-newtype PropSet = PS (ChoiceT Id S)
-
-noProps :: PropSet
-noProps = PS $ return S { finVars   = Set.empty
-                        , infVars   = Set.empty
-                        , linear    = SAT.noProps
-                        , nonLin    = []
-                        , waitVars  = Set.empty
-                        , changes   = False
-                        , nextVar   = 0
-                        }
-
-assert :: Prop -> PropSet -> PropSet
-assert p (PS m) =
-  PS $ do s <- m
-          (_,s1) <- runStateT s
-                  $ unFM
-                  $ cvt p >> checkConsistent
-          return s1
-
-  where
-  cvt (p1 :&& p2) = cvt p1 `mkAnd` cvt p2
-  cvt (p1 :|| p2) = cvt p1 `mkOr`  cvt p2
-  cvt (Not p1)    = cvt (mkNot p1)
-  cvt (Fin t)     = cryDefined t  `mkAnd` cryIsFin t
-  cvt (t1 :== t2) = cryDefined t1 `mkAnd` cryDefined t2 `mkAnd` cryIsEq  t1 t2
-  cvt (t1 :/= t2) = cryDefined t1 `mkAnd` cryDefined t2 `mkAnd` cryIsNeq t1 t2
-  cvt (t1 :>= t2) = cryDefined t1 `mkAnd` cryDefined t2 `mkAnd` cryIsGeq t1 t2
-  cvt (t1 :>  t2) = cryDefined t1 `mkAnd` cryDefined t2 `mkAnd` cryIsGt  t1 t2
-
-  mkNot q = case q of
-              p1 :&& p2 -> mkNot p1 :|| mkNot p2
-              p1 :|| p2 -> mkNot p1 :&& mkNot p2
-              Not p1    -> p1
-              Fin e     -> e  :== K Inf
-              t1 :== t2 -> t1 :/= t2
-              t1 :/= t2 -> t1 :== t2
-              t1 :>= t2 -> t2 :> t1
-              t1 :>  t2 -> t2 :>= t1
-
-
-data InfNat = Nat Integer | Inf
-              deriving (Eq,Ord,Show)
-
-data Result = Sat [(Int,InfNat)]
-            | Unsat
-            | Unknown
-              deriving Show
-
-checkSat :: PropSet -> Result
-checkSat (PS ch) =
-  runId $
-  do mb <- runChoiceT ch
-     return $ case mb of
-                Nothing -> Unsat
-                Just (s, more) ->
-                  case getModel s of
-                    Just m  -> Sat m
-                    Nothing -> case checkSat (PS more) of
-                                 Unsat -> Unknown
-                                 x     -> x
-
-getModel :: S -> Maybe [(Int,InfNat)]
-getModel s =
-  do let ps = linear s
-     m  <- satCheckSat ps
-     let exact = [ satVar x SAT.:== SAT.K v | (x,v) <- m ]
-     m1 <- satCheckSat $ foldr SAT.assert SAT.noProps
-                       $ exact ++
-                         [ satVar x SAT.:== cvt m nl | (x,nl) <- nonLin s ]
-     return [ (x,v) | (UserName x, v)
-                          <- [ (x,Inf)  | x <- Set.toList (infVars s) ] ++
-                             [ (x,Nat v) | (x,v) <- m1 ] ]
-
-  where
-  lkp m x = case lookup x m of
-              Nothing -> 0
-              Just n  -> n
-  cvt m nl =
-    case nl of
-      NLDiv e x  -> SAT.Div e (lkp m x)
-      NLMod e x  -> SAT.Mod e (lkp m x)
-      NLExp x y  -> SAT.K $ lkp m x ^ lkp m y
-      NLExpL k y -> SAT.K $ k ^ lkp m y
-      NLExpR x k -> SAT.K $ lkp m x ^ k
-      NLMul x y  -> SAT.K $ lkp m x * lkp m y
-      NLLg2 x    -> SAT.K $ nLg2 (lkp m x)
-
-
-
---------------------------------------------------------------------------------
-
-data NonLin = NLDiv SAT.Expr Name
-            | NLMod SAT.Expr Name
-            | NLExp Name Name
-            | NLExpL Integer Name
-            | NLExpR Name Integer
-            | NLMul Name Name
-            | NLLg2 Name
-              deriving Show
-
-setNL :: Name -> Integer -> (Name,NonLin) -> Either (Name,NonLin) SAT.Prop
-setNL x n (v, nl) = case it of
-                      Left nl1 -> Left (x,nl1)
-                      Right e  -> Right (satVar v SAT.:== e)
-  where
-  it = case nl of
-         NLDiv e y  | x == y            -> Right $ SAT.Div e n
-         NLMod e y  | x == y            -> Right $ SAT.Mod e n
-         NLMul y z  | y == z && x == y  -> Right $ SAT.K $ n * n
-                    | x == y            -> Right $ n SAT.:* satVar z
-                    | x == z            -> Right $ n SAT.:* satVar y
-         NLExp y z  | y == z && x == y  -> Right $ SAT.K $ n ^ n
-                    | x == y            -> Left  $ NLExpL n z
-                    | x == z            -> Left  $ NLExpR y n
-         NLExpL k z | x == z            -> Right $ SAT.K $ k ^ n
-         NLExpR y k | x == y            -> Right $ SAT.K $ n ^ k
-         NLLg2 y    | x == y            -> Right $ SAT.K $ nLg2 n
-         _                              -> Left nl
-
-
-data S = S
-  { finVars   :: Set Name     -- all of these are ordinary finite vars
-  , infVars   :: Set Name     -- these vars are all equal to Inf (XXX: subst?)
-  , linear    :: SAT.PropSet  -- linear constraints
-  , nonLin    :: [(Name,NonLin)] -- non-linear (delayed) constraints
-  , waitVars  :: Set Name     -- waiting for improvements to these
-                              -- improvements here may turn non-lin into lin
-                              -- INV: these are a subset of finVars
-  , changes   :: Bool         -- temp: did something improve last time?
-                              -- if so we should restart.
-  , nextVar   :: !Int         -- source of new variables
-  }
-
-newtype FM a = FM { unFM :: StateT S (ChoiceT Id) a }
-
-instance Functor FM where
-  fmap f (FM m) = FM (fmap f m)
-
-instance Applicative FM where
-  pure x          = FM (pure x)
-  FM mf <*> FM mx = FM (mf <*> mx)
-
-instance Alternative FM where
-  empty = mzero
-  (<|>) = mplus
-
-instance Monad FM where
-  return x        = FM (return x)
-  FM mf >>= k     = FM (mf >>= unFM . k)
-
-instance MonadPlus FM where
-  mzero = FM mzero
-  mplus (FM m1) (FM m2) = FM (mplus m1 m2)
-
-
-noChanges :: F
-noChanges = FM $ sets_ $ \s -> s { changes = False }
-
-addLin :: SAT.Prop -> F
-addLin p = FM $ sets_ $ \s -> s { linear = SAT.assert p (linear s)
-                                , changes = True }
-
-
-checkConsistent :: F
-checkConsistent =
-  do s <- FM get
-     when (changes s) $
-       case satCheckSat (linear s) of
-         Nothing -> mzero
-         Just m  ->
-          do noChanges
-             mapM_ tryImprove [ (x,v) | (x,v) <- m, x `Set.member` waitVars s ]
-             checkConsistent
-
-tryImprove :: (Name,Integer) -> F
-tryImprove (x,n) =
-  do s <- FM get
-     case satCheckSat (SAT.assert (satVar x SAT.:/= SAT.K n) (linear s)) of
-       Nothing -> doImprove x n
-       Just _  -> return ()
-
-doImprove :: Name -> Integer -> F
-doImprove x n =
-  do resumed <- FM $ sets $ \s ->
-       let (stay, go) = partitionEithers $ map (setNL x n) (nonLin s)
-       in (go, s { nonLin = stay, waitVars = Set.delete x (waitVars s) })
-     mapM_ addLin resumed
-
-
-getLin :: FM SAT.PropSet
-getLin = FM $ linear `fmap` get
-
-newName :: FM Name
-newName = FM $ sets $ \s -> let x = nextVar s
-                            in (SysName x, s { nextVar = x + 1 })
-
-addNonLin :: NonLin -> FM SAT.Expr
-addNonLin nl =
-  do x <- newName
-     FM $ sets_ $ \s -> s { nonLin = (x,nl) : nonLin s }
-     isFin x
-     return $ satVar x
-
-
-type F = FM ()
-
-mkAnd :: F -> F -> F
-mkAnd f1 f2 = f1 >> f2
-
-mkOr  :: F -> F -> F
-mkOr f1 f2 = f1 `mplus` f2
-
-tt :: F
-tt = return ()
-
-ff :: F
-ff = mzero
-
-isEq :: Expr -> Expr -> F
-isEq t1 t2 = addLin =<< ((SAT.:==) <$> mkLin t1 <*> mkLin t2)
-
-isGt :: Expr -> Expr -> F
-isGt t1 t2 = addLin =<< ((SAT.:>) <$> mkLin t1 <*> mkLin t2)
-
-isFin :: Name -> F
-isFin x = do FM $ do s <- get
-                     guard (Set.notMember x (infVars s))
-                     set s { finVars = Set.insert x (finVars s) }
-             addLin (satVar x SAT.:>= SAT.K 0)
-
-isInf :: Name -> F
-isInf x = FM $ do s <- get
-                  guard (Set.notMember x (finVars s))
-                  set s { infVars = Set.insert x (infVars s) }
-
-
-
---------------------------------------------------------------------------------
-
-
-cryIsEq :: Expr -> Expr -> F
-cryIsEq t1 t2 = (cryIsInf t1 `mkAnd` cryIsInf t2) `mkOr`
-                (cryIsFin t1 `mkAnd` cryIsFin t2 `mkAnd` isEq t1 t2)
-
-cryIsNeq :: Expr -> Expr -> F
-cryIsNeq t1 t2 = cryIsGt t1 t2 `mkOr` cryIsGt t2 t1
-
-cryIsGt :: Expr -> Expr -> F
-cryIsGt t1 t2 = (cryIsInf t1 `mkAnd` cryIsFin t2) `mkOr`
-                (cryIsFin t1 `mkAnd` cryIsFin t2  `mkAnd` isGt t1 t2)
-
-cryIsGeq :: Expr -> Expr -> F
-cryIsGeq t1 t2 = cryIsEq t1 t2 `mkOr` cryIsGt t1 t2
-
-cryIsDifferent :: Expr -> Expr -> F
-cryIsDifferent t1 t2 = cryIsGt t1 t2 `mkOr` cryIsGt t2 t1
-
-
-{- XXX: Are we being a bit too strict here?
-Some oprtations may be defined even if one of their arguments
-is not.  For example, perhaps the following should not be rejected:
-inf + undefined -> inf
-0 - undefined   -> 0
-0 * undefined   -> 0
-mod undefined 1 -> 0
-1 ^ undefined   -> 1
-undefined ^ 0   -> 1`
-min 0 undefined -> 0
-max inf undefined -> inf
--}
-cryDefined :: Expr -> F
-cryDefined ty =
-  case ty of
-    K _        -> tt
-    Var _      -> tt
-    t1 :+ t2  -> cryDefined t1 `mkAnd` cryDefined t2
-    t1 :- t2  -> cryDefined t1 `mkAnd` cryDefined t2 `mkAnd`
-                 cryIsFin t2   `mkAnd` cryIsGeq t1 t2
-    t1 :* t2  -> cryDefined t1 `mkAnd` cryDefined t2
-    Div t1 t2  -> cryDefined t1 `mkAnd` cryDefined t2 `mkAnd`
-                  cryIsFin t1   `mkAnd` cryIsGt t2 (K $ Nat 0)
-    Mod t1 t2  -> cryDefined t1 `mkAnd` cryDefined t2 `mkAnd`
-                  cryIsFin t1   `mkAnd` cryIsGt t2 (K $ Nat 0)
-
-    t1 :^^ t2  -> cryDefined t1 `mkAnd` cryDefined t2
-    Min t1 t2  -> cryDefined t1 `mkAnd` cryDefined t2
-    Max t1 t2  -> cryDefined t1 `mkAnd` cryDefined t2
-    Lg2 t1     -> cryDefined t1
-    Width t1   -> cryDefined t1
-    LenFromThen t1 t2 t3 ->
-      cryDefined t1 `mkAnd` cryDefined t2 `mkAnd`
-      cryDefined t3 `mkAnd` cryIsFin t1   `mkAnd`
-      cryIsFin t2   `mkAnd` cryIsFin t3  `mkAnd`
-      cryIsDifferent t1 t2
-    LenFromThenTo t1 t2 t3 ->
-      cryDefined t1 `mkAnd` cryDefined t2 `mkAnd`
-      cryDefined t3 `mkAnd` cryIsFin t1   `mkAnd`
-      cryIsFin t2   `mkAnd` cryIsFin t3  `mkAnd`
-      cryIsDifferent t1 t2
-
-
--- Assuming a defined input.
-cryIsInf :: Expr -> F
-cryIsInf ty =
-  case ty of
-    K Inf               -> tt
-    K (Nat _)           -> ff
-    Var x               -> isInf x
-    t1 :+ t2            -> cryIsInf t1 `mkOr` cryIsInf t2
-    t1 :- _             -> cryIsInf t1
-    t1 :* t2            -> (cryIsInf t1 `mkAnd` cryIsGt t2 (K $ Nat 0))`mkOr`
-                           (cryIsInf t2 `mkAnd` cryIsGt t1 (K $ Nat 0))
-    Div t1 _            -> cryIsInf t1
-    Mod _  _            -> ff
-    t1 :^^ t2           -> (cryIsInf t1 `mkAnd` cryIsGt t2 (K $ Nat 0))`mkOr`
-                           (cryIsInf t2 `mkAnd` cryIsGt t1 (K $ Nat 1))
-    Min t1 t2           -> cryIsInf t1  `mkAnd` cryIsInf t2
-    Max t1 t2           -> cryIsInf t1 `mkOr` cryIsInf t2
-    Lg2 t1              -> cryIsInf t1
-    Width t1            -> cryIsInf t1
-    LenFromThen _ _ _   -> ff
-    LenFromThenTo _ _ _ -> ff
-
-
--- Assuming a defined input.
-cryIsFin :: Expr -> F
-cryIsFin ty =
-  case ty of
-    K Inf         -> ff
-    K (Nat _)     -> tt
-    Var x         -> isFin x
-    t1 :+ t2      -> cryIsFin t1 `mkAnd` cryIsFin t2
-    t1 :- _       -> cryIsFin t1
-    t1 :* t2      -> (cryIsFin t1 `mkAnd` cryIsFin t2) `mkOr`
-                      cryIsEq t1 (K $ Nat 0)       `mkOr`
-                      cryIsEq t2 (K $ Nat 0)
-
-    Div t1 _      -> cryIsFin t1
-    Mod _ _       -> tt
-    t1 :^^ t2     -> (cryIsFin t1 `mkAnd` cryIsFin t2) `mkOr`
-                      cryIsEq t1 (K $ Nat 0)            `mkOr`
-                      cryIsEq t1 (K $ Nat 1)            `mkOr`
-                      cryIsEq t2 (K $ Nat 0)
-
-    Min t1 t2     -> (cryIsFin t1 `mkAnd` cryIsGeq t2 t1) `mkOr`
-                     (cryIsFin t2 `mkAnd` cryIsGeq t1 t2)
-
-    Max t1 t2     -> cryIsFin t1 `mkAnd` cryIsFin t2
-    Lg2 t1        -> cryIsFin t1
-    Width t1      -> cryIsFin t1
-    LenFromThen  _ _ _   -> tt
-    LenFromThenTo  _ _ _ -> tt
-
--- eliminate Inf terms from finite values
-cryNoInf :: Expr -> FM Expr
-cryNoInf ty =
-  case ty of
-    K Inf :+ _   -> mzero
-    _ :+ K Inf   -> mzero
-
-    K Inf :- _   -> mzero
-    _ :- K Inf   -> mzero
-
-    K Inf :* t2  -> cryIsEq t2 (K $ Nat 0) >> return (K $ Nat 0)
-    t1 :* K Inf  -> cryIsEq t1 (K $ Nat 0) >> return (K $ Nat 0)
-
-    Div (K Inf) _    -> mzero
-    Div _ (K Inf)    -> return $ K $ Nat 0
-
-    Mod (K Inf) _    -> mzero
-    Mod t1 (K Inf)   -> cryNoInf t1
-
-    K Inf :^^ t2   -> cryIsEq t2 (K $ Nat 0) >> return (K $ Nat 1)
-    t1 :^^ K Inf   -> msum [ cryIsEq t1 (K $ Nat 0) >> return (K $ Nat 0)
-                           , cryIsEq t1 (K $ Nat 1) >> return (K $ Nat 1)
-                           ]
-
-    Min (K Inf) t2   -> cryNoInf t2
-    Min t1 (K Inf)   -> cryNoInf t1
-
-    Max (K Inf) _    -> mzero
-    Max _ (K Inf)    -> mzero
-
-    Lg2 (K Inf)      -> mzero
-
-    Width (K Inf)    -> mzero
-
-    LenFromThen (K Inf) _ _   -> mzero
-    LenFromThen _ (K Inf) _   -> mzero
-    LenFromThen _ _ (K Inf)   -> mzero
-
-    LenFromThenTo (K Inf) _ _ -> mzero
-    LenFromThenTo _ (K Inf) _ -> mzero
-    LenFromThenTo _ _ (K Inf) -> mzero
-
-    K Inf                    -> mzero
-
-    _                        -> return ty
-
-
--- Assumes a finite, and defined input.
-mkLin :: Expr -> FM SAT.Expr
-mkLin ty0 =
-  cryNoInf ty0 >>= \ty ->
-  case ty of
-    K Inf                  -> panic "Cryptol.TypeCheck.Solver.CrySAT.mkLin"
-                                [ "K Inf after cryNoInf" ]
-    K (Nat n)              -> return (SAT.K n)
-    Var x                  -> isFin x >> return (satVar x)
-    t1 :+ t2               -> (SAT.:+)            <$> mkLin t1 <*> mkLin t2
-    t1 :- t2               -> (SAT.:-)            <$> mkLin t1 <*> mkLin t2
-    t1 :* t2               -> join $ mkMul        <$> mkLin t1 <*> mkLin t2
-    Div t1 t2              -> join $ mkDiv        <$> mkLin t1 <*> mkLin t2
-    Mod t1 t2              -> join $ mkMod        <$> mkLin t1 <*> mkLin t2
-    t1 :^^ t2              -> join $ mkExp        <$> mkLin t1 <*> mkLin t2
-    Min t1 t2              -> mkMin               <$> mkLin t1 <*> mkLin t2
-    Max t1 t2              -> mkMax               <$> mkLin t1 <*> mkLin t2
-    Lg2 t1                 -> join $ mkLg2        <$> mkLin t1
-    Width t1               -> join $ mkWidth       <$> mkLin t1
-    LenFromThen t1 t2 t3   -> join $ mkLenFromThen <$> mkLin t1
-                                                   <*> mkLin t2
-                                                   <*> mkLin t3
-    LenFromThenTo t1 t2 t3 -> join $ mkLenFromThenTo <$> mkLin t1
-                                                     <*> mkLin t2
-                                                     <*> mkLin t3
-  where
-  mkMin t1 t2 = SAT.If (t1 SAT.:< t2) t1 t2
-  mkMax t1 t2 = SAT.If (t1 SAT.:< t2) t2 t1
-
-  mkMul t1 t2 =
-    do mb <- toConst t1
-       case mb of
-         Just n -> return (n SAT.:* t2)
-         Nothing ->
-            do mb1 <- toConst t2
-               case mb1 of
-                 Just n  -> return (n SAT.:* t1)
-                 Nothing -> do x <- toVar t1
-                               y <- toVar t2
-                               addNonLin (NLMul x y)
-
-  mkDiv t1 t2 =
-    do mb <- toConst t2
-       case mb of
-         Just n  -> return (SAT.Div t1 n)
-         Nothing -> do x <- toVar t2
-                       addNonLin (NLDiv t1 x)
-
-  mkMod t1 t2 =
-    do mb <- toConst t2
-       case mb of
-         Just n  -> return (SAT.Mod t1 n)
-         Nothing -> do x <- toVar t2
-                       addNonLin (NLMod t1 x)
-
-  mkLg2 t1 =
-    do mb <- toConst t1
-       case mb of
-         Just n   -> return $ SAT.K $ nLg2 n
-         Nothing  -> do x <- toVar t1
-                        addNonLin (NLLg2 x)
-
-  mkWidth t1 = mkLg2 (SAT.K 1 SAT.:+ t1)
-
-  mkExp t1 t2 =
-    do mb <- toConst t1
-       case mb of
-         Just n ->
-           do mb1 <- toConst t2
-              case mb1 of
-                Just m  -> return $ SAT.K $ n ^ m
-                Nothing -> do y <- toVar t2
-                              addNonLin (NLExpL n y)
-         Nothing -> do x <- toVar t1
-                       y <- toVar t2
-                       addNonLin (NLExp x y)
-
-
-
-  -- derived
-  mkLenFromThen x y w =
-    do upTo <- msum [ do addLin (y SAT.:> x)
-                         w1 <- mkExp (SAT.K 2) w
-                         return (w1 SAT.:- SAT.K 1)
-                    , do addLin (x SAT.:> y)
-                         return (SAT.K 0)
-                    ]
-       mkLenFromThenTo x y upTo
-
-  mkLenFromThenTo x y z =
-    msum [ do addLin (x SAT.:> y)   -- going down
-              msum [ addLin (z SAT.:> x)  >> return (SAT.K 0)
-                   , addLin (z SAT.:== x) >> return (SAT.K 1)
-                   , do addLin (z SAT.:< x)
-                        t <- mkDiv (x SAT.:- z) (x SAT.:- y)
-                        return (SAT.K 1 SAT.:+ t)
-                   ]
-
-         , do addLin (x SAT.:< y)   -- going up
-              msum [ addLin (z SAT.:< x)  >> return (SAT.K 0)
-                   , addLin (z SAT.:== x) >> return (SAT.K 1)
-                   , do addLin (z SAT.:> x)
-                        t <- mkDiv (z SAT.:- x) (y SAT.:- x)
-                        return (SAT.K 1 SAT.:+ t)
-                   ]
-
-         ]
-
-toConst :: SAT.Expr -> FM (Maybe Integer)
-toConst (SAT.K n) = return (Just n)
-toConst t = do l <- getLin
-               case SAT.getExprRange t l of
-                 Nothing -> return Nothing
-                 Just vs -> msum $ map (return . Just) vs
-
-toVar :: SAT.Expr -> FM Name
-toVar (SAT.Var x) | Just n <- SAT.fromName x = return $ importName n
-toVar e       = do x <- newName
-                   addLin (satVar x SAT.:== e)
-                   FM $ sets_ $ \s -> s { waitVars = Set.insert x (waitVars s) }
-                   return x
-
---------------------------------------------------------------------------------
-
--- | Rounds up.
--- @lg2 x = y@, iff @y@ is the smallest number such that @x <= 2 ^ y@
-nLg2 :: Integer -> Integer
-nLg2 0  = 0
-nLg2 n  = case genLog n 2 of
-            Just (x,exact) | exact     -> x
-                           | otherwise -> x + 1
-            Nothing -> panic "Cryptol.TypeCheck.Solver.CrySAT.nLg2"
-                         [ "genLog returned Nothing" ]
-
-
-
---------------------------------------------------------------------------------
-
--- | Compute the logarithm of a number in the given base, rounded down to the
--- closest integer.  The boolean indicates if we the result is exact
--- (i.e., True means no rounding happened, False means we rounded down).
--- The logarithm base is the second argument.
-genLog :: Integer -> Integer -> Maybe (Integer, Bool)
-genLog x 0    = if x == 1 then Just (0, True) else Nothing
-genLog _ 1    = Nothing
-genLog 0 _    = Nothing
-genLog x base = Just (exactLoop 0 x)
-  where
-  exactLoop s i
-    | i == 1     = (s,True)
-    | i < base   = (s,False)
-    | otherwise  =
-        let s1 = s + 1
-        in s1 `seq` case divMod i base of
-                      (j,r)
-                        | r == 0    -> exactLoop s1 j
-                        | otherwise -> (underLoop s1 j, False)
-
-  underLoop s i
-    | i < base  = s
-    | otherwise = let s1 = s + 1 in s1 `seq` underLoop s1 (div i base)
+-- Copyright   :  (c) 2013-2016 Galois, Inc.
+-- License     :  BSD3
+-- Maintainer  :  cryptol@galois.com
+-- Stability   :  provisional
+-- Portability :  portable
+
+{-# LANGUAGE Safe #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE PatternGuards #-}
+{-# LANGUAGE TypeSynonymInstances #-}
+module Cryptol.TypeCheck.Solver.CrySAT
+  ( withScope, withSolver
+  , assumeProps, simplifyProps, getModel
+  , check
+  , Solver, logger, getIntervals
+  , DefinedProp(..)
+  , debugBlock
+  , DebugLog(..)
+  , knownDefined, numericRight
+  , minimizeContradictionSimpDef
+  ) where
+
+import qualified Cryptol.TypeCheck.AST as Cry
+import           Cryptol.TypeCheck.InferTypes(Goal(..), SolverConfig(..), Solved(..))
+import qualified Cryptol.TypeCheck.Subst as Cry
+
+import           Cryptol.TypeCheck.Solver.Numeric.AST
+import           Cryptol.TypeCheck.Solver.Numeric.Fin
+import           Cryptol.TypeCheck.Solver.Numeric.ImportExport
+import           Cryptol.TypeCheck.Solver.Numeric.Interval
+import           Cryptol.TypeCheck.Solver.Numeric.Defined
+import           Cryptol.TypeCheck.Solver.Numeric.Simplify
+import           Cryptol.TypeCheck.Solver.Numeric.NonLin
+import           Cryptol.TypeCheck.Solver.Numeric.SMT
+import           Cryptol.Utils.PP -- ( Doc )
+import           Cryptol.Utils.Panic ( panic )
+
+import           MonadLib
+import           Data.Maybe ( fromMaybe )
+import           Data.Map (Map)
+import qualified Data.Map as Map
+import           Data.Foldable ( any, all )
+import qualified Data.Set as Set
+import           Data.IORef ( IORef, newIORef, readIORef, modifyIORef',
+                              atomicModifyIORef' )
+import           Prelude hiding (any,all)
+
+import qualified SimpleSMT as SMT
+
+
+-- | We use this to remember what we simplified
+newtype SimpProp = SimpProp { unSimpProp :: Prop }
+
+simpProp :: Prop -> SimpProp
+simpProp p = SimpProp (crySimplify p)
+
+
+class    HasProp a        where getProp :: a -> Cry.Prop
+instance HasProp Cry.Prop where getProp  = id
+instance HasProp Goal     where getProp  = goal
+
+
+-- | 'dpSimpProp' and 'dpSimpExprProp' should be logically equivalent,
+-- to each other, and to whatever 'a' represents (usually 'a' is a 'Goal').
+data DefinedProp a = DefinedProp
+  { dpData         :: a
+    -- ^ Optional data to associate with prop.
+    -- Often, the original `Goal` from which the prop was extracted.
+
+  , dpSimpProp     :: SimpProp
+    {- ^ Fully simplified: may mention ORs, and named non-linear terms.
+    These are what we send to the prover, and we don't attempt to
+    convert them back into Cryptol types. -}
+
+  , dpSimpExprProp :: Prop
+    {- ^ A version of the proposition where just the expression terms
+    have been simplified.  These should not contain ORs or named non-linear
+    terms because we want to import them back into Crytpol types. -}
+  }
+
+knownDefined :: (a,Prop) -> DefinedProp a
+knownDefined (a,p) = DefinedProp
+  { dpData = a, dpSimpProp = simpProp p, dpSimpExprProp = p }
+
+
+-- | Class goals go on the left, numeric goals go on the right.
+numericRight :: Goal -> Either Goal (Goal, Prop)
+numericRight g  = case exportProp (goal g) of
+                    Just p  -> Right (g, p)
+                    Nothing -> Left g
+
+
+
+
+-- | Simplify a bunch of well-defined properties.
+--  * Eliminates properties that are implied by the rest.
+--  * Does not modify the set of assumptions.
+simplifyProps :: Solver -> [DefinedProp Goal] -> IO [Goal]
+simplifyProps s props =
+  debugBlock s "Simplifying properties" $
+  withScope s (go [] (eliminateSimpleGEQ props))
+  where
+  go survived [] = return survived
+
+  go survived (DefinedProp { dpSimpProp = SimpProp PTrue } : more) =
+                                                          go survived more
+
+  go survived (p : more) =
+    case dpSimpProp p of
+      SimpProp PTrue -> go survived more
+      SimpProp p' ->
+        do mbProved <- withScope s $
+             do mapM_ (assert s) more
+                e <- getIntervals s
+                case e of
+                  Left _     -> return Nothing
+                  Right ints -> do b <- prove s p'
+                                   return (Just (ints,b))
+           case mbProved of
+             Just (_,True)  -> go survived more
+
+             Just (ints,False) ->
+               debugLog s ("Using the fin solver:" ++ show (pp (goal (dpData p)))) >>
+               case cryIsFin ints (dpData p) of
+                 Solved _ gs' ->
+                   do debugLog s "solved"
+                      let more' = [ knownDefined g | Right g <- map numericRight gs' ]
+                      go survived (more' ++ more)
+                 Unsolved ->
+                   do debugLog s "unsolved"
+                      assert s p
+                      go (dpData p : survived) more
+
+                 Unsolvable ->
+                   do debugLog s "unsolvable"
+                      go (dpData p:survived) more
+
+             Nothing -> go (dpData p:survived) more
+
+
+{- | Simplify easy less-than-or-equal-to and equal-to goals.
+Those are common with long lists of literals, so we have special handling
+for them.  In particular:
+
+  * Reduce goals of the form @(a >= k1, a >= k2, a >= k3, ...)@ to
+   @a >= max (k1, k2, k3, ...)@, when all the k's are constant.
+
+  * Eliminate goals of the form @ki >= k2@, when @k2@ is leq than @k1@.
+
+  * Eliminate goals of the form @a >= 0@.
+
+NOTE:  This assumes that the goals are well-defined.
+-}
+eliminateSimpleGEQ :: [DefinedProp a] -> [DefinedProp a]
+eliminateSimpleGEQ = go Map.empty []
+  where
+
+  go geqs other (g : rest) =
+    case dpSimpExprProp g of
+      K a :== K b
+        | a == b -> go geqs other rest
+
+      _ :>= K (Nat 0) ->
+          go geqs  other rest
+
+      K (Nat k1) :>= K (Nat k2)
+        | k1 >= k2 -> go geqs other rest
+
+      Var v :>= K (Nat k2) ->
+        go (addUpperBound v (k2,g) geqs) other rest
+
+      _ -> go geqs (g:other) rest
+
+  go geqs other [] = [ g | (_,g) <- Map.elems geqs ] ++ other
+
+  -- add in a possible upper bound for var
+  addUpperBound var g = Map.insertWith cmp var g
+    where
+    cmp a b | fst a > fst b = a
+            | otherwise     = b
+
+
+
+
+
+-- | Add the given constraints as assumptions.
+--  * We assume that the constraints are well-defined.
+--  * Modifies the set of assumptions.
+assumeProps :: Solver -> [Cry.Prop] -> IO [SimpProp]
+assumeProps s props =
+  do let ps = [ (p,p') | p       <- props
+                       , Just p' <- [exportProp p] ]
+
+     let defPs = [ (p,cryDefinedProp p') | (p,p') <- ps ]
+
+     let simpProps = map knownDefined (defPs ++ ps)
+     mapM_ (assert s) simpProps
+     return (map dpSimpProp simpProps)
+  -- XXX: Instead of asserting one at a time, perhaps we should
+  -- assert a conjunction.  That way, we could simplify the whole thing
+  -- in one go, and would avoid having to assert 'true' many times.
+
+
+
+
+-- | Given a list of propositions that together lead to a contradiction,
+-- find a sub-set that still leads to a contradiction (but is smaller).
+minimizeContradictionSimpDef :: HasProp a => Solver -> [DefinedProp a] -> IO [a]
+minimizeContradictionSimpDef s ps = start [] ps
+  where
+  start bad todo =
+    do res <- SMT.check (solver s)
+       case res of
+         SMT.Unsat -> return (map dpData bad)
+         _         -> do solPush s
+                         go bad [] todo
+
+  go _ _ [] = panic "minimizeContradiction"
+               $ ("No contradiction" : map (show . ppProp . dpSimpExprProp) ps)
+  go bad prev (d : more) =
+    do assert s d
+       res <- SMT.check (solver s)
+       case res of
+         SMT.Unsat -> do solPop s
+                         assert s d
+                         start (d : bad) prev
+         _ -> go bad (d : prev) more
+
+
+
+{- | Attempt to find a substituion that, when applied, makes all of the
+given properties hold. -}
+getModel :: Solver -> [Cry.Prop] -> IO (Maybe Cry.Subst)
+getModel s props = withScope s $
+  do ps  <- assumeProps s props
+     res <- SMT.check (solver s)
+     let vars = Set.toList $ Set.unions $ map (cryPropFVS . unSimpProp) ps
+
+     case res of
+       SMT.Sat ->
+          do vs <- getVals (solver s) vars
+             -- This is guaranteed to be a model only for the *linear*
+             -- properties, so now we check if it works for the rest too.
+
+             let su1  = fmap K vs
+                 ps1  = [ fromMaybe p (apSubst su1 p) | SimpProp p <- ps ]
+                 ok p = case crySimplify p of
+                          PTrue -> True
+                          _     -> False
+
+                 su2 = Cry.listSubst
+                          [ (x, numTy v) | (UserName x, v) <- Map.toList vs ]
+
+             return (guard (all ok ps1) >> return su2)
+
+
+       _ -> return Nothing
+
+
+  where
+  numTy Inf     = Cry.tInf
+  numTy (Nat k) = Cry.tNum k
+
+--------------------------------------------------------------------------------
+
+
+-- | An SMT solver, and some info about declared variables.
+data Solver = Solver
+  { solver    :: SMT.Solver
+    -- ^ The actual solver
+
+  , declared  :: IORef VarInfo
+    -- ^ Information about declared variables, and assumptions in scope.
+
+  , logger    :: SMT.Logger
+    -- ^ For debugging
+  }
+
+
+-- | Keeps track of declared variables and non-linear terms.
+data VarInfo = VarInfo
+  { curScope    :: Scope
+  , otherScopes :: [Scope]
+  } deriving Show
+
+data Scope = Scope
+  { scopeNames    :: [Name]
+    -- ^ Variables declared in this scope (not counting the ones from
+    -- previous scopes).
+
+  , scopeNonLinS  :: NonLinS
+    {- ^ These are the non-linear terms mentioned in the assertions
+    that are currently asserted (including ones from previous scopes). -}
+
+  , scopeIntervals :: Either Cry.TVar (Map.Map Cry.TVar Interval)
+    -- ^ Either a type variable that makes the asserted properties unsatisfiable
+    -- (due to a broken interval), or the current set of intervals for type
+    -- variables. If a variable is not in the interval map, its value can be
+    -- anything.
+    --
+    -- This includes all intervals from previous scopes.
+
+  , scopeAsserted  :: [Cry.Prop]
+    -- ^ This is the set of currently-asserted cryptol properties only in this
+    -- scope.
+    --
+    -- This includes all asserted props from previous scopes.
+  } deriving Show
+
+scopeEmpty :: Scope
+scopeEmpty = Scope { scopeNames = [], scopeNonLinS = initialNonLinS
+                   , scopeIntervals = Right Map.empty, scopeAsserted = [] }
+
+scopeElem :: Name -> Scope -> Bool
+scopeElem x Scope { .. } = x `elem` scopeNames
+
+scopeInsert :: Name -> Scope -> Scope
+scopeInsert x Scope { .. } = Scope { scopeNames = x : scopeNames, .. }
+
+scopeAssertNew :: Cry.Prop -> Scope -> Scope
+scopeAssertNew prop Scope { .. } =
+  Scope { scopeIntervals = ints'
+        , scopeAsserted  = props
+        , .. }
+
+  where
+  props = prop : scopeAsserted
+  ints' = case scopeIntervals of
+            Left tv    -> Left tv
+            Right ints -> case computePropIntervals ints props of
+                            NoChange           -> scopeIntervals
+                            NewIntervals is    -> Right is
+                            InvalidInterval tv -> Left tv
+
+
+-- | Given a *simplified* prop, separate linear and non-linear parts
+-- and return the linear ones.
+scopeAssertSimpProp :: SimpProp -> Scope -> ([SimpProp],Scope)
+scopeAssertSimpProp (SimpProp p) Scope { .. } =
+  let (ps1,s1) = nonLinProp scopeNonLinS p
+  in (map SimpProp ps1, Scope { scopeNonLinS = s1, ..  })
+
+
+scopeAssert :: HasProp a => DefinedProp a -> Scope -> ([SimpProp],Scope)
+scopeAssert DefinedProp { .. } s =
+  let (ps1,s1) = scopeAssertSimpProp dpSimpProp s
+   in (ps1,scopeAssertNew (getProp dpData) s1)
+
+
+-- | No scopes.
+viEmpty :: VarInfo
+viEmpty = VarInfo { curScope = scopeEmpty, otherScopes = [] }
+
+-- | Check if a name is any of the scopes.
+viElem :: Name -> VarInfo -> Bool
+viElem x VarInfo { .. } = any (x `scopeElem`) (curScope : otherScopes)
+
+-- | Add a name to a scope.
+viInsert :: Name -> VarInfo -> VarInfo
+viInsert x VarInfo { .. } = VarInfo { curScope = scopeInsert x curScope, .. }
+
+-- | Add an assertion to the current scope. Returns the linear part.
+viAssertSimpProp :: SimpProp -> VarInfo -> (VarInfo, [SimpProp])
+viAssertSimpProp p VarInfo { .. } = ( VarInfo { curScope = s1, .. }, p1)
+  where (p1, s1) = scopeAssertSimpProp p curScope
+
+viAssert :: HasProp a => DefinedProp a -> VarInfo -> (VarInfo, [SimpProp])
+viAssert d VarInfo { .. } = (VarInfo { curScope = s1, .. },p1)
+  where (p1, s1) = scopeAssert d curScope
+
+-- | Enter a scope.
+viPush :: VarInfo -> VarInfo
+viPush VarInfo { .. } =
+  VarInfo { curScope = scopeEmpty { scopeNonLinS   = scopeNonLinS curScope
+                                  , scopeAsserted  = scopeAsserted curScope
+                                  , scopeIntervals = scopeIntervals curScope }
+          , otherScopes = curScope : otherScopes
+          }
+
+-- | Exit a scope.
+viPop :: VarInfo -> VarInfo
+viPop VarInfo { .. } = case otherScopes of
+                         c : cs -> VarInfo { curScope = c, otherScopes = cs }
+                         _ -> panic "viPop" ["no more scopes"]
+
+
+-- | All declared names, that have not been "marked".
+-- These are the variables whose values we are interested in.
+viUnmarkedNames :: VarInfo -> [ Name ]
+viUnmarkedNames VarInfo { .. } = concatMap scopeNames scopes
+  where scopes      = curScope : otherScopes
+
+
+getIntervals :: Solver -> IO (Either Cry.TVar (Map Cry.TVar Interval))
+getIntervals Solver { .. } =
+  do vi <- readIORef declared
+     return (scopeIntervals (curScope vi))
+
+
+-- | All known non-linear terms.
+getNLSubst :: Solver -> IO Subst
+getNLSubst Solver { .. } =
+  do VarInfo { .. } <- readIORef declared
+     return $ nonLinSubst $ scopeNonLinS curScope
+
+-- | Execute a computation with a fresh solver instance.
+withSolver :: SolverConfig -> (Solver -> IO a) -> IO a
+withSolver SolverConfig { .. } k =
+  do logger <- if solverVerbose > 0 then SMT.newLogger 0 else return quietLogger
+
+
+     let smtDbg = if solverVerbose > 1 then Just logger else Nothing
+     solver <- SMT.newSolver solverPath solverArgs smtDbg
+     _ <- SMT.setOptionMaybe solver ":global-decls" "false"
+     SMT.setLogic solver "QF_LIA"
+     declared <- newIORef viEmpty
+     a <- k Solver { .. }
+     _ <- SMT.stop solver
+
+     return a
+
+  where
+  quietLogger = SMT.Logger { SMT.logMessage = \_ -> return ()
+                           , SMT.logLevel   = return 0
+                           , SMT.logSetLevel= \_ -> return ()
+                           , SMT.logTab     = return ()
+                           , SMT.logUntab   = return ()
+                           }
+
+solPush :: Solver -> IO ()
+solPush Solver { .. } =
+  do SMT.push solver
+     SMT.logTab logger
+     modifyIORef' declared viPush
+
+solPop :: Solver -> IO ()
+solPop Solver { .. } =
+  do modifyIORef' declared viPop
+     SMT.logUntab logger
+     SMT.pop solver
+
+-- | Execute a computation in a new solver scope.
+withScope :: Solver -> IO a -> IO a
+withScope s k =
+  do solPush s
+     a <- k
+     solPop s
+     return a
+
+-- | Declare a variable.
+declareVar :: Solver -> Name -> IO ()
+declareVar s@Solver { .. } a =
+  do done <- fmap (a `viElem`) (readIORef declared)
+     unless done $
+       do e  <- SMT.declare solver (smtName a)    SMT.tInt
+          let fin_a = smtFinName a
+          fin <- SMT.declare solver fin_a SMT.tBool
+          SMT.assert solver (SMT.geq e (SMT.int 0))
+
+          nlSu <- getNLSubst s
+          modifyIORef' declared (viInsert a)
+          case Map.lookup a nlSu of
+            Nothing -> return ()
+            Just e'  ->
+              do let finDef = crySimplify (Fin e')
+                 mapM_ (declareVar s) (Set.toList (cryPropFVS finDef))
+                 SMT.assert solver $
+                    SMT.eq fin (ifPropToSmtLib (desugarProp finDef))
+
+
+
+-- | Add an assertion to the current context.
+-- INVARIANT: Assertion is simplified.
+assert :: HasProp a => Solver -> DefinedProp a -> IO ()
+assert _               DefinedProp { dpSimpProp = SimpProp PTrue } = return ()
+assert s@Solver { .. } def@DefinedProp { dpSimpProp = p } =
+  do debugLog s ("Assuming: " ++ show (ppProp (unSimpProp p)))
+     a <- getIntervals s
+     debugLog s ("Intervals before:" ++ show (either pp ppIntervals a))
+     ps1' <- atomicModifyIORef' declared (viAssert def)
+     b <- getIntervals s
+     debugLog s ("Intervals after:" ++ show (either pp ppIntervals b))
+     let ps1 = map unSimpProp ps1'
+         vs  = Set.toList $ Set.unions $ map cryPropFVS ps1
+     mapM_ (declareVar s) vs
+     mapM_ (SMT.assert solver . ifPropToSmtLib . desugarProp) ps1
+
+
+-- | Add an assertion to the current context.
+-- INVARIANT: Assertion is simplified.
+assertSimpProp :: Solver -> SimpProp -> IO ()
+assertSimpProp _ (SimpProp PTrue) = return ()
+assertSimpProp s@Solver { .. } p@(SimpProp p0) =
+  do debugLog s ("Assuming: " ++ show (ppProp p0))
+     ps1' <- atomicModifyIORef' declared (viAssertSimpProp p)
+     let ps1 = map unSimpProp ps1'
+         vs  = Set.toList $ Set.unions $ map cryPropFVS ps1
+     mapM_ (declareVar s) vs
+     mapM_ (SMT.assert solver . ifPropToSmtLib . desugarProp) ps1
+
+
+-- | Try to prove a property.  The result is 'True' when we are sure that
+-- the property holds, and 'False' otherwise.  In other words, getting `False`
+-- *does not* mean that the proposition does not hold.
+prove :: Solver -> Prop -> IO Bool
+prove _ PTrue  = return True
+prove s@Solver { .. } p =
+  debugBlock s ("Proving: " ++ show (ppProp p)) $
+  withScope s $
+  do assertSimpProp s (simpProp (Not p))
+     res <- SMT.check solver
+     case res of
+       SMT.Unsat   -> debugLog s "Proved" >> return True
+       SMT.Unknown -> debugLog s "Not proved" >> return False -- We are not sure
+       SMT.Sat     -> debugLog s "Not proved" >> return False
+        -- XXX: If the answer is Sat, it is possible that this is a
+        -- a fake example, as we need to evaluate the nonLinear constraints.
+        -- If they are all satisfied, then we have a genuine counter example.
+        -- Otherwise, we could look for another one...
+
+
+{- | Check if the current set of assumptions is satisfiable, and find
+some facts that must hold in any models of the current assumptions.
+
+Returns `Nothing` if the currently asserted constraints are known to
+be unsatisfiable.
+
+Returns `Just (su, sub-goals)` is the current set is satisfiable.
+  * The `su` is a substitution that may be applied to the current constraint
+    set without loosing generality.
+  * The `sub-goals` are additional constraints that must hold if the
+    constraint set is to be satisfiable.
+-}
+check :: Solver -> IO (Maybe (Subst, [Prop]))
+check s@Solver { .. } =
+  do e <- getIntervals s
+     case e of
+
+       Left tv ->
+         do debugLog s ("Invalid interval: " ++ show (pp tv))
+            return Nothing
+
+       Right ints ->
+         do debugLog s ("Intervals:" ++ show (ppIntervals ints))
+            res <- SMT.check solver
+            case res of
+
+              SMT.Unsat   ->
+               do debugLog s "Not satisfiable"
+                  return Nothing
+
+              SMT.Unknown ->
+               do debugLog s "Unknown"
+                  return (Just (Map.empty, []))
+
+              SMT.Sat     ->
+               do debugLog s "Satisfiable"
+                  (impMap,sideConds) <- debugBlock s "Computing improvements"
+                                            (getImpSubst s)
+                  return (Just (impMap, sideConds))
+
+
+
+{- | Assuming that we are in a satisfiable state, try to compute an
+improving substitution.  We also return additional constraints that must
+hold for the currently asserted propositions to hold.
+-}
+getImpSubst :: Solver -> IO (Subst,[Prop])
+getImpSubst s@Solver { .. } =
+  do names <- viUnmarkedNames `fmap` readIORef declared
+     m     <- getVals solver names
+     (impSu,sideConditions) <- cryImproveModel solver logger m
+
+     nlSu <- getNLSubst s
+
+     let isNonLinName (SysName {})  = True
+         isNonLinName (UserName {}) = False
+
+         (nlFacts, vFacts) = Map.partitionWithKey (\k _ -> isNonLinName k) impSu
+
+         (vV, vNL)  = Map.partition noNLVars vFacts
+
+         nlSu1  = fmap (doAppSubst vV) nlSu
+
+         (vNL_su,vNL_eqs) = Map.partitionWithKey goodDef
+                          $ fmap (doAppSubst nlSu1) vNL
+
+         nlSu2 = fmap (doAppSubst vNL_su) nlSu1
+         nlLkp x = case Map.lookup x nlSu2 of
+                     Just e  -> e
+                     Nothing -> panic "getImpSubst"
+                                [ "Missing NL variable:", show x ]
+
+         allSides =
+           [ Var a   :== e                  | (a,e) <- Map.toList vNL_eqs ] ++
+           [ nlLkp x :== doAppSubst nlSu2 e | (x,e) <- Map.toList nlFacts ] ++
+           [ doAppSubst nlSu2 si            | si    <- sideConditions ]
+
+         theImpSu = composeSubst vNL_su vV
+
+     debugBlock s "Improvments" $
+       do debugBlock s "substitution" $
+            mapM_ (debugLog s . dump) (Map.toList theImpSu)
+          debugBlock s "side-conditions" $ debugLog s allSides
+
+
+     return (theImpSu, allSides)
+
+
+  where
+  goodDef k e = not (k `Set.member` cryExprFVS e)
+
+  isNLVar (SysName _) = True
+  isNLVar _           = False
+
+  noNLVars e = all (not . isNLVar) (cryExprFVS e)
+
+  dump (x,e) = show (ppProp (Var x :== e))
+
+--------------------------------------------------------------------------------
+
+debugBlock :: Solver -> String -> IO a -> IO a
+debugBlock s@Solver { .. } name m =
+  do debugLog s name
+     SMT.logTab logger
+     a <- m
+     SMT.logUntab logger
+     return a
+
+class DebugLog t where
+  debugLog :: Solver -> t -> IO ()
+
+  debugLogList :: Solver -> [t] -> IO ()
+  debugLogList s ts = case ts of
+                        [] -> debugLog s "(none)"
+                        _  -> mapM_ (debugLog s) ts
+
+instance DebugLog Char where
+  debugLog s x     = SMT.logMessage (logger s) (show x)
+  debugLogList s x = SMT.logMessage (logger s) x
+
+instance DebugLog a => DebugLog [a] where
+  debugLog = debugLogList
+
+instance DebugLog a => DebugLog (Maybe a) where
+  debugLog s x = case x of
+                   Nothing -> debugLog s "(nothing)"
+                   Just a  -> debugLog s a
+
+instance DebugLog Doc where
+  debugLog s x = debugLog s (show x)
+
+instance DebugLog Cry.Type where
+  debugLog s x = debugLog s (pp x)
+
+instance DebugLog Goal where
+  debugLog s x = debugLog s (goal x)
+
+instance DebugLog Cry.Subst where
+  debugLog s x = debugLog s (pp x)
+
+instance DebugLog Prop where
+  debugLog s x = debugLog s (ppProp x)
 
 
 
diff --git a/src/Cryptol/TypeCheck/Solver/Eval.hs b/src/Cryptol/TypeCheck/Solver/Eval.hs
deleted file mode 100644
--- a/src/Cryptol/TypeCheck/Solver/Eval.hs
+++ /dev/null
@@ -1,529 +0,0 @@
--- |
--- Module      :  $Header$
--- Copyright   :  (c) 2013-2015 Galois, Inc.
--- License     :  BSD3
--- Maintainer  :  cryptol@galois.com
--- Stability   :  provisional
--- Portability :  portable
---
--- We define the behavior of Cryptol's type-level functions on
--- integers.
-
-{-# LANGUAGE PatternGuards #-}
-{-# LANGUAGE Safe #-}
-module Cryptol.TypeCheck.Solver.Eval where
-
-import           Cryptol.TypeCheck.AST
-import           Cryptol.TypeCheck.Solver.InfNat
-import           Cryptol.TypeCheck.Solver.FinOrd
-import           Cryptol.TypeCheck.Solver.Interval
-import           Cryptol.TypeCheck.Solver.Utils(splitConstSummand)
-
-import           Data.List(sortBy)
-
---------------------------------------------------------------------------------
--- Simplify a type
--- NOTE: These functions assume zonked types.
-
-{- DO THIS
--- XXX
-reAssocArgs :: OrdFacts -> TFun -> [Type] -> [Type]
-reAssocArgs info TCAdd [ t1, TCon (TF TCAdd) [t2, t3]]
-  | Just t4 <- tfAdd info t1 t2  = reAssocArgs info TCAdd [t4,t3]
-
-reAssocArgs _ TCAdd [ TCon (TF TCAdd) [t1, t2], t3] = [ t1, t2 .+. t3 ]
-
-reAssocArgs info TCMul [ t1, TCon (TF TCMul) [t2, t3]]
-  | Just t4 <- tfMul info t1 t2   = reAssocArgs info TMul [t4, t3]
-
-reAssocArgs _ TCMul [ TCon (TF TCMul) [t1, t2], t3] = [ t1, t2 .*. t3 ]
-
-reAssocArgs _ _ ts = ts
--}
-
---------------------------------------------------------------------------------
-
-{- | Collect `fin` and simple `<=` constraints in the ord model
-Returns `Left` if we find a goal which is incompatible with the others.
-Otherwise, we return `Right` with a model, and the remaining
-(i.e., the non-order related) properties.
-
-These sorts of facts are quite useful during type simplification, because
-they provide information which potentially useful for cancellation
-(e.g., this variables is finite and not 0)
--}
-assumedOrderModel :: OrdFacts -> [Prop] ->
-                        Either (OrdFacts,Prop) (OrdFacts, [Prop])
-
-assumedOrderModel m0 todo = go m0 [] False (map (simpType m0) todo)
-  where
-  go m others changes []
-    | changes   = assumedOrderModel m others
-    | otherwise =
-      case concatMap (derivedOrd m) others of
-        []      -> Right (m, others)
-        derived -> case assumedOrderModel m derived of
-                     Left err -> Left err
-                     Right (m1,os) -> Right (m1,os++others)
-
-  go m others changes (g : gs) =
-    case addFact g m of
-      OrdAlreadyKnown   -> go m  others changes gs
-      OrdAdded m1       -> go m1 others True gs
-      OrdCannot         -> go m (g : others) changes gs
-      OrdImprove t1 t2  -> go m ((t1 =#= t2) : others) changes gs
-      OrdImpossible     -> Left (m,g)
-
-
--- | This returns order properties that are implied by the give property.
--- It is important that the returned properties are propoer ordering 
--- properties (i.e., `addFact` will not return `OrdCannot`).
-derivedOrd :: OrdFacts -> Prop -> [Prop]
-derivedOrd m prop =
-  case prop of
-    TUser _ _ p -> derivedOrd m p
-
-    TCon (PC PGeq) [TVar x, t2] | notSimple t2 -> lowerCt x (typeInterval m t2)
-    TCon (PC PGeq) [t1,TVar x] | notSimple t1  -> upperCt x (typeInterval m t1)
-    TCon (PC PEqual) [TVar x, t]
-      | notSimple t -> equalCt x (typeInterval m t)
-    TCon (PC PEqual) [t, TVar x]
-      | notSimple  t -> equalCt x (typeInterval m t)
-    _ -> []
-
-  where
-  notSimple = not . isSimpleType
-  equalCt x i = lowerCt x i ++ upperCt x i
-  lowerCt x i = [ TVar x >== fromNat' (lowerBound i) ]
-  upperCt x i = case upperBound i of
-                  Nat n -> [ tNum n >== TVar x ]
-                  Inf | isFinite i -> [ pFin (TVar x) ]
-                      | otherwise  -> []
-
-isSimpleType :: Type -> Bool
-isSimpleType (TCon (TC TCInf) _)      = True
-isSimpleType (TCon (TC (TCNum _)) _)  = True
-isSimpleType (TVar _)                 = True
-isSimpleType _                        = False
-
-
---------------------------------------------------------------------------------
-
-
--- Performs only forward evaluation.
-simpType :: OrdFacts -> Type -> Type
-simpType i ty =
-  case ty of
-    TUser f ts t   -> TUser f (map (simpType i) ts) (simpType i t)
-    TCon (TF f) ts -> let ts1 = reorderArgs f (map (simpType i) ts)
-                      in case evalTFun i f ts1 of
-                           Nothing -> TCon (TF f) ts1
-                           Just t1 -> simpType i t1
-    TCon tc ts     -> TCon tc (map (simpType i) ts)
-    TRec fs        -> TRec [ (l,simpType i t) | (l,t) <- fs ]
-    _              -> ty
-
-reorderArgs :: TFun -> [Type] -> [Type]
-reorderArgs TCAdd ts = commuteArgs ts
-reorderArgs TCMul ts = commuteArgs ts
-reorderArgs _ ts     = ts
-
--- Move constants to the front, followed by free variables, followed by
--- bound variables, followed by other expressions.
-commuteArgs :: [Type] -> [Type]
-commuteArgs = sortBy cmp
-  where
-  cmp (TCon (TC (TCNum x)) _) (TCon (TC (TCNum y)) _) = compare x y
-  cmp (TCon (TC (TCNum _)) _) _                       = LT
-  cmp _                       (TCon (TC (TCNum _)) _) = GT
-
-  cmp (TCon (TC TCInf) _) (TCon (TC TCInf) _) = EQ
-  cmp (TCon (TC TCInf) _) _                   = LT
-  cmp _                   (TCon (TC TCInf) _) = GT
-
-  cmp (TVar x) (TVar y)   = compare x y
-  cmp (TVar _) _          = LT
-  cmp _         (TVar _)  = GT
-
-  cmp _ _                 = EQ
-
-
-evalTFun :: OrdFacts -> TFun -> [Type] -> Maybe Type
-evalTFun i tfun args =
-  case (tfun, args) of
-    (TCAdd, [t1,t2])             -> tfAdd i t1 t2
-    (TCSub, [t1,t2])             -> tfSub i t1 t2
-    (TCMul, [t1,t2])             -> tfMul i t1 t2
-    (TCDiv, [t1,t2])             -> tfDiv i t1 t2
-    (TCMod, [t1,t2])             -> tfMod i t1 t2
-    (TCExp, [t1,t2])             -> tfExp i t1 t2
-    (TCMin, [t1,t2])             -> tfMin i t1 t2
-    (TCMax, [t1,t2])             -> tfMax i t1 t2
-    (TCLg2, [t1])                -> tfLg2 i t1
-    (TCWidth, [t1])              -> tfWidth i t1
-    (TCLenFromThen,  [t1,t2,t3]) -> tfLenFromThen   i t1 t2 t3
-    (TCLenFromThenTo,[t1,t2,t3]) -> tfLenFromThenTo i t1 t2 t3
-
-    _                            -> Nothing
-
-
-
-
-typeInterval :: OrdFacts -> Type -> Interval
-typeInterval i = go . simpType i
-  where
-  go ty =
-    case ty of
-      TVar {}     -> knownInterval i ty
-      TUser _ _ t -> go t
-      TCon (TC (TCNum x)) _ -> iConst (Nat x)
-      TCon (TF f) ts ->
-        case (f,ts) of
-          (TCAdd,   [t1,t2]) -> iAdd (go t1) (go t2)
-          (TCSub,   [t1,t2]) -> iSub (go t1) (go t2)
-          (TCMul,   [t1,t2]) -> iMul (go t1) (go t2)
-          (TCDiv,   [t1,t2]) -> iDiv (go t1) (go t2)
-          (TCMod,   [t1,t2]) -> iMod (go t1) (go t2)
-          (TCExp,   [t1,t2]) -> iExp (go t1) (go t2)
-          (TCLg2,   [t1])    -> iLg2 (go t1)
-          (TCWidth, [t1])    -> iWidth (go t1)
-
-          (TCLenFromThen,  [t1,t2,t3]) -> iLenFromThen   (go t1) (go t2) (go t3)
-          (TCLenFromThenTo,[t1,t2,t3]) -> iLenFromThenTo (go t1) (go t2) (go t3)
-
-          _                  -> anything
-      _ -> anything
-
-typeKnownLeq :: OrdFacts -> Type -> Type -> Bool
-typeKnownLeq _ _ (TCon (TC TCInf) _)     = True
-typeKnownLeq _ (TCon (TC (TCNum 0)) _) _ = True
-
-typeKnownLeq _ t1 t2 | t1 == t2          = True
-
-typeKnownLeq m t1 t2 | upperBound i1 <= lowerBound i2  = True
-  where i1 = typeInterval m t1
-        i2 = typeInterval m t2
-
-typeKnownLeq _ t1 t2
-  | Just (_,t2') <- splitConstSummand t2, t1 == t2' = True
-
-typeKnownLeq m t1 t2 = isKnownLeq m t1 t2
-
-typeKnownFin :: OrdFacts -> Type -> Bool
-typeKnownFin m t = isFinite (typeInterval m t)
-
-
-
---------------------------------------------------------------------------------
-
-tfAdd :: OrdFacts -> Type -> Type -> Maybe Type
-tfAdd m t1 t2
-  | Just Inf      <- arg1 = Just tInf
-
-  | Just (Nat 0)  <- arg1 = Just t2
-
-  | Just Inf      <- arg2 = Just tInf
-
-  | Just (Nat 0)  <- arg2 = Just t1
-
-  | Just (Nat x)  <- arg1
-  , Just (Nat y)  <- arg2 = Just $ tNum $ x + y
-
-  -- k1 + (k2 + t)  = (k1 + k1) + t
-  | Just (Nat k1) <- arg1
-  , TCon (TF TCAdd) [ s1, s2 ] <- tNoUser t2
-  , Just (Nat k2) <- toNat' s1  = Just $ tNum (k1 + k2) .+. s2
-
-  -- Simplification for `k1 + (t - k2)`
-  -- This is only OK as long as we know that `t - k2` is well-defined.
-  | Just (Nat x)               <- arg1
-  , TCon (TF TCSub) [ s1, s2 ] <- t2
-  , Just (Nat y)               <- toNat' s2
-  , let i = lowerBound (typeInterval m s1)
-  , i >= Nat y            = Just (if x >= y then tNum (x - y) .+. s1
-                                            else s1 .-. tNum (y - x))
-
-  -- a + a = 2 * a
-  | t1 == t2              = Just (tNum (2 :: Int) .*. t1)
-
-  -- k * a + a = (k + 1) * a
-  | TCon (TF TCMul) [s1,s2] <- tNoUser t1
-  , Just x <- toNat' s1
-  , s2 == t2              = factorConst x (Nat 1) t2
-
-  -- a + k * a = (k + 1) * a
-  | TCon (TF TCMul) [s1,s2] <- tNoUser t2
-  , Just x <- toNat' s1
-  , s2 == t1              = factorConst x (Nat 1) t1
-
-  -- k1 * a + k2 * a = (k1 + k1) * a
-  | TCon (TF TCMul) [s1,s2] <- tNoUser t1
-  , Just x <- toNat' s1
-  , TCon (TF TCMul) [p1,p2] <- tNoUser t2
-  , Just y <- toNat' p1
-  , s2 == p2              = factorConst x y p1
-
-
-  | otherwise             = Nothing
-
-  where arg1 = toNat' t1
-        arg2 = toNat' t2
-
-        factorConst k1 k2 t = Just $ fromNat' (nAdd k1 k2) .*. t
-
-
-
-{- | @tfSub x y = Just z@ iff @z@ is the unique value such that 
-@tfAdd y z = Just x@ -}
-tfSub :: OrdFacts -> Type -> Type -> Maybe Type
-tfSub i t1 t2
-  | Just (Nat 0) <- arg2  = Just t1
-
-  | Just Inf <- arg1
-  , typeKnownFin i t2       = Just tInf
-
-  -- k1 - k2
-  | Just (Nat x) <- arg1
-  , Just (Nat y) <- arg2
-  , x >= y                = Just $ tNum (x - y)
-
-  -- (x - y) - z  = x - (y + z)
-  | TCon (TF TCSub) [s1,s2] <- t1 = Just (s1 .-. (s2 .+. t2))
-
-  -- (k1 + t) - k2
-  | TCon (TF TCAdd) [s1,s2] <- t1
-  , Just k1 <- toNat' s1
-  , Just k2 <- arg2   = case (nSub k1 k2, nSub k2 k1) of
-
-                          -- = (k1 - k2) + t
-                          (Just a, _) -> Just (fromNat' a .+. s2)
-
-                          -- = t - (k2 - k1)
-                          (_, Just a) -> Just (s2 .-. fromNat' a)
-
-                          _ -> Nothing
-
-  | otherwise             = Nothing
-
-
-  where arg1 = toNat' t1
-        arg2 = toNat' t2
-
-
--- | It is important that the 0 rules come before the `Inf` ones
-tfMul :: OrdFacts -> Type -> Type -> Maybe Type
-tfMul i t1 t2
-  | Just (Nat 0) <- arg1  = Just t1
-
-
-  | Just (Nat 1) <- arg1  = Just t2
-
-  | Just (Nat 0) <- arg2  = Just t2
-
-  | Just (Nat 1) <- arg2  = Just t1
-
-  | Just Inf     <- arg1
-  , oneOrMore i t2        = Just tInf
-
-  | Just Inf     <- arg2
-  , oneOrMore i t1        = Just tInf
-
-  | Just (Nat x) <- arg1
-  , Just (Nat y) <- arg2  = Just $ tNum $ x * y
-
-  -- k1 * (k2 * t)  = (k1 * k2) * t
-  | Just k1 <- arg1
-  , TCon (TF TCMul) [s1,s2] <- t2
-  , Just k2 <- toNat' s1  = Just $ fromNat' (nMul k1 k2) .*. s2
-
-  | otherwise             = Nothing
-
-  where arg1 = toNat' t1
-        arg2 = toNat' t2
-
-{- y * q + r = x
-x / y = q with remainder r
-0 <= r && r < y -}
-tfDiv :: OrdFacts -> Type -> Type -> Maybe Type
-tfDiv i t1 t2
-  | Just (Nat 1) <- arg2      = Just t1
-
-  | Just Inf     <- arg2
-  , typeKnownFin i t1           = Just $ tNum (0 :: Int)
-
-  | Just (Nat 0) <- arg1
-  , Nat 1 <= lowerBound iT2   = Just $ tNum (0 :: Int)
-
-  | Just Inf <- arg1
-  , Nat 1 <= lowerBound iT2 &&
-    isFinite iT2              = Just tInf
-
-  | Just (Nat x) <- arg1
-  , Just (Nat y) <- arg2
-  , 1 <= y                   = Just $ tNum $ div x y
-
-  -- (k1 * t) / k2  = (k1/k2) * t   , as long as the division is exact
-  | TCon (TF TCMul) [ s1, s2 ] <- tNoUser t1
-  , Just k1  <- toNat' s1
-  , Just k2  <- arg2
-  , Just res <- nDiv k1 k2    = Just $ fromNat' res .*. s2
-
-  | otherwise                 = Nothing
-
-  where arg1 = toNat' t1
-        arg2 = toNat' t2
-
-        iT2  = knownInterval i t2
-
-
-tfMod :: OrdFacts -> Type -> Type -> Maybe Type
-tfMod i t1 t2
-  | Just (Nat 1) <- arg2    = Just $ tNum (0 :: Int)
-
-  | Just Inf     <- arg2
-  , typeKnownFin i t1         = Just t1
-
-  | Just (Nat 0) <- arg1
-  , Nat 1 <= lowerBound iT2 = Just $ tNum (0 :: Int)
-
-  -- There is no unique remainder in the case when we are dividing
-  -- @Inf@ by a natural number.
-
-  | Just (Nat x) <- arg1
-  , Just (Nat y) <- arg2
-  , 1 <= y                  = Just $ tNum $ mod x y
-
-  | otherwise               = Nothing
-
-  where arg1 = toNat' t1
-        arg2 = toNat' t2
-
-        iT2  = knownInterval i t2
-
-
-
-
-tfMin :: OrdFacts -> Type -> Type -> Maybe Type
-tfMin i t1 t2
-  | typeKnownLeq i t1 t2  = Just t1
-  | typeKnownLeq i t2 t1  = Just t2
-  | otherwise           = Nothing
-
-tfMax :: OrdFacts -> Type -> Type -> Maybe Type
-tfMax i t1 t2
-  | typeKnownLeq i t1 t2  = Just t2
-  | typeKnownLeq i t2 t1  = Just t1
-  | otherwise           = Nothing
-
-
--- x ^ 0        = 1
--- x ^ (n + 1)  = x * (x ^ n)
--- x ^ (m + n)  = (x ^ m) * (x ^ n)
--- x ^ (m * n)  = (x ^ m) ^ n
-tfExp :: OrdFacts -> Type -> Type -> Maybe Type
-tfExp i t1 t2
-  | Just (Nat 0) <- arg1
-  , oneOrMore i t2            = Just $ tNum (0 :: Int)
-
-  | Just (Nat 1) <- arg1      = Just $ tNum (1 :: Int)
-
-  | Just Inf <- arg1
-  , oneOrMore i t2            = Just tInf
-
-  | Just (Nat 0) <- arg2      = Just $ tNum (1 :: Int)
-
-  | Just (Nat 1) <- arg2      = Just t1
-
-  | Just Inf <- arg2
-  , twoOrMore i t1            = Just tInf
-
-  | Just (Nat x) <- arg1
-  , Just (Nat y) <- arg2      = Just $ tNum $ x ^ y
-
-  | otherwise                 = Nothing
-
-  where arg1 = toNat' t1
-        arg2 = toNat' t2
-
-
--- | Rounds up
--- @lg2 x = Just y@, if @y@ is the smallest number such that @x <= 2 ^ y@
-tfLg2 :: OrdFacts -> Type -> Maybe Type
-tfLg2 _ t
-  | Just (Nat 0) <- arg     = Just $ tNum (0 :: Int)  -- XXX: should this be defined?
-  | Just (Nat x) <- arg     = do (n,exact) <- genLog x 2
-                                 return $ tNum $ if exact then n else n + 1
-  | Just Inf     <- arg     = Just tInf
-  | otherwise               = Nothing
-
-  where arg = toNat' t
-
--- | XXX: @width@ and @lg2@ are almost the same!
--- @width n == lg2 (n + 1)@
-tfWidth :: OrdFacts -> Type -> Maybe Type
-
--- width (2 ^ a - 1) = a
-tfWidth _ ty
-  | TCon (TF TCSub) [ t1, TCon (TC (TCNum 1)) _ ] <- ty
-  , TCon (TF TCExp) [ TCon (TC (TCNum 2)) _, t2 ] <- t1 = Just t2
-
-tfWidth _ t
-  | Just (Nat x)   <- arg = return $ tNum (widthInteger x)
-  | Just Inf <- arg       = Just tInf
-  | otherwise             = Nothing
-
-  where arg = toNat' t
-
--- len [ t1, t2 .. ] : [_][t3]
-tfLenFromThen :: OrdFacts -> Type -> Type -> Type -> Maybe Type
-tfLenFromThen i t1 t2 t3
-
-  -- (t2 >= t1) => len [ t1, t2 .. ] = len [ t1, t2, .. 0 ]
-  | typeKnownLeq i t2 t1        = tfLenFromThenTo i t1 t2 (tNum (0 :: Int))
-
-  | Just x <- arg1
-  , Just y <- arg2
-  , Just z <- arg3              = fmap fromNat' (nLenFromThen x y z)
-
-  | otherwise                   = Nothing
-
-  where
-  arg1 = toNat' t1
-  arg2 = toNat' t2
-  arg3 = toNat' t3
-
-tfLenFromThenTo :: OrdFacts -> Type -> Type -> Type -> Maybe Type
-tfLenFromThenTo _ t1 t2 t3
-  | Just x <- toNat' t1
-  , Just y <- toNat' t2
-  , Just z <- toNat' t3       = fmap fromNat' (nLenFromThenTo x y z)
-
-  | otherwise = Nothing
-
-
-
-
-
---------------------------------------------------------------------------------
-
-toNat' :: Type -> Maybe Nat'
-toNat' ty =
-  case ty of
-    TUser _ _ t           -> toNat' t
-    TCon (TC TCInf) _     -> Just Inf
-    TCon (TC (TCNum x)) _ -> Just (Nat x)
-    _                     -> Nothing
-
-fromNat' :: Nat' -> Type
-fromNat' Inf = tInf
-fromNat' (Nat x) = tNum x
-
-oneOrMore :: OrdFacts -> Type -> Bool
-oneOrMore i t = typeKnownLeq i (tNum (1::Int)) t
-
-twoOrMore :: OrdFacts -> Type -> Bool
-twoOrMore i t = typeKnownLeq i (tNum (2::Int)) t
-
-
-
-
diff --git a/src/Cryptol/TypeCheck/Solver/FinOrd.hs b/src/Cryptol/TypeCheck/Solver/FinOrd.hs
deleted file mode 100644
--- a/src/Cryptol/TypeCheck/Solver/FinOrd.hs
+++ /dev/null
@@ -1,523 +0,0 @@
--- |
--- Module      :  $Header$
--- Copyright   :  (c) 2013-2015 Galois, Inc.
--- License     :  BSD3
--- Maintainer  :  cryptol@galois.com
--- Stability   :  provisional
--- Portability :  portable
---
--- This module contains machinery to reason about ordering of
--- variables, their finiteness, and their possible intervals.
-
-{-# LANGUAGE Safe #-}
-{-# LANGUAGE PatternGuards, TypeSynonymInstances #-}
-module Cryptol.TypeCheck.Solver.FinOrd
-  ( OrdFacts, AssertResult(..)
-  , noFacts, addFact
-  , isKnownLeq
-  , knownInterval
-  , ordFactsToGoals
-  , ordFactsToProps
-  , dumpDot
-  , dumpDoc
-  , IsFact(..)
-  ) where
-
-import           Cryptol.TypeCheck.Solver.InfNat
-import           Cryptol.TypeCheck.Solver.Interval
-import           Cryptol.TypeCheck.AST
-import           Cryptol.TypeCheck.InferTypes
-import           Cryptol.TypeCheck.TypeMap
-import           Cryptol.Parser.Position
-import qualified Cryptol.Utils.Panic as P
-import           Cryptol.Utils.PP(Doc,pp,vcat,text,(<+>))
-
-import           Data.Set (Set)
-import qualified Data.Set as Set
-import           Data.Map (Map)
-import qualified Data.Map as Map
-import           Data.IntMap (IntMap)
-import qualified Data.IntMap as IntMap
-import           Data.Maybe(fromMaybe,maybeToList)
-import           Control.Monad(guard)
-
--- Please change this, if renaming the module.
-panic :: String -> [String] -> a
-panic x y = P.panic ("Cryptol.TypeCheck.Solver.FinOrd." ++ x) y
-
-
--- | Add a `(>=)` or `fin` goal into the model.
--- Assumes that the types are normalized (i.e., no type functions).
-class IsFact t where
-  factProp       :: t -> Prop
-  factChangeProp :: t -> Prop -> t
-  factSource     :: t -> EdgeSrc
-
-instance IsFact Goal where
-  factProp           = goal
-  factChangeProp g p = g { goal = p }
-  factSource g       = FromGoal (goalSource g) (goalRange g)
-
-instance IsFact Prop where
-  factProp           = id
-  factChangeProp _ x = x
-  factSource _       = NoGoal
-
-addFact :: IsFact t => t -> OrdFacts -> AssertResult
-addFact g m =
-  case tNoUser (factProp g) of
-    TCon (PC PFin) [t] ->
-      let (x,m1) = nameTerm m t
-      in insertFin src x m1
-
-    TCon (PC PGeq) [t1,t2] ->
-      let (x,m1) = nameTerm m  t1
-          (y,m2) = nameTerm m1 t2
-      in insertLeq src y x m2
-
-    _ -> OrdCannot
-  where
-  src = factSource g
-
-
--- | Possible outcomes, when asserting a fact.
-data AssertResult
-  = OrdAdded OrdFacts       -- ^ We added a new fact
-  | OrdAlreadyKnown         -- ^ We already knew this
-  | OrdImprove Type Type    -- ^ Only if the two types are equal
-  | OrdImpossible           -- ^ The fact is known to be false
-  | OrdCannot               -- ^ We could not perform opertaion.
-    deriving Show
-
-
-
--- | Query if the one type is known to be smaller than, or equal to, the other.
--- Assumes that the type is simple (i.e., no type functions).
-isKnownLeq :: OrdFacts -> Type -> Type -> Bool
-isKnownLeq m t1 t2 =
-  let (x,m1) = nameTerm m  t1
-      (y,m2) = nameTerm m1 t2
-  in isLeq m2 x y
-
-
--- | Compute an interval, that we know definately contains the given type.
--- Assumes that the type is normalized (i.e., no type functions).
-knownInterval :: OrdFacts -> Type -> Interval
-knownInterval m t =
-    fromMaybe anything $
-    do a <- numType t
-       return $
-         case (cvtLower (getLowerBound m a), cvtUpper (getUpperBound m a)) of
-           (x,(y,z)) -> Interval { lowerBound = x
-                                 , upperBound = y
-                                 , isFinite   = z
-                                 }
-  where
-  cvtLower (Nat'' x) = Nat x
-  cvtLower FinNat''  = panic "knownInterval"
-                             [ "`FinNat` used as a lower bound for:"
-                             , show t
-                             ]
-  cvtLower Inf''     = Inf
-
-  cvtUpper (Nat'' x) = (Nat x, True)
-  cvtUpper FinNat''  = (Inf,   True)
-  cvtUpper Inf''     = (Inf,   False)
-
-
-ordFactsToGoals :: OrdFacts -> [Goal]
-ordFactsToGoals = ordFactsToList onlyGoals
-  where
-  onlyGoals (FromGoal c r) = Just $ \p -> Goal { goalSource = c
-                                               , goalRange = r
-                                               , goal = p }
-  onlyGoals NoGoal         = Nothing
-
-ordFactsToProps :: OrdFacts -> [Prop]
-ordFactsToProps = ordFactsToList (\_ -> Just id)
-
-
-
-ordFactsToList :: (EdgeSrc -> Maybe (Prop -> a)) -> OrdFacts -> [a]
-ordFactsToList consider (OrdFacts m ts) = concatMap getGoals (Map.toList m)
-  where
-  getGoals (ty, es) =
-    do (lower,notNum) <-
-          case ty of
-            NTNat FinNat''     -> []
-            NTNat Inf''        -> []
-            NTNat (Nat'' n)    -> guard (n > 0) >> [ (tNum n, False) ]
-            NTVar v            -> [ (TVar v,  True) ]
-            NTNamed x          -> [ (getNamed x, True) ]
-
-       Edge { target = t, eSource = src } <- Set.toList (above es)
-       f <- maybeToList (consider src)
-
-       g <- case t of
-              NTNat FinNat''     -> guard notNum >> [ pFin lower ]
-              NTNat Inf''        -> []
-              NTNat (Nat'' n)    -> guard notNum >> [ tNum n >== lower ]
-              NTVar x            -> [ TVar x >== lower ]
-              NTNamed x          -> [ getNamed x >== lower ]
-
-       return (f g)
-
-  getNamed x = case IntMap.lookup x (nameToType ts) of
-                 Just t  -> t
-                 Nothing -> panic "ordFactsToList" [ "Missing name" ]
-
-
-
-
-
-
---------------------------------------------------------------------------------
-
-
-data OrdFacts     = OrdFacts (Map NumType Edges) OrdTerms
-                    deriving Show
-
--- | Names for non-primitive terms
-data OrdTerms     = OrdTerms
-                    { typeToName :: TypeMap Int
-                      -- ^ Maps terms to their name
-
-                    , nameToType  :: IntMap Type
-                      -- ^ Maps names to terms
-
-                    , nextId  :: Int -- ^ For naming new terms.
-                    } deriving Show
-
-
-data Edges        = Edges { above :: Set Edge, below :: Set Edge }
-                    deriving Show
-
-data Edge         = Edge { target :: NumType, eSource :: EdgeSrc }
-                    deriving Show
-
--- | Where did this edge come from?
--- This is used so that we can turn edges back into goals.
-data EdgeSrc      = FromGoal ConstraintSource Range
-                  | NoGoal
-                    deriving Show
-
-instance Eq Edge where
-  x == y = target x == target y
-
-instance Ord Edge where
-  compare x y = compare (target x) (target y)
-
-{- | A varaation on `Nat'`, which allows us to support `fin` constraints:
-we add an extra element `FinNat''`, which is larger than all natural numbers,
-but smaller than infinity.  Then, we can express `fin t` as `t <= fin`.
-This is only internal to the implementation and is not visible outside
-this module. -}
-data Nat''        = Nat'' Integer
-                  | FinNat''        -- Upper bound for known finite
-                  | Inf''
-                    deriving (Eq,Ord,Show)
-
--- NOTE: It is important that constants come before variables in the
--- ordering (used in `insNode`)
-data NumType      = NTNat Nat'' | NTVar TVar | NTNamed Int
-                    deriving (Eq,Ord,Show)
-
-nameTerm :: OrdFacts -> Type -> (NumType, OrdFacts)
-nameTerm fs t | Just n <- numType t = (n, fs)
-nameTerm fs@(OrdFacts xs ts) t =
-  case lookupTM t (typeToName ts) of
-    Just n -> (NTNamed n, fs)
-    Nothing ->
-      let name = nextId ts
-          ts1  = OrdTerms { nameToType = IntMap.insert name t (nameToType ts)
-                          , typeToName = insertTM t name (typeToName ts)
-                          , nextId     = name + 1
-                          }
-
-      in (NTNamed name, OrdFacts xs ts1)
-
-zero :: NumType
-zero = NTNat (Nat'' 0)
-
--- | A finite number larger than all ordinary numbers.
--- Used to represent `fin` predicates.
-fin :: NumType
-fin = NTNat FinNat''
-
-inf :: NumType
-inf = NTNat Inf''
-
-numType :: Type -> Maybe NumType
-numType ty =
-  case tNoUser ty of
-    TCon (TC (TCNum n)) _        -> Just $ NTNat $ Nat'' n
-    TCon (TC TCInf) _            -> Just $ NTNat $ Inf''
-    TVar x | kindOf x == KNum    -> Just $ NTVar x
-    _                            -> Nothing
-
-fromNumType :: OrdTerms -> NumType -> Maybe Type
-fromNumType _ (NTVar x)         = Just (TVar x)
-fromNumType _ (NTNat Inf'')     = Just tInf
-fromNumType _ (NTNat FinNat'')  = Nothing
-fromNumType _ (NTNat (Nat'' x)) = Just (tNum x)
-fromNumType ts (NTNamed x)      = IntMap.lookup x (nameToType ts)
-
-isVar :: NumType -> Bool
-isVar (NTVar _)   = True
-isVar (NTNamed _) = True
-isVar (NTNat _)   = False
-
-noFacts :: OrdFacts
-noFacts = snd $ insNode inf
-        $ snd $ insNode fin
-        $ snd $ insNode zero
-        $ OrdFacts Map.empty OrdTerms { typeToName = emptyTM
-                                      , nameToType = IntMap.empty
-                                      , nextId     = 0
-                                      }
-
-noEdges :: Edges
-noEdges = Edges { above = Set.empty, below = Set.empty }
-
--- | Get the edges immediately above or bellow a node.
-imm :: (Edges -> Set Edge) -> OrdFacts -> NumType -> Set Edge
-imm dir (OrdFacts m _) t = maybe Set.empty dir (Map.lookup t m)
-
-
--- Try to find a path from one node to another.
-reachable :: OrdFacts -> NumType -> NumType -> Bool
-reachable m smaller larger =
-  search Set.empty (Set.singleton Edge { target = smaller, eSource = NoGoal })
-  where
-  search visited todo
-    | Just (Edge { target = term }, rest) <- Set.minView todo =
-       if term == larger
-         then True
-         else let new = imm above m term
-                  vis = Set.insert term visited
-                  notDone = Set.filter (not . (`Set.member` vis) . target)
-              in search vis (notDone new `Set.union` notDone rest)
-
-    | otherwise = False
-
-
-
-{-
-The linking function is a bit complex because we keep the ordering database
-minimal.
-
-This diagram illustrates what we do when we link two nodes (`link`).
-
-We start with a situation like on the left, and we are adding an
-edge from L to U.  The final result is illustrated on the right.
-
-   Before    After
-
-     a         a
-    /|        /
-   / |       /
-  U  |      U\
-  |  L        \L
-  | /         /
-  |/         /
-  d         d
-
-L: lower
-U: upper
-a: a member of "above uedges"  (uus)
-d: a member of "below ledges"  (lls)
--}
-
-{- XXX: It would be useful to return the edges that were removed because these
-edges can be solved in term of the existing facts, so if some of them correspond
-to wanted constrainst we can discharge them straight aways.   We still get
-the same effect in `reExamineWanteds` but in a much less effecieant way. -}
-
-
-link :: EdgeSrc -> (NumType,Edges) -> (NumType,Edges)
-      -> OrdFacts -> (Edges,Edges,OrdFacts)
-
-link src (lower, ledges) (upper, uedges) m0 =
-
-  let uus         = Set.mapMonotonic target (above uedges)
-      lls         = Set.mapMonotonic target (below ledges)
-
-      rm x        = Set.filter (not . (`Set.member` x) . target)
-
-      {- As soon as we insert someghing above a node, we remove any
-      links to `Inf''` because, inductively, the thing above will
-      already be connected -}
-      newLedges   = ledges { above = Set.insert Edge { target = upper
-                                                     , eSource = src }
-                                   $ rm (Set.insert inf uus) -- see comment
-                                   $ above ledges
-                           }
-      newUedges   = uedges { below = Set.insert Edge { target = lower
-                                                     , eSource = src }
-                                   $ rm lls
-                                   $ below uedges
-                           }
-
-      del x       = Set.delete Edge { target = x, eSource = NoGoal }
-
-      adjust f t (OrdFacts m xs) = OrdFacts (Map.adjust f t m) xs
-      insert k x (OrdFacts m xs) = OrdFacts (Map.insert k x m) xs
-      adjAbove    = adjust (\e -> e { above = del upper (above e) })
-      adjBelow    = adjust (\e -> e { below = del lower (below e) })
-      fold f xs x = Set.fold f x xs
-
-  in ( newLedges
-     , newUedges
-     , insert lower newLedges
-     $ insert upper newUedges
-     $ fold adjAbove lls
-     $ fold adjBelow uus
-       m0
-     )
-
-
-
--- | Insert a new node in a collection of facts.
--- Returns the edges surrounding the new node.
---  * Variable nodes are always linked to 0 and Inf'' (directly or indirectly).
---  * Constant nodes are always linked to neighbouring constant nodes.
-insNode :: NumType -> OrdFacts -> (Edges, OrdFacts)
-insNode t model@(OrdFacts m0 xs) =
-  case Map.splitLookup t m0 of
-    (_, Just r, _)  -> (r, model)
-    (left, Nothing, right) ->
-      let m1 = OrdFacts (Map.insert t noEdges m0) xs
-      in if isVar t
-
-         -- New variabeles are always linkes to 0 and inf.
-         then
-
-            case Map.lookup zero m0 of
-              Just zes ->
-                let (_,es1,m2@(OrdFacts m2M _)) = link NoGoal (zero,zes) (t,noEdges) m1
-                in case Map.lookup inf m2M of
-                     Just ies ->
-                        let (es2,_,m3) = link NoGoal (t,es1) (inf,ies) m2
-                        in (es2,m3)
-                     Nothing -> panic "insNode"
-                                  [ "infinity is missing from the model"
-                                  , show m0
-                                  ]
-              Nothing -> panic "insNode"
-                           [ "0 is missing from the model"
-                           , show m0
-                           ]
-
-         -- Constants are linked to their neighbours.
-         else
-
-             -- link to a smaller constnat, if any
-             let ans2@(es2, m2) =
-                   case toNum Map.findMax left of
-                     Nothing -> (noEdges,m1)
-                     Just l  ->
-                       let (_,x,y) = link NoGoal l (t,noEdges) m1
-                       in (x,y)
-
-             -- link to a larger constant, if any
-             in case toNum Map.findMin right of
-                  Nothing -> ans2
-                  Just u  ->
-                    let (x,_,y) = link NoGoal (t,es2) u m2
-                    in (x,y)
-
-  where
-  toNum f x = do guard (not (Map.null x))
-                 let it@(n,_) = f x
-                 guard (not (isVar n))
-                 return it
-
-
-isLeq :: OrdFacts -> NumType -> NumType -> Bool
-isLeq m t1 t2 = reachable m2 t1 t2
-  where (_,m1) = insNode t1 m
-        (_,m2) = insNode t2 m1
-
-
-insertLeq :: EdgeSrc -> NumType -> NumType -> OrdFacts -> AssertResult
-insertLeq _ (NTNat Inf'') (NTNat Inf'') _       = OrdAlreadyKnown
-insertLeq _ (NTNat Inf'') (NTNat FinNat'')  _   = OrdImpossible
-insertLeq _ (NTNat Inf'') (NTNat (Nat'' _)) _   = OrdImpossible
-
-insertLeq _ (NTNat FinNat'') (NTNat Inf'') _    = OrdAlreadyKnown
-insertLeq _ (NTNat FinNat'') (NTNat FinNat'') _ = OrdAlreadyKnown -- can't happen
-insertLeq _ (NTNat FinNat'') (NTNat (Nat'' _)) _= OrdImpossible   -- ditto
-
-insertLeq _ (NTNat (Nat'' _)) (NTNat Inf'') _     = OrdAlreadyKnown
-insertLeq _ (NTNat (Nat'' _)) (NTNat FinNat'')  _ = OrdAlreadyKnown
-insertLeq _ (NTNat (Nat'' x)) (NTNat (Nat'' y)) _
-  | x <= y    = OrdAlreadyKnown
-  | otherwise = OrdImpossible
-
-
-insertLeq src t1 t2 m0
-  | reachable m2 t2 t1 = case (fromNumType terms t1, fromNumType terms t2) of
-                           (Just a, Just b) -> OrdImprove a b
-                           _                -> OrdCannot  -- should not happen
-  | otherwise =
-     if reachable m2 t1 t2
-       then OrdAlreadyKnown
-       else let (_,_,m3) = link src (t1,n1) (t2,n2) m2
-            in OrdAdded m3
-  where (_,m1)   = insNode t1 m0
-        (n2,m2@(OrdFacts m2M terms))  = insNode t2 m1
-        Just n1 = Map.lookup t1 m2M
-
-insertFin :: EdgeSrc -> NumType -> OrdFacts -> AssertResult
-insertFin src t m = insertLeq src t (NTNat FinNat'') m
-
-
-getLowerBound :: OrdFacts -> NumType -> Nat''
-getLowerBound _ (NTNat n) = n
-getLowerBound fs@(OrdFacts m _) t =
-  case Map.lookup t m of
-    Nothing -> Nat'' 0
-    Just es -> case map (getLowerBound fs . target) $ Set.toList $ below es of
-                 [] -> Nat'' 0
-                 xs -> maximum xs
-
-getUpperBound :: OrdFacts -> NumType -> Nat''
-getUpperBound _ (NTNat n) = n
-getUpperBound fs@(OrdFacts m _) t =
-  case Map.lookup t m of
-    Nothing -> Inf''
-    Just es -> case map (getUpperBound fs . target) $ Set.toList $ above es of
-                 [] -> Inf''
-                 xs -> minimum xs
-
-
-
-
---------------------------------------------------------------------------------
--- Testing
-
--- | Render facts in `dot` notation. The boolean says if we want the arrows
--- to point up.
-dumpDot :: Bool -> OrdFacts -> String
-dumpDot isUp (OrdFacts m _) = "digraph {" ++ concatMap edges (Map.toList m) ++ "}"
-  where
-  edge x e = x ++ " -> " ++ node (target e) ++ "[color=\"blue\"];"
-  dir = if isUp then above else below
-  edges (x,es) = let n = node x
-                 in n ++ ";" ++
-                    concatMap (edge n) (Set.toList (dir es))
-
-  node (NTNat (Nat'' x))            = show (show x)
-  node (NTNat FinNat'')             = show "fin"
-  node (NTNat Inf'')                = show "inf"
-  node (NTVar (TVFree x _ _ _))     = show ("?v" ++ show x)
-  node (NTVar (TVBound x _))        = show ("v" ++ show x)
-  node (NTNamed x)                  = show ("<" ++ show x ++ ">")
-
-dumpDoc :: OrdFacts -> Doc
-dumpDoc = vcat . ordFactsToList mk
-  where
-  mk src = Just $ \x -> case src of
-                          NoGoal      -> text "[G]" <+> pp x
-                          FromGoal {} -> text "[W]" <+> pp x
-
diff --git a/src/Cryptol/TypeCheck/Solver/InfNat.hs b/src/Cryptol/TypeCheck/Solver/InfNat.hs
--- a/src/Cryptol/TypeCheck/Solver/InfNat.hs
+++ b/src/Cryptol/TypeCheck/Solver/InfNat.hs
@@ -1,6 +1,6 @@
 -- |
 -- Module      :  $Header$
--- Copyright   :  (c) 2013-2015 Galois, Inc.
+-- Copyright   :  (c) 2013-2016 Galois, Inc.
 -- License     :  BSD3
 -- Maintainer  :  cryptol@galois.com
 -- Stability   :  provisional
@@ -10,27 +10,53 @@
 -- element, and various arithmetic operators on them.
 
 {-# LANGUAGE Safe #-}
+{-# LANGUAGE DeriveGeneric #-}
 module Cryptol.TypeCheck.Solver.InfNat where
 
 import Data.Bits
 import Cryptol.Utils.Panic
 
+import Data.GenericTrie(TrieKey)
+import GHC.Generics(Generic)
+
 -- | Natural numbers with an infinity element
 data Nat' = Nat Integer | Inf
-            deriving (Show,Eq,Ord)
+            deriving (Show,Eq,Ord,Generic)
 
+instance TrieKey Nat'
+
 fromNat :: Nat' -> Maybe Integer
 fromNat n' =
   case n' of
     Nat i -> Just i
     _     -> Nothing
 
+--------------------------------------------------------------------------------
+
+nEq :: Maybe Nat' -> Maybe Nat' -> Bool
+nEq (Just x) (Just y) = x == y
+nEq _ _               = False
+
+nGt :: Maybe Nat' -> Maybe Nat' -> Bool
+nGt (Just x) (Just y) = x > y
+nGt _ _               = False
+
+nFin :: Maybe Nat' -> Bool
+nFin (Just x)         = x /= Inf
+nFin _                = False
+
+
+
+
+--------------------------------------------------------------------------------
+
+
 nAdd :: Nat' -> Nat' -> Nat'
 nAdd Inf _           = Inf
 nAdd _ Inf           = Inf
 nAdd (Nat x) (Nat y) = Nat (x + y)
 
-{-| Some algerbaic properties of interest:
+{-| Some algebraic properties of interest:
 
 > 1 * x = x
 > x * (y * z) = (x * y) * z
@@ -47,7 +73,7 @@
 nMul (Nat x) (Nat y) = Nat (x * y)
 
 
-{-| Some algeibraic properties of interest:
+{-| Some algebraic properties of interest:
 
 > x ^ 0        = 1
 > x ^ (n + 1)  = x * (x ^ n)
@@ -82,6 +108,11 @@
 nSub _ _                      = Nothing
 
 
+-- XXX:
+-- Does it make sense to define:
+--   nDiv Inf (Nat x)  = Inf
+--   nMod Inf (Nat x)  = Nat 0
+
 {- | Rounds down.
 
 > y * q + r = x
@@ -122,25 +153,101 @@
 nWidth (Nat n)  = Nat (widthInteger n)
 
 
+{- | @length ([ x, y .. ] : [_][w])@
+We don't check that the second element fits in `w` many bits as the
+second element may not be part of the list.
+For example, the length of @[ 0 .. ] : [_][0]@ is @nLenFromThen 0 1 0@,
+which should evaluate to 1. -}
+
+
+{- XXX: It would appear that the actual notation also requires `y` to fit in...
+It is not clear if that's a good idea.  Consider, for example,
+
+    [ 1, 4 .., 2 ]
+
+Cryptol infers that this list has one element, but it insists that the
+width of the elements be at least 3, to accommodate the 4.
+-}
 nLenFromThen :: Nat' -> Nat' -> Nat' -> Maybe Nat'
-nLenFromThen a@(Nat x) b@(Nat y) (Nat w)
-  | y > x = nLenFromThenTo a b (Nat (2^w - 1))
-  | y < x = nLenFromThenTo a b (Nat 0)
+nLenFromThen a@(Nat x) b@(Nat y) wi@(Nat w)
+  | wi < nWidth a = Nothing
+  | y > x         = nLenFromThenTo a b (Nat (2^w - 1))
+  | y < x         = nLenFromThenTo a b (Nat 0)
 
 nLenFromThen _ _ _ = Nothing
 
+-- | @length [ x, y .. z ]@
 nLenFromThenTo :: Nat' -> Nat' -> Nat' -> Maybe Nat'
 nLenFromThenTo (Nat x) (Nat y) (Nat z)
-  | step /= 0 = let len   = div dist step + 1
-                in Just $ Nat $ max 0 (if x > y then if z > x then 0 else len
-                                         else if z < x then 0 else len)
+  | step /= 0 = let len = div dist step + 1
+                in Just $ Nat $ if x > y
+                                  -- decreasing
+                                  then (if z > x then 0 else len)
+                                  -- increasing
+                                  else (if z < x then 0 else len)
   where
   step = abs (x - y)
   dist = abs (x - z)
 
 nLenFromThenTo _ _ _ = Nothing
 
+{- Note [Sequences of Length 0]
 
+  nLenFromThenTo x y z == 0
+    case 1: x > y  && z > x
+    case 2: x <= y && z < x
+
+  nLenFromThen x y w == 0
+    impossible
+-}
+
+{- Note [Sequences of Length 1]
+
+  `nLenFromThenTo x y z == 1`
+
+  dist < step && (x > y && z <= x   ||   y >= x && z >= x)
+
+  case 1: dist < step && x > y && z <= x
+  case 2: dist < step && y >= x && z >= x
+
+  case 1: if    `z <= x`,
+          then  `x - z >= 0`,
+          hence `dist = x - z`    (a)
+
+          if    `x > y`
+          then  `x - y` > 0
+          hence `step = x - y`    (b)
+
+          from (a) and (b):
+            `dist < step`
+            `x - z < x - y`
+            `-z < -y`
+            `z > y`
+
+  case 1 summary:  x >= z && z > y
+
+
+
+  case 2: if y >= x, then step = y - x   (a)
+          if z >= x, then dist = z - x   (b)
+
+          dist < step =
+          (z - x) < (y - x) =
+          (z < y)
+
+  case 2 summary: y > z, z >= x
+
+------------------------
+
+  `nLenFromThen x y w == 1`
+    | y > x         = nLenFromThenTo x y (Nat (2^w - 1))
+    | y < x         = nLenFromThenTo x y (Nat 0)
+
+    y >= 2^w, y > x
+
+-}
+
+
 --------------------------------------------------------------------------------
 
 -- | Compute the logarithm of a number in the given base, rounded down to the
@@ -178,3 +285,34 @@
     go' s n
       | n < bit 32 = go s n
       | otherwise  = let s' = s + 32 in s' `seq` go' s' (n `shiftR` 32)
+
+
+-- | Compute the exact root of a natural number.
+-- The second argument specifies which root we are computing.
+rootExact :: Integer -> Integer -> Maybe Integer
+rootExact x y = do (z,True) <- genRoot x y
+                   return z
+
+
+
+{- | Compute the the n-th root of a natural number, rounded down to
+the closest natural number.  The boolean indicates if the result
+is exact (i.e., True means no rounding was done, False means rounded down).
+The second argument specifies which root we are computing. -}
+genRoot :: Integer -> Integer -> Maybe (Integer, Bool)
+genRoot _  0    = Nothing
+genRoot x0 1    = Just (x0, True)
+genRoot x0 root = Just (search 0 (x0+1))
+  where
+  search from to = let x = from + div (to - from) 2
+                       a = x ^ root
+                   in case compare a x0 of
+                        EQ              -> (x, True)
+                        LT | x /= from  -> search x to
+                           | otherwise  -> (from, False)
+                        GT | x /= to    -> search from x
+                           | otherwise  -> (from, False)
+
+
+
+
diff --git a/src/Cryptol/TypeCheck/Solver/Interval.hs b/src/Cryptol/TypeCheck/Solver/Interval.hs
deleted file mode 100644
--- a/src/Cryptol/TypeCheck/Solver/Interval.hs
+++ /dev/null
@@ -1,190 +0,0 @@
--- |
--- Module      :  $Header$
--- Copyright   :  (c) 2013-2015 Galois, Inc.
--- License     :  BSD3
--- Maintainer  :  cryptol@galois.com
--- Stability   :  provisional
--- Portability :  portable
---
--- This module defines intervals and interval arithmetic.
-
-{-# LANGUAGE Safe #-}
-module Cryptol.TypeCheck.Solver.Interval
-  ( Interval(..)
-  , anything
-  , iConst
-
-  , iAdd, iMul, iExp
-  , iMin, iMax
-  , iLg2, iWidth
-
-  , iSub, iDiv, iMod
-
-  , iLenFromThen, iLenFromTo, iLenFromThenTo
-
-  , iLeq, iLt, iDisjoint
-  ) where
-
-
-import Cryptol.TypeCheck.Solver.InfNat
-
-
-{- | Representation of intervals.
-Intervals always include the lower bound.
-Intervals include the upper bound if:
-  * either the upper bound is finite, or
-  * the upper bound is 'Inf' and @isFinite == False@.
-
-Invariant: if the upper bound is finite, then `isFinite == True`.
-
-> [x,y]     Interval (Nat x) (Nat y) True
-> [x,inf]   Interval (Nat x) Inf     False
-> [x,inf)   Interval (Nat x) Inf     True
-
--}
-data Interval = Interval
-  { lowerBound     :: Nat'  -- ^ Lower bound
-  , upperBound     :: Nat'  -- ^ Upper bound
-  , isFinite       :: Bool  -- ^ Do we know this to be a finite value.
-      -- Note that for @[inf,inf]@ this field is `False`
-      -- (i.e., this field is not talking about the size of the interval,
-      -- but, rather, about if it contains infinity).
-  } deriving Show
-
--- | Any possible value.
-anything :: Interval
-anything = Interval { lowerBound = Nat 0
-                    , upperBound = Inf
-                    , isFinite   = False
-                    }
-
-anyFinite :: Interval
-anyFinite = anything { isFinite = True }
-
-iConst :: Nat' -> Interval
-iConst x = Interval { lowerBound = x, upperBound = x, isFinite = x < Inf }
-
-iAdd :: Interval -> Interval -> Interval
-iAdd = liftMono2 nAdd (&&)
-
-iMul :: Interval -> Interval -> Interval
-iMul = liftMono2 nMul (&&)
-
-iMin :: Interval -> Interval -> Interval
-iMin = liftMono2 nMin (||)
-
-iMax :: Interval -> Interval -> Interval
-iMax = liftMono2 nMax (&&)
-
-iLg2 :: Interval -> Interval
-iLg2 = liftMono1 nLg2
-
-iWidth :: Interval -> Interval
-iWidth = liftMono1 nWidth
-
-
-iExp :: Interval -> Interval -> Interval
-iExp i1 i2 = fixUp (liftMono2 nExp (&&) i1 i2)
-  where
-  -- exp k : is a monotonic function for k >= 1
-  -- exp 0 : is a monotonic from 1 onwards
-  -- Example of why we need fixing, consdier:
-  -- [0,0] ^ [0,5]
-  -- Monotonic computation results in:
-  -- [1,0]
-  fixUp i3
-    | lowerBound i1 == Nat 0 &&
-      lowerBound i2 == Nat 0 &&
-      upperBound i2 >= Nat 1 =
-        Interval { lowerBound = Nat 0
-                 , upperBound = nMax (Nat 1) (upperBound i3)
-                 , isFinite   = isFinite i3
-                 }
-  fixUp i3 = i3
-
-
-iSub :: Interval -> Interval -> Interval
-iSub = liftPosNeg nSub
-
-iDiv :: Interval -> Interval -> Interval
-iDiv = liftPosNeg nDiv
-
-iMod :: Interval -> Interval -> Interval
-iMod _ i2 = Interval { lowerBound = Nat 0
-                     , upperBound = case upperBound i2 of
-                                      Inf   -> Inf
-                                      Nat n -> Nat (n - 1)
-                     , isFinite   = True -- we never have infinite reminder.
-                     }
-
--- XXX
-iLenFromThen :: Interval -> Interval -> Interval -> Interval
-iLenFromThen _ _ _ = anyFinite
-
--- XXX
-iLenFromTo :: Interval -> Interval -> Interval
-iLenFromTo _ _ = anyFinite
-
--- XXX
-iLenFromThenTo :: Interval -> Interval -> Interval -> Interval
-iLenFromThenTo _ _ _ = anyFinite
-
-
-
-
--- | The first interval is definiately smaller
-iLeq :: Interval -> Interval -> Bool
-iLeq i1 i2 = upperBound i1 <= lowerBound i2
-
--- | The first interval is definiately smaller
-iLt :: Interval -> Interval -> Bool
-iLt i1 i2 = upperBound i1 < lowerBound i2
-         || (isFinite i1 && lowerBound i2 == Inf)
-
--- | The two intervals do not overlap.
-iDisjoint :: Interval -> Interval -> Bool
-iDisjoint i1 i2 = iLt i1 i2 || iLt i2 i1
-
-
---------------------------------------------------------------------------------
-
-
-liftMono1 :: (Nat' -> Nat')     -- ^ Binary monotonic fun. to lift
-          -> Interval -> Interval
-liftMono1 f i =
-  let u = f (upperBound i)
-  in Interval { lowerBound = f (lowerBound i)
-              , upperBound = u
-              , isFinite   = mkFin (isFinite i) u
-              }
-
-liftMono2 :: (Nat' -> Nat' -> Nat')     -- ^ Binary monotonic fun. to lift
-          -> (Bool -> Bool -> Bool)     -- ^ Compute finitneness
-          -> Interval -> Interval -> Interval
-liftMono2 f isF i1 i2 =
-  let u = f (upperBound i1) (upperBound i2)
-  in Interval { lowerBound = f (lowerBound i1) (lowerBound i2)
-              , upperBound = u
-              , isFinite   = mkFin (isF (isFinite i1) (isFinite i2)) u
-              }
-
-
--- For div and sub, increase in first argument, decrease in second.
-liftPosNeg :: (Nat' -> Nat' -> Maybe Nat')
-           -> Interval -> Interval -> Interval
-liftPosNeg f i1 i2 =
-  Interval { lowerBound = case f (lowerBound i1) (upperBound i2) of
-                            Nothing -> Nat 0
-                            Just n  -> n
-          , upperBound  = case f (upperBound i1) (lowerBound i2) of
-                            Just n  -> n
-                            Nothing -> upperBound i1
-          , isFinite    = isFinite i1
-          }
-
-mkFin :: Bool -> Nat' -> Bool
-mkFin ifInf ub = case ub of
-                   Nat _ -> True
-                   Inf   -> ifInf
-
-
diff --git a/src/Cryptol/TypeCheck/Solver/Numeric.hs b/src/Cryptol/TypeCheck/Solver/Numeric.hs
deleted file mode 100644
--- a/src/Cryptol/TypeCheck/Solver/Numeric.hs
+++ /dev/null
@@ -1,292 +0,0 @@
--- |
--- Module      :  $Header$
--- Copyright   :  (c) 2013-2015 Galois, Inc.
--- License     :  BSD3
--- Maintainer  :  cryptol@galois.com
--- Stability   :  provisional
--- Portability :  portable
---
--- Solver code that does not depend on the type inference monad.
-
-{-# LANGUAGE PatternGuards #-}
-{-# LANGUAGE Safe #-}
-module Cryptol.TypeCheck.Solver.Numeric
-  ( numericStep
-  , simpFin
-  , goalOrderModel
-  ) where
-
-import Cryptol.Utils.Panic(panic)
-
-import Cryptol.TypeCheck.AST
-import Cryptol.TypeCheck.Unify(mgu,Result(..))
-import Cryptol.TypeCheck.Subst(fvs)
-import Cryptol.TypeCheck.InferTypes(Goal(..), Solved(..))
-import Cryptol.TypeCheck.Solver.FinOrd(OrdFacts, AssertResult(..),addFact)
-import Cryptol.TypeCheck.Solver.Interval(Interval(..),iDisjoint)
-import Cryptol.TypeCheck.Solver.Eval(typeInterval,simpType,
-                                      typeKnownFin,typeKnownLeq,
-                                      assumedOrderModel,
-                                      derivedOrd
-                                    )
-import Cryptol.TypeCheck.Solver.InfNat(Nat'(..))
-import Cryptol.TypeCheck.Solver.Utils
-
-import Control.Monad(guard,msum)
-import qualified Data.Set as Set
-
-
--- | Try to perform a single step of simplification for a
--- numeric goal.  We assume that the substitution has been applied to the
--- goal.
-numericStep :: OrdFacts -> Goal -> Solved
-numericStep m g =
-  case tNoUser (simpType m (goal g)) of
-
-    -- First we check if things are exactly the same, or we can
-    -- substitutie in a variable (e.g., ?a = 1 + x)
-    TCon (PC PEqual) [t1,t2]
-
-       | OK (su,[]) <- unifier -> solvedS (Just su) []
-       | Error _    <- unifier -> Unsolvable
-         where unifier = mgu t1 t2
-
-    TCon (PC PEqual) [t1,t2]
-
-       -- Check if Inf is the only possible solution
-       | Just prop <- checkOnlyInf m t1 t2 -> solved [prop]
-
-       -- k1 + t1 = k2 + t2
-       | Just (k1,t1') <- splitConstSummand t1
-       , Just (k2,t2') <- splitConstSummand t2 ->
-          let sub = case compare k1 k2 of
-                      EQ -> t1' =#= t2'
-                      LT -> t1' =#= (tNum (k2 - k1) .+. t2')
-                      GT -> (tNum (k1 - k2) .+. t1') =#= t2'
-          in solved [sub]
-
-       -- fin a => a + t1 = a + t2
-       | Just p <- eqByCancel m t1 t2 -> solved [p]
-
-       -- k1 * t1 = k2 * t2
-       | Just (k1,t1') <- splitConstFactor t1
-       , Just (k2,t2') <- splitConstFactor t2
-       , let c = gcd k1 k2
-       , c > 1 -> solved [ tNum (div k1 c) .*. t1' =#= tNum (div k2 c) .*. t2' ]
-
-       -- (x < b, x = min a b) => (x = a)
-       | TCon (TF TCMin) [a,b] <- t1
-       , Just ps <- simpEqMin m t2 a b  -> solved ps
-       | TCon (TF TCMin) [a,b] <- t2
-       , Just ps <- simpEqMin m t1 a b  -> solved ps
-
-       -- (k >= 1, a = min (a + k, t)) => a = t
-       | TVar a <- tNoUser t1
-       , Just ps <- aIsMin m a (splitMins t2) -> solved ps
-
-       | TVar a <- tNoUser t2
-       , Just ps <- aIsMin m a (splitMins t1) -> solved ps
-
-       -- (?x + s = t, s <= t, fin s) => (?x = t - s)
-       -- useful as long as `?x` not in `fvs (s,t)`
-       | Just ps <- eqBySub m t1 t2 -> solved ps
-
-       -- Impossible
-       | iDisjoint i1 i2 -> Unsolvable
-
-       where i1 = typeInterval m t1
-             i2 = typeInterval m t2
-
-
-    -- We know these are not simple because they would have ended up
-    -- in the OrdFacts
-    TCon (PC PGeq) [t1,t2]
-      | typeKnownLeq m t2 t1  -> solved []
-      | otherwise             -> Unsolved
-
-    prop | Just ps <- simpFin m prop -> solved ps
-
-    _ -> Unsolved
-
-  where
-  solved = solvedS Nothing
-  solvedS su xs = Solved su [ g { goal = x } | x <- xs ]
-
-
--- t1 == min t2 t3
-simpEqMin :: OrdFacts -> Type -> Type -> Type -> Maybe [Prop]
-simpEqMin m t1 t2 t3
-  | t1 == t2              = Just [ t3 >== t1 ]    -- t1 = min t1 t3
-  | t1 == t3              = Just [ t2 >== t1 ]    -- t1 = min t2 t1
-  | knownSmaller m t1 t2  = Just [ t1 =#= t3 ]
-  | knownSmaller m t1 t3  = Just [ t1 =#= t2 ]
-  | otherwise             = Nothing
-
--- | Check to see if we know that `t1` is strictly smaller than `t2`
--- XXX: It'd be nice to combine this with knownLeq
--- XXX: There can be all kinds of rules here.
-knownSmaller :: OrdFacts -> Type -> Type -> Bool
-knownSmaller m t1 t2
-  -- just a simple common case, arising from things like ([0] # something)
-  | Just (_,t2') <- splitConstSummand t2
-  , isFinite (typeInterval m t1)
-  , t1 == t2' = True
-
-knownSmaller _ _ _ = False
-
-
-simpFin :: OrdFacts -> Prop -> Maybe [Prop]
-simpFin m prop =
-  case tNoUser prop of
-    TCon (PC PFin) [ty] -> simpFinTy m ty
-    _                   -> Nothing
-
-
-simpFinTy :: OrdFacts -> Type -> Maybe [Prop]
-simpFinTy _ ty | TCon (TC (TCNum _)) _ <- tNoUser ty = Just []
-simpFinTy m ty | typeKnownFin m ty = Just []
-simpFinTy m ty =
-  case tNoUser ty of
-
-    TCon (TF tf) [t1]
-      | TCLg2    <- tf -> Just [pFin t1]
-      | TCWidth  <- tf -> Just [pFin t1]
-
-    TCon (TF tf) [t1,t2]
-      | TCAdd <- tf -> Just [pFin t1, pFin t2]
-      | TCSub <- tf -> Just [pFin t1]
-
-      | TCMul <- tf
-      , Nat n1 <- lowerBound i1, n1 >= 1
-      , Nat n2 <- lowerBound i2, n2 >= 1
-                    -> Just [pFin t1, pFin t2]
-
-      | TCDiv <- tf -> Just [pFin t1]
-      | TCMod <- tf -> Just []    -- hm
-      | TCExp <- tf -> Just [pFin t1, pFin t2]
-      | TCMin <- tf -> Nothing
-      | TCMax <- tf -> Just [pFin t1, pFin t2]
-      where i1 = typeInterval m t1
-            i2 = typeInterval m t2
-
-
-    TCon (TF tf) [_,_,_]
-      | TCLenFromThen   <- tf -> Just []
-      | TCLenFromThenTo <- tf -> Just []
-
-    _ -> Nothing
-
-
-{- | Detect equations of the form:
-
-    a   = p + a   // fin p, p >= 1
-    inf = p + a   // fin p
-    inf = p * a   // fin p, p >= 1
-
-The only solution to such equations is when `a = inf`, which is what we return.
-When in doubt, it is OK to return `Nothing`
--}
-checkOnlyInf :: OrdFacts -> Type -> Type -> Maybe Prop
-checkOnlyInf ordM t1 t2 =
-  case (tNoUser t1, tNoUser t2) of
-    (TCon (TC TCInf) _, ty)                -> checkInf ty
-    (ty,                TCon (TC TCInf) _) -> checkInf ty
-    (TVar x,            ty)                -> checkVar x ty
-    (ty, TVar x)                           -> checkVar x ty
-    (_,_)                                  -> Nothing
-  where
-  checkVar a ty =
-    do ty1 <- splitVarSummand a ty
-       guard (validP 1 ty1)
-       return (TVar a =#= tInf)
-
-  validP lb p = let i = typeInterval ordM p
-                in isFinite i && lowerBound i >= Nat lb
-
-  checkInf ty = case ty of
-                  TCon (TF TCAdd) [l,r]
-                    | validP 0 l -> Just (r =#= tInf)
-                    | validP 0 r -> Just (l =#= tInf)
-                  TCon (TF TCMul) [l,r]
-                    | validP 1 l -> Just (r =#= tInf)
-                    | validP 1 r -> Just (l =#= tInf)
-                  _ -> Nothing
-
--- (?x + s = t, fin s) <=> (t >= s, ?x = t - s)
--- useful as long as `?x` not in `fvs (s,t)`
-eqBySub :: OrdFacts -> Type -> Type -> Maybe [Prop]
-eqBySub ordM t1 t2 = msum $ zipWith attempt (splitVarSummands t1) (repeat t2) ++
-                            zipWith attempt (splitVarSummands t2) (repeat t1)
-  where
-  attempt (x,s) t
-    | not (x `Set.member` fvs (s,t)) && typeKnownFin ordM s =
-      Just [ TVar x =#= (t .-. s), t >== s ]
-
-    | otherwise = Nothing
-
--- (fin a, a + x == a + y) => (x == y)
-eqByCancel :: OrdFacts -> Type -> Type -> Maybe Prop
-eqByCancel ordM t1 t2 =
- msum [ check x | x <- Set.toList (fvs t1), typeKnownFin ordM (TVar x) ]
-  where
-  check x = do t1' <- splitVarSummand x t1
-               t2' <- splitVarSummand x t2
-               return (t1' =#= t2')
-
-
--- (a == min (k + a, t), k >= 1) => a == t
-aIsMin :: OrdFacts -> TVar -> [Type] -> Maybe [Prop]
-aIsMin _ _ []  = Nothing
-aIsMin _ _ [_] = Nothing
-aIsMin m a ts0 = attempt [] ts0
-  where
-  tMins []  = panic "Cryptol.TypeCheck.Solver.Numeric" [ "tMins []" ]
-  tMins [t] = t
-  tMins ts  = foldr1 tMin ts
-
-  attempt _ [] = Nothing
-  attempt others (t:ts)
-    | isAparat m a t = Just [ TVar a =#= tMins (ts ++ others) ]
-    | otherwise      = attempt (t:others) ts
-
-
--- Either this or splitVars summand could be fancier and go through functions
-isAparat :: OrdFacts -> TVar -> Type -> Bool
-isAparat m x ty = case splitVarSummand x ty of
-                    Just t1 -> typeKnownLeq m (tNum (1::Int)) t1
-                    _       -> False
-
-
-
--- | Collect `fin` and `<=` constraints in the ord model
--- Returns (new model, bad goals, other goals).
--- "bad goals" are goals that are incompatible with the model
--- "other goals" are ones that are not "<=" or "fin"
-goalOrderModel :: OrdFacts -> [Goal] -> (OrdFacts, [Goal], [Goal])
-goalOrderModel m0 todo =
-  go m0 [] [] False [ g { goal = simpType m0 (goal g) } | g <- todo ]
-  where
-  go m bad others changes []
-    | changes     = let (m1,newBad,newOthers) = goalOrderModel m others
-                    in (m1, newBad ++ bad, newOthers)
-    | otherwise   = case concatMap (derivedOrd m) (map goal others) of
-                      [] -> (m,bad,others)
-                      der -> case assumedOrderModel m der of
-                               -- we know that these goals cannot be solved
-                               -- but we don't have a good way to report the err
-                               -- For now, we just leave the goals alone
-                               Left _err -> (m,bad,others)
-
-                               Right (m1,_) -> (m1,bad,others)
-
-  go m bad others changes (g : gs)
-    | Just ps <- simpFin m (goal g) =
-        go m bad others changes ([ g { goal = p } | p <- ps ] ++ gs)
-
-  go m bad others changes (g : gs) =
-    case addFact g m of
-      OrdAlreadyKnown   -> go m bad others changes gs
-      OrdAdded m1       -> go m1 bad others True gs
-      OrdCannot         -> go m bad (g : others) changes gs
-      OrdImprove t1 t2  -> go m bad (g { goal = t1 =#= t2 } : others) changes gs
-      OrdImpossible     -> go m (g : bad) others changes gs
diff --git a/src/Cryptol/TypeCheck/Solver/Numeric/AST.hs b/src/Cryptol/TypeCheck/Solver/Numeric/AST.hs
new file mode 100644
--- /dev/null
+++ b/src/Cryptol/TypeCheck/Solver/Numeric/AST.hs
@@ -0,0 +1,425 @@
+-- |
+-- Module      :  $Header$
+-- Copyright   :  (c) 2014-2016 Galois, Inc.
+-- License     :  BSD3
+-- Maintainer  :  cryptol@galois.com
+-- Stability   :  provisional
+-- Portability :  portable
+--
+-- The sytnax of numeric propositions.
+
+{-# LANGUAGE Safe #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE DeriveGeneric #-}
+module Cryptol.TypeCheck.Solver.Numeric.AST
+  ( Name(..), ppName
+
+  , Prop(..), cryPropExprs, cryPropFVS
+  , ppProp, ppPropPrec
+
+  , Expr(..), zero, one, two, inf, cryAnds, cryOrs
+  , cryExprExprs, cryRebuildExpr
+  , cryExprFVS
+  , ppExpr, ppExprPrec
+
+  , Nat'(..)
+
+  , IfExpr, IfExpr'(..), ppIf, ppIfExpr
+
+  , Subst, HasVars(..), cryLet, composeSubst, doAppSubst
+  ) where
+
+import          Cryptol.TypeCheck.AST(TVar)
+import          Cryptol.TypeCheck.PP(pp)
+import          Cryptol.TypeCheck.Solver.InfNat ( Nat'(..) )
+import          Cryptol.Utils.PP ( Doc, text, (<+>), hang, ($$), char, (<>)
+                                 , parens, integer, sep )
+import          Cryptol.Utils.Panic ( panic )
+import          Cryptol.Utils.Misc ( anyJust )
+
+-- import           Data.GenericTrie (TrieKey)
+import           GHC.Generics(Generic)
+import           Data.Maybe (fromMaybe)
+import           Data.Map ( Map )
+import qualified Data.Map as Map
+import           Data.Set ( Set )
+import qualified Data.Set as Set
+import qualified Control.Applicative as A
+import           Control.Monad ( liftM, ap )
+
+
+infixr 2 :||
+infixr 3 :&&
+infix  4 :==, :>, :>=, :==:, :>:
+infixl 6 :+, :-
+infixl 7 :*
+infixr 8 :^^
+
+
+
+data Name = UserName TVar | SysName Int
+            deriving (Show,Eq,Ord,Generic)
+
+
+
+-- | Propopsitions, representing Cryptol's numeric constraints (and a bit more).
+data Prop =
+
+   -- Preidcates on natural numbers with infinity.
+   -- After simplification, the only one of these should be `fin x`,
+   -- where `x` is a variable.
+
+   Fin Expr | Expr :== Expr | Expr :>= Expr | Expr :> Expr
+
+
+  -- Predicate on strict natural numbers (i.e., no infinities)
+  -- Should be introduced by 'cryNatOp', to eliminte 'inf'.
+  | Expr :==: Expr | Expr :>: Expr
+
+  -- Standard logical strucutre>
+  | Prop :&& Prop | Prop :|| Prop
+  | Not Prop
+  | PFalse | PTrue
+    deriving (Eq,Show,Generic)
+
+
+-- | Expressions, representing Cryptol's numeric types.
+data Expr = K Nat'
+          | Var Name
+          | Expr :+ Expr                  -- total
+          | Expr :- Expr                  -- partial: x >= y, fin y
+          | Expr :* Expr                  -- total
+          | Div Expr Expr                 -- partial: fin x, y >= 1
+          | Mod Expr Expr                 -- partial: fin x, y >= 1
+          | Expr :^^ Expr                 -- total
+          | Min Expr Expr                 -- total
+          | Max Expr Expr                 -- total
+          | Width Expr                    -- total
+          | LenFromThen   Expr Expr Expr  -- partial: x /= y, w >= width x
+          | LenFromThenTo Expr Expr Expr  -- partial: x /= y
+            deriving (Eq,Show,Generic,Ord)
+
+
+-- | The constant @0@.
+zero :: Expr
+zero = K (Nat 0)
+
+-- | The constant @1@.
+one :: Expr
+one = K (Nat 1)
+
+-- | The constant @2@.
+two :: Expr
+two = K (Nat 2)
+
+-- | The constant @infinity@.
+inf :: Expr
+inf = K Inf
+
+
+-- | Make a conjucntion of the given properties.
+cryAnds :: [Prop] -> Prop
+cryAnds []  = PTrue
+cryAnds ps  = foldr1 (:&&) ps
+
+-- | Make a disjunction of the given properties.
+cryOrs :: [Prop] -> Prop
+cryOrs []   = PFalse
+cryOrs ps   = foldr1 (:||) ps
+
+
+
+
+-- | Compute all expressions in a property.
+cryPropExprs :: Prop -> [Expr]
+cryPropExprs = go []
+  where
+  go es prop =
+    case prop of
+      PTrue     -> es
+      PFalse    -> es
+      Not p     -> go es p
+      p :&& q   -> go (go es q) p
+      p :|| q   -> go (go es q) p
+
+      Fin x     -> x : es
+
+      x :== y   -> x : y : es
+      x :>  y   -> x : y : es
+      x :>= y   -> x : y : es
+
+      x :==: y  -> x : y : es
+      x :>:  y  -> x : y : es
+
+
+-- | Compute the immediate sub-expressions of an expression.
+cryExprExprs :: Expr -> [Expr]
+cryExprExprs expr =
+  case expr of
+    K _                 -> []
+    Var _               -> []
+    x :+ y              -> [x,y]
+    x :- y              -> [x,y]
+    x :* y              -> [x,y]
+    Div x y             -> [x,y]
+    Mod x y             -> [x,y]
+    x :^^ y             -> [x,y]
+    Min x y             -> [x,y]
+    Max x y             -> [x,y]
+    Width x             -> [x]
+    LenFromThen   x y z -> [x,y,z]
+    LenFromThenTo x y z -> [x,y,z]
+
+-- | Rebuild an expression, using the top-level strucutre of the first
+-- expression, but the second list of expressions as sub-expressions.
+cryRebuildExpr :: Expr -> [Expr] -> Expr
+cryRebuildExpr expr args =
+  case (expr,args) of
+    (K _,   [])                     -> expr
+    (Var _, [])                     -> expr
+    (_ :+ _k, [x,y])                -> x :+ y
+    (_ :- _ , [x,y])                -> x :- y
+    (_ :* _ , [x,y])                -> x :* y
+    (Div _ _, [x,y])                -> Div x y
+    (Mod _ _, [x,y])                -> Mod x y
+    (_ :^^ _, [x,y])                -> x :^^ y
+    (Min _ _, [x,y])                -> Min x y
+    (Max _ _, [x,y])                -> Max x y
+    (Width _, [x])                  -> Width x
+    (LenFromThen   _ _ _ , [x,y,z]) -> LenFromThen x y z
+    (LenFromThenTo _ _ _ , [x,y,z]) -> LenFromThenTo x y z
+    _ -> panic "cryRebuildExpr" $ map show
+           $ text "expr:" <+> ppExpr expr
+           : [ text "arg:" <+> ppExpr a | a <- args ]
+
+
+-- | Compute the free variables in an expression.
+cryExprFVS :: Expr -> Set Name
+cryExprFVS expr =
+  case expr of
+    Var x -> Set.singleton x
+    _     -> Set.unions (map cryExprFVS (cryExprExprs expr))
+
+-- | Compute the free variables in a proposition.
+cryPropFVS :: Prop -> Set Name
+cryPropFVS = Set.unions . map cryExprFVS . cryPropExprs
+
+
+
+
+
+data IfExpr' p a = If p (IfExpr' p a) (IfExpr' p a) | Return a | Impossible
+                deriving Eq
+
+type IfExpr = IfExpr' Prop
+
+instance Monad (IfExpr' p) where
+  return  = Return
+  fail _  = Impossible
+  m >>= k = case m of
+              Impossible -> Impossible
+              Return a   -> k a
+              If p t e   -> If p (t >>= k) (e >>= k)
+
+instance Functor (IfExpr' p) where
+  fmap  = liftM
+
+instance A.Applicative (IfExpr' p) where
+  pure  = return
+  (<*>) = ap
+
+
+--------------------------------------------------------------------------------
+-- Substitution
+--------------------------------------------------------------------------------
+
+type Subst = Map Name Expr
+
+composeSubst :: Subst -> Subst -> Subst
+composeSubst g f = Map.union f' g
+  where
+  f' = fmap (\e -> fromMaybe e (apSubst g e)) f
+
+cryLet :: HasVars e => Name -> Expr -> e -> Maybe e
+cryLet x e = apSubst (Map.singleton x e)
+
+doAppSubst :: HasVars a => Subst -> a -> a
+doAppSubst su a = fromMaybe a (apSubst su a)
+
+-- | Replaces occurances of the name with the expression.
+-- Returns 'Nothing' if there were no occurances of the name.
+class HasVars ast where
+  apSubst :: Subst -> ast -> Maybe ast
+
+-- | This is used in the simplification to "apply" substitutions to Props.
+instance HasVars Bool where
+  apSubst _ _ = Nothing
+
+instance HasVars Expr where
+  apSubst su = go
+    where
+    go expr =
+      case expr of
+        K _                 -> Nothing
+        Var b               -> Map.lookup b su
+        x :+ y              -> bin (:+) x y
+        x :- y              -> bin (:-) x y
+        x :* y              -> bin (:*) x y
+        x :^^ y             -> bin (:^^) x y
+        Div x y             -> bin Div x y
+        Mod x y             -> bin Mod x y
+        Min x y             -> bin Min x y
+        Max x y             -> bin Max x y
+        Width x             -> Width `fmap` go x
+        LenFromThen x y w   -> three LenFromThen x y w
+        LenFromThenTo x y z -> three LenFromThen x y z
+
+    bin f x y = do [x',y'] <- anyJust go [x,y]
+                   return (f x' y')
+
+    three f x y z = do [x',y',z'] <- anyJust go [x,y,z]
+                       return (f x' y' z')
+
+instance HasVars Prop where
+  apSubst su = go
+    where
+    go prop =
+      case prop of
+        PFalse    -> Nothing
+        PTrue     -> Nothing
+        Not p     -> Not `fmap` go p
+        p :&& q   -> bin (:&&) p q
+        p :|| q   -> bin (:||) p q
+        Fin x     -> Fin `fmap` apSubst su x
+        x :== y   -> twoE (:==) x y
+        x :>= y   -> twoE (:>=) x y
+        x :> y    -> twoE (:>) x y
+        x :==: y  -> twoE (:==:) x y
+        x :>: y   -> twoE (:>) x y
+
+    bin f x y = do [x',y'] <- anyJust go [x,y]
+                   return (f x' y')
+
+    twoE f x y = do [x',y'] <- anyJust (apSubst su) [x,y]
+                    return (f x' y')
+
+
+--------------------------------------------------------------------------------
+-- Tries
+--------------------------------------------------------------------------------
+
+-- instance TrieKey Name
+-- instance TrieKey Prop
+-- instance TrieKey Expr
+
+
+
+
+--------------------------------------------------------------------------------
+-- Pretty Printing
+--------------------------------------------------------------------------------
+
+-- | Pretty print a name.
+ppName :: Name -> Doc
+ppName name =
+  case name of
+    UserName x -> pp x
+    SysName  x -> char '_' <> text (names !! x)
+
+-- | An infinite list of names, for pretty prinitng.
+names :: [String]
+names  = concatMap gen [ 0 :: Integer .. ]
+  where
+  gen x  = [ a : suff x | a <- [ 'a' .. 'z' ] ]
+
+  suff 0 = ""
+  suff x = show x
+
+
+
+-- | Pretty print a top-level property.
+ppProp :: Prop -> Doc
+ppProp = ppPropPrec 0
+
+-- | Pretty print a proposition, in the given precedence context.
+ppPropPrec :: Int -> Prop -> Doc
+ppPropPrec prec prop =
+  case prop of
+    Fin x     -> fun "fin" ppExprPrec x
+    x :== y   -> bin "==" 4 1 1 ppExprPrec x y
+    x :>= y   -> bin ">=" 4 1 1 ppExprPrec x y
+    x :> y    -> bin ">"  4 1 1 ppExprPrec x y
+
+    x :==: y  -> bin "==#" 4 1 1 ppExprPrec x y
+    x :>: y   -> bin ">#"  4 1 1 ppExprPrec x y
+
+    p :&& q   -> bin "&&" 3 1 0 ppPropPrec p q
+    p :|| q   -> bin "||" 2 1 0 ppPropPrec p q
+    Not p     -> fun "not" ppPropPrec p
+    PTrue     -> text "True"
+    PFalse    -> text "False"
+
+  where
+  wrap p d = if prec > p then parens d else d
+
+  fun f how x = wrap 10 (text f <+> how 11 x)
+
+  bin op opP lMod rMod how x y =
+    wrap opP (sep [ how (opP + lMod) x, text op, how (opP + rMod) y ])
+
+
+
+-- | Pretty print an expression at the top level.
+ppExpr :: Expr -> Doc
+ppExpr = ppExprPrec 0
+
+-- | Pretty print an expression, in the given precedence context.
+ppExprPrec :: Int -> Expr -> Doc
+ppExprPrec prec expr =
+  case expr of
+    K Inf               -> text "inf"
+    K (Nat n)           -> integer n
+    Var a               -> ppName a
+    x :+ y              -> bin "+" 6 0 1 x y
+    x :- y              -> bin "-" 6 0 1 x y
+    x :* y              -> bin "*" 7 0 1 x y
+    Div x y             -> fun "div" [x,y]
+    Mod x y             -> fun "mod" [x,y]
+    x :^^ y             -> bin "^^" 8 1 0 x y
+    Min x y             -> fun "min" [x,y]
+    Max x y             -> fun "max" [x,y]
+    Width x             -> fun "width" [x]
+    LenFromThen x y w   -> fun "lenFromThen" [x,y,w]
+    LenFromThenTo x y z -> fun "lenFromThenTo" [x,y,z]
+
+  where
+  wrap p d = if prec > p then parens d else d
+
+  fun f xs = wrap 10 (text f <+> sep (map (ppExprPrec 11) xs))
+
+  bin op opP lMod rMod x y =
+    wrap opP
+      (ppExprPrec (opP + lMod) x <+> text op <+> ppExprPrec (opP + rMod) y)
+
+
+
+-- | Pretty print an experssion with ifs.
+ppIfExpr :: IfExpr Expr -> Doc
+ppIfExpr = ppIf ppProp ppExpr
+
+-- | Pretty print an experssion with ifs.
+ppIf :: (p -> Doc) -> (a -> Doc) -> IfExpr' p a -> Doc
+ppIf ppAtom ppVal = go
+  where
+  go expr =
+    case expr of
+      If p t e -> hang (text "if" <+> ppAtom p) 2
+                ( (text "then" <+> go t)  $$
+                  (text "else" <+> go e)
+                )
+      Return e    -> ppVal e
+      Impossible  -> text "<impossible>"
+
+
+
diff --git a/src/Cryptol/TypeCheck/Solver/Numeric/Defined.hs b/src/Cryptol/TypeCheck/Solver/Numeric/Defined.hs
new file mode 100644
--- /dev/null
+++ b/src/Cryptol/TypeCheck/Solver/Numeric/Defined.hs
@@ -0,0 +1,55 @@
+-- |
+-- Module      :  $Header$
+-- Copyright   :  (c) 2014-2016 Galois, Inc.
+-- License     :  BSD3
+-- Maintainer  :  cryptol@galois.com
+-- Stability   :  provisional
+-- Portability :  portable
+
+{-# LANGUAGE Safe #-}
+module Cryptol.TypeCheck.Solver.Numeric.Defined where
+
+import Cryptol.TypeCheck.Solver.Numeric.AST
+import Cryptol.Utils.Panic ( panic )
+
+-- | A condition ensure that the given *basic* proposition makes sense.
+cryDefinedProp :: Prop -> Prop
+cryDefinedProp prop =
+  case prop of
+    Fin x   -> cryDefined x
+    x :== y -> cryDefined x :&& cryDefined y
+    x :>= y -> cryDefined x :&& cryDefined y
+    Not p   -> cryDefinedProp p
+    _ -> panic "cryDefinedProp" [ "Not a simple property:"
+                                , show (ppProp prop)
+                                ]
+
+
+-- | Generate a property ensuring that the expression is well-defined.
+-- This might be a bit too strict.  For example, we reject things like
+-- @max inf (0 - 1)@, which one might think would simplify to @inf@.
+cryDefined :: Expr -> Prop
+cryDefined expr =
+  case expr of
+    K _       -> PTrue
+    Var _     -> PTrue    -- Variables are always assumed to be OK.
+                      -- The idea is that we are going to check for
+                      -- defined-ness before instantiating variables.
+    x :+ y    -> cryDefined x :&& cryDefined y
+    x :- y    -> cryDefined x :&& cryDefined y :&&
+                 Fin y :&& x :>= y
+    x :* y    -> cryDefined x :&& cryDefined y
+    Div x y   -> cryDefined x :&& cryDefined y :&&
+                 Fin x :&& y :>= K (Nat 1)
+    Mod x y   -> cryDefined x :&& cryDefined y :&&
+                 Fin x :&& y :>= K (Nat 1)
+    x :^^ y   -> cryDefined x :&& cryDefined y
+    Min x y   -> cryDefined x :&& cryDefined y
+    Max x y   -> cryDefined x :&& cryDefined y
+    Width x   -> cryDefined x
+    LenFromThen x y w ->
+      cryDefined x :&& cryDefined y :&& cryDefined w :&&
+      Fin x :&& Fin y :&& Fin w :&& Not (x :== y) :&& w :>= Width x
+    LenFromThenTo x y z ->
+      cryDefined x :&& cryDefined y :&& cryDefined z :&&
+      Fin x :&& Fin y :&& Fin z :&& Not (x :== y)
diff --git a/src/Cryptol/TypeCheck/Solver/Numeric/Fin.hs b/src/Cryptol/TypeCheck/Solver/Numeric/Fin.hs
new file mode 100644
--- /dev/null
+++ b/src/Cryptol/TypeCheck/Solver/Numeric/Fin.hs
@@ -0,0 +1,93 @@
+-- |
+-- Module      :  $Header$
+-- Copyright   :  (c) 2015-2016 Galois, Inc.
+-- License     :  BSD3
+-- Maintainer  :  cryptol@galois.com
+-- Stability   :  provisional
+-- Portability :  portable
+-- 
+-- Simplification of `fin` constraints.
+
+{-# LANGUAGE PatternGuards #-}
+module Cryptol.TypeCheck.Solver.Numeric.Fin where
+
+import Data.Map (Map)
+
+import Cryptol.TypeCheck.AST
+import Cryptol.TypeCheck.InferTypes
+import Cryptol.TypeCheck.Solver.Numeric.Interval
+import Cryptol.TypeCheck.Solver.InfNat
+
+
+cryIsFin :: Map TVar Interval -> Goal -> Solved
+cryIsFin varInfo g =
+  case pIsFin (goal g) of
+    Just ty -> cryIsFinType varInfo g ty
+    Nothing -> Unsolved
+
+cryIsFinType :: Map TVar Interval -> Goal -> Type -> Solved
+cryIsFinType varInfo g ty =
+  case tNoUser ty of
+
+    TCon (TC tc) [] | TCNum _ <- tc -> solved []
+
+    TCon (TF f) ts ->
+      case (f,ts) of
+        (TCAdd,[t1,t2]) -> solved [ pFin t1, pFin t2 ]
+        (TCSub,[t1,_ ]) -> solved [ pFin t1 ]
+
+        -- fin (x * y)
+        (TCMul,[t1,t2])
+          | iLower i1 >= Nat 1 && iIsFin i1 -> solved [ pFin t2 ]
+          | iLower i2 >= Nat 1 && iIsFin i2 -> solved [ pFin t1 ]
+
+          | iLower i1 >= Nat 1 &&
+            iLower i2 >= Nat 1 -> solved [ pFin t1, pFin t2 ]
+
+          | iIsFin i1 && iIsFin i2 -> solved []
+          where
+          i1 = typeInterval varInfo t1
+          i2 = typeInterval varInfo t2
+
+
+        (TCDiv, [t1,_])  -> solved [ pFin t1 ]
+        (TCMod, [_,_])   -> solved []
+
+        -- fin (x ^ y)
+        (TCExp, [t1,t2])
+          | iLower i1 == Inf   -> solved [ t2 =#= tZero ]
+          | iLower i2 == Inf   -> solved [ tOne >== t1 ]
+
+          | iLower i1 >= Nat 2 -> solved [ pFin t1, pFin t2 ]
+          | iLower i2 >= Nat 1 -> solved [ pFin t1, pFin t2 ]
+
+          | Just x <- iUpper i1, x <= Nat 1 -> solved []
+          | Just (Nat 0) <- iUpper i2       -> solved []
+          where
+          i1 = typeInterval varInfo t1
+          i2 = typeInterval varInfo t2
+
+        -- fin (min x y)
+        (TCMin, [t1,t2])
+          | iIsFin i1  -> solved []
+          | iIsFin i2  -> solved []
+          | Just x <- iUpper i1, x <= iLower i2 -> solved [ pFin t1 ]
+          | Just x <- iUpper i2, x <= iLower i1 -> solved [ pFin t2 ]
+          where
+          i1 = typeInterval varInfo t1
+          i2 = typeInterval varInfo t2
+
+        (TCMax, [t1,t2])          -> solved [ pFin t1, pFin t2 ]
+        (TCWidth, [t1])           -> solved [ pFin t1 ]
+        (TCLenFromThen,[_,_,_])   -> solved []
+        (TCLenFromThenTo,[_,_,_]) -> solved []
+
+        _ -> Unsolved
+
+    _ -> Unsolved
+
+
+  where
+  solved ps = Solved Nothing [ g { goal = p } | p <- ps ]
+
+
diff --git a/src/Cryptol/TypeCheck/Solver/Numeric/ImportExport.hs b/src/Cryptol/TypeCheck/Solver/Numeric/ImportExport.hs
new file mode 100644
--- /dev/null
+++ b/src/Cryptol/TypeCheck/Solver/Numeric/ImportExport.hs
@@ -0,0 +1,171 @@
+-- |
+-- Module      :  $Header$
+-- Copyright   :  (c) 2014-2016 Galois, Inc.
+-- License     :  BSD3
+-- Maintainer  :  cryptol@galois.com
+-- Stability   :  provisional
+-- Portability :  portable
+
+{-# LANGUAGE Safe #-}
+module Cryptol.TypeCheck.Solver.Numeric.ImportExport
+  ( ExportM
+  , exportProp
+  , exportType
+  , runExportM
+  , exportPropM
+  , exportTypeM
+  , importProp
+  , importType
+  ) where
+
+import           Cryptol.TypeCheck.Solver.Numeric.AST
+import qualified Cryptol.TypeCheck.AST as Cry
+import           MonadLib
+
+exportProp :: Cry.Prop -> Maybe Prop
+exportProp = runExportM . exportPropM
+
+exportType :: Cry.Prop -> Maybe Expr
+exportType = runExportM . exportTypeM
+
+runExportM :: ExportM a -> Maybe a
+runExportM = either (\_ -> Nothing) Just
+           . runId
+           . runExceptionT
+
+type ExportM = ExceptionT () Id
+
+exportPropM :: Cry.Prop -> ExportM Prop
+exportPropM ty =
+  case ty of
+    Cry.TUser _ _ t -> exportPropM t
+    Cry.TRec {}     -> raise ()
+    Cry.TVar {}     -> raise ()
+    Cry.TCon (Cry.PC pc) ts ->
+      mapM exportTypeM ts >>= \ets ->
+      case (pc, ets) of
+        (Cry.PFin,   [t])     -> return (Fin t)
+        (Cry.PEqual, [t1,t2]) -> return (t1 :== t2)
+        (Cry.PNeq,   [t1,t2]) -> return (Not (t1 :== t2))
+        (Cry.PGeq,   [t1,t2]) -> return (t1 :>= t2)
+        _                     -> raise ()
+    Cry.TCon _ _ -> raise ()
+
+exportTypeM :: Cry.Type -> ExportM Expr
+exportTypeM ty =
+  case ty of
+    Cry.TUser _ _ t -> exportTypeM t
+    Cry.TRec {}     -> raise ()
+    Cry.TVar x      -> return $ Var $ UserName x
+    Cry.TCon tc ts  ->
+      case tc of
+        Cry.TC Cry.TCInf     -> return (K Inf)
+        Cry.TC (Cry.TCNum x) -> return (K (Nat x))
+        Cry.TC _             -> raise ()
+
+        Cry.TF f ->
+          mapM exportTypeM ts >>= \ets ->
+          case (f, ets) of
+            (Cry.TCAdd, [t1,t2]) -> return (t1 :+ t2)
+            (Cry.TCSub, [t1,t2]) -> return (t1 :- t2)
+            (Cry.TCMul, [t1,t2]) -> return (t1 :* t2)
+            (Cry.TCDiv, [t1,t2]) -> return (Div t1 t2)
+            (Cry.TCMod, [t1,t2]) -> return (Mod t1 t2)
+            (Cry.TCExp, [t1,t2]) -> return (t1 :^^ t2)
+            (Cry.TCMin, [t1,t2]) -> return (Min t1 t2)
+            (Cry.TCMax, [t1,t2]) -> return (Max t1 t2)
+            (Cry.TCWidth, [t1])  -> return (Width t1)
+            (Cry.TCLenFromThen,   [t1,t2,t3]) -> return (LenFromThen   t1 t2 t3)
+            (Cry.TCLenFromThenTo, [t1,t2,t3]) -> return (LenFromThenTo t1 t2 t3)
+
+            _ -> raise ()
+
+        Cry.PC _ -> raise ()
+
+importProp :: Prop -> Maybe [Cry.Prop]
+importProp prop =
+  case prop of
+    PFalse    -> Nothing
+    PTrue     -> Just []
+
+    Not p     -> importProp =<< pNot p
+    p1 :&& p2 -> do ps1 <- importProp p1
+                    ps2 <- importProp p2
+                    return (ps1 ++ ps2)
+    _  :|| _  -> Nothing
+
+    Fin expr -> do t <- importType expr
+                   return [ Cry.pFin t ]
+
+    e1 :==  e2 -> do t1 <- importType e1
+                     t2 <- importType e2
+                     return [t1 Cry.=#= t2]
+    e1 :>=  e2 -> do t1 <- importType e1
+                     t2 <- importType e2
+                     return [t1 Cry.>== t2]
+    _ :> _     -> Nothing
+    e1 :==: e2 -> do t1 <- importType e1
+                     t2 <- importType e2
+                     -- XXX: Do we need to add fin?
+                     return [t1 Cry.=#= t2]
+    _ :>: _    -> Nothing
+
+  where
+  pNot p =
+    case p of
+      PFalse  -> Just PTrue
+      PTrue   -> Nothing
+
+      Not a   -> Just a
+      _ :&& _ -> Nothing
+      a :|| b -> Just (Not a :&& Not b)
+
+      Fin a    -> Just (a :== K Inf)
+      _ :== _  -> Nothing
+      _ :>= _  -> Nothing
+      a :>  b  -> Just (b :>= a)
+      _ :==: _ -> Nothing
+      a :>: b  -> Just (b :>= a) 
+      -- XXX: Do we need to add Fin on `a` and 'b'?
+
+
+importType :: Expr -> Maybe Cry.Type
+importType = go
+  where
+  go expr =
+    case expr of
+      Var x               -> case x of
+                               UserName v -> return (Cry.TVar v)
+                               _          -> Nothing
+      K n                 -> case n of
+                               Nat x -> Just (Cry.tNum x)
+                               Inf   -> Just (Cry.tInf)
+      x :+ y              -> op2 Cry.TCAdd x y
+      x :- y              -> op2 Cry.TCSub x y
+      x :* y              -> op2 Cry.TCMul x y
+      Div x y             -> op2 Cry.TCDiv x y
+      Mod x y             -> op2 Cry.TCMod x y
+      x :^^ y             -> op2 Cry.TCExp x y
+      Min x y             -> op2 Cry.TCMin x y
+      Max x y             -> op2 Cry.TCMax x y
+      Width x             -> op1 Cry.TCWidth x
+      LenFromThen   x y z -> op3 Cry.TCLenFromThen x y z
+      LenFromThenTo x y z -> op3 Cry.TCLenFromThenTo x y z
+
+  app f xs = Cry.TCon (Cry.TF f) xs
+
+  op1 f x =
+    do t <- go x
+       return (app f [t])
+
+  op2 f x y =
+    do t1 <- go x
+       t2 <- go y
+       return (app f [t1,t2])
+
+  op3 f x y z =
+    do t1 <- go x
+       t2 <- go y
+       t3 <- go z
+       return (app f [t1,t2,t3])
+
diff --git a/src/Cryptol/TypeCheck/Solver/Numeric/Interval.hs b/src/Cryptol/TypeCheck/Solver/Numeric/Interval.hs
new file mode 100644
--- /dev/null
+++ b/src/Cryptol/TypeCheck/Solver/Numeric/Interval.hs
@@ -0,0 +1,344 @@
+-- |
+-- Module      :  $Header$
+-- Copyright   :  (c) 2015-2016 Galois, Inc.
+-- License     :  BSD3
+-- Maintainer  :  cryptol@galois.com
+-- Stability   :  provisional
+-- Portability :  portable
+-- 
+-- An interval interpretation of types.
+
+{-# LANGUAGE PatternGuards #-}
+{-# LANGUAGE BangPatterns #-}
+
+module Cryptol.TypeCheck.Solver.Numeric.Interval where
+
+import Cryptol.TypeCheck.AST
+import Cryptol.TypeCheck.Solver.InfNat
+import Cryptol.Utils.PP hiding (int)
+
+import           Data.Map ( Map )
+import qualified Data.Map as Map
+import           Data.Maybe (catMaybes)
+
+
+-- | Only meaningful for numeric types
+typeInterval :: Map TVar Interval -> Type -> Interval
+typeInterval varInfo = go
+  where
+  go ty =
+    case ty of
+      TUser _ _ t -> go t
+      TCon tc ts ->
+        case (tc, ts) of
+          (TC TCInf, [])      -> iConst Inf
+          (TC (TCNum n), [])  -> iConst (Nat n)
+          (TF TCAdd, [x,y])   -> iAdd (go x) (go y)
+          (TF TCSub, [x,y])   -> iSub (go x) (go y)
+          (TF TCMul, [x,y])   -> iMul (go x) (go y)
+          (TF TCDiv, [x,y])   -> iDiv (go x) (go y)
+          (TF TCMod, [x,y])   -> iMod (go x) (go y)
+          (TF TCExp, [x,y])   -> iExp (go x) (go y)
+          (TF TCWidth, [x])   -> iWidth (go x)
+          (TF TCMin, [x,y])   -> iMin (go x) (go y)
+          (TF TCMax, [x,y])   -> iMax (go x) (go y)
+          (TF TCLenFromThen, [x,y,z]) ->
+            iLenFromThen (go x) (go y) (go z)
+
+          (TF TCLenFromThenTo, [x,y,z]) ->
+            iLenFromThenTo (go x) (go y) (go z)
+          _ -> iAny
+
+      TVar x -> Map.findWithDefault iAny x varInfo
+
+      _ -> iAny
+
+
+data IntervalUpdate = NoChange
+                    | InvalidInterval TVar
+                    | NewIntervals (Map TVar Interval)
+                      deriving (Show)
+
+updateInterval :: (TVar,Interval) -> Map TVar Interval -> IntervalUpdate
+updateInterval (x,int) varInts =
+  case Map.lookup x varInts of
+    Just int' ->
+      case iIntersect int int' of
+        Just val | int' /= val -> NewIntervals (Map.insert x val varInts)
+                 | otherwise   -> NoChange
+        Nothing                -> InvalidInterval x
+
+    Nothing   -> NewIntervals (Map.insert x int varInts)
+
+
+computePropIntervals :: Map TVar Interval -> [Prop] -> IntervalUpdate
+computePropIntervals ints ps0 = go (3 :: Int) False ints ps0
+  where
+  go !_n False _ [] = NoChange
+
+  go !n True  is []
+    | n > 0     = changed is (go (n-1) False is ps0)
+    | otherwise = NewIntervals is
+
+  go !n new   is (p:ps) =
+    case foldr (update is) NoChange (propInterval is p) of
+      InvalidInterval i -> InvalidInterval i
+      NewIntervals is'  -> go n True is' ps
+      NoChange          -> go n new  is  ps
+
+  changed a x = case x of
+                  NoChange -> NewIntervals a
+                  r        -> r
+
+  update is0 int NoChange            = updateInterval int is0
+  update _   _   (InvalidInterval i) = InvalidInterval i
+  update _   int (NewIntervals is)   = changed is (updateInterval int is)
+
+
+-- | What we learn about variables from a single prop.
+propInterval :: Map TVar Interval -> Prop -> [(TVar,Interval)]
+propInterval varInts prop = catMaybes
+  [ do ty <- pIsFin prop
+       x  <- tIsVar ty
+       return (x,iAnyFin)
+
+  , do (l,r) <- pIsEq prop
+       x     <- tIsVar l
+       return (x,typeInterval varInts r)
+
+  , do (l,r) <- pIsEq prop
+       x     <- tIsVar r
+       return (x,typeInterval varInts l)
+
+  , do (l,r) <- pIsGeq prop
+       x     <- tIsVar l
+       let int = typeInterval varInts r
+       return (x,int { iUpper = Just Inf })
+
+  , do (l,r) <- pIsGeq prop
+       x     <- tIsVar r
+       let int = typeInterval varInts l
+       return (x,int { iLower = Nat 0 })
+  ]
+
+--------------------------------------------------------------------------------
+
+data Interval = Interval
+  { iLower :: Nat'          -- ^ lower bound (inclusive)
+  , iUpper :: Maybe Nat'    -- ^ upper bound (inclusive)
+                            -- If there is no upper bound,
+                            -- than all *natural* numbers.
+  } deriving (Eq,Show)
+
+ppIntervals :: Map TVar Interval -> Doc
+ppIntervals  = vcat . map ppr . Map.toList
+  where
+  ppr (var,i) = pp var <> char ':' <+> ppInterval i
+
+ppInterval :: Interval -> Doc
+ppInterval x = brackets (hsep [ ppr (iLower x)
+                              , text ".."
+                              , maybe (text "fin") ppr (iUpper x)])
+  where
+  ppr a = case a of
+           Nat n -> integer n
+           Inf   -> text "inf"
+
+
+iIsExact :: Interval -> Maybe Nat'
+iIsExact i = if iUpper i == Just (iLower i) then Just (iLower i) else Nothing
+
+iIsFin :: Interval -> Bool
+iIsFin i = case iUpper i of
+             Just Inf -> False
+             _        -> True
+
+
+-- | Returns 'True' when the intervals definitely overlap, and 'False'
+-- otherwise.
+iDisjoint :: Interval -> Interval -> Bool
+iDisjoint
+  (Interval (Nat l1) (Just (Nat h1)))
+  (Interval (Nat l2) (Just (Nat h2))) =
+    or [ h1 > l2 && h1 < h2, l1 > l2 && l1 < h2 ]
+iDisjoint _ _ = False
+
+
+-- | Intersect two intervals, yielding a new one that describes the space where
+-- they overlap.  If the two intervals are disjoint, the result will be
+-- 'Nothing'.
+iIntersect :: Interval -> Interval -> Maybe Interval
+iIntersect i j =
+  case (lower,upper) of
+    (Nat l, Just (Nat u)) | l <= u -> ok
+    (Nat _, Just  Inf)             -> ok
+    (Nat _, Nothing)               -> ok
+    (Inf,   Just Inf)              -> ok
+    _                              -> Nothing
+  where
+
+  ok    = Just (Interval lower upper)
+
+  lower = nMax (iLower i) (iLower j)
+
+  upper = case (iUpper i, iUpper j) of
+            (Just a, Just b)            -> Just (nMin a b)
+            (Nothing,Nothing)           -> Nothing
+            (Just l,Nothing) | l /= Inf -> Just l
+            (Nothing,Just r) | r /= Inf -> Just r
+            _                           -> Nothing
+
+
+-- | Any value
+iAny :: Interval
+iAny = Interval (Nat 0) (Just Inf)
+
+-- | Any finite value
+iAnyFin :: Interval
+iAnyFin = Interval (Nat 0) Nothing
+
+-- | Exactly this value
+iConst :: Nat' -> Interval
+iConst x = Interval x (Just x)
+
+
+
+
+iAdd :: Interval -> Interval -> Interval
+iAdd i j = Interval { iLower = nAdd (iLower i) (iLower j)
+                    , iUpper = case (iUpper i, iUpper j) of
+                                 (Nothing, Nothing) -> Nothing
+                                 (Just x, Just y)   -> Just (nAdd x y)
+                                 (Nothing, Just y)  -> upper y
+                                 (Just x, Nothing)  -> upper x
+                    }
+  where
+  upper x = case x of
+              Inf -> Just Inf
+              _   -> Nothing
+
+iMul :: Interval -> Interval -> Interval
+iMul i j = Interval { iLower = nMul (iLower i) (iLower j)
+                    , iUpper = case (iUpper i, iUpper j) of
+                                 (Nothing, Nothing) -> Nothing
+                                 (Just x, Just y)   -> Just (nMul x y)
+                                 (Nothing, Just y)  -> upper y
+                                 (Just x, Nothing)  -> upper x
+                    }
+  where
+  upper x = case x of
+              Inf   -> Just Inf
+              Nat 0 -> Just (Nat 0)
+              _     -> Nothing
+
+iExp :: Interval -> Interval -> Interval
+iExp i j = Interval { iLower = nExp (iLower i) (iLower j)
+                    , iUpper = case (iUpper i, iUpper j) of
+                                 (Nothing, Nothing) -> Nothing
+                                 (Just x, Just y)   -> Just (nExp x y)
+                                 (Nothing, Just y)  -> upperR y
+                                 (Just x, Nothing)  -> upperL x
+                    }
+  where
+  upperL x = case x of
+               Inf   -> Just Inf
+               Nat 0 -> Just (Nat 0)
+               Nat 1 -> Just (Nat 1)
+               _     -> Nothing
+
+  upperR x = case x of
+               Inf   -> Just Inf
+               Nat 0 -> Just (Nat 1)
+               _     -> Nothing
+
+iMin :: Interval -> Interval -> Interval
+iMin i j = Interval { iLower = nMin (iLower i) (iLower j)
+                    , iUpper = case (iUpper i, iUpper j) of
+                                 (Nothing, Nothing)   -> Nothing
+                                 (Just x, Just y)     -> Just (nMin x y)
+                                 (Nothing, Just Inf)  -> Nothing
+                                 (Nothing, Just y)    -> Just y
+                                 (Just Inf, Nothing)  -> Nothing
+                                 (Just x, Nothing)    -> Just x
+                    }
+
+iMax :: Interval -> Interval -> Interval
+iMax i j = Interval { iLower = nMax (iLower i) (iLower j)
+                    , iUpper = case (iUpper i, iUpper j) of
+                                 (Nothing, Nothing)   -> Nothing
+                                 (Just x, Just y)     -> Just (nMax x y)
+                                 (Nothing, Just Inf)  -> Just Inf
+                                 (Nothing, Just _)    -> Nothing
+                                 (Just Inf, Nothing)  -> Just Inf
+                                 (Just _, Nothing)    -> Nothing
+                    }
+
+iSub :: Interval -> Interval -> Interval
+iSub i j = Interval { iLower = lower, iUpper = upper }
+  where
+  lower = case iUpper j of
+            Nothing -> Nat 0
+            Just x  -> case nSub (iLower i) x of
+                         Nothing -> Nat 0
+                         Just y  -> y
+
+
+  upper = case iUpper i of
+            Nothing -> Nothing
+            Just x  -> case nSub x (iLower j) of
+                         Nothing -> Just Inf {- malformed subtraction -}
+                         Just y  -> Just y
+
+
+iDiv :: Interval -> Interval -> Interval
+iDiv i j = Interval { iLower = lower, iUpper = upper }
+  where
+  lower = case iUpper j of
+            Nothing -> Nat 0
+            Just x  -> case nDiv (iLower i) x of
+                         Nothing -> Nat 0   -- malformed division
+                         Just y  -> y
+
+  upper = case iUpper i of
+            Nothing -> Nothing
+            Just x  -> case nDiv x (nMax (iLower i) (Nat 1)) of
+                         Nothing -> Just Inf
+                         Just y  -> Just y
+
+
+iMod :: Interval -> Interval -> Interval
+iMod _ j = Interval { iLower = Nat 0, iUpper = upper }
+  where
+  upper = case iUpper j of
+            Just (Nat n) | n > 0 -> Just (Nat (n - 1))
+            _                    -> Nothing
+
+
+iWidth :: Interval -> Interval
+iWidth i = Interval { iLower = nWidth (iLower i)
+                    , iUpper = case iUpper i of
+                                 Nothing -> Nothing
+                                 Just n  -> Just (nWidth n)
+                    }
+
+iLenFromThen :: Interval -> Interval -> Interval -> Interval
+iLenFromThen i j w
+  | Just x <- iIsExact i, Just y <- iIsExact j, Just z <- iIsExact w
+  , Just r <- nLenFromThen x y z = iConst r
+  | otherwise =
+      case iUpper w of
+        Just (Nat n) ->
+                    Interval { iLower = Nat 0, iUpper = Just (Nat (2^n - 1)) }
+        _ -> iAnyFin
+
+
+iLenFromThenTo :: Interval -> Interval -> Interval -> Interval
+iLenFromThenTo i j k
+  | Just x <- iIsExact i, Just y <- iIsExact j, Just z <- iIsExact k
+  , Just r <- nLenFromThenTo x y z = iConst r
+  | otherwise = iAnyFin
+
+
+
+
+
diff --git a/src/Cryptol/TypeCheck/Solver/Numeric/NonLin.hs b/src/Cryptol/TypeCheck/Solver/Numeric/NonLin.hs
new file mode 100644
--- /dev/null
+++ b/src/Cryptol/TypeCheck/Solver/Numeric/NonLin.hs
@@ -0,0 +1,285 @@
+-- |
+-- Module      :  $Header$
+-- Copyright   :  (c) 2014-2016 Galois, Inc.
+-- License     :  BSD3
+-- Maintainer  :  cryptol@galois.com
+-- Stability   :  provisional
+-- Portability :  portable
+-- 
+-- Separate Non-Linear Constraints
+-- When we spot a non-linear expression, we name it and add it to a map.
+-- 
+-- If we see the same expression multiple times, then we give it the same name.
+-- 
+-- The body of the non-linear expression is not processed further,
+-- so the resulting map should not contain any of the newly minted names.
+
+{-# LANGUAGE Safe, RecordWildCards #-}
+
+module Cryptol.TypeCheck.Solver.Numeric.NonLin
+  ( nonLinProp
+  , NonLinS, nonLinSubst
+  , initialNonLinS
+  , apSubstNL
+  , lookupNL
+  ) where
+
+import Cryptol.TypeCheck.Solver.Numeric.AST
+import Cryptol.TypeCheck.Solver.Numeric.Simplify
+import Cryptol.TypeCheck.Solver.Numeric.SimplifyExpr
+import Cryptol.Utils.Panic(panic)
+
+-- import           Data.GenericTrie (Trie)
+-- import qualified Data.GenericTrie as Trie
+import           Data.Maybe ( fromMaybe )
+import           MonadLib
+import           Data.Map (Map)
+import qualified Data.Map as Map
+
+type Trie   = Map
+
+trie_empty :: Map k a
+trie_empty  = Map.empty
+
+trie_insert :: Expr -> a -> Map Expr a -> Map Expr a
+trie_insert = Map.insert
+
+trie_delete :: Expr -> Map Expr a -> Map Expr a
+trie_delete = Map.delete
+
+trie_lookup :: Expr -> Map Expr a -> Maybe a
+trie_lookup = Map.lookup
+
+
+-- | Factor-out non-linear terms, by naming them.
+nonLinProp :: NonLinS -> Prop -> ([Prop], NonLinS)
+nonLinProp s0 prop = (p : ps, s)
+  where ((p,ps),s) = runNL s0 (nonLinPropM prop)
+
+{- | Apply a substituin to the non-linear expression database.
+Returns `Nothing` if nothing was affected.
+Otherwise returns `Just`, and a substitution for non-linear expressions
+that became linear.
+
+The definitions of NL terms do not contain other named NL terms,
+so it does not matter if the substitution contains bindings like @_a = e@.
+
+There should be no bindings that mention NL term names in the definitions
+of the substition (i.e, things like @x = _a@ are NOT ok).
+-}
+apSubstNL :: Subst -> NonLinS -> Maybe (Subst, [Prop], NonLinS)
+apSubstNL su s0 = case runNL s0 (mApSubstNL su) of
+                    ((Nothing,_),_) -> Nothing
+                    ((Just su1,ps),r) -> Just (su1,ps,r)
+
+lookupNL :: Name -> NonLinS -> Maybe Expr
+lookupNL x NonLinS { .. } = Map.lookup x nonLinExprs
+
+
+runNL :: NonLinS -> NonLinM a -> ((a, [Prop]), NonLinS)
+runNL s m = runId
+          $ runStateT s 
+          $ do a  <- m
+               ps <- finishTodos
+               return (a,ps)
+
+-- | Get the known non-linear terms.
+nonLinSubst :: NonLinS -> Subst
+nonLinSubst = nonLinExprs
+
+-- | The initial state for the linearization process.
+initialNonLinS :: NonLinS
+initialNonLinS = NonLinS
+  { nextName = 0
+  , nonLinExprs = Map.empty
+  , nlKnown = trie_empty
+  , nlTodo = []
+  }
+
+
+data SubstOneRes = NoChange
+                   -- ^ Substitution does not affect the expression.
+
+                 | Updated (Maybe (Name,Expr))
+                   -- ^ The expression was updated and, maybe, it became linear.
+
+
+{- | Apply the substituint to all non-linear bindings.
+Returns `Nothing` if nothing was affected.
+Otherwise returns `Just`, and a substituion mapping names that used
+to be non-linear but became linear.
+
+Note that we may return `Just empty`, indicating that some non-linear
+expressions were updated, but they remained non-linear. -}
+mApSubstNL :: Subst -> NonLinM (Maybe Subst)
+mApSubstNL su =
+  do s <- get
+     answers <- mapM (mApSubstOneNL su) (Map.toList (nonLinExprs s))
+     return (foldr upd Nothing answers)
+  where
+  upd NoChange ch     = ch
+  upd (Updated mb) ch = let lsu = fromMaybe Map.empty ch
+                        in Just (case mb of
+                                   Nothing    -> lsu
+                                   Just (x,e) -> Map.insert x e lsu)
+
+
+mApSubstOneNL :: Subst -> (Name,Expr) -> NonLinM SubstOneRes
+mApSubstOneNL su (x,e) =
+  case apSubst su e of
+    Nothing -> return NoChange
+    Just e1 ->
+      case crySimpExprMaybe e1 of
+
+        Nothing ->
+          sets $ \NonLinS { .. } ->
+            ( Updated Nothing
+            , NonLinS { nonLinExprs = Map.insert x e1 nonLinExprs
+                      , nlKnown = trie_insert e1 x (trie_delete e nlKnown)
+                      , .. }
+            )
+
+        Just e2
+          | isNonLinOp e2 ->
+          sets $ \NonLinS { .. } ->
+            (Updated Nothing
+            , NonLinS { nonLinExprs = Map.insert x e2 nonLinExprs
+                      , nlKnown = trie_insert e2 x (trie_delete e nlKnown)
+                      , .. }
+            )
+
+          | otherwise ->
+            do sets_ $ \NonLinS { .. } ->
+                 NonLinS { nonLinExprs = Map.delete x nonLinExprs
+                         , nlKnown = trie_delete e nlKnown
+                         , ..
+                         }
+               es <- mapM nonLinExprM (cryExprExprs e2)
+               let e3 = cryRebuildExpr e2 es
+               return (Updated (Just (x,e3)))
+
+
+
+-- | Is the top-level operator a non-linear one.
+isNonLinOp :: Expr -> Bool
+isNonLinOp expr =
+  case expr of
+    K _   -> False
+    Var _ -> False
+
+    _ :+ _ -> False
+
+    _ :- _ -> False
+
+    x :* y ->
+      case (x,y) of
+        (K _, _)  -> False
+        (_, K _)  -> False
+        _         -> True
+
+    Div _ y ->
+      case y of
+        K (Nat n) -> n == 0
+        _         -> True
+
+    Mod _ y ->
+      case y of
+        K (Nat n) -> n == 0
+        _         -> True
+
+    _ :^^ _       -> True
+
+    Min _ _       -> False
+
+    Max _ _       -> False
+
+    Width _       -> True
+
+    LenFromThen _ _ _ -> True -- See also comment on `LenFromThenTo`
+
+    LenFromThenTo x y _ ->
+      case (x,y) of
+        (K _, K _) -> False
+        _          -> True    -- Actually, as long as the difference bettwen
+                              -- `x` and `y` is constant we'd be OK, but not
+                              -- sure how to do that...
+
+nlImplied :: Expr -> Name -> [Prop]
+nlImplied expr x =
+  map crySimplify $
+  case expr of
+    K (Nat n) :^^ e | n >= 2 -> [ Var x :>= one, Var x :>= e :+ one ]
+    Mod _ e                  -> [ e     :>= Var x :+ one ]
+
+    _                        -> []
+
+
+
+
+nonLinPropM :: Prop -> NonLinM Prop
+nonLinPropM prop =
+  case prop of
+    PFalse      -> return PFalse
+    PTrue       -> return PTrue
+    Not p       -> Not   `fmap` nonLinPropM p
+    p :&& q     -> (:&&) `fmap` nonLinPropM p `ap` nonLinPropM q
+    p :|| q     -> (:||) `fmap` nonLinPropM p `ap` nonLinPropM q
+    Fin (Var _) -> return prop
+    Fin _       -> unexpected
+    x :==: y    -> (:==:) `fmap` nonLinExprM x `ap` nonLinExprM y
+    x :>: y     -> (:>:)  `fmap` nonLinExprM x `ap` nonLinExprM y
+
+    _ :== _     -> unexpected
+    _ :>= _     -> unexpected
+    _ :> _      -> unexpected
+
+  where
+  unexpected = panic "nonLinPropM" [ show (ppProp prop) ]
+
+
+
+nonLinExprM :: Expr -> NonLinM Expr
+nonLinExprM expr
+  | isNonLinOp expr = nameExpr expr
+  | otherwise = cryRebuildExpr expr `fmap` mapM nonLinExprM (cryExprExprs expr)
+
+
+
+type NonLinM = StateT NonLinS Id
+
+data NonLinS = NonLinS
+  { nextName    :: !Int
+  , nonLinExprs :: Subst
+  , nlKnown     :: Trie Expr Name
+  , nlTodo      :: [Prop]
+  } deriving Show
+
+nameExpr :: Expr -> NonLinM Expr
+nameExpr e = sets $ \s ->
+  case trie_lookup e (nlKnown s) of
+    Just x -> (Var x, s)
+    Nothing ->
+      let x  = nextName s
+          n  = SysName x
+          s1 = NonLinS { nextName = 1 + x
+                       , nonLinExprs = Map.insert n e (nonLinExprs s)
+                       , nlKnown = trie_insert e n (nlKnown s)
+                       , nlTodo = nlImplied e n ++ nlTodo s
+                       }
+      in (Var n, s1)
+
+
+finishTodos :: NonLinM [Prop]
+finishTodos =
+  do s <- get
+     case nlTodo s of
+       [] -> return []
+       p : ps ->
+        do set s { nlTodo = ps }
+           p'  <- nonLinPropM p
+           ps' <- finishTodos
+           return (p' : ps')
+
+
+
+
diff --git a/src/Cryptol/TypeCheck/Solver/Numeric/SMT.hs b/src/Cryptol/TypeCheck/Solver/Numeric/SMT.hs
new file mode 100644
--- /dev/null
+++ b/src/Cryptol/TypeCheck/Solver/Numeric/SMT.hs
@@ -0,0 +1,519 @@
+-- |
+-- Module      :  $Header$
+-- Copyright   :  (c) 2014-2016 Galois, Inc.
+-- License     :  BSD3
+-- Maintainer  :  cryptol@galois.com
+-- Stability   :  provisional
+-- Portability :  portable
+--
+-- Desugar into SMTLIB Terminology
+
+{-# LANGUAGE Safe #-}
+
+module Cryptol.TypeCheck.Solver.Numeric.SMT
+  ( desugarProp
+  , smtName
+  , smtFinName
+  , ifPropToSmtLib
+  , cryImproveModel
+  , getVal
+  , getVals
+  ) where
+
+import           Cryptol.TypeCheck.AST (TVar(TVFree,TVBound))
+import           Cryptol.TypeCheck.Solver.InfNat
+import           Cryptol.TypeCheck.Solver.Numeric.AST
+import           Cryptol.TypeCheck.Solver.Numeric.Simplify(crySimplify)
+import           Cryptol.Utils.Misc ( anyJust )
+import           Cryptol.Utils.Panic ( panic )
+
+import           Data.List ( partition, unfoldr )
+import           Data.Map ( Map )
+import qualified Data.Map as Map
+import qualified Data.Set as Set
+import           SimpleSMT ( SExpr )
+import qualified SimpleSMT as SMT
+import           MonadLib
+
+
+--------------------------------------------------------------------------------
+-- Desugar to SMT
+--------------------------------------------------------------------------------
+
+-- XXX: Expanding the if-then-elses could make things large.
+-- Perhaps keep them as first class things, in hope that the solver
+-- can do something more clever with that?
+
+
+-- | Assumes simplified, linear, finite, defined expressions.
+desugarExpr :: Expr -> IfExpr Expr
+desugarExpr expr =
+  do es <- mapM desugarExpr (cryExprExprs expr)
+     case (expr,es) of
+       (Min {}, [x,y]) -> If (x :>: y) (return y) (return x)
+       (Max {}, [x,y]) -> If (x :>: y) (return x) (return y)
+       (LenFromThenTo {}, [ x@(K (Nat a)), K (Nat b), z ])
+
+          -- going down
+          | a > b -> If (z :>: x) (return zero)
+                                  (return (Div (x :- z) step :+ one))
+
+          -- goind up
+          | b > a -> If (x :>: z) (return zero)
+                                  (return (Div (z :- x) step :+ one))
+
+          where step = K (Nat (abs (a - b)))
+
+       _ -> return (cryRebuildExpr expr es)
+
+
+-- | Assumes simplified, linear, defined.
+desugarProp :: Prop -> IfExpr Prop
+desugarProp prop =
+  case prop of
+    PFalse      -> return PFalse
+    PTrue       -> return PTrue
+    Not p       -> Not   `fmap` desugarProp p
+    p :&& q     -> (:&&) `fmap` desugarProp p `ap` desugarProp q
+    p :|| q     -> (:||) `fmap` desugarProp p `ap` desugarProp q
+    Fin (Var _) -> return prop
+    x :==: y    -> (:==:) `fmap` desugarExpr x `ap` desugarExpr y
+    x :>: y     -> (:>:)  `fmap` desugarExpr x `ap` desugarExpr y
+
+    Fin _     -> unexpected
+    _ :== _   -> unexpected
+    _ :>= _   -> unexpected
+    _ :> _    -> unexpected
+
+  where
+  unexpected = panic "desugarProp" [ show (ppProp prop) ]
+
+
+ifPropToSmtLib :: IfExpr Prop -> SExpr
+ifPropToSmtLib ifProp =
+  case ifProp of
+    Impossible -> SMT.bool False -- Sholdn't really matter
+    Return p   -> propToSmtLib p
+    If p q r   -> SMT.ite (propToSmtLib p) (ifPropToSmtLib q) (ifPropToSmtLib r)
+
+propToSmtLib :: Prop -> SExpr
+propToSmtLib prop =
+  case prop of
+    PFalse       -> SMT.bool False
+    PTrue        -> SMT.bool True
+    Not p        -> case p of
+                      Fin _   -> SMT.not (propToSmtLib p)
+
+                      -- It is IMPORTANT that the fin constraints are outside
+                      -- the not.
+                      x :>: y -> addFin $ SMT.geq (exprToSmtLib y)
+                                                  (exprToSmtLib x)
+                      _ -> unexpected
+
+
+    p :&& q     -> SMT.and (propToSmtLib p) (propToSmtLib q)
+    p :|| q     -> SMT.or  (propToSmtLib p) (propToSmtLib q)
+    Fin (Var x) -> fin x
+
+    {- For the linear constraints, if the term is finite, then all of
+       its variables must have been finite.
+
+       XXX: Adding the `fin` decls at the leaves leads to some duplication:
+       We could add them just once for each conjunctoin of simple formulas,
+       but I am not sure how much this matters.
+    -}
+    x :==: y    -> addFin $ SMT.eq (exprToSmtLib x) (exprToSmtLib y)
+    x :>: y     -> addFin $ SMT.gt (exprToSmtLib x) (exprToSmtLib y)
+
+    Fin _       -> unexpected
+    _ :== _     -> unexpected
+    _ :>= _     -> unexpected
+    _ :> _      -> unexpected
+
+  where
+  unexpected = panic "propToSmtLib" [ show (ppProp prop) ]
+  fin x      = SMT.const (smtFinName x)
+
+  addFin e   = foldr (\x' e' -> SMT.and (fin x') e') e
+                     (Set.toList (cryPropFVS prop))
+
+exprToSmtLib :: Expr -> SExpr
+exprToSmtLib expr =
+
+  case expr of
+    K (Nat n)           -> SMT.int n
+    Var a               -> SMT.const (smtName a)
+    x :+ y              -> SMT.add (exprToSmtLib x) (exprToSmtLib y)
+    x :- y              -> SMT.sub (exprToSmtLib x) (exprToSmtLib y)
+    x :* y              -> SMT.mul (exprToSmtLib x) (exprToSmtLib y)
+    Div x y             -> SMT.div (exprToSmtLib x) (exprToSmtLib y)
+    Mod x y             -> SMT.mod (exprToSmtLib x) (exprToSmtLib y)
+
+    K Inf               -> unexpected
+    _ :^^ _             -> unexpected
+    Min {}              -> unexpected
+    Max {}              -> unexpected
+    Width {}            -> unexpected
+    LenFromThen {}      -> unexpected
+    LenFromThenTo {}    -> unexpected
+
+  where
+  unexpected = panic "exprToSmtLib" [ show (ppExpr expr) ]
+
+
+-- | The name of a variable in the SMT translation.
+smtName :: Name -> String
+smtName a = case a of
+              SysName n -> name "s" n
+              UserName tv -> case tv of
+                               TVFree n _ _ _ -> name "u" n
+                               TVBound n _    -> name "k" n
+
+  where
+  name p n = case divMod n 26 of
+               (q,r) -> p ++ toEnum (fromEnum 'a' + r) :
+                              (if q == 0 then "" else show q)
+  
+
+-- | The name of a boolean variable, representing `fin x`.
+smtFinName :: Name -> String
+smtFinName x = "fin_" ++ smtName x
+
+
+
+
+
+--------------------------------------------------------------------------------
+-- Models
+--------------------------------------------------------------------------------
+
+{- | Get the value for the given name.
+      * Assumes that we are in a SAT state (i.e., there is a model)
+      * Assumes that the name is in the model -}
+getVal :: SMT.Solver -> Name -> IO Nat'
+getVal s a =
+  do yes <- isInf a
+     if yes
+       then return Inf
+       else do v <- SMT.getConst s (smtName a)
+               case v of
+                 SMT.Int x | x >= 0 -> return (Nat x)
+                 _ -> panic "cryCheck.getVal" [ "Not a natural number", show v ]
+
+  where
+  isInf v = do yes <- SMT.getConst s (smtFinName v)
+               case yes of
+                 SMT.Bool ans -> return (not ans)
+                 _            -> panic "cryCheck.isInf"
+                                       [ "Not a boolean value", show yes ]
+
+
+-- | Get the values for the given names.
+getVals :: SMT.Solver -> [Name] -> IO (Map Name Nat')
+getVals s xs =
+  do es <- mapM (getVal s) xs
+     return (Map.fromList (zip xs es))
+
+
+-- | Convert a bunch of improving equations into an idempotent substitution.
+-- Assumes that the equations don't have loops.
+toSubst :: Map Name Expr -> Subst
+toSubst m0 = last (m0 : unfoldr step m0)
+  where step m = do m1 <- anyJust (apSubst m) m
+                    return (m1,m1)
+
+
+{- | Given a model, compute an improving substitution, implied by the model.
+The entries in the substitution look like this:
+
+  * @x = A@         variable @x@ must equal constant @A@
+
+  * @x = y@         variable @x@ must equal variable @y@
+
+  * @x = A * y + B@ (coming soon)
+                    variable @x@ is a linear function of @y@,
+                    @A@ and @B@ are natural numbers.
+-}
+
+
+
+{- | We are mostly interested in improving unification variables.
+However, it is also useful to improve skolem variables, as this could
+turn non-linear constraints into linear ones.  For example, if we
+have a constraint @x * y = z@, and we can figure out that @x@ must be 5,
+then we end up with a linear constraint @5 * y = z@.
+-}
+cryImproveModel :: SMT.Solver -> SMT.Logger -> Map Name Nat'
+                -> IO (Map Name Expr, [Prop])
+cryImproveModel solver logger model =
+  do (imps,subGoals) <- go Map.empty [] initialTodo
+     return (toSubst imps, subGoals)
+
+  where
+  -- Process unification variables first.  That way, if we get `x = y`, we'd
+  -- prefer `x` to be a unification variable.
+  initialTodo    = uncurry (++) $ partition (isUniVar . fst) $ Map.toList model
+  isUniVar x     = case x of
+                     UserName (TVFree {}) -> True
+                     _                    -> False
+
+
+  -- done:  the set of known improvements
+  -- extra: the collection of inferred sub-goals
+  go done extra []             = return (done,extra)
+  go done extra ((x,e) : rest) =
+
+    -- x = K?
+    do mbCounter <- cryMustEqualK solver (Map.keys model) x e
+       case mbCounter of
+         Nothing -> go (Map.insert x (K e) done) extra rest
+         Just ce -> goV ce done extra [] x e rest
+
+
+  -- ce:    a counter example to `x = e`
+  -- done:  known improvements
+  -- extra: known sub-goals
+  -- todo:  more work to process once we are done with `x`.
+  goV _  done extra todo _ _ [] = go done extra (reverse todo)
+  goV ce done extra todo x e ((y,e') : more)
+    -- x = y?
+    | e == e' = do yesK <- cryMustEqualV solver x y
+                   if yesK then go (Map.insert x (Var y) done)
+                                   extra
+                                   (reverse todo ++ more)
+                           else tryLR
+
+    | otherwise = tryLR
+
+    where
+    next = goV ce done extra ((y,e'):todo) x e more
+
+    tryLR =
+      do mb <- tryLR_with x e y e'
+         case mb of
+           Just (r,subGoals) -> go (Map.insert x r done)
+                                   (subGoals ++ extra)
+                                   (reverse todo ++ more)
+           Nothing ->
+             do mb1 <- tryLR_with y e' x e
+                case mb1 of
+                  Nothing -> next
+                  Just (r, subGoals) -> go (Map.insert y r done)
+                                           (subGoals ++ extra)
+                                           (reverse todo ++ more)
+
+
+    tryLR_with v1 v1Expr v2 v2Expr =
+      case ( isUniVar v1
+           , v1Expr
+           , v2Expr
+           , Map.lookup v1 ce
+           , Map.lookup v2 ce
+           ) of
+        (True, x1, y1, Just x2, Just y2) ->
+          cryCheckLinRel solver logger v2 v1 (y1,x1) (y2,x2)
+        _ -> return Nothing
+
+
+
+
+
+
+
+-- | Try to prove the given expression.
+checkUnsat :: SMT.Solver -> SExpr -> IO Bool
+checkUnsat s e =
+  do SMT.push s
+     SMT.assert s e
+     res <- SMT.check s
+     SMT.pop s
+     return (res == SMT.Unsat)
+
+
+-- | Try to prove the given expression.
+-- If we fail, we try to give a counter example.
+-- If the answer is unknown, then we return an empty counter example.
+getCounterExample :: SMT.Solver -> [Name] -> SExpr -> IO (Maybe (Map Name Nat'))
+getCounterExample s xs e =
+  do SMT.push s
+     SMT.assert s e
+     res <- SMT.check s
+     ans <- case res of
+              SMT.Unsat   -> return Nothing
+              SMT.Unknown -> return (Just Map.empty)
+              SMT.Sat     -> Just `fmap` getVals s xs
+     SMT.pop s
+     return ans
+
+
+
+
+
+-- | Is this the only possible value for the constant, under the current
+-- assumptions.
+-- Assumes that we are in a 'Sat' state.
+-- Returns 'Nothing' if the variables must always match the given value.
+-- Otherwise, we return a counter-example (which may be empty, if uniknown)
+cryMustEqualK :: SMT.Solver -> [Name] ->
+                 Name -> Nat' -> IO (Maybe (Map Name Nat'))
+cryMustEqualK solver xs x val =
+  case val of
+    Inf   -> getCounterExample solver xs (SMT.const (smtFinName x))
+    Nat n -> getCounterExample solver xs $
+             SMT.not $
+             SMT.and (SMT.const $ smtFinName x)
+                     (SMT.eq (SMT.const (smtName x)) (SMT.int n))
+
+
+
+-- | Do these two variables need to always be the same, under the current
+-- assumptions.
+-- Assumes that we are in a 'Sat' state.
+cryMustEqualV :: SMT.Solver -> Name -> Name -> IO Bool
+cryMustEqualV solver x y =
+     checkUnsat solver $
+        SMT.not $
+        SMT.or (SMT.not (fin x) `SMT.and` SMT.not (fin y))
+               (fin x `SMT.and` fin y `SMT.and` SMT.eq (var x) (var y))
+
+  where fin a = SMT.const (smtFinName a)
+        var a = SMT.const (smtName a)
+
+
+-- | Try to find a linear relation between the two variables, based
+-- on two observed data points.
+-- NOTE:  The variable being defined is the SECOND name.
+cryCheckLinRel :: SMT.Solver -> SMT.Logger ->
+         {- x -} Name {- ^ Definition in terms of this variable. -} ->
+         {- y -} Name {- ^ Define this variable. -} ->
+                 (Nat',Nat') {- ^ Values in one model (x,y) -} ->
+                 (Nat',Nat') {- ^ Values in another model (x,y) -} ->
+                 IO (Maybe (Expr,[Prop]))
+                 {- ^ Either nothing, or an improving expression, and any
+                      additional obligations -}
+cryCheckLinRel s logger x y p1 p2 =
+  -- First, try to find a linear relation that holds in all finite cases.
+  do SMT.push s
+     SMT.assert s (isFin x)
+     SMT.assert s (isFin y)
+     ans <- case (p1,p2) of
+              ((Nat x1, Nat y1), (Nat x2, Nat y2)) ->
+                  checkLR x1 y1 x2 y2
+
+              ((Inf,    Inf),    (Nat x2, Nat y2)) ->
+                 mbGoOn (getFinPt x2) $ \(x1,y1) -> checkLR x1 y1 x2 y2
+
+              ((Nat x1, Nat y1), (Inf,    Inf)) ->
+                 mbGoOn (getFinPt x1) $ \(x2,y2) -> checkLR x1 y1 x2 y2
+
+              _ -> return Nothing
+
+     SMT.pop s
+
+
+     -- Next, check the infinite cases: if @y = A * x + B@, then
+     -- either both @x@ and @y@ must be infinite or they both must be finite.
+     -- Note that we don't consider relations where A = 0: because they
+     -- would be handled when we checked that @y@ is a constant.
+     case ans of
+       Nothing -> return Nothing
+       Just e ->
+         do SMT.push s
+            SMT.assert s (SMT.not (SMT.eq (isFin x) (isFin y)))
+            c <- SMT.check s
+            SMT.pop s
+            case c of
+              SMT.Unsat -> return (Just e)
+              _         -> return Nothing
+
+  where
+  isFin a = SMT.const (smtFinName a)
+
+  -- XXX: Duplicates `cryDefined`
+  -- The constraints are always of the form: x >= K, or K >= x
+  wellDefined e =
+    case e of
+      (K (Nat a) :* t) :- K (Nat b) ->
+        let c = div (b + a - 1) a
+        in [ t :>= K (Nat c) ]
+
+      K (Nat b) :- (K (Nat a) :* t)
+        -> let c = div b a
+           in [ K (Nat c) :>= t ]
+
+      a  :- b -> [ a :>= b ]
+
+      _ -> []
+
+
+  checkLR x1 y1 x2 y2 =
+    do SMT.logMessage logger ("checkLR: " ++ show (x1,y1) ++ "   "
+                                          ++ show (x2,y2))
+       mbGoOn (return (linRel (x1,y1) (x2,y2))) (\(a,b) ->
+         do let sumTerm v
+                   | b == 0    = v
+                   | b < 0     = v :- K (Nat (negate b))
+                   | otherwise = v :+ K (Nat b)
+
+                expr
+                  | a == 1     = sumTerm (Var x)
+                  | a <  0     = K (Nat b) :- K (Nat (negate a)) :* Var x
+                  | otherwise  = sumTerm (K (Nat a) :* Var x)
+
+            SMT.logMessage logger ("candidate: " ++ show (ppProp (Var y :==: expr)))
+
+            proved <- checkUnsat s
+                    $ propToSmtLib $ crySimplify
+                    $ Not $ Var y :==: expr
+
+            if not proved
+               then SMT.logMessage logger "failed" >> return Nothing
+               else return (Just (expr,wellDefined expr)))
+
+  -- Try to get an example of another point, which is finite, and at
+  -- different @x@ coordinate.
+  getFinPt otherX =
+    do SMT.push s
+       SMT.assert s (SMT.not (SMT.eq (SMT.const (smtName x)) (SMT.int otherX)))
+       smtAns <- SMT.check s
+       ans <- case smtAns of
+                SMT.Sat ->
+                  do vX <- SMT.getConst s (smtName x)
+                     vY <- SMT.getConst s (smtName y)
+                     case (vX, vY) of
+                       (SMT.Int vx, SMT.Int vy)
+                          | vx >= 0 && vy >= 0 -> return (Just (vx,vy))
+                       _ -> return Nothing
+                _ -> return Nothing
+       SMT.pop s
+       return ans
+
+  mbGoOn m k = do ans <- m
+                  case ans of
+                    Nothing -> return Nothing
+                    Just a  -> k a
+
+{- | Compute a linear relation through two concrete points.
+Try to find a relation of the form @y = a * x + b@.
+Depending on the signs of @a@ and @b@, we need additional checks,
+to ensure tha @a * x + b@ is valid.
+
+y1 = A * x1 + B
+y2 = A * x2 + B
+(y2 - y1) = A * (x2 - x1)
+
+A = (y2 - y1) / (x2 - x1)
+B = y1 - A * x1
+-}
+linRel :: (Integer,Integer)       {- ^ First point -} ->
+          (Integer,Integer)       {- ^ Second point -} ->
+          Maybe (Integer,Integer) {- ^ (A,B) -}
+linRel (x1,y1) (x2,y2) =
+  do guard (x1 /= x2)
+     let (a,r) = divMod (y2 - y1) (x2 - x1)
+     guard (r == 0 && a /= 0)    -- Not interested in A = 0
+     let b = y1 - a * x1
+     guard $ not $ a < 0 && b < 0   -- No way this will give a natural number.
+     return (a,b)
+
+
diff --git a/src/Cryptol/TypeCheck/Solver/Numeric/Simplify.hs b/src/Cryptol/TypeCheck/Solver/Numeric/Simplify.hs
new file mode 100644
--- /dev/null
+++ b/src/Cryptol/TypeCheck/Solver/Numeric/Simplify.hs
@@ -0,0 +1,846 @@
+-- |
+-- Module      :  $Header$
+-- Copyright   :  (c) 2014-2016 Galois, Inc.
+-- License     :  BSD3
+-- Maintainer  :  cryptol@galois.com
+-- Stability   :  provisional
+-- Portability :  portable
+-- 
+-- TODO:
+--  - Putting in a normal form to spot "prove by assumption"
+--  - Additional simplification rules, namely various cancelation.
+--  - Things like:  lg2 e(x) = x, where we know thate is increasing.
+
+{-# LANGUAGE Safe, PatternGuards, BangPatterns #-}
+{-# LANGUAGE TypeSynonymInstances, FlexibleInstances #-}
+
+module Cryptol.TypeCheck.Solver.Numeric.Simplify
+  (
+  -- * Simplify a property
+  crySimplify, crySimplifyMaybe
+
+  -- * Simplify expressions in a prop
+  , crySimpPropExpr, crySimpPropExprMaybe
+  ) where
+
+import           Cryptol.TypeCheck.Solver.Numeric.AST
+import           Cryptol.TypeCheck.Solver.Numeric.SimplifyExpr
+import           Cryptol.TypeCheck.Solver.InfNat(genLog,genRoot,rootExact)
+import           Cryptol.Utils.Misc ( anyJust )
+
+import           Control.Monad ( mplus )
+import           Data.List ( sortBy )
+import           Data.Maybe ( fromMaybe )
+import qualified Data.Set as Set
+
+
+-- | Simplify a property, if possible.
+crySimplify :: Prop -> Prop
+crySimplify p = fromMaybe p (crySimplifyMaybe p)
+
+-- | Simplify a property, if possible.
+crySimplifyMaybe :: Prop -> Maybe Prop
+crySimplifyMaybe p =
+  let mbSimpExprs = simpSubs p
+      exprsSimped = fromMaybe p mbSimpExprs
+      mbRearrange = tryRearrange exprsSimped
+      rearranged  = fromMaybe exprsSimped mbRearrange
+  in crySimplify `fmap` (crySimpStep rearranged `mplus` mbRearrange
+                                                `mplus` mbSimpExprs)
+
+  where
+  tryRearrange q = case q of
+                    _ :&& _ -> cryRearrangeAnd q
+                    _ :|| _ -> cryRearrangeOr  q
+                    _       -> Nothing
+
+  simpSubs q = case q of
+                Not a     -> Not `fmap` crySimplifyMaybe a
+                a :&& b   -> do [a',b'] <- anyJust crySimplifyMaybe [a,b]
+                                return (a' :&& b')
+                a :|| b   -> do [a',b'] <- anyJust crySimplifyMaybe [a,b]
+                                return (a' :|| b')
+                _         -> crySimpPropExprMaybe q
+
+
+
+
+
+-- | A single simplification step.
+crySimpStep :: Prop -> Maybe Prop
+crySimpStep prop =
+  case prop of
+
+    Fin x     -> cryIsFin x   -- Fin only on variables.
+
+    x :== y   -> Just (cryIsEq x y)
+    x :>  y   -> Just (cryIsGt x y)
+
+    x :>= y   ->
+      case (x,y) of
+        -- XXX: DUPLICTION
+        (K (Nat 0), _)       -> Just (y :== zero)
+        (K (Nat a), Width b) -> Just (K (Nat (2 ^ a)) :>= b)
+
+        (_,       K (Nat 0)) -> Just PTrue
+        (Width e, K (Nat b)) -> Just (e :>= K (Nat (2^(b-1))))
+
+
+        (K Inf, _)     -> Just PTrue
+        (_, K Inf)     -> Just (x :== inf)
+        _              -> Just (x :== inf :|| one :+ x :> y)
+
+    x :==: y ->
+      case (x,y) of
+        (K a, K b)     -> Just (if a == b then PTrue else PFalse)
+        (K (Nat n), _) | Just p <- cryIsNat True n y -> Just p
+        (_, K (Nat n)) | Just p <- cryIsNat True n x -> Just p
+
+        _ | x == y    -> Just PTrue
+          | otherwise -> case (x,y) of
+                           (Var _, _) -> Nothing
+                           (_, Var _) -> Just (y :==: x)
+                           _          -> Nothing
+
+    x :>: y ->
+      case (x,y) of
+        (K (Nat n),_)  | Just p <- cryNatGt True n y -> Just p
+        (_, K (Nat n)) | Just p <- cryGtNat True n x -> Just p
+
+        _ | x == y      -> Just PFalse
+          | otherwise   -> Nothing
+
+
+    -- For :&& and :|| we assume that the props have been rearrnaged
+    p :&& q -> cryAnd p q
+    p :|| q -> cryOr p q
+
+    Not p   -> cryNot p
+    PFalse  -> Nothing
+    PTrue   -> Nothing
+
+
+-- | Rebalance parens, and arrange conjucts so that we can transfer
+-- information left-to-right.
+cryRearrangeAnd :: Prop -> Maybe Prop
+cryRearrangeAnd prop =
+  case rebalance prop of
+    Just p  -> Just p
+    Nothing -> cryAnds `fmap` cryRearrange cmpAnd (split prop)
+  where
+  rebalance (a :&& b) =
+    case a of
+      PFalse    -> Just PFalse
+      PTrue     -> Just b
+      a1 :&& a2 -> Just (a1 :&& (a2 :&& b))
+      _         -> fmap (a :&&) (rebalance b)
+  rebalance _ = Nothing
+
+  split (a :&& b) = a : split b
+  split a         = [a]
+
+
+-- | Rebalance parens, and arrange disjuncts so that we can transfer
+-- information left-to-right.
+cryRearrangeOr :: Prop -> Maybe Prop
+cryRearrangeOr prop =
+  case rebalance prop of
+    Just p  -> Just p
+    Nothing -> cryOrs `fmap` cryRearrange cmpOr (split prop)
+  where
+  rebalance (a :|| b) =
+    case a of
+      PFalse    -> Just b
+      PTrue     -> Just PTrue
+      a1 :|| a2 -> Just (a1 :|| (a2 :|| b))
+      _         -> fmap (a :||) (rebalance b)
+  rebalance _ = Nothing
+
+  split (a :|| b) = a : split b
+  split a         = [a]
+
+
+
+
+-- | Identify propositions that are suiatable for inlining.
+cryIsDefn :: Prop -> Maybe (Name, Expr)
+cryIsDefn (Var x :==: e) = if (x `Set.member` cryExprFVS e)
+                              then Nothing
+                              else Just (x,e)
+cryIsDefn _              = Nothing
+
+
+
+
+
+type PropOrdering = (Int,Prop) -> (Int,Prop) -> Ordering
+
+{- | Rearrange proposition for conjuctions and disjunctions.
+
+information left-to-right, so we put proposition with information content
+on the left.
+-}
+cryRearrange :: PropOrdering -> [Prop] -> Maybe [Prop]
+cryRearrange cmp ps = if ascending keys then Nothing else Just sortedProps
+  where
+  -- We tag each proposition with a number, so that later we can tell easily
+  -- if the propositions got rearranged.
+  (keys, sortedProps) = unzip (sortBy cmp (zip [ 0 :: Int .. ] ps))
+
+  ascending (x : y : zs) = x < y && ascending (y : zs)
+  ascending _            = True
+
+
+cmpAnd :: PropOrdering
+cmpAnd (k1,prop1) (k2,prop2) =
+  case (prop1, prop2) of
+
+    -- First comes PFalse, maybe we don't need to do anything
+    (PFalse, PFalse) -> compare k1 k2
+    (PFalse, _)      -> LT
+    (_,PFalse)       -> GT
+
+    -- Next comes PTrue
+    (PTrue, PTrue)   -> compare k1 k2
+    (PTrue, _)       -> LT
+    (_,PTrue)        -> GT
+
+    -- Next come `not (fin a)`  (i.e, a = inf)
+    (Not (Fin (Var x)), Not (Fin (Var y))) -> cmpVars x y
+    (Not (Fin (Var _)), _)                 -> LT
+    (_, Not (Fin (Var _)))                 -> GT
+
+    -- Next come defintions: `x = e` (with `x` not in `fvs e`)
+    -- XXX: Inefficient, because we keep recomputing free variables
+    -- (here, and then when actually applying the substitution)
+    _ | Just (x,_) <- mbL
+      , Just (y,_) <- mbR  -> cmpVars x y
+      | Just _     <- mbL  -> LT
+      | Just _     <- mbR  -> GT
+      where
+      mbL = cryIsDefn prop1
+      mbR = cryIsDefn prop2
+
+    -- Next come `fin a`
+    (Fin (Var x), Fin (Var y)) -> cmpVars x y
+    (Fin (Var _), _)           -> LT
+    (_, Fin (Var _))           -> GT
+
+    -- Everything else stays as is
+    _ -> compare k1 k2
+
+  where
+  cmpVars x y
+    | x < y     = LT
+    | x > y     = GT
+    | otherwise = compare k1 k2
+
+
+cmpOr :: PropOrdering
+cmpOr (k1,prop1) (k2,prop2) =
+  case (prop1, prop2) of
+
+    -- First comes PTrue, maybe we don't need to do anything
+    (PTrue, PTrue)   -> compare k1 k2
+    (PTrue, _)       -> LT
+    (_,PTrue)        -> GT
+
+    -- Next comes PFalse
+    (PFalse, PFalse) -> compare k1 k2
+    (PFalse, _)      -> LT
+    (_,PFalse)       -> GT
+
+    -- Next comes `fin a` (because we propagete `a = inf`)
+    (Fin (Var x), Fin (Var y)) -> cmpVars x y
+    (Fin (Var _), _)           -> LT
+    (_, Fin (Var _))           -> GT
+
+    -- Next come `not (fin a)`  (i.e, propagete (fin a))
+    (Not (Fin (Var x)), Not (Fin (Var y))) -> cmpVars x y
+    (Not (Fin (Var _)), _)                 -> LT
+    (_, Not (Fin (Var _)))                 -> GT
+
+    -- we don't propagete (x /= e) for now.
+
+    -- Everything else stays as is
+    _ -> compare k1 k2
+
+  where
+  cmpVars x y
+    | x < y     = LT
+    | x > y     = GT
+    | otherwise = compare k1 k2
+
+
+
+
+
+-- | Simplification of ':&&'.
+-- Assumes arranged conjucntions.
+-- See 'cryRearrangeAnd'.
+cryAnd :: Prop -> Prop -> Maybe Prop
+cryAnd p q =
+  case p of
+    PTrue       -> Just q
+
+    PFalse      -> Just PFalse
+
+    Not (Fin (Var x))
+      | Just q' <- cryKnownFin x False q -> Just (p :&& q')
+
+    Fin (Var x)
+      | Just q' <- cryKnownFin x True q -> Just (p :&& q')
+
+    _ | Just (x,e) <- cryIsDefn p
+      , Just q'    <- cryLet x e q
+      -> Just (p :&& q')
+
+    _ -> Nothing
+
+
+-- | Simplification of ':||'.
+-- Assumes arranged disjunctions.
+-- See 'cryRearrangeOr'
+cryOr :: Prop -> Prop -> Maybe Prop
+cryOr p q =
+  case p of
+    PTrue     -> Just PTrue
+
+    PFalse    -> Just q
+
+    Fin (Var x)
+      | Just q' <- cryKnownFin x False q -> Just (p :|| q')
+
+    Not (Fin (Var x))
+      | Just q' <- cryKnownFin x True q -> Just (p :|| q')
+
+    _ -> Nothing
+
+
+
+-- | Propagate the fact that the variable is known to be finite ('True')
+-- or not-finite ('False').
+-- Note that this may introduce new expression redexes.
+cryKnownFin :: Name -> Bool -> Prop -> Maybe Prop
+cryKnownFin a isFin prop =
+  case prop of
+    Fin (Var a') | a == a' -> Just (if isFin then PTrue else PFalse)
+
+    p :&& q -> do [p',q'] <- anyJust (cryKnownFin a isFin) [p,q]
+                  return (p' :&& q')
+
+    p :|| q -> do [p',q'] <- anyJust (cryKnownFin a isFin) [p,q]
+                  return (p' :|| q')
+
+    Not p   -> Not `fmap` cryKnownFin a isFin p
+
+    x :==: y
+      | not isFin, Just [x',y'] <- anyJust (cryLet a inf) [x,y]
+      -> Just (cryNatOp (:==:) x' y')
+
+    x :>: y
+      | not isFin, Just [x',y'] <- anyJust (cryLet a inf) [x,y]
+      -> Just (cryNatOp (:>:) x' y')
+
+    -- All the other cases should be simplified, eventually.
+    _       -> Nothing
+
+
+
+
+-- | Negation.
+cryNot :: Prop -> Maybe Prop
+cryNot prop =
+  case prop of
+    Fin _           -> Nothing
+
+    x :== y         -> Just (x :> y :|| y :> x)
+    x :>= y         -> Just (y :>  x)
+    x :>  y         -> Just (y :>= x)
+
+    x :==: y        -> Just (x :>: y :|| y :>: x)
+
+    _ :>: _         -> Nothing
+
+    p :&& q         -> Just (Not p :|| Not q)
+    p :|| q         -> Just (Not p :&& Not q)
+    Not p           -> Just p
+    PFalse          -> Just PTrue
+    PTrue           -> Just PFalse
+
+
+
+-- | Simplificaiton for @:==@
+cryIsEq :: Expr -> Expr -> Prop
+cryIsEq l r =
+  case (l,r) of
+    (K m, K n)      -> if m == n then PTrue else PFalse
+
+    (K Inf, _)      -> Not (Fin r)
+    (_, K Inf)      -> Not (Fin l)
+
+    (Div x y, z)    -> x :>= z :* y :&& (one :+ z) :* y :> x
+
+    (K (Nat n),_) | Just p <- cryIsNat False n r -> p
+    (_,K (Nat n)) | Just p <- cryIsNat False n l -> p
+
+    _               -> Not (Fin l) :&& Not (Fin r)
+                   :|| Fin l :&& Fin r :&& cryNatOp (:==:) l r
+
+
+
+
+-- | Simplificatoin for @:>@
+cryIsGt :: Expr -> Expr -> Prop
+cryIsGt (K m) (K n)   = if m > n then PTrue else PFalse
+cryIsGt (K (Nat n)) e | Just p <- cryNatGt False n e = p
+cryIsGt e (K (Nat n)) | Just p <- cryGtNat False n e = p
+
+cryIsGt x y           = Fin y :&& (x :== inf :||
+                                   Fin x :&& cryNatOp (:>:) x y)
+
+
+
+-- | Attempt to simplify a @fin@ constraint.
+-- Assumes a defined input.
+cryIsFin :: Expr -> Maybe Prop
+cryIsFin expr =
+  case expr of
+    K Inf                -> Just PFalse
+    K (Nat _)            -> Just PTrue
+    Var _                -> Nothing
+    t1 :+ t2             -> Just (Fin t1 :&& Fin t2)
+    t1 :- _              -> Just (Fin t1)
+
+    t1 :* t2             -> Just ( Fin t1 :&& Fin t2
+                               :|| t1 :== zero :&& t2 :== inf
+                               :|| t2 :== zero :&& t1 :== inf
+                                 )
+
+    Div t1 _             -> Just (Fin t1)
+    Mod _ _              -> Just PTrue
+
+    t1 :^^ t2            ->
+      Just ( Fin t1 :&& Fin t2
+         :|| t1 :== inf :&& t2 :== zero   -- inf ^^ 0
+         :|| t2 :== inf :&& (t1 :== zero :|| t1 :== one)
+                             -- 0 ^^ inf,    1 ^^ inf
+           )
+
+    Min t1 t2            -> Just (Fin t1 :|| Fin t2)
+    Max t1 t2            -> Just (Fin t1 :&& Fin t2)
+    Width t1             -> Just (Fin t1)
+    LenFromThen  _ _ _   -> Just PTrue
+    LenFromThenTo  _ _ _ -> Just PTrue
+
+
+cryIsNat :: Bool -> Integer -> Expr -> Maybe Prop
+cryIsNat useFinite n expr =
+  case expr of
+    K Inf     -> Just PFalse
+
+    K (Nat m) -> Just (if m == n then PTrue else PFalse)
+
+    Var _ | useFinite   -> Nothing
+          | otherwise   -> Just (Fin expr :&& expr :==: K (Nat n))
+
+    K (Nat m) :+ e2     -> Just $ if m > n then PFalse
+                                           else eq e2 $ K $ Nat $ n - m
+
+    x :+ y
+      | n == 0          -> Just (eq x zero :&& eq y zero)
+      | n == 1          -> Just (eq x zero :&& eq y one :||
+                                 eq x one  :&& eq y zero)
+      | otherwise       -> Nothing
+
+    e1 :- e2            -> Just $ eq (K (Nat n) :+ e1) e2
+
+    K (Nat m) :* e2     ->
+      Just $ if m == 0
+                then if n == 0 then PTrue else PFalse
+                else case divMod n m of
+                       (q,r) -> if r == 0 then eq e2 (K (Nat q))
+                                          else PFalse
+    e1 :* e2
+      | n == 0          -> Just (eq e1 zero :|| eq e2 zero)
+      | n == 1          -> Just (eq e1 one :&& eq e2 one)
+      | otherwise       -> Nothing
+
+    -- (x >= n * y) /\ ((n+1) * y > x)
+    Div x y             -> Just (gt (one :+ x) (K (Nat n) :* y) :&&
+                                 gt (K (Nat (n + 1)) :* y) x)
+
+    Mod _ _ | useFinite -> Nothing
+            | otherwise -> Just (cryNatOp (:==:) expr (K (Nat n)))
+
+
+    K (Nat m) :^^ y     -> Just $ case genLog n m of
+                                    Just (a, exact)
+                                      | exact -> eq y (K (Nat a))
+                                    _ -> PFalse
+    x :^^ K (Nat m)     -> Just $ case rootExact n m of
+                                    Just a  -> eq x (K (Nat a))
+                                    Nothing -> PFalse
+    x :^^ y
+      | n == 0          -> Just (eq x zero :&& gt y zero)
+      | n == 1          -> Just (eq x one  :|| eq y zero)
+      | otherwise       -> Nothing
+
+    Min x y
+      | n == 0          -> Just (eq x zero :|| eq y zero)
+      | otherwise       -> Just ( eq x (K (Nat n)) :&& gt y (K (Nat (n - 1)))
+                              :|| eq y (K (Nat n)) :&& gt x (K (Nat (n - 1)))
+                                )
+
+    Max x y             -> Just ( eq x (K (Nat n)) :&& gt (K (Nat (n + 1))) y
+                              :|| eq y (K (Nat n)) :&& gt (K (Nat (n + 1))) y
+                                )
+
+    Width x
+      | n == 0          -> Just (eq x zero)
+      | otherwise       -> Just (gt x (K (Nat (2^(n-1) - 1))) :&&
+                                 gt (K (Nat (2 ^ n))) x)
+
+    LenFromThen x y w
+      | n == 0          -> Just PFalse
+
+      -- See Note [Sequences of Length 1] in 'Cryptol.TypeCheck.Solver.InfNat'
+      | n == 1          -> Just (gt y x :&& gt (y :+ one) (two :^^ w))
+      | otherwise       -> Nothing -- XXX: maybe some more?
+
+
+    -- See `nLenFromThenTo` in 'Cryptol.TypeCheck.Solver.InfNat'
+    LenFromThenTo x y z
+      | n == 0          -> Just ( gt x y :&& gt z x
+                              :|| gt y x :&& gt x z
+                                )
+
+      -- See Note [Sequences of Length 1] in 'Cryptol.TypeCheck.Solver.InfNat'
+      | n == 1          -> Just (gt z y :&& gt (x :+ one) z     :||
+                                 gt y z :&& gt (z :+ one) x)
+      | otherwise       -> Nothing -- XXX: maybe some more?
+
+
+  where
+  eq x y = if useFinite then x :==: y else x :== y
+  gt x y = if useFinite then x :>: y  else x :>  y
+
+-- | Constant > expression
+cryNatGt :: Bool -> Integer -> Expr -> Maybe Prop
+cryNatGt useFinite n expr
+  | n == 0    = Just PFalse
+  | n == 1    = Just (eq expr zero)
+  | otherwise =
+    case expr of
+      K x   -> Just $ if Nat n > x then PTrue else PFalse
+
+      Var _ -> Nothing
+
+      K (Nat m) :+ y -> Just $ if n >= m then gt (k (n - m)) y else PFalse
+      _ :+ _         -> Nothing
+
+      x :- y         -> Just $ gt (k n :+ y) x
+
+      K (Nat m) :* y
+        | m == 0    -> Just PTrue   -- because we know that n > 1
+        | otherwise -> Just $ case divMod n m of
+                                (q,0) -> gt (k q) y
+                                (0,_) -> eq y zero
+                                (q,_) -> gt (k (q + 1)) y
+      _ :* _          -> Nothing
+
+      Div x y         -> Just $ gt (k n :* y) x
+
+      Mod _ (K (Nat m))
+        | m <= n      -> Just PTrue
+
+      Mod (K (Nat m)) _
+        | m < n       -> Just PTrue
+      Mod _ _         -> Nothing
+
+
+      K (Nat m) :^^ y
+        | m == 0      -> Just PTrue   -- because n > 1
+        | m == 1      -> Just PTrue   -- ditto
+        | otherwise   -> do (a,exact) <- genLog n m
+                            return $ if exact
+                                        then gt (k a) y
+                                        else gt (k (a + 1)) y
+      x :^^ K (Nat m)
+        | m == 0      -> Just PTrue
+        | m == 1      -> Just (gt (k n) x)
+        | otherwise   -> do (a,exact) <- genRoot n m
+                            return $ if exact
+                                        then gt (k a) x
+                                        else gt (k (a + 1)) x
+      _ :^^ _         -> Nothing
+
+      Min x y         -> Just $ gt (k n) x :|| gt (k n) y
+      Max x y         -> Just $ gt (k n) x :&& gt (k n) y
+
+      Width x         -> Just $ gt (k (2 ^ n)) x
+
+      LenFromThen _ _ _   -> Nothing -- Are there some rules?
+
+      LenFromThenTo _ _ _ -> Nothing -- Are there some rulesj
+
+  where
+  k x    = K (Nat x)
+  eq x y = if useFinite then x :==: y else x :== y
+  gt x y = if useFinite then x :>: y  else x :>  y
+
+
+
+-- | Expression > constant
+cryGtNat :: Bool -> Integer -> Expr -> Maybe Prop
+cryGtNat useFinite n expr =
+  case expr of
+    K x                 -> Just $ if x > Nat n then PTrue else PFalse
+    Var _               -> Nothing
+
+    K (Nat m) :+ y
+      | m > n           -> Just PTrue
+      | otherwise       -> Just (gt y (K (Nat (n - m))))
+
+    x :+ y
+      | n == 0          -> Just (gt x zero :|| gt y zero)
+      | otherwise       -> Nothing
+
+    x :- y              -> Just $ gt x (K (Nat n) :+ y)
+
+
+    K (Nat m) :* y
+      | m > 0           -> Just $ case divMod n m of
+                                    (a,_) -> gt y $ K $ Nat a
+
+    x :* y
+      | n == 0          -> Just (gt x zero :&& gt y zero)
+      | otherwise       -> Nothing
+
+    Div x y             -> Just $ gt (one :+ x) (K (Nat (n+1)) :* y)
+
+    Mod _ (K (Nat m))
+      | m <= n          -> Just PFalse
+    Mod (K (Nat m)) _
+      | m < n           -> Just PFalse
+    Mod _ _             -> Nothing
+
+    K (Nat m) :^^ y
+      | m == 0          -> Just $ if n == 0 then eq y zero else PFalse
+      | m == 1          -> Just $ if n == 0 then PTrue else PFalse
+      | otherwise       -> do (a,_exact) <- genLog n m
+                              Just (gt y (K (Nat a)))
+
+    x :^^ K (Nat m)
+      | m == 0          -> Just $ if n == 0 then PTrue else PFalse
+      | m == 1          -> Just $ gt x (K (Nat n))
+      | otherwise       -> do (a,exact) <- genRoot n m
+                              Just $ if exact
+                                        then gt x (K (Nat a))
+                                        else gt (one :+ x) (K (Nat (a+1)))
+
+    x :^^ y
+      | n == 0          -> Just (gt x zero :|| eq y zero)
+      | otherwise       -> Nothing
+
+    Min x y             -> Just $ gt x (K (Nat n)) :&& gt y (K (Nat n))
+    Max x y             -> Just $ gt x (K (Nat n)) :|| gt y (K (Nat n))
+
+    Width x             -> Just $ gt (one :+ x) (K (Nat (2 ^ n)))
+
+    LenFromThen _ _ _
+      | n == 0          -> Just PTrue
+      | otherwise       -> Nothing -- Are there some rules?
+
+    LenFromThenTo x y z
+      | n == 0          -> Just (gt x y :&& gt z x :|| gt y x :&& gt x z)
+      | otherwise       -> Nothing
+
+  where
+  eq x y = if useFinite then x :==: y else x :== y
+  gt x y = if useFinite then x :>: y  else x :>  y
+
+
+
+-- | Simplify only the Expr parts of a Prop.
+crySimpPropExpr :: Prop -> Prop
+crySimpPropExpr p = fromMaybe p (crySimpPropExprMaybe p)
+
+-- | Simplify only the Expr parts of a Prop.
+-- Returns `Nothing` if there were no changes.
+crySimpPropExprMaybe  :: Prop -> Maybe Prop
+crySimpPropExprMaybe prop =
+  case prop of
+
+    Fin e                 -> Fin `fmap` crySimpExprMaybe e
+
+    a :==  b              -> binop crySimpExprMaybe (:== ) a b
+    a :>=  b              -> binop crySimpExprMaybe (:>= ) a b
+    a :>   b              -> binop crySimpExprMaybe (:>  ) a b
+    a :==: b              -> binop crySimpExprMaybe (:==:) a b
+    a :>:  b              -> binop crySimpExprMaybe (:>: ) a b
+
+    a :&& b               -> binop crySimpPropExprMaybe (:&&) a b
+    a :|| b               -> binop crySimpPropExprMaybe (:||) a b
+
+    Not p                 -> Not `fmap` crySimpPropExprMaybe p
+
+    PFalse                -> Nothing
+    PTrue                 -> Nothing
+
+  where
+
+  binop simp f l r =
+    case (simp l, simp r) of
+      (Nothing,Nothing) -> Nothing
+      (l',r')           -> Just (f (fromMaybe l l') (fromMaybe r r'))
+
+
+
+
+
+
+-- | Our goal is to bubble @inf@ terms to the top of @Return@.
+cryNoInf :: Expr -> IfExpr Expr
+cryNoInf expr =
+  case expr of
+
+    -- These are the interesting cases where we have to branch
+
+    x :* y ->
+      do x' <- cryNoInf x
+         y' <- cryNoInf y
+         case (x', y') of
+           (K Inf, K Inf) -> return inf
+           (K Inf, _)     -> mkIf (y' :==: zero) (return zero) (return inf)
+           (_, K Inf)     -> mkIf (x' :==: zero) (return zero) (return inf)
+           _              -> return (x' :* y')
+
+    x :^^ y ->
+      do x' <- cryNoInf x
+         y' <- cryNoInf y
+         case (x', y') of
+           (K Inf, K Inf) -> return inf
+           (K Inf, _)     -> mkIf (y' :==: zero) (return one) (return inf)
+           (_, K Inf)     -> mkIf (x' :==: zero) (return zero)
+                           $ mkIf (x' :==: one)  (return one)
+                           $ return inf
+           _              -> return (x' :^^ y')
+
+
+
+    -- The rest just propagates
+
+    K _     -> return expr
+    Var _   -> return expr
+
+    x :+ y  ->
+      do x' <- cryNoInf x
+         y' <- cryNoInf y
+         case (x', y') of
+           (K Inf, _)  -> return inf
+           (_, K Inf)  -> return inf
+           _           -> return (x' :+ y')
+
+    x :- y  ->
+      do x' <- cryNoInf x
+         y' <- cryNoInf y
+         case (x', y') of
+           (_, K Inf)  -> Impossible
+           (K Inf, _)  -> return inf
+           _           -> mkIf (x' :==: y)
+                               (return zero)
+                               (mkIf (x' :>: y) (return (x' :- y'))
+                                                Impossible)
+
+    Div x y ->
+      do x' <- cryNoInf x
+         y' <- cryNoInf y
+         case (x', y') of
+           (K Inf, _) -> Impossible
+           (_, K Inf) -> return zero
+           _          -> mkIf (y' :>: zero) (return (Div x' y')) Impossible
+
+    Mod x y ->
+      do x' <- cryNoInf x
+         -- `Mod x y` is finite, even if `y` is `inf`, so first check
+         -- for finiteness.
+         mkIf (Fin y)
+              (do y' <- cryNoInf y
+                  case (x',y') of
+                    (K Inf, _) -> Impossible
+                    (_, K Inf) -> Impossible
+                    _ -> mkIf (y' :>: zero) (return (Mod x' y')) Impossible
+              )
+              (return x')
+
+    Min x y ->
+      do x' <- cryNoInf x
+         y' <- cryNoInf y
+         case (x',y') of
+           (K Inf, _) -> return y'
+           (_, K Inf) -> return x'
+           _          -> return (Min x' y')
+
+    Max x y ->
+      do x' <- cryNoInf x
+         y' <- cryNoInf y
+         case (x', y') of
+           (K Inf, _) -> return inf
+           (_, K Inf) -> return inf
+           _          -> return (Max x' y')
+
+    Width x ->
+      do x' <- cryNoInf x
+         case x' of
+           K Inf      -> return inf
+           _          -> return (Width x')
+
+    LenFromThen x y w   -> fun3 LenFromThen x y w
+    LenFromThenTo x y z -> fun3 LenFromThenTo x y z
+
+
+  where
+  fun3 f x y z =
+    do x' <- cryNoInf x
+       y' <- cryNoInf y
+       z' <- cryNoInf z
+       case (x',y',z') of
+         (K Inf, _, _) -> Impossible
+         (_, K Inf, _) -> Impossible
+         (_, _, K Inf) -> Impossible
+         _             -> mkIf (x' :==: y') Impossible
+                                            (return (f x' y' z'))
+
+  mkIf p t e = case crySimplify p of
+                 PTrue  -> t
+                 PFalse -> e
+                 p'     -> If p' t e
+
+
+
+
+-- | Make an expression that should work ONLY on natural nubers.
+-- Eliminates occurances of @inf@.
+-- Assumes that the two input expressions are well-formed and finite.
+-- The expression is constructed by the given function.
+cryNatOp :: (Expr -> Expr -> Prop) -> Expr -> Expr -> Prop
+cryNatOp op x y =
+  toProp $
+  do x' <- noInf x
+     y' <- noInf y
+     return (op x' y')
+  where
+  noInf a = do a' <- cryNoInf a
+               case a' of
+                 K Inf -> Impossible
+                 _     -> return a'
+
+  toProp ite =
+    case ite of
+      Impossible -> PFalse -- It doesn't matter, but @false@ might anihilate.
+      Return p   -> p
+      If p t e   -> p :&& toProp t :|| Not p :&& toProp e
+
+
+
diff --git a/src/Cryptol/TypeCheck/Solver/Numeric/Simplify1.hs b/src/Cryptol/TypeCheck/Solver/Numeric/Simplify1.hs
new file mode 100644
--- /dev/null
+++ b/src/Cryptol/TypeCheck/Solver/Numeric/Simplify1.hs
@@ -0,0 +1,513 @@
+-- |
+-- Module      :  $Header$
+-- Copyright   :  (c) 2015-2016 Galois, Inc.
+-- License     :  BSD3
+-- Maintainer  :  cryptol@galois.com
+-- Stability   :  provisional
+-- Portability :  portable
+-- 
+-- Simplification.
+-- The rules in this module are all conditional on the expressions being
+-- well-defined.
+-- 
+-- So, for example, consider the formula `P`, which corresponds to `fin e`.
+-- `P` says the following:
+-- 
+--     if e is well-formed, then will evaluate to a finite natural number.
+-- 
+-- More concretely, consider `fin (3 - 5)`.  This will be simplified to `True`,
+-- which does not mean that `3 - 5` is actually finite.
+
+{-# LANGUAGE Safe, PatternGuards, BangPatterns #-}
+{-# LANGUAGE TypeSynonymInstances, FlexibleInstances #-}
+
+module Cryptol.TypeCheck.Solver.Numeric.Simplify1 (propToProp', ppProp') where
+
+import           Cryptol.TypeCheck.Solver.Numeric.SimplifyExpr
+                   (crySimpExpr, splitSum, normSum, Sign(..))
+import           Cryptol.TypeCheck.Solver.Numeric.AST
+import           Cryptol.TypeCheck.Solver.InfNat(genLog,rootExact)
+import           Cryptol.Utils.Misc ( anyJust )
+import           Cryptol.Utils.Panic
+import           Cryptol.Utils.PP
+
+import           Control.Monad ( liftM2 )
+import           Data.Maybe ( fromMaybe )
+import qualified Data.Map as Map
+import           Data.Either(partitionEithers)
+
+
+
+data Atom = AFin Name
+          | AGt Expr Expr   -- on naturals
+          | AEq Expr Expr   -- on naturals
+            deriving Eq
+
+type I    = IfExpr' Atom
+
+
+-- tmp
+propToProp' :: Prop -> I Bool
+propToProp' prop =
+  case prop of
+    Fin e     -> pFin e
+    x :== y   -> pEq x y
+    x :>= y   -> pGeq x y
+    x :>  y   -> pGt  x y
+    x :>: y   -> pAnd (pFin x) (pAnd (pFin y) (pGt x y))
+    x :==: y  -> pAnd (pFin x) (pAnd (pFin y) (pEq x y))
+    p :&& q   -> pAnd (propToProp' p) (propToProp' q)
+    p :|| q   -> pOr  (propToProp' p) (propToProp' q)
+    Not p     -> pNot (propToProp' p)
+    PFalse    -> pFalse
+    PTrue     -> pTrue
+
+
+instance (Eq a, HasVars a) => HasVars (I a) where
+  apSubst su prop =
+    case prop of
+      Impossible -> Nothing
+      Return _   -> Nothing
+      If a t e   ->
+        case apSubstAtom su a of
+          Nothing -> do [x,y] <- branches
+                        return (If a x y)
+          Just a' -> Just $ fromMaybe (pIf a' t e)
+                          $ do [x,y] <- branches
+                               return (pIf a' x y)
+
+        where branches = anyJust (apSubst su) [t,e]
+
+-- | Apply a substituition to an atom
+apSubstAtom :: Subst -> Atom -> Maybe (I Bool)
+apSubstAtom su atom =
+  case atom of
+    AFin x    -> do e <- Map.lookup x su
+                    return (pFin e)
+    AEq e1 e2 -> do [x,y] <- anyJust (apSubst su) [e1,e2]
+                    return (pEq x y)
+    AGt e1 e2 -> do [x,y] <- anyJust (apSubst su) [e1,e2]
+                    return (pGt x y)
+
+
+{- TODO: Unused
+-- | The various way in which the given proposition may be true.
+-- The Boolean indicates if the atom is +ve:
+-- 'True' for positive, 'False' for -ve.
+truePaths :: I Bool -> [ [(Bool,Atom)] ]
+truePaths prop =
+  case prop of
+    Impossible    -> []
+    Return False  -> []
+    Return True   -> [ [] ]
+    If a t e      -> map ((True,a):)  (truePaths t) ++
+                     map ((False,a):) (truePaths e)
+-}
+
+
+--------------------------------------------------------------------------------
+-- Pretty print
+
+ppAtom :: Atom -> Doc
+ppAtom atom =
+  case atom of
+    AFin x  -> text "fin" <+> ppName x
+    AGt x y -> ppExpr x <+> text ">" <+> ppExpr y
+    AEq x y -> ppExpr x <+> text "=" <+> ppExpr y
+
+ppProp' :: I Bool -> Doc
+ppProp' = ppIf ppAtom (text . show)
+
+--------------------------------------------------------------------------------
+-- General logic stuff
+
+-- | False
+pFalse :: I Bool
+pFalse = Return False
+
+-- | True
+pTrue :: I Bool
+pTrue = Return True
+
+-- | Negation
+pNot :: I Bool -> I Bool
+pNot p =
+  case p of
+    Impossible -> Impossible
+    Return a   -> Return (not a)
+    If c t e   -> If c (pNot t) (pNot e)
+
+-- | And
+pAnd :: I Bool -> I Bool -> I Bool
+pAnd p q = pIf p q pFalse
+
+-- | Or
+pOr :: I Bool -> I Bool -> I Bool
+pOr p q = pIf p pTrue q
+
+
+mkIf :: (Eq a, HasVars a) => Atom -> I a -> I a -> I a
+mkIf a t e
+  | t == e    = t
+  | otherwise = case a of
+                  AFin x -> If a (pKnownFin x t) (pKnownInf x e)
+                  _ | If b@(AFin y) _ _ <- t -> If b (mkFinIf y) (mkInfIf y)
+                    | If b@(AFin y) _ _ <- e -> If b (mkFinIf y) (mkInfIf y)
+
+                  AEq x' y'
+                    | x == y    -> t
+                    | otherwise -> If (AEq x y) t e
+                    where (x,y) = balanceEq x' y'
+
+
+                  _      -> If a t e
+
+  where
+  mkFinIf y = mkIf a (pKnownFin y t) (pKnownFin y e)
+  mkInfIf y = case apSubstAtom (Map.singleton y (K Inf)) a of
+                Nothing -> mkIf a (pKnownInf y t) (pKnownInf y t)
+                Just a' -> pIf a' (pKnownInf y t) (pKnownInf y t)
+
+
+-- | If-then-else with non-atom at decision.
+pIf :: (Eq a, HasVars a) => I Bool -> I a -> I a -> I a
+pIf c t e =
+  case c of
+    Impossible    -> Impossible
+    Return True   -> t
+    Return False  -> e
+    If p t1 e1
+      | t2 == e2  -> t2
+      | otherwise -> mkIf p t2 e2
+      where
+      t2 = pIf t1 t e
+      e2 = pIf e1 t e
+
+-- | Atoms to propositions.
+pAtom :: Atom -> I Bool
+pAtom p = do a <- case p of
+                    AFin _  -> return p
+                    AEq x y -> bin AEq x y
+                    AGt x y -> bin AGt x y
+             If a pTrue pFalse
+  where
+  prep x    = do y <- eNoInf x
+                 case y of
+                   K Inf -> Impossible
+                   _     -> return (crySimpExpr y)
+  bin f x y = liftM2 f (prep x) (prep y)
+
+
+
+
+--------------------------------------------------------------------------------
+-- Implementation of Cryptol constraints
+
+-- | Implementation of `==`
+pEq :: Expr -> Expr -> I Bool
+pEq x (K (Nat n)) = pIsNat n x
+pEq (K (Nat n)) y = pIsNat n y
+pEq x y = pIf (pInf x) (pInf y) (pAnd (pFin y) (pAtom (AEq x y)))
+
+-- | Implementation of `>=`
+pGeq :: Expr -> Expr -> I Bool
+pGeq x y = pIf (pInf x) pTrue (pAnd (pFin y) (pAtom (AGt (one :+ x) y)))
+
+-- | Implementation `e1 > e2`.
+pGt :: Expr -> Expr -> I Bool
+pGt x y = pNot (pGeq y x)
+
+
+
+-- | Implementation of `Fin`
+pFin :: Expr -> I Bool
+pFin expr =
+  case expr of
+    K Inf                -> pFalse
+    K (Nat _)            -> pTrue
+    Var x                -> pAtom (AFin x)
+    t1 :+ t2             -> pAnd (pFin t1) (pFin t2)
+    t1 :- _              -> pFin t1
+    t1 :* t2             -> pIf (pInf t1) (pEq t2 zero)
+                          $ pIf (pInf t2) (pEq t1 zero)
+                          $ pTrue
+
+    Div t1 _             -> pFin t1
+    Mod _ _              -> pTrue
+
+    t1 :^^ t2            -> pIf (pInf t1) (pEq t2 zero)
+                          $ pIf (pInf t2) (pOr (pEq t1 zero) (pEq t1 one))
+                          $ pTrue
+
+
+    Min t1 t2            -> pOr (pFin t1) (pFin t2)
+    Max t1 t2            -> pAnd (pFin t1) (pFin t2)
+    Width t1             -> pFin t1
+    LenFromThen  _ _ _   -> pTrue
+    LenFromThenTo  _ _ _ -> pTrue
+
+-- | Implementation of `e == inf`
+pInf :: Expr -> I Bool
+pInf = pNot . pFin
+
+pIsNat :: Integer -> Expr -> I Bool
+pIsNat n expr =
+  case expr of
+    K Inf               -> pFalse
+    K (Nat m)           -> if m == n then pTrue else pFalse
+    Var _               -> nothing
+
+    K (Nat m) :+ e2     -> if n < m then pFalse
+                                    else pIsNat (n - m) e2
+    x :+ y
+      | n == 0          -> pAnd (pIsNat 0 x) (pIsNat 0 y)
+      | n == 1          -> pOr  (pAnd (pIsNat 0 x) (pIsNat 1 y))
+                                (pAnd (pIsNat 1 x) (pIsNat 0 y))
+      | otherwise       -> nothing
+
+    e1 :- e2            -> pEq (K (Nat n) :+ e1) e2
+
+    K (Nat m) :* e2     ->
+      if m == 0
+        then if n == 0 then pTrue else pFalse
+        else case divMod n m of
+                    (q,r) -> if r == 0 then pIsNat q e2
+                                       else pFalse
+    e1 :* e2
+      | n == 0          -> pOr  (pIsNat 0 e1) (pIsNat 0 e2)
+      | n == 1          -> pAnd (pIsNat 1 e1) (pIsNat 1 e2)
+      | otherwise       -> nothing
+
+    -- (x >= n * y) /\ ((n+1) * y > x)
+    Div x y             -> pAnd (pGt (one :+ x) (K (Nat n) :* y))
+                                (pGt (K (Nat (n + 1)) :* y) x)
+
+
+    Mod _ _             -> nothing
+
+    K (Nat m) :^^ y     -> case genLog n m of
+                             Just (a, exact) | exact -> pIsNat a y
+                             _                       -> pFalse
+    x :^^ K (Nat m)     -> case rootExact n m of
+                             Just a  -> pIsNat a x
+                             Nothing -> pFalse
+    x :^^ y
+      | n == 0          -> pAnd (pIsNat 0 x) (pGt y zero)
+      | n == 1          -> pOr  (pIsNat 1 x) (pIsNat 0 y)
+      | otherwise       -> nothing
+
+    Min x y
+      | n == 0          -> pOr (pIsNat 0 x) (pIsNat 0 y)
+      | otherwise       -> pOr (pAnd (pIsNat n x) (pGt y (K (Nat (n - 1)))))
+                               (pAnd (pIsNat n y) (pGt x (K (Nat (n - 1)))))
+
+    Max x y             -> pOr (pAnd (pIsNat n x) (pGt (K (Nat (n + 1))) y))
+                               (pAnd (pIsNat n y) (pGt (K (Nat (n + 1))) y))
+
+
+    Width x
+      | n == 0          -> pIsNat 0 x
+      | otherwise       -> pAnd (pGt x (K (Nat (2^(n-1) - 1))))
+                                (pGt (K (Nat (2 ^ n))) x)
+
+    x                   ->
+      panic "Cryptol.TypeCheck.Solver.Numeric.Simplify1.pIsNat"
+        [ "unexpected expression ", show x ]
+{-
+    LenFromThen x y w
+      | n == 0          -> Just PFalse
+
+      -- See Note [Sequences of Length 1] in 'Cryptol.TypeCheck.Solver.InfNat'
+      | n == 1          -> Just (gt y x :&& gt (y :+ one) (two :^^ w))
+      | otherwise       -> Nothing -- XXX: maybe some more?
+
+
+    -- See `nLenFromThenTo` in 'Cryptol.TypeCheck.Solver.InfNat'
+    LenFromThenTo x y z
+      | n == 0          -> Just ( gt x y :&& gt z x
+                              :|| gt y x :&& gt x z
+                                )
+
+      -- See Note [Sequences of Length 1] in 'Cryptol.TypeCheck.Solver.InfNat'
+      | n == 1          -> Just (gt z y :&& gt (x :+ one) z     :||
+                                 gt y z :&& gt (z :+ one) x)
+      | otherwise       -> Nothing -- XXX: maybe some more?
+
+
+-}
+  where
+  nothing = pAnd (pFin expr) (pAtom (AEq expr (K (Nat n))))
+
+
+_pIsGtThanNat :: Integer -> Expr -> I Bool
+_pIsGtThanNat = undefined
+
+_pNatIsGtThan :: Integer -> Expr -> I Bool
+_pNatIsGtThan = undefined
+
+--------------------------------------------------------------------------------
+
+pKnownFin :: (HasVars a, Eq a) => Name -> I a -> I a
+pKnownFin x prop =
+  case prop of
+    If (AFin y) t _
+      | x == y  -> pKnownFin x t
+    If p t e    -> mkIf p (pKnownFin x t) (pKnownFin x e)
+    _ -> prop
+
+pKnownInf :: (Eq a, HasVars a) => Name -> I a -> I a
+pKnownInf x prop = fromMaybe prop (apSubst (Map.singleton x (K Inf)) prop)
+
+
+
+
+
+
+-- Cancel constants
+-- If the original equation was valid, it continues to be valid.
+balanceEq :: Expr -> Expr -> (Expr, Expr)
+balanceEq (K (Nat a) :+ e1) (K (Nat b) :+ e2)
+  | a >= b    = balanceEq e2 (K (Nat (a - b)) :+ e1)
+  | otherwise = balanceEq e1 (K (Nat (b - a)) :+ e2)
+
+-- Move subtraction to the other side.
+-- If the original equation was valid, this will continue to be valid.
+balanceEq e1 e2
+  | not (null neg_es1 && null neg_es2) = balanceEq (mk neg_es2 pos_es1)
+                                                   (mk neg_es1 pos_es2)
+
+  where
+  (pos_es1, neg_es1)  = partitionEithers (map classify (splitSum e1))
+  (pos_es2, neg_es2)  = partitionEithers (map classify (splitSum e2))
+
+  classify (sign,e)   = case sign of
+                          Pos -> Left e
+                          Neg -> Right e
+
+  mk as bs = normSum (foldr (:+) zero (as ++ bs))
+
+-- fallback
+balanceEq x y = (x,y)
+
+
+
+{- TODO: unused
+balanceGt (K (Nat a) :+ e1) (K (Nat b) :+ e2)
+  | a >= b    = balanceGt (K (Nat (a - b)) :+ e1) e2
+  | otherwise = balanceGt e1                      (K (Nat (b - a)) :+ e2)
+-}
+
+
+
+
+
+--------------------------------------------------------------------------------
+
+-- | Eliminate `inf`, except at the top level.
+eNoInf :: Expr -> I Expr
+eNoInf expr =
+  case expr of
+
+    -- These are the interesting cases where we have to branch
+
+    x :* y ->
+      do x' <- eNoInf x
+         y' <- eNoInf y
+         case (x', y') of
+           (K Inf, K Inf) -> return inf
+           (K Inf, _)     -> pIf (pEq y' zero) (return zero) (return inf)
+           (_, K Inf)     -> pIf (pEq x' zero) (return zero) (return inf)
+           _              -> return (x' :* y')
+
+    x :^^ y ->
+      do x' <- eNoInf x
+         y' <- eNoInf y
+         case (x', y') of
+           (K Inf, K Inf) -> return inf
+           (K Inf, _)     -> pIf (pEq y' zero) (return one) (return inf)
+           (_, K Inf)     -> pIf (pEq x' zero) (return zero)
+                           $ pIf (pEq x' one)  (return one)
+                           $ return inf
+           _              -> return (x' :^^ y')
+
+
+    -- The rest just propagates
+
+    K _     -> return expr
+    Var _   -> return expr
+
+    x :+ y  ->
+      do x' <- eNoInf x
+         y' <- eNoInf y
+         case (x', y') of
+           (K Inf, _)  -> return inf
+           (_, K Inf)  -> return inf
+           _           -> return (x' :+ y')
+
+    x :- y  ->
+      do x' <- eNoInf x
+         y' <- eNoInf y
+         case (x', y') of
+           (_, K Inf)  -> Impossible
+           (K Inf, _)  -> return inf
+           _           -> return (x' :- y')
+
+    Div x y ->
+      do x' <- eNoInf x
+         y' <- eNoInf y
+         case (x', y') of
+           (K Inf, _) -> Impossible
+           (_, K Inf) -> return zero
+           _          -> return (Div x' y')
+
+    Mod x y ->
+      do x' <- eNoInf x
+         -- `Mod x y` is finite, even if `y` is `inf`, so first check
+         -- for finiteness.
+         pIf (pFin y)
+              (do y' <- eNoInf y
+                  case (x',y') of
+                    (K Inf, _) -> Impossible
+                    (_, K Inf) -> Impossible
+                    _          -> return (Mod x' y')
+              )
+              (return x')
+
+    Min x y ->
+      do x' <- eNoInf x
+         y' <- eNoInf y
+         case (x',y') of
+           (K Inf, _) -> return y'
+           (_, K Inf) -> return x'
+           _          -> return (Min x' y')
+
+    Max x y ->
+      do x' <- eNoInf x
+         y' <- eNoInf y
+         case (x', y') of
+           (K Inf, _) -> return inf
+           (_, K Inf) -> return inf
+           _          -> return (Max x' y')
+
+    Width x ->
+      do x' <- eNoInf x
+         case x' of
+           K Inf      -> return inf
+           _          -> return (Width x')
+
+    LenFromThen x y w   -> fun3 LenFromThen x y w
+    LenFromThenTo x y z -> fun3 LenFromThenTo x y z
+
+
+  where
+  fun3 f x y z =
+    do x' <- eNoInf x
+       y' <- eNoInf y
+       z' <- eNoInf z
+       case (x',y',z') of
+         (K Inf, _, _) -> Impossible
+         (_, K Inf, _) -> Impossible
+         (_, _, K Inf) -> Impossible
+         _             -> return (f x' y' z')
+
+
diff --git a/src/Cryptol/TypeCheck/Solver/Numeric/SimplifyExpr.hs b/src/Cryptol/TypeCheck/Solver/Numeric/SimplifyExpr.hs
new file mode 100644
--- /dev/null
+++ b/src/Cryptol/TypeCheck/Solver/Numeric/SimplifyExpr.hs
@@ -0,0 +1,216 @@
+-- |
+-- Module      :  $Header$
+-- Copyright   :  (c) 2015-2016 Galois, Inc.
+-- License     :  BSD3
+-- Maintainer  :  cryptol@galois.com
+-- Stability   :  provisional
+-- Portability :  portable
+--
+-- Simplification of expressions.
+-- The result of simplifying an expression `e`, is a new expression `e'`,
+-- which satisfies the property:
+-- 
+--    if e is well-defined then e and e' will evaluate to the same type.
+-- 
+
+{-# LANGUAGE Safe, BangPatterns #-}
+module Cryptol.TypeCheck.Solver.Numeric.SimplifyExpr where
+
+import           Cryptol.TypeCheck.Solver.Numeric.AST
+import qualified Cryptol.TypeCheck.Solver.InfNat as IN
+import           Cryptol.Utils.Misc ( anyJust )
+
+import           Control.Monad ( guard )
+import           Data.Maybe ( fromMaybe, maybeToList )
+import qualified Data.Map as Map
+
+
+-- | Simplify an expression, if possible.
+crySimpExpr :: Expr -> Expr
+crySimpExpr expr = fromMaybe expr (crySimpExprMaybe expr)
+
+-- | Perform simplification from the leaves up.
+-- Returns `Nothing` if there were no changes.
+crySimpExprMaybe :: Expr -> Maybe Expr
+crySimpExprMaybe expr =
+  case crySimpExprStep (fromMaybe expr mbE1) of
+    Nothing -> mbE1
+    Just e2 -> Just (fromMaybe e2 (crySimpExprMaybe e2))
+  where
+  mbE1 = cryRebuildExpr expr `fmap` anyJust crySimpExprMaybe (cryExprExprs expr)
+
+
+
+-- XXX: Add rules to group together occurances of variables
+
+
+data Sign = Pos | Neg deriving Show
+
+otherSign :: Sign -> Sign
+otherSign s = case s of
+                Pos -> Neg
+                Neg -> Pos
+
+signed :: Sign -> Integer -> Integer
+signed s = case s of
+             Pos -> id
+             Neg -> negate
+
+
+splitSum :: Expr -> [(Sign,Expr)]
+splitSum e0 = go Pos e0 []
+  where go s (e1 :+ e2) es = go s e1 (go s e2 es)
+        go s (e1 :- e2) es = go s e1 (go (otherSign s) e2 es)
+        go s e es          = (s,e) : es
+
+normSum :: Expr -> Expr
+normSum = posTerm . go 0 Map.empty Nothing . splitSum
+  where
+
+  -- constants, variables, other terms
+  go !_ !_  !_ ((Pos,K Inf) : _) = (Pos, K Inf)
+
+  go k xs t ((s, K (Nat n)) : es) = go (k + signed s n) xs t es
+
+  go k xs t ((s, Var x) : es) = go k (Map.insertWith (+) x (signed s 1) xs) t es
+
+  go k xs t ((s, K (Nat n) :* Var x) : es)
+    | n == 0     = go k xs t es
+    | otherwise  = go k (Map.insertWith (+) x (signed s n) xs) t es
+
+  go k xs Nothing (e : es) = go k xs (Just e) es
+
+  go k xs (Just e1) (e2 : es) = go k xs (Just (add e1 e2)) es
+
+  go k xs t [] =
+    let terms     = constTerm k
+                 ++ concatMap varTerm (Map.toList xs)
+                 ++ maybeToList t
+
+    in case terms of
+         [] -> (Pos, K (Nat 0))
+         ts -> foldr1 add ts
+
+  constTerm k
+    | k == 0    = []
+    | k >  0    = [ (Pos, K (Nat k)) ]
+    | otherwise = [ (Neg, K (Nat (negate k))) ]
+
+  varTerm (x,k)
+    | k == 0    = []
+    | k == 1    = [ (Pos, Var x) ]
+    | k > 0     = [ (Pos, K (Nat k) :* Var x) ]
+    | k == (-1) = [ (Neg, Var x) ]
+    | otherwise = [ (Neg, K (Nat (negate k)) :* Var x) ]
+
+  add (s1,t1) (s2,t2) =
+    case (s1,s2) of
+      (Pos,Pos) -> (Pos, t1 :+ t2)
+      (Pos,Neg) -> (Pos, t1 :- t2)
+      (Neg,Pos) -> (Pos, t2 :- t1)
+      (Neg,Neg) -> (Neg, t1 :+ t2)
+
+  posTerm (Pos,x) = x
+  posTerm (Neg,x) = K (Nat 0) :- x
+
+
+
+
+crySimpExprStep :: Expr -> Maybe Expr
+crySimpExprStep e =
+  case crySimpExprStep1 e of
+    Just e1 -> Just e1
+    Nothing -> do let e1 = normSum e
+                  guard (e /= e1)
+                  return e1
+
+-- | Make a simplification step, assuming the expression is well-formed.
+crySimpExprStep1 :: Expr -> Maybe Expr
+crySimpExprStep1 expr =
+  case expr of
+    K _                   -> Nothing
+    Var _                 -> Nothing
+
+    _ :+ _                -> Nothing
+    _ :- _                -> Nothing
+
+    x :* y ->
+      case (x,y) of
+        (K (Nat 0), _)    -> Just zero
+        (K (Nat 1), _)    -> Just y
+        (K a, K b)        -> Just (K (IN.nMul a b))
+        (_,   K _)        -> Just (y :* x)
+
+        (K a, K b :* z)   -> Just (K (IN.nMul a b) :* z)
+
+        -- Normalize, somewhat
+        (a :* b, _)       -> Just (a :* (b :* y))
+        (Var a, Var b)
+          | b > a         -> Just (y :* x)
+
+        _                 -> Nothing
+
+    Div x y ->
+      case (x,y) of
+        (K (Nat 0), _)    -> Just zero
+        (_, K (Nat 1))    -> Just x
+        (_, K Inf)        -> Just zero
+        (K a, K b)        -> K `fmap` IN.nDiv a b
+        _ | x == y        -> Just one
+        _                 -> Nothing
+
+    Mod x y ->
+      case (x,y) of
+        (K (Nat 0), _)    -> Just zero
+        (_, K Inf)        -> Just x
+        (_, K (Nat 1))    -> Just zero
+        (K a, K b)        -> K `fmap` IN.nMod a b
+        _                 -> Nothing
+
+    x :^^ y ->
+      case (x,y) of
+        (_, K (Nat 0))    -> Just one
+        (_, K (Nat 1))    -> Just x
+        (K (Nat 1), _)    -> Just one
+        (K a, K b)        -> Just (K (IN.nExp a b))
+        _                 -> Nothing
+
+    Min x y ->
+      case (x,y) of
+        (K (Nat 0), _)    -> Just zero
+        (K Inf, _)        -> Just y
+        (_, K (Nat 0))    -> Just zero
+        (_, K Inf)        -> Just x
+        (K a, K b)        -> Just (K (IN.nMin a b))
+        _ | x == y        -> Just x
+        _                 -> Nothing
+
+    Max x y ->
+      case (x,y) of
+        (K (Nat 0), _)    -> Just y
+        (K Inf, _)        -> Just inf
+        (_, K (Nat 0))    -> Just x
+        (_, K Inf)        -> Just inf
+        (K a, K b)        -> Just (K (IN.nMax a b))
+        _ | x == y        -> Just x
+        _                 -> Nothing
+
+    Width x ->
+      case x of
+        K a                           -> Just (K (IN.nWidth a))
+        K (Nat 2) :^^ e               -> Just (one :+ e)
+        K (Nat 2) :^^ e :- K (Nat 1)  -> Just e
+        _                             -> Nothing
+
+    LenFromThen x y w ->
+      case (x,y,w) of
+        (K a, K b, K c)   -> K `fmap` IN.nLenFromThen a b c
+        _                 -> Nothing
+
+    LenFromThenTo x y z ->
+      case (x,y,z) of
+        (K a, K b, K c)   -> K `fmap` IN.nLenFromThenTo a b c
+        _                 -> Nothing
+
+
+
diff --git a/src/Cryptol/TypeCheck/Solver/Selector.hs b/src/Cryptol/TypeCheck/Solver/Selector.hs
--- a/src/Cryptol/TypeCheck/Solver/Selector.hs
+++ b/src/Cryptol/TypeCheck/Solver/Selector.hs
@@ -1,13 +1,11 @@
 -- |
 -- Module      :  $Header$
--- Copyright   :  (c) 2013-2015 Galois, Inc.
+-- Copyright   :  (c) 2013-2016 Galois, Inc.
 -- License     :  BSD3
 -- Maintainer  :  cryptol@galois.com
 -- Stability   :  provisional
 -- Portability :  portable
-
-{-# LANGUAGE PatternGuards #-}
-
+{-# LANGUAGE PatternGuards, Safe #-}
 module Cryptol.TypeCheck.Solver.Selector (tryHasGoal) where
 
 import Cryptol.TypeCheck.AST
@@ -16,13 +14,14 @@
                               , newType, applySubst, addHasGoal, solveHasGoal
                               )
 import Cryptol.TypeCheck.Subst(listSubst,apSubst)
+import Cryptol.Utils.Ident (Ident)
 import Cryptol.Utils.PP(text,pp,ordinal,(<+>))
 import Cryptol.Utils.Panic(panic)
 
 import Control.Monad(forM,guard)
 
 
-recordType :: [Name] -> InferM Type
+recordType :: [Ident] -> InferM Type
 recordType labels =
   do fields <- forM labels $ \l ->
         do t <- newType (text "record field" <+> pp l) KType
diff --git a/src/Cryptol/TypeCheck/Solver/Simplify.hs b/src/Cryptol/TypeCheck/Solver/Simplify.hs
new file mode 100644
--- /dev/null
+++ b/src/Cryptol/TypeCheck/Solver/Simplify.hs
@@ -0,0 +1,164 @@
+-- |
+-- Module      :  $Header$
+-- Copyright   :  (c) 2015-2016 Galois, Inc.
+-- License     :  BSD3
+-- Maintainer  :  cryptol@galois.com
+-- Stability   :  provisional
+-- Portability :  portable
+
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE MultiWayIf #-}
+
+module Cryptol.TypeCheck.Solver.Simplify (
+    tryRewritePropAsSubst
+  ) where
+
+
+import Cryptol.Prims.Syntax (TFun(..))
+import Cryptol.TypeCheck.AST (Type(..),Prop,TVar,pIsEq,isFreeTV,TCon(..))
+import Cryptol.TypeCheck.Solver.Numeric.Interval (Interval,iIsFin,typeInterval)
+import Cryptol.TypeCheck.Subst (fvs)
+
+import           Control.Monad (msum,guard,mzero)
+import           Data.Function (on)
+import           Data.List (sortBy)
+import           Data.Maybe (catMaybes,listToMaybe)
+import           Data.Map (Map)
+import qualified Data.Set as Set
+
+
+-- | When given an equality constraint, attempt to rewrite it to the form `?x =
+-- ...`, by moving all occurrences of `?x` to the LHS, and any other variables
+-- to the RHS.  This will only work when there's only one unification variable
+-- present in the prop.
+tryRewritePropAsSubst :: Map TVar Interval -> Prop -> Maybe (TVar,Type)
+tryRewritePropAsSubst fins p =
+  do (x,y) <- pIsEq p
+
+     let vars = Set.toList (Set.filter isFreeTV (fvs p))
+
+     listToMaybe $ sortBy (flip compare `on` rank)
+                 $ catMaybes [ tryRewriteEq fins var x y | var <- vars ]
+
+
+-- | Rank a rewrite, favoring expressions that have fewer subtractions than
+-- additions.
+rank :: (TVar,Type) -> Int
+rank (_,ty) = go ty
+  where
+
+  go (TCon (TF TCAdd) ts) = sum (map go ts) + 1
+  go (TCon (TF TCSub) ts) = sum (map go ts) - 1
+  go (TCon (TF TCMul) ts) = sum (map go ts) + 1
+  go (TCon (TF TCDiv) ts) = sum (map go ts) - 1
+  go (TCon _          ts) = sum (map go ts)
+  go _                    = 0
+
+
+-- | Rewrite an equation with respect to a unification variable ?x, into the
+-- form `?x = t`.  There are two interesting cases to consider (four with
+-- symmetry):
+--
+--  * ?x = ty
+--  * expr containing ?x = expr
+--
+-- In the first case, we just return the type variable and the type, but in the
+-- second we try to rewrite the equation until it's in the form of the first
+-- case.
+tryRewriteEq :: Map TVar Interval -> TVar -> Type -> Type -> Maybe (TVar,Type)
+tryRewriteEq fins uvar l r =
+  msum [ do guard (uvarTy == l && uvar `Set.notMember` rfvs)
+            return (uvar, r)
+
+       , do guard (uvarTy == r && uvar `Set.notMember` lfvs)
+            return (uvar, l)
+
+       , do guard (uvar `Set.notMember` rfvs)
+            ty <- rewriteLHS fins uvar l r
+            return (uvar,ty)
+
+       , do guard (uvar `Set.notMember` lfvs)
+            ty <- rewriteLHS fins uvar r l
+            return (uvar,ty)
+       ]
+
+  where
+
+  uvarTy = TVar uvar
+
+  lfvs   = fvs l
+  rfvs   = fvs r
+
+
+-- | Check that a type contains only finite type variables.
+allFin :: Map TVar Interval -> Type -> Bool
+allFin ints ty = iIsFin (typeInterval ints ty)
+
+
+-- | Rewrite an equality until the LHS is just `uvar`. Return the rewritten RHS.
+--
+-- There are a few interesting cases when rewriting the equality:
+--
+--  A o B = R  when `uvar` is only present in A
+--  A o B = R  when `uvar` is only present in B
+--
+-- In the first case, as we only consider addition and subtraction, the
+-- rewriting will continue on the left, after moving the `B` side to the RHS of
+-- the equation.  In the second case, if the operation is addition, the `A` side
+-- will be moved to the RHS, with rewriting continuing in `B`. However, in the
+-- case of subtraction, the `B` side is moved to the RHS, and rewriting
+-- continues on the RHS instead.
+--
+-- In both cases, if the operation is addition, rewriting will only continue if
+-- the operand being moved to the RHS is known to be finite. If this check was
+-- not done, we would end up violating the well-definedness condition for
+-- subtraction (for a, b: well defined (a - b) iff fin b).
+rewriteLHS :: Map TVar Interval -> TVar -> Type -> Type -> Maybe Type
+rewriteLHS fins uvar = go
+  where
+
+  go (TVar tv) rhs | tv == uvar = return rhs
+
+  go (TCon (TF tf) [x,y]) rhs =
+    do let xfvs = fvs x
+           yfvs = fvs y
+
+           inX  = Set.member uvar xfvs
+           inY  = Set.member uvar yfvs
+
+       if | inX && inY -> mzero
+          | inX        -> balanceR x tf y rhs
+          | inY        -> balanceL x tf y rhs
+          | otherwise  -> mzero
+
+
+  -- discard type synonyms, the rewriting will make them no longer apply
+  go (TUser _ _ l) rhs =
+       go l rhs
+
+  -- records won't work here.
+  go _ _ =
+       mzero
+
+
+  -- invert the type function to balance the equation, when the variable occurs
+  -- on the LHS of the expression `x tf y`
+  balanceR x TCAdd y rhs = do guardFin y
+                              go x (TCon (TF TCSub) [rhs,y])
+  balanceR x TCSub y rhs = go x (TCon (TF TCAdd) [rhs,y])
+  balanceR _ _     _ _   = mzero
+
+
+  -- invert the type function to balance the equation, when the variable occurs
+  -- on the RHS of the expression `x tf y`
+  balanceL x TCAdd y rhs = do guardFin y
+                              go y (TCon (TF TCSub) [rhs,x])
+  balanceL x TCSub y rhs = go (TCon (TF TCAdd) [rhs,y]) x
+  balanceL _ _     _ _   = mzero
+
+
+  -- guard that the type is finite
+  --
+  -- XXX this ignores things like `min x inf` where x is finite, and just
+  -- assumes that it won't work.
+  guardFin ty = guard (allFin fins ty)
diff --git a/src/Cryptol/TypeCheck/Solver/Smtlib.hs b/src/Cryptol/TypeCheck/Solver/Smtlib.hs
deleted file mode 100644
--- a/src/Cryptol/TypeCheck/Solver/Smtlib.hs
+++ /dev/null
@@ -1,168 +0,0 @@
--- |
--- Module      :  $Header$
--- Copyright   :  (c) 2013-2015 Galois, Inc.
--- License     :  BSD3
--- Maintainer  :  cryptol@galois.com
--- Stability   :  provisional
--- Portability :  portable
-
-{-# LANGUAGE OverloadedStrings, RecordWildCards, PatternGuards #-}
-{-# LANGUAGE ScopedTypeVariables #-}
-module Cryptol.TypeCheck.Solver.Smtlib (simpDelayed) where
-
-import           Cryptol.TypeCheck.AST as Cry
-import           Cryptol.TypeCheck.Subst (fvs)
-import           Cryptol.TypeCheck.InferTypes(Goal(..))
-import           Cryptol.TypeCheck.Solver.FinOrd
-
-import           SMTLib2      as SMT
-import           SMTLib2.Int  as SMT
-import           SMTLib2.Core as SMT
-import qualified Control.Exception as X
-import           Data.String(fromString)
-import           Data.List(partition)
-import           Data.Maybe(mapMaybe)
-import qualified Data.Set as Set
-import           System.Directory(findExecutable)
-import           System.Environment(getExecutablePath)
-import           System.FilePath((</>), takeDirectory)
-import           System.Process(readProcessWithExitCode)
-import           System.Exit(ExitCode(..))
-
-
-simpDelayed :: [TParam] -> OrdFacts -> [Prop] -> [Goal] -> IO [Goal]
-simpDelayed _qvars ordAsmp origAsmps goals =
-  do ans <- mapM tryGoal goals
-
-     let (_natsDone,natsNot) = partition snd ans
-     -- XXX: check that `natsDone` also hold for the infinite case
-     return (map fst natsNot)
-
-  where
-  vs = map toVar (Set.toList (fvs (ordFactsToProps ordAsmp,
-                                        (origAsmps,map goal goals))))
-
-  asmps = mapMaybe toPred (ordFactsToProps ordAsmp ++ origAsmps)
-
-  tryGoal g = case toPred (goal g) of
-                Just q -> do res <- z3 (toScript vs asmps q)
-                             return (g, res == Unsat)
-                              -- i.e., solved for Nats, anyway
-                Nothing -> return (g, False)
-
-toTerm :: Cry.Type -> Maybe SMT.Expr
-toTerm ty =
-  case ty of
-    TCon tc ts  ->
-      do es <- mapM toTerm ts
-         case (tc, es) of
-           (TC (TCNum x), [])  -> return (SMT.num x)
-
-           (TF TCAdd, [e1,e2]) -> return (SMT.nAdd e1 e2)
-           (TF TCSub, [e1,e2]) -> return (SMT.nSub e1 e2)
-           (TF TCMul, [e1,e2]) -> return (SMT.nMul e1 e2)
-           (TF TCDiv, [e1,e2]) -> return (SMT.nDiv e1 e2)
-           (TF TCMod, [e1,e2]) -> return (SMT.nMod e1 e2)
-
-           (TF TCMin, [e1,e2]) -> return (SMT.ite (SMT.nLeq e1 e2) e1 e2)
-           (TF TCMax, [e1,e2]) -> return (SMT.ite (SMT.nLeq e1 e2) e2 e1)
-
-           (TF TCLg2,   [_])   -> Nothing
-           (TF TCExp,   [e1,e2])
-               | Lit (LitNum x) <- e2
-               , x >= 0        -> return $
-                                  if x == 0
-                                     then SMT.num (1 :: Int)
-                                     else foldr1 SMT.nMul
-                                        $ replicate (fromInteger x) e1
-               | otherwise     -> Nothing
-
-           (TF TCWidth, [_])   -> Nothing -- == lg2 (e + 1)
-
-           (TF TCLenFromThen, _) -> Nothing
-           (TF TCLenFromThenTo, _) -> Nothing
-
-           _  -> Nothing
-
-
-    Cry.TVar x      -> return (smtVar (toVar x))
-    TUser _ _ t -> toTerm t
-    TRec _      -> Nothing
-
-toVar :: TVar -> SMT.Name
-toVar (TVFree  x _ _ _) = fromString ("free"  ++ show x)
-toVar (TVBound x _) = fromString ("bound" ++ show x)
-
-smtVar :: SMT.Name -> SMT.Expr
-smtVar x = app (I x []) []
-
-toPred :: Cry.Prop -> Maybe SMT.Expr
-toPred ty =
-  case ty of
-    TCon tc ts ->
-      do es <- mapM toTerm ts
-         case (tc,es) of
-           (PC PEqual, [e1,e2])  -> return (e1 === e2)
-           (PC PGeq, [e1,e2])    -> return (SMT.nLeq e2 e1)
-
-           _                     -> Nothing
-
-    Cry.TVar {} -> Nothing
-    TUser _ _ t -> toPred t
-    TRec {}     -> Nothing
-
-toScript :: [SMT.Name] -> [SMT.Expr] -> SMT.Expr -> SMT.Script
-toScript vs pes q =
-  Script $
-    [ SMT.CmdSetLogic "QF_LIA" ] ++
-    [ SMT.CmdDeclareFun x [] SMT.tInt | x <- vs ] ++
-    [ SMT.CmdAssert (SMT.nLeq (SMT.num (0::Int)) (smtVar x)) | x <- vs ] ++
-    [ SMT.CmdAssert p | p <- pes ] ++
-    [ SMT.CmdAssert (SMT.not q) ] ++
-    [ SMT.CmdCheckSat ]
-
-data SMTResult = Sat | Unsat | Unknown
-                  deriving (Eq,Show)
-
--- | First look for @z3@ in the path, but failing that, assume that it's 
--- installed side-by-side with Cryptol.
-findZ3 :: IO FilePath
-findZ3 = do
-  mfp <- findExecutable "z3"
-  case mfp of
-    Just fp -> return fp
-    Nothing -> do
-     bindir <- takeDirectory `fmap` getExecutablePath
-     return (bindir </> "z3")
-
-z3 :: SMT.Script -> IO SMTResult
-z3 script =
-  X.handle (\(_::X.IOException) -> return Unknown) $
-  do let txt = show (SMT.pp script)
-     z3path <- findZ3
-     (ex,out,err) <- readProcessWithExitCode z3path ["-smt2","-in"] txt
-     case ex of
-       ExitFailure 10  -> return Sat
-       ExitFailure 20  -> return Unsat
-       ExitFailure 127 -> return Unknown -- z3 program not found
-       ExitSuccess
-         | out == "sat\n"     -> return Sat
-         | out == "unsat\n"   -> return Unsat
-         | out == "unknown\n" -> return Unknown
-
-       -- XXX: We should not print to STDOUT here.
-       -- Report to a separate logger.
-       x -> do putStrLn "Called to Z3 failed!!!"
-               putStrLn ("Exit code: " ++ show x)
-               putStrLn "Script"
-               putStrLn txt
-
-               putStrLn "Standard out:"
-               putStrLn out
-
-               putStrLn "Standard error:"
-               putStrLn err
-
-               return Unknown -- or error
-
-
diff --git a/src/Cryptol/TypeCheck/Solver/Utils.hs b/src/Cryptol/TypeCheck/Solver/Utils.hs
--- a/src/Cryptol/TypeCheck/Solver/Utils.hs
+++ b/src/Cryptol/TypeCheck/Solver/Utils.hs
@@ -1,6 +1,6 @@
 -- |
 -- Module      :  $Header$
--- Copyright   :  (c) 2013-2015 Galois, Inc.
+-- Copyright   :  (c) 2013-2016 Galois, Inc.
 -- License     :  BSD3
 -- Maintainer  :  cryptol@galois.com
 -- Stability   :  provisional
@@ -11,13 +11,6 @@
 import Cryptol.TypeCheck.AST
 import Control.Monad(mplus,guard)
 import Data.Maybe(listToMaybe)
-
--- min (a,min(b,c)) -> [a,b,c]
-splitMins :: Type -> [Type]
-splitMins ty =
-  case tNoUser ty of
-    TCon (TF TCMin) [t1,t2] -> splitMins t1 ++ splitMins t2
-    _ -> [ty]
 
 
 
diff --git a/src/Cryptol/TypeCheck/Subst.hs b/src/Cryptol/TypeCheck/Subst.hs
--- a/src/Cryptol/TypeCheck/Subst.hs
+++ b/src/Cryptol/TypeCheck/Subst.hs
@@ -1,6 +1,6 @@
 -- |
 -- Module      :  $Header$
--- Copyright   :  (c) 2013-2015 Galois, Inc.
+-- Copyright   :  (c) 2013-2016 Galois, Inc.
 -- License     :  BSD3
 -- Maintainer  :  cryptol@galois.com
 -- Stability   :  provisional
@@ -23,6 +23,7 @@
 import Cryptol.TypeCheck.PP
 import Cryptol.TypeCheck.TypeMap
 import Cryptol.Utils.Panic(panic)
+import Cryptol.Utils.Misc(anyJust)
 
 data Subst = S { suMap :: Map.Map TVar Type, suDefaulting :: !Bool }
                   deriving Show
@@ -57,9 +58,11 @@
 
 
 instance PP (WithNames Subst) where
-  ppPrec _ (WithNames s mp) = text "Substitution:" $$ nest 2
-                                (vcat $ map pp1 $ Map.toList $ suMap s)
+  ppPrec _ (WithNames s mp)
+    | null els  = text "(empty substitution)"
+    | otherwise = text "Substitution:" $$ nest 2 (vcat (map pp1 els))
     where pp1 (x,t) = ppWithNames mp x <+> text "=" <+> ppWithNames mp t
+          els       = Map.toList (suMap s)
 
 instance PP Subst where
   ppPrec n = ppWithNamesPrec IntMap.empty n
@@ -92,8 +95,29 @@
     where bound = Set.fromList (map tpVar as)
 
 
+-- | Apply a substitution.  Returns `Nothing` if nothing changed.
+apSubstMaybe :: Subst -> Type -> Maybe Type
+apSubstMaybe su ty =
+  case ty of
+    TCon t ts     -> TCon t `fmap` anyJust (apSubstMaybe su) ts
+    TUser f ts t  -> do t1 <- apSubstMaybe su t
+                        return (TUser f (map (apSubst su) ts) t1)
+    TRec fs       -> TRec `fmap` anyJust fld fs
+      where fld (x,t) = do t1 <- apSubstMaybe su t
+                           return (x,t1)
+    TVar x ->
+      case Map.lookup x (suMap su) of
+        Just t -> Just $ if suDefaulting su
+                            then apSubst (defaultingSubst emptySubst) t
+                            else t
+        Nothing -> if suDefaulting su
+                    then Just (defaultFreeVar x)
+                    else Nothing
 
 
+
+
+
 class TVars t where
   apSubst :: Subst -> t -> t      -- ^ replaces free vars
 
@@ -210,7 +234,6 @@
         ECast e t     -> ECast (go e) (apSubst su t)
 
         EVar {}       -> expr
-        ECon {}       -> expr
 
         ETuple es     -> ETuple (map go es)
         ERec fs       -> ERec [ (f, go e) | (f,e) <- fs ]
@@ -233,6 +256,10 @@
   apSubst su d          = d { dSignature  = apSubst su (dSignature d)
                             , dDefinition = apSubst su (dDefinition d)
                             }
+
+instance TVars DeclDef where
+  apSubst su (DExpr e) = DExpr (apSubst su e)
+  apSubst _  DPrim     = DPrim
 
 instance TVars Module where
   apSubst su m = m { mDecls = apSubst su (mDecls m) }
diff --git a/src/Cryptol/TypeCheck/TypeMap.hs b/src/Cryptol/TypeCheck/TypeMap.hs
--- a/src/Cryptol/TypeCheck/TypeMap.hs
+++ b/src/Cryptol/TypeCheck/TypeMap.hs
@@ -1,6 +1,6 @@
 -- |
 -- Module      :  $Header$
--- Copyright   :  (c) 2013-2015 Galois, Inc.
+-- Copyright   :  (c) 2013-2016 Galois, Inc.
 -- License     :  BSD3
 -- Maintainer  :  cryptol@galois.com
 -- Stability   :  provisional
@@ -20,6 +20,7 @@
   ) where
 
 import           Cryptol.TypeCheck.AST
+import           Cryptol.Utils.Ident
 
 import qualified Data.Map as Map
 import           Data.Map (Map)
@@ -114,8 +115,8 @@
 type TypesMap = List TypeMap
 
 data TypeMap a = TM { tvar :: Map TVar a
-                    , tcon :: Map TCon   (List TypeMap a)
-                    , trec :: Map [Name] (List TypeMap a)
+                    , tcon :: Map TCon    (List TypeMap a)
+                    , trec :: Map [Ident] (List TypeMap a)
                     } deriving (Functor)
 
 instance TrieMap TypeMap Type where
@@ -167,4 +168,3 @@
 
 instance Show a => Show (TypeMap a) where
   showsPrec p xs = showsPrec p (toListTM xs)
-
diff --git a/src/Cryptol/TypeCheck/TypeOf.hs b/src/Cryptol/TypeCheck/TypeOf.hs
--- a/src/Cryptol/TypeCheck/TypeOf.hs
+++ b/src/Cryptol/TypeCheck/TypeOf.hs
@@ -1,6 +1,6 @@
 -- |
 -- Module      :  $Header$
--- Copyright   :  (c) 2014-2015 Galois, Inc.
+-- Copyright   :  (c) 2014-2016 Galois, Inc.
 -- License     :  BSD3
 -- Maintainer  :  cryptol@galois.com
 -- Stability   :  provisional
@@ -8,6 +8,7 @@
 
 {-# LANGUAGE Safe                                #-}
 {-# LANGUAGE ViewPatterns                        #-}
+{-# LANGUAGE PatternGuards                       #-}
 module Cryptol.TypeCheck.TypeOf
   ( fastTypeOf
   , fastSchemaOf
@@ -15,18 +16,16 @@
 
 import Cryptol.TypeCheck.AST
 import Cryptol.TypeCheck.Subst
-import Cryptol.Prims.Types (typeOf)
 import Cryptol.Utils.Panic
 import Cryptol.Utils.PP
 
 import           Data.Map    (Map)
 import qualified Data.Map as Map
-import           Data.Maybe (fromJust)
 
 -- | Given a typing environment and an expression, compute the type of
 -- the expression as quickly as possible, assuming that the expression
 -- is well formed with correct type annotations.
-fastTypeOf :: Map QName Schema -> Expr -> Type
+fastTypeOf :: Map Name Schema -> Expr -> Type
 fastTypeOf tyenv expr =
   case expr of
     -- Monomorphic fragment
@@ -43,7 +42,6 @@
                                          [ "EApp with non-function operator" ]
     ECast _ t     -> t
     -- Polymorphic fragment
-    ECon      {}  -> polymorphic
     EVar      {}  -> polymorphic
     ETAbs     {}  -> polymorphic
     ETApp     {}  -> polymorphic
@@ -57,12 +55,14 @@
         _ -> panic "Cryptol.TypeCheck.TypeOf.fastTypeOf"
                [ "unexpected polymorphic type" ]
 
-fastSchemaOf :: Map QName Schema -> Expr -> Schema
+fastSchemaOf :: Map Name Schema -> Expr -> Schema
 fastSchemaOf tyenv expr =
   case expr of
     -- Polymorphic fragment
-    ECon econ      -> typeOf econ
-    EVar x         -> fromJust (Map.lookup x tyenv)
+    EVar x         -> case Map.lookup x tyenv of
+                         Just ty -> ty
+                         Nothing -> panic "Cryptol.TypeCheck.TypeOf.fastSchemaOf"
+                               [ "EVar failed to find type variable:", show x ]
     ETAbs tparam e -> case fastSchemaOf tyenv e of
                         Forall tparams props ty -> Forall (tparam : tparams) props ty
     ETApp e t      -> case fastSchemaOf tyenv e of
@@ -99,8 +99,10 @@
 
 -- | Yields the return type of the selector on the given argument type.
 typeSelect :: Type -> Selector -> Type
+typeSelect (TUser _ _ ty) sel = typeSelect ty sel
 typeSelect (TCon _tctuple ts) (TupleSel i _) = ts !! i
-typeSelect (TRec fields) (RecordSel n _) = fromJust (lookup n fields)
+typeSelect (TRec fields) (RecordSel n _)
+     | Just ty <- lookup n fields = ty
 typeSelect (TCon _tcseq [_, a]) (ListSel _ _) = a
 typeSelect ty _ = panic "Cryptol.TypeCheck.TypeOf.typeSelect"
                     [ "cannot apply selector to value of type", render (pp ty) ]
diff --git a/src/Cryptol/TypeCheck/Unify.hs b/src/Cryptol/TypeCheck/Unify.hs
--- a/src/Cryptol/TypeCheck/Unify.hs
+++ b/src/Cryptol/TypeCheck/Unify.hs
@@ -1,6 +1,6 @@
 -- |
 -- Module      :  $Header$
--- Copyright   :  (c) 2013-2015 Galois, Inc.
+-- Copyright   :  (c) 2013-2016 Galois, Inc.
 -- License     :  BSD3
 -- Maintainer  :  cryptol@galois.com
 -- Stability   :  provisional
@@ -19,9 +19,8 @@
 import Data.List(sortBy)
 import qualified Data.Set as Set
 
-#if __GLASGOW_HASKELL__ < 710
-import Control.Applicative (Applicative(..))
-#endif
+import Prelude ()
+import Prelude.Compat
 
 -- | The most general unifier is a substitution and a set of constraints
 -- on bound variables.
diff --git a/src/Cryptol/Utils/Debug.hs b/src/Cryptol/Utils/Debug.hs
--- a/src/Cryptol/Utils/Debug.hs
+++ b/src/Cryptol/Utils/Debug.hs
@@ -1,33 +1,18 @@
 -- |
 -- Module      :  $Header$
--- Copyright   :  (c) 2013-2015 Galois, Inc.
+-- Copyright   :  (c) 2013-2016 Galois, Inc.
 -- License     :  BSD3
 -- Maintainer  :  cryptol@galois.com
 -- Stability   :  provisional
 -- Portability :  portable
 
-{-# LANGUAGE CPP #-}
-#define DEBUG
-
-#ifdef DEBUG
-{-# LANGUAGE Trustworthy #-}
-#else
-{-# LANGUAGE Safe #-}
-#endif
-
 module Cryptol.Utils.Debug where
 
 import Cryptol.Utils.PP
 
-#ifdef DEBUG
 import qualified Debug.Trace as X
 trace :: String -> b -> b
 trace = X.trace
-#else
-trace :: String -> b -> b
-trace _ x = x
-#endif
 
 ppTrace :: Doc -> b -> b
 ppTrace d = trace (show d)
-
diff --git a/src/Cryptol/Utils/Ident.hs b/src/Cryptol/Utils/Ident.hs
new file mode 100644
--- /dev/null
+++ b/src/Cryptol/Utils/Ident.hs
@@ -0,0 +1,90 @@
+-- |
+-- Module      :  $Header$
+-- Copyright   :  (c) 2015-2016 Galois, Inc.
+-- License     :  BSD3
+-- Maintainer  :  cryptol@galois.com
+-- Stability   :  provisional
+-- Portability :  portable
+
+{-# LANGUAGE DeriveGeneric #-}
+
+module Cryptol.Utils.Ident where
+
+import           Control.DeepSeq (NFData)
+import           Data.Char (isSpace)
+import           Data.List (unfoldr)
+import qualified Data.Text as T
+import           Data.String (IsString(..))
+import           GHC.Generics (Generic)
+
+
+-- | Module names are just text.
+type ModName = T.Text
+
+unpackModName :: ModName -> [String]
+unpackModName  = unfoldr step
+  where
+  step str
+    | T.null str = Nothing
+    | otherwise  = case T.breakOn modSep str of
+                     (a,b) -> Just (T.unpack a,T.drop (T.length modSep) b)
+
+packModName :: [String] -> ModName
+packModName strs = T.intercalate modSep (map (trim . T.pack) strs)
+  where
+  -- trim space off of the start and end of the string
+  trim str = T.dropWhile isSpace (T.dropWhileEnd isSpace str)
+
+modSep :: T.Text
+modSep  = T.pack "::"
+
+-- | Identifiers, along with a flag that indicates whether or not they're infix
+-- operators. The boolean is present just as cached information from the lexer,
+-- and never used during comparisons.
+data Ident = Ident Bool T.Text
+             deriving (Show,Generic)
+
+instance Eq Ident where
+  a == b = compare a b == EQ
+  a /= b = compare a b /= EQ
+
+instance Ord Ident where
+  compare (Ident _ i1) (Ident _ i2) = compare i1 i2
+
+instance IsString Ident where
+  fromString str = mkIdent (T.pack str)
+
+instance NFData Ident
+
+packIdent :: String -> Ident
+packIdent  = mkIdent . T.pack
+
+packInfix :: String -> Ident
+packInfix  = mkInfix . T.pack
+
+unpackIdent :: Ident -> String
+unpackIdent  = T.unpack . identText
+
+mkIdent :: T.Text -> Ident
+mkIdent  = Ident False
+
+mkInfix :: T.Text -> Ident
+mkInfix  = Ident True
+
+isInfixIdent :: Ident -> Bool
+isInfixIdent (Ident b _) = b
+
+nullIdent :: Ident -> Bool
+nullIdent (Ident _ t) = T.null t
+
+identText :: Ident -> T.Text
+identText (Ident _ t) = t
+
+
+-- Frequently Used Names -------------------------------------------------------
+
+preludeName :: ModName
+preludeName  = packModName ["Cryptol"]
+
+interactiveName :: ModName
+interactiveName  = packModName ["<interactive>"]
diff --git a/src/Cryptol/Utils/Misc.hs b/src/Cryptol/Utils/Misc.hs
new file mode 100644
--- /dev/null
+++ b/src/Cryptol/Utils/Misc.hs
@@ -0,0 +1,35 @@
+-- |
+-- Module      :  $Header$
+-- Copyright   :  (c) 2014-2016 Galois, Inc.
+-- License     :  BSD3
+-- Maintainer  :  cryptol@galois.com
+-- Stability   :  provisional
+-- Portability :  portable
+
+{-# LANGUAGE Safe, FlexibleContexts #-}
+module Cryptol.Utils.Misc where
+
+import MonadLib
+import Data.Maybe(fromMaybe)
+
+import Prelude ()
+import Prelude.Compat
+
+-- | Apply a function to all elements of a container.
+-- Returns `Nothing` if nothing changed, and @Just container@ otherwise.
+anyJust :: Traversable t => (a -> Maybe a) -> t a -> Maybe (t a)
+anyJust f m = mk $ runId $ runStateT False $ traverse upd m
+  where
+  mk (a,changes) = if changes then Just a else Nothing
+
+  upd x = case f x of
+            Just y  -> set True >> return y
+            Nothing -> return x
+
+-- | Apply functions to both elements of a pair.
+-- Returns `Nothing` if neither changed, and @Just pair@ otherwise.
+anyJust2 :: (a -> Maybe a) -> (b -> Maybe b) -> (a,b) -> Maybe (a,b)
+anyJust2 f g (a,b) =
+  case (f a, g b) of
+    (Nothing, Nothing) -> Nothing
+    (x,y)              -> Just (fromMaybe a x, fromMaybe b y)
diff --git a/src/Cryptol/Utils/PP.hs b/src/Cryptol/Utils/PP.hs
--- a/src/Cryptol/Utils/PP.hs
+++ b/src/Cryptol/Utils/PP.hs
@@ -1,6 +1,6 @@
 -- |
 -- Module      :  $Header$
--- Copyright   :  (c) 2013-2015 Galois, Inc.
+-- Copyright   :  (c) 2013-2016 Galois, Inc.
 -- License     :  BSD3
 -- Maintainer  :  cryptol@galois.com
 -- Stability   :  provisional
@@ -8,25 +8,119 @@
 
 {-# LANGUAGE Safe #-}
 {-# LANGUAGE PatternGuards #-}
-module Cryptol.Utils.PP
-  ( PP(..)
-  , pp
-  , pretty
-  , optParens
-  , ppInfix
-  , Assoc(..)
-  , Infix(..)
-  , module Text.PrettyPrint
-  , ordinal
-  , ordSuffix
-  , commaSep
-  ) where
+{-# LANGUAGE DeriveGeneric #-}
+module Cryptol.Utils.PP where
 
-import Text.PrettyPrint
+import           Cryptol.Utils.Ident
 
+import           Control.DeepSeq.Generics
+import           Control.Monad (mplus)
+import           Data.Maybe (fromMaybe)
+import           Data.String (IsString(..))
+import qualified Data.Text as T
+import           GHC.Generics (Generic)
+import qualified Text.PrettyPrint as PJ
+
+import Prelude ()
+import Prelude.Compat
+
+-- Name Displaying -------------------------------------------------------------
+
+-- | How to display names, inspired by the GHC `Outputable` module. Getting a
+-- value of 'Nothing' from the NameDisp function indicates that the name is not
+-- in scope.
+data NameDisp = EmptyNameDisp
+              | NameDisp (ModName -> Ident -> Maybe NameFormat)
+                deriving (Generic)
+
+instance NFData NameDisp where rnf = genericRnf
+
+instance Show NameDisp where
+  show _ = "<NameDisp>"
+
+instance Monoid NameDisp where
+  mempty = EmptyNameDisp
+
+  mappend (NameDisp f)  (NameDisp g)  = NameDisp (\m n -> f m n `mplus` g m n)
+  mappend EmptyNameDisp EmptyNameDisp = EmptyNameDisp
+  mappend EmptyNameDisp x             = x
+  mappend x             _             = x
+
+
+data NameFormat = UnQualified
+                | Qualified !ModName
+                | NotInScope
+                  deriving (Show)
+
+-- | Never qualify names from this module.
+neverQualifyMod :: ModName -> NameDisp
+neverQualifyMod mn = NameDisp $ \ mn' _ ->
+  if mn == mn' then Just UnQualified
+               else Nothing
+
+alwaysQualify :: NameDisp
+alwaysQualify  = NameDisp $ \ mn _ -> Just (Qualified mn)
+
+neverQualify :: NameDisp
+neverQualify  = NameDisp $ \ _ _ -> Just UnQualified
+
+fmtModName :: ModName -> NameFormat -> ModName
+fmtModName _  UnQualified    = T.empty
+fmtModName _  (Qualified mn) = mn
+fmtModName mn NotInScope     = mn
+
+-- | Compose two naming environments, preferring names from the left
+-- environment.
+extend :: NameDisp -> NameDisp -> NameDisp
+extend  = mappend
+
+-- | Get the format for a name. When 'Nothing' is returned, the name is not
+-- currently in scope.
+getNameFormat :: ModName -> Ident -> NameDisp -> NameFormat
+getNameFormat m i (NameDisp f)  = fromMaybe NotInScope (f m i)
+getNameFormat _ _ EmptyNameDisp = NotInScope
+
+-- | Produce a document in the context of the current 'NameDisp'.
+withNameDisp :: (NameDisp -> Doc) -> Doc
+withNameDisp k = Doc (\disp -> runDoc disp (k disp))
+
+-- | Fix the way that names are displayed inside of a doc.
+fixNameDisp :: NameDisp -> Doc -> Doc
+fixNameDisp disp (Doc f) = Doc (\ _ -> f disp)
+
+
+-- Documents -------------------------------------------------------------------
+
+newtype Doc = Doc (NameDisp -> PJ.Doc) deriving (Generic)
+
+instance Monoid Doc where
+  mempty = liftPJ PJ.empty
+  mappend = liftPJ2 (PJ.<>)
+
+instance NFData Doc where rnf = genericRnf
+
+runDoc :: NameDisp -> Doc -> PJ.Doc
+runDoc names (Doc f) = f names
+
+instance Show Doc where
+  show d = show (runDoc mempty d)
+
+instance IsString Doc where
+  fromString = text
+
+render :: Doc -> String
+render d = PJ.render (runDoc mempty d)
+
 class PP a where
   ppPrec :: Int -> a -> Doc
 
+class PP a => PPName a where
+  -- | Print a name in prefix: @f a b@ or @(+) a b)@
+  ppPrefixName :: a -> Doc
+
+  -- | Print a name as an infix operator: @a + b@
+  ppInfixName  :: a -> Doc
+
 pp :: PP a => a -> Doc
 pp = ppPrec 0
 
@@ -40,8 +134,10 @@
 
 -- | Information about associativity.
 data Assoc = LeftAssoc | RightAssoc | NonAssoc
-              deriving (Show,Eq)
+              deriving (Show,Eq,Generic)
 
+instance NFData Assoc where rnf = genericRnf
+
 -- | Information about an infix expression of some sort.
 data Infix op thing = Infix
   { ieOp    :: op       -- ^ operator
@@ -93,3 +189,96 @@
   notTeen = m < 11 || m > 19
 
 
+-- Wrapped Combinators ---------------------------------------------------------
+
+liftPJ :: PJ.Doc -> Doc
+liftPJ d = Doc (const d)
+
+liftPJ1 :: (PJ.Doc -> PJ.Doc) -> Doc -> Doc
+liftPJ1 f (Doc d) = Doc (\env -> f (d env))
+
+liftPJ2 :: (PJ.Doc -> PJ.Doc -> PJ.Doc) -> (Doc -> Doc -> Doc)
+liftPJ2 f (Doc a) (Doc b) = Doc (\e -> f (a e) (b e))
+
+liftSep :: ([PJ.Doc] -> PJ.Doc) -> ([Doc] -> Doc)
+liftSep f ds = Doc (\e -> f [ d e | Doc d <- ds ])
+
+infixl 6 <>, <+>
+
+(<>) :: Doc -> Doc -> Doc
+(<>)  = liftPJ2 (PJ.<>)
+
+(<+>) :: Doc -> Doc -> Doc
+(<+>)  = liftPJ2 (PJ.<+>)
+
+infixl 5 $$
+
+($$) :: Doc -> Doc -> Doc
+($$)  = liftPJ2 (PJ.$$)
+
+sep :: [Doc] -> Doc
+sep  = liftSep PJ.sep
+
+fsep :: [Doc] -> Doc
+fsep  = liftSep PJ.fsep
+
+hsep :: [Doc] -> Doc
+hsep  = liftSep PJ.hsep
+
+hcat :: [Doc] -> Doc
+hcat  = liftSep PJ.hcat
+
+vcat :: [Doc] -> Doc
+vcat  = liftSep PJ.vcat
+
+hang :: Doc -> Int -> Doc -> Doc
+hang (Doc p) i (Doc q) = Doc (\e -> PJ.hang (p e) i (q e))
+
+nest :: Int -> Doc -> Doc
+nest n = liftPJ1 (PJ.nest n)
+
+parens :: Doc -> Doc
+parens  = liftPJ1 PJ.parens
+
+braces :: Doc -> Doc
+braces  = liftPJ1 PJ.braces
+
+brackets :: Doc -> Doc
+brackets  = liftPJ1 PJ.brackets
+
+quotes :: Doc -> Doc
+quotes  = liftPJ1 PJ.quotes
+
+punctuate :: Doc -> [Doc] -> [Doc]
+punctuate p = go
+  where
+  go (d:ds) | null ds   = [d]
+            | otherwise = d <> p : go ds
+  go []                 = []
+
+text :: String -> Doc
+text s = liftPJ (PJ.text s)
+
+char :: Char -> Doc
+char c = liftPJ (PJ.char c)
+
+integer :: Integer -> Doc
+integer i = liftPJ (PJ.integer i)
+
+int :: Int -> Doc
+int i = liftPJ (PJ.int i)
+
+comma :: Doc
+comma  = liftPJ PJ.comma
+
+empty :: Doc
+empty  = liftPJ PJ.empty
+
+colon :: Doc
+colon  = liftPJ PJ.colon
+
+instance PP T.Text where
+  ppPrec _ str = text (T.unpack str)
+
+instance PP Ident where
+  ppPrec _ i = text (T.unpack (identText i))
diff --git a/src/Cryptol/Utils/Panic.hs b/src/Cryptol/Utils/Panic.hs
--- a/src/Cryptol/Utils/Panic.hs
+++ b/src/Cryptol/Utils/Panic.hs
@@ -1,6 +1,6 @@
 -- |
 -- Module      :  $Header$
--- Copyright   :  (c) 2013-2015 Galois, Inc.
+-- Copyright   :  (c) 2013-2016 Galois, Inc.
 -- License     :  BSD3
 -- Maintainer  :  cryptol@galois.com
 -- Stability   :  provisional
diff --git a/src/Cryptol/Version.hs b/src/Cryptol/Version.hs
--- a/src/Cryptol/Version.hs
+++ b/src/Cryptol/Version.hs
@@ -1,6 +1,6 @@
 -- |
 -- Module      :  $Header$
--- Copyright   :  (c) 2013-2015 Galois, Inc.
+-- Copyright   :  (c) 2013-2016 Galois, Inc.
 -- License     :  BSD3
 -- Maintainer  :  cryptol@galois.com
 -- Stability   :  provisional
@@ -8,8 +8,15 @@
 
 {-# LANGUAGE Safe #-}
 
-module Cryptol.Version where
+module Cryptol.Version (
+    commitHash
+  , commitShortHash
+  , commitBranch
+  , commitDirty
+  , version
+  ) where
 
+import Paths_cryptol
 import qualified GitRev
 
 commitHash :: String
diff --git a/src/GitRev.hs b/src/GitRev.hs
--- a/src/GitRev.hs
+++ b/src/GitRev.hs
@@ -1,6 +1,6 @@
 -- |
 -- Module      :  $Header$
--- Copyright   :  (c) 2014-2015 Galois, Inc.
+-- Copyright   :  (c) 2014-2016 Galois, Inc.
 -- License     :  BSD3
 -- Maintainer  :  cryptol@galois.com
 -- Stability   :  provisional
