diff --git a/Main.hs b/Main.hs
--- a/Main.hs
+++ b/Main.hs
@@ -10,12 +10,14 @@
 import Data.Char
 import Data.Either
 import Data.List
+import Distribution.Text
 import GHC.IO.Exception
 import Language.Pec.Abs
 import Language.Pec.ErrM
 import Language.Pec.Layout
 import Language.Pec.Par
 import Language.Pec.Print
+import Paths_pec
 import System.Console.CmdArgs
 import System.Directory
 import System.FilePath
@@ -26,6 +28,7 @@
   { files :: [FilePath]
   , keep_tmp_files :: Bool
   , rebuild_all :: Bool
+  , idir :: [FilePath]
   } deriving (Show, Data, Typeable)
 
 argsDesc :: Args
@@ -33,10 +36,11 @@
   { files = def &= args
   , keep_tmp_files = def &= help "Keep temporary files"
   , rebuild_all = def &= help "Rebuild all files"
+  , idir = def &= typDir &= help "Import directory"
   } &= summary summry &= program prog
 
 summry :: String
-summry = prog ++ " v" ++ vers ++ ", " ++ copyright
+summry = prog ++ " v" ++ display version ++ ", " ++ copyright
 
 prog :: String
 prog = "pec"
@@ -44,20 +48,21 @@
 copyright :: String
 copyright = "(C) Brett Letner 2011"
 
-vers :: String
-vers = "0.1"
-
-initSt :: Args -> St
-initSt x = St
-  { visited = []
-  , modified = False
-  , rebuild = rebuild_all x
-  , not_visited = map (\fn -> dropExtension fn ++ "_") $ files x
-  , strings = []
-  , counts = []
-  , keep_tmps = keep_tmp_files x
---   , mains = []
-  }
+initSt :: Args -> IO St
+initSt x = do
+  prel <- getDataFileName "lib/Prelude.pec"
+  return $ St
+    { visited = []
+    , modified = False
+    , rebuild = rebuild_all x
+    , not_visited = map (\fn -> dropExtension fn ++ "_") $ files x
+    , strings = []
+    , counts = []
+    , keep_tmps = keep_tmp_files x
+  --   , mains = []
+    , lib_dir = takeDirectory prel
+    , imp_dirs = idir x
+    }
 
 type M a = StateT St IO a
 
@@ -69,6 +74,8 @@
   , strings :: [String]
   , counts :: [Integer]
   , keep_tmps :: Bool
+  , lib_dir :: FilePath
+  , imp_dirs :: [FilePath]
 --   , mains :: [FilePath]
   }
 
@@ -76,26 +83,25 @@
 main = do
   args <- cmdArgs argsDesc
   let fns = files args
+  st0 <- initSt args
   case fns of
     [] -> putStrLn summry
     (fn:_) -> do
       let mnFn = new_ext "_main.hs" fn
       let llFn = new_ext ".ll" fn
-      st <- execStateT pec_all $ initSt args
-      when (modified st || rebuild st) $ writeFile mnFn $ H.prettyPrint $
+      st <- execStateT pec_all st0
+      mnFnExists <- doesFileExist mnFn
+      when (modified st || rebuild st || not mnFnExists) $ writeFile mnFn $ H.prettyPrint $
         hMainModule (dropExtension fn) (visited st) (strings st)
-      let mnExe = new_ext ".exe" mnFn
-      my_system $ unwords ["ghc --make -o", mnExe, mnFn] -- fixme:check exit code
-      pwd <- getCurrentDirectory
-      my_system $ pwd ++ "/" ++ mnExe
+      my_system "runghc" ["-i" ++ concat (intersperse ":" $ all_imp_dirs st), mnFn]
       let llFns = ["istrings_" ++ new_ext ".ll" fn] ++ (map (new_ext ".ll" . init) $ visited st)
       let llBc = new_ext ".bc" llFn
-      my_system $ "cat " ++ unwords llFns ++ " | llvm-as > " ++ llBc
+      _ <- system $ "cat " ++ unwords llFns ++ " | llvm-as > " ++ llBc
       let llExe = new_ext ".exe" llFn
