packages feed

ruler-core (empty) → 1.0

raw patch · 37 files changed

+7747/−0 lines, 37 filesdep +arraydep +basedep +containersbuild-type:Customsetup-changed

Dependencies added: array, base, containers, directory, fgl, filepath, haskell98, mtl, uuagc, uulib

Files

+ README view
@@ -0,0 +1,66 @@+Ruler-core++Ruler-core is an attribute grammar preprocessor, with a number of extensions to deal with (inference)-rule based systems.++How to get it to run:++1) checkout the repository or obtain the sources in another way+2) run cabal-install of ruler-core. This will install the dependencies, but will fail to build ruler-core itself.+3) run the cabal-files manually. The following is a trace:++$ runghc Setup.hs configure --user+Configuring ruler-core-0.9...+++$ runghc Setup.hs build+Preprocessing executables for ruler-core-0.9...+"processing: src/Ast.ag"+"processing: src/Transform.ag"+"processing: src/Errs.ag"+Building ruler-core-0.9...+[ 1 of 11] Compiling Env              ( src/Env.hs, dist/build/ruler-core/ruler-core-tmp/Env.o )+[ 2 of 11] Compiling Pretty           ( src/Pretty.hs, dist/build/ruler-core/ruler-core-tmp/Pretty.o )+[ 3 of 11] Compiling Common           ( src/Common.hs, dist/build/ruler-core/ruler-core-tmp/Common.o )+[ 4 of 11] Compiling Ast              ( dist/build/ruler-core/ruler-core-tmp/Ast.hs, dist/build/ruler-core/ruler-core-tmp/Ast.o )+[ 5 of 11] Compiling DepAnalysis      ( src/DepAnalysis.hs, dist/build/ruler-core/ruler-core-tmp/DepAnalysis.o )+[ 6 of 11] Compiling Opts             ( src/Opts.hs, dist/build/ruler-core/ruler-core-tmp/Opts.o )+[ 7 of 11] Compiling Errs             ( dist/build/ruler-core/ruler-core-tmp/Errs.hs, dist/build/ruler-core/ruler-core-tmp/Errs.o )+[ 8 of 11] Compiling Transform        ( dist/build/ruler-core/ruler-core-tmp/Transform.hs, dist/build/ruler-core/ruler-core-tmp/Transform.o )+[ 9 of 11] Compiling Parser           ( src/Parser.hs, dist/build/ruler-core/ruler-core-tmp/Parser.o )+[10 of 11] Compiling Scanner          ( dist/build/ruler-core/ruler-core-tmp/Scanner.hs, dist/build/ruler-core/ruler-core-tmp/Scanner.o )+[11 of 11] Compiling Main             ( src/Main.hs, dist/build/ruler-core/ruler-core-tmp/Main.o )+Linking dist/build/ruler-core/ruler-core ...+++To see a list of command-line options:+$ ./dist/build/ruler-core/ruler-core +No AG source file specified.+Usage: imp-visits <OPTION ...> <ag-file> ...+  -o path  --output=path  output .hs file+  -v       --verbose      verbose output+           --pretty       pp AST to STDOUT+           --tokens       print tokens to STDOUT+           --haskell      generate Haskell code (default)+           --js           generate Javascript code+  -f       --force        force code generation+           --nodata       do not generate data types+           --graph=path   output .dot file+           --noline       do not generate LINE pragmas+++Try an example:+$ ./dist/build/ruler-core/ruler-core examples/CycRepmin.rul -o test.hs+$ ghci test.hs+GHCi, version 6.12.1: http://www.haskell.org/ghc/  :? for help+Loading package ghc-prim ... linking ... done.+Loading package integer-gmp ... linking ... done.+Loading package base ... linking ... done.+Loading package ffi-1.0 ... linking ... done.+[1 of 1] Compiling CycRepmin        ( test.hs, interpreted )+Ok, modules loaded: CycRepmin.+*CycRepmin> main+Loading package syb-0.1.0.2 ... linking ... done.+Loading package base-3.0.3.2 ... linking ... done.+Loading package mtl-1.1.0.2 ... linking ... done.+Tree_Bin {l_Tree_Bin = Tree_Leaf {x_Tree_Leaf = 1}, r_Tree_Bin = Tree_Bin {l_Tree_Bin = Tree_Leaf {x_Tree_Leaf = 1}, r_Tree_Bin = Tree_Leaf {x_Tree_Leaf = 1}}}+*CycRepmin>
+ Setup.hs view
@@ -0,0 +1,7 @@+module Main where++import Distribution.Simple+import Distribution.Simple.UUAGC++main = defaultMainWithHooks uuagcUserHook+
+ dist/build/ruler-core/ruler-core-tmp/Ast.hs view
@@ -0,0 +1,156 @@+++-- UUAGC 0.9.32 (src/Ast.ag)+module Ast where++{-# LINE 8 "src/Ast.ag" #-}++import Common+{-# LINE 10 "dist/src/sdist.34564/ruler-core-1.0/dist/build/ruler-core/ruler-core-tmp/Ast.hs" #-}+-- AliasType ---------------------------------------------------+data AliasType  = AliasType_List !(Ident) +                | AliasType_Maybe !(Ident) +                | AliasType_Prod !(([Ident])) +-- Attr --------------------------------------------------------+data Attr  = Attr_Inh !(Ident) !(String) +           | Attr_Syn !(Ident) !(String) +-- AttrTypeCode ------------------------------------------------+data AttrTypeCode  = AttrTypeCode_Child +                   | AttrTypeCode_Lhs +                   | AttrTypeCode_ProdLocal +                   | AttrTypeCode_VisLocal +                   | AttrTypeCode_Visit +-- AttrTypePat -------------------------------------------------+data AttrTypePat  = AttrTypePat_Child +                  | AttrTypePat_Lhs +                  | AttrTypePat_ProdLocal +                  | AttrTypePat_VisLocal +                  | AttrTypePat_Visit +-- Attrs -------------------------------------------------------+type Attrs  = [Attr ]+-- Bind --------------------------------------------------------+data Bind  = Bind_Fun +           | Bind_Monadic +-- Block -------------------------------------------------------+data Block  = Block_Data !(Data ) +            | Block_DataSem !(DataSem ) +            | Block_Item !(Ident) !(Item ) +            | Block_Itf !(Itf ) +            | Block_Section !(Code ) +            | Block_Type !(Type ) +-- Blocks ------------------------------------------------------+type Blocks  = [Block ]+-- BlocksTop ---------------------------------------------------+data BlocksTop  = BlocksTop_None +                | BlocksTop_Top !(Blocks ) +-- BoundCode ---------------------------------------------------+data BoundCode  = BoundCode_Code !(Bind ) !(Pos) !(Code ) +-- Clause ------------------------------------------------------+data Clause  = Clause_Clause !(Pos) !(Ident) !(Stmts ) !(SemVisit ) +-- Clauses -----------------------------------------------------+type Clauses  = [Clause ]+-- ClausesTop --------------------------------------------------+data ClausesTop  = ClausesTop_Impl !(Clauses) +                 | ClausesTop_Top !(Clauses ) +-- Code --------------------------------------------------------+data Code  = Code_Code !(Items ) +-- Con ---------------------------------------------------------+data Con  = Con_Con !(Pos) !(Ident) !(Vars ) !(Fields ) +-- Cons --------------------------------------------------------+type Cons  = [Con ]+-- Data --------------------------------------------------------+data Data  = Data_Data !(Pos) !(Ident) !(Vars ) !(Cons ) !(Exts ) +-- DataSem -----------------------------------------------------+data DataSem  = DataSem_Sem !(Pos) !(Ident) !(Vars ) !((Maybe String)) !(Bool) !(Stmts) !(ClausesTop ) +-- ExprField ---------------------------------------------------+data ExprField  = ExprField_Field !(Ident) !(Code ) +-- ExprFields --------------------------------------------------+type ExprFields  = [ExprField ]+-- Ext ---------------------------------------------------------+data Ext  = Ext_Ext !(Ident) +-- Exts --------------------------------------------------------+type Exts  = [Ext ]+-- Field -------------------------------------------------------+data Field  = Field_Field !(Ident) !(FieldType ) +-- FieldType ---------------------------------------------------+data FieldType  = FieldType_Nonterm !(Ident) +                | FieldType_Term !(String) +-- Fields ------------------------------------------------------+type Fields  = [Field ]+-- ImplStmt ----------------------------------------------------+data ImplStmt  = ImplStmt_DefaultChild !(Pos) !(Bool) !(Ident) !(Ident) !((Maybe Int)) +               | ImplStmt_DefaultSyn !(Pos) !(Bool) !(Ident) !((Maybe Int)) +               | ImplStmt_DefaultVisLocal !(Pos) !(Ident) +               | ImplStmt_Invoke !(Pos) !(Ident) !(Ident) !(Ident) +-- ImplStmts ---------------------------------------------------+type ImplStmts  = [ImplStmt ]+-- Item --------------------------------------------------------+data Item  = Item_Attr !(Pos) !(Ident) !(Ident) +           | Item_Brackets !(Pos) !(Items ) !(Pos) +           | Item_CoSem !(Pos) !(Ident) !(Ident) !(Ident) !(Vars ) !((Maybe String)) !(SemVisit ) +           | Item_Construct !(Pos) !(Ident) !(Ident) !(ExprFields ) +           | Item_DataSem !(DataSem ) +           | Item_Detach !(Pos) !(Ident) !(Ident) +           | Item_Plain !(Pos) !(String) +           | Item_Sem !(Pos) !(Ident) !(Ident) !(Vars ) !((Maybe String)) !(SemVisit ) +-- Items -------------------------------------------------------+type Items  = [Item ]+-- Itf ---------------------------------------------------------+data Itf  = Itf_Itf !(Pos) !(Ident) !(Vars ) !(ItfVisits ) +-- ItfVisit ----------------------------------------------------+data ItfVisit  = ItfVisit_Visit !(Pos) !(Ident) !(Bool) !(Vars ) !(Attrs ) +-- ItfVisits ---------------------------------------------------+type ItfVisits  = [ItfVisit ]+-- MaybeBoundCode ----------------------------------------------+type MaybeBoundCode  = Maybe BoundCode +-- Mode --------------------------------------------------------+data Mode  = Mode_Assert +           | Mode_Match +-- Pat ---------------------------------------------------------+data Pat  = Pat_Attr !(Ident) !(Ident) +          | Pat_AttrCon !(Ident) !(Ident) !(Ident) +          | Pat_Con !(Ident) !(Pats ) +          | Pat_Cons !(Pat ) !(Pat ) +          | Pat_List !(Pats ) +          | Pat_Tup !(Pats ) +          | Pat_Underscore !(Pos) +-- Pats --------------------------------------------------------+type Pats  = [Pat ]+-- Program -----------------------------------------------------+data Program  = Program_Program !(BlocksTop ) +-- Rename ------------------------------------------------------+data Rename  = Rename_Rename !(Ident) !(Ident) +-- Renames -----------------------------------------------------+type Renames  = [Rename ]+-- SemCon ------------------------------------------------------+data SemCon  = SemCon_Con !(Pos) !(Ident) !(SemFields ) +-- SemCons -----------------------------------------------------+type SemCons  = [SemCon ]+-- SemField ----------------------------------------------------+data SemField  = SemField_Field !(Pos) !(Ident) !((Either Ident String)) +-- SemFields ---------------------------------------------------+type SemFields  = [SemField ]+-- SemVisit ----------------------------------------------------+data SemVisit  = SemVisit_End +               | SemVisit_Impl +               | SemVisit_Internal !(Pos) !(Ident) !(Bool) !(Stmts ) !(ClausesTop ) +               | SemVisit_Prependable !(Pos) !(Ident) !(SemVisit) +               | SemVisit_Visit !(Pos) !(Ident) !(Bool) !(VisitAttrs ) !(Stmts ) !(ClausesTop ) +-- Stmt --------------------------------------------------------+data Stmt  = Stmt_Attach !(Pos) !((Maybe Ident)) !(Ident) !(Ident) !(MaybeBoundCode ) +           | Stmt_Default !(Bool) !(Pos) !(Ident) !(MaybeBoundCode ) +           | Stmt_Eval !(Mode ) !(Pat ) !(BoundCode ) +           | Stmt_Invoke !(Pos) !(Ident) !(Ident) !(MaybeBoundCode ) +           | Stmt_Rename !(Pos) !(Ident) !(Renames ) +-- Stmts -------------------------------------------------------+type Stmts  = [Stmt ]+-- Type --------------------------------------------------------+data Type  = Type_Alias !(Pos) !(Ident) !(AliasType ) !(Vars ) +-- Var ---------------------------------------------------------+data Var  = Var_Var !(Ident) +-- Vars --------------------------------------------------------+type Vars  = [Var ]+-- VisitAttr ---------------------------------------------------+data VisitAttr  = VisitAttr_Chn !(Ident) !(String) +-- VisitAttrs --------------------------------------------------+type VisitAttrs  = [VisitAttr ]
+ dist/build/ruler-core/ruler-core-tmp/Errs.hs view
@@ -0,0 +1,484 @@+++-- UUAGC 0.9.32 (src/Errs.ag)+module Errs(errsToStr, prettyErrs, Errs, Err(..), debugMsg, nullErrs) where++{-# LINE 6 "src/Errs.ag" #-}++import Common+import Pretty+import UU.Scanner.Position+import Data.Sequence(Seq)+import qualified Data.Sequence as Seq+import Data.Map(Map)+import qualified Data.Map as Map+import Data.Foldable+import Opts+{-# LINE 18 "dist/src/sdist.34564/ruler-core-1.0/dist/build/ruler-core/ruler-core-tmp/Errs.hs" #-}++{-# LINE 20 "src/Errs.ag" #-}++type Errs = Seq Err++prettyErr :: Opts -> Err -> PP_Doc+prettyErr opts e+  = pp_Syn_Err syn+  where+    inh = Inh_Err { opts_Inh_Err = opts }+    syn = wrap_Err sem inh+    sem = sem_Err e++prettyErrs :: Opts -> Errs -> PP_Doc+prettyErrs opts = vlist . map (prettyErr opts) . toList++errsToStr :: Opts -> Errs -> String+errsToStr opts es = disp (prettyErrs opts es) 999999 ""++debugMsg :: String -> Errs+debugMsg = Seq.singleton . Err_General noPos++nullErrs :: Errs -> Bool+nullErrs = Seq.null+{-# LINE 43 "dist/src/sdist.34564/ruler-core-1.0/dist/build/ruler-core/ruler-core-tmp/Errs.hs" #-}++{-# LINE 203 "src/Errs.ag" #-}++locLine :: PP a => Pos -> a -> PP_Doc+locLine (Pos l c f) d+  = pp f >|< ":" >|< pp l >|< "," >|< pp c >|< ":error:" >#< pp d+{-# LINE 50 "dist/src/sdist.34564/ruler-core-1.0/dist/build/ruler-core/ruler-core-tmp/Errs.hs" #-}+-- Err ---------------------------------------------------------+data Err  = Err_AmbAttach !(Ident) !(Ident) +          | Err_AmbDefault !(Pos) !(Ident) +          | Err_ChildSynUnav !(Pos) !(Ident) !(Ident) !(Ident) !(Ident) +          | Err_ClausesCyclic !(Pos) !(Ident) !(Int) +          | Err_Cyclic !(Pos) !((Map DepItem Pos)) !(([DepItem])) +          | Err_Dup !(([Ident])) +          | Err_DupAttr !(Bool) !(Ident) !(Ident) +          | Err_EffCyclic !(Pos) +          | Err_ExpVisit !(Pos) !(Ident) !(Ident) +          | Err_General !(Pos) !(String) +          | Err_InternalInCyclic !(Pos) !(Ident) +          | Err_IterCyclic !(Pos) +          | Err_MatchCyclic !(Pos) +          | Err_Missing !(([Ident])) +          | Err_MissingAttr !(Bool) !(Ident) !(Ident) +          | Err_MissingClause !(Ident) !(Ident) +          | Err_MissingVisit !(Pos) !(Ident) !(Ident) +          | Err_NameClash !(Ident) +          | Err_TypeConflict !(Ident) !(Ident) +          | Err_UndeclAttr !(Ident) !(Ident) +          | Err_UndeclVisit !(Pos) !(Ident) !(Ident) +          | Err_UndefVisit !(Ident) !(Ident) !(([Ident])) +          | Err_UndetachVisit !(Ident) !(Ident) !(Ident) +          | Err_VisExpCyclic !(Ident) !(Ident) +          | Err_VisitsNotImpl !(([Ident])) !(([Ident])) +-- cata+sem_Err :: Err  ->+           T_Err +sem_Err (Err_AmbAttach _name _visit )  =+    (sem_Err_AmbAttach _name _visit )+sem_Err (Err_AmbDefault _pos _name )  =+    (sem_Err_AmbDefault _pos _name )+sem_Err (Err_ChildSynUnav _pos _child _itf _vis _name )  =+    (sem_Err_ChildSynUnav _pos _child _itf _vis _name )+sem_Err (Err_ClausesCyclic _pos _name _n )  =+    (sem_Err_ClausesCyclic _pos _name _n )+sem_Err (Err_Cyclic _pos _posMap _comps )  =+    (sem_Err_Cyclic _pos _posMap _comps )+sem_Err (Err_Dup _ks )  =+    (sem_Err_Dup _ks )+sem_Err (Err_DupAttr _inherited _child _name )  =+    (sem_Err_DupAttr _inherited _child _name )+sem_Err (Err_EffCyclic _pos )  =+    (sem_Err_EffCyclic _pos )+sem_Err (Err_ExpVisit _pos _found _expect )  =+    (sem_Err_ExpVisit _pos _found _expect )+sem_Err (Err_General _pos _str )  =+    (sem_Err_General _pos _str )+sem_Err (Err_InternalInCyclic _pos _name )  =+    (sem_Err_InternalInCyclic _pos _name )+sem_Err (Err_IterCyclic _pos )  =+    (sem_Err_IterCyclic _pos )+sem_Err (Err_MatchCyclic _pos )  =+    (sem_Err_MatchCyclic _pos )+sem_Err (Err_Missing _ks )  =+    (sem_Err_Missing _ks )+sem_Err (Err_MissingAttr _inherited _child _name )  =+    (sem_Err_MissingAttr _inherited _child _name )+sem_Err (Err_MissingClause _itf _name )  =+    (sem_Err_MissingClause _itf _name )+sem_Err (Err_MissingVisit _pos _child _visit )  =+    (sem_Err_MissingVisit _pos _child _visit )+sem_Err (Err_NameClash _name )  =+    (sem_Err_NameClash _name )+sem_Err (Err_TypeConflict _found _expect )  =+    (sem_Err_TypeConflict _found _expect )+sem_Err (Err_UndeclAttr _child _name )  =+    (sem_Err_UndeclAttr _child _name )+sem_Err (Err_UndeclVisit _pos _name _itf )  =+    (sem_Err_UndeclVisit _pos _name _itf )+sem_Err (Err_UndefVisit _child _visit _visits )  =+    (sem_Err_UndefVisit _child _visit _visits )+sem_Err (Err_UndetachVisit _child _visit _expect )  =+    (sem_Err_UndetachVisit _child _visit _expect )+sem_Err (Err_VisExpCyclic _name _child )  =+    (sem_Err_VisExpCyclic _name _child )+sem_Err (Err_VisitsNotImpl _nonterm _vs )  =+    (sem_Err_VisitsNotImpl _nonterm _vs )+-- semantic domain+type T_Err  = Opts ->+              ( PP_Doc)+data Inh_Err  = Inh_Err {opts_Inh_Err :: !(Opts)}+data Syn_Err  = Syn_Err {pp_Syn_Err :: !(PP_Doc)}+wrap_Err :: T_Err  ->+            Inh_Err  ->+            Syn_Err +wrap_Err sem (Inh_Err _lhsIopts )  =+    (let ( _lhsOpp) = sem _lhsIopts +     in  (Syn_Err _lhsOpp ))+sem_Err_AmbAttach :: Ident ->+                     Ident ->+                     T_Err +sem_Err_AmbAttach name_ visit_  =+    (\ _lhsIopts ->+         (case (({-# LINE 182 "src/Errs.ag" #-}+                 identPos name_+                 {-# LINE 148 "src/Errs.hs" #-})) of+          { _pos ->+          (case (({-# LINE 144 "src/Errs.ag" #-}+                  locLine _pos     ("ambiguous attach of child" >#< show name_ >#< "and visit" >#< show visit_)+                  {-# LINE 152 "src/Errs.hs" #-})) of+           { _lhsOpp ->+           ( _lhsOpp) }) }))+sem_Err_AmbDefault :: Pos ->+                      Ident ->+                      T_Err +sem_Err_AmbDefault pos_ name_  =+    (\ _lhsIopts ->+         (case (({-# LINE 145 "src/Errs.ag" #-}+                 locLine pos_     ("ambiguous default statement for" >#< show name_)+                 {-# LINE 162 "src/Errs.hs" #-})) of+          { _lhsOpp ->+          ( _lhsOpp) }))+sem_Err_ChildSynUnav :: Pos ->+                        Ident ->+                        Ident ->+                        Ident ->+                        Ident ->+                        T_Err +sem_Err_ChildSynUnav pos_ child_ itf_ vis_ name_  =+    (\ _lhsIopts ->+         (case (({-# LINE 147 "src/Errs.ag" #-}+                 locLine pos_     ("default for" >#< show name_ >#< "requires unavailable attribute" >#< show name_ >#< "of" >#< show child_ >|< "'s visit" >#< show vis_)+                 {-# LINE 175 "src/Errs.hs" #-})) of+          { _lhsOpp ->+          ( _lhsOpp) }))+sem_Err_ClausesCyclic :: Pos ->+                         Ident ->+                         Int ->+                         T_Err +sem_Err_ClausesCyclic pos_ name_ n_  =+    (\ _lhsIopts ->+         (case (({-# LINE 150 "src/Errs.ag" #-}+                 locLine pos_     ("cyclic visit" >#< show name_ >#< "must have one clause, but has" >#< show n_)+                 {-# LINE 186 "src/Errs.hs" #-})) of+          { _lhsOpp ->+          ( _lhsOpp) }))+sem_Err_Cyclic :: Pos ->+                  (Map DepItem Pos) ->+                  ([DepItem]) ->+                  T_Err +sem_Err_Cyclic pos_ posMap_ comps_  =+    (\ _lhsIopts ->+         (case (({-# LINE 188 "src/Errs.ag" #-}+                 \d -> let pos = Map.findWithDefault noPos d posMap_+                       in case d of+                            DepMatch _               -> "@" >|< show (line pos)+                            DepAssert _              -> "@" >|< show (line pos)+                            DepDefault o             -> "d" >|< show o+                            DepAttach n              -> "@" >|< show (line pos)+                            DepInvoke (visit:name:_) -> show name >|< "." >|< show visit >|< "@" >|< show (line $ identPos name)+                            DepInvoke _              -> text "i???"+                            DepVisStart (visit:_)    -> ">" >|< show visit >|< "@" >|< show (line $ identPos visit)+                            DepVisStart _            -> text ">v???"+                            DepVisEnd  (visit:_)     -> show visit >|< "@" >|< show (line $ identPos visit) >|< "<"+                            DepVisEnd _              -> text "<v???"+                            DepClause (clause:_)     -> "|" >|< show clause >|< "@" >|< show (line $ identPos clause)+                            DepClause _              -> text "|???"+                 {-# LINE 210 "src/Errs.hs" #-})) of+          { _ppDep ->+          (case (({-# LINE 148 "src/Errs.ag" #-}+                  locLine pos_     ("cycle:" >#< hlist_sp (map _ppDep     comps_) )+                  {-# LINE 214 "src/Errs.hs" #-})) of+           { _lhsOpp ->+           ( _lhsOpp) }) }))+sem_Err_Dup :: ([Ident]) ->+               T_Err +sem_Err_Dup ks_  =+    (\ _lhsIopts ->+         (case (({-# LINE 158 "src/Errs.ag" #-}+                 if null ks_ then ident "<unspecified>" else head ks_+                 {-# LINE 223 "src/Errs.hs" #-})) of+          { _main ->+          (case (({-# LINE 160 "src/Errs.ag" #-}+                  identPos _main+                  {-# LINE 227 "src/Errs.hs" #-})) of+           { _pos ->+           (case (({-# LINE 132 "src/Errs.ag" #-}+                   locLine _pos     ("duplicate identifier" >#< show _main    )+                   {-# LINE 231 "src/Errs.hs" #-})) of+            { _lhsOpp ->+            ( _lhsOpp) }) }) }))+sem_Err_DupAttr :: Bool ->+                   Ident ->+                   Ident ->+                   T_Err +sem_Err_DupAttr inherited_ child_ name_  =+    (\ _lhsIopts ->+         (case (({-# LINE 178 "src/Errs.ag" #-}+                 if inherited_ then text "inh" else text "syn"+                 {-# LINE 242 "src/Errs.hs" #-})) of+          { _type ->+          (case (({-# LINE 177 "src/Errs.ag" #-}+                  identPos name_+                  {-# LINE 246 "src/Errs.hs" #-})) of+           { _pos ->+           (case (({-# LINE 142 "src/Errs.ag" #-}+                   locLine _pos     ("duplicate" >#< _type     >#< "attr" >#< show child_ >|< "." >|< show name_)+                   {-# LINE 250 "src/Errs.hs" #-})) of+            { _lhsOpp ->+            ( _lhsOpp) }) }) }))+sem_Err_EffCyclic :: Pos ->+                     T_Err +sem_Err_EffCyclic pos_  =+    (\ _lhsIopts ->+         (case (({-# LINE 151 "src/Errs.ag" #-}+                 locLine pos_     ("effectful code not allowed for cyclic stmt")+                 {-# LINE 259 "src/Errs.hs" #-})) of+          { _lhsOpp ->+          ( _lhsOpp) }))+sem_Err_ExpVisit :: Pos ->+                    Ident ->+                    Ident ->+                    T_Err +sem_Err_ExpVisit pos_ found_ expect_  =+    (\ _lhsIopts ->+         (case (({-# LINE 133 "src/Errs.ag" #-}+                 locLine pos_     ("expecting visit" >#< show expect_ >#< "found" >#< show found_)+                 {-# LINE 270 "src/Errs.hs" #-})) of+          { _lhsOpp ->+          ( _lhsOpp) }))+sem_Err_General :: Pos ->+                   String ->+                   T_Err +sem_Err_General pos_ str_  =+    (\ _lhsIopts ->+         (case (({-# LINE 130 "src/Errs.ag" #-}+                 locLine pos_ str_+                 {-# LINE 280 "src/Errs.hs" #-})) of+          { _lhsOpp ->+          ( _lhsOpp) }))+sem_Err_InternalInCyclic :: Pos ->+                            Ident ->+                            T_Err +sem_Err_InternalInCyclic pos_ name_  =+    (\ _lhsIopts ->+         (case (({-# LINE 154 "src/Errs.ag" #-}+                 locLine pos_  ("internal visit" >#< show name_ >#< "may not occur in a fully cyclic visit")+                 {-# LINE 290 "src/Errs.hs" #-})) of+          { _lhsOpp ->+          ( _lhsOpp) }))+sem_Err_IterCyclic :: Pos ->+                      T_Err +sem_Err_IterCyclic pos_  =+    (\ _lhsIopts ->+         (case (({-# LINE 153 "src/Errs.ag" #-}+                 locLine pos_     ("visit may not be iterated by cyclic stmt")+                 {-# LINE 299 "src/Errs.hs" #-})) of+          { _lhsOpp ->+          ( _lhsOpp) }))+sem_Err_MatchCyclic :: Pos ->+                       T_Err +sem_Err_MatchCyclic pos_  =+    (\ _lhsIopts ->+         (case (({-# LINE 149 "src/Errs.ag" #-}+                 locLine pos_     ("match statement not allowed in cyclic visit")+                 {-# LINE 308 "src/Errs.hs" #-})) of+          { _lhsOpp ->+          ( _lhsOpp) }))+sem_Err_Missing :: ([Ident]) ->+                   T_Err +sem_Err_Missing ks_  =+    (\ _lhsIopts ->+         (case (({-# LINE 158 "src/Errs.ag" #-}+                 if null ks_ then ident "<unspecified>" else head ks_+                 {-# LINE 317 "src/Errs.hs" #-})) of+          { _main ->+          (case (({-# LINE 160 "src/Errs.ag" #-}+                  identPos _main+                  {-# LINE 321 "src/Errs.hs" #-})) of+           { _pos ->+           (case (({-# LINE 131 "src/Errs.ag" #-}+                   locLine _pos     ("undefined identifier" >#< show _main    )+                   {-# LINE 325 "src/Errs.hs" #-})) of+            { _lhsOpp ->+            ( _lhsOpp) }) }) }))+sem_Err_MissingAttr :: Bool ->+                       Ident ->+                       Ident ->+                       T_Err +sem_Err_MissingAttr inherited_ child_ name_  =+    (\ _lhsIopts ->+         (case (({-# LINE 175 "src/Errs.ag" #-}+                 if inherited_ then text "inh" else text "syn"+                 {-# LINE 336 "src/Errs.hs" #-})) of+          { _type ->+          (case (({-# LINE 174 "src/Errs.ag" #-}+                  identPos name_+                  {-# LINE 340 "src/Errs.hs" #-})) of+           { _pos ->+           (case (({-# LINE 141 "src/Errs.ag" #-}+                   locLine _pos     ("undefined" >#< _type     >#< "attr" >#< show child_ >|< "." >|< show name_)+                   {-# LINE 344 "src/Errs.hs" #-})) of+            { _lhsOpp ->+            ( _lhsOpp) }) }) }))+sem_Err_MissingClause :: Ident ->+                         Ident ->+                         T_Err +sem_Err_MissingClause itf_ name_  =+    (\ _lhsIopts ->+         (case (({-# LINE 180 "src/Errs.ag" #-}+                 identPos name_+                 {-# LINE 354 "src/Errs.hs" #-})) of+          { _pos ->+          (case (({-# LINE 143 "src/Errs.ag" #-}+                  locLine _pos     ("missing clause " >#< show name_ >#< "of" >#< show itf_)+                  {-# LINE 358 "src/Errs.hs" #-})) of+           { _lhsOpp ->+           ( _lhsOpp) }) }))+sem_Err_MissingVisit :: Pos ->+                        Ident ->+                        Ident ->+                        T_Err +sem_Err_MissingVisit pos_ child_ visit_  =+    (\ _lhsIopts ->+         (case (({-# LINE 134 "src/Errs.ag" #-}+                 locLine pos_     ("missing invoke of visit" >#< show visit_ >#< "of child" >#< show child_)+                 {-# LINE 369 "src/Errs.hs" #-})) of+          { _lhsOpp ->+          ( _lhsOpp) }))+sem_Err_NameClash :: Ident ->+                     T_Err +sem_Err_NameClash name_  =+    (\ _lhsIopts ->+         (case (({-# LINE 172 "src/Errs.ag" #-}+                 identPos name_+                 {-# LINE 378 "src/Errs.hs" #-})) of+          { _pos ->+          (case (({-# LINE 140 "src/Errs.ag" #-}+                  locLine _pos     ("name clash" >#< show name_)+                  {-# LINE 382 "src/Errs.hs" #-})) of+           { _lhsOpp ->+           ( _lhsOpp) }) }))+sem_Err_TypeConflict :: Ident ->+                        Ident ->+                        T_Err +sem_Err_TypeConflict found_ expect_  =+    (\ _lhsIopts ->+         (case (({-# LINE 184 "src/Errs.ag" #-}+                 identPos found_+                 {-# LINE 392 "src/Errs.hs" #-})) of+          { _pos ->+          (case (({-# LINE 146 "src/Errs.ag" #-}+                  locLine _pos     ("type" >#< show found_ >#< "does not match expected type" >#< show expect_)+                  {-# LINE 396 "src/Errs.hs" #-})) of+           { _lhsOpp ->+           ( _lhsOpp) }) }))+sem_Err_UndeclAttr :: Ident ->+                      Ident ->+                      T_Err +sem_Err_UndeclAttr child_ name_  =+    (\ _lhsIopts ->+         (case (({-# LINE 170 "src/Errs.ag" #-}+                 identPos name_+                 {-# LINE 406 "src/Errs.hs" #-})) of+          { _pos ->+          (case (({-# LINE 139 "src/Errs.ag" #-}+                  locLine _pos     ("undeclared attr" >#< show child_ >|< "." >|< show name_)+                  {-# LINE 410 "src/Errs.hs" #-})) of+           { _lhsOpp ->+           ( _lhsOpp) }) }))+sem_Err_UndeclVisit :: Pos ->+                       Ident ->+                       Ident ->+                       T_Err +sem_Err_UndeclVisit pos_ name_ itf_  =+    (\ _lhsIopts ->+         (case (({-# LINE 137 "src/Errs.ag" #-}+                 locLine pos_     ("undeclared visit" >#< show name_ >#< "of interface" >#< show itf_)+                 {-# LINE 421 "src/Errs.hs" #-})) of+          { _lhsOpp ->+          ( _lhsOpp) }))+sem_Err_UndefVisit :: Ident ->+                      Ident ->+                      ([Ident]) ->+                      T_Err +sem_Err_UndefVisit child_ visit_ visits_  =+    (\ _lhsIopts ->+         (case (({-# LINE 166 "src/Errs.ag" #-}+                 identPos visit_+                 {-# LINE 432 "src/Errs.hs" #-})) of+          { _pos ->+          (case (({-# LINE 136 "src/Errs.ag" #-}+                  locLine _pos     ("undefined visit" >#< show visit_ >#< "of child" >#< show child_)+                  {-# LINE 436 "src/Errs.hs" #-})) of+           { _lhsOpp ->+           ( _lhsOpp) }) }))+sem_Err_UndetachVisit :: Ident ->+                         Ident ->+                         Ident ->+                         T_Err +sem_Err_UndetachVisit child_ visit_ expect_  =+    (\ _lhsIopts ->+         (case (({-# LINE 168 "src/Errs.ag" #-}+                 identPos visit_+                 {-# LINE 447 "src/Errs.hs" #-})) of+          { _pos ->+          (case (({-# LINE 138 "src/Errs.ag" #-}+                  locLine _pos     ("undetachable visit" >#< show visit_ >#< "of child" >#< show child_ >|< ": expecting visit" >#< show expect_)+                  {-# LINE 451 "src/Errs.hs" #-})) of+           { _lhsOpp ->+           ( _lhsOpp) }) }))+sem_Err_VisExpCyclic :: Ident ->+                        Ident ->+                        T_Err +sem_Err_VisExpCyclic name_ child_  =+    (\ _lhsIopts ->+         (case (({-# LINE 186 "src/Errs.ag" #-}+                 identPos name_+                 {-# LINE 461 "src/Errs.hs" #-})) of+          { _pos ->+          (case (({-# LINE 152 "src/Errs.ag" #-}+                  locLine _pos     ("visit" >#< show name_ >#< "of" >#< show child_ >#< "is on a cycle")+                  {-# LINE 465 "src/Errs.hs" #-})) of+           { _lhsOpp ->+           ( _lhsOpp) }) }))+sem_Err_VisitsNotImpl :: ([Ident]) ->+                         ([Ident]) ->+                         T_Err +sem_Err_VisitsNotImpl nonterm_ vs_  =+    (\ _lhsIopts ->+         (case (({-# LINE 164 "src/Errs.ag" #-}+                 identPos (head nonterm_)+                 {-# LINE 475 "src/Errs.hs" #-})) of+          { _pos ->+          (case (({-# LINE 162 "src/Errs.ag" #-}+                  if null vs_ then ident "<unspecified>" else head vs_+                  {-# LINE 479 "src/Errs.hs" #-})) of+           { _main ->+           (case (({-# LINE 135 "src/Errs.ag" #-}+                   locLine _pos     ("missing visit" >#< show _main     >#< "for" >#< show (head nonterm_))+                   {-# LINE 483 "src/Errs.hs" #-})) of+            { _lhsOpp ->+            ( _lhsOpp) }) }) }))
+ dist/build/ruler-core/ruler-core-tmp/Scanner.hs view
@@ -0,0 +1,353 @@+{-# OPTIONS -fglasgow-exts -cpp #-}+{-# LINE 1 "src/Scanner.x" #-}+
+module Scanner(tokenize, ppTokens) where
+
+import UU.Scanner
+import UU.Scanner.GenToken
+import Data.Char
+import UU.Pretty
+import Opts
++#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# "\xf7\xff\xff\xff\x69\x00\x00\x00\xc3\x00\x00\x00\xe0\x00\x00\x00\xf8\xff\xff\xff\xf9\xff\xff\xff\xfd\xff\xff\xff\xfe\xff\xff\xff\xff\xff\xff\xff\x02\x00\x00\x00\xe3\xff\xff\xff\x00\x00\x00\x00\xe4\xff\xff\xff\xe5\xff\xff\xff\xe6\xff\xff\xff\xe7\xff\xff\xff\x0b\x00\x00\x00\x00\x00\x00\x00\xe9\xff\xff\xff\xed\xff\xff\xff\xee\xff\xff\xff\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x35\x01\x00\x00\x89\x01\x00\x00\xdd\x01\x00\x00\x31\x02\x00\x00\x85\x02\x00\x00\xd9\x02\x00\x00\x2d\x03\x00\x00\x81\x03\x00\x00\xd5\x03\x00\x00\x29\x04\x00\x00\x7d\x04\x00\x00\xd1\x04\x00\x00\x25\x05\x00\x00\x79\x05\x00\x00\xcd\x05\x00\x00\x21\x06\x00\x00\x75\x06\x00\x00\xc9\x06\x00\x00\x1d\x07\x00\x00\x71\x07\x00\x00\xc5\x07\x00\x00\x19\x08\x00\x00\x6d\x08\x00\x00\xc1\x08\x00\x00\x15\x09\x00\x00\x69\x09\x00\x00\xbd\x09\x00\x00\x11\x0a\x00\x00\x65\x0a\x00\x00\xb9\x0a\x00\x00\x0d\x0b\x00\x00\x61\x0b\x00\x00\xb5\x0b\x00\x00\x09\x0c\x00\x00\x5d\x0c\x00\x00\xb1\x0c\x00\x00\x05\x0d\x00\x00\x59\x0d\x00\x00\xad\x0d\x00\x00\x01\x0e\x00\x00\x55\x0e\x00\x00\xa9\x0e\x00\x00\xfd\x0e\x00\x00\x51\x0f\x00\x00\xa5\x0f\x00\x00\xf9\x0f\x00\x00\x4d\x10\x00\x00\xa1\x10\x00\x00\xf5\x10\x00\x00\x49\x11\x00\x00\x9d\x11\x00\x00\xf1\x11\x00\x00\x45\x12\x00\x00\x99\x12\x00\x00\xed\x12\x00\x00\x41\x13\x00\x00\x95\x13\x00\x00\xe9\x13\x00\x00\x3d\x14\x00\x00\x91\x14\x00\x00\xe5\x14\x00\x00\x39\x15\x00\x00\x8d\x15\x00\x00\xe1\x15\x00\x00\x35\x16\x00\x00\x89\x16\x00\x00\xdd\x16\x00\x00\x31\x17\x00\x00\x85\x17\x00\x00\xd9\x17\x00\x00\x2d\x18\x00\x00\x81\x18\x00\x00\xd5\x18\x00\x00\x29\x19\x00\x00\x7d\x19\x00\x00\xd1\x19\x00\x00\x25\x1a\x00\x00\x79\x1a\x00\x00\xcd\x1a\x00\x00\x21\x1b\x00\x00\x75\x1b\x00\x00\xc9\x1b\x00\x00\x1d\x1c\x00\x00\x71\x1c\x00\x00\xc5\x1c\x00\x00\x00\x00\x00\x00\x19\x1d\x00\x00\x6d\x1d\x00\x00\xc1\x1d\x00\x00\x15\x1e\x00\x00\x69\x1e\x00\x00\xeb\xff\xff\xff\x00\x00\x00\x00\xbd\x1e\x00\x00\x11\x1f\x00\x00\x65\x1f\x00\x00\xb9\x1f\x00\x00\x0d\x20\x00\x00\x61\x20\x00\x00\xb5\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf1\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x09\x21\x00\x00\x5d\x21\x00\x00\xb1\x21\x00\x00\x05\x22\x00\x00\x59\x22\x00\x00\xad\x22\x00\x00\x01\x23\x00\x00\x55\x23\x00\x00\xa9\x23\x00\x00\xfd\x23\x00\x00\x51\x24\x00\x00\xa5\x24\x00\x00\xf9\x24\x00\x00\x4d\x25\x00\x00\xa1\x25\x00\x00\xf5\x25\x00\x00\x49\x26\x00\x00\x9d\x26\x00\x00\xf1\x26\x00\x00\x45\x27\x00\x00\x99\x27\x00\x00\xed\x27\x00\x00\x41\x28\x00\x00\x95\x28\x00\x00\xe9\x28\x00\x00\x3d\x29\x00\x00\x91\x29\x00\x00\xe5\x29\x00\x00\x39\x2a\x00\x00\x8d\x2a\x00\x00\x00\x00\x00\x00\x6b\x00\x00\x00\xfe\x2a\x00\x00\xff\x2a\x00\x00\x00\x2b\x00\x00\x1c\x2b\x00\x00\x70\x2b\x00\x00\xc2\x2a\x00\x00\xc4\x2b\x00\x00\x18\x2c\x00\x00\x6c\x2c\x00\x00\xc0\x2c\x00\x00\xda\x2c\x00\x00\x2e\x2d\x00\x00\x82\x2d\x00\x00\xd6\x2d\x00\x00\x2a\x2e\x00\x00\x44\x2e\x00\x00\x98\x2e\x00\x00\xec\x2e\x00\x00"#++alex_table :: AlexAddr+alex_table = AlexA# "\x00\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\xff\xff\xff\xff\x05\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x09\x00\x10\x00\x10\x00\x0c\x00\x0c\x00\xff\xff\x15\x00\x06\x00\x06\x00\x06\x00\x15\x00\x12\x00\xff\xff\x06\x00\x82\x00\x7c\x00\x7d\x00\x00\x00\x07\x00\x80\x00\x0a\x00\x74\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x73\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x34\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x7e\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\xa1\x00\xa1\x00\x23\x00\x2c\x00\x36\x00\xa1\x00\xa1\x00\xa1\x00\x1a\x00\xa1\x00\xa1\x00\xa1\x00\x76\x00\xa1\x00\xa1\x00\xa1\x00\xa1\x00\xa1\x00\x26\x00\x30\x00\xa1\x00\x1e\x00\xa1\x00\xa1\x00\xa1\x00\xa1\x00\x0f\x00\x05\x00\x00\x00\xff\xff\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0b\x00\x06\x00\x00\x00\x00\x00\x00\x00\xa5\x00\x00\x00\x11\x00\x00\x00\x7c\x00\x7d\x00\x00\x00\x00\x00\x80\x00\x0a\x00\x84\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x73\x00\x00\x00\x83\x00\x81\x00\x00\x00\x00\x00\x85\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x7e\x00\x00\x00\x7f\x00\xa9\x00\x86\x00\x00\x00\x5f\x00\xa1\x00\x3f\x00\x64\x00\xa1\x00\xa1\x00\xa1\x00\xa1\x00\x4f\x00\xa1\x00\xa1\x00\xa1\x00\x54\x00\xa1\x00\x58\x00\xa1\x00\xa1\x00\x6b\x00\xa1\x00\x59\x00\xa1\x00\x43\x00\xa1\x00\xa1\x00\xa1\x00\xa1\x00\x0e\x00\xa7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa7\x00\x00\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb2\x00\xb2\x00\x8f\x00\x9f\x00\xb2\x00\xb2\x00\xb2\x00\xb2\x00\xb2\x00\xb2\x00\xb2\x00\xb2\x00\xb2\x00\xb2\x00\xb2\x00\xb2\x00\xb2\x00\xb2\x00\x93\x00\xb2\x00\xb2\x00\xb2\x00\xb2\x00\xb2\x00\xb2\x00\xb2\x00\x14\x00\x00\x00\x17\x00\xb7\x00\xb7\x00\x90\x00\xa0\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\x94\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\x16\x00\xa2\x00\x17\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x18\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x24\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x19\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x18\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x1b\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x1c\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\x7b\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x1d\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\x18\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x1f\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x20\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\x21\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x2d\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x22\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x18\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x18\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x25\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x39\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x00\x00\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\x27\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x2a\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\x2b\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x28\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x28\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x2e\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x2f\x00\xa2\x00\xa4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x00\x00\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\x29\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x00\x00\x00\xa4\x00\x31\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x00\x00\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\x32\x00\xa4\x00\xa4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x00\x00\x00\x33\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x28\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x35\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x37\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x38\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x3a\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x3b\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x3c\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\x3d\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x48\x00\xa2\x00\xa2\x00\xa2\x00\x3e\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x47\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x3a\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x40\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x41\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\x7b\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x42\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\x3a\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x44\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x45\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\x46\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x66\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x3a\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x3a\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\x49\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x4a\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x4b\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x4c\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x4d\x00\xa2\x00\x57\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x4e\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x50\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\x51\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x52\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\x53\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x77\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x50\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x55\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x56\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x50\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x50\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x5a\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\x5b\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\x5c\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x5d\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x5e\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x5a\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\x60\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\x61\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x72\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x62\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x63\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\x5a\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x65\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x5a\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x67\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\x68\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x69\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x6a\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x6e\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6d\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x6c\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x6f\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x70\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\x71\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x77\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x78\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\x79\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\x75\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x7a\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb1\x00\x00\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb3\x00\x00\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb8\x00\x00\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb1\x00\x00\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb3\x00\x00\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\x87\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb8\x00\x00\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\x88\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb1\x00\x00\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb3\x00\x00\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\x89\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb8\x00\x00\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\x8a\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb1\x00\x00\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb3\x00\x00\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\x8b\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb8\x00\x00\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\x8c\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb1\x00\x00\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb3\x00\x00\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\x8d\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb8\x00\x00\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\x8e\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb1\x00\x00\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb3\x00\x00\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\x87\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb8\x00\x00\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\x88\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb1\x00\x00\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb3\x00\x00\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\x91\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb8\x00\x00\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\x92\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb1\x00\x00\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb3\x00\x00\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\x87\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb8\x00\x00\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\x88\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb1\x00\x00\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb3\x00\x00\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\x95\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb8\x00\x00\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\x96\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb1\x00\x00\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb3\x00\x00\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\x97\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb8\x00\x00\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\x98\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb1\x00\x00\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb3\x00\x00\x00\x99\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb8\x00\x00\x00\x9a\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb1\x00\x00\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb3\x00\x00\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\x9b\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb8\x00\x00\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\x9c\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb1\x00\x00\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb3\x00\x00\x00\x9d\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb8\x00\x00\x00\x9e\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x00\x00\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x00\x00\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa5\x00\xa5\x00\xa6\x00\xaa\x00\xaa\x00\xaa\x00\xaa\x00\xaa\x00\xaa\x00\xaa\x00\xaa\x00\xaa\x00\xaa\x00\xaa\x00\xaa\x00\xaa\x00\xaa\x00\xaa\x00\xaa\x00\xaa\x00\xaa\x00\xaa\x00\xaa\x00\xaa\x00\xaa\x00\xaa\x00\xaa\x00\xaa\x00\xaa\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xab\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa9\x00\xa9\x00\xa9\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\x00\x00\x00\x00\x00\x00\x00\x00\xab\x00\x00\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\x00\x00\x00\x00\x00\x00\x00\x00\xab\x00\x00\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xae\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xac\x00\x00\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\x00\x00\x00\x00\x00\x00\x00\x00\xae\x00\x00\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xac\x00\x00\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\x00\x00\x00\x00\x00\x00\x00\x00\xae\x00\x00\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xb0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb0\x00\x00\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb0\x00\x00\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb1\x00\x00\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb3\x00\x00\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb1\x00\x00\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb3\x00\x00\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb5\x00\x00\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb5\x00\x00\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb4\x00\xb4\x00\xb4\x00\xb4\x00\xb4\x00\xb4\x00\xb4\x00\xb4\x00\xb4\x00\xb4\x00\xb4\x00\xb4\x00\xb4\x00\xb4\x00\xb4\x00\xb4\x00\xb4\x00\xb4\x00\xb4\x00\xb4\x00\xb4\x00\xb4\x00\xb4\x00\xb4\x00\xb4\x00\xb4\x00\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb8\x00\x00\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb8\x00\x00\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"#++alex_check :: AlexAddr+alex_check = AlexA# "\xff\xff\x0a\x00\x0a\x00\x0a\x00\x0d\x00\x0d\x00\x0d\x00\x0a\x00\x0a\x00\x0a\x00\x0d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x0a\x00\x2d\x00\x20\x00\x20\x00\x20\x00\x2d\x00\x2d\x00\x0a\x00\x20\x00\x2d\x00\x28\x00\x29\x00\xff\xff\x20\x00\x2c\x00\x2d\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\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\xff\xff\x5d\x00\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\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\x0a\x00\xff\xff\x0a\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7d\x00\x20\x00\xff\xff\xff\xff\xff\xff\x22\x00\xff\xff\x7d\x00\xff\xff\x28\x00\x29\x00\xff\xff\xff\xff\x2c\x00\x2d\x00\x2e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3a\x00\xff\xff\x3c\x00\x3d\x00\xff\xff\xff\xff\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\xff\xff\x5d\x00\x5c\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x22\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x22\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\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\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\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\xff\xff\x7d\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\x27\x00\x7d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\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\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\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\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\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\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\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\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\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\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\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\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\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\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\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\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\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\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\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\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\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\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\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\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\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\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\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\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\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\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x0a\x00\x0a\x00\x0a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x22\x00\x22\x00\x22\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\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\x5c\x00\x5c\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\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\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\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\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\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\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\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\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\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\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"#++alex_deflt :: AlexAddr+alex_deflt = AlexA# "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x08\x00\x08\x00\xff\xff\xff\xff\xff\xff\x0d\x00\x0d\x00\xff\xff\xff\xff\x0d\x00\xff\xff\x13\x00\x13\x00\xff\xff\x13\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"#++alex_accept = listArray (0::Int,184) [[],[],[],[],[],[(AlexAccSkip)],[(AlexAccSkip)],[(AlexAccSkip)],[(AlexAccSkip)],[],[],[(AlexAccSkip)],[],[],[],[(AlexAcc (alex_action_4))],[],[(AlexAcc (alex_action_3))],[],[],[(AlexAcc (alex_action_4))],[],[(AlexAcc (alex_action_4))],[(AlexAcc (alex_action_5))],[(AlexAcc (alex_action_6))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_20))],[(AlexAcc (alex_action_20))],[(AlexAcc (alex_action_20))],[(AlexAcc (alex_action_20))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_8))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_9))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_10))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_11))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_12))],[(AlexAcc (alex_action_12))],[(AlexAcc (alex_action_12))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_13))],[(AlexAcc (alex_action_13))],[(AlexAcc (alex_action_13))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_14))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_15))],[(AlexAcc (alex_action_15))],[(AlexAcc (alex_action_15))],[(AlexAcc (alex_action_15))],[(AlexAcc (alex_action_15))],[(AlexAcc (alex_action_16))],[(AlexAcc (alex_action_16))],[],[(AlexAcc (alex_action_17))],[(AlexAcc (alex_action_17))],[(AlexAcc (alex_action_17))],[(AlexAcc (alex_action_18))],[(AlexAcc (alex_action_18))],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_20))],[(AlexAcc (alex_action_20))],[(AlexAcc (alex_action_21))],[(AlexAcc (alex_action_21))],[],[],[],[(AlexAcc (alex_action_22))],[(AlexAcc (alex_action_22))],[],[],[],[(AlexAcc (alex_action_23))],[(AlexAcc (alex_action_23))],[],[],[],[(AlexAcc (alex_action_24))],[(AlexAcc (alex_action_24))],[],[],[]]+{-# LINE 52 "src/Scanner.x" #-}+
+tokenize :: Opts -> FilePath -> String -> [Token]
+tokenize opts path str
+  = merge $ scanTks opts [(Pos 1 0 path, 0)] (Pos 1 1 path, str)
+
+merge []            = []
+merge r@[_]         = r
+merge (ValToken TkTextln s1 p : ValToken TkTextln s2 _ : r)
+  = merge (ValToken TkTextln (s1 ++ s2) p : r)
+merge (t : r)       = t : merge r
+
+type AlexInput = (Pos, String)  -- current position, current string
+
+alexGetChar :: AlexInput -> Maybe (Char,AlexInput)
+alexGetChar (_, [])     = Nothing
+alexGetChar (p, c : cs) = Just (c, (adv p c, cs))
+
+alexInputPrevChar :: AlexInput -> Char
+alexInputPrevChar = error "alexInputPrevChar: should not be used."
+
+type Ctx = (Pos, Int)  -- context start position, start code
+type CtxStack = [Ctx]
+
+scanTks :: Opts -> CtxStack -> AlexInput -> [Token]
+scanTks opts st inp@(pos,str)
+  = let (sc,st',tks) = unwind pos str st []
+    in tks ++
+       case alexScan inp sc of
+         AlexEOF                -> unwindAll st' pos
+         AlexError _            -> let (Just (c, inp')) = alexGetChar inp
+                                       tk | sc == h || sc == j = valueToken TkTextln [c] pos
+                                          | otherwise          = errToken [c] pos
+                                   in tk : scanTks opts st' inp'
+         AlexSkip inp' _        -> scanTks opts st' inp'
+         AlexToken inp' len act -> let tk = act (take len str) pos
+                                   in tk : scanTks opts (push opts sc tk st') inp'
+
+push :: Opts -> Int -> Token -> CtxStack -> CtxStack
+push opts sc (Reserved k pos)
+  | sc == 0 && k == "{"          = ((noPos, n) :)
+  | sc == h && k == "{"          = ((noPos, n) :)
+  | sc == h && k == "}"          = tail
+  | sc == j && k == "{"          = ((noPos, j) :)
+  | sc == j && k == "}"          = tail
+  | sc == 0 && k == "itf"        = ((pos, 0) :)
+  | sc == 0 && k == "data"       = ((pos, 0) :)
+  | sc /= a && k == "sem"        = ((pos, a) :)
+  | sc /= a && k == "datasem"    = ((pos, a) :)
+  | sc /= a && k == "cosem"      = ((pos, a) :)
+  | sc /= a && k == "detach"     = ((pos, a) :)
+  | sc == a && k == "="          = ((pos, n) :)
+  | sc == a && k == "<-"         = ((pos, n) :)
+  | sc == 0 && k == "::"         = ((pos, n) :)
+  | sc == a && k == "::"         = ((pos, n) :)
+  | sc == a && k == "monad"      = ((pos, n) :)
+  | sc == a && k == "visit"      = ((pos, a) :)
+  | sc == a && k == "internal"   = ((pos, a) :)
+  | sc == a && k == "clause"     = ((pos, a) :)
+  where
+    n | genHaskell opts = h
+      | genJs opts      = j
+      | otherwise       = error "target language unspecified"
+push _ _ _ = id
+
+unwind :: Pos -> String -> CtxStack -> [Token] -> (Int, CtxStack, [Token])
+unwind p str st@((p',c) : st') acc
+  |    (cp == cp' &&
+         (null str || (not $ isSpace $ head str)) )
+    || (cp < cp' &&
+         ( any (not . isSpace) $
+             take (cp' - cp) str) ) = unwind p str st' (reserved "end" p : acc)
+  | otherwise                       = (c, st, acc)
+  where cp  = column p
+        cp' = column p'
+
+unwindAll :: CtxStack -> Pos -> [Token]
+unwindAll st pos
+  = map (const (reserved "end" pos)) (init st)
+
+ppTokens :: [Token] -> PP_Doc
+ppTokens = vlist . map ppToken
+
+ppToken :: Token -> PP_Doc
+ppToken (Reserved str pos)    = "keyword " >|< show str >|< " at " >|< ppPos pos
+ppToken (ValToken tp val pos) = show tp >|< " " >|< val >|< " at " >|< ppPos pos
+
+ppPos :: Pos -> PP_Doc
+ppPos (Pos l c _) = show l >|< "," >|< show c
+++a,h,j :: Int+a = 1+h = 2+j = 3+alex_action_3 =  valueToken TkTextln +alex_action_4 =  reserved +alex_action_5 =  reserved +alex_action_6 =  reserved +alex_action_7 =  reserved +alex_action_8 =  reserved +alex_action_9 =  reserved +alex_action_10 =  reserved +alex_action_11 =  reserved +alex_action_12 =  reserved +alex_action_13 =  reserved +alex_action_14 =  reserved +alex_action_15 =  reserved +alex_action_16 =  reserved +alex_action_17 =  reserved +alex_action_18 =  reserved +alex_action_19 =  valueToken TkVarid  +alex_action_20 =  valueToken TkConid  +alex_action_21 =  valueToken TkTextln +alex_action_22 =  valueToken TkTextln +alex_action_23 =  valueToken TkVarid  +alex_action_24 =  valueToken TkVarid  +{-# 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 37 "templates/GenericTemplate.hs" #-}++{-# LINE 47 "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
+ dist/build/ruler-core/ruler-core-tmp/Transform.hs view

file too large to diff

+ examples/Alias.rul view
@@ -0,0 +1,47 @@+{+{-# LANGUAGE BangPatterns #-}+module Alias where++import Control.Monad.Error+}++type ListX : [X]++data X+  con C++itf X+  visit v+    inh ast :: X+    syn x :: Int++datasem X+  clause C+    lhs.x = 1++itf ListX+  visit v+    inh ast :: ListX+    syn x :: Int++datasem ListX+  clause Cons+    invoke v of hd+    invoke v of tl+    lhs.x = hd.x + tl.x+  clause Nil+    lhs.x = 0++{+test :: ListX -> IO Int+test xs = do+  let inh = Inh_ListX_v { ast_Inh_ListX = xs }+  syn <- invoke_ListX_v dnt_ListX inh+  let x = x_Syn_ListX syn+  return x++main :: IO ()+main = do let list = [X_C,X_C,X_C]+          x <- test list+          putStrLn $ show x+}
+ examples/ConMatch.rul view
@@ -0,0 +1,22 @@+{+{-# LANGUAGE BangPatterns #-}+module Eval where++import Control.Monad.Error+}++itf I+  visit v+    syn x :: Int+    +data D+  con C+    y :: Int++{+t = sem t : I monad IO+      visit v+        clause c+          match D.C@m = D_C 3+          lhs.x = m.y+}
+ examples/CycRepmin.rul view
@@ -0,0 +1,63 @@+{+{-# LANGUAGE BangPatterns #-}+module CycRepmin where++import Control.Monad.Error+}++data Tree+  con Leaf+    x :: Int+  con Bin+    l : Tree+    r : Tree+  ext Show++data Root+  con Root+    t : Tree++itf Root+  visit dispatch+    inh ast :: Root+    syn t :: Tree++itf Tree+  visit dispatch+    inh ast :: Tree+  visit compdist cyclic+    inh g :: Int+    syn m :: Int+  visit result+    syn t :: Tree++datasem Root monad IO+  cyclic  -- reminder: turn on cycle checking+  clause Root+    t.g   = t.m+    lhs.t = t.t++datasem Tree monad IO+  clause Leaf+    lhs.t = Tree_Leaf lhs.g+    lhs.m = loc.x++  clause Bin+    default g = last+    visit compdist+      lhs.m = l.m `min` r.m+      lhs.t = Tree_Bin l.t r.t++{+test :: Tree -> IO Tree+test t = do+  let inh = Inh_Root_dispatch { ast_Inh_Root = Root_Root t }+  syn <- invoke_Root_dispatch dnt_Root inh+  let t = t_Syn_Root syn+  return t++main :: IO ()+main = do let exp = Tree_Bin (Tree_Leaf 1) (Tree_Bin (Tree_Leaf 2) (Tree_Leaf 3))+          x <- test exp+          putStrLn $ show x+}
+ examples/Eval.rul view
@@ -0,0 +1,56 @@+{+{-# LANGUAGE BangPatterns #-}+module Eval where++import Control.Monad.Error+}++data Expr+  con Int+    x :: Int+  con Plus+    l :: Expr+    r :: Expr++itf Eval+  visit eval+    inh e :: Expr+    syn val :: Int++{+eval = sem eval : Eval monad IO+         visit eval+           clause int+             match Expr.Int@loc = lhs.e+             lhs.val = loc.x++           clause plus+             attach m : Decon_Expr_Plus = mkDecon_Expr_Plus+             m.data = lhs.e+             invoke deconstruct of m++             child l : Eval = eval+             child r : Eval = eval++             l.e = m.l+             r.e = m.r++             invoke eval of l+             invoke eval of r++             lhs.val = l.val + r.val+}++{+test :: Expr -> IO Int+test exp = do+  let inh = Inh_Eval_eval { e_Inh_Eval = exp }+  syn <- invoke_Eval_eval eval inh+  let x = val_Syn_Eval syn+  return x++main :: IO ()+main = do let exp = Expr_Plus (Expr_Int 1) (Expr_Plus (Expr_Int 2) (Expr_Int 3))+          x <- test exp+          putStrLn $ show x+}
+ examples/EvalAsAg.rul view
@@ -0,0 +1,42 @@+{+{-# LANGUAGE BangPatterns #-}+module Eval where++import Control.Monad.Error+}++data Expr+  con Int+    x :: Int+  con Plus+    l : Expr+    r : Expr++itf Expr+  visit eval+    inh ast :: Expr+    syn val :: Int++datasem Expr monad IO+  clause Int+    loc.z = 3+    lhs.val = loc.x+  clause Plus+    invoke eval of l+    invoke eval of r+    lhs.val = l.val + r.val+++{+test :: Expr -> IO Int+test exp = do+  let inh = Inh_Expr_eval { ast_Inh_Expr = exp }+  syn <- invoke_Expr_eval dnt_Expr inh+  let x = val_Syn_Expr syn+  return x++main :: IO ()+main = do let exp = Expr_Plus (Expr_Int 1) (Expr_Plus (Expr_Int 2) (Expr_Int 3))+          x <- test exp+          putStrLn $ show x+}
+ examples/HelloWorld.rul view
@@ -0,0 +1,23 @@+{+{-# LANGUAGE BangPatterns #-}+module HelloWorld where++import Control.Monad.Error+}++itf H+  visit v1+    syn xs :: String++{+hello = sem hello : H monad Either String+          visit v1+            clause c1+              match True = False+              lhs.xs = "Hello World"++hello2 = sem hello2 : H monad Either String+           visit v1+             clause c3+               lhs.xs = "Booh!"+}
+ examples/Internal.rul view
@@ -0,0 +1,46 @@+{+{-# LANGUAGE BangPatterns #-}+module Internal where++import Control.Monad.Error+}++data D+  con C++itf D+  visit dispatch+    inh ast :: D+    syn x :: Int+    syn z :: Int++{+foo =+ sem foo : D monad IO+  visit dispatch+   clause C+    internal bla   -- internal clause: conditionally compute attributes+      loc.p = 9+      lhs.z = loc.p+      clause other1+        match False = True  -- this clause will fail+        loc.q = True+        lhs.x = loc.p + const 3 lhs.ast+      clause other2+        lhs.x = 42          -- the result of this internal clause is returned+}++{+test :: D -> IO (Int, Int)+test d = do+  let inh = Inh_D_dispatch { ast_Inh_D = d }+  syn <- invoke_D_dispatch foo inh+  let x = x_Syn_D syn+  let z = z_Syn_D syn+  return (x,z)++main :: IO ()+main = do let d = D_C+          t <- test d+          putStrLn $ show t+}
+ examples/JsMenu.rul view
@@ -0,0 +1,131 @@+{+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"+"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">++<html>+<head>+<title>Visitor example</title>++<script type="text/javascript">+var eEval  = new Object();+var eAbort = new Object();++}++data Root+  con Root+    root : Menu++data Menu+  con Menu+    name :: +    cs : Menus++type Menus : [Menu]++itf Root+  visit perform+    inh ast ::++itf Menu+  visit gather+    inh ast     ::+    inh depth   ::+    syn gathMax ::+  visit layout+    inh finMax  ::+    inh count   ::+    syn count   ::++itf Menus+  visit gather+    inh ast     ::+    inh depth   ::+    syn gathMax ::+  visit layout+    inh finMax  ::+    inh count   ::+    syn count   ::++{+var  root = new Root_Root(+  new Menu_Menu("a", [+    new Menu_Menu("b", [+          new Menu_Menu("c", [])+       ,  new Menu_Menu("d", []) ]) ]));++function align(root, anchor) {+  datasem Root+    clause Root+      root:depth   = 0+      root:count   = 0+      root:finMax  = root:gathMax+      invoke layout of root++  datasem Menu+    clause Menu+      cs:finMax    = lhs:finMax+      cs:depth     = 1 + lhs:depth+      cs:count     = 1 + lhs:count+      lhs:count    = cs:count++      match loc:elem  = document.getElementById(loc:name)+      loc:offset      = lhs:depth * 20+      loc:width       = loc:offset + loc:elem.clientWidth+      lhs:gathMax     = Math.max(cs:gathMax, loc:width)++      visit layout+        match _     =  (function () {+                          loc:elem.style.left    = (anchor.offsetLeft + loc:offset) + "px";+                          loc:elem.style.top     = (anchor.offsetTop + lhs:count * 30) + "px";+                          loc:elem.style.width   = (lhs:finMax - loc:offset) + "px";+                          loc:elem.style.height  = 30 + "px";+                       }) ()++  datasem Menus+    default depth    = function(depths)  { return depths[depths.length-1]; }+    default finMax   = function(maxs)    { return maxs[maxs.length-1]; }+    default gathMax  = function(maxs)    { return Math.max.apply(Math, maxs); }+    default count    = function(counts)  { return counts[0]; }+    clause Cons+    clause Nil+  +  var inps = new Inh_Root_perform();+  inps.ast = root;+  dnt_Root()(inps);+}++</script>++<style type="text/css">+  #a { background-color: red; position: absolute; display: block; width: auto; }+  #b { background-color: green; position: absolute; display: block; width: auto; }+  #c { background-color: blue; position: absolute; display: block; width: auto; }+  #d { background-color: yellow; position: absolute; display: block; width: auto; }+</style>++</head>+<body onLoad="align(root, document.getElementById('anchor'));">+  +<div id="a">+  item a+</div>++<div id="b">+  very big item b+</div>++<div id="c">+  not so big c+</div>++<div id="d">+  tiny+</div>++<div id="anchor" style="position: absolute; display: block; left: 200px; right: 50px;">+</div>++</body>+</html>+}
+ examples/JsMenu2.rul view
@@ -0,0 +1,101 @@+data Menu+  con Menu+    name :: +    cs : Menus++type Menus : [Menu]++itf Root+  visit perform+    inh ast ::++itf Menu+  visit gather+    inh ast     ::+    syn gathMax ::+  visit layout+    inh count   ::+    syn count   ::++itf Menus+  visit gather+    inh ast     ::+    syn gathMax ::+  visit layout+    inh finMax  ::+    inh count   ::+    syn count   ::++{+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"+"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">++<html>+<head>+<title>Visitor example</title>++<script type="text/javascript">++var  root = new Root_Root(+  new Menu_Menu("a", [+    new Menu_Menu("b", [+          new Menu_Menu("c", [])+       ,  new Menu_Menu("d", []) ]) ]));++function align(root, anchor) {+  datasem Menu+    clause Menu+      cs:count     = lhs:count+1+      lhs:count    = cs:count+      lhs:gathMax  = cs:gathMax+      cs:finMax    = 1++  datasem Menus+    default gathMax  = function(maxs)    { return Math.max.apply(Math, maxs); }+    default finMax   = function(maxs)    { return maxs[maxs.length-1]; }+    default count    = function(counts)  { return counts[0]; }+    clause Cons+      hd:count = lhs:count+      -- tl:count = hd:count+      lhs:count = tl:count+    clause Nil++  var inhs  = new Inh_Root_perform();+  inhs.ast  = root+  eval_Root_perform(s_Root, inhs);+}++</script>++<style type="text/css">+  #a { background-color: red; position: absolute; display: block; width: auto; }+  #b { background-color: green; position: absolute; display: block; width: auto; }+  #c { background-color: blue; position: absolute; display: block; width: auto; }+  #d { background-color: yellow; position: absolute; display: block; width: auto; }+</style>++</head>+<body onLoad="align(root, document.getElementById('anchor'));">+  +<div id="a">+  item a+</div>++<div id="b">+  very big item b+</div>++<div id="c">+  not so big c+</div>++<div id="d">+  tiny+</div>++<div id="anchor" style="position: absolute; display: block; left: 200px; right: 50px;">+</div>++</body>+</html>+}
+ examples/RenameAttr.rul view
@@ -0,0 +1,40 @@+{+{-# LANGUAGE BangPatterns #-}+module RenameAttr where++import Control.Monad.Error+}++data X+  con X+    chld : Y+  con X2+    c1 : Y+    c2 : Y++data Y+  con Y++itf X+  visit v+    inh ast :: X+    syn x :: Int++itf Y+  visit v+    inh ast :: Y+    syn z :: Int++datasem X+  clause X+    rename chld z to x+    invoke v of chld+    lhs.x = chld.x+  clause X2+    rename c1 z to x+    rename c2 z to x+    default x = sum++datasem Y+  clause Y+    lhs.z = 3
+ examples/Repmin.rul view
@@ -0,0 +1,62 @@+{+{-# LANGUAGE BangPatterns #-}+module Repmin where++import Control.Monad.Error+}++data Tree+  con Leaf+    x :: Int+  con Bin+    l : Tree+    r : Tree+  ext Show++data Root+  con Root+    t : Tree++itf Root+  visit dispatch+    inh ast :: Root+    syn t :: Tree++itf Tree+  visit dispatch+    inh ast :: Tree+  visit compute+    syn m :: Int+  visit distribute+    inh g :: Int+  visit result+    syn t :: Tree++datasem Root monad IO+  clause Root+    t.g   = t.m+    lhs.t = t.t++datasem Tree monad IO+  clause Leaf+    lhs.t = Tree_Leaf lhs.g+    lhs.m = loc.x++  clause Bin+    default g = last+    lhs.t = Tree_Bin l.t r.t+    lhs.m = l.m `min` r.m++{+test :: Tree -> IO Tree+test t = do+  let inh = Inh_Root_dispatch { ast_Inh_Root = Root_Root t }+  syn <- invoke_Root_dispatch dnt_Root inh+  let t = t_Syn_Root syn+  return t++main :: IO ()+main = do let exp = Tree_Bin (Tree_Leaf 1) (Tree_Bin (Tree_Leaf 2) (Tree_Leaf 3))+          x <- test exp+          putStrLn $ show x+}
+ examples/Sum.rul view
@@ -0,0 +1,40 @@+{+{-# LANGUAGE BangPatterns #-}+module Sum where++import Control.Monad.Error+}++itf S+  visit v1+    inh l :: [Int]+  visit v2+    syn s :: Int++{+sum' = sem sum : S monad Either String+         visit v1+           clause sumNil+             lhs.s = 0+             match [] = lhs.l++           clause sumCons+             tl.l = loc.xs+             lhs.s = loc.x + tl.s+             match (loc.x : loc.xs) = lhs.l+             attach v1 of tl : S = sum'+}++{+test :: [Int] -> Either String Int+test xs = do+  let inh1 = Inh_S_v1 { l_Inh_S = xs }+  syn1 <- invoke_S_v1 sum' inh1+  let inh2 = Inh_S_v2 { }+  syn2 <- invoke_S_v2 (next_S_v1 syn1) inh2+  let s = s_Syn_S syn2+  return s++main :: IO ()+main = putStrLn (show (test [1..100000]))+}
+ examples/TypedEval.rul view
@@ -0,0 +1,27 @@+{+{-# LANGUAGE BangPatterns #-}+module Eval where++import Control.Monad.Error+}++data Expr+  var a+  con Int+    constr a ~ Int+    x :: Int++itf Eval+  var a+  visit eval+    inh e :: Expr a+    syn val :: a++{+eval = sem eval : Eval+         inst m :: IO+         visit eval+           clause int+             match Expr.Int@loc = lhs.e+             lhs.val = loc.x+}
+ examples/Unknown.rul view
@@ -0,0 +1,360 @@+data TyQu
+  con TyForall
+    
+data TyExpr
+  con Con
+    nm        :: HsName
+  con App
+    func      :: TyExpr
+    arg       :: TyExpr
+  con AppTop
+    tyExpr    :: TyExpr
+  con Parens
+    tyExpr    :: TyExpr
+  con Ann
+    ann       :: TyExprAnn
+    tyExpr    :: TyExpr
+  con Wild
+  con Mono
+  con Var
+    nm        :: HsName
+  con VarWild
+    mm        :: HsName
+  con Quant
+    qu        :: TyQu
+    tyVar     :: HsName
+    tyExpr    :: TyExpr
+  con Forall
+    qu        :: TyQu
+    tyVar     :: [HsName]
+    tyExpr    :: TyExpr    
+  con Row
+    rowTyExpr :: RowTyExpr
+    
+data TyVar
+  con Var
+    nm      :: HsName
+    
+type TyVars : [TyVar]
+    
+-- Type Index (a1 >= TyQuantifiedScheme)
+data TyIndex
+  con Group
+    varnm   :: HsName
+    bounds  :: TyQuantifiedScheme
+    
+-- -- Quantified type scheme
+-- data TyQuantifiedScheme
+  -- con Quant
+    -- tyIndex  :: TyIndex
+    -- tyScheme :: TyScheme
+  -- con Bottom
+   
+-- Type Schemes
+data TyScheme
+  con Quant
+    subst    :: Scheme
+    tyExpr   :: TyScheme
+  con SystemF
+    tyExpr   :: TyExpr
+  con Bottom
+  -- These next two are just used internally
+  con Sugar
+     prefix  :: Prefix
+     tyExpr  :: TyScheme
+  con Forall
+     tyQuant :: [HsName]
+     tyExpr  :: TyScheme
+
+-- A simple tybound e.f. (a >= phi)
+data Scheme
+  con Simple
+    varnm  :: HsName
+    bounds :: TyScheme
+  
+-- Mono type
+data TyMono 
+  con Var 
+    nm      :: HsName
+  con App
+    func    :: TyMono
+    arg     :: TyMono
+  con Con
+    nm      :: HsName
+  con AppTop
+    tyMono  :: TyMono
+    
+-- Unqualified typed
+data TyPoly
+  con Var 
+    nm      :: HsName
+  con App
+    func    :: TyPoly
+    arg     :: TyPoly
+  con Con
+    nm      :: HsName
+  con SystemF
+    tyExpr  :: TyExpr
+    
+data DataFieldExpr
+  con Upd
+    dataFieldExpr  :  DataFieldExpr
+    nm             :: HsName
+    expr           :  Expr
+  con Con
+    nm             :: HsName
+  con Expr
+    expr           :  Expr
+   
+data DataFieldPatExpr
+  con Ext
+    dataFieldPatExpr  :: DataFieldPatExpr
+    nm                :: HsName
+    patExpr           :: PatExpr
+  con Con
+    nm                :: HsName
+    
+data RecExpr
+  con Empty
+  con Ext
+    recExpr     :  RecExpr
+    mbNm        :: (Maybe HsName)
+    expr        :  Expr
+  con Upd
+    recExpr     :  RecExpr
+    mbNm        :: HsName
+    expr        :  Expr
+  con Expr
+    expr        :  Expr
+    
+data RecPatExpr
+  con Empty
+  con Ext
+    recPatExpr  :  RecPatExpr
+    mbNm        :: (Maybe HsName)
+    patExpr     :: PatExpr
+  con Expr
+    patExpr     :: PatExpr
+    
+data RowTyExpr
+  con Empty
+  con Ext
+    rowTyExpr       :: RowTyExpr
+    mbNm            :: (Maybe HsName)
+    tyExpr          :: TyExpr
+    
+data KiExpr
+  con Con
+    nm       :: HsName
+  con Var
+    nm       :: HsName
+  con App
+    func     :: KiExpr
+    arg      :: KiExpr
+  con AppTop
+    kiExpr   :: KiExpr
+  con Parens
+    kiExpr   :: KiExpr
+  con Ann
+    ann      :: KiExprAnn
+    kiExpr   :: KiExpr
+    
+data Expr
+  con IConst
+    int           :: Int
+  con CConst
+    char          :: Char
+  con Con
+    nm            :: HsName
+  con Var
+    nm            :: HsName
+  con App
+    func          :  Expr
+    arg           :  Expr
+  con Let
+    isStrict      :: Bool
+    decls         :  Decls
+    body          :  Expr
+  con Lam
+    arg           :: PatExpr
+    body          :  Expr
+  con AppTop
+    expr          :  Expr
+  con Parens
+    expr          :  Expr
+  con TypeAs
+    tyExpr        :: TyExpr
+    expr          :  Expr
+  con Ann
+    ann           :: ExprAnn
+    expr          :  Expr
+  con AppImpred
+    func          :  Expr
+    arg           :  Expr
+  con SConst 
+    str           :: String
+  con Case
+    expr          :  Expr
+    alts          :: CaseAlts
+    mbCaseIds     :: (Maybe UIDS)
+    caseFailS     :: UIDS
+    isTupOfArg    :: Bool
+  con DataFields
+    dataFieldExpr :: DataFieldExpr
+  con Rec
+    recExpr       :: RecExpr
+  con Sel
+    expr          :  Expr
+    lbl           :: HsName
+  con Undefined
+  con CaseAltFail 
+    caseId        :: UID
+    
+data PatExpr
+  con IConst
+    int              :: Int
+  con CConst
+    char             :: Char
+  con Con
+    nm               :: HsName
+  con Var
+    nm               :: HsName
+  con VarAs
+    nm               :: HsName
+    patExpr          :: PatExpr
+  con App
+    func             :: PatExpr
+    arg              :: PatExpr
+  con AppTop
+    patExpr          :: PatExpr
+  con Parens
+    patExpr          :: PatExpr
+  con Ann
+    ann              :: PatExprAnn
+    patExpr          :: PatExpr
+  con TypeAs
+    tyExpr           :: TyExpr
+    patExpr          :: PatExpr
+  con SConst
+    str              :: String
+  con Rec
+    recPatExpr       :: RecPatExpr
+  con DataFields
+    dataFieldPatExpr :: DataFieldPatExpr
+  con Irrefutable
+    patExpr          :: PatExpr
+    
+data CaseAlt
+  con Pat
+    patExpr   :: PatExpr
+    expr      :  Expr
+
+type CaseAlts : [CaseAlt]
+    
+data DataConstr
+  con Constr
+    conNm      :: HsName
+    fields     :  DataFields
+    
+type DataConstrs : [DataConstr]
+
+data DataField
+  con Field
+    mbLabels     :: (Maybe [HsName])
+    tyExpr       :: TyExpr
+    
+type DataFields : [DataField]
+   
+data ExprAnn
+  con Empty
+  
+data TyExprAnn
+  con Empty
+
+data PatExprAnn
+  con Empty
+  
+data KiExprAnn
+  con Empty
+  
+data Decl
+  con TySig
+    nm         :: HsName
+    tyExpr     :: TyExpr
+  con Val
+    patExpr    :: PatExpr
+    expr       :  Expr
+  con Data
+    isNewType  :: Bool
+    tyNm       :: HsName
+    tyVars     :: TyVars
+    constrs    :: DataConstrs
+  con KiSig
+    nm         :: HsName
+    kiExpr     :: KiExpr
+  con FFI
+    callconv   :: FFIWay
+    safety     :: String
+    impEnt     :: String
+    nm         :: HsName
+    tyExpr     :: TyExpr
+  
+type TyExprs : [TyExpr]
+type Decls   : [Decl]
+  
+itf Unify
+  visit unify
+    inh pre  :: Prefix
+    inh exp1 :: TyExpr
+    inh exp2 :: TyExpr
+    inh frs  :: Int
+    syn pre  :: Prefix
+    syn sub  :: Env
+    syn frs  :: Int
+
+itf Subsume
+  visit subsume
+    inh pre  :: Prefix
+    inh exp  :: TyScheme
+    inh ty   :: TyScheme
+    inh frs  :: Int
+    syn pre  :: Prefix
+    syn sub  :: Env
+    syn frs  :: Int
+
+itf UnifyScheme
+  visit unifyScheme
+    inh pre  :: Prefix
+    inh ty1  :: TyScheme
+    inh ty2  :: TyScheme
+    inh frs  :: Int
+    syn pre  :: Prefix
+    syn sub  :: Env
+    syn ty   :: TyScheme
+    syn frs  :: Int
+
+{
+unifyScheme = sem unifyScheme : UnifyScheme monad IO
+                visit unifyScheme
+                  default? pre = last
+                  default? frs = last
+                  default? sub = const empty
+                  clause Main_unifyScheme
+                    loc.nfTy = isNf lhs.ty1
+                    loc.nfTs = isNf lhs.ty2
+                    loc.nf   = True -- loc.nfTy && loc.nfTs
+                    internal nf_check
+                        loc.b1 = isBottom lhs.ty1
+                        loc.b2 = isBottom lhs.ty2
+                        clause s_subsume
+                          match True       = loc.nf
+                          internal bot_check
+                            clause first_bottom
+                                match True = loc.b1
+                                (loc.q, loc.tyx) = splitQuant lhs.ty2
+                                lhs.ty     = nf lhs.ty2 -- loc.tyx
+                                lhs.pre    = lhs.pre -- munion loc.q lhs.pre
+                        clause f_subsume
+                          match False                 = loc.nf
+                          lhs.ty = error "unifyScheme failure, ty1 or ty2 is not in normal form"
+}
+ ruler-core.cabal view
@@ -0,0 +1,20 @@+cabal-version: >=1.6
+build-type: Custom
+name: ruler-core
+version: 1.0
+license: LGPL
+maintainer: Arie Middelkoop <ariem@cs.uu.nl>
+homepage: http://www.cs.uu.nl/wiki/HUT/WebHome
+description: Ruler-core Attribute Grammar
+category: Development
+stability: Experimental
+copyright: Arie Middelkoop
+extra-source-files: README, uuagc_options, src/AstAG.ag, src/Ast.ag, src/TargetHaskell.ag, src/TargetGraph.ag, src/TargetJs.ag, examples/*.rul
+
+executable ruler-core
+  build-depends: base >= 4, base < 5, uulib, uuagc>=0.9.26, filepath, directory, containers, array, mtl, fgl
+  build-depends: haskell98
+  main-is: Main.hs
+  hs-source-dirs: src
+  other-modules:
+    Scanner, Parser, Opts, Ast, Transform, Errs, Env, DepAnalysis, Pretty, Common
+ src/Ast.ag view
@@ -0,0 +1,10 @@+MODULE {Ast} {} {}++PRAGMA genlinepragmas++INCLUDE "AstAG.ag"++imports+{+import Common+}
+ src/AstAG.ag view
@@ -0,0 +1,334 @@+DATA Program+  | Program+      blocks : BlocksTop++DATA BlocksTop+  | Top+      blocks : Blocks+  | None++TYPE Blocks = [Block]++DATA Block+  | Itf+      itf : Itf+  | Data+      data : Data+  | Type+      type : Type+  | Section+      code : Code+  | Item+      name : Ident+      item : Item+  | DataSem+      sem  : DataSem++DATA Itf+  | Itf+      pos    : Pos+      name   : Ident+      vars   : Vars+      visits : ItfVisits++TYPE ItfVisits = [ItfVisit]++DATA ItfVisit+  | Visit+      pos    : Pos+      name   : Ident+      cyclic : Bool+      vars   : Vars+      attrs  : Attrs++TYPE Attrs = [Attr]++DATA Attr+  | Inh+      name : Ident+      type : String+  | Syn+      name : Ident+      type : String++DATA Data+  | Data+      pos    : Pos+      name   : Ident+      vars   : Vars+      cons   : Cons+      exts   : Exts++TYPE Vars = [Var]++DATA Var+  | Var+      name   : Ident++TYPE Exts = [Ext]++DATA Ext+  | Ext+      name   : Ident++TYPE Cons = [Con]++DATA Con+  | Con+      pos    : Pos+      name   : Ident+      vars   : Vars+      fields : Fields++TYPE Fields = [Field]++DATA Field+  | Field+      name       : Ident+      type       : FieldType++DATA FieldType+  | Term     type : String+  | Nonterm  name : Ident++DATA Type+  | Alias+      pos    : Pos+      name   : Ident+      type   : AliasType+      vars   : Vars++DATA AliasType+  | Prod   fields : {[Ident]}+  | List   type   : Ident+  | Maybe  type   : Ident++DATA DataSem+  | Sem+      pos     : Pos+      tp      : Ident+      vars    : Vars+      mbMonad : {Maybe String}+      cyclic  : Bool+      stmts   : {Stmts}+      clauses : ClausesTop++TYPE SemCons = [SemCon]++DATA SemCon+  | Con+      pos     : Pos+      name    : Ident+      fields  : SemFields++TYPE SemFields = [SemField]++DATA SemField+  | Field+      pos     : Pos+      name    : Ident+      type    : {Either Ident String}++DATA Code+  | Code+      items : Items++TYPE MaybeBoundCode = MAYBE BoundCode++DATA BoundCode+  | Code+      bind : Bind+      pos  : Pos+      code : Code++TYPE Items = [Item]++DATA Item+  | Plain+      pos      : Pos+      txt      : String+  | Attr+      pos      : Pos+      child    : Ident+      name     : Ident+  | Sem+      pos      : Pos+      name     : Ident+      tp       : Ident+      vars     : Vars+      mbMonad  : {Maybe String}+      first    : SemVisit+  | CoSem+      pos      : Pos+      name     : Ident+      tp       : Ident+      visit    : Ident+      vars     : Vars+      mbMonad  : {Maybe String}+      first    : SemVisit+  | DataSem+      sem      : DataSem+  | Detach  -- requires visits up to but not including this visit to be invoked+      pos      : Pos+      visit    : Ident+      name     : Ident+  | Construct+      pos      : Pos+      data     : Ident+      con      : Ident+      fields   : ExprFields+  | Brackets+      pos      : Pos+      items    : Items+      posEnd   : Pos++TYPE ExprFields = [ExprField]++DATA ExprField+  | Field+      name  : Ident+      code  : Code++DATA SemVisit+  | Visit+      pos      : Pos+      name     : Ident+      cyclic   : Bool+      attrs    : VisitAttrs+      stmts    : Stmts+      clauses  : ClausesTop+  | Internal+      pos      : Pos+      name     : Ident+      cyclic   : Bool+      stmts    : Stmts+      clauses  : ClausesTop+  | Impl+  | Prependable  -- maybe prepended by other visits+      pos      : Pos+      name     : Ident+      actual   : {SemVisit}+  | End++TYPE VisitAttrs = [VisitAttr]++DATA VisitAttr+  | Chn+      name  : Ident+      type  : String++DATA ClausesTop+  | Top+      clauses : Clauses+  | Impl+      clauses : {Clauses}++TYPE Clauses = [Clause]++DATA Clause+  | Clause+      pos     : Pos+      name    : Ident+      stmts   : Stmts+      next    : SemVisit++TYPE Stmts = [Stmt]++DATA Stmt+  | Eval+      mode    : Mode+      pat     : Pat+      code    : BoundCode+  | Attach+      pos     : Pos+      mbVisit : {Maybe Ident}+      name    : Ident+      type    : Ident+      code    : MaybeBoundCode+  | Invoke+      pos     : Pos+      visit   : Ident+      name    : Ident+      code    : MaybeBoundCode+  | Default+      allowEmpty : Bool+      pos        : Pos+      name       : Ident+      mbCode     : MaybeBoundCode+  | Rename+      pos        : Pos+      child      : Ident+      subst      : Renames++TYPE Renames = [Rename]+DATA Rename | Rename+  source : Ident+  dest   : Ident++DATA Mode+  | Match+  | Assert++DATA Bind+  | Fun+  | Monadic++TYPE Pats = [Pat]++DATA Pat+  | Con+      name   : Ident+      pats   : Pats+  | AttrCon+      con    : Ident+      name   : Ident+      dt     : Ident+  | Attr+      child  : Ident+      name   : Ident+  | Tup+      pats   : Pats+  | List+      pats   : Pats+  | Cons+      hd     : Pat+      tl     : Pat+  | Underscore+      pos    : Pos++DATA AttrTypePat+  | VisLocal+  | ProdLocal+  | Lhs+  | Child+  | Visit++DATA AttrTypeCode+  | VisLocal+  | ProdLocal+  | Lhs+  | Child+  | Visit++TYPE ImplStmts = [ImplStmt]++DATA ImplStmt+  | Invoke+      pos        : Pos+      child      : Ident+      visit      : Ident+      itf        : Ident+  | DefaultChild+      pos        : Pos+      allowEmpty : Bool+      child      : Ident+      name       : Ident+      mbCodeRef  : {Maybe Int}+  | DefaultSyn+      pos        : Pos+      allowEmpty : Bool+      name       : Ident+      mbCodeRef  : {Maybe Int}+  | DefaultVisLocal+      pos        : Pos+      name       : Ident
+ src/Common.hs view
@@ -0,0 +1,134 @@+module Common+  ( Ident(..), identName, identPos, ident, explainIdent, explainPos, QIdent+  , module UU.Scanner.Position+  , DepItem(..), Reason(..)+  )+  where++import UU.Scanner.Position+import Data.Map(Map)+import qualified Data.Map as Map+++--+-- Identifiers+--++data Ident+  = Ident String Pos++identName :: Ident -> String+identName (Ident nm _) = nm++identPos :: Ident -> Pos+identPos (Ident _ pos) = pos++ident :: String -> Ident+ident nm = Ident nm noPos++instance Show Ident where+  show (Ident nm _) = nm++instance Eq Ident where+  (Ident nmA _) == (Ident nmB _) = nmA == nmB++instance Ord Ident where+  compare (Ident nmA _) (Ident nmB _) = compare nmA nmB++explainIdent :: Ident -> String+explainIdent ident = show ident ++ " {" ++ explainPos (identPos ident) ++ "}"++explainPos :: Pos -> String+explainPos (Pos l c file) = file ++ ":" ++ show l ++ "," ++ show c++--+-- Qualified Identifiers+--++type QIdent = [Ident]+++--+-- DepItems+--++data DepItem+  = DepMatch      !Int     -- occ id+  | DepAssert     !Int     -- occ id+  | DepDefault    !Int     -- code id+  | DepAttach     !Int     -- occ id+  | DepInvoke     !QIdent  -- name : qual childname+  | DepVisStart   !QIdent  -- name : basename+  | DepVisEnd     !QIdent  -- name : basename+  | DepClause     !QIdent  -- name : basename (or: loc.basename)+  deriving (Eq, Show)++instance Ord DepItem where+  compare a b =+   let+    c (DepMatch n)    (DepMatch m)     = compare m n+    -- c (DepMatch n)    (DepAssert m)    = compare m n+    c (DepMatch _)    _                = GT+    -- c (DepAssert n)   (DepMatch m)     = compare m n+    c (DepAssert n)   (DepMatch m)     = LT+    c (DepAssert n)   (DepAssert m)    = compare m n+    c (DepAssert _)   _                = GT+    c (DepDefault _)  (DepMatch _)     = LT+    c (DepDefault _)  (DepAssert _)    = LT+    c (DepDefault n)  (DepDefault m)   = compare m n+    c (DepDefault _)  _                = GT+    c (DepAttach _)   (DepMatch _)     = LT+    c (DepAttach _)   (DepAssert _)    = LT+    c (DepAttach _)   (DepDefault _)   = LT+    c (DepAttach n)   (DepAttach m)    = compare m n+    c (DepAttach _)   _                = GT+    c (DepInvoke _)   (DepMatch _)     = LT+    c (DepInvoke _)   (DepAssert _)    = LT+    c (DepInvoke _)   (DepDefault _)   = LT+    c (DepInvoke _)   (DepAttach _)    = LT+    c (DepInvoke n)   (DepInvoke m)    = compareNames (reverse n) (reverse m)+    c (DepInvoke _)   _                = GT+    c (DepVisStart _) (DepMatch _)     = LT+    c (DepVisStart _) (DepAssert _)    = LT+    c (DepVisStart _) (DepDefault _)   = LT+    c (DepVisStart _) (DepAttach _)    = LT+    c (DepVisStart _) (DepInvoke _)    = LT+    c (DepVisStart n) (DepVisStart m)  = compareNames (reverse n) (reverse m)+    c (DepVisStart _) _                = GT+    c (DepVisEnd n)   (DepVisEnd m)    = compareNames (reverse n) (reverse m)+    c (DepVisEnd _)   _                = LT+    c (DepClause _)   (DepMatch _)     = LT+    c (DepClause _)   (DepAssert _)    = LT+    c (DepClause _)   (DepDefault _)   = LT+    c (DepClause _)   (DepAttach _)    = LT+    c (DepClause _)   (DepInvoke _)    = LT+    c (DepClause _)   (DepVisStart _)  = LT+    c (DepClause _)   (DepVisEnd _)    = GT+    c (DepClause n)   (DepClause m)    = compareNames (reverse n) (reverse m)+   in c b a++compareNames :: QIdent -> QIdent -> Ordering+compareNames [] [] = EQ+compareNames [] _  = GT+compareNames _  [] = LT+compareNames (x:xs) (y:ys)+  = case compare x y of+      LT -> GT+      GT -> LT+      EQ -> compareNames xs ys++-- Dependency reasons+data Reason = ReasonScopeVisit !Ident+            | ReasonScopeClause !Ident+            | ReasonScopeEnd !Ident+            | ReasonAttrReq !Ident !Ident+            | ReasonInvokeReq !Ident+            | ReasonChildReq !Ident+            | ReasonAttach !Ident !Ident+            | ReasonDefault !Ident+            | ReasonDetach !Ident !Ident+            | ReasonSink+            | ReasonAlloc+            | ReasonError+            | ReasonOrder+  deriving (Eq,Ord,Show)
+ src/DepAnalysis.hs view
@@ -0,0 +1,207 @@+module DepAnalysis (analyze) where++import Common+import Data.Graph+import Data.Tree+import Data.Maybe+import Control.Monad.State.Strict+import qualified Data.Map as Map+import Data.Map(Map)+import qualified Data.IntMap as IntMap+import Data.IntMap(IntMap)+import qualified Data.Set as Set+import Data.Set(Set)+import qualified Data.IntSet as IntSet+import Data.IntSet(IntSet)+import Data.List(partition, nub,sortBy,groupBy)+import Data.Array+import Data.Tree+import qualified Data.Graph.Inductive as G+++-- computes additional dependencies related to "late-as-possible" scheduling and avoidance of+-- cyclic visits+analyze :: [DepItem] -> [DepItem] -> [DepItem] -> Set DepItem -> [(Reason, DepItem, [DepItem])] -> [SCC DepItem]+analyze oSemStarts oStartVisits oEndVisits avoidVisits deps = map compToItem comps+  where+    comps = stronglyConnCompR $ total $ deps'++    compToItem (AcyclicSCC d) = AcyclicSCC (toItem d)+    compToItem (CyclicSCC ds) = CyclicSCC (map toItem ds)+    toItem (_,d,_) = d++    (gIn, vertexToKey, keyToVertex) = graphFromEdges (merge deps)+    gInRev = transposeG gIn+    deps' =  merge (map (\(d,(b,_)) -> (ReasonAlloc, d, [b])) extraConstrs ++ deps)+    +    merge ds = map (\(d,(r,ds)) -> (r,d,ds)) $ Map.assocs $+                 Map.fromListWith (\(_,as) (r,bs) -> (r,nub (as ++ bs))) $ map (\(r,d,ds) -> (d, (r,ds))) ds++    sequenceMap = let pairs = zip oStartVisits oEndVisits+                      seqs []             = []+                      seqs l@((x,_) : zs) = (x, l) : seqs zs+                   in Map.fromList (seqs pairs)  -- given an beginVisit: gives the end visits starting at this visit+    visitAllocMap = Map.mapWithKey allocStmt $ Map.filterWithKey (\k _ -> isStmt k) pairRanges+    extraConstrs  = [ (k,p) | (k,Just p) <- Map.assocs visitAllocMap ]++    allocStmt :: DepItem -> (DepItem, DepItem) -> Maybe (DepItem, DepItem)+    allocStmt dep (begin,end)+      | begin == end = Nothing+      | otherwise = if null ok+                    then if null bad+                         then Nothing+                         else Just (last bad)+                    else Just (last ok)+                  where+                    s = Map.findWithDefault [] begin sequenceMap+                    s' = untilVisit end s+                    (bad, ok) = partition (\(b,e) -> e `Set.member` avoidVisits) s'++    untilVisit x [] = []+    untilVisit x (p@(_,e):ys)+      | x == e    = [p]+      | otherwise = p : untilVisit x ys++    isStmt (DepMatch   _) = True+    isStmt (DepAssert  _) = True+    isStmt (DepDefault _) = True+    isStmt (DepAttach  _) = True+    isStmt (DepInvoke  _) = True+    isStmt _              = False++    endRanges   = markNodes gIn oEndVisits                  -- lastest visits+    beginRanges = markNodes gInRev (reverse oStartVisits)   -- earliest visits+    pairRanges  = Map.mapWithKey (\k v -> (Map.findWithDefault k k beginRanges, v)) endRanges+    rootItem    = DepVisStart [ident "_root"]++    markNodes :: Graph -> [DepItem] -> Map DepItem DepItem+    markNodes g sources = snd $ execState (travForest forest) (Nothing, Map.empty)+      where+        sources' = Set.fromList sources+        forest = dfs g (catMaybes $ map keyToVertex sources)+        travForest trees = mapM_ travTree trees+        travTree (Node v sub)+          = do let (_, d, _) = vertexToKey v+               encounter d+               travForest sub+        +        encounter d+          = do (mbD, mp) <- get+               if d `Set.member` sources'+                then put (Just d, mp)+                else case mbD of+                       Nothing -> return ()+                       Just d' -> put (mbD, Map.insertWith (flip const) d d' mp)++-- Creates a total order+total :: [(Reason, DepItem, [DepItem])] -> [(Reason, DepItem, [DepItem])]+total deps = result+  where+    result = map (\(a,(r,bs)) -> (r,a,bs)) $ Map.assocs merged+    merged = Map.unionWith merge+               (Map.fromListWith merge [ (a, (ReasonOrder, [b])) | (b,a) <- pairs ])+               (Map.fromList [ (a,(r,bs)) | (r,a,bs) <- deps ])+    +    merge (_,as) (r,bs) = (r,nub (as ++ bs))+    toVal x = case G.lab g0 x of+                Nothing -> error ("has disapeared from graph: " ++ show x)+                Just v  -> v+    pairs = zip nodes3 (tail nodes3)+    nodes3 = map toVal nodes2+    +    items = nub ([ s | (_,s,_) <- deps ] ++ [ d | (_,_,ds) <- deps, d <- ds ])+    (nodes, mp) = G.mkNodes G.new items+    (Just edges) = G.mkEdges mp [ (s,d,r) | (r, s, ds) <- deps, d <- ds ]+    +    g0 :: G.Gr DepItem Reason+    g0 = G.mkGraph nodes edges     -- orig graph+    g1 = G.trc $ removeCycles g0   -- search graph+    +    nodes1 = sortBy compare' (G.nodes g0)  -- totally ordered+    compare' a b+      = let (Just av) = G.lab g0 a+            (Just bv) = G.lab g0 b+        in compare av bv+    +    dmap = list2DMap nodes1+    nodes2 = toListDMap $ fixSolve (assocsDMap dmap) dmap+    +    fixSolve todo dmap+      = case Map.maxViewWithKey todo of+          Nothing -> dmap+          Just ((a,v), todo1) ->+            let preds = G.pre g1 v  -- a must be before the preds+                troubles = filter (\b -> b < a) $ map (\v -> lookupDMapVal v dmap) preds+            in if null troubles+               then fixSolve todo1 dmap+               else let b = minimum troubles+                        succs = G.suc g1 v+                    in case insertDMap b v (removeDMap a dmap) of+                         Left dmap' ->  -- reindexed, rebuild todo+                           let a' = lookupDMapVal v dmap'+                               todo2 = Map.fromList [ (lookupDMapVal v dmap', v) | v <- Map.elems todo1 ]+                               todo3 = Map.fromList [ (k,v) | v <- succs, let k = lookupDMapVal v dmap', k > a'] `Map.union` todo2+                           in fixSolve todo3 dmap'+                         Right dmap' ->+                           let todo2 = Map.fromList [ (b,v) | v <- succs, let k = lookupDMapVal v dmap', b > a] `Map.union` todo1+                           in fixSolve todo2 dmap'++-- eliminates those edges E from the graph that make it cyclic.+-- for an edge e `elem` E, it holds that not removing it from+-- the graph:+-- (a) makes it cylic, or+-- (b) does not increase the connected-ness of nodes+-- the idea:+-- (1) compute strongly connected components+-- (2) arbitrarily totally-order the nodes in such component+-- (3) filter out those edges between nodes in such component+--     that are going in a different direction than imposed+--     by the order.+removeCycles :: G.Gr DepItem Reason -> G.Gr DepItem Reason+removeCycles g+  = G.efilter keep g+  where+    cmps = G.scc g+    mp = IntMap.unions (map createMp cmps)+    createMp comp =+      let items = IntSet.fromList comp+      in IntMap.fromList [ (i, items) | i <- comp ]+    +    keep (a, b, _)+      = case IntMap.lookup a mp of+          Nothing -> error "removeCycles: missing node"+          Just comp -> not (IntSet.member b comp) || b > a++-- A sparse array with elements indexed by doubles instead of integers,+-- offering fast insertion.++newtype DMap = DMap (Map Double Int, IntMap Double)++emptyDMap = DMap (Map.empty, IntMap.empty)++lookupDMapKey k (DMap (m,_)) = Map.findWithDefault undefined k m+lookupDMapVal v (DMap (_,m)) = IntMap.findWithDefault undefined v m++assocsDMap (DMap (m,_)) = Map.deleteMin $ Map.deleteMax m  -- remove sentinels++list2DMap xs = DMap (m, r)+  where+    pairs = zip [1.0, 2.0..] xs+    m = Map.fromAscList ([(0.0,0)] ++ pairs ++ [(fromIntegral (length xs + 1),maxBound)])+    r = IntMap.fromList [ (k,d) | (d,k) <- pairs ]++-- insert just before b (potentially reassigns the elements in the map)+insertDMap b v (DMap (m,r))+  | c == a    = let mp1' = Map.deleteMin mp1+                    mp2' = Map.deleteMax mp2+                in Left $ list2DMap (Map.elems mp1' ++ [v, v'] ++ Map.elems mp2')+  | otherwise = Right $ DMap (Map.insert c v m, IntMap.insert v c r)+  where+    (mp1,Just v',mp2) = Map.splitLookup b m+    (a,_) = Map.findMax mp1+    c = (a + b) / 2.0++removeDMap a (DMap (m,r))+  = DMap (Map.delete a m, r)++toListDMap (DMap (m,_)) = tail $ init $ Map.elems m
+ src/Env.hs view
@@ -0,0 +1,130 @@+module Env( emptyEnv, enterWith, splitWith, enter, leave, dups, missing+          , extend, extendTail, find, Env, split, merge, defined, findAll+          , intersection, strip, push, assocs) where++import Data.Map(Map)+import qualified Data.Map as Map+import Data.List(nub)++newtype Env k v = Env [Map k (Entries k v)]++data Entries k v+  = E [k] [(k,v)]++instance (Show k, Show v) => Show (Env k v) where+  show (Env mps) = show (map Map.assocs mps)++instance (Show k, Show v) => Show (Entries k v) where+  show (E ms ks) = "<E: " ++ show ms ++ " * " ++ show ks ++ ">"++emptyEnv :: Env k v+emptyEnv = Env [Map.empty]++enter :: Env k v -> Env k v+enter (Env mps) = Env (Map.empty : mps)++enterWith :: Env k v -> Env k v -> Env k v+enterWith (Env (mp : _)) (Env mps) = Env (mp : mps)++leave :: Env k v -> (Env k v, Env k v)+leave (Env (mp : mps)) = (Env mps, Env [mp])++split :: Env k v -> (Env k v, Env k v)+split x = (enter x, x)++splitWith :: Env k v -> Env k v -> (Env k v, Env k v)+splitWith l x = (enterWith l x, x)++-- result: merged env, left only env+merge :: Ord k => Env k v -> Env k v -> (Env k v, Env k v)+merge (Env (ha:t)) (Env t1)+  | length t /= length t1 = error "input environments from different scopes"+  | otherwise             = (Env t2, Env [l])+  where+    tstar  = Map.unions t1+    (l,t2) = apply ha tstar t1++apply :: Ord k => Map k (Entries k v) -> Map k (Entries k v) -> [Map k (Entries k v)] -> (Map k (Entries k v), [Map k (Entries k v)])   +apply mp mpstar mps+  = (new `Map.union` mpDefs, mps')+  where+    (mpElse, mpDefs) = Map.partition (\(E _ ds) -> null ds) mp+    (old,new) = Map.partitionWithKey (\k _ -> Map.member k mpstar) mpElse+    mps' = Map.foldWithKey mergeEnt mps old++mergeEnt :: Ord k => k -> Entries k v -> [Map k (Entries k v)] -> [Map k (Entries k v)]+mergeEnt k e (mp:mps)+  | k `Map.member` mp = Map.insertWith mergeE k e mp : mps+  | otherwise         = mp : mergeEnt k e mps++mergeE :: Entries k v -> Entries k v -> Entries k v+mergeE (E ms1 ds1) (E ms2 ds2) = E (ms1 ++ ms2) (ds1 ++ ds2)++dups :: Ord k => Env k v -> [[(k,v)]]+dups (Env mps) = foldl (Map.fold dups') [] mps+  where dups' (E _ defs) | length defs > 1 = (defs :)+                         | otherwise       = id++missing :: Ord k => Env k v -> [[k]]+missing (Env mps) = foldl (Map.fold miss') [] mps+  where miss' (E ks _) | null ks   = id+                       | otherwise = (ks :)++extend :: Ord k => k -> v -> Env k v -> Env k v+extend k v (Env (mp:mps))+  = case Map.lookup k mp of+      Nothing        -> Env (Map.insert k (E [] [(k,v)]) mp : mps)+      Just (E ms ps) -> Env (Map.insert k (E ms ((k,v) : ps)) mp : mps)++extendTail :: Ord k => k -> v -> Env k v -> Env k v+extendTail k v (Env (mp:mps))+  = case Map.lookup k mp of+      Nothing        -> Env (Map.insert k (E [] [(k,v)]) mp : mps)+      Just (E ms ps) -> Env (Map.insert k (E ms (ps ++ [(k,v)])) mp : mps)++find :: Ord k => k -> v -> Env k v -> (v, Env k v)+find k defl e@(Env mps)+  = case find' mps of+      Just (v, mps') -> (v, Env mps')+      Nothing        -> (defl, Env (Map.insertWith mergeE k (E [k] []) (head mps) : tail mps ))+  where+    find' [] = Nothing+    find' ms@(mp : mps)+      = case Map.lookup k mp of+          Just (E _ ((_,v):_)) -> return (v, ms)+          _ -> do (v,mps') <- find' mps+                  return (v, mp : mps')++findAll :: Ord k => k -> Env k v -> [v]+findAll k (Env mps) = concatMap find' mps+  where+    find' mp = case Map.lookup k mp of+                 Just (E _ defs) -> map snd defs+                 _               -> []++defined :: Ord k => k -> Env k v -> Bool+defined k (Env mps) = foldr def' False mps+  where def' mp r = Map.member k mp || r++intersection :: Ord k => [Env k v] -> Env k v+intersection []    = emptyEnv+intersection [env] = env+intersection (x:xs) = inter x (intersection xs)+  where+    inter (Env (a:l)) (Env (b:r)) = Env (inter' a b : zipWith inter' l r)+    inter' = Map.intersectionWith mergeE++strip :: Env k v -> Env k v+strip (Env t) = Env (map (Map.map strip') t)+  where strip' (E _ ds) = E [] (trim ds)+        trim [] = []+        trim (x:_) = [x]++push :: Ord k => Env k v -> Env k v -> Env k v+push (Env (m : _)) (Env (m' : t))+  = Env (Map.unionWith mergeE m m' : t)++assocs :: Ord k => Env k v -> [(k,v)]+assocs (Env ms)+  = [ head ds | (k, E _ ds) <- acs, not (null ds) ]+  where acs = Map.assocs $ Map.unions ms
+ src/Errs.ag view
@@ -0,0 +1,207 @@+MODULE {Errs} {errsToStr, prettyErrs, Errs, Err(..), debugMsg, nullErrs} {}++PRAGMA genlinepragmas++imports+{+import Common+import Pretty+import UU.Scanner.Position+import Data.Sequence(Seq)+import qualified Data.Sequence as Seq+import Data.Map(Map)+import qualified Data.Map as Map+import Data.Foldable+import Opts+}++WRAPPER Err++{+type Errs = Seq Err++prettyErr :: Opts -> Err -> PP_Doc+prettyErr opts e+  = pp_Syn_Err syn+  where+    inh = Inh_Err { opts_Inh_Err = opts }+    syn = wrap_Err sem inh+    sem = sem_Err e++prettyErrs :: Opts -> Errs -> PP_Doc+prettyErrs opts = vlist . map (prettyErr opts) . toList++errsToStr :: Opts -> Errs -> String+errsToStr opts es = disp (prettyErrs opts es) 999999 ""++debugMsg :: String -> Errs+debugMsg = Seq.singleton . Err_General noPos++nullErrs :: Errs -> Bool+nullErrs = Seq.null+}++DATA Err+  | General+      pos     : Pos+      str     : String+  | Missing+      ks      : {[Ident]}+  | Dup+      ks      : {[Ident]}+  | ExpVisit+      pos     : Pos+      found   : Ident+      expect  : Ident+  | MissingVisit+      pos     : Pos+      child   : Ident+      visit   : Ident+  | VisitsNotImpl+      nonterm : {[Ident]}+      vs      : {[Ident]}+  | UndefVisit+      child   : Ident+      visit   : Ident+      visits  : {[Ident]}+  | UndeclVisit+      pos     : Pos+      name    : Ident+      itf     : Ident+  | UndetachVisit+      child   : Ident+      visit   : Ident+      expect  : Ident+  | UndeclAttr+      child   : Ident+      name    : Ident+  | NameClash+      name    : Ident+  | MissingAttr+      inherited : Bool+      child     : Ident+      name      : Ident+  | DupAttr+      inherited : Bool+      child     : Ident+      name      : Ident+  | MissingClause+      itf       : Ident+      name      : Ident+  | AmbAttach+      name      : Ident+      visit     : Ident+  | AmbDefault+      pos       : Pos+      name      : Ident+  | TypeConflict+      found     : Ident+      expect    : Ident+  | ChildSynUnav+      pos       : Pos+      child     : Ident+      itf       : Ident+      vis       : Ident+      name      : Ident+  | Cyclic+      pos       : Pos+      posMap    : {Map DepItem Pos}+      comps     : {[DepItem]}+  | MatchCyclic+      pos       : Pos+  | ClausesCyclic+      pos       : Pos+      name      : Ident+      n         : Int+  | EffCyclic+      pos       : Pos+  | VisExpCyclic+      name      : Ident+      child     : Ident+  | IterCyclic+      pos       : Pos+  | InternalInCyclic+      pos       : Pos+      name      : Ident++ATTR Err [ opts : Opts | | pp : {PP_Doc} ]++SEM Err+  | General        lhs.pp = locLine @pos @str+  | Missing        lhs.pp = locLine @loc.pos ("undefined identifier" >#< show @loc.main)+  | Dup            lhs.pp = locLine @loc.pos ("duplicate identifier" >#< show @loc.main)+  | ExpVisit       lhs.pp = locLine @pos     ("expecting visit" >#< show @expect >#< "found" >#< show @found)+  | MissingVisit   lhs.pp = locLine @pos     ("missing invoke of visit" >#< show @visit >#< "of child" >#< show @child)+  | VisitsNotImpl  lhs.pp = locLine @loc.pos ("missing visit" >#< show @loc.main >#< "for" >#< show (head @nonterm))+  | UndefVisit     lhs.pp = locLine @loc.pos ("undefined visit" >#< show @visit >#< "of child" >#< show @child)+  | UndeclVisit    lhs.pp = locLine @pos     ("undeclared visit" >#< show @name >#< "of interface" >#< show @itf)+  | UndetachVisit  lhs.pp = locLine @loc.pos ("undetachable visit" >#< show @visit >#< "of child" >#< show @child >|< ": expecting visit" >#< show @expect)+  | UndeclAttr     lhs.pp = locLine @loc.pos ("undeclared attr" >#< show @child >|< "." >|< show @name)+  | NameClash      lhs.pp = locLine @loc.pos ("name clash" >#< show @name)+  | MissingAttr    lhs.pp = locLine @loc.pos ("undefined" >#< @loc.type >#< "attr" >#< show @child >|< "." >|< show @name)+  | DupAttr        lhs.pp = locLine @loc.pos ("duplicate" >#< @loc.type >#< "attr" >#< show @child >|< "." >|< show @name)+  | MissingClause  lhs.pp = locLine @loc.pos ("missing clause " >#< show @name >#< "of" >#< show @itf)+  | AmbAttach      lhs.pp = locLine @loc.pos ("ambiguous attach of child" >#< show @name >#< "and visit" >#< show @visit)+  | AmbDefault     lhs.pp = locLine @pos     ("ambiguous default statement for" >#< show @name)+  | TypeConflict   lhs.pp = locLine @loc.pos ("type" >#< show @found >#< "does not match expected type" >#< show @expect)+  | ChildSynUnav   lhs.pp = locLine @pos     ("default for" >#< show @name >#< "requires unavailable attribute" >#< show @name >#< "of" >#< show @child >|< "'s visit" >#< show @vis)+  | Cyclic         lhs.pp = locLine @pos     ("cycle:" >#< hlist_sp (map @loc.ppDep @comps) )+  | MatchCyclic    lhs.pp = locLine @pos     ("match statement not allowed in cyclic visit")+  | ClausesCyclic  lhs.pp = locLine @pos     ("cyclic visit" >#< show @name >#< "must have one clause, but has" >#< show @n)+  | EffCyclic      lhs.pp = locLine @pos     ("effectful code not allowed for cyclic stmt")+  | VisExpCyclic   lhs.pp = locLine @loc.pos ("visit" >#< show @name >#< "of" >#< show @child >#< "is on a cycle")+  | IterCyclic     lhs.pp = locLine @pos     ("visit may not be iterated by cyclic stmt")+  | InternalInCyclic  lhs.pp = locLine @pos  ("internal visit" >#< show @name >#< "may not occur in a fully cyclic visit")++SEM Err+  | Missing Dup+      loc.main   = if null @ks then ident "<unspecified>" else head @ks+      loc.others = tail @ks+      loc.pos    = identPos @loc.main+  | VisitsNotImpl+      loc.main   = if null @vs then ident "<unspecified>" else head @vs+      loc.others = tail @vs+      loc.pos    = identPos (head @nonterm)+  | UndefVisit+      loc.pos    = identPos @visit+  | UndetachVisit+      loc.pos    = identPos @visit+  | UndeclAttr+      loc.pos    = identPos @name+  | NameClash+      loc.pos    = identPos @name+  | MissingAttr+      loc.pos    = identPos @name+      loc.type   = if @inherited then text "inh" else text "syn"+  | DupAttr+      loc.pos    = identPos @name+      loc.type   = if @inherited then text "inh" else text "syn"+  | MissingClause+      loc.pos    = identPos @name+  | AmbAttach+      loc.pos    = identPos @name+  | TypeConflict+      loc.pos    = identPos @found+  | VisExpCyclic+      loc.pos    = identPos @name+  | Cyclic+      loc.ppDep  = \d -> let pos = Map.findWithDefault noPos d @posMap+                         in case d of+                              DepMatch _               -> "@" >|< show (line pos)+                              DepAssert _              -> "@" >|< show (line pos)+                              DepDefault o             -> "d" >|< show o+                              DepAttach n              -> "@" >|< show (line pos)+                              DepInvoke (visit:name:_) -> show name >|< "." >|< show visit >|< "@" >|< show (line $ identPos name)+                              DepInvoke _              -> text "i???"+                              DepVisStart (visit:_)    -> ">" >|< show visit >|< "@" >|< show (line $ identPos visit)+                              DepVisStart _            -> text ">v???"+                              DepVisEnd  (visit:_)     -> show visit >|< "@" >|< show (line $ identPos visit) >|< "<"+                              DepVisEnd _              -> text "<v???"+                              DepClause (clause:_)     -> "|" >|< show clause >|< "@" >|< show (line $ identPos clause)+                              DepClause _              -> text "|???"++{+locLine :: PP a => Pos -> a -> PP_Doc+locLine (Pos l c f) d+  = pp f >|< ":" >|< pp l >|< "," >|< pp c >|< ":error:" >#< pp d+}
+ src/Main.hs view
@@ -0,0 +1,48 @@+module Main where
+
+import Scanner
+import Parser
+import Opts
+import Common
+import Transform
+import Errs
+import Control.Monad
+import System
+import System.IO
+
+main :: IO ()
+main = do opts  <- commandlineArgs
+          let path = sourceFile opts
+              pos  = Pos 1 1 path
+          when (path /= "") $
+            do str <- readFile path
+               let tks  = tokenize opts path str
+                   pres = parseProgram opts pos tks
+               when (tokens opts) (putStrLn (show $ ppTokens tks))
+               case pres of
+                 Left err  -> do hPutStrLn stderr err
+                                 hFlush stderr
+                                 exitFailure
+                 Right ast -> let (errs, txtId, txtTarget, txtGraph) = transform pos opts ast
+                              in do when (pretty opts) (putStrLn txtId)
+                                    when (not $ nullErrs errs) $ do
+                                      hPutStrLn stderr (errsToStr opts errs)
+                                      hFlush stderr
+                                    case outputGraph opts of
+                                      Just name -> myWriteFile name txtGraph
+                                      Nothing   -> return ()
+                                    if nullErrs errs || forceGen opts
+                                      then case outputFile opts of
+                                             Just name -> myWriteFile name txtTarget
+                                             Nothing   -> return ()
+                                      else exitFailure
+
+myWriteFile :: FilePath -> String -> IO ()
+myWriteFile path txt
+  = seq (seqChars txt) $ withFile path WriteMode writeHandle
+  where
+    seqChars []     = ()
+    seqChars (c:cs) = seq c (seqChars cs)
+
+    writeHandle h = do hPutStrLn h txt
+                       hFlush h
+ src/Opts.hs view
@@ -0,0 +1,95 @@+module Opts where
+
+import System.Console.GetOpt
+import System.Environment
+import System.FilePath
+import System.IO
+import System.Directory
+
+data Opts
+  = Opts { sourceFile  :: !FilePath
+         , outputFile  :: !(Maybe FilePath)
+         , verbose     :: !Bool
+         , tokens      :: !Bool
+         , pretty      :: !Bool
+         , genHaskell  :: !Bool
+         , genJs       :: !Bool
+         , forceGen    :: !Bool
+         , noDataGen   :: !Bool
+         , outputGraph :: !(Maybe FilePath)
+         , hNoLinePragmas :: !Bool
+         , genConNonterms :: !Bool
+         , genCoSems      :: !Bool
+         }
+
+opts :: [OptDescr (Opts -> IO Opts)]
+opts = [ Option "o" ["output"]  (ReqArg oOutput "path") "output .hs file"
+       , Option "v" ["verbose"] (NoArg oVerbose) "verbose output"
+       , Option ""  ["pretty"]  (NoArg oPretty) "pp AST to STDOUT"
+       , Option ""  ["tokens"]  (NoArg oTokens) "print tokens to STDOUT"
+       , Option ""  ["haskell"] (NoArg oHaskell) "generate Haskell code (default)"
+       , Option ""  ["js"]      (NoArg oJs)      "generate Javascript code"
+       , Option "f" ["force"]   (NoArg oForce) "force code generation"
+       , Option ""  ["nodata"]  (NoArg oNoData) "do not generate data types"
+       , Option ""  ["graph"]   (ReqArg oGraph "path") "output .dot file"
+       , Option ""  ["noline"]  (NoArg oNoLinePragmas) "do not generate LINE pragmas"
+       , Option ""  ["genconnon"] (NoArg oGenConNon) "generate constructor nonterminals"
+       , Option ""  ["gencosems"] (NoArg oGenCoSems) "generate cosems"
+       ]
+
+oOutput :: FilePath -> Opts -> IO Opts
+oOutput s o = return (o { outputFile = Just s })
+
+oGraph :: FilePath -> Opts -> IO Opts
+oGraph s o = return (o { outputGraph = Just s })
+
+oVerbose :: Opts -> IO Opts
+oVerbose o = return (o { verbose = True })
+
+oPretty :: Opts -> IO Opts
+oPretty o = return (o { pretty = True })
+
+oTokens :: Opts -> IO Opts
+oTokens o = return (o { tokens = True })
+
+oHaskell :: Opts -> IO Opts
+oHaskell o = return (o { genHaskell = True, genJs = False })
+
+oJs :: Opts -> IO Opts
+oJs o = return (o { genJs = True, genHaskell = False })
+
+oForce :: Opts -> IO Opts
+oForce o = return (o { forceGen = True })
+
+oNoData :: Opts -> IO Opts
+oNoData o = return (o { noDataGen = True })
+
+oNoLinePragmas :: Opts -> IO Opts
+oNoLinePragmas o = return (o { hNoLinePragmas = True })
+
+oGenConNon :: Opts -> IO Opts
+oGenConNon o = return (o { genConNonterms = True })
+
+oGenCoSems :: Opts -> IO Opts
+oGenCoSems o = return (o { genCoSems = True })
+
+defaultOpts :: Opts
+defaultOpts = Opts { sourceFile = "", outputFile = Nothing, verbose = False, pretty = False, tokens = False
+                   , genHaskell = True, genJs = False
+                   , forceGen = False, noDataGen = False, outputGraph = Nothing, hNoLinePragmas = False
+                   , genConNonterms = False, genCoSems = False }
+
+commandlineArgs :: IO Opts
+commandlineArgs
+  = do args <- getArgs
+       let usage = usageInfo "Usage: imp-visits <OPTION ...> <ag-file> ..." opts
+       case getOpt Permute opts args of
+         (actions, args', []) | null args' -> do hPutStrLn stderr ("No AG source file specified.\n" ++ usage)
+                                                 foldl (>>=) (return defaultOpts) actions
+                              | otherwise  -> foldl (>>=) (return $ patch $ defaultOpts { sourceFile = head args' }) actions
+         (_, _, errs)                      -> do hPutStrLn stderr (unlines errs ++ "\n" ++ usage)
+                                                 return defaultOpts
+  where
+    patch o = if sourceFile o /= ""
+              then o { outputFile = Just $ replaceExtension (sourceFile o) ".hs" }
+              else o
+ src/Parser.hs view
@@ -0,0 +1,258 @@+module Parser(AgParser, parseProgram) where
+
+
+import UU.Scanner
+import UU.Scanner.GenToken
+import UU.Parsing
+import Opts
+import Ast
+import Common
+import qualified Data.Sequence as Seq
+import qualified Data.Map as Map
+import Data.Map(Map)
+
+
+type AgParser a = Parser Token a
+
+pEnd :: AgParser Pos
+pEnd = pKeyPos "end" <?> "end of layout"
+
+pVarIdent :: AgParser Ident
+pVarIdent = uncurry Ident <$> pVaridPos
+
+pConIdent :: AgParser Ident
+pConIdent = uncurry Ident <$> pConidPos
+
+pIdentItf, pIdentAttr, pIdentChild, pIdentVisit, pIdentCon :: AgParser Ident
+pIdentItf    = pConIdent <?> "itf ident"
+pIdentAttr   = pVarIdent <?> "attr ident"
+pIdentSem    = pVarIdent <?> "sem ident"
+pIdentChild  = pVarIdent <?> "child ident"
+pIdentVisit  = pVarIdent <?> "visit ident"
+pIdentClause = pVarIdent <?> "clause ident"
+pIdentCon    = pConIdent <?> "con ident"
+pDataIdent   = pConIdent <?> "data ident"
+pConstrIdent = pConIdent <?> "con ident"
+pFieldIdent  = pVarIdent <?> "field ident"
+pExtIdent    = pConIdent <?> "ext ident"
+pTyVarIdent  = pVarIdent <?> "var ident"
+
+pProgram :: AgParser Program
+pProgram = (Program_Program . BlocksTop_Top) <$> pList_gr pBlock
+
+pBlock :: AgParser Block
+pBlock  =  Block_Itf <$> pItf
+       <|> Block_Section <$> pCurly pCode
+       <|> Block_Data <$> pData
+       <|> Block_Type <$> pType
+       <|> Block_DataSem <$> pDataSem
+
+pCode :: AgParser Code
+pCode = Code_Code <$> pList_gr pItem
+
+pItf :: AgParser Itf
+pItf = Itf_Itf
+        <$> pKeyPos "itf"
+        <*> pIdentItf
+        <*> pList_gr pVar
+        <*> pItfVisits
+        <*  pEnd
+        <?> "itf"
+
+pItfVisits :: AgParser ItfVisits
+pItfVisits
+  = pList1_gr pItfVisit <?> "visits"
+
+pItfVisit :: AgParser ItfVisit
+pItfVisit
+   = (ItfVisit_Visit
+       <$> pKeyPos "visit"
+       <*> pIdentVisit
+       <*> opt (True <$ pKey "cyclic") False
+       <*> pList_gr pVar
+       <*> pList_gr pAttrInhSyn
+       <?> "visit")
+
+pAttrInhSyn :: AgParser Attr
+pAttrInhSyn = (pAttrInh <|> pAttrSyn) <?> "attr"
+
+pAttrInh :: AgParser Attr
+pAttrInh = Attr_Inh <$ pKey "inh" <*> pVarIdent <* pKey "::" <*> (pTextln <?> "type") <* pEnd
+
+pAttrSyn :: AgParser Attr
+pAttrSyn = Attr_Syn <$ pKey "syn" <*> pVarIdent <* pKey "::" <*> (pTextln <?> "type") <* pEnd
+
+pData :: AgParser Data
+pData = Data_Data <$> pKeyPos "data" <*> pDataIdent <*> pList_gr pVar <*> pList_gr pCon <*> pList_gr pExt <* pEnd <?> "data"
+
+pVar :: AgParser Var
+pVar = Var_Var <$ pKeyPos "var" <*> pTyVarIdent <?> "var"
+
+pExt :: AgParser Ext
+pExt = Ext_Ext <$ pKeyPos "ext" <*> pExtIdent <?> "ext"
+
+pCon :: AgParser Con
+pCon = Con_Con <$> pKeyPos "con" <*> pConstrIdent <*> pList_gr pVar <*> pList_gr pField <?> "con"
+
+pField :: AgParser Field
+pField = pFieldIdent <**> (    (\nt fld -> Field_Field fld (FieldType_Nonterm nt)) <$ pKey ":"  <*> pDataIdent
+                          <|>  (\tp fld  -> Field_Field fld (FieldType_Term tp))   <$ pKey "::" <*> (pTextln <?> "type") <* pEnd
+                          ) <?> "field" 
+
+pType :: AgParser Type
+pType = Type_Alias <$> pKeyPos "type" <*> pDataIdent <* pKey ":" <*> pAliasType <*> pList_gr pVar <?> "type"
+
+pAliasType :: AgParser AliasType
+pAliasType
+  =   (AliasType_Prod  <$> pParens_pCommas pDataIdent <?> "product type")
+  <|> (AliasType_List  <$> pBracks pDataIdent <?> "list type")
+  <|> (AliasType_Maybe <$  pKey "Maybe" <*> pDataIdent <?> "Maybe type")
+
+pDataSem :: AgParser DataSem
+pDataSem
+  = DataSem_Sem <$> pKeyPos "datasem"
+                <*> pIdentItf
+                <*> pList_gr pVar
+                <*> opt (pKey "monad" *> (Just <$> pTextln <* pEnd <?> "monad type")) Nothing
+                <*> opt (True <$ pKey "cyclic") False
+                <*> pList_gr pStmt
+                <*> (ClausesTop_Impl <$> pList_gr pClause)
+                <*  pEnd <?> "data sem"
+
+pItem :: AgParser Item
+pItem
+  =   uncurry (flip Item_Plain) <$> (pTextlnPos <?> "code")
+  <|> uncurry mkAttr <$> (pVaridPos <?> "attribute occurrence")
+  <|> (Item_Sem <$> pKeyPos "sem"
+                <*> pIdentSem
+                <* pKey ":"
+                <*> pIdentItf
+                <*> pList_gr pVar
+                <*> opt (pKey "monad" *> (Just <$> pTextln <* pEnd <?> "monad type")) Nothing
+                <*> pSemVisit
+                <* pEnd <?> "sem")
+  <|> (Item_CoSem <$> pKeyPos "cosem"
+                  <*> pIdentSem
+                  <* pKey ":"
+                  <*> pIdentItf
+                  <*> pIdentVisit
+                  <*> pList_gr pVar
+                  <*> opt (pKey "monad" *> (Just <$> pTextln <* pEnd <?> "monad type")) Nothing
+                  <*> pSemVisit
+                  <* pEnd <?> "cosem")
+  <|> Item_DataSem <$> pDataSem
+  <|> (Item_Detach <$> pKeyPos "detach" <*> pIdentVisit <* pKey "of" <*> pIdentChild <* pEnd <?> "detach item")
+  <|> (Item_Brackets <$> pKeyPos "{" <*> pList_gr pItem <*> pKeyPos"}" <?> "brackets")
+  <?> "code item"
+  where
+    mkAttr s p = let (i,t) = break (\c -> c == '.' || c == ':') s
+                 in Item_Attr p (Ident i p) (Ident (tail t) p)
+
+pSemVisit :: AgParser SemVisit
+pSemVisit
+  = opt ( ((\pos nm cyclic chns stmts clauses ->
+              SemVisit_Prependable pos nm (SemVisit_Visit pos nm cyclic chns stmts clauses))
+                         <$> pKeyPos "visit" <*> pIdentVisit <*> opt (True <$ pKey "cyclic") False
+                         <*> pList_gr pChn <*> pList_gr pStmt
+                         <*> (ClausesTop_Impl <$> pList_gr pClause)
+                         <* pEnd
+                         <?> "visit")
+          <|> ((\pos nm cyclic stmts clauses ->
+               SemVisit_Internal pos nm cyclic stmts clauses)
+                          <$> pKeyPos "internal" <*> pIdentVisit <*> opt (True <$ pKey "cyclic") False
+                          <*> pList_gr pStmt
+                          <*> (ClausesTop_Impl <$> pList_gr pClause)
+                          <* pEnd
+                          <?> "internal visit")
+        ) SemVisit_Impl
+
+pChn :: AgParser VisitAttr
+pChn = VisitAttr_Chn <$ pKey "chn" <*> pVarIdent <* pKey "::" <*> (pTextln <?> "type") <* pEnd <?> "visit-local attr"
+
+pClause :: AgParser Clause
+pClause = Clause_Clause <$> pKeyPos "clause" <*> pClauseIdent <*> pList_gr pStmt <*> pSemVisit <* pEnd <?> "clause"
+
+pClauseIdent :: AgParser Ident
+pClauseIdent
+  = pVarIdent <|> pConIdent <?> "clause name"
+
+pStmt :: AgParser Stmt
+pStmt
+  =   ( Stmt_Eval   <$> opt (Mode_Match <$ pKey "match") Mode_Assert <*> pPat <*> pBoundCode <?> "eval stmt" )
+  <|> ( Stmt_Invoke <$> pKeyPos "invoke" <*> pIdentVisit <* pKey "of" <*> pIdentChild <*> pMaybeBoundCode <?> "invoke stmt" )
+  <|> ( (\p v mb -> Stmt_Attach p (maybe Nothing (const $ Just v) mb) (maybe v id mb) )
+                    <$> pKeyPos "attach" <*> pIdentChild <*> pMbChild
+                    <* pKey ":" <*> pIdentItf <*> pMaybeBoundCode <?> "attach stmt" )
+  <|> ((\p -> Stmt_Attach p Nothing) <$> pKeyPos "child" <*> pIdentChild
+                                     <* pKey ":" <*> pIdentItf <*> pMaybeBoundCode <?> "child stmt")
+  <|> ( Stmt_Default True  <$> pKeyPos "default?" <*> pVarIdent <*> pMaybeBoundCode <?> "default stmt" )
+  <|> ( Stmt_Default False <$> (pKeyPos "default" <|> pKeyPos "default1") <*> pVarIdent <*> pMaybeBoundCode <?> "default1 stmt")
+  <|> ( Stmt_Rename <$> pKeyPos "rename" <*> pIdentChild <*> pList_gr pRename <?> "rename stmt")
+  <?> "statement"
+
+pRename :: AgParser Rename
+pRename = Rename_Rename <$> pIdentAttr <* pKey "to" <*> pIdentAttr
+
+pMbChild :: AgParser (Maybe Ident)
+pMbChild = opt (Just <$ pKey "of" <*> pIdentChild) Nothing
+
+pMaybeBoundCode :: AgParser MaybeBoundCode
+pMaybeBoundCode
+  = opt (Just <$> pBoundCode) Nothing
+
+pBoundCode :: AgParser BoundCode
+pBoundCode
+  =   BoundCode_Code Bind_Fun      <$> pKeyPos "="  <*> pCode <* pEnd
+  <|> BoundCode_Code Bind_Monadic  <$> pKeyPos "<-" <*> pCode <* pEnd
+
+pPat :: AgParser Pat
+pPat = pChainr_gr (Pat_Cons <$ pKey ":") pPatCon
+
+pPatCon :: AgParser Pat
+pPatCon = pIdentCon <**> (   (Pat_Con <$$> pList_gr pPatBase <?> "con pattern")
+                         <|> ((pKey "." *> pIdentCon <* pKey "@" <**> Pat_AttrCon <$$> pIdentChild) <?> "attr con")
+                         )
+        <|> pPatBase
+
+pPatBase :: AgParser Pat
+pPatBase
+  =   Pat_Underscore <$> pKeyPos "_"
+  <|> Pat_Attr <$> pIdentChild <* pKey "." <*> pIdentAttr
+  <|> Pat_Attr <$> pIdentChild <* pKey ":" <*> pIdentAttr  -- should actually check to only parse these in case of javascript
+  <|> Pat_Tup <$> pParens_pCommas pPat
+  <|> Pat_List <$> pBracks_pCommas pPat
+  <?> "simple pattern"
+
+
+--
+-- Run parser
+--
+
+parseProgram :: Opts -> Pos -> [Token] -> Either String Program
+parseProgram opts pos tks
+  = parseTokens opts pos pProgram tks
+
+parseTokens :: Opts -> Pos -> AgParser a -> [Token] -> Either String a
+parseTokens opts pos p tks
+  = if null msgs
+    then final `seq` Right v
+    else Left $ toError opts pos $ head msgs
+  where
+    steps = UU.Parsing.parse p tks
+    msgs  = getMsgs steps
+    (Pair v final) = evalSteps steps
+
+toError :: Opts -> Pos -> Message Token (Maybe Token) -> String
+toError opts pos (Msg exp mtok _)
+  = show p ++ ": " ++ m ++ ". Expecting " ++ show exp
+  where
+    p = case mtok of
+          Nothing -> pos
+          Just t  -> position t
+    m = case mtok of
+          Nothing -> "end of file"
+          Just tok -> case tok of
+                        Reserved str _         -> "symbol " ++ show str
+                        ValToken TkError val _ -> "unrecognized token " ++ show val
+                        ValToken tp val _      -> let descr = if verbose opts then show tp ++ " " else ""
+                                                  in descr ++ show val
+ src/Pretty.hs view
@@ -0,0 +1,187 @@+-------------------------------------------------------------------------+-- Subset of UU.Pretty, based on very simple pretty printing+-- Extended with line-nr tracking+-------------------------------------------------------------------------++module Pretty+  ( PP_Doc, PP(..)+  , disp++  , (>|<), (>-<)+  , (>#<)+  , ppWithLineNr+  , hlist, vlist, hv, hlist_sp+  , fill+  , indent++  , pp_block+  , vlist_sep+  , pp_parens+  , pp_braces+  , pp_brackets+  , pp_doubleQuotes+  , hv_sp++  , empty, text+  )+  where++import Data.List(intersperse)+  +-------------------------------------------------------------------------+-- Doc structure+-------------------------------------------------------------------------++data Doc+  = Emp+  | Str			!String					-- basic string+  | Hor			Doc  !Doc				-- horizontal positioning+  | Ver			Doc  !Doc				-- vertical positioning+  | Ind			!Int Doc				-- indent+  | Line        (Int -> Doc)            -- line nr++type PP_Doc = Doc++-------------------------------------------------------------------------+-- Basic combinators+-------------------------------------------------------------------------++infixr 3 >|<, >#<+infixr 2 >-< ++(>|<) :: (PP a, PP b) => a -> b -> PP_Doc+l >|< r = pp l `Hor` pp r++(>-<) :: (PP a, PP b) => a -> b -> PP_Doc+l >-< r = pp l `Ver` pp r++(>#<) :: (PP a, PP b) => a -> b -> PP_Doc+l >#< r  =  l >|< " " >|< r++indent :: PP a => Int -> a -> PP_Doc+indent i d = Ind i $ pp d++text :: String -> PP_Doc+text s+  = let ls = lines s+        ls' | null ls   = [""]+            | otherwise = ls+    in vlist (map Str ls')++empty :: PP_Doc+empty = Emp++ppWithLineNr :: PP a => (Int -> a) -> PP_Doc+ppWithLineNr f = Line (pp . f)++-------------------------------------------------------------------------+-- Derived combinators+-------------------------------------------------------------------------++hlist, vlist :: PP a => [a] -> PP_Doc+vlist [] = empty+vlist as = foldr  (>-<) empty as+hlist [] = empty+hlist as = foldr  (>|<) empty as++hv :: PP a => [a] -> PP_Doc+hv = vlist++hv_sp :: PP a => [a] -> PP_Doc+hv_sp = foldr (>#<) empty++fill :: PP a => [a] -> PP_Doc+fill = hlist++pp_block:: (PP a, PP b, PP c) => a -> b -> c -> [PP_Doc] -> PP_Doc+pp_block o c s as = pp o >|< hlist (intersperse (pp s) as) >|< pp c++pp_parens :: PP a => a -> PP_Doc+pp_parens p = '(' >|< p >|< ')'++pp_braces :: PP a => a -> PP_Doc+pp_braces p = '{' >-< p >-< '}'++pp_brackets :: PP a => a -> PP_Doc+pp_brackets p = '[' >|< pp p >|< ']'++pp_doubleQuotes :: PP a => a -> PP_Doc+pp_doubleQuotes p = '"' >|< pp p >|< '"'++vlist_sep :: (PP a, PP b) => a -> [b] -> PP_Doc+vlist_sep sep lst+  = vlist (intersperse (pp sep) (map pp lst))++hlist_sp :: PP a => [a] -> PP_Doc+hlist_sp ps = hlist (intersperse (pp " ") (map pp ps))++-------------------------------------------------------------------------+-- PP class+-------------------------------------------------------------------------++class Show a => PP a where+  pp     :: a   -> PP_Doc+  pp       = text . show++  ppList :: [a] -> PP_Doc+  ppList as = hlist as++instance PP Doc where+  pp     = id++instance PP Char where+  pp c   = text [c]+  ppList = text++instance PP a => PP [a] where+  pp = ppList++instance Show Doc where+  show p = disp p 200 ""++instance PP Int where+  pp = text . show++instance PP Float where+  pp = text . show++-------------------------------------------------------------------------+-- Observation+-------------------------------------------------------------------------++isEmpty :: PP_Doc -> Bool+isEmpty Emp         = True+isEmpty (Ver d1 d2) = isEmpty d1 && isEmpty d2+isEmpty (Hor d1 d2) = isEmpty d1 && isEmpty d2+isEmpty (Ind _  d ) = isEmpty d+isEmpty _           = False++-------------------------------------------------------------------------+-- Rendering+-------------------------------------------------------------------------++disp  ::  PP_Doc -> Int -> ShowS+disp d _ s+  = r+  where (r,_,_) = put 0 1 d s+        put p l d s+          = case d of+              Emp              -> (s,p,l)+              Str s'           -> (s' ++ s,p + length s',l)+              Ind i  d         -> (ind ++ r,p', l')+                               where (r,p',l') = put (p+i) l d s+                                     ind = replicate i ' '+              Hor d1 d2        -> (r1,p2,l2)+                               where (r1,p1,l1) = put p  l  d1 r2+                                     (r2,p2,l2) = put p1 l1 d2 s+              Ver d1 d2 | isEmpty d1+                               -> put p l d2 s+              Ver d1 d2 | isEmpty d2+                               -> put p l d1 s+              Ver d1 d2        -> (r1,p2,l2)+                               where (r1,p1,l1) = put p l d1 $ "\n" ++ ind ++ r2+                                     (r2,p2,l2) = put p (l1+1) d2 s+                                     ind = replicate p ' '+              Line f           -> (r,p',l')+                               where (r,p',l') = put p l (f l) s+
+ src/Scanner.x view
@@ -0,0 +1,140 @@+{
+module Scanner(tokenize, ppTokens) where
+
+import UU.Scanner
+import UU.Scanner.GenToken
+import Data.Char
+import UU.Pretty
+import Opts
+}
+
+$litChar     = [^[\" \\]]
+$identChar   = [a-zA-Z0-9\'_]
+
+@ucIdent     = [A-Z] $identChar*
+@lcIdent     = [a-z] $identChar*
+
+tokens :-
+  <0,a>     (" " | \n | \r)+                             ;                        -- ignore spaces
+  <0,a,h>   "--" $white .*                               ;                        -- to-end-of-line comment
+  <0,a>     "{-" ([^\-] | $white | "-" [^\}])* "-}"      ;                        -- multi-line comment (not nested)
+  <h>       "{-" ([^\-] | $white | "-" [^\}])* "-}"      { valueToken TkTextln }  -- haskell comment token
+
+  <0,h,j>  "{"                                        { reserved }
+  <h,j>    "}"                                        { reserved }
+
+  <0>    itf | visit | cyclic | inh | syn             { reserved }
+  <0>    data | con | type | Maybe | ext              { reserved }
+  <0>    datasem                                      { reserved }
+
+  <a>    clause | visit | cyclic | chn | internal     { reserved }
+  <a>    match | invoke | of | to                     { reserved }
+  <a>    attach | detach | child | rename             { reserved }
+  <a>    default | default1 | "default?"              { reserved }
+
+  <0,a>  "::" | ":" | "monad"                         { reserved }
+  <0,a>  var                                          { reserved }
+
+  <0,a>  "(" | ")" | "[" | "]" | ","                  { reserved }
+  <a>    "=" | "<-"                                   { reserved }
+  <a>    "." | "@" | "_"                              { reserved }
+  <h,j>  cosem | sem | datasem                        { reserved }
+
+  <0,a>  @lcIdent                                     { valueToken TkVarid  }
+  <0,a>  @ucIdent                                     { valueToken TkConid  }
+
+  <h,j>  \" ([^\"]|\\\")* \"                          { valueToken TkTextln } -- scan string
+  <h>    @ucIdent "." @lcIdent                        { valueToken TkTextln } -- treat qualified names as opaque strings
+  <h>    @lcIdent "." @lcIdent                        { valueToken TkVarid  } -- scan attr occ
+  <j>    @lcIdent ":" @lcIdent                        { valueToken TkVarid  } -- scan attr occ
+
+
+{
+tokenize :: Opts -> FilePath -> String -> [Token]
+tokenize opts path str
+  = merge $ scanTks opts [(Pos 1 0 path, 0)] (Pos 1 1 path, str)
+
+merge []            = []
+merge r@[_]         = r
+merge (ValToken TkTextln s1 p : ValToken TkTextln s2 _ : r)
+  = merge (ValToken TkTextln (s1 ++ s2) p : r)
+merge (t : r)       = t : merge r
+
+type AlexInput = (Pos, String)  -- current position, current string
+
+alexGetChar :: AlexInput -> Maybe (Char,AlexInput)
+alexGetChar (_, [])     = Nothing
+alexGetChar (p, c : cs) = Just (c, (adv p c, cs))
+
+alexInputPrevChar :: AlexInput -> Char
+alexInputPrevChar = error "alexInputPrevChar: should not be used."
+
+type Ctx = (Pos, Int)  -- context start position, start code
+type CtxStack = [Ctx]
+
+scanTks :: Opts -> CtxStack -> AlexInput -> [Token]
+scanTks opts st inp@(pos,str)
+  = let (sc,st',tks) = unwind pos str st []
+    in tks ++
+       case alexScan inp sc of
+         AlexEOF                -> unwindAll st' pos
+         AlexError _            -> let (Just (c, inp')) = alexGetChar inp
+                                       tk | sc == h || sc == j = valueToken TkTextln [c] pos
+                                          | otherwise          = errToken [c] pos
+                                   in tk : scanTks opts st' inp'
+         AlexSkip inp' _        -> scanTks opts st' inp'
+         AlexToken inp' len act -> let tk = act (take len str) pos
+                                   in tk : scanTks opts (push opts sc tk st') inp'
+
+push :: Opts -> Int -> Token -> CtxStack -> CtxStack
+push opts sc (Reserved k pos)
+  | sc == 0 && k == "{"          = ((noPos, n) :)
+  | sc == h && k == "{"          = ((noPos, n) :)
+  | sc == h && k == "}"          = tail
+  | sc == j && k == "{"          = ((noPos, j) :)
+  | sc == j && k == "}"          = tail
+  | sc == 0 && k == "itf"        = ((pos, 0) :)
+  | sc == 0 && k == "data"       = ((pos, 0) :)
+  | sc /= a && k == "sem"        = ((pos, a) :)
+  | sc /= a && k == "datasem"    = ((pos, a) :)
+  | sc /= a && k == "cosem"      = ((pos, a) :)
+  | sc /= a && k == "detach"     = ((pos, a) :)
+  | sc == a && k == "="          = ((pos, n) :)
+  | sc == a && k == "<-"         = ((pos, n) :)
+  | sc == 0 && k == "::"         = ((pos, n) :)
+  | sc == a && k == "::"         = ((pos, n) :)
+  | sc == a && k == "monad"      = ((pos, n) :)
+  | sc == a && k == "visit"      = ((pos, a) :)
+  | sc == a && k == "internal"   = ((pos, a) :)
+  | sc == a && k == "clause"     = ((pos, a) :)
+  where
+    n | genHaskell opts = h
+      | genJs opts      = j
+      | otherwise       = error "target language unspecified"
+push _ _ _ = id
+
+unwind :: Pos -> String -> CtxStack -> [Token] -> (Int, CtxStack, [Token])
+unwind p str st@((p',c) : st') acc
+  |    (cp == cp' &&
+         (null str || (not $ isSpace $ head str)) )
+    || (cp < cp' &&
+         ( any (not . isSpace) $
+             take (cp' - cp) str) ) = unwind p str st' (reserved "end" p : acc)
+  | otherwise                       = (c, st, acc)
+  where cp  = column p
+        cp' = column p'
+
+unwindAll :: CtxStack -> Pos -> [Token]
+unwindAll st pos
+  = map (const (reserved "end" pos)) (init st)
+
+ppTokens :: [Token] -> PP_Doc
+ppTokens = vlist . map ppToken
+
+ppToken :: Token -> PP_Doc
+ppToken (Reserved str pos)    = "keyword " >|< show str >|< " at " >|< ppPos pos
+ppToken (ValToken tp val pos) = show tp >|< " " >|< val >|< " at " >|< ppPos pos
+
+ppPos :: Pos -> PP_Doc
+ppPos (Pos l c _) = show l >|< "," >|< show c
+}
+ src/TargetGraph.ag view
@@ -0,0 +1,104 @@+-- This file is included by Transform.ag+-- Generates code for a dependency graph++SEM Program | Program+  loc.ppGraph   = "digraph Deps {"+                  >-< indent 2 ( vlist+                       [ ppgNode (Map.findWithDefault noPos d @blocks.gathStmtPosMap) d @loc.distRanks+                       | d <- @loc.unqItems+                       ])+                  >-< indent 2 ( vlist+                        [ label' from >#< "->" >#< ppgDeps (map label' [to])+                            >#< pp_block "[" "]" "," ( ppgColor (isOnCycle from @loc.distRanks && isOnCycle to @loc.distRanks)+                                                     : maybe [] (\d -> [ppgProp "label" d]) (ppgReason reason))+                            +                            >|< ";"+                        | (from, (reason, tos)) <- Map.assocs @loc.unqDeps+                        , length tos >= 1+                        , let label' = \item -> ppgKey (Map.findWithDefault noPos item @blocks.gathStmtPosMap) item+                        , to <- tos ]+                      )+                  >-< "}"++{+isOnCycle :: DepItem -> Map DepItem (Bool,Int) -> Bool+isOnCycle d mp+  = case Map.lookup d mp of+      Nothing    -> False+      Just (b,_) -> b++ppgProp :: PP a => String -> a -> PP_Doc+ppgProp s d = s >|< "=" >|< pp_doubleQuotes (pp d)++ppgNms :: QIdent -> PP_Doc+ppgNms = hlist . map show++ppgDeps :: PP a => [a] -> PP_Doc+ppgDeps [x] = pp x+ppgDeps xs  = pp_block "{" "}" ";" (map pp xs)++ppgNode :: Pos -> DepItem -> Map DepItem (Bool,Int) -> PP_Doc+ppgNode pos item rankMap+  = case item of+      DepMatch n      -> ppgKey pos item >#< pp_block "[" "]" "," [ppgProp "label" l, c] >|< ";"+      DepAssert n     -> ppgKey pos item >#< pp_block "[" "]" "," [ppgProp "label" l, c] >|< ";"+      DepDefault n    -> ppgKey pos item >#< pp_block "[" "]" "," [ppgProp "label" l, c] >|< ";"+      DepAttach n     -> ppgKey pos item >#< pp_block "[" "]" "," [ppgProp "shape" "box",ppgProp "label" l, c] >|< ";"+      DepInvoke nms   -> ppgKey pos item >#< pp_block "[" "]" "," [ppgProp "shape" "box",ppgProp "skew" ".3",ppgProp "label" l,c] >|< ";"+      DepVisStart nms -> ppgKey pos item >#< pp_block "[" "]" "," [ppgProp "shape" "box",ppgProp "skew" ".3",ppgProp "label" l,c] >|< ";"+      DepVisEnd nms   -> ppgKey pos item >#< pp_block "[" "]" "," [ppgProp "shape" "box",ppgProp "skew" ".3",ppgProp "label" l,c] >|< ";"+      DepClause nms   -> ppgKey pos item >#< pp_block "[" "]" "," [ppgProp "shape" "box",ppgProp "skew" ".3",ppgProp "label" l,c] >|< ";"+  where mbInfo = Map.lookup item rankMap+        l = ppgLabel pos item (maybe Nothing (Just . snd) mbInfo)+        c = ppgColor (maybe False fst mbInfo)++ppgColor :: Bool -> PP_Doc+ppgColor True  = ppgProp "color" "red4"+ppgColor False = ppgProp "color" "black"++ppgLabel :: Pos -> DepItem -> Maybe Int -> PP_Doc+ppgLabel pos item mbRank+  = case item of+      DepMatch m   -> r >#< show m >|< "?@" >|< show (line pos)+      DepAssert n  -> r >#< show n >|< "@" >|< show (line pos)+      DepDefault o -> r >#< "d" >|< show o+      DepAttach n  -> r >#< "@" >|< show (line pos)+      DepInvoke (visit:name:_) -> r >#< name >|< "." >|< visit >|< "@" >|< show (line $ identPos name)+      DepInvoke _              -> r >#< text "i???"+      DepVisStart (visit:_)    -> r >#< ">" >|< show visit >|< "@" >|< show (line $ identPos visit)+      DepVisStart _            -> r >#< text ">v???"+      DepVisEnd (visit:_)      -> r >#< show visit >|< "@" >|< show (line $ identPos visit) >|< "<"+      DepVisEnd _              -> r >#< text "<v???"+      DepClause (clause:_)     -> r >#< "|" >|< show clause >|< "@" >|< show (line $ identPos clause)+      DepClause _              -> r >#< text "|???"+  where+    r = case mbRank of+          Nothing -> empty+          Just k  -> show k >|< ":"++ppgKey :: Pos -> DepItem -> PP_Doc+ppgKey pos item+  = case item of+      DepMatch n      -> "s"  >|< show n+      DepAssert n     -> "s"  >|< show n+      DepDefault n    -> "d"  >|< show n+      DepAttach n     -> "a"  >|< show n+      DepInvoke nms   -> "iv" >|< ppgNms nms+      DepVisStart nms -> "vb" >|< ppgNms nms+      DepVisEnd nms   -> "ve" >|< ppgNms nms+      DepClause nms   -> "cl" >|< ppgNms nms++ppgReason :: Reason -> Maybe PP_Doc+ppgReason reason+  = case reason of+      ReasonScopeVisit i      -> Nothing -- Just ("sc-vis-pre" >#< show i)+      ReasonScopeClause i     -> Nothing -- Just ("sc-cl" >#< show i)+      ReasonScopeEnd i        -> Nothing -- Just ("sc-vis-end" >#< show i)+      ReasonAttrReq chld attr -> Just (show chld >|< "." >|< show attr)+      ReasonInvokeReq i       -> Just ("inv" >#< show i)+      ReasonChildReq i        -> Nothing -- Just ("chld" >#< show i)+      ReasonAttach i v        -> Just ("att" >#< show i >|< "." >|< show v)+      ReasonDefault attr      -> Nothing -- Just ("def." >|< show attr)+      ReasonDetach _ _        -> Nothing -- Just $ text "detach"+      ReasonError             -> Just $ text "error"+}
+ src/TargetHaskell.ag view
@@ -0,0 +1,644 @@+-- This file is included by Transform.ag+-- Based on the AST of AstAG.ag+-- Generates code for Haskell++SEM Program | Program+  +pp = if genHaskell @lhs.opts+        then (@loc.hpp >-<)+        else id+++{+hItfNm nm = "I_" ++ show nm+hCoItfNm nm vis = hItfNm (mkCoIdent nm vis)+hItfVsNm nm vis = "I_" ++ show nm ++ "_" ++ show vis+hCoItfVsNm nm vis = hItfVsNm (mkCoIdent nm vis) vis+hNt x = "_nt_" ++ show x+hVis x = "_vis_" ++ show x+hSemNm k v = "_sem_" ++ show k ++ "_" ++ show v++hInp child name+  | show child == "loc" = show child ++ "L" ++ show name+  | show child == "lhs" = show child ++ "I" ++ show name+  | show child == "vis" = show child ++ "I" ++ show name+  | otherwise           = show child ++ "S" ++ show name++hOutp child name+  | show child == "loc" = show child ++ "L" ++ show name+  | show child == "lhs" = show child ++ "S" ++ show name+  | show child == "vis" = show child ++ "S" ++ show name+  | otherwise           = show child ++ "I" ++ show name++hOutpLoc child name = show child ++ "L" ++ show name+hInpLoc child name = show child ++ "L" ++ show name++hInhFldNm nm itf vis = show nm ++ "_Inh_" ++ show itf+hSynFldNm nm itf vis = show nm ++ "_Syn_" ++ show itf+hInhFldNmFull nm itf vis = hInhFldNm nm itf vis ++ "_" ++ show vis+hSynFldNmFull nm itf vis = hSynFldNm nm itf vis ++ "_" ++ show vis+hCoInhFldNm nm itf vis = hInhFldNm nm (mkCoIdent itf vis) vis+hCoSynFldNm nm itf vis = hSynFldNm nm (mkCoIdent itf vis) vis+hCoInhFldNmFull nm itf vis = hCoInhFldNm nm itf vis ++ "_" ++ show vis+hCoSynFldNmFull nm itf vis = hCoSynFldNm nm itf vis ++ "_" ++ show vis++hInhDt itf vis = "Inh_" ++ show itf ++ "_" ++ show vis+hSynDt itf vis = "Syn_" ++ show itf ++ "_" ++ show vis+hCoInhDt itf vis = hInhDt (mkCoIdent itf vis) vis+hCoSynDt itf vis = hSynDt (mkCoIdent itf vis) vis++hInvNm itf nm = "invoke_" ++ show itf ++ "_" ++ show nm+hCoInvNm itf nm = "coinvoke_" ++ show itf ++ "_" ++ show nm+hNextNm itf nm = "next_" ++ show itf ++ "_" ++ show nm+hCurrentNm itf nm = "current_" ++ show itf ++ "_" ++ show nm++hDtNm nm = show nm+hConNm dt nm = show dt ++ "_" ++ show nm+hFldNm dt con nm = show nm ++ "_" ++ show dt ++ "_" ++ show con+hDtSemNm nm = "dnt_" ++ show nm++hDfltNm nm nr = "dflt_" ++ show nm ++ "_" ++ show nr++hCatch :: (PP a, PP b) => a -> b -> PP_Doc+hCatch l r = "catchError"+             >-< indent 2 (pp_parens (pp l))+             >-< indent 2 (pp_parens (pp r))++hThrow msg = "throwError" >#< pp_parens ("strMsg" >#< show msg)+}+++SEM Program | Program+  loc.hpp = vlist @blocks.hpps++ATTR Block Itf ItfVisit Data Con Field Type AliasType DataSem MaybeBoundCode BoundCode Code+     Item SemVisit ClausesTop Clauses Clause Stmt Pat ImplStmt Var AttrTypePat AttrTypeCode+  [ | | hpp : {PP_Doc} ]++ATTR ExprField [ | | hopp : {(Int,PP_Doc)} ]++SEM Block+  | Section  lhs.hpp = @code.hpp+  | Itf      lhs.hpp = @itf.hpp+  | Data     lhs.hpp = if noDataGen @lhs.opts then empty else @data.hpp+  | Type     lhs.hpp = if noDataGen @lhs.opts then empty else @type.hpp+  | Item     lhs.hpp = "mk" >|< show @name >#< "::" >#< @item.hppType+                       >-< "mk" >|< show @name >#< "="+                       >-< indent 2 @item.hpp+  | DataSem  lhs.hpp = @sem.hpp++SEM Itf+  | Itf      lhs.hpp = empty+  +             +hpp = ("type" >#< hItfNm @name >#< "m" >#< "=" >#< hItfVsNm @name @visits.firstVisit >#< "m") >-<+             +hpp = vlist @visits.hpps >-<++SEM ItfVisit+  | Visit    lhs.hpp      = empty+             loc.hCtx     = "(Monad m) => "+             loc.hMonad   = if @cyclic then empty else text "m"+             loc.hConNm   = text $ hItfVsNm @loc.itfNm @name+             loc.hCoConNm = text $ hCoItfVsNm @loc.itfNm @name+             loc.hRepFld  = [ hSynFldNmFull repIdent @loc.itfNm @name >#< "::" >#< "!" >|< pp_parens (@loc.hConNm >#< "m") ]+             loc.hNextFld = maybe [] (\nm -> [ hSynFldNmFull nextIdent @loc.itfNm @name +                                               >#< "::" >#< "!" >|< pp_parens (hItfVsNm @loc.itfNm nm >#< "m")]) @lhs.mbNextVisit+             loc.hArrTp   = hInhDt @loc.itfNm @name >#< "m" >#< "->" >#< @loc.hMonad >#< pp_parens (hSynDt @loc.itfNm @name >#< "m")+             loc.hCoArrTp = hCoInhDt @loc.itfNm @name >#< "m" >#< "->" >#< @loc.hMonad >#< pp_parens (hCoSynDt @loc.itfNm @name >#< "m")+             +hpp = ("newtype" >#< @loc.hCtx >#< @loc.hConNm >#< "m" >#< "=" >#< @loc.hConNm >#< pp_parens @loc.hArrTp) >-<+             +hpp = ("newtype" >#< @loc.hCtx >#< @loc.hCoConNm >#< "m" >#< "=" >#< @loc.hCoConNm >#< pp_parens @loc.hCoArrTp) >-<+             +hpp = ("data" >#< @loc.hCtx+                            >#< hInhDt @loc.itfNm @name >#< "m" >#< "=" >#< hInhDt @loc.itfNm @name+                            >#< pp_block "{" "}" "," @attrs.hInhDeclPPs) >-<+             +hpp = ("data" >#< @loc.hCtx+                            >#< hSynDt @loc.itfNm @name >#< "m" >#< "=" >#< hSynDt @loc.itfNm @name+                            >#< pp_block "{" "}" "," (@loc.hRepFld ++ @loc.hNextFld ++ @attrs.hSynDeclPPs)+                            ) >-<+             +hpp = ("data" >#< @loc.hCtx+                            >#< hCoInhDt @loc.itfNm @name >#< "m" >#< "=" >#< hCoInhDt @loc.itfNm @name+                            >#< pp_block "{" "}" "," @attrs.hCoInhDeclPPs) >-<+             +hpp = ("data" >#< @loc.hCtx+                            >#< hCoSynDt @loc.itfNm @name >#< "m" >#< "=" >#< hCoSynDt @loc.itfNm @name+                            >#< pp_block "{" "}" "," (+                                  (hCoSynFldNmFull repIdent @loc.itfNm @name >#< "::" >#< "!" >|< pp_parens (@loc.hCoConNm >#< "m"))+                                  : @attrs.hCoSynDeclPPs)+                             ) >-<+             +hpp = ("type" >#< hCoItfNm @loc.itfNm @name >#< "m" >#< "=" >#< hCoItfVsNm @loc.itfNm @name >#< "m") >-<+             +             +hpp = (hInvNm @loc.itfNm @name >#< "!" >|< pp_parens (@loc.hConNm >#< "!" >|< "__f") >#< "=" >#< "__f") >-<+             +hpp = (hCoInvNm @loc.itfNm @name >#< "!" >|< pp_parens (@loc.hCoConNm >#< "!" >|< "__f") >#< "=" >#< "__f") >-<+             +hpp = case @lhs.mbNextVisit of+                       Nothing -> id+                       Just v  -> ((hNextNm @loc.itfNm @name >#< "!" >|< pp_parens (+                                    hSynDt @loc.itfNm @name >#< pp_braces (+                                      hSynFldNmFull nextIdent @loc.itfNm @name >#< "=" >#< "__f")+                                  ) >#< "=" >#< "__f" >#< "--" >#< v) >-<)+             +hpp = ((hCurrentNm @loc.itfNm @name >#< "!" >|< pp_parens (+                      hSynDt @loc.itfNm @name >#< pp_braces (hSynFldNmFull repIdent @loc.itfNm @name >#< "=" >#< "__f")+                    ) >#< "=" >#< "__f") >-<)++{+nextIdent :: Ident+nextIdent = ident "next_"++repIdent :: Ident+repIdent = ident "rep_"+}++ATTR Attrs Attr [ | | hInhDeclPPs,hSynDeclPPs,hCoInhDeclPPs,hCoSynDeclPPs USE {++} {[]} : {[PP_Doc]}]++SEM Attr+  | Inh Syn  loc.hTpPP         = stripSpacing @type+             loc.pos           = identPos @name+             loc.hBoxed        = if @lhs.visCyclic then empty else text "!"+  | Inh      loc.hFldNm        = hInhFldNm @name @loc.itfNm @loc.visNm+             lhs.hInhDeclPPs   = [hWrapLinePragma @lhs.opts (identPos @name) (@loc.hFldNm >#< "::" >#< @loc.hBoxed >|< @loc.hTpPP)]+  | Syn      loc.hFldNm        = hSynFldNm @name @loc.itfNm @loc.visNm+             lhs.hSynDeclPPs   = [hWrapLinePragma @lhs.opts (identPos @name) (@loc.hFldNm >#< "::" >#< @loc.hBoxed >|< @loc.hTpPP)]++  | Inh      loc.hCoFldNm      = hCoSynFldNm @name @loc.itfNm @loc.visNm+             lhs.hCoSynDeclPPs = [hWrapLinePragma @lhs.opts (identPos @name) (@loc.hCoFldNm >#< "::" >#< @loc.hBoxed >|< @loc.hTpPP)]+  | Syn      loc.hCoFldNm      = hCoInhFldNm @name @loc.itfNm @loc.visNm+             lhs.hCoInhDeclPPs = [hWrapLinePragma @lhs.opts (identPos @name) (@loc.hCoFldNm >#< "::" >#< @loc.hBoxed >|< @loc.hTpPP)]++{+stripSpacing :: String -> PP_Doc+stripSpacing = pp_block "(" ")" " " . map text . lines+}++SEM Data | Data+  lhs.hpp   = "data" >#< hDtNm @name >#< hlist_sp @vars.hpps >-< indent 2 (vlist @cons.hpps) >-< indent 2 @loc.hExts+  loc.hExts = if Set.null @exts.gathExts+              then empty+              else "deriving" >#< pp_block "(" ")" "," [ text (show i) | i <- Set.toList @exts.gathExts ]++SEM Con | Con+  loc.prefix  = if @lhs.isFirst then "=" else "|"+  lhs.hpp     = @loc.prefix >#< @loc.hVarsPP >#< hConNm @lhs.data @name >#< pp_block "{" "}" "," @fields.hpps+  loc.hVarsPP = if null @vars.vars+                then empty+                else "forall" >#< hlist_sp (map (text .show) @vars.vars) >#< "."++SEM Field | Field+  loc.txtTp = either show id @type.fldType+  lhs.hpp   = hFldNm @lhs.data @lhs.con @name >#< "::" >#< "!" >|< hParensWithPos @lhs.opts (identPos @name) (stripSpacing @loc.txtTp)++ATTR Cons Con [ isFirst : Bool | | ]+SEM Data | Data  cons.isFirst = True+SEM Cons | Cons  tl.isFirst = False++SEM Type | Alias+  lhs.hpp = "type" >#< @name >#< hlist_sp @vars.hpps >#< "=" >#< @type.hpp++SEM AliasType+  | Prod   lhs.hpp = pp_block "(" ")" "," (map (text . show) @fields)+  | List   lhs.hpp = pp_brackets $ text $ show @type+  | Maybe  lhs.hpp = "Maybe" >#< pp_parens (text $ show @type)++SEM DataSem | Sem+  lhs.hpp = hDtSemNm @tp >#< "::" >#< @loc.hppType+            >-< hDtSemNm @tp >#< "="+            >-< indent 4 @clauses.hpp+  loc.hppType = case @mbMonad of+                  Nothing -> "(Monad m, MonadError e m, Error e) => " >#< hItfNm @tp >#< "m"+                  Just t  -> hItfNm @tp >#< pp_parens (stripSpacing t)++SEM BoundCode+  | Code         lhs.hpp = @code.hpp  -- deal with binder etc in parent++SEM MaybeBoundCode+  | Nothing      lhs.hpp = empty++SEM Code+  | Code         lhs.hpp = vlist @items.hpps++SEM Item+  | Plain        lhs.hpp = if all isSpace @txt+                           then empty+                           else vlist $ modifySpacing @loc.diff @lhs.indent @txt+  | Attr         lhs.hpp = addSpaces @loc.diff $ @tp.hpp+  | Sem CoSem    lhs.hpp = addSpaces @loc.diff ( pp_parens (+                             "let" >#< (hNt @name >#< "::" >#< @loc.hppType)+                             >-< indent 4 (hNt @name >#< "=")+                             >-< indent 6 @first.hpp+                             >-< "in" >#< hNt @name ))+  | DataSem      lhs.hpp = @sem.hpp+  | Detach       lhs.hpp = addSpaces @loc.diff (text $ hSemNm @name @visit)+  | Brackets     lhs.hpp = addSpaces @loc.diff (text "{")+                           >-< vlist @items.hpps+                           >-< addSpaces @loc.diff2 (text "}")+  | Construct    lhs.hpp      = addSpaces @loc.diff (pp_parens @loc.hpp)+                 loc.hFldsPPs = sortPairs @fields.hopps+                 loc.hpp = case @mbAlias of+                             Nothing    -> hConNm @data @con >#< hlist_sp @loc.hFldsPPs+                             Just alias -> case alias of+                                             AliasType_Prod _  -> pp_block "(" ")" "," @loc.hFldsPPs+                                             AliasType_List _  -> if @con == ident "Cons"+                                                                  then "(:)" >#< hlist_sp @loc.hFldsPPs+                                                                  else text "[]"+                                             AliasType_Maybe _ -> if @con == ident "Nothing"+                                                                  then "Just" >#< hlist_sp @loc.hFldsPPs+                                                                  else text "Nothing"++{+hWrapLinePragma :: PP a => Opts -> Pos -> a -> PP_Doc+hWrapLinePragma opts pos doc+  | isJust (outputFile opts) && not (hNoLinePragmas opts)+      = let nrIn  = line pos+            nmIn  = file pos+            nmOut = fromJust (outputFile opts)+        in ""+           >-< "{-# LINE" >#< show nrIn >#< show nmIn >#< "#-}"+           >-< doc+           >-< "{-# LINE" >#< ppWithLineNr (\n -> pp $ show $ n + 1) >#< show nmOut >#< "#-}"+           >-< ""+  | otherwise = pp doc+}++ATTR Item [ | | hppType : PP_Doc ]+SEM Item+  | Plain Attr Detach Brackets Construct+           loc.hppType = text "{- cannot be used toplevel -}"+  | Sem    loc.hppType = case @mbMonad of+                           Nothing -> "(Monad m, MonadError e m, Error e) => " >#< hItfNm @tp >#< "m"+                           Just t  -> hItfNm @tp >#< pp_parens (stripSpacing t)+  | CoSem  loc.hppType = case @mbMonad of+                           Nothing -> "(Monad m, MonadError e m, Error e) => " >#< hCoItfNm @tp @visit >#< "m"+                           Just t  -> hCoItfNm @tp @visit >#< pp_parens (stripSpacing t)+  | DataSem+           loc.hppType = text "{- no type signature for nested datatype semantics -}"++SEM SemVisit+  | Visit        loc.hChildren = hlist_sp [ hSemNm k v | (k, Just v) <- Map.assocs @loc.myNextVisits ]+                 loc.hChns     = [ hParensWithPos @lhs.opts @pos $ hInp visIdent nm | (nm,_) <- Map.assocs @attrs.gathVisitLocalAttrs ]+                 loc.hChnsOut  = [ hParensWithPos @lhs.opts @pos $ hOutp @name nm | (nm,_) <- Map.assocs @attrs.gathVisitLocalAttrs ]+                 loc.hInhPPs   = [ hInhFldNm nm @loc.itfNm @name >#< "=" >#< hParensWithPos @lhs.opts @pos (hInp lhsIdent nm)+                                 | (nm,_) <- Map.assocs @loc.inhAttrMap ]+                 loc.hMatch    = pp_parens (hInhDt @loc.itfNm @name >#< pp_block "{" "}" "," @loc.hInhPPs)+                 loc.hVisType  = if @lhs.withinCoSem+                                 then text (hCoItfVsNm @lhs.coItf @name)+                                 else text (hItfVsNm @loc.itfNm @name)+                 lhs.hpp = pp_parens (+                             "let -- __vis ::" >#< @loc.hVisType +                             >-< "    __vis =" >#< (+                               "let" >#< ( hVis @name >#< @loc.hChildren >#< @loc.hChns >#< @loc.hMatch+                                         >-< indent 2 (+                                           "=" >#< ( if @loc.fullCyclic+                                                     then "let" >#< vlist (concat @loc.hGroupedStmts)+                                                          >-< "in" >#< @clauses.hpp+                                                     else "do" >#< (+                                                            hppStmtBlock @loc.hGroupedStmts+                                                            >-< @clauses.hpp+                                                          )+                                                   )+                                           )+                                         )+                               >-< "in" >#< hItfVsNm @loc.itfNm @name >#<+                                     pp_parens (hVis @name >#< @loc.hChildren >#< @loc.hChnsOut)+                             ) >-< "in __vis"+                           )+  | Internal     lhs.hpp = hppStmtBlock @loc.hGroupedStmts+                           >-< @clauses.hpp+  | End          lhs.hpp = if @lhs.fullCyclic+                           then vlist @loc.hGroupedStmts  -- assume these end up in a let-block or do-block+                           else hppStmtBlock @loc.hGroupedStmts++{+hppStmtBlock :: PP a => [[a]] -> PP_Doc+hppStmtBlock = vlist . map ppComp+  where ppComp []  = empty+        ppComp [x] = pp x+        ppComp xs  = "let" >#< vlist (map pp xs)+}++SEM Clauses+  | Cons         lhs.hpp = if @lhs.fullCyclic+                           then @hd.hpp  -- only one clause+                           else pp_parens (hCatch @hd.hpp ("\\_ -> " >#< @tl.hpp))+  | Nil          lhs.hpp = if @lhs.fullCyclic+                           then text "undefined" -- never generated when there is only one clause+                           else pp_parens (hThrow ("no applicable clause for " ++ show (head @lhs.itf) ++ "." ++ show @lhs.visit))++SEM Clause+  | Clause       loc.hChildren = hlist_sp [ hSemNm k v | (k, Just v) <- Map.assocs @lhs.myNextVisits ]+                 loc.hChns     = hlist_sp [ hParensWithPos @lhs.opts @pos $ hInp visIdent nm+                                          | (nm,_) <- Map.assocs @lhs.directVisitLocalAttrs ]+                 loc.hNext     = maybe [] (\nm -> [ hSynFldNmFull nextIdent @loc.itfNm @lhs.visit >#< "= _visNext" ]) @next.mbNextVisit+                 loc.hVisLocs  =  [ hInp visIdent @lhs.visit >#< "=" >#< hParensWithPos @lhs.opts @pos (hOutp visIdent nm)+                                  | (nm,_) <- Map.assocs @lhs.directVisitLocalAttrs ]+                 loc.hRestart  = "_visRestart =" >#< hItfVsNm @loc.itfNm @lhs.visit+                                 >#< pp_parens (hVis @lhs.visit >#< @loc.hChildren >#< @loc.hChns)+                 loc.hResVal   = pp_parens ( hSynDt @loc.itfNm @lhs.visit+                                   >#< pp_block "{" "}" "," ( [hSynFldNmFull repIdent @loc.itfNm @lhs.visit >#< "= _visRestart" ] +++                                                               @loc.hNext +++                                                               [ hSynFldNm nm @loc.itfNm @lhs.visit >#< "=" >#<+                                                                 hParensWithPos @lhs.opts @pos (hOutp lhsIdent nm)+                                                                 | (nm,_) <- Map.assocs @loc.synAttrMap ] ))+                 lhs.hpp = if @lhs.fullCyclic+                           then "let" >#< (+                                  vlist (concat @loc.hGroupedStmts)+                                  >-< vlist @loc.hVisLocs+                                  >-< @loc.hRestart+                                  >-< case @next.mbNextVisit of+                                        Nothing -> @next.hpp  -- remaining stmts+                                        Just _  -> "_visNext" >#< "=" >#< @next.hpp+                                )+                                >-< "in" >#< @loc.hResVal+                           else "do" >#< (+                                 hppStmtBlock @loc.hGroupedStmts+                                 >-< if @loc.isDeepest+                                     then vlist (map ("let" >#<) @loc.hVisLocs)+                                           >-< "let" >#< ( "!" >|< @loc.hRestart+                                                 >-< case @next.mbNextVisit of+                                                       Nothing -> empty+                                                       Just _  -> "!" >|< "_visNext" >#< "=" >#< @next.hpp+                                               )+                                           >-< case @next.mbNextVisit of+                                                 Nothing -> @next.hpp+                                                 Just _  -> empty+                                           >-< "return" >#< @loc.hResVal+                                     else @next.hpp  -- continue with the deeper clauses+                               )++{+hParensWithPos :: PP a => Opts -> Pos -> a -> PP_Doc+hParensWithPos opts pos doc+  = ""+    >-< "("+    >-< indent 2 (hWrapLinePragma opts pos doc)+    >-< " )"+    >-< ""+}++SEM Stmt+  | Eval         loc.infoComment = "-- eval stmt:" >#< show (line @loc.pos) >#< ", rank:" >#< @loc.rank+                                     >#< ", dest: " >#< show @loc.destVisit+                 lhs.hpp = hWrapLinePragma @lhs.opts @loc.pos $+                           if @loc.isCyclic+                           then ppBindPos @lhs.opts @loc.pos @loc.isCyclic @pat.hpp @code.hpp >#< "-- rank:" >#< show @loc.rank+                           else if @mode.isMatch+                                then ppBindPos @lhs.opts @loc.pos False @pat.hpp (hppWrapRet @code.isFun @code.hpp)+                                            >#< @loc.infoComment+                                else ppBindPos @lhs.opts @loc.pos False ("!" >|< "__fresh") (hppWrapRet @code.isFun @code.hpp)+                                     >-< "let" >#< pp_parens @pat.hpp >#< "= __fresh" >#< @loc.infoComment+  | Attach       loc.infoComment = "-- attach stmt:" >#< show (line @pos) >#< ", rank:" >#< @loc.rank+                 lhs.hpp = ppBind @loc.isCyclic (hSemNm @name @loc.visit) @loc.hRhsCode >#< @loc.infoComment+                 loc.hRhsCode = if @code.isJust+                                then hppWrapRet @code.isFun @code.hpp+                                else "return" >#< pp_parens (text $ hDtSemNm @type)+  | Invoke       loc.infoComment = "-- invoke stmt:" >#< show (line @pos) >#< ", rank:" >#< @loc.rank+                 loc.hBang = if @loc.behaveCyclic then empty else text "!"+                 lhs.hpp   = (if @loc.isCyclic+                              then vlist (concat @loc.hGroupedStmts)+                              else hppStmtBlock @loc.hGroupedStmts)+                             >-< if @code.isJust+                                 then ppBind @loc.isCyclic @loc.hPat ("let" >#< @loc.hIter >-< "in" >#< @loc.hRhs) >#< @loc.infoComment+                                 else ppBind @loc.isCyclic (@loc.hBang >|< @loc.hPat)+                                           ((\p -> if not @loc.isCyclic && @loc.behaveCyclic then "return" >#< pp_parens p else p) (+                                             ("let" >#< @loc.hBang >|< pp_parens (hItfVsNm @loc.unqualChildItf @visit+                                                                                    >#< "!" >|< "__f")+                                                    >#< "=" >#< hSemNm @name @visit+                                              >-< "in" >#< "__f" >#< @loc.hfInps)))+                                        >#< @loc.infoComment+                 loc.hRhsCode = if @code.isJust+                                then @code.hpp+                                else "return" >#< pp_parens ("mk" >|< noIterNm @loc.unqualChildItf @visit)+                 loc.hIter = "__iter" >#< "!" >|< pp_parens (hItfVsNm @loc.unqualChildItf @visit >#< "!" >|< "__f")+                                      >#< @loc.hfInps+                             >-< indent 2 ( "=" >#< "do" >#< (+                                   "!" >|< ppBind False (hCoItfVsNm @loc.unqualChildItf @visit >#< "!" >|< "__g") @loc.hRhsCode+                                   >-< ppBind @loc.behaveCyclic (@loc.hBang >|< "__res@" >|< @loc.hfOuts) ("__f" >#< @loc.hfInps)+                                   >-< hCatch ("do" >#< (+                                                         @loc.hBang >|< ppBind False @loc.hgOuts ("__g" >#< @loc.hgInps)+                                                         >-< "__iter" >#< "__f" >#< @loc.hfInps+                                                       ))+                                              (text "const (return __res)")+                                 ))+                 loc.hfInps = pp_parens (hInhDt @loc.unqualChildItf @visit >#< pp_block "{" "}" ","+                                [ hInhFldNm nm @loc.unqualChildItf @visit >#< "=" >#<+                                    hParensWithPos @lhs.opts @pos (hOutp @name nm)+                                | (nm,_) <- Map.assocs @loc.inhAttrMap ] )+                 loc.hfOuts = pp_parens (hSynDt @loc.unqualChildItf @visit >#< pp_block "{" "}" ","+                                ( (hSynFldNmFull repIdent @loc.unqualChildItf @visit >#< "=" >#< "__f") :+                                [ hSynFldNm nm @loc.unqualChildItf @visit >#< "=" >#<+                                    hParensWithPos @lhs.opts @pos (hInp @name nm)+                                | (nm,_) <- Map.assocs @loc.synAttrMap ] ))+                 loc.hgInps = pp_parens (hCoInhDt @loc.unqualChildItf @visit >#< pp_block "{" "}" ","+                                [ hCoInhFldNm nm @loc.unqualChildItf @visit >#< "=" >#<+                                    hParensWithPos @lhs.opts @pos (hInp @name nm)+                                | (nm,_) <- Map.assocs @loc.synAttrMap ] )+                 loc.hgOuts = pp_parens (hCoSynDt @loc.unqualChildItf @visit >#< pp_block "{" "}" ","+                                [ hCoSynFldNm nm @loc.unqualChildItf @visit >#< "=" >#<+                                    hParensWithPos @lhs.opts @pos (hOutp @name nm)+                                | (nm,_) <- Map.assocs @loc.inhAttrMap ] )+                 loc.hRhs  = "__iter" >#< hSemNm @name @visit >#< @loc.hfInps+                 loc.hPat  = pp_parens (+                               hSynDt @loc.unqualChildItf @visit >#< pp_block "{" "}" "," (+                                 ( maybe [] (\nm -> [ hSynFldNmFull nextIdent @loc.unqualChildItf @visit >#< "=" >#< hSemNm @name nm ])+                                   @loc.mbNextVisit) +++                                 [ hSynFldNm nm @loc.unqualChildItf @visit >#< "=" >#< hInp @name nm+                                 | (nm,_) <- Map.assocs @loc.synAttrMap ]+                             ))+  | Default      loc.infoComment = "-- default stmt:" >#< show (line @pos) >#< ", rank:" >#< @loc.rank+                 lhs.hpp = if @loc.isCyclic+                           then ppBind True (text $ hDfltNm @name @loc.codeId) @mbCode.hpp >#< @loc.infoComment+                           else if @mbCode.isJust+                                then ppBindPos @lhs.opts @pos False ("!" >|< "__fresh") (hppWrapRet @mbCode.isFun @mbCode.hpp)+                                       >-< "let" >#< pp_parens (text $ hDfltNm @name @loc.codeId) >#< "= __fresh" >#< @loc.infoComment+                                else empty+  | Rename       lhs.hpp = empty++SEM ImplStmt+  | Invoke+       loc.hBang = if @loc.behaveCyclic then empty else text "!"+       lhs.hpp =   (if @loc.isCyclic+                     then vlist (concat @loc.hGroupedStmts)+                     else hppStmtBlock @loc.hGroupedStmts)+                   >-< ppBind @loc.isCyclic+                              (@loc.hBang >|< @loc.hPat)+                              ((\p -> if not @loc.isCyclic && @loc.behaveCyclic then "return" >#< pp_parens p else p) (+                              "let" >#< @loc.hBang >|< pp_parens (hItfVsNm @itf @visit >#< "!" >|< "__f")+                                     >#< "=" >#< hSemNm @child @visit+                               >-< "in" >#< "__f" >#< @loc.hfInps))+                         >#< "-- implicit invoke: " >#< show @child >|< "." >|< show @visit+       loc.hfInps = pp_parens (hInhDt @itf @visit >#< pp_block "{" "}" ","+                      [ hInhFldNm nm @itf @visit >#< "=" >#<+                          hParensWithPos @lhs.opts @pos (hOutp @child nm)+                      | (nm,_) <- Map.assocs @loc.inhAttrMap ] )+       loc.hPat  = pp_parens (+                     hSynDt @itf @visit >#< pp_block "{" "}" "," (+                       ( maybe [] (\nm -> [ hSynFldNmFull nextIdent @itf @visit >#< "=" >#< hSemNm @child nm ])+                         @loc.mbNextVisit) +++                       [ hSynFldNm nm @itf @visit >#< "=" >#< hParensWithPos @lhs.opts @pos (hInp @child nm)+                       | (nm,_) <- Map.assocs @loc.synAttrMap ]+                   ))+  +  | DefaultChild+      lhs.hpp = @loc.hPrefix >|< hParensWithPos @lhs.opts @pos (hOutp @child @name)+                >#< "=" >#< pp_parens @loc.hApp >#< "-- default rule for inh: " >#< show @child >|< "." >|< show @name+  | DefaultSyn+      lhs.hpp = @loc.hPrefix >|< hParensWithPos @lhs.opts @pos (hOutp lhsIdent @name)+                >#< "=" >#< pp_parens @loc.hApp >#< "-- default rule for syn: " >#< show lhsIdent >|< "." >|< show @name++  | DefaultChild DefaultSyn+      loc.hApp  = @loc.hFun >#< pp_block "[" "]" "," (reverse @loc.hInps)+      loc.hInps = (if @loc.lhsHasAttr then [text $ hInp lhsIdent @name] else []) ++ map (\(c,a) -> text $ hInp c a) @loc.childAttrs+      loc.hFun  = case @mbCodeRef of+                    Nothing  -> text "head"+                    Just ref -> hParensWithPos @lhs.opts @pos $ hDfltNm @name ref+  | DefaultVisLocal+      lhs.hpp = @loc.hPrefix >|< hParensWithPos @lhs.opts @pos (hOutp visIdent @name) >#< "="+                >#< hParensWithPos @lhs.opts @pos (hInp visIdent @name)+                >#< "-- default rule for vis-local: " >#< show @name+  +  | DefaultChild DefaultSyn DefaultVisLocal+      loc.hPrefix = if @loc.isCyclic then empty else text "let "++{+ppBind :: (PP a, PP b) => Bool -> a -> b -> PP_Doc+ppBind True  pat expr = pp_parens (pp pat) >#< "="  >-< indent 2 (pp_parens (pp expr))+ppBind False pat expr = pp_parens (pp pat) >#< "<-" >-< indent 2 (pp_parens (pp expr))++ppBindPos :: (PP a, PP b) => Opts -> Pos -> Bool -> a -> b -> PP_Doc+-- ppBindPos _ _ = ppBind+ppBindPos opts pos True pat expr  = hWrapLinePragma opts pos (pp pat) >#< "="  >-< indent 2 (hWrapLinePragma opts pos (pp expr))+ppBindPos opts pos False pat expr = hWrapLinePragma opts pos (pp pat) >#< "<-" >-< indent 2 (hWrapLinePragma opts pos (pp expr))++hppWrapRet :: PP a => Bool -> a -> PP_Doc+hppWrapRet True d  = "return" >#< pp_parens (pp d)+hppWrapRet False d = pp d+}++SEM Pat+  | Con          lhs.hpp = @loc.hBang >|< hParensWithPos @lhs.opts (identPos @name) (@name >#< hlist_sp @pats.hpps)+  | AttrCon      lhs.hpp          = @loc.hBang >|< (pp_parens @loc.hpp)+                 loc.hFldsPPs     = [ hParensWithPos @lhs.opts (identPos @name) (hOutpLoc @name nm) | (nm,_) <- @loc.fields ]+                 loc.hBangFldsPPs = map (@loc.hBang >|<) @loc.hFldsPPs+                 loc.hpp = case @mbAlias of+                             Nothing    -> hConNm @dt @con >#< hlist_sp @loc.hFldsPPs+                             Just alias -> case alias of+                                             AliasType_Prod _  -> pp_block "(" ")" "," @loc.hBangFldsPPs+                                             AliasType_List _  -> if @con == ident "Cons"+                                                                  then "(:)" >#< hlist_sp @loc.hBangFldsPPs+                                                                  else text "[]"+                                             AliasType_Maybe _ -> if @con == ident "Nothing"+                                                                  then text "Nothing"+                                                                  else "Just" >#< hlist_sp @loc.hBangFldsPPs+  | Attr         lhs.hpp = @loc.hBang >|< hParensWithPos @lhs.opts (identPos @child) @tp.hpp+  | Tup          lhs.hpp = @loc.hBang >|< pp_block "(" ")" "," @pats.hpps+  | List         lhs.hpp = @loc.hBang >|< pp_block "[" "]" "," @pats.hpps+  | Cons         lhs.hpp = @loc.hBang >|< pp_parens (@hd.hpp >#< ":" >#< pp_parens @tl.hpp)+  | Underscore   lhs.hpp = @loc.hBang >|< text "_"+  | *            loc.hBang = if @lhs.isCyclic then empty else text "!"++SEM ExprField | Field+  lhs.hopp = (@loc.fieldIndex, pp_parens @code.hpp)++SEM Var | Var+  lhs.hpp = text (show @name)+++SEM AttrTypePat+  | ProdLocal  lhs.hpp = text $ hOutpLoc @lhs.child @lhs.name+  | VisLocal Lhs Child Visit+               lhs.hpp = text $ hOutp @lhs.child @lhs.name++SEM AttrTypeCode+  | ProdLocal  lhs.hpp = text $ hInpLoc @lhs.child @lhs.name+  | VisLocal Lhs Child Visit+               lhs.hpp = text $ hInp @lhs.child @lhs.name+++ATTR BlocksTop Blocks ItfVisits Items Pats Cons Fields Vars+  [ | | hpps : {[PP_Doc]} ]++SEM BlocksTop+  | Top   lhs.hpps = @blocks.hpps ++ (if noDataGen @lhs.opts then [] else @extra.hpps)+  | None  lhs.hpps = []++SEM Blocks+  | Cons  lhs.hpps = @hd.hpp : @tl.hpps+  | Nil   lhs.hpps = []++SEM ItfVisits+  | Cons  lhs.hpps = @hd.hpp : @tl.hpps+  | Nil   lhs.hpps = []++SEM Cons+  | Cons  lhs.hpps = @hd.hpp : @tl.hpps+  | Nil   lhs.hpps = []++SEM Fields+  | Cons  lhs.hpps = @hd.hpp : @tl.hpps+  | Nil   lhs.hpps = []++SEM Items+  | Cons  lhs.hpps = @hd.hpp : @tl.hpps+  | Nil   lhs.hpps = []++SEM Pats+  | Cons  lhs.hpps = @hd.hpp : @tl.hpps+  | Nil   lhs.hpps = []++SEM Vars+  | Cons  lhs.hpps = @hd.hpp : @tl.hpps+  | Nil   lhs.hpps = []+++--+-- Compute spread of stmts+--++ATTR AllFinal [ hSpilledStmts : {[(Int,PP_Doc)]} | | ]+SEM Program | Program  blocks.hSpilledStmts = []++SEM SemVisit | Visit Internal+  (loc.hoStmts, clauses.hSpilledStmts) = partition (rankIsLower @clauses.minRank)+                                           (@lhs.hSpilledStmts ++ @impls.hopps ++ @stmts.hopps)+  loc.hGroupedStmts = groupPairs @loc.hoStmts++SEM SemVisit | End+  loc.hGroupedStmts = groupPairs @lhs.hSpilledStmts++SEM Clause | Clause+  (loc.hoStmts, next.hSpilledStmts) = partition (rankIsLower @next.minRank)+                                        (@lhs.hSpilledStmts ++ @deflts.hopps ++ @impls.hopps ++ @stmts.hopps)++  loc.hGroupedStmts = groupPairs @loc.hoStmts++SEM Stmt | Invoke      loc.hGroupedStmts = groupPairs @deflts.hopps+SEM ImplStmt | Invoke  loc.hGroupedStmts = groupPairs @deflts.hopps+++{+rankIsLower :: Int -> (Int, PP_Doc) -> Bool+rankIsLower m (n,_) = n < m+}++--+-- Certain fields need to be ordered+--++ATTR Stmts ImplStmts+  [ | | hopps : {[(Int, PP_Doc)]} ]++SEM ImplStmts+  | Cons  lhs.hopps = (@hd.rank, @hd.hpp) : @tl.hopps+  | Nil   lhs.hopps = []++SEM Stmts+  | Cons  lhs.hopps = (@hd.rank, @hd.hpp) : @tl.hopps+  | Nil   lhs.hopps = []++ATTR ExprFields+  [ | | hopps : {[(Int,PP_Doc)]} ]++SEM ExprFields+  | Cons  lhs.hopps = @hd.hopp : @tl.hopps+  | Nil   lhs.hopps = []++{+sortPairs :: [(Int,a)] -> [a]+sortPairs = map snd . sortBy (\(x,_) (y,_) -> x `compare` y)++groupPairs :: [(Int,a)] -> [[a]]+groupPairs = map (map snd) . groupBy (\(x,_) (y,_) -> x == y) . sortBy (\(x,_) (y,_) -> x `compare` y)+}
+ src/TargetJs.ag view
@@ -0,0 +1,425 @@+-- This file is included by Transform.ag+-- Based on the AST of AstAG.ag+-- Generates code for Javascript++SEM Program | Program+  +pp = if genJs @lhs.opts+        then (@loc.jspp >-<)+        else id++{+jsInp child name+  | show child == "loc" = show child ++ "L" ++ show name+  | show child == "lhs" = show child ++ "I" ++ show name+  | show child == "vis" = show child ++ "I" ++ show name+  | otherwise           = show child ++ "S" ++ show name++jsOutp child name+  | show child == "loc" = show child ++ "L" ++ show name+  | show child == "lhs" = show child ++ "S" ++ show name+  | show child == "vis" = show child ++ "S" ++ show name+  | otherwise           = show child ++ "I" ++ show name++jsDtSemNm nm = "dnt_" ++ show nm++jsVis nm vis = "vis_" ++ show nm ++ "_" ++ show vis++jsConNm dt nm = show dt ++ "_" ++ show nm+}++SEM Program | Program+  loc.jspp = vlist @blocks.jspps++ATTR Block Itf ItfVisit Data Con Field Type AliasType DataSem MaybeBoundCode BoundCode Code+     Item SemVisit ClausesTop Clauses Clause Stmt Pat ImplStmt Var AttrTypePat AttrTypeCode+  [ | | jspp : {PP_Doc} ]++ATTR ExprField [ | | jsopp : {(Int,PP_Doc)} ]++SEM Block+  | Section  lhs.jspp = @code.jspp+  | Itf      lhs.jspp = @itf.jspp+  | Data     lhs.jspp = @data.jspp+  | Type     lhs.jspp = empty+  | Item     lhs.jspp = "var mk" >|< show @name >#< "=" >-< indent 2 @item.jspp+  | DataSem  lhs.jspp = @sem.jspp++SEM Itf+  | Itf      lhs.jspp = vlist @visits.jspps++SEM ItfVisit+  | Visit    lhs.jspp = empty+             loc.jsInhNm = "Inh_" >|< jsConNm @loc.itfNm @name+             loc.jsSynNm = "Syn_" >|< jsConNm @loc.itfNm @name+             +jspp = ("function" >#< @loc.jsInhNm >#< "() {}"+                     >-< @loc.jsInhNm >|< ".prototype.check = function()"+                     >-< indent 2 (pp_braces (+                           vlist [ jsTpCheck nm tp | (nm,tp) <- Map.assocs @attrs.gathVisitInhAttrs ]+                         ))+                     >-< "function" >#< @loc.jsSynNm >#< "() {}"+                      >-< @loc.jsSynNm >|< ".prototype.check = function()"+                      >-< indent 2 (pp_braces (+                            vlist [ jsTpCheck nm tp | (nm,tp) <- Map.assocs @attrs.gathVisitSynAttrs ]+                          ))+                     ) >-<++{+jsTpCheck nm tp+  = "var _val = this." >|< show nm >|< ";"+    >-< "if (_val === undefined) { throw \"Undefined attribute: " >|< show nm >|< "\"; }"+    >-< if all isSpace tp+        then empty+        else "var _assert =" >#< tp >#< ";"+             >-< "if (!_assert) { throw \"Assert function undefined\"; }"+             >-< "var _outcome = _assert(_val);"+             >-< "if (!_outcome) { throw \"Attribute fails predicate: " >|< show nm >|< "\"; }"+}++SEM Data | Data+  lhs.jspp = "function" >#< show @name >#< "() {}"+             >-< vlist @cons.jspps++SEM Con | Con+  lhs.jspp = "function" >#<  jsConNm @lhs.data @name+                 >#< pp_block "(" ")" "," @fields.jspps+             >-< pp_braces (+                   vlist [ "this." >|< nmPP >#< "=" >#< nmPP >|< ";" | nmPP <- @fields.jspps ]+                   >-< vlist @fields.jsChecksPPs+                 )+             >-< jsConNm @lhs.data @name >|< ".prototype = new " >#< show @lhs.data >|< "();"+             >-< jsConNm @lhs.data @name >|< ".prototype.constructor =" >#< jsConNm @lhs.data @name >|< ";"++ATTR Fields Field [ | | jsChecksPPs USE {++} {[]} : {[PP_Doc]} ]+ATTR FieldType [ | | jsCheckPP : {Maybe PP_Doc} ]++SEM Field | Field+  lhs.jspp = text $ show @name+  lhs.jsChecksPPs = [ "var _val = " >#< show @name >|< ";"+                      >-< "if (_val === undefined) { throw \"Field undefined: " >|< show @name >|< "\";}"+                      >-< case @type.jsCheckPP of+                            Nothing -> text "_outcome = true;"+                            Just p  -> p+                      >-< "if" >#< pp_parens ("!_outcome")+                      >#< pp_braces ("throw \"Field fails predicate: " >|< show @name >|< "\";") ]++SEM FieldType+  | Term     lhs.jsCheckPP = if all isSpace @type+                             then Nothing+                             else Just ("var _assert =" >#< @type >|< ";"+                                  >-< "if (!_assert) { throw \"assert function undefined\"; }"+                                  >-< "var _outcome = _assert(_val);")+  | Nonterm  lhs.jsCheckPP = case @loc.mbAlias of+                               Nothing -> Just ("var _outcome = _val instanceof" >#< show @name >|< ";")+                               Just alias -> case alias of+                                                AliasType_Prod _  -> Just $ text ("var _outcome = _val instanceof Tuple;")+                                                AliasType_List _  -> Just $ text ("var _outcome = _val instanceof Array;")+                                                AliasType_Maybe _ -> Just $ text ("var _outcome = _val instanceof Maybe;")++SEM Type | Alias+  lhs.jspp = empty++SEM AliasType+  | Prod   lhs.jspp = empty+  | List   lhs.jspp = empty+  | Maybe  lhs.jspp = empty++SEM DataSem | Sem+  lhs.jspp = "var dnt_" >|< show @tp >#< "="+             >#< pp_parens ( "function ()"+                         >-< pp_braces (+                               "var" >#< "nt" >|< show @tp >#< "=" >#< @clauses.jspp >|< ";"+                                >-< "return" >#< "nt" >|< show @tp >|< ";"+                         )) >|< ";"++SEM BoundCode+  | Code         lhs.jspp = @code.jspp  -- deal with binder etc in parent++SEM MaybeBoundCode+  | Nothing      lhs.jspp = empty++SEM Code+  | Code         lhs.jspp = vlist @items.jspps++SEM Item+  | Plain        lhs.jspp = if all isSpace @txt+                            then empty+                            else vlist $ modifySpacing @loc.diff @lhs.indent @txt+  | Attr         lhs.jspp = addSpaces @loc.diff @tp.jspp+  | Sem CoSem    lhs.jspp = addSpaces @loc.diff (pp_parens (+                              "function ()"+                              >-< pp_braces (+                                    "var" >#< "nt" >|< show @name >#< "=" >#< @first.jspp >|< ";"+                                    >-< "return" >#< "nt" >|< show @name >|< ";"+                                  )+                            ))+  | DataSem      lhs.jspp = @sem.jspp+  | Detach       lhs.jspp = addSpaces @loc.diff empty+  | Brackets     lhs.jspp = addSpaces @loc.diff (text "{")+                            >-< vlist @items.jspps+                            >-< addSpaces @loc.diff2 (text "}")+  | Construct    lhs.jspp      = addSpaces @loc.diff (pp_parens @loc.jspp)+                 loc.jspp      = case @mbAlias of+                                   Nothing    -> empty+                                   Just alias -> case alias of+                                                   AliasType_Prod _  -> empty+                                                   AliasType_List _  -> empty+                                                   AliasType_Maybe _ -> empty++SEM SemVisit+  | Visit        lhs.jspp = "function (_inps)" +                            >-< pp_braces (+                                  "_inps.check();"+                                  >-< vlist [ "var" >#< jsInp lhsIdent nm >#< "=" >#< "_inps." >|< show nm >|< ";"+                                            | (nm,_) <- Map.assocs @loc.inhAttrMap ]+                                  >-< jsppStmtBlock @loc.jsGroupedStmts+                                  >-< @clauses.jspp+                                )+  | Internal     lhs.jspp = jsppStmtBlock @loc.jsGroupedStmts+                            >-< @clauses.jspp+  | End          lhs.jspp = if @lhs.fullCyclic+                            then vlist @loc.jsGroupedStmts+                            else jsppStmtBlock @loc.jsGroupedStmts++{+jsppStmtBlock :: PP a => [[a]] -> PP_Doc+jsppStmtBlock = vlist . map ppComp+  where ppComp []  = empty+        ppComp [x] = pp x+        ppComp xs  = vlist (map pp xs)+}++SEM Clauses+  | Cons         lhs.jspp = if @lhs.fullCyclic+                            then @hd.jspp  -- only one clause+                            else "try" >#< pp_braces (+                                    @hd.jspp+                                 ) >-< "catch (err)" >#< pp_braces (+                                   "if (err == eEval)"+                                   >-< pp_braces (+                                     @tl.jspp+                                   ) >-< "else" >#< pp_braces (+                                     text "throw err;"+                                   )+                                 )+  | Nil          lhs.jspp = text "throw eEval;"++SEM Clause+  | Clause       lhs.jspp = jsppStmtBlock @loc.jsGroupedStmts+                            >-< if @loc.isDeepest+                                then "var _outs = new Syn_" >|< jsConNm (head @lhs.itf) @lhs.visit >|< "();"+                                     >-< case @next.mbNextVisit of+                                           Just _  -> "_outs._next = " >#< @next.jspp >|< ";"+                                           Nothing -> @next.jspp+                                     >-< vlist [ "_outs." >|< show nm >#< "=" >#< jsOutp lhsIdent nm >|< ";"+                                               | (nm,_) <- Map.assocs @loc.synAttrMap ]+                                     >-< "return _outs;"+                                else @next.jspp++SEM Stmt+  | Eval         lhs.jspp = ( if not @mode.isMatch+                              then "var _res; try" >#< pp_braces ("_res =" >#< @code.jspp >|< ";")+                                    >-< "catch(err) { if (err == eEval) { throw eAbort; } else { throw err; } }"+                              else "var _res = " >#< @code.jspp+                            ) >|< ";" >-< @pat.jspp+                 pat.isMatch = @mode.isMatch+  | Attach       lhs.jspp = "var _semantics =" >#< @loc.jsRhsCode >|< ";"+                            >-< "if (!_semantics) { throw \"Undefined semantics: " >|< show @name >|< "\"; }"+                            >-< "var" >#< jsVis @name @visit >#< "= _semantics();"+                            >-< "if (!" >|< jsVis @name @visit >|< ") { throw \"Undefined attached semantics: " >|< show @name >|< "\"; }"+                 loc.jsRhsCode = if @code.isJust+                                 then @code.hpp+                                 else text $ jsDtSemNm @type+  | Invoke       lhs.jspp = jsppStmtBlock @loc.jsGroupedStmts+                            >-< "var _args = new Inh_" >|< jsConNm @loc.unqualChildItf @visit >|< "();"+                            >-< vlist [ "_args." >|< show nm >#< "=" >#< jsOutp @name nm >|< ";"+                                      | (nm,_) <- Map.assocs @loc.inhAttrMap ]+                            >-< "if (!" >|< jsVis @name @visit >|< ") { throw \"uninitialized semantics: ">|< jsVis @name @visit >#< "(expl)\"; }"+                            >-< "var _res =" >#< jsVis @name @visit >#< pp_parens (text "_args") >|< ";"+                            >-< "_res.check();"+                            >-< vlist [ "var" >#< (jsInp @name nm) >#< "=" >#< "_res." >|< show nm >|< ";"+                                      | (nm,_) <- Map.assocs @loc.synAttrMap ]+                            >-< case @loc.mbNextVisit of+                                  Nothing   -> empty+                                  Just next -> "var" >#< jsVis @name next >#< "= _res._next;"+  +  | Default      lhs.jspp = if @mbCode.isJust+                            then "var _def" >|< show @loc.codeId >#< "=" >#< @mbCode.jspp >|< ";"+                            else empty+  | Rename       lhs.jspp = empty++SEM ImplStmt+  | Invoke+       lhs.jspp = jsppStmtBlock @loc.jsGroupedStmts+                  >-< "var _args = new Inh_" >|< jsConNm @itf @visit >|< "();"+                  >-< vlist [ "_args." >|< show nm >#< "=" >#< jsOutp @child nm >|< ";"+                            | (nm,_) <- Map.assocs @loc.inhAttrMap ]+                  >-< "if (!" >|< jsVis @child @visit >|< ") { throw \"uninitialized semantics: ">|< jsVis @child @visit >#< " (impl)\"; }"+                  >-< "var _res =" >#< jsVis @child @visit >#< pp_parens (text "_args") >|< ";"+                  >-< "_res.check();"+                  >-< vlist [ "var" >#< (jsInp @child nm) >#< "=" >#< "_res." >|< show nm >|< ";"+                            | (nm,_) <- Map.assocs @loc.synAttrMap ]+                  >-< case @loc.mbNextVisit of+                        Nothing   -> empty+                        Just next -> "var" >#< jsVis @child next >#< "= _res._next;"+                  +                  +  +  | DefaultChild+      lhs.jspp = "var" >#< hOutp @child @name >#< "=" >#< @loc.jsApp >|< ";"+  | DefaultSyn+      lhs.jspp = "var" >#< hOutp lhsIdent @name >#< "=" >#< @loc.jsApp >|< ";"+  +  | DefaultChild DefaultSyn+      loc.jsApp = case @mbCodeRef of+                    Nothing  -> @loc.jsArr >|< "[0]"+                    Just ref -> "_def" >|< show ref >#< pp_parens @loc.jsArr+      loc.jsArr = pp_block "[" "]" "," (reverse @loc.jsInps)+      loc.jsInps = (if @loc.lhsHasAttr then [text $ jsInp lhsIdent @name] else []) ++ map (\(c,a) -> text $ jsInp c a) @loc.childAttrs++  | DefaultVisLocal+      lhs.jspp = empty++ATTR Pat Pats [ isMatch : Bool | | ]++SEM Pat+  | Con          lhs.jspp = "if (!(_res instanceof" >#< show @name >|< "))" >#< @loc.jsThrow+                            >-< "var _con = _res;"+                            >-< vlist [ "var _res = _con[" >|< show i >|< "];"+                                        >-< jspp+                                      | (i, jspp) <- zip [0..] @pats.jspps ]+  | AttrCon      lhs.jspp = case @mbAlias of+                              Nothing    -> "if (!(_res instanceof" >#< jsConNm @dt @con >|< "))" >#< @loc.jsThrow+                                            >-< "var _val = _res;"+                                            >-< vlist @loc.jsFieldPPs+                              Just alias -> case alias of+                                              AliasType_Prod _  -> "if (!(_res instanceof Tuple))" >#< @loc.jsThrow+                                                                   >-< "if (_res.length != " >|< (show $ length @loc.fields) >|< ")" >#< @loc.jsThrow+                                                                   >-< "var _val = _res;"+                                                                   >-< vlist @loc.jsFieldPPs+                                              AliasType_List _  -> if @con == ident "Cons"+                                                                   then "if (!(_res instanceof Array))" >#< @loc.jsThrow+                                                                        >-< "if (_res.length < 1)" >#< @loc.jsThrow+                                                                        >-< "var" >#< hOutp @name (ident "hd") >#< "= _res[0];"+                                                                        >-< "var" >#< hOutp @name (ident "tl") >#< "= _res.slice(1);"+                                                                   else "if (!(_res instanceof Array))" >#< @loc.jsThrow+                                                                        >-< "if (_res.length != 0)" >#< @loc.jsThrow+                                              AliasType_Maybe _ -> if @con == ident "Nothing"+                                                                   then "if (!(_res instanceof Maybe_Nothing))" >#< @loc.jsThrow+                                                                   else "if (!(_res instanceof Maybe_Just))" >#< @loc.jsThrow+                                                                        >-< "var _val = _res;"+                                                                        >-< vlist @loc.jsFieldPPs+                 loc.jsFieldPPs = [ "var" >#< hOutp @name nm >#< "= _val." >|< show nm >|< ";" | (nm,_) <- @loc.fields ]+  | Attr         lhs.jspp = "var" >#< @tp.jspp >#< "=" >#< "_res;"+  | Tup          lhs.jspp = "var _tuple = _res;"+                            >-< "if (_tuple.length !=" >#< length (@pats.jspps) >|< ")" >#< @loc.jsThrow+                            >-< vlist [ "var _res = _tuple[" >|< show i >|< "];"+                                        >-< jspp+                                      | (i, jspp) <- zip [0..] @pats.jspps ]+  | List         lhs.jspp = "var _arr = _res;"+                            >-< "if (_tuple.length !=" >#< length (@pats.jspps) >|< ")" >#< @loc.jsThrow+                            >-< vlist [ "var _res = _arr[" >|< show i >|< "];"+                                        >-< jspp+                                      | (i, jspp) <- zip [0..] @pats.jspps ]+  | Cons         lhs.jspp = "var _arr = _res;"+                            >-< "if (_arr.length < 1)" >#< @loc.jsThrow+                            >-< "var _res = _arr[0];"+                            >-< @hd.jspp+                            >-< "var _res = _arr.slice(1);"+                            >-< @tl.jspp+  | Underscore   lhs.jspp = empty+  +  | Tup List Cons Con AttrCon+      loc.jsThrow = if @lhs.isMatch+                    then "throw eEval;"+                    else "throw eAbort;"++SEM ExprField | Field+  lhs.jsopp = (@loc.fieldIndex, pp_parens @code.jspp)++SEM Var | Var+  lhs.jspp = text (show @name)++SEM AttrTypePat  | *   lhs.jspp = text $ jsOutp @lhs.child @lhs.name+SEM AttrTypeCode | *   lhs.jspp = text $ jsInp  @lhs.child @lhs.name++ATTR BlocksTop Blocks ItfVisits Items Pats Cons Fields Vars+  [ | | jspps : {[PP_Doc]} ]++SEM BlocksTop+  | Top   lhs.jspps = @blocks.jspps+  | None  lhs.jspps = []++SEM Blocks+  | Cons  lhs.jspps = @hd.jspp : @tl.jspps+  | Nil   lhs.jspps = []++SEM ItfVisits+  | Cons  lhs.jspps = @hd.jspp : @tl.jspps+  | Nil   lhs.jspps = []++SEM Cons+  | Cons  lhs.jspps = @hd.jspp : @tl.jspps+  | Nil   lhs.jspps = []++SEM Fields+  | Cons  lhs.jspps = @hd.jspp : @tl.jspps+  | Nil   lhs.jspps = []++SEM Items+  | Cons  lhs.jspps = @hd.jspp : @tl.jspps+  | Nil   lhs.jspps = []++SEM Pats+  | Cons  lhs.jspps = @hd.jspp : @tl.jspps+  | Nil   lhs.jspps = []++SEM Vars+  | Cons  lhs.jspps = @hd.jspp : @tl.jspps+  | Nil   lhs.jspps = []+++--+-- Compute spread of stmts+--++ATTR AllFinal [ jsSpilledStmts : {[(Int,PP_Doc)]} | | ]+SEM Program | Program  blocks.jsSpilledStmts = []++SEM SemVisit | Visit Internal+  (loc.jsoStmts, clauses.jsSpilledStmts) = partition (rankIsLower @clauses.minRank)+                                             (@lhs.jsSpilledStmts ++ @impls.jsopps ++ @stmts.jsopps)+  loc.jsGroupedStmts = groupPairs @loc.jsoStmts++SEM SemVisit | End+  loc.jsGroupedStmts = groupPairs @lhs.jsSpilledStmts++SEM Clause | Clause+  (loc.jsoStmts, next.jsSpilledStmts) = partition (rankIsLower @next.minRank)+                                          (@lhs.jsSpilledStmts ++ @deflts.jsopps ++ @impls.jsopps ++ @stmts.jsopps)++  loc.jsGroupedStmts = groupPairs @loc.jsoStmts++SEM Stmt | Invoke      loc.jsGroupedStmts = groupPairs @deflts.jsopps+SEM ImplStmt | Invoke  loc.jsGroupedStmts = groupPairs @deflts.jsopps++--+-- Certain fields need to be ordered+--++ATTR Stmts ImplStmts+  [ | | jsopps : {[(Int, PP_Doc)]} ]++SEM ImplStmts+  | Cons  lhs.jsopps = (@hd.rank, @hd.jspp) : @tl.jsopps+  | Nil   lhs.jsopps = []++SEM Stmts+  | Cons  lhs.jsopps = (@hd.rank, @hd.jspp) : @tl.jsopps+  | Nil   lhs.jsopps = []++ATTR ExprFields+  [ | | jsopps : {[(Int,PP_Doc)]} ]++SEM ExprFields+  | Cons  lhs.jsopps = @hd.jsopp : @tl.jsopps+  | Nil   lhs.jsopps = []
+ src/Transform.ag view
@@ -0,0 +1,2670 @@+MODULE {Transform} {transform} {}++PRAGMA genlinepragmas++INCLUDE "AstAG.ag"++imports+{+import Common+import Ast+import Errs+import Data.Sequence(Seq)+import qualified Data.Sequence as Seq+import Data.Map(Map)+import qualified Data.Map as Map+import Data.IntMap(IntMap)+import qualified Data.IntMap as IntMap+import Data.Set(Set)+import qualified Data.Set as Set+import Env+import Data.Monoid+import Data.List(nub, isPrefixOf, intersect, sortBy, partition, groupBy, sort)+import Pretty+import UU.Scanner.Position+import Opts+import Data.Maybe+import Data.Char+import Data.Graph+import Data.Foldable(toList)+import DepAnalysis+import Debug.Trace(trace)+}+++WRAPPER Program++{+transform :: Pos -> Opts -> Program -> (Errs, String, String, String)+transform pos opts prog+  = (errs, txtPretty, txtTarget, txtGraph)+  where+    inh  = Inh_Program { opts_Inh_Program = opts, pos_Inh_Program = pos }+    syn  = wrap_Program sem inh+    sem  = sem_Program prog+    errs = firstErrs [ errs0_Syn_Program syn+                     , errs1_Syn_Program syn+                     , errs2_Syn_Program syn+                     , errs3_Syn_Program syn+                     , errs4_Syn_Program syn+                     , errs5_Syn_Program syn ]+    +    resPretty = pretty_Syn_Program syn+    txtPretty = disp resPretty 999999 ""+    resTarget = pp_Syn_Program syn+    txtTarget = disp resTarget 999999 ""+    resGraph  = graph_Syn_Program syn+    txtGraph  = disp resGraph 999999 ""++firstErrs :: [Errs] -> Errs+firstErrs [] = Seq.empty+firstErrs (x:xs) = if Seq.null x then firstErrs xs else x+}+++--+-- Transformations for various backends+--++ATTR Program [ | | pp, pretty, graph : {PP_Doc} ]+SEM Program | Program+  lhs.pp     = empty   -- add output for additional backends+  lhs.pretty = @loc.ppId+  lhs.graph  = @loc.ppGraph++INCLUDE "TargetHaskell.ag"+INCLUDE "TargetJs.ag"+INCLUDE "TargetGraph.ag"+++ATTR Program AllFinal AllDataFields Itf ItfVisits ItfVisit Attrs Attr Type  [ opts : Opts | | ]+ATTR Program [ pos : Pos | | ]+++--+-- Collect errors+--++-- errs0: data-type/itf based checks+-- errs1: rudamentary checks+-- errs2: child checks+-- errs3: attribute checks+-- errs4: cycle checks++SET AllDataFields = Data Cons Con Fields Field FieldType+SET AllCode = AllCodeWithoutAttrs AttrTypePat AttrTypeCode+SET AllCodeWithoutAttrs = Code Items Item DataSem AllVisitClauses Stmts Stmt+                          MaybeBoundCode BoundCode Pats Pat  ExprFields ExprField+                          SemCons SemCon SemFields SemField+SET AllCodeBlocksWithoutAttrs = BlocksTop Blocks Block AllCodeWithoutAttrs+SET AllCodeBlocks = BlocksTop Blocks Block AllCode+SET AllVisitClauses = SemVisit ClausesTop Clauses Clause+SET AllFinal = AllCodeBlocks ImplStmts ImplStmt+SET AllVisFinal = AllVisitClauses ImplStmts ImplStmt Stmts Stmt Pats Pat AttrTypePat AttrTypeCode++ATTR Program AllCodeBlocks Data Type Cons Con Itf ItfVisits ItfVisit+  [ | | errs0,errs1,errs2,errs3,errs4,errs5 USE {Seq.><} {Seq.empty} : Errs ]+ATTR ImplStmts ImplStmt [ | | errs2,errs3,errs4,errs5 USE {Seq.><} {Seq.empty} : Errs ]++SEM Program+  | Program  +errs0 = addDefErrs @blocks.gathItfs+             +errs0 = addDefErrs @blocks.gathVisits+             +errs0 = addDefErrs @blocks.gathInhs+             +errs0 = addDefErrs @blocks.gathSyns+             +errs1 = addDefErrs @blocks.gathNonterms+             +errs1 = addDefErrs @blocks.gathClauses+             +errs1 = addUseErrs @blocks.distItfs+             +errs1 = addUseErrs @blocks.distVisits+             +errs1 = addUseErrs @blocks.distChildDefs+             +errs0 = addDefErrs @blocks.gathDataCons+             +errs0 = addUseErrs @blocks.distDataCons+             +errs0 = addDefErrs' @blocks.gathDatas+             +errs0 = addUseErrs' @blocks.distDatas+             -- +errs0 = addDefErrs' @blocks.gathDataSems  -- duplicate datasems allowed+             +errs1 = addUseErrs' @blocks.distDataSems+             +errs3 = addDefErrs'' @blocks.gathDefs+             +errs3 = addUseErrs'' @blocks.distDefs++{+addDefErrs :: Env QIdent v -> Errs -> Errs+addDefErrs env es+  = Seq.fromList (map (Err_Dup . map head) ds) Seq.>< es+  where ds = map (map fst) (dups env)++addUseErrs :: Env QIdent v -> Errs -> Errs+addUseErrs env es+  = Seq.fromList (map (Err_Missing . map head) ms) Seq.>< es+  where ms = missing env++addDefErrs' :: Env Ident v -> Errs -> Errs+addDefErrs' env es+  = Seq.fromList (map Err_Dup ds) Seq.>< es+  where ds = map (map fst) (dups env)++addUseErrs' :: Env Ident v -> Errs -> Errs+addUseErrs' env es+  = Seq.fromList (map Err_Missing ms) Seq.>< es+  where ms = missing env++addDefUseErrs' :: Env Ident v -> Errs -> Errs+addDefUseErrs' env = addDefErrs' env . addUseErrs' env++addDefErrs'' :: Env (Ident,Ident,Bool) v -> Errs -> Errs+addDefErrs'' env es+  = Seq.fromList (map mkDupErr ds) Seq.>< es+  where ds = map (map fst) (dups env)+        mkDupErr ((c,n,b):_) = Err_DupAttr b c n++addUseErrs'' :: Env (Ident,Ident,Bool) v -> Errs -> Errs+addUseErrs'' env es+  = Seq.fromList (map mkMissErr ms) Seq.>< es+  where ms = missing env+        mkMissErr ((c,n,b):_) = Err_MissingAttr b c n++addDefUseErrs'' :: Env (Ident,Ident,Bool) v -> Errs -> Errs+addDefUseErrs'' env = addDefErrs'' env . addUseErrs'' env+}++--+-- Standard duplication checks+--+++{+type ItfEnv = Env QIdent ()+}++ATTR BlocksTop Blocks Block Itf ItfVisits ItfVisit [ | gathItfs : ItfEnv | ]++SEM Program | Program  blocks.gathItfs = emptyEnv++SEM Itf | Itf         +gathItfs = extend [@name] ()+SEM ItfVisit | Visit  +gathItfs = extend @loc.coItf ()++ATTR ItfVisits ItfVisit Attrs Attr [ itf : {QIdent} | | ]+SEM Itf | Itf  visits.itf = [@name]++{+type VisitEnv = Env QIdent ()+}++ATTR BlocksTop Blocks Block Itf ItfVisits ItfVisit [ | gathVisits : VisitEnv | ]++SEM Program | Program  blocks.gathVisits = emptyEnv++SEM ItfVisit | Visit+  +gathVisits = extend (@name : @lhs.itf) ()+  +gathVisits = extend (@name : @loc.coItf) ()+++ATTR Attrs Attr [ visit : {QIdent} coItf : {QIdent} | | ]+SEM ItfVisit | Visit+  attrs.visit = @name : @lhs.itf+  loc.coItf = [mkCoIdent (head @lhs.itf) @name]++{+mkCoIdent :: Ident -> Ident -> Ident+mkCoIdent itf vis = Ident ("Co_" ++ show itf ++ "_" ++ show vis) (identPos itf)+}++{+type AttrEnv = Env QIdent String+}++ATTR BlocksTop Blocks Block Itf ItfVisits ItfVisit Attrs Attr [ | gathInhs, gathSyns : AttrEnv | ]++SEM Program+  | Program  blocks.gathInhs = emptyEnv+             blocks.gathSyns = emptyEnv++SEM Attr+  | Inh  +gathInhs = extend (@name : @lhs.itf) @type+         +gathSyns = extend (@name : @lhs.coItf) @type+  | Syn  +gathSyns = extend (@name : @lhs.itf) @type+         +gathInhs = extend (@name : @lhs.coItf) @type++ATTR VisitAttrs VisitAttr [ | gathChns : AttrEnv | ]++SEM SemVisit+  | Visit  attrs.gathChns = emptyEnv+           +errs0 = addDefErrs @attrs.gathChns++SEM VisitAttr | Chn  +gathChns = extend [@name] @type++{+type NontermEnv = Env QIdent ()+type ClausesEnv = Env QIdent ()+type DataSemEnv = Env Ident ()+}++ATTR AllCodeBlocks [ | gathNonterms : NontermEnv gathClauses : ClausesEnv | ]+ATTR AllCode ImplStmts ImplStmt [ nonterm : {QIdent} | | ]+ATTR ImplStmts ImplStmt [ gathNonterms : NontermEnv gathClauses : ClausesEnv | | ]++SEM Block | Section  code.nonterm  = [ident "<root>"]+          | Item     item.nonterm  = [ident "<root>"]+          | DataSem  sem.nonterm   = [ident "<root>"]++SEM DataSem | Sem    clauses.nonterm   = [@tp]++SEM Item | Sem CoSem+  first.nonterm = [@name]++SEM Program+  | Program  blocks.gathNonterms = emptyEnv+             blocks.gathClauses  = emptyEnv++SEM Item+  | Sem CoSem  +gathNonterms = extend [@name] ()++SEM Clause+  | Clause  +gathClauses = extend (@name : @lhs.nonterm) ()++ATTR ClausesTop Clauses Clause [ | | gathClauseNames USE {`Set.union`} {Set.empty} : {Set Ident} ]+SEM Clause | Clause  lhs.gathClauseNames = Set.singleton @name++ATTR AllCodeBlocks [ | gathDataSems : DataSemEnv | ]+ATTR AllCodeBlocks [ | distDataSems : DataSemEnv | ]+ATTR ImplStmts ImplStmt [ distDataSems : DataEnv | | ]++SEM Program | Program+  blocks.gathDataSems = emptyEnv+  blocks.distDataSems = @blocks.gathDataSems++SEM DataSem | Sem+  +gathDataSems = extend @tp ()++ATTR AllCodeBlocks ImplStmts ImplStmt [ allVisits : {Set Ident} | | ]++SEM Program | Program+  blocks.allVisits = Set.empty++SEM Item | Sem CoSem+  first.allVisits = Set.union (Set.fromList @loc.nextVisits) @lhs.allVisits++SEM DataSem | Sem+  clauses.allVisits = Set.union (Set.fromList @loc.nextVisits) @lhs.allVisits++SEM Stmt | Attach  -- check that visits and children have distinct names+  +errs1 = ( if @name `Set.member` @lhs.allVisits+             then Seq.singleton $ Err_NameClash @name+             else Seq.empty+           ) Seq.><++ATTR Cons Con Fields Field ExprFields ExprField [ data : Ident | | ]+ATTR Fields Field ExprFields ExprField [ con : Ident | | ]+SEM Data | Data  cons.data  = @name+SEM Con | Con    fields.con = @name+SEM Item | Construct fields.data = @data+SEM Item | Construct fields.con  = @con++{+type DataEnv  = Env Ident ()+type ConEnv   = Env QIdent FieldEnv+type FieldEnv = Env Ident (Int,Either Ident String)+}++ATTR BlocksTop Blocks Block Data Cons Con Type [ | gathDataCons : ConEnv | ]+ATTR AllCodeBlocks [ | distDataCons : ConEnv | ]+ATTR ImplStmts ImplStmt [ distDataCons : ConEnv | | ]++SEM Program | Program+  blocks.gathDataCons = emptyEnv+  blocks.distDataCons = @blocks.gathDataCons++SEM Con | Con+  +gathDataCons = extend [@name, @lhs.data] @fields.gathFields++ATTR BlocksTop Blocks Block Data Type [ | gathDatas : DataEnv | ]+SEM Program | Program  blocks.gathDatas = emptyEnv+SEM Data | Data        +gathDatas = extend @name ()++ATTR Fields Field [ | gathFields : FieldEnv | ]+SEM Con | Con+  fields.gathFields = emptyEnv+  +errs0 = addDefErrs' @fields.gathFields++SEM Field | Field+  +gathFields = extend @name (@lhs.nr, @type.fldType)++ATTR Cons Con Fields Field [ | nr : Int | ]+SEM Data | Data    cons.nr   = 0+SEM Con | Con      fields.nr = 1 + @lhs.nr+SEM Field | Field  lhs.nr    = 1 + @lhs.nr++ATTR FieldType [ | | fldType : {Either Ident String} ]+SEM FieldType+  | Term     lhs.fldType = Right @type+  | Nonterm  lhs.fldType = Left @name++ATTR ExprFields ExprField [ fieldOrder : {Map Ident Int} | gathFields : FieldEnv | ]+SEM Item | Construct+  fields.gathFields = emptyEnv+  loc.gathFieldEnv = foldr (\(nm,_) -> snd . find nm (0,Right "")) @fields.gathFields @loc.fields+  +errs0 = addDefErrs' @loc.gathFieldEnv+  +errs0 = addUseErrs' @loc.gathFieldEnv+  fields.fieldOrder = Map.fromList (zip (map fst @loc.fields) [1..])++SEM ExprField | Field+  +gathFields    = extend @name (0,Right "")+  loc.fieldIndex = Map.findWithDefault 0 @name @lhs.fieldOrder++{+type VarsEnv = Env Ident ()+}++ATTR Vars Var Cons Con ItfVisits ItfVisit [ | gathVarsEnv : VarsEnv | ]+SEM Var | Var+  +gathVarsEnv = extend @name ()++SEM Type | Alias+  vars.gathVarsEnv = emptyEnv+  +errs1 = addDefErrs' @vars.gathVarsEnv++SEM Data | Data+  vars.gathVarsEnv = emptyEnv+  +errs1 = addDefErrs' @cons.gathVarsEnv++SEM Cons | Cons+  (hd.gathVarsEnv, tl.gathVarsEnv) = split @lhs.gathVarsEnv+  (lhs.gathVarsEnv, loc.locGathVarsEnv) = merge @hd.gathVarsEnv @tl.gathVarsEnv+  +errs1 = addDefErrs' @loc.locGathVarsEnv++SEM Itf | Itf+  vars.gathVarsEnv = emptyEnv+  +errs1 = addDefErrs' @visits.gathVarsEnv++SEM ItfVisits | Cons+  (hd.gathVarsEnv, tl.gathVarsEnv) = split @lhs.gathVarsEnv+  (lhs.gathVarsEnv, loc.locGathVarsEnv) = merge @hd.gathVarsEnv @tl.gathVarsEnv+  +errs1 = addDefErrs' @loc.locGathVarsEnv++SEM Item | Sem CoSem+  vars.gathVarsEnv = emptyEnv+  +errs1 = addDefErrs' @vars.gathVarsEnv++SEM DataSem | Sem+  vars.gathVarsEnv = emptyEnv+  +errs1 = addDefErrs' @vars.gathVarsEnv++--+-- Standard usage checks+--++ATTR AllCodeBlocks [ | distItfs : ItfEnv | ]+ATTR ImplStmts ImplStmt [ distItfs : ItfEnv | | ]++SEM Program+  | Program  blocks.distItfs = @blocks.gathItfs++SEM Item | Sem CoSem+  +distItfs = snd . find [@tp] ()++SEM Stmt | Attach+  +distItfs = snd . find [@type] ()++SEM DataSem | Sem+  +distItfs = snd . find [@tp] ()++ATTR AllCode Pats Pat AttrTypePat AttrTypeCode ImplStmts ImplStmt [ itf : QIdent coItf : Ident | | ]+SEM Block | Section Item DataSem+  loc.itf   = [ident "<root>"]+  loc.coItf = ident "<root>"++SEM DataSem | Sem+  clauses.itf  = [@tp]++SEM Item+  | Sem      first.itf = [@tp]+  | CoSem    first.itf = [@loc.coItf]+             loc.coItf = mkCoIdent @tp @visit+             first.coItf = @tp++ATTR AllCodeBlocks [ | distVisits : VisitEnv | ]+ATTR ImplStmts ImplStmt [ distVisits : VisitEnv | | ]++SEM Program+  | Program  blocks.distVisits = @blocks.gathVisits++SEM SemVisit | Visit+  +distVisits = snd . find (@name : @lhs.itf) ()++SEM Stmt+  | Invoke  loc.unqualChildItf = head @loc.childItf+            loc.childVisits = Map.findWithDefault [] @loc.unqualChildItf @lhs.distVisitOrder+            +errs1 = ( if null @loc.childVisits || @visit `elem` @loc.childVisits+                       then Seq.empty else Seq.singleton (Err_UndefVisit @name @visit @loc.childVisits)) Seq.><+  | Attach  loc.childVisits = Map.findWithDefault [] @type @lhs.distVisitOrder+            loc.visit = case @mbVisit of+                          Nothing -> if null @loc.childVisits then Ident "<unknown>" @pos else head @loc.childVisits+                          Just v  -> v+            +errs1 = ( if null @loc.childVisits || @loc.visit `elem` @loc.childVisits+                       then Seq.empty else Seq.singleton (Err_UndefVisit @name @loc.visit @loc.childVisits)) Seq.><++SEM ImplStmt+  | Invoke  loc.childVisits = Map.findWithDefault [] @itf @lhs.distVisitOrder++SEM Pat | AttrCon+  (loc.fieldEnv, lhs.distDataCons) = find [@con, @dt] emptyEnv @lhs.distDataCons+  loc.fields = sortAssocs $ assocs @loc.fieldEnv++{+sortAssocs :: [(Ident, (Int, a))] -> [(Ident, a)]+sortAssocs = map (\(nm,(_,tp)) -> (nm,tp)) . sortBy (\(_,(n1,_)) (_,(n2,_)) -> compare n1 n2)+}++SEM Item | Construct+  (loc.fieldEnv, lhs.distDataCons) = find [@con, @data] emptyEnv @lhs.distDataCons+  loc.fields = sortAssocs $ assocs @loc.fieldEnv++SEM Stmt | Attach+  +distDataSems = if @code.isJust+                  then id+                  else snd . find @type ()++ATTR AllCodeBlocks Type AliasType AllDataFields [ | distDatas : DataEnv | ]+ATTR ImplStmts ImplStmt [ distDatas : DataEnv | | ]  -- should perhaps turn into a changed attr++SEM Program | Program+  blocks.distDatas = @blocks.gathDatas++SEM DataSem | Sem+  +distDatas = snd . find @tp ()+  +  +errs2 = if Map.member astIdent $ Map.findWithDefault Map.empty @loc.firstVisit+                                  $ Map.findWithDefault Map.empty @tp @lhs.distVisitInhAttrs+           then id+           else (Seq.singleton (Err_Missing [replPos @pos astIdent]) Seq.><)++SEM AliasType+  | Prod   +distDatas = \env -> foldr (\tp -> snd . find tp ()) env @fields+  | List   +distDatas = snd . find @type ()+  | Maybe  +distDatas = snd . find @type ()++SEM FieldType | Nonterm  +distDatas = snd . find @name ()+SEM Item | Construct     +distDatas = snd . find @data ()+SEM Pat | AttrCon        +distDatas = snd . find @dt ()++{+astIdent :: Ident+astIdent = Ident "ast" noPos+}++--+-- Children defined+--++ATTR AllCodeBlocksWithoutAttrs [ | gathChildDefs : {Env QIdent (QIdent, QIdent)} | ]+ATTR AllCodeBlocks [ | distChildDefs : {Env QIdent (QIdent,QIdent)} | ]+ATTR ImplStmts ImplStmt [ gathChildDefs, distChildDefs : {Env QIdent (QIdent,QIdent)} | | ]  -- inherit only++SEM Program | Program  blocks.gathChildDefs = emptyEnv+                       blocks.distChildDefs = @blocks.gathChildDefs++SEM Item+  | Sem CoSem+         loc.firstVisit = if null @loc.nextVisits then unknIdent else head @loc.nextVisits+         first.gathChildDefs = extend locQIdent (locQIdent, locQIdent)+                               $ extend visQIdent (visQIdent, visQIdent)+                               $ extend lhsQIdent ([@tp], [@loc.firstVisit, @tp])+                               $ enter @lhs.gathChildDefs+         (lhs.gathChildDefs, loc.localChildDefs) = leave @first.gathChildDefs+         -- don't addDefErrs on @loc.localChildDefs++         first.distChildDefs = enterWith @loc.localChildDefs @lhs.distChildDefs+         (lhs.distChildDefs, loc.localChildDefs') = leave @first.distChildDefs+         +         +errs1 = addUseErrs @loc.localChildDefs'+  | Attr    ((loc.childItf, loc.startVisit), lhs.distChildDefs) = find [@child] (unknQIdent,unknQIdent) @lhs.distChildDefs+  | Detach  ((loc.childItf, loc.startVisit), lhs.distChildDefs) = find [@name] (unknQIdent,unknQIdent) @lhs.distChildDefs++SEM DataSem | Sem+  clauses.gathChildDefs = extend locQIdent (locQIdent, locQIdent)+                          $ extend visQIdent (visQIdent, visQIdent)+                          $ extend lhsQIdent ([@tp], [@loc.firstVisit, @tp])+                          $ enter @lhs.gathChildDefs+  (lhs.gathChildDefs, loc.localChildDefs) = leave @clauses.gathChildDefs+  -- don't addDefErrs on @loc.localChildDefs++  clauses.distChildDefs = enterWith @loc.localChildDefs @lhs.distChildDefs+  (lhs.distChildDefs, loc.localChildDefs') = leave @clauses.distChildDefs+   +  +errs1 = addUseErrs @loc.localChildDefs'++SEM Clauses+  | Cons  (hd.gathChildDefs, tl.gathChildDefs)    = split @lhs.gathChildDefs+          (lhs.gathChildDefs, loc.gathLChildDefs) = merge @hd.gathChildDefs @tl.gathChildDefs+          +          (hd.distChildDefs, tl.distChildDefs)    = splitWith @loc.gathLChildDefs @lhs.distChildDefs+          (lhs.distChildDefs, loc.distLChildDefs) = merge @hd.distChildDefs @tl.distChildDefs++          +errs1 = addUseErrs @loc.distLChildDefs++SEM Stmt+  | Attach  +gathChildDefs = extend [@name] ([@type],[@loc.visit,@type])+            loc.allAttaches = findAll [@name] @lhs.distChildDefs+            loc.initType = head $ last ([@type] : map fst @loc.allAttaches)+            +errs1 = if @type /= @loc.initType+                     then (Err_TypeConflict @type @loc.initType Seq.<|)+                     else id+  | Invoke  ((loc.childItf, loc.startVisit), code.distChildDefs) = find [@name] (unknQIdent,unknQIdent) @lhs.distChildDefs++SEM Pat+  | Attr    ((loc.childItf, loc.startVisit), lhs.distChildDefs) = find [@child] (unknQIdent,unknQIdent) @lhs.distChildDefs+  | AttrCon +gathChildDefs = extendTail [@name] (locQIdent,locQIdent)+            ((loc.childItf, loc.startVisit), lhs.distChildDefs) = find [@name] (unknQIdent,unknQIdent) @lhs.distChildDefs++{+unknIdent :: Ident+unknIdent = ident "<undefined>"++unknQIdent :: QIdent+unknQIdent = [unknIdent]++locQIdent :: QIdent+locQIdent = [locIdent]++lhsQIdent :: QIdent+lhsQIdent = [lhsIdent]++visQIdent :: QIdent+visQIdent = [visIdent]+}+++--+-- Compute renames for each clause/visit+--+-- unchecked: source name must be in interface of child+-- unchecked: duplicate renames+-- unchecked: new name not in interface of child+--++{+type RenameMap = Map Ident (Map Ident Ident)+}++ATTR Stmts Stmt [ | | gathRenames USE {`unionWithUnion`} {mempty} : RenameMap ]+SEM Stmt | Rename+  lhs.gathRenames = Map.singleton @child @subst.gathRenames++ATTR Renames Rename [ | | gathRenames USE {`mappend`} {mempty} : {Map Ident Ident} ]+SEM Rename | Rename+  lhs.gathRenames = Map.fromList [ (@source, @dest), (@dest, @source) ]++ATTR AllFinal [ distRenames : RenameMap | | ]++SEM Program | Program  blocks.distRenames  = Map.empty+SEM DataSem | Sem      clauses.distRenames = Map.empty+SEM Item | Sem CoSem   first.distRenames   = Map.empty++SEM Clause | Clause      loc.distRenames = @stmts.gathRenames `unionWithUnion` @lhs.distRenames+SEM SemVisit | Visit     loc.distRenames = @stmts.gathRenames `unionWithUnion` @lhs.distRenames+SEM SemVisit | Internal  loc.distRenames = @stmts.gathRenames `unionWithUnion` @lhs.distRenames++{+renameAttr :: RenameMap -> Ident -> Ident -> Ident+renameAttr mp child nm = Map.findWithDefault nm nm $ Map.findWithDefault Map.empty child mp+renameAttrFwd = renameAttr+renameAttrBwd = renameAttr+}++SEM Item | Attr  loc.origName = renameAttrBwd @lhs.distRenames @child @name+SEM Pat | Attr   loc.origName = renameAttrBwd @lhs.distRenames @child @name+++--+-- Add and check additional instructions (children, etc.) for clauses+--++ATTR SemVisit ClausesTop Clauses Clause [ clauseExtras : {Map Ident Stmts} | | ]++SEM Clause | Clause   next.clauseExtras  = Map.empty+SEM Item | Sem CoSem  first.clauseExtras = Map.empty++SEM DataSem | Sem+  clauses.clauseExtras = @cons.clauseExtras++  loc.consMap = Map.findWithDefault Map.empty @tp @lhs.distDataMap++  inst.cons : SemCons+  inst.cons = [ SemCon_Con @pos (replPos @pos c)+                  [ SemField_Field @pos (replPos @pos nm) tp | (nm,tp) <- sortAssocs $ Map.assocs fs ]+              | (c,fs) <- sortAssocs $ Map.assocs @loc.consMap ]++  cons.itf = [@tp]++{+trim :: String -> String+trim = reverse . dropWhile isSpace . reverse . dropWhile isSpace+} -- (Ident (trim (either show id tp)) @pos++ATTR SemCons SemCon [ | | clauseExtras USE {`Map.union`} {Map.empty} : {Map Ident Stmts} ]+ATTR SemFields SemField [ | | clauseExtras USE {++} {[]} : Stmts ]++SEM SemCon | Con+  lhs.clauseExtras = Map.singleton @name+                       ( Stmt_Eval Mode_Match (Pat_AttrCon @name (replPos @pos locIdent) (head @lhs.itf))+                           (BoundCode_Code Bind_Fun @pos $ Code_Code+                              [Item_Attr @pos (replPos @pos lhsIdent) (replPos @pos astIdent) ])+                       : @fields.clauseExtras )++SEM SemField | Field+  loc.isNonterm = case @type of+                    Left nt -> Map.member nt @lhs.distDataMap+                    Right _ -> False+  +distDataSems = case @type of+                    Left nt | @loc.isNonterm -> snd . find nt ()+                    _ -> id+  lhs.clauseExtras = case @type of+                       Left nt | @loc.isNonterm ->+                             [ Stmt_Attach @pos Nothing @name nt Nothing+                             , Stmt_Eval Mode_Assert (Pat_Attr @name (replPos @pos astIdent))+                                                     (BoundCode_Code Bind_Fun @pos (Code_Code [+                                                       Item_Attr @pos (replPos @pos locIdent) @name ]))+                             ]+                       _ -> []++--+-- Check clauses defined when having this extraMap+--++SEM ClausesTop | Top+  +errs0 = if Map.null @lhs.clauseExtras+           then id+           else let reqKeys = Map.keysSet @lhs.clauseExtras+                    impKeys = @clauses.gathClauseNames+                    diffSet = (impKeys `Set.difference` reqKeys) `Set.union` (reqKeys `Set.difference` impKeys)+                    diff = Set.elems diffSet+                    errs = map (\nm -> Err_MissingClause (head @lhs.itf) nm) diff+                in (Seq.fromList errs Seq.><)++-- NOTE: This *must* be before inst.impls, otherwise the copy rule for available attributes goes wrong+SEM Clause | Clause+  inst.stmts : T_Stmts+  inst.stmts = \stmts -> foldr (\s r -> sem_Stmts_Cons (sem_Stmt s) r) stmts @loc.extraStmts ++  loc.extraStmts = Map.findWithDefault [] @name @lhs.clauseExtras++--+-- Count visits+--++ATTR AllVisitClauses [ visitNr : Int | | ]+SEM Item | Sem CoSem           first.visitNr   = 1+SEM DataSem | Sem              clauses.visitNr = 1++SEM SemVisit | Visit           loc.visitNr     = @lhs.visitNr + 1++--+-- Visit order+--++ATTR BlocksTop Blocks Block Itf ItfVisits ItfVisit [ | | gathVisitOrder USE {`mappend`} {mempty} : {Map Ident [Ident]} ]+ATTR ItfVisits ItfVisit [ | | gathVisitsOrder USE {++} {[]} : {[Ident]} ]++SEM Itf | Itf         +gathVisitOrder = Map.insert @name @visits.gathVisitsOrder+SEM ItfVisit | Visit  lhs.gathVisitsOrder = [@name]+                      lhs.gathVisitOrder = Map.singleton (head @loc.coItf) [@name]++ATTR AllCodeBlocks ImplStmts ImplStmt [ distVisitOrder : {Map Ident [Ident]} doneVisits : {[Ident]} | | ]+ATTR SemVisit ClausesTop Clauses Clause [ nextVisits : {[Ident]} | | ]++SEM Program | Program  blocks.distVisitOrder = @blocks.gathVisitOrder+SEM Item | Sem         loc.nextVisits        = Map.findWithDefault [] @tp @lhs.distVisitOrder+         | CoSem       loc.nextVisits        = Map.findWithDefault [] @loc.coItf @lhs.distVisitOrder+         | Detach      loc.visitOrder        = Map.findWithDefault [] @loc.unqualChildItf @lhs.distVisitOrder++SEM AttrTypePat | Child   loc.visitOrder     = Map.findWithDefault [] @lhs.childItf @lhs.distVisitOrder+SEM AttrTypeCode | Child  loc.visitOrder     = Map.findWithDefault [] @lhs.childItf @lhs.distVisitOrder++SEM DataSem | Sem      loc.visits            = Map.findWithDefault [] @tp @lhs.distVisitOrder+                       loc.nextVisits        = @loc.visits+                       loc.firstVisit        = case @loc.visits of+                                                 []    -> Ident "unknown" @pos+                                                 (x:_) -> x++SEM Program | Program  blocks.doneVisits = []+SEM Item | Sem         loc.doneVisits    = []+         | CoSem       loc.doneVisits    = []+SEM DataSem | Sem      loc.doneVisits    = []++SEM SemVisit | Visit  loc.doneVisits = @name : @lhs.doneVisits  -- visits of the interface done++-- Insert empty visits to match the visits actually in the AST+SEM SemVisit+  | Visit  loc.unqualItf = head @lhs.itf+           loc.itfVisits = Map.findWithDefault [] @loc.unqualItf @lhs.distVisitOrder+           (loc.sequenceErrs, clauses.nextVisits) = checkVisitSequence @pos @name @lhs.nextVisits+           +errs0 = if not (@name `elem` @loc.itfVisits)+                    then (Err_UndeclVisit @pos @name @loc.unqualItf Seq.<|)+                    else (@loc.sequenceErrs Seq.><)+  | Internal  -- don't eat any of the expected visits+           loc.name      = Ident (show @name ++ "_int" ++ show @loc.lexOrder) (identPos @name)+           loc.unqualItf = head @lhs.itf+  | Impl   inst.actual : SemVisit+           inst.actual = prependEmptyVisits @lhs.basename @lhs.masterPos SemVisit_End @lhs.nextVisits+  | Prependable+           loc.missingVisits   = if elem @name @lhs.nextVisits+                                 then takeWhile (/= @name) @lhs.nextVisits+                                 else []+           loc.remainingVisits = drop (length @loc.missingVisits) @lhs.nextVisits+           inst.visits : SemVisit+           inst.visits = if null @loc.remainingVisits || @name `elem` @lhs.doneVisits+                         then SemVisit_End+                         else prependEmptyVisits @lhs.basename @pos @actual @loc.missingVisits+           +errs0 = if null @loc.remainingVisits && not (null @lhs.nextVisits)+                    then (Err_ExpVisit @pos @name (head @lhs.nextVisits) Seq.<|)+                    else if @name `elem` @lhs.doneVisits+                         then (Err_Dup [@name] Seq.<|)+                         else id+  | End    +errs0 = (if null @lhs.nextVisits then Seq.empty else Seq.singleton (Err_VisitsNotImpl @lhs.nonterm @lhs.nextVisits)) Seq.><++ATTR AllVisitClauses [ masterPos : Pos | | ]+SEM Item | Sem CoSem           first.masterPos   = @pos+SEM DataSem | Sem              clauses.masterPos = @pos+SEM SemVisit | Visit Internal  loc.masterPos     = @pos+SEM Clause | Clause            loc.masterPos     = @pos++{+prependEmptyVisits _ _ t [] = t+prependEmptyVisits basename pos t (v:vs)+  = SemVisit_Visit pos v False [] [] (ClausesTop_Top [Clause_Clause pos (mkClauseName pos v basename) []+      (prependEmptyVisits basename pos t vs) ])++mkClauseName :: Pos -> Ident -> QIdent -> Ident+mkClauseName pos v vs+  = Ident (show v ++ concatMap (\v' -> "_" ++ show v') vs) pos++checkVisitSequence :: Pos -> Ident -> [Ident] -> (Errs, [Ident])+checkVisitSequence _ _ [] = (Seq.empty, [])  -- dont report more errors if already erroneous+checkVisitSequence pos nm (nm' : nms)+  | nm == nm' = (Seq.empty, nms)+  | otherwise = (Seq.singleton $ Err_ExpVisit pos nm nm', [])  -- mismatch+}++-- insert dummy clause if no clauses were given+SEM ClausesTop+  | Impl+      loc.pos  = @lhs.masterPos+      loc.name = mkClauseName @loc.pos (Ident "impl" @loc.pos) @lhs.basename+  +      inst.actual : ClausesTop+      inst.actual = if null @clauses+                    then ClausesTop_Top [Clause_Clause @loc.pos @loc.name [] SemVisit_Impl ]+                    else ClausesTop_Top @clauses+++{+unionWithPlusplus :: Ord k => Map k [v] -> Map k [v] -> Map k [v]+unionWithParallel, unionWithSequential :: (Ord k, Ord v) => Map k [[v]] -> Map k [[v]] -> Map k [[v]]++unionWithPlusplus   = Map.unionWith (++)+unionWithParallel mp1 mp2 = Map.unionWith (++) mp1' mp2'+  where addleft  = Map.map (const [[]]) (mp2 `Map.difference` mp1)+        addright = Map.map (const [[]]) (mp1 `Map.difference` mp2)+        mp1' = addleft `Map.union` mp1+        mp2' = addright `Map.union` mp2+unionWithSequential = Map.unionWith (\[h] t -> map (h++) t)++unionWithUnion :: (Ord k, Monoid v) => Map k v -> Map k v -> Map k v+unionWithUnion = Map.unionWith mappend+}++SEM Item+  | Detach  loc.unqualChildItf = head @loc.childItf+            loc.childVisits = Map.findWithDefault [] @loc.unqualChildItf @lhs.distVisitOrder++{+nextAfterInvoked :: [Ident] -> [Ident] -> Ident+nextAfterInvoked (a:as) (b:bs)+  | a == b    = nextAfterInvoked as bs+  | otherwise = b+}+++--+-- Check if all visits are uniquely named+--++ATTR AllVisitClauses [ | gathVisitNames : {Env Ident ()} | ]+SEM SemVisit | Visit Internal+  +gathVisitNames = extend @name ()++SEM Item | Sem CoSem  first.gathVisitNames = emptyEnv+                      +errs0 = addDefErrs' @first.gathVisitNames+SEM DataSem | Sem     clauses.gathVisitNames = emptyEnv+                      +errs0 = addDefErrs' @clauses.gathVisitNames++SEM Clauses | Cons+      (hd.gathVisitNames, tl.gathVisitNames)    = split @lhs.gathVisitNames+      (lhs.gathVisitNames, loc.gathLVisitNames) = merge @hd.gathVisitNames @tl.gathVisitNames+      +errs1 = addDefErrs' @loc.gathLVisitNames++ATTR SemVisit [ | | isInternal : Bool ]+SEM SemVisit+  | Visit     lhs.isInternal = False+  | Internal  lhs.isInternal = True+  | End       lhs.isInternal = False++SEM Clause | Clause+  loc.isDeepest = not @next.isInternal++--+-- Attribute information: all syn/inh attrs per nonterm and per visit+--++{+type AttrMap = Map Ident (Map Ident String)+type VisitAttrMap = Map Ident AttrMap+}++ATTR BlocksTop Blocks Block Itf ItfVisits ItfVisit [ | | gathInhAttrs, gathSynAttrs USE {`mappend`} {mempty} : AttrMap ]+ATTR BlocksTop Blocks Block Itf ItfVisits ItfVisit [ | | gathVisitInhAttrs, gathVisitSynAttrs USE {`mappend`} {mempty} : VisitAttrMap ]+ATTR ItfVisits ItfVisit [ | | gathVisitsInhAttrs, gathVisitsSynAttrs USE {`mappend`} {mempty} : AttrMap ]+ATTR Attrs Attr [ | | gathVisitInhAttrs, gathVisitSynAttrs USE {`mappend`} {mempty} : {Map Ident String} ]++SEM Attr+  | Inh  lhs.gathVisitInhAttrs = Map.singleton @name @type+  | Syn  lhs.gathVisitSynAttrs = Map.singleton @name @type++SEM ItfVisit+  | Visit  lhs.gathVisitsInhAttrs = Map.singleton @name @attrs.gathVisitInhAttrs+           lhs.gathVisitsSynAttrs = Map.singleton @name @attrs.gathVisitSynAttrs+           lhs.gathVisitInhAttrs  = Map.singleton (head @loc.coItf) (Map.singleton @name @attrs.gathVisitSynAttrs)+           lhs.gathVisitSynAttrs  = Map.singleton (head @loc.coItf) (Map.singleton @name @attrs.gathVisitInhAttrs)+           lhs.gathInhAttrs       = Map.singleton (head @loc.coItf) @attrs.gathVisitSynAttrs+           lhs.gathSynAttrs       = Map.singleton (head @loc.coItf) @attrs.gathVisitInhAttrs++SEM Itf+  | Itf    +gathVisitInhAttrs = Map.insert @name @visits.gathVisitsInhAttrs+           +gathVisitSynAttrs = Map.insert @name @visits.gathVisitsSynAttrs++           +gathInhAttrs = Map.insert @name $ Map.unions $ Map.elems @visits.gathVisitsInhAttrs+           +gathSynAttrs = Map.insert @name $ Map.unions $ Map.elems @visits.gathVisitsSynAttrs++ATTR AllCodeBlocks ImplStmts ImplStmt [ distInhAttrs, distSynAttrs : AttrMap distVisitInhAttrs, distVisitSynAttrs : VisitAttrMap | | ]++SEM Program | Program+  blocks.distInhAttrs      = @blocks.gathInhAttrs+  blocks.distSynAttrs      = @blocks.gathSynAttrs+  blocks.distVisitInhAttrs = @blocks.gathVisitInhAttrs+  blocks.distVisitSynAttrs = @blocks.gathVisitSynAttrs++ATTR VisitAttrs VisitAttr [ | | gathVisitLocalAttrs USE {`mappend`} {mempty} : {Map Ident String} ]+ATTR Clauses Clause ClausesTop SemVisit [ | | gathVisitAttrs USE {`mappend`} {mempty} : {Map Ident (Map Ident String)} ]+ATTR AllCodeBlocks ImplStmts ImplStmt [ directVisitAttrs : {Map Ident (Map Ident String)} | | ]++SEM SemVisit | Visit   +gathVisitAttrs = Map.insert @name @attrs.gathVisitLocalAttrs+SEM VisitAttr | Chn    lhs.gathVisitLocalAttrs = Map.singleton @name @type+SEM Program | Program  blocks.directVisitAttrs = Map.empty+SEM Item | Sem CoSem   first.directVisitAttrs  = @first.gathVisitAttrs++ATTR AllCodeBlocks ImplStmts ImplStmt [ directVisitLocalAttrs : {Map Ident String} | | ]+SEM Program | Program  blocks.directVisitLocalAttrs  = Map.empty+SEM SemVisit | Visit   stmts.directVisitLocalAttrs   = @attrs.gathVisitLocalAttrs+                       clauses.directVisitLocalAttrs = @attrs.gathVisitLocalAttrs++--+-- Dispatch to AttrType+--++ATTR AttrTypePat AttrTypeCode [ child, name, childItf : Ident | | ]++SEM Pat | Attr+      inst.tp : AttrTypePat+      inst.tp = case identName @child of+                  s | s == "loc"                         -> AttrTypePat_ProdLocal+                    | s == "lhs"                         -> AttrTypePat_Lhs+                    | s == "vis"                         -> AttrTypePat_VisLocal+                    | @child `Set.member` @lhs.allVisits -> AttrTypePat_Visit+                    | @loc.childItf == locQIdent         -> AttrTypePat_ProdLocal+                    | otherwise                          -> AttrTypePat_Child+      tp.child    = @child+      tp.name     = @loc.origName+      tp.childItf = head @loc.childItf++SEM Item | Attr+      inst.tp : AttrTypeCode+      inst.tp = case identName @child of+                  s | s == "loc"                         -> AttrTypeCode_ProdLocal+                    | s == "lhs"                         -> AttrTypeCode_Lhs+                    | s == "vis"                         -> AttrTypeCode_VisLocal+                    | @child `Set.member` @lhs.allVisits -> AttrTypeCode_Visit+                    | @loc.childItf == locQIdent         -> AttrTypeCode_ProdLocal+                    | otherwise                          -> AttrTypeCode_Child+      tp.child    = @child+      tp.name     = @loc.origName+      tp.childItf = head @loc.childItf++-- computation of defineable attributes+--   * all syn attrs of lhs+--   * inh attrs of visits of children+--      N.B. we may wish to check that we only define inherited attrs of+--      actually invoked children. However, this is too restrictive for+--      the programmer.+--      We now allow inh attrs to be defined on all visits not invoked yet+--   * any local attribute is defineable++SEM AttrTypePat+  | Lhs  -- check if @lhs.name is a syn attr of @lhs.childItf+      loc.allowedDefs = Map.findWithDefault Map.empty (head @lhs.itf) @lhs.distSynAttrs+  | Child+      loc.visits      = Set.toList $ Map.findWithDefault Set.empty @lhs.child @lhs.distChildEffRanges+      loc.inhMap      = Map.findWithDefault Map.empty @lhs.childItf @lhs.distVisitInhAttrs+      loc.allowedDefs = Map.unions (map (\v -> Map.findWithDefault Map.empty v @loc.inhMap) @loc.visits)+  | Visit+      loc.allowedDefs = Map.findWithDefault Map.empty @lhs.child @lhs.directVisitAttrs+  | VisLocal+      loc.allowedDefs = @lhs.directVisitLocalAttrs+  | Lhs Child Visit VisLocal+      +errs2 = ( if Map.member @lhs.name @loc.allowedDefs+                 then Seq.empty+                 else Seq.singleton (Err_UndeclAttr @lhs.child @lhs.name) ) Seq.><++{+common :: [[Ident]] -> [Ident]+common []     = []+common [x]    = x+common (x:xs) = x `intersect` common xs+}+++--+-- computation of available attributes+--+-- detect duplication + detect missing+-- we can use a single environment to keep track of the various+-- forms of attributes, because the "child"-name prevents overlap.+-- However, since scoping of visit-local attrs is different, we+-- put these in a separate environment+--++{+type At = (Ident,Ident,Bool)  -- True: inherited attr, False: syn attr+type DefsEnv = Env At (Maybe String)++locIdent, lhsIdent, visIdent :: Ident+locIdent = ident "loc"+lhsIdent = ident "lhs"+visIdent = ident "vis"+}++ATTR AllCodeBlocks ImplStmts ImplStmt [ | gathDefs, gathVisLocalDefs, distDefs, distVisLocalDefs : DefsEnv | ]++SEM Program | Program  blocks.gathDefs         = emptyEnv+                       blocks.gathVisLocalDefs = emptyEnv+                       blocks.distDefs         = @blocks.gathDefs+                       blocks.distVisLocalDefs = @blocks.gathVisLocalDefs++-- scoping+SEM Item | Sem CoSem+      loc.gathDefsIn         = enter @lhs.gathDefs+      first.gathDefs = @loc.gathDefsInh+      first.gathVisLocalDefs = enter @lhs.gathVisLocalDefs+      first.distDefs         = enterWith @loc.localDefs @lhs.distDefs+      first.distVisLocalDefs = enterWith @loc.localVisLocalDefs @lhs.distVisLocalDefs+      +      loc.gathDefsInh = Map.fold (flip (Map.foldWithKey (\n t -> extend (replPos @pos lhsIdent,replPos @pos n,True) (Just t)))) @loc.gathDefsIn @loc.inhAttrMap  -- add all inherited attrs of all visits+      +      (lhs.gathDefs, loc.localDefs)                  = leave @first.gathDefs+      (lhs.gathVisLocalDefs, loc.localVisLocalDefs)  = leave @first.gathVisLocalDefs+      (lhs.distDefs, loc.localDefs')                 = leave @first.distDefs+      (lhs.distVisLocalDefs, loc.localVisLocalDefs') = leave @first.distVisLocalDefs+      +      +errs3 = addDefErrs'' @loc.localDefs+      +errs3 = addDefErrs'' @loc.localVisLocalDefs+      +errs3 = addUseErrs'' @loc.localDefs'+      +errs3 = addUseErrs'' @loc.localVisLocalDefs'++SEM DataSem | Sem+      loc.gathDefsIn           = enter @lhs.gathDefs+      clauses.gathDefs         = @loc.gathDefsInh+      clauses.gathVisLocalDefs = enter @lhs.gathVisLocalDefs+      clauses.distDefs         = enterWith @loc.localDefs @lhs.distDefs+      clauses.distVisLocalDefs = enterWith @loc.localVisLocalDefs @lhs.distVisLocalDefs+      +      loc.gathDefsInh = Map.fold (flip (Map.foldWithKey (\n t -> extend (replPos @pos lhsIdent,replPos @pos n,True) (Just t)))) @loc.gathDefsIn @loc.inhAttrMap  -- add all inherited attrs of all visits++      (lhs.gathDefs, loc.localDefs)                  = leave @clauses.gathDefs+      (lhs.gathVisLocalDefs, loc.localVisLocalDefs)  = leave @clauses.gathVisLocalDefs+      (lhs.distDefs, loc.localDefs')                 = leave @clauses.distDefs+      (lhs.distVisLocalDefs, loc.localVisLocalDefs') = leave @clauses.distVisLocalDefs++      +errs3 = addDefErrs'' @loc.localDefs+      +errs3 = addDefErrs'' @loc.localVisLocalDefs+      +errs3 = addUseErrs'' @loc.localDefs'+      +errs3 = addUseErrs'' @loc.localVisLocalDefs'++SEM Clauses | Cons+      (hd.gathDefs, tl.gathDefs)                       = split @lhs.gathDefs+      (hd.gathVisLocalDefs, tl.gathVisLocalDefs)       = split @lhs.gathVisLocalDefs+      (lhs.gathDefs, loc.gathLDefs)                    = merge @hd.gathDefs @tl.gathDefs+      (lhs.gathVisLocalDefs, loc.gathVisLocalLDefs)    = merge @hd.gathVisLocalDefs @tl.gathVisLocalDefs+      hd.distDefs                                      = enterWith @loc.gathLDefs @lhs.distDefs+      hd.distVisLocalDefs                              = enterWith @loc.gathVisLocalLDefs @lhs.distVisLocalDefs+      (tl.distDefs, loc.localDistDefs)                 = leave @hd.distDefs+      (tl.distVisLocalDefs, loc.localDistVisLocalDefs) = leave @hd.distVisLocalDefs++      +errs3 = addDefErrs'' @loc.gathLDefs+      +errs3 = addDefErrs'' @loc.gathVisLocalLDefs+      +errs3 = addUseErrs'' @loc.localDistDefs+      +errs3 = addUseErrs'' @loc.localDistVisLocalDefs++SEM SemVisit | Visit+      loc.ldefs1 = enter @lhs.gathVisLocalDefs+      stmts.gathVisLocalDefs                          = @loc.ldefs2+      (lhs.gathVisLocalDefs, loc.localVisLocalDefs)   = leave @impls.gathVisLocalDefs+      stmts.distVisLocalDefs = enterWith @loc.localVisLocalDefs @lhs.distVisLocalDefs+      (lhs.distVisLocalDefs, loc.localVisLocalDefs')  = leave @impls.distVisLocalDefs++      +errs3 = addDefErrs'' @loc.localVisLocalDefs+      +errs3 = addUseErrs'' @loc.localVisLocalDefs'+-- a SemVisit | Internal is just invisible in this case (treated as a nested tree of clauses)++-- collect the local additions to compute the intersection of them+ATTR Clauses [ | | gathDefsAdds, gathVisLocalDefsAdds : {[DefsEnv]} ]++SEM Clauses+  | Cons  lhs.gathDefsAdds         = @loc.gathLDefs         : @tl.gathDefsAdds+          lhs.gathVisLocalDefsAdds = @loc.gathVisLocalLDefs : @tl.gathVisLocalDefsAdds+  | Nil   lhs.gathDefsAdds         = []+          lhs.gathVisLocalDefsAdds = []++SEM ClausesTop+  | Top  +gathDefs         = push (strip $ intersection @clauses.gathDefsAdds)+         +gathVisLocalDefs = push (strip $ intersection @clauses.gathVisLocalDefsAdds)++SEM Clause | Clause+  loc.enterF     = if @loc.isDeepest then enter else id+  loc.leaveF     = if @loc.isDeepest then leave else (\x -> (x, emptyEnv))+  loc.enterWithF = if @loc.isDeepest then enterWith else (\_ x -> x)  ++  next.gathDefs = @loc.enterF @stmts.gathDefs+  (impls.gathDefs, loc.nextVisitLocDefs)  = @loc.leaveF @next.gathDefs+  next.distDefs = @loc.enterWithF @loc.nextVisitLocDefs @stmts.distDefs+  (impls.distDefs, loc.nextVisitLocDefs') = @loc.leaveF @next.distDefs+  +  +errs3 = addDefErrs'' @loc.nextVisitLocDefs+  +errs3 = addUseErrs'' @loc.nextVisitLocDefs'++  lhs.gathDefs         = @impls.gathDefs+  lhs.gathVisLocalDefs = @next.gathVisLocalDefs  -- impls can't have gathVisLocalDefs++-- Add chn attrs of visit and check that they are defined when we enter the next visit+SEM SemVisit | Visit+      loc.ldefs2 = Map.foldWithKey (\n t -> extend (replPos @pos visIdent,replPos @pos n,True) (Just t)) @loc.ldefs1 @attrs.gathVisitLocalAttrs++ATTR ClausesTop Clauses Clause SemVisit [ localAttrs : {Map Ident String} | | ]+SEM Item | Sem CoSem  first.localAttrs   = Map.empty+SEM DataSem | Sem     clauses.localAttrs = Map.empty++SEM SemVisit | Visit  clauses.localAttrs = @attrs.gathVisitLocalAttrs  -- lhs.localAttrs thus refers to the local attrs of the parent++SEM Clause | Clause  -- only when the clause is deepest.+  loc.missingLocalAttrMap = if @loc.isDeepest+                            then Map.filterWithKey (\n _ -> not $+                                   defined (replPos @pos visIdent,replPos @pos n,False) @next.distVisLocalDefs) @lhs.localAttrs+                            else Map.empty  -- no default rules, maybe in deeper clause+  loc.deflLocalAttrMap = @loc.missingLocalAttrMap+  loc.deflLocalAttrs   = Map.keys @loc.deflLocalAttrMap  -- always use default rules for local attributes++SEM SemVisit | Visit+  loc.inhAttrMap = Map.findWithDefault Map.empty @name (Map.findWithDefault Map.empty (head @lhs.itf) @lhs.distVisitInhAttrs)++ATTR SemVisit ClausesTop Clauses Clause [ visit : Ident | | ]+SEM Item | Sem CoSem  first.visit   = @name  -- some dummy value+SEM DataSem | Sem     clauses.visit = @tp    -- some dummy value+SEM SemVisit | Visit  clauses.visit = @name  -- internal visits are not passed as name++SEM Clause | Clause  -- only when clause is deepest.+  loc.synAttrMap = Map.findWithDefault Map.empty @lhs.visit (Map.findWithDefault Map.empty (head @lhs.itf) @lhs.distVisitSynAttrs)+  loc.missingAttrMap = if @loc.isDeepest+                       then Map.filterWithKey (\n _ -> not $ defined (replPos @pos lhsIdent,n,False) @lhs.distDefs) @loc.synAttrMap+                       else Map.empty+  (loc.deflAttrMap, loc.undefAttrMap) = Map.partitionWithKey (\n _ -> Map.member n @loc.distDeflStmts) @loc.missingAttrMap+  lhs.distDefs = Map.foldWithKey (\n _ -> snd . find (replPos @pos lhsIdent,replPos @pos n,False) Nothing) @impls.distDefs @loc.undefAttrMap  -- bypass inst.dflts+  loc.deflAttrs = [ (a, Map.findWithDefault (False,Nothing) a @loc.distDeflStmts) | a <- Map.keys @loc.deflAttrMap ]+  -- +errs1 = (debugMsg ("pos: " ++ show @pos ++ "\nall: " ++ show @lhs.distDefs ++ "\nundef: " ++ show @loc.undefAttrMap ++ "\ndefl: " ++ show @loc.deflAttrMap ++ "\ndefs: " ++ show @loc.distDeflStmts) Seq.><)++SEM AttrTypePat+  | VisLocal   +gathVisLocalDefs = extend (@lhs.child, @lhs.name, False) Nothing+  | ProdLocal  +gathDefs = extend (@lhs.child, @lhs.name, False) Nothing+  | Lhs        +gathDefs = extend (@lhs.child, @lhs.name, False) Nothing+  | Child      +gathDefs = extend (@lhs.child, @lhs.name, True)  Nothing+  | Visit      +gathDefs = extend (@lhs.child, @lhs.name, False) Nothing++SEM Pat | AttrCon+  +gathDefs = \env -> foldr (\(nm,tp) -> extend (@name, nm, not @loc.isLoc) (Just (either show id tp))) env @loc.fields++SEM AttrTypeCode+  | VisLocal   +distVisLocalDefs = snd . find (@lhs.child, @lhs.name,True) Nothing+  | ProdLocal  +distDefs = snd . find (@lhs.child, @lhs.name, False) Nothing+  | Lhs        +distDefs = snd . find (@lhs.child, @lhs.name, True)  Nothing+  | Child      +distDefs = snd . find (@lhs.child, @lhs.name, False) Nothing+  | Visit      +distDefs = snd . find (@lhs.child, @lhs.name, True)  Nothing++{+replPos :: Pos -> Ident -> Ident+replPos p i = Ident (identName i) p+}++-- Invoke: bring attrs in scope (but not in the scope of rhs)+--         + compute attrs to "default"+SEM Stmt | Invoke+  loc.inhAttrMap = Map.findWithDefault Map.empty @visit (Map.findWithDefault Map.empty @loc.unqualChildItf @lhs.distVisitInhAttrs)+  loc.synAttrMap = Map.findWithDefault Map.empty @visit (Map.findWithDefault Map.empty @loc.unqualChildItf @lhs.distVisitSynAttrs)+  +  loc.missingAttrMap = Map.filterWithKey (\n _ -> not $ defined (@name,n,True) @lhs.distDefs) @loc.inhAttrMap+  (loc.deflAttrMap, loc.undefAttrMap) = Map.partitionWithKey (\n _ -> Map.member n @lhs.distDeflStmts) @loc.missingAttrMap+  loc.deflAttrs = [ (a, Map.findWithDefault (False,Nothing) a @lhs.distDeflStmts) | a <- Map.keys @loc.deflAttrMap ]+  +  -- watch out: copy rule would take deflts.distDefs too, resulting in a loop.+  lhs.distDefs = Map.foldWithKey (\n _ -> snd . find (@name,replPos @pos n,True) Nothing) @code.distDefs @loc.undefAttrMap+  lhs.gathDefs = Map.foldWithKey (\n t -> extend (@name,replPos @pos n,False) (Just t)) @code.gathDefs @loc.synAttrMap++-- Also in case of implicit invoke+SEM ImplStmt | Invoke+  loc.inhAttrMap = Map.findWithDefault Map.empty @visit (Map.findWithDefault Map.empty @itf @lhs.distVisitInhAttrs)+  loc.synAttrMap = Map.findWithDefault Map.empty @visit (Map.findWithDefault Map.empty @itf @lhs.distVisitSynAttrs)+  +  loc.missingAttrMap = Map.filterWithKey (\n _ -> not $ defined (@child,n,True) @lhs.distDefs) @loc.inhAttrMap+  (loc.deflAttrMap, loc.undefAttrMap) = Map.partitionWithKey (\n _ -> Map.member n @lhs.distDeflStmts) @loc.missingAttrMap+  loc.deflAttrs = [ (a, Map.findWithDefault (False,Nothing) a @lhs.distDeflStmts) | a <- Map.keys @loc.deflAttrMap ]+  +  -- watch out: copy rule would take deflts.distDefs too, resulting in a loop.+  lhs.distDefs = Map.foldWithKey (\n _ -> snd . find (@child,replPos @pos n,True) Nothing) @lhs.distDefs @loc.undefAttrMap+  lhs.gathDefs = Map.foldWithKey (\n t -> extend (@child,replPos @pos n,False) (Just t)) @lhs.gathDefs @loc.synAttrMap+--  +errs2 = debugMsg ("impl invoke: " ++ show @child ++ "." ++ show @visit ++ " base " ++ show @lhs.basename ++": " ++ show @loc.synAttrMap) Seq.><++--+-- Add implicit invokes. Watch out with assigning attributes to implicit statements.+--  Must be before the inst.deflts!+--++SEM Clause | Clause+  inst.impls : ImplStmts+  inst.impls = +               [ ImplStmt_Invoke @pos nm s (findChild nm @lhs.distChildDefs)+               | (nm,vs) <- Map.assocs @loc.implicitInvokes, s <- Set.toList vs ]++SEM SemVisit | Visit Internal+  inst.impls : ImplStmts+  inst.impls = [ ImplStmt_Invoke @pos nm s (findChild nm @lhs.distChildDefs)+               | (nm,vs) <- Map.assocs @loc.implicitInvokes, s <- Set.toList vs ]++{+findChild nm env = itf+  where (([itf], _), _) = find [nm] (unknQIdent,unknQIdent) env+}++--+-- Deal with default rules+--++SEM Clause | Clause+  inst.deflts : ImplStmts+  inst.deflts = map (\(nm,(_,mbCode)) -> ImplStmt_DefaultSyn @pos True nm mbCode) @loc.deflAttrs+                ++ map (ImplStmt_DefaultVisLocal @pos) @loc.deflLocalAttrs++SEM Stmt | Invoke+  inst.deflts : ImplStmts+  inst.deflts = map (\(nm,(empty,mbCode)) -> ImplStmt_DefaultChild @pos empty @name nm mbCode) @loc.deflAttrs++SEM ImplStmt | Invoke+  inst.deflts : ImplStmts+  inst.deflts = map (\(nm,(empty,mbCode)) -> ImplStmt_DefaultChild @pos empty @child nm mbCode) @loc.deflAttrs++--+-- Determine children + input attributes for default rule+--++SEM ImplStmt | DefaultChild DefaultSyn+  loc.childrenOrdered  = map fst $ sortBy (\(_,a) (_,b) -> a `compare` b) (Map.assocs @lhs.distChildOcc)+  loc.availChildren    = [ (c,itf, findVisitOfAttr nm itf @lhs.distAttrVisMap)+                         | c <- @loc.childrenOrdered+                         , let ([itf], _) = fst $ find [c] (unknQIdent,unknQIdent) @lhs.distChildDefs+                               nm = renameAttrFwd @lhs.distRenames c @name+                         , hasSynAttr nm itf @lhs.distSynAttrs+                         ]++SEM ImplStmt | DefaultChild  loc.candidateChildren = takeWhile (\(nm,_,_) -> nm /= @child) @loc.availChildren+SEM ImplStmt | DefaultSyn    loc.candidateChildren = @loc.availChildren++SEM ImplStmt | DefaultChild+--  +errs2 = debugMsg ("child: " ++ show @child ++ ", attr: " ++ show @name ++ ", children: " ++ show @loc.children) Seq.><++SEM ImplStmt | DefaultChild DefaultSyn+  (loc.children, loc.errChildren) = partition (\(c,itf,vis) -> visAvailable c itf vis @lhs.availInvokes @lhs.distVisitOrder)+                                      @loc.candidateChildren+  loc.childAttrs = map (\(c,_,_) -> (c, renameAttrFwd @lhs.distRenames c @name)) @loc.children+  +errs2 = \es -> foldr (\(c,itf,vis) -> (Err_ChildSynUnav @pos c itf vis @name Seq.<|)) es @loc.errChildren++SEM ImplStmt | DefaultChild+  +errs3 = if not @allowEmpty && null @loc.children && not @loc.lhsHasAttr+           then (Err_MissingAttr True @child (replPos @pos @name) Seq.<|)+           else id++SEM ImplStmt | DefaultSyn+  +errs3 = if not @allowEmpty && null @loc.children && not @loc.lhsHasAttr+           then (Err_MissingAttr False (replPos @pos lhsIdent) @name Seq.<|)+           else id++-- is there an lhs.name inh attribute?+-- if the lhs inh attr is in a later visit, this results in a cycle+SEM ImplStmt | DefaultChild DefaultSyn+  loc.unqualChildItf = head @lhs.itf+  loc.lhsHasAttr = isJust $ Map.lookup (True,@name) $+                     Map.findWithDefault Map.empty @loc.unqualChildItf @lhs.distAttrVisMap++{+visAvailable child itf vis invokeMap orderMap+  = any (\start -> vis `elem` dropWhile (/= start) order) invokes+  where+    invokes = Set.toList $ Map.findWithDefault Set.empty child invokeMap+    order   = Map.findWithDefault [] itf orderMap++hasSynAttr nm itf mp = Map.member nm $ Map.findWithDefault Map.empty itf mp+findVisitOfAttr nm itf mp = Map.findWithDefault (ident "<unknownvisit>") (False,nm) (Map.findWithDefault Map.empty itf mp)+}+++--+-- Lexical occurrence of statements+--++ATTR AllFinal [ | lexCounter : Int | ]++SEM Program | Program+  blocks.lexCounter = 1++SEM Stmt | *+  loc.lexOrder : UNIQUEREF lexCounter++SEM ImplStmt | *+  loc.lexOrder : UNIQUEREF lexCounter++SEM Clause | Clause            loc.lexOrder : UNIQUEREF lexCounter+SEM SemVisit | Visit Internal  loc.lexOrder : UNIQUEREF lexCounter++{+nextUnique :: Int -> (Int, Int)+nextUnique x = (x+1, x)+}++--+-- Lexical occurrence of children+-- (direct children of a clause)++ATTR Stmts Stmt [ | | gathChildOcc USE {`unionWithMin`} {Map.empty} : {Map Ident Int} ]+ATTR AllCodeBlocks ImplStmts ImplStmt [ distChildOcc : {Map Ident Int} | | ]++{+unionWithMin :: Map Ident Int -> Map Ident Int -> Map Ident Int+unionWithMin = Map.unionWith min+}++SEM Stmt | Attach  lhs.gathChildOcc = Map.singleton @name @loc.lexOrder++SEM Program | Program  blocks.distChildOcc  = Map.empty+SEM Item | Sem CoSem   first.distChildOcc   = Map.empty+SEM DataSem | Sem      clauses.distChildOcc = Map.empty++SEM SemVisit | Visit Internal  loc.distChildOcc = @stmts.gathChildOcc `unionWithMin` @lhs.distChildOcc+SEM Clause | Clause            loc.distChildOcc = @stmts.gathChildOcc `unionWithMin` @lhs.distChildOcc++--+-- Define clauses of DataSem in terms of a visit+--++SEM DataSem | Sem+  inst.clauses : T_SemVisit+  inst.clauses = sem_SemVisit_Visit @pos @loc.firstVisit @cyclic (sem_VisitAttrs_Nil) (sem_Stmts @stmts)++--+-- Some useful properties+--++ATTR ItfVisits ItfVisit [ | | firstVisit : Ident ]+SEM ItfVisit | Visit  lhs.firstVisit = @name+SEM ItfVisits+  | Cons  lhs.firstVisit = @hd.firstVisit+  | Nil   lhs.firstVisit = ident "nofirstvisit"++SEM ItfVisit+  | Visit  loc.itfNm = head @lhs.itf++SEM Attr+  | Inh Syn  loc.itfNm = head @lhs.itf+             loc.visNm = head @lhs.visit++ATTR ItfVisit [ mbNextVisit : {Maybe Ident} | | ]+ATTR ItfVisits [ | | mbNextVisit : {Maybe Ident} ]++SEM ItfVisits+  | Cons  hd.mbNextVisit  = @tl.mbNextVisit+          lhs.mbNextVisit = Just @hd.firstVisit+  | Nil   lhs.mbNextVisit = Nothing++SEM SemVisit | Visit Internal  loc.itfNm = head @lhs.itf+SEM Clause | Clause            loc.itfNm = head @lhs.itf++ATTR SemVisit [ | | mbNextVisit : {Maybe Ident} ]+SEM SemVisit+  | Visit Internal  lhs.mbNextVisit = Just @name+  | End             lhs.mbNextVisit = Nothing++ATTR MaybeBoundCode [ | | isJust : Bool ]+SEM MaybeBoundCode+  | Just     lhs.isJust = True+  | Nothing  lhs.isJust = False++ATTR Exts Ext [ | | gathExts USE {`Set.union`} {Set.empty} : {Set Ident} ]+SEM Ext | Ext  lhs.gathExts = Set.singleton @name  ++{+type AttrVisMap = Map Ident (Map (Bool,Ident) Ident)+}++ATTR BlocksTop Blocks Block Itf [ | | gathAttrVisMap USE {`Map.union`} {Map.empty} : AttrVisMap ]+ATTR ItfVisits ItfVisit Attrs Attr [ | | gathAttrVisMap USE {`Map.union`} {Map.empty} : {Map (Bool,Ident) Ident} ]+SEM Itf | Itf  lhs.gathAttrVisMap = Map.singleton @name @visits.gathAttrVisMap+SEM Attr | Inh Syn  lhs.gathAttrVisMap = Map.singleton (@loc.isInh, @name) (head @lhs.visit)+SEM Attr | Inh  loc.isInh = True+         | Syn  loc.isInh = False++ATTR AllCodeBlocks ImplStmts ImplStmt [ distAttrVisMap : AttrVisMap | | ]+SEM Program | Program  blocks.distAttrVisMap = @blocks.gathAttrVisMap++{+type DataMap  = Map Ident ConMap+type ConMap   = Map Ident (Int, FieldMap)+type FieldMap = Map Ident (Int, Either Ident String)+}++ATTR BlocksTop Blocks Block Data Type [ | | gathDataMap USE {`Map.union`} {Map.empty} : DataMap ]+ATTR Cons Con [ | | gathConMap USE {`Map.union`} {Map.empty} : ConMap ]+ATTR Fields Field [ | | gathFieldMap USE {`Map.union`} {Map.empty} : FieldMap ]++SEM Data  | Data   lhs.gathDataMap  = Map.singleton @name @cons.gathConMap+SEM Con   | Con    lhs.gathConMap   = Map.singleton @name (@lhs.nr, @fields.gathFieldMap)+SEM Field | Field  lhs.gathFieldMap = Map.singleton @name (@lhs.nr, @type.fldType)++ATTR AllCodeBlocks ImplStmts ImplStmt [ distDataMap : DataMap | | ]+SEM Program | Program  blocks.distDataMap = @blocks.gathDataMap++-- Basename: a unique name for the current clause. VisitNames are shared.+ATTR AllFinal [ basename : QIdent | | ]+ATTR AllVisitClauses [ semBasename : QIdent | | ]++SEM Program | Program  blocks.basename = [ident "<root>"]++SEM Item | Sem CoSem  loc.basename    = [@name]+                      loc.semBasename = [@name]+SEM DataSem | Sem     loc.basename    = [@tp]+                      loc.semBasename = [@tp]+SEM Clause | Clause   loc.basename    = @name : @lhs.basename++-- within the context of a cosem or not+ATTR AllVisitClauses [ withinCoSem : Bool | | ]++SEM Item | Sem     first.withinCoSem   = False+SEM Item | CoSem   first.withinCoSem   = True+SEM DataSem | Sem  clauses.withinCoSem = False++-- mode of a Mode+ATTR Mode [ | | isMatch : Bool ]+SEM Mode | Match   lhs.isMatch = True+         | Assert  lhs.isMatch = False++-- position of a DataSem++ATTR DataSem [ | | pos : Pos ]+SEM DataSem | Sem  lhs.pos = @pos+SEM Item | DataSem  loc.pos = @sem.pos+++--+-- Convert type aliases to their structural representation+--++ATTR AliasType [ | | alias : SELF ]+ATTR BlocksTop Blocks Block Type [ | | gathAliasses USE {`Map.union`} {Map.empty} : {Map Ident AliasType} ]+ATTR AllCodeBlocks ImplStmts ImplStmt Data Cons Con Fields Field FieldType Type [ distAliasses : {Map Ident AliasType} | | ]++SEM Type | Alias       lhs.gathAliasses = Map.singleton @name @type.alias+SEM Program | Program  blocks.distAliasses = @blocks.gathAliasses++SEM Pat  | AttrCon       loc.mbAlias = Map.lookup @dt @lhs.distAliasses+SEM Item | Construct     loc.mbAlias = Map.lookup @data @lhs.distAliasses+SEM FieldType | Nonterm  loc.mbAlias = Map.lookup @name @lhs.distAliasses++SEM Type | Alias+inst.data : Data+inst.data = @type.data++ATTR AliasType [ pos : Pos name : Ident vars : Vars | | data : {Data} ]+SEM Type | Alias  type.pos  = @pos+                  type.name = @name+                  type.vars = @vars.self++SEM AliasType+  | Prod   lhs.data = let mkFld i nm = Field_Field (Ident ("x" ++ show i) @lhs.pos) (FieldType_Nonterm nm)+                      in Data_Data @lhs.pos @lhs.name @lhs.vars+                           [Con_Con @lhs.pos (Ident "Prod" @lhs.pos) [] (zipWith mkFld [1..] @fields) ] []+  | List   lhs.data = Data_Data @lhs.pos @lhs.name @lhs.vars+                        [ Con_Con @lhs.pos (Ident "Cons" @lhs.pos) []+                            [ Field_Field (Ident "hd" @lhs.pos) (FieldType_Nonterm @type)+                            , Field_Field (Ident "tl" @lhs.pos) (FieldType_Nonterm @lhs.name)+                            ]+                        , Con_Con @lhs.pos (Ident "Nil" @lhs.pos) [] []+                        ] []+  | Maybe  lhs.data = Data_Data @lhs.pos @lhs.name @lhs.vars+                        [ Con_Con @lhs.pos (Ident "Just" @lhs.pos) []+                            [ Field_Field (Ident "just" @lhs.pos) (FieldType_Nonterm @type)+                            ]+                        , Con_Con @lhs.pos (Ident "Nothing" @lhs.pos) [] []+                        ] []++ATTR Vars Var [ | | self : SELF vars USE {++} {[]} : {[Ident]} ]+SEM Var | Var  lhs.vars = [@name]++--+-- Deal with type variables+--++-- todo+ATTR ItfVisits ItfVisit Cons Con [ vars : {[Ident]} | | ]++--+-- Extra Interfaces and semantics+--++ATTR Blocks Block Data Cons Con Itf ItfVisits ItfVisit [ | | extraBlocks USE {++} {[]} : {Blocks} ]++SEM BlocksTop | Top+  inst.extra : BlocksTop+  inst.extra = if null @blocks.extraBlocks+               then BlocksTop_None+               else BlocksTop_Top @blocks.extraBlocks++SEM Con | Con+  lhs.extraBlocks = if genConNonterms @lhs.opts+                    then [@loc.constr, @loc.deconstr, @loc.constrSem, @loc.deconstrSem]+                    else []+  loc.conItfNm    = conItf @lhs.data @name+  loc.deconItfNm  = deconItf @lhs.data @name+  loc.allVarNms   = sort (@lhs.vars ++ @vars.vars)+  loc.allVars     = map Var_Var @loc.allVarNms+  loc.constr   = Block_Itf $+                 Itf_Itf @pos @loc.conItfNm @loc.allVars [ItfVisit_Visit @pos (Ident "construct" @pos) False []+                   ( Attr_Syn (Ident "data" @pos) (show @lhs.data)+                   : [ Attr_Inh k (either show id t) | (k,t) <- sortAssocs $ assocs @fields.gathFields ] )]+  loc.deconstr = Block_Itf $+                 Itf_Itf @pos @loc.deconItfNm @loc.allVars [ItfVisit_Visit @pos (Ident "deconstruct" @pos) False []+                   ( Attr_Inh (Ident "data" @pos) (show @lhs.data)+                   : [ Attr_Syn k (either show id t) | (k,t) <- sortAssocs $ assocs @fields.gathFields ] )]+  loc.constrSem   = Block_Item @loc.conItfNm $+                      Item_Sem @pos @loc.conItfNm @loc.conItfNm [] Nothing $+                        SemVisit_Visit @pos (Ident "construct" @pos) False [] [] $ ClausesTop_Top [+                          Clause_Clause @pos (Ident "dispatch" @pos) [+                            Stmt_Eval Mode_Assert+                              (Pat_Attr (Ident "lhs" @pos) (Ident "data" @pos))+                              (BoundCode_Code Bind_Fun @pos $ Code_Code [+                                Item_Construct @pos @lhs.data @name+                                  [ ExprField_Field k $ Code_Code [+                                        Item_Attr @pos (Ident "lhs" @pos) k+                                      ]+                                  | (k,_) <- assocs @fields.gathFields ]+                              ] ) ] SemVisit_End ]+  loc.deconstrSem = Block_Item @loc.deconItfNm $+                      Item_Sem @pos @loc.deconItfNm @loc.deconItfNm [] Nothing $+                        SemVisit_Visit @pos (Ident "deconstruct" @pos) False [] [] $ ClausesTop_Top [+                          Clause_Clause @pos (Ident "dispatch" @pos) [+                            Stmt_Eval Mode_Match+                              (Pat_AttrCon @name (Ident "lhs" @pos) @lhs.data)+                              (BoundCode_Code Bind_Fun @pos $ Code_Code [+                                 Item_Attr @pos (Ident "lhs" @pos) (Ident "data" @pos)])+                            ] SemVisit_End ]++{+conItf   dt con = Ident ("Con_" ++ show dt ++ "_" ++ show con) (identPos con)+deconItf dt con = Ident ("Decon_" ++ show dt ++ "_" ++ show con) (identPos con)+noIterNm dt con = Ident ("NoIter_" ++ show dt ++ "_" ++ show con) (identPos con)+}++SEM ItfVisit | Visit+  lhs.extraBlocks = if genCoSems @lhs.opts+                     then [@loc.noIterSem]+                     else []+  loc.unqualItf = head @lhs.itf+  loc.noIterNm  = noIterNm @loc.unqualItf @name+  loc.noIterSem = Block_Item @loc.noIterNm $+                    Item_CoSem @pos @loc.noIterNm @loc.unqualItf @name [] Nothing $+                      SemVisit_Visit @pos @name False [] [] $ ClausesTop_Top []++--+-- Compute the next visit of the (needed) children in scope+--++ATTR Stmts Stmt ImplStmts ImplStmt [ | gathNextVisits : {Map Ident (Maybe Ident)} | ]+ATTR SemVisit ClausesTop Clauses Clause [ distNextVisits : {Map Ident (Maybe Ident)} | | ]++SEM Item | Sem CoSem  first.distNextVisits   = Map.empty+SEM DataSem | Sem     clauses.distNextVisits = Map.empty++SEM Stmt | Invoke      loc.mbNextVisit = visitAfter @visit @loc.childVisits+SEM ImplStmt | Invoke  loc.mbNextVisit = visitAfter @visit @loc.childVisits++SEM SemVisit | Visit Internal+  stmts.gathNextVisits = Map.empty+  clauses.distNextVisits = @impls.gathNextVisits `Map.union` @lhs.distNextVisits+SEM Clause | Clause+  stmts.gathNextVisits = Map.empty+  next.distNextVisits = let ks = Map.keysSet @next.allReqInvokes+                        in Map.filter (maybe False (`Set.member` ks))+                                      (@impls.gathNextVisits `Map.union` @lhs.distNextVisits)++SEM Stmt | Invoke      +gathNextVisits = Map.insertWith (laterVisit @loc.childVisits) @name @loc.mbNextVisit+SEM ImplStmt | Invoke  +gathNextVisits = Map.insertWith (laterVisit @loc.childVisits) @child @loc.mbNextVisit++{+visitAfter :: Ident -> [Ident] -> Maybe Ident+visitAfter nm (a : b : nms)+  | nm == a    = Just b+  | otherwise  = visitAfter nm (b : nms)+visitAfter _ _ = Nothing++laterVisit :: [Ident] -> Maybe Ident -> Maybe Ident -> Maybe Ident+laterVisit _ Nothing  Nothing  = Nothing+laterVisit _ Nothing  (Just x) = Just x+laterVisit _ (Just x) Nothing  = Just x+laterVisit xs (Just l) (Just r) = Just $ laterVisit' xs l r++laterVisit' [] _ r = r+laterVisit' (x:xs) l r+  | x == l    = l+  | x == r    = r+  | otherwise = laterVisit' xs l r+}++ATTR SemVisit ClausesTop Clauses Clause [ myNextVisits : {Map Ident (Maybe Ident)} | | ]+SEM Item | Sem CoSem  loc.myNextVisits = Map.empty+SEM DataSem | Sem     loc.myNextVisits = Map.empty++SEM SemVisit | Visit+  loc.myNextVisits = Map.filter isJust @lhs.distNextVisits+++--+-- Computation of child ranges+-- (note: allDistChildMinRanges is passed to nested sems)+-- can be used to determine available children+--++ATTR AllCodeBlocks ImplStmts ImplStmt [ distAllChildMinRanges, distChildMinRanges : {Map Ident [Ident]} | | ]+ATTR AllCodeBlocks ImplStmts ImplStmt [ distChildEffRanges : {Map Ident (Set Ident)} | | ]+ATTR Stmts Stmt [ | | gathChildMinRanges USE {`unionWithPlusplus`} {Map.empty} : {Map Ident [Ident]} ]+ATTR Stmts Stmt [ | | gathChildEffRanges USE {`unionWithUnion`} {Map.empty} : {Map Ident (Set Ident)} ]++SEM Program | Program  blocks.distChildMinRanges    = Map.empty+                       blocks.distAllChildMinRanges = Map.empty+                       blocks.distChildEffRanges    = Map.empty+SEM DataSem | Sem      clauses.distChildMinRanges   = Map.empty+                       clauses.distChildEffRanges   = Map.empty+SEM Item | Sem CoSem   first.distChildMinRanges     = Map.empty+                       first.distChildEffRanges     = Map.empty++SEM Clause | Clause+  loc.distChildMinRanges    = @stmts.gathChildMinRanges `unionWithPlusplus` @lhs.distChildMinRanges+  loc.distAllChildMinRanges = @stmts.gathChildMinRanges `Map.union` @lhs.distAllChildMinRanges -- shadows+  loc.distChildEffRanges    = @stmts.gathChildEffRanges `unionWithUnion` @lhs.distChildEffRanges+  next.distChildEffRanges   = @loc.distChildEffRanges `diffInside` @loc.availInvokes+  loc.introChildren         = Map.keysSet (Map.difference @stmts.gathChildMinRanges @lhs.distChildMinRanges)++SEM SemVisit | Visit Internal+  loc.distChildMinRanges    = @stmts.gathChildMinRanges `unionWithPlusplus` @lhs.distChildMinRanges+  loc.distAllChildMinRanges = @stmts.gathChildMinRanges `Map.union` @lhs.distChildMinRanges  -- shadows+  loc.distChildEffRanges    = @stmts.gathChildEffRanges `unionWithUnion` @lhs.distChildEffRanges+  loc.introChildren         = Map.keysSet (Map.difference @stmts.gathChildMinRanges @lhs.distAllChildMinRanges)++SEM Stmt | Attach+  lhs.gathChildMinRanges = Map.singleton @name [@visit]+  lhs.gathChildEffRanges = Map.singleton @name (Set.fromList $ dropWhile (/= @loc.visit) @loc.childVisits)++-- detect ambiguous child attachments+-- there may not be two attach-stmts in a scope simultaneously with the same start visit+SEM Stmt | Attach+  +errs2 = if (length $ filter (== @visit) $ Map.findWithDefault [] @name @lhs.distChildMinRanges) > 1+           then (Err_AmbAttach @name @visit Seq.<|)+           else id++--+-- Computation of implicit invokes+--++-- banned invokes: an invoke explicitly declared in some clause. May not be implicitly invoked higher-up+ATTR AllVisitClauses Stmts Stmt [ | | bannedInvokes USE {`unionWithUnion`} {Map.empty} : {Map Ident (Set Ident)} ]+ATTR Clauses Clause Stmts Stmt [ | | explInvokes USE {`unionWithUnion`} {Map.empty} : {Map Ident (Set Ident)} ]++SEM Stmt | Invoke              lhs.explInvokes = Map.singleton @name (Set.singleton @visit)+SEM ClausesTop | Top           +bannedInvokes  = @clauses.explInvokes `unionWithUnion`+SEM SemVisit | Visit Internal  +bannedInvokes  = @stmts.explInvokes `unionWithUnion`++-- invokes needed on children+ATTR AllCodeBlocks [ | | minReqInvokes, allReqInvokes USE {`unionWithUnion`} {Map.empty} : {Map Ident (Set Ident)} ]+ATTR Clauses [ | | commonInvokes : {[Map Ident (Set Ident)]} ]++SEM Clauses+  | Cons  lhs.commonInvokes = @hd.allReqInvokes : @tl.commonInvokes+  | Nil   lhs.commonInvokes = []++SEM ClausesTop | Top+  lhs.minReqInvokes = intersectionsInvoke (@clauses.minReqInvokes : @clauses.commonInvokes)  ++{+intersectionsInvoke []     = Map.empty+intersectionsInvoke [x]    = x+intersectionsInvoke (x:xs) = Map.intersectionWith Set.intersection x (intersectionsInvoke xs)+}++SEM Clause | Clause+  loc.minReqInvokes1 = @stmts.minReqInvokes `unionWithUnion` @next.minReqInvokes  -- all needed+  loc.allReqInvokes1 = @stmts.allReqInvokes `unionWithUnion` @next.allReqInvokes+  loc.minReqInvokes  = Map.filterWithKey (\k _ -> not (Set.member k @loc.introChildren)) @loc.minReqInvokes1+  loc.allReqInvokes  = Map.filterWithKey (\k _ -> not (Set.member k @loc.introChildren)) @loc.allReqInvokes1++SEM SemVisit | Visit Internal+  loc.minReqInvokes1 = @stmts.minReqInvokes `unionWithUnion` @clauses.minReqInvokes+  loc.allReqInvokes1 = @stmts.allReqInvokes `unionWithUnion` @clauses.allReqInvokes+  loc.minReqInvokes  = Map.filterWithKey (\k _ -> not (Set.member k @loc.introChildren)) @loc.minReqInvokes1+  loc.allReqInvokes  = Map.filterWithKey (\k _ -> not (Set.member k @loc.introChildren)) @loc.allReqInvokes1++-- register all needs for visits+SEM Item | Detach+  loc.minRanges     = Set.fromList $ Map.findWithDefault [] @name @lhs.distAllChildMinRanges+  loc.potentialReqs = drop 1 $ dropWhile (/= @visit) $ reverse @loc.visitOrder+  loc.actualReqs    = take (1 + length (takeWhile (\x -> not $ Set.member x @loc.minRanges) @loc.potentialReqs)) @loc.potentialReqs++  loc.invokeReqs    = Map.singleton @name $ Set.fromList @loc.actualReqs+  lhs.minReqInvokes = @loc.invokeReqs+  lhs.allReqInvokes = @loc.invokeReqs++-- Introduces the need for all visits having the attribute+-- specified by the default of all children in scope+-- (iff not banned: checked higher up)+SEM Stmt | Default+  -- enumerate direct children and their itfs+  -- enumerate visits with attr name (use attrVisMap)+  -- add to minReqInvokes and allReqInvokes+  loc.visitReqs = [ Map.singleton child $ Set.fromList $ rangeUpTo (fromJust mbVis) range+                    | child <- Map.keys @lhs.distChildMinRanges+                    , let itf         = findChild child @lhs.distChildDefs+                          attrVisits  = Map.findWithDefault Map.empty itf @lhs.distAttrVisMap+                          childVisits = Map.findWithDefault [] itf @lhs.distVisitOrder+                          minRanges   = Set.fromList $ Map.findWithDefault [] child @lhs.distChildMinRanges+                          range       = dropWhile (\v -> not (v `Set.member` minRanges)) childVisits+                          mbVis       = Map.lookup (False,nm) attrVisits+                          nm          = renameAttrFwd @lhs.distRenames child @name+                    , isJust mbVis+                    ]+  loc.invokeReqs    = Map.unionsWith Set.union @loc.visitReqs+  lhs.minReqInvokes = @loc.invokeReqs+  lhs.allReqInvokes = @loc.invokeReqs++SEM Stmt | Attach+  -- enumerate all defaults in scope+  -- lookup if syn attr exists for this child+  -- if yes, add a need on the visit+  loc.attrVisits    = Map.findWithDefault Map.empty @type @lhs.distAttrVisMap+  loc.visitReqs     = [ rangeUpTo (fromJust mbVis) $ dropWhile (/= @loc.visit) @loc.childVisits +                      | attr <- Map.keys @lhs.distDeflStmts+                      , let mbVis = Map.lookup (False,attr) @loc.attrVisits+                      , isJust mbVis ]+  loc.invokeReqs    = Map.singleton @name $ Set.fromList (concat @loc.visitReqs)+  lhs.minReqInvokes = @loc.invokeReqs+  lhs.allReqInvokes = @loc.invokeReqs++{+rangeUpTo :: Ident -> [Ident] -> [Ident]+rangeUpTo _ [] = []+rangeUpTo vis (x:xs)+  | x == vis  = [x]+  | otherwise = x : rangeUpTo vis xs+}++SEM AttrTypeCode | Child+  loc.visitOfAttr   = Map.findWithDefault unknIdent (False,@lhs.name)+                        (Map.findWithDefault Map.empty @lhs.childItf @lhs.distAttrVisMap)+  loc.minRanges     = Set.fromList $ Map.findWithDefault [] @lhs.child @lhs.distAllChildMinRanges+  loc.potentialReqs = dropWhile (/= @loc.visitOfAttr) $ reverse @loc.visitOrder+  loc.actualReqs    = take (1 + length (takeWhile (\x -> not $ Set.member x @loc.minRanges) @loc.potentialReqs)) @loc.potentialReqs+  +  loc.invokeReqs    = Map.singleton @lhs.child $ Set.fromList @loc.actualReqs+  lhs.minReqInvokes = @loc.invokeReqs+  lhs.allReqInvokes = @loc.invokeReqs++-- available invokes (two flavours: nested and not nested)+ATTR AllCodeBlocks ImplStmts ImplStmt [ availInvokes, allAvailInvokes : {Map Ident (Set Ident)} | | ]++SEM Program | Program  blocks.availInvokes    = Map.empty+                       blocks.allAvailInvokes = Map.empty++SEM DataSem | Sem     clauses.availInvokes    = Map.empty+SEM Item | Sem CoSem  first.availInvokes      = Map.empty++SEM SemVisit | Visit Internal+  loc.implicitInvokes   = @loc.minReqInvokes1 `diffInside` @lhs.availInvokes+                                              `diffInside` @stmts.explInvokes+                                              `diffInside` @clauses.bannedInvokes+  loc.additionalInvokes = @loc.minReqInvokes1 `diffInside` @clauses.bannedInvokes `unionWithUnion` @stmts.explInvokes+  loc.availInvokes      = @loc.additionalInvokes `unionWithUnion` @lhs.availInvokes+  loc.allAvailInvokes   = @loc.additionalInvokes `unionWithUnion` (+                            Map.filterWithKey (notIn @loc.introChildren) @lhs.allAvailInvokes )+--  +errs1 = debugMsg ("visit: " ++ show @name ++ "\n impl: " ++ show @loc.implicitInvokes ++"\n banned: " ++ show @clauses.bannedInvokes) Seq.><++SEM Clause | Clause+  loc.implicitInvokes   = @loc.minReqInvokes1 `diffInside` @lhs.availInvokes+                                              `diffInside` @stmts.explInvokes+                                              `diffInside` @next.bannedInvokes+  loc.additionalInvokes = @loc.minReqInvokes1 `diffInside` @next.bannedInvokes `unionWithUnion` @stmts.explInvokes+  loc.availInvokes      = @loc.additionalInvokes `unionWithUnion` @lhs.availInvokes+  loc.allAvailInvokes   = @loc.additionalInvokes `unionWithUnion` (+                            Map.filterWithKey (notIn @loc.introChildren) @lhs.allAvailInvokes )+  +--  +errs1 = debugMsg ("clause: " ++ show @name ++ "\n impl: " ++ show @loc.implicitInvokes ++"\n banned: " ++ show @next.bannedInvokes) Seq.><++{+notIn :: Ord a => Set a -> a -> b -> Bool+notIn s k _ = not (k `Set.member` s)++diffInside :: Map Ident (Set Ident) -> Map Ident (Set Ident) -> Map Ident (Set Ident)+diffInside = Map.differenceWith f where+  f a b = let r = Set.difference a b+          in if Set.null r then Nothing else Just r+}++-- Report errors for missing invokes+ATTR Code Items Item  AllVisitClauses Stmts Stmt+     MaybeBoundCode BoundCode AttrTypeCode+     [ | | gathMissingInvokes USE {`Set.union`} {Set.empty} : {Set (Ident,Ident)}]+  +SEM Item | Detach+  lhs.gathMissingInvokes = Set.fromList [ (k, v) | (k,vs) <- Map.assocs (@loc.invokeReqs `diffInside` @lhs.allAvailInvokes)+                                        , v <- Set.toList vs ]++SEM AttrTypeCode | Child+  lhs.gathMissingInvokes = Set.fromList [ (k, v) | (k,vs) <- Map.assocs (@loc.invokeReqs `diffInside` @lhs.allAvailInvokes)+                                        , v <- Set.toList vs ]++SEM SemVisit | Visit Internal+  loc.missingInvokes = Set.toList (@stmts.gathMissingInvokes `Set.difference` @clauses.gathMissingInvokes)+  +errs2 = Seq.fromList (map (\(nm,vs) -> Err_MissingVisit @pos nm vs) @loc.missingInvokes) Seq.><++SEM Clause | Clause+  loc.missingInvokes = Set.toList (@stmts.gathMissingInvokes `Set.difference` @next.gathMissingInvokes)+  +errs2 = Seq.fromList (map (\(nm,vs) -> Err_MissingVisit @pos nm vs) @loc.missingInvokes) Seq.><++--+-- Propagate default-stmts in scope+--++ATTR AllCodeBlocks ImplStmts ImplStmt [ distDeflStmts : {Map Ident (Bool,Maybe Int)} | | ]+ATTR Stmts Stmt [ | | gathDeflStmts USE {`Map.union`} {Map.empty} : {Map Ident (Bool,Maybe Int)} ]++SEM Program | Program  blocks.distDeflStmts  = Map.empty+SEM Item | Sem CoSem   first.distDeflStmts   = Map.empty+SEM DataSem | Sem      clauses.distDeflStmts = Map.empty++SEM Stmt | Default             loc.codeId : UNIQUEREF codeIdCounter+                               loc.mbCodeId = if @mbCode.isJust then Just @loc.codeId else Nothing+                               lhs.gathDeflStmts = Map.singleton @name (@allowEmpty,@mbCodeId)+SEM SemVisit | Visit Internal  loc.distDeflStmts = @stmts.gathDeflStmts `Map.union` @lhs.distDeflStmts+SEM Clause | Clause            loc.distDeflStmts = @stmts.gathDeflStmts `Map.union` @lhs.distDeflStmts++ATTR AllCodeBlocks [ | codeIdCounter : Int | ]+SEM Program | Program  blocks.codeIdCounter = 1++SEM Stmt | Default+  +errs1 = if Map.findWithDefault (@allowEmpty,@mbCodeId) @name @lhs.distDeflStmts /= (@allowEmpty,@mbCodeId)+           then (Err_AmbDefault @pos @name Seq.<|)+           else id++--+-- Gather visit starts and ends in lexical order+--++ATTR AllCodeBlocks [ | | gathVisitStarts, gathVisitEnds USE {Seq.><} {Seq.empty} : {Seq DepItem} ]+SEM SemVisit | Visit Internal+  +gathVisitStarts = @loc.scopeDep   Seq.<|+  +gathVisitEnds   = @loc.visitEndDep Seq.<|++--+-- Gather semantics starts and ends (in lexical order)+--++ATTR AllCodeBlocks [ | | gathSemStarts USE {Seq.><} {Seq.empty} : {Seq DepItem} ]+SEM SemVisit | Visit+  +gathSemStarts = if @lhs.visitNr == 1+                   then (@loc.scopeDep Seq.<|)+                   else id+++--+-- Determine visit start rank+--++ATTR AllVisitClauses [ | | gathVisRankMap USE {`mappend`} {mempty} : {IntMap Ident} ]+ATTR AllVisitClauses Stmts Stmt ImplStmts ImplStmt [ distVisRankMap : {IntMap Ident} | | ]++SEM SemVisit | Visit Internal+  +gathVisRankMap = IntMap.insert @loc.rank @name++SEM Item | Sem CoSem  first.distVisRankMap   = @first.gathVisRankMap+SEM DataSem | Sem     clauses.distVisRankMap = @clauses.gathVisRankMap++SEM Stmt | *      loc.destVisit = getDestVisit @loc.rank @lhs.distVisRankMap+SEM ImplStmt | *  loc.destVisit = getDestVisit @loc.rank @lhs.distVisRankMap++{+getDestVisit :: Int -> IntMap Ident -> Ident+getDestVisit  rank ranks+  = maybe (ident "unknownDestVisit") fst mbMax+  where (smaller, _) = IntMap.split rank ranks+        mbMax        = IntMap.maxView smaller+}++--+-- Cyclic visit information+--++{+type CycVisMap = Map Ident (Set Ident)+}++ATTR BlocksTop Blocks Block Itf [ | | gathCycVisMap USE {`Map.union`} {Map.empty} : CycVisMap ]+ATTR ItfVisits ItfVisit [ | | gathCycVisits USE {`Set.union`} {Set.empty} : {Set Ident}]+ATTR Attrs Attr [ visCyclic : Bool | | ]+ATTR AllFinal [ distCycVisMap : CycVisMap | | ]++SEM ItfVisit | Visit   lhs.gathCycVisits = if @cyclic then Set.singleton @name else Set.empty+                       loc.visCyclic     = @cyclic+SEM Itf | Itf          lhs.gathCycVisMap = Map.singleton @name @visits.gathCycVisits+SEM Program | Program  blocks.distCycVisMap = @blocks.gathCycVisMap++ATTR SemVisit ClausesTop Clauses Clause Stmts Stmt ImplStmts ImplStmt [ fullCyclicVisits : {Set Ident} | | ]+ATTR SemVisit ClausesTop Clauses Clause [ fullCyclic : Bool | | ]++SEM Item | Sem CoSem  first.fullCyclicVisits   = Map.findWithDefault Set.empty @tp @lhs.distCycVisMap+                      first.fullCyclic         = False+SEM DataSem | Sem     clauses.fullCyclicVisits = Map.findWithDefault Set.empty @tp @lhs.distCycVisMap+                      clauses.fullCyclic       = False++SEM SemVisit | Visit+  loc.fullCyclic  = Set.member @name @lhs.fullCyclicVisits+  loc.allowCycles = @cyclic || @lhs.fullCyclic++SEM SemVisit | Internal  -- may not occur in a full cyclic visit+  loc.fullCyclic  = False+  loc.allowCycles = @cyclic+  +errs3 = if @lhs.fullCyclic+           then (Err_InternalInCyclic @pos @name Seq.<|)+           else id++ATTR SemVisit ClausesTop Clauses Clause [ | | gathAllowCycVisits USE {`mappend`} {mempty} : {Set Ident} ]+ATTR SemVisit ClausesTop Clauses Clause Stmts Stmt ImplStmts ImplStmt [ allowCycVisits : {Set Ident} | | ]++SEM Item | Sem CoSem    first.allowCycVisits   = @first.gathAllowCycVisits+SEM DataSem | Sem       clauses.allowCycVisits = @clauses.gathAllowCycVisits+SEM SemVisit | Visit    +gathAllowCycVisits    = if @loc.allowCycles then Set.insert @name else id+             | Internal +gathAllowCycVisits    = if @loc.allowCycles then Set.insert @loc.name else id++SEM Stmt | *      loc.fullCyclic  = Set.member @loc.destVisit @lhs.fullCyclicVisits  +                  loc.allowCycles = Set.member @loc.destVisit @lhs.allowCycVisits+SEM ImplStmt | *  loc.fullCyclic  = Set.member @loc.destVisit @lhs.fullCyclicVisits+                  loc.allowCycles = Set.member @loc.destVisit @lhs.allowCycVisits++SEM Stmt | Invoke+  loc.visitCyclic  = Set.member @visit (Map.findWithDefault Set.empty @loc.unqualChildItf @lhs.distCycVisMap)+  loc.behaveCyclic = @loc.fullCyclic || @loc.visitCyclic++SEM ImplStmt | Invoke+  loc.visitCyclic  = Set.member @visit (Map.findWithDefault Set.empty @itf @lhs.distCycVisMap)+  loc.behaveCyclic = @loc.fullCyclic || @loc.visitCyclic++-- sanity check+SEM Stmt+  | Eval      +errs5 = if @loc.isCyclic && @mode.isMatch+                       then (Err_MatchCyclic @loc.pos Seq.<|)+                       else id+              +errs5 = if @loc.isCyclic && not @code.isFun+                       then (Err_EffCyclic @loc.pos Seq.<|)+                       else id+  | Attach    +errs5 = if @loc.isCyclic && @code.isJust && not @code.isFun+                       then (Err_EffCyclic @pos Seq.<|)+                       else id+  | Invoke    +errs5 = if @loc.isCyclic && @code.isJust && not @code.isFun+                       then (Err_EffCyclic @pos Seq.<|)+                       else id+  | Default   +errs5 = if @loc.isCyclic && @mbCode.isJust && not @mbCode.isFun+                       then (Err_EffCyclic @pos Seq.<|)+                       else id++SEM Stmt | Invoke+  +errs5 = if @loc.isCyclic && not @loc.visitCyclic+           then (Err_VisExpCyclic @visit @name Seq.<|)+           else id+  +errs5 = if @code.isJust && @loc.isCyclic+           then (Err_IterCyclic @pos Seq.<|)+           else id++SEM ImplStmt | Invoke+  +errs5 = if @loc.isCyclic && not @loc.visitCyclic+           then (Err_VisExpCyclic @visit @child Seq.<|)+           else id++SEM SemVisit | Visit Internal+  loc.nClauses = Set.size @clauses.gathClauseNames+  +errs1 = if @loc.fullCyclic && @loc.nClauses /= 1 && not @lhs.withinCoSem+           then (Err_ClausesCyclic @pos @name @loc.nClauses Seq.<|)+           else id++ATTR ClausesTop Clauses [ | | nClauses : Int ]+SEM Clauses+  | Cons  +nClauses    = (+1)+  | Nil   lhs.nClauses = 0++ATTR MaybeBoundCode BoundCode Bind [ | | isFun : Bool ]+SEM Bind+  | Fun       lhs.isFun = True+  | Monadic   lhs.isFun = False++SEM MaybeBoundCode | Nothing  lhs.isFun = False++-- Visits to avoid+ATTR AllCodeBlocks [ | | gathAvoidVisits USE {`Set.union`} {Set.empty} : {Set DepItem} ]+SEM SemVisit | Visit+  +gathAvoidVisits = if @loc.fullCyclic+                     then Set.insert @loc.visitEndDep+                     else id++-- What item belongs to what visit+ATTR AllFinal [ | | gathItemVisits USE {`Map.union`} {Map.empty} : {Map DepItem DepItem} ]+SEM SemVisit | Visit Internal  +gathItemVisits = Map.insert @loc.scopeDep @loc.scopeDep+SEM Clause | Clause            +gathItemVisits = Map.insert @loc.scopeDep @lhs.visitBeginDep+SEM Stmt | *                   +gathItemVisits = Map.insert @loc.stmtSource @lhs.visitBeginDep+SEM ImplStmt | *               +gathItemVisits = Map.insert @loc.stmtSource @lhs.visitBeginDep++ATTR AllFinal [ | | gathLegalCycStmts USE {`Set.union`} {Set.empty} : {Set DepItem} ]+SEM Stmt | *      +gathLegalCycStmts = if @loc.allowCycles then Set.insert @loc.stmtSource else id+SEM ImplStmt | *  +gathLegalCycStmts = if @loc.allowCycles then Set.insert @loc.stmtSource else id+++--+-- Dependency analysis+--++-- Dependable items and their ordening+{+unknDepItem :: DepItem+unknDepItem = DepVisStart [ident "errorunknown"]+}++-- Pass down the source of a statement+ATTR AllFinal [ stmtSource : DepItem | | ]++SEM Program | Program  blocks.stmtSource = DepMatch (-999)+SEM Stmt+  | Eval     loc.stmtSource = if @mode.isMatch then DepMatch @loc.lexOrder else DepAssert @loc.lexOrder+  | Default  loc.stmtSource = DepDefault @loc.codeId+  | Attach   loc.stmtSource = DepAttach @loc.lexOrder+  | Invoke   loc.stmtSource = DepInvoke (@visit : @name : @lhs.basename)+  | Rename   loc.stmtSource = DepAssert @loc.lexOrder++SEM ImplStmt+  | Invoke   loc.stmtSource = DepInvoke (@visit : @child : @lhs.basename)+  | DefaultChild DefaultSyn DefaultVisLocal+             loc.stmtSource = DepAssert @loc.lexOrder++ATTR AllFinal [ | | gathStmtPosMap USE {`Map.union`} {Map.empty} : {Map DepItem Pos} ]+SEM Stmt | Eval   loc.pos = @code.pos+SEM Stmt | *      +gathStmtPosMap = Map.insert @loc.stmtSource @pos+SEM ImplStmt | *  +gathStmtPosMap = Map.insert @loc.stmtSource @pos++ATTR Pats Pat BoundCode [ | | pos : Pos ]+SEM Pat | Con         lhs.pos = identPos @name+        | AttrCon     lhs.pos = identPos @dt+        | Attr        lhs.pos = identPos @child+        | Tup         lhs.pos = @pats.pos+        | List        lhs.pos = @pats.pos+        | Cons        lhs.pos = @hd.pos+        | Underscore  lhs.pos = @pos+SEM Pats | Cons       lhs.pos = @hd.pos+         | Nil        lhs.pos = noPos+SEM BoundCode | Code  lhs.pos = @pos++-- Determines: "Where is each attribute defined? What is its source?"+{+type AttrSourceMap = Map (Bool,Ident,Ident) DepItem  -- Bool: True = inherited attr+}++ATTR AllFinal [ distAttrSource : AttrSourceMap | | ]+ATTR AllVisFinal [ | | gathAttrSource USE {`Map.union`} {Map.empty} : AttrSourceMap ]+ATTR AllVisitClauses [ | | gathSemAttrSource USE {`Map.union`} {Map.empty} : AttrSourceMap ]  -- global to entire SEM++SEM Program | Program   blocks.distAttrSource = Map.empty+SEM SemVisit | Visit    loc.distAttrSource = Map.unions [ @loc.gathChnAttrSource+                                                        , @stmts.gathAttrSource+                                                        , @loc.gathVisAttrSource+                                                        , @impls.gathAttrSource+                                                        , @lhs.distAttrSource ]+SEM SemVisit | Internal loc.distAttrSource = Map.unions [ @stmts.gathAttrSource+                                                        , @impls.gathAttrSource+                                                        , @lhs.distAttrSource ]+SEM Clause | Clause     loc.distAttrSource = Map.unions [ @stmts.gathAttrSource+                                                        , @deflts.gathAttrSource+                                                        , @impls.gathAttrSource+                                                        , @lhs.distAttrSource ]++SEM SemVisit | Visit+  loc.gathChnAttrSource = Map.fromList [ ((True,visIdent,attr),  @loc.scopeDep)    | attr <- Map.keys @attrs.gathVisitLocalAttrs ]+  loc.gathVisAttrSource = Map.fromList [ ((False,@name,attr),    @loc.visitEndDep) | attr <- Map.keys @attrs.gathVisitLocalAttrs ]++-- soures of lhs-inherited attributes+SEM Item | Sem CoSem+  loc.inhAttrMap = Map.findWithDefault Map.empty @tp @lhs.distVisitInhAttrs+  loc.inhAttrSource = Map.fromList [ ((True,lhsIdent,attr), DepVisStart (visit : @loc.semBasename))+                                   | (visit,mp) <- Map.assocs @loc.inhAttrMap, attr <- Map.keys mp ]+  first.distAttrSource = Map.union @loc.inhAttrSource @lhs.distAttrSource++SEM DataSem | Sem+  loc.inhAttrMap = Map.findWithDefault Map.empty @tp @lhs.distVisitInhAttrs+  loc.inhAttrSource = Map.fromList [ ((True,lhsIdent,attr), DepVisStart (visit : @loc.semBasename))+                                   | (visit,mp) <- Map.assocs @loc.inhAttrMap, attr <- Map.keys mp ]+  clauses.distAttrSource = Map.union @loc.inhAttrSource @lhs.distAttrSource++SEM Stmt | Invoke  -- child visit+  +gathAttrSource = Map.union $ Map.fromList [ ((False,@name,attr), @loc.stmtSource) | attr <- Map.keys @loc.synAttrMap ]++SEM ImplStmt | Invoke  -- child visit+  +gathAttrSource = Map.union $ Map.fromList [ ((False,@child,attr), @loc.stmtSource) | attr <- Map.keys @loc.synAttrMap ]++SEM AttrTypePat | VisLocal ProdLocal Lhs+  +gathAttrSource = Map.insert (False,@lhs.child,@lhs.name) @lhs.stmtSource+SEM AttrTypePat | Child Visit+  +gathAttrSource = Map.insert (True,@lhs.child,@lhs.name) @lhs.stmtSource++SEM ImplStmt+  | DefaultSyn       +gathAttrSource = Map.insert (False,lhsIdent,@name) @loc.stmtSource+  | DefaultChild     +gathAttrSource = Map.insert (True,@child,@name)    @loc.stmtSource+  | DefaultVisLocal  +gathAttrSource = Map.insert (False,visIdent,@name) @loc.stmtSource++SEM Pat | AttrCon+  loc.isLoc = @name == locIdent || @loc.childItf == locQIdent+  +gathAttrSource = Map.union (Map.fromList [ ((not @loc.isLoc, @name, nm), @lhs.stmtSource) | (nm,_) <- @loc.fields ])++-- Determines: "Where is each child defined. What is its start visit?"+{+type ChildSourceMap = Map Ident (Map Ident DepItem)+}++ATTR AllFinal [ distChildSource : ChildSourceMap | | ]+ATTR AllVisFinal [ | | gathChildSource USE {`unionWithUnion`} {Map.empty} : ChildSourceMap ]++SEM Program | Program   blocks.distChildSource = Map.empty+SEM SemVisit  | Visit Internal+  loc.distChildSource = Map.unionsWith mappend [ @stmts.gathChildSource+                                               , Map.filterWithKey (notIn @loc.introChildren) @lhs.distChildSource ]+SEM Clause | Clause+  loc.distChildSource = Map.unionsWith mappend [ @stmts.gathChildSource+                                               , Map.filterWithKey (notIn @loc.introChildren) @lhs.distChildSource ]++SEM Stmt | Attach+  +gathChildSource = Map.insertWith mappend @name (Map.singleton @loc.visit @loc.stmtSource)++-- Determines: "Where is each invoke defined?"+{+type VisitSourceMap = Map Ident (Map Ident DepItem)+}++ATTR AllFinal [ distVisitSource : VisitSourceMap | | ]+ATTR AllVisFinal [ | | gathVisitSource USE {`unionWithUnion`} {Map.empty} : VisitSourceMap ]++SEM Program | Program   blocks.distVisitSource = Map.empty+SEM SemVisit  | Visit Internal+  loc.distVisitSource = Map.unionsWith mappend [ @stmts.gathVisitSource+                                               , Map.filterWithKey (notIn @loc.introChildren) @lhs.distVisitSource ]++SEM Clause | Clause+  loc.distVisitSource = Map.unionsWith mappend [ @stmts.gathVisitSource+                                               , @impls.gathVisitSource+                                               , Map.filterWithKey (notIn @loc.introChildren) @lhs.distVisitSource ]++SEM Stmt | Invoke+  +gathVisitSource = Map.insertWith mappend @name (Map.singleton @visit @loc.stmtSource)++SEM ImplStmt | Invoke+  +gathVisitSource = Map.insertWith mappend @child (Map.singleton @visit @loc.stmtSource)++-- Context: in what clause or visit are we in scope?+ATTR AllFinal [ scopeReason, visitEndReason : Reason   scopeDep, visitBeginDep, visitEndDep : DepItem | | ]+SEM Program | Program+  blocks.scopeReason    = ReasonScopeVisit (ident "<root>")+  blocks.scopeDep       = DepVisStart [ident "<root>"]+  blocks.visitBeginDep  = DepVisStart [ident "<root>"]+  blocks.visitEndDep    = DepVisEnd [ident "<root>"]+  blocks.visitEndReason = ReasonScopeEnd (ident "<root>")++SEM SemVisit | Visit+  loc.scopeReason       = ReasonScopeVisit @name+  loc.scopeDep          = DepVisStart (@name : @lhs.semBasename)+  loc.visitBeginDep     = DepVisStart (@name : @lhs.semBasename)+  loc.visitEndDep       = DepVisEnd   (@name : @lhs.semBasename)+  loc.visitEndReason    = ReasonScopeEnd @name++SEM SemVisit | Internal+  loc.scopeReason       = ReasonScopeVisit @name+  loc.scopeDep          = DepVisStart (@loc.name : @lhs.semBasename)+  loc.visitBeginDep     = DepVisStart (@loc.name : @lhs.semBasename)+  loc.visitEndDep       = DepVisEnd   (@loc.name : @lhs.semBasename)+  loc.visitEndReason    = ReasonScopeEnd @name++SEM Clause | Clause+  loc.scopeReason       = ReasonScopeClause @name+  loc.scopeDep          = DepClause @loc.basename++-- Gather dependencies+{+data Dep = Dep !DepItem !Reason !([DepItem])+  deriving (Eq,Ord,Show)++type Deps = Seq Dep++addDep :: DepItem -> Reason -> [DepItem] -> Deps -> Deps+addDep item reason deps = (Seq.<|) (Dep item reason deps)++unknDep :: Dep+unknDep = Dep unknDepItem ReasonError [unknDepItem]+}++ATTR AllFinal [ | | gathDeps USE {Seq.><} {Seq.empty} : Deps ]++-- dependency on source of attr+SEM AttrTypeCode | VisLocal ProdLocal Lhs Child Visit+  +gathDeps = addDep @lhs.stmtSource (ReasonAttrReq @lhs.child @lhs.name) [@loc.attrDep]+  loc.attrDep = Map.findWithDefault (mkUnknownDep @loc.depKey) @loc.depKey @lhs.distAttrSource++SEM AttrTypeCode | VisLocal Lhs+  loc.depKey = (True,@lhs.child,@lhs.name)++SEM AttrTypeCode | Child Visit ProdLocal+  loc.depKey = (False,@lhs.child,@lhs.name)++{+mkUnknownDep :: Show a => a -> DepItem+mkUnknownDep s = DepVisStart [ident ("unknown" ++ show s)]+}++-- dependency on syn and vis attrs of visit. Must be defined before visit end.+SEM Clause | Clause  -- lhs.scopeDep is identifier of visit+  +gathDeps = if @loc.isDeepest+              then (Seq.fromList [ Dep @lhs.visitEndDep (ReasonAttrReq lhsIdent attr) +                                  [Map.findWithDefault (trace ("Clause.Clause.unknown.syn: " ++ show (attr, @loc.distAttrSource) ) unknDepItem) (False,lhsIdent,attr) @loc.distAttrSource]+                               | attr <- Map.keys @loc.synAttrMap ] Seq.><)+              else id+  +gathDeps = if @loc.isDeepest+              then (Seq.fromList [ Dep @lhs.visitEndDep (ReasonAttrReq visIdent attr) +                                  [Map.findWithDefault (trace "Clause.Clause.unknown.loc" unknDepItem) (False,visIdent,attr) @loc.distAttrSource]+                                | attr <- Map.keys @lhs.localAttrs ] Seq.><)+              else id++SEM Stmt | *  -- dependency on start of visit or clause+  +gathDeps = addDep @loc.stmtSource @lhs.scopeReason [@lhs.scopeDep]++SEM ImplStmt | *  -- dependency on start of visit or clause+  +gathDeps = addDep @loc.stmtSource @lhs.scopeReason [@lhs.scopeDep]++SEM ImplStmt | DefaultChild DefaultSyn  -- dependency on default stmt if reference to code+  +gathDeps = case @mbCodeRef of+                Nothing  -> id+                Just ref -> addDep @loc.stmtSource (ReasonDefault @name) [DepDefault ref]++SEM Stmt | Eval  -- dependency: must be before end of visit for match statements+  +gathDeps = if @mode.isMatch+              then addDep @lhs.visitEndDep @lhs.visitEndReason [@loc.stmtSource]+              else id++SEM Stmt | Invoke -- depends on: * previous invokes, nearest child, and defs for inh attrs+  loc.mbVisitSource = nearestVisitEntry False @visit @loc.childVisits $ Map.findWithDefault Map.empty @name @lhs.distVisitSource+  loc.mbChildSource = nearestVisitEntry True  @visit @loc.childVisits $ Map.findWithDefault Map.empty @name @lhs.distChildSource+  +gathDeps = case @loc.mbVisitSource of+                Nothing    -> id+                Just (_,d) -> addDep @loc.stmtSource (ReasonInvokeReq @visit) [d]+  +gathDeps = case @loc.mbChildSource of+                Nothing    -> id+                Just (_,d) -> addDep @loc.stmtSource (ReasonChildReq @name) [d]+  +gathDeps = Seq.fromList [ Dep @loc.stmtSource (ReasonAttrReq @name attr)+                               [Map.findWithDefault (trace "Stmt.Invoke.unknown.inh" unknDepItem) (True,@name,attr) @lhs.distAttrSource]+                           | attr <- Map.keys @loc.inhAttrMap ] Seq.><+  +gathDeps = addDep @lhs.visitEndDep @lhs.visitEndReason [@loc.stmtSource]++SEM ImplStmt | Invoke -- depends on: * previous invokes, nearest child, and defs for inh attrs+  loc.mbVisitSource = nearestVisitEntry False @visit @loc.childVisits $ Map.findWithDefault Map.empty @child @lhs.distVisitSource+  loc.mbChildSource = nearestVisitEntry True  @visit @loc.childVisits $ Map.findWithDefault Map.empty @child @lhs.distChildSource+  +gathDeps = case @loc.mbVisitSource of+                Nothing    -> id+                Just (_,d) -> addDep @loc.stmtSource (ReasonInvokeReq @visit) [d]+  +gathDeps = case @loc.mbChildSource of+                Nothing    -> id+                Just (_,d) -> addDep @loc.stmtSource (ReasonChildReq @child) [d]+  +gathDeps = Seq.fromList [ Dep @loc.stmtSource (ReasonAttrReq @child attr)+                               [Map.findWithDefault (trace "ImplStmt.Invoke.unknown.inh" unknDepItem) (True,@child,attr) @lhs.distAttrSource]+                           | attr <- Map.keys @loc.inhAttrMap ] Seq.><+  -- +errs2 = debugMsg ("Impl invoke: " ++ show @child ++ ", visit: " ++ show @visit ++ ", inh attrs: " ++ show @loc.inhAttrMap ++ "\nsource: " ++ show @lhs.distAttrSource) Seq.><++{+nearestVisitEntry :: Bool -> Ident -> [Ident] -> Map Ident DepItem -> Maybe (Ident,DepItem)+nearestVisitEntry inclusive vis order mp+  = case [ (b, Map.findWithDefault (trace "nearestVisitEntry.unknown" unknDepItem) b mp) | b <- befores, Map.member b mp ] of+      []    -> Nothing+      (e:_) -> Just e+  where+    entries = Map.assocs mp+    befores = reverse $ (takeWhile (/= vis) order ++ (if inclusive then [vis] else []))+}++-- deal with previous attach+SEM Stmt | Attach+  loc.childSources = Map.findWithDefault Map.empty @name @lhs.distChildSource+  loc.mbPrevEntry  = nearestVisitEntry False @loc.visit @loc.childVisits @loc.childSources+  +gathDeps = case @loc.mbPrevEntry of+                Nothing    -> id+                Just (_,d) -> addDep @loc.stmtSource (ReasonAttach @name @loc.visit) [d]++-- deal with detach+SEM Item | Detach  -- depends on: prev visits and children+  loc.mbVisitSource = nearestVisitEntry False @visit @loc.childVisits $ Map.findWithDefault Map.empty @name @lhs.distVisitSource+  loc.mbChildSource = nearestVisitEntry False @visit @loc.childVisits $ Map.findWithDefault Map.empty @name @lhs.distChildSource+  +gathDeps = case @loc.mbVisitSource of+                Nothing    -> id+                Just (_,d) -> addDep @lhs.stmtSource (ReasonDetach @name @visit) [d]+  +gathDeps = case @loc.mbChildSource of+                Nothing    -> id+                Just (_,d) -> addDep @lhs.stmtSource (ReasonDetach @name @visit) [d]++SEM SemVisit | Visit  -- depends on end of prev visit, end depends on begin+  +gathDeps = if null @lhs.doneVisits+              then id+              else addDep @loc.scopeDep @lhs.visitEndReason [@lhs.visitEndDep]++  +gathDeps = addDep @loc.visitEndDep (ReasonScopeVisit @name) [@loc.scopeDep]++SEM SemVisit | Internal  -- depends on end of prev visit, end depends on begin+  +gathDeps = addDep @loc.scopeDep @lhs.visitEndReason [@lhs.visitEndDep]+  +gathDeps = addDep @loc.visitEndDep (ReasonScopeVisit @name) [@loc.scopeDep]++SEM Clause | Clause  -- should be in between visit start and end+  +gathDeps = addDep @loc.scopeDep @lhs.scopeReason [@lhs.scopeDep]+  +gathDeps = addDep @lhs.visitEndDep @lhs.visitEndReason [@loc.scopeDep]++SEM ImplStmt | DefaultChild DefaultSyn  -- depend on generated stmt+  +gathDeps = case @mbCodeRef of+                Nothing  -> id+                Just ref -> addDep @loc.stmtSource (ReasonDefault @name) [DepDefault ref]++SEM ImplStmt | DefaultVisLocal  -- may not escape visit+  +gathDeps = addDep @lhs.visitEndDep @lhs.visitEndReason [@loc.stmtSource]++SEM ImplStmt -- depend on children + inh attrs+  | DefaultChild DefaultSyn+      +gathDeps = if @loc.lhsHasAttr+                  then addDep @loc.stmtSource (ReasonAttrReq lhsIdent @name)+                         [Map.findWithDefault (trace "ImplStmt.Default.lhsinh" unknDepItem) (True,lhsIdent,@name) @lhs.distAttrSource]+                  else id+      +gathDeps = Seq.fromList [ Dep @loc.stmtSource (ReasonAttrReq c a)+                                   [Map.findWithDefault (trace "ImplStmt.Default.childsyn" unknDepItem) (False,c,a) @lhs.distAttrSource]+                               | (c,a) <- @loc.childAttrs ] Seq.><+      -- +errs2 = debugMsg ("dependencies: " ++ show @loc.stmtSource ++ ", attr: " ++ show @name ++ ", children: " ++ show @loc.children) Seq.><++ATTR AllFinal [ distRanks : {Map DepItem (Bool,Int)} | | ]++SEM Program | Program+  loc.unqDeps    = Map.fromListWith (\(r1,as) (r2,bs) -> (mostDescriptiveReason r1 r2,nub (as ++ bs)))+                     [ (from, (reason,tos)) | (Dep from reason tos) <- toList @blocks.gathDeps ]+                   `Map.union`+                     (Map.fromList [ (i, (ReasonSink,[])) | i <- @loc.unqItems ])+  loc.unqItems   = Set.toList $ Set.fromList $ concatMap (\(Dep from _ tos) -> from : tos) $ toList @blocks.gathDeps+  loc.components = analyze (toList @blocks.gathSemStarts) (toList @blocks.gathVisitStarts) (toList @blocks.gathVisitEnds) @blocks.gathAvoidVisits $+                     map (\(from,(reason,tos)) -> (reason,from,tos)) $ Map.assocs @unqDeps+  loc.distRanks  = let merge rank (AcyclicSCC d) = [(d,(False,rank))]+                       merge rank (CyclicSCC ps) = zip ps (repeat (True,rank))+                       mp = Map.fromList $ concat $ zipWith merge [1..] @loc.components+                   in  mp+  +  loc.cyclicComps = let isCyclicSCC (CyclicSCC _)    = True+                        isCyclicSCC _                = False+                        fromCyclicSCC (CyclicSCC xs) = xs+                    in [ fromCyclicSCC c | c <- @loc.components, isCyclicSCC c ]+  loc.cyclicItems = Set.fromList $ concat @loc.cyclicComps+  loc.cyclicErrComps = let isLegalComp items+                             = length vis <= 1 && all isLegal items && any isInvoke items+                             where vis   = nub [ Map.findWithDefault item item @blocks.gathItemVisits | item <- items ]+                           +                           isLegal (DepClause _)   = True+                           isLegal (DepVisStart _) = True+                           isLegal (DepVisEnd _)   = True+                           isLegal item            = Set.member item @blocks.gathLegalCycStmts+                           +                           isInvoke (DepInvoke _)  = True+                           isInvoke _              = False+                       in filter (not . isLegalComp) @loc.cyclicComps++  +errs4 = Seq.fromList (map (Err_Cyclic @lhs.pos @blocks.gathStmtPosMap) @loc.cyclicErrComps) Seq.><++{+mostDescriptiveReason r1 r2+  = case r2 of+      ReasonAttrReq _ _  -> r2+      _                  -> r1++instance Show a => Show (SCC a) where+  show (CyclicSCC xs) = unwords (map show xs)+  show (AcyclicSCC x) = show x+}++ATTR Stmt ImplStmt [ | | rank : Int ]+ATTR Pats Pat [ isCyclic : Bool | | ]++SEM Stmt | *+  (loc.isOnCycle, loc.rank) = Map.findWithDefault (False,@loc.lexOrder) @loc.stmtSource @lhs.distRanks+  loc.isCyclic              = @loc.fullCyclic || @loc.isOnCycle++SEM ImplStmt | *+  (loc.isOnCycle, loc.rank) = Map.findWithDefault (False,@loc.lexOrder) @loc.stmtSource @lhs.distRanks+  loc.isCyclic              = @loc.fullCyclic || @loc.isOnCycle++SEM SemVisit | Visit Internal+  (loc.isOnCycle, loc.rank) = Map.findWithDefault (False,@loc.lexOrder) @loc.scopeDep @lhs.distRanks+  loc.isCyclic              = @loc.fullCyclic || @loc.isOnCycle++SEM Clause | Clause+  (loc.isOnCycle, loc.rank) = Map.findWithDefault (False,@loc.lexOrder) @loc.scopeDep @lhs.distRanks+  loc.isCyclic              = @lhs.fullCyclic || @loc.isOnCycle++-- Max rank of clauses+ATTR AllVisitClauses [ | | minRank USE {`min`} {maxBound} : Int ]++SEM Clause | Clause            lhs.minRank = @loc.rank+SEM SemVisit | Visit Internal  lhs.minRank = @loc.rank++--+-- Pretty-print of the AST+--++{+instance PP Ident where+  pp = text . identName+}++ATTR Block Itf ItfVisit Attr Data Type AliasType Con Field FieldType DataSem MaybeBoundCode BoundCode Code Item+     SemVisit VisitAttr Clause Stmt ImplStmt Mode Bind Pat ExprField+  [ | | pp : {PP_Doc} ]++SEM Program+  | Program      loc.ppId = vlist @blocks.pps++SEM Block+  | Section      lhs.pp = "{" >-< @code.pp >-< "}"+  | Itf          lhs.pp = @itf.pp+  | Data         lhs.pp = @data.pp+  | Type         lhs.pp = @type.pp+  | Item         lhs.pp = @name >#< "=" >-< indent 2 @item.pp+  | DataSem      lhs.pp = @sem.pp++SEM Itf+  | Itf          lhs.pp = "itf" >#< @name+                          >-< indent 2 (vlist @visits.pps)++SEM ItfVisit+  | Visit        lhs.pp = "visit" >#< @name >#< (if @cyclic then text "cyclic" else empty)+                          >-< indent 2 (vlist @attrs.pps)   ++SEM Attr+  | Inh          lhs.pp = "inh" >#< @name >#< "::" >#< @type+  | Syn          lhs.pp = "syn" >#< @name >#< "::" >#< @type++SEM Data | Data+  lhs.pp = "data" >#< @name >-< indent 2 ( vlist @cons.pps )++SEM Con | Con+  lhs.pp = "con" >#< @name >-< indent 2 (vlist @fields.pps)++SEM Field | Field+  lhs.pp = @name >#< @type.pp++SEM FieldType+  | Term     lhs.pp = "::" >#< @type+  | Nonterm  lhs.pp = ":" >#< show @name++SEM Type | Alias+  lhs.pp = "type" >#< show @name >#< ":" >#< @type.pp++SEM AliasType+  | Prod   lhs.pp = pp_block "(" ")" "," (map (text . show) @fields)+  | List   lhs.pp = pp_brackets (text $ show @type)+  | Maybe  lhs.pp = "Maybe" >#< show @type++SEM DataSem | Sem+  lhs.pp = "datasem" >#< show @tp >-< indent 2 @clauses.pp++SEM BoundCode+  | Code         lhs.pp = @bind.pp >#< @code.pp++SEM MaybeBoundCode+  | Nothing      lhs.pp = empty++SEM Code+  | Code         lhs.pp = vlist @items.pps++SEM Item+  | Plain        loc.pp = vlist (modifySpacing @loc.diff @lhs.indent @txt)+  | Attr         lhs.pp = addSpaces @loc.diff (@child >|< "." >|< @name)+  | Sem          lhs.pp = addSpaces @loc.diff ("sem" >#< @name >#< ":" >#< @tp+                                              >-< indent 2 @first.pp)+  | CoSem        lhs.pp = addSpaces @loc.diff ("cosem" >#< @name >#< ":" >#< @tp >#< @visit+                                              >-< indent 2 @first.pp)+  | Detach       lhs.pp = addSpaces @loc.diff ("detach" >#< @name >#< "of" >#< @visit)+  | Brackets     lhs.pp = addSpaces @loc.diff (text "{")+                          >-< vlist @items.pps+                          >-< addSpaces @loc.diff2 (text "}")+  | Construct    lhs.pp = addSpaces @loc.diff (show @data >|< "." >|< show @con >#< pp_block "{" "}" "," @fields.pps)++ATTR Code Items Item ExprFields ExprField DataSem SemVisit Stmts ClausesTop Clauses Clause Stmt+  [ indent : Int | | ]++SEM Block | Section   code.indent    = 1+          | Item      item.indent    = 1+          | DataSem   sem.indent     = 1+SEM BoundCode | Code  code.indent = column @pos + @bind.width++SEM Item+  | *            loc.diff  = column @pos - @lhs.indent+  | Brackets     loc.diff2 = column @posEnd - @lhs.indent++{+modifySpacing :: Int -> Int -> String -> [String]+modifySpacing n m s+  = take (length ls) (r : rs)+  where+    ls = lines s+    (f : fs) = ls ++ [""]+    r  = shift n f+    rs = map (drop (m-1)) fs+    +shift :: Int -> String -> String+shift n+  | n <= 0 = drop n+  | n > 0  = (replicate n ' ' ++)++addSpaces :: Int -> PP_Doc -> PP_Doc+addSpaces n d = text (replicate n ' ') >|< d+}++SEM SemVisit+  | Visit        lhs.pp = "visit" >#< @name+                          >-< indent 2 (   vlist @attrs.pps+                                       >-< vlist @stmts.pps+                                       >-< vlist @impls.pps+                                       >-< vlist @clauses.pps+                                       )+  | Internal     lhs.pp = "internal" >#< @name+                          >-< indent 2 (   vlist @stmts.pps+                                       >-< vlist @clauses.pps+                                       )+  | End          lhs.pp = empty++SEM VisitAttr+  | Chn          lhs.pp = "chn" >#< @name >#< "::" >#< @type++SEM Clause+  | Clause       lhs.pp = "clause" >#< @name+                          >-< indent 2 (   vlist @stmts.pps+                                       >-< vlist @impls.pps+                                       >-< vlist @deflts.pps+                                       >-< @next.pp+                                       )++SEM Stmt+  | Eval         lhs.pp = @mode.pp >|< @pat.pp >#< @code.pp+  | Attach       lhs.pp = "attach" >#< @loc.visit >#< "of" >#< @name >#< ":" >#< @type >#< @code.pp+  | Invoke       lhs.pp = vlist @deflts.pps+                          >-< "invoke" >#< @visit >#< "of" >#< @name >#< @code.pp+  | Default      lhs.pp = "default" >#< @name >#< "..."+  | Rename       lhs.pp = empty++SEM ImplStmt+  | Invoke       lhs.pp = vlist @deflts.pps+                          >-< "invoke" >#< show @visit >#< "of" >#< show @child >#< "-- implicit"+  | DefaultChild lhs.pp = "default" >#< show @child >|< "." >|< show @name >#< pp_block "(" ")" "," (reverse @loc.ppInps)+  | DefaultSyn   lhs.pp = "default lhs." >|< show @name >#< pp_block "(" ")" "," (reverse @loc.ppInps)+  | DefaultVisLocal+                 lhs.pp = "default local." >|< show @name+  +  | DefaultChild DefaultSyn+      loc.ppInps = (if @loc.lhsHasAttr then [text "lhs"] else []) ++ map (\(c,_,_) -> text $ show c) @loc.children++SEM Mode+  | Match        lhs.pp = text "match "+  | Assert       lhs.pp = empty++SEM Bind+  | Fun          lhs.pp = text "="+  | Monadic      lhs.pp = text "<-"++ATTR Bind [ | | width : Int ]+SEM Bind+  | Fun          lhs.width = 1+  | Monadic      lhs.width = 2++SEM Pat+  | Con          loc.needPar = needParens PrioCon @lhs.prio @lhs.isRight+  | Cons         loc.needPar = needParens PrioCons @lhs.prio @lhs.isRight++SEM Pat+  | Con          lhs.pp = addParens @loc.needPar (@name >#< hlist_sp @pats.pps)+  | AttrCon      lhs.pp = show @dt >|< "." >|< show @con >|< "@" >|< @name+  | Attr         lhs.pp = @child >|< "." >|< @name+  | Tup          lhs.pp = pp_block "(" ")" "," @pats.pps+  | List         lhs.pp = pp_block "[" "]" "," @pats.pps+  | Cons         lhs.pp = addParens @loc.needPar (@hd.pp >#< ":" >#< @tl.pp)+  | Underscore   lhs.pp = text "_"++ATTR Pat Pats [ prio : Prio | | ]+ATTR Pat [ isRight : Bool | | ]++SEM Stmt | Eval    pat.prio    = PrioTop+                   pat.isRight = False++SEM Pat+  | Con   pats.prio = PrioCon+  | Tup   pats.prio = PrioTop+  | List  pats.prio = PrioTop+  | Cons  hd.prio   = PrioCons+          tl.prio   = PrioCons++SEM Pats | Cons  hd.isRight = False++SEM Pat+  | Cons  hd.isRight = False+          tl.isRight = True++{+data Prio+  = PrioTop | PrioCons | PrioCon+  deriving (Eq, Ord)++needParens :: Prio -> Prio -> Bool -> Bool+needParens myPrio lhsPrio isRight = myPrio <= lhsPrio && (myPrio /= lhsPrio || isRight)++addParens :: Bool -> PP_Doc -> PP_Doc+addParens True  = pp_parens+addParens False = id+}++SEM ExprField | Field+  lhs.pp = @name >-< indent 2 ("=" >#< pp_parens @code.pp)++ATTR BlocksTop Blocks ItfVisits Attrs Items VisitAttrs ClausesTop Clauses Stmts ImplStmts Pats Cons Fields ExprFields+  [ | | pps : {[PP_Doc]} ]++SEM BlocksTop+  | Top   lhs.pps = @blocks.pps ++ @extra.pps+  | None  lhs.pps = []++SEM Blocks+  | Cons  lhs.pps = @hd.pp : @tl.pps+  | Nil   lhs.pps = []++SEM ItfVisits+  | Cons  lhs.pps = @hd.pp : @tl.pps+  | Nil   lhs.pps = []++SEM Attrs+  | Cons  lhs.pps = @hd.pp : @tl.pps+  | Nil   lhs.pps = []++SEM Cons+  | Cons  lhs.pps = @hd.pp : @tl.pps+  | Nil   lhs.pps = []++SEM Fields+  | Cons  lhs.pps = @hd.pp : @tl.pps+  | Nil   lhs.pps = []++SEM Items+  | Cons  lhs.pps = @hd.pp : @tl.pps+  | Nil   lhs.pps = []++SEM VisitAttrs+  | Cons  lhs.pps = @hd.pp : @tl.pps+  | Nil   lhs.pps = []++SEM Clauses+  | Cons  lhs.pps = @hd.pp : @tl.pps+  | Nil   lhs.pps = []++SEM Stmts+  | Cons  lhs.pps = @hd.pp : @tl.pps+  | Nil   lhs.pps = []++SEM ImplStmts+  | Cons  lhs.pps = @hd.pp : @tl.pps+  | Nil   lhs.pps = []++SEM Pats+  | Cons  lhs.pps = @hd.pp : @tl.pps+  | Nil   lhs.pps = []++SEM ExprFields+  | Cons  lhs.pps = @hd.pp : @tl.pps+  | Nil   lhs.pps = []
+ uuagc_options view
@@ -0,0 +1,8 @@+file: "src/Ast.ag"
+options: data, rename, strictdata
+
+file: "src/Transform.ag"
+options: catas, rename, semfuns, signatures, pretty, strictwrap
+
+file: "src/Errs.ag"
+options: data, rename, catas, semfuns, signatures, optimize, strictdata, strictwrap