diff --git a/fay.cabal b/fay.cabal
--- a/fay.cabal
+++ b/fay.cabal
@@ -1,5 +1,5 @@
 name:                fay
-version:             0.10.0.0
+version:             0.10.1.0
 synopsis:            A compiler for Fay, a Haskell subset that compiles to JavaScript.
 description:         Fay is a proper subset of Haskell which can be compiled (type-checked)
                      with GHC, and compiled to JavaScript. It is lazy, pure, with a Fay monad,
@@ -22,38 +22,31 @@
                      .
                      /Release Notes/
                      .
-                     * Add TCO optimization.
-                     .
-                     * Added uncurrying optimization for non-partial applications.
+                     * Enable strict list for arithmetic sequences optimisation only when compiler optimise flag set.
                      .
-                     * Add simple benchmarking program.
+                     * Add print and putStrLn to the Prelude
                      .
-                     * Add SVG logo.
+                     * Add list utility functions from the standard Prelude
                      .
-                     * Added Defined type and appropriate serialization.
+                     * Test optimized as well as unoptimized builds.
                      .
-                     * Treat Maybe as a nullable value in conversions.
+                     * Standard precendence and associativity for infix operators
                      .
-                     * Added oscillator example.
+                     * Add function utilities from Prelude, including seq
                      .
-                     * Add optimization flag.
-
-                     * Support tuple serialization.
-                     * Fix list length in pats (closes #145).
+                     * Add math functions in Prelude
                      .
-                     * Name resolution and some export list support.
-
-                     * Add codeworld space invaders example.
+                     * Add support for sections (desugaring to lambdas)
                      .
-                     * NoImplicitPrelude is now passed automatically to GHC. Does not break code that uses the pragma (see #134).
+                     * Added example of the ContT and Deferred monad, sleep and readFile.
                      .
-                     * Add support for list comprehensions using desugaring from Haskell report. See #40 and #132.
+                     * Add more of the prelude, including error and a lot of math stuff.
                      .
-                     * Make error messages a tiny bit friendlier, and some general house-keeping.
+                     * Remove needs for module declarations in modules that define main.
                      .
-                     * Support negation expressions (see #116).
+                     * Support enumThen ([1,2..]) style lists.
                      .
-                     * Rewrite readFromFay using only Data, no Read/Show requirements (see #112).
+                     * Add support for enumFromThenTo ([1,2..10]) lists.
                      .
                      See full history at: <https://github.com/faylang/fay/commits>
 homepage:            http://fay-lang.org/
diff --git a/js/runtime.js b/js/runtime.js
--- a/js/runtime.js
+++ b/js/runtime.js
@@ -37,6 +37,18 @@
      (this.value = this.value(), this.forced = true, this.value));
 };
 
+function Fay$$seq(x) {
+  return function(y) {
+    _(x,false);
+    return y;
+  }
+}
+
+function Fay$$seq$36$uncurried(x,y) {
+  _(x,false);
+  return y;
+}
+
 /*******************************************************************************
  * Monad.
  */
diff --git a/src/Language/Fay/Compiler.hs b/src/Language/Fay/Compiler.hs
--- a/src/Language/Fay/Compiler.hs
+++ b/src/Language/Fay/Compiler.hs
@@ -27,7 +27,7 @@
 import           Language.Fay.Compiler.Misc
 import           Language.Fay.Print         (printJSString)
 import           Language.Fay.Types
-
+import qualified Language.Fay.Stdlib as Stdlib (enumFromTo,enumFromThenTo)
 import           Control.Applicative
 import           Control.Monad.Error
 import           Control.Monad.IO
@@ -207,7 +207,8 @@
 typecheck :: [FilePath] -> [String] -> Bool -> String -> Compile ()
 typecheck includeDirs ghcFlags wall fp = do
   res <- liftIO $ readAllFromProcess' "ghc" (
-    ["-fno-code", "-package fay", "-XNoImplicitPrelude", fp] ++ map ("-i" ++) includeDirs ++ ghcFlags ++ wallF) ""
+    ["-fno-code", "-package fay", "-XNoImplicitPrelude", "-main-is", "Language.Fay.DummyMain", fp]
+    ++ map ("-i" ++) includeDirs ++ ghcFlags ++ wallF) ""
   either error (warn . fst) res
    where
     wallF | wall = ["-Wall"]
@@ -536,14 +537,12 @@
     Con qname                     -> compileVar qname
     Do stmts                      -> compileDoBlock stmts
     Lambda _ pats exp             -> compileLambda pats exp
-    EnumFrom i                    -> do e <- compileExp i
-                                        name <- resolveName "enumFrom"
-                                        return (JsApp (JsName (JsNameVar name)) [e])
-    EnumFromTo i i'               -> do f <- compileExp i
-                                        t <- compileExp i'
-                                        name <- resolveName "enumFromTo"
-                                        return (JsApp (JsApp (JsName (JsNameVar name)) [f])
-                                                      [t])
+    LeftSection e o               -> compileExp =<< desugarLeftSection e o
+    RightSection o e              -> compileExp =<< desugarRightSection o e
+    EnumFrom i                    -> compileEnumFrom i
+    EnumFromTo i i'               -> compileEnumFromTo i i'
+    EnumFromThen a b              -> compileEnumFromThen a b
+    EnumFromThenTo a b z          -> compileEnumFromThenTo a b z
     RecConstr name fieldUpdates -> compileRecConstr name fieldUpdates
     RecUpdate rec  fieldUpdates -> updateRec rec fieldUpdates
     ListComp exp stmts            -> compileExp =<< desugarListComp exp stmts
@@ -644,7 +643,7 @@
                 [JsEarlyReturn exp]
                 (reverse (zip uniqueNames pats))
 
--- | Compile list comprehensions.
+-- | Desugar list comprehensions.
 desugarListComp :: Exp -> [QualStmt] -> Compile Exp
 desugarListComp e [] =
     return (List [ e ])
@@ -664,6 +663,16 @@
 desugarListComp _ (s                             : _    ) =
     throwError (UnsupportedQualStmt s)
 
+-- | Desugar left sections to lambdas.
+desugarLeftSection :: Exp -> QOp -> Compile Exp
+desugarLeftSection e o = withScopedTmpName $ \tmp ->
+    return (Lambda undefined [PVar tmp] (InfixApp e o (Var (UnQual tmp))))
+
+-- | Desugar left sections to lambdas.
+desugarRightSection :: QOp -> Exp -> Compile Exp
+desugarRightSection o e = withScopedTmpName $ \tmp ->
+    return (Lambda undefined [PVar tmp] (InfixApp (Var (UnQual tmp)) o e))
+
 -- | Compile case expressions.
 compileCase :: Exp -> [Alt] -> Compile JsExp
 compileCase exp alts = do
@@ -948,3 +957,79 @@
     String string -> return (JsApp (JsName (JsBuiltIn "list"))
                                    [JsLit (JsStr string)])
     lit           -> throwError (UnsupportedLiteral lit)
+
+-- | Maximum number of elements to allow in strict list representation
+-- of arithmetic sequences.
+maxStrictASLen :: Int
+maxStrictASLen = 10
+
+-- | Compile [e1..] arithmetic sequences.
+compileEnumFrom :: Exp -> Compile JsExp
+compileEnumFrom i = do
+  e <- compileExp i
+  name <- resolveName "enumFrom"
+  return (JsApp (JsName (JsNameVar name)) [e])
+
+-- | Compile [e1..e3] arithmetic sequences.
+compileEnumFromTo :: Exp -> Exp -> Compile JsExp
+compileEnumFromTo i i' = do
+  f <- compileExp i
+  t <- compileExp i'
+  name <- resolveName "enumFromTo"
+  cfg <- gets stateConfig
+  return $ case optEnumFromTo cfg f t of
+    Just s -> s
+    _ -> JsApp (JsApp (JsName (JsNameVar name)) [f]) [t]
+
+-- | Optimize short literal [e1..e3] arithmetic sequences.
+optEnumFromTo :: CompileConfig -> JsExp -> JsExp -> Maybe JsExp
+optEnumFromTo cfg (JsLit f) (JsLit t) =
+  if configOptimize cfg
+  then case (f,t) of
+    (JsInt fl, JsInt tl) -> strict JsInt fl tl
+    (JsFloating fl, JsFloating tl) -> strict JsFloating fl tl
+    _ -> Nothing
+  else Nothing
+    where strict :: (Enum a, Ord a, Num a) => (a -> JsLit) -> a -> a -> Maybe JsExp
+          strict litfn f t =
+            if fromEnum t - fromEnum f < maxStrictASLen
+            then Just . makeList . map (JsLit . litfn) $ Stdlib.enumFromTo f t
+            else Nothing
+optEnumFromTo _ _ _ = Nothing
+
+-- | Compile [e1,e2..] arithmetic sequences.
+compileEnumFromThen :: Exp -> Exp -> Compile JsExp
+compileEnumFromThen a b = do
+  fr <- compileExp a
+  th <- compileExp b
+  name <- resolveName "enumFromThen"
+  return (JsApp (JsApp (JsName (JsNameVar name)) [fr]) [th])
+
+-- | Compile [e1,e2..e3] arithmetic sequences.
+compileEnumFromThenTo :: Exp -> Exp -> Exp -> Compile JsExp
+compileEnumFromThenTo a b z = do
+  fr <- compileExp a
+  th <- compileExp b
+  to <- compileExp z
+  name <- resolveName "enumFromThenTo"
+  cfg <- gets stateConfig
+  return $ case optEnumFromThenTo cfg fr th to of
+    Just s -> s
+    _ -> JsApp (JsApp (JsApp (JsName (JsNameVar name)) [fr]) [th]) [to]
+
+-- | Optimize short literal [e1,e2..e3] arithmetic sequences.
+optEnumFromThenTo :: CompileConfig -> JsExp -> JsExp -> JsExp -> Maybe JsExp
+optEnumFromThenTo cfg (JsLit fr) (JsLit th) (JsLit to) =
+  if configOptimize cfg
+  then case (fr,th,to) of
+    (JsInt frl, JsInt thl, JsInt tol) -> strict JsInt frl thl tol
+    (JsFloating frl, JsFloating thl, JsFloating tol) -> strict JsFloating frl thl tol
+    _ -> Nothing
+  else Nothing
+    where strict :: (Enum a, Ord a, Num a) => (a -> JsLit) -> a -> a -> a -> Maybe JsExp
+          strict litfn fr th to =
+            if (fromEnum to - fromEnum fr) `div`
+               (fromEnum th - fromEnum fr) + 1 < maxStrictASLen
+            then Just . makeList . map (JsLit . litfn) $ Stdlib.enumFromThenTo fr th to
+            else Nothing
+optEnumFromThenTo _ _ _ _ = Nothing
diff --git a/src/Language/Fay/FFI.hs b/src/Language/Fay/FFI.hs
--- a/src/Language/Fay/FFI.hs
+++ b/src/Language/Fay/FFI.hs
@@ -2,7 +2,11 @@
 {-# LANGUAGE NoImplicitPrelude    #-}
 {-# LANGUAGE TypeSynonymInstances #-}
 
-module Language.Fay.FFI where
+module Language.Fay.FFI
+  (Fay
+  ,Foreign
+  ,ffi)
+  where
 
 import           Language.Fay.Types (Fay)
 import           Prelude            (Bool, Char, Double, String, Int, Maybe, error)
diff --git a/src/Language/Fay/Prelude.hs b/src/Language/Fay/Prelude.hs
--- a/src/Language/Fay/Prelude.hs
+++ b/src/Language/Fay/Prelude.hs
@@ -38,8 +38,8 @@
 import           Language.Fay.Types  (Fay)
 import           Data.Data
 import           Prelude             (Bool(..), Char, Double, Eq(..), Int, Integer, Maybe(..), Monad,
- Ord, Read(..), Show(), String, error, read, (&&), (*), (+), (-),
- (/), (/=), (<), (<=), (==), (>), (>=), (||))
+                                      Ord, Read(..), Show(), String, read, (&&), (*), (+), (-),
+                                      (/), (/=), (<), (<=), (==), (>), (>=), (||))
 
 (>>) :: Fay a -> Fay b -> Fay b
 (>>) = error "Language.Fay.Prelude.(>>): Used (>>) outside JS."
diff --git a/src/Language/Fay/Stdlib.hs b/src/Language/Fay/Stdlib.hs
--- a/src/Language/Fay/Stdlib.hs
+++ b/src/Language/Fay/Stdlib.hs
@@ -1,67 +1,179 @@
-{-# LANGUAGE NoImplicitPrelude #-}
+{-# LANGUAGE NoImplicitPrelude         #-}
 module Language.Fay.Stdlib
   (($)
+  ,($!)
+  ,(!!)
   ,(++)
   ,(.)
   ,(=<<)
+  ,(**)
+  ,(^^)
+  ,(^)
   ,Defined(..)
+  ,Either(..)
   ,Ordering(..)
-  ,show
-  ,fromInteger
-  ,fromRational
+  ,abs
+  ,acos
+  ,acosh
+  ,all
+  ,and
   ,any
+  ,asin
+  ,asinh
+  ,asTypeOf
+  ,atan
+  ,atanh
+  ,break
+  ,ceiling
   ,compare
   ,concat
   ,concatMap
   ,const
+  ,cos
+  ,cosh
+  ,curry
+  ,cycle
+  ,div
+  ,divMod
+  ,drop
+  ,dropWhile
+  ,either
   ,elem
   ,enumFrom
+  ,enumFromThen
+  ,enumFromThenTo
   ,enumFromTo
-  ,fromIntegral
+  ,error
+  ,even
+  ,exp
   ,filter
   ,find
   ,flip
+  ,floor
   ,foldl
+  ,foldl1
   ,foldr
+  ,foldr1
   ,forM_
+  ,fromInteger
+  ,fromIntegral
+  ,fromRational
   ,fst
-  ,length
-  ,mod
+  ,gcd
+  ,head
+  ,id
+  ,init
   ,insertBy
   ,intercalate
   ,intersperse
+  ,iterate
+  ,last
+  ,lcm
+  ,length
+  ,lines
+  ,log
+  ,logBase
   ,lookup
   ,map
   ,mapM_
+  ,max
+  ,maximum
   ,maybe
+  ,min
+  ,minimum
+  ,mod
+  ,negate
   ,not
+  ,notElem
   ,nub
   ,null
+  ,odd
+  ,or
   ,otherwise
+  ,pi
+  ,pred
   ,prependToAll
+  ,print
+  ,product
+  ,properFraction
+  ,putStrLn
+  ,quot
+  ,quotRem
+  ,recip
+  ,rem
+  ,repeat
+  ,replicate
   ,reverse
+  ,round
+  ,scanl
+  ,scanl1
+  ,scanr
+  ,scanr1
+  ,seq
   ,sequence
+  ,sequence_
+  ,show
+  ,signum
+  ,sin
+  ,sinh
   ,snd
   ,sort
   ,sortBy
+  ,span
+  ,splitAt
+  ,sqrt
+  ,subtract
+  ,succ
+  ,sum
+  ,tail
+  ,take
+  ,takeWhile
+  ,tan
+  ,tanh
+  ,truncate
+  ,uncurry
+  ,undefined
+  ,unlines
+  ,until
+  ,unwords
+  ,unzip
+  ,unzip3
   ,when
+  ,words
   ,zip
+  ,zip3
   ,zipWith
-  ,max
-  ,min)
+  ,zipWith3)
   where
 
 import           Language.Fay.FFI
 import           Prelude          (Bool (..), Double, Eq (..), Fractional, Int,
-                                   Integer, Maybe (..), Monad (..), Num ((+)),
-                                   Ord ((>), (<)), Rational, Show, String, (||))
+                                   Integer, Maybe (..), Monad (..),
+                                   Num ((+), (-), (*)), Fractional ((/)),
+                                   Ord ((>), (<)), Rational, Show, String,
+                                   (&&), (||), seq)
 
-show :: (Foreign a,Show a) => a -> String
+error :: String -> a
+error str = case error' str of 0 -> error str ; _ -> error str
+
+error' :: String -> Int
+error' = ffi "(function() { throw %1 })()"
+
+undefined :: a
+undefined = error "Prelude.undefined"
+
+show :: (Foreign a, Show a) => a -> String
 show = ffi "JSON.stringify(%1)"
 
 data Defined a = Undefined | Defined a
 instance Foreign a => Foreign (Defined a)
 
+data Either a b = Left a | Right b
+
+either :: (a -> c) -> (b -> c) -> Either a b -> c
+either f _ (Left a) = f a
+either _ g (Right b) = g b
+
 -- There is only Double in JS.
 fromInteger :: a -> a
 fromInteger x = x
@@ -69,6 +181,124 @@
 fromRational :: a -> a
 fromRational x = x
 
+negate :: Num a => a -> a
+negate x = (-x)
+
+abs :: (Num a, Ord a) => a -> a
+abs x = if x < 0 then negate x else x
+
+signum :: (Num a, Ord a) => a -> a
+signum x = if x > 0 then 1 else if x == 0 then 0 else -1
+
+pi :: Double
+pi = ffi "Math.PI"
+
+exp :: Double -> Double
+exp = ffi "Math.exp(%1)"
+
+sqrt :: Double -> Double
+sqrt = ffi "Math.sqrt(%1)"
+
+log :: Double -> Double
+log = ffi "Math.log(%1)"
+
+(**) :: Double -> Double -> Double
+(**) = unsafePow
+infixr 8 **
+
+(^^) :: Double -> Int -> Double
+(^^) = unsafePow
+infixr 8 ^^
+
+unsafePow :: (Foreign a, Num a, Foreign b, Num b) => a -> b -> a
+unsafePow = ffi "Math.pow(%1,%2)"
+
+(^) :: Num a => a -> Int -> a
+a ^ b | b < 0  = error "(^): negative exponent"
+      | b == 0 = 1
+      | even b = let x = a ^ (b `quot` 2) in x * x
+a ^ b          = a * a ^ (b - 1)
+infixr 8 ^
+
+logBase :: Double -> Double -> Double
+logBase b x = log x / log b
+
+sin :: Double -> Double
+sin = ffi "Math.sin(%1)"
+
+tan :: Double -> Double
+tan = ffi "Math.tan(%1)"
+
+cos :: Double -> Double
+cos = ffi "Math.cos(%1)"
+
+asin :: Double -> Double
+asin = ffi "Math.asin(%1)"
+
+atan :: Double -> Double
+atan = ffi "Math.atan(%1)"
+
+acos :: Double -> Double
+acos = ffi "Math.acos(%1)"
+
+sinh :: Double -> Double
+sinh x = (exp x - exp (-x)) / 2
+
+tanh :: Double -> Double
+tanh x = let a = exp x ; b = exp (-x) in (a - b) / (a + b)
+
+cosh :: Double -> Double
+cosh x = (exp x + exp (-x)) / 2
+
+asinh :: Double -> Double
+asinh x = log (x + sqrt(x**2 + 1))
+
+atanh :: Double -> Double
+atanh x = log ((1 + x) / (1 - x)) / 2
+
+acosh :: Double -> Double
+acosh x = log (x + sqrt (x**2 - 1))
+
+properFraction :: Double -> (Int, Double)
+properFraction x = let a = truncate x in (a, x - fromIntegral a)
+
+truncate :: Double -> Int
+truncate x = if x < 0 then ceiling x else floor x
+
+round :: Double -> Int
+round = ffi "Math.round(%1)"
+
+ceiling :: Double -> Int
+ceiling = ffi "Math.ceil(%1)"
+
+floor :: Double -> Int
+floor = ffi "Math.floor(%1)"
+
+subtract :: Num a => a -> a -> a
+subtract = flip (-)
+
+even :: Int -> Bool
+even x = x `rem` 2 == 0
+
+odd :: Int -> Bool
+odd x = not (even x)
+
+gcd :: Int -> Int -> Int
+gcd a b = go (abs a) (abs b)
+  where go x 0 = x
+        go x y = go y (x `rem` y)
+
+lcm :: Int -> Int -> Int
+lcm _ 0 = 0
+lcm 0 _ = 0
+lcm a b = abs ((a `quot` (gcd a b)) * b)
+
+curry :: ((a, b) -> c) -> a -> b -> c
+curry f x y = f (x, y)
+
+uncurry :: (a -> b -> c) -> (a, b) -> c
+uncurry f p = case p of (x, y) -> f x y
+
 snd :: (t, t1) -> t1
 snd (_,x) = x
 
@@ -79,10 +309,6 @@
 find p (x:xs) = if p x then Just x else find p xs
 find _ [] = Nothing
 
-any :: (t -> Bool) -> [t] -> Bool
-any p (x:xs) = if p x then True else any p xs
-any _ [] = False
-
 filter :: (a -> Bool) -> [a] -> [a]
 filter p (x:xs) = if p x then x : filter p xs else filter p xs
 filter _ []     = []
@@ -112,6 +338,9 @@
 elem x (y:ys)   = x == y || elem x ys
 elem _ []       = False
 
+notElem :: Eq a => a -> [a] -> Bool
+notElem x ys = not (elem x ys)
+
 data Ordering = GT | LT | EQ
 
 sort :: Ord a => [a] -> [a]
@@ -142,23 +371,75 @@
 when :: Monad m => Bool -> m a -> m ()
 when p m = if p then m >> return () else return ()
 
+succ :: Num a => a -> a
+succ x = x + 1
+
+pred :: Num a => a -> a
+pred x = x - 1
+
 enumFrom :: Num a => a -> [a]
 enumFrom i = i : enumFrom (i + 1)
 
-enumFromTo :: (Eq t, Num t) => t -> t -> [t]
+enumFromTo :: (Ord t, Num t) => t -> t -> [t]
 enumFromTo i n =
-  if i == n
-     then [i]
-     else i : enumFromTo (i + 1) n
+  if i > n then [] else i : enumFromTo (i + 1) n
 
-zipWith :: (a->b->c) -> [a]->[b]->[c]
+enumFromBy :: (Num t) => t -> t -> [t]
+enumFromBy fr by = fr : enumFromBy (fr + by) by
+
+enumFromThen :: (Num t) => t -> t -> [t]
+enumFromThen fr th = enumFromBy fr (th - fr)
+
+enumFromByTo :: (Ord t, Num t) => t -> t -> t -> [t]
+enumFromByTo fr by to = if by < 0 then neg fr else pos fr
+  where neg x = if x < to then [] else x : neg (x + by)
+        pos x = if x > to then [] else x : pos (x + by)
+
+enumFromThenTo :: (Ord t, Num t) => t -> t -> t -> [t]
+enumFromThenTo fr th to = enumFromByTo fr (th - fr) to
+
+zipWith :: (a -> b -> c) -> [a] -> [b] -> [c]
 zipWith f (a:as) (b:bs) = f a b : zipWith f as bs
 zipWith _ _      _      = []
 
+zipWith3 :: (a -> b -> c -> d) -> [a] -> [b] -> [c] -> [d]
+zipWith3 f (a:as) (b:bs) (c:cs) = f a b c : zipWith3 f as bs cs
+zipWith3 _ _      _      _      = []
+
 zip :: [a] -> [b] -> [(a,b)]
 zip (a:as) (b:bs) = (a,b) : zip as bs
 zip _      _      = []
 
+zip3 :: [a] -> [b] -> [c] -> [(a, b, c)]
+zip3 (a:as) (b:bs) (c:cs) = (a,b,c) : zip3 as bs cs
+zip3 _      _      _      = []
+
+unzip :: [(a, b)] -> ([a], [b])
+unzip ((x,y):ps) = case unzip ps of (xs,ys) -> (x:xs, y:ys)
+unzip []         = ([], [])
+
+unzip3 :: [(a, b, c)] -> ([a], [b], [c])
+unzip3 ((x,y,z):ps) = case unzip3 ps of (xs,ys,zs) -> (x:xs, y:ys, z:zs)
+unzip3 []           = ([], [], [])
+
+lines :: String -> [String]
+lines []   = []
+lines s    = case break isLineBreak s of (a, [])   -> [a]
+                                         (a, _:cs) -> a : lines cs
+  where isLineBreak c = c == '\r' || c == '\n'
+
+unlines :: [String] -> String
+unlines = intercalate "\n"
+
+words :: String -> [String]
+words str = words' (dropWhile isSpace str)
+  where words' []  = []
+        words' s = case break isSpace s of (a,b) -> a : words b
+        isSpace c  = c `elem` " \t\r\n\f\v"
+
+unwords :: [String] -> String
+unwords = intercalate " "
+
 flip :: (t1 -> t2 -> t) -> t2 -> t1 -> t
 flip f x y = f y x
 
@@ -168,6 +449,7 @@
 
 (.) :: (t1 -> t) -> (t2 -> t1) -> t2 -> t
 (f . g) x = f (g x)
+infixr 9 .
 
 (++) :: [a] -> [a] -> [a]
 x ++ y = conc x y
@@ -192,10 +474,70 @@
 foldr _ z []     = z
 foldr f z (x:xs) = f x (foldr f z xs)
 
+foldr1 :: (a -> a -> a) -> [a] -> a
+foldr1 _ [x]    = x
+foldr1 f (x:xs) = f x (foldr1 f xs)
+foldr1 _ []     = error "foldr1: empty list"
+
 foldl :: (t1 -> t -> t1) -> t1 -> [t] -> t1
 foldl _ z []     = z
 foldl f z (x:xs) = foldl f (f z x) xs
 
+foldl1 :: (a -> a -> a) -> [a] -> a
+foldl1 f (x:xs) = foldl f x xs
+foldl1 _ []     = error "foldl1: empty list"
+
+and :: [Bool] -> Bool
+and []     = True
+and (x:xs) = x && and xs
+
+or :: [Bool] -> Bool
+or []     = False
+or (x:xs) = x || or xs
+
+any :: (a -> Bool) -> [a] -> Bool
+any _ []     = False
+any p (x:xs) = p x || any p xs
+
+all :: (a -> Bool) -> [a] -> Bool
+all _ []     = True
+all p (x:xs) = p x && all p xs
+
+maximum :: (Num a, Foreign a) => [a] -> a
+maximum [] = error "maximum: empty list"
+maximum xs = foldl1 max xs
+
+minimum :: (Num a, Foreign a) => [a] -> a
+minimum [] = error "minimum: empty list"
+minimum xs = foldl1 min xs
+
+product :: Num a => [a] -> a
+product [] = error "product: empty list"
+product xs = foldl (*) 1 xs
+
+sum :: Num a => [a] -> a
+sum [] = error "sum: empty list"
+sum xs = foldl (+) 0 xs
+
+scanl :: (a -> b -> a) -> a -> [b] -> [a]
+scanl f z l = z : case l of [] -> []
+                            (x:xs) -> scanl f (f z x) xs
+
+scanl1 :: (a -> a -> a) -> [a] -> [a]
+scanl1 _ [] = []
+scanl1 f (x:xs) = scanl f x xs
+
+scanr :: (a -> b -> b) -> b -> [a] -> [b]
+scanr _ z [] = [z]
+scanr f z (x:xs) = case scanr f z xs of (h:t) -> f x h : h : t
+                                        _     -> undefined
+
+scanr1 :: (a -> a -> a) -> [a] -> [a]
+scanr1 _ []     = []
+scanr1 _ [x]    = [x]
+scanr1 f (x:xs) = case scanr1 f xs of (h:t) -> f x h : h : t
+                                      _     -> undefined
+
 lookup :: Eq a1 => a1 -> [(a1, a)] -> Maybe a
 lookup _key []          =  Nothing
 lookup  key ((x,y):xys) =
@@ -228,18 +570,56 @@
 length :: [a] -> Int
 length xs = length' 0 xs
 
+length' :: Int -> [a] -> Int
 length' acc (_:xs) = length' (acc+1) xs
 length' acc _ = acc
 
-mod :: Double -> Double -> Double
-mod = ffi "%1 %% %2"
+rem :: Int -> Int -> Int
+rem x y = if y == 0 then error "Division by zero" else rem' x y
+infixl 7 `rem`
 
-min :: Double -> Double -> Double
+rem' :: Int -> Int -> Int
+rem' = ffi "%1 %% %2"
+
+quot :: Int -> Int -> Int
+quot x y = if y == 0 then error "Division by zero" else quot' x y
+infixl 7 `quot`
+
+quot' :: Int -> Int -> Int
+quot' = ffi "~~(%1/%2)"
+
+quotRem :: Int -> Int -> (Int, Int)
+quotRem x y = (quot x y, rem x y)
+
+div :: Int -> Int -> Int
+div x y
+  | x > 0 && y < 0 = quot (x-1) y - 1
+  | x < 0 && y > 0 = quot (x+1) y - 1
+div x y            = quot x y
+infixl 7 `div`
+
+mod :: Int -> Int -> Int
+mod x y
+  | x > 0 && y < 0 = rem (x-1) y + y + 1
+  | x < 0 && y > 0 = rem (x+1) y + y - 1
+mod x y            = rem x y
+infixl 7 `mod`
+
+divMod :: Int -> Int -> (Int, Int)
+divMod x y
+  | x > 0 && y < 0 = case (x-1) `quotRem` y of (q,r) -> (q-1, r+y+1)
+  | x < 0 && y > 1 = case (x+1) `quotRem` y of (q,r) -> (q-1, r+y-1)
+divMod x y         = quotRem x y
+
+min :: (Num a, Foreign a) => a -> a -> a
 min = ffi "Math.min(%1,%2)"
 
-max :: Double -> Double -> Double
+max :: (Num a, Foreign a) => a -> a -> a
 max = ffi "Math.max(%1,%2)"
 
+recip :: Double -> Double
+recip x = 1 / x
+
 fromIntegral :: Int -> Double
 fromIntegral = ffi "%1"
 
@@ -261,3 +641,99 @@
 sequence ms = foldr k (return []) ms
             where
               k m m' = do { x <- m; xs <- m'; return (x:xs) }