-      my_system $ unwords ["llvm-ld -disable-opt -o", llExe, llBc] -- array bug in llvm
-      when (not $ keep_tmps st) $ my_system $ unwords $
-        [ "rm *.hi *.o", "*_.hs" -- fixme: clean up Cnts files
-        , mnExe, mnFn, llBc
+      my_system2 "llvm-ld" ["-disable-opt", "-native", "-o", llExe, llBc] -- array bug in llvm
+      when (not $ keep_tmps st) $ my_system "rm" $
+        [ "-f", "*.hi", "*.o", "*_.hs" -- fixme: clean up Cnts files
+        , mnFn, llBc, new_ext ".exe.bc" fn
         ] ++ llFns
       return ()
 
@@ -115,7 +121,8 @@
 
 pec_file :: FilePath -> M [FilePath]
 pec_file n = do
-  let fn = init n ++ ".pec"
+  let fn0 = init n ++ ".pec"
+  fn <- my_get_filepath fn0
   let hsFn = new_ext "_.hs" fn
   ss <- lift $ liftM lines $ readFile fn
   let (xs,ys) = partition (\s -> not (null s) && head s == '>') ss
@@ -130,6 +137,23 @@
           imports_hack (lines $ H.prettyPrint h) (map tail xs)
       return $ imports m
 
+all_imp_dirs :: St -> [String]
+all_imp_dirs st = ["."] ++ imp_dirs st ++ [lib_dir st]
+
+my_get_filepath :: FilePath -> M FilePath
+my_get_filepath fn = do
+  xs <- gets all_imp_dirs
+  lift $ get_filepath fn xs
+
+get_filepath :: FilePath -> [FilePath] -> IO FilePath
+get_filepath fn [] = error $ "unable to find file:" ++ fn
+get_filepath fn0 (x:xs) = do
+  let fn = joinPath $ splitPath x ++ [fn0]
+  r <- doesFileExist fn
+  if r
+    then return fn
+    else get_filepath fn0 xs
+
 isOutOfDate :: FilePath -> FilePath -> M Bool
 isOutOfDate inFn outFn = do
   b <- gets rebuild
@@ -685,10 +709,19 @@
 userc :: Print a => a -> String
 userc a = printTree a ++ "_"
 
-my_system :: String -> IO ()
-my_system s = do
-  putStrLn $ "system:" ++ s
-  ec <- system s
+my_system :: String -> [String] -> IO ()
+my_system s ss = do
+  putStrLn $ "system:" ++ unwords (s:ss)
+  ec <- rawSystem s ss
+  case ec of
+    ExitSuccess -> return ()
+    ExitFailure i -> error $ "exiting(" ++ show i ++ ")"
+
+my_system2 :: String -> [String] -> IO ()
+my_system2 s ss = do
+  let cmd = unwords (s:ss)
+  putStrLn $ "system:" ++ cmd
+  ec <- system cmd
   case ec of
     ExitSuccess -> return ()
     ExitFailure i -> error $ "exiting(" ++ show i ++ ")"
diff --git a/README b/README
--- a/README
+++ b/README
@@ -4,7 +4,7 @@
 modern language features.  Pec is a procedural language with a
 functional/declarative feel.  Programming in pec is very similar to
 monadic programming in Haskell.  The primary use case for pec is to
-provide a productive environment for writing safe, performant embedded
+provide a productive environment for writing safe, efficient, embedded
 applications.
 
 Feature list
@@ -26,7 +26,8 @@
 small codebase (thanks to several existing Haskell tools/libraries).
 
 You can download and install pec via cabal or access the git
-repository on github (git@github.com:stevezhee/pec.git).
+repository on github (git@github.com:stevezhee/pec.git).  You'll need
+to install the llvm tools (http://llvm.org/) to build the examples.
 
 Any feedback on the design and/or implementation of pec would be
 greatly appreciated :)
diff --git a/dist/build/pec/pec-tmp/Language/Pec/Lex.hs b/dist/build/pec/pec-tmp/Language/Pec/Lex.hs
new file mode 100644
--- /dev/null
+++ b/dist/build/pec/pec-tmp/Language/Pec/Lex.hs
@@ -0,0 +1,361 @@
+{-# OPTIONS -fglasgow-exts -cpp #-}
+{-# LINE 3 "Language/Pec/Lex.x" #-}
+
+{-# OPTIONS -fno-warn-incomplete-patterns #-}
+module Language.Pec.Lex where
+
+
+
+
+#if __GLASGOW_HASKELL__ >= 603
+#include "ghcconfig.h"
+#elif defined(__GLASGOW_HASKELL__)
+#include "config.h"
+#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_base :: AlexAddr
+alex_base = AlexA# "\xf8\xff\xff\xff\xd7\xff\xff\xff\xfd\xff\xff\xff\xe5\x00\x00\x00\xfe\xff\xff\xff\x0b\x01\x00\x00\xda\xff\xff\xff\x2e\x01\x00\x00\xe0\xff\xff\xff\x51\x01\x00\x00\x00\x00\x00\x00\x74\x01\x00\x00\xe1\xff\xff\xff\x97\x01\x00\x00\xe2\xff\xff\xff\xba\x01\x00\x00\xdd\x01\x00\x00\xe3\xff\xff\xff\x00\x02\x00\x00\x6e\x00\x00\x00\x00\x00\x00\x00\x23\x02\x00\x00\x46\x02\x00\x00\x9b\x02\x00\x00\xbe\x02\x00\x00\xe1\x02\x00\x00\x36\x03\x00\x00\x4c\x00\x00\x00\x5f\x00\x00\x00\x69\x00\x00\x00\x75\x00\x00\x00\xcb\x00\x00\x00\x57\x02\x00\x00\x54\x03\x00\x00\x24\x04\x00\x00\xf4\x04\x00\x00\xc4\x05\x00\x00\x94\x06\x00\x00\x64\x07\x00\x00\x43\x08\x00\x00\x61\x02\x00\x00\x61\x08\x00\x00\x00\x00\x00\x00\xfb\x00\x00\x00\x04\x01\x00\x00\x81\x02\x00\x00\x00\x00\x00\x00\xe7\xff\xff\xff\x31\x00\x00\x00\xf0\x00\x00\x00"#
+
+alex_table :: AlexAddr
+alex_table = AlexA# "\x00\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x06\x00\xff\xff\xff\xff\x02\x00\x0e\x00\x0e\x00\x0c\x00\x0e\x00\x2e\x00\x00\x00\x08\x00\x0a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x13\x00\x27\x00\x2b\x00\x17\x00\x27\x00\x27\x00\x27\x00\x30\x00\x14\x00\x14\x00\x27\x00\x27\x00\x14\x00\x1a\x00\x15\x00\x07\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x18\x00\x14\x00\x19\x00\x16\x00\x27\x00\x27\x00\x16\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\x14\x00\x27\x00\x14\x00\x27\x00\x23\x00\xff\xff\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\x14\x00\x16\x00\x14\x00\x27\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x1b\x00\x1b\x00\x1b\x00\x1b\x00\x1b\x00\x1b\x00\x1b\x00\x1b\x00\x1b\x00\x1b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x31\x00\x13\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1b\x00\x1b\x00\x1b\x00\x1b\x00\x1b\x00\x1b\x00\x1b\x00\x1b\x00\x1b\x00\x1b\x00\x1d\x00\x00\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x00\x00\x00\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\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\xff\xff\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x20\x00\x00\x00\x00\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\xff\xff\x05\x00\x00\x00\x05\x00\x05\x00\x05\x00\x05\x00\x00\x00\x00\x00\xff\xff\x05\x00\x05\x00\x00\x00\x05\x00\x05\x00\x05\x00\xff\xff\x00\x00\x2f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2a\x00\x00\x00\x05\x00\x00\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x2a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x05\x00\x05\x00\x05\x00\x05\x00\x00\x00\x00\x00\x00\x00\x05\x00\x05\x00\x00\x00\x05\x00\x05\x00\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x05\x00\x00\x00\x05\x00\x00\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x2f\x00\x00\x00\x00\x00\x27\x00\x00\x00\x27\x00\x27\x00\x27\x00\x27\x00\x00\x00\x00\x00\x2d\x00\x10\x00\x27\x00\x00\x00\x27\x00\x27\x00\x03\x00\x2f\x00\x00\x00\x2d\x00\x05\x00\x00\x00\x05\x00\x2f\x00\x00\x00\x00\x00\x05\x00\x27\x00\x05\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x0f\x00\x12\x00\x00\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x05\x00\x27\x00\x12\x00\x27\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x27\x00\x00\x00\x27\x00\x27\x00\x27\x00\x27\x00\x00\x00\x00\x00\x00\x00\x27\x00\x27\x00\x00\x00\x27\x00\x27\x00\x27\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x27\x00\x00\x00\x27\x00\x12\x00\x27\x00\x12\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x0f\x00\x12\x00\x00\x00\x12\x00\x12\x00\x09\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x12\x00\x27\x00\x12\x00\x27\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x0d\x00\x12\x00\x00\x00\x12\x00\x12\x00\x0b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x27\x00\x00\x00\x27\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x0f\x00\x12\x00\x00\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x0f\x00\x12\x00\x00\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x27\x00\x00\x00\x27\x00\x27\x00\x27\x00\x27\x00\x00\x00\x00\x00\x00\x00\x27\x00\x27\x00\x00\x00\x27\x00\x16\x00\x27\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x12\x00\x12\x00\x27\x00\x12\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x00\x00\x00\x00\x00\x00\x27\x00\x00\x00\x27\x00\x27\x00\x27\x00\x27\x00\x00\x00\x00\x00\x00\x00\x27\x00\x27\x00\x00\x00\x27\x00\x27\x00\x27\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x12\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x00\x00\x00\x00\x00\x00\x00\x00\x27\x00\x00\x00\x27\x00\x27\x00\x2c\x00\x27\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x27\x00\x00\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x00\x00\x27\x00\x27\x00\x27\x00\x00\x00\x27\x00\x27\x00\x27\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x27\x00\x00\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x00\x00\x2c\x00\x00\x00\x27\x00\x00\x00\x27\x00\x27\x00\x27\x00\x27\x00\x00\x00\x00\x00\x00\x00\x27\x00\x27\x00\x00\x00\x27\x00\x27\x00\x27\x00\x00\x00\x2c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2c\x00\x00\x00\x27\x00\x16\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x00\x00\x00\x00\x00\x00\x27\x00\x00\x00\x27\x00\x27\x00\x27\x00\x27\x00\x00\x00\x00\x00\x00\x00\x27\x00\x27\x00\x00\x00\x16\x00\x27\x00\x27\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x27\x00\x00\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x27\x00\x00\x00\x27\x00\x27\x00\x00\x00\x27\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x27\x00\x00\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x00\x00\x27\x00\x27\x00\x27\x00\x00\x00\x27\x00\x27\x00\x27\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x27\x00\x00\x00\x27\x00\x27\x00\x16\x00\x27\x00\x27\x00\x00\x00\x00\x00\x00\x00\x00\x00\x29\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x00\x00\x00\x00\x00\x00\x00\x00\x27\x00\x00\x00\x27\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\x00\x00\x00\x00\x00\x00\x27\x00\x22\x00\x27\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\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\x29\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x22\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\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\x00\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x22\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x25\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\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\x29\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x26\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\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\x00\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x25\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\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\x29\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x26\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\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\x00\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x27\x00\x00\x00\x27\x00\x27\x00\x27\x00\x27\x00\x00\x00\x00\x00\x00\x00\x27\x00\x27\x00\x00\x00\x27\x00\x27\x00\x27\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x27\x00\x00\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x00\x00\x00\x00\x00\x00\x00\x00\x29\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x00\x00\x00\x00\x00\x00\x00\x00\x27\x00\x00\x00\x27\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x00\x00\x00\x00\x00\x00\x27\x00\x29\x00\x27\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x00\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x00\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00"#
+
+alex_check :: AlexAddr
+alex_check = AlexA# "\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x2f\x00\x0a\x00\x0a\x00\x2f\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x27\x00\xff\xff\x2f\x00\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\x27\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\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\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\x20\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x2e\x00\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\x65\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\xff\xff\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\x0a\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x2d\x00\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x0a\x00\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\xff\xff\xff\xff\x0a\x00\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\x0a\x00\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x22\x00\xff\xff\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x22\x00\xff\xff\xff\xff\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\x2e\x00\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\x5e\x00\xff\xff\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x5c\x00\xff\xff\xff\xff\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\xff\xff\xff\xff\x5c\x00\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\x6e\x00\xff\xff\x5c\x00\x7c\x00\xff\xff\x7e\x00\x74\x00\xff\xff\xff\xff\x5c\x00\x3a\x00\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\x2e\x00\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7c\x00\xff\xff\x7e\x00\x5c\x00\x3a\x00\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\x2e\x00\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7c\x00\xff\xff\x7e\x00\x5c\x00\x3a\x00\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\x2e\x00\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7c\x00\xff\xff\x7e\x00\x5c\x00\x3a\x00\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\x2e\x00\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7c\x00\xff\xff\x7e\x00\x5c\x00\x3a\x00\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\x2e\x00\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7c\x00\xff\xff\x7e\x00\x5c\x00\x3a\x00\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\x2e\x00\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7c\x00\xff\xff\x7e\x00\x5c\x00\x3a\x00\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\x2e\x00\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7c\x00\xff\xff\x7e\x00\x5c\x00\x3a\x00\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\x2e\x00\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7c\x00\xff\xff\x7e\x00\x5c\x00\x3a\x00\x5e\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\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\x7c\x00\xff\xff\x7e\x00\x5c\x00\x22\x00\x5e\x00\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\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x7c\x00\xff\xff\x7e\x00\x2a\x00\x2b\x00\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\xff\xff\x5c\x00\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\x2e\x00\x2f\x00\xff\xff\x6e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x74\x00\xff\xff\x5c\x00\x3a\x00\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\x2e\x00\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7c\x00\xff\xff\x7e\x00\x5c\x00\x3a\x00\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\x21\x00\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x7c\x00\xff\xff\x7e\x00\x2a\x00\x2b\x00\xff\xff\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\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\x5c\x00\xff\xff\x5e\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\xff\xff\xff\xff\x7c\x00\x5f\x00\x7e\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\xff\xff\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\x27\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\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\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\xff\xff\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\xff\xff\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\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\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\xff\xff\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\x27\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\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\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\xff\xff\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\xff\xff\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\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\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\xff\xff\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\x27\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\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\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\xff\xff\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\xff\xff\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\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\x2e\x00\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3a\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\x5c\x00\xff\xff\x5e\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\xff\xff\xff\xff\x7c\x00\x5f\x00\x7e\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\xff\xff\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\xff\xff\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00"#
+
+alex_deflt :: AlexAddr
+alex_deflt = AlexA# "\xff\xff\xff\xff\x04\x00\x04\x00\x04\x00\x04\x00\xff\xff\xff\xff\x11\x00\x11\x00\xff\xff\xff\xff\x11\x00\x11\x00\x11\x00\x11\x00\x11\x00\x11\x00\x11\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2c\x00\x2c\x00\xff\xff\xff\xff\xff\xff\x2f\x00\xff\xff"#
+
+alex_accept = listArray (0::Int,49) [[],[],[(AlexAccSkip)],[(AlexAccSkip)],[(AlexAccSkip)],[(AlexAccSkip)],[],[(AlexAcc (alex_action_7))],[(AlexAccSkip)],[(AlexAccSkip)],[(AlexAccSkip)],[(AlexAccSkip)],[],[(AlexAcc (alex_action_7))],[],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[],[(AlexAcc (alex_action_7))],[(AlexAccSkip)],[(AlexAcc (alex_action_3))],[(AlexAcc (alex_action_3))],[(AlexAcc (alex_action_3))],[(AlexAcc (alex_action_3))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_4))],[(AlexAcc (alex_action_4))],[],[(AlexAcc (alex_action_8))],[],[],[(AlexAcc (alex_action_5))],[(AlexAcc (alex_action_5))],[(AlexAcc (alex_action_6))],[(AlexAcc (alex_action_6))],[(AlexAcc (alex_action_6))],[(AlexAcc (alex_action_6))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_9))],[(AlexAcc (alex_action_10))],[(AlexAcc (alex_action_11))],[],[],[],[(AlexAcc (alex_action_12))],[],[],[]]
+{-# LINE 41 "Language/Pec/Lex.x" #-}
+
+
+tok f p s = f p s
+
+share :: String -> String
+share = id
+
+data Tok =
+   TS !String !Int    -- reserved words and symbols
+ | TL !String         -- string literals
+ | TI !String         -- integer literals
+ | TV !String         -- identifiers
+ | TD !String         -- double precision float literals
+ | TC !String         -- character literals
+ | T_Frac !String
+ | T_Uident !String
+ | T_Lident !String
+ | T_USym !String
+ | T_Number !String
+ | T_Count !String
+
+ deriving (Eq,Show,Ord)
+
+data Token = 
+   PT  Posn Tok
+ | Err Posn
+  deriving (Eq,Show,Ord)
+
+tokenPos (PT (Pn _ l _) _ :_) = "line " ++ show l
+tokenPos (Err (Pn _ l _) :_) = "line " ++ show l
+tokenPos _ = "end of file"
+
+posLineCol (Pn _ l c) = (l,c)
+mkPosToken t@(PT p _) = (posLineCol p, prToken t)
+
+prToken t = case t of
+  PT _ (TS s _) -> s
+  PT _ (TL s)   -> s
+  PT _ (TI s)   -> s
+  PT _ (TV s)   -> s
+  PT _ (TD s)   -> s
+  PT _ (TC s)   -> s
+  PT _ (T_Frac s) -> s
+  PT _ (T_Uident s) -> s
+  PT _ (T_Lident s) -> s
+  PT _ (T_USym s) -> s
+  PT _ (T_Number s) -> s
+  PT _ (T_Count s) -> s
+
+
+data BTree = N | B String Tok BTree BTree deriving (Show)
+
+eitherResIdent :: (String -> Tok) -> String -> Tok
+eitherResIdent tv s = treeFind resWords
+  where
+  treeFind N = tv s
+  treeFind (B a t left right) | s < a  = treeFind left
+                              | s > a  = treeFind right
+                              | s == a = t
+
+resWords = b "as" 17 (b ";" 9 (b "->" 5 (b ")" 3 (b "(" 2 (b "#" 1 N N) N) (b "," 4 N N)) (b ".." 7 (b "." 6 N N) (b "::" 8 N N))) (b "Array" 13 (b "=" 11 (b "<-" 10 N N) (b "@" 12 N N)) (b "]" 15 (b "[" 14 N N) (b "all" 16 N N)))) (b "let" 25 (b "exports" 21 (b "case" 19 (b "branch" 18 N N) (b "do" 20 N N)) (b "import" 23 (b "extern" 22 N N) (b "in" 24 N N))) (b "where" 29 (b "of" 27 (b "module" 26 N N) (b "type" 28 N N)) (b "|" 31 (b "{" 30 N N) (b "}" 32 N N))))
+   where b s n = let bs = id s
+                  in B bs (TS bs n)
+
+unescapeInitTail :: String -> String
+unescapeInitTail = id . unesc . tail . id where
+  unesc s = case s of
+    '\\':c:cs | elem c ['\"', '\\', '\''] -> c : unesc cs
+    '\\':'n':cs  -> '\n' : unesc cs
+    '\\':'t':cs  -> '\t' : unesc cs
+    '"':[]    -> []
+    c:cs      -> c : unesc cs
+    _         -> []
+
+-------------------------------------------------------------------
+-- Alex wrapper code.
+-- A modified "posn" wrapper.
+-------------------------------------------------------------------
+
+data Posn = Pn !Int !Int !Int
+      deriving (Eq, Show,Ord)
+
+alexStartPos :: Posn
+alexStartPos = Pn 0 1 1
+
+alexMove :: Posn -> Char -> Posn
+alexMove (Pn a l c) '\t' = Pn (a+1)  l     (((c+7) `div` 8)*8+1)
+alexMove (Pn a l c) '\n' = Pn (a+1) (l+1)   1
+alexMove (Pn a l c) _    = Pn (a+1)  l     (c+1)
+
+type AlexInput = (Posn,     -- current position,
+                  Char,     -- previous char
+                  String)   -- current input string
+
+tokens :: String -> [Token]
+tokens str = go (alexStartPos, '\n', str)
+    where
+      go :: AlexInput -> [Token]
+      go inp@(pos, _, str) =
+               case alexScan inp 0 of
+                AlexEOF                -> []
+                AlexError (pos, _, _)  -> [Err pos]
+                AlexSkip  inp' len     -> go inp'
+                AlexToken inp' len act -> act pos (take len str) : (go inp')
+
+alexGetChar :: AlexInput -> Maybe (Char,AlexInput)
+alexGetChar (p, _, s) =
+  case  s of
+    []  -> Nothing
+    (c:s) ->
+             let p' = alexMove p c
+              in p' `seq` Just (c, (p', c, s))
+
+alexInputPrevChar :: AlexInput -> Char
+alexInputPrevChar (p, c, s) = c
+
+alex_action_3 =  tok (\p s -> PT p (eitherResIdent (TV . share) s)) 
+alex_action_4 =  tok (\p s -> PT p (eitherResIdent (T_Frac . share) s)) 
+alex_action_5 =  tok (\p s -> PT p (eitherResIdent (T_Uident . share) s)) 
+alex_action_6 =  tok (\p s -> PT p (eitherResIdent (T_Lident . share) s)) 
+alex_action_7 =  tok (\p s -> PT p (eitherResIdent (T_USym . share) s)) 
+alex_action_8 =  tok (\p s -> PT p (eitherResIdent (T_Number . share) s)) 
+alex_action_9 =  tok (\p s -> PT p (eitherResIdent (T_Count . share) s)) 
+alex_action_10 =  tok (\p s -> PT p (eitherResIdent (TV . share) s)) 
+alex_action_11 =  tok (\p s -> PT p (TL $ share $ unescapeInitTail s)) 
+alex_action_12 =  tok (\p s -> PT p (TC $ share s))  
+{-# LINE 1 "templates/GenericTemplate.hs" #-}
+{-# LINE 1 "templates/GenericTemplate.hs" #-}
+{-# LINE 1 "<built-in>" #-}
+{-# LINE 1 "<command-line>" #-}
+{-# LINE 1 "templates/GenericTemplate.hs" #-}
+-- -----------------------------------------------------------------------------
+-- ALEX TEMPLATE
+--
+-- This code is in the PUBLIC DOMAIN; you may copy it freely and use
+-- it for any purpose whatsoever.
+
+-- -----------------------------------------------------------------------------
+-- INTERNALS and main scanner engine
+
+{-# LINE 35 "templates/GenericTemplate.hs" #-}
+
+{-# LINE 45 "templates/GenericTemplate.hs" #-}
+
+
+data AlexAddr = AlexA# Addr#
+
+#if __GLASGOW_HASKELL__ < 503
+uncheckedShiftL# = shiftL#
+#endif
+
+{-# INLINE alexIndexInt16OffAddr #-}
+alexIndexInt16OffAddr (AlexA# arr) off =
+#ifdef WORDS_BIGENDIAN
+  narrow16Int# i
+  where
+	i    = word2Int# ((high `uncheckedShiftL#` 8#) `or#` low)
+	high = int2Word# (ord# (indexCharOffAddr# arr (off' +# 1#)))
+	low  = int2Word# (ord# (indexCharOffAddr# arr off'))
+	off' = off *# 2#
+#else
+  indexInt16OffAddr# arr off
+#endif
+
+
+
+
+
+{-# INLINE alexIndexInt32OffAddr #-}
+alexIndexInt32OffAddr (AlexA# arr) off = 
+#ifdef WORDS_BIGENDIAN
+  narrow32Int# i
+  where
+   i    = word2Int# ((b3 `uncheckedShiftL#` 24#) `or#`
+		     (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#)))
+   b0   = int2Word# (ord# (indexCharOffAddr# arr off'))
+   off' = off *# 4#
+#else
+  indexInt32OffAddr# arr off
+#endif
+
+
+
+
+
+#if __GLASGOW_HASKELL__ < 503
+quickIndex arr i = arr ! i
+#else
+-- GHC >= 503, unsafeAt is available from Data.Array.Base.
+quickIndex = unsafeAt
+#endif
+
+
+
+
+-- -----------------------------------------------------------------------------
+-- Main lexing routines
+
+data AlexReturn a
+  = AlexEOF
+  | AlexError  !AlexInput
+  | AlexSkip   !AlexInput !Int
+  | AlexToken  !AlexInput !Int a
+
+-- alexScan :: AlexInput -> StartCode -> AlexReturn a
+alexScan input (I# (sc))
+  = alexScanUser undefined input (I# (sc))
+
+alexScanUser user input (I# (sc))
+  = case alex_scan_tkn user input 0# input sc AlexNone of
+	(AlexNone, input') ->
+		case alexGetChar input of
+			Nothing -> 
+
+
+
+				   AlexEOF
+			Just _ ->
+
+
+
+				   AlexError input'
+
+	(AlexLastSkip input len, _) ->
+
+
+
+		AlexSkip input len
+
+	(AlexLastAcc k input len, _) ->
+
+
+
+		AlexToken input len k
+
+
+-- Push the input through the DFA, remembering the most recent accepting
+-- state it encountered.
+
+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)))
+  in
+  new_acc `seq`
+  case alexGetChar input of
+     Nothing -> (new_acc, input)
+     Just (c, new_input) -> 
+
+
+
+	let
+		base   = alexIndexInt32OffAddr alex_base s
+		(I# (ord_c)) = ord c
+		offset = (base +# ord_c)
+		check  = alexIndexInt16OffAddr alex_check offset
+		
+		new_s = if (offset >=# 0#) && (check ==# ord_c)
+			  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 (len +# 1#) 
+			new_input new_s new_acc
+
+  where
+	check_accs [] = last_acc
+	check_accs (AlexAcc a : _) = AlexLastAcc a input (I# (len))
+	check_accs (AlexAccSkip : _)  = AlexLastSkip  input (I# (len))
+	check_accs (AlexAccPred a pred : rest)
+	   | pred user orig_input (I# (len)) input
+	   = AlexLastAcc a input (I# (len))
+	check_accs (AlexAccSkipPred pred : rest)
+	   | pred user orig_input (I# (len)) input
+	   = AlexLastSkip input (I# (len))
+	check_accs (_ : rest) = check_accs rest
+
+data AlexLastAcc a
+  = AlexNone
+  | AlexLastAcc a !AlexInput !Int
+  | AlexLastSkip  !AlexInput !Int
+
+data AlexAcc a user
+  = AlexAcc a
+  | AlexAccSkip
+  | AlexAccPred a (AlexAccPred user)
+  | AlexAccSkipPred (AlexAccPred user)
+
+type AlexAccPred user = user -> AlexInput -> Int -> AlexInput -> Bool
+
+-- -----------------------------------------------------------------------------
+-- Predicates on a rule
+
+alexAndPred p1 p2 user in1 len in2
+  = p1 user in1 len in2 && p2 user in1 len in2
+
+--alexPrevCharIsPred :: Char -> AlexAccPred _ 
+alexPrevCharIs c _ input _ _ = c == alexInputPrevChar input
+
+--alexPrevCharIsOneOfPred :: Array Char Bool -> AlexAccPred _ 
+alexPrevCharIsOneOf arr _ input _ _ = arr ! alexInputPrevChar input
+
+--alexRightContext :: Int -> AlexAccPred _
+alexRightContext (I# (sc)) user _ _ input = 
+     case alex_scan_tkn user input 0# input sc AlexNone of
+	  (AlexNone, _) -> False
+	  _ -> True
+	-- TODO: there's no need to find the longest
+	-- match when checking the right context, just
+	-- the first match will do.
+
+-- used by wrappers
+iUnbox (I# (i)) = i
diff --git a/lib/Prelude.pec b/lib/Prelude.pec
new file mode 100644
--- /dev/null
+++ b/lib/Prelude.pec
@@ -0,0 +1,287 @@
+module Prelude
+
+exports all
+
+where
+
+type W8 = W #256 //singleton "Count" type.  In this case, used to specify a word that holds 256 values.
+type W16 = W #65536
+type I32 = I #4294967296 // 32 bit int
+
+type Bool = | False | True
+// enum type
+// the "|" is used to specify "or"
+
+type Maybe a = | Nothing | Just a // polymorphic variant
+// order doesn't matter
+// type Maybe a = | Just a | Nothing would be compiled exactly the same way
+
+type Either a b = | Left a | Right b // polymorphic variant
+
+type Ordering = | LT | EQ | GT // another enum
+
+extern putchar :: Char -> ()
+// external C call
+// name on the left, type on the right
+
+extern puts :: Ptr Char -> ()
+extern exit :: I32 -> ()
+
+to_ordering :: I32 -> Ordering
+to_ordering x = branch of
+  | x < 0 -> LT
+  | x > 0 -> GT
+  | -> EQ
+
+putCh :: Char -> ()
+putCh c = putchar c
+
+assert :: Bool -> ()
+assert x = when (not x)
+  (do
+    putLn "assertion failed"
+    exit -1
+  )
+// "when" is not a primitive, it is a library function, see "when_" below
+
+not :: Bool -> Bool
+not x = if x False True
+
+putLn :: IString -> ()
+putLn x = puts (from_istring x)
+
+is_upper :: Char -> Bool
+is_upper c = (c >= 'A') && (c <= 'Z') // operators don't have precedence, parens are required
+
+is_lower :: Char -> Bool
+is_lower c = (c >= 'a') && (c <= 'z')
+
+is_digit :: Char -> Bool
+is_digit c = (c >= '0') && (c <= '9')
+
+to_lower :: Char -> Char
+to_lower c = branch of
+  | is_upper c -> chr (ord c + 32)
+  | -> c
+
+to_upper :: Char -> Char
+to_upper c = branch of
+  | is_lower c -> chr (ord c - 32)
+  | -> c
+
+// inline Haskell "library" DSL code
+
+>import Pec.Base
+>import Data.List
+>
+>type CntW8 = Cnt256
+>type W8 = W CntW8
+>type Char_ = Char
+>type Ptr_ a = Ptr a
+>type IString_ = IString
+>type W32_ = W32
+>type Float_ = Float
+>type Double_ = Double
+>
+>class Typed a => ARITH a where
+>  add :: Term a -> Term a -> Term a
+>  sub :: Term a -> Term a -> Term a
+>  mul :: Term a -> Term a -> Term a
+>  adiv :: Term a -> Term a -> Term a
+>  arem :: Term a -> Term a -> Term a
+>
+>class Typed a => BITS a where
+>  shl :: Term a -> Term a -> Term a
+>  shr :: Typed a => Term a -> Term a -> Term a
+>  band :: Term a -> Term a -> Term a
+>  bor :: Term a -> Term a -> Term a
+>  xor :: Term a -> Term a -> Term a
+>  -- support ashr?
+>
+>class Typed a => ORD a where
+>  gt :: Term a -> Term a -> Term Bool_
+>  ge :: Term a -> Term a -> Term Bool_
+>  lt :: Term a -> Term a -> Term Bool_
+>  le :: Term a -> Term a -> Term Bool_
+>
+>class Typed a => EQ a where
+>  eq :: Term a -> Term a -> Term Bool_
+>  eq = prim2 "icmp eq"
+>  ne :: Term a -> Term a -> Term Bool_
+>  ne = prim2 "icmp ne"
+>
+>class (Typed a, Show a) => FRAC a where
+>  frac :: a -> Term a
+>  frac = val . show
+>
+// operators must be defined using the DSL
+// The '$' is tacked on by the compiler in order to avoid name clashes.
+>(@$) :: Typed a => Term (Ptr a) -> Term a
+>(@$) = load
+>
+>(>$) :: ORD a => Term a -> Term a -> Term Bool_
+>(>$) = gt
+>
+>(>=$) :: ORD a => Term a -> Term a -> Term Bool_
+>(>=$) = ge
+>
+>(<$) :: ORD a => Term a -> Term a -> Term Bool_
+>(<$) = lt
+>
+>(<=$) :: ORD a => Term a -> Term a -> Term Bool_
+>(<=$) = le
+>
+>(+$) :: ARITH a => Term a -> Term a -> Term a
+>(+$) = add
+>
+>(-$) :: ARITH a => Term a -> Term a -> Term a
+>(-$) = sub
+>
+>(*$) :: ARITH a => Term a -> Term a -> Term a
+>(*$) = mul
+>
+>(/$) :: ARITH a => Term a -> Term a -> Term a
+>(/$) = adiv
+>
+>(%$) :: ARITH a => Term a -> Term a -> Term a
+>(%$) = arem
+>
+>(==$) :: EQ a => Term a -> Term a -> Term Bool_
+>(==$) = eq
+>
+>(!=$) :: EQ a => Term a -> Term a -> Term Bool_
+>(!=$) = ne
+>
+>(<<$) :: BITS a => Term a -> Term a -> Term a
+>(<<$) = shl
+>
+>(>>$) :: BITS a => Term a -> Term a -> Term a
+>(>>$) = shr
+>
+>(&$) :: BITS a => Term a -> Term a -> Term a
+>(&$) = band
+>
+>(|$) :: BITS a => Term a -> Term a -> Term a
+>(|$) = bor
+>
+>(^$) :: BITS a => Term a -> Term a -> Term a
+>(^$) = xor
+>
+>(&&$) :: Term Bool_ -> Term Bool_ -> Term Bool_
+>(&&$) x y = Lift $ do
+>  a <- eval x
+>  b <- eval y
+>  return $ switch a
+>    [(false_tag, false_alt (\ _ -> false_))
+>    ,(defaulttag, \ _ -> b)]
+>
+>(||$) :: Term Bool_ -> Term Bool_ -> Term Bool_
+>(||$) x y = Lift $ do
+>  a <- eval x
+>  b <- eval y
+>  return $ switch a
+>    [(true_tag, true_alt (\ _ -> true_))
+>    ,(defaulttag, \ _ -> b)]
+>
+// ad-hoc polymorphism, using Haskell classes
+>instance Count cnt => EQ (I cnt)
+>instance Count cnt => EQ (W cnt)
+>instance EQ Char
+>instance EQ IString
+>instance (EQ a, EQ b) => EQ (a,b)
+>instance INT Double where int = frac . fromInteger
+>instance INT Float where int = frac . fromInteger
+>instance FRAC Double
+>instance FRAC Float
+>
+>instance Count cnt => BITS (W cnt) where
+>  shl = prim2 "shl"
+>  shr = prim2 "lshr"
+>  band = prim2 "and"
+>  bor = prim2 "or"
+>  xor = prim2 "xor"
+>
+>instance Count cnt => ORD (W cnt) where
+>  gt = prim2 "icmp ugt"
+>  ge = prim2 "icmp uge"
+>  lt = prim2 "icmp ult"
+>  le = prim2 "icmp ule"
+>
+>instance ORD Char where
+>  gt = prim2 "icmp ugt"
+>  ge = prim2 "icmp uge"
+>  lt = prim2 "icmp ult"
+>  le = prim2 "icmp ule"
+>
+>instance Count cnt => ORD (I cnt) where
+>  gt = prim2 "icmp sgt"
+>  ge = prim2 "icmp sge"
+>  lt = prim2 "icmp slt"
+>  le = prim2 "icmp sle"
+>
+>instance ORD Double where
+>  gt = prim2 "fcmp ogt"
+>  ge = prim2 "fcmp oge"
+>  lt = prim2 "fcmp olt"
+>  le = prim2 "fcmp ole"
+>
+>instance ORD Float where
+>  gt = prim2 "fcmp ogt"
+>  ge = prim2 "fcmp oge"
+>  lt = prim2 "fcmp olt"
+>  le = prim2 "fcmp ole"
+>
+>instance Count cnt => ARITH (I cnt) where
+>  add = prim2 "add"
+>  sub = prim2 "sub"
+>  mul = prim2 "mul"
+>  adiv = prim2 "sdiv"
+>  arem = prim2 "srem"
+>
+>instance Count cnt => ARITH (W cnt) where
+>  add = prim2 "add"
+>  sub = prim2 "sub"
+>  mul = prim2 "mul"
+>  adiv = prim2 "udiv"
+>  arem = prim2 "urem"
+>
+>instance ARITH Double where
+>  add = prim2 "fadd"
+>  sub = prim2 "fsub"
+>  mul = prim2 "fmul"
+>  adiv = prim2 "fdiv"
+>  arem = prim2 "frem"
+>
+>instance ARITH Float where
+>  add = prim2 "fadd"
+>  sub = prim2 "fsub"
+>  mul = prim2 "fmul"
+>  adiv = prim2 "fdiv"
+>  arem = prim2 "frem"
+>
+>eq_unit = \_ _ -> true_
+>ne_unit = \_ _ -> false_
+>
+>instance EQ () where
+>  eq = eq_unit
+>  ne = ne_unit
+>
+// polymorphic function
+// note that the '_' is added to the end of pec names to avoid name clashes
+>array_ :: (Count cnt, Typed cnt, Typed a) => Term (cnt -> a -> Array cnt a)
+>array_ = lam2_ $ \(cnt :: Term cnt) x -> Lift $ do
+>  a <- eval x
+>  return $ array cnt $ genericReplicate (countof (unused :: cnt)) a
+>
+>ord_ :: Term (Char -> W8)
+>ord_ = lam_ cast
+>
+>chr_ :: Term (W8 -> Char)
+>chr_ = lam_ cast
+>
+>if_ :: Typed a => Term (Bool_ -> a -> a -> a)
+>if_ = lam3_ $ \f g h ->
+>  switch f [(true_tag, \_ -> g), (false_tag, \_ -> h)]
+>
+>when_ :: Term (Bool_ -> () -> ())
+>when_ = lam2_ $ \a b -> app3 if_ a b unit
diff --git a/lib/Stack.pec b/lib/Stack.pec
new file mode 100644
--- /dev/null
+++ b/lib/Stack.pec
@@ -0,0 +1,50 @@
+module Stack
+
+exports (Stack, stack, push, pop, is_empty, is_full)
+// explicit export list
+
+where
+
+import Prelude
+
+type Stck #cnt a = { height :: W32, data :: Array cnt a }
+// stacks are polymorphic in their size and what they contain
+
+type Stack #cnt a = Stck cnt a
+
+>type Stack cnt a = Stack_ cnt a
+>
+>stack_ :: (Count cnt, Typed cnt, Typed a) => Term (cnt -> Stack cnt a)
+>stack_ = lam_ $ \_ -> lift $ do
+>  p <- eval $ alloca unused
+>  eval_ $ store (height_get p) (int 0)
+>  return $ load p
+>
+>push_ :: (Count cnt, Typed cnt, Typed a) =>
+>  Term (a -> Ptr (Stack cnt a) -> Bool_)
+>push_ = lam2_ $ \a (p :: Term (Ptr (Stack cnt a))) ->
+>  app3 if_ (app is_full_ p)
+>    false_
+>    (lift (do i <- eval $ load (height_get p)
+>              evalv $ store (idx (data_get p) (cast i)) a
+>              evalv $ store (height_get p) (add i (int 1))
+>              return true_
+>          ))
+> 
+>pop_ :: (Count cnt, Typed cnt, Typed a) =>
+>  Term (Ptr (Stack cnt a) -> Maybe_ a)
+>pop_ = lam_ $ \p -> app3 if_ (app is_empty_ p)
+>  nothing_
+>  (lift (do i <- eval $ sub (load (height_get p)) (int 1)
+>            evalv $ store (height_get p) i
+>            return $ app just_ (load (idx (data_get p) (cast i)))
+>        ))
+>
+>is_empty_ :: (Count cnt, Typed cnt, Typed a) =>
+>  Term (Ptr (Stack cnt a) -> Bool_)
+>is_empty_ = lam_ $ \p -> eq (load (height_get p)) (int 0)
+>
+>is_full_ :: (Count cnt, Typed cnt, Typed a) =>
+>  Term (Ptr (Stack cnt a) -> Bool_)
+>is_full_ = lam_ $ \(p :: Term (Ptr (Stack cnt a))) ->
+>  eq (load (height_get p)) (int $ countof (unused :: cnt))
diff --git a/lib/StrBuf.pec b/lib/StrBuf.pec
new file mode 100644
--- /dev/null
+++ b/lib/StrBuf.pec
@@ -0,0 +1,48 @@
+module StrBuf exports all
+
+where
+
+import Prelude
+
+type StrBuf #cnt = | StrBuf (Array (SuccCnt cnt) Char)
+
+extern "strcmp" c_strcmp :: Ptr Char -> Ptr Char -> I32
+extern "strlen" c_strlen :: Ptr Char -> W32
+extern "strncpy" c_strncpy :: Ptr Char -> Ptr Char -> I32 -> Ptr Char
+// a different name can be used for the C call if necessary
+
+>type StrBuf a = StrBuf_ a
+>
+>strbuf_ :: (Count cnt, Typed cnt) => Term (cnt -> StrBuf cnt)
+>strbuf_ = lam_ $ \(a :: Term cnt) ->
+>  cast (app2 array_ (unused :: Term (SuccCnt cnt)) (char '\0'))
+>
+>from_strbuf_ :: Count cnt => Term (Ptr (StrBuf cnt) -> Ptr Char)
+>from_strbuf_ = lam_ bitcast
+>
+>put_ :: Count cnt => Term (Ptr (StrBuf cnt) -> ())
+>put_ = lam_ $ \p -> app puts_ (app from_strbuf_ p)
+>
+>strlen_ :: Count cnt => Term (Ptr (StrBuf cnt) -> W32)
+>strlen_ = lam_ $ \x -> app c_strlen_ (app from_strbuf_ x)
+>
+>strcmp_ :: (Count a, Count b) =>
+>  Term (Ptr (StrBuf a) -> Ptr (StrBuf b) -> Ordering_)
+>strcmp_ = lam2_ $ \x y ->
+>  app to_ordering_ (app2 c_strcmp_ (app from_strbuf_ x) (app from_strbuf_ y))
+>
+>to_strbuf_ :: Count cnt => Term (IString -> Ptr (StrBuf cnt) -> Bool_)
+>to_strbuf_ = lam2_ $ \x y -> app2 strncpy (app from_istring_ x) y
+>
+>strcpy_ :: (Count a, Count b) =>
+>  Term (Ptr (StrBuf a) -> Ptr (StrBuf b) -> Bool_)
+>strcpy_ = lam2_ $ \x y -> app2 strncpy (app from_strbuf_ x) y
+>
+>strncpy :: Count cnt => Term (Ptr Char -> Ptr (StrBuf cnt) -> Bool_)
+>strncpy = lam2_ $ \x (y :: Term (Ptr (StrBuf cnt))) -> Lift $ do
+>  let n = countof (unused :: cnt)
+>  evalv $ app3 c_strncpy_ (app from_strbuf_ y) x (int $ succ n)
+>  c <- eval $ idx (app unwrap_ptr_ y) (int n)
+>  return $ app3 if_ (load c `eq` char '\0')
+>    true_
+>    (lift (eval (store c (char '\0')) >> return false_))
diff --git a/pec.cabal b/pec.cabal
--- a/pec.cabal
+++ b/pec.cabal
@@ -1,10 +1,10 @@
 Name: pec
 
-Version: 0.1
+Version: 0.1.1
 
 Synopsis: pec embedded compiler
 
-Description:  The intent of pec is to provide a drop-in replacement for C, but with modern language features.  Pec is a procedural language with a functional/declarative feel.  Programming in pec is very similar to monadic programming in Haskell.  The primary use case for pec is to provide a productive environment for writing safe, performant embedded applications.
+Description:  The intent of pec is to provide a drop-in replacement for C, but with modern language features.  Pec is a procedural language with a functional/declarative feel.  Programming in pec is very similar to monadic programming in Haskell.  The primary use case for pec is to provide a productive environment for writing safe, efficient, embedded applications.
 
 License: BSD3
 
@@ -22,7 +22,7 @@
 
 Extra-source-files: Pec.cf
 
-data-files: Makefile, FAQ, Pec/Makefile, DESIGN, test_cases/Makefile, test_cases/TestStack.pec, test_cases/Prelude.pec, test_cases/TestLoad.pec, test_cases/Stack.pec, test_cases/StrBuf.pec, test_cases/TestPrims.pec, test_cases/TestTuple.pec, test_cases/TestStrBuf.pec, test_cases/TestVariant.pec, test_cases/TestArray.pec, pec.cabal, THANKS, README, TODO, LICENSE, Language/Pec/Doc.html
+data-files: Makefile, FAQ, Pec/Makefile, DESIGN, lib/Stack.pec, lib/StrBuf.pec, lib/Prelude.pec, test_cases/Makefile, test_cases/TestStack.pec, test_cases/TestLoad.pec, test_cases/TestPrims.pec, test_cases/TestTuple.pec, test_cases/TestStrBuf.pec, test_cases/TestVariant.pec, test_cases/TestArray.pec, pec.cabal, THANKS, README, TODO, LICENSE, Language/Pec/Doc.html
 
 Cabal-version: >= 1.6
 
@@ -38,7 +38,7 @@
 Executable pec
   Main-is: Main.hs
   
-  Build-depends: base >= 4 && < 5, derive, array, filepath, cmdargs, mtl, process, directory
+  Build-depends: base >= 4 && < 5, derive, array, filepath, cmdargs, mtl, process, directory, Cabal
   
   Other-modules: Language.Pec.Lex, Language.Pec.Layout, Language.Pec.ErrM, Language.Pec.Abs, Language.Pec.Par, Language.Pec.Print
 
diff --git a/test_cases/Prelude.pec b/test_cases/Prelude.pec
deleted file mode 100644
--- a/test_cases/Prelude.pec
+++ /dev/null
@@ -1,287 +0,0 @@
-module Prelude
-
-exports all
-
-where
-
-type W8 = W #256 //singleton "Count" type.  In this case, used to specify a word that holds 256 values.
-type W16 = W #65536
-type I32 = I #4294967296 // 32 bit int
-
-type Bool = | False | True
-// enum type
-// the "|" is used to specify "or"
-
-type Maybe a = | Nothing | Just a // polymorphic variant
-// order doesn't matter
-// type Maybe a = | Just a | Nothing would be compiled exactly the same way
-
-type Either a b = | Left a | Right b // polymorphic variant
-
-type Ordering = | LT | EQ | GT // another enum
-
-extern putchar :: Char -> ()
-// external C call
-// name on the left, type on the right
-
-extern puts :: Ptr Char -> ()
-extern exit :: I32 -> ()
-
-to_ordering :: I32 -> Ordering
-to_ordering x = branch of
-  | x < 0 -> LT
-  | x > 0 -> GT
-  | -> EQ
-
-putCh :: Char -> ()
-putCh c = putchar c
-
-assert :: Bool -> ()
-assert x = when (not x)
-  (do
-    putLn "assertion failed"
-    exit -1
-  )
-// "when" is not a primitive, it is a library function, see "when_" below
-
-not :: Bool -> Bool
-not x = if x False True
-
-putLn :: IString -> ()
-putLn x = puts (from_istring x)
-
-is_upper :: Char -> Bool
-is_upper c = (c >= 'A') && (c <= 'Z') // operators don't have precedence, parens are required
-
-is_lower :: Char -> Bool
-is_lower c = (c >= 'a') && (c <= 'z')
-
-is_digit :: Char -> Bool
-is_digit c = (c >= '0') && (c <= '9')
-
-to_lower :: Char -> Char
-to_lower c = branch of
-  | is_upper c -> chr (ord c + 32)
-  | -> c
-
-to_upper :: Char -> Char
-to_upper c = branch of
-  | is_lower c -> chr (ord c - 32)
-  | -> c
-
-// inline Haskell "library" DSL code
-
->import Pec.Base
->import Data.List
->
->type CntW8 = Cnt256
->type W8 = W CntW8
->type Char_ = Char
->type Ptr_ a = Ptr a
->type IString_ = IString
->type W32_ = W32
->type Float_ = Float
->type Double_ = Double
->
->class Typed a => ARITH a where
->  add :: Term a -> Term a -> Term a
->  sub :: Term a -> Term a -> Term a
->  mul :: Term a -> Term a -> Term a
->  adiv :: Term a -> Term a -> Term a
->  arem :: Term a -> Term a -> Term a
->
->class Typed a => BITS a where
->  shl :: Term a -> Term a -> Term a
->  shr :: Typed a => Term a -> Term a -> Term a
->  band :: Term a -> Term a -> Term a
->  bor :: Term a -> Term a -> Term a
->  xor :: Term a -> Term a -> Term a
->  -- support ashr?
->
->class Typed a => ORD a where
->  gt :: Term a -> Term a -> Term Bool_
->  ge :: Term a -> Term a -> Term Bool_
->  lt :: Term a -> Term a -> Term Bool_
->  le :: Term a -> Term a -> Term Bool_
->
->class Typed a => EQ a where
->  eq :: Term a -> Term a -> Term Bool_
->  eq = prim2 "icmp eq"
->  ne :: Term a -> Term a -> Term Bool_
->  ne = prim2 "icmp ne"
->
->class (Typed a, Show a) => FRAC a where
->  frac :: a -> Term a
->  frac = val . show
->
-// operators must be defined using the DSL
-// The '$' is tacked on by the compiler in order to avoid name clashes.
->(@$) :: Typed a => Term (Ptr a) -> Term a
->(@$) = load
->
->(>$) :: ORD a => Term a -> Term a -> Term Bool_
->(>$) = gt
->
->(>=$) :: ORD a => Term a -> Term a -> Term Bool_
->(>=$) = ge
->
->(<$) :: ORD a => Term a -> Term a -> Term Bool_
->(<$) = lt
->
->(<=$) :: ORD a => Term a -> Term a -> Term Bool_
->(<=$) = le
->
->(+$) :: ARITH a => Term a -> Term a -> Term a
->(+$) = add
->
->(-$) :: ARITH a => Term a -> Term a -> Term a
->(-$) = sub
->
->(*$) :: ARITH a => Term a -> Term a -> Term a
->(*$) = mul
->
->(/$) :: ARITH a => Term a -> Term a -> Term a
->(/$) = adiv
->
->(%$) :: ARITH a => Term a -> Term a -> Term a
->(%$) = arem
->
->(==$) :: EQ a => Term a -> Term a -> Term Bool_
->(==$) = eq
->
->(!=$) :: EQ a => Term a -> Term a -> Term Bool_
->(!=$) = ne
->
->(<<$) :: BITS a => Term a -> Term a -> Term a
->(<<$) = shl
->
->(>>$) :: BITS a => Term a -> Term a -> Term a
->(>>$) = shr
->
->(&$) :: BITS a => Term a -> Term a -> Term a
->(&$) = band
->
->(|$) :: BITS a => Term a -> Term a -> Term a
->(|$) = bor
->
->(^$) :: BITS a => Term a -> Term a -> Term a
->(^$) = xor
->
->(&&$) :: Term Bool_ -> Term Bool_ -> Term Bool_
->(&&$) x y = Lift $ do
->  a <- eval x
->  b <- eval y
->  return $ switch a
->    [(false_tag, false_alt (\ _ -> false_))
->    ,(defaulttag, \ _ -> b)]
->
->(||$) :: Term Bool_ -> Term Bool_ -> Term Bool_
->(||$) x y = Lift $ do
->  a <- eval x
->  b <- eval y
->  return $ switch a
->    [(true_tag, true_alt (\ _ -> true_))
->    ,(defaulttag, \ _ -> b)]
->
-// ad-hoc polymorphism, using Haskell classes
->instance Count cnt => EQ (I cnt)
->instance Count cnt => EQ (W cnt)
->instance EQ Char
->instance EQ IString
->instance (EQ a, EQ b) => EQ (a,b)
->instance INT Double where int = frac . fromInteger
->instance INT Float where int = frac . fromInteger
->instance FRAC Double
->instance FRAC Float
->
->instance Count cnt => BITS (W cnt) where
->  shl = prim2 "shl"
->  shr = prim2 "lshr"
->  band = prim2 "and"
->  bor = prim2 "or"
->  xor = prim2 "xor"
->
->instance Count cnt => ORD (W cnt) where
->  gt = prim2 "icmp ugt"
->  ge = prim2 "icmp uge"
->  lt = prim2 "icmp ult"
->  le = prim2 "icmp ule"
->
->instance ORD Char where
->  gt = prim2 "icmp ugt"
->  ge = prim2 "icmp uge"
->  lt = prim2 "icmp ult"
->  le = prim2 "icmp ule"
->
->instance Count cnt => ORD (I cnt) where
->  gt = prim2 "icmp sgt"
->  ge = prim2 "icmp sge"
->  lt = prim2 "icmp slt"
->  le = prim2 "icmp sle"
->
->instance ORD Double where
->  gt = prim2 "fcmp ogt"
->  ge = prim2 "fcmp oge"
->  lt = prim2 "fcmp olt"
->  le = prim2 "fcmp ole"
->
->instance ORD Float where
->  gt = prim2 "fcmp ogt"
->  ge = prim2 "fcmp oge"
->  lt = prim2 "fcmp olt"
->  le = prim2 "fcmp ole"
->
->instance Count cnt => ARITH (I cnt) where
->  add = prim2 "add"
->  sub = prim2 "sub"
->  mul = prim2 "mul"
->  adiv = prim2 "sdiv"
->  arem = prim2 "srem"
->
->instance Count cnt => ARITH (W cnt) where
->  add = prim2 "add"
->  sub = prim2 "sub"
->  mul = prim2 "mul"
->  adiv = prim2 "udiv"
->  arem = prim2 "urem"
->
->instance ARITH Double where
->  add = prim2 "fadd"
->  sub = prim2 "fsub"
->  mul = prim2 "fmul"
->  adiv = prim2 "fdiv"
->  arem = prim2 "frem"
->
->instance ARITH Float where
->  add = prim2 "fadd"
->  sub = prim2 "fsub"
->  mul = prim2 "fmul"
->  adiv = prim2 "fdiv"
->  arem = prim2 "frem"
->
->eq_unit = \_ _ -> true_
->ne_unit = \_ _ -> false_
->
->instance EQ () where
->  eq = eq_unit
->  ne = ne_unit
->
-// polymorphic function
-// note that the '_' is added to the end of pec names to avoid name clashes
->array_ :: (Count cnt, Typed cnt, Typed a) => Term (cnt -> a -> Array cnt a)
->array_ = lam2_ $ \(cnt :: Term cnt) x -> Lift $ do
->  a <- eval x
->  return $ array cnt $ genericReplicate (countof (unused :: cnt)) a
->
->ord_ :: Term (Char -> W8)
->ord_ = lam_ cast
->
->chr_ :: Term (W8 -> Char)
->chr_ = lam_ cast
->
->if_ :: Typed a => Term (Bool_ -> a -> a -> a)
->if_ = lam3_ $ \f g h ->
->  switch f [(true_tag, \_ -> g), (false_tag, \_ -> h)]
->
->when_ :: Term (Bool_ -> () -> ())
->when_ = lam2_ $ \a b -> app3 if_ a b unit
diff --git a/test_cases/Stack.pec b/test_cases/Stack.pec
deleted file mode 100644
--- a/test_cases/Stack.pec
+++ /dev/null
@@ -1,50 +0,0 @@
-module Stack
-
-exports (Stack, stack, push, pop, is_empty, is_full)
-// explicit export list
-
-where
-
-import Prelude
-
-type Stck #cnt a = { height :: W32, data :: Array cnt a }
-// stacks are polymorphic in their size and what they contain
-
-type Stack #cnt a = Stck cnt a
-
->type Stack cnt a = Stack_ cnt a
->
->stack_ :: (Count cnt, Typed cnt, Typed a) => Term (cnt -> Stack cnt a)
->stack_ = lam_ $ \_ -> lift $ do
->  p <- eval $ alloca unused
->  eval_ $ store (height_get p) (int 0)
->  return $ load p
->
->push_ :: (Count cnt, Typed cnt, Typed a) =>
->  Term (a -> Ptr (Stack cnt a) -> Bool_)
->push_ = lam2_ $ \a (p :: Term (Ptr (Stack cnt a))) ->
->  app3 if_ (app is_full_ p)
->    false_
->    (lift (do i <- eval $ load (height_get p)
->              evalv $ store (idx (data_get p) (cast i)) a
->              evalv $ store (height_get p) (add i (int 1))
->              return true_
->          ))
-> 
->pop_ :: (Count cnt, Typed cnt, Typed a) =>
->  Term (Ptr (Stack cnt a) -> Maybe_ a)
->pop_ = lam_ $ \p -> app3 if_ (app is_empty_ p)
->  nothing_
->  (lift (do i <- eval $ sub (load (height_get p)) (int 1)
->            evalv $ store (height_get p) i
->            return $ app just_ (load (idx (data_get p) (cast i)))
->        ))
->
->is_empty_ :: (Count cnt, Typed cnt, Typed a) =>
->  Term (Ptr (Stack cnt a) -> Bool_)
->is_empty_ = lam_ $ \p -> eq (load (height_get p)) (int 0)
->
->is_full_ :: (Count cnt, Typed cnt, Typed a) =>
->  Term (Ptr (Stack cnt a) -> Bool_)
->is_full_ = lam_ $ \(p :: Term (Ptr (Stack cnt a))) ->
->  eq (load (height_get p)) (int $ countof (unused :: cnt))
diff --git a/test_cases/StrBuf.pec b/test_cases/StrBuf.pec
deleted file mode 100644
--- a/test_cases/StrBuf.pec
+++ /dev/null
@@ -1,48 +0,0 @@
-module StrBuf exports all
-
-where
-
-import Prelude
-
-type StrBuf #cnt = | StrBuf (Array (SuccCnt cnt) Char)
-
-extern "strcmp" c_strcmp :: Ptr Char -> Ptr Char -> I32
-extern "strlen" c_strlen :: Ptr Char -> W32
-extern "strncpy" c_strncpy :: Ptr Char -> Ptr Char -> I32 -> Ptr Char
-// a different name can be used for the C call if necessary
-
->type StrBuf a = StrBuf_ a
->
->strbuf_ :: (Count cnt, Typed cnt) => Term (cnt -> StrBuf cnt)
->strbuf_ = lam_ $ \(a :: Term cnt) ->
->  cast (app2 array_ (unused :: Term (SuccCnt cnt)) (char '\0'))
->
->from_strbuf_ :: Count cnt => Term (Ptr (StrBuf cnt) -> Ptr Char)
->from_strbuf_ = lam_ bitcast
->
->put_ :: Count cnt => Term (Ptr (StrBuf cnt) -> ())
->put_ = lam_ $ \p -> app puts_ (app from_strbuf_ p)
->
->strlen_ :: Count cnt => Term (Ptr (StrBuf cnt) -> W32)
->strlen_ = lam_ $ \x -> app c_strlen_ (app from_strbuf_ x)
->
->strcmp_ :: (Count a, Count b) =>
->  Term (Ptr (StrBuf a) -> Ptr (StrBuf b) -> Ordering_)
->strcmp_ = lam2_ $ \x y ->
->  app to_ordering_ (app2 c_strcmp_ (app from_strbuf_ x) (app from_strbuf_ y))
->
->to_strbuf_ :: Count cnt => Term (IString -> Ptr (StrBuf cnt) -> Bool_)
->to_strbuf_ = lam2_ $ \x y -> app2 strncpy (app from_istring_ x) y
->
->strcpy_ :: (Count a, Count b) =>
->  Term (Ptr (StrBuf a) -> Ptr (StrBuf b) -> Bool_)
->strcpy_ = lam2_ $ \x y -> app2 strncpy (app from_strbuf_ x) y
->
->strncpy :: Count cnt => Term (Ptr Char -> Ptr (StrBuf cnt) -> Bool_)
->strncpy = lam2_ $ \x (y :: Term (Ptr (StrBuf cnt))) -> Lift $ do
->  let n = countof (unused :: cnt)
->  evalv $ app3 c_strncpy_ (app from_strbuf_ y) x (int $ succ n)
->  c <- eval $ idx (app unwrap_ptr_ y) (int n)
->  return $ app3 if_ (load c `eq` char '\0')
->    true_
->    (lift (eval (store c (char '\0')) >> return false_))