+
+sequence_ :: Monad m => [m a] -> m ()
+sequence_ []     = return ()
+sequence_ (m:ms) = m >> sequence_ ms
+
+id :: a -> a
+id x = x
+
+asTypeOf :: a -> a -> a
+asTypeOf = const
+
+until :: (a -> Bool) -> (a -> a) -> a -> a
+until p f x = if p x then x else until p f (f x)
+
+($!) :: (a -> b) -> a -> b
+f $! x = x `seq` f x
+infixr 0 $!
+
+(!!) :: [a] -> Int -> a
+a !! b = if b < 0 then error "(!!): negative index" else go a b
+  where go []    _ = error "(!!): index too large"
+        go (h:_) 0 = h
+        go (_:t) n = go t (n-1)
+infixl 9 !!
+
+head :: [a] -> a
+head []    = error "head: empty list"
+head (h:_) = h
+
+tail :: [a] -> [a]
+tail []    = error "tail: empty list"
+tail (_:t) = t
+
+init :: [a] -> [a]
+init []    = error "init: empty list"
+init [a]   = [a]
+init (h:t) = h : init t
+
+last :: [a] -> a
+last []    = error "last: empty list"
+last [a]   = a
+last (_:t) = last t
+
+iterate :: (a -> a) -> a -> [a]
+iterate f x = x : iterate f (f x)
+
+repeat :: a -> [a]
+repeat x = x : repeat x
+
+replicate :: Int -> a -> [a]
+replicate 0 _ = []
+replicate n x = if n < 0 then error "replicate: negative length"
+                         else x : replicate (n-1) x
+
+cycle :: [a] -> [a]
+cycle [] = error "cycle: empty list"
+cycle xs = xs' where xs' = xs ++ xs'
+
+take :: Int -> [a] -> [a]
+take 0 _  = []
+take _ [] = []
+take n (x:xs) = if n < 0 then error "take: negative length"
+                         else x : take (n-1) xs
+
+drop :: Int -> [a] -> [a]
+drop 0 xs = xs
+drop _ [] = []
+drop n (_:xs) = if n < 0 then error "drop: negative length"
+                         else drop (n-1) xs
+
+splitAt :: Int -> [a] -> ([a], [a])
+splitAt 0 xs     = ([], xs)
+splitAt _ []     = ([], [])
+splitAt n (x:xs) = if n < 0 then error "splitAt: negative length"
+                            else case splitAt (n-1) xs of (a,b) -> (x:a, b)
+
+takeWhile :: (a -> Bool) -> [a] -> [a]
+takeWhile _ []     = []
+takeWhile p (x:xs) = if p x then x : takeWhile p xs else []
+
+dropWhile :: (a -> Bool) -> [a] -> [a]
+dropWhile _ []     = []
+dropWhile p (x:xs) = if p x then dropWhile p xs else x:xs
+
+span :: (a -> Bool) -> [a] -> ([a], [a])
+span _ []     = ([], [])
+span p (x:xs) = if p x then case span p xs of (a,b) -> (x:a, b) else ([], x:xs)
+
+break :: (a -> Bool) -> [a] -> ([a], [a])
+break p = span (not . p)
+
+print :: (Foreign a) => a -> Fay ()
+print = ffi "(function(x) { if (console && console.log) console.log(x) })(%1)"
+
+putStrLn :: String -> Fay ()
+putStrLn = ffi "(function(x) { if (console && console.log) console.log(x) })(%1)"
diff --git a/src/Language/Fay/Types.hs b/src/Language/Fay/Types.hs
--- a/src/Language/Fay/Types.hs
+++ b/src/Language/Fay/Types.hs
@@ -120,7 +120,7 @@
   ,(Symbol ">>=",[ScopeImported "Fay$" (Just "bind")])
   ,(Ident "return",[ScopeImported "Fay$" (Just "return")])
   ,(Ident "force",[ScopeImported "Fay$" (Just "force")])
-  ,(Symbol "*",[ScopeImported "Fay$" (Just "mult")])
+  ,(Ident "seq",[ScopeImported "Fay$" (Just "seq")])
   ,(Symbol "*",[ScopeImported "Fay$" (Just "mult")])
   ,(Symbol "+",[ScopeImported "Fay$" (Just "add")])
   ,(Symbol "-",[ScopeImported "Fay$" (Just "sub")])
diff --git a/src/Tests.hs b/src/Tests.hs
--- a/src/Tests.hs
+++ b/src/Tests.hs
@@ -27,19 +27,23 @@
 -- | Make the case-by-case unit tests.
 makeCompilerTests :: IO Test
 makeCompilerTests = do
-  files <- fmap (map ("tests" </>) . sort . filter dotHs) $ getDirectoryContents "tests"
-  return $ testGroup "Tests" $ flip map files $ \file ->
-    testCase file $ do
-      let root = (reverse . drop 1 . dropWhile (/='.') . reverse) file
-          out = toJsName file
-      outExists <- doesFileExist root
-      compileFromTo def { configTypecheck = False, configDirectoryIncludes = ["tests/"] } file (Just out)
-      result <- runJavaScriptFile out
-      if outExists
-         then do output <- readFile root
-                 assertEqual file output (either show id result)
-         else assertEqual file True (either (const True) (const False) result)
-  where dotHs = isSuffixOf ".hs"
+  files <- fmap (map ("tests" </>) . sort . filter (isSuffixOf ".hs")) $ getDirectoryContents "tests"
+  return $ testGroup "Tests" $ flip map files $ \file -> testCase file $ do
+    testFile False file
+    testFile True file
+
+testFile :: Bool -> String -> IO ()
+testFile opt file = do
+  let root = (reverse . drop 1 . dropWhile (/='.') . reverse) file
+      out = toJsName file
+      config = def { configOptimize = opt }
+  outExists <- doesFileExist root
+  compileFromTo config { configTypecheck = False, configDirectoryIncludes = ["tests/"] } file (Just out)
+  result <- runJavaScriptFile out
+  if outExists
+     then do output <- readFile root
+             assertEqual file output (either show id result)
+     else assertEqual file True (either (const True) (const False) result)
 
 -- | Run a JS file.
 runJavaScriptFile :: String -> IO (Either String String)
diff --git a/tests/Bool.hs b/tests/Bool.hs
--- a/tests/Bool.hs
+++ b/tests/Bool.hs
@@ -1,12 +1,5 @@
-
-
-module Bool where
-
-import           Language.Fay.FFI
 import           Language.Fay.Prelude
 
 main :: Fay ()
 main = print True
 
-print :: Bool -> Fay ()
-print = ffi "console.log(%1)"
diff --git a/tests/Double.hs b/tests/Double.hs
--- a/tests/Double.hs
+++ b/tests/Double.hs
@@ -1,11 +1,4 @@
-
-
-module Double where
-
-import           Language.Fay.FFI
 import           Language.Fay.Prelude
 
 main = print (2 * 4 / 2)
 
-print :: Double -> Fay ()
-print = ffi "console.log(%1)"
diff --git a/tests/Double2.hs b/tests/Double2.hs
--- a/tests/Double2.hs
+++ b/tests/Double2.hs
@@ -1,11 +1,4 @@
-
-
-module Double2 where
-
-import           Language.Fay.FFI
 import           Language.Fay.Prelude
 
 main = print (10 + (2 * (4 / 2)))
 
-print :: Double -> Fay ()
-print = ffi "console.log(%1)"
diff --git a/tests/Double3.hs b/tests/Double3.hs
--- a/tests/Double3.hs
+++ b/tests/Double3.hs
@@ -1,11 +1,4 @@
-
-
-module Double3 where
-
-import           Language.Fay.FFI
 import           Language.Fay.Prelude
 
 main = print (5 * 3 / 2)
 
-print :: Double -> Fay ()
-print = ffi "console.log(%1)"
diff --git a/tests/Double4.hs b/tests/Double4.hs
--- a/tests/Double4.hs
+++ b/tests/Double4.hs
@@ -1,11 +1,4 @@
-
-
-module Double4 where
-
-import           Language.Fay.FFI
 import           Language.Fay.Prelude
 
 main = print 1
 
-print :: Double -> Fay ()
-print = ffi "console.log(%1)"
diff --git a/tests/HierarchicalImport.hs b/tests/HierarchicalImport.hs
--- a/tests/HierarchicalImport.hs
+++ b/tests/HierarchicalImport.hs
@@ -1,14 +1,6 @@
-
-
-module HierarchicalImport where
-
-import           Language.Fay.FFI
 import           Language.Fay.Prelude
-
 import           Hierarchical.Export
 
 main :: Fay ()
-main = printS exported
+main = putStrLn exported
 
-printS :: String -> Fay ()
-printS = ffi "console.log(%1)"
diff --git a/tests/List.hs b/tests/List.hs
--- a/tests/List.hs
+++ b/tests/List.hs
@@ -1,11 +1,7 @@
-
-
-module List where
-
 import           Language.Fay.FFI
 import           Language.Fay.Prelude
 
-main = print (showList (take 5 (let ns = 1 : map' (\x -> x + 1) ns in ns)))
+main = putStrLn (showList (take 5 (let ns = 1 : map' (\x -> x + 1) ns in ns)))
 
 take 0 _      = []
 take n (x:xs) = x : take (n - 1) xs
@@ -13,8 +9,5 @@
 map' f []     = []
 map' f (x:xs) = f x : map' f xs
 
-print :: String -> Fay ()
-print = ffi "console.log(%1)"
-
-showList :: [Double] -> String
+showList :: [a] -> String
 showList = ffi "JSON.stringify(%1)"
diff --git a/tests/List2.hs b/tests/List2.hs
--- a/tests/List2.hs
+++ b/tests/List2.hs
@@ -1,11 +1,7 @@
-
-
-module List2 where
-
 import           Language.Fay.FFI
 import           Language.Fay.Prelude
 
-main = print (showList (take 5 (let ns = 1 : map' (foo 123) ns in ns)))
+main = putStrLn (showList (take 5 (let ns = 1 : map' (foo 123) ns in ns)))
 
 foo x y = x * y / 2
 
@@ -14,9 +10,6 @@
 
 map' f []     = []
 map' f (x:xs) = f x : map' f xs
-
-print :: String -> Fay ()
-print = ffi "console.log(%1)"
 
 showList :: [Double] -> String
 showList = ffi "JSON.stringify(%1)"
diff --git a/tests/Monad.hs b/tests/Monad.hs
--- a/tests/Monad.hs
+++ b/tests/Monad.hs
@@ -1,11 +1,7 @@
 {-# LANGUAGE EmptyDataDecls    #-}
 
-
 -- | Monads test.
 
-module Monad where
-
-import           Language.Fay.FFI
 import           Language.Fay.Prelude
 
 main :: Fay ()
@@ -18,5 +14,3 @@
   print x
   print y
 
-print :: Double -> Fay ()
-print = ffi "console.log(%1)"
diff --git a/tests/Monad2.hs b/tests/Monad2.hs
--- a/tests/Monad2.hs
+++ b/tests/Monad2.hs
@@ -4,18 +4,12 @@
 
 -- | Monads test.
 
-module Monad2 where
-
-import           Language.Fay.FFI
 import           Language.Fay.Prelude
 
 main :: Fay ()
 main = do
   -- State monad test
-  return (let result = runState demo 60 in fst result ++ ": " ++ show (snd result)) >>= print
-
-print :: String -> Fay ()
-print = ffi "console.log(%1)"
+  return (let result = runState demo 60 in fst result ++ ": " ++ show (snd result)) >>= putStrLn
 
 --------------------------------------------------------------------------------
 -- A monad interface
diff --git a/tests/RecCon.hs b/tests/RecCon.hs
--- a/tests/RecCon.hs
+++ b/tests/RecCon.hs
@@ -1,16 +1,8 @@
-
-
-module RecCon where
-
-import           Language.Fay.FFI
 import           Language.Fay.Prelude
 
 data Bool = True | False
 
 main = print (head (fix (\xs -> 123 : xs)))
-
-print :: Double -> Fay ()
-print = ffi "console.log(%1)"
 
 head (x:xs) = x
 
diff --git a/tests/RecDecl.hs b/tests/RecDecl.hs
--- a/tests/RecDecl.hs
+++ b/tests/RecDecl.hs
@@ -1,7 +1,3 @@
-
-
-module RecDecl where
-
 import           Language.Fay.FFI
 import           Language.Fay.Prelude
 
@@ -49,8 +45,8 @@
   print r''
 
   print r1
-  printS (show (i r1))
-  printS (show (c r1))
+  putStrLn (show (i r1))
+  putStrLn (show (c r1))
   print r2
   print r'
   print r3
@@ -58,8 +54,3 @@
   print x1
   print x2
 
-printS :: String -> Fay ()
-printS = ffi "console.log(%1)"
-
-print :: Foreign f => f -> Fay ()
-print = ffi "console.log(%1)"
diff --git a/tests/RecordImport_Export.hs b/tests/RecordImport_Export.hs
--- a/tests/RecordImport_Export.hs
+++ b/tests/RecordImport_Export.hs
@@ -1,5 +1,3 @@
-
-
 module RecordImport_Export where
 
 import           Language.Fay.Prelude
diff --git a/tests/RecordImport_Import.hs b/tests/RecordImport_Import.hs
--- a/tests/RecordImport_Import.hs
+++ b/tests/RecordImport_Import.hs
@@ -1,8 +1,3 @@
-
-
-module RecordImport_Import where
-
-import           Language.Fay.FFI
 import           Language.Fay.Prelude
 
 import           RecordImport_Export
@@ -20,10 +15,7 @@
 showFields :: Fields -> String
 showFields (Fields a b) = "Fields " ++ show a ++ " " ++ show b
 
-printS :: String -> Fay ()
-printS = ffi "console.log(%1)"
-
 main = do
-  printS $ showR $ R 1
-  printS $ showFields $ Fields { fieldFoo = 2, fieldBar = 3 }
+  putStrLn $ showR $ R 1
+  putStrLn $ showFields $ Fields { fieldFoo = 2, fieldBar = 3 }
 
diff --git a/tests/String.hs b/tests/String.hs
--- a/tests/String.hs
+++ b/tests/String.hs
@@ -1,11 +1,4 @@
-
-
-module String where
-
-import           Language.Fay.FFI
 import           Language.Fay.Prelude
 
-main = print "Hello, World!"
+main = putStrLn "Hello, World!"
 
-print :: String -> Fay ()
-print = ffi "console.log(%1)"
diff --git a/tests/asPatternMatch b/tests/asPatternMatch
--- a/tests/asPatternMatch
+++ b/tests/asPatternMatch
@@ -1,3 +1,6 @@
-{"car":{"car":1,"cdr":{"car":2,"cdr":{"car":3,"cdr":null}}},"cdr":{"car":{"car":1,"cdr":{"car":2,"cdr":{"car":3,"cdr":null}}},"cdr":null}}
-{"car":{"car":1,"cdr":{"car":2,"cdr":{"car":3,"cdr":null}}},"cdr":{"car":1,"cdr":{"car":{"car":2,"cdr":{"car":3,"cdr":null}},"cdr":null}}}
-{"car":{"car":1,"cdr":{"car":2,"cdr":{"car":3,"cdr":null}}},"cdr":{"car":1,"cdr":{"car":{"car":2,"cdr":{"car":3,"cdr":null}},"cdr":null}}}
+{ car: { car: 1, cdr: { car: 2, cdr: [Object] } },
+  cdr: { car: { car: 1, cdr: [Object] }, cdr: null } }
+{ car: { car: 1, cdr: { car: 2, cdr: [Object] } },
+  cdr: { car: 1, cdr: { car: [Object], cdr: null } } }
+{ car: { car: 1, cdr: { car: 2, cdr: [Object] } },
+  cdr: { car: 1, cdr: { car: [Object], cdr: null } } }
diff --git a/tests/asPatternMatch.hs b/tests/asPatternMatch.hs
--- a/tests/asPatternMatch.hs
+++ b/tests/asPatternMatch.hs
@@ -1,8 +1,3 @@
-
-
-module AsPatternMatch where
-
-import           Language.Fay.FFI
 import           Language.Fay.Prelude
 
 matchSame :: [a] -> ([a],[a])
@@ -14,11 +9,8 @@
 matchNested :: (a, [b]) -> ([b],b,[b])
 matchNested (a,b@(x:xs)) = (b,x,xs)
 
-print :: String -> Fay ()
-print = ffi "console.log(%1)"
-
 main :: Fay ()
 main = do
-  print $ show $ matchSame [1,2,3]
-  print $ show $ matchSplit [1,2,3]
-  print $ show $ matchNested (1, [1,2,3])
+  print $ matchSame [1,2,3]
+  print $ matchSplit [1,2,3]
+  print $ matchNested (1, [1,2,3])
diff --git a/tests/basicFunctions.hs b/tests/basicFunctions.hs
--- a/tests/basicFunctions.hs
+++ b/tests/basicFunctions.hs
@@ -1,11 +1,6 @@
-
-
-module BasicFunctions where
-
-import           Language.Fay.FFI
 import           Language.Fay.Prelude
 
-main = print (concat' ["Hello, ","World!"])
+main = putStrLn (concat' ["Hello, ","World!"])
 
 concat' = foldr' append []
 
@@ -15,5 +10,3 @@
 append (x:xs) ys = x : append xs ys
 append []     ys = ys
 
-print :: String -> Fay ()
-print = ffi "console.log(%1)"
diff --git a/tests/case.hs b/tests/case.hs
--- a/tests/case.hs
+++ b/tests/case.hs
@@ -1,13 +1,6 @@
-
-
-module Case where
-
-import           Language.Fay.FFI
 import           Language.Fay.Prelude
 
-main = print (case True of
-               True -> "Hello!"
-               False -> "Ney!")
+main = putStrLn (case True of
+                   True -> "Hello!"
+                   False -> "Ney!")
 
-print :: String -> Fay ()
-print = ffi "console.log(%1)"
diff --git a/tests/case2.hs b/tests/case2.hs
--- a/tests/case2.hs
+++ b/tests/case2.hs
@@ -1,13 +1,6 @@
-
-
-module Case2 where
-
-import           Language.Fay.FFI
 import           Language.Fay.Prelude
 
-main = print (case False of
-               True -> "Hello!"
-               False -> "Ney!")
+main = putStrLn (case False of
+                   True -> "Hello!"
+                   False -> "Ney!")
 
-print :: String -> Fay ()
-print = ffi "console.log(%1)"
diff --git a/tests/caseList.hs b/tests/caseList.hs
--- a/tests/caseList.hs
+++ b/tests/caseList.hs
@@ -1,15 +1,8 @@
-
-
-module CaseList where
-
-import           Language.Fay.FFI
 import           Language.Fay.Prelude
 
-main = print (case [1,2,3,4,5] of
+main = putStrLn (case [1,2,3,4,5] of
   [1,2,3,4,6] -> "6!"
   [1,2,4,2,4] -> "a!"
   [1,2,3,4,5] -> "OK."
   _           -> "Broken.")
 
-print :: String -> Fay ()
-print = ffi "console.log(%1)"
diff --git a/tests/caseWildcard.hs b/tests/caseWildcard.hs
--- a/tests/caseWildcard.hs
+++ b/tests/caseWildcard.hs
@@ -1,13 +1,6 @@
-
-
-module CaseWildCard where
-
-import           Language.Fay.FFI
 import           Language.Fay.Prelude
 
-main = print (case False of
-               True -> "Hello!"
-               _    -> "Ney!")
+main = putStrLn (case False of
+                  True -> "Hello!"
+                  _    -> "Ney!")
 
-print :: String -> Fay ()
-print = ffi "console.log(%1)"
diff --git a/tests/do.hs b/tests/do.hs
--- a/tests/do.hs
+++ b/tests/do.hs
@@ -1,11 +1,4 @@
-
-
-module Do where
-
-import           Language.Fay.FFI
 import           Language.Fay.Prelude
 
-main = do print "Hello,"; print "World!"
+main = do putStrLn "Hello,"; putStrLn "World!"
 
-print :: String -> Fay ()
-print = ffi "console.log(%1)"
diff --git a/tests/doAssingPatternMatch.hs b/tests/doAssingPatternMatch.hs
--- a/tests/doAssingPatternMatch.hs
+++ b/tests/doAssingPatternMatch.hs
@@ -1,13 +1,6 @@
-
-
-module DoAssignPatternMatch where
-
-import           Language.Fay.FFI
 import           Language.Fay.Prelude
 
 main = do
   [1,2] <- return [1,2]
-  print "OK."
+  putStrLn "OK."
 
-print :: String -> Fay ()
-print = ffi "console.log(%1)"
diff --git a/tests/doBindAssign.hs b/tests/doBindAssign.hs
--- a/tests/doBindAssign.hs
+++ b/tests/doBindAssign.hs
@@ -1,13 +1,6 @@
-
-
-module DoBindAssign where
-
-import           Language.Fay.FFI
 import           Language.Fay.Prelude
 
 main = do
   x <- return "Hello, World!" >>= return
-  print x
+  putStrLn x
 
-print :: String -> Fay ()
-print = ffi "console.log(%1)"
diff --git a/tests/emptyMain.hs b/tests/emptyMain.hs
--- a/tests/emptyMain.hs
+++ b/tests/emptyMain.hs
@@ -1,8 +1,3 @@
-
-
-module EmptyMain where
-
-import           Language.Fay.FFI
 import           Language.Fay.Prelude
 
 main = return ()
diff --git a/tests/fix.hs b/tests/fix.hs
--- a/tests/fix.hs
+++ b/tests/fix.hs
@@ -1,14 +1,6 @@
-
-
-module Fix where
-
-import           Language.Fay.FFI
 import           Language.Fay.Prelude
 
 main = print (head (tail (fix (\xs -> 123 : xs))))
-
-print :: Double -> Fay ()
-print = ffi "console.log(%1)"
 
 head (x:xs) = x
 
diff --git a/tests/fromInteger.hs b/tests/fromInteger.hs
--- a/tests/fromInteger.hs
+++ b/tests/fromInteger.hs
@@ -1,12 +1,4 @@
-
-
-module FromInteger where
-
-import           Language.Fay.FFI
 import           Language.Fay.Prelude
 
-print :: String -> Fay ()
-print = ffi "console.log(%1)"
-
 main :: Fay ()
-main = print $ show $ fromInteger 5
+main = putStrLn $ show $ fromInteger 5
diff --git a/tests/infixDataConst.hs b/tests/infixDataConst.hs
--- a/tests/infixDataConst.hs
+++ b/tests/infixDataConst.hs
@@ -1,11 +1,5 @@
-
-
-module Test where
-
-import           Language.Fay.FFI
 import           Language.Fay.Prelude
 
-
 data Ty1 = Integer `InfixConst1` Integer
 instance Foreign Ty1
 
@@ -19,5 +13,3 @@
 
 main = print t
 
-print :: Ty3 -> Fay ()
-print = ffi "console.log(%1)"
diff --git a/tests/ints.hs b/tests/ints.hs
--- a/tests/ints.hs
+++ b/tests/ints.hs
@@ -1,13 +1,5 @@
-
-
-module Ints where
-
-import           Language.Fay.FFI
 import           Language.Fay.Prelude
 
 main = do
   print 123
 
--- | Print using console.log.
-print :: Int -> Fay ()
-print = ffi "console.log(%1)"
diff --git a/tests/mutableReference.hs b/tests/mutableReference.hs
--- a/tests/mutableReference.hs
+++ b/tests/mutableReference.hs
@@ -2,9 +2,6 @@
 
 {-# LANGUAGE EmptyDataDecls    #-}
 
-
-module MutableReference where
-
 import           Language.Fay.FFI
 import           Language.Fay.Prelude
 
@@ -13,7 +10,7 @@
   ref <- newRef "Hello, World!"
   x <- readRef ref
   writeRef ref "Hai!"
-  readRef ref >>= print
+  readRef ref >>= putStrLn
 
 data Ref a
 instance Show (Ref a)
@@ -28,5 +25,3 @@
 readRef :: Foreign a => Ref a -> Fay a
 readRef = ffi "Fay$$readRef(%1)"
 
-print :: String -> Fay ()
-print = ffi "console.log(%1)"
diff --git a/tests/patternGuards b/tests/patternGuards
--- a/tests/patternGuards
+++ b/tests/patternGuards
@@ -1,3 +1,3 @@
-[ true, false ]
-[ 2, 1, 0 ]
-[ true, false ]
+[true,false]
+[2,1,0]
+[true,false]
diff --git a/tests/patternGuards.hs b/tests/patternGuards.hs
--- a/tests/patternGuards.hs
+++ b/tests/patternGuards.hs
@@ -1,12 +1,9 @@
 {-# LANGUAGE FlexibleInstances #-}
 
-
-module PatternGuards where
-
 -- | As pattern matches
 
-import           Language.Fay.FFI
 import           Language.Fay.Prelude
+import           Language.Fay.FFI
 
 isPositive :: Double -> Bool
 isPositive x | x > 0 = True
@@ -22,13 +19,12 @@
 -- Not called, throws "non-exhaustive guard"
 nonExhaustive x | x > 1 = True
 
-printD :: [Double] -> Fay ()
-printD = ffi "console.log(%1)"
-printB :: [Bool] -> Fay ()
-printB = ffi "console.log(%1)"
-
 main :: Fay ()
 main = do
-  printB [isPositive 1, isPositive 0]
-  printD [threeConds 3, threeConds 1, threeConds 0]
-  printB [withOtherwise 2, withOtherwise 0]
+  putStrLn $ showList [isPositive 1, isPositive 0]
+  putStrLn $ showList [threeConds 3, threeConds 1, threeConds 0]
+  putStrLn $ showList [withOtherwise 2, withOtherwise 0]
+
+showList :: [a] -> String
+showList = ffi "JSON.stringify(%1)"
+
diff --git a/tests/patternMatchFail.hs b/tests/patternMatchFail.hs
--- a/tests/patternMatchFail.hs
+++ b/tests/patternMatchFail.hs
@@ -1,11 +1,4 @@
-
-
-module PatternMatchFail where
-
-import           Language.Fay.FFI
 import           Language.Fay.Prelude
 
-main = print ((\a 'a' -> "OK.") 0 'b')
+main = putStrLn ((\a 'a' -> "OK.") 0 'b')
 
-print :: String -> Fay ()
-print = ffi "console.log(%1)"
diff --git a/tests/recordFunctionPatternMatch.hs b/tests/recordFunctionPatternMatch.hs
--- a/tests/recordFunctionPatternMatch.hs
+++ b/tests/recordFunctionPatternMatch.hs
@@ -1,18 +1,11 @@
-
-
-module RecordFunctionPatternMatch where
-
-import           Language.Fay.FFI
 import           Language.Fay.Prelude
 
 data Person = Person String String Int
 
-main = print (foo (Person "Chris" "Done" 14))
+main = putStrLn (foo (Person "Chris" "Done" 14))
 
 foo (Person "Chris" "Done" 13) = "Foo!"
 foo (Person "Chris" "Barf" 14) = "Bar!"
 foo (Person "Chris" "Done" 14) = "Hello!"
 foo _ = "World!"
 
-print :: String -> Fay ()
-print = ffi "console.log(%1)"
diff --git a/tests/recordPatternMatch.hs b/tests/recordPatternMatch.hs
--- a/tests/recordPatternMatch.hs
+++ b/tests/recordPatternMatch.hs
@@ -1,15 +1,8 @@
-
-
-module RecordPatternMatch where
-
-import           Language.Fay.FFI
 import           Language.Fay.Prelude
 
 data Person = Person String String Int
 
-main = print (case Person "Chris" "Done" 14 of
-                Person "Chris" "Done" 13 -> "Hello!"
-                _ -> "World!")
+main = putStrLn (case Person "Chris" "Done" 14 of
+                   Person "Chris" "Done" 13 -> "Hello!"
+                   _ -> "World!")
 
-print :: String -> Fay ()
-print = ffi "console.log(%1)"
diff --git a/tests/recordPatternMatch2.hs b/tests/recordPatternMatch2.hs
--- a/tests/recordPatternMatch2.hs
+++ b/tests/recordPatternMatch2.hs
@@ -1,17 +1,10 @@
-
-
-module RecordPatternMatch2 where
-
-import           Language.Fay.FFI
 import           Language.Fay.Prelude
 
 data Person = Person String String Int
 
-main = print (case Person "Chris" "Done" 14 of
-                Person "Chris" "Done" 13 -> "Foo!"
-                Person "Chris" "Barf" 14 -> "Bar!"
-                Person "Chris" "Done" 14 -> "Hello!"
-                _ -> "World!")
+main = putStrLn (case Person "Chris" "Done" 14 of
+                   Person "Chris" "Done" 13 -> "Foo!"
+                   Person "Chris" "Barf" 14 -> "Bar!"
+                   Person "Chris" "Done" 14 -> "Hello!"
+                   _ -> "World!")
 
-print :: String -> Fay ()
-print = ffi "console.log(%1)"
diff --git a/tests/recordUseBeforeDefine.hs b/tests/recordUseBeforeDefine.hs
--- a/tests/recordUseBeforeDefine.hs
+++ b/tests/recordUseBeforeDefine.hs
@@ -1,8 +1,3 @@
-
-
-module RecordUseBeforeDefine where
-
-import           Language.Fay.FFI
 import           Language.Fay.Prelude
 
 import           Hierarchical.RecordDefined
@@ -16,5 +11,3 @@
 
 data R = R Double
 
-print :: Double -> Fay ()
-print = ffi "console.log(%1)"
diff --git a/tests/records.hs b/tests/records.hs
--- a/tests/records.hs
+++ b/tests/records.hs
@@ -1,8 +1,3 @@
-
-
-module Records where
-
-import           Language.Fay.FFI
 import           Language.Fay.Prelude
 
 data Person1 = Person1 String String Int
@@ -15,10 +10,8 @@
 p3  = Person3 "Chris" "Done" 13
 
 main = do
-  print (case p1 of Person1 "Chris" "Done" 13 -> "Hello!")
-  print (case p2 of Person2 "Chris" "Done" 13 -> "Hello!")
-  print (case p2a of Person2 "Chris" "Done" 13 -> "Hello!")
-  print (case p3 of Person3 "Chris" "Done" 13 -> "Hello!")
+  putStrLn (case p1 of Person1 "Chris" "Done" 13 -> "Hello!")
+  putStrLn (case p2 of Person2 "Chris" "Done" 13 -> "Hello!")
+  putStrLn (case p2a of Person2 "Chris" "Done" 13 -> "Hello!")
+  putStrLn (case p3 of Person3 "Chris" "Done" 13 -> "Hello!")
 
-print :: String -> Fay ()
-print = ffi "console.log(%1)"
diff --git a/tests/reservedWords.hs b/tests/reservedWords.hs
--- a/tests/reservedWords.hs
+++ b/tests/reservedWords.hs
@@ -1,51 +1,46 @@
 {-# LANGUAGE EmptyDataDecls    #-}
 
-
-module ReservedWords where
-
-import           Language.Fay.FFI
 import           Language.Fay.Prelude
 
 main = do
   -- All reserved words
-  let break = "break" in printS break
-  let catch = "catch" in printS catch
-  let const = "const" in printS const
-  let continue = "continue" in printS continue
-  let debugger = "debugger" in printS debugger
-  let delete = "delete" in printS delete
-  let enum = "enum" in printS enum
-  let export = "export" in printS export
-  let extends = "extends" in printS extends
-  let finally = "finally" in printS finally
-  let for = "for" in printS for
-  let function = "function" in printS function
-  let implements = "implements" in printS implements
-  let instanceof = "instanceof" in printS instanceof
-  let interface = "interface" in printS interface
-  let new = "new" in printS new
-  let null = "null" in printS null
-  let package = "package" in printS package
-  let private = "private" in printS private
-  let protected = "protected" in printS protected
-  let public = "public" in printS public
-  let return = "return" in printS return
-  let static = "static" in printS static
-  let super = "super" in printS super
-  let switch = "switch" in printS switch
-  let this = "this" in printS this
-  let throw = "throw" in printS throw
-  let try = "try" in printS try
-  let typeof = "typeof" in printS typeof
-  let undefined = "undefined" in printS undefined
-  let var = "var" in printS var
-  let void = "void" in printS void
-  let while = "while" in printS while
-  let with = "with" in printS with
-  let yield = "yield" in printS yield
+  let break = "break" in putStrLn break
+  let catch = "catch" in putStrLn catch
+  let const = "const" in putStrLn const
+  let continue = "continue" in putStrLn continue
+  let debugger = "debugger" in putStrLn debugger
+  let delete = "delete" in putStrLn delete
+  let enum = "enum" in putStrLn enum
+  let export = "export" in putStrLn export
+  let extends = "extends" in putStrLn extends
+  let finally = "finally" in putStrLn finally
+  let for = "for" in putStrLn for
+  let function = "function" in putStrLn function
+  let implements = "implements" in putStrLn implements
+  let instanceof = "instanceof" in putStrLn instanceof
+  let interface = "interface" in putStrLn interface
+  let new = "new" in putStrLn new
+  let null = "null" in putStrLn null
+  let package = "package" in putStrLn package
+  let private = "private" in putStrLn private
+  let protected = "protected" in putStrLn protected
+  let public = "public" in putStrLn public
+  let return = "return" in putStrLn return
+  let static = "static" in putStrLn static
+  let super = "super" in putStrLn super
+  let switch = "switch" in putStrLn switch
+  let this = "this" in putStrLn this
+  let throw = "throw" in putStrLn throw
+  let try = "try" in putStrLn try
+  let typeof = "typeof" in putStrLn typeof
+  let undefined = "undefined" in putStrLn undefined
+  let var = "var" in putStrLn var
+  let void = "void" in putStrLn void
+  let while = "while" in putStrLn while
+  let with = "with" in putStrLn with
+  let yield = "yield" in putStrLn yield
 
-  printS ""
+  putStrLn ""
   -- Stdlib functions that need to be encoded
-  printS $ const "stdconst" 2
-printS :: String -> Fay ()
-printS = ffi "console.log(%1)"
+  putStrLn $ const "stdconst" 2
+
diff --git a/tests/tailRecursion.hs b/tests/tailRecursion.hs
--- a/tests/tailRecursion.hs
+++ b/tests/tailRecursion.hs
@@ -1,17 +1,9 @@
 -- | This is to test tail-recursive calls are iterative.
-
-
-
-module Tail where
-
-import           Language.Fay.FFI
 import           Language.Fay.Prelude
 
 main = do
-  print (sum 100000 0 :: Double)
+  print (sumTo 100000 0 :: Double)
 
-sum 0 acc = acc
-sum n acc = sum (n - 1) (acc + n)
+sumTo 0 acc = acc
+sumTo n acc = sumTo (n - 1) (acc + n)
 
-print :: Double -> Fay ()
-print = ffi "console.log(%1)"
diff --git a/tests/then.hs b/tests/then.hs
--- a/tests/then.hs
+++ b/tests/then.hs
@@ -1,11 +1,4 @@
-
-
-module Then where
-
-import           Language.Fay.FFI
 import           Language.Fay.Prelude
 
-main = print "Hello," >> print "World!"
+main = putStrLn "Hello," >> putStrLn "World!"
 
-print :: String -> Fay ()
-print = ffi "console.log(%1)"
diff --git a/tests/utf8.hs b/tests/utf8.hs
--- a/tests/utf8.hs
+++ b/tests/utf8.hs
@@ -2,138 +2,133 @@
 
 -- | Unicode test.
 
-module Utf8 where
-
-import           Language.Fay.FFI
 import           Language.Fay.Prelude
 
 main :: Fay ()
 main = do
   -- Latin-1 Supplement
-  printS "¡ ¢ £ ¤ ¥ ¦ § ¨ © ª « ¬ ® ¯ ° ± ² ³ ´ µ ¶ · ¸ ¹ º » ¼ ½ ¾ ¿ À Á Â Ã Ä Å Æ Ç È É Ê Ë Ì Í Î Ï Ð Ñ Ò Ó Ô Õ Ö × Ø Ù Ú Û Ü Ý Þ ß à á â ã ä å æ ç è é ê ë ì í î ï ð ñ ò ó ô õ ö ÷ ø ù ú û ü ý þ ÿ"
+  putStrLn "¡ ¢ £ ¤ ¥ ¦ § ¨ © ª « ¬ ® ¯ ° ± ² ³ ´ µ ¶ · ¸ ¹ º » ¼ ½ ¾ ¿ À Á Â Ã Ä Å Æ Ç È É Ê Ë Ì Í Î Ï Ð Ñ Ò Ó Ô Õ Ö × Ø Ù Ú Û Ü Ý Þ ß à á â ã ä å æ ç è é ê ë ì í î ï ð ñ ò ó ô õ ö ÷ ø ù ú û ü ý þ ÿ"
 
   -- Latin Extended-A
-  printS "Ā ā Ă ă Ą ą Ć ć Ĉ ĉ Ċ ċ Č č Ď ď Đ đ Ē ē Ĕ ĕ Ė ė Ę ę Ě ě Ĝ ĝ Ğ ğ Ġ ġ Ģ ģ Ĥ ĥ Ħ ħ Ĩ ĩ Ī ī Ĭ ĭ Į į İ ı Ĳ ĳ Ĵ ĵ Ķ ķ ĸ Ĺ ĺ Ļ ļ Ľ ľ Ŀ ŀ Ł ł Ń ń Ņ ņ Ň ň ŉ Ŋ ŋ Ō ō Ŏ ŏ Ő ő Œ œ Ŕ ŕ Ŗ ŗ Ř ř Ś ś Ŝ ŝ Ş ş Š š Ţ ţ Ť ť Ŧ ŧ Ũ ũ Ū ū Ŭ ŭ Ů ů Ű ű Ų ų Ŵ ŵ Ŷ ŷ Ÿ Ź ź Ż ż Ž ž ſ"
+  putStrLn "Ā ā Ă ă Ą ą Ć ć Ĉ ĉ Ċ ċ Č č Ď ď Đ đ Ē ē Ĕ ĕ Ė ė Ę ę Ě ě Ĝ ĝ Ğ ğ Ġ ġ Ģ ģ Ĥ ĥ Ħ ħ Ĩ ĩ Ī ī Ĭ ĭ Į į İ ı Ĳ ĳ Ĵ ĵ Ķ ķ ĸ Ĺ ĺ Ļ ļ Ľ ľ Ŀ ŀ Ł ł Ń ń Ņ ņ Ň ň ŉ Ŋ ŋ Ō ō Ŏ ŏ Ő ő Œ œ Ŕ ŕ Ŗ ŗ Ř ř Ś ś Ŝ ŝ Ş ş Š š Ţ ţ Ť ť Ŧ ŧ Ũ ũ Ū ū Ŭ ŭ Ů ů Ű ű Ų ų Ŵ ŵ Ŷ ŷ Ÿ Ź ź Ż ż Ž ž ſ"
    -- Latin Extended-B
-  printS "ƀ Ɓ Ƃ ƃ Ƅ ƅ Ɔ Ƈ ƈ Ɖ Ɗ Ƌ ƌ ƍ Ǝ Ə Ɛ Ƒ ƒ Ɠ Ɣ ƕ Ɩ Ɨ Ƙ ƙ ƚ ƛ Ɯ Ɲ ƞ Ɵ Ơ ơ Ƣ ƣ Ƥ ƥ Ʀ Ƨ ƨ Ʃ ƪ ƫ Ƭ ƭ Ʈ Ư ư Ʊ Ʋ Ƴ ƴ Ƶ ƶ Ʒ Ƹ ƹ ƺ ƻ Ƽ ƽ ƾ ƿ ǀ ǁ ǂ ǃ Ǆ ǅ ǆ Ǉ ǈ ǉ Ǌ ǋ ǌ Ǎ ǎ Ǐ ǐ Ǒ ǒ Ǔ ǔ Ǖ ǖ Ǘ ǘ Ǚ ǚ Ǜ ǜ ǝ Ǟ ǟ Ǡ ǡ Ǣ ǣ Ǥ ǥ Ǧ ǧ Ǩ ǩ Ǫ ǫ Ǭ ǭ Ǯ ǯ ǰ Ǳ ǲ ǳ Ǵ ǵ Ǻ ǻ Ǽ ǽ Ǿ ǿ Ȁ ȁ Ȃ ȃ ..."
+  putStrLn "ƀ Ɓ Ƃ ƃ Ƅ ƅ Ɔ Ƈ ƈ Ɖ Ɗ Ƌ ƌ ƍ Ǝ Ə Ɛ Ƒ ƒ Ɠ Ɣ ƕ Ɩ Ɨ Ƙ ƙ ƚ ƛ Ɯ Ɲ ƞ Ɵ Ơ ơ Ƣ ƣ Ƥ ƥ Ʀ Ƨ ƨ Ʃ ƪ ƫ Ƭ ƭ Ʈ Ư ư Ʊ Ʋ Ƴ ƴ Ƶ ƶ Ʒ Ƹ ƹ ƺ ƻ Ƽ ƽ ƾ ƿ ǀ ǁ ǂ ǃ Ǆ ǅ ǆ Ǉ ǈ ǉ Ǌ ǋ ǌ Ǎ ǎ Ǐ ǐ Ǒ ǒ Ǔ ǔ Ǖ ǖ Ǘ ǘ Ǚ ǚ Ǜ ǜ ǝ Ǟ ǟ Ǡ ǡ Ǣ ǣ Ǥ ǥ Ǧ ǧ Ǩ ǩ Ǫ ǫ Ǭ ǭ Ǯ ǯ ǰ Ǳ ǲ ǳ Ǵ ǵ Ǻ ǻ Ǽ ǽ Ǿ ǿ Ȁ ȁ Ȃ ȃ ..."
   -- IPA Extensions
-  printS "ɐ ɑ ɒ ɓ ɔ ɕ ɖ ɗ ɘ ə ɚ ɛ ɜ ɝ ɞ ɟ ɠ ɡ ɢ ɣ ɤ ɥ ɦ ɧ ɨ ɩ ɪ ɫ ɬ ɭ ɮ ɯ ɰ ɱ ɲ ɳ ɴ ɵ ɶ ɷ ɸ ɹ ɺ ɻ ɼ ɽ ɾ ɿ ʀ ʁ ʂ ʃ ʄ ʅ ʆ ʇ ʈ ʉ ʊ ʋ ʌ ʍ ʎ ʏ ʐ ʑ ʒ ʓ ʔ ʕ ʖ ʗ ʘ ʙ ʚ ʛ ʜ ʝ ʞ ʟ ʠ ʡ ʢ ʣ ʤ ʥ ʦ ʧ ʨ"
+  putStrLn "ɐ ɑ ɒ ɓ ɔ ɕ ɖ ɗ ɘ ə ɚ ɛ ɜ ɝ ɞ ɟ ɠ ɡ ɢ ɣ ɤ ɥ ɦ ɧ ɨ ɩ ɪ ɫ ɬ ɭ ɮ ɯ ɰ ɱ ɲ ɳ ɴ ɵ ɶ ɷ ɸ ɹ ɺ ɻ ɼ ɽ ɾ ɿ ʀ ʁ ʂ ʃ ʄ ʅ ʆ ʇ ʈ ʉ ʊ ʋ ʌ ʍ ʎ ʏ ʐ ʑ ʒ ʓ ʔ ʕ ʖ ʗ ʘ ʙ ʚ ʛ ʜ ʝ ʞ ʟ ʠ ʡ ʢ ʣ ʤ ʥ ʦ ʧ ʨ"
   -- Spacing Modifier Letters
-  printS "ʰ ʱ ʲ ʳ ʴ ʵ ʶ ʷ ʸ ʹ ʺ ʻ ʼ ʽ ʾ ʿ ˀ ˁ ˂ ˃ ˄ ˅ ˆ ˇ ˈ ˉ ˊ ˋ ˌ ˍ ˎ ˏ ː ˑ ˒ ˓ ˔ ˕ ˖ ˗ ˘ ˙ ˚ ˛ ˜ ˝ ˞ ˠ ˡ ˢ ˣ ˤ ˥ ˦ ˧ ˨ ˩"
+  putStrLn "ʰ ʱ ʲ ʳ ʴ ʵ ʶ ʷ ʸ ʹ ʺ ʻ ʼ ʽ ʾ ʿ ˀ ˁ ˂ ˃ ˄ ˅ ˆ ˇ ˈ ˉ ˊ ˋ ˌ ˍ ˎ ˏ ː ˑ ˒ ˓ ˔ ˕ ˖ ˗ ˘ ˙ ˚ ˛ ˜ ˝ ˞ ˠ ˡ ˢ ˣ ˤ ˥ ˦ ˧ ˨ ˩"
   -- Combining Diacritical Marks
-  printS "̀ ́ ̂ ̃ ̄ ̅ ̆ ̇ ̈ ̉ ̊ ̋ ̌ ̍ ̎ ̏ ̐ ̑ ̒ ̓ ̔ ̕ ̖ ̗ ̘ ̙ ̚ ̛ ̜ ̝ ̞ ̟ ̠ ̡ ̢ ̣ ̤ ̥ ̦ ̧ ̨ ̩ ̪ ̫ ̬ ̭ ̮ ̯ ̰ ̱ ̲ ̳ ̴ ̵ ̶ ̷ ̸ ̹ ̺ ̻ ̼ ̽ ̾ ̿ ̀ ́ ͂ ̓ ̈́ ͅ ͠ ͡"
+  putStrLn "̀ ́ ̂ ̃ ̄ ̅ ̆ ̇ ̈ ̉ ̊ ̋ ̌ ̍ ̎ ̏ ̐ ̑ ̒ ̓ ̔ ̕ ̖ ̗ ̘ ̙ ̚ ̛ ̜ ̝ ̞ ̟ ̠ ̡ ̢ ̣ ̤ ̥ ̦ ̧ ̨ ̩ ̪ ̫ ̬ ̭ ̮ ̯ ̰ ̱ ̲ ̳ ̴ ̵ ̶ ̷ ̸ ̹ ̺ ̻ ̼ ̽ ̾ ̿ ̀ ́ ͂ ̓ ̈́ ͅ ͠ ͡"
   -- Greek
-  printS "ʹ ͵ ͺ ; ΄ ΅ Ά · Έ Ή Ί Ό Ύ Ώ ΐ Α Β Γ Δ Ε Ζ Η Θ Ι Κ Λ Μ Ν Ξ Ο Π Ρ Σ Τ Υ Φ Χ Ψ Ω Ϊ Ϋ ά έ ή ί ΰ α β γ δ ε ζ η θ ι κ λ μ ν ξ ο π ρ ς σ τ υ φ χ ψ ω ϊ ϋ ό ύ ώ ϐ ϑ ϒ ϓ ϔ ϕ ϖ Ϛ Ϝ Ϟ Ϡ Ϣ ϣ Ϥ ϥ Ϧ ϧ Ϩ ϩ Ϫ ϫ Ϭ ϭ Ϯ ϯ ϰ ϱ ϲ ϳ"
+  putStrLn "ʹ ͵ ͺ ; ΄ ΅ Ά · Έ Ή Ί Ό Ύ Ώ ΐ Α Β Γ Δ Ε Ζ Η Θ Ι Κ Λ Μ Ν Ξ Ο Π Ρ Σ Τ Υ Φ Χ Ψ Ω Ϊ Ϋ ά έ ή ί ΰ α β γ δ ε ζ η θ ι κ λ μ ν ξ ο π ρ ς σ τ υ φ χ ψ ω ϊ ϋ ό ύ ώ ϐ ϑ ϒ ϓ ϔ ϕ ϖ Ϛ Ϝ Ϟ Ϡ Ϣ ϣ Ϥ ϥ Ϧ ϧ Ϩ ϩ Ϫ ϫ Ϭ ϭ Ϯ ϯ ϰ ϱ ϲ ϳ"
   -- Cyrillic
-  printS "Ё Ђ Ѓ Є Ѕ І Ї Ј Љ Њ Ћ Ќ Ў Џ А Б В Г Д Е Ж З И Й К Л М Н О П Р С Т У Ф Х Ц Ч Ш Щ Ъ Ы Ь Э Ю Я а б в г д е ж з и й к л м н о п р с т у ф х ц ч ш щ ъ ы ь э ю я ё ђ ѓ є ѕ і ї ј љ њ ћ ќ ў џ Ѡ ѡ Ѣ ѣ Ѥ ѥ Ѧ ѧ Ѩ ѩ Ѫ ѫ Ѭ ѭ Ѯ ѯ Ѱ ѱ Ѳ ѳ Ѵ ѵ Ѷ ѷ Ѹ ѹ Ѻ ѻ Ѽ ѽ Ѿ ѿ Ҁ ҁ ҂ ҃ ..."
+  putStrLn "Ё Ђ Ѓ Є Ѕ І Ї Ј Љ Њ Ћ Ќ Ў Џ А Б В Г Д Е Ж З И Й К Л М Н О П Р С Т У Ф Х Ц Ч Ш Щ Ъ Ы Ь Э Ю Я а б в г д е ж з и й к л м н о п р с т у ф х ц ч ш щ ъ ы ь э ю я ё ђ ѓ є ѕ і ї ј љ њ ћ ќ ў џ Ѡ ѡ Ѣ ѣ Ѥ ѥ Ѧ ѧ Ѩ ѩ Ѫ ѫ Ѭ ѭ Ѯ ѯ Ѱ ѱ Ѳ ѳ Ѵ ѵ Ѷ ѷ Ѹ ѹ Ѻ ѻ Ѽ ѽ Ѿ ѿ Ҁ ҁ ҂ ҃ ..."
   -- Armenian
-  printS "Ա Բ Գ Դ Ե Զ Է Ը Թ Ժ Ի Լ Խ Ծ Կ Հ Ձ Ղ Ճ Մ Յ Ն Շ Ո Չ Պ Ջ Ռ Ս Վ Տ Ր Ց Ւ Փ Ք Օ Ֆ ՙ ՚ ՛ ՜ ՝ ՞ ՟ ա բ գ դ ե զ է ը թ ժ ի լ խ ծ կ հ ձ ղ ճ մ յ ն շ ո չ պ ջ ռ ս վ տ ր ց ւ փ ք օ ֆ և ։"
+  putStrLn "Ա Բ Գ Դ Ե Զ Է Ը Թ Ժ Ի Լ Խ Ծ Կ Հ Ձ Ղ Ճ Մ Յ Ն Շ Ո Չ Պ Ջ Ռ Ս Վ Տ Ր Ց Ւ Փ Ք Օ Ֆ ՙ ՚ ՛ ՜ ՝ ՞ ՟ ա բ գ դ ե զ է ը թ ժ ի լ խ ծ կ հ ձ ղ ճ մ յ ն շ ո չ պ ջ ռ ս վ տ ր ց ւ փ ք օ ֆ և ։"
   -- Hebrew
-  printS "֑ ֒ ֓ ֔ ֕ ֖ ֗ ֘ ֙ ֚ ֛ ֜ ֝ ֞ ֟ ֠ ֡ ֣ ֤ ֥ ֦ ֧ ֨ ֩ ֪ ֫ ֬ ֭ ֮ ֯ ְ ֱ ֲ ֳ ִ ֵ ֶ ַ ָ ֹ ֻ ּ ֽ ־ ֿ ׀ ׁ ׂ ׃ ׄ א ב ג ד ה ו ז ח ט י ך כ ל ם מ ן נ ס ע ף פ ץ צ ק ר ש ת װ ױ ײ ׳ ״"
+  putStrLn "֑ ֒ ֓ ֔ ֕ ֖ ֗ ֘ ֙ ֚ ֛ ֜ ֝ ֞ ֟ ֠ ֡ ֣ ֤ ֥ ֦ ֧ ֨ ֩ ֪ ֫ ֬ ֭ ֮ ֯ ְ ֱ ֲ ֳ ִ ֵ ֶ ַ ָ ֹ ֻ ּ ֽ ־ ֿ ׀ ׁ ׂ ׃ ׄ א ב ג ד ה ו ז ח ט י ך כ ל ם מ ן נ ס ע ף פ ץ צ ק ר ש ת װ ױ ײ ׳ ״"
   -- Arabic
-  printS "، ؛ ؟ ء آ أ ؤ إ ئ ا ب ة ت ث ج ح خ د ذ ر ز س ش ص ض ط ظ ع غ ـ ف ق ك ل م ن ه و ى ي ً ٌ ٍ َ ُ ِ ّ ْ ٠ ١ ٢ ٣ ٤ ٥ ٦ ٧ ٨ ٩ ٪ ٫ ٬ ٭ ٰ ٱ ٲ ٳ ٴ ٵ ٶ ٷ ٸ ٹ ٺ ٻ ټ ٽ پ ٿ ڀ ځ ڂ ڃ ڄ څ چ ڇ ڈ ډ ڊ ڋ ڌ ڍ ڎ ڏ ڐ ڑ ڒ ړ ڔ ڕ ږ ڗ ژ ڙ ښ ڛ ڜ ڝ ڞ ڟ ڠ ڡ ڢ ڣ ڤ ڥ ڦ ڧ ڨ ک ڪ ګ ڬ ڭ ڮ گ ڰ ڱ ..."
+  putStrLn "، ؛ ؟ ء آ أ ؤ إ ئ ا ب ة ت ث ج ح خ د ذ ر ز س ش ص ض ط ظ ع غ ـ ف ق ك ل م ن ه و ى ي ً ٌ ٍ َ ُ ِ ّ ْ ٠ ١ ٢ ٣ ٤ ٥ ٦ ٧ ٨ ٩ ٪ ٫ ٬ ٭ ٰ ٱ ٲ ٳ ٴ ٵ ٶ ٷ ٸ ٹ ٺ ٻ ټ ٽ پ ٿ ڀ ځ ڂ ڃ ڄ څ چ ڇ ڈ ډ ڊ ڋ ڌ ڍ ڎ ڏ ڐ ڑ ڒ ړ ڔ ڕ ږ ڗ ژ ڙ ښ ڛ ڜ ڝ ڞ ڟ ڠ ڡ ڢ ڣ ڤ ڥ ڦ ڧ ڨ ک ڪ ګ ڬ ڭ ڮ گ ڰ ڱ ..."
   -- Devanagari
-  printS "ँ ं ः अ आ इ ई उ ऊ ऋ ऌ ऍ ऎ ए ऐ ऑ ऒ ओ औ क ख ग घ ङ च छ ज झ ञ ट ठ ड ढ ण त थ द ध न ऩ प फ ब भ म य र ऱ ल ळ ऴ व श ष स ह ़ ऽ ा ि ी ु ू ृ ॄ ॅ ॆ े ै ॉ ॊ ो ौ ् ॐ ॑ ॒ ॓ ॔ क़ ख़ ग़ ज़ ड़ ढ़ फ़ य़ ॠ ॡ ॢ ॣ । ॥ ० १ २ ३ ४ ५ ६ ७ ८ ९ ॰"
+  putStrLn "ँ ं ः अ आ इ ई उ ऊ ऋ ऌ ऍ ऎ ए ऐ ऑ ऒ ओ औ क ख ग घ ङ च छ ज झ ञ ट ठ ड ढ ण त थ द ध न ऩ प फ ब भ म य र ऱ ल ळ ऴ व श ष स ह ़ ऽ ा ि ी ु ू ृ ॄ ॅ ॆ े ै ॉ ॊ ो ौ ् ॐ ॑ ॒ ॓ ॔ क़ ख़ ग़ ज़ ड़ ढ़ फ़ य़ ॠ ॡ ॢ ॣ । ॥ ० १ २ ३ ४ ५ ६ ७ ८ ९ ॰"
   -- Bengali
-  printS "ঁ ং ঃ অ আ ই ঈ উ ঊ ঋ ঌ এ ঐ ও ঔ ক খ গ ঘ ঙ চ ছ জ ঝ ঞ ট ঠ ড ঢ ণ ত থ দ ধ ন প ফ ব ভ ম য র ল শ ষ স হ ় া ি ী ু ূ ৃ ৄ ে ৈ ো ৌ ্ ৗ ড় ঢ় য় ৠ ৡ ৢ ৣ ০ ১ ২ ৩ ৪ ৫ ৬ ৭ ৮ ৯ ৰ ৱ ৲ ৳ ৴ ৵ ৶ ৷ ৸ ৹ ৺"
+  putStrLn "ঁ ং ঃ অ আ ই ঈ উ ঊ ঋ ঌ এ ঐ ও ঔ ক খ গ ঘ ঙ চ ছ জ ঝ ঞ ট ঠ ড ঢ ণ ত থ দ ধ ন প ফ ব ভ ম য র ল শ ষ স হ ় া ি ী ু ূ ৃ ৄ ে ৈ ো ৌ ্ ৗ ড় ঢ় য় ৠ ৡ ৢ ৣ ০ ১ ২ ৩ ৪ ৫ ৬ ৭ ৮ ৯ ৰ ৱ ৲ ৳ ৴ ৵ ৶ ৷ ৸ ৹ ৺"
   -- Gurmukhi
-  printS "ਂ ਅ ਆ ਇ ਈ ਉ ਊ ਏ ਐ ਓ ਔ ਕ ਖ ਗ ਘ ਙ ਚ ਛ ਜ ਝ ਞ ਟ ਠ ਡ ਢ ਣ ਤ ਥ ਦ ਧ ਨ ਪ ਫ ਬ ਭ ਮ ਯ ਰ ਲ ਲ਼ ਵ ਸ਼ ਸ ਹ ਼ ਾ ਿ ੀ ੁ ੂ ੇ ੈ ੋ ੌ ੍ ਖ਼ ਗ਼ ਜ਼ ੜ ਫ਼ ੦ ੧ ੨ ੩ ੪ ੫ ੬ ੭ ੮ ੯ ੰ ੱ ੲ ੳ ੴ"
+  putStrLn "ਂ ਅ ਆ ਇ ਈ ਉ ਊ ਏ ਐ ਓ ਔ ਕ ਖ ਗ ਘ ਙ ਚ ਛ ਜ ਝ ਞ ਟ ਠ ਡ ਢ ਣ ਤ ਥ ਦ ਧ ਨ ਪ ਫ ਬ ਭ ਮ ਯ ਰ ਲ ਲ਼ ਵ ਸ਼ ਸ ਹ ਼ ਾ ਿ ੀ ੁ ੂ ੇ ੈ ੋ ੌ ੍ ਖ਼ ਗ਼ ਜ਼ ੜ ਫ਼ ੦ ੧ ੨ ੩ ੪ ੫ ੬ ੭ ੮ ੯ ੰ ੱ ੲ ੳ ੴ"
   -- Gujarati
-  printS "ઁ ં ઃ અ આ ઇ ઈ ઉ ઊ ઋ ઍ એ ઐ ઑ ઓ ઔ ક ખ ગ ઘ ઙ ચ છ જ ઝ ઞ ટ ઠ ડ ઢ ણ ત થ દ ધ ન પ ફ બ ભ મ ય ર લ ળ વ શ ષ સ હ ઼ ઽ ા િ ી ુ ૂ ૃ ૄ ૅ ે ૈ ૉ ો ૌ ્ ૐ ૠ ૦ ૧ ૨ ૩ ૪ ૫ ૬ ૭ ૮ ૯"
+  putStrLn "ઁ ં ઃ અ આ ઇ ઈ ઉ ઊ ઋ ઍ એ ઐ ઑ ઓ ઔ ક ખ ગ ઘ ઙ ચ છ જ ઝ ઞ ટ ઠ ડ ઢ ણ ત થ દ ધ ન પ ફ બ ભ મ ય ર લ ળ વ શ ષ સ હ ઼ ઽ ા િ ી ુ ૂ ૃ ૄ ૅ ે ૈ ૉ ો ૌ ્ ૐ ૠ ૦ ૧ ૨ ૩ ૪ ૫ ૬ ૭ ૮ ૯"
   -- Oriya
-  printS "ଁ ଂ ଃ ଅ ଆ ଇ ଈ ଉ ଊ ଋ ଌ ଏ ଐ ଓ ଔ କ ଖ ଗ ଘ ଙ ଚ ଛ ଜ ଝ ଞ ଟ ଠ ଡ ଢ ଣ ତ ଥ ଦ ଧ ନ ପ ଫ ବ ଭ ମ ଯ ର ଲ ଳ ଶ ଷ ସ ହ ଼ ଽ ା ି ୀ ୁ ୂ ୃ େ ୈ ୋ ୌ ୍ ୖ ୗ ଡ଼ ଢ଼ ୟ ୠ ୡ ୦ ୧ ୨ ୩ ୪ ୫ ୬ ୭ ୮ ୯ ୰"
+  putStrLn "ଁ ଂ ଃ ଅ ଆ ଇ ଈ ଉ ଊ ଋ ଌ ଏ ଐ ଓ ଔ କ ଖ ଗ ଘ ଙ ଚ ଛ ଜ ଝ ଞ ଟ ଠ ଡ ଢ ଣ ତ ଥ ଦ ଧ ନ ପ ଫ ବ ଭ ମ ଯ ର ଲ ଳ ଶ ଷ ସ ହ ଼ ଽ ା ି ୀ ୁ ୂ ୃ େ ୈ ୋ ୌ ୍ ୖ ୗ ଡ଼ ଢ଼ ୟ ୠ ୡ ୦ ୧ ୨ ୩ ୪ ୫ ୬ ୭ ୮ ୯ ୰"
   -- Tamil
-  printS "ஂ ஃ அ ஆ இ ஈ உ ஊ எ ஏ ஐ ஒ ஓ ஔ க ங ச ஜ ஞ ட ண த ந ன ப ம ய ர ற ல ள ழ வ ஷ ஸ ஹ ா ி ீ ு ூ ெ ே ை ொ ோ ௌ ் ௗ ௧ ௨ ௩ ௪ ௫ ௬ ௭ ௮ ௯ ௰ ௱ ௲"
+  putStrLn "ஂ ஃ அ ஆ இ ஈ உ ஊ எ ஏ ஐ ஒ ஓ ஔ க ங ச ஜ ஞ ட ண த ந ன ப ம ய ர ற ல ள ழ வ ஷ ஸ ஹ ா ி ீ ு ூ ெ ே ை ொ ோ ௌ ் ௗ ௧ ௨ ௩ ௪ ௫ ௬ ௭ ௮ ௯ ௰ ௱ ௲"
   -- Telugu
-  printS "ఁ ం ః అ ఆ ఇ ఈ ఉ ఊ ఋ ఌ ఎ ఏ ఐ ఒ ఓ ఔ క ఖ గ ఘ ఙ చ ఛ జ ఝ ఞ ట ఠ డ ఢ ణ త థ ద ధ న ప ఫ బ భ మ య ర ఱ ల ళ వ శ ష స హ ా ి ీ ు ూ ృ ౄ ె ే ై ొ ో ౌ ్ ౕ ౖ ౠ ౡ ౦ ౧ ౨ ౩ ౪ ౫ ౬ ౭ ౮ ౯"
+  putStrLn "ఁ ం ః అ ఆ ఇ ఈ ఉ ఊ ఋ ఌ ఎ ఏ ఐ ఒ ఓ ఔ క ఖ గ ఘ ఙ చ ఛ జ ఝ ఞ ట ఠ డ ఢ ణ త థ ద ధ న ప ఫ బ భ మ య ర ఱ ల ళ వ శ ష స హ ా ి ీ ు ూ ృ ౄ ె ే ై ొ ో ౌ ్ ౕ ౖ ౠ ౡ ౦ ౧ ౨ ౩ ౪ ౫ ౬ ౭ ౮ ౯"
   -- Kannada
-  printS "ಂ ಃ ಅ ಆ ಇ ಈ ಉ ಊ ಋ ಌ ಎ ಏ ಐ ಒ ಓ ಔ ಕ ಖ ಗ ಘ ಙ ಚ ಛ ಜ ಝ ಞ ಟ ಠ ಡ ಢ ಣ ತ ಥ ದ ಧ ನ ಪ ಫ ಬ ಭ ಮ ಯ ರ ಱ ಲ ಳ ವ ಶ ಷ ಸ ಹ ಾ ಿ ೀ ು ೂ ೃ ೄ ೆ ೇ ೈ ೊ ೋ ೌ ್ ೕ ೖ ೞ ೠ ೡ ೦ ೧ ೨ ೩ ೪ ೫ ೬ ೭ ೮ ೯"
+  putStrLn "ಂ ಃ ಅ ಆ ಇ ಈ ಉ ಊ ಋ ಌ ಎ ಏ ಐ ಒ ಓ ಔ ಕ ಖ ಗ ಘ ಙ ಚ ಛ ಜ ಝ ಞ ಟ ಠ ಡ ಢ ಣ ತ ಥ ದ ಧ ನ ಪ ಫ ಬ ಭ ಮ ಯ ರ ಱ ಲ ಳ ವ ಶ ಷ ಸ ಹ ಾ ಿ ೀ ು ೂ ೃ ೄ ೆ ೇ ೈ ೊ ೋ ೌ ್ ೕ ೖ ೞ ೠ ೡ ೦ ೧ ೨ ೩ ೪ ೫ ೬ ೭ ೮ ೯"
   -- Malayalam
-  printS "ം ഃ അ ആ ഇ ഈ ഉ ഊ ഋ ഌ എ ഏ ഐ ഒ ഓ ഔ ക ഖ ഗ ഘ ങ ച ഛ ജ ഝ ഞ ട ഠ ഡ ഢ ണ ത ഥ ദ ധ ന പ ഫ ബ ഭ മ യ ര റ ല ള ഴ വ ശ ഷ സ ഹ ാ ി ീ ു ൂ ൃ െ േ ൈ ൊ ോ ൌ ് ൗ ൠ ൡ ൦ ൧ ൨ ൩ ൪ ൫ ൬ ൭ ൮ ൯"
+  putStrLn "ം ഃ അ ആ ഇ ഈ ഉ ഊ ഋ ഌ എ ഏ ഐ ഒ ഓ ഔ ക ഖ ഗ ഘ ങ ച ഛ ജ ഝ ഞ ട ഠ ഡ ഢ ണ ത ഥ ദ ധ ന പ ഫ ബ ഭ മ യ ര റ ല ള ഴ വ ശ ഷ സ ഹ ാ ി ീ ു ൂ ൃ െ േ ൈ ൊ ോ ൌ ് ൗ ൠ ൡ ൦ ൧ ൨ ൩ ൪ ൫ ൬ ൭ ൮ ൯"
   -- Thai
-  printS "ก ข ฃ ค ฅ ฆ ง จ ฉ ช ซ ฌ ญ ฎ ฏ ฐ ฑ ฒ ณ ด ต ถ ท ธ น บ ป ผ ฝ พ ฟ ภ ม ย ร ฤ ล ฦ ว ศ ษ ส ห ฬ อ ฮ ฯ ะ ั า ำ ิ ี ึ ื ุ ู ฺ ฿ เ แ โ ใ ไ ๅ ๆ ็ ่ ้ ๊ ๋ ์ ํ ๎ ๏ ๐ ๑ ๒ ๓ ๔ ๕ ๖ ๗ ๘ ๙ ๚ ๛"
+  putStrLn "ก ข ฃ ค ฅ ฆ ง จ ฉ ช ซ ฌ ญ ฎ ฏ ฐ ฑ ฒ ณ ด ต ถ ท ธ น บ ป ผ ฝ พ ฟ ภ ม ย ร ฤ ล ฦ ว ศ ษ ส ห ฬ อ ฮ ฯ ะ ั า ำ ิ ี ึ ื ุ ู ฺ ฿ เ แ โ ใ ไ ๅ ๆ ็ ่ ้ ๊ ๋ ์ ํ ๎ ๏ ๐ ๑ ๒ ๓ ๔ ๕ ๖ ๗ ๘ ๙ ๚ ๛"
   -- Lao
-  printS "ກ ຂ ຄ ງ ຈ ຊ ຍ ດ ຕ ຖ ທ ນ ບ ປ ຜ ຝ ພ ຟ ມ ຢ ຣ ລ ວ ສ ຫ ອ ຮ ຯ ະ ັ າ ຳ ິ ີ ຶ ື ຸ ູ ົ ຼ ຽ ເ ແ ໂ ໃ ໄ ໆ ່ ້ ໊ ໋ ໌ ໍ ໐ ໑ ໒ ໓ ໔ ໕ ໖ ໗ ໘ ໙ ໜ ໝ"
+  putStrLn "ກ ຂ ຄ ງ ຈ ຊ ຍ ດ ຕ ຖ ທ ນ ບ ປ ຜ ຝ ພ ຟ ມ ຢ ຣ ລ ວ ສ ຫ ອ ຮ ຯ ະ ັ າ ຳ ິ ີ ຶ ື ຸ ູ ົ ຼ ຽ ເ ແ ໂ ໃ ໄ ໆ ່ ້ ໊ ໋ ໌ ໍ ໐ ໑ ໒ ໓ ໔ ໕ ໖ ໗ ໘ ໙ ໜ ໝ"
   -- Tibetan
-  printS "ༀ ༁ ༂ ༃ ༄ ༅ ༆ ༇ ༈ ༉ ༊ ་ ༌ ། ༎ ༏ ༐ ༑ ༒ ༓ ༔ ༕ ༖ ༗ ༘ ༙ ༚ ༛ ༜ ༝ ༞ ༟ ༠ ༡ ༢ ༣ ༤ ༥ ༦ ༧ ༨ ༩ ༪ ༫ ༬ ༭ ༮ ༯ ༰ ༱ ༲ ༳ ༴ ༵ ༶ ༷ ༸ ༹ ༺ ༻ ༼ ༽ ༾ ༿ ཀ ཁ ག གྷ ང ཅ ཆ ཇ ཉ ཊ ཋ ཌ ཌྷ ཎ ཏ ཐ ད དྷ ན པ ཕ བ བྷ མ ཙ ཚ ཛ ཛྷ ཝ ཞ ཟ འ ཡ ར ལ ཤ ཥ ས ཧ ཨ ཀྵ ཱ ི ཱི ུ ཱུ ྲྀ ཷ ླྀ ཹ ེ ཻ ོ ཽ ཾ ཿ ྀ ཱྀ ྂ ྃ ྄ ྅ ྆ ྇ ..."
+  putStrLn "ༀ ༁ ༂ ༃ ༄ ༅ ༆ ༇ ༈ ༉ ༊ ་ ༌ ། ༎ ༏ ༐ ༑ ༒ ༓ ༔ ༕ ༖ ༗ ༘ ༙ ༚ ༛ ༜ ༝ ༞ ༟ ༠ ༡ ༢ ༣ ༤ ༥ ༦ ༧ ༨ ༩ ༪ ༫ ༬ ༭ ༮ ༯ ༰ ༱ ༲ ༳ ༴ ༵ ༶ ༷ ༸ ༹ ༺ ༻ ༼ ༽ ༾ ༿ ཀ ཁ ག གྷ ང ཅ ཆ ཇ ཉ ཊ ཋ ཌ ཌྷ ཎ ཏ ཐ ད དྷ ན པ ཕ བ བྷ མ ཙ ཚ ཛ ཛྷ ཝ ཞ ཟ འ ཡ ར ལ ཤ ཥ ས ཧ ཨ ཀྵ ཱ ི ཱི ུ ཱུ ྲྀ ཷ ླྀ ཹ ེ ཻ ོ ཽ ཾ ཿ ྀ ཱྀ ྂ ྃ ྄ ྅ ྆ ྇ ..."
   -- Georgian
-  printS "Ⴀ Ⴁ Ⴂ Ⴃ Ⴄ Ⴅ Ⴆ Ⴇ Ⴈ Ⴉ Ⴊ Ⴋ Ⴌ Ⴍ Ⴎ Ⴏ Ⴐ Ⴑ Ⴒ Ⴓ Ⴔ Ⴕ Ⴖ Ⴗ Ⴘ Ⴙ Ⴚ Ⴛ Ⴜ Ⴝ Ⴞ Ⴟ Ⴠ Ⴡ Ⴢ Ⴣ Ⴤ Ⴥ ა ბ გ დ ე ვ ზ თ ი კ ლ მ ნ ო პ ჟ რ ს ტ უ ფ ქ ღ ყ შ ჩ ც ძ წ ჭ ხ ჯ ჰ ჱ ჲ ჳ ჴ ჵ ჶ ჻"
+  putStrLn "Ⴀ Ⴁ Ⴂ Ⴃ Ⴄ Ⴅ Ⴆ Ⴇ Ⴈ Ⴉ Ⴊ Ⴋ Ⴌ Ⴍ Ⴎ Ⴏ Ⴐ Ⴑ Ⴒ Ⴓ Ⴔ Ⴕ Ⴖ Ⴗ Ⴘ Ⴙ Ⴚ Ⴛ Ⴜ Ⴝ Ⴞ Ⴟ Ⴠ Ⴡ Ⴢ Ⴣ Ⴤ Ⴥ ა ბ გ დ ე ვ ზ თ ი კ ლ მ ნ ო პ ჟ რ ს ტ უ ფ ქ ღ ყ შ ჩ ც ძ წ ჭ ხ ჯ ჰ ჱ ჲ ჳ ჴ ჵ ჶ ჻"
   -- Hangul Jamo
-  printS "ᄀ ᄁ ᄂ ᄃ ᄄ ᄅ ᄆ ᄇ ᄈ ᄉ ᄊ ᄋ ᄌ ᄍ ᄎ ᄏ ᄐ ᄑ ᄒ ᄓ ᄔ ᄕ ᄖ ᄗ ᄘ ᄙ ᄚ ᄛ ᄜ ᄝ ᄞ ᄟ ᄠ ᄡ ᄢ ᄣ ᄤ ᄥ ᄦ ᄧ ᄨ ᄩ ᄪ ᄫ ᄬ ᄭ ᄮ ᄯ ᄰ ᄱ ᄲ ᄳ ᄴ ᄵ ᄶ ᄷ ᄸ ᄹ ᄺ ᄻ ᄼ ᄽ ᄾ ᄿ ᅀ ᅁ ᅂ ᅃ ᅄ ᅅ ᅆ ᅇ ᅈ ᅉ ᅊ ᅋ ᅌ ᅍ ᅎ ᅏ ᅐ ᅑ ᅒ ᅓ ᅔ ᅕ ᅖ ᅗ ᅘ ᅙ ᅟ ᅠ ᅡ ᅢ ᅣ ᅤ ᅥ ᅦ ᅧ ᅨ ᅩ ᅪ ᅫ ᅬ ᅭ ᅮ ᅯ ᅰ ᅱ ᅲ ᅳ ᅴ ᅵ ᅶ ᅷ ᅸ ᅹ ᅺ ᅻ ᅼ ᅽ ᅾ ᅿ ᆀ ᆁ ᆂ ᆃ ᆄ ..."
+  putStrLn "ᄀ ᄁ ᄂ ᄃ ᄄ ᄅ ᄆ ᄇ ᄈ ᄉ ᄊ ᄋ ᄌ ᄍ ᄎ ᄏ ᄐ ᄑ ᄒ ᄓ ᄔ ᄕ ᄖ ᄗ ᄘ ᄙ ᄚ ᄛ ᄜ ᄝ ᄞ ᄟ ᄠ ᄡ ᄢ ᄣ ᄤ ᄥ ᄦ ᄧ ᄨ ᄩ ᄪ ᄫ ᄬ ᄭ ᄮ ᄯ ᄰ ᄱ ᄲ ᄳ ᄴ ᄵ ᄶ ᄷ ᄸ ᄹ ᄺ ᄻ ᄼ ᄽ ᄾ ᄿ ᅀ ᅁ ᅂ ᅃ ᅄ ᅅ ᅆ ᅇ ᅈ ᅉ ᅊ ᅋ ᅌ ᅍ ᅎ ᅏ ᅐ ᅑ ᅒ ᅓ ᅔ ᅕ ᅖ ᅗ ᅘ ᅙ ᅟ ᅠ ᅡ ᅢ ᅣ ᅤ ᅥ ᅦ ᅧ ᅨ ᅩ ᅪ ᅫ ᅬ ᅭ ᅮ ᅯ ᅰ ᅱ ᅲ ᅳ ᅴ ᅵ ᅶ ᅷ ᅸ ᅹ ᅺ ᅻ ᅼ ᅽ ᅾ ᅿ ᆀ ᆁ ᆂ ᆃ ᆄ ..."
   -- Latin Extended Additional
-  printS "Ḁ ḁ Ḃ ḃ Ḅ ḅ Ḇ ḇ Ḉ ḉ Ḋ ḋ Ḍ ḍ Ḏ ḏ Ḑ ḑ Ḓ ḓ Ḕ ḕ Ḗ ḗ Ḙ ḙ Ḛ ḛ Ḝ ḝ Ḟ ḟ Ḡ ḡ Ḣ ḣ Ḥ ḥ Ḧ ḧ Ḩ ḩ Ḫ ḫ Ḭ ḭ Ḯ ḯ Ḱ ḱ Ḳ ḳ Ḵ ḵ Ḷ ḷ Ḹ ḹ Ḻ ḻ Ḽ ḽ Ḿ ḿ Ṁ ṁ Ṃ ṃ Ṅ ṅ Ṇ ṇ Ṉ ṉ Ṋ ṋ Ṍ ṍ Ṏ ṏ Ṑ ṑ Ṓ ṓ Ṕ ṕ Ṗ ṗ Ṙ ṙ Ṛ ṛ Ṝ ṝ Ṟ ṟ Ṡ ṡ Ṣ ṣ Ṥ ṥ Ṧ ṧ Ṩ ṩ Ṫ ṫ Ṭ ṭ Ṯ ṯ Ṱ ṱ Ṳ ṳ Ṵ ṵ Ṷ ṷ Ṹ ṹ Ṻ ṻ Ṽ ṽ Ṿ ṿ ..."
+  putStrLn "Ḁ ḁ Ḃ ḃ Ḅ ḅ Ḇ ḇ Ḉ ḉ Ḋ ḋ Ḍ ḍ Ḏ ḏ Ḑ ḑ Ḓ ḓ Ḕ ḕ Ḗ ḗ Ḙ ḙ Ḛ ḛ Ḝ ḝ Ḟ ḟ Ḡ ḡ Ḣ ḣ Ḥ ḥ Ḧ ḧ Ḩ ḩ Ḫ ḫ Ḭ ḭ Ḯ ḯ Ḱ ḱ Ḳ ḳ Ḵ ḵ Ḷ ḷ Ḹ ḹ Ḻ ḻ Ḽ ḽ Ḿ ḿ Ṁ ṁ Ṃ ṃ Ṅ ṅ Ṇ ṇ Ṉ ṉ Ṋ ṋ Ṍ ṍ Ṏ ṏ Ṑ ṑ Ṓ ṓ Ṕ ṕ Ṗ ṗ Ṙ ṙ Ṛ ṛ Ṝ ṝ Ṟ ṟ Ṡ ṡ Ṣ ṣ Ṥ ṥ Ṧ ṧ Ṩ ṩ Ṫ ṫ Ṭ ṭ Ṯ ṯ Ṱ ṱ Ṳ ṳ Ṵ ṵ Ṷ ṷ Ṹ ṹ Ṻ ṻ Ṽ ṽ Ṿ ṿ ..."
   -- Greek Extended
-  printS "ἀ ἁ ἂ ἃ ἄ ἅ ἆ ἇ Ἀ Ἁ Ἂ Ἃ Ἄ Ἅ Ἆ Ἇ ἐ ἑ ἒ ἓ ἔ ἕ Ἐ Ἑ Ἒ Ἓ Ἔ Ἕ ἠ ἡ ἢ ἣ ἤ ἥ ἦ ἧ Ἠ Ἡ Ἢ Ἣ Ἤ Ἥ Ἦ Ἧ ἰ ἱ ἲ ἳ ἴ ἵ ἶ ἷ Ἰ Ἱ Ἲ Ἳ Ἴ Ἵ Ἶ Ἷ ὀ ὁ ὂ ὃ ὄ ὅ Ὀ Ὁ Ὂ Ὃ Ὄ Ὅ ὐ ὑ ὒ ὓ ὔ ὕ ὖ ὗ Ὑ Ὓ Ὕ Ὗ ὠ ὡ ὢ ὣ ὤ ὥ ὦ ὧ Ὠ Ὡ Ὢ Ὣ Ὤ Ὥ Ὦ Ὧ ὰ ά ὲ έ ὴ ή ὶ ί ὸ ό ὺ ύ ὼ ώ ᾀ ᾁ ᾂ ᾃ ᾄ ᾅ ᾆ ᾇ ᾈ ᾉ ᾊ ᾋ ᾌ ᾍ ..."
+  putStrLn "ἀ ἁ ἂ ἃ ἄ ἅ ἆ ἇ Ἀ Ἁ Ἂ Ἃ Ἄ Ἅ Ἆ Ἇ ἐ ἑ ἒ ἓ ἔ ἕ Ἐ Ἑ Ἒ Ἓ Ἔ Ἕ ἠ ἡ ἢ ἣ ἤ ἥ ἦ ἧ Ἠ Ἡ Ἢ Ἣ Ἤ Ἥ Ἦ Ἧ ἰ ἱ ἲ ἳ ἴ ἵ ἶ ἷ Ἰ Ἱ Ἲ Ἳ Ἴ Ἵ Ἶ Ἷ ὀ ὁ ὂ ὃ ὄ ὅ Ὀ Ὁ Ὂ Ὃ Ὄ Ὅ ὐ ὑ ὒ ὓ ὔ ὕ ὖ ὗ Ὑ Ὓ Ὕ Ὗ ὠ ὡ ὢ ὣ ὤ ὥ ὦ ὧ Ὠ Ὡ Ὢ Ὣ Ὤ Ὥ Ὦ Ὧ ὰ ά ὲ έ ὴ ή ὶ ί ὸ ό ὺ ύ ὼ ώ ᾀ ᾁ ᾂ ᾃ ᾄ ᾅ ᾆ ᾇ ᾈ ᾉ ᾊ ᾋ ᾌ ᾍ ..."
   -- General Punctuation
-  printS "‐ ‑ ‒ – — ― ‖ ‗ ‘ ’ ‚ ‛ “ ” „ ‟"
+  putStrLn "‐ ‑ ‒ – — ― ‖ ‗ ‘ ’ ‚ ‛ “ ” „ ‟"
   -- Superscripts and Subscripts
-  printS "⁰ ⁴ ⁵ ⁶ ⁷ ⁸ ⁹ ⁺ ⁻ ⁼ ⁽ ⁾ ⁿ ₀ ₁ ₂ ₃ ₄ ₅ ₆ ₇ ₈ ₉ ₊ ₋ ₌ ₍ ₎"
+  putStrLn "⁰ ⁴ ⁵ ⁶ ⁷ ⁸ ⁹ ⁺ ⁻ ⁼ ⁽ ⁾ ⁿ ₀ ₁ ₂ ₃ ₄ ₅ ₆ ₇ ₈ ₉ ₊ ₋ ₌ ₍ ₎"
   -- Currency Symbols
-  printS "₠ ₡ ₢ ₣ ₤ ₥ ₦ ₧ ₨ ₩ ₪ ₫"
+  putStrLn "₠ ₡ ₢ ₣ ₤ ₥ ₦ ₧ ₨ ₩ ₪ ₫"
   -- Combining Marks for Symbols
-  printS "⃐ ⃑ ⃒ ⃓ ⃔ ⃕ ⃖ ⃗ ⃘ ⃙ ⃚ ⃛ ⃜ ⃝ ⃞ ⃟ ⃠ ⃡"
+  putStrLn "⃐ ⃑ ⃒ ⃓ ⃔ ⃕ ⃖ ⃗ ⃘ ⃙ ⃚ ⃛ ⃜ ⃝ ⃞ ⃟ ⃠ ⃡"
   -- Letterlike Symbols
-  printS "℀ ℁ ℂ ℃ ℄ ℅ ℆ ℇ ℈ ℉ ℊ ℋ ℌ ℍ ℎ ℏ ℐ ℑ ℒ ℓ ℔ ℕ № ℗ ℘ ℙ ℚ ℛ ℜ ℝ ℞ ℟ ℠ ℡ ™ ℣ ℤ ℥ Ω ℧ ℨ ℩ K Å ℬ ℭ ℮ ℯ ℰ ℱ Ⅎ ℳ ℴ ℵ ℶ ℷ ℸ"
+  putStrLn "℀ ℁ ℂ ℃ ℄ ℅ ℆ ℇ ℈ ℉ ℊ ℋ ℌ ℍ ℎ ℏ ℐ ℑ ℒ ℓ ℔ ℕ № ℗ ℘ ℙ ℚ ℛ ℜ ℝ ℞ ℟ ℠ ℡ ™ ℣ ℤ ℥ Ω ℧ ℨ ℩ K Å ℬ ℭ ℮ ℯ ℰ ℱ Ⅎ ℳ ℴ ℵ ℶ ℷ ℸ"
   -- Number Forms
-  printS "⅓ ⅔ ⅕ ⅖ ⅗ ⅘ ⅙ ⅚ ⅛ ⅜ ⅝ ⅞ ⅟ Ⅰ Ⅱ Ⅲ Ⅳ Ⅴ Ⅵ Ⅶ Ⅷ Ⅸ Ⅹ Ⅺ Ⅻ Ⅼ Ⅽ Ⅾ Ⅿ ⅰ ⅱ ⅲ ⅳ ⅴ ⅵ ⅶ ⅷ ⅸ ⅹ ⅺ ⅻ ⅼ ⅽ ⅾ ⅿ ↀ ↁ ↂ"
+  putStrLn "⅓ ⅔ ⅕ ⅖ ⅗ ⅘ ⅙ ⅚ ⅛ ⅜ ⅝ ⅞ ⅟ Ⅰ Ⅱ Ⅲ Ⅳ Ⅴ Ⅵ Ⅶ Ⅷ Ⅸ Ⅹ Ⅺ Ⅻ Ⅼ Ⅽ Ⅾ Ⅿ ⅰ ⅱ ⅲ ⅳ ⅴ ⅵ ⅶ ⅷ ⅸ ⅹ ⅺ ⅻ ⅼ ⅽ ⅾ ⅿ ↀ ↁ ↂ"
   -- Arrows
-  printS "← ↑ → ↓ ↔ ↕ ↖ ↗ ↘ ↙ ↚ ↛ ↜ ↝ ↞ ↟ ↠ ↡ ↢ ↣ ↤ ↥ ↦ ↧ ↨ ↩ ↪ ↫ ↬ ↭ ↮ ↯ ↰ ↱ ↲ ↳ ↴ ↵ ↶ ↷ ↸ ↹ ↺ ↻ ↼ ↽ ↾ ↿ ⇀ ⇁ ⇂ ⇃ ⇄ ⇅ ⇆ ⇇ ⇈ ⇉ ⇊ ⇋ ⇌ ⇍ ⇎ ⇏ ⇐ ⇑ ⇒ ⇓ ⇔ ⇕ ⇖ ⇗ ⇘ ⇙ ⇚ ⇛ ⇜ ⇝ ⇞ ⇟ ⇠ ⇡ ⇢ ⇣ ⇤ ⇥ ⇦ ⇧ ⇨ ⇩ ⇪"
+  putStrLn "← ↑ → ↓ ↔ ↕ ↖ ↗ ↘ ↙ ↚ ↛ ↜ ↝ ↞ ↟ ↠ ↡ ↢ ↣ ↤ ↥ ↦ ↧ ↨ ↩ ↪ ↫ ↬ ↭ ↮ ↯ ↰ ↱ ↲ ↳ ↴ ↵ ↶ ↷ ↸ ↹ ↺ ↻ ↼ ↽ ↾ ↿ ⇀ ⇁ ⇂ ⇃ ⇄ ⇅ ⇆ ⇇ ⇈ ⇉ ⇊ ⇋ ⇌ ⇍ ⇎ ⇏ ⇐ ⇑ ⇒ ⇓ ⇔ ⇕ ⇖ ⇗ ⇘ ⇙ ⇚ ⇛ ⇜ ⇝ ⇞ ⇟ ⇠ ⇡ ⇢ ⇣ ⇤ ⇥ ⇦ ⇧ ⇨ ⇩ ⇪"
   -- Mathematical Operators
-  printS "∀ ∁ ∂ ∃ ∄ ∅ ∆ ∇ ∈ ∉ ∊ ∋ ∌ ∍ ∎ ∏ ∐ ∑ − ∓ ∔ ∕ ∖ ∗ ∘ ∙ √ ∛ ∜ ∝ ∞ ∟ ∠ ∡ ∢ ∣ ∤ ∥ ∦ ∧ ∨ ∩ ∪ ∫ ∬ ∭ ∮ ∯ ∰ ∱ ∲ ∳ ∴ ∵ ∶ ∷ ∸ ∹ ∺ ∻ ∼ ∽ ∾ ∿ ≀ ≁ ≂ ≃ ≄ ≅ ≆ ≇ ≈ ≉ ≊ ≋ ≌ ≍ ≎ ≏ ≐ ≑ ≒ ≓ ≔ ≕ ≖ ≗ ≘ ≙ ≚ ≛ ≜ ≝ ≞ ≟ ≠ ≡ ≢ ≣ ≤ ≥ ≦ ≧ ≨ ≩ ≪ ≫ ≬ ≭ ≮ ≯ ≰ ≱ ≲ ≳ ≴ ≵ ≶ ≷ ≸ ≹ ≺ ≻ ≼ ≽ ≾ ≿ ..."
+  putStrLn "∀ ∁ ∂ ∃ ∄ ∅ ∆ ∇ ∈ ∉ ∊ ∋ ∌ ∍ ∎ ∏ ∐ ∑ − ∓ ∔ ∕ ∖ ∗ ∘ ∙ √ ∛ ∜ ∝ ∞ ∟ ∠ ∡ ∢ ∣ ∤ ∥ ∦ ∧ ∨ ∩ ∪ ∫ ∬ ∭ ∮ ∯ ∰ ∱ ∲ ∳ ∴ ∵ ∶ ∷ ∸ ∹ ∺ ∻ ∼ ∽ ∾ ∿ ≀ ≁ ≂ ≃ ≄ ≅ ≆ ≇ ≈ ≉ ≊ ≋ ≌ ≍ ≎ ≏ ≐ ≑ ≒ ≓ ≔ ≕ ≖ ≗ ≘ ≙ ≚ ≛ ≜ ≝ ≞ ≟ ≠ ≡ ≢ ≣ ≤ ≥ ≦ ≧ ≨ ≩ ≪ ≫ ≬ ≭ ≮ ≯ ≰ ≱ ≲ ≳ ≴ ≵ ≶ ≷ ≸ ≹ ≺ ≻ ≼ ≽ ≾ ≿ ..."
   -- Miscellaneous Technical
-  printS "⌀ ⌂ ⌃ ⌄ ⌅ ⌆ ⌇ ⌈ ⌉ ⌊ ⌋ ⌌ ⌍ ⌎ ⌏ ⌐ ⌑ ⌒ ⌓ ⌔ ⌕ ⌖ ⌗ ⌘ ⌙ ⌚ ⌛ ⌜ ⌝ ⌞ ⌟ ⌠ ⌡ ⌢ ⌣ ⌤ ⌥ ⌦ ⌧ ⌨ 〈 〉 ⌫ ⌬ ⌭ ⌮ ⌯ ⌰ ⌱ ⌲ ⌳ ⌴ ⌵ ⌶ ⌷ ⌸ ⌹ ⌺ ⌻ ⌼ ⌽ ⌾ ⌿ ⍀ ⍁ ⍂ ⍃ ⍄ ⍅ ⍆ ⍇ ⍈ ⍉ ⍊ ⍋ ⍌ ⍍ ⍎ ⍏ ⍐ ⍑ ⍒ ⍓ ⍔ ⍕ ⍖ ⍗ ⍘ ⍙ ⍚ ⍛ ⍜ ⍝ ⍞ ⍟ ⍠ ⍡ ⍢ ⍣ ⍤ ⍥ ⍦ ⍧ ⍨ ⍩ ⍪ ⍫ ⍬ ⍭ ⍮ ⍯ ⍰ ⍱ ⍲ ⍳ ⍴ ⍵ ⍶ ⍷ ⍸ ⍹ ⍺"
+  putStrLn "⌀ ⌂ ⌃ ⌄ ⌅ ⌆ ⌇ ⌈ ⌉ ⌊ ⌋ ⌌ ⌍ ⌎ ⌏ ⌐ ⌑ ⌒ ⌓ ⌔ ⌕ ⌖ ⌗ ⌘ ⌙ ⌚ ⌛ ⌜ ⌝ ⌞ ⌟ ⌠ ⌡ ⌢ ⌣ ⌤ ⌥ ⌦ ⌧ ⌨ 〈 〉 ⌫ ⌬ ⌭ ⌮ ⌯ ⌰ ⌱ ⌲ ⌳ ⌴ ⌵ ⌶ ⌷ ⌸ ⌹ ⌺ ⌻ ⌼ ⌽ ⌾ ⌿ ⍀ ⍁ ⍂ ⍃ ⍄ ⍅ ⍆ ⍇ ⍈ ⍉ ⍊ ⍋ ⍌ ⍍ ⍎ ⍏ ⍐ ⍑ ⍒ ⍓ ⍔ ⍕ ⍖ ⍗ ⍘ ⍙ ⍚ ⍛ ⍜ ⍝ ⍞ ⍟ ⍠ ⍡ ⍢ ⍣ ⍤ ⍥ ⍦ ⍧ ⍨ ⍩ ⍪ ⍫ ⍬ ⍭ ⍮ ⍯ ⍰ ⍱ ⍲ ⍳ ⍴ ⍵ ⍶ ⍷ ⍸ ⍹ ⍺"
   -- Control Pictures
-  printS "␀ ␁ ␂ ␃ ␄ ␅ ␆ ␇ ␈ ␉ ␊ ␋ ␌ ␍ ␎ ␏ ␐ ␑ ␒ ␓ ␔ ␕ ␖ ␗ ␘ ␙ ␚ ␛ ␜ ␝ ␞ ␟ ␠ ␡ ␢ ␣ ␤"
+  putStrLn "␀ ␁ ␂ ␃ ␄ ␅ ␆ ␇ ␈ ␉ ␊ ␋ ␌ ␍ ␎ ␏ ␐ ␑ ␒ ␓ ␔ ␕ ␖ ␗ ␘ ␙ ␚ ␛ ␜ ␝ ␞ ␟ ␠ ␡ ␢ ␣ ␤"
   -- Optical Character Recognition
-  printS "⑀ ⑁ ⑂ ⑃ ⑄ ⑅ ⑆ ⑇ ⑈ ⑉ ⑊"
+  putStrLn "⑀ ⑁ ⑂ ⑃ ⑄ ⑅ ⑆ ⑇ ⑈ ⑉ ⑊"
   -- -- Enclosed Alphanumerics
-  printS "① ② ③ ④ ⑤ ⑥ ⑦ ⑧ ⑨ ⑩ ⑪ ⑫ ⑬ ⑭ ⑮ ⑯ ⑰ ⑱ ⑲ ⑳ ⑴ ⑵ ⑶ ⑷ ⑸ ⑹ ⑺ ⑻ ⑼ ⑽ ⑾ ⑿ ⒀ ⒁ ⒂ ⒃ ⒄ ⒅ ⒆ ⒇ ⒈ ⒉ ⒊ ⒋ ⒌ ⒍ ⒎ ⒏ ⒐ ⒑ ⒒ ⒓ ⒔ ⒕ ⒖ ⒗ ⒘ ⒙ ⒚ ⒛ ⒜ ⒝ ⒞ ⒟ ⒠ ⒡ ⒢ ⒣ ⒤ ⒥ ⒦ ⒧ ⒨ ⒩ ⒪ ⒫ ⒬ ⒭ ⒮ ⒯ ⒰ ⒱ ⒲ ⒳ ⒴ ⒵ Ⓐ Ⓑ Ⓒ Ⓓ Ⓔ Ⓕ Ⓖ Ⓗ Ⓘ Ⓙ Ⓚ Ⓛ Ⓜ Ⓝ Ⓞ Ⓟ Ⓠ Ⓡ Ⓢ Ⓣ Ⓤ Ⓥ Ⓦ Ⓧ Ⓨ Ⓩ ⓐ ⓑ ⓒ ⓓ ⓔ ⓕ ⓖ ⓗ ⓘ ⓙ ⓚ ⓛ ⓜ ⓝ ⓞ ⓟ ..."
+  putStrLn "① ② ③ ④ ⑤ ⑥ ⑦ ⑧ ⑨ ⑩ ⑪ ⑫ ⑬ ⑭ ⑮ ⑯ ⑰ ⑱ ⑲ ⑳ ⑴ ⑵ ⑶ ⑷ ⑸ ⑹ ⑺ ⑻ ⑼ ⑽ ⑾ ⑿ ⒀ ⒁ ⒂ ⒃ ⒄ ⒅ ⒆ ⒇ ⒈ ⒉ ⒊ ⒋ ⒌ ⒍ ⒎ ⒏ ⒐ ⒑ ⒒ ⒓ ⒔ ⒕ ⒖ ⒗ ⒘ ⒙ ⒚ ⒛ ⒜ ⒝ ⒞ ⒟ ⒠ ⒡ ⒢ ⒣ ⒤ ⒥ ⒦ ⒧ ⒨ ⒩ ⒪ ⒫ ⒬ ⒭ ⒮ ⒯ ⒰ ⒱ ⒲ ⒳ ⒴ ⒵ Ⓐ Ⓑ Ⓒ Ⓓ Ⓔ Ⓕ Ⓖ Ⓗ Ⓘ Ⓙ Ⓚ Ⓛ Ⓜ Ⓝ Ⓞ Ⓟ Ⓠ Ⓡ Ⓢ Ⓣ Ⓤ Ⓥ Ⓦ Ⓧ Ⓨ Ⓩ ⓐ ⓑ ⓒ ⓓ ⓔ ⓕ ⓖ ⓗ ⓘ ⓙ ⓚ ⓛ ⓜ ⓝ ⓞ ⓟ ..."
   -- Box Drawing
-  printS "─ ━ │ ┃ ┄ ┅ ┆ ┇ ┈ ┉ ┊ ┋ ┌ ┍ ┎ ┏ ┐ ┑ ┒ ┓ └ ┕ ┖ ┗ ┘ ┙ ┚ ┛ ├ ┝ ┞ ┟ ┠ ┡ ┢ ┣ ┤ ┥ ┦ ┧ ┨ ┩ ┪ ┫ ┬ ┭ ┮ ┯ ┰ ┱ ┲ ┳ ┴ ┵ ┶ ┷ ┸ ┹ ┺ ┻ ┼ ┽ ┾ ┿ ╀ ╁ ╂ ╃ ╄ ╅ ╆ ╇ ╈ ╉ ╊ ╋ ╌ ╍ ╎ ╏ ═ ║ ╒ ╓ ╔ ╕ ╖ ╗ ╘ ╙ ╚ ╛ ╜ ╝ ╞ ╟ ╠ ╡ ╢ ╣ ╤ ╥ ╦ ╧ ╨ ╩ ╪ ╫ ╬ ╭ ╮ ╯ ╰ ╱ ╲ ╳ ╴ ╵ ╶ ╷ ╸ ╹ ╺ ╻ ╼ ╽ ╾ ╿"
+  putStrLn "─ ━ │ ┃ ┄ ┅ ┆ ┇ ┈ ┉ ┊ ┋ ┌ ┍ ┎ ┏ ┐ ┑ ┒ ┓ └ ┕ ┖ ┗ ┘ ┙ ┚ ┛ ├ ┝ ┞ ┟ ┠ ┡ ┢ ┣ ┤ ┥ ┦ ┧ ┨ ┩ ┪ ┫ ┬ ┭ ┮ ┯ ┰ ┱ ┲ ┳ ┴ ┵ ┶ ┷ ┸ ┹ ┺ ┻ ┼ ┽ ┾ ┿ ╀ ╁ ╂ ╃ ╄ ╅ ╆ ╇ ╈ ╉ ╊ ╋ ╌ ╍ ╎ ╏ ═ ║ ╒ ╓ ╔ ╕ ╖ ╗ ╘ ╙ ╚ ╛ ╜ ╝ ╞ ╟ ╠ ╡ ╢ ╣ ╤ ╥ ╦ ╧ ╨ ╩ ╪ ╫ ╬ ╭ ╮ ╯ ╰ ╱ ╲ ╳ ╴ ╵ ╶ ╷ ╸ ╹ ╺ ╻ ╼ ╽ ╾ ╿"
   -- Block Elements
-  printS "▀ ▁ ▂ ▃ ▄ ▅ ▆ ▇ █ ▉ ▊ ▋ ▌ ▍ ▎ ▏ ▐ ░ ▒ ▓ ▔ ▕"
+  putStrLn "▀ ▁ ▂ ▃ ▄ ▅ ▆ ▇ █ ▉ ▊ ▋ ▌ ▍ ▎ ▏ ▐ ░ ▒ ▓ ▔ ▕"
   -- Geometric Shapes
-  printS "■ □ ▢ ▣ ▤ ▥ ▦ ▧ ▨ ▩ ▪ ▫ ▬ ▭ ▮ ▯ ▰ ▱ ▲ △ ▴ ▵ ▶ ▷ ▸ ▹ ► ▻ ▼ ▽ ▾ ▿ ◀ ◁ ◂ ◃ ◄ ◅ ◆ ◇ ◈ ◉ ◊ ○ ◌ ◍ ◎ ● ◐ ◑ ◒ ◓ ◔ ◕ ◖ ◗ ◘ ◙ ◚ ◛ ◜ ◝ ◞ ◟ ◠ ◡ ◢ ◣ ◤ ◥ ◦ ◧ ◨ ◩ ◪ ◫ ◬ ◭ ◮ ◯"
+  putStrLn "■ □ ▢ ▣ ▤ ▥ ▦ ▧ ▨ ▩ ▪ ▫ ▬ ▭ ▮ ▯ ▰ ▱ ▲ △ ▴ ▵ ▶ ▷ ▸ ▹ ► ▻ ▼ ▽ ▾ ▿ ◀ ◁ ◂ ◃ ◄ ◅ ◆ ◇ ◈ ◉ ◊ ○ ◌ ◍ ◎ ● ◐ ◑ ◒ ◓ ◔ ◕ ◖ ◗ ◘ ◙ ◚ ◛ ◜ ◝ ◞ ◟ ◠ ◡ ◢ ◣ ◤ ◥ ◦ ◧ ◨ ◩ ◪ ◫ ◬ ◭ ◮ ◯"
   -- Miscellaneous Symbols
-  printS "☀ ☁ ☂ ☃ ☄ ★ ☆ ☇ ☈ ☉ ☊ ☋ ☌ ☍ ☎ ☏ ☐ ☑ ☒ ☓ ☚ ☛ ☜ ☝ ☞ ☟ ☠ ☡ ☢ ☣ ☤ ☥ ☦ ☧ ☨ ☩ ☪ ☫ ☬ ☭ ☮ ☯ ☰ ☱ ☲ ☳ ☴ ☵ ☶ ☷ ☸ ☹ ☺ ☻ ☼ ☽ ☾ ☿ ♀ ♁ ♂ ♃ ♄ ♅ ♆ ♇ ♈ ♉ ♊ ♋ ♌ ♍ ♎ ♏ ♐ ♑ ♒ ♓ ♔ ♕ ♖ ♗ ♘ ♙ ♚ ♛ ♜ ♝ ♞ ♟ ♠ ♡ ♢ ♣ ♤ ♥ ♦ ♧ ♨ ♩ ♪ ♫ ♬ ♭ ♮ ♯"
+  putStrLn "☀ ☁ ☂ ☃ ☄ ★ ☆ ☇ ☈ ☉ ☊ ☋ ☌ ☍ ☎ ☏ ☐ ☑ ☒ ☓ ☚ ☛ ☜ ☝ ☞ ☟ ☠ ☡ ☢ ☣ ☤ ☥ ☦ ☧ ☨ ☩ ☪ ☫ ☬ ☭ ☮ ☯ ☰ ☱ ☲ ☳ ☴ ☵ ☶ ☷ ☸ ☹ ☺ ☻ ☼ ☽ ☾ ☿ ♀ ♁ ♂ ♃ ♄ ♅ ♆ ♇ ♈ ♉ ♊ ♋ ♌ ♍ ♎ ♏ ♐ ♑ ♒ ♓ ♔ ♕ ♖ ♗ ♘ ♙ ♚ ♛ ♜ ♝ ♞ ♟ ♠ ♡ ♢ ♣ ♤ ♥ ♦ ♧ ♨ ♩ ♪ ♫ ♬ ♭ ♮ ♯"
   -- Dingbats
-  printS "✁ ✂ ✃ ✄ ✆ ✇ ✈ ✉ ✌ ✍ ✎ ✏ ✐ ✑ ✒ ✓ ✔ ✕ ✖ ✗ ✘ ✙ ✚ ✛ ✜ ✝ ✞ ✟ ✠ ✡ ✢ ✣ ✤ ✥ ✦ ✧ ✩ ✪ ✫ ✬ ✭ ✮ ✯ ✰ ✱ ✲ ✳ ✴ ✵ ✶ ✷ ✸ ✹ ✺ ✻ ✼ ✽ ✾ ✿ ❀ ❁ ❂ ❃ ❄ ❅ ❆ ❇ ❈ ❉ ❊ ❋ ❍ ❏ ❐ ❑ ❒ ❖ ❘ ❙ ❚ ❛ ❜ ❝ ❞ ❡ ❢ ❣ ❤ ❥ ❦ ❧ ❶ ❷ ❸ ❹ ❺ ❻ ❼ ❽ ❾ ❿ ➀ ➁ ➂ ➃ ➄ ➅ ➆ ➇ ➈ ➉ ➊ ➋ ➌ ➍ ➎ ➏ ➐ ➑ ➒ ➓ ➔ ➘ ➙ ➚ ➛ ➜ ➝ ..."
+  putStrLn "✁ ✂ ✃ ✄ ✆ ✇ ✈ ✉ ✌ ✍ ✎ ✏ ✐ ✑ ✒ ✓ ✔ ✕ ✖ ✗ ✘ ✙ ✚ ✛ ✜ ✝ ✞ ✟ ✠ ✡ ✢ ✣ ✤ ✥ ✦ ✧ ✩ ✪ ✫ ✬ ✭ ✮ ✯ ✰ ✱ ✲ ✳ ✴ ✵ ✶ ✷ ✸ ✹ ✺ ✻ ✼ ✽ ✾ ✿ ❀ ❁ ❂ ❃ ❄ ❅ ❆ ❇ ❈ ❉ ❊ ❋ ❍ ❏ ❐ ❑ ❒ ❖ ❘ ❙ ❚ ❛ ❜ ❝ ❞ ❡ ❢ ❣ ❤ ❥ ❦ ❧ ❶ ❷ ❸ ❹ ❺ ❻ ❼ ❽ ❾ ❿ ➀ ➁ ➂ ➃ ➄ ➅ ➆ ➇ ➈ ➉ ➊ ➋ ➌ ➍ ➎ ➏ ➐ ➑ ➒ ➓ ➔ ➘ ➙ ➚ ➛ ➜ ➝ ..."
   -- CJK Symbols and Punctuation
-  printS "　 、 。 〃 〄 々 〆 〇 〈 〉 《 》 「 」 『 』 【 】 〒 〓 〔 〕 〖 〗 〘 〙 〚 〛 〜 〝 〞 〟 〠 〡 〢 〣 〤 〥 〦 〧 〨 〩 〪 〫 〬 〭 〮 〯 〰 〱 〲 〳 〴 〵 〶 〷 〿"
+  putStrLn "　 、 。 〃 〄 々 〆 〇 〈 〉 《 》 「 」 『 』 【 】 〒 〓 〔 〕 〖 〗 〘 〙 〚 〛 〜 〝 〞 〟 〠 〡 〢 〣 〤 〥 〦 〧 〨 〩 〪 〫 〬 〭 〮 〯 〰 〱 〲 〳 〴 〵 〶 〷 〿"
   -- Hiragana
-  printS "ぁ あ ぃ い ぅ う ぇ え ぉ お か が き ぎ く ぐ け げ こ ご さ ざ し じ す ず せ ぜ そ ぞ た だ ち ぢ っ つ づ て で と ど な に ぬ ね の は ば ぱ ひ び ぴ ふ ぶ ぷ へ べ ぺ ほ ぼ ぽ ま み む め も ゃ や ゅ ゆ ょ よ ら り る れ ろ ゎ わ ゐ ゑ を ん ゔ ゙ ゚ ゛ ゜ ゝ ゞ"
+  putStrLn "ぁ あ ぃ い ぅ う ぇ え ぉ お か が き ぎ く ぐ け げ こ ご さ ざ し じ す ず せ ぜ そ ぞ た だ ち ぢ っ つ づ て で と ど な に ぬ ね の は ば ぱ ひ び ぴ ふ ぶ ぷ へ べ ぺ ほ ぼ ぽ ま み む め も ゃ や ゅ ゆ ょ よ ら り る れ ろ ゎ わ ゐ ゑ を ん ゔ ゙ ゚ ゛ ゜ ゝ ゞ"
   -- Katakana
-  printS "ァ ア ィ イ ゥ ウ ェ エ ォ オ カ ガ キ ギ ク グ ケ ゲ コ ゴ サ ザ シ ジ ス ズ セ ゼ ソ ゾ タ ダ チ ヂ ッ ツ ヅ テ デ ト ド ナ ニ ヌ ネ ノ ハ バ パ ヒ ビ ピ フ ブ プ ヘ ベ ペ ホ ボ ポ マ ミ ム メ モ ャ ヤ ュ ユ ョ ヨ ラ リ ル レ ロ ヮ ワ ヰ ヱ ヲ ン ヴ ヵ ヶ ヷ ヸ ヹ ヺ ・ ー ヽ ヾ"
+  putStrLn "ァ ア ィ イ ゥ ウ ェ エ ォ オ カ ガ キ ギ ク グ ケ ゲ コ ゴ サ ザ シ ジ ス ズ セ ゼ ソ ゾ タ ダ チ ヂ ッ ツ ヅ テ デ ト ド ナ ニ ヌ ネ ノ ハ バ パ ヒ ビ ピ フ ブ プ ヘ ベ ペ ホ ボ ポ マ ミ ム メ モ ャ ヤ ュ ユ ョ ヨ ラ リ ル レ ロ ヮ ワ ヰ ヱ ヲ ン ヴ ヵ ヶ ヷ ヸ ヹ ヺ ・ ー ヽ ヾ"
   -- Bopomofo
-  printS "ㄅ ㄆ ㄇ ㄈ ㄉ ㄊ ㄋ ㄌ ㄍ ㄎ ㄏ ㄐ ㄑ ㄒ ㄓ ㄔ ㄕ ㄖ ㄗ ㄘ ㄙ ㄚ ㄛ ㄜ ㄝ ㄞ ㄟ ㄠ ㄡ ㄢ ㄣ ㄤ ㄥ ㄦ ㄧ ㄨ ㄩ ㄪ ㄫ ㄬ"
+  putStrLn "ㄅ ㄆ ㄇ ㄈ ㄉ ㄊ ㄋ ㄌ ㄍ ㄎ ㄏ ㄐ ㄑ ㄒ ㄓ ㄔ ㄕ ㄖ ㄗ ㄘ ㄙ ㄚ ㄛ ㄜ ㄝ ㄞ ㄟ ㄠ ㄡ ㄢ ㄣ ㄤ ㄥ ㄦ ㄧ ㄨ ㄩ ㄪ ㄫ ㄬ"
   -- Hangul Compatibility Jamo
-  printS "ㄱ ㄲ ㄳ ㄴ ㄵ ㄶ ㄷ ㄸ ㄹ ㄺ ㄻ ㄼ ㄽ ㄾ ㄿ ㅀ ㅁ ㅂ ㅃ ㅄ ㅅ ㅆ ㅇ ㅈ ㅉ ㅊ ㅋ ㅌ ㅍ ㅎ ㅏ ㅐ ㅑ ㅒ ㅓ ㅔ ㅕ ㅖ ㅗ ㅘ ㅙ ㅚ ㅛ ㅜ ㅝ ㅞ ㅟ ㅠ ㅡ ㅢ ㅣ ㅤ ㅥ ㅦ ㅧ ㅨ ㅩ ㅪ ㅫ ㅬ ㅭ ㅮ ㅯ ㅰ ㅱ ㅲ ㅳ ㅴ ㅵ ㅶ ㅷ ㅸ ㅹ ㅺ ㅻ ㅼ ㅽ ㅾ ㅿ ㆀ ㆁ ㆂ ㆃ ㆄ ㆅ ㆆ ㆇ ㆈ ㆉ ㆊ ㆋ ㆌ ㆍ ㆎ"
+  putStrLn "ㄱ ㄲ ㄳ ㄴ ㄵ ㄶ ㄷ ㄸ ㄹ ㄺ ㄻ ㄼ ㄽ ㄾ ㄿ ㅀ ㅁ ㅂ ㅃ ㅄ ㅅ ㅆ ㅇ ㅈ ㅉ ㅊ ㅋ ㅌ ㅍ ㅎ ㅏ ㅐ ㅑ ㅒ ㅓ ㅔ ㅕ ㅖ ㅗ ㅘ ㅙ ㅚ ㅛ ㅜ ㅝ ㅞ ㅟ ㅠ ㅡ ㅢ ㅣ ㅤ ㅥ ㅦ ㅧ ㅨ ㅩ ㅪ ㅫ ㅬ ㅭ ㅮ ㅯ ㅰ ㅱ ㅲ ㅳ ㅴ ㅵ ㅶ ㅷ ㅸ ㅹ ㅺ ㅻ ㅼ ㅽ ㅾ ㅿ ㆀ ㆁ ㆂ ㆃ ㆄ ㆅ ㆆ ㆇ ㆈ ㆉ ㆊ ㆋ ㆌ ㆍ ㆎ"
   -- Kanbun
-  printS "㆐ ㆑ ㆒ ㆓ ㆔ ㆕ ㆖ ㆗ ㆘ ㆙ ㆚ ㆛ ㆜ ㆝ ㆞ ㆟"
+  putStrLn "㆐ ㆑ ㆒ ㆓ ㆔ ㆕ ㆖ ㆗ ㆘ ㆙ ㆚ ㆛ ㆜ ㆝ ㆞ ㆟"
   -- Enclosed CJK Letters and Months
-  printS "㈀ ㈁ ㈂ ㈃ ㈄ ㈅ ㈆ ㈇ ㈈ ㈉ ㈊ ㈋ ㈌ ㈍ ㈎ ㈏ ㈐ ㈑ ㈒ ㈓ ㈔ ㈕ ㈖ ㈗ ㈘ ㈙ ㈚ ㈛ ㈜ ㈠ ㈡ ㈢ ㈣ ㈤ ㈥ ㈦ ㈧ ㈨ ㈩ ㈪ ㈫ ㈬ ㈭ ㈮ ㈯ ㈰ ㈱ ㈲ ㈳ ㈴ ㈵ ㈶ ㈷ ㈸ ㈹ ㈺ ㈻ ㈼ ㈽ ㈾ ㈿ ㉀ ㉁ ㉂ ㉃ ㉠ ㉡ ㉢ ㉣ ㉤ ㉥ ㉦ ㉧ ㉨ ㉩ ㉪ ㉫ ㉬ ㉭ ㉮ ㉯ ㉰ ㉱ ㉲ ㉳ ㉴ ㉵ ㉶ ㉷ ㉸ ㉹ ㉺ ㉻ ㉿ ㊀ ㊁ ㊂ ㊃ ㊄ ㊅ ㊆ ㊇ ㊈ ㊉ ㊊ ㊋ ㊌ ㊍ ㊎ ㊏ ㊐ ㊑ ㊒ ㊓ ㊔ ㊕ ㊖ ㊗ ㊘ ㊙ ㊚ ㊛ ㊜ ㊝ ㊞ ㊟ ㊠ ㊡ ..."
+  putStrLn "㈀ ㈁ ㈂ ㈃ ㈄ ㈅ ㈆ ㈇ ㈈ ㈉ ㈊ ㈋ ㈌ ㈍ ㈎ ㈏ ㈐ ㈑ ㈒ ㈓ ㈔ ㈕ ㈖ ㈗ ㈘ ㈙ ㈚ ㈛ ㈜ ㈠ ㈡ ㈢ ㈣ ㈤ ㈥ ㈦ ㈧ ㈨ ㈩ ㈪ ㈫ ㈬ ㈭ ㈮ ㈯ ㈰ ㈱ ㈲ ㈳ ㈴ ㈵ ㈶ ㈷ ㈸ ㈹ ㈺ ㈻ ㈼ ㈽ ㈾ ㈿ ㉀ ㉁ ㉂ ㉃ ㉠ ㉡ ㉢ ㉣ ㉤ ㉥ ㉦ ㉧ ㉨ ㉩ ㉪ ㉫ ㉬ ㉭ ㉮ ㉯ ㉰ ㉱ ㉲ ㉳ ㉴ ㉵ ㉶ ㉷ ㉸ ㉹ ㉺ ㉻ ㉿ ㊀ ㊁ ㊂ ㊃ ㊄ ㊅ ㊆ ㊇ ㊈ ㊉ ㊊ ㊋ ㊌ ㊍ ㊎ ㊏ ㊐ ㊑ ㊒ ㊓ ㊔ ㊕ ㊖ ㊗ ㊘ ㊙ ㊚ ㊛ ㊜ ㊝ ㊞ ㊟ ㊠ ㊡ ..."
   -- CJK Compatibility
-  printS "㌀ ㌁ ㌂ ㌃ ㌄ ㌅ ㌆ ㌇ ㌈ ㌉ ㌊ ㌋ ㌌ ㌍ ㌎ ㌏ ㌐ ㌑ ㌒ ㌓ ㌔ ㌕ ㌖ ㌗ ㌘ ㌙ ㌚ ㌛ ㌜ ㌝ ㌞ ㌟ ㌠ ㌡ ㌢ ㌣ ㌤ ㌥ ㌦ ㌧ ㌨ ㌩ ㌪ ㌫ ㌬ ㌭ ㌮ ㌯ ㌰ ㌱ ㌲ ㌳ ㌴ ㌵ ㌶ ㌷ ㌸ ㌹ ㌺ ㌻ ㌼ ㌽ ㌾ ㌿ ㍀ ㍁ ㍂ ㍃ ㍄ ㍅ ㍆ ㍇ ㍈ ㍉ ㍊ ㍋ ㍌ ㍍ ㍎ ㍏ ㍐ ㍑ ㍒ ㍓ ㍔ ㍕ ㍖ ㍗ ㍘ ㍙ ㍚ ㍛ ㍜ ㍝ ㍞ ㍟ ㍠ ㍡ ㍢ ㍣ ㍤ ㍥ ㍦ ㍧ ㍨ ㍩ ㍪ ㍫ ㍬ ㍭ ㍮ ㍯ ㍰ ㍱ ㍲ ㍳ ㍴ ㍵ ㍶ ㍻ ㍼ ㍽ ㍾ ㍿ ㎀ ㎁ ㎂ ㎃ ..."
+  putStrLn "㌀ ㌁ ㌂ ㌃ ㌄ ㌅ ㌆ ㌇ ㌈ ㌉ ㌊ ㌋ ㌌ ㌍ ㌎ ㌏ ㌐ ㌑ ㌒ ㌓ ㌔ ㌕ ㌖ ㌗ ㌘ ㌙ ㌚ ㌛ ㌜ ㌝ ㌞ ㌟ ㌠ ㌡ ㌢ ㌣ ㌤ ㌥ ㌦ ㌧ ㌨ ㌩ ㌪ ㌫ ㌬ ㌭ ㌮ ㌯ ㌰ ㌱ ㌲ ㌳ ㌴ ㌵ ㌶ ㌷ ㌸ ㌹ ㌺ ㌻ ㌼ ㌽ ㌾ ㌿ ㍀ ㍁ ㍂ ㍃ ㍄ ㍅ ㍆ ㍇ ㍈ ㍉ ㍊ ㍋ ㍌ ㍍ ㍎ ㍏ ㍐ ㍑ ㍒ ㍓ ㍔ ㍕ ㍖ ㍗ ㍘ ㍙ ㍚ ㍛ ㍜ ㍝ ㍞ ㍟ ㍠ ㍡ ㍢ ㍣ ㍤ ㍥ ㍦ ㍧ ㍨ ㍩ ㍪ ㍫ ㍬ ㍭ ㍮ ㍯ ㍰ ㍱ ㍲ ㍳ ㍴ ㍵ ㍶ ㍻ ㍼ ㍽ ㍾ ㍿ ㎀ ㎁ ㎂ ㎃ ..."
   -- CJK Unified Ideographs
-  printS "一 丁 丂 七 丄 丅 丆 万 丈 三 上 下 丌 不 与 丏 丐 丑 丒 专 且 丕 世 丗 丘 丙 业 丛 东 丝 丞 丟 丠 両 丢 丣 两 严 並 丧 丨 丩 个 丫 丬 中 丮 丯 丰 丱 串 丳 临 丵 丶 丷 丸 丹 为 主 丼 丽 举 丿 乀 乁 乂 乃 乄 久 乆 乇 么 义 乊 之 乌 乍 乎 乏 乐 乑 乒 乓 乔 乕 乖 乗 乘 乙 乚 乛 乜 九 乞 也 习 乡 乢 乣 乤 乥 书 乧 乨 乩 乪 乫 乬 乭 乮 乯 买 乱 乲 乳 乴 乵 乶 乷 乸 乹 乺 乻 乼 乽 乾 乿 ..."
+  putStrLn "一 丁 丂 七 丄 丅 丆 万 丈 三 上 下 丌 不 与 丏 丐 丑 丒 专 且 丕 世 丗 丘 丙 业 丛 东 丝 丞 丟 丠 両 丢 丣 两 严 並 丧 丨 丩 个 丫 丬 中 丮 丯 丰 丱 串 丳 临 丵 丶 丷 丸 丹 为 主 丼 丽 举 丿 乀 乁 乂 乃 乄 久 乆 乇 么 义 乊 之 乌 乍 乎 乏 乐 乑 乒 乓 乔 乕 乖 乗 乘 乙 乚 乛 乜 九 乞 也 习 乡 乢 乣 乤 乥 书 乧 乨 乩 乪 乫 乬 乭 乮 乯 买 乱 乲 乳 乴 乵 乶 乷 乸 乹 乺 乻 乼 乽 乾 乿 ..."
   -- Hangul Syllables
-  printS "가 각 갂 갃 간 갅 갆 갇 갈 갉 갊 갋 갌 갍 갎 갏 감 갑 값 갓 갔 강 갖 갗 갘 같 갚 갛 개 객 갞 갟 갠 갡 갢 갣 갤 갥 갦 갧 갨 갩 갪 갫 갬 갭 갮 갯 갰 갱 갲 갳 갴 갵 갶 갷 갸 갹 갺 갻 갼 갽 갾 갿 걀 걁 걂 걃 걄 걅 걆 걇 걈 걉 걊 걋 걌 걍 걎 걏 걐 걑 걒 걓 걔 걕 걖 걗 걘 걙 걚 걛 걜 걝 걞 걟 걠 걡 걢 걣 걤 걥 걦 걧 걨 걩 걪 걫 걬 걭 걮 걯 거 걱 걲 걳 건 걵 걶 걷 걸 걹 걺 걻 걼 걽 걾 걿 ..."
+  putStrLn "가 각 갂 갃 간 갅 갆 갇 갈 갉 갊 갋 갌 갍 갎 갏 감 갑 값 갓 갔 강 갖 갗 갘 같 갚 갛 개 객 갞 갟 갠 갡 갢 갣 갤 갥 갦 갧 갨 갩 갪 갫 갬 갭 갮 갯 갰 갱 갲 갳 갴 갵 갶 갷 갸 갹 갺 갻 갼 갽 갾 갿 걀 걁 걂 걃 걄 걅 걆 걇 걈 걉 걊 걋 걌 걍 걎 걏 걐 걑 걒 걓 걔 걕 걖 걗 걘 걙 걚 걛 걜 걝 걞 걟 걠 걡 걢 걣 걤 걥 걦 걧 걨 걩 걪 걫 걬 걭 걮 걯 거 걱 걲 걳 건 걵 걶 걷 걸 걹 걺 걻 걼 걽 걾 걿 ..."
   -- CJK Compatibility Ideographs
-  printS "豈 更 車 賈 滑 串 句 龜 龜 契 金 喇 奈 懶 癩 羅 蘿 螺 裸 邏 樂 洛 烙 珞 落 酪 駱 亂 卵 欄 爛 蘭 鸞 嵐 濫 藍 襤 拉 臘 蠟 廊 朗 浪 狼 郎 來 冷 勞 擄 櫓 爐 盧 老 蘆 虜 路 露 魯 鷺 碌 祿 綠 菉 錄 鹿 論 壟 弄 籠 聾 牢 磊 賂 雷 壘 屢 樓 淚 漏 累 縷 陋 勒 肋 凜 凌 稜 綾 菱 陵 讀 拏 樂 諾 丹 寧 怒 率 異 北 磻 便 復 不 泌 數 索 參 塞 省 葉 說 殺 辰 沈 拾 若 掠 略 亮 兩 凉 梁 糧 良 諒 量 勵 ..."
+  putStrLn "豈 更 車 賈 滑 串 句 龜 龜 契 金 喇 奈 懶 癩 羅 蘿 螺 裸 邏 樂 洛 烙 珞 落 酪 駱 亂 卵 欄 爛 蘭 鸞 嵐 濫 藍 襤 拉 臘 蠟 廊 朗 浪 狼 郎 來 冷 勞 擄 櫓 爐 盧 老 蘆 虜 路 露 魯 鷺 碌 祿 綠 菉 錄 鹿 論 壟 弄 籠 聾 牢 磊 賂 雷 壘 屢 樓 淚 漏 累 縷 陋 勒 肋 凜 凌 稜 綾 菱 陵 讀 拏 樂 諾 丹 寧 怒 率 異 北 磻 便 復 不 泌 數 索 參 塞 省 葉 說 殺 辰 沈 拾 若 掠 略 亮 兩 凉 梁 糧 良 諒 量 勵 ..."
   -- Alphabetic Presentation Forms
-  printS "ﬀ ﬁ ﬂ ﬃ ﬄ ﬅ ﬆ ﬓ ﬔ ﬕ ﬖ ﬗ ﬞ ײַ ﬠ ﬡ ﬢ ﬣ ﬤ ﬥ ﬦ ﬧ ﬨ ﬩ שׁ שׂ שּׁ שּׂ אַ אָ אּ בּ גּ דּ הּ וּ זּ טּ יּ ךּ כּ לּ מּ נּ סּ ףּ פּ צּ קּ רּ שּ תּ וֹ בֿ כֿ פֿ ﭏ"
+  putStrLn "ﬀ ﬁ ﬂ ﬃ ﬄ ﬅ ﬆ ﬓ ﬔ ﬕ ﬖ ﬗ ﬞ ײַ ﬠ ﬡ ﬢ ﬣ ﬤ ﬥ ﬦ ﬧ ﬨ ﬩ שׁ שׂ שּׁ שּׂ אַ אָ אּ בּ גּ דּ הּ וּ זּ טּ יּ ךּ כּ לּ מּ נּ סּ ףּ פּ צּ קּ רּ שּ תּ וֹ בֿ כֿ פֿ ﭏ"
   -- Arabic Presentation Forms-A
-  printS "ﭐ ﭑ ﭒ ﭓ ﭔ ﭕ ﭖ ﭗ ﭘ ﭙ ﭚ ﭛ ﭜ ﭝ ﭞ ﭟ ﭠ ﭡ ﭢ ﭣ ﭤ ﭥ ﭦ ﭧ ﭨ ﭩ ﭪ ﭫ ﭬ ﭭ ﭮ ﭯ ﭰ ﭱ ﭲ ﭳ ﭴ ﭵ ﭶ ﭷ ﭸ ﭹ ﭺ ﭻ ﭼ ﭽ ﭾ ﭿ ﮀ ﮁ ﮂ ﮃ ﮄ ﮅ ﮆ ﮇ ﮈ ﮉ ﮊ ﮋ ﮌ ﮍ ﮎ ﮏ ﮐ ﮑ ﮒ ﮓ ﮔ ﮕ ﮖ ﮗ ﮘ ﮙ ﮚ ﮛ ﮜ ﮝ ﮞ ﮟ ﮠ ﮡ ﮢ ﮣ ﮤ ﮥ ﮦ ﮧ ﮨ ﮩ ﮪ ﮫ ﮬ ﮭ ﮮ ﮯ ﮰ ﮱ ﯓ ﯔ ﯕ ﯖ ﯗ ﯘ ﯙ ﯚ ﯛ ﯜ ﯝ ﯞ ﯟ ﯠ ﯡ ﯢ ﯣ ﯤ ﯥ ﯦ ﯧ ﯨ ﯩ ﯪ ﯫ ﯬ ﯭ ﯮ ﯯ ﯰ ..."
+  putStrLn "ﭐ ﭑ ﭒ ﭓ ﭔ ﭕ ﭖ ﭗ ﭘ ﭙ ﭚ ﭛ ﭜ ﭝ ﭞ ﭟ ﭠ ﭡ ﭢ ﭣ ﭤ ﭥ ﭦ ﭧ ﭨ ﭩ ﭪ ﭫ ﭬ ﭭ ﭮ ﭯ ﭰ ﭱ ﭲ ﭳ ﭴ ﭵ ﭶ ﭷ ﭸ ﭹ ﭺ ﭻ ﭼ ﭽ ﭾ ﭿ ﮀ ﮁ ﮂ ﮃ ﮄ ﮅ ﮆ ﮇ ﮈ ﮉ ﮊ ﮋ ﮌ ﮍ ﮎ ﮏ ﮐ ﮑ ﮒ ﮓ ﮔ ﮕ ﮖ ﮗ ﮘ ﮙ ﮚ ﮛ ﮜ ﮝ ﮞ ﮟ ﮠ ﮡ ﮢ ﮣ ﮤ ﮥ ﮦ ﮧ ﮨ ﮩ ﮪ ﮫ ﮬ ﮭ ﮮ ﮯ ﮰ ﮱ ﯓ ﯔ ﯕ ﯖ ﯗ ﯘ ﯙ ﯚ ﯛ ﯜ ﯝ ﯞ ﯟ ﯠ ﯡ ﯢ ﯣ ﯤ ﯥ ﯦ ﯧ ﯨ ﯩ ﯪ ﯫ ﯬ ﯭ ﯮ ﯯ ﯰ ..."
   -- Combining Half Marks
-  printS "︠ ︡ ︢ ︣"
+  putStrLn "︠ ︡ ︢ ︣"
   -- CJK Compatibility Forms
-  printS "︰ ︱ ︲ ︳ ︴ ︵ ︶ ︷ ︸ ︹ ︺ ︻ ︼ ︽ ︾ ︿ ﹀ ﹁ ﹂ ﹃ ﹄ ﹉ ﹊ ﹋ ﹌ ﹍ ﹎ ﹏"
+  putStrLn "︰ ︱ ︲ ︳ ︴ ︵ ︶ ︷ ︸ ︹ ︺ ︻ ︼ ︽ ︾ ︿ ﹀ ﹁ ﹂ ﹃ ﹄ ﹉ ﹊ ﹋ ﹌ ﹍ ﹎ ﹏"
   -- Small Form Variants
-  printS "﹐ ﹑ ﹒ ﹔ ﹕ ﹖ ﹗ ﹘ ﹙ ﹚ ﹛ ﹜ ﹝ ﹞ ﹟ ﹠ ﹡ ﹢ ﹣ ﹤ ﹥ ﹦ ﹨ ﹩ ﹪ ﹫"
+  putStrLn "﹐ ﹑ ﹒ ﹔ ﹕ ﹖ ﹗ ﹘ ﹙ ﹚ ﹛ ﹜ ﹝ ﹞ ﹟ ﹠ ﹡ ﹢ ﹣ ﹤ ﹥ ﹦ ﹨ ﹩ ﹪ ﹫"
   -- Arabic Presentation Forms-B
-  printS "ﹰ ﹱ ﹲ ﹴ ﹶ ﹷ ﹸ ﹹ ﹺ ﹻ ﹼ ﹽ ﹾ ﹿ ﺀ ﺁ ﺂ ﺃ ﺄ ﺅ ﺆ ﺇ ﺈ ﺉ ﺊ ﺋ ﺌ ﺍ ﺎ ﺏ ﺐ ﺑ ﺒ ﺓ ﺔ ﺕ ﺖ ﺗ ﺘ ﺙ ﺚ ﺛ ﺜ ﺝ ﺞ ﺟ ﺠ ﺡ ﺢ ﺣ ﺤ ﺥ ﺦ ﺧ ﺨ ﺩ ﺪ ﺫ ﺬ ﺭ ﺮ ﺯ ﺰ ﺱ ﺲ ﺳ ﺴ ﺵ ﺶ ﺷ ﺸ ﺹ ﺺ ﺻ ﺼ ﺽ ﺾ ﺿ ﻀ ﻁ ﻂ ﻃ ﻄ ﻅ ﻆ ﻇ ﻈ ﻉ ﻊ ﻋ ﻌ ﻍ ﻎ ﻏ ﻐ ﻑ ﻒ ﻓ ﻔ ﻕ ﻖ ﻗ ﻘ ﻙ ﻚ ﻛ ﻜ ﻝ ﻞ ﻟ ﻠ ﻡ ﻢ ﻣ ﻤ ﻥ ﻦ ﻧ ﻨ ﻩ ﻪ ﻫ ﻬ ﻭ ﻮ ﻯ ﻰ ﻱ ..."
+  putStrLn "ﹰ ﹱ ﹲ ﹴ ﹶ ﹷ ﹸ ﹹ ﹺ ﹻ ﹼ ﹽ ﹾ ﹿ ﺀ ﺁ ﺂ ﺃ ﺄ ﺅ ﺆ ﺇ ﺈ ﺉ ﺊ ﺋ ﺌ ﺍ ﺎ ﺏ ﺐ ﺑ ﺒ ﺓ ﺔ ﺕ ﺖ ﺗ ﺘ ﺙ ﺚ ﺛ ﺜ ﺝ ﺞ ﺟ ﺠ ﺡ ﺢ ﺣ ﺤ ﺥ ﺦ ﺧ ﺨ ﺩ ﺪ ﺫ ﺬ ﺭ ﺮ ﺯ ﺰ ﺱ ﺲ ﺳ ﺴ ﺵ ﺶ ﺷ ﺸ ﺹ ﺺ ﺻ ﺼ ﺽ ﺾ ﺿ ﻀ ﻁ ﻂ ﻃ ﻄ ﻅ ﻆ ﻇ ﻈ ﻉ ﻊ ﻋ ﻌ ﻍ ﻎ ﻏ ﻐ ﻑ ﻒ ﻓ ﻔ ﻕ ﻖ ﻗ ﻘ ﻙ ﻚ ﻛ ﻜ ﻝ ﻞ ﻟ ﻠ ﻡ ﻢ ﻣ ﻤ ﻥ ﻦ ﻧ ﻨ ﻩ ﻪ ﻫ ﻬ ﻭ ﻮ ﻯ ﻰ ﻱ ..."
   -- Halfwidth and Fullwidth Forms
-  printS "！ ＂ ＃ ＄ ％ ＆ ＇ （ ） ＊ ＋ ， － ． ／ ０ １ ２ ３ ４ ５ ６ ７ ８ ９ ： ； ＜ ＝ ＞ ？ ＠ Ａ Ｂ Ｃ Ｄ Ｅ Ｆ Ｇ Ｈ Ｉ Ｊ Ｋ Ｌ Ｍ Ｎ Ｏ Ｐ Ｑ Ｒ Ｓ Ｔ Ｕ Ｖ Ｗ Ｘ Ｙ Ｚ ［ ＼ ］ ＾ ＿ ｀ ａ ｂ ｃ ｄ ｅ ｆ ｇ ｈ ｉ ｊ ｋ ｌ ｍ ｎ ｏ ｐ ｑ ｒ ｓ ｔ ｕ ｖ ｗ ｘ ｙ ｚ ｛ ｜ ｝ ～ ｡ ｢ ｣ ､ ･ ｦ ｧ ｨ ｩ ｪ ｫ ｬ ｭ ｮ ｯ ｰ ｱ ｲ ｳ ｴ ｵ ｶ ｷ ｸ ｹ ｺ ｻ ｼ ｽ ｾ ｿ ﾀ ﾁ ﾂ ..."
+  putStrLn "！ ＂ ＃ ＄ ％ ＆ ＇ （ ） ＊ ＋ ， － ． ／ ０ １ ２ ３ ４ ５ ６ ７ ８ ９ ： ； ＜ ＝ ＞ ？ ＠ Ａ Ｂ Ｃ Ｄ Ｅ Ｆ Ｇ Ｈ Ｉ Ｊ Ｋ Ｌ Ｍ Ｎ Ｏ Ｐ Ｑ Ｒ Ｓ Ｔ Ｕ Ｖ Ｗ Ｘ Ｙ Ｚ ［ ＼ ］ ＾ ＿ ｀ ａ ｂ ｃ ｄ ｅ ｆ ｇ ｈ ｉ ｊ ｋ ｌ ｍ ｎ ｏ ｐ ｑ ｒ ｓ ｔ ｕ ｖ ｗ ｘ ｙ ｚ ｛ ｜ ｝ ～ ｡ ｢ ｣ ､ ･ ｦ ｧ ｨ ｩ ｪ ｫ ｬ ｭ ｮ ｯ ｰ ｱ ｲ ｳ ｴ ｵ ｶ ｷ ｸ ｹ ｺ ｻ ｼ ｽ ｾ ｿ ﾀ ﾁ ﾂ ..."
 
-printS :: String -> Fay ()
-printS = ffi "console.log(%1)"
diff --git a/tests/where.hs b/tests/where.hs
--- a/tests/where.hs
+++ b/tests/where.hs
@@ -1,13 +1,6 @@
-
-
-module Where where
-
-import           Language.Fay.FFI
 import           Language.Fay.Prelude
 
-main = print $ "Hello " ++ friends ++ family
+main = putStrLn $ "Hello " ++ friends ++ family
   where friends = "my friends"
         family = " and family"
 
-print :: String -> Fay ()
-print = ffi "console.log(%1)"
