language-c 0.3.2.1 → 0.10.2
raw patch · 48 files changed
Files
- AUTHORS +1/−0
- ChangeLog +0/−53
- ChangeLog.md +210/−0
- README +0/−34
- README.md +46/−0
- Setup.hs +0/−5
- dist/build/Language/C/Parser/Lexer.hs +0/−522
- dist/build/Language/C/Parser/Parser.hs +0/−6337
- language-c.cabal +116/−88
- src/Language/C.hs +2/−2
- src/Language/C/Analysis.hs +0/−1
- src/Language/C/Analysis/AstAnalysis.hs +644/−110
- src/Language/C/Analysis/AstAnalysis.hs-boot +13/−0
- src/Language/C/Analysis/Builtins.hs +226/−0
- src/Language/C/Analysis/ConstEval.hs +237/−0
- src/Language/C/Analysis/Debug.hs +43/−13
- src/Language/C/Analysis/DeclAnalysis.hs +206/−116
- src/Language/C/Analysis/DefTable.hs +45/−20
- src/Language/C/Analysis/Export.hs +119/−38
- src/Language/C/Analysis/MachineDescs.hs +119/−0
- src/Language/C/Analysis/NameSpaceMap.hs +21/−6
- src/Language/C/Analysis/SemError.hs +16/−6
- src/Language/C/Analysis/SemRep.hs +208/−179
- src/Language/C/Analysis/TravMonad.hs +222/−123
- src/Language/C/Analysis/TypeCheck.hs +443/−0
- src/Language/C/Analysis/TypeConversions.hs +39/−0
- src/Language/C/Analysis/TypeUtils.hs +343/−0
- src/Language/C/Data.hs +6/−5
- src/Language/C/Data/Error.hs +14/−13
- src/Language/C/Data/Ident.hs +23/−18
- src/Language/C/Data/InputStream.hs +34/−15
- src/Language/C/Data/Name.hs +7/−4
- src/Language/C/Data/Node.hs +74/−26
- src/Language/C/Data/Position.hs +72/−62
- src/Language/C/Data/RList.hs +1/−1
- src/Language/C/Parser/Builtin.hs +3/−1
- src/Language/C/Parser/Lexer.x +337/−179
- src/Language/C/Parser/Parser.y +420/−270
- src/Language/C/Parser/ParserMonad.hs +39/−4
- src/Language/C/Parser/Tokens.hs +261/−195
- src/Language/C/Pretty.hs +117/−38
- src/Language/C/Syntax/AST.hs +1475/−737
- src/Language/C/Syntax/Constants.hs +56/−27
- src/Language/C/Syntax/Ops.hs +48/−48
- src/Language/C/Syntax/Utils.hs +76/−0
- src/Language/C/System/GCC.hs +9/−4
- src/Language/C/System/Preprocess.hs +5/−5
- test/harness/run-harness.hs +70/−0
AUTHORS view
@@ -7,6 +7,7 @@ Iavor Diatchki <iavor.diatchki@gmail.com> Kevin Charter <kcharter@gmail.com>+Aleksey Kliger This project originated from the C parser component of c2hs, for many additional contributors see AUTHORS.c2hs.
− ChangeLog
@@ -1,53 +0,0 @@-Changes 0.3.1.1 - 0.3.2 (Bug fix release)-==========================================================================- * Add UNPACK pragma for Ident- * Allow '\r' at the end of line pragmas- * Fix bug '0 is lexed as octal integer constant'- * Fix pretty-printing of if-then-else-- * API Changes (hdiff)- = Language.C.Analysis.TravMonad- + travErrors :: TravState s -> [CError]--Changes 0.3.1 - 0.3.1.1 (Bug fix release)-==========================================================================- * Fix cabal file for compilation with GHC 6.10.1 (Aaron Tomb)- * Fix bug #22: Set file permission after copying input (thanks to Kevin Charter for reporting this bug)- * Fix bug #21: typedef can have more than one declarator (thanks to bkomuves for reporting this bug)- * Fix bug #18: adjustPos (change to line of another file) should set column offset to one- * Enhancement: add 'parseCFilePre' to module Language.C- * Enhancement: Add initPos and adjustPos to Data.Position--Changes 0.3 - 0.3.1-==========================================================================-Thu Aug 21 benedikt.huber@gmail.com- * add aliases for exposed parsers, in order to document them--Fri Aug 15 benedikt.huber@gmail.com- * Remove NameMap from Data.Name. We will do this right when neccessary.- * Parser public API: expose parsers and the Parser Monad- * ParserMonad: Return updated name supply when executing parser- * Parser: Expose expression, statement, declaration and file parsers- * Data: Add newNameSupply ~ (namesStartingFrom 0)--Thu Aug 14 17:13:29 CEST 2008 iavor.diatchki@gmail.com- * Add a utility function to create a "blank" set of cpp arguments.- * Make that analysis traversal monad abstract.- * Export the type synonym "Register" (and bump version)--Wed Aug 13 12:00:57 CEST 2008 benedikt.huber@gmail.com- * add Data.Position: internalIdentAt---Old Changes-==========================================================================--Mon Jun 9 23:12:46 CEST 2008 benedikt.huber@gmail.com- * License switched to 3-clause BSD- $-- In accordance with the original authors, Language.C is now licensed as BSD-3.- See:- http://haskell.org/pipermail/c2hs/2008-June/000833.html- http://haskell.org/pipermail/c2hs/2008-June/000834.html- http://haskell.org/pipermail/c2hs/2008-June/000835.html-
+ ChangeLog.md view
@@ -0,0 +1,210 @@+# Changelog++## 0.10.2++- Accept C23 `bool` keyword.++## 0.10.1++- Support `0.0f16` syntax.++## 0.10.0++- Support for half-precision floating point `__fp16`, `_Float16`, and `_Float16x`.+- Support for bfloat16 `__bf16`.+- Support alignment specifier `_Alignas` in struct declatations.++## 0.9.4++- Support `happy-2.1`.++## 0.9.3++- Add support for `__builtin_bit_cast` to support clang toolchain,+ enabling builds with GHC 9.4+ on Windows.++## 0.9.2++- Add support for 128 bit builtin integer types++## 0.9.1++- Support parsing an empty list of clobbers after a colon in `asm` statements++## 0.9.0.2++- Correct lower bound on GHC++## 0.9.0.1++- Scrap dependency on syb++Thanks to @vmchale++## 0.9++- Make `Trav` a monad transformer+- Add `runTravTWithTravState`+- Tests now use Cabal-3+- Implement alignment calculation and correct size calculation+- Add `Show` instance for `Type`+- Add machine descriptions for x86_64 and armv7l+- Small correction in output of prettyprinter+- Allow zeros as line numbers in preprocessed directives++Thanks to @aweinstock314, @ersran9, @expipiplus1, @jkoppel, @trofi and @visq++## Changes since 0.7.0++Wed May 23 07:08:02 2018 +0200+ * Support IEC 60559 types and literals. Closes #52.++Wed May 16 07:08:15 2018 +0200+ * introduce flag for optional IEC 60559 type support (see #43)++Wed May 16 06:36:04 2018 +0200+ * WIP: towards a complete Export (#51)++Thu Feb 22 13:22:50 2018 -0500+ * [syntax] GHC.Generics.Generic and Control.DeepSeq.NFData instances (#49)+ (.cabal) drop splitBase flag++Tue Feb 20 08:34:39 2018 +0300+ * Selectively hide Prelude.<>: GHC 8.4 compat (#45)++Tue Feb 20 00:09:16 2018 -0500+ * (Analysis) Minimal support for `__float128` (#47)++Sat Nov 25 08:59:59 2017 +0100+ * Consider builtin_convertvector from #34 for pretty printing++Sat Nov 25 00:46:33 2017 -0600+ * add support for `_Float128` (#41)++## Changes since 0.6.0++Mon Jul 31 2017+ * Improve TypeCheck output (#31)++Sun Jul 30 2017+ * Add `__float128` (fixes #33)++Mon Maz 22 2017+ * Support clang’s `__builtin_convertvector` (Fixes #34)++Wed Mar 8 2017+ * Move file and parent information to new datatype FilePosition for performance reasons++## Changes since 0.5.0++Thu Feb 23 2017+ * Make gccParseCPPArgs grab the arg to -MF -MT and -MQ++Wed Feb 15 2017+ * In enums, allow multiple attribute specifiers per enumerator++Tue Feb 21 2017+ * Allow typedef redefinition if it denotes the same type++Tue Feb 21 2017+ * Change TypeDefRef to store Type, not Maybe Type++Tue Feb 14 2017+ * Parse (and ignore) Clang __attribute__((availability(id=major.minor.rev)))++Sun Sep 11 2016+ * Add `__builtin_bswap32/64`.++Wed Jun 22 2016+ * Add `_Alignof` to Lexer.x (fixes #7)++Mon Jun 27 2016+ * Updates for C11 (part 1)+ * `_Nullable` and `_Nonnull` support as well as Warnings/lint fixes provided by Anthony Cowley (https://github.com/acowley)++Wed Mar 16 2016+ * Consider storage specifier "ThreadSpec" for global and local declarations++Tue Mar 15 2016+ * Support C11 `_NoReturn`, genearlize is_inline to FunSpecs (Syntax) / FunAttrs (SemRep)++## Changes since 0.4.3++Wed Mar 2 2016+ * Add direct base type BaseInt128 (complements previous `__int128` patch)+ ryan.gl.scott@gmail.com++Sun Feb 28 2016+ * Parse gcc-specific `__int128` type++Thu Dec 4 2014+ * Scott Kovach <dskovach@gmail.com>: added derived Eq,Ord instances to NodeInfo++## Changes since 0.4.2++Sat Jan 11 2014+ * Allow unicode characters in string/char literals and filenames++Mon Oct 27 2014+ * macos-attributes++Tue Aug 13 2013+ * Do not derive Error instances for newtypes (type parameter has non-parametric role)++Mon Aug 12 2013+ * Fix bug caused by applying posFile to nopos (reported by Mikhail Sosonkin)++## Changes since 0.4.1++Tue Mar 19 2013+ * TypeCheck: Return Left str instead of fail str (do not rely on MonadError instance of Either)+ * Improve printing of SUERefs and Ident++Thu Feb 28 2013+ * Fix parsing and printing of octal character escapes.++Tue Jun 12 2012+ * Export Annotated type class from AST module++Wed Aug 24 2012+ * Patch for alex-3.0++## Changes 0.3.1 - 0.4.1++Tue Aug 16 2011:+ * Port to ghc-7.2++Fri Apr 15 2011: Alexander Bernauer <bernauer@inf.ethz.ch>+ * Show instances (popular request) for AST types, DumpAst demo++## Changes 0.3 - 0.3.1++Thu Aug 21 benedikt.huber@gmail.com+ * add aliases for exposed parsers, in order to document them++Fri Aug 15 benedikt.huber@gmail.com+ * Remove NameMap from Data.Name. We will do this right when neccessary.+ * Parser public API: expose parsers and the Parser Monad+ * ParserMonad: Return updated name supply when executing parser+ * Parser: Expose expression, statement, declaration and file parsers+ * Data: Add newNameSupply ~ (namesStartingFrom 0)++Thu Aug 14 17:13:29 CEST 2008 iavor.diatchki@gmail.com+ * Add a utility function to create a "blank" set of cpp arguments.+ * Make that analysis traversal monad abstract.+ * Export the type synonym "Register" (and bump version)++Wed Aug 13 12:00:57 CEST 2008 benedikt.huber@gmail.com+ * add Data.Position: internalIdentAt++## Old Changes++Mon Jun 9 23:12:46 CEST 2008 benedikt.huber@gmail.com+ * License switched to 3-clause BSD+ $+- In accordance with the original authors, Language.C is now licensed as BSD-3.+ See:+ http://haskell.org/pipermail/c2hs/2008-June/000833.html+ http://haskell.org/pipermail/c2hs/2008-June/000834.html+ http://haskell.org/pipermail/c2hs/2008-June/000835.html+
− README
@@ -1,34 +0,0 @@-= Language.C =--Language.C is a parser and pretty-printer framework for C99 and the extensions of gcc.--See http://www.sivity.net/projects/language.c/--== Build and Install ==--cabal install---- or ----runhaskell Setup configure FLAGS-runhaskell Setup build-runhaskell Setup install--Provide the set of flags passing- --flags="<flags-seperated-by-space>"-to configure.--== Sources ==--see src/README--== Examples ==--A couple of small examples are available in /examples--== Testing ==--A couple of regression tests can be run via-> cd test/harness; make--For more tests, see test/README.
+ README.md view
@@ -0,0 +1,46 @@+# Language.C++Language.C is a parser and pretty-printer framework for C11 and the extensions of gcc.++See http://visq.github.io/language-c/++## C Language Compatibility++language-c has no comprehensive C23 support yet, but supports+ - the `bool` keyword++Currently unsupported C11 constructs:+ - static assertion 6.7.10 (`_Static_assert`)+ - generic selection 6.5.1.1 (`_Generic`)+ - `_Atomic`, `_Thread_local`+ - Universal character names++Currently unsupported GNU C extensions:+ - `__auto_type`+ - `__builtin_offsetof`+ `char a[__builtin_offsetof (struct S, sa->f)`+ - `_Decimal32`+ - Extended assembler+ `__asm__ __volatile__ ("" : : : )`;+ `__asm__ goto ("" : : : : label)`;+ - `__attribute__((packed))`: types featuring this attribute may have an+ incorrect size or alignment calculated.++### IEC 60559:++Since `language-c-0.8`, extended floating point types are supported (gcc 7 feature). Package maintainers may decide to disable these types (flag `iecFpExtension`) to work around the fact that the `_Float128` type is redefined by glibc >= 2.26 if gcc < 7 is used for preprocessing:++```+ /* The type _Float128 exists only since GCC 7.0. */+ # if !__GNUC_PREREQ (7, 0) || defined __cplusplus+ typedef __float128 _Float128;+ # endif+```++## Examples++A couple of small examples are available in `examples`.++## Testing++See `test/README`.
− Setup.hs
@@ -1,5 +0,0 @@-#!/usr/bin/env runhaskell--import Distribution.Simple--main = defaultMain
− dist/build/Language/C/Parser/Lexer.hs
@@ -1,522 +0,0 @@-{-# OPTIONS -fglasgow-exts -cpp #-}-{-# LINE 49 "src/Language/C/Parser/Lexer.x" #-}---module Language.C.Parser.Lexer (lexC, parseError) where--import Data.Char (isDigit)-import Control.Monad (liftM)--import Language.C.Data.InputStream-import Language.C.Data.Position (Position(..),posOf)-import Language.C.Data.Ident (mkIdent)--import Language.C.Syntax.Constants--import Language.C.Parser.Tokens-import Language.C.Parser.ParserMonad--#if __GLASGOW_HASKELL__ >= 603-#include "ghcconfig.h"-#elif defined(__GLASGOW_HASKELL__)-#include "config.h"-#endif-#if __GLASGOW_HASKELL__ >= 503-import Data.Array-import Data.Char (ord)-import Data.Array.Base (unsafeAt)-#else-import Array-import Char (ord)-#endif-#if __GLASGOW_HASKELL__ >= 503-import GHC.Exts-#else-import GlaExts-#endif-alex_base :: AlexAddr-alex_base = AlexA# "\xf8\xff\xff\xff\x6e\x00\x00\x00\x73\x00\x00\x00\x00\x00\x00\x00\xfc\xff\xff\xff\x78\x00\x00\x00\x82\x00\x00\x00\xb3\x00\x00\x00\xbd\x00\x00\x00\xee\x00\x00\x00\xf7\x00\x00\x00\x11\x01\x00\x00\x2b\x01\x00\x00\x45\x01\x00\x00\x5f\x01\x00\x00\x79\x01\x00\x00\x69\x01\x00\x00\x83\x01\x00\x00\xd4\x01\x00\x00\x34\x02\x00\x00\x94\x02\x00\x00\xf4\x02\x00\x00\x54\x03\x00\x00\xb4\x03\x00\x00\x12\x04\x00\x00\x5b\x04\x00\x00\x00\x00\x00\x00\xfd\xff\xff\xff\xfe\xff\xff\xff\xa8\xff\xff\xff\x9d\xff\xff\xff\xa4\xff\xff\xff\xab\xff\xff\xff\x9b\xff\xff\xff\x00\x00\x00\x00\x04\x00\x00\x00\x05\x00\x00\x00\x9c\xff\xff\xff\xa3\xff\xff\xff\xad\xff\xff\xff\xaf\xff\xff\xff\x81\x04\x00\x00\xda\x04\x00\x00\x31\x05\x00\x00\x00\x00\x00\x00\x7e\x05\x00\x00\xa9\x05\x00\x00\x71\x01\x00\x00\x75\x01\x00\x00\x7b\x01\x00\x00\xe9\x03\x00\x00\x01\x04\x00\x00\x10\x04\x00\x00\x83\x05\x00\x00\x8d\x00\x00\x00\xec\xff\xff\xff\xa9\xff\xff\xff\xc8\xff\xff\xff\x31\x00\x00\x00\x49\x00\x00\x00\x2e\x00\x00\x00\x00\x00\x00\x00\xcf\x05\x00\x00\xf5\x05\x00\x00\xe7\x05\x00\x00\xeb\x05\x00\x00\xf9\x05\x00\x00\xfd\x05\x00\x00\x03\x06\x00\x00\x1c\x06\x00\x00\x24\x06\x00\x00\xc7\x00\x00\x00\x3b\x00\x00\x00\xaa\xff\xff\xff\xcb\xff\xff\xff\x6c\x00\x00\x00\x4a\x00\x00\x00\x50\x00\x00\x00\x00\x00\x00\x00\x6a\x06\x00\x00\xb0\x06\x00\x00\x3d\x06\x00\x00\x5c\x06\x00\x00\xa2\x06\x00\x00\xb5\x06\x00\x00\xba\x06\x00\x00\xd6\x06\x00\x00\xdb\x06\x00\x00\x74\x01\x00\x00\x8e\x00\x00\x00\xe8\xff\xff\xff\x38\x00\x00\x00\xa8\x00\x00\x00\xc1\x00\x00\x00\x87\x00\x00\x00\x21\x07\x00\x00\x3a\x07\x00\x00\x76\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7e\x07\x00\x00\x86\x07\x00\x00\x0b\x01\x00\x00\x9a\x07\x00\x00\xda\x07\x00\x00\x31\x01\x00\x00\x49\x01\x00\x00\x4a\x01\x00\x00\x1f\x08\x00\x00\x68\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xba\x07\x00\x00\xfb\x07\x00\x00\x2d\x04\x00\x00\x7f\x08\x00\x00\xc5\x08\x00\x00\x4e\x04\x00\x00\xae\x05\x00\x00\xbe\x05\x00\x00\xdd\x08\x00\x00\x26\x09\x00\x00\x00\x00\x00\x00\x3a\x08\x00\x00\x3d\x09\x00\x00\x6b\x09\x00\x00\x73\x09\x00\x00\xc4\x05\x00\x00\xea\x05\x00\x00\x87\x09\x00\x00\xc7\x09\x00\x00\xef\x05\x00\x00\x0f\x06\x00\x00\xa7\x09\x00\x00\xe7\x09\x00\x00\x25\x06\x00\x00\x07\x0a\x00\x00\x1f\x0a\x00\x00\x3e\x0a\x00\x00\x87\x0a\x00\x00\x9e\x0a\x00\x00\xd5\x0a\x00\x00\x1e\x0b\x00\x00\x00\x00\x00\x00\xec\x0a\x00\x00\x35\x0b\x00\x00\x63\x0b\x00\x00\x6b\x0b\x00\x00\x6d\x06\x00\x00\x7d\x06\x00\x00\x7f\x0b\x00\x00\xbf\x0b\x00\x00\xab\x06\x00\x00\xb1\x06\x00\x00\x9f\x0b\x00\x00\xdf\x0b\x00\x00\xe2\x06\x00\x00\xff\x0b\x00\x00\x17\x0c\x00\x00\x36\x0c\x00\x00\x7f\x0c\x00\x00\x96\x0c\x00\x00\xcd\x0c\x00\x00\x16\x0d\x00\x00\x00\x00\x00\x00\x38\x0d\x00\x00\x5a\x0d\x00\x00\xea\x0c\x00\x00\x7b\x0d\x00\x00\x1f\x00\x00\x00\x82\x01\x00\x00\x03\x07\x00\x00\x9a\x0d\x00\x00\xbb\x0d\x00\x00\x26\x05\x00\x00\xd0\x0d\x00\x00\xf4\x0a\x00\x00\x00\x00\x00\x00\xda\x0d\x00\x00\x27\x00\x00\x00\x17\x04\x00\x00\xe6\x0d\x00\x00\x27\x0e\x00\x00\x4d\x0e\x00\x00\x69\x0e\x00\x00\x2d\x0d\x00\x00\x00\x00\x00\x00\xf1\x06\x00\x00\x39\x07\x00\x00\x5f\x04\x00\x00\x8b\x0e\x00\x00\xaa\x0e\x00\x00\xc0\x0e\x00\x00\xc8\x0e\x00\x00\xb0\x05\x00\x00\x6a\x07\x00\x00\xf6\x0e\x00\x00\x3b\x0f\x00\x00\x9c\x07\x00\x00\x53\x0f\x00\x00\x9c\x0f\x00\x00\xdc\x0e\x00\x00\xe5\x0f\x00\x00\x00\x00\x00\x00\x9e\x07\x00\x00\x81\x08\x00\x00\x6c\x07\x00\x00\xb3\x0f\x00\x00\xfe\x0f\x00\x00\x2c\x10\x00\x00\x34\x10\x00\x00\x8a\x07\x00\x00\x98\x08\x00\x00\x62\x10\x00\x00\xa7\x10\x00\x00\xc7\x08\x00\x00\xbf\x10\x00\x00\x08\x11\x00\x00\x48\x10\x00\x00\x51\x11\x00\x00\x00\x00\x00\x00\x63\x00\x00\x00\x66\x00\x00\x00\x68\x11\x00\x00\x8e\x11\x00\x00\xa5\x11\x00\x00\xcb\x11\x00\x00\xe2\x11\x00\x00\x08\x12\x00\x00\x1f\x12\x00\x00\x45\x12\x00\x00\x5c\x12\x00\x00\x82\x12\x00\x00\x99\x12\x00\x00\xbf\x12\x00\x00\x00\x00\x00\x00\x6b\x00\x00\x00\xc9\x08\x00\x00\xf8\x08\x00\x00\x22\x09\x00\x00\x89\x09\x00\x00\x1f\x11\x00\x00\x04\x13\x00\x00\x8b\x09\x00\x00\x0c\x13\x00\x00\x38\x0a\x00\x00\x3a\x0a\x00\x00\xcb\x07\x00\x00\x23\x13\x00\x00\x51\x13\x00\x00\xcc\x07\x00\x00\x59\x13\x00\x00\x71\x13\x00\x00\xba\x13\x00\x00\xd1\x13\x00\x00\xf7\x13\x00\x00\x0e\x14\x00\x00\x34\x14\x00\x00\x4b\x14\x00\x00\x71\x14\x00\x00\x88\x14\x00\x00\xae\x14\x00\x00\xc5\x14\x00\x00\xeb\x14\x00\x00\x02\x15\x00\x00\x28\x15\x00\x00\x50\x15\x00\x00\x99\x15\x00\x00\xb0\x15\x00\x00\xd6\x15\x00\x00\xed\x15\x00\x00\x13\x16\x00\x00\x2a\x16\x00\x00\x50\x16\x00\x00\x67\x16\x00\x00\x8d\x16\x00\x00\xa4\x16\x00\x00\xca\x16\x00\x00\xe1\x16\x00\x00\x07\x17\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x13\x01\x00\x00\x57\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x5a\x00\x00\x00\x5c\x00\x00\x00\x5e\x00\x00\x00\x9e\x00\x00\x00\x5f\x00\x00\x00\x64\x00\x00\x00\x86\x00\x00\x00\x8b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8f\x00\x00\x00\x00\x00\x00\x00\x90\x00\x00\x00\x93\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9d\x00\x00\x00"#--alex_table :: AlexAddr-alex_table = AlexA# "\x00\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x03\x00\x1a\x00\x1a\x00\x1b\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x22\x00\x22\x00\x23\x00\x25\x00\x26\x00\x27\x00\x2c\x00\x2c\x00\x3d\x00\x3d\x00\x02\x00\x20\x01\xbe\x00\x10\x00\x29\x00\x27\x01\x28\x01\x6c\x00\x1a\x01\x1b\x01\x25\x01\x23\x01\x42\x01\x1f\x01\xad\x00\x26\x01\x2d\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x37\x01\x43\x01\x2a\x01\x30\x01\x2c\x01\x36\x01\x39\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x1c\x01\x4e\x00\x1d\x01\x32\x01\x29\x00\x38\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x44\x01\x33\x01\x45\x01\x21\x01\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x09\x00\x03\x00\x2c\x00\x4e\x00\x04\x00\x2c\x00\x4a\x00\xa6\x00\xa6\x00\xde\x00\x09\x00\x03\x00\xde\x00\x02\x00\x04\x00\xb3\x00\xb3\x00\xed\x00\x02\x00\x31\x01\x3c\x00\x4d\x00\x3a\x01\x09\x00\x3b\x01\x12\x00\x3c\x01\x40\x01\x3c\x00\x2c\x00\x3d\x00\x29\x01\x2d\x01\x09\x00\x2c\x00\x12\x00\x3d\x00\x2c\x00\x49\x00\x06\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x06\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x0a\x00\x03\x00\x2c\x00\x3d\x00\x04\x00\x3d\x00\x22\x01\x41\x01\x34\x01\x3d\x00\x0a\x00\x03\x00\x2e\x01\x2b\x01\x04\x00\x46\x01\x2f\x01\x3e\x01\x00\x00\x00\x00\x3f\x01\x00\x00\x00\x00\x0a\x00\x38\x01\x12\x00\x00\x00\x00\x00\x4d\x00\x3b\x00\x5b\x00\x3d\x01\x4e\x00\x0a\x00\x00\x00\x12\x00\x00\x00\x3d\x00\x37\x00\x08\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x08\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x09\x00\x03\x00\x3a\x00\x5a\x00\x04\x00\x4e\x00\x4e\x00\x00\x00\x00\x00\x0a\x00\x03\x00\x37\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5e\x00\x09\x00\x35\x01\x12\x00\x00\x00\x00\x00\x4c\x00\x5e\x00\xff\xff\x4e\x00\x0a\x00\xff\xff\x12\x00\x0c\x00\x03\x00\x48\x00\x4e\x00\x04\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0c\x00\x63\x00\x4b\x00\x0c\x00\x03\x00\x4e\x00\x00\x00\x04\x00\x00\x00\x00\x00\xff\xff\x48\x00\x00\x00\xff\xff\x00\x00\x24\x01\x00\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0c\x00\x00\x00\x00\x00\x0f\x00\x03\x00\x39\x01\x1e\x01\x04\x00\xff\xff\xff\xff\x00\x00\xff\xff\xff\xff\x62\x00\x00\x00\x00\x00\x00\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0f\x00\x00\x00\x8c\x00\x0f\x00\x03\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x64\x00\xff\xff\x11\x00\x00\x00\x00\x00\x0e\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0f\x00\x00\x00\x00\x00\x0f\x00\x03\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x11\x00\x00\x00\x00\x00\x11\x00\x8b\x00\x00\x00\x0e\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0f\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x11\x00\x00\x00\x8b\x00\x6d\x00\x00\x00\x00\x00\x00\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x00\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x31\x00\x00\x00\x00\x00\x5d\x00\x61\x00\x61\x00\x00\x00\x00\x00\x00\x00\x61\x00\x35\x00\xa6\x00\x59\x00\x61\x00\x61\x00\x00\x00\x00\x00\xa6\x00\x00\x00\x61\x00\x00\x00\x28\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x21\x00\x2c\x00\x2c\x00\x00\x00\x30\x00\x2c\x00\x2c\x00\x5c\x00\x35\x00\x61\x00\x00\x00\x2c\x00\x2c\x00\x61\x00\x61\x00\xa6\x00\x59\x00\x61\x00\x61\x00\x28\x00\x00\x00\xa6\x00\x00\x00\x61\x00\x00\x00\x00\x00\x21\x00\x13\x00\x13\x00\x0b\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x18\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x0b\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x18\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x0b\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x15\x00\x15\x00\x15\x00\x15\x00\x15\x00\x15\x00\x15\x00\x15\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x18\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x0b\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x18\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x0b\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x18\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x0b\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x18\x00\x13\x00\x13\x00\x13\x00\x13\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x61\x00\x00\x00\xff\xff\x00\x00\x13\x00\xff\xff\x00\x00\x00\x00\x00\x00\x35\x00\x00\x00\x00\x00\x00\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x00\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x00\x00\x13\x00\x2c\x00\x2c\x00\x70\x00\x34\x00\x35\x00\x13\x00\xff\xff\x00\x00\x00\x00\xff\xff\x61\x00\xb3\x00\x35\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb3\x00\x00\x00\x35\x00\x00\x00\x00\x00\x00\x00\xff\xff\x2c\x00\x2c\x00\xff\xff\x61\x00\x13\x00\x00\x00\x00\x00\x00\x00\x00\x00\x13\x00\x13\x00\x6f\x00\x35\x00\x13\x00\x13\x00\x2c\x00\x2c\x00\x00\x00\x61\x00\xb3\x00\x00\x00\x00\x00\x13\x00\xbc\x00\x00\x00\xb3\x00\x13\x00\x35\x00\x13\x00\x00\x00\x13\x00\xa1\x00\x19\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x00\x00\x00\x00\x00\x00\x2b\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\xc9\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2b\x00\x00\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\xcf\x00\x00\x00\x2b\x00\x00\x00\x00\x00\x79\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2b\x00\x00\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\x00\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2b\x00\x00\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\xa7\x00\x00\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\xae\x00\xae\x00\xff\xff\x00\x00\xff\xff\xff\xff\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb1\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x33\x00\xff\xff\x00\x00\x00\x00\xff\xff\x61\x00\x00\x00\xff\xff\xbc\x00\x2f\x00\x00\x00\x71\x00\x5f\x00\xa7\x00\x61\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\xae\x00\xae\x00\xb1\x00\x00\x00\xff\xff\x00\x00\x36\x00\x36\x00\x00\x00\x32\x00\x7c\x00\x2c\x00\x2c\x00\xb1\x00\x61\x00\x00\x00\x00\x00\x00\x00\x2f\x00\xff\xff\x33\x00\x60\x00\xff\xff\x61\x00\xff\xff\x00\x00\x00\x00\xff\xff\xa7\x00\x2f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x00\x00\xa0\x00\x00\x00\xc9\x00\x00\x00\xb1\x00\x00\x00\x00\x00\x7c\x00\x36\x00\x36\x00\xb1\x00\x32\x00\x7c\x00\x00\x00\x00\x00\xff\xff\x7a\x00\x44\x00\xff\xff\x00\x00\x2f\x00\x00\x00\x8f\x00\x00\x00\x00\x00\xa7\x00\x40\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\xff\xff\x00\x00\x00\x00\xff\xff\x42\x00\xb1\x00\x00\x00\x7c\x00\x61\x00\x47\x00\x47\x00\xb1\x00\x43\x00\x61\x00\x00\x00\x00\x00\x00\x00\x61\x00\x44\x00\x00\x00\x00\x00\x40\x00\x46\x00\x8f\x00\x00\x00\x00\x00\x61\x00\x40\x00\x8f\x00\x7c\x00\x00\x00\x61\x00\x45\x00\x3d\x00\x3d\x00\x46\x00\x41\x00\x3d\x00\x3d\x00\x00\x00\x46\x00\x46\x00\x00\x00\xb1\x00\x00\x00\x61\x00\x00\x00\x47\x00\x47\x00\x61\x00\x43\x00\x3d\x00\x3d\x00\x00\x00\x61\x00\x3d\x00\x3d\x00\x61\x00\x45\x00\x40\x00\x8f\x00\x3d\x00\x3d\x00\x61\x00\x61\x00\x61\x00\x46\x00\x46\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x46\x00\x61\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8f\x00\x00\x00\x00\x00\x00\x00\x3d\x00\x3d\x00\xff\xff\x61\x00\x53\x00\xff\xff\x00\x00\x00\x00\x3d\x00\x3d\x00\x00\x00\x61\x00\x46\x00\x61\x00\x00\x00\x91\x00\x00\x00\x00\x00\x00\x00\x00\x00\x61\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x91\x00\x00\x00\x4e\x00\x4e\x00\x61\x00\x52\x00\x00\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x61\x00\x61\x00\x00\x00\x00\x00\xff\xff\x55\x00\x00\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\xff\xff\x51\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4e\x00\x4e\x00\x00\x00\x57\x00\xa4\x00\x00\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x61\x00\x91\x00\x58\x00\x58\x00\x00\x00\x54\x00\x00\x00\x91\x00\xa4\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb7\x00\x51\x00\x50\x00\x50\x00\x50\x00\x50\x00\x50\x00\x50\x00\x50\x00\x50\x00\x50\x00\x50\x00\x00\x00\x00\x00\xff\xff\x00\x00\x57\x00\xff\xff\x00\x00\x50\x00\x50\x00\x50\x00\x50\x00\x50\x00\x50\x00\x61\x00\x00\x00\x00\x00\x00\x00\xff\xff\x55\x00\x00\x00\xff\xff\x00\x00\xba\x00\x61\x00\x00\x00\x00\x00\x00\x00\x51\x00\x56\x00\xa4\x00\x00\x00\x91\x00\x57\x00\x4e\x00\x4e\x00\xa4\x00\x61\x00\x57\x00\x00\x00\x50\x00\x50\x00\x50\x00\x50\x00\x50\x00\x50\x00\x61\x00\xff\xff\x58\x00\x58\x00\x00\x00\x54\x00\x00\x00\x4e\x00\x4e\x00\xba\x00\x56\x00\x61\x00\x4e\x00\x4e\x00\x51\x00\x61\x00\x61\x00\x00\x00\x00\x00\x57\x00\x57\x00\x00\x00\x00\x00\x00\x00\x57\x00\x61\x00\x47\x01\x00\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\x00\x00\xa4\x00\x4e\x00\x4e\x00\x00\x00\x61\x00\xff\xff\x4e\x00\x4e\x00\xff\xff\x61\x00\x00\x00\x00\x00\x00\x00\x57\x00\x00\x00\xfe\x00\x00\x00\x00\x00\x61\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\xbd\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbf\x00\x00\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\xb9\x00\x00\x00\x50\x00\x50\x00\x50\x00\x50\x00\x50\x00\x50\x00\x50\x00\x50\x00\x50\x00\x50\x00\xff\xff\x00\x00\xff\xff\xff\xff\x00\x00\xff\xff\x00\x00\x50\x00\x50\x00\x50\x00\x50\x00\x50\x00\x50\x00\x00\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\xff\xff\x00\x00\x00\x00\xff\xff\xbd\x00\x00\x00\xcd\x00\x00\x00\xff\xff\xbf\x00\x00\x00\xff\xff\xff\xff\xca\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x50\x00\x50\x00\x50\x00\x50\x00\x50\x00\x50\x00\x00\x00\x00\x00\x00\x00\xff\xff\x62\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\xff\xff\xcd\x00\x63\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x67\x00\x67\x00\x67\x00\x67\x00\x67\x00\x67\x00\x67\x00\x67\x00\xbd\x00\x00\x00\x00\x00\x63\x00\x00\x00\xbf\x00\xff\xff\xff\xff\xca\x00\xff\xff\xda\x00\x00\x00\x68\x00\x68\x00\x68\x00\x68\x00\x68\x00\x68\x00\x68\x00\x68\x00\x68\x00\x68\x00\x00\x00\xff\xff\xff\xff\x00\x00\xff\xff\xff\xff\x8b\x00\x68\x00\x68\x00\x68\x00\x68\x00\x68\x00\x68\x00\x6f\x00\x8c\x00\x00\x00\xff\xff\x00\x00\xda\x00\xff\xff\x00\x00\x00\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\xff\xff\xff\xff\x00\x00\x00\x00\x8c\x00\x00\x00\xca\x00\x00\x00\xfe\x00\x68\x00\x68\x00\x68\x00\x68\x00\x68\x00\x68\x00\x62\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x68\x00\x68\x00\x68\x00\x68\x00\x68\x00\x68\x00\x68\x00\x68\x00\x68\x00\x68\x00\x00\x00\x00\x00\xa0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x68\x00\x68\x00\x68\x00\x68\x00\x68\x00\x68\x00\x00\x00\x70\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfe\x00\xfe\x00\xff\xff\x00\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x00\x00\x00\x00\x00\x00\x8b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x68\x00\x68\x00\x68\x00\x68\x00\x68\x00\x68\x00\x6a\x00\x00\x00\x00\x00\xff\xff\x00\x00\x6a\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x65\x00\x65\x00\x65\x00\x65\x00\x65\x00\x65\x00\x65\x00\x65\x00\xa1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6a\x00\x00\x00\x00\x00\x7c\x00\x00\x00\x00\x00\x6b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x7f\x00\x7f\x00\x7f\x00\x7f\x00\x7f\x00\x7f\x00\x7f\x00\x00\x00\x00\x00\xe5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6a\x00\x6a\x00\x00\x00\x00\x00\x6b\x00\x6a\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\xff\xff\xff\xff\x6a\x00\xff\xff\x00\x00\x00\x00\x6a\x00\x00\x00\x6a\x00\xe1\x00\x6a\x00\x8f\x00\x6e\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\xff\xff\xce\x00\x00\x00\xff\xff\x70\x00\x00\x00\xd0\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x00\x00\xce\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd0\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x00\x00\x00\x00\x00\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\xff\xff\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xa1\x00\x00\x00\xdb\x00\x00\x00\x00\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x00\x00\xff\xff\x00\x00\xce\x00\x00\x00\xef\x00\x6f\x00\x00\x00\xd0\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\xdb\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x77\x00\x00\x00\x00\x00\xff\xff\x00\x00\x77\x00\xff\xff\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x00\x00\x72\x00\x72\x00\x72\x00\x72\x00\x72\x00\x72\x00\x72\x00\x72\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xef\x00\x00\x00\x77\x00\x00\x00\x00\x00\xff\xff\x00\x00\xa0\x00\x78\x00\xdb\x00\x00\x00\x0c\x01\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\xe5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x77\x00\x00\x00\x00\x00\x00\x00\x00\x00\x77\x00\x77\x00\x00\x00\x00\x00\x78\x00\x77\x00\xef\x00\x00\x00\x00\x00\xff\xff\x00\x00\xff\xff\xff\xff\x77\x00\x00\x00\x00\x00\x00\x00\x77\x00\x00\x00\x77\x00\xe1\x00\x77\x00\x0c\x01\x7b\x00\x76\x00\x76\x00\x76\x00\x76\x00\x76\x00\x76\x00\x76\x00\x76\x00\x76\x00\x76\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7c\x00\x00\x00\x00\x00\x76\x00\x76\x00\x76\x00\x76\x00\x76\x00\x76\x00\x80\x00\x80\x00\x80\x00\x80\x00\x80\x00\x80\x00\x80\x00\x80\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x0c\x01\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x76\x00\x76\x00\x76\x00\x76\x00\x76\x00\x76\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x7c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\xff\xff\x8f\x00\x7c\x00\x81\x00\x81\x00\x81\x00\x81\x00\x81\x00\x81\x00\x81\x00\x81\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\xef\x00\x00\x00\xef\x00\x7c\x00\x00\x00\xff\xff\xff\xff\xff\xff\x00\x00\xff\xff\x00\x00\x00\x00\x83\x00\x83\x00\x83\x00\x83\x00\x83\x00\x83\x00\x83\x00\x83\x00\x83\x00\x83\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8f\x00\x83\x00\x83\x00\x83\x00\x83\x00\x83\x00\x83\x00\x7c\x00\x8f\x00\x00\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8f\x00\x00\x00\x0c\x01\x00\x00\x0c\x01\x83\x00\x83\x00\x83\x00\x83\x00\x83\x00\x83\x00\x7c\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x84\x00\x84\x00\x84\x00\x84\x00\x84\x00\x84\x00\x84\x00\x84\x00\x84\x00\x84\x00\x00\x00\x00\x00\x8f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x84\x00\x84\x00\x84\x00\x84\x00\x84\x00\x84\x00\x7c\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x89\x00\x89\x00\x89\x00\x89\x00\x89\x00\x89\x00\x89\x00\x89\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x84\x00\x84\x00\x84\x00\x84\x00\x84\x00\x84\x00\x7c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x85\x00\xff\xff\x8f\x00\xff\xff\xff\xff\x85\x00\xff\xff\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x00\x00\x7d\x00\x7d\x00\x7d\x00\x7d\x00\x7d\x00\x7d\x00\x7d\x00\x7d\x00\x00\x00\x00\x00\x00\x00\xef\x00\x00\x00\xef\x00\x00\x00\x85\x00\xff\xff\x85\x00\xff\xff\x00\x00\x8f\x00\x85\x00\x85\x00\x00\x00\x00\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x7e\x00\x7e\x00\x7e\x00\x7e\x00\x7e\x00\x7e\x00\x7e\x00\x7e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x85\x00\x00\x00\x85\x00\x00\x00\x00\x00\x85\x00\x85\x00\x00\x00\x85\x00\x85\x00\x85\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x85\x00\x00\x00\x00\x00\x00\x00\x85\x00\x00\x00\x85\x00\x0c\x01\x85\x00\x0c\x01\x8d\x00\x00\x00\x00\x00\x85\x00\x00\x00\x00\x00\x00\x00\x00\x00\x85\x00\x85\x00\x00\x00\x00\x00\x85\x00\x85\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x85\x00\x00\x00\x00\x00\x00\x00\x85\x00\x00\x00\x85\x00\x00\x00\x85\x00\x00\x00\x8e\x00\x83\x00\x83\x00\x83\x00\x83\x00\x83\x00\x83\x00\x83\x00\x83\x00\x83\x00\x83\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x83\x00\x83\x00\x83\x00\x83\x00\x83\x00\x83\x00\x84\x00\x84\x00\x84\x00\x84\x00\x84\x00\x84\x00\x84\x00\x84\x00\x84\x00\x84\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x84\x00\x84\x00\x84\x00\x84\x00\x84\x00\x84\x00\x00\x00\x00\x00\x00\x00\x83\x00\x83\x00\x83\x00\x83\x00\x83\x00\x83\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x86\x00\x00\x00\xff\xff\x00\x00\x00\x00\x86\x00\x00\x00\x00\x00\x84\x00\x84\x00\x84\x00\x84\x00\x84\x00\x84\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x91\x00\x86\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x86\x00\x00\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\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\x86\x00\x00\x00\x00\x00\x00\x00\x00\x00\x86\x00\x86\x00\x00\x00\x00\x00\x86\x00\x86\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\xff\xff\x86\x00\x00\x00\x00\x00\x00\x00\x86\x00\xa4\x00\x86\x00\x00\x00\x86\x00\x00\x00\x90\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x91\x00\x00\x00\x00\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x91\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x00\x91\x00\x96\x00\x96\x00\x96\x00\x96\x00\x96\x00\x96\x00\x96\x00\x96\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x91\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x98\x00\x98\x00\x98\x00\x98\x00\x98\x00\x98\x00\x98\x00\x98\x00\x98\x00\x98\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x00\x98\x00\x98\x00\x98\x00\x98\x00\x98\x00\x98\x00\x91\x00\xa4\x00\x00\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x9d\x00\x9d\x00\x9d\x00\x9d\x00\x9d\x00\x9d\x00\x9d\x00\x9d\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x98\x00\x98\x00\x98\x00\x98\x00\x98\x00\x98\x00\x91\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x99\x00\x99\x00\x99\x00\x99\x00\x99\x00\x99\x00\x99\x00\x99\x00\x99\x00\x99\x00\x00\x00\x00\x00\xa4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x99\x00\x99\x00\x99\x00\x99\x00\x99\x00\x99\x00\x91\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x99\x00\x99\x00\x99\x00\x99\x00\x99\x00\x99\x00\x91\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9a\x00\x00\x00\xa4\x00\x00\x00\x00\x00\x9a\x00\x00\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x00\x00\x92\x00\x92\x00\x92\x00\x92\x00\x92\x00\x92\x00\x92\x00\x92\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9a\x00\x00\x00\x9a\x00\x00\x00\x00\x00\xa4\x00\x9a\x00\x9a\x00\x00\x00\x00\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x93\x00\x93\x00\x93\x00\x93\x00\x93\x00\x93\x00\x93\x00\x93\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9a\x00\x00\x00\x9a\x00\x00\x00\x00\x00\x9a\x00\x9a\x00\x00\x00\x9a\x00\x9a\x00\x9a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9a\x00\x00\x00\x00\x00\x00\x00\x9a\x00\x00\x00\x9a\x00\x00\x00\x9a\x00\x00\x00\xa2\x00\x00\x00\x00\x00\x9a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9a\x00\x9a\x00\x00\x00\x00\x00\x9a\x00\x9a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9a\x00\x00\x00\x00\x00\x00\x00\x9a\x00\x00\x00\x9a\x00\x00\x00\x9a\x00\x00\x00\xa3\x00\x98\x00\x98\x00\x98\x00\x98\x00\x98\x00\x98\x00\x98\x00\x98\x00\x98\x00\x98\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x98\x00\x98\x00\x98\x00\x98\x00\x98\x00\x98\x00\x99\x00\x99\x00\x99\x00\x99\x00\x99\x00\x99\x00\x99\x00\x99\x00\x99\x00\x99\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x99\x00\x99\x00\x99\x00\x99\x00\x99\x00\x99\x00\x00\x00\x00\x00\x00\x00\x98\x00\x98\x00\x98\x00\x98\x00\x98\x00\x98\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9b\x00\x00\x00\x00\x00\x99\x00\x99\x00\x99\x00\x99\x00\x99\x00\x99\x00\x9c\x00\x9c\x00\x9c\x00\x9c\x00\x9c\x00\x9c\x00\x9c\x00\x9c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9b\x00\x9b\x00\xab\x00\x00\x00\x9b\x00\x9b\x00\x00\x00\x00\x00\xab\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9b\x00\x00\x00\x00\x00\x00\x00\x9b\x00\x00\x00\x9b\x00\x00\x00\x9b\x00\x00\x00\xa5\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\xab\x00\x00\x00\x00\x00\xac\x00\xac\x00\x00\x00\xab\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\xb4\x00\xb4\x00\xb4\x00\xb4\x00\xb4\x00\xb4\x00\xb4\x00\xb4\x00\xb4\x00\xb4\x00\x00\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\xaf\x00\xab\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xab\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xaf\x00\xab\x00\xaf\x00\xab\x00\xac\x00\xac\x00\x00\x00\xab\x00\x00\x00\xab\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\xaf\x00\xab\x00\xab\x00\x00\x00\xac\x00\xac\x00\x00\x00\xab\x00\xab\x00\xa7\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\x00\x00\x00\x00\x00\x00\x00\x00\xb1\x00\x00\x00\xab\x00\x00\x00\x00\x00\xac\x00\xac\x00\xb0\x00\xab\x00\xb0\x00\x00\x00\x00\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb2\x00\x00\x00\xb2\x00\x00\x00\xb1\x00\xaa\x00\xaa\x00\xaa\x00\xaa\x00\xaa\x00\xaa\x00\xaa\x00\xaa\x00\xaa\x00\xaa\x00\xb4\x00\xb4\x00\xb4\x00\xb4\x00\xb4\x00\xb4\x00\xb4\x00\xb4\x00\xb4\x00\xb4\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\xb5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb5\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\xba\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb5\x00\x00\x00\x00\x00\xb6\x00\xb6\x00\x00\x00\xb5\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\xba\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\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\xba\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\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\xbb\x00\xff\xff\xbb\x00\xba\x00\xff\xff\xb4\x00\xb4\x00\xb4\x00\xb4\x00\xb4\x00\xb4\x00\xb4\x00\xb4\x00\xb4\x00\xb4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbc\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\xbd\x00\xff\xff\x00\x00\x00\x00\x00\x00\xbf\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xc3\x00\xc3\x00\xc3\x00\xc3\x00\xc3\x00\xc3\x00\xc3\x00\xc3\x00\xbc\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc9\x00\x00\x00\x00\x00\xbd\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbf\x00\xc4\x00\xc4\x00\xc4\x00\xc4\x00\xc4\x00\xc4\x00\xc4\x00\xc4\x00\xc5\x00\xc5\x00\xc5\x00\xc5\x00\xc5\x00\xc5\x00\xc5\x00\xc5\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\xca\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\x00\x00\x00\x00\xbc\x00\x00\x00\x00\x00\x00\x00\xc9\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\x00\x00\xca\x00\x00\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\xbd\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbf\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc7\x00\xc7\x00\xc7\x00\xc7\x00\xc7\x00\xc7\x00\xc7\x00\xc7\x00\xc7\x00\xc7\x00\xbf\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbf\x00\x00\x00\xc7\x00\xc7\x00\xc7\x00\xc7\x00\xc7\x00\xc7\x00\x00\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbf\x00\x00\x00\x00\x00\x00\x00\x00\x00\xca\x00\xbf\x00\x00\x00\x00\x00\x00\x00\xc7\x00\xc7\x00\xc7\x00\xc7\x00\xc7\x00\xc7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbf\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbf\x00\xbf\x00\x00\x00\x00\x00\xbf\x00\xbf\x00\x00\x00\x00\x00\x00\x00\xff\xff\xc8\x00\x00\x00\xff\xff\xbf\x00\x00\x00\xc8\x00\x00\x00\xbf\x00\x00\x00\xbf\x00\x00\x00\xbf\x00\x00\x00\xcb\x00\xc1\x00\xc1\x00\xc1\x00\xc1\x00\xc1\x00\xc1\x00\xc1\x00\xc1\x00\x00\x00\xcd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc8\x00\x00\x00\xd3\x00\xd3\x00\xd3\x00\xd3\x00\xd3\x00\xd3\x00\xd3\x00\xd3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc8\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc8\x00\xc8\x00\x00\x00\x00\x00\xc8\x00\xc8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\xc8\x00\xff\xff\x00\x00\x00\x00\xc8\x00\xda\x00\xc8\x00\x00\x01\xc8\x00\x00\x00\xcc\x00\xc7\x00\xc7\x00\xc7\x00\xc7\x00\xc7\x00\xc7\x00\xc7\x00\xc7\x00\xc7\x00\xc7\x00\x00\x00\xce\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd0\x00\xc7\x00\xc7\x00\xc7\x00\xc7\x00\xc7\x00\xc7\x00\x00\x00\x00\x00\xd4\x00\xd4\x00\xd4\x00\xd4\x00\xd4\x00\xd4\x00\xd4\x00\xd4\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xc7\x00\xc7\x00\xc7\x00\xc7\x00\xc7\x00\xc7\x00\x00\x00\x00\x00\xcd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xce\x00\x00\x00\x00\x00\x00\x00\xdb\x00\xd0\x00\xd5\x00\xd5\x00\xd5\x00\xd5\x00\xd5\x00\xd5\x00\xd5\x00\xd5\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\x00\x00\x00\x00\xcd\x00\x00\x00\x00\x00\x00\x00\xda\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\x00\x00\xdb\x00\x00\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xda\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\xce\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd0\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd0\x00\x00\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\x00\x00\xd1\x00\xd1\x00\xd1\x00\xd1\x00\xd1\x00\xd1\x00\xd1\x00\xd1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd0\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdb\x00\xd0\x00\x00\x00\x00\x00\x00\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd0\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd0\x00\xd0\x00\x00\x00\x00\x00\xd0\x00\xd0\x00\x00\x00\x00\x00\x00\x00\xff\xff\xd9\x00\x00\x00\xff\xff\xd0\x00\x00\x00\xd9\x00\x00\x00\xd0\x00\x00\x00\xd0\x00\x00\x00\xd0\x00\x00\x00\xdc\x00\xd2\x00\xd2\x00\xd2\x00\xd2\x00\xd2\x00\xd2\x00\xd2\x00\xd2\x00\x00\x00\xef\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xd9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd9\x00\x00\x00\xf4\x00\xf4\x00\xf4\x00\xf4\x00\xf4\x00\xf4\x00\xf4\x00\xf4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd9\x00\xd9\x00\x00\x00\x00\x00\xd9\x00\xd9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd9\x00\x00\x00\x00\x00\x00\x00\xd9\x00\x0c\x01\xd9\x00\x00\x01\xd9\x00\x00\x00\xdd\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xe2\x00\xe2\x00\xe2\x00\xe2\x00\xe2\x00\xe2\x00\xe2\x00\xe2\x00\xe2\x00\xe2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe2\x00\xe2\x00\xe2\x00\xe2\x00\xe2\x00\xe2\x00\x00\x00\x00\x00\x00\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe3\x00\xe3\x00\xe3\x00\xe3\x00\xe3\x00\xe3\x00\xe3\x00\xe3\x00\xe3\x00\xe3\x00\x00\x00\xe2\x00\xe2\x00\xe2\x00\xe2\x00\xe2\x00\xe2\x00\xe3\x00\xe3\x00\xe3\x00\xe3\x00\xe3\x00\xe3\x00\xe4\x00\xe4\x00\xe4\x00\xe4\x00\xe4\x00\xe4\x00\xe4\x00\xe4\x00\xe4\x00\xe4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe4\x00\xe4\x00\xe4\x00\xe4\x00\xe4\x00\xe4\x00\x00\x00\x00\x00\x00\x00\xe3\x00\xe3\x00\xe3\x00\xe3\x00\xe3\x00\xe3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdf\x00\xdf\x00\xdf\x00\xdf\x00\xdf\x00\xdf\x00\xdf\x00\xdf\x00\xdf\x00\xdf\x00\x00\x00\xe4\x00\xe4\x00\xe4\x00\xe4\x00\xe4\x00\xe4\x00\xdf\x00\xdf\x00\xdf\x00\xdf\x00\xdf\x00\xdf\x00\xe6\x00\xe6\x00\xe6\x00\xe6\x00\xe6\x00\xe6\x00\xe6\x00\xe6\x00\xe6\x00\xe6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe6\x00\xe6\x00\xe6\x00\xe6\x00\xe6\x00\xe6\x00\x00\x00\x00\x00\x00\x00\xdf\x00\xdf\x00\xdf\x00\xdf\x00\xdf\x00\xdf\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe7\x00\xe7\x00\xe7\x00\xe7\x00\xe7\x00\xe7\x00\xe7\x00\xe7\x00\xe7\x00\xe7\x00\x00\x00\xe6\x00\xe6\x00\xe6\x00\xe6\x00\xe6\x00\xe6\x00\xe7\x00\xe7\x00\xe7\x00\xe7\x00\xe7\x00\xe7\x00\xe8\x00\xe8\x00\xe8\x00\xe8\x00\xe8\x00\xe8\x00\xe8\x00\xe8\x00\xe8\x00\xe8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe8\x00\xe8\x00\xe8\x00\xe8\x00\xe8\x00\xe8\x00\x00\x00\x00\x00\x00\x00\xe7\x00\xe7\x00\xe7\x00\xe7\x00\xe7\x00\xe7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe9\x00\xe9\x00\xe9\x00\xe9\x00\xe9\x00\xe9\x00\xe9\x00\xe9\x00\xe9\x00\xe9\x00\x00\x00\xe8\x00\xe8\x00\xe8\x00\xe8\x00\xe8\x00\xe8\x00\xe9\x00\xe9\x00\xe9\x00\xe9\x00\xe9\x00\xe9\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\x00\x00\x00\x00\x00\x00\xe9\x00\xe9\x00\xe9\x00\xe9\x00\xe9\x00\xe9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xeb\x00\xeb\x00\xeb\x00\xeb\x00\xeb\x00\xeb\x00\xeb\x00\xeb\x00\xeb\x00\xeb\x00\x00\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\xeb\x00\xeb\x00\xeb\x00\xeb\x00\xeb\x00\xeb\x00\xec\x00\xec\x00\xec\x00\xec\x00\xec\x00\xec\x00\xec\x00\xec\x00\xec\x00\xec\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xec\x00\xec\x00\xec\x00\xec\x00\xec\x00\xec\x00\x00\x00\x00\x00\x00\x00\xeb\x00\xeb\x00\xeb\x00\xeb\x00\xeb\x00\xeb\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe0\x00\xe0\x00\xe0\x00\xe0\x00\xe0\x00\xe0\x00\xe0\x00\xe0\x00\xe0\x00\xe0\x00\x00\x00\xec\x00\xec\x00\xec\x00\xec\x00\xec\x00\xec\x00\xe0\x00\xe0\x00\xe0\x00\xe0\x00\xe0\x00\xe0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe0\x00\xe0\x00\xe0\x00\xe0\x00\xe0\x00\xe0\x00\xef\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\xff\xff\xef\x00\x00\x00\xff\xff\x00\x00\x00\x00\xff\xff\xf5\x00\xf5\x00\xf5\x00\xf5\x00\xf5\x00\xf5\x00\xf5\x00\xf5\x00\xf6\x00\xf6\x00\xf6\x00\xf6\x00\xf6\x00\xf6\x00\xf6\x00\xf6\x00\xf6\x00\xf6\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\xf6\x00\xf6\x00\xf6\x00\xf6\x00\xf6\x00\xf6\x00\xfb\x00\xfb\x00\xfb\x00\xfb\x00\xfb\x00\xfb\x00\xfb\x00\xfb\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x0c\x01\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x0c\x01\x00\x00\x00\x00\x00\x00\x00\x00\xf6\x00\xf6\x00\xf6\x00\xf6\x00\xf6\x00\xf6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfe\x00\xff\xff\xfc\x00\xfc\x00\xfc\x00\xfc\x00\xfc\x00\xfc\x00\xfc\x00\xfc\x00\xfd\x00\xfd\x00\xfd\x00\xfd\x00\xfd\x00\xfd\x00\xfd\x00\xfd\x00\xfd\x00\xfd\x00\xf9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf9\x00\x00\x00\xfd\x00\xfd\x00\xfd\x00\xfd\x00\xfd\x00\xfd\x00\x00\x00\xfa\x00\xfa\x00\xfa\x00\xfa\x00\xfa\x00\xfa\x00\xfa\x00\xfa\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfe\x00\x00\x00\x00\x00\xf9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfe\x00\xf9\x00\x00\x00\x00\x00\x00\x00\xfd\x00\xfd\x00\xfd\x00\xfd\x00\xfd\x00\xfd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf9\x00\xf9\x00\x00\x00\x00\x00\xf9\x00\xf9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf9\x00\x00\x00\x00\x00\x00\x00\xf9\x00\x00\x00\xf9\x00\x00\x01\xf9\x00\x00\x00\xff\x00\xfd\x00\xfd\x00\xfd\x00\xfd\x00\xfd\x00\xfd\x00\xfd\x00\xfd\x00\xfd\x00\xfd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfd\x00\xfd\x00\xfd\x00\xfd\x00\xfd\x00\xfd\x00\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x00\x00\x00\x00\x00\x00\xfd\x00\xfd\x00\xfd\x00\xfd\x00\xfd\x00\xfd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x00\x00\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x00\x00\x00\x00\x00\x00\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf0\x00\xf0\x00\xf0\x00\xf0\x00\xf0\x00\xf0\x00\xf0\x00\xf0\x00\xf0\x00\xf0\x00\x00\x00\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\xf0\x00\xf0\x00\xf0\x00\xf0\x00\xf0\x00\xf0\x00\x05\x01\x05\x01\x05\x01\x05\x01\x05\x01\x05\x01\x05\x01\x05\x01\x05\x01\x05\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x01\x05\x01\x05\x01\x05\x01\x05\x01\x05\x01\x00\x00\x00\x00\x00\x00\xf0\x00\xf0\x00\xf0\x00\xf0\x00\xf0\x00\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x01\x06\x01\x06\x01\x06\x01\x06\x01\x06\x01\x06\x01\x06\x01\x06\x01\x06\x01\x00\x00\x05\x01\x05\x01\x05\x01\x05\x01\x05\x01\x05\x01\x06\x01\x06\x01\x06\x01\x06\x01\x06\x01\x06\x01\x07\x01\x07\x01\x07\x01\x07\x01\x07\x01\x07\x01\x07\x01\x07\x01\x07\x01\x07\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x01\x07\x01\x07\x01\x07\x01\x07\x01\x07\x01\x00\x00\x00\x00\x00\x00\x06\x01\x06\x01\x06\x01\x06\x01\x06\x01\x06\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x01\x08\x01\x08\x01\x08\x01\x08\x01\x08\x01\x08\x01\x08\x01\x08\x01\x08\x01\x00\x00\x07\x01\x07\x01\x07\x01\x07\x01\x07\x01\x07\x01\x08\x01\x08\x01\x08\x01\x08\x01\x08\x01\x08\x01\x09\x01\x09\x01\x09\x01\x09\x01\x09\x01\x09\x01\x09\x01\x09\x01\x09\x01\x09\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x09\x01\x09\x01\x09\x01\x09\x01\x09\x01\x09\x01\x00\x00\x00\x00\x00\x00\x08\x01\x08\x01\x08\x01\x08\x01\x08\x01\x08\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x00\x00\x09\x01\x09\x01\x09\x01\x09\x01\x09\x01\x09\x01\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x0b\x01\x0b\x01\x0b\x01\x0b\x01\x0b\x01\x0b\x01\x0b\x01\x0b\x01\x0b\x01\x0b\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0b\x01\x0b\x01\x0b\x01\x0b\x01\x0b\x01\x0b\x01\x00\x00\x00\x00\x00\x00\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf1\x00\xf1\x00\xf1\x00\xf1\x00\xf1\x00\xf1\x00\xf1\x00\xf1\x00\xf1\x00\xf1\x00\x00\x00\x0b\x01\x0b\x01\x0b\x01\x0b\x01\x0b\x01\x0b\x01\xf1\x00\xf1\x00\xf1\x00\xf1\x00\xf1\x00\xf1\x00\x00\x00\x00\x00\x00\x00\xf2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf3\x00\xf3\x00\xf3\x00\xf3\x00\xf3\x00\xf3\x00\xf3\x00\xf3\x00\x00\x00\xf1\x00\xf1\x00\xf1\x00\xf1\x00\xf1\x00\xf1\x00\xf2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf2\x00\xf2\x00\x00\x00\x00\x00\xf2\x00\xf2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf2\x00\x00\x00\x00\x00\x00\x00\xf2\x00\x00\x00\xf2\x00\x0e\x01\xf2\x00\x00\x00\x0d\x01\xf6\x00\xf6\x00\xf6\x00\xf6\x00\xf6\x00\xf6\x00\xf6\x00\xf6\x00\xf6\x00\xf6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf6\x00\xf6\x00\xf6\x00\xf6\x00\xf6\x00\xf6\x00\x0f\x01\x0f\x01\x0f\x01\x0f\x01\x0f\x01\x0f\x01\x0f\x01\x0f\x01\x0f\x01\x0f\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0f\x01\x0f\x01\x0f\x01\x0f\x01\x0f\x01\x0f\x01\x00\x00\x00\x00\x00\x00\xf6\x00\xf6\x00\xf6\x00\xf6\x00\xf6\x00\xf6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x01\x10\x01\x10\x01\x10\x01\x10\x01\x10\x01\x10\x01\x10\x01\x10\x01\x10\x01\x00\x00\x0f\x01\x0f\x01\x0f\x01\x0f\x01\x0f\x01\x0f\x01\x10\x01\x10\x01\x10\x01\x10\x01\x10\x01\x10\x01\x11\x01\x11\x01\x11\x01\x11\x01\x11\x01\x11\x01\x11\x01\x11\x01\x11\x01\x11\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x01\x11\x01\x11\x01\x11\x01\x11\x01\x11\x01\x00\x00\x00\x00\x00\x00\x10\x01\x10\x01\x10\x01\x10\x01\x10\x01\x10\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf7\x00\xf7\x00\xf7\x00\xf7\x00\xf7\x00\xf7\x00\xf7\x00\xf7\x00\xf7\x00\xf7\x00\x00\x00\x11\x01\x11\x01\x11\x01\x11\x01\x11\x01\x11\x01\xf7\x00\xf7\x00\xf7\x00\xf7\x00\xf7\x00\xf7\x00\x13\x01\x13\x01\x13\x01\x13\x01\x13\x01\x13\x01\x13\x01\x13\x01\x13\x01\x13\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x13\x01\x13\x01\x13\x01\x13\x01\x13\x01\x13\x01\x00\x00\x00\x00\x00\x00\xf7\x00\xf7\x00\xf7\x00\xf7\x00\xf7\x00\xf7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x14\x01\x14\x01\x14\x01\x14\x01\x14\x01\x14\x01\x14\x01\x14\x01\x14\x01\x14\x01\x00\x00\x13\x01\x13\x01\x13\x01\x13\x01\x13\x01\x13\x01\x14\x01\x14\x01\x14\x01\x14\x01\x14\x01\x14\x01\x15\x01\x15\x01\x15\x01\x15\x01\x15\x01\x15\x01\x15\x01\x15\x01\x15\x01\x15\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x15\x01\x15\x01\x15\x01\x15\x01\x15\x01\x15\x01\x00\x00\x00\x00\x00\x00\x14\x01\x14\x01\x14\x01\x14\x01\x14\x01\x14\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x16\x01\x16\x01\x16\x01\x16\x01\x16\x01\x16\x01\x16\x01\x16\x01\x16\x01\x16\x01\x00\x00\x15\x01\x15\x01\x15\x01\x15\x01\x15\x01\x15\x01\x16\x01\x16\x01\x16\x01\x16\x01\x16\x01\x16\x01\x17\x01\x17\x01\x17\x01\x17\x01\x17\x01\x17\x01\x17\x01\x17\x01\x17\x01\x17\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17\x01\x17\x01\x17\x01\x17\x01\x17\x01\x17\x01\x00\x00\x00\x00\x00\x00\x16\x01\x16\x01\x16\x01\x16\x01\x16\x01\x16\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x01\x18\x01\x18\x01\x18\x01\x18\x01\x18\x01\x18\x01\x18\x01\x18\x01\x18\x01\x00\x00\x17\x01\x17\x01\x17\x01\x17\x01\x17\x01\x17\x01\x18\x01\x18\x01\x18\x01\x18\x01\x18\x01\x18\x01\x19\x01\x19\x01\x19\x01\x19\x01\x19\x01\x19\x01\x19\x01\x19\x01\x19\x01\x19\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x19\x01\x19\x01\x19\x01\x19\x01\x19\x01\x19\x01\x00\x00\x00\x00\x00\x00\x18\x01\x18\x01\x18\x01\x18\x01\x18\x01\x18\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf8\x00\xf8\x00\xf8\x00\xf8\x00\xf8\x00\xf8\x00\xf8\x00\xf8\x00\xf8\x00\xf8\x00\x00\x00\x19\x01\x19\x01\x19\x01\x19\x01\x19\x01\x19\x01\xf8\x00\xf8\x00\xf8\x00\xf8\x00\xf8\x00\xf8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf8\x00\xf8\x00\xf8\x00\xf8\x00\xf8\x00\xf8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"#--alex_check :: AlexAddr-alex_check = AlexA# "\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0a\x00\x0a\x00\x0a\x00\x61\x00\x6d\x00\x67\x00\x61\x00\x72\x00\x0a\x00\x0a\x00\x74\x00\x6e\x00\x65\x00\x64\x00\x4c\x00\x6c\x00\x6c\x00\x4c\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x4c\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\x6c\x00\x5d\x00\x5e\x00\x5f\x00\x6c\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x09\x00\x0a\x00\x55\x00\x4c\x00\x0d\x00\x55\x00\x4c\x00\x69\x00\x6a\x00\x27\x00\x09\x00\x0a\x00\x27\x00\x20\x00\x0d\x00\x69\x00\x6a\x00\x27\x00\x20\x00\x3d\x00\x4c\x00\x4c\x00\x3d\x00\x20\x00\x3d\x00\x22\x00\x3d\x00\x3d\x00\x6c\x00\x55\x00\x55\x00\x3c\x00\x3d\x00\x20\x00\x75\x00\x22\x00\x55\x00\x75\x00\x6c\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x09\x00\x0a\x00\x75\x00\x75\x00\x0d\x00\x55\x00\x2b\x00\x3d\x00\x26\x00\x75\x00\x09\x00\x0a\x00\x3d\x00\x3e\x00\x0d\x00\x2e\x00\x3d\x00\x3d\x00\xff\xff\xff\xff\x3d\x00\xff\xff\xff\xff\x20\x00\x3d\x00\x22\x00\xff\xff\xff\xff\x6c\x00\x4c\x00\x4c\x00\x3d\x00\x55\x00\x20\x00\xff\xff\x22\x00\xff\xff\x75\x00\x55\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x09\x00\x0a\x00\x6c\x00\x6c\x00\x0d\x00\x75\x00\x55\x00\xff\xff\xff\xff\x09\x00\x0a\x00\x75\x00\xff\xff\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x4c\x00\x20\x00\x7c\x00\x22\x00\xff\xff\xff\xff\x4c\x00\x6c\x00\x0a\x00\x55\x00\x20\x00\x0d\x00\x22\x00\x09\x00\x0a\x00\x55\x00\x75\x00\x0d\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x20\x00\x27\x00\x6c\x00\x09\x00\x0a\x00\x75\x00\xff\xff\x0d\x00\xff\xff\xff\xff\x0a\x00\x75\x00\xff\xff\x0d\x00\xff\xff\x2d\x00\xff\xff\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x20\x00\xff\xff\xff\xff\x09\x00\x0a\x00\x3d\x00\x3e\x00\x0d\x00\x0a\x00\x0a\x00\xff\xff\x0d\x00\x0d\x00\x27\x00\xff\xff\xff\xff\xff\xff\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x20\x00\xff\xff\x5c\x00\x09\x00\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\xff\xff\x27\x00\x27\x00\x09\x00\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x20\x00\xff\xff\xff\xff\x09\x00\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\x09\x00\x5c\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x20\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x20\x00\xff\xff\x5c\x00\x5c\x00\xff\xff\xff\xff\xff\xff\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x4c\x00\xff\xff\xff\xff\x4c\x00\x4c\x00\x4c\x00\xff\xff\xff\xff\xff\xff\x55\x00\x4c\x00\x46\x00\x55\x00\x55\x00\x55\x00\xff\xff\xff\xff\x4c\x00\xff\xff\x55\x00\xff\xff\x69\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x70\x00\x69\x00\x6a\x00\xff\xff\x6c\x00\x69\x00\x6a\x00\x6c\x00\x6c\x00\x6c\x00\xff\xff\x69\x00\x6a\x00\x75\x00\x6c\x00\x66\x00\x75\x00\x75\x00\x75\x00\x69\x00\xff\xff\x6c\x00\xff\xff\x75\x00\xff\xff\xff\xff\x70\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\x22\x00\x4c\x00\xff\xff\x0a\x00\xff\xff\x27\x00\x0d\x00\xff\xff\xff\xff\xff\xff\x55\x00\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\xff\xff\xff\xff\x4c\x00\xff\xff\xff\xff\xff\xff\x3f\x00\x69\x00\x6a\x00\x27\x00\x6c\x00\x55\x00\x45\x00\x0a\x00\xff\xff\xff\xff\x0d\x00\x4c\x00\x46\x00\x75\x00\xff\xff\xff\xff\xff\xff\xff\xff\x4c\x00\xff\xff\x55\x00\xff\xff\xff\xff\xff\xff\x0a\x00\x69\x00\x6a\x00\x0d\x00\x6c\x00\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x27\x00\x75\x00\x65\x00\x66\x00\x69\x00\x6a\x00\xff\xff\x6c\x00\x66\x00\xff\xff\xff\xff\x6e\x00\x22\x00\xff\xff\x6c\x00\x72\x00\x75\x00\x74\x00\xff\xff\x76\x00\x5c\x00\x78\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\x24\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x5c\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\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\x22\x00\xff\xff\x24\x00\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\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\x24\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\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\x2e\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x0a\x00\xff\xff\x0a\x00\x0d\x00\xff\xff\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x45\x00\xff\xff\xff\xff\xff\xff\xff\xff\x0a\x00\xff\xff\x4c\x00\x0d\x00\xff\xff\xff\xff\x0a\x00\x4c\x00\xff\xff\x0d\x00\x22\x00\x55\x00\xff\xff\x27\x00\x58\x00\x2e\x00\x55\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x65\x00\xff\xff\x27\x00\xff\xff\x69\x00\x6a\x00\xff\xff\x6c\x00\x27\x00\x69\x00\x6a\x00\x45\x00\x6c\x00\xff\xff\xff\xff\xff\xff\x75\x00\x0a\x00\x4c\x00\x78\x00\x0d\x00\x75\x00\x0a\x00\xff\xff\xff\xff\x0d\x00\x2e\x00\x55\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x5c\x00\xff\xff\x5c\x00\xff\xff\x65\x00\xff\xff\xff\xff\x27\x00\x69\x00\x6a\x00\x45\x00\x6c\x00\x27\x00\xff\xff\xff\xff\x0a\x00\x5c\x00\x4c\x00\x0d\x00\xff\xff\x75\x00\xff\xff\x5c\x00\xff\xff\xff\xff\x2e\x00\x55\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x0a\x00\xff\xff\xff\xff\x0d\x00\x4c\x00\x65\x00\xff\xff\x27\x00\x4c\x00\x69\x00\x6a\x00\x45\x00\x6c\x00\x55\x00\xff\xff\xff\xff\xff\xff\x55\x00\x4c\x00\xff\xff\xff\xff\x75\x00\x4c\x00\x5c\x00\xff\xff\xff\xff\x4c\x00\x55\x00\x5c\x00\x27\x00\xff\xff\x55\x00\x4c\x00\x69\x00\x6a\x00\x55\x00\x6c\x00\x69\x00\x6a\x00\xff\xff\x6c\x00\x55\x00\xff\xff\x65\x00\xff\xff\x75\x00\xff\xff\x69\x00\x6a\x00\x75\x00\x6c\x00\x69\x00\x6a\x00\xff\xff\x6c\x00\x69\x00\x6a\x00\x4c\x00\x6c\x00\x75\x00\x5c\x00\x69\x00\x6a\x00\x75\x00\x6c\x00\x4c\x00\x55\x00\x75\x00\xff\xff\xff\xff\xff\xff\xff\xff\x0a\x00\x75\x00\x55\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\x69\x00\x6a\x00\x0a\x00\x6c\x00\x4c\x00\x0d\x00\xff\xff\xff\xff\x69\x00\x6a\x00\xff\xff\x6c\x00\x75\x00\x55\x00\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\x75\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x27\x00\xff\xff\x69\x00\x6a\x00\x4c\x00\x6c\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x55\x00\x75\x00\xff\xff\xff\xff\x0a\x00\x4c\x00\xff\xff\x0d\x00\xff\xff\xff\xff\x0a\x00\xff\xff\xff\xff\x0d\x00\x55\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x69\x00\x6a\x00\xff\xff\x6c\x00\x5c\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x75\x00\x27\x00\x69\x00\x6a\x00\xff\xff\x6c\x00\xff\xff\x27\x00\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x2e\x00\x75\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x0a\x00\xff\xff\x4c\x00\x0d\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x55\x00\xff\xff\xff\xff\xff\xff\x0a\x00\x4c\x00\xff\xff\x0d\x00\xff\xff\x50\x00\x4c\x00\xff\xff\xff\xff\xff\xff\x55\x00\x4c\x00\x5c\x00\xff\xff\x27\x00\x55\x00\x69\x00\x6a\x00\x5c\x00\x6c\x00\x55\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x75\x00\x27\x00\x69\x00\x6a\x00\xff\xff\x6c\x00\xff\xff\x69\x00\x6a\x00\x70\x00\x6c\x00\x4c\x00\x69\x00\x6a\x00\x75\x00\x6c\x00\x4c\x00\xff\xff\xff\xff\x75\x00\x55\x00\xff\xff\xff\xff\xff\xff\x75\x00\x55\x00\x2e\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x5c\x00\x69\x00\x6a\x00\xff\xff\x6c\x00\x0a\x00\x69\x00\x6a\x00\x0d\x00\x6c\x00\xff\xff\xff\xff\xff\xff\x75\x00\xff\xff\x5c\x00\xff\xff\xff\xff\x75\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x22\x00\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x2e\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x0a\x00\xff\xff\x0a\x00\x0d\x00\xff\xff\x0d\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x0a\x00\xff\xff\xff\xff\x0d\x00\x22\x00\xff\xff\x22\x00\xff\xff\x0a\x00\x27\x00\xff\xff\x0d\x00\x0a\x00\x5c\x00\xff\xff\x0d\x00\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\x0a\x00\x27\x00\x0a\x00\x0d\x00\x0a\x00\x0d\x00\xff\xff\x0d\x00\x22\x00\x27\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x22\x00\xff\xff\xff\xff\x27\x00\xff\xff\x27\x00\x0a\x00\x27\x00\x5c\x00\x0d\x00\x5c\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\x0a\x00\x0a\x00\xff\xff\x0d\x00\x0d\x00\x5c\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x27\x00\x5c\x00\xff\xff\x0a\x00\xff\xff\x5c\x00\x0d\x00\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x27\x00\x27\x00\xff\xff\xff\xff\x5c\x00\xff\xff\x5c\x00\xff\xff\x5c\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x27\x00\xff\xff\xff\xff\xff\xff\x0a\x00\xff\xff\xff\xff\x0d\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\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\x5c\x00\x0a\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x22\x00\xff\xff\xff\xff\x0a\x00\xff\xff\x27\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3f\x00\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\x45\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\xff\xff\x55\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\xff\xff\xff\xff\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\x0a\x00\xff\xff\x0a\x00\x0d\x00\x6e\x00\x0d\x00\xff\xff\xff\xff\x72\x00\xff\xff\x74\x00\x75\x00\x76\x00\x5c\x00\x78\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x0a\x00\x22\x00\xff\xff\x0d\x00\x27\x00\xff\xff\x27\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x22\x00\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x0a\x00\xff\xff\x0a\x00\x0d\x00\x0a\x00\x0d\x00\xff\xff\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\x5c\x00\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\x0a\x00\xff\xff\x22\x00\xff\xff\x22\x00\x27\x00\xff\xff\x27\x00\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\x5c\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x22\x00\xff\xff\xff\xff\x0a\x00\xff\xff\x27\x00\x0d\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x22\x00\xff\xff\x3f\x00\xff\xff\xff\xff\x27\x00\xff\xff\x5c\x00\x45\x00\x5c\x00\xff\xff\x5c\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\x55\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\xff\xff\xff\xff\x65\x00\x66\x00\x22\x00\xff\xff\xff\xff\x0a\x00\xff\xff\x27\x00\x0d\x00\x6e\x00\xff\xff\xff\xff\xff\xff\x72\x00\xff\xff\x74\x00\x75\x00\x76\x00\x5c\x00\x78\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x0a\x00\x5c\x00\xff\xff\x0d\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\xff\xff\xff\xff\xff\xff\xff\xff\x0a\x00\x27\x00\x0a\x00\x0d\x00\x0a\x00\x0d\x00\xff\xff\x0d\x00\x5c\x00\x27\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x22\x00\xff\xff\x22\x00\x27\x00\xff\xff\x27\x00\x0a\x00\x27\x00\xff\xff\x0d\x00\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x27\x00\x5c\x00\xff\xff\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\x5c\x00\xff\xff\x5c\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x27\x00\xff\xff\xff\xff\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x27\x00\xff\xff\xff\xff\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\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\x22\x00\x0a\x00\x5c\x00\x0a\x00\x0d\x00\x27\x00\x0d\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\xff\xff\xff\xff\x22\x00\xff\xff\x22\x00\xff\xff\x3f\x00\x27\x00\x22\x00\x27\x00\xff\xff\x5c\x00\x45\x00\x27\x00\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\x3f\x00\xff\xff\xff\xff\x61\x00\x62\x00\xff\xff\x45\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x6e\x00\xff\xff\xff\xff\xff\xff\x72\x00\xff\xff\x74\x00\x5c\x00\x76\x00\x5c\x00\x78\x00\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\xff\xff\xff\xff\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x6e\x00\xff\xff\xff\xff\xff\xff\x72\x00\xff\xff\x74\x00\xff\xff\x76\x00\xff\xff\x78\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0a\x00\x22\x00\xff\xff\x0d\x00\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\x3f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x45\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\xff\xff\xff\xff\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\x0a\x00\xff\xff\xff\xff\x0d\x00\x6e\x00\xff\xff\xff\xff\xff\xff\x72\x00\x5c\x00\x74\x00\xff\xff\x76\x00\xff\xff\x78\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x0a\x00\xff\xff\xff\xff\x0d\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\xff\xff\xff\xff\xff\xff\xff\xff\x0a\x00\x27\x00\xff\xff\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\x27\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x27\x00\x5c\x00\xff\xff\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x27\x00\xff\xff\xff\xff\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x27\x00\xff\xff\xff\xff\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\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\x22\x00\xff\xff\x5c\x00\xff\xff\xff\xff\x27\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3f\x00\xff\xff\x22\x00\xff\xff\xff\xff\x5c\x00\x45\x00\x27\x00\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\x3f\x00\xff\xff\xff\xff\x61\x00\x62\x00\xff\xff\x45\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x6e\x00\xff\xff\xff\xff\xff\xff\x72\x00\xff\xff\x74\x00\xff\xff\x76\x00\xff\xff\x78\x00\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\xff\xff\xff\xff\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x6e\x00\xff\xff\xff\xff\xff\xff\x72\x00\xff\xff\x74\x00\xff\xff\x76\x00\xff\xff\x78\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x22\x00\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x45\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\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x46\x00\xff\xff\x65\x00\x66\x00\xff\xff\xff\xff\x4c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x6e\x00\xff\xff\xff\xff\xff\xff\x72\x00\xff\xff\x74\x00\xff\xff\x76\x00\xff\xff\x78\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x66\x00\xff\xff\xff\xff\x69\x00\x6a\x00\xff\xff\x6c\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\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\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x4c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x65\x00\x66\x00\x45\x00\x46\x00\x69\x00\x6a\x00\xff\xff\x6c\x00\xff\xff\x4c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x65\x00\x66\x00\x46\x00\xff\xff\x69\x00\x6a\x00\xff\xff\x6c\x00\x4c\x00\x2e\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x45\x00\xff\xff\x66\x00\xff\xff\xff\xff\x69\x00\x6a\x00\x2b\x00\x6c\x00\x2d\x00\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2b\x00\xff\xff\x2d\x00\xff\xff\x65\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x46\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x4c\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x50\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x66\x00\xff\xff\xff\xff\x69\x00\x6a\x00\xff\xff\x6c\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x70\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x50\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x2b\x00\x0a\x00\x2d\x00\x70\x00\x0d\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x22\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0a\x00\xff\xff\x22\x00\x0d\x00\xff\xff\xff\xff\xff\xff\x27\x00\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x22\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\x22\x00\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x22\x00\xff\xff\xff\xff\xff\xff\x5c\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\x5c\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\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x22\x00\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x22\x00\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3f\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\x45\x00\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\xff\xff\xff\xff\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\x0a\x00\x22\x00\xff\xff\x0d\x00\x6e\x00\xff\xff\x27\x00\xff\xff\x72\x00\xff\xff\x74\x00\xff\xff\x76\x00\xff\xff\x78\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\x22\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x45\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x55\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\xff\xff\xff\xff\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0a\x00\xff\xff\x6e\x00\x0d\x00\xff\xff\xff\xff\x72\x00\x5c\x00\x74\x00\x75\x00\x76\x00\xff\xff\x78\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x22\x00\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\x22\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x22\x00\xff\xff\xff\xff\xff\xff\x5c\x00\x27\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x22\x00\xff\xff\xff\xff\xff\xff\x5c\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\x5c\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\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x22\x00\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x22\x00\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3f\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\x45\x00\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\xff\xff\xff\xff\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\x0a\x00\x22\x00\xff\xff\x0d\x00\x6e\x00\xff\xff\x27\x00\xff\xff\x72\x00\xff\xff\x74\x00\xff\xff\x76\x00\xff\xff\x78\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\x22\x00\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\x3f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x45\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x55\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\xff\xff\xff\xff\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x6e\x00\xff\xff\xff\xff\xff\xff\x72\x00\x5c\x00\x74\x00\x75\x00\x76\x00\xff\xff\x78\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x0a\x00\xff\xff\xff\xff\x0d\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\x22\x00\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\x0a\x00\x22\x00\xff\xff\x0d\x00\xff\xff\xff\xff\x27\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\x5c\x00\xff\xff\xff\xff\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\x27\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x22\x00\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\x3f\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\x45\x00\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x55\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\xff\xff\xff\xff\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x6e\x00\xff\xff\xff\xff\xff\xff\x72\x00\xff\xff\x74\x00\x75\x00\x76\x00\xff\xff\x78\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\x22\x00\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x3f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x45\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x55\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\xff\xff\xff\xff\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x6e\x00\xff\xff\xff\xff\xff\xff\x72\x00\xff\xff\x74\x00\x75\x00\x76\x00\xff\xff\x78\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1c\x00\x1c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x24\x00\x24\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x85\x00\x85\x00\x85\x00\x85\x00\x85\x00\x85\x00\x85\x00\x6a\x00\xee\x00\xff\xff\xff\xff\xff\xff\xff\xff\x9a\x00\x9a\x00\x9a\x00\x9a\x00\x9a\x00\x9a\x00\x9a\x00\x77\x00\xee\x00\xff\xff\xff\xff\x86\x00\x86\x00\x86\x00\x86\x00\x86\x00\x86\x00\x86\x00\x86\x00\x86\x00\x86\x00\x86\x00\x86\x00\x86\x00\x86\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x9b\x00\x9b\x00\x9b\x00\x9b\x00\x9b\x00\x9b\x00\x9b\x00\x9b\x00\x9b\x00\x9b\x00\x9b\x00\x9b\x00\x9b\x00\x9b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf9\x00\xc8\x00\xbf\x00\xbf\x00\xc8\x00\xbf\x00\xc8\x00\xbf\x00\xc8\x00\xbf\x00\xc8\x00\xc8\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf9\x00\xd9\x00\xd0\x00\xd0\x00\xd9\x00\xd0\x00\xd9\x00\xd0\x00\xd9\x00\xd0\x00\xd9\x00\xd9\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf2\x00\xf2\x00\xf2\x00\xf2\x00\xf2\x00\xf2\x00\xf2\x00\xf2\x00\xf2\x00\xf2\x00\xf9\x00\xf9\x00\xf9\x00\xf9\x00\xf9\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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,327) [[],[],[(AlexAccSkip)],[(AlexAcc (alex_action_1))],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[(AlexAccSkip)],[],[],[],[],[],[],[],[(AlexAccSkip)],[],[],[],[],[],[],[(AlexAcc (alex_action_4))],[(AlexAcc (alex_action_4))],[(AlexAcc (alex_action_4))],[(AlexAcc (alex_action_5))],[(AlexAcc (alex_action_5))],[(AlexAcc (alex_action_5))],[(AlexAcc (alex_action_5))],[(AlexAcc (alex_action_5))],[(AlexAcc (alex_action_5))],[(AlexAcc (alex_action_5))],[(AlexAcc (alex_action_5))],[(AlexAcc (alex_action_5))],[(AlexAcc (alex_action_5))],[(AlexAcc (alex_action_5))],[(AlexAcc (alex_action_5))],[(AlexAcc (alex_action_5))],[(AlexAcc (alex_action_5))],[(AlexAcc (alex_action_5))],[(AlexAcc (alex_action_5))],[(AlexAcc (alex_action_5))],[(AlexAcc (alex_action_6))],[(AlexAcc (alex_action_6))],[(AlexAcc (alex_action_6))],[(AlexAcc (alex_action_6))],[(AlexAcc (alex_action_6))],[(AlexAcc (alex_action_6))],[(AlexAcc (alex_action_6))],[(AlexAcc (alex_action_6))],[(AlexAcc (alex_action_6))],[(AlexAcc (alex_action_6))],[(AlexAcc (alex_action_6))],[(AlexAcc (alex_action_6))],[(AlexAcc (alex_action_6))],[(AlexAcc (alex_action_6))],[(AlexAcc (alex_action_6))],[(AlexAcc (alex_action_6))],[(AlexAcc (alex_action_6))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[],[],[(AlexAcc (alex_action_8))],[(AlexAcc (alex_action_9))],[(AlexAcc (alex_action_9))],[(AlexAcc (alex_action_9))],[],[],[],[],[],[],[],[],[],[],[(AlexAcc (alex_action_10))],[(AlexAcc (alex_action_10))],[(AlexAcc (alex_action_10))],[],[],[],[],[],[],[],[],[],[],[(AlexAcc (alex_action_11))],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[(AlexAcc (alex_action_12))],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[(AlexAcc (alex_action_13))],[(AlexAcc (alex_action_13))],[(AlexAcc (alex_action_13))],[(AlexAcc (alex_action_13))],[(AlexAcc (alex_action_13))],[(AlexAcc (alex_action_13))],[(AlexAcc (alex_action_13))],[(AlexAcc (alex_action_26))],[],[],[],[],[],[(AlexAcc (alex_action_14))],[(AlexAcc (alex_action_14))],[(AlexAcc (alex_action_14))],[(AlexAcc (alex_action_14))],[(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_18))],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[(AlexAcc (alex_action_19))],[],[(AlexAcc (alex_action_20))],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[(AlexAcc (alex_action_21))],[(AlexAcc (alex_action_22))],[(AlexAcc (alex_action_23))],[(AlexAcc (alex_action_24))],[(AlexAcc (alex_action_25))],[(AlexAcc (alex_action_32))],[(AlexAcc (alex_action_27))],[(AlexAcc (alex_action_28))],[(AlexAcc (alex_action_29))],[(AlexAcc (alex_action_31))],[(AlexAcc (alex_action_30))],[(AlexAcc (alex_action_33))],[(AlexAcc (alex_action_34))],[(AlexAcc (alex_action_35))],[(AlexAcc (alex_action_36))],[(AlexAcc (alex_action_37))],[(AlexAcc (alex_action_39))],[(AlexAcc (alex_action_38))],[(AlexAcc (alex_action_41))],[(AlexAcc (alex_action_40))],[(AlexAcc (alex_action_42))],[(AlexAcc (alex_action_43))],[(AlexAcc (alex_action_51))],[(AlexAcc (alex_action_44))],[(AlexAcc (alex_action_45))],[(AlexAcc (alex_action_46))],[(AlexAcc (alex_action_47))],[(AlexAcc (alex_action_48))],[(AlexAcc (alex_action_49))],[(AlexAcc (alex_action_50))],[(AlexAcc (alex_action_52))],[(AlexAcc (alex_action_53))],[(AlexAcc (alex_action_54))],[(AlexAcc (alex_action_55))],[(AlexAcc (alex_action_56))],[(AlexAcc (alex_action_57))],[(AlexAcc (alex_action_58))],[(AlexAcc (alex_action_59))],[(AlexAcc (alex_action_60))],[(AlexAcc (alex_action_61))],[(AlexAcc (alex_action_62))],[(AlexAcc (alex_action_63))],[(AlexAcc (alex_action_64))],[(AlexAcc (alex_action_65))],[(AlexAcc (alex_action_66))],[]]-{-# LINE 247 "src/Language/C/Parser/Lexer.x" #-}---- Fix the 'octal' lexing of '0'-readCOctal :: String -> Either String CInteger-readCOctal s@('0':r) =- case r of- (c:_) | isDigit c -> readCInteger OctalRepr r- _ -> readCInteger DecRepr s---- We use the odd looking list of string patterns here rather than normal--- string literals since GHC converts the latter into a sequence of string--- comparisons (ie a linear search) but it translates the former using its--- effecient pattern matching which gives us the expected radix-style search.--- This gives change makes a significant performance difference.----idkwtok :: String -> Position -> P CToken-idkwtok ('a':'l':'i':'g':'n':'o':'f':[]) = tok CTokAlignof-idkwtok ('_':'_':'a':'l':'i':'g':'n':'o':'f':[]) = tok CTokAlignof-idkwtok ('_':'_':'a':'l':'i':'g':'n':'o':'f':'_':'_':[]) = tok CTokAlignof-idkwtok ('a':'s':'m':[]) = tok CTokAsm-idkwtok ('_':'_':'a':'s':'m':[]) = tok CTokAsm-idkwtok ('_':'_':'a':'s':'m':'_':'_':[]) = tok CTokAsm-idkwtok ('a':'u':'t':'o':[]) = tok CTokAuto-idkwtok ('b':'r':'e':'a':'k':[]) = tok CTokBreak-idkwtok ('_':'B':'o':'o':'l':[]) = tok CTokBool-idkwtok ('c':'a':'s':'e':[]) = tok CTokCase-idkwtok ('c':'h':'a':'r':[]) = tok CTokChar-idkwtok ('c':'o':'n':'s':'t':[]) = tok CTokConst-idkwtok ('_':'_':'c':'o':'n':'s':'t':[]) = tok CTokConst-idkwtok ('_':'_':'c':'o':'n':'s':'t':'_':'_':[]) = tok CTokConst-idkwtok ('c':'o':'n':'t':'i':'n':'u':'e':[]) = tok CTokContinue-idkwtok ('_':'C':'o':'m':'p':'l':'e':'x':[]) = tok CTokComplex-idkwtok ('_':'_':'c':'o':'m':'p':'l':'e':'x':'_':'_':[]) = tok CTokComplex-idkwtok ('d':'e':'f':'a':'u':'l':'t':[]) = tok CTokDefault-idkwtok ('d':'o':[]) = tok CTokDo-idkwtok ('d':'o':'u':'b':'l':'e':[]) = tok CTokDouble-idkwtok ('e':'l':'s':'e':[]) = tok CTokElse-idkwtok ('e':'n':'u':'m':[]) = tok CTokEnum-idkwtok ('e':'x':'t':'e':'r':'n':[]) = tok CTokExtern-idkwtok ('f':'l':'o':'a':'t':[]) = tok CTokFloat-idkwtok ('f':'o':'r':[]) = tok CTokFor-idkwtok ('g':'o':'t':'o':[]) = tok CTokGoto-idkwtok ('i':'f':[]) = tok CTokIf-idkwtok ('i':'n':'l':'i':'n':'e':[]) = tok CTokInline-idkwtok ('_':'_':'i':'n':'l':'i':'n':'e':[]) = tok CTokInline-idkwtok ('_':'_':'i':'n':'l':'i':'n':'e':'_':'_':[]) = tok CTokInline-idkwtok ('i':'n':'t':[]) = tok CTokInt-idkwtok ('l':'o':'n':'g':[]) = tok CTokLong-idkwtok ('r':'e':'g':'i':'s':'t':'e':'r':[]) = tok CTokRegister-idkwtok ('r':'e':'s':'t':'r':'i':'c':'t':[]) = tok CTokRestrict-idkwtok ('_':'_':'r':'e':'s':'t':'r':'i':'c':'t':[]) = tok CTokRestrict-idkwtok ('_':'_':'r':'e':'s':'t':'r':'i':'c':'t':'_':'_':[]) = tok CTokRestrict-idkwtok ('r':'e':'t':'u':'r':'n':[]) = tok CTokReturn-idkwtok ('s':'h':'o':'r':'t':[]) = tok CTokShort-idkwtok ('s':'i':'g':'n':'e':'d':[]) = tok CTokSigned-idkwtok ('_':'_':'s':'i':'g':'n':'e':'d':[]) = tok CTokSigned-idkwtok ('_':'_':'s':'i':'g':'n':'e':'d':'_':'_':[]) = tok CTokSigned-idkwtok ('s':'i':'z':'e':'o':'f':[]) = tok CTokSizeof-idkwtok ('s':'t':'a':'t':'i':'c':[]) = tok CTokStatic-idkwtok ('s':'t':'r':'u':'c':'t':[]) = tok CTokStruct-idkwtok ('s':'w':'i':'t':'c':'h':[]) = tok CTokSwitch-idkwtok ('t':'y':'p':'e':'d':'e':'f':[]) = tok CTokTypedef-idkwtok ('t':'y':'p':'e':'o':'f':[]) = tok CTokTypeof-idkwtok ('_':'_':'t':'y':'p':'e':'o':'f':[]) = tok CTokTypeof-idkwtok ('_':'_':'t':'y':'p':'e':'o':'f':'_':'_':[]) = tok CTokTypeof-idkwtok ('_':'_':'t':'h':'r':'e':'a':'d':[]) = tok CTokThread-idkwtok ('u':'n':'i':'o':'n':[]) = tok CTokUnion-idkwtok ('u':'n':'s':'i':'g':'n':'e':'d':[]) = tok CTokUnsigned-idkwtok ('v':'o':'i':'d':[]) = tok CTokVoid-idkwtok ('v':'o':'l':'a':'t':'i':'l':'e':[]) = tok CTokVolatile-idkwtok ('_':'_':'v':'o':'l':'a':'t':'i':'l':'e':[]) = tok CTokVolatile-idkwtok ('_':'_':'v':'o':'l':'a':'t':'i':'l':'e':'_':'_':[]) = tok CTokVolatile-idkwtok ('w':'h':'i':'l':'e':[]) = tok CTokWhile-idkwtok ('_':'_':'l':'a':'b':'e':'l':'_':'_':[]) = tok CTokLabel-idkwtok ('_':'_':'a':'t':'t':'r':'i':'b':'u':'t':'e':[]) = tok (CTokGnuC GnuCAttrTok)-idkwtok ('_':'_':'a':'t':'t':'r':'i':'b':'u':'t':'e':'_':'_':[]) = tok (CTokGnuC GnuCAttrTok)-idkwtok ('_':'_':'e':'x':'t':'e':'n':'s':'i':'o':'n':'_':'_':[]) = tok (CTokGnuC GnuCExtTok)-idkwtok ('_':'_':'r':'e':'a':'l':[]) = tok (CTokGnuC GnuCComplexReal)-idkwtok ('_':'_':'r':'e':'a':'l':'_':'_':[]) = tok (CTokGnuC GnuCComplexReal)-idkwtok ('_':'_':'i':'m':'a':'g':[]) = tok (CTokGnuC GnuCComplexImag)-idkwtok ('_':'_':'i':'m':'a':'g':'_':'_':[]) = tok (CTokGnuC GnuCComplexImag)-idkwtok ('_':'_':'b':'u':'i':'l':'t':'i':'n':'_':rest)- | rest == "va_arg" = tok (CTokGnuC GnuCVaArg)- | rest == "offsetof" = tok (CTokGnuC GnuCOffsetof)- | rest == "types_compatible_p" = tok (CTokGnuC GnuCTyCompat)--idkwtok cs = \pos -> do- name <- getNewName- let ident = mkIdent pos cs name- tyident <- isTypeIdent ident- if tyident- then return (CTokTyIdent pos ident)- else return (CTokIdent pos ident)--ignoreAttribute :: P ()-ignoreAttribute = skipTokens (0::Int)- where skipTokens :: Int -> P ()- skipTokens n = do- tok <- lexToken- case tok of- CTokRParen _ | n == 1 -> return ()- | otherwise -> skipTokens (n-1)- CTokLParen _ -> skipTokens (n+1)- _ -> skipTokens n--tok :: (Position -> CToken) -> Position -> P CToken-tok tc pos = return (tc pos)--linePragmaAdjust :: String -> Position -> Position-linePragmaAdjust str p@(Position fname row _) = Position fname' row' 1- where- str' = dropWhite . drop 1 $ str- (rowStr, str'') = span isDigit str'- row' = read rowStr- str''' = dropWhite str''- fnameStr = takeWhile (/= '"') . drop 1 $ str'''- fname' | null str''' || head str''' /= '"' = fname- -- try and get more sharing of file name strings- | fnameStr == fname = fname- | otherwise = fnameStr- --- dropWhite = dropWhile (\c -> c == ' ' || c == '\t')---- special utility for the lexer-unescapeMultiChars :: String -> [Char]-unescapeMultiChars cs@(_ : _ : _) = case unescapeChar cs of (c,cs') -> c : unescapeMultiChars cs'-unescapeMultiChars ('\'' : []) = []-unescapeMultiChars _ = error "Unexpected end of multi-char constant"--{-# INLINE token_ #-}--- token that ignores the string-token_ :: (Position -> CToken) -> Position -> Int -> InputStream -> P CToken-token_ tok pos _ _ = return (tok pos)--{-# INLINE token_fail #-}--- error token-token_fail :: String -> Position ->- Int -> InputStream -> P CToken-token_fail errmsg pos _ _ = failP pos [ "Lexical Error !", errmsg ]---{-# INLINE token #-}--- token that uses the string-token :: (Position -> a -> CToken) -> (String -> a)- -> Position -> Int -> InputStream -> P CToken-token tok read pos len str = return (tok pos (read $ takeChars len str))--{-# INLINE token_plus #-}--- token that may fail-token_plus :: (Position -> a -> CToken) -> (String -> Either String a)- -> Position -> Int -> InputStream -> P CToken-token_plus tok read pos len str =- case read (takeChars len str) of Left err -> failP pos [ "Lexical error ! ", err ]- Right ok -> return $! tok pos ok---- -------------------------------------------------------------------------------- The input type--type AlexInput = (Position, -- current position,- InputStream) -- current input string--alexInputPrevChar :: AlexInput -> Char-alexInputPrevChar _ = error "alexInputPrevChar not used"--alexGetChar :: AlexInput -> Maybe (Char,AlexInput)-alexGetChar (p,is) | inputStreamEmpty is = Nothing- | otherwise = let (c,s) = takeChar is in- let p' = alexMove p c in p' `seq`- Just (c, (p', s))--alexMove :: Position -> Char -> Position-alexMove (Position f l c) ' ' = Position f l (c+1)-alexMove (Position f l c) '\n' = Position f (l+1) 1-alexMove (Position f l c) '\t' = Position f l (((c+7) `div` 8)*8+1)-alexMove p '\r' = p-alexMove (Position f l c) _ = Position f l (c+1)--lexicalError :: P a-lexicalError = do- pos <- getPos- (c,cs) <- liftM takeChar getInput- failP pos- ["Lexical error !",- "The character " ++ show c ++ " does not fit here."]--parseError :: P a-parseError = do- tok <- getLastToken- failP (posOf tok)- ["Syntax error !",- "The symbol `" ++ show tok ++ "' does not fit here."]--lexToken :: P CToken-lexToken = do- pos <- getPos- inp <- getInput- case alexScan (pos, inp) 0 of- AlexEOF -> return CTokEof- AlexError inp' -> lexicalError- AlexSkip (pos', inp') len -> do- setPos pos'- setInput inp'- lexToken- AlexToken (pos', inp') len action -> do- setPos pos'- setInput inp'- tok <- action pos len inp- setLastToken tok- return tok--lexC :: (CToken -> P a) -> P a-lexC cont = do- tok <- lexToken- cont tok--alex_action_1 = \pos len str -> setPos (linePragmaAdjust (takeChars len str) pos) >> lexToken -alex_action_4 = \pos len str -> idkwtok (takeChars len str) pos -alex_action_5 = token_plus CTokILit readCOctal -alex_action_6 = token_plus CTokILit (readCInteger DecRepr) -alex_action_7 = token_plus CTokILit (readCInteger HexRepr . drop 2) -alex_action_8 = token_fail "Invalid integer constant suffix" -alex_action_9 = token CTokCLit (cChar . fst . unescapeChar . tail) -alex_action_10 = token CTokCLit (cChar_w . fst . unescapeChar . tail . tail) -alex_action_11 = token CTokCLit (flip cChars False . unescapeMultiChars .tail) -alex_action_12 = token CTokCLit (flip cChars True . unescapeMultiChars . tail . tail) -alex_action_13 = token CTokFLit readCFloat -alex_action_14 = token CTokFLit readCFloat -alex_action_15 = token_fail "Hexadecimal floating constant requires an exponent" -alex_action_16 = token CTokSLit (cString . unescapeString . init . tail) -alex_action_17 = token CTokSLit (cString_w . unescapeString . init . tail . tail) -alex_action_18 = token_fail "Universal character names are unsupported" -alex_action_19 = token_fail "Invalid escape sequence" -alex_action_20 = token_fail "Universal character names in string literals are unsupported"-alex_action_21 = token_ CTokLParen -alex_action_22 = token_ CTokRParen -alex_action_23 = token_ CTokLBracket -alex_action_24 = token_ CTokRBracket -alex_action_25 = token_ CTokArrow -alex_action_26 = token_ CTokDot -alex_action_27 = token_ CTokExclam -alex_action_28 = token_ CTokTilde -alex_action_29 = token_ CTokInc -alex_action_30 = token_ CTokDec -alex_action_31 = token_ CTokPlus -alex_action_32 = token_ CTokMinus -alex_action_33 = token_ CTokStar -alex_action_34 = token_ CTokSlash -alex_action_35 = token_ CTokPercent -alex_action_36 = token_ CTokAmper -alex_action_37 = token_ CTokShiftL -alex_action_38 = token_ CTokShiftR -alex_action_39 = token_ CTokLess -alex_action_40 = token_ CTokLessEq -alex_action_41 = token_ CTokHigh -alex_action_42 = token_ CTokHighEq -alex_action_43 = token_ CTokEqual -alex_action_44 = token_ CTokUnequal -alex_action_45 = token_ CTokHat -alex_action_46 = token_ CTokBar -alex_action_47 = token_ CTokAnd -alex_action_48 = token_ CTokOr -alex_action_49 = token_ CTokQuest -alex_action_50 = token_ CTokColon -alex_action_51 = token_ CTokAssign -alex_action_52 = token_ CTokPlusAss -alex_action_53 = token_ CTokMinusAss -alex_action_54 = token_ CTokStarAss -alex_action_55 = token_ CTokSlashAss -alex_action_56 = token_ CTokPercAss -alex_action_57 = token_ CTokAmpAss -alex_action_58 = token_ CTokHatAss -alex_action_59 = token_ CTokBarAss -alex_action_60 = token_ CTokSLAss -alex_action_61 = token_ CTokSRAss -alex_action_62 = token_ CTokComma -alex_action_63 = token_ CTokSemic -alex_action_64 = token_ CTokLBrace -alex_action_65 = token_ CTokRBrace -alex_action_66 = token_ CTokEllipsis -{-# LINE 1 "templates/GenericTemplate.hs" #-}-{-# LINE 1 "templates/GenericTemplate.hs" #-}-{-# LINE 1 "<built-in>" #-}-{-# LINE 1 "<command line>" #-}-{-# LINE 1 "templates/GenericTemplate.hs" #-}--- -------------------------------------------------------------------------------- ALEX TEMPLATE------ This code is in the PUBLIC DOMAIN; you may copy it freely and use--- it for any purpose whatsoever.---- -------------------------------------------------------------------------------- INTERNALS and main scanner engine--{-# LINE 35 "templates/GenericTemplate.hs" #-}--{-# LINE 45 "templates/GenericTemplate.hs" #-}---data AlexAddr = AlexA# Addr#--#if __GLASGOW_HASKELL__ < 503-uncheckedShiftL# = shiftL#-#endif--{-# INLINE alexIndexInt16OffAddr #-}-alexIndexInt16OffAddr (AlexA# arr) off =-#ifdef WORDS_BIGENDIAN- narrow16Int# i- where- i = word2Int# ((high `uncheckedShiftL#` 8#) `or#` low)- high = int2Word# (ord# (indexCharOffAddr# arr (off' +# 1#)))- low = int2Word# (ord# (indexCharOffAddr# arr off'))- off' = off *# 2#-#else- indexInt16OffAddr# arr off-#endif------{-# INLINE alexIndexInt32OffAddr #-}-alexIndexInt32OffAddr (AlexA# arr) off = -#ifdef WORDS_BIGENDIAN- narrow32Int# i- where- i = word2Int# ((b3 `uncheckedShiftL#` 24#) `or#`- (b2 `uncheckedShiftL#` 16#) `or#`- (b1 `uncheckedShiftL#` 8#) `or#` b0)- b3 = int2Word# (ord# (indexCharOffAddr# arr (off' +# 3#)))- b2 = int2Word# (ord# (indexCharOffAddr# arr (off' +# 2#)))- b1 = int2Word# (ord# (indexCharOffAddr# arr (off' +# 1#)))- b0 = int2Word# (ord# (indexCharOffAddr# arr off'))- off' = off *# 4#-#else- indexInt32OffAddr# arr off-#endif------#if __GLASGOW_HASKELL__ < 503-quickIndex arr i = arr ! i-#else--- GHC >= 503, unsafeAt is available from Data.Array.Base.-quickIndex = unsafeAt-#endif------- -------------------------------------------------------------------------------- Main lexing routines--data AlexReturn a- = AlexEOF- | AlexError !AlexInput- | AlexSkip !AlexInput !Int- | AlexToken !AlexInput !Int a---- alexScan :: AlexInput -> StartCode -> AlexReturn a-alexScan input (I# (sc))- = alexScanUser undefined input (I# (sc))--alexScanUser user input (I# (sc))- = case alex_scan_tkn user input 0# input sc AlexNone of- (AlexNone, input') ->- case alexGetChar input of- Nothing -> ---- AlexEOF- Just _ ->---- AlexError input'-- (AlexLastSkip input len, _) ->---- AlexSkip input len-- (AlexLastAcc k input len, _) ->---- AlexToken input len k----- Push the input through the DFA, remembering the most recent accepting--- state it encountered.--alex_scan_tkn user orig_input len input s last_acc =- input `seq` -- strict in the input- let - new_acc = check_accs (alex_accept `quickIndex` (I# (s)))- in- new_acc `seq`- case alexGetChar input of- Nothing -> (new_acc, input)- Just (c, new_input) -> ---- let- base = alexIndexInt32OffAddr alex_base s- (I# (ord_c)) = ord c- offset = (base +# ord_c)- check = alexIndexInt16OffAddr alex_check offset- - new_s = if (offset >=# 0#) && (check ==# ord_c)- then alexIndexInt16OffAddr alex_table offset- else alexIndexInt16OffAddr alex_deflt s- in- case new_s of - -1# -> (new_acc, input)- -- on an error, we want to keep the input *before* the- -- character that failed, not after.- _ -> alex_scan_tkn user orig_input (len +# 1#) - new_input new_s new_acc-- where- check_accs [] = last_acc- check_accs (AlexAcc a : _) = AlexLastAcc a input (I# (len))- check_accs (AlexAccSkip : _) = AlexLastSkip input (I# (len))- check_accs (AlexAccPred a pred : rest)- | pred user orig_input (I# (len)) input- = AlexLastAcc a input (I# (len))- check_accs (AlexAccSkipPred pred : rest)- | pred user orig_input (I# (len)) input- = AlexLastSkip input (I# (len))- check_accs (_ : rest) = check_accs rest--data AlexLastAcc a- = AlexNone- | AlexLastAcc a !AlexInput !Int- | AlexLastSkip !AlexInput !Int--data AlexAcc a user- = AlexAcc a- | AlexAccSkip- | AlexAccPred a (AlexAccPred user)- | AlexAccSkipPred (AlexAccPred user)--type AlexAccPred user = user -> AlexInput -> Int -> AlexInput -> Bool---- -------------------------------------------------------------------------------- Predicates on a rule--alexAndPred p1 p2 user in1 len in2- = p1 user in1 len in2 && p2 user in1 len in2----alexPrevCharIsPred :: Char -> AlexAccPred _ -alexPrevCharIs c _ input _ _ = c == alexInputPrevChar input----alexPrevCharIsOneOfPred :: Array Char Bool -> AlexAccPred _ -alexPrevCharIsOneOf arr _ input _ _ = arr ! alexInputPrevChar input----alexRightContext :: Int -> AlexAccPred _-alexRightContext (I# (sc)) user _ _ input = - case alex_scan_tkn user input 0# input sc AlexNone of- (AlexNone, _) -> False- _ -> True- -- TODO: there's no need to find the longest- -- match when checking the right context, just- -- the first match will do.---- used by wrappers-iUnbox (I# (i)) = i
− dist/build/Language/C/Parser/Parser.hs
@@ -1,6337 +0,0 @@-{-# OPTIONS_GHC -fno-warn-overlapping-patterns #-}-{-# OPTIONS -fglasgow-exts -cpp #-}-module Language.C.Parser.Parser (- -- * Parse a C translation unit- parseC,- -- * Exposed Parsers- translUnitP, extDeclP, statementP, expressionP-) where---- Relevant C99 sections:------ 6.5 Expressions .1 - .17 and 6.6 (almost literally)--- Supported GNU extensions:--- - Allow a compound statement as an expression--- - Various __builtin_* forms that take type parameters--- - `alignof' expression or type--- - `__extension__' to suppress warnings about extensions--- - Allow taking address of a label with: && label--- - Omitting the `then' part of conditional expressions--- - complex numbers------ 6.7 C Declarations .1 -.8--- Supported GNU extensions:--- - '__thread' thread local storage (6.7.1)------ 6.8 Statements .1 - .8--- Supported GNU extensions:--- - case ranges (C99 6.8.1)--- - '__label__ ident;' declarations (C99 6.8.2)--- - computed gotos (C99 6.8.6)------ 6.9 Translation unit--- Supported GNU extensions:--- - allow empty translation_unit--- - allow redundant ';'--- - allow extension keyword before external declaration--- - asm definitions------ Since some of the grammar productions are quite difficult to read,--- (especially those involved with the decleration syntax) we document them--- with an extended syntax that allows a more consise representation:------ Ordinary rules------ foo named terminal or non-terminal------ 'c' terminal, literal character token------ A B concatenation------ A | B alternation------ (A) grouping------ Extended rules------ A? optional, short hand for (A|) or [A]{ 0==A || 1==A }------ ... stands for some part of the grammar omitted for clarity------ {A} represents sequences, 0 or more.------ <permute> modifier which states that any permutation of the immediate subterms is valid---------- TODO ---------------------------------------------------------------------------- !* We ignore the C99 static keyword (see C99 6.7.5.3)--- !* We do not distinguish in the AST between incomplete array types and--- complete variable length arrays ([ '*' ] means the latter). (see C99 6.7.5.2)--- !* The AST doesn't allow recording __attribute__ of unnamed struct field--- (see , struct_default_declaring_list, struct_identifier_declarator)--- !* see `We're being far to liberal here' (... struct definition within structs)--- * Documentation isn't complete and consistent yet.--import Prelude hiding (reverse)-import qualified Data.List as List--import Language.C.Parser.Builtin (builtinTypeNames)-import Language.C.Parser.Lexer (lexC, parseError)-import Language.C.Parser.Tokens (CToken(..), GnuCTok(..))-import Language.C.Parser.ParserMonad (P, failP, execParser, getNewName, addTypedef, shadowTypedef,- enterScope, leaveScope, ParseError(..))--import Language.C.Data.RList-import Language.C.Data.InputStream-import Language.C.Data.Ident-import Language.C.Data.Name-import Language.C.Data.Node-import Language.C.Data.Position-import Language.C.Syntax-#if __GLASGOW_HASKELL__ >= 503-import qualified Data.Array as Happy_Data_Array-#else-import qualified Array as Happy_Data_Array-#endif-#if __GLASGOW_HASKELL__ >= 503-import qualified GHC.Exts as Happy_GHC_Exts-#else-import qualified GlaExts as Happy_GHC_Exts-#endif---- parser produced by Happy Version 1.18.4--newtype HappyAbsSyn = HappyAbsSyn HappyAny-#if __GLASGOW_HASKELL__ >= 607-type HappyAny = Happy_GHC_Exts.Any-#else-type HappyAny = forall a . a-#endif-happyIn7 :: (CTranslUnit) -> (HappyAbsSyn )-happyIn7 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn7 #-}-happyOut7 :: (HappyAbsSyn ) -> (CTranslUnit)-happyOut7 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut7 #-}-happyIn8 :: (Reversed [CExtDecl]) -> (HappyAbsSyn )-happyIn8 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn8 #-}-happyOut8 :: (HappyAbsSyn ) -> (Reversed [CExtDecl])-happyOut8 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut8 #-}-happyIn9 :: (CExtDecl) -> (HappyAbsSyn )-happyIn9 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn9 #-}-happyOut9 :: (HappyAbsSyn ) -> (CExtDecl)-happyOut9 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut9 #-}-happyIn10 :: (CFunDef) -> (HappyAbsSyn )-happyIn10 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn10 #-}-happyOut10 :: (HappyAbsSyn ) -> (CFunDef)-happyOut10 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut10 #-}-happyIn11 :: (CDeclr) -> (HappyAbsSyn )-happyIn11 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn11 #-}-happyOut11 :: (HappyAbsSyn ) -> (CDeclr)-happyOut11 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut11 #-}-happyIn12 :: (CStat) -> (HappyAbsSyn )-happyIn12 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn12 #-}-happyOut12 :: (HappyAbsSyn ) -> (CStat)-happyOut12 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut12 #-}-happyIn13 :: (CStat) -> (HappyAbsSyn )-happyIn13 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn13 #-}-happyOut13 :: (HappyAbsSyn ) -> (CStat)-happyOut13 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut13 #-}-happyIn14 :: (CStat) -> (HappyAbsSyn )-happyIn14 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn14 #-}-happyOut14 :: (HappyAbsSyn ) -> (CStat)-happyOut14 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut14 #-}-happyIn15 :: (()) -> (HappyAbsSyn )-happyIn15 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn15 #-}-happyOut15 :: (HappyAbsSyn ) -> (())-happyOut15 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut15 #-}-happyIn16 :: (()) -> (HappyAbsSyn )-happyIn16 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn16 #-}-happyOut16 :: (HappyAbsSyn ) -> (())-happyOut16 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut16 #-}-happyIn17 :: (Reversed [CBlockItem]) -> (HappyAbsSyn )-happyIn17 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn17 #-}-happyOut17 :: (HappyAbsSyn ) -> (Reversed [CBlockItem])-happyOut17 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut17 #-}-happyIn18 :: (CBlockItem) -> (HappyAbsSyn )-happyIn18 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn18 #-}-happyOut18 :: (HappyAbsSyn ) -> (CBlockItem)-happyOut18 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut18 #-}-happyIn19 :: (CBlockItem) -> (HappyAbsSyn )-happyIn19 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn19 #-}-happyOut19 :: (HappyAbsSyn ) -> (CBlockItem)-happyOut19 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut19 #-}-happyIn20 :: (CFunDef) -> (HappyAbsSyn )-happyIn20 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn20 #-}-happyOut20 :: (HappyAbsSyn ) -> (CFunDef)-happyOut20 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut20 #-}-happyIn21 :: (Reversed [Ident]) -> (HappyAbsSyn )-happyIn21 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn21 #-}-happyOut21 :: (HappyAbsSyn ) -> (Reversed [Ident])-happyOut21 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut21 #-}-happyIn22 :: (CStat) -> (HappyAbsSyn )-happyIn22 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn22 #-}-happyOut22 :: (HappyAbsSyn ) -> (CStat)-happyOut22 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut22 #-}-happyIn23 :: (CStat) -> (HappyAbsSyn )-happyIn23 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn23 #-}-happyOut23 :: (HappyAbsSyn ) -> (CStat)-happyOut23 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut23 #-}-happyIn24 :: (CStat) -> (HappyAbsSyn )-happyIn24 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn24 #-}-happyOut24 :: (HappyAbsSyn ) -> (CStat)-happyOut24 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut24 #-}-happyIn25 :: (CStat) -> (HappyAbsSyn )-happyIn25 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn25 #-}-happyOut25 :: (HappyAbsSyn ) -> (CStat)-happyOut25 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut25 #-}-happyIn26 :: (CAsmStmt) -> (HappyAbsSyn )-happyIn26 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn26 #-}-happyOut26 :: (HappyAbsSyn ) -> (CAsmStmt)-happyOut26 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut26 #-}-happyIn27 :: (Maybe CTypeQual) -> (HappyAbsSyn )-happyIn27 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn27 #-}-happyOut27 :: (HappyAbsSyn ) -> (Maybe CTypeQual)-happyOut27 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut27 #-}-happyIn28 :: ([CAsmOperand]) -> (HappyAbsSyn )-happyIn28 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn28 #-}-happyOut28 :: (HappyAbsSyn ) -> ([CAsmOperand])-happyOut28 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut28 #-}-happyIn29 :: (Reversed [CAsmOperand]) -> (HappyAbsSyn )-happyIn29 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn29 #-}-happyOut29 :: (HappyAbsSyn ) -> (Reversed [CAsmOperand])-happyOut29 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut29 #-}-happyIn30 :: (CAsmOperand) -> (HappyAbsSyn )-happyIn30 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn30 #-}-happyOut30 :: (HappyAbsSyn ) -> (CAsmOperand)-happyOut30 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut30 #-}-happyIn31 :: (Reversed [CStrLit]) -> (HappyAbsSyn )-happyIn31 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn31 #-}-happyOut31 :: (HappyAbsSyn ) -> (Reversed [CStrLit])-happyOut31 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut31 #-}-happyIn32 :: (CDecl) -> (HappyAbsSyn )-happyIn32 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn32 #-}-happyOut32 :: (HappyAbsSyn ) -> (CDecl)-happyOut32 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut32 #-}-happyIn33 :: (Reversed [CDecl]) -> (HappyAbsSyn )-happyIn33 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn33 #-}-happyOut33 :: (HappyAbsSyn ) -> (Reversed [CDecl])-happyOut33 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut33 #-}-happyIn34 :: (CDecl) -> (HappyAbsSyn )-happyIn34 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn34 #-}-happyOut34 :: (HappyAbsSyn ) -> (CDecl)-happyOut34 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut34 #-}-happyIn35 :: ((Maybe CStrLit, [CAttr])) -> (HappyAbsSyn )-happyIn35 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn35 #-}-happyOut35 :: (HappyAbsSyn ) -> ((Maybe CStrLit, [CAttr]))-happyOut35 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut35 #-}-happyIn36 :: (CDecl) -> (HappyAbsSyn )-happyIn36 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn36 #-}-happyOut36 :: (HappyAbsSyn ) -> (CDecl)-happyOut36 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut36 #-}-happyIn37 :: ([CDeclSpec]) -> (HappyAbsSyn )-happyIn37 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn37 #-}-happyOut37 :: (HappyAbsSyn ) -> ([CDeclSpec])-happyOut37 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut37 #-}-happyIn38 :: (Reversed [CDeclSpec]) -> (HappyAbsSyn )-happyIn38 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn38 #-}-happyOut38 :: (HappyAbsSyn ) -> (Reversed [CDeclSpec])-happyOut38 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut38 #-}-happyIn39 :: (CDeclSpec) -> (HappyAbsSyn )-happyIn39 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn39 #-}-happyOut39 :: (HappyAbsSyn ) -> (CDeclSpec)-happyOut39 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut39 #-}-happyIn40 :: (CStorageSpec) -> (HappyAbsSyn )-happyIn40 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn40 #-}-happyOut40 :: (HappyAbsSyn ) -> (CStorageSpec)-happyOut40 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut40 #-}-happyIn41 :: ([CDeclSpec]) -> (HappyAbsSyn )-happyIn41 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn41 #-}-happyOut41 :: (HappyAbsSyn ) -> ([CDeclSpec])-happyOut41 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut41 #-}-happyIn42 :: (CTypeSpec) -> (HappyAbsSyn )-happyIn42 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn42 #-}-happyOut42 :: (HappyAbsSyn ) -> (CTypeSpec)-happyOut42 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut42 #-}-happyIn43 :: (Reversed [CDeclSpec]) -> (HappyAbsSyn )-happyIn43 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn43 #-}-happyOut43 :: (HappyAbsSyn ) -> (Reversed [CDeclSpec])-happyOut43 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut43 #-}-happyIn44 :: (Reversed [CDeclSpec]) -> (HappyAbsSyn )-happyIn44 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn44 #-}-happyOut44 :: (HappyAbsSyn ) -> (Reversed [CDeclSpec])-happyOut44 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut44 #-}-happyIn45 :: (Reversed [CDeclSpec]) -> (HappyAbsSyn )-happyIn45 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn45 #-}-happyOut45 :: (HappyAbsSyn ) -> (Reversed [CDeclSpec])-happyOut45 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut45 #-}-happyIn46 :: (Reversed [CDeclSpec]) -> (HappyAbsSyn )-happyIn46 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn46 #-}-happyOut46 :: (HappyAbsSyn ) -> (Reversed [CDeclSpec])-happyOut46 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut46 #-}-happyIn47 :: (Reversed [CDeclSpec]) -> (HappyAbsSyn )-happyIn47 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn47 #-}-happyOut47 :: (HappyAbsSyn ) -> (Reversed [CDeclSpec])-happyOut47 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut47 #-}-happyIn48 :: (Reversed [CDeclSpec]) -> (HappyAbsSyn )-happyIn48 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn48 #-}-happyOut48 :: (HappyAbsSyn ) -> (Reversed [CDeclSpec])-happyOut48 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut48 #-}-happyIn49 :: (CTypeSpec) -> (HappyAbsSyn )-happyIn49 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn49 #-}-happyOut49 :: (HappyAbsSyn ) -> (CTypeSpec)-happyOut49 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut49 #-}-happyIn50 :: (CStructUnion) -> (HappyAbsSyn )-happyIn50 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn50 #-}-happyOut50 :: (HappyAbsSyn ) -> (CStructUnion)-happyOut50 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut50 #-}-happyIn51 :: (Located CStructTag) -> (HappyAbsSyn )-happyIn51 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn51 #-}-happyOut51 :: (HappyAbsSyn ) -> (Located CStructTag)-happyOut51 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut51 #-}-happyIn52 :: (Reversed [CDecl]) -> (HappyAbsSyn )-happyIn52 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn52 #-}-happyOut52 :: (HappyAbsSyn ) -> (Reversed [CDecl])-happyOut52 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut52 #-}-happyIn53 :: (CDecl) -> (HappyAbsSyn )-happyIn53 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn53 #-}-happyOut53 :: (HappyAbsSyn ) -> (CDecl)-happyOut53 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut53 #-}-happyIn54 :: (CDecl) -> (HappyAbsSyn )-happyIn54 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn54 #-}-happyOut54 :: (HappyAbsSyn ) -> (CDecl)-happyOut54 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut54 #-}-happyIn55 :: (CDecl) -> (HappyAbsSyn )-happyIn55 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn55 #-}-happyOut55 :: (HappyAbsSyn ) -> (CDecl)-happyOut55 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut55 #-}-happyIn56 :: ((Maybe CDeclr, Maybe CExpr)) -> (HappyAbsSyn )-happyIn56 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn56 #-}-happyOut56 :: (HappyAbsSyn ) -> ((Maybe CDeclr, Maybe CExpr))-happyOut56 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut56 #-}-happyIn57 :: ((Maybe CDeclr, Maybe CExpr)) -> (HappyAbsSyn )-happyIn57 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn57 #-}-happyOut57 :: (HappyAbsSyn ) -> ((Maybe CDeclr, Maybe CExpr))-happyOut57 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut57 #-}-happyIn58 :: (CEnum) -> (HappyAbsSyn )-happyIn58 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn58 #-}-happyOut58 :: (HappyAbsSyn ) -> (CEnum)-happyOut58 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut58 #-}-happyIn59 :: (Reversed [(Ident, Maybe CExpr)]) -> (HappyAbsSyn )-happyIn59 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn59 #-}-happyOut59 :: (HappyAbsSyn ) -> (Reversed [(Ident, Maybe CExpr)])-happyOut59 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut59 #-}-happyIn60 :: ((Ident, Maybe CExpr)) -> (HappyAbsSyn )-happyIn60 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn60 #-}-happyOut60 :: (HappyAbsSyn ) -> ((Ident, Maybe CExpr))-happyOut60 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut60 #-}-happyIn61 :: (CTypeQual) -> (HappyAbsSyn )-happyIn61 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn61 #-}-happyOut61 :: (HappyAbsSyn ) -> (CTypeQual)-happyOut61 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut61 #-}-happyIn62 :: (Reversed [CTypeQual]) -> (HappyAbsSyn )-happyIn62 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn62 #-}-happyOut62 :: (HappyAbsSyn ) -> (Reversed [CTypeQual])-happyOut62 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut62 #-}-happyIn63 :: (CDeclrR) -> (HappyAbsSyn )-happyIn63 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn63 #-}-happyOut63 :: (HappyAbsSyn ) -> (CDeclrR)-happyOut63 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut63 #-}-happyIn64 :: (Maybe CStrLit) -> (HappyAbsSyn )-happyIn64 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn64 #-}-happyOut64 :: (HappyAbsSyn ) -> (Maybe CStrLit)-happyOut64 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut64 #-}-happyIn65 :: (CDeclrR) -> (HappyAbsSyn )-happyIn65 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn65 #-}-happyOut65 :: (HappyAbsSyn ) -> (CDeclrR)-happyOut65 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut65 #-}-happyIn66 :: (CDeclrR) -> (HappyAbsSyn )-happyIn66 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn66 #-}-happyOut66 :: (HappyAbsSyn ) -> (CDeclrR)-happyOut66 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut66 #-}-happyIn67 :: (CDeclrR) -> (HappyAbsSyn )-happyIn67 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn67 #-}-happyOut67 :: (HappyAbsSyn ) -> (CDeclrR)-happyOut67 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut67 #-}-happyIn68 :: (CDeclrR) -> (HappyAbsSyn )-happyIn68 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn68 #-}-happyOut68 :: (HappyAbsSyn ) -> (CDeclrR)-happyOut68 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut68 #-}-happyIn69 :: (CDeclrR) -> (HappyAbsSyn )-happyIn69 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn69 #-}-happyOut69 :: (HappyAbsSyn ) -> (CDeclrR)-happyOut69 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut69 #-}-happyIn70 :: (CDeclrR) -> (HappyAbsSyn )-happyIn70 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn70 #-}-happyOut70 :: (HappyAbsSyn ) -> (CDeclrR)-happyOut70 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut70 #-}-happyIn71 :: (CDeclrR) -> (HappyAbsSyn )-happyIn71 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn71 #-}-happyOut71 :: (HappyAbsSyn ) -> (CDeclrR)-happyOut71 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut71 #-}-happyIn72 :: (CDeclrR) -> (HappyAbsSyn )-happyIn72 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn72 #-}-happyOut72 :: (HappyAbsSyn ) -> (CDeclrR)-happyOut72 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut72 #-}-happyIn73 :: (CDeclrR) -> (HappyAbsSyn )-happyIn73 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn73 #-}-happyOut73 :: (HappyAbsSyn ) -> (CDeclrR)-happyOut73 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut73 #-}-happyIn74 :: (CDeclrR) -> (HappyAbsSyn )-happyIn74 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn74 #-}-happyOut74 :: (HappyAbsSyn ) -> (CDeclrR)-happyOut74 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut74 #-}-happyIn75 :: (CDeclrR) -> (HappyAbsSyn )-happyIn75 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn75 #-}-happyOut75 :: (HappyAbsSyn ) -> (CDeclrR)-happyOut75 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut75 #-}-happyIn76 :: (CDeclr) -> (HappyAbsSyn )-happyIn76 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn76 #-}-happyOut76 :: (HappyAbsSyn ) -> (CDeclr)-happyOut76 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut76 #-}-happyIn77 :: (CDeclrR) -> (HappyAbsSyn )-happyIn77 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn77 #-}-happyOut77 :: (HappyAbsSyn ) -> (CDeclrR)-happyOut77 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut77 #-}-happyIn78 :: (CDeclrR) -> (HappyAbsSyn )-happyIn78 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn78 #-}-happyOut78 :: (HappyAbsSyn ) -> (CDeclrR)-happyOut78 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut78 #-}-happyIn79 :: (([CDecl], Bool)) -> (HappyAbsSyn )-happyIn79 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn79 #-}-happyOut79 :: (HappyAbsSyn ) -> (([CDecl], Bool))-happyOut79 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut79 #-}-happyIn80 :: (Reversed [CDecl]) -> (HappyAbsSyn )-happyIn80 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn80 #-}-happyOut80 :: (HappyAbsSyn ) -> (Reversed [CDecl])-happyOut80 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut80 #-}-happyIn81 :: (CDecl) -> (HappyAbsSyn )-happyIn81 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn81 #-}-happyOut81 :: (HappyAbsSyn ) -> (CDecl)-happyOut81 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut81 #-}-happyIn82 :: (Reversed [Ident]) -> (HappyAbsSyn )-happyIn82 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn82 #-}-happyOut82 :: (HappyAbsSyn ) -> (Reversed [Ident])-happyOut82 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut82 #-}-happyIn83 :: (CDecl) -> (HappyAbsSyn )-happyIn83 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn83 #-}-happyOut83 :: (HappyAbsSyn ) -> (CDecl)-happyOut83 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut83 #-}-happyIn84 :: (CDeclrR) -> (HappyAbsSyn )-happyIn84 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn84 #-}-happyOut84 :: (HappyAbsSyn ) -> (CDeclrR)-happyOut84 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut84 #-}-happyIn85 :: (CDeclrR -> CDeclrR) -> (HappyAbsSyn )-happyIn85 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn85 #-}-happyOut85 :: (HappyAbsSyn ) -> (CDeclrR -> CDeclrR)-happyOut85 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut85 #-}-happyIn86 :: (CDeclrR -> CDeclrR) -> (HappyAbsSyn )-happyIn86 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn86 #-}-happyOut86 :: (HappyAbsSyn ) -> (CDeclrR -> CDeclrR)-happyOut86 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut86 #-}-happyIn87 :: (CDeclrR -> CDeclrR) -> (HappyAbsSyn )-happyIn87 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn87 #-}-happyOut87 :: (HappyAbsSyn ) -> (CDeclrR -> CDeclrR)-happyOut87 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut87 #-}-happyIn88 :: (CDeclrR) -> (HappyAbsSyn )-happyIn88 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn88 #-}-happyOut88 :: (HappyAbsSyn ) -> (CDeclrR)-happyOut88 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut88 #-}-happyIn89 :: (CDeclrR) -> (HappyAbsSyn )-happyIn89 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn89 #-}-happyOut89 :: (HappyAbsSyn ) -> (CDeclrR)-happyOut89 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut89 #-}-happyIn90 :: (CInit) -> (HappyAbsSyn )-happyIn90 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn90 #-}-happyOut90 :: (HappyAbsSyn ) -> (CInit)-happyOut90 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut90 #-}-happyIn91 :: (Maybe CInit) -> (HappyAbsSyn )-happyIn91 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn91 #-}-happyOut91 :: (HappyAbsSyn ) -> (Maybe CInit)-happyOut91 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut91 #-}-happyIn92 :: (Reversed CInitList) -> (HappyAbsSyn )-happyIn92 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn92 #-}-happyOut92 :: (HappyAbsSyn ) -> (Reversed CInitList)-happyOut92 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut92 #-}-happyIn93 :: ([CDesignator]) -> (HappyAbsSyn )-happyIn93 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn93 #-}-happyOut93 :: (HappyAbsSyn ) -> ([CDesignator])-happyOut93 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut93 #-}-happyIn94 :: (Reversed [CDesignator]) -> (HappyAbsSyn )-happyIn94 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn94 #-}-happyOut94 :: (HappyAbsSyn ) -> (Reversed [CDesignator])-happyOut94 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut94 #-}-happyIn95 :: (CDesignator) -> (HappyAbsSyn )-happyIn95 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn95 #-}-happyOut95 :: (HappyAbsSyn ) -> (CDesignator)-happyOut95 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut95 #-}-happyIn96 :: (CDesignator) -> (HappyAbsSyn )-happyIn96 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn96 #-}-happyOut96 :: (HappyAbsSyn ) -> (CDesignator)-happyOut96 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut96 #-}-happyIn97 :: (CExpr) -> (HappyAbsSyn )-happyIn97 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn97 #-}-happyOut97 :: (HappyAbsSyn ) -> (CExpr)-happyOut97 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut97 #-}-happyIn98 :: (Reversed [CDesignator]) -> (HappyAbsSyn )-happyIn98 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn98 #-}-happyOut98 :: (HappyAbsSyn ) -> (Reversed [CDesignator])-happyOut98 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut98 #-}-happyIn99 :: (CExpr) -> (HappyAbsSyn )-happyIn99 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn99 #-}-happyOut99 :: (HappyAbsSyn ) -> (CExpr)-happyOut99 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut99 #-}-happyIn100 :: (Reversed [CExpr]) -> (HappyAbsSyn )-happyIn100 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn100 #-}-happyOut100 :: (HappyAbsSyn ) -> (Reversed [CExpr])-happyOut100 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut100 #-}-happyIn101 :: (CExpr) -> (HappyAbsSyn )-happyIn101 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn101 #-}-happyOut101 :: (HappyAbsSyn ) -> (CExpr)-happyOut101 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut101 #-}-happyIn102 :: (Located CUnaryOp) -> (HappyAbsSyn )-happyIn102 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn102 #-}-happyOut102 :: (HappyAbsSyn ) -> (Located CUnaryOp)-happyOut102 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut102 #-}-happyIn103 :: (CExpr) -> (HappyAbsSyn )-happyIn103 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn103 #-}-happyOut103 :: (HappyAbsSyn ) -> (CExpr)-happyOut103 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut103 #-}-happyIn104 :: (CExpr) -> (HappyAbsSyn )-happyIn104 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn104 #-}-happyOut104 :: (HappyAbsSyn ) -> (CExpr)-happyOut104 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut104 #-}-happyIn105 :: (CExpr) -> (HappyAbsSyn )-happyIn105 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn105 #-}-happyOut105 :: (HappyAbsSyn ) -> (CExpr)-happyOut105 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut105 #-}-happyIn106 :: (CExpr) -> (HappyAbsSyn )-happyIn106 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn106 #-}-happyOut106 :: (HappyAbsSyn ) -> (CExpr)-happyOut106 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut106 #-}-happyIn107 :: (CExpr) -> (HappyAbsSyn )-happyIn107 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn107 #-}-happyOut107 :: (HappyAbsSyn ) -> (CExpr)-happyOut107 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut107 #-}-happyIn108 :: (CExpr) -> (HappyAbsSyn )-happyIn108 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn108 #-}-happyOut108 :: (HappyAbsSyn ) -> (CExpr)-happyOut108 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut108 #-}-happyIn109 :: (CExpr) -> (HappyAbsSyn )-happyIn109 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn109 #-}-happyOut109 :: (HappyAbsSyn ) -> (CExpr)-happyOut109 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut109 #-}-happyIn110 :: (CExpr) -> (HappyAbsSyn )-happyIn110 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn110 #-}-happyOut110 :: (HappyAbsSyn ) -> (CExpr)-happyOut110 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut110 #-}-happyIn111 :: (CExpr) -> (HappyAbsSyn )-happyIn111 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn111 #-}-happyOut111 :: (HappyAbsSyn ) -> (CExpr)-happyOut111 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut111 #-}-happyIn112 :: (CExpr) -> (HappyAbsSyn )-happyIn112 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn112 #-}-happyOut112 :: (HappyAbsSyn ) -> (CExpr)-happyOut112 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut112 #-}-happyIn113 :: (CExpr) -> (HappyAbsSyn )-happyIn113 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn113 #-}-happyOut113 :: (HappyAbsSyn ) -> (CExpr)-happyOut113 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut113 #-}-happyIn114 :: (CExpr) -> (HappyAbsSyn )-happyIn114 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn114 #-}-happyOut114 :: (HappyAbsSyn ) -> (CExpr)-happyOut114 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut114 #-}-happyIn115 :: (CExpr) -> (HappyAbsSyn )-happyIn115 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn115 #-}-happyOut115 :: (HappyAbsSyn ) -> (CExpr)-happyOut115 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut115 #-}-happyIn116 :: (Located CAssignOp) -> (HappyAbsSyn )-happyIn116 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn116 #-}-happyOut116 :: (HappyAbsSyn ) -> (Located CAssignOp)-happyOut116 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut116 #-}-happyIn117 :: (CExpr) -> (HappyAbsSyn )-happyIn117 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn117 #-}-happyOut117 :: (HappyAbsSyn ) -> (CExpr)-happyOut117 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut117 #-}-happyIn118 :: (Reversed [CExpr]) -> (HappyAbsSyn )-happyIn118 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn118 #-}-happyOut118 :: (HappyAbsSyn ) -> (Reversed [CExpr])-happyOut118 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut118 #-}-happyIn119 :: (Maybe CExpr) -> (HappyAbsSyn )-happyIn119 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn119 #-}-happyOut119 :: (HappyAbsSyn ) -> (Maybe CExpr)-happyOut119 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut119 #-}-happyIn120 :: (Maybe CExpr) -> (HappyAbsSyn )-happyIn120 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn120 #-}-happyOut120 :: (HappyAbsSyn ) -> (Maybe CExpr)-happyOut120 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut120 #-}-happyIn121 :: (CExpr) -> (HappyAbsSyn )-happyIn121 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn121 #-}-happyOut121 :: (HappyAbsSyn ) -> (CExpr)-happyOut121 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut121 #-}-happyIn122 :: (CConst) -> (HappyAbsSyn )-happyIn122 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn122 #-}-happyOut122 :: (HappyAbsSyn ) -> (CConst)-happyOut122 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut122 #-}-happyIn123 :: (CStrLit) -> (HappyAbsSyn )-happyIn123 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn123 #-}-happyOut123 :: (HappyAbsSyn ) -> (CStrLit)-happyOut123 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut123 #-}-happyIn124 :: (Reversed [CString]) -> (HappyAbsSyn )-happyIn124 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn124 #-}-happyOut124 :: (HappyAbsSyn ) -> (Reversed [CString])-happyOut124 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut124 #-}-happyIn125 :: (Ident) -> (HappyAbsSyn )-happyIn125 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn125 #-}-happyOut125 :: (HappyAbsSyn ) -> (Ident)-happyOut125 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut125 #-}-happyIn126 :: ([CAttr]) -> (HappyAbsSyn )-happyIn126 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn126 #-}-happyOut126 :: (HappyAbsSyn ) -> ([CAttr])-happyOut126 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut126 #-}-happyIn127 :: ([CAttr]) -> (HappyAbsSyn )-happyIn127 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn127 #-}-happyOut127 :: (HappyAbsSyn ) -> ([CAttr])-happyOut127 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut127 #-}-happyIn128 :: ([CAttr]) -> (HappyAbsSyn )-happyIn128 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn128 #-}-happyOut128 :: (HappyAbsSyn ) -> ([CAttr])-happyOut128 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut128 #-}-happyIn129 :: (Reversed [CAttr]) -> (HappyAbsSyn )-happyIn129 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn129 #-}-happyOut129 :: (HappyAbsSyn ) -> (Reversed [CAttr])-happyOut129 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut129 #-}-happyIn130 :: (Maybe CAttr) -> (HappyAbsSyn )-happyIn130 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn130 #-}-happyOut130 :: (HappyAbsSyn ) -> (Maybe CAttr)-happyOut130 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut130 #-}-happyIn131 :: (Reversed [CExpr]) -> (HappyAbsSyn )-happyIn131 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn131 #-}-happyOut131 :: (HappyAbsSyn ) -> (Reversed [CExpr])-happyOut131 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut131 #-}-happyInTok :: (CToken) -> (HappyAbsSyn )-happyInTok x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyInTok #-}-happyOutTok :: (HappyAbsSyn ) -> (CToken)-happyOutTok x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOutTok #-}---happyActOffsets :: HappyAddr-happyActOffsets = HappyA# "\x00\x00\x1d\x0f\xd3\x09\x31\x0f\x00\x00\x80\x07\x00\x00\x7f\x09\x77\x0f\x31\x0f\x00\x00\xc8\x09\x1f\x05\x05\x05\x7f\x03\xf0\x04\x65\x08\x54\x08\x49\x08\x3e\x08\xc6\x04\x00\x00\x2b\x08\xef\x07\x00\x00\x00\x00\x0b\x09\x00\x00\x00\x00\xcd\x0e\xcd\x0e\x00\x00\x00\x00\x00\x00\x00\x00\x82\x04\xaf\x0e\x96\x0e\x00\x00\x00\x00\x00\x00\xf6\x07\x00\x00\x32\x0e\x14\x0e\x14\x0e\x48\x08\x47\x08\x24\x08\xb6\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xde\x07\xe6\x07\x00\x00\x00\x00\x4a\x05\xd2\x07\xfb\x0d\xd0\x07\xd6\x07\xd3\x09\xf5\x07\x24\x00\xed\x07\xfb\x0d\xec\x07\xd5\x07\xc6\x07\x00\x00\x76\x07\x00\x00\xae\x07\x00\x00\x95\x04\x8e\x04\x01\x01\xd5\x11\x00\x00\x01\x01\x00\x00\x9a\x19\x9a\x19\x11\x18\x01\x18\x21\x08\x21\x08\x00\x00\x00\x00\x71\x07\x00\x00\xa6\x11\x00\x00\x00\x00\x00\x00\xd9\x01\x00\x00\x00\x00\x00\x00\x4a\x05\x89\x12\x00\x00\x3d\x01\x3d\x01\xcb\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6b\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc5\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbb\x07\x1d\x0f\x55\x07\x00\x00\xb8\x07\x6f\x09\x7a\x01\x59\x07\x5b\x07\xb3\x12\x00\x00\x00\x00\x4b\x00\xb2\x07\xb4\x09\xaa\x07\x4b\x00\x86\x07\x00\x00\x00\x00\x00\x00\xed\x01\x00\x00\x00\x00\xa7\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x38\x18\x00\x00\x9d\x07\x00\x00\x94\x18\xff\x0a\x72\x07\x00\x00\x00\x00\x00\x00\x00\x00\xed\x01\x00\x00\x77\x11\x97\x07\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x67\x07\x5f\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x62\x07\x00\x00\x6e\x02\x48\x02\x0f\x00\x52\x07\x00\x00\x00\x00\x00\x00\xed\x01\x00\x00\x00\x00\x7b\x07\x00\x00\x4f\x07\x53\x07\x00\x00\x1b\x07\x00\x00\x1b\x07\x00\x00\x00\x00\xfb\x0d\xfb\x0d\x00\x00\x4d\x07\xfb\x0d\x41\x07\xfb\x0d\x00\x00\x43\x08\x14\x07\xd3\x09\x00\x00\x00\x00\x00\x00\x1f\x00\x00\x00\x65\x07\x00\x00\x2e\x07\xf4\x06\x00\x00\xc3\x1a\xc3\x1a\xfb\x0d\x00\x00\x0b\x09\x00\x00\x00\x00\xf0\x06\x00\x00\x00\x00\x0b\x09\x00\x00\x0b\x09\x00\x00\x00\x00\x00\x00\x4e\x07\x97\x03\xe7\x1a\xab\x04\xab\x04\x7a\x0a\x4c\x07\x4b\x07\x9f\x1a\xfb\x0d\xfb\x0d\x97\x0d\xfb\x0d\xfb\x0d\xfb\x0d\xfb\x0d\xfb\x0d\xfb\x0d\xfb\x0d\xfb\x0d\xfb\x0d\xfb\x0d\xfb\x0d\xfb\x0d\xfb\x0d\xfb\x0d\xfb\x0d\xfb\x0d\xfb\x0d\x00\x00\xfb\x0d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7c\x0d\xfb\x0d\x36\x04\x36\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x44\x07\x6e\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x09\xa3\x09\x8a\x04\x8a\x04\x4f\x04\x4f\x04\x4f\x04\x4f\x04\x7f\x03\x7f\x03\x1d\x04\x35\x07\x2b\x07\x16\x07\x0c\x07\xfb\x0d\x25\x07\x00\x00\xfb\x06\x00\x00\x61\x0d\x00\x00\x00\x00\x00\x00\xb7\x06\x57\x1a\x33\x1a\x48\x11\x00\x0f\x00\x00\x00\x00\x0f\x07\x0e\x07\x00\x00\xf3\x06\xdd\x06\xdb\x06\xc7\x06\xd3\x09\xdf\x07\xad\x06\x94\x06\x7c\x06\xd3\x09\xfb\x0d\x00\x00\xcb\x06\x6c\x19\xab\x06\xa7\x06\x00\x00\xc4\x06\x00\x00\xc3\x06\xc1\x06\xea\x00\xd8\x00\x38\x18\xa1\x06\x5d\x06\xaa\x06\x00\x00\x6f\x09\x38\x18\x86\x06\x00\x00\x00\x00\x1e\x19\x5b\x0b\x00\x00\x00\x00\xb1\x01\x93\x01\x8e\x06\x88\x06\x0f\x00\x47\x00\x93\x01\x00\x00\x38\x18\x66\x06\x00\x00\x49\x06\x00\x00\x6f\x09\x3e\x06\x00\x00\x00\x00\x00\x00\x00\x00\xed\x01\x00\x00\x62\x06\x00\x00\x38\x18\x3d\x06\x00\x00\x9b\x0a\x00\x00\x29\x06\xe0\x0b\x09\x00\xce\x05\x74\x02\xff\x0f\x74\x02\x21\x08\x21\x08\xd0\x0f\x24\x06\xfb\x05\x00\x00\x1b\x01\x45\x19\x00\x00\x00\x00\x00\x00\x00\x00\xd8\x00\x19\x11\xd8\x00\xea\x10\x5a\x12\x6f\x09\x38\x18\x04\x06\x00\x00\x19\x06\x9e\x09\x12\x00\x12\x00\x0f\x00\x00\x00\x0f\x00\x00\x00\x0f\x00\x00\x00\x00\x00\xdc\x0c\x09\x06\xf4\x05\xcc\x03\x03\x06\xfe\x05\x77\x00\xca\x00\x00\x00\x00\x00\xef\x05\x00\x00\x00\x00\xcd\x02\x00\x00\xcb\x05\xcc\x03\xaa\x05\x00\x00\x00\x00\x00\x00\xdc\x0c\x4b\x09\x00\x00\x0f\x00\x00\x00\xfd\x0c\x00\x00\xc8\x05\xc1\x05\x8c\x05\x8c\x05\xbb\x10\x00\x00\xf1\x00\xc9\x00\x8c\x05\x00\x00\x56\x05\x66\x18\x00\x00\x53\x05\x00\x00\xf0\x18\xc2\x18\xa1\x0f\xde\x12\x53\x05\x53\x05\x00\x00\x72\x0f\x49\x07\x53\x05\x00\x00\x53\x05\x53\x05\x00\x00\xab\x04\x62\x0c\x9d\x05\x9b\x05\x09\x00\x00\x00\x90\x05\x46\x05\x37\x0a\x09\x00\x00\x00\x00\x00\x6f\x09\x38\x18\x6d\x05\x00\x00\x8f\x05\x8d\x05\xdc\x17\x00\x00\x00\x00\x00\x00\x2f\x09\x84\x05\x0e\x00\xbe\x00\x83\x05\x0f\x00\x0f\x00\x2c\x09\x00\x00\x00\x00\x00\x00\xe3\x0a\x65\x00\x00\x00\x00\x00\x81\x05\x79\x05\x10\x05\x00\x00\x00\x00\x00\x00\x35\x05\x35\x05\xd3\x09\xd3\x09\xd3\x09\x00\x00\xfb\x0d\xfb\x0d\xfb\x0d\x42\x05\x00\x00\xaa\x01\xc9\x03\xdf\x07\xf2\x04\x00\x00\x23\x05\x00\x00\x00\x00\x00\x00\x00\x00\xd8\x00\x8c\x10\xd8\x00\x5d\x10\x2d\x05\xa7\x08\x00\x00\x7b\x1a\x9a\x03\x7b\x1a\x1c\x05\x1c\x05\x1c\x05\x30\x0c\x00\x00\xa2\x09\x31\x05\x2f\x05\x2d\x00\x33\x12\x00\x00\x00\x00\xfe\x0b\xfb\x0d\x00\x00\xfb\x0d\x00\x00\xfb\x0d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb3\x02\xfd\x0c\xdc\x02\x00\x00\x99\x01\x00\x00\xd4\x04\xfb\x0d\x9a\x03\xfe\x0b\x21\x05\x0d\x05\x13\x00\x00\x00\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\xab\x04\x09\x05\xed\x02\x00\x00\xf9\x04\x00\x00\xc0\x04\x2e\x10\xc0\x04\xc0\x04\xc0\x04\x00\x00\xa3\x03\x89\x04\x00\x00\xa2\x04\x2a\x00\xd3\x09\xc7\x04\x9c\x04\x97\x04\x7f\x04\x00\x00\x00\x00\x88\x04\x88\x04\xa1\x04\x00\x00\x00\x00\x22\x09\x00\x00\x00\x00\x2b\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe0\x0a\x0f\x00\x00\x00\xaf\x17\xd4\x02\x00\x00\xa0\x03\x98\x03\x0f\x1a\xc2\x12\x00\x00\x00\x00\xbe\x19\x00\x00\x00\x00\x00\x00\x00\x00\x9f\x04\x9a\x04\x8b\x04\x86\x04\x09\x00\x0a\x04\x00\x00\x7a\x04\x00\x00\x00\x00\x68\x04\xfb\x0d\x00\x00\x00\x00\x00\x00\xb4\x04\x9f\x00\x04\x12\x00\x00\x00\x00\xdc\x0a\x3e\x09\x24\x0a\x00\x00\x00\x00\x00\x00\x00\x00\x1f\x01\x2b\x00\x2b\x00\x16\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x47\x02\xfb\x0d\xf4\x00\x00\x00\xe4\x0c\x64\x04\x77\x00\x00\x00\x00\x00\x00\x00\xa8\x00\x00\x00\x00\x00\x00\x00\x00\x00\xde\x00\x00\x00\x2b\x00\x5f\x01\xcd\x00\x3e\x04\x00\x00\x00\x00\xfb\x0d\x3c\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdd\x03\x1b\x04\xfb\x0d\x9e\x00\xeb\x19\xc8\x03\x00\x00\xc8\x03\x00\x00\xc8\x03\x06\x04\xfb\x0d\x00\x00\x00\x00\xcd\x00\x1f\x09\x00\x00\x00\x00\x00\x00\x00\x00\xd3\x09\xfb\x0d\xfb\x0d\xf5\x03\x00\x00\x0a\x01\xef\x03\x00\x00\x1a\x04\x49\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdf\x03\x00\x00\x00\x00\x00\x00\xfb\x0d\x40\x03\x00\x00\x00\x00\x00\x00\x0f\x00\x00\x00\x97\x01\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7c\x0b\x00\x00\x00\x00\x80\x0c\x00\x00\x00\x00\xfb\x0d\x63\x0b\x00\x00\x00\x00\x00\x00\x03\x04\x00\x00\x01\x04\xe1\x03\xfb\x0d\x2a\x00\xb6\x03\x2a\x00\x00\x00\xd8\x03\xd3\x03\x00\x00\x00\x00\x00\x00\xfb\x0d\x00\x00\x9e\x00\xd4\x02\x6a\x03\x00\x00\xfb\x0d\x00\x00\x00\x00\xb9\x03\x00\x00\x00\x00\x00\x00\xfb\x0d\x00\x00\x00\x00\x00\x00\x4a\x03\x4a\x03\x00\x00\xd3\x09\xd3\x09\xd5\x00\x00\x00\x00\x00\xa8\x03\x3b\x03\x3b\x03\x00\x00\x00\x00\x7a\x03\x00\x00\x00\x00\x74\x03\x72\x03\x00\x00\x46\x03\x0b\x03\x00\x00\x00\x00\x00\x00\x00\x00\x15\x00\x00\x00\x00\x00\xfb\x0d\xfb\x0d\x6c\x03\x5b\x03\x17\x03\xe9\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"#--happyGotoOffsets :: HappyAddr-happyGotoOffsets = HappyA# "\x36\x03\x71\x00\xd3\x06\xc6\x1d\x3c\x03\x38\x00\x00\x00\x00\x00\xc5\x02\x35\x0d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4d\x03\x00\x00\x00\x00\x71\x0d\xa4\x0b\x00\x00\x00\x00\x00\x00\x00\x00\xb8\x02\xd5\x0a\xb9\x0a\x00\x00\x00\x00\x00\x00\xa7\x02\x00\x00\x20\x0c\xbe\x03\x60\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x03\x1a\x00\x00\x00\x76\x1f\x00\x00\x00\x00\xb8\x06\x00\x00\x95\x02\x00\x00\x4c\x1c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x03\x00\x00\x00\x00\x00\x00\x2a\x06\xc3\x00\x00\x00\x8a\x05\x00\x00\x14\x00\x16\x01\x6c\x02\x7d\x01\xa2\x01\xcb\x00\x00\x00\x00\x00\x96\x08\x00\x00\x9a\x00\x00\x00\x00\x00\x00\x00\x99\x08\xe2\x02\x00\x00\x00\x00\xbb\x02\x15\x01\x00\x00\xa8\x0a\xd7\x09\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5c\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\xca\x15\x71\x02\x5d\x02\x6a\x02\x77\x08\x00\x00\x00\x00\x70\x02\x00\x00\x5b\x08\x00\x00\x40\x00\xc6\x02\x00\x00\x00\x00\x00\x00\x52\x02\x9e\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xad\x04\x00\x00\x66\x02\x00\x00\xa8\x13\x16\x17\xa9\x02\x00\x00\x00\x00\x00\x00\x00\x00\x51\x02\x90\x02\xec\x00\x00\x00\x00\x00\x1a\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x82\x02\x4f\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x65\x02\x9a\x13\xe8\x16\x35\x08\x75\x02\x00\x00\x00\x00\x00\x00\x4a\x02\x5c\x02\x00\x00\x00\x00\x00\x00\x62\x02\x31\x02\x56\x02\xf3\x07\x00\x00\xee\x07\x00\x00\x00\x00\xab\x1d\x90\x1d\x00\x00\x00\x00\x75\x1d\x00\x00\x5a\x1d\x00\x00\x98\x06\x00\x00\x4e\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xeb\x01\xe9\x07\x00\x00\x7b\x16\x53\x16\x5b\x1f\x00\x00\xe7\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc1\x02\x00\x00\x5b\x02\x00\x00\x00\x00\x00\x00\x00\x00\x69\x05\x9b\x00\x78\x00\x50\x00\x89\x16\x00\x00\x00\x00\xac\x03\x3f\x1d\xc7\x1f\x24\x1d\xe2\x1f\x08\x15\x84\x15\xfd\x1f\xf1\x0b\x6f\x0b\xf0\x0c\xbb\x0c\x40\x0c\x3a\x0b\x9b\x0c\x1a\x0b\xfc\x07\x26\x07\xc1\x0b\x2c\x0a\x9d\x09\x00\x00\x40\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x09\x1d\xee\x1c\xdb\x01\xcd\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xac\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x99\x07\x00\x00\x00\x00\x00\x00\xc6\x01\x61\x04\x00\x00\x73\x13\xda\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x33\x06\x35\x02\x33\x02\xea\x01\x7e\x01\x18\x06\x25\x1f\x00\x00\x00\x00\xa6\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x15\x03\x91\x20\x87\x04\xdd\x01\xce\x07\x00\x00\x00\x00\xa6\x15\x4c\x04\xb7\x01\x00\x00\x00\x00\xda\x13\x26\x03\x00\x00\x00\x00\x6c\x05\x30\x13\x00\x00\x00\x00\xa2\x07\x36\x02\xb6\x0b\x00\x00\x26\x04\xa0\x01\x00\x00\x00\x00\xa7\x01\x4e\x15\xc7\x01\x00\x00\x00\x00\x00\x00\x00\x00\x2e\x02\xb0\x01\x00\x00\x00\x00\xeb\x03\x60\x01\x00\x00\xa9\x16\x00\x00\x00\x00\xc4\x1b\x6a\x07\x14\x01\x40\x20\x18\x14\x28\x20\x9f\x01\x18\x00\x2c\x14\x00\x00\x00\x00\x00\x00\x00\x00\xa6\x03\x00\x00\x00\x00\x00\x00\x00\x00\x84\x20\x47\x07\x77\x20\x68\x14\xaf\x14\x2a\x15\xc5\x03\x4d\x01\x00\x00\x00\x00\x73\x07\xd3\x01\xeb\x04\x27\x07\x00\x00\x20\x07\x00\x00\x15\x07\x00\x00\x00\x00\xbf\x03\x00\x00\x00\x00\xb9\x01\x00\x00\x00\x00\xfd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x85\x01\x00\x00\x00\x00\x00\x00\x00\x00\x44\x04\x15\x07\x00\x00\xd9\x06\x00\x00\xa9\x1b\x00\x00\x00\x00\x00\x00\x16\x02\xf7\x01\xa9\x14\x00\x00\x6f\x13\x0d\x0e\xf4\x01\x00\x00\x00\x00\x0a\x14\x00\x00\x96\x06\x00\x00\x00\x04\x00\x00\x3e\x13\x60\x17\x76\x06\x68\x06\x00\x00\x06\x13\x59\x17\x2b\x06\x00\x00\x10\x06\xe2\x05\x00\x00\xdb\x00\x62\x17\x00\x00\x00\x00\xdf\x05\x00\x00\x00\x00\x00\x00\xe0\x16\xd9\x05\x00\x00\x00\x00\xd2\x14\x64\x03\x42\x01\x00\x00\x00\x00\x00\x00\x31\x16\x5c\x01\x00\x00\x00\x00\xff\x05\x00\x00\xf9\x08\x60\x07\x00\x00\xf1\x05\xe4\x05\xe1\x05\x00\x00\x00\x00\x00\x00\x92\x0c\x18\x04\x00\x00\x00\x00\x00\x00\x00\x00\x0f\x01\x00\x00\x00\x00\x00\x00\x5e\x01\x57\x01\xae\x05\x93\x05\x78\x05\x00\x00\x31\x1c\x16\x1c\xd3\x1c\x00\x00\x00\x00\x00\x00\x00\x00\xc0\x01\x33\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x54\x09\x43\x01\xc4\x07\x3e\x01\x00\x00\x36\x07\x00\x00\x40\x16\xd5\xff\xe1\x14\x00\x00\x00\x00\x00\x00\xc7\x02\x00\x00\x8a\x02\x00\x00\x00\x00\xf9\x00\x96\x14\x00\x00\x00\x00\x13\x1b\x0a\x1f\x00\x00\x91\x1f\x00\x00\xef\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8e\x1b\x9d\x02\x00\x00\x00\x00\x00\x00\x00\x00\xd4\x1e\xd3\x00\xf1\x1a\x00\x00\x00\x00\x7f\x00\x00\x00\xb4\x05\x00\x00\x00\x00\x00\x00\x00\x00\xce\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3c\x01\x67\x01\x36\x01\x1d\x01\x17\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf4\xff\x0e\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x84\x00\x80\x00\x00\x00\x00\x00\x00\x00\x99\x05\x00\x00\x00\x00\x6b\x0e\x00\x00\x00\x00\x00\x00\x00\x00\xb0\x09\x5c\x05\x00\x00\x31\x16\x6a\x20\x00\x00\x00\x00\x00\x00\x04\x04\xb9\x16\x00\x00\x00\x00\x22\x16\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xce\x04\xb0\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x1e\x00\x00\x00\x00\x00\x00\x1a\x17\xfa\x05\x64\x14\x00\x00\x00\x00\x80\x16\x9a\x06\xca\x04\x00\x00\x00\x00\x00\x00\x00\x00\xc3\x02\xaa\x0d\x36\x0d\xfa\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9e\x1e\xd9\xff\x00\x00\x50\x1b\x00\x00\x4d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd9\xff\x00\x00\x91\x06\xbf\x03\x5a\x05\x00\x00\x00\x00\x00\x00\x83\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x28\x00\x00\x00\x68\x1e\x57\x04\x61\x04\x78\x04\x00\x00\x09\x04\x00\x00\x86\x03\x00\x00\x4d\x1e\x00\x00\x00\x00\x5a\x05\xab\x03\x00\x00\x00\x00\x00\x00\x00\x00\xf3\x04\xfb\x1b\xe0\x1b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\x00\x00\x00\x00\xb8\x1c\x44\x00\x00\x00\x00\x00\x00\x00\x2c\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x35\x1b\x00\x00\x00\x00\x73\x1b\x00\x00\x00\x00\x32\x1e\x35\x1b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9d\x1c\xf5\xff\x00\x00\xf1\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17\x1e\x00\x00\x5f\x03\x5b\x20\xd0\xff\x00\x00\xfc\x1d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe1\x1d\x00\x00\x00\x00\x00\x00\xec\x01\xd0\xff\x00\x00\xd6\x04\x9e\x01\x00\x00\x00\x00\x00\x00\x00\x00\x32\x00\xa5\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf9\xff\x49\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x82\x1c\x67\x1c\x00\x00\x00\x00\x00\x00\x91\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"#--happyDefActions :: HappyAddr-happyDefActions = HappyA# "\xfa\xff\x3d\xfe\x00\x00\x00\x00\x00\x00\x3d\xfe\x9b\xfe\x8f\xfe\x7d\xfe\x00\x00\x7b\xfe\x77\xfe\x74\xfe\x71\xfe\x6c\xfe\x69\xfe\x67\xfe\x65\xfe\x63\xfe\x61\xfe\x5f\xfe\x5c\xfe\x4f\xfe\x00\x00\xa5\xfe\xa4\xfe\x3d\xfe\x7e\xfe\x7f\xfe\x00\x00\x00\x00\x81\xfe\x80\xfe\x82\xfe\x83\xfe\x00\x00\x00\x00\x00\x00\x45\xfe\x46\xfe\x44\xfe\x43\xfe\xa6\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe4\xff\xe3\xff\xe2\xff\xe1\xff\xe0\xff\xdf\xff\xde\xff\x00\x00\x00\x00\xc7\xff\xd7\xff\xb5\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4b\xfe\x00\x00\x00\x00\xa6\xfe\x3e\xfe\x00\x00\xf7\xff\x00\x00\xf6\xff\x00\x00\x00\x00\x00\x00\x00\x00\x98\xff\x00\x00\x77\xff\x9b\xff\x8a\xff\x9a\xff\x89\xff\x99\xff\x88\xff\x6c\xff\x52\xff\x3d\xfe\x51\xff\x00\x00\xe5\xff\x0a\xff\x08\xff\x09\xff\xa6\xff\xfb\xfe\xfa\xfe\x00\x00\x3c\xfe\x3b\xfe\x00\x00\x3d\xfe\x00\x00\x8d\xff\x7e\xff\x86\xff\x7d\xff\x81\xff\x3d\xfe\x8f\xff\x82\xff\x84\xff\x83\xff\x8c\xff\x85\xff\x80\xff\x8e\xff\x4d\xff\x90\xff\x00\x00\x8b\xff\x4c\xff\x7f\xff\x87\xff\xfe\xfe\x60\xff\x00\x00\x3d\xfe\x00\x00\xf5\xff\x00\x00\x3d\xfe\x00\x00\x3c\xfe\x00\x00\x00\x00\x07\xff\xf9\xfe\x3c\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\xff\x76\xff\x6b\xff\x26\xff\xa6\xff\x3a\xfe\x00\x00\x5a\xff\x2b\xff\x2f\xff\x2c\xff\x2d\xff\x2e\xff\x3d\xfe\x03\xff\xd7\xfe\xd5\xfe\xf4\xfe\x49\xfe\x00\x00\x96\xff\x75\xff\x6a\xff\x2a\xff\x26\xff\xa6\xff\x00\x00\x00\x00\x5d\xff\x00\x00\x66\xff\x54\xff\x53\xff\x62\xff\x92\xff\x91\xff\x61\xff\x6f\xff\x68\xff\x67\xff\xa9\xff\x6e\xff\x6d\xff\xaa\xff\x7b\xff\x72\xff\x73\xff\x71\xff\x7a\xff\x79\xff\x78\xff\x00\x00\x26\xff\x27\xff\x23\xff\x20\xff\x1f\xff\x24\xff\x16\xff\x28\xff\xa6\xff\x00\x00\x3d\xfe\x22\xff\x00\x00\x94\xff\x7c\xff\x70\xff\x26\xff\xa6\xff\x93\xff\x00\x00\x65\xff\x00\x00\x26\xff\xa6\xff\x3d\xfe\xa8\xff\x3d\xfe\xa7\xff\xf3\xff\x00\x00\x00\x00\x4a\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x3f\xfe\x4b\xfe\x00\x00\x00\x00\xbc\xff\x7d\xfe\x47\xfe\x00\x00\xbb\xff\x00\x00\xb4\xff\xd5\xff\x3d\xfe\xc6\xff\x3d\xfe\x3d\xfe\x00\x00\x85\xfe\x3d\xfe\x86\xfe\x8c\xfe\x42\xfe\x41\xfe\x8a\xfe\x3d\xfe\x88\xfe\x3d\xfe\x84\xfe\x8d\xfe\x8e\xfe\x00\x00\xde\xfe\x8a\xff\x89\xff\x88\xff\x00\x00\x00\x00\x00\x00\x3c\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8b\xfe\x00\x00\x5a\xfe\x56\xfe\x55\xfe\x59\xfe\x58\xfe\x57\xfe\x52\xfe\x51\xfe\x50\xfe\x54\xfe\x53\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x95\xfe\x94\xfe\xf8\xff\xf9\xff\x97\xfe\x96\xfe\x00\x00\x00\x00\x91\xfe\x99\xfe\x5b\xfe\x78\xfe\x79\xfe\x7a\xfe\x75\xfe\x76\xfe\x72\xfe\x73\xfe\x6d\xfe\x6f\xfe\x6e\xfe\x70\xfe\x6a\xfe\x6b\xfe\x68\xfe\x66\xfe\x64\xfe\x62\xfe\x00\x00\x00\x00\x60\xfe\x4d\xfe\x4e\xfe\xa3\xfe\x00\x00\xdb\xfe\xd8\xfe\xda\xfe\xd9\xfe\x00\x00\xdc\xfe\xf4\xfe\xc8\xfe\xdd\xfe\xa2\xfe\x00\x00\x00\x00\x40\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd6\xff\xd5\xff\x00\x00\x00\x00\x00\x00\x00\x00\xdb\xff\x00\x00\x3d\xfe\x00\x00\x00\x00\xbe\xff\x00\x00\xba\xff\x00\x00\x00\x00\x00\x00\x00\x00\x3d\xfe\xb6\xfe\x3d\xfe\x00\x00\xf1\xff\x3d\xfe\x3d\xfe\xb6\xfe\xef\xff\x21\xff\xf4\xfe\x00\x00\x1e\xff\x12\xff\x3c\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0c\xff\x3d\xfe\xb6\xfe\xf0\xff\x4e\xff\x4b\xff\x3d\xfe\x00\x00\x95\xff\x74\xff\x69\xff\x29\xff\x26\xff\xa6\xff\x00\x00\x57\xff\x3d\xfe\xb6\xfe\xee\xff\x49\xfe\x48\xfe\x00\x00\x49\xfe\x82\xfe\x3d\xfe\xef\xfe\xeb\xfe\xe8\xfe\x9a\xff\x89\xff\xe4\xfe\x00\x00\xf3\xfe\xf1\xfe\x00\x00\x3c\xfe\xe0\xfe\xd4\xfe\xec\xff\xa5\xff\x00\x00\x00\x00\x00\x00\x00\x00\x3c\xfe\x3d\xfe\x3d\xfe\xb6\xfe\xf2\xff\x00\x00\x00\x00\x00\x00\x3d\xfe\xf6\xfe\xfd\xfe\x02\xff\x06\xff\x09\xff\x05\xff\xf8\xfe\x00\x00\x00\x00\x34\xff\x00\x00\x00\x00\x00\x00\x36\xfe\x00\x00\x38\xfe\x34\xfe\x35\xfe\x5f\xff\x5e\xff\x00\x00\x33\xff\x31\xff\x00\x00\x00\x00\x04\xff\x01\xff\xf5\xfe\x00\x00\x00\x00\xfc\xfe\x00\xff\xa1\xff\x00\x00\xeb\xff\x00\x00\x00\x00\x26\xff\x26\xff\x00\x00\x28\xff\x00\x00\x3d\xfe\x26\xff\xf7\xfe\x00\x00\x3d\xfe\xd6\xfe\x3d\xfe\xe2\xfe\x00\x00\xe3\xfe\xf4\xfe\xc8\xfe\x3d\xfe\x3d\xfe\xe7\xfe\xf4\xfe\xc8\xfe\x3d\xfe\xea\xfe\x3d\xfe\x3d\xfe\xee\xfe\x3d\xfe\x00\x00\x00\x00\x00\x00\x82\xfe\xd3\xfe\x00\x00\x00\x00\x49\xfe\x82\xfe\xa3\xff\xe7\xff\x3d\xfe\x3d\xfe\xb6\xfe\xed\xff\x00\x00\x00\x00\x3d\xfe\x4b\xff\x9d\xff\xe9\xff\x00\x00\x00\x00\x00\x00\x3d\xfe\x00\x00\x0f\xff\x1a\xff\x00\x00\x1d\xff\x1c\xff\x11\xff\x00\x00\x00\x00\xa4\xff\xe8\xff\x00\x00\x00\x00\x00\x00\x9f\xff\x9e\xff\xea\xff\x26\xff\x26\xff\x00\x00\x00\x00\x00\x00\xbd\xff\x4b\xfe\x4b\xfe\x00\x00\x00\x00\xdc\xff\x00\x00\x00\x00\xd6\xff\x00\x00\xd3\xff\x00\x00\xd4\xff\xd2\xff\xd0\xff\xd1\xff\x00\x00\x00\x00\x00\x00\x00\x00\x60\xff\x3d\xfe\xdd\xff\x3d\xfe\x00\x00\x3d\xfe\x00\x00\x89\xfe\x87\xfe\x3d\xfe\xc6\xfe\xc4\xfe\x00\x00\x00\x00\x00\x00\x3c\xfe\xba\xfe\x7c\xfe\xb4\xfe\x00\x00\x5d\xfe\x00\x00\x98\xfe\x00\x00\x9a\xfe\x90\xfe\x5e\xfe\x4c\xfe\xb3\xfe\x00\x00\x00\x00\x00\x00\xac\xfe\xad\xfe\xb9\xfe\x00\x00\x00\x00\x00\x00\xb4\xfe\x00\x00\x00\x00\x00\x00\xc1\xfe\xc2\xfe\xc0\xfe\xc3\xfe\xc5\xfe\xc7\xfe\x3c\xfe\x00\x00\x00\x00\x9e\xfe\x00\x00\xcf\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd9\xff\x00\x00\x00\x00\xc9\xff\x00\x00\xb3\xff\x00\x00\x00\x00\x00\x00\x00\x00\xc5\xff\xc3\xff\xc2\xff\xb6\xfe\xb6\xfe\x00\x00\x64\xff\x63\xff\x00\x00\x1b\xff\x10\xff\x00\x00\x15\xff\x19\xff\x0d\xff\x0e\xff\x00\x00\x18\xff\x0b\xff\x3d\xfe\x40\xff\x49\xff\x00\x00\x00\x00\x3d\xfe\x3c\xfe\x4a\xff\x4f\xff\x3d\xfe\x5c\xff\x5b\xff\xa2\xff\xe6\xff\x00\x00\x00\x00\x00\x00\x00\x00\x82\xfe\x3d\xfe\xd1\xfe\x00\x00\xd2\xfe\xcc\xfe\x00\x00\x00\x00\xed\xfe\xec\xfe\xe9\xfe\x3d\xfe\xc4\xfe\x3c\xfe\xe6\xfe\xe5\xfe\x3d\xfe\xc4\xfe\x3c\xfe\xe1\xfe\xf0\xfe\xf2\xfe\xdf\xfe\x00\x00\x00\x00\x00\x00\x26\xff\x59\xff\x58\xff\xb5\xfe\xff\xfe\xf4\xff\x00\x00\x00\x00\x00\x00\x38\xff\x00\x00\x00\x00\x36\xfe\x37\xfe\x39\xfe\x31\xfe\x00\x00\x32\xfe\x32\xff\x37\xff\x30\xff\x00\x00\x36\xff\x00\x00\x3c\xfe\x3c\xfe\x00\x00\xcf\xfe\xcb\xfe\x00\x00\x00\x00\xd0\xfe\xca\xfe\x56\xff\x55\xff\x46\xff\x44\xff\x3c\xff\x00\x00\x00\x00\x3c\xfe\x3d\xfe\x48\xff\x3d\xfe\x47\xff\x3d\xfe\x3f\xff\x00\x00\x50\xff\x17\xff\x00\x00\x00\x00\x14\xff\x25\xff\x9c\xff\xa0\xff\x00\x00\x4b\xfe\x4b\xfe\x00\x00\xda\xff\x00\x00\xb2\xff\xb1\xff\x00\x00\x00\x00\xb9\xff\xd8\xff\xc8\xff\xce\xff\xcc\xff\xcd\xff\x00\x00\xcb\xff\x9f\xfe\xa0\xfe\x00\x00\x00\x00\xa1\xfe\xbf\xfe\xbd\xfe\xbe\xfe\xbc\xfe\x00\x00\xa9\xfe\x00\x00\xae\xfe\xab\xfe\xa8\xfe\xaf\xfe\xb2\xfe\x00\x00\x93\xfe\xb1\xfe\x00\x00\x92\xfe\xaa\xfe\x00\x00\x00\x00\xb8\xfe\xbb\xfe\x9d\xfe\x00\x00\xca\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb3\xff\xc1\xff\x00\x00\x00\x00\xc4\xff\x13\xff\x3e\xff\x00\x00\x42\xff\x00\x00\x00\x00\x45\xff\x3b\xff\x00\x00\x39\xff\xc9\xfe\x00\x00\xce\xfe\x35\xff\x33\xfe\x00\x00\x30\xfe\xcd\xfe\x3a\xff\x3d\xfe\x43\xff\x3d\xff\x00\x00\x00\x00\x00\x00\xb8\xff\xb0\xff\x00\x00\x00\x00\x00\x00\x9c\xfe\xb7\xfe\x00\x00\xb0\xfe\xa7\xfe\x00\x00\x00\x00\xaf\xff\x00\x00\x00\x00\xd6\xff\xc0\xff\x41\xff\xbf\xff\x00\x00\xac\xff\xb7\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xab\xff\xb6\xff\xad\xff\xae\xff"#--happyCheck :: HappyAddr-happyCheck = HappyA# "\xff\xff\x02\x00\x03\x00\x04\x00\x36\x00\x74\x00\x15\x00\x16\x00\x17\x00\x15\x00\x16\x00\x17\x00\x17\x00\x04\x00\x35\x00\x01\x00\x01\x00\x18\x00\x03\x00\x01\x00\x04\x00\x02\x00\x1c\x00\x02\x00\x19\x00\x74\x00\x1b\x00\x0d\x00\x1d\x00\x1e\x00\x1f\x00\x0d\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x01\x00\x03\x00\x14\x00\x02\x00\x5b\x00\x0d\x00\x33\x00\x39\x00\x20\x00\x21\x00\x37\x00\x23\x00\x0d\x00\x21\x00\x02\x00\x03\x00\x04\x00\x1e\x00\x2e\x00\x2a\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x79\x00\x01\x00\x79\x00\x36\x00\x76\x00\x01\x00\x2e\x00\x36\x00\x76\x00\x36\x00\x19\x00\x09\x00\x1b\x00\x0d\x00\x1d\x00\x1e\x00\x1f\x00\x0d\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x74\x00\x01\x00\x5e\x00\x74\x00\x74\x00\x5c\x00\x33\x00\x5e\x00\x74\x00\x5c\x00\x37\x00\x5e\x00\x5e\x00\x0d\x00\x02\x00\x03\x00\x04\x00\x77\x00\x78\x00\x79\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x5c\x00\x5d\x00\x42\x00\x43\x00\x44\x00\x5b\x00\x36\x00\x5c\x00\x5d\x00\x5e\x00\x19\x00\x5e\x00\x1b\x00\x79\x00\x1d\x00\x1e\x00\x1f\x00\x79\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x04\x00\x01\x00\x01\x00\x79\x00\x03\x00\x5c\x00\x33\x00\x5e\x00\x74\x00\x5c\x00\x37\x00\x5e\x00\x02\x00\x0d\x00\x0d\x00\x36\x00\x36\x00\x77\x00\x78\x00\x79\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x79\x00\x76\x00\x21\x00\x1e\x00\x23\x00\x23\x00\x01\x00\x07\x00\x5c\x00\x5d\x00\x5e\x00\x2a\x00\x2b\x00\x2c\x00\x04\x00\x7b\x00\x79\x00\x01\x00\x0d\x00\x02\x00\x33\x00\x01\x00\x2c\x00\x36\x00\x36\x00\x2a\x00\x5c\x00\x54\x00\x36\x00\x0d\x00\x02\x00\x54\x00\x01\x00\x0d\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x43\x00\x20\x00\x21\x00\x0d\x00\x23\x00\x48\x00\x77\x00\x78\x00\x79\x00\x01\x00\x21\x00\x2a\x00\x2b\x00\x2c\x00\x04\x00\x79\x00\x01\x00\x1e\x00\x2a\x00\x56\x00\x33\x00\x0d\x00\x79\x00\x36\x00\x5c\x00\x5c\x00\x5d\x00\x5e\x00\x0d\x00\x5c\x00\x5d\x00\x36\x00\x01\x00\x36\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x2d\x00\x02\x00\x21\x00\x0d\x00\x23\x00\x43\x00\x36\x00\x78\x00\x79\x00\x79\x00\x48\x00\x2a\x00\x2b\x00\x2c\x00\x04\x00\x5c\x00\x5d\x00\x5e\x00\x02\x00\x07\x00\x33\x00\x01\x00\x2d\x00\x36\x00\x56\x00\x07\x00\x5c\x00\x5d\x00\x5e\x00\x1e\x00\x5c\x00\x5d\x00\x5e\x00\x0d\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x5c\x00\x5d\x00\x21\x00\x21\x00\x23\x00\x23\x00\x5c\x00\x5d\x00\x79\x00\x07\x00\x01\x00\x2a\x00\x2b\x00\x2c\x00\x04\x00\x07\x00\x79\x00\x2a\x00\x5c\x00\x04\x00\x33\x00\x76\x00\x0d\x00\x37\x00\x36\x00\x5c\x00\x5d\x00\x5e\x00\x5c\x00\x5d\x00\x77\x00\x78\x00\x79\x00\x36\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x5c\x00\x5d\x00\x21\x00\x01\x00\x23\x00\x43\x00\x20\x00\x21\x00\x79\x00\x23\x00\x48\x00\x2a\x00\x2b\x00\x2c\x00\x04\x00\x0d\x00\x2a\x00\x2b\x00\x2c\x00\x02\x00\x33\x00\x79\x00\x1c\x00\x36\x00\x56\x00\x33\x00\x7a\x00\x7b\x00\x36\x00\x1c\x00\x5c\x00\x5d\x00\x5e\x00\x4b\x00\x41\x00\x42\x00\x43\x00\x44\x00\x74\x00\x41\x00\x42\x00\x43\x00\x44\x00\x21\x00\x2d\x00\x23\x00\x77\x00\x78\x00\x79\x00\x79\x00\x79\x00\x39\x00\x2a\x00\x2b\x00\x2c\x00\x01\x00\x36\x00\x54\x00\x39\x00\x2a\x00\x5c\x00\x33\x00\x5e\x00\x03\x00\x36\x00\x21\x00\x06\x00\x0d\x00\x54\x00\x43\x00\x05\x00\x06\x00\x07\x00\x2c\x00\x48\x00\x41\x00\x42\x00\x43\x00\x44\x00\x02\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x01\x00\x36\x00\x54\x00\x56\x00\x78\x00\x79\x00\x1f\x00\x34\x00\x35\x00\x5c\x00\x79\x00\x5e\x00\x0d\x00\x20\x00\x21\x00\x2a\x00\x20\x00\x21\x00\x2d\x00\x05\x00\x06\x00\x07\x00\x1e\x00\x09\x00\x1a\x00\x0b\x00\x0c\x00\x0d\x00\x07\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x2d\x00\x36\x00\x5c\x00\x5d\x00\x36\x00\x19\x00\x01\x00\x1b\x00\x03\x00\x1d\x00\x1e\x00\x1f\x00\x79\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x34\x00\x35\x00\x5c\x00\x5d\x00\x5e\x00\x74\x00\x33\x00\x54\x00\x0a\x00\x79\x00\x37\x00\x5a\x00\x0e\x00\x5c\x00\x76\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x54\x00\x6e\x00\x5c\x00\x5d\x00\x5e\x00\x1c\x00\x73\x00\x74\x00\x1c\x00\x76\x00\x42\x00\x43\x00\x44\x00\x79\x00\x2c\x00\x5a\x00\x79\x00\x5c\x00\x30\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x39\x00\x6e\x00\x76\x00\x39\x00\x54\x00\x1c\x00\x73\x00\x74\x00\x4b\x00\x76\x00\x77\x00\x78\x00\x79\x00\x05\x00\x06\x00\x07\x00\x0a\x00\x09\x00\x79\x00\x0b\x00\x0c\x00\x0d\x00\x76\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x01\x00\x1c\x00\x78\x00\x79\x00\x1c\x00\x19\x00\x39\x00\x1b\x00\x76\x00\x1d\x00\x1e\x00\x1f\x00\x0d\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x07\x00\x77\x00\x78\x00\x79\x00\x1c\x00\x39\x00\x33\x00\x07\x00\x39\x00\x1c\x00\x37\x00\x1c\x00\x1c\x00\x01\x00\x1a\x00\x2a\x00\x3c\x00\x3d\x00\x2d\x00\x01\x00\x1a\x00\x03\x00\x42\x00\x43\x00\x44\x00\x0d\x00\x07\x00\x22\x00\x23\x00\x1a\x00\x25\x00\x0d\x00\x27\x00\x39\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x39\x00\x07\x00\x39\x00\x39\x00\x20\x00\x21\x00\x33\x00\x5a\x00\x76\x00\x5c\x00\x37\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x36\x00\x6e\x00\x5c\x00\x5d\x00\x5e\x00\x4c\x00\x73\x00\x74\x00\x1a\x00\x76\x00\x77\x00\x78\x00\x79\x00\x79\x00\x07\x00\x41\x00\x42\x00\x43\x00\x44\x00\x5a\x00\x50\x00\x5c\x00\x1a\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x07\x00\x6e\x00\x5c\x00\x5d\x00\x5e\x00\x07\x00\x73\x00\x74\x00\x5c\x00\x5d\x00\x77\x00\x78\x00\x79\x00\x01\x00\x79\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x2a\x00\x74\x00\x03\x00\x2d\x00\x0d\x00\x06\x00\x22\x00\x23\x00\x79\x00\x25\x00\x76\x00\x27\x00\x79\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x07\x00\x02\x00\x03\x00\x36\x00\x1e\x00\x06\x00\x33\x00\x58\x00\x59\x00\x2a\x00\x37\x00\x36\x00\x2d\x00\x1f\x00\x1a\x00\x36\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x79\x00\x41\x00\x42\x00\x43\x00\x44\x00\x07\x00\x22\x00\x23\x00\x76\x00\x25\x00\x4c\x00\x27\x00\x08\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x33\x00\x5a\x00\x75\x00\x5c\x00\x37\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x76\x00\x6e\x00\x5c\x00\x5d\x00\x6d\x00\x4c\x00\x73\x00\x74\x00\x00\x00\x01\x00\x77\x00\x78\x00\x79\x00\x78\x00\x79\x00\x01\x00\x77\x00\x78\x00\x79\x00\x5a\x00\x2b\x00\x5c\x00\x5b\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x07\x00\x6e\x00\x41\x00\x42\x00\x43\x00\x44\x00\x73\x00\x74\x00\x36\x00\x02\x00\x77\x00\x78\x00\x79\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x5b\x00\x41\x00\x42\x00\x43\x00\x44\x00\x07\x00\x46\x00\x47\x00\x02\x00\x22\x00\x23\x00\x2b\x00\x25\x00\x01\x00\x27\x00\x01\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x4e\x00\x4f\x00\x50\x00\x19\x00\x04\x00\x1b\x00\x33\x00\x1d\x00\x1e\x00\x1f\x00\x37\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x32\x00\x13\x00\x14\x00\x15\x00\x16\x00\x5b\x00\x33\x00\x01\x00\x4c\x00\x03\x00\x37\x00\x5c\x00\x5d\x00\x78\x00\x79\x00\x41\x00\x42\x00\x43\x00\x44\x00\x0d\x00\x5c\x00\x5d\x00\x5a\x00\x5e\x00\x5c\x00\x02\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x5a\x00\x6e\x00\x5c\x00\x04\x00\x5e\x00\x5f\x00\x73\x00\x74\x00\x2a\x00\x2b\x00\x77\x00\x78\x00\x79\x00\x21\x00\x5e\x00\x23\x00\x2a\x00\x2b\x00\x07\x00\x2a\x00\x2b\x00\x23\x00\x2a\x00\x2b\x00\x2c\x00\x73\x00\x74\x00\x02\x00\x2a\x00\x2b\x00\x2c\x00\x33\x00\x02\x00\x77\x00\x78\x00\x79\x00\x19\x00\x33\x00\x1b\x00\x2b\x00\x1d\x00\x1e\x00\x1f\x00\x04\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x07\x00\x2a\x00\x2b\x00\x36\x00\x5c\x00\x5d\x00\x33\x00\x4e\x00\x4f\x00\x50\x00\x37\x00\x77\x00\x78\x00\x79\x00\x41\x00\x42\x00\x43\x00\x44\x00\x19\x00\x04\x00\x1b\x00\x04\x00\x1d\x00\x1e\x00\x1f\x00\x2c\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x5a\x00\x2a\x00\x5c\x00\x01\x00\x5e\x00\x5f\x00\x33\x00\x79\x00\x2b\x00\x21\x00\x37\x00\x23\x00\x1e\x00\x79\x00\x5e\x00\x23\x00\x5c\x00\x5d\x00\x2a\x00\x2b\x00\x2c\x00\x07\x00\x2a\x00\x2b\x00\x2c\x00\x73\x00\x74\x00\x33\x00\x17\x00\x18\x00\x36\x00\x33\x00\x79\x00\x1e\x00\x36\x00\x5e\x00\x77\x00\x78\x00\x79\x00\x19\x00\x04\x00\x1b\x00\x04\x00\x1d\x00\x1e\x00\x1f\x00\x30\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x07\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x33\x00\x42\x00\x43\x00\x44\x00\x37\x00\x46\x00\x47\x00\x11\x00\x12\x00\x77\x00\x78\x00\x79\x00\x19\x00\x02\x00\x1b\x00\x5e\x00\x1d\x00\x1e\x00\x1f\x00\x04\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x79\x00\x36\x00\x77\x00\x78\x00\x79\x00\x04\x00\x33\x00\x77\x00\x78\x00\x79\x00\x37\x00\x23\x00\x41\x00\x42\x00\x43\x00\x44\x00\x32\x00\x04\x00\x2a\x00\x2b\x00\x2c\x00\x07\x00\x04\x00\x78\x00\x79\x00\x5c\x00\x5d\x00\x33\x00\x0b\x00\x0c\x00\x36\x00\x41\x00\x42\x00\x43\x00\x44\x00\x02\x00\x77\x00\x78\x00\x79\x00\x19\x00\x02\x00\x1b\x00\x02\x00\x1d\x00\x1e\x00\x1f\x00\x1f\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x07\x00\x01\x00\x2d\x00\x03\x00\x2a\x00\x2b\x00\x33\x00\x3c\x00\x78\x00\x79\x00\x37\x00\x2a\x00\x2b\x00\x0d\x00\x2b\x00\x77\x00\x78\x00\x79\x00\x19\x00\x2b\x00\x1b\x00\x02\x00\x1d\x00\x1e\x00\x1f\x00\x2b\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x79\x00\x05\x00\x06\x00\x07\x00\x5c\x00\x5d\x00\x33\x00\x36\x00\x1c\x00\x1d\x00\x37\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x36\x00\x21\x00\x2c\x00\x23\x00\x43\x00\x77\x00\x78\x00\x79\x00\x1e\x00\x48\x00\x2a\x00\x2b\x00\x2c\x00\x43\x00\x05\x00\x06\x00\x07\x00\x02\x00\x48\x00\x33\x00\x77\x00\x78\x00\x79\x00\x56\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x17\x00\x18\x00\x5e\x00\x56\x00\x02\x00\x42\x00\x43\x00\x44\x00\x02\x00\x5c\x00\x5d\x00\x5e\x00\x05\x00\x06\x00\x07\x00\x11\x00\x12\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x37\x00\x02\x00\x77\x00\x78\x00\x79\x00\x77\x00\x78\x00\x79\x00\x0b\x00\x0c\x00\x41\x00\x42\x00\x43\x00\x44\x00\x5a\x00\x02\x00\x5c\x00\x02\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x79\x00\x6e\x00\x77\x00\x78\x00\x79\x00\x2c\x00\x73\x00\x74\x00\x1e\x00\x76\x00\x5a\x00\x5c\x00\x5c\x00\x2d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x1e\x00\x6e\x00\x77\x00\x78\x00\x79\x00\x30\x00\x73\x00\x74\x00\x5a\x00\x76\x00\x5c\x00\x5b\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x02\x00\x6e\x00\x05\x00\x06\x00\x07\x00\x36\x00\x73\x00\x74\x00\x02\x00\x76\x00\x02\x00\x02\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x1f\x00\x43\x00\x04\x00\x02\x00\x36\x00\x02\x00\x48\x00\x4d\x00\x04\x00\x3b\x00\x3c\x00\x3d\x00\x05\x00\x06\x00\x07\x00\x41\x00\x42\x00\x43\x00\x44\x00\x04\x00\x56\x00\x04\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x3b\x00\x3c\x00\x3d\x00\x4e\x00\x4f\x00\x50\x00\x41\x00\x42\x00\x43\x00\x44\x00\x5e\x00\x5c\x00\x05\x00\x06\x00\x07\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x30\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x38\x00\x02\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x02\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x5a\x00\x79\x00\x5c\x00\x2b\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x79\x00\x6e\x00\x4e\x00\x4f\x00\x50\x00\x1f\x00\x73\x00\x74\x00\x5a\x00\x76\x00\x5c\x00\x01\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x02\x00\x6e\x00\x4e\x00\x4f\x00\x50\x00\x02\x00\x73\x00\x74\x00\x5a\x00\x76\x00\x5c\x00\x02\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x02\x00\x6e\x00\x05\x00\x06\x00\x07\x00\x2c\x00\x73\x00\x74\x00\x1f\x00\x76\x00\x2a\x00\x02\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x5e\x00\x04\x00\x04\x00\x4e\x00\x4f\x00\x50\x00\x4e\x00\x4f\x00\x50\x00\x3b\x00\x3c\x00\x3d\x00\x05\x00\x06\x00\x07\x00\x41\x00\x42\x00\x43\x00\x44\x00\x4e\x00\x4f\x00\x50\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x4e\x00\x4f\x00\x50\x00\x77\x00\x78\x00\x79\x00\x05\x00\x06\x00\x07\x00\x77\x00\x78\x00\x79\x00\x77\x00\x78\x00\x79\x00\x1f\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x38\x00\x01\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x2c\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x5a\x00\x79\x00\x5c\x00\x2c\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x1f\x00\x6e\x00\x77\x00\x78\x00\x79\x00\x02\x00\x73\x00\x74\x00\x5a\x00\x76\x00\x5c\x00\x02\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x08\x00\x6e\x00\x77\x00\x78\x00\x79\x00\x1f\x00\x73\x00\x74\x00\x5a\x00\x76\x00\x5c\x00\x01\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x5e\x00\x6e\x00\x05\x00\x06\x00\x07\x00\x1f\x00\x73\x00\x74\x00\x02\x00\x76\x00\x02\x00\x02\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x01\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x2b\x00\x42\x00\x43\x00\x44\x00\x2b\x00\x5b\x00\x05\x00\x06\x00\x07\x00\x41\x00\x42\x00\x43\x00\x44\x00\x77\x00\x78\x00\x79\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x77\x00\x78\x00\x79\x00\x5c\x00\x2a\x00\x5a\x00\x46\x00\x5c\x00\x02\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x2a\x00\x6e\x00\x2a\x00\x70\x00\x78\x00\x79\x00\x73\x00\x74\x00\x77\x00\x78\x00\x79\x00\x02\x00\x02\x00\x5a\x00\x79\x00\x5c\x00\x5e\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x2a\x00\x6e\x00\x4e\x00\x4f\x00\x50\x00\x1e\x00\x73\x00\x74\x00\x5a\x00\x76\x00\x5c\x00\x1a\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x1b\x00\x6e\x00\x0c\x00\x0d\x00\x19\x00\x10\x00\x73\x00\x74\x00\x04\x00\x76\x00\x01\x00\x5b\x00\x03\x00\x02\x00\x02\x00\x19\x00\x02\x00\x1b\x00\x5e\x00\x1d\x00\x1e\x00\x1f\x00\x0d\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x4e\x00\x4f\x00\x50\x00\x01\x00\x20\x00\x21\x00\x33\x00\x23\x00\x57\x00\x2b\x00\x37\x00\x4e\x00\x4f\x00\x50\x00\x2a\x00\x2b\x00\x2c\x00\x46\x00\x4e\x00\x4f\x00\x50\x00\x2b\x00\x5e\x00\x33\x00\x2c\x00\x01\x00\x36\x00\x2c\x00\x36\x00\x5a\x00\x01\x00\x5c\x00\x30\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x41\x00\x42\x00\x43\x00\x44\x00\x43\x00\x0d\x00\x2c\x00\x30\x00\x5a\x00\x48\x00\x5c\x00\x2c\x00\x5e\x00\x5f\x00\x60\x00\x37\x00\x01\x00\x73\x00\x74\x00\x3b\x00\x3c\x00\x3d\x00\x2c\x00\x56\x00\x03\x00\x41\x00\x42\x00\x43\x00\x44\x00\x5c\x00\x5d\x00\x5e\x00\x01\x00\x73\x00\x74\x00\x2b\x00\x02\x00\x77\x00\x78\x00\x79\x00\x30\x00\x31\x00\x2c\x00\x33\x00\x02\x00\x35\x00\x5b\x00\x5e\x00\x38\x00\x01\x00\x65\x00\x3b\x00\x01\x00\x3d\x00\x3e\x00\x3f\x00\x79\x00\x4e\x00\x4f\x00\x50\x00\x44\x00\x45\x00\x01\x00\x47\x00\x04\x00\x5e\x00\x4a\x00\x4b\x00\x01\x00\x4d\x00\x4e\x00\x5e\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x01\x00\x77\x00\x78\x00\x79\x00\x2c\x00\x65\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x01\x00\x77\x00\x78\x00\x79\x00\x1e\x00\x65\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x01\x00\x01\x00\x10\x00\x4e\x00\x4f\x00\x50\x00\x5a\x00\x1e\x00\x5c\x00\x01\x00\x5e\x00\x5f\x00\x60\x00\x1b\x00\x2b\x00\x38\x00\x2b\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x1e\x00\x41\x00\x42\x00\x43\x00\x44\x00\x2b\x00\x2b\x00\x2c\x00\x73\x00\x74\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x65\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x01\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x01\x00\x77\x00\x78\x00\x79\x00\x01\x00\x01\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x5b\x00\x31\x00\x10\x00\x65\x00\x2a\x00\x5a\x00\x36\x00\x5c\x00\x1b\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x1b\x00\x3e\x00\x77\x00\x78\x00\x79\x00\x1a\x00\x43\x00\x77\x00\x78\x00\x79\x00\x47\x00\x48\x00\x77\x00\x78\x00\x79\x00\x19\x00\x4d\x00\x73\x00\x74\x00\x50\x00\x2f\x00\x52\x00\x31\x00\x10\x00\x33\x00\x56\x00\x35\x00\x36\x00\xff\xff\x38\x00\xff\xff\xff\xff\x3b\x00\x5e\x00\x3d\x00\x3e\x00\x3f\x00\x4e\x00\x4f\x00\x50\x00\x43\x00\x44\x00\x45\x00\xff\xff\x47\x00\x48\x00\xff\xff\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\xff\xff\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\xff\xff\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x01\x00\x4e\x00\x4f\x00\x50\x00\xff\xff\x36\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x10\x00\x41\x00\x42\x00\x43\x00\x44\x00\xff\xff\x46\x00\x47\x00\x19\x00\xff\xff\x1b\x00\x1b\x00\x1d\x00\x1e\x00\x1f\x00\xff\xff\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x77\x00\x78\x00\x79\x00\x2f\x00\xff\xff\x31\x00\x33\x00\x33\x00\xff\xff\x35\x00\x37\x00\xff\xff\x38\x00\xff\xff\xff\xff\x3b\x00\xff\xff\x3d\x00\x3e\x00\x3f\x00\x4e\x00\x4f\x00\x50\x00\xff\xff\x44\x00\x45\x00\xff\xff\x47\x00\x78\x00\x79\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\xff\xff\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\xff\xff\xff\xff\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x01\x00\x77\x00\x78\x00\x79\x00\xff\xff\x37\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x10\x00\xff\xff\x77\x00\x78\x00\x79\x00\x01\x00\x02\x00\x03\x00\x01\x00\x02\x00\x03\x00\x1b\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x01\x00\x02\x00\x03\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\x3c\x00\x3d\x00\x2c\x00\xff\xff\xff\xff\x2f\x00\x42\x00\x43\x00\x44\x00\x33\x00\x01\x00\x35\x00\x03\x00\xff\xff\x38\x00\xff\xff\xff\xff\x3b\x00\xff\xff\x3d\x00\xff\xff\x3f\x00\x0d\x00\x01\x00\x02\x00\x03\x00\x44\x00\x45\x00\x77\x00\x78\x00\x79\x00\xff\xff\x4a\x00\x4b\x00\x4c\x00\x04\x00\x4e\x00\xff\xff\xff\xff\x51\x00\xff\xff\x53\x00\x54\x00\x55\x00\xff\xff\xff\xff\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x01\x00\x78\x00\x79\x00\xff\xff\x36\x00\xff\xff\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x10\x00\x01\x00\x43\x00\x03\x00\xff\xff\x05\x00\x06\x00\x48\x00\xff\xff\x09\x00\x0a\x00\x1b\x00\xff\xff\x38\x00\xff\xff\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x56\x00\x41\x00\x42\x00\x43\x00\x44\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\xff\xff\x2f\x00\x01\x00\x02\x00\x03\x00\x33\x00\x01\x00\x35\x00\x03\x00\xff\xff\x38\x00\xff\xff\xff\xff\x3b\x00\xff\xff\x3d\x00\xff\xff\x3f\x00\x0d\x00\x0d\x00\x0e\x00\x0f\x00\x44\x00\x45\x00\x01\x00\x02\x00\x03\x00\xff\xff\x4a\x00\x4b\x00\x4c\x00\xff\xff\x4e\x00\xff\xff\xff\xff\x51\x00\xff\xff\x53\x00\x54\x00\x55\x00\xff\xff\xff\xff\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x01\x00\x0d\x00\x0e\x00\x0f\x00\x36\x00\xff\xff\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x10\x00\xff\xff\x43\x00\x36\x00\xff\xff\xff\xff\xff\xff\x48\x00\x3b\x00\x3c\x00\x3d\x00\x1b\x00\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\xff\xff\xff\xff\x5a\x00\x56\x00\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x2b\x00\x2c\x00\x5e\x00\xff\xff\x2f\x00\x30\x00\xff\xff\x32\x00\xff\xff\x34\x00\xff\xff\xff\xff\x37\x00\xff\xff\x39\x00\x3a\x00\x37\x00\xff\xff\x73\x00\x74\x00\xff\xff\x40\x00\x41\x00\x42\x00\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x49\x00\x46\x00\x47\x00\x4c\x00\xff\xff\xff\xff\x4f\x00\xff\xff\xff\xff\x01\x00\xff\xff\x03\x00\x78\x00\x79\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x0d\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x01\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x10\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x77\x00\x78\x00\x79\x00\xff\xff\x1b\x00\xff\xff\xff\xff\x31\x00\xff\xff\x33\x00\xff\xff\x35\x00\xff\xff\xff\xff\x38\x00\xff\xff\xff\xff\x3b\x00\xff\xff\x3d\x00\x3e\x00\x3f\x00\xff\xff\xff\xff\x2f\x00\xff\xff\x44\x00\x45\x00\xff\xff\x47\x00\xff\xff\x36\x00\x4a\x00\x4b\x00\xff\xff\x4d\x00\x4e\x00\xff\xff\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x43\x00\x01\x00\xff\xff\x03\x00\xff\xff\x48\x00\x5c\x00\x5d\x00\x5e\x00\x4c\x00\x4d\x00\xff\xff\x5a\x00\x0d\x00\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x56\x00\xff\xff\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x01\x00\xff\xff\xff\xff\x73\x00\x74\x00\xff\xff\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x10\x00\xff\xff\x33\x00\xff\xff\x35\x00\x36\x00\xff\xff\x38\x00\xff\xff\xff\xff\x3b\x00\x1b\x00\x3d\x00\xff\xff\x3f\x00\xff\xff\xff\xff\xff\xff\x43\x00\x44\x00\x45\x00\xff\xff\xff\xff\x48\x00\xff\xff\x4a\x00\x4b\x00\xff\xff\xff\xff\x4e\x00\xff\xff\x2f\x00\x51\x00\xff\xff\x53\x00\x54\x00\x55\x00\x56\x00\x36\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5d\x00\x5e\x00\xff\xff\xff\xff\xff\xff\xff\xff\x01\x00\x43\x00\x03\x00\xff\xff\x01\x00\xff\xff\x48\x00\x01\x00\xff\xff\xff\xff\x4c\x00\x4d\x00\x0d\x00\x42\x00\x43\x00\x44\x00\x0d\x00\x46\x00\x47\x00\x0d\x00\x56\x00\xff\xff\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x01\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x10\x00\xff\xff\xff\xff\x36\x00\x5a\x00\xff\xff\x5c\x00\x36\x00\x5e\x00\x5f\x00\x36\x00\x1b\x00\xff\xff\xff\xff\xff\xff\xff\xff\x43\x00\x78\x00\x79\x00\xff\xff\x43\x00\x48\x00\xff\xff\x43\x00\xff\xff\x48\x00\xff\xff\xff\xff\x48\x00\x73\x00\x74\x00\x2f\x00\x5a\x00\xff\xff\x5c\x00\x56\x00\x5e\x00\x5f\x00\x36\x00\x56\x00\xff\xff\x5c\x00\x56\x00\x5e\x00\xff\xff\x5c\x00\x5d\x00\x5e\x00\x5c\x00\x5d\x00\x5e\x00\x43\x00\xff\xff\xff\xff\xff\xff\xff\xff\x48\x00\x73\x00\x74\x00\xff\xff\x4c\x00\x4d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x56\x00\xff\xff\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x01\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x01\x00\xff\xff\x03\x00\xff\xff\x0d\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x10\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x01\x00\x1b\x00\x03\x00\xff\xff\xff\xff\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x10\x00\x73\x00\x74\x00\x2c\x00\x2d\x00\x36\x00\x2f\x00\xff\xff\x5a\x00\xff\xff\x5c\x00\x1b\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x43\x00\xff\xff\xff\xff\xff\xff\xff\xff\x48\x00\xff\xff\xff\xff\xff\xff\xff\xff\x2c\x00\x2d\x00\xff\xff\x2f\x00\xff\xff\x73\x00\x74\x00\x4c\x00\xff\xff\x56\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\x5d\x00\x5e\x00\xff\xff\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\xff\xff\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x4c\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\xff\xff\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x01\x00\x73\x00\x74\x00\xff\xff\xff\xff\xff\xff\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x10\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\xff\xff\x42\x00\x43\x00\x44\x00\x1b\x00\x46\x00\x47\x00\x5a\x00\x01\x00\x5c\x00\x03\x00\x5e\x00\x5f\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x10\x00\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x36\x00\x73\x00\x74\x00\x1b\x00\xff\xff\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\xff\xff\x43\x00\xff\xff\xff\xff\xff\xff\xff\xff\x48\x00\xff\xff\x2c\x00\xff\xff\x4c\x00\x2f\x00\x78\x00\x79\x00\xff\xff\x01\x00\xff\xff\x03\x00\x73\x00\x74\x00\x56\x00\xff\xff\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x0d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x4c\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\xff\xff\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x01\x00\x73\x00\x74\x00\x36\x00\xff\xff\xff\xff\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x10\x00\x43\x00\xff\xff\xff\xff\xff\xff\xff\xff\x48\x00\xff\xff\x5a\x00\xff\xff\x5c\x00\x1b\x00\x5e\x00\x5f\x00\x60\x00\x01\x00\xff\xff\xff\xff\xff\xff\xff\xff\x56\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x5e\x00\xff\xff\x10\x00\x2f\x00\xff\xff\x73\x00\x74\x00\xff\xff\xff\xff\xff\xff\x36\x00\xff\xff\x5a\x00\x1b\x00\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\xff\xff\x43\x00\xff\xff\xff\xff\xff\xff\xff\xff\x48\x00\xff\xff\x2c\x00\xff\xff\x4c\x00\x2f\x00\xff\xff\xff\xff\xff\xff\x73\x00\x74\x00\xff\xff\xff\xff\xff\xff\x56\x00\xff\xff\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\xff\xff\xff\xff\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\xff\xff\x36\x00\xff\xff\xff\xff\xff\xff\x4c\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\xff\xff\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x01\x00\xff\xff\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x01\x00\x02\x00\xff\xff\xff\xff\x0d\x00\xff\xff\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x10\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x01\x00\x1b\x00\xff\xff\xff\xff\xff\xff\xff\xff\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x79\x00\xff\xff\x10\x00\x73\x00\x74\x00\xff\xff\xff\xff\x36\x00\x2f\x00\xff\xff\x5a\x00\xff\xff\x5c\x00\x1b\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x43\x00\xff\xff\xff\xff\xff\xff\xff\xff\x48\x00\xff\xff\xff\xff\xff\xff\xff\xff\x2c\x00\xff\xff\xff\xff\x2f\x00\xff\xff\x73\x00\x74\x00\x4c\x00\xff\xff\x56\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\x5e\x00\xff\xff\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\xff\xff\xff\xff\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x4c\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\xff\xff\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\xff\xff\xff\xff\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x01\x00\x73\x00\x74\x00\xff\xff\xff\xff\xff\xff\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x10\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\xff\xff\x42\x00\x43\x00\x44\x00\xff\xff\x1b\x00\x01\x00\x02\x00\xff\xff\xff\xff\xff\xff\xff\xff\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x10\x00\x2c\x00\xff\xff\x5a\x00\x2f\x00\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\xff\xff\x1b\x00\x01\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x10\x00\x73\x00\x74\x00\xff\xff\x2f\x00\xff\xff\x4c\x00\x78\x00\x79\x00\xff\xff\xff\xff\x1b\x00\xff\xff\xff\xff\x1e\x00\xff\xff\xff\xff\xff\xff\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\xff\xff\xff\xff\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x2f\x00\xff\xff\x4c\x00\xff\xff\xff\xff\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\xff\xff\xff\xff\xff\xff\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\xff\xff\xff\xff\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\xff\xff\xff\xff\x4c\x00\x73\x00\x74\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\xff\xff\x42\x00\x43\x00\x44\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\xff\xff\xff\xff\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x01\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x10\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x01\x00\x1b\x00\xff\xff\xff\xff\xff\xff\xff\xff\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x78\x00\x79\x00\x10\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\x1b\x00\xff\xff\xff\xff\xff\xff\x01\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x10\x00\x2f\x00\x37\x00\xff\xff\xff\xff\x4c\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x1b\x00\x41\x00\x42\x00\x43\x00\x44\x00\xff\xff\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\xff\xff\xff\xff\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x4c\x00\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\xff\xff\xff\xff\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x4c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x77\x00\x78\x00\x79\x00\xff\xff\xff\xff\xff\xff\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\xff\xff\xff\xff\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x01\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x10\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\xff\xff\x42\x00\x43\x00\x44\x00\x01\x00\x1b\x00\xff\xff\xff\xff\xff\xff\xff\xff\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x10\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\x1b\x00\xff\xff\xff\xff\xff\xff\x01\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x10\x00\x2f\x00\xff\xff\xff\xff\xff\xff\x4c\x00\x78\x00\x79\x00\xff\xff\xff\xff\xff\xff\x1b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\xff\xff\xff\xff\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x4c\x00\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\x01\x00\xff\xff\x03\x00\xff\xff\xff\xff\xff\xff\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\xff\xff\x0d\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x4c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x01\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x0d\x00\xff\xff\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x01\x00\xff\xff\xff\xff\xff\xff\x36\x00\xff\xff\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x10\x00\xff\xff\x43\x00\xff\xff\xff\xff\xff\xff\xff\xff\x48\x00\xff\xff\xff\xff\xff\xff\x1b\x00\x30\x00\x31\x00\xff\xff\x33\x00\xff\xff\x35\x00\xff\xff\xff\xff\x38\x00\x56\x00\xff\xff\x3b\x00\xff\xff\x3d\x00\x3e\x00\x3f\x00\xff\xff\x5e\x00\xff\xff\x2f\x00\x44\x00\x45\x00\xff\xff\x47\x00\xff\xff\xff\xff\x4a\x00\x4b\x00\xff\xff\x4d\x00\x4e\x00\xff\xff\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x01\x00\xff\xff\x03\x00\xff\xff\xff\xff\xff\xff\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x4c\x00\xff\xff\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\xff\xff\xff\xff\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\xff\xff\x01\x00\x31\x00\x03\x00\x33\x00\xff\xff\x35\x00\x36\x00\xff\xff\x38\x00\xff\xff\xff\xff\x3b\x00\x0d\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\xff\xff\xff\xff\x43\x00\x44\x00\x45\x00\xff\xff\x47\x00\x48\x00\xff\xff\x4a\x00\x4b\x00\xff\xff\x4d\x00\x4e\x00\xff\xff\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\x5d\x00\x5e\x00\x01\x00\x31\x00\x03\x00\x33\x00\xff\xff\x35\x00\x36\x00\xff\xff\x38\x00\xff\xff\xff\xff\x3b\x00\x0d\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\xff\xff\xff\xff\x43\x00\x44\x00\x45\x00\xff\xff\x47\x00\x48\x00\xff\xff\x4a\x00\x4b\x00\xff\xff\x4d\x00\x4e\x00\xff\xff\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\x5d\x00\x5e\x00\x01\x00\x31\x00\x03\x00\x33\x00\xff\xff\x35\x00\x36\x00\xff\xff\x38\x00\xff\xff\xff\xff\x3b\x00\x0d\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\xff\xff\xff\xff\x43\x00\x44\x00\x45\x00\xff\xff\x47\x00\x48\x00\xff\xff\x4a\x00\x4b\x00\xff\xff\x4d\x00\x4e\x00\xff\xff\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\x5d\x00\x5e\x00\x01\x00\x31\x00\xff\xff\x33\x00\xff\xff\x35\x00\x36\x00\xff\xff\x38\x00\xff\xff\xff\xff\x3b\x00\x0d\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\xff\xff\xff\xff\x43\x00\x44\x00\x45\x00\xff\xff\x47\x00\x48\x00\xff\xff\x4a\x00\x4b\x00\xff\xff\x4d\x00\x4e\x00\xff\xff\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\x5d\x00\x5e\x00\x01\x00\x31\x00\xff\xff\x33\x00\xff\xff\x35\x00\x36\x00\xff\xff\x38\x00\xff\xff\xff\xff\x3b\x00\x0d\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\xff\xff\xff\xff\x43\x00\x44\x00\x45\x00\xff\xff\x47\x00\x48\x00\xff\xff\x4a\x00\x4b\x00\xff\xff\x4d\x00\x4e\x00\xff\xff\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\x5d\x00\x5e\x00\x01\x00\x31\x00\xff\xff\x33\x00\xff\xff\x35\x00\x36\x00\xff\xff\x38\x00\xff\xff\xff\xff\x3b\x00\x0d\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\xff\xff\xff\xff\x43\x00\x44\x00\x45\x00\xff\xff\x47\x00\x48\x00\xff\xff\x4a\x00\x4b\x00\xff\xff\x4d\x00\x4e\x00\xff\xff\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\x5d\x00\x5e\x00\x01\x00\x31\x00\xff\xff\x33\x00\xff\xff\x35\x00\x36\x00\xff\xff\x38\x00\xff\xff\xff\xff\x3b\x00\x0d\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\xff\xff\xff\xff\x43\x00\x44\x00\x45\x00\xff\xff\x47\x00\x48\x00\xff\xff\x4a\x00\x4b\x00\xff\xff\x4d\x00\x4e\x00\xff\xff\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\x5d\x00\x5e\x00\x01\x00\x31\x00\xff\xff\x33\x00\xff\xff\x35\x00\x36\x00\xff\xff\x38\x00\xff\xff\xff\xff\x3b\x00\x0d\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\xff\xff\xff\xff\x43\x00\x44\x00\x45\x00\xff\xff\x47\x00\x48\x00\xff\xff\x4a\x00\x4b\x00\xff\xff\x4d\x00\x4e\x00\xff\xff\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\x5d\x00\x5e\x00\x01\x00\x31\x00\xff\xff\x33\x00\xff\xff\x35\x00\x36\x00\xff\xff\x38\x00\xff\xff\xff\xff\x3b\x00\x0d\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\xff\xff\xff\xff\x43\x00\x44\x00\x45\x00\xff\xff\x47\x00\x48\x00\xff\xff\x4a\x00\x4b\x00\xff\xff\x4d\x00\x4e\x00\xff\xff\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\x5d\x00\x5e\x00\x01\x00\x31\x00\x03\x00\x33\x00\xff\xff\x35\x00\x36\x00\xff\xff\x38\x00\xff\xff\xff\xff\x3b\x00\x0d\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\xff\xff\xff\xff\x43\x00\x44\x00\x45\x00\xff\xff\x47\x00\x48\x00\xff\xff\x4a\x00\x4b\x00\xff\xff\x4d\x00\x4e\x00\xff\xff\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\x5d\x00\x5e\x00\x01\x00\x31\x00\xff\xff\x33\x00\xff\xff\x35\x00\x36\x00\xff\xff\x38\x00\xff\xff\xff\xff\x3b\x00\x0d\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\xff\xff\xff\xff\x43\x00\x44\x00\x45\x00\xff\xff\x47\x00\x48\x00\xff\xff\x4a\x00\x4b\x00\xff\xff\x4d\x00\x4e\x00\xff\xff\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5d\x00\x5e\x00\x01\x00\x31\x00\xff\xff\x33\x00\xff\xff\x35\x00\x36\x00\xff\xff\x38\x00\xff\xff\xff\xff\x3b\x00\x0d\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\xff\xff\xff\xff\x43\x00\x44\x00\x45\x00\xff\xff\x47\x00\x48\x00\xff\xff\x4a\x00\x4b\x00\xff\xff\x4d\x00\x4e\x00\xff\xff\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\x5d\x00\x5e\x00\x01\x00\x31\x00\xff\xff\x33\x00\xff\xff\x35\x00\x36\x00\xff\xff\x38\x00\xff\xff\xff\xff\x3b\x00\x0d\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\xff\xff\xff\xff\x43\x00\x44\x00\x45\x00\xff\xff\x47\x00\x48\x00\xff\xff\x4a\x00\x4b\x00\xff\xff\x4d\x00\x4e\x00\xff\xff\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\x5d\x00\x5e\x00\x01\x00\x31\x00\x03\x00\x33\x00\xff\xff\x35\x00\x36\x00\xff\xff\x38\x00\xff\xff\xff\xff\x3b\x00\x0d\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\xff\xff\xff\xff\x43\x00\x44\x00\x45\x00\xff\xff\x47\x00\x48\x00\xff\xff\x4a\x00\x4b\x00\xff\xff\x4d\x00\x4e\x00\xff\xff\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\x5d\x00\x5e\x00\x01\x00\x31\x00\x03\x00\x33\x00\xff\xff\x35\x00\xff\xff\xff\xff\x38\x00\xff\xff\xff\xff\x3b\x00\x0d\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\xff\xff\xff\xff\xff\xff\x44\x00\x45\x00\xff\xff\x47\x00\xff\xff\xff\xff\x4a\x00\x4b\x00\xff\xff\x4d\x00\x4e\x00\xff\xff\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\xff\xff\x01\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\x5d\x00\x5e\x00\xff\xff\x31\x00\xff\xff\x33\x00\x0d\x00\x35\x00\xff\xff\xff\xff\x38\x00\xff\xff\xff\xff\x3b\x00\xff\xff\x3d\x00\x3e\x00\x3f\x00\xff\xff\xff\xff\xff\xff\xff\xff\x44\x00\x45\x00\xff\xff\x47\x00\xff\xff\xff\xff\x4a\x00\x4b\x00\xff\xff\x4d\x00\x4e\x00\xff\xff\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\xff\xff\x01\x00\x31\x00\xff\xff\x33\x00\xff\xff\x35\x00\x5d\x00\x5e\x00\x38\x00\xff\xff\xff\xff\x3b\x00\x0d\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\xff\xff\xff\xff\xff\xff\x44\x00\x45\x00\xff\xff\x47\x00\xff\xff\xff\xff\x4a\x00\x4b\x00\xff\xff\x4d\x00\x4e\x00\xff\xff\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\xff\xff\xff\xff\xff\xff\xff\xff\x01\x00\xff\xff\x5c\x00\x5d\x00\x5e\x00\xff\xff\x31\x00\xff\xff\x33\x00\xff\xff\x35\x00\xff\xff\x0d\x00\x38\x00\xff\xff\x01\x00\x3b\x00\xff\xff\x3d\x00\x3e\x00\x3f\x00\xff\xff\xff\xff\xff\xff\xff\xff\x44\x00\x45\x00\x0d\x00\x47\x00\xff\xff\xff\xff\x4a\x00\x4b\x00\xff\xff\x4d\x00\x4e\x00\xff\xff\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x01\x00\x1e\x00\x03\x00\xff\xff\xff\xff\xff\xff\x5c\x00\x5d\x00\x5e\x00\xff\xff\x36\x00\xff\xff\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x33\x00\x43\x00\x35\x00\xff\xff\xff\xff\x38\x00\x48\x00\xff\xff\x3b\x00\xff\xff\x3d\x00\xff\xff\x3f\x00\xff\xff\xff\xff\xff\xff\xff\xff\x44\x00\x45\x00\xff\xff\x56\x00\xff\xff\xff\xff\x4a\x00\x4b\x00\xff\xff\x5c\x00\x4e\x00\x5e\x00\xff\xff\x51\x00\x36\x00\x53\x00\x54\x00\x55\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\x5d\x00\x5e\x00\x43\x00\xff\xff\xff\xff\x1e\x00\x1f\x00\x48\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\xff\xff\x56\x00\xff\xff\xff\xff\xff\xff\xff\xff\x33\x00\x5c\x00\xff\xff\x5e\x00\x37\x00\xff\xff\xff\xff\xff\xff\xff\xff\x3c\x00\x3d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x42\x00\x43\x00\x44\x00\xff\xff\xff\xff\xff\xff\x48\x00\x49\x00\x4a\x00\xff\xff\xff\xff\xff\xff\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\xff\xff\xff\xff\xff\xff\x1e\x00\x1f\x00\xff\xff\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x33\x00\x42\x00\x43\x00\x44\x00\x37\x00\x46\x00\x47\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x77\x00\x78\x00\x79\x00\x42\x00\x43\x00\x44\x00\xff\xff\xff\xff\xff\xff\x48\x00\x49\x00\x4a\x00\xff\xff\xff\xff\xff\xff\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x1e\x00\x1f\x00\xff\xff\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x33\x00\xff\xff\x78\x00\x79\x00\x37\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\xff\xff\x42\x00\x43\x00\x44\x00\xff\xff\x77\x00\x78\x00\x79\x00\xff\xff\xff\xff\xff\xff\x48\x00\x49\x00\x4a\x00\xff\xff\xff\xff\xff\xff\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x1e\x00\x1f\x00\xff\xff\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x33\x00\x42\x00\x43\x00\x44\x00\x37\x00\x46\x00\x47\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x78\x00\x79\x00\xff\xff\x77\x00\x78\x00\x79\x00\xff\xff\xff\xff\xff\xff\x48\x00\x49\x00\x4a\x00\x4b\x00\xff\xff\xff\xff\xff\xff\xff\xff\x1e\x00\x1f\x00\xff\xff\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x33\x00\xff\xff\xff\xff\xff\xff\x37\x00\x78\x00\x79\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x77\x00\x78\x00\x79\x00\x48\x00\x49\x00\x4a\x00\xff\xff\xff\xff\xff\xff\x1e\x00\x1f\x00\xff\xff\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\xff\xff\x20\x00\x21\x00\xff\xff\x23\x00\xff\xff\x33\x00\xff\xff\xff\xff\xff\xff\x37\x00\x2a\x00\x2b\x00\x2c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x33\x00\xff\xff\x21\x00\x36\x00\x23\x00\xff\xff\x77\x00\x78\x00\x79\x00\x4a\x00\xff\xff\x2a\x00\x2b\x00\x2c\x00\x41\x00\x42\x00\x43\x00\x44\x00\xff\xff\xff\xff\x33\x00\xff\xff\xff\xff\x36\x00\xff\xff\xff\xff\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\xff\xff\xff\xff\x77\x00\x78\x00\x79\x00\xff\xff\x21\x00\xff\xff\x23\x00\xff\xff\x21\x00\xff\xff\x23\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x79\x00\x2a\x00\x2b\x00\x2c\x00\xff\xff\xff\xff\x33\x00\xff\xff\xff\xff\xff\xff\x33\x00\xff\xff\xff\xff\x36\x00\xff\xff\x3c\x00\x3d\x00\xff\xff\xff\xff\x78\x00\x79\x00\x42\x00\x43\x00\x44\x00\x41\x00\x42\x00\x43\x00\x44\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x21\x00\xff\xff\x23\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x33\x00\x21\x00\xff\xff\x23\x00\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\x23\x00\x2a\x00\x2b\x00\x2c\x00\xff\xff\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x33\x00\x79\x00\xff\xff\x36\x00\x78\x00\x79\x00\x33\x00\xff\xff\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x22\x00\x23\x00\xff\xff\x25\x00\xff\xff\x27\x00\xff\xff\x29\x00\x2a\x00\x2b\x00\x2c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x22\x00\x23\x00\x33\x00\x25\x00\xff\xff\x27\x00\x37\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\xff\xff\x79\x00\xff\xff\xff\xff\xff\xff\xff\xff\x33\x00\xff\xff\xff\xff\xff\xff\x37\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x4c\x00\xff\xff\xff\xff\xff\xff\x79\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x79\x00\xff\xff\xff\xff\xff\xff\x5a\x00\x4c\x00\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\xff\xff\x6e\x00\xff\xff\xff\xff\xff\xff\xff\xff\x73\x00\x74\x00\xff\xff\xff\xff\x77\x00\x78\x00\x79\x00\x22\x00\x23\x00\xff\xff\x25\x00\xff\xff\x27\x00\xff\xff\x29\x00\x2a\x00\x2b\x00\x2c\x00\xff\xff\x77\x00\x78\x00\x79\x00\xff\xff\xff\xff\x33\x00\xff\xff\xff\xff\xff\xff\x37\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x22\x00\x23\x00\xff\xff\x25\x00\xff\xff\x27\x00\x4c\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x73\x00\x74\x00\xff\xff\xff\xff\xff\xff\xff\xff\x33\x00\xff\xff\xff\xff\x5a\x00\x37\x00\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\xff\xff\x6e\x00\xff\xff\x4c\x00\xff\xff\xff\xff\x73\x00\x74\x00\xff\xff\xff\xff\x77\x00\x78\x00\x79\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\xff\xff\x6e\x00\xff\xff\xff\xff\xff\xff\xff\xff\x73\x00\x74\x00\xff\xff\xff\xff\x77\x00\x78\x00\x79\x00\x22\x00\x23\x00\xff\xff\x25\x00\xff\xff\x27\x00\xff\xff\x29\x00\x2a\x00\x2b\x00\x2c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x33\x00\xff\xff\xff\xff\xff\xff\x37\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\x22\x00\x23\x00\xff\xff\x25\x00\xff\xff\x27\x00\x4c\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x73\x00\x74\x00\xff\xff\xff\xff\xff\xff\xff\xff\x33\x00\xff\xff\xff\xff\x5a\x00\x37\x00\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\xff\xff\x6e\x00\xff\xff\x4c\x00\xff\xff\xff\xff\x73\x00\x74\x00\xff\xff\xff\xff\x77\x00\x78\x00\x79\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\xff\xff\x6e\x00\xff\xff\xff\xff\xff\xff\xff\xff\x73\x00\x74\x00\xff\xff\xff\xff\x77\x00\x78\x00\x79\x00\x22\x00\x23\x00\xff\xff\x25\x00\xff\xff\x27\x00\xff\xff\x29\x00\x2a\x00\x2b\x00\x2c\x00\xff\xff\x2e\x00\x2f\x00\x30\x00\x22\x00\x23\x00\x33\x00\x25\x00\xff\xff\x27\x00\x37\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\xff\xff\x2e\x00\x2f\x00\x30\x00\x22\x00\x23\x00\x33\x00\x25\x00\xff\xff\x27\x00\x37\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x33\x00\xff\xff\x22\x00\x23\x00\x37\x00\x25\x00\xff\xff\x27\x00\xff\xff\x29\x00\x2a\x00\x2b\x00\x2c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x33\x00\xff\xff\xff\xff\xff\xff\x37\x00\xff\xff\x4c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x77\x00\x78\x00\x79\x00\xff\xff\x22\x00\x23\x00\x4c\x00\x25\x00\xff\xff\x27\x00\xff\xff\x29\x00\x2a\x00\x2b\x00\x2c\x00\x77\x00\x78\x00\x79\x00\xff\xff\x23\x00\xff\xff\x33\x00\xff\xff\xff\xff\xff\xff\x37\x00\x2a\x00\x2b\x00\x2c\x00\x36\x00\x77\x00\x78\x00\x79\x00\xff\xff\xff\xff\x33\x00\xff\xff\xff\xff\x36\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\xff\xff\xff\xff\x4c\x00\xff\xff\xff\xff\x77\x00\x78\x00\x79\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\xff\xff\xff\xff\xff\xff\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x23\x00\xff\xff\xff\xff\x36\x00\xff\xff\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x32\x00\x33\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x77\x00\x78\x00\x79\x00\xff\xff\xff\xff\x77\x00\x78\x00\x79\x00\x41\x00\x42\x00\x43\x00\x44\x00\xff\xff\xff\xff\xff\xff\x78\x00\x79\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x36\x00\xff\xff\xff\xff\xff\xff\x71\x00\xff\xff\x73\x00\x74\x00\xff\xff\x37\x00\x77\x00\x78\x00\x79\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\xff\xff\x46\x00\x47\x00\xff\xff\xff\xff\x79\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x37\x00\xff\xff\xff\xff\x36\x00\x71\x00\xff\xff\x73\x00\x74\x00\x3b\x00\x3c\x00\x3d\x00\xff\xff\x79\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x77\x00\x78\x00\x79\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\xff\xff\xff\xff\xff\xff\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x71\x00\xff\xff\x73\x00\x74\x00\xff\xff\xff\xff\x77\x00\x78\x00\x79\x00\x37\x00\x77\x00\x78\x00\x79\x00\x3b\x00\x3c\x00\x3d\x00\x37\x00\x36\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\xff\xff\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\xff\xff\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\xff\xff\x77\x00\x78\x00\x79\x00\xff\xff\xff\xff\x73\x00\x74\x00\x77\x00\x78\x00\x79\x00\x2b\x00\xff\xff\x2d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x33\x00\xff\xff\x35\x00\xff\xff\xff\xff\x38\x00\xff\xff\xff\xff\x3b\x00\xff\xff\x3d\x00\xff\xff\x3f\x00\xff\xff\xff\xff\xff\xff\xff\xff\x44\x00\x45\x00\xff\xff\xff\xff\xff\xff\xff\xff\x4a\x00\x4b\x00\xff\xff\xff\xff\x4e\x00\xff\xff\xff\xff\x51\x00\xff\xff\x53\x00\x54\x00\x55\x00\xff\xff\xff\xff\x2b\x00\xff\xff\x2d\x00\xff\xff\xff\xff\x5d\x00\x5e\x00\x5f\x00\x33\x00\xff\xff\x35\x00\xff\xff\xff\xff\x38\x00\xff\xff\xff\xff\x3b\x00\xff\xff\x3d\x00\xff\xff\x3f\x00\xff\xff\xff\xff\xff\xff\xff\xff\x44\x00\x45\x00\xff\xff\xff\xff\xff\xff\xff\xff\x4a\x00\x4b\x00\xff\xff\xff\xff\x4e\x00\xff\xff\x2b\x00\x51\x00\xff\xff\x53\x00\x54\x00\x55\x00\x31\x00\xff\xff\xff\xff\xff\xff\xff\xff\x36\x00\xff\xff\x5d\x00\x5e\x00\x5f\x00\x2b\x00\xff\xff\xff\xff\x3e\x00\xff\xff\xff\xff\x31\x00\xff\xff\x43\x00\xff\xff\xff\xff\x36\x00\x47\x00\x48\x00\xff\xff\xff\xff\xff\xff\xff\xff\x4d\x00\x3e\x00\xff\xff\x50\x00\xff\xff\x52\x00\x43\x00\xff\xff\xff\xff\x56\x00\x47\x00\x48\x00\xff\xff\xff\xff\xff\xff\xff\xff\x4d\x00\x5e\x00\xff\xff\x50\x00\xff\xff\x52\x00\x2c\x00\xff\xff\xff\xff\x56\x00\xff\xff\x31\x00\xff\xff\x33\x00\xff\xff\x35\x00\xff\xff\x5e\x00\x38\x00\xff\xff\xff\xff\x3b\x00\xff\xff\x3d\x00\x3e\x00\x3f\x00\xff\xff\xff\xff\xff\xff\xff\xff\x44\x00\x45\x00\xff\xff\x47\x00\xff\xff\xff\xff\x4a\x00\x4b\x00\xff\xff\x4d\x00\x4e\x00\xff\xff\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2e\x00\x5d\x00\x5e\x00\x31\x00\xff\xff\x33\x00\xff\xff\x35\x00\xff\xff\xff\xff\x38\x00\xff\xff\xff\xff\x3b\x00\xff\xff\x3d\x00\x3e\x00\x3f\x00\xff\xff\xff\xff\xff\xff\xff\xff\x44\x00\x45\x00\xff\xff\x47\x00\xff\xff\xff\xff\x4a\x00\x4b\x00\xff\xff\x4d\x00\x4e\x00\xff\xff\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5d\x00\x5e\x00\x31\x00\xff\xff\x33\x00\xff\xff\x35\x00\x36\x00\xff\xff\x38\x00\xff\xff\xff\xff\x3b\x00\xff\xff\x3d\x00\x3e\x00\x3f\x00\xff\xff\xff\xff\xff\xff\x43\x00\x44\x00\x45\x00\xff\xff\x47\x00\x48\x00\xff\xff\x4a\x00\x4b\x00\xff\xff\x4d\x00\x4e\x00\xff\xff\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\x5d\x00\x5e\x00\x31\x00\xff\xff\x33\x00\xff\xff\x35\x00\x36\x00\xff\xff\x38\x00\xff\xff\xff\xff\x3b\x00\xff\xff\x3d\x00\x3e\x00\x3f\x00\xff\xff\xff\xff\xff\xff\x43\x00\x44\x00\x45\x00\xff\xff\x47\x00\x48\x00\xff\xff\x4a\x00\x4b\x00\xff\xff\x4d\x00\x4e\x00\xff\xff\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5d\x00\x5e\x00\x31\x00\xff\xff\x33\x00\xff\xff\x35\x00\x36\x00\xff\xff\x38\x00\xff\xff\xff\xff\x3b\x00\xff\xff\x3d\x00\x3e\x00\x3f\x00\xff\xff\xff\xff\xff\xff\x43\x00\x44\x00\x45\x00\xff\xff\x47\x00\x48\x00\xff\xff\x4a\x00\x4b\x00\xff\xff\x4d\x00\x4e\x00\xff\xff\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5d\x00\x5e\x00\x31\x00\xff\xff\x33\x00\xff\xff\x35\x00\x36\x00\xff\xff\x38\x00\xff\xff\xff\xff\x3b\x00\xff\xff\x3d\x00\x3e\x00\x3f\x00\xff\xff\xff\xff\xff\xff\x43\x00\x44\x00\x45\x00\xff\xff\x47\x00\x48\x00\xff\xff\x4a\x00\x4b\x00\xff\xff\x4d\x00\x4e\x00\xff\xff\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\xff\xff\x31\x00\xff\xff\x33\x00\xff\xff\x35\x00\x5d\x00\x5e\x00\x38\x00\xff\xff\xff\xff\x3b\x00\xff\xff\x3d\x00\x3e\x00\x3f\x00\xff\xff\xff\xff\xff\xff\xff\xff\x44\x00\x45\x00\xff\xff\x47\x00\xff\xff\xff\xff\x4a\x00\x4b\x00\xff\xff\x4d\x00\x4e\x00\xff\xff\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\xff\xff\xff\xff\x31\x00\xff\xff\x33\x00\xff\xff\x35\x00\x5d\x00\x5e\x00\x38\x00\xff\xff\xff\xff\x3b\x00\xff\xff\x3d\x00\x3e\x00\x3f\x00\xff\xff\xff\xff\xff\xff\xff\xff\x44\x00\x45\x00\xff\xff\x47\x00\xff\xff\xff\xff\x4a\x00\x4b\x00\xff\xff\x4d\x00\x4e\x00\xff\xff\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5d\x00\x5e\x00\x31\x00\xff\xff\x33\x00\xff\xff\x35\x00\x36\x00\xff\xff\x38\x00\xff\xff\xff\xff\x3b\x00\xff\xff\xff\xff\x3e\x00\x3f\x00\xff\xff\xff\xff\xff\xff\x43\x00\x44\x00\x45\x00\xff\xff\x47\x00\x48\x00\xff\xff\x4a\x00\x4b\x00\xff\xff\x4d\x00\xff\xff\xff\xff\x50\x00\xff\xff\x52\x00\xff\xff\x54\x00\x55\x00\x56\x00\x33\x00\xff\xff\x35\x00\xff\xff\xff\xff\x38\x00\xff\xff\x5e\x00\x3b\x00\xff\xff\x3d\x00\xff\xff\x3f\x00\xff\xff\xff\xff\xff\xff\xff\xff\x44\x00\x45\x00\xff\xff\xff\xff\xff\xff\xff\xff\x4a\x00\x4b\x00\xff\xff\xff\xff\x4e\x00\xff\xff\xff\xff\x51\x00\xff\xff\x53\x00\x54\x00\x55\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5d\x00\x5e\x00\x5f\x00\x33\x00\xff\xff\x35\x00\x36\x00\xff\xff\x38\x00\xff\xff\xff\xff\x3b\x00\xff\xff\x3d\x00\xff\xff\x3f\x00\xff\xff\xff\xff\xff\xff\x43\x00\x44\x00\x45\x00\xff\xff\xff\xff\x48\x00\xff\xff\x4a\x00\x4b\x00\xff\xff\xff\xff\x4e\x00\xff\xff\xff\xff\x51\x00\xff\xff\x53\x00\x54\x00\x55\x00\x56\x00\x33\x00\xff\xff\x35\x00\x36\x00\xff\xff\x38\x00\x5d\x00\x5e\x00\x3b\x00\xff\xff\x3d\x00\xff\xff\x3f\x00\xff\xff\xff\xff\xff\xff\x43\x00\x44\x00\x45\x00\xff\xff\xff\xff\x48\x00\xff\xff\x4a\x00\x4b\x00\xff\xff\xff\xff\x4e\x00\xff\xff\xff\xff\x51\x00\xff\xff\x53\x00\x54\x00\x55\x00\x56\x00\x33\x00\xff\xff\x35\x00\x36\x00\xff\xff\x38\x00\x5d\x00\x5e\x00\x3b\x00\xff\xff\x3d\x00\xff\xff\x3f\x00\xff\xff\xff\xff\xff\xff\x43\x00\x44\x00\x45\x00\xff\xff\xff\xff\x48\x00\xff\xff\x4a\x00\x4b\x00\xff\xff\xff\xff\x4e\x00\xff\xff\xff\xff\x51\x00\xff\xff\x53\x00\x54\x00\x55\x00\x56\x00\x33\x00\xff\xff\x35\x00\x36\x00\xff\xff\x38\x00\x5d\x00\x5e\x00\x3b\x00\xff\xff\x3d\x00\xff\xff\x3f\x00\xff\xff\xff\xff\xff\xff\x43\x00\x44\x00\x45\x00\xff\xff\xff\xff\x48\x00\xff\xff\x4a\x00\x4b\x00\xff\xff\xff\xff\x4e\x00\xff\xff\xff\xff\x51\x00\xff\xff\x53\x00\x54\x00\x55\x00\x56\x00\x33\x00\xff\xff\x35\x00\xff\xff\xff\xff\x38\x00\x5d\x00\x5e\x00\x3b\x00\xff\xff\x3d\x00\xff\xff\x3f\x00\xff\xff\xff\xff\xff\xff\xff\xff\x44\x00\x45\x00\xff\xff\xff\xff\xff\xff\xff\xff\x4a\x00\x4b\x00\xff\xff\xff\xff\x4e\x00\xff\xff\xff\xff\x51\x00\xff\xff\x53\x00\x54\x00\x55\x00\xff\xff\x33\x00\xff\xff\x35\x00\xff\xff\xff\xff\x38\x00\x5d\x00\x5e\x00\x3b\x00\xff\xff\x3d\x00\xff\xff\x3f\x00\xff\xff\xff\xff\xff\xff\xff\xff\x44\x00\x45\x00\xff\xff\xff\xff\xff\xff\xff\xff\x4a\x00\x4b\x00\xff\xff\xff\xff\x4e\x00\xff\xff\xff\xff\x51\x00\xff\xff\x53\x00\x54\x00\x55\x00\xff\xff\x33\x00\xff\xff\x35\x00\xff\xff\xff\xff\x38\x00\x5d\x00\x5e\x00\x3b\x00\xff\xff\x3d\x00\xff\xff\x3f\x00\xff\xff\xff\xff\xff\xff\xff\xff\x44\x00\x45\x00\xff\xff\xff\xff\xff\xff\xff\xff\x4a\x00\x4b\x00\xff\xff\xff\xff\x4e\x00\xff\xff\xff\xff\x51\x00\xff\xff\x53\x00\x54\x00\x55\x00\xff\xff\x33\x00\xff\xff\x35\x00\x36\x00\xff\xff\x38\x00\x5d\x00\x5e\x00\x3b\x00\xff\xff\xff\xff\xff\xff\x3f\x00\xff\xff\xff\xff\xff\xff\x43\x00\x44\x00\x45\x00\xff\xff\xff\xff\x48\x00\xff\xff\x4a\x00\x4b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x54\x00\x55\x00\x56\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x53\x00\x5e\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x73\x00\x74\x00\x53\x00\x76\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x73\x00\x74\x00\x53\x00\x76\x00\xff\xff\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x73\x00\x74\x00\x5a\x00\x76\x00\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x72\x00\x73\x00\x74\x00\xff\xff\x53\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7c\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\xff\xff\x53\x00\xff\xff\xff\xff\xff\xff\xff\xff\x73\x00\x74\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\xff\xff\x53\x00\xff\xff\xff\xff\xff\xff\xff\xff\x73\x00\x74\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x73\x00\x74\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x71\x00\xff\xff\x73\x00\x74\x00\xff\xff\x5a\x00\xff\xff\x5c\x00\x79\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\xff\xff\x6e\x00\xff\xff\x70\x00\xff\xff\xff\xff\x73\x00\x74\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\xff\xff\x6e\x00\xff\xff\x70\x00\xff\xff\xff\xff\x73\x00\x74\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\xff\xff\x6e\x00\xff\xff\x70\x00\xff\xff\xff\xff\x73\x00\x74\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\xff\xff\x6e\x00\xff\xff\x70\x00\xff\xff\xff\xff\x73\x00\x74\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\xff\xff\x6e\x00\xff\xff\x70\x00\xff\xff\xff\xff\x73\x00\x74\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\xff\xff\x6e\x00\xff\xff\xff\xff\xff\xff\xff\xff\x73\x00\x74\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\xff\xff\x6e\x00\xff\xff\xff\xff\xff\xff\xff\xff\x73\x00\x74\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\xff\xff\x6e\x00\xff\xff\xff\xff\xff\xff\xff\xff\x73\x00\x74\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\xff\xff\x6e\x00\xff\xff\xff\xff\xff\xff\xff\xff\x73\x00\x74\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\xff\xff\x6e\x00\xff\xff\xff\xff\xff\xff\xff\xff\x73\x00\x74\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\xff\xff\x6e\x00\xff\xff\xff\xff\xff\xff\xff\xff\x73\x00\x74\x00\x5a\x00\xff\xff\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x73\x00\x74\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\xff\xff\x6e\x00\xff\xff\xff\xff\xff\xff\xff\xff\x73\x00\x74\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\xff\xff\xff\xff\x6f\x00\xff\xff\xff\xff\xff\xff\x73\x00\x74\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\xff\xff\x6e\x00\xff\xff\xff\xff\xff\xff\xff\xff\x73\x00\x74\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\xff\xff\x6e\x00\xff\xff\xff\xff\xff\xff\xff\xff\x73\x00\x74\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\xff\xff\x6e\x00\xff\xff\xff\xff\xff\xff\xff\xff\x73\x00\x74\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\xff\xff\x6e\x00\xff\xff\xff\xff\xff\xff\xff\xff\x73\x00\x74\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\xff\xff\x6e\x00\xff\xff\xff\xff\xff\xff\xff\xff\x73\x00\x74\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x72\x00\x73\x00\x74\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x72\x00\x73\x00\x74\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x72\x00\x73\x00\x74\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x72\x00\x73\x00\x74\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x72\x00\x73\x00\x74\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x72\x00\x73\x00\x74\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x73\x00\x74\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x72\x00\x73\x00\x74\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x73\x00\x74\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x72\x00\x73\x00\x74\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x73\x00\x74\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x73\x00\x74\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x72\x00\x73\x00\x74\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x73\x00\x74\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x73\x00\x74\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x72\x00\x73\x00\x74\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x73\x00\x74\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x73\x00\x74\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x73\x00\x74\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x73\x00\x74\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x3b\x00\x3c\x00\x3d\x00\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\xff\xff\xff\xff\xff\xff\x73\x00\x74\x00\xff\xff\xff\xff\xff\xff\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x3b\x00\x3c\x00\x3d\x00\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x31\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x38\x00\xff\xff\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x31\x00\x41\x00\x42\x00\x43\x00\x44\x00\xff\xff\xff\xff\x38\x00\xff\xff\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x38\x00\xff\xff\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x38\x00\xff\xff\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x38\x00\xff\xff\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"#--happyTable :: HappyAddr-happyTable = HappyA# "\x00\x00\x88\x00\x4c\x00\x4d\x00\xa2\x01\x7b\x03\x5e\x03\x12\x03\x13\x03\x11\x03\x12\x03\x13\x03\x60\x03\x3d\xfe\xe6\x02\x25\x02\x8d\x01\x72\x03\xaa\x00\xcb\x01\x35\x03\x25\x03\x1a\x02\x7a\x03\x4e\x00\x69\x03\x4f\x00\x26\x02\x50\x00\x51\x00\x52\x00\xcc\x01\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\xd4\x02\x16\x03\xf8\x00\x7b\x02\x82\x02\xef\x00\x5f\x00\x84\x01\xc7\x00\xb9\x00\x60\x00\xc8\x00\xf7\x01\xbc\x00\x3d\x01\x4c\x00\x4d\x00\x75\x01\x36\x03\x7b\x03\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x9c\x00\x25\x02\x4f\x03\xba\x00\x83\x02\xcb\x01\x76\x01\xbd\x00\xe2\x01\xf9\x00\x4e\x00\x71\x03\x4f\x00\x26\x02\x50\x00\x51\x00\x52\x00\xcc\x01\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x14\x03\x97\x01\x86\x00\x14\x03\x14\x03\x84\x00\x5f\x00\x86\x00\x73\x03\x84\x00\x60\x00\x86\x00\x86\x00\xd6\x00\x4b\x00\x4c\x00\x4d\x00\x68\x00\x69\x00\x6a\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\xf0\x00\x4b\x00\xc8\x01\x63\x00\xc9\x01\x2a\x00\xb6\x00\x84\x00\x98\x01\x86\x00\x4e\x00\x86\x00\x4f\x00\xc9\x00\x50\x00\x51\x00\x52\x00\xbe\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\xaa\x00\xcb\x01\x06\x02\x4f\x03\xaa\x00\x84\x00\x5f\x00\x86\x00\x6a\x03\x84\x00\x60\x00\x86\x00\x55\x03\xcc\x01\x07\x02\xdd\x01\xbd\x00\x68\x00\x69\x00\x6a\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x9c\x00\x39\x03\xab\x00\xfb\x02\xac\x00\xc4\x00\x25\x02\x3b\x03\x84\x00\x98\x01\x86\x00\xad\x00\x5d\x00\x5e\x00\xd7\x00\xe1\x02\xb7\x00\xd3\x02\x26\x02\xe0\x02\x5f\x00\x25\x02\x9d\x01\xae\x00\xc5\x00\x56\x03\xde\x01\x0a\x03\x3c\xfe\xf7\x01\x6d\x03\x0b\x03\xf6\x01\x26\x02\xaf\x00\x62\x00\x63\x00\x64\x00\xb0\x00\x66\x00\x67\x00\x3c\xfe\xd8\x00\xb9\x00\xf7\x01\xd9\x00\x3c\xfe\x68\x00\x69\x00\x6a\x00\xcb\x01\xb5\x00\xda\x00\x5d\x00\x5e\x00\x9e\x01\xbe\x00\xd4\x02\x6e\x03\xe1\x02\x3c\xfe\x5f\x00\xcc\x01\x60\x02\xba\x00\x84\x00\x84\x00\xd7\x00\x86\x00\xf7\x01\xf0\x00\x4b\x00\xb6\x00\xd5\x00\xa1\x00\xdb\x00\x62\x00\x63\x00\x64\x00\xdc\x00\x66\x00\x67\x00\x54\x03\x41\x03\x9f\x01\xd6\x00\xa0\x01\xa2\x00\xae\x00\xb1\x00\x6a\x00\xc6\x00\xa3\x00\xa1\x01\x5d\x00\x5e\x00\x96\x00\x84\x00\xd7\x00\x86\x00\xf9\x01\x19\x03\x5f\x00\xec\x02\xe8\x02\xa2\x01\xa4\x00\x1a\x03\x84\x00\xd7\x00\x86\x00\x42\x03\x84\x00\xd7\x00\x86\x00\xf7\x01\xa3\x01\x62\x00\x63\x00\x64\x00\xa4\x01\x66\x00\x67\x00\x84\x00\xd7\x00\x97\x00\xc3\x00\x98\x00\xc4\x00\xf0\x00\x4b\x00\xdd\x00\x1b\x03\x6c\x00\x99\x00\x5d\x00\x5e\x00\x86\x02\x1d\x03\xb7\x00\xfa\x01\x84\x00\x89\x02\x5f\x00\x28\x03\x6d\x00\x0c\x02\xc5\x00\x84\x00\x98\x01\x86\x00\xf0\x00\x4b\x00\xc1\x02\x80\x02\x6a\x00\xa1\x00\x9a\x00\x62\x00\x63\x00\x64\x00\x9b\x00\x66\x00\x67\x00\x84\x00\xd7\x00\xab\x00\xcb\x01\xac\x00\xa2\x00\xd8\x00\xb9\x00\x9c\x00\xd9\x00\xa3\x00\xad\x00\x5d\x00\x5e\x00\x1c\x03\xcc\x01\xda\x00\x5d\x00\x5e\x00\x67\x02\x5f\x00\x60\x02\x98\x02\xae\x00\xa4\x00\x5f\x00\xda\x01\xdb\x01\xba\x00\x99\x02\x84\x00\xd7\x00\x86\x00\x8c\x02\xaf\x00\x62\x00\x63\x00\xd0\x01\x9a\x02\xdb\x00\x62\x00\x63\x00\xd0\x01\x9f\x01\xa8\x02\xa0\x01\x0d\x02\x8c\x00\x6a\x00\x9c\x00\xc6\x00\x84\x01\xa1\x01\x5d\x00\x5e\x00\x97\x01\xa1\x00\xb4\x02\x84\x01\x68\x02\x84\x00\x5f\x00\x86\x00\xa8\xfe\xa2\x01\xbc\x00\xa8\xfe\xd6\x00\xec\x01\xa2\x00\x6e\x03\x32\x00\x33\x00\xd7\x01\xa3\x00\xa3\x01\x62\x00\x63\x00\xd0\x01\x90\x02\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x25\x02\xbd\x00\x16\x02\xa4\x00\x87\x02\x6a\x00\xa8\xfe\xda\x02\xe1\x01\x84\x00\xdd\x00\x86\x00\x26\x02\xc0\x00\xb9\x00\x37\x03\xb8\x00\xb9\x00\x38\x03\x46\x02\x32\x00\x33\x00\x91\x02\x8d\x02\x19\x02\x48\x02\x49\x02\x4a\x02\x1b\x02\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x1e\x02\xba\x00\xf0\x00\x4b\x00\xba\x00\x4b\x02\xa9\x00\x4f\x00\xaa\x00\x50\x00\x4c\x02\x4d\x02\x9c\x00\x53\x00\x4e\x02\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\xe0\x01\xe1\x01\x84\x00\x98\x01\x86\x00\x42\x02\x5f\x00\x20\x02\x70\x01\xbe\x00\x4f\x02\x06\x00\x71\x01\x07\x00\xe2\x01\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x2f\x02\x39\x00\x84\x00\xd7\x00\x86\x00\x89\x01\x18\x00\x19\x00\xa8\x01\x3a\x00\x92\x00\x63\x00\xe9\x01\xc1\x00\xe5\xff\x06\x00\xbb\x00\x07\x00\x86\x01\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x84\x01\x39\x00\xe2\x01\x84\x01\x35\x02\xc6\x01\x18\x00\x19\x00\x43\x02\x3a\x00\x68\x00\xc3\x01\x6a\x00\x46\x02\x32\x00\x33\x00\x44\x02\x47\x02\x60\x02\x48\x02\x49\x02\x4a\x02\x3f\x01\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x92\x01\x1a\x02\x95\x00\x6a\x00\x83\x01\x4b\x02\x84\x01\x4f\x00\x40\x01\x50\x00\x4c\x02\x4d\x02\xd6\x00\x53\x00\x4e\x02\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x0d\x01\x70\x03\x8c\x00\x6a\x00\x89\x01\x84\x01\x5f\x00\x86\x01\x84\x01\x99\x01\x4f\x02\xa8\x01\xc6\x01\x97\x01\x82\x01\xea\x02\x23\x02\xcf\x00\xeb\x02\x06\x02\x88\x01\xaa\x00\xc8\x01\x63\x00\xc9\x01\xd6\x00\x8a\x01\x0e\x01\x55\x00\x98\x01\x0f\x01\x07\x02\x10\x01\x84\x01\x11\x01\x5c\x00\x5d\x00\x5e\x00\x84\x01\x9a\x01\x84\x01\x84\x01\xc0\x00\xb9\x00\x5f\x00\x06\x00\x9b\x01\x07\x00\x12\x01\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\xba\x00\x39\x00\x84\x00\xd7\x00\x86\x00\x68\x01\x18\x00\x19\x00\xa7\x01\x3a\x00\x68\x00\xc3\x01\x6a\x00\x9c\x00\xa9\x01\xcf\x01\x62\x00\x63\x00\xd0\x01\x06\x00\xbc\x01\x07\x00\xc5\x01\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x0d\x01\x14\x01\x84\x00\x98\x01\x86\x00\xc7\x01\x18\x00\x19\x00\x84\x00\xd7\x00\x68\x00\x15\x01\x6a\x00\xf6\x01\x9c\x00\x7d\x02\x5f\x01\xa6\x00\xa7\x00\x60\x01\x61\x01\x30\x03\xd4\x01\x75\x02\x31\x03\xf7\x01\x76\x02\x0e\x01\x55\x00\xc1\x00\x0f\x01\xd5\x01\x10\x01\x9c\x00\x11\x01\x5c\x00\x5d\x00\x5e\x00\x0d\x01\x20\x03\x21\x03\x9f\x00\x04\x03\x22\x03\x5f\x00\x2b\x03\x2c\x03\xdd\x02\x12\x01\xae\x00\xde\x02\x2e\x03\xa4\x00\xae\x00\x2b\x02\xce\x00\xcf\x00\x2c\x02\xd1\x00\x9c\x00\xd1\x01\x62\x00\x63\x00\xd0\x01\xe7\x00\x0e\x01\x55\x00\xed\x00\x0f\x01\x69\x01\x10\x01\xfa\x00\x11\x01\x5c\x00\x5d\x00\x5e\x00\x7e\x02\x5f\x01\xa6\x00\xa7\x00\x60\x01\x61\x01\x5f\x00\x06\x00\x04\x01\x07\x00\x12\x01\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x0a\x01\x14\x01\x84\x00\xd7\x00\x2b\x01\x6b\x01\x18\x00\x19\x00\x87\x00\x05\x00\x68\x00\x15\x01\x6a\x00\x2d\x02\x6a\x00\x05\x00\x7f\x02\x80\x02\x6a\x00\x06\x00\x7d\x03\x07\x00\x2a\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x0d\x01\x14\x01\x38\x02\x62\x00\x63\x00\xd0\x01\x18\x00\x19\x00\xae\x00\x7e\x03\x68\x00\x15\x01\x6a\x00\x2b\x02\xce\x00\xcf\x00\x2c\x02\xd1\x00\x2a\x00\xd1\x01\x62\x00\x63\x00\x64\x00\xb5\x02\xd2\x01\x67\x00\x7f\x03\x0e\x01\x55\x00\x75\x03\x0f\x01\x76\x03\x10\x01\x77\x03\x11\x01\x5c\x00\x5d\x00\x5e\x00\x38\x03\xa6\x00\xa7\x00\xbe\x01\x69\x03\x4f\x00\x5f\x00\x50\x00\xbf\x01\xc0\x01\x12\x01\x53\x00\xc1\x01\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5a\x03\x20\x01\x21\x01\x22\x01\x23\x01\x2a\x00\x5f\x00\x65\x01\x13\x01\xaa\x00\xc2\x01\xf0\x00\x4b\x00\x2d\x02\x6a\x00\xf9\x02\x62\x00\x63\x00\xd0\x01\x66\x01\x3d\x03\x3e\x03\x06\x00\x86\x00\x07\x00\x6c\x03\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x06\x00\x14\x01\x07\x00\x58\x03\x00\x01\x09\x00\x18\x00\x19\x00\xfe\x02\xff\x02\x68\x00\x15\x01\x6a\x00\x97\x00\x86\x00\x98\x00\x00\x03\x01\x03\xee\x01\xfa\x01\x19\x03\x98\x00\x99\x00\x5d\x00\x5e\x00\x18\x00\x19\x00\x5d\x03\x99\x00\x5d\x00\x5e\x00\x5f\x00\x5e\x03\x68\x00\xc3\x01\x6a\x00\xbe\x01\x5f\x00\x4f\x00\x60\x03\x50\x00\xbf\x01\xc0\x01\x63\x03\x53\x00\xc1\x01\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x17\x02\xfa\x01\x8f\x02\xa2\x01\xf0\x00\x4b\x00\x5f\x00\x26\x02\xa6\x00\xa7\x00\xc2\x01\x49\x03\x8c\x00\x6a\x00\xe5\x01\x62\x00\x63\x00\xd0\x01\xbe\x01\x64\x03\x4f\x00\x65\x03\x50\x00\xbf\x01\xc0\x01\x3d\x00\x53\x00\xc1\x01\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x06\x00\x40\x03\x07\x00\x3f\x03\x02\x01\x09\x00\x5f\x00\x9c\x00\x43\x03\x9f\x01\xc2\x01\xa0\x01\x49\x03\x9c\x00\x86\x00\xac\x00\xf0\x00\x4b\x00\xa1\x01\x5d\x00\x5e\x00\x21\x02\xad\x00\x5d\x00\x5e\x00\x18\x00\x19\x00\x5f\x00\x1e\x01\x1f\x01\xa2\x01\x5f\x00\x9c\x00\x4f\x03\xae\x00\x86\x00\x68\x00\xc3\x01\x6a\x00\xbe\x01\x51\x03\x4f\x00\x53\x03\x50\x00\xbf\x01\xc0\x01\x86\x01\x53\x00\xc1\x01\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x30\x02\x92\x01\xcf\x00\x93\x01\xd1\x00\x9d\x02\x5f\x00\x92\x00\x63\x00\x93\x00\xc2\x01\x94\x00\x67\x00\x24\x01\x25\x01\x68\x00\xc3\x01\x6a\x00\xbe\x01\xe3\x02\x4f\x00\x86\x00\x50\x00\xbf\x01\xc0\x01\xf0\x02\x53\x00\xc1\x01\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x9c\x00\xae\x00\xfb\x02\xfc\x02\x6a\x00\xf1\x02\x5f\x00\x4a\x03\x8c\x00\x6a\x00\xc2\x01\xa0\x01\xd1\x01\x62\x00\x63\x00\xd0\x01\x4c\x03\xf4\x02\xa1\x01\x5d\x00\x5e\x00\x36\x02\xf5\x02\x95\x01\x6a\x00\xf0\x00\x4b\x00\x5f\x00\x26\x01\x27\x01\xa2\x01\xf9\x02\x62\x00\x63\x00\xd0\x01\xf6\x02\x68\x00\xc3\x01\x6a\x00\xbe\x01\xf7\x02\x4f\x00\x0a\x03\x50\x00\xbf\x01\xc0\x01\xee\x01\x53\x00\xc1\x01\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\xbd\x01\x06\x02\x18\x03\xaa\x00\xe4\x00\xe5\x00\x5f\x00\x0d\x03\xd3\x01\x6a\x00\xc2\x01\xe6\x00\xe7\x00\x07\x02\x0e\x03\x68\x00\xc3\x01\x6a\x00\xbe\x01\x0f\x03\x4f\x00\x10\x03\x50\x00\xbf\x01\xc0\x01\x17\x03\x53\x00\xc1\x01\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x9c\x00\x6f\x03\x32\x00\x33\x00\xf0\x00\x4b\x00\x5f\x00\xa1\x00\x18\x01\x19\x01\xc2\x01\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\xa1\x00\x97\x00\x3d\x00\x98\x00\xa2\x00\x4b\x03\x8c\x00\x6a\x00\x2b\x03\xa3\x00\x99\x00\x5d\x00\x5e\x00\xa2\x00\x45\x03\x32\x00\x33\x00\x1f\x03\xa3\x00\x5f\x00\x68\x00\xc3\x01\x6a\x00\xa4\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x1e\x01\x1f\x01\x86\x00\xa4\x00\x23\x03\xc8\x01\x63\x00\xc9\x01\x26\x03\x84\x00\xd7\x00\x86\x00\x10\x03\x32\x00\x33\x00\x24\x01\x25\x01\x77\x02\xa6\x00\xa7\x00\x78\x02\x79\x02\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\xe8\x01\x27\x03\x68\x00\xc3\x01\x6a\x00\xf1\x02\x8c\x00\x6a\x00\x26\x01\x27\x01\x8f\x00\x62\x00\x63\x00\xd0\x01\x06\x00\x7c\x02\x07\x00\x7d\x02\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x9c\x00\x39\x00\xf2\x02\x8c\x00\x6a\x00\x63\x02\x18\x00\x19\x00\x3e\xfe\x3a\x00\x06\x00\xbc\x01\x07\x00\x8c\x02\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x92\x02\x39\x00\x68\x00\x91\x00\x6a\x00\x86\x01\x18\x00\x19\x00\x06\x00\x3a\x00\x07\x00\x2a\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x9c\x02\x39\x00\x95\x02\x32\x00\x33\x00\xa1\x00\x18\x00\x19\x00\x9d\x02\x3a\x00\xa5\x02\xa7\x02\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\xee\x01\xa2\x00\xca\x00\xb3\x02\xa2\x01\xb4\x02\xa3\x00\xbc\x02\xbd\x02\x9e\x02\xce\x00\xcf\x00\x96\x02\x32\x00\x33\x00\xe5\x01\x62\x00\x63\x00\xd0\x01\xbf\x02\xa4\x00\xc0\x02\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x2a\x02\xce\x00\xcf\x00\x05\x03\xa6\x00\xa7\x00\xcf\x01\x62\x00\x63\x00\xd0\x01\x86\x00\xd1\x02\x97\x02\x32\x00\x33\x00\x66\x01\x5f\x01\xa6\x00\xa7\x00\x60\x01\x61\x01\x86\x01\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\xcb\x00\xd6\x02\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd7\x02\xd2\x00\x62\x00\x63\x00\x64\x00\xd3\x00\x66\x00\x67\x00\x06\x00\x9c\x00\x07\x00\xda\x02\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x9c\x00\x39\x00\x26\x02\xa6\x00\xa7\x00\xdc\x02\x18\x00\x19\x00\x06\x00\x3a\x00\x07\x00\xdf\x02\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\xdf\x01\x39\x00\x23\x03\xa6\x00\xa7\x00\xe0\x01\x18\x00\x19\x00\x06\x00\x3a\x00\x07\x00\xe5\x01\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\xec\x01\x39\x00\x41\x02\x32\x00\x33\x00\xe4\x01\x18\x00\x19\x00\xee\x01\x3a\x00\xfb\x01\xfc\x01\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x86\x00\x12\x02\xe0\x00\x26\x02\xa6\x00\xa7\x00\xa2\x02\xa6\x00\xa7\x00\x2a\x02\xce\x00\xcf\x00\x52\x02\x32\x00\x33\x00\xcf\x01\x62\x00\x63\x00\xd0\x01\xa3\x02\xa6\x00\xa7\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x7d\x02\x5f\x01\xa6\x00\xa7\x00\x60\x01\x61\x01\x26\x02\xa6\x00\xa7\x00\xb8\x02\x8c\x00\x6a\x00\x76\x01\x32\x00\x33\x00\xbd\x02\x8c\x00\x6a\x00\xc2\x02\x8c\x00\x6a\x00\xee\x01\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\xe1\x00\x19\x02\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\x3d\x00\xd2\x00\x62\x00\x63\x00\x64\x00\xe2\x00\x66\x00\x67\x00\x06\x00\x9c\x00\x07\x00\x20\x02\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\xee\x01\x39\x00\xc3\x02\x8c\x00\x6a\x00\x28\x02\x18\x00\x19\x00\x06\x00\x3a\x00\x07\x00\x29\x02\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x78\x01\x39\x00\xc4\x02\x8c\x00\x6a\x00\xee\x01\x18\x00\x19\x00\x06\x00\x3a\x00\x07\x00\x34\x02\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x86\x00\x39\x00\xf1\x00\x32\x00\x33\x00\xee\x01\x18\x00\x19\x00\x3a\x02\x3a\x00\x3b\x02\x3c\x02\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x40\x02\x92\x01\xcf\x00\x93\x01\xd1\x00\x9d\x02\x3d\x02\x92\x00\x63\x00\xe9\x01\x3e\x02\x2a\x00\x31\x00\x32\x00\x33\x00\xcf\x01\x62\x00\x63\x00\xd0\x01\xc8\x02\x8c\x00\x6a\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x7d\x02\x5f\x01\xa6\x00\xa7\x00\x60\x01\x61\x01\xc9\x02\x8c\x00\x6a\x00\xbc\x01\x54\x02\x06\x00\x46\x02\x07\x00\x57\x02\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x55\x02\xea\x00\x56\x02\x79\x01\x95\x01\x6a\x00\x18\x00\x19\x00\xcd\x02\x8c\x00\x6a\x00\x58\x02\x59\x02\x06\x00\x9c\x00\x07\x00\x86\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x64\x02\x39\x00\xd8\x02\xa6\x00\xa7\x00\x66\x02\x18\x00\x19\x00\x06\x00\x3a\x00\x07\x00\x1b\x01\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x1a\x01\x39\x00\x85\x02\x4a\x02\x1c\x01\x1d\x01\x18\x00\x19\x00\x69\x02\x3a\x00\x06\x02\x6b\x01\xaa\x00\x5d\x01\x5e\x01\x4b\x02\x68\x01\x4f\x00\x86\x00\x50\x00\x4c\x02\x4d\x02\x07\x02\x53\x00\x4e\x02\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\xa5\x00\xa6\x00\xa7\x00\x74\x01\xd8\x00\xb9\x00\x5f\x00\xd9\x00\x78\x01\x7c\x01\x4f\x02\xe6\x01\xa6\x00\xa7\x00\xda\x00\x5d\x00\x5e\x00\x73\x01\xe7\x01\xa6\x00\xa7\x00\x7e\x01\x86\x00\x5f\x00\x3d\x00\x88\x01\xba\x00\x3d\x00\x3d\xfe\x06\x00\x6c\x00\x07\x00\x86\x01\xf4\x00\x09\x00\x0a\x00\x49\x01\xf7\x01\x62\x00\x63\x00\xd0\x01\x3d\xfe\x6d\x00\xe5\xff\x86\x01\x06\x00\x3d\xfe\x07\x00\x3d\x00\xf4\x00\x09\x00\x03\x01\xa5\x02\x9e\x01\x18\x00\x19\x00\x8e\x01\xce\x00\xcf\x00\x3d\x00\x3d\xfe\xaa\x00\x8f\x00\x62\x00\x63\x00\xd0\x01\x84\x00\xd7\x00\x86\x00\xc5\x01\x18\x00\x19\x00\x3f\x01\xcd\x01\x68\x00\xc3\x01\x6a\x00\x6e\x00\x6f\x00\x3d\x00\x70\x00\xcf\x01\x71\x00\x2a\x00\x86\x00\x72\x00\xda\x01\xff\xff\x73\x00\x8a\x00\x74\x00\x75\x00\x76\x00\xdd\x00\xa5\x00\xa6\x00\xa7\x00\x77\x00\x78\x00\x8b\x00\x79\x00\x88\x02\x86\x00\x7a\x00\x7b\x00\x8e\x00\x7c\x00\x7d\x00\x86\x00\x7e\x00\x7f\x00\x80\x00\x81\x00\x82\x00\x83\x00\xe9\x00\x68\x00\x90\x01\x6a\x00\x3d\x00\xff\xff\x84\x00\x85\x00\x86\x00\x87\x00\x1b\x00\x0e\x02\x8c\x00\x6a\x00\x3f\xfe\xfb\xff\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\xea\x00\xed\x00\x23\x00\x26\x02\xa6\x00\xa7\x00\x06\x00\xf3\x00\x07\x00\xf1\x00\xf4\x00\x09\x00\x61\x02\x24\x00\xf4\x00\xcb\x00\xf8\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xfc\x00\xd2\x00\x62\x00\x63\x00\xd0\x01\xfd\x00\x3c\x00\x3d\x00\x18\x00\x19\x00\x25\x00\x3e\x00\x6f\x00\x3f\x00\x70\x00\x40\x00\x71\x00\x3d\xfe\x41\x00\x72\x00\x42\x00\x43\x00\x73\x00\xff\xff\x74\x00\x75\x00\x76\x00\x44\x00\x45\x00\x46\x00\x3d\xfe\x77\x00\x78\x00\xfe\x00\x79\x00\x3d\xfe\x47\x00\x7a\x00\x7b\x00\x26\x00\x7c\x00\x7d\x00\x48\x00\x7e\x00\x7f\x00\x80\x00\x81\x00\x82\x00\x83\x00\x3d\xfe\x49\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x4a\x00\x51\x02\x86\x00\x52\x02\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x1b\x00\x34\x02\x8c\x00\x6a\x00\xff\x00\x00\x01\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x06\x01\x6f\x00\x23\x00\xff\xff\x17\x01\x06\x00\xa1\x00\x07\x00\x1a\x01\xf4\x00\x09\x00\x0a\x00\x4a\x01\x24\x00\x75\x00\x6f\x01\x8c\x00\x6a\x00\x1b\x01\xa2\x00\x80\x01\x8c\x00\x6a\x00\x79\x00\xa3\x00\x81\x01\x8c\x00\x6a\x00\x1c\x01\x7c\x00\x18\x00\x19\x00\x7e\x00\x25\x00\x80\x00\xd7\xff\x1d\x01\xd7\xff\xa4\x00\xd7\xff\xd7\xff\x00\x00\xd7\xff\x00\x00\x00\x00\xd7\xff\x86\x00\xd7\xff\xd7\xff\xd7\xff\x8b\x01\xa6\x00\xa7\x00\xd7\xff\xd7\xff\xd7\xff\x00\x00\xd7\xff\xd7\xff\x00\x00\xd7\xff\xd7\xff\x26\x00\xd7\xff\xd7\xff\x00\x00\xd7\xff\xd7\xff\xd7\xff\xd7\xff\xd7\xff\xd7\xff\xd7\xff\x00\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\xd7\xff\xd7\xff\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x1b\x00\xa5\x00\xa6\x00\xa7\x00\x00\x00\xae\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x00\x00\x00\x00\x23\x00\xd1\x01\x62\x00\x63\x00\x64\x00\x00\x00\xd2\x01\x67\x00\x3e\x02\x00\x00\x4f\x00\x24\x00\x50\x00\xbf\x01\xc0\x01\x00\x00\x53\x00\xc1\x01\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x8b\x00\x8c\x00\x6a\x00\x25\x00\x00\x00\x6f\x00\x5f\x00\x70\x00\x00\x00\x71\x00\xc2\x01\x00\x00\x72\x00\x00\x00\x00\x00\x73\x00\x00\x00\x74\x00\x75\x00\x76\x00\xa5\x00\xa6\x00\xa7\x00\x00\x00\x77\x00\x78\x00\x00\x00\x79\x00\xd3\x01\x6a\x00\x7a\x00\x7b\x00\x26\x00\x7c\x00\x7d\x00\x00\x00\x7e\x00\x7f\x00\x80\x00\x81\x00\x82\x00\x83\x00\x00\x00\x00\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x85\x00\x86\x00\x52\x02\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x1b\x00\xb4\x00\x8c\x00\x6a\x00\x00\x00\x59\x02\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x00\x00\x00\x00\x23\x00\x00\x00\x68\x00\xc3\x01\x6a\x00\x8d\x01\x47\x03\xaa\x00\x8d\x01\x09\x03\xaa\x00\x24\x00\x5a\x02\x5f\x01\xa6\x00\xa7\x00\x60\x01\x61\x01\x8d\x01\xa2\x02\xaa\x00\x8d\x01\xa8\x02\xaa\x00\x00\x00\x00\x00\x92\x01\xcf\x00\x3d\x00\x00\x00\x00\x00\x25\x00\x92\x00\x63\x00\xe9\x01\x70\x00\x01\x02\x71\x00\xaa\x00\x00\x00\x72\x00\x00\x00\x00\x00\x73\x00\x00\x00\x74\x00\x00\x00\x76\x00\x02\x02\x8d\x01\xce\x01\xaa\x00\x77\x00\x78\x00\x68\x00\x5b\x02\x6a\x00\x00\x00\x7a\x00\x7b\x00\x26\x00\x8a\x02\x7d\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x81\x00\x82\x00\x83\x00\x00\x00\x00\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x85\x00\x86\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x1b\x00\x95\x01\x6a\x00\x00\x00\x3c\xfe\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x00\x00\x00\x00\x23\x00\x38\x01\x3c\xfe\x39\x01\x00\x00\x3a\x01\x3b\x01\x3c\xfe\x00\x00\x3c\x01\x3d\x01\x24\x00\x00\x00\xe1\x00\x00\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\x3c\xfe\xd2\x00\x62\x00\x63\x00\xd0\x01\x00\x00\x84\x00\x00\x00\x86\x00\x00\x00\x25\x00\x8d\x01\xeb\x01\xaa\x00\x70\x00\x65\x01\x71\x00\xaa\x00\x00\x00\x72\x00\x00\x00\x00\x00\x73\x00\x00\x00\x74\x00\x00\x00\x76\x00\x66\x01\x28\x01\x29\x01\x2a\x01\x77\x00\x78\x00\xa9\x00\xce\x01\xaa\x00\x00\x00\x7a\x00\x7b\x00\x26\x00\x00\x00\x7d\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x81\x00\x82\x00\x83\x00\x00\x00\x00\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x85\x00\x86\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x1b\x00\x28\x01\x29\x01\x2a\x01\x3c\xfe\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x00\x00\x00\x00\x23\x00\x00\x00\x3c\xfe\xae\x00\x00\x00\x00\x00\x00\x00\x3c\xfe\x2b\x02\xce\x00\xcf\x00\x24\x00\x00\x00\x00\x00\xd1\x01\x62\x00\x63\x00\xd0\x01\x00\x00\x00\x00\x06\x00\x3c\xfe\x07\x00\x00\x00\xf4\x00\x09\x00\x46\x01\x3c\x00\x3d\x00\x86\x00\x00\x00\x25\x00\x3e\x00\x00\x00\x3f\x00\x00\x00\x40\x00\x00\x00\x00\x00\x41\x00\x00\x00\x42\x00\x43\x00\x8e\x00\x00\x00\x18\x00\x19\x00\x00\x00\x44\x00\x45\x00\x46\x00\x00\x00\x00\x00\x8f\x00\x62\x00\x63\x00\x64\x00\x47\x00\x90\x00\x67\x00\x26\x00\x00\x00\x00\x00\x48\x00\x00\x00\x00\x00\x01\x02\x00\x00\xaa\x00\x06\x03\x6a\x00\x49\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x4a\x00\x4b\x00\x02\x02\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x1b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\xbb\x02\x00\x00\x00\x00\x23\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x68\x00\x91\x00\x6a\x00\x00\x00\x24\x00\x00\x00\x00\x00\x6f\x00\x00\x00\x70\x00\x00\x00\x71\x00\x00\x00\x00\x00\x72\x00\x00\x00\x00\x00\x73\x00\x00\x00\x74\x00\x75\x00\x76\x00\x00\x00\x00\x00\x25\x00\x00\x00\x77\x00\x78\x00\x00\x00\x79\x00\x00\x00\xa1\x00\x7a\x00\x7b\x00\x00\x00\x7c\x00\x7d\x00\x00\x00\x7e\x00\x9e\x00\x80\x00\x81\x00\x82\x00\x83\x00\xa2\x00\x65\x01\x00\x00\xaa\x00\x00\x00\xa3\x00\x84\x00\x9f\x00\x86\x00\x26\x00\x3c\xfe\x00\x00\x06\x00\x66\x01\x07\x00\x00\x00\xf4\x00\x09\x00\x47\x01\xa4\x00\x00\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x00\x00\x86\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x1b\x00\x00\x00\x00\x00\x18\x00\x19\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x16\x02\x00\x00\x00\x00\x23\x00\x00\x00\x70\x00\x00\x00\x71\x00\xa1\x00\x00\x00\x72\x00\x00\x00\x00\x00\x73\x00\x24\x00\x74\x00\x00\x00\x76\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x77\x00\x78\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x7a\x00\x7b\x00\x00\x00\x00\x00\x7d\x00\x00\x00\x25\x00\xb3\x00\x00\x00\x81\x00\x82\x00\x83\x00\xa4\x00\xa1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb4\x00\x86\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x02\xa2\x00\xaa\x00\x00\x00\x25\x02\x00\x00\xa3\x00\xa1\x02\x00\x00\x00\x00\x26\x00\x3d\xfe\x02\x02\x92\x00\x63\x00\x93\x00\x26\x02\x94\x00\x67\x00\xf7\x01\xa4\x00\x00\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x00\x00\x86\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x1b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\xaf\x01\x00\x00\x00\x00\x23\x00\x00\x00\x00\x00\xa1\x00\x06\x00\x00\x00\x07\x00\xa1\x00\x06\x01\x09\x00\xa1\x00\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x95\x00\x6a\x00\x00\x00\xa2\x00\xa3\x00\x00\x00\xa2\x00\x00\x00\xa3\x00\x00\x00\x00\x00\xa3\x00\x18\x00\x19\x00\x25\x00\x06\x00\x00\x00\x07\x00\xa4\x00\x08\x01\x09\x00\x3d\xfe\xa4\x00\x00\x00\x84\x00\xa4\x00\x86\x00\x00\x00\x84\x00\xd7\x00\x86\x00\x84\x00\xd7\x00\x86\x00\x3d\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x3d\xfe\x18\x00\x19\x00\x00\x00\x26\x00\xb0\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3d\xfe\x00\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2f\x02\x86\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x1b\x00\x00\x00\x75\x02\x00\x00\xd6\x00\x76\x02\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x00\x00\x00\x00\x23\x00\x06\x00\x00\x00\x07\x00\x00\x00\xf4\x00\x09\x00\x0a\x00\x0b\x00\x4b\x01\x1b\x00\x24\x00\x75\x02\x00\x00\x00\x00\x76\x02\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x00\x00\x00\x00\x23\x00\x18\x00\x19\x00\x77\x02\x66\x03\xa1\x00\x25\x00\x00\x00\x06\x00\x00\x00\x07\x00\x24\x00\xf4\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x4d\x01\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x77\x02\x34\x03\x00\x00\x25\x00\x00\x00\x18\x00\x19\x00\x26\x00\x00\x00\xa4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x84\x00\xd7\x00\x86\x00\x00\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x4a\x00\x4b\x00\x00\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x26\x00\x06\x00\x00\x00\x07\x00\x00\x00\xf4\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x51\x01\x27\x00\x28\x00\x29\x00\x2a\x00\x4a\x00\x4b\x00\x00\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x1b\x00\x18\x00\x19\x00\x00\x00\x00\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x11\x02\x00\x00\x00\x00\x23\x00\x00\x00\x92\x01\xcf\x00\x93\x01\xd1\x00\x22\x02\x00\x00\x92\x00\x63\x00\x93\x00\x24\x00\x94\x00\x67\x00\x06\x00\x1b\x00\x07\x00\x75\x02\x0b\x01\x09\x00\x76\x02\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x00\x00\x00\x00\x23\x00\x25\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3c\xfe\x18\x00\x19\x00\x24\x00\x00\x00\x06\x00\x00\x00\x07\x00\x00\x00\xf4\x00\x09\x00\x48\x01\x00\x00\x3c\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x3c\xfe\x00\x00\x77\x02\x00\x00\x26\x00\x25\x00\x95\x01\x6a\x00\x00\x00\x65\x01\x00\x00\xaa\x00\x18\x00\x19\x00\x3c\xfe\x00\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x66\x01\x86\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x26\x00\x06\x00\x00\x00\x07\x00\x00\x00\xf4\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x52\x01\x27\x00\x28\x00\x29\x00\x2a\x00\x4a\x00\x4b\x00\x00\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x1b\x00\x18\x00\x19\x00\xa1\x00\x00\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x00\x00\x00\x00\x23\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x06\x00\x00\x00\x07\x00\x24\x00\xf4\x00\x09\x00\x03\x01\x1b\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x86\x00\x00\x00\x23\x00\x25\x00\x00\x00\x18\x00\x19\x00\x00\x00\x00\x00\x00\x00\xa1\x00\x00\x00\x06\x00\x24\x00\x07\x00\x00\x00\xf4\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x4e\x01\x00\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x77\x02\x00\x00\x26\x00\x25\x00\x00\x00\x00\x00\x00\x00\x18\x00\x19\x00\x00\x00\x00\x00\x00\x00\xa4\x00\x00\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x00\x00\x00\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x00\x00\xa2\x01\x00\x00\x00\x00\x00\x00\x26\x00\x9e\x02\xce\x00\xcf\x00\x9f\x02\xd1\x00\x00\x00\xe5\x01\x62\x00\x63\x00\xd0\x01\x00\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\xcb\x01\x00\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x1b\x00\xe6\x02\x00\x00\x00\x00\xcc\x01\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x00\x00\x00\x00\x23\x00\x06\x00\x00\x00\x07\x00\x00\x00\xf4\x00\x09\x00\x0a\x00\x0b\x00\x4c\x01\x1b\x00\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x9c\x00\x00\x00\x23\x00\x18\x00\x19\x00\x00\x00\x00\x00\xa1\x00\x25\x00\x00\x00\x06\x00\x00\x00\x07\x00\x24\x00\xf4\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x4f\x01\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x77\x02\x00\x00\x00\x00\x25\x00\x00\x00\x18\x00\x19\x00\x26\x00\x00\x00\xa4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x84\x00\x00\x00\x86\x00\x00\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x00\x00\x00\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x26\x00\x06\x00\x00\x00\x07\x00\x00\x00\xf4\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x50\x01\x00\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x00\x00\x00\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x1b\x00\x18\x00\x19\x00\x00\x00\x00\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x00\x00\x00\x00\x23\x00\x92\x01\xcf\x00\x93\x01\xd1\x00\x22\x02\x00\x00\x92\x00\x63\x00\xe9\x01\x00\x00\x24\x00\x1b\x00\x45\x01\x00\x00\x00\x00\x00\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x00\x00\x00\x00\x23\x00\x63\x02\x00\x00\x06\x00\x25\x00\x07\x00\x00\x00\xf4\x00\x09\x00\x2a\x01\x00\x00\x24\x00\x1b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x00\x00\x00\x00\x23\x00\x18\x00\x19\x00\x00\x00\x25\x00\x00\x00\x26\x00\x95\x01\x6a\x00\x00\x00\x00\x00\x24\x00\x00\x00\x00\x00\x59\x01\x00\x00\x00\x00\x00\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x00\x00\x00\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x25\x00\x00\x00\x26\x00\x00\x00\x00\x00\x06\x00\x00\x00\x07\x00\x00\x00\x0c\x01\x09\x00\x00\x00\x00\x00\x00\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x00\x00\x00\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x00\x00\x00\x00\x26\x00\x18\x00\x19\x00\x92\x01\xcf\x00\x93\x01\xd1\x00\x29\x02\x00\x00\x92\x00\x63\x00\xe9\x01\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x00\x00\x00\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x1b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x00\x00\x00\x00\x23\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x01\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x95\x01\x6a\x00\x23\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x25\x00\x00\x00\x00\x00\x00\x00\x00\x00\x24\x00\x00\x00\x00\x00\x00\x00\x1b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x00\x00\x00\x00\x23\x00\x25\x00\xd1\x02\x00\x00\x00\x00\x26\x00\x8e\x01\xce\x00\xcf\x00\x8f\x01\xd1\x00\x24\x00\x8f\x00\x62\x00\x63\x00\xd0\x01\x00\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x00\x00\x00\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x26\x00\x25\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x00\x00\x00\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x26\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x68\x00\x90\x01\x6a\x00\x00\x00\x00\x00\x00\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x00\x00\x00\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x08\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x00\x00\x00\x00\x23\x00\x92\x01\xcf\x00\x93\x01\xd1\x00\x07\x03\x00\x00\x92\x00\x63\x00\xe9\x01\x0a\x01\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x00\x00\x00\x00\x23\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x25\x00\x00\x00\x00\x00\x00\x00\x00\x00\x24\x00\x00\x00\x00\x00\x00\x00\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x00\x00\x00\x00\x23\x00\x25\x00\x00\x00\x00\x00\x00\x00\x26\x00\x95\x01\x6a\x00\x00\x00\x00\x00\x00\x00\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x00\x00\x00\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x26\x00\x25\x00\x00\x00\x00\x00\x00\x00\x00\x00\x65\x01\x00\x00\xaa\x00\x00\x00\x00\x00\x00\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x00\x00\x66\x01\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x26\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x6d\x00\x00\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x1b\x00\x00\x00\x00\x00\x00\x00\x3d\xfe\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x00\x00\x00\x00\x23\x00\x00\x00\x3d\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x3d\xfe\x00\x00\x00\x00\x00\x00\x24\x00\x6e\x00\x6f\x00\x00\x00\x70\x00\x00\x00\x71\x00\x00\x00\x00\x00\x72\x00\x3d\xfe\x00\x00\x73\x00\x00\x00\x74\x00\x75\x00\x76\x00\x00\x00\x86\x00\x00\x00\x25\x00\x77\x00\x78\x00\x00\x00\x79\x00\x00\x00\x00\x00\x7a\x00\x7b\x00\x00\x00\x7c\x00\x7d\x00\x00\x00\x7e\x00\x7f\x00\x80\x00\x81\x00\x82\x00\x83\x00\x06\x02\x00\x00\xaa\x00\x00\x00\x00\x00\x00\x00\x84\x00\x85\x00\x86\x00\x87\x00\x26\x00\x00\x00\x07\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x00\x00\x00\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x2d\x01\x2e\x01\x2f\x01\x30\x01\x31\x01\x32\x01\x33\x01\x34\x01\x35\x01\x36\x01\x37\x01\x00\x00\x01\x02\x6f\x00\xaa\x00\x70\x00\x00\x00\x71\x00\x3d\xfe\x00\x00\x72\x00\x00\x00\x00\x00\x73\x00\x02\x02\x74\x00\x75\x00\x76\x00\x00\x00\x00\x00\x00\x00\x3d\xfe\x77\x00\x78\x00\x00\x00\x79\x00\x3d\xfe\x00\x00\x7a\x00\x7b\x00\x00\x00\x7c\x00\x7d\x00\x00\x00\x7e\x00\x7f\x00\x80\x00\x81\x00\x82\x00\x83\x00\x3d\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x84\x00\x85\x00\x86\x00\x01\x02\x6f\x00\xaa\x00\x70\x00\x00\x00\x71\x00\x3d\xfe\x00\x00\x72\x00\x00\x00\x00\x00\x73\x00\x02\x02\x74\x00\x75\x00\x76\x00\x00\x00\x00\x00\x00\x00\x3d\xfe\x77\x00\x78\x00\x00\x00\x79\x00\x3d\xfe\x00\x00\x7a\x00\x7b\x00\x00\x00\x7c\x00\x7d\x00\x00\x00\x7e\x00\x7f\x00\x80\x00\x81\x00\x82\x00\x83\x00\x3d\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x84\x00\x85\x00\x86\x00\x01\x02\x6f\x00\xaa\x00\x70\x00\x00\x00\x71\x00\xa1\x00\x00\x00\x72\x00\x00\x00\x00\x00\x73\x00\x02\x02\x74\x00\x75\x00\x76\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x77\x00\x78\x00\x00\x00\x79\x00\xa3\x00\x00\x00\x7a\x00\x7b\x00\x00\x00\x7c\x00\x7d\x00\x00\x00\x7e\x00\xb3\x00\x80\x00\x81\x00\x82\x00\x83\x00\xa4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x84\x00\xb4\x00\x86\x00\xcb\x01\x6f\x00\x00\x00\x70\x00\x00\x00\x71\x00\xa1\x00\x00\x00\x72\x00\x00\x00\x00\x00\x73\x00\xcc\x01\x74\x00\x75\x00\x76\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x77\x00\x78\x00\x00\x00\x79\x00\xa3\x00\x00\x00\x7a\x00\x7b\x00\x00\x00\x7c\x00\x7d\x00\x00\x00\x7e\x00\xdf\x00\x80\x00\x81\x00\x82\x00\x83\x00\xa4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x84\x00\xe0\x00\x86\x00\xcb\x01\x6f\x00\x00\x00\x70\x00\x00\x00\x71\x00\xa1\x00\x00\x00\x72\x00\x00\x00\x00\x00\x73\x00\xcc\x01\x74\x00\x75\x00\x76\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x77\x00\x78\x00\x00\x00\x79\x00\xa3\x00\x00\x00\x7a\x00\x7b\x00\x00\x00\x7c\x00\x7d\x00\x00\x00\x7e\x00\xa6\x01\x80\x00\x81\x00\x82\x00\x83\x00\xa4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x84\x00\xa7\x01\x86\x00\xcb\x01\x6f\x00\x00\x00\x70\x00\x00\x00\x71\x00\xa1\x00\x00\x00\x72\x00\x00\x00\x00\x00\x73\x00\xcc\x01\x74\x00\x75\x00\x76\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x77\x00\x78\x00\x00\x00\x79\x00\xa3\x00\x00\x00\x7a\x00\x7b\x00\x00\x00\x7c\x00\x7d\x00\x00\x00\x7e\x00\xb3\x00\x80\x00\x81\x00\x82\x00\x83\x00\xa4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x84\x00\xb4\x00\x86\x00\xcb\x01\x6f\x00\x00\x00\x70\x00\x00\x00\x71\x00\xa1\x00\x00\x00\x72\x00\x00\x00\x00\x00\x73\x00\xcc\x01\x74\x00\x75\x00\x76\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x77\x00\x78\x00\x00\x00\x79\x00\xa3\x00\x00\x00\x7a\x00\x7b\x00\x00\x00\x7c\x00\x7d\x00\x00\x00\x7e\x00\xdf\x00\x80\x00\x81\x00\x82\x00\x83\x00\xa4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x84\x00\xe0\x00\x86\x00\xcb\x01\x6f\x00\x00\x00\x70\x00\x00\x00\x71\x00\xa1\x00\x00\x00\x72\x00\x00\x00\x00\x00\x73\x00\xcc\x01\x74\x00\x75\x00\x76\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x77\x00\x78\x00\x00\x00\x79\x00\xa3\x00\x00\x00\x7a\x00\x7b\x00\x00\x00\x7c\x00\x7d\x00\x00\x00\x7e\x00\xa6\x01\x80\x00\x81\x00\x82\x00\x83\x00\xa4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x84\x00\xa7\x01\x86\x00\xcb\x01\x6f\x00\x00\x00\x70\x00\x00\x00\x71\x00\xa1\x00\x00\x00\x72\x00\x00\x00\x00\x00\x73\x00\xcc\x01\x74\x00\x75\x00\x76\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x77\x00\x78\x00\x00\x00\x79\x00\xa3\x00\x00\x00\x7a\x00\x7b\x00\x00\x00\x7c\x00\x7d\x00\x00\x00\x7e\x00\xb3\x00\x80\x00\x81\x00\x82\x00\x83\x00\xa4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x84\x00\xb4\x00\x86\x00\x65\x01\x6f\x00\xaa\x00\x70\x00\x00\x00\x71\x00\xa1\x00\x00\x00\x72\x00\x00\x00\x00\x00\x73\x00\x66\x01\x74\x00\x75\x00\x76\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x77\x00\x78\x00\x00\x00\x79\x00\xa3\x00\x00\x00\x7a\x00\x7b\x00\x00\x00\x7c\x00\x7d\x00\x00\x00\x7e\x00\xdf\x00\x80\x00\x81\x00\x82\x00\x83\x00\xa4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x84\x00\xe0\x00\x86\x00\x6c\x00\x6f\x00\x00\x00\x70\x00\x00\x00\x71\x00\x3d\xfe\x00\x00\x72\x00\x00\x00\x00\x00\x73\x00\x6d\x00\x74\x00\x75\x00\x76\x00\x00\x00\x00\x00\x00\x00\x3d\xfe\x77\x00\x78\x00\x00\x00\x79\x00\x3d\xfe\x00\x00\x7a\x00\x7b\x00\x00\x00\x7c\x00\x7d\x00\x00\x00\x7e\x00\x7f\x00\x80\x00\x81\x00\x82\x00\x83\x00\x3d\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x85\x00\x86\x00\x6c\x00\x6f\x00\x00\x00\x70\x00\x00\x00\x71\x00\xa1\x00\x00\x00\x72\x00\x00\x00\x00\x00\x73\x00\x6d\x00\x74\x00\x75\x00\x76\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x77\x00\x78\x00\x00\x00\x79\x00\xa3\x00\x00\x00\x7a\x00\x7b\x00\x00\x00\x7c\x00\x7d\x00\x00\x00\x7e\x00\xa6\x01\x80\x00\x81\x00\x82\x00\x83\x00\xa4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x84\x00\xa7\x01\x86\x00\x6c\x00\x6f\x00\x00\x00\x70\x00\x00\x00\x71\x00\xa1\x00\x00\x00\x72\x00\x00\x00\x00\x00\x73\x00\x6d\x00\x74\x00\x75\x00\x76\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x77\x00\x78\x00\x00\x00\x79\x00\xa3\x00\x00\x00\x7a\x00\x7b\x00\x00\x00\x7c\x00\x7d\x00\x00\x00\x7e\x00\xb3\x00\x80\x00\x81\x00\x82\x00\x83\x00\xa4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x84\x00\xb4\x00\x86\x00\x06\x02\x6f\x00\xaa\x00\x70\x00\x00\x00\x71\x00\xa1\x00\x00\x00\x72\x00\x00\x00\x00\x00\x73\x00\x07\x02\x74\x00\x75\x00\x76\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x77\x00\x78\x00\x00\x00\x79\x00\xa3\x00\x00\x00\x7a\x00\x7b\x00\x00\x00\x7c\x00\x7d\x00\x00\x00\x7e\x00\xdf\x00\x80\x00\x81\x00\x82\x00\x83\x00\xa4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x84\x00\xe0\x00\x86\x00\x65\x01\x6f\x00\xaa\x00\x70\x00\x00\x00\x71\x00\x00\x00\x00\x00\x72\x00\x00\x00\x00\x00\x73\x00\x66\x01\x74\x00\x75\x00\x76\x00\x00\x00\x00\x00\x00\x00\x00\x00\x77\x00\x78\x00\x00\x00\x79\x00\x00\x00\x00\x00\x7a\x00\x7b\x00\x00\x00\x7c\x00\x7d\x00\x00\x00\x7e\x00\x9e\x00\x80\x00\x81\x00\x82\x00\x83\x00\x00\x00\xcb\x01\x00\x00\x00\x00\x00\x00\x00\x00\x84\x00\x9f\x00\x86\x00\x00\x00\x6f\x00\x00\x00\x70\x00\xcc\x01\x71\x00\x00\x00\x00\x00\x72\x00\x00\x00\x00\x00\x73\x00\x00\x00\x74\x00\x75\x00\x76\x00\x00\x00\x00\x00\x00\x00\x00\x00\x77\x00\x78\x00\x00\x00\x79\x00\x00\x00\x00\x00\x7a\x00\x7b\x00\x00\x00\x7c\x00\x7d\x00\x00\x00\x7e\x00\x9e\x00\x80\x00\x81\x00\x82\x00\x83\x00\x00\x00\x6c\x00\x6f\x00\x00\x00\x70\x00\x00\x00\x71\x00\x9f\x00\x86\x00\x72\x00\x00\x00\x00\x00\x73\x00\x6d\x00\x74\x00\x75\x00\x76\x00\x00\x00\x00\x00\x00\x00\x00\x00\x77\x00\x78\x00\x00\x00\x79\x00\x00\x00\x00\x00\x7a\x00\x7b\x00\x00\x00\x7c\x00\x7d\x00\x00\x00\x7e\x00\x9e\x00\x80\x00\x81\x00\x82\x00\x83\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6c\x00\x00\x00\x84\x00\x9f\x00\x86\x00\x00\x00\x6f\x00\x00\x00\x70\x00\x00\x00\x71\x00\x00\x00\x6d\x00\x72\x00\x00\x00\xcb\x01\x73\x00\x00\x00\x74\x00\x75\x00\x76\x00\x00\x00\x00\x00\x00\x00\x00\x00\x77\x00\x78\x00\xcc\x01\x79\x00\x00\x00\x00\x00\x7a\x00\x7b\x00\x00\x00\x7c\x00\x7d\x00\x00\x00\x7e\x00\x9e\x00\x80\x00\x81\x00\x82\x00\x83\x00\x01\x02\xfb\x02\xaa\x00\x00\x00\x00\x00\x00\x00\x84\x00\x9f\x00\x86\x00\x00\x00\xa1\x00\x00\x00\x02\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x70\x00\xa2\x00\x71\x00\x00\x00\x00\x00\x72\x00\xa3\x00\x00\x00\x73\x00\x00\x00\x74\x00\x00\x00\x76\x00\x00\x00\x00\x00\x00\x00\x00\x00\x77\x00\x78\x00\x00\x00\xa4\x00\x00\x00\x00\x00\x7a\x00\x7b\x00\x00\x00\x84\x00\x7d\x00\x86\x00\x00\x00\x9e\x00\x3d\xfe\x81\x00\x82\x00\x83\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x84\x00\x9f\x00\x86\x00\x3d\xfe\x00\x00\x00\x00\xb0\x01\xb1\x01\x3d\xfe\x53\x00\xb2\x01\x55\x00\x56\x00\x57\x00\xb3\x01\xb4\x01\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x00\x00\x3d\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x5f\x00\x84\x00\x00\x00\x86\x00\xb5\x01\x00\x00\x00\x00\x00\x00\x00\x00\x92\x01\xcf\x00\x00\x00\x00\x00\x00\x00\x00\x00\x92\x00\x63\x00\xe9\x01\x00\x00\x00\x00\x00\x00\xb6\x01\xb7\x01\xb8\x01\x00\x00\x00\x00\x00\x00\x5c\x02\xa6\x00\xa7\x00\x5d\x02\x5e\x02\x00\x00\x00\x00\x00\x00\xb0\x01\xb1\x01\x00\x00\x53\x00\xb2\x01\x55\x00\x56\x00\x57\x00\xb3\x01\xb4\x01\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x00\x00\x92\x01\xcf\x00\x93\x01\xd1\x00\x29\x02\x5f\x00\x92\x00\x63\x00\x93\x00\xb5\x01\x94\x00\x67\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x68\x00\xc7\x02\x6a\x00\x92\x00\x63\x00\xe9\x01\x00\x00\x00\x00\x00\x00\xb6\x01\xb7\x01\xb8\x01\x00\x00\x00\x00\x00\x00\x5c\x02\xa6\x00\xa7\x00\x5d\x02\x5e\x02\xb0\x01\xb1\x01\x00\x00\x53\x00\xb2\x01\x55\x00\x56\x00\x57\x00\xb3\x01\xb4\x01\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5f\x00\x00\x00\x95\x01\x6a\x00\xb5\x01\x92\x01\xcf\x00\x93\x01\xd1\x00\x94\x01\x00\x00\x92\x00\x63\x00\xe9\x01\x00\x00\x68\x00\xcc\x02\x6a\x00\x00\x00\x00\x00\x00\x00\xb6\x01\xb7\x01\xb8\x01\x00\x00\x00\x00\x00\x00\x5c\x02\xa6\x00\xa7\x00\x5d\x02\x5e\x02\xb0\x01\xb1\x01\x00\x00\x53\x00\xb2\x01\x55\x00\x56\x00\x57\x00\xb3\x01\xb4\x01\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x00\x00\x92\x01\xcf\x00\x93\x01\xd1\x00\x94\x01\x5f\x00\x92\x00\x63\x00\x93\x00\xb5\x01\x94\x00\x67\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x95\x01\x6a\x00\x00\x00\x68\x00\x5f\x02\x6a\x00\x00\x00\x00\x00\x00\x00\xb6\x01\xb7\x01\xb8\x01\xb9\x01\x00\x00\x00\x00\x00\x00\x00\x00\xb0\x01\xb1\x01\x00\x00\x53\x00\xb2\x01\x55\x00\x56\x00\x57\x00\xb3\x01\xb4\x01\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5f\x00\x00\x00\x00\x00\x00\x00\xb5\x01\x95\x01\x6a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x68\x00\xba\x01\x6a\x00\xb6\x01\xb7\x01\xb8\x01\x00\x00\x00\x00\x00\x00\xb0\x01\xb1\x01\x00\x00\x53\x00\xb2\x01\x55\x00\x56\x00\x57\x00\xb3\x01\xb4\x01\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x00\x00\xd8\x00\xb9\x00\x00\x00\xd9\x00\x00\x00\x5f\x00\x00\x00\x00\x00\x00\x00\xb5\x01\xda\x00\x5d\x00\x5e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5f\x00\x00\x00\xab\x00\xba\x00\xac\x00\x00\x00\x68\x00\xba\x01\x6a\x00\xce\x02\x00\x00\xad\x00\x5d\x00\x5e\x00\x07\x02\x62\x00\x63\x00\xd0\x01\x00\x00\x00\x00\x5f\x00\x00\x00\x00\x00\xae\x00\x00\x00\x00\x00\x08\x02\x5f\x01\xa6\x00\xa7\x00\x60\x01\x61\x01\x00\x00\x00\x00\xfc\x01\x62\x00\x63\x00\xd0\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfd\x01\x5f\x01\xa6\x00\xa7\x00\x60\x01\x61\x01\x00\x00\x00\x00\x68\x00\xba\x01\x6a\x00\x00\x00\x97\x00\x00\x00\x98\x00\x00\x00\xab\x00\x00\x00\xac\x00\x00\x00\x00\x00\x99\x00\x5d\x00\x5e\x00\xdd\x00\xad\x00\x5d\x00\x5e\x00\x00\x00\x00\x00\x5f\x00\x00\x00\x00\x00\x00\x00\x5f\x00\x00\x00\x00\x00\xae\x00\x00\x00\x23\x02\xcf\x00\x00\x00\x00\x00\xfe\x01\xff\x01\xc8\x01\x63\x00\xc9\x01\xf2\x01\x62\x00\x63\x00\xd0\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x77\x02\xa6\x00\xa7\x00\x78\x02\x79\x02\x97\x00\x00\x00\x98\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x99\x00\x5d\x00\x5e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5f\x00\x9f\x01\x00\x00\xa0\x01\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x98\x00\xa1\x01\x5d\x00\x5e\x00\x00\x00\x00\x00\x00\x00\x99\x00\x5d\x00\x5e\x00\x5f\x00\x9c\x00\x00\x00\xa2\x01\xf3\x01\x6a\x00\x5f\x00\x00\x00\x77\x02\xa6\x00\xa7\x00\x78\x02\x79\x02\x00\x00\xd4\x02\x62\x00\x63\x00\xd0\x01\x00\x00\x00\x00\xf1\x01\x62\x00\x63\x00\xd0\x01\x0e\x01\x55\x00\x00\x00\x0f\x01\x00\x00\x10\x01\x00\x00\x11\x01\x5c\x00\x5d\x00\x5e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0e\x01\x55\x00\x5f\x00\x0f\x01\x00\x00\x10\x01\x12\x01\x11\x01\x5c\x00\x5d\x00\x5e\x00\x00\x00\x9c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5f\x00\x00\x00\x00\x00\x00\x00\x12\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb6\x02\x00\x00\x00\x00\x00\x00\x9c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9c\x00\x00\x00\x00\x00\x00\x00\x06\x00\x81\x02\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x00\x00\xb7\x02\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x19\x00\x00\x00\x00\x00\x68\x00\x15\x01\x6a\x00\x0e\x01\x55\x00\x00\x00\x0f\x01\x00\x00\x10\x01\x00\x00\x11\x01\x5c\x00\x5d\x00\x5e\x00\x00\x00\x68\x00\x15\x01\x6a\x00\x00\x00\x00\x00\x5f\x00\x00\x00\x00\x00\x00\x00\x12\x01\x06\x00\x00\x00\x07\x00\x00\x00\xf4\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x55\x01\x0e\x01\x55\x00\x00\x00\x0f\x01\x00\x00\x10\x01\xef\x01\x11\x01\x5c\x00\x5d\x00\x5e\x00\x18\x00\x19\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5f\x00\x00\x00\x00\x00\x06\x00\x12\x01\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x00\x00\xf0\x01\x00\x00\x1c\x02\x00\x00\x00\x00\x18\x00\x19\x00\x00\x00\x00\x00\x68\x00\x15\x01\x6a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x00\x00\x1d\x02\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x19\x00\x00\x00\x00\x00\x68\x00\x15\x01\x6a\x00\x0e\x01\x55\x00\x00\x00\x0f\x01\x00\x00\x10\x01\x00\x00\x11\x01\x5c\x00\x5d\x00\x5e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5f\x00\x00\x00\x00\x00\x00\x00\x12\x01\x06\x00\x00\x00\x07\x00\x00\x00\xf4\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x54\x01\x00\x00\x0e\x01\x55\x00\x00\x00\x0f\x01\x00\x00\x10\x01\x31\x02\x11\x01\x5c\x00\x5d\x00\x5e\x00\x18\x00\x19\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5f\x00\x00\x00\x00\x00\x06\x00\x12\x01\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x00\x00\x32\x02\x00\x00\xd7\x01\x00\x00\x00\x00\x18\x00\x19\x00\x00\x00\x00\x00\x68\x00\x15\x01\x6a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x00\x00\xd8\x01\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x19\x00\x00\x00\x00\x00\x68\x00\x15\x01\x6a\x00\xa9\x02\x55\x00\x00\x00\x0f\x01\x00\x00\x10\x01\x00\x00\x11\x01\x5c\x00\x5d\x00\x5e\x00\x00\x00\xf7\x02\xab\x02\xac\x02\xa9\x02\x55\x00\x5f\x00\x0f\x01\x00\x00\x10\x01\xad\x02\x11\x01\x5c\x00\x5d\x00\x5e\x00\x00\x00\xaa\x02\xab\x02\xac\x02\x0e\x01\x55\x00\x5f\x00\x0f\x01\x00\x00\x10\x01\xad\x02\x11\x01\x5c\x00\x5d\x00\x5e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5f\x00\x00\x00\x0e\x01\x55\x00\x12\x01\x0f\x01\x00\x00\x10\x01\x00\x00\x11\x01\x5c\x00\x5d\x00\x5e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5f\x00\x00\x00\x00\x00\x00\x00\x12\x01\x00\x00\x84\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x68\x00\xae\x02\x6a\x00\x00\x00\x0e\x01\x55\x00\x6d\x01\x0f\x01\x00\x00\x10\x01\x00\x00\x11\x01\x5c\x00\x5d\x00\x5e\x00\x68\x00\xae\x02\x6a\x00\x00\x00\xac\x00\x00\x00\x5f\x00\x00\x00\x00\x00\x00\x00\x12\x01\xad\x00\x5d\x00\x5e\x00\xae\x00\x68\x00\x15\x01\x6a\x00\x00\x00\x00\x00\x5f\x00\x00\x00\x00\x00\xae\x00\x00\x00\xd1\x01\x62\x00\x63\x00\xd0\x01\x00\x00\x00\x00\x6e\x01\x00\x00\x00\x00\x68\x00\x15\x01\x6a\x00\x7e\x02\x5f\x01\xa6\x00\xa7\x00\x60\x01\x61\x01\x00\x00\x00\x00\x00\x00\x5e\x01\x5f\x01\xa6\x00\xa7\x00\x60\x01\x61\x01\x98\x00\x00\x00\x00\x00\xae\x00\x00\x00\x00\x00\x00\x00\x99\x00\x5d\x00\x5e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf8\x02\x5f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x68\x00\x15\x01\x6a\x00\x00\x00\x00\x00\x7f\x02\xec\x02\x6a\x00\xf9\x02\x62\x00\x63\x00\xd0\x01\x00\x00\x00\x00\x00\x00\x62\x01\x63\x01\x06\x00\x00\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\xab\x01\xa2\x01\x00\x00\x00\x00\x00\x00\x12\x02\x00\x00\x18\x00\x19\x00\x00\x00\x8d\x01\x13\x02\x14\x02\x6a\x00\x8e\x01\xce\x00\xcf\x00\x8f\x01\xd1\x00\x00\x00\x8f\x00\x62\x00\x63\x00\x64\x00\x00\x00\x90\x00\x67\x00\x00\x00\x00\x00\x9c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\xab\x01\xaa\x01\x00\x00\x00\x00\xae\x00\xb9\x02\x00\x00\x18\x00\x19\x00\x2b\x02\xce\x00\xcf\x00\x00\x00\x9c\x00\x00\x00\xd1\x01\x62\x00\x63\x00\xd0\x01\x68\x00\x90\x01\x6a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7e\x02\x5f\x01\xa6\x00\xa7\x00\x60\x01\x61\x01\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\xab\x01\x00\x00\x00\x00\x00\x00\x00\x00\xac\x01\x00\x00\x18\x00\x19\x00\x00\x00\x00\x00\x68\x00\xad\x01\x6a\x00\xc5\x02\x7f\x02\xed\x02\x6a\x00\x8e\x01\xce\x00\xcf\x00\xca\x02\x9f\x00\x00\x00\x8f\x00\x62\x00\x63\x00\xd0\x01\x00\x00\x00\x00\x00\x00\x8f\x00\x62\x00\x63\x00\xd0\x01\x00\x00\x5a\x02\x5f\x01\xa6\x00\xa7\x00\x60\x01\x61\x01\x00\x00\x5a\x02\x5f\x01\xa6\x00\xa7\x00\x60\x01\x61\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\xc0\x02\x00\x00\x68\x00\xc6\x02\x6a\x00\x00\x00\x00\x00\x18\x00\x19\x00\x68\x00\xcb\x02\x6a\x00\xb0\x02\x00\x00\x05\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x70\x00\x00\x00\x71\x00\x00\x00\x00\x00\x72\x00\x00\x00\x00\x00\x73\x00\x00\x00\x74\x00\x00\x00\x76\x00\x00\x00\x00\x00\x00\x00\x00\x00\x77\x00\x78\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x00\x7b\x00\x00\x00\x00\x00\x7d\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x81\x00\x82\x00\x83\x00\x00\x00\x00\x00\xb0\x02\x00\x00\xb1\x02\x00\x00\x00\x00\x85\x00\x86\x00\xb2\x02\x70\x00\x00\x00\x71\x00\x00\x00\x00\x00\x72\x00\x00\x00\x00\x00\x73\x00\x00\x00\x74\x00\x00\x00\x76\x00\x00\x00\x00\x00\x00\x00\x00\x00\x77\x00\x78\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x00\x7b\x00\x00\x00\x00\x00\x7d\x00\x00\x00\xc0\x00\x7f\x00\x00\x00\x81\x00\x82\x00\x83\x00\x6f\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa1\x00\x00\x00\x85\x00\x86\x00\xb2\x02\xc3\x00\x00\x00\x00\x00\x75\x00\x00\x00\x00\x00\x6f\x00\x00\x00\xa2\x00\x00\x00\x00\x00\xa1\x00\x79\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7c\x00\x75\x00\x00\x00\x7e\x00\x00\x00\x80\x00\xa2\x00\x00\x00\x00\x00\xa4\x00\x79\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7c\x00\x86\x00\x00\x00\x7e\x00\x00\x00\x80\x00\x3d\x00\x00\x00\x00\x00\xa4\x00\x00\x00\x6f\x00\x00\x00\x70\x00\x00\x00\x71\x00\x00\x00\x86\x00\x72\x00\x00\x00\x00\x00\x73\x00\x00\x00\x74\x00\x75\x00\x76\x00\x00\x00\x00\x00\x00\x00\x00\x00\x77\x00\x78\x00\x00\x00\x79\x00\x00\x00\x00\x00\x7a\x00\x7b\x00\x00\x00\x7c\x00\x7d\x00\x00\x00\x7e\x00\x7f\x00\x80\x00\x81\x00\x82\x00\x83\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd0\x02\x85\x00\x86\x00\x6f\x00\x00\x00\x70\x00\x00\x00\x71\x00\x00\x00\x00\x00\x72\x00\x00\x00\x00\x00\x73\x00\x00\x00\x74\x00\x75\x00\x76\x00\x00\x00\x00\x00\x00\x00\x00\x00\x77\x00\x78\x00\x00\x00\x79\x00\x00\x00\x00\x00\x7a\x00\x7b\x00\x00\x00\x7c\x00\x7d\x00\x00\x00\x7e\x00\x7f\x00\x80\x00\x81\x00\x82\x00\x83\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x85\x00\x86\x00\x6f\x00\x00\x00\x70\x00\x00\x00\x71\x00\x3d\xfe\x00\x00\x72\x00\x00\x00\x00\x00\x73\x00\x00\x00\x74\x00\x75\x00\x76\x00\x00\x00\x00\x00\x00\x00\x3d\xfe\x77\x00\x78\x00\x00\x00\x79\x00\x3d\xfe\x00\x00\x7a\x00\x7b\x00\x00\x00\x7c\x00\x7d\x00\x00\x00\x7e\x00\x7f\x00\x80\x00\x81\x00\x82\x00\x83\x00\x3d\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbc\x01\x85\x00\x86\x00\x3b\xfe\x00\x00\x3b\xfe\x00\x00\x3b\xfe\x3b\xfe\x00\x00\x3b\xfe\x00\x00\x00\x00\x3b\xfe\x00\x00\x3b\xfe\x3b\xfe\x3b\xfe\x00\x00\x00\x00\x00\x00\x3b\xfe\x3b\xfe\x3b\xfe\x00\x00\x3b\xfe\x3b\xfe\x00\x00\x3b\xfe\x3b\xfe\x00\x00\x3b\xfe\x3b\xfe\x00\x00\x3b\xfe\x3b\xfe\x3b\xfe\x3b\xfe\x3b\xfe\x3b\xfe\x3b\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3b\xfe\x3b\xfe\x6f\x00\x00\x00\x70\x00\x00\x00\x71\x00\xa1\x00\x00\x00\x72\x00\x00\x00\x00\x00\x73\x00\x00\x00\x74\x00\x75\x00\x76\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x77\x00\x78\x00\x00\x00\x79\x00\xa3\x00\x00\x00\x7a\x00\x7b\x00\x00\x00\x7c\x00\x7d\x00\x00\x00\x7e\x00\xa6\x01\x80\x00\x81\x00\x82\x00\x83\x00\xa4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa7\x01\x86\x00\x6f\x00\x00\x00\x70\x00\x00\x00\x71\x00\x3d\xfe\x00\x00\x72\x00\x00\x00\x00\x00\x73\x00\x00\x00\x74\x00\x75\x00\x76\x00\x00\x00\x00\x00\x00\x00\x3d\xfe\x77\x00\x78\x00\x00\x00\x79\x00\x3d\xfe\x00\x00\x7a\x00\x7b\x00\x00\x00\x7c\x00\x7d\x00\x00\x00\x7e\x00\x7f\x00\x80\x00\x81\x00\x82\x00\x83\x00\x3d\xfe\x00\x00\x6f\x00\x00\x00\x70\x00\x00\x00\x71\x00\x85\x00\x86\x00\x72\x00\x00\x00\x00\x00\x73\x00\x00\x00\x74\x00\x75\x00\x76\x00\x00\x00\x00\x00\x00\x00\x00\x00\x77\x00\x78\x00\x00\x00\x79\x00\x00\x00\x00\x00\x7a\x00\x7b\x00\x00\x00\x7c\x00\x7d\x00\x00\x00\x7e\x00\x9e\x00\x80\x00\x81\x00\x82\x00\x83\x00\x00\x00\x00\x00\x6f\x00\x00\x00\x70\x00\x00\x00\x71\x00\x9f\x00\x86\x00\x72\x00\x00\x00\x00\x00\x73\x00\x00\x00\x74\x00\x75\x00\x76\x00\x00\x00\x00\x00\x00\x00\x00\x00\x77\x00\x78\x00\x00\x00\x79\x00\x00\x00\x00\x00\x7a\x00\x7b\x00\x00\x00\x7c\x00\x7d\x00\x00\x00\x7e\x00\x7f\x00\x80\x00\x81\x00\x82\x00\x83\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x85\x00\x86\x00\x6f\x00\x00\x00\x70\x00\x00\x00\x71\x00\xa1\x00\x00\x00\x72\x00\x00\x00\x00\x00\x73\x00\x00\x00\x00\x00\x75\x00\x76\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x77\x00\x78\x00\x00\x00\x79\x00\xa3\x00\x00\x00\x7a\x00\x7b\x00\x00\x00\x7c\x00\x00\x00\x00\x00\x7e\x00\x00\x00\x80\x00\x00\x00\x82\x00\x83\x00\xa4\x00\x70\x00\x00\x00\x71\x00\x00\x00\x00\x00\x72\x00\x00\x00\x86\x00\x73\x00\x00\x00\x74\x00\x00\x00\x76\x00\x00\x00\x00\x00\x00\x00\x00\x00\x77\x00\x78\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x00\x7b\x00\x00\x00\x00\x00\x7d\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x81\x00\x82\x00\x83\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x85\x00\x86\x00\xb2\x02\x70\x00\x00\x00\x71\x00\xa1\x00\x00\x00\x72\x00\x00\x00\x00\x00\x73\x00\x00\x00\x74\x00\x00\x00\x76\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x77\x00\x78\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x7a\x00\x7b\x00\x00\x00\x00\x00\x7d\x00\x00\x00\x00\x00\xa6\x01\x00\x00\x81\x00\x82\x00\x83\x00\xa4\x00\x70\x00\x00\x00\x71\x00\xa1\x00\x00\x00\x72\x00\xa7\x01\x86\x00\x73\x00\x00\x00\x74\x00\x00\x00\x76\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x77\x00\x78\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x7a\x00\x7b\x00\x00\x00\x00\x00\x7d\x00\x00\x00\x00\x00\xb3\x00\x00\x00\x81\x00\x82\x00\x83\x00\xa4\x00\x3b\xfe\x00\x00\x3b\xfe\x3b\xfe\x00\x00\x3b\xfe\xb4\x00\x86\x00\x3b\xfe\x00\x00\x3b\xfe\x00\x00\x3b\xfe\x00\x00\x00\x00\x00\x00\x3b\xfe\x3b\xfe\x3b\xfe\x00\x00\x00\x00\x3b\xfe\x00\x00\x3b\xfe\x3b\xfe\x00\x00\x00\x00\x3b\xfe\x00\x00\x00\x00\x3b\xfe\x00\x00\x3b\xfe\x3b\xfe\x3b\xfe\x3b\xfe\x70\x00\x00\x00\x71\x00\xa1\x00\x00\x00\x72\x00\x3b\xfe\x3b\xfe\x73\x00\x00\x00\x74\x00\x00\x00\x76\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x77\x00\x78\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x7a\x00\x7b\x00\x00\x00\x00\x00\x7d\x00\x00\x00\x00\x00\xa6\x01\x00\x00\x81\x00\x82\x00\x83\x00\xa4\x00\x70\x00\x00\x00\x71\x00\x00\x00\x00\x00\x72\x00\xa7\x01\x86\x00\x73\x00\x00\x00\x74\x00\x00\x00\x76\x00\x00\x00\x00\x00\x00\x00\x00\x00\x77\x00\x78\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x00\x7b\x00\x00\x00\x00\x00\x7d\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x81\x00\x82\x00\x83\x00\x00\x00\x70\x00\x00\x00\x71\x00\x00\x00\x00\x00\x72\x00\x85\x00\x86\x00\x73\x00\x00\x00\x74\x00\x00\x00\x76\x00\x00\x00\x00\x00\x00\x00\x00\x00\x77\x00\x78\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x00\x7b\x00\x00\x00\x00\x00\x7d\x00\x00\x00\x00\x00\x9e\x00\x00\x00\x81\x00\x82\x00\x83\x00\x00\x00\x70\x00\x00\x00\x71\x00\x00\x00\x00\x00\x72\x00\x9f\x00\x86\x00\x73\x00\x00\x00\x74\x00\x00\x00\x76\x00\x00\x00\x00\x00\x00\x00\x00\x00\x77\x00\x78\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x00\x7b\x00\x00\x00\x00\x00\x7d\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x81\x00\x82\x00\x83\x00\x00\x00\x70\x00\x00\x00\x71\x00\xa1\x00\x00\x00\x72\x00\x85\x00\x86\x00\x73\x00\x00\x00\x00\x00\x00\x00\x76\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x77\x00\x78\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x7a\x00\x7b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x82\x00\x83\x00\xa4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6c\x02\x86\x00\x27\x03\x6e\x02\x6f\x02\x70\x02\x71\x02\x06\x00\x00\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x72\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x19\x00\x6c\x02\x73\x02\x6d\x02\x6e\x02\x6f\x02\x70\x02\x71\x02\x06\x00\x00\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x72\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x19\x00\x31\x03\x73\x02\x00\x00\x32\x03\x6f\x02\x70\x02\x71\x02\x06\x00\x00\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x72\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x19\x00\x06\x00\x73\x02\x07\x00\x00\x00\xf4\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\xf5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe3\x02\x18\x00\x19\x00\x00\x00\x67\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe4\x02\x06\x00\x00\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x72\x02\x00\x00\x2e\x03\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x19\x00\x06\x00\x00\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x72\x02\x00\x00\xd7\x02\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x19\x00\x06\x00\x00\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x72\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x19\x00\x06\x00\x00\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\xab\x01\x00\x00\x00\x00\x00\x00\x00\x00\x0f\x02\x00\x00\x18\x00\x19\x00\x00\x00\x06\x00\x00\x00\x07\x00\x9c\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x00\x00\xea\x00\x00\x00\x43\x03\x00\x00\x00\x00\x18\x00\x19\x00\x06\x00\x00\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x00\x00\xea\x00\x00\x00\x44\x03\x00\x00\x00\x00\x18\x00\x19\x00\x06\x00\x00\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x00\x00\xea\x00\x00\x00\x93\x02\x00\x00\x00\x00\x18\x00\x19\x00\x06\x00\x00\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x00\x00\xea\x00\x00\x00\x94\x02\x00\x00\x00\x00\x18\x00\x19\x00\x06\x00\x00\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x00\x00\xea\x00\x00\x00\xeb\x00\x00\x00\x00\x00\x18\x00\x19\x00\x06\x00\x00\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x00\x00\x77\x03\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x19\x00\x06\x00\x00\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x00\x00\x78\x03\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x19\x00\x06\x00\x00\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x00\x00\x61\x03\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x19\x00\x06\x00\x00\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x00\x00\x3a\x03\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x19\x00\x06\x00\x00\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x00\x00\x92\x02\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x19\x00\x06\x00\x00\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x00\x00\x41\x01\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x19\x00\x06\x00\x00\x00\x07\x00\x42\x01\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x43\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x19\x00\x06\x00\x00\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x00\x00\x57\x01\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x19\x00\x06\x00\x00\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x5a\x01\x00\x00\x00\x00\x5b\x01\x00\x00\x00\x00\x00\x00\x18\x00\x19\x00\x06\x00\x00\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x19\x00\x06\x00\x00\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x00\x00\x7c\x01\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x19\x00\x06\x00\x00\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x00\x00\x7e\x01\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x19\x00\x06\x00\x00\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x00\x00\x7f\x01\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x19\x00\x06\x00\x00\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x00\x00\x17\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x19\x00\x06\x00\x00\x00\x07\x00\x00\x00\xf4\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\xf5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x56\x03\x18\x00\x19\x00\x06\x00\x00\x00\x07\x00\x00\x00\xf4\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\xf5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x58\x03\x18\x00\x19\x00\x06\x00\x00\x00\x07\x00\x00\x00\xf4\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\xf5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5b\x03\x18\x00\x19\x00\x06\x00\x00\x00\x07\x00\x00\x00\xf4\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\xf5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x66\x03\x18\x00\x19\x00\x06\x00\x00\x00\x07\x00\x00\x00\xf4\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\xf5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x47\x03\x18\x00\x19\x00\x06\x00\x00\x00\x07\x00\x00\x00\xf4\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\xf5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4d\x03\x18\x00\x19\x00\x06\x00\x00\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x51\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x19\x00\x06\x00\x00\x00\x07\x00\x00\x00\xf4\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\xf5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe8\x02\x18\x00\x19\x00\x06\x00\x00\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\xee\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x19\x00\x06\x00\x00\x00\x07\x00\x00\x00\xf4\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\xf5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x29\x03\x18\x00\x19\x00\x06\x00\x00\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x69\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x19\x00\x06\x00\x00\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x6b\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x19\x00\x06\x00\x00\x00\x07\x00\x00\x00\xf4\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\xf5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x02\x18\x00\x19\x00\x06\x00\x00\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x45\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x19\x00\x06\x00\x00\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x6c\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x19\x00\x06\x00\x00\x00\x07\x00\x00\x00\xf4\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\xf5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf6\x00\x18\x00\x19\x00\x06\x00\x00\x00\x07\x00\x00\x00\xf4\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x6a\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x19\x00\x06\x00\x00\x00\x07\x00\x00\x00\xf4\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x64\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x19\x00\x06\x00\x00\x00\x07\x00\x00\x00\xf4\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x59\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x19\x00\x06\x00\x00\x00\x07\x00\x00\x00\xf4\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x56\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x19\x00\x06\x00\x00\x00\x07\x00\x00\x00\xf4\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x53\x01\x02\x02\xce\x00\xcf\x00\x00\x00\x00\x00\x00\x00\x03\x02\x62\x00\x63\x00\xd0\x01\x00\x00\x00\x00\x00\x00\x18\x00\x19\x00\x00\x00\x00\x00\x00\x00\x04\x02\x5f\x01\xa6\x00\xa7\x00\x60\x01\x61\x01\x09\x02\xce\x00\xcf\x00\x00\x00\x00\x00\x00\x00\x0a\x02\x62\x00\x63\x00\xd0\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x59\x03\x0b\x02\x5f\x01\xa6\x00\xa7\x00\x60\x01\x61\x01\x02\x03\x00\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\x01\x03\xf4\x01\x62\x00\x63\x00\xd0\x01\x00\x00\x00\x00\x02\x03\x00\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\x00\x00\xf4\x01\x62\x00\x63\x00\xd0\x01\xcb\x00\x00\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\x00\x00\xf4\x01\x62\x00\x63\x00\xd0\x01\xe1\x00\x00\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\x00\x00\xf4\x01\x62\x00\x63\x00\xd0\x01\x37\x02\x00\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\x00\x00\xf4\x01\x62\x00\x63\x00\xd0\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"#--happyReduceArr = Happy_Data_Array.array (4, 463) [- (4 , happyReduce_4),- (5 , happyReduce_5),- (6 , happyReduce_6),- (7 , happyReduce_7),- (8 , happyReduce_8),- (9 , happyReduce_9),- (10 , happyReduce_10),- (11 , happyReduce_11),- (12 , happyReduce_12),- (13 , happyReduce_13),- (14 , happyReduce_14),- (15 , happyReduce_15),- (16 , happyReduce_16),- (17 , happyReduce_17),- (18 , happyReduce_18),- (19 , happyReduce_19),- (20 , happyReduce_20),- (21 , happyReduce_21),- (22 , happyReduce_22),- (23 , happyReduce_23),- (24 , happyReduce_24),- (25 , happyReduce_25),- (26 , happyReduce_26),- (27 , happyReduce_27),- (28 , happyReduce_28),- (29 , happyReduce_29),- (30 , happyReduce_30),- (31 , happyReduce_31),- (32 , happyReduce_32),- (33 , happyReduce_33),- (34 , happyReduce_34),- (35 , happyReduce_35),- (36 , happyReduce_36),- (37 , happyReduce_37),- (38 , happyReduce_38),- (39 , happyReduce_39),- (40 , happyReduce_40),- (41 , happyReduce_41),- (42 , happyReduce_42),- (43 , happyReduce_43),- (44 , happyReduce_44),- (45 , happyReduce_45),- (46 , happyReduce_46),- (47 , happyReduce_47),- (48 , happyReduce_48),- (49 , happyReduce_49),- (50 , happyReduce_50),- (51 , happyReduce_51),- (52 , happyReduce_52),- (53 , happyReduce_53),- (54 , happyReduce_54),- (55 , happyReduce_55),- (56 , happyReduce_56),- (57 , happyReduce_57),- (58 , happyReduce_58),- (59 , happyReduce_59),- (60 , happyReduce_60),- (61 , happyReduce_61),- (62 , happyReduce_62),- (63 , happyReduce_63),- (64 , happyReduce_64),- (65 , happyReduce_65),- (66 , happyReduce_66),- (67 , happyReduce_67),- (68 , happyReduce_68),- (69 , happyReduce_69),- (70 , happyReduce_70),- (71 , happyReduce_71),- (72 , happyReduce_72),- (73 , happyReduce_73),- (74 , happyReduce_74),- (75 , happyReduce_75),- (76 , happyReduce_76),- (77 , happyReduce_77),- (78 , happyReduce_78),- (79 , happyReduce_79),- (80 , happyReduce_80),- (81 , happyReduce_81),- (82 , happyReduce_82),- (83 , happyReduce_83),- (84 , happyReduce_84),- (85 , happyReduce_85),- (86 , happyReduce_86),- (87 , happyReduce_87),- (88 , happyReduce_88),- (89 , happyReduce_89),- (90 , happyReduce_90),- (91 , happyReduce_91),- (92 , happyReduce_92),- (93 , happyReduce_93),- (94 , happyReduce_94),- (95 , happyReduce_95),- (96 , happyReduce_96),- (97 , happyReduce_97),- (98 , happyReduce_98),- (99 , happyReduce_99),- (100 , happyReduce_100),- (101 , happyReduce_101),- (102 , happyReduce_102),- (103 , happyReduce_103),- (104 , happyReduce_104),- (105 , happyReduce_105),- (106 , happyReduce_106),- (107 , happyReduce_107),- (108 , happyReduce_108),- (109 , happyReduce_109),- (110 , happyReduce_110),- (111 , happyReduce_111),- (112 , happyReduce_112),- (113 , happyReduce_113),- (114 , happyReduce_114),- (115 , happyReduce_115),- (116 , happyReduce_116),- (117 , happyReduce_117),- (118 , happyReduce_118),- (119 , happyReduce_119),- (120 , happyReduce_120),- (121 , happyReduce_121),- (122 , happyReduce_122),- (123 , happyReduce_123),- (124 , happyReduce_124),- (125 , happyReduce_125),- (126 , happyReduce_126),- (127 , happyReduce_127),- (128 , happyReduce_128),- (129 , happyReduce_129),- (130 , happyReduce_130),- (131 , happyReduce_131),- (132 , happyReduce_132),- (133 , happyReduce_133),- (134 , happyReduce_134),- (135 , happyReduce_135),- (136 , happyReduce_136),- (137 , happyReduce_137),- (138 , happyReduce_138),- (139 , happyReduce_139),- (140 , happyReduce_140),- (141 , happyReduce_141),- (142 , happyReduce_142),- (143 , happyReduce_143),- (144 , happyReduce_144),- (145 , happyReduce_145),- (146 , happyReduce_146),- (147 , happyReduce_147),- (148 , happyReduce_148),- (149 , happyReduce_149),- (150 , happyReduce_150),- (151 , happyReduce_151),- (152 , happyReduce_152),- (153 , happyReduce_153),- (154 , happyReduce_154),- (155 , happyReduce_155),- (156 , happyReduce_156),- (157 , happyReduce_157),- (158 , happyReduce_158),- (159 , happyReduce_159),- (160 , happyReduce_160),- (161 , happyReduce_161),- (162 , happyReduce_162),- (163 , happyReduce_163),- (164 , happyReduce_164),- (165 , happyReduce_165),- (166 , happyReduce_166),- (167 , happyReduce_167),- (168 , happyReduce_168),- (169 , happyReduce_169),- (170 , happyReduce_170),- (171 , happyReduce_171),- (172 , happyReduce_172),- (173 , happyReduce_173),- (174 , happyReduce_174),- (175 , happyReduce_175),- (176 , happyReduce_176),- (177 , happyReduce_177),- (178 , happyReduce_178),- (179 , happyReduce_179),- (180 , happyReduce_180),- (181 , happyReduce_181),- (182 , happyReduce_182),- (183 , happyReduce_183),- (184 , happyReduce_184),- (185 , happyReduce_185),- (186 , happyReduce_186),- (187 , happyReduce_187),- (188 , happyReduce_188),- (189 , happyReduce_189),- (190 , happyReduce_190),- (191 , happyReduce_191),- (192 , happyReduce_192),- (193 , happyReduce_193),- (194 , happyReduce_194),- (195 , happyReduce_195),- (196 , happyReduce_196),- (197 , happyReduce_197),- (198 , happyReduce_198),- (199 , happyReduce_199),- (200 , happyReduce_200),- (201 , happyReduce_201),- (202 , happyReduce_202),- (203 , happyReduce_203),- (204 , happyReduce_204),- (205 , happyReduce_205),- (206 , happyReduce_206),- (207 , happyReduce_207),- (208 , happyReduce_208),- (209 , happyReduce_209),- (210 , happyReduce_210),- (211 , happyReduce_211),- (212 , happyReduce_212),- (213 , happyReduce_213),- (214 , happyReduce_214),- (215 , happyReduce_215),- (216 , happyReduce_216),- (217 , happyReduce_217),- (218 , happyReduce_218),- (219 , happyReduce_219),- (220 , happyReduce_220),- (221 , happyReduce_221),- (222 , happyReduce_222),- (223 , happyReduce_223),- (224 , happyReduce_224),- (225 , happyReduce_225),- (226 , happyReduce_226),- (227 , happyReduce_227),- (228 , happyReduce_228),- (229 , happyReduce_229),- (230 , happyReduce_230),- (231 , happyReduce_231),- (232 , happyReduce_232),- (233 , happyReduce_233),- (234 , happyReduce_234),- (235 , happyReduce_235),- (236 , happyReduce_236),- (237 , happyReduce_237),- (238 , happyReduce_238),- (239 , happyReduce_239),- (240 , happyReduce_240),- (241 , happyReduce_241),- (242 , happyReduce_242),- (243 , happyReduce_243),- (244 , happyReduce_244),- (245 , happyReduce_245),- (246 , happyReduce_246),- (247 , happyReduce_247),- (248 , happyReduce_248),- (249 , happyReduce_249),- (250 , happyReduce_250),- (251 , happyReduce_251),- (252 , happyReduce_252),- (253 , happyReduce_253),- (254 , happyReduce_254),- (255 , happyReduce_255),- (256 , happyReduce_256),- (257 , happyReduce_257),- (258 , happyReduce_258),- (259 , happyReduce_259),- (260 , happyReduce_260),- (261 , happyReduce_261),- (262 , happyReduce_262),- (263 , happyReduce_263),- (264 , happyReduce_264),- (265 , happyReduce_265),- (266 , happyReduce_266),- (267 , happyReduce_267),- (268 , happyReduce_268),- (269 , happyReduce_269),- (270 , happyReduce_270),- (271 , happyReduce_271),- (272 , happyReduce_272),- (273 , happyReduce_273),- (274 , happyReduce_274),- (275 , happyReduce_275),- (276 , happyReduce_276),- (277 , happyReduce_277),- (278 , happyReduce_278),- (279 , happyReduce_279),- (280 , happyReduce_280),- (281 , happyReduce_281),- (282 , happyReduce_282),- (283 , happyReduce_283),- (284 , happyReduce_284),- (285 , happyReduce_285),- (286 , happyReduce_286),- (287 , happyReduce_287),- (288 , happyReduce_288),- (289 , happyReduce_289),- (290 , happyReduce_290),- (291 , happyReduce_291),- (292 , happyReduce_292),- (293 , happyReduce_293),- (294 , happyReduce_294),- (295 , happyReduce_295),- (296 , happyReduce_296),- (297 , happyReduce_297),- (298 , happyReduce_298),- (299 , happyReduce_299),- (300 , happyReduce_300),- (301 , happyReduce_301),- (302 , happyReduce_302),- (303 , happyReduce_303),- (304 , happyReduce_304),- (305 , happyReduce_305),- (306 , happyReduce_306),- (307 , happyReduce_307),- (308 , happyReduce_308),- (309 , happyReduce_309),- (310 , happyReduce_310),- (311 , happyReduce_311),- (312 , happyReduce_312),- (313 , happyReduce_313),- (314 , happyReduce_314),- (315 , happyReduce_315),- (316 , happyReduce_316),- (317 , happyReduce_317),- (318 , happyReduce_318),- (319 , happyReduce_319),- (320 , happyReduce_320),- (321 , happyReduce_321),- (322 , happyReduce_322),- (323 , happyReduce_323),- (324 , happyReduce_324),- (325 , happyReduce_325),- (326 , happyReduce_326),- (327 , happyReduce_327),- (328 , happyReduce_328),- (329 , happyReduce_329),- (330 , happyReduce_330),- (331 , happyReduce_331),- (332 , happyReduce_332),- (333 , happyReduce_333),- (334 , happyReduce_334),- (335 , happyReduce_335),- (336 , happyReduce_336),- (337 , happyReduce_337),- (338 , happyReduce_338),- (339 , happyReduce_339),- (340 , happyReduce_340),- (341 , happyReduce_341),- (342 , happyReduce_342),- (343 , happyReduce_343),- (344 , happyReduce_344),- (345 , happyReduce_345),- (346 , happyReduce_346),- (347 , happyReduce_347),- (348 , happyReduce_348),- (349 , happyReduce_349),- (350 , happyReduce_350),- (351 , happyReduce_351),- (352 , happyReduce_352),- (353 , happyReduce_353),- (354 , happyReduce_354),- (355 , happyReduce_355),- (356 , happyReduce_356),- (357 , happyReduce_357),- (358 , happyReduce_358),- (359 , happyReduce_359),- (360 , happyReduce_360),- (361 , happyReduce_361),- (362 , happyReduce_362),- (363 , happyReduce_363),- (364 , happyReduce_364),- (365 , happyReduce_365),- (366 , happyReduce_366),- (367 , happyReduce_367),- (368 , happyReduce_368),- (369 , happyReduce_369),- (370 , happyReduce_370),- (371 , happyReduce_371),- (372 , happyReduce_372),- (373 , happyReduce_373),- (374 , happyReduce_374),- (375 , happyReduce_375),- (376 , happyReduce_376),- (377 , happyReduce_377),- (378 , happyReduce_378),- (379 , happyReduce_379),- (380 , happyReduce_380),- (381 , happyReduce_381),- (382 , happyReduce_382),- (383 , happyReduce_383),- (384 , happyReduce_384),- (385 , happyReduce_385),- (386 , happyReduce_386),- (387 , happyReduce_387),- (388 , happyReduce_388),- (389 , happyReduce_389),- (390 , happyReduce_390),- (391 , happyReduce_391),- (392 , happyReduce_392),- (393 , happyReduce_393),- (394 , happyReduce_394),- (395 , happyReduce_395),- (396 , happyReduce_396),- (397 , happyReduce_397),- (398 , happyReduce_398),- (399 , happyReduce_399),- (400 , happyReduce_400),- (401 , happyReduce_401),- (402 , happyReduce_402),- (403 , happyReduce_403),- (404 , happyReduce_404),- (405 , happyReduce_405),- (406 , happyReduce_406),- (407 , happyReduce_407),- (408 , happyReduce_408),- (409 , happyReduce_409),- (410 , happyReduce_410),- (411 , happyReduce_411),- (412 , happyReduce_412),- (413 , happyReduce_413),- (414 , happyReduce_414),- (415 , happyReduce_415),- (416 , happyReduce_416),- (417 , happyReduce_417),- (418 , happyReduce_418),- (419 , happyReduce_419),- (420 , happyReduce_420),- (421 , happyReduce_421),- (422 , happyReduce_422),- (423 , happyReduce_423),- (424 , happyReduce_424),- (425 , happyReduce_425),- (426 , happyReduce_426),- (427 , happyReduce_427),- (428 , happyReduce_428),- (429 , happyReduce_429),- (430 , happyReduce_430),- (431 , happyReduce_431),- (432 , happyReduce_432),- (433 , happyReduce_433),- (434 , happyReduce_434),- (435 , happyReduce_435),- (436 , happyReduce_436),- (437 , happyReduce_437),- (438 , happyReduce_438),- (439 , happyReduce_439),- (440 , happyReduce_440),- (441 , happyReduce_441),- (442 , happyReduce_442),- (443 , happyReduce_443),- (444 , happyReduce_444),- (445 , happyReduce_445),- (446 , happyReduce_446),- (447 , happyReduce_447),- (448 , happyReduce_448),- (449 , happyReduce_449),- (450 , happyReduce_450),- (451 , happyReduce_451),- (452 , happyReduce_452),- (453 , happyReduce_453),- (454 , happyReduce_454),- (455 , happyReduce_455),- (456 , happyReduce_456),- (457 , happyReduce_457),- (458 , happyReduce_458),- (459 , happyReduce_459),- (460 , happyReduce_460),- (461 , happyReduce_461),- (462 , happyReduce_462),- (463 , happyReduce_463)- ]--happy_n_terms = 102 :: Int-happy_n_nonterms = 125 :: Int--happyReduce_4 = happyMonadReduce 1# 0# happyReduction_4-happyReduction_4 (happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut8 happy_x_1 of { happy_var_1 -> - ( withNodeInfo happy_var_1 $ CTranslUnit (reverse happy_var_1))}- ) (\r -> happyReturn (happyIn7 r))--happyReduce_5 = happySpecReduce_0 1# happyReduction_5-happyReduction_5 = happyIn8- (empty- )--happyReduce_6 = happySpecReduce_2 1# happyReduction_6-happyReduction_6 happy_x_2- happy_x_1- = case happyOut8 happy_x_1 of { happy_var_1 -> - happyIn8- (happy_var_1- )}--happyReduce_7 = happySpecReduce_2 1# happyReduction_7-happyReduction_7 happy_x_2- happy_x_1- = case happyOut8 happy_x_1 of { happy_var_1 -> - case happyOut9 happy_x_2 of { happy_var_2 -> - happyIn8- (happy_var_1 `snoc` happy_var_2- )}}--happyReduce_8 = happySpecReduce_1 2# happyReduction_8-happyReduction_8 happy_x_1- = case happyOut10 happy_x_1 of { happy_var_1 -> - happyIn9- (CFDefExt happy_var_1- )}--happyReduce_9 = happySpecReduce_1 2# happyReduction_9-happyReduction_9 happy_x_1- = case happyOut32 happy_x_1 of { happy_var_1 -> - happyIn9- (CDeclExt happy_var_1- )}--happyReduce_10 = happySpecReduce_2 2# happyReduction_10-happyReduction_10 happy_x_2- happy_x_1- = case happyOut9 happy_x_2 of { happy_var_2 -> - happyIn9- (happy_var_2- )}--happyReduce_11 = happyReduce 5# 2# happyReduction_11-happyReduction_11 (happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOut123 happy_x_3 of { happy_var_3 -> - happyIn9- (CAsmExt happy_var_3- ) `HappyStk` happyRest}--happyReduce_12 = happyMonadReduce 2# 3# happyReduction_12-happyReduction_12 (happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut11 happy_x_1 of { happy_var_1 -> - case happyOut14 happy_x_2 of { happy_var_2 -> - ( leaveScope >> (withNodeInfo happy_var_1 $ CFunDef [] happy_var_1 [] happy_var_2))}}- ) (\r -> happyReturn (happyIn10 r))--happyReduce_13 = happyMonadReduce 3# 3# happyReduction_13-happyReduction_13 (happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut127 happy_x_1 of { happy_var_1 -> - case happyOut11 happy_x_2 of { happy_var_2 -> - case happyOut14 happy_x_3 of { happy_var_3 -> - ( leaveScope >> (withNodeInfo happy_var_2 $ CFunDef (liftCAttrs happy_var_1) happy_var_2 [] happy_var_3))}}}- ) (\r -> happyReturn (happyIn10 r))--happyReduce_14 = happyMonadReduce 3# 3# happyReduction_14-happyReduction_14 (happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut37 happy_x_1 of { happy_var_1 -> - case happyOut11 happy_x_2 of { happy_var_2 -> - case happyOut14 happy_x_3 of { happy_var_3 -> - ( leaveScope >> (withNodeInfo happy_var_1 $ CFunDef happy_var_1 happy_var_2 [] happy_var_3))}}}- ) (\r -> happyReturn (happyIn10 r))--happyReduce_15 = happyMonadReduce 3# 3# happyReduction_15-happyReduction_15 (happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut41 happy_x_1 of { happy_var_1 -> - case happyOut11 happy_x_2 of { happy_var_2 -> - case happyOut14 happy_x_3 of { happy_var_3 -> - ( leaveScope >> (withNodeInfo happy_var_1 $ CFunDef happy_var_1 happy_var_2 [] happy_var_3))}}}- ) (\r -> happyReturn (happyIn10 r))--happyReduce_16 = happyMonadReduce 3# 3# happyReduction_16-happyReduction_16 (happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut38 happy_x_1 of { happy_var_1 -> - case happyOut11 happy_x_2 of { happy_var_2 -> - case happyOut14 happy_x_3 of { happy_var_3 -> - ( leaveScope >> (withNodeInfo happy_var_1 $ CFunDef (reverse happy_var_1) happy_var_2 [] happy_var_3))}}}- ) (\r -> happyReturn (happyIn10 r))--happyReduce_17 = happyMonadReduce 3# 3# happyReduction_17-happyReduction_17 (happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut62 happy_x_1 of { happy_var_1 -> - case happyOut11 happy_x_2 of { happy_var_2 -> - case happyOut14 happy_x_3 of { happy_var_3 -> - ( leaveScope >> (withNodeInfo happy_var_1 $ CFunDef (liftTypeQuals happy_var_1) happy_var_2 [] happy_var_3))}}}- ) (\r -> happyReturn (happyIn10 r))--happyReduce_18 = happyMonadReduce 4# 3# happyReduction_18-happyReduction_18 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut62 happy_x_1 of { happy_var_1 -> - case happyOut127 happy_x_2 of { happy_var_2 -> - case happyOut11 happy_x_3 of { happy_var_3 -> - case happyOut14 happy_x_4 of { happy_var_4 -> - ( leaveScope >> (withNodeInfo happy_var_1 $ CFunDef (liftTypeQuals happy_var_1 ++ liftCAttrs happy_var_2) happy_var_3 [] happy_var_4))}}}}- ) (\r -> happyReturn (happyIn10 r))--happyReduce_19 = happyMonadReduce 3# 3# happyReduction_19-happyReduction_19 (happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut76 happy_x_1 of { happy_var_1 -> - case happyOut33 happy_x_2 of { happy_var_2 -> - case happyOut14 happy_x_3 of { happy_var_3 -> - ( withNodeInfo happy_var_1 $ CFunDef [] happy_var_1 (reverse happy_var_2) happy_var_3)}}}- ) (\r -> happyReturn (happyIn10 r))--happyReduce_20 = happyMonadReduce 4# 3# happyReduction_20-happyReduction_20 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut127 happy_x_1 of { happy_var_1 -> - case happyOut76 happy_x_2 of { happy_var_2 -> - case happyOut33 happy_x_3 of { happy_var_3 -> - case happyOut14 happy_x_4 of { happy_var_4 -> - ( withNodeInfo happy_var_2 $ CFunDef (liftCAttrs happy_var_1) happy_var_2 (reverse happy_var_3) happy_var_4)}}}}- ) (\r -> happyReturn (happyIn10 r))--happyReduce_21 = happyMonadReduce 4# 3# happyReduction_21-happyReduction_21 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut37 happy_x_1 of { happy_var_1 -> - case happyOut76 happy_x_2 of { happy_var_2 -> - case happyOut33 happy_x_3 of { happy_var_3 -> - case happyOut14 happy_x_4 of { happy_var_4 -> - ( withNodeInfo happy_var_1 $ CFunDef happy_var_1 happy_var_2 (reverse happy_var_3) happy_var_4)}}}}- ) (\r -> happyReturn (happyIn10 r))--happyReduce_22 = happyMonadReduce 4# 3# happyReduction_22-happyReduction_22 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut41 happy_x_1 of { happy_var_1 -> - case happyOut76 happy_x_2 of { happy_var_2 -> - case happyOut33 happy_x_3 of { happy_var_3 -> - case happyOut14 happy_x_4 of { happy_var_4 -> - ( withNodeInfo happy_var_1 $ CFunDef happy_var_1 happy_var_2 (reverse happy_var_3) happy_var_4)}}}}- ) (\r -> happyReturn (happyIn10 r))--happyReduce_23 = happyMonadReduce 4# 3# happyReduction_23-happyReduction_23 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut38 happy_x_1 of { happy_var_1 -> - case happyOut76 happy_x_2 of { happy_var_2 -> - case happyOut33 happy_x_3 of { happy_var_3 -> - case happyOut14 happy_x_4 of { happy_var_4 -> - ( withNodeInfo happy_var_1 $ CFunDef (reverse happy_var_1) happy_var_2 (reverse happy_var_3) happy_var_4)}}}}- ) (\r -> happyReturn (happyIn10 r))--happyReduce_24 = happyMonadReduce 4# 3# happyReduction_24-happyReduction_24 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut62 happy_x_1 of { happy_var_1 -> - case happyOut76 happy_x_2 of { happy_var_2 -> - case happyOut33 happy_x_3 of { happy_var_3 -> - case happyOut14 happy_x_4 of { happy_var_4 -> - ( withNodeInfo happy_var_1 $ CFunDef (liftTypeQuals happy_var_1) happy_var_2 (reverse happy_var_3) happy_var_4)}}}}- ) (\r -> happyReturn (happyIn10 r))--happyReduce_25 = happyMonadReduce 5# 3# happyReduction_25-happyReduction_25 (happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut62 happy_x_1 of { happy_var_1 -> - case happyOut127 happy_x_2 of { happy_var_2 -> - case happyOut76 happy_x_3 of { happy_var_3 -> - case happyOut33 happy_x_4 of { happy_var_4 -> - case happyOut14 happy_x_5 of { happy_var_5 -> - ( withNodeInfo happy_var_1 $ CFunDef (liftTypeQuals happy_var_1 ++ liftCAttrs happy_var_2) happy_var_3 (reverse happy_var_4) happy_var_5)}}}}}- ) (\r -> happyReturn (happyIn10 r))--happyReduce_26 = happyMonadReduce 1# 4# happyReduction_26-happyReduction_26 (happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut72 happy_x_1 of { happy_var_1 -> - ( let declr = reverseDeclr happy_var_1 in- enterScope >> doFuncParamDeclIdent declr >> return declr)}- ) (\r -> happyReturn (happyIn11 r))--happyReduce_27 = happySpecReduce_1 5# happyReduction_27-happyReduction_27 happy_x_1- = case happyOut13 happy_x_1 of { happy_var_1 -> - happyIn12- (happy_var_1- )}--happyReduce_28 = happySpecReduce_1 5# happyReduction_28-happyReduction_28 happy_x_1- = case happyOut14 happy_x_1 of { happy_var_1 -> - happyIn12- (happy_var_1- )}--happyReduce_29 = happySpecReduce_1 5# happyReduction_29-happyReduction_29 happy_x_1- = case happyOut22 happy_x_1 of { happy_var_1 -> - happyIn12- (happy_var_1- )}--happyReduce_30 = happySpecReduce_1 5# happyReduction_30-happyReduction_30 happy_x_1- = case happyOut23 happy_x_1 of { happy_var_1 -> - happyIn12- (happy_var_1- )}--happyReduce_31 = happySpecReduce_1 5# happyReduction_31-happyReduction_31 happy_x_1- = case happyOut24 happy_x_1 of { happy_var_1 -> - happyIn12- (happy_var_1- )}--happyReduce_32 = happySpecReduce_1 5# happyReduction_32-happyReduction_32 happy_x_1- = case happyOut25 happy_x_1 of { happy_var_1 -> - happyIn12- (happy_var_1- )}--happyReduce_33 = happyMonadReduce 1# 5# happyReduction_33-happyReduction_33 (happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut26 happy_x_1 of { happy_var_1 -> - ( withNodeInfo happy_var_1 (CAsm happy_var_1))}- ) (\r -> happyReturn (happyIn12 r))--happyReduce_34 = happyMonadReduce 4# 6# happyReduction_34-happyReduction_34 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut125 happy_x_1 of { happy_var_1 -> - case happyOutTok happy_x_2 of { happy_var_2 -> - case happyOut126 happy_x_3 of { happy_var_3 -> - case happyOut12 happy_x_4 of { happy_var_4 -> - ( withNodeInfo happy_var_2 $ CLabel happy_var_1 happy_var_4 happy_var_3)}}}}- ) (\r -> happyReturn (happyIn13 r))--happyReduce_35 = happyMonadReduce 4# 6# happyReduction_35-happyReduction_35 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut121 happy_x_2 of { happy_var_2 -> - case happyOut12 happy_x_4 of { happy_var_4 -> - ( withNodeInfo happy_var_1 $ CCase happy_var_2 happy_var_4)}}}- ) (\r -> happyReturn (happyIn13 r))--happyReduce_36 = happyMonadReduce 3# 6# happyReduction_36-happyReduction_36 (happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut12 happy_x_3 of { happy_var_3 -> - ( withNodeInfo happy_var_1 $ CDefault happy_var_3)}}- ) (\r -> happyReturn (happyIn13 r))--happyReduce_37 = happyMonadReduce 6# 6# happyReduction_37-happyReduction_37 (happy_x_6 `HappyStk`- happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut121 happy_x_2 of { happy_var_2 -> - case happyOut121 happy_x_4 of { happy_var_4 -> - case happyOut12 happy_x_6 of { happy_var_6 -> - ( withNodeInfo happy_var_1 $ CCases happy_var_2 happy_var_4 happy_var_6)}}}}- ) (\r -> happyReturn (happyIn13 r))--happyReduce_38 = happyMonadReduce 5# 7# happyReduction_38-happyReduction_38 (happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut17 happy_x_3 of { happy_var_3 -> - ( withNodeInfo happy_var_1 $ CCompound [] (reverse happy_var_3))}}- ) (\r -> happyReturn (happyIn14 r))--happyReduce_39 = happyMonadReduce 6# 7# happyReduction_39-happyReduction_39 (happy_x_6 `HappyStk`- happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut21 happy_x_3 of { happy_var_3 -> - case happyOut17 happy_x_4 of { happy_var_4 -> - ( withNodeInfo happy_var_1 $ CCompound (reverse happy_var_3) (reverse happy_var_4))}}}- ) (\r -> happyReturn (happyIn14 r))--happyReduce_40 = happyMonadReduce 0# 8# happyReduction_40-happyReduction_40 (happyRest) tk- = happyThen (( enterScope)- ) (\r -> happyReturn (happyIn15 r))--happyReduce_41 = happyMonadReduce 0# 9# happyReduction_41-happyReduction_41 (happyRest) tk- = happyThen (( leaveScope)- ) (\r -> happyReturn (happyIn16 r))--happyReduce_42 = happySpecReduce_0 10# happyReduction_42-happyReduction_42 = happyIn17- (empty- )--happyReduce_43 = happySpecReduce_2 10# happyReduction_43-happyReduction_43 happy_x_2- happy_x_1- = case happyOut17 happy_x_1 of { happy_var_1 -> - case happyOut18 happy_x_2 of { happy_var_2 -> - happyIn17- (happy_var_1 `snoc` happy_var_2- )}}--happyReduce_44 = happySpecReduce_1 11# happyReduction_44-happyReduction_44 happy_x_1- = case happyOut12 happy_x_1 of { happy_var_1 -> - happyIn18- (CBlockStmt happy_var_1- )}--happyReduce_45 = happySpecReduce_1 11# happyReduction_45-happyReduction_45 happy_x_1- = case happyOut19 happy_x_1 of { happy_var_1 -> - happyIn18- (happy_var_1- )}--happyReduce_46 = happySpecReduce_1 12# happyReduction_46-happyReduction_46 happy_x_1- = case happyOut32 happy_x_1 of { happy_var_1 -> - happyIn19- (CBlockDecl happy_var_1- )}--happyReduce_47 = happySpecReduce_1 12# happyReduction_47-happyReduction_47 happy_x_1- = case happyOut20 happy_x_1 of { happy_var_1 -> - happyIn19- (CNestedFunDef happy_var_1- )}--happyReduce_48 = happySpecReduce_2 12# happyReduction_48-happyReduction_48 happy_x_2- happy_x_1- = case happyOut19 happy_x_2 of { happy_var_2 -> - happyIn19- (happy_var_2- )}--happyReduce_49 = happyMonadReduce 3# 13# happyReduction_49-happyReduction_49 (happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut37 happy_x_1 of { happy_var_1 -> - case happyOut11 happy_x_2 of { happy_var_2 -> - case happyOut14 happy_x_3 of { happy_var_3 -> - ( leaveScope >> (withNodeInfo happy_var_1 $ CFunDef happy_var_1 happy_var_2 [] happy_var_3))}}}- ) (\r -> happyReturn (happyIn20 r))--happyReduce_50 = happyMonadReduce 3# 13# happyReduction_50-happyReduction_50 (happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut41 happy_x_1 of { happy_var_1 -> - case happyOut11 happy_x_2 of { happy_var_2 -> - case happyOut14 happy_x_3 of { happy_var_3 -> - ( leaveScope >> (withNodeInfo happy_var_1 $ CFunDef happy_var_1 happy_var_2 [] happy_var_3))}}}- ) (\r -> happyReturn (happyIn20 r))--happyReduce_51 = happyMonadReduce 3# 13# happyReduction_51-happyReduction_51 (happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut38 happy_x_1 of { happy_var_1 -> - case happyOut11 happy_x_2 of { happy_var_2 -> - case happyOut14 happy_x_3 of { happy_var_3 -> - ( leaveScope >> (withNodeInfo happy_var_1 $ CFunDef (reverse happy_var_1) happy_var_2 [] happy_var_3))}}}- ) (\r -> happyReturn (happyIn20 r))--happyReduce_52 = happyMonadReduce 3# 13# happyReduction_52-happyReduction_52 (happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut62 happy_x_1 of { happy_var_1 -> - case happyOut11 happy_x_2 of { happy_var_2 -> - case happyOut14 happy_x_3 of { happy_var_3 -> - ( leaveScope >> (withNodeInfo happy_var_1 $ CFunDef (liftTypeQuals happy_var_1) happy_var_2 [] happy_var_3))}}}- ) (\r -> happyReturn (happyIn20 r))--happyReduce_53 = happyMonadReduce 4# 13# happyReduction_53-happyReduction_53 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut62 happy_x_1 of { happy_var_1 -> - case happyOut127 happy_x_2 of { happy_var_2 -> - case happyOut11 happy_x_3 of { happy_var_3 -> - case happyOut14 happy_x_4 of { happy_var_4 -> - ( leaveScope >> (withNodeInfo happy_var_1 $ CFunDef (liftTypeQuals happy_var_1 ++ liftCAttrs happy_var_2) happy_var_3 [] happy_var_4))}}}}- ) (\r -> happyReturn (happyIn20 r))--happyReduce_54 = happySpecReduce_3 14# happyReduction_54-happyReduction_54 happy_x_3- happy_x_2- happy_x_1- = case happyOut82 happy_x_2 of { happy_var_2 -> - happyIn21- (happy_var_2- )}--happyReduce_55 = happyReduce 4# 14# happyReduction_55-happyReduction_55 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOut21 happy_x_1 of { happy_var_1 -> - case happyOut82 happy_x_3 of { happy_var_3 -> - happyIn21- (happy_var_1 `rappendr` happy_var_3- ) `HappyStk` happyRest}}--happyReduce_56 = happyMonadReduce 1# 15# happyReduction_56-happyReduction_56 (happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - ( withNodeInfo happy_var_1 $ CExpr Nothing)}- ) (\r -> happyReturn (happyIn22 r))--happyReduce_57 = happyMonadReduce 2# 15# happyReduction_57-happyReduction_57 (happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut117 happy_x_1 of { happy_var_1 -> - ( withNodeInfo happy_var_1 $ CExpr (Just happy_var_1))}- ) (\r -> happyReturn (happyIn22 r))--happyReduce_58 = happyMonadReduce 5# 16# happyReduction_58-happyReduction_58 (happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut117 happy_x_3 of { happy_var_3 -> - case happyOut12 happy_x_5 of { happy_var_5 -> - ( withNodeInfo happy_var_1 $ CIf happy_var_3 happy_var_5 Nothing)}}}- ) (\r -> happyReturn (happyIn23 r))--happyReduce_59 = happyMonadReduce 7# 16# happyReduction_59-happyReduction_59 (happy_x_7 `HappyStk`- happy_x_6 `HappyStk`- happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut117 happy_x_3 of { happy_var_3 -> - case happyOut12 happy_x_5 of { happy_var_5 -> - case happyOut12 happy_x_7 of { happy_var_7 -> - ( withNodeInfo happy_var_1 $ CIf happy_var_3 happy_var_5 (Just happy_var_7))}}}}- ) (\r -> happyReturn (happyIn23 r))--happyReduce_60 = happyMonadReduce 5# 16# happyReduction_60-happyReduction_60 (happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut117 happy_x_3 of { happy_var_3 -> - case happyOut12 happy_x_5 of { happy_var_5 -> - ( withNodeInfo happy_var_1 $ CSwitch happy_var_3 happy_var_5)}}}- ) (\r -> happyReturn (happyIn23 r))--happyReduce_61 = happyMonadReduce 5# 17# happyReduction_61-happyReduction_61 (happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut117 happy_x_3 of { happy_var_3 -> - case happyOut12 happy_x_5 of { happy_var_5 -> - ( withNodeInfo happy_var_1 $ CWhile happy_var_3 happy_var_5 False)}}}- ) (\r -> happyReturn (happyIn24 r))--happyReduce_62 = happyMonadReduce 7# 17# happyReduction_62-happyReduction_62 (happy_x_7 `HappyStk`- happy_x_6 `HappyStk`- happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut12 happy_x_2 of { happy_var_2 -> - case happyOut117 happy_x_5 of { happy_var_5 -> - ( withNodeInfo happy_var_1 $ CWhile happy_var_5 happy_var_2 True)}}}- ) (\r -> happyReturn (happyIn24 r))--happyReduce_63 = happyMonadReduce 9# 17# happyReduction_63-happyReduction_63 (happy_x_9 `HappyStk`- happy_x_8 `HappyStk`- happy_x_7 `HappyStk`- happy_x_6 `HappyStk`- happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut119 happy_x_3 of { happy_var_3 -> - case happyOut119 happy_x_5 of { happy_var_5 -> - case happyOut119 happy_x_7 of { happy_var_7 -> - case happyOut12 happy_x_9 of { happy_var_9 -> - ( withNodeInfo happy_var_1 $ CFor (Left happy_var_3) happy_var_5 happy_var_7 happy_var_9)}}}}}- ) (\r -> happyReturn (happyIn24 r))--happyReduce_64 = happyMonadReduce 10# 17# happyReduction_64-happyReduction_64 (happy_x_10 `HappyStk`- happy_x_9 `HappyStk`- happy_x_8 `HappyStk`- happy_x_7 `HappyStk`- happy_x_6 `HappyStk`- happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut32 happy_x_4 of { happy_var_4 -> - case happyOut119 happy_x_5 of { happy_var_5 -> - case happyOut119 happy_x_7 of { happy_var_7 -> - case happyOut12 happy_x_9 of { happy_var_9 -> - ( withNodeInfo happy_var_1 $ CFor (Right happy_var_4) happy_var_5 happy_var_7 happy_var_9)}}}}}- ) (\r -> happyReturn (happyIn24 r))--happyReduce_65 = happyMonadReduce 3# 18# happyReduction_65-happyReduction_65 (happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut125 happy_x_2 of { happy_var_2 -> - ( withNodeInfo happy_var_1 $ CGoto happy_var_2)}}- ) (\r -> happyReturn (happyIn25 r))--happyReduce_66 = happyMonadReduce 4# 18# happyReduction_66-happyReduction_66 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut117 happy_x_3 of { happy_var_3 -> - ( withNodeInfo happy_var_1 $ CGotoPtr happy_var_3)}}- ) (\r -> happyReturn (happyIn25 r))--happyReduce_67 = happyMonadReduce 2# 18# happyReduction_67-happyReduction_67 (happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - ( withNodeInfo happy_var_1 $ CCont)}- ) (\r -> happyReturn (happyIn25 r))--happyReduce_68 = happyMonadReduce 2# 18# happyReduction_68-happyReduction_68 (happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - ( withNodeInfo happy_var_1 $ CBreak)}- ) (\r -> happyReturn (happyIn25 r))--happyReduce_69 = happyMonadReduce 3# 18# happyReduction_69-happyReduction_69 (happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut119 happy_x_2 of { happy_var_2 -> - ( withNodeInfo happy_var_1 $ CReturn happy_var_2)}}- ) (\r -> happyReturn (happyIn25 r))--happyReduce_70 = happyMonadReduce 6# 19# happyReduction_70-happyReduction_70 (happy_x_6 `HappyStk`- happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut27 happy_x_2 of { happy_var_2 -> - case happyOut123 happy_x_4 of { happy_var_4 -> - ( withNodeInfo happy_var_1 $ CAsmStmt happy_var_2 happy_var_4 [] [] [])}}}- ) (\r -> happyReturn (happyIn26 r))--happyReduce_71 = happyMonadReduce 8# 19# happyReduction_71-happyReduction_71 (happy_x_8 `HappyStk`- happy_x_7 `HappyStk`- happy_x_6 `HappyStk`- happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut27 happy_x_2 of { happy_var_2 -> - case happyOut123 happy_x_4 of { happy_var_4 -> - case happyOut28 happy_x_6 of { happy_var_6 -> - ( withNodeInfo happy_var_1 $ CAsmStmt happy_var_2 happy_var_4 happy_var_6 [] [])}}}}- ) (\r -> happyReturn (happyIn26 r))--happyReduce_72 = happyMonadReduce 10# 19# happyReduction_72-happyReduction_72 (happy_x_10 `HappyStk`- happy_x_9 `HappyStk`- happy_x_8 `HappyStk`- happy_x_7 `HappyStk`- happy_x_6 `HappyStk`- happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut27 happy_x_2 of { happy_var_2 -> - case happyOut123 happy_x_4 of { happy_var_4 -> - case happyOut28 happy_x_6 of { happy_var_6 -> - case happyOut28 happy_x_8 of { happy_var_8 -> - ( withNodeInfo happy_var_1 $ CAsmStmt happy_var_2 happy_var_4 happy_var_6 happy_var_8 [])}}}}}- ) (\r -> happyReturn (happyIn26 r))--happyReduce_73 = happyMonadReduce 12# 19# happyReduction_73-happyReduction_73 (happy_x_12 `HappyStk`- happy_x_11 `HappyStk`- happy_x_10 `HappyStk`- happy_x_9 `HappyStk`- happy_x_8 `HappyStk`- happy_x_7 `HappyStk`- happy_x_6 `HappyStk`- happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut27 happy_x_2 of { happy_var_2 -> - case happyOut123 happy_x_4 of { happy_var_4 -> - case happyOut28 happy_x_6 of { happy_var_6 -> - case happyOut28 happy_x_8 of { happy_var_8 -> - case happyOut31 happy_x_10 of { happy_var_10 -> - ( withNodeInfo happy_var_1 $ CAsmStmt happy_var_2 happy_var_4 happy_var_6 happy_var_8 (reverse happy_var_10))}}}}}}- ) (\r -> happyReturn (happyIn26 r))--happyReduce_74 = happySpecReduce_0 20# happyReduction_74-happyReduction_74 = happyIn27- (Nothing- )--happyReduce_75 = happySpecReduce_1 20# happyReduction_75-happyReduction_75 happy_x_1- = case happyOut61 happy_x_1 of { happy_var_1 -> - happyIn27- (Just happy_var_1- )}--happyReduce_76 = happySpecReduce_0 21# happyReduction_76-happyReduction_76 = happyIn28- ([]- )--happyReduce_77 = happySpecReduce_1 21# happyReduction_77-happyReduction_77 happy_x_1- = case happyOut29 happy_x_1 of { happy_var_1 -> - happyIn28- (reverse happy_var_1- )}--happyReduce_78 = happySpecReduce_1 22# happyReduction_78-happyReduction_78 happy_x_1- = case happyOut30 happy_x_1 of { happy_var_1 -> - happyIn29- (singleton happy_var_1- )}--happyReduce_79 = happySpecReduce_3 22# happyReduction_79-happyReduction_79 happy_x_3- happy_x_2- happy_x_1- = case happyOut29 happy_x_1 of { happy_var_1 -> - case happyOut30 happy_x_3 of { happy_var_3 -> - happyIn29- (happy_var_1 `snoc` happy_var_3- )}}--happyReduce_80 = happyMonadReduce 4# 23# happyReduction_80-happyReduction_80 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut123 happy_x_1 of { happy_var_1 -> - case happyOut117 happy_x_3 of { happy_var_3 -> - ( withNodeInfo happy_var_1 $ CAsmOperand Nothing happy_var_1 happy_var_3)}}- ) (\r -> happyReturn (happyIn30 r))--happyReduce_81 = happyMonadReduce 7# 23# happyReduction_81-happyReduction_81 (happy_x_7 `HappyStk`- happy_x_6 `HappyStk`- happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_2 of { (CTokIdent _ happy_var_2) -> - case happyOut123 happy_x_4 of { happy_var_4 -> - case happyOut117 happy_x_6 of { happy_var_6 -> - ( withNodeInfo happy_var_4 $ CAsmOperand (Just happy_var_2) happy_var_4 happy_var_6)}}}- ) (\r -> happyReturn (happyIn30 r))--happyReduce_82 = happyMonadReduce 7# 23# happyReduction_82-happyReduction_82 (happy_x_7 `HappyStk`- happy_x_6 `HappyStk`- happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_2 of { (CTokTyIdent _ happy_var_2) -> - case happyOut123 happy_x_4 of { happy_var_4 -> - case happyOut117 happy_x_6 of { happy_var_6 -> - ( withNodeInfo happy_var_4 $ CAsmOperand (Just happy_var_2) happy_var_4 happy_var_6)}}}- ) (\r -> happyReturn (happyIn30 r))--happyReduce_83 = happySpecReduce_1 24# happyReduction_83-happyReduction_83 happy_x_1- = case happyOut123 happy_x_1 of { happy_var_1 -> - happyIn31- (singleton happy_var_1- )}--happyReduce_84 = happySpecReduce_3 24# happyReduction_84-happyReduction_84 happy_x_3- happy_x_2- happy_x_1- = case happyOut31 happy_x_1 of { happy_var_1 -> - case happyOut123 happy_x_3 of { happy_var_3 -> - happyIn31- (happy_var_1 `snoc` happy_var_3- )}}--happyReduce_85 = happyMonadReduce 2# 25# happyReduction_85-happyReduction_85 (happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut45 happy_x_1 of { happy_var_1 -> - ( withNodeInfo happy_var_1 $ CDecl (reverse happy_var_1) [])}- ) (\r -> happyReturn (happyIn32 r))--happyReduce_86 = happyMonadReduce 2# 25# happyReduction_86-happyReduction_86 (happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut46 happy_x_1 of { happy_var_1 -> - ( withNodeInfo happy_var_1 $ CDecl (reverse happy_var_1) [])}- ) (\r -> happyReturn (happyIn32 r))--happyReduce_87 = happySpecReduce_2 25# happyReduction_87-happyReduction_87 happy_x_2- happy_x_1- = case happyOut36 happy_x_1 of { happy_var_1 -> - happyIn32- (case happy_var_1 of- CDecl declspecs dies at ->- CDecl declspecs (List.reverse dies) at- )}--happyReduce_88 = happySpecReduce_2 25# happyReduction_88-happyReduction_88 happy_x_2- happy_x_1- = case happyOut34 happy_x_1 of { happy_var_1 -> - happyIn32- (case happy_var_1 of- CDecl declspecs dies at ->- CDecl declspecs (List.reverse dies) at- )}--happyReduce_89 = happySpecReduce_0 26# happyReduction_89-happyReduction_89 = happyIn33- (empty- )--happyReduce_90 = happySpecReduce_2 26# happyReduction_90-happyReduction_90 happy_x_2- happy_x_1- = case happyOut33 happy_x_1 of { happy_var_1 -> - case happyOut32 happy_x_2 of { happy_var_2 -> - happyIn33- (happy_var_1 `snoc` happy_var_2- )}}--happyReduce_91 = happyMonadReduce 4# 27# happyReduction_91-happyReduction_91 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut38 happy_x_1 of { happy_var_1 -> - case happyOut72 happy_x_2 of { happy_var_2 -> - case happyOut35 happy_x_3 of { happy_var_3 -> - case happyOut91 happy_x_4 of { happy_var_4 -> - ( let declspecs = reverse happy_var_1 in- do{ declr <- withAsmNameAttrs happy_var_3 happy_var_2- ; doDeclIdent declspecs declr- ; withNodeInfo happy_var_1 $ CDecl declspecs [(Just (reverseDeclr declr), happy_var_4, Nothing)] })}}}}- ) (\r -> happyReturn (happyIn34 r))--happyReduce_92 = happyMonadReduce 4# 27# happyReduction_92-happyReduction_92 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut62 happy_x_1 of { happy_var_1 -> - case happyOut72 happy_x_2 of { happy_var_2 -> - case happyOut35 happy_x_3 of { happy_var_3 -> - case happyOut91 happy_x_4 of { happy_var_4 -> - ( let declspecs = liftTypeQuals happy_var_1 in- do{ declr <- withAsmNameAttrs happy_var_3 happy_var_2- ; doDeclIdent declspecs declr- ; withNodeInfo happy_var_1 $ CDecl declspecs [(Just (reverseDeclr declr), happy_var_4, Nothing)] })}}}}- ) (\r -> happyReturn (happyIn34 r))--happyReduce_93 = happyMonadReduce 5# 27# happyReduction_93-happyReduction_93 (happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut62 happy_x_1 of { happy_var_1 -> - case happyOut127 happy_x_2 of { happy_var_2 -> - case happyOut72 happy_x_3 of { happy_var_3 -> - case happyOut35 happy_x_4 of { happy_var_4 -> - case happyOut91 happy_x_5 of { happy_var_5 -> - ( let declspecs = liftTypeQuals happy_var_1 in- do{ declr <- withAsmNameAttrs happy_var_4 happy_var_3- ; doDeclIdent declspecs declr- ; withNodeInfo happy_var_1 $ CDecl (declspecs ++ liftCAttrs happy_var_2) [(Just (reverseDeclr declr), happy_var_5, Nothing)] })}}}}}- ) (\r -> happyReturn (happyIn34 r))--happyReduce_94 = happyMonadReduce 4# 27# happyReduction_94-happyReduction_94 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut127 happy_x_1 of { happy_var_1 -> - case happyOut72 happy_x_2 of { happy_var_2 -> - case happyOut35 happy_x_3 of { happy_var_3 -> - case happyOut91 happy_x_4 of { happy_var_4 -> - ( let declspecs = liftCAttrs happy_var_1 in- do{ declr <- withAsmNameAttrs happy_var_3 happy_var_2- ; doDeclIdent declspecs declr- ; withNodeInfo happy_var_1 $ CDecl declspecs [(Just (reverseDeclr declr), happy_var_4, Nothing)] })}}}}- ) (\r -> happyReturn (happyIn34 r))--happyReduce_95 = happyMonadReduce 6# 27# happyReduction_95-happyReduction_95 (happy_x_6 `HappyStk`- happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut34 happy_x_1 of { happy_var_1 -> - case happyOut126 happy_x_3 of { happy_var_3 -> - case happyOut72 happy_x_4 of { happy_var_4 -> - case happyOut35 happy_x_5 of { happy_var_5 -> - case happyOut91 happy_x_6 of { happy_var_6 -> - ( case happy_var_1 of- CDecl declspecs dies at -> do- declr <- withAsmNameAttrs (fst happy_var_5, snd happy_var_5 ++ happy_var_3) happy_var_4- doDeclIdent declspecs declr- return (CDecl declspecs ((Just (reverseDeclr declr), happy_var_6, Nothing) : dies) at))}}}}}- ) (\r -> happyReturn (happyIn34 r))--happyReduce_96 = happySpecReduce_2 28# happyReduction_96-happyReduction_96 happy_x_2- happy_x_1- = case happyOut64 happy_x_1 of { happy_var_1 -> - case happyOut126 happy_x_2 of { happy_var_2 -> - happyIn35- ((happy_var_1,happy_var_2)- )}}--happyReduce_97 = happyMonadReduce 4# 29# happyReduction_97-happyReduction_97 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut37 happy_x_1 of { happy_var_1 -> - case happyOut63 happy_x_2 of { happy_var_2 -> - case happyOut35 happy_x_3 of { happy_var_3 -> - case happyOut91 happy_x_4 of { happy_var_4 -> - ( do{- declr <- withAsmNameAttrs happy_var_3 happy_var_2;- doDeclIdent happy_var_1 declr;- withNodeInfo happy_var_1 $ CDecl happy_var_1 [(Just (reverseDeclr declr), happy_var_4, Nothing)] })}}}}- ) (\r -> happyReturn (happyIn36 r))--happyReduce_98 = happyMonadReduce 4# 29# happyReduction_98-happyReduction_98 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut41 happy_x_1 of { happy_var_1 -> - case happyOut63 happy_x_2 of { happy_var_2 -> - case happyOut35 happy_x_3 of { happy_var_3 -> - case happyOut91 happy_x_4 of { happy_var_4 -> - ( do{- declr <- withAsmNameAttrs happy_var_3 happy_var_2;- doDeclIdent happy_var_1 declr;- withNodeInfo happy_var_1 $ CDecl happy_var_1 [(Just (reverseDeclr declr), happy_var_4, Nothing)] })}}}}- ) (\r -> happyReturn (happyIn36 r))--happyReduce_99 = happyMonadReduce 6# 29# happyReduction_99-happyReduction_99 (happy_x_6 `HappyStk`- happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut36 happy_x_1 of { happy_var_1 -> - case happyOut126 happy_x_3 of { happy_var_3 -> - case happyOut63 happy_x_4 of { happy_var_4 -> - case happyOut35 happy_x_5 of { happy_var_5 -> - case happyOut91 happy_x_6 of { happy_var_6 -> - ( case happy_var_1 of- CDecl declspecs dies at -> do- declr <- withAsmNameAttrs (fst happy_var_5, snd happy_var_5 ++ happy_var_3) happy_var_4- doDeclIdent declspecs declr- return (CDecl declspecs ((Just (reverseDeclr declr), happy_var_6, Nothing) : dies) at))}}}}}- ) (\r -> happyReturn (happyIn36 r))--happyReduce_100 = happySpecReduce_1 30# happyReduction_100-happyReduction_100 happy_x_1- = case happyOut43 happy_x_1 of { happy_var_1 -> - happyIn37- (reverse happy_var_1- )}--happyReduce_101 = happySpecReduce_1 30# happyReduction_101-happyReduction_101 happy_x_1- = case happyOut45 happy_x_1 of { happy_var_1 -> - happyIn37- (reverse happy_var_1- )}--happyReduce_102 = happySpecReduce_1 30# happyReduction_102-happyReduction_102 happy_x_1- = case happyOut47 happy_x_1 of { happy_var_1 -> - happyIn37- (reverse happy_var_1- )}--happyReduce_103 = happySpecReduce_1 31# happyReduction_103-happyReduction_103 happy_x_1- = case happyOut40 happy_x_1 of { happy_var_1 -> - happyIn38- (singleton (CStorageSpec happy_var_1)- )}--happyReduce_104 = happySpecReduce_2 31# happyReduction_104-happyReduction_104 happy_x_2- happy_x_1- = case happyOut127 happy_x_1 of { happy_var_1 -> - case happyOut40 happy_x_2 of { happy_var_2 -> - happyIn38- (reverseList (liftCAttrs happy_var_1) `snoc` (CStorageSpec happy_var_2)- )}}--happyReduce_105 = happySpecReduce_2 31# happyReduction_105-happyReduction_105 happy_x_2- happy_x_1- = case happyOut62 happy_x_1 of { happy_var_1 -> - case happyOut40 happy_x_2 of { happy_var_2 -> - happyIn38- (rmap CTypeQual happy_var_1 `snoc` CStorageSpec happy_var_2- )}}--happyReduce_106 = happySpecReduce_3 31# happyReduction_106-happyReduction_106 happy_x_3- happy_x_2- happy_x_1- = case happyOut62 happy_x_1 of { happy_var_1 -> - case happyOut127 happy_x_2 of { happy_var_2 -> - case happyOut40 happy_x_3 of { happy_var_3 -> - happyIn38- ((rmap CTypeQual happy_var_1 `rappend` liftCAttrs happy_var_2) `snoc` CStorageSpec happy_var_3- )}}}--happyReduce_107 = happySpecReduce_2 31# happyReduction_107-happyReduction_107 happy_x_2- happy_x_1- = case happyOut38 happy_x_1 of { happy_var_1 -> - case happyOut39 happy_x_2 of { happy_var_2 -> - happyIn38- (happy_var_1 `snoc` happy_var_2- )}}--happyReduce_108 = happySpecReduce_2 31# happyReduction_108-happyReduction_108 happy_x_2- happy_x_1- = case happyOut38 happy_x_1 of { happy_var_1 -> - case happyOut128 happy_x_2 of { happy_var_2 -> - happyIn38- (addTrailingAttrs happy_var_1 happy_var_2- )}}--happyReduce_109 = happySpecReduce_1 32# happyReduction_109-happyReduction_109 happy_x_1- = case happyOut40 happy_x_1 of { happy_var_1 -> - happyIn39- (CStorageSpec happy_var_1- )}--happyReduce_110 = happySpecReduce_1 32# happyReduction_110-happyReduction_110 happy_x_1- = case happyOut61 happy_x_1 of { happy_var_1 -> - happyIn39- (CTypeQual happy_var_1- )}--happyReduce_111 = happyMonadReduce 1# 33# happyReduction_111-happyReduction_111 (happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - ( withNodeInfo happy_var_1 $ CTypedef)}- ) (\r -> happyReturn (happyIn40 r))--happyReduce_112 = happyMonadReduce 1# 33# happyReduction_112-happyReduction_112 (happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - ( withNodeInfo happy_var_1 $ CExtern)}- ) (\r -> happyReturn (happyIn40 r))--happyReduce_113 = happyMonadReduce 1# 33# happyReduction_113-happyReduction_113 (happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - ( withNodeInfo happy_var_1 $ CStatic)}- ) (\r -> happyReturn (happyIn40 r))--happyReduce_114 = happyMonadReduce 1# 33# happyReduction_114-happyReduction_114 (happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - ( withNodeInfo happy_var_1 $ CAuto)}- ) (\r -> happyReturn (happyIn40 r))--happyReduce_115 = happyMonadReduce 1# 33# happyReduction_115-happyReduction_115 (happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - ( withNodeInfo happy_var_1 $ CRegister)}- ) (\r -> happyReturn (happyIn40 r))--happyReduce_116 = happyMonadReduce 1# 33# happyReduction_116-happyReduction_116 (happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - ( withNodeInfo happy_var_1 $ CThread)}- ) (\r -> happyReturn (happyIn40 r))--happyReduce_117 = happySpecReduce_1 34# happyReduction_117-happyReduction_117 happy_x_1- = case happyOut44 happy_x_1 of { happy_var_1 -> - happyIn41- (reverse happy_var_1- )}--happyReduce_118 = happySpecReduce_1 34# happyReduction_118-happyReduction_118 happy_x_1- = case happyOut46 happy_x_1 of { happy_var_1 -> - happyIn41- (reverse happy_var_1- )}--happyReduce_119 = happySpecReduce_1 34# happyReduction_119-happyReduction_119 happy_x_1- = case happyOut48 happy_x_1 of { happy_var_1 -> - happyIn41- (reverse happy_var_1- )}--happyReduce_120 = happyMonadReduce 1# 35# happyReduction_120-happyReduction_120 (happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - ( withNodeInfo happy_var_1 $ CVoidType)}- ) (\r -> happyReturn (happyIn42 r))--happyReduce_121 = happyMonadReduce 1# 35# happyReduction_121-happyReduction_121 (happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - ( withNodeInfo happy_var_1 $ CCharType)}- ) (\r -> happyReturn (happyIn42 r))--happyReduce_122 = happyMonadReduce 1# 35# happyReduction_122-happyReduction_122 (happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - ( withNodeInfo happy_var_1 $ CShortType)}- ) (\r -> happyReturn (happyIn42 r))--happyReduce_123 = happyMonadReduce 1# 35# happyReduction_123-happyReduction_123 (happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - ( withNodeInfo happy_var_1 $ CIntType)}- ) (\r -> happyReturn (happyIn42 r))--happyReduce_124 = happyMonadReduce 1# 35# happyReduction_124-happyReduction_124 (happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - ( withNodeInfo happy_var_1 $ CLongType)}- ) (\r -> happyReturn (happyIn42 r))--happyReduce_125 = happyMonadReduce 1# 35# happyReduction_125-happyReduction_125 (happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - ( withNodeInfo happy_var_1 $ CFloatType)}- ) (\r -> happyReturn (happyIn42 r))--happyReduce_126 = happyMonadReduce 1# 35# happyReduction_126-happyReduction_126 (happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - ( withNodeInfo happy_var_1 $ CDoubleType)}- ) (\r -> happyReturn (happyIn42 r))--happyReduce_127 = happyMonadReduce 1# 35# happyReduction_127-happyReduction_127 (happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - ( withNodeInfo happy_var_1 $ CSignedType)}- ) (\r -> happyReturn (happyIn42 r))--happyReduce_128 = happyMonadReduce 1# 35# happyReduction_128-happyReduction_128 (happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - ( withNodeInfo happy_var_1 $ CUnsigType)}- ) (\r -> happyReturn (happyIn42 r))--happyReduce_129 = happyMonadReduce 1# 35# happyReduction_129-happyReduction_129 (happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - ( withNodeInfo happy_var_1 $ CBoolType)}- ) (\r -> happyReturn (happyIn42 r))--happyReduce_130 = happyMonadReduce 1# 35# happyReduction_130-happyReduction_130 (happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - ( withNodeInfo happy_var_1 $ CComplexType)}- ) (\r -> happyReturn (happyIn42 r))--happyReduce_131 = happySpecReduce_2 36# happyReduction_131-happyReduction_131 happy_x_2- happy_x_1- = case happyOut38 happy_x_1 of { happy_var_1 -> - case happyOut42 happy_x_2 of { happy_var_2 -> - happyIn43- (happy_var_1 `snoc` CTypeSpec happy_var_2- )}}--happyReduce_132 = happySpecReduce_2 36# happyReduction_132-happyReduction_132 happy_x_2- happy_x_1- = case happyOut44 happy_x_1 of { happy_var_1 -> - case happyOut40 happy_x_2 of { happy_var_2 -> - happyIn43- (happy_var_1 `snoc` CStorageSpec happy_var_2- )}}--happyReduce_133 = happySpecReduce_2 36# happyReduction_133-happyReduction_133 happy_x_2- happy_x_1- = case happyOut43 happy_x_1 of { happy_var_1 -> - case happyOut39 happy_x_2 of { happy_var_2 -> - happyIn43- (happy_var_1 `snoc` happy_var_2- )}}--happyReduce_134 = happySpecReduce_2 36# happyReduction_134-happyReduction_134 happy_x_2- happy_x_1- = case happyOut43 happy_x_1 of { happy_var_1 -> - case happyOut42 happy_x_2 of { happy_var_2 -> - happyIn43- (happy_var_1 `snoc` CTypeSpec happy_var_2- )}}--happyReduce_135 = happySpecReduce_2 36# happyReduction_135-happyReduction_135 happy_x_2- happy_x_1- = case happyOut43 happy_x_1 of { happy_var_1 -> - case happyOut128 happy_x_2 of { happy_var_2 -> - happyIn43- (addTrailingAttrs happy_var_1 happy_var_2- )}}--happyReduce_136 = happySpecReduce_1 37# happyReduction_136-happyReduction_136 happy_x_1- = case happyOut42 happy_x_1 of { happy_var_1 -> - happyIn44- (singleton (CTypeSpec happy_var_1)- )}--happyReduce_137 = happySpecReduce_2 37# happyReduction_137-happyReduction_137 happy_x_2- happy_x_1- = case happyOut127 happy_x_1 of { happy_var_1 -> - case happyOut42 happy_x_2 of { happy_var_2 -> - happyIn44- ((reverseList $ liftCAttrs happy_var_1) `snoc` (CTypeSpec happy_var_2)- )}}--happyReduce_138 = happySpecReduce_2 37# happyReduction_138-happyReduction_138 happy_x_2- happy_x_1- = case happyOut62 happy_x_1 of { happy_var_1 -> - case happyOut42 happy_x_2 of { happy_var_2 -> - happyIn44- (rmap CTypeQual happy_var_1 `snoc` CTypeSpec happy_var_2- )}}--happyReduce_139 = happySpecReduce_3 37# happyReduction_139-happyReduction_139 happy_x_3- happy_x_2- happy_x_1- = case happyOut62 happy_x_1 of { happy_var_1 -> - case happyOut127 happy_x_2 of { happy_var_2 -> - case happyOut42 happy_x_3 of { happy_var_3 -> - happyIn44- (rmap CTypeQual happy_var_1 `rappend` (liftCAttrs happy_var_2) `snoc` CTypeSpec happy_var_3- )}}}--happyReduce_140 = happySpecReduce_2 37# happyReduction_140-happyReduction_140 happy_x_2- happy_x_1- = case happyOut44 happy_x_1 of { happy_var_1 -> - case happyOut61 happy_x_2 of { happy_var_2 -> - happyIn44- (happy_var_1 `snoc` CTypeQual happy_var_2- )}}--happyReduce_141 = happySpecReduce_2 37# happyReduction_141-happyReduction_141 happy_x_2- happy_x_1- = case happyOut44 happy_x_1 of { happy_var_1 -> - case happyOut42 happy_x_2 of { happy_var_2 -> - happyIn44- (happy_var_1 `snoc` CTypeSpec happy_var_2- )}}--happyReduce_142 = happySpecReduce_2 37# happyReduction_142-happyReduction_142 happy_x_2- happy_x_1- = case happyOut44 happy_x_1 of { happy_var_1 -> - case happyOut128 happy_x_2 of { happy_var_2 -> - happyIn44- (addTrailingAttrs happy_var_1 happy_var_2- )}}--happyReduce_143 = happySpecReduce_2 38# happyReduction_143-happyReduction_143 happy_x_2- happy_x_1- = case happyOut38 happy_x_1 of { happy_var_1 -> - case happyOut49 happy_x_2 of { happy_var_2 -> - happyIn45- (happy_var_1 `snoc` CTypeSpec happy_var_2- )}}--happyReduce_144 = happySpecReduce_2 38# happyReduction_144-happyReduction_144 happy_x_2- happy_x_1- = case happyOut46 happy_x_1 of { happy_var_1 -> - case happyOut40 happy_x_2 of { happy_var_2 -> - happyIn45- (happy_var_1 `snoc` CStorageSpec happy_var_2- )}}--happyReduce_145 = happySpecReduce_2 38# happyReduction_145-happyReduction_145 happy_x_2- happy_x_1- = case happyOut45 happy_x_1 of { happy_var_1 -> - case happyOut39 happy_x_2 of { happy_var_2 -> - happyIn45- (happy_var_1 `snoc` happy_var_2- )}}--happyReduce_146 = happySpecReduce_2 38# happyReduction_146-happyReduction_146 happy_x_2- happy_x_1- = case happyOut45 happy_x_1 of { happy_var_1 -> - case happyOut128 happy_x_2 of { happy_var_2 -> - happyIn45- (addTrailingAttrs happy_var_1 happy_var_2- )}}--happyReduce_147 = happySpecReduce_1 39# happyReduction_147-happyReduction_147 happy_x_1- = case happyOut49 happy_x_1 of { happy_var_1 -> - happyIn46- (singleton (CTypeSpec happy_var_1)- )}--happyReduce_148 = happySpecReduce_2 39# happyReduction_148-happyReduction_148 happy_x_2- happy_x_1- = case happyOut127 happy_x_1 of { happy_var_1 -> - case happyOut49 happy_x_2 of { happy_var_2 -> - happyIn46- ((reverseList $ liftCAttrs happy_var_1) `snoc` (CTypeSpec happy_var_2)- )}}--happyReduce_149 = happySpecReduce_2 39# happyReduction_149-happyReduction_149 happy_x_2- happy_x_1- = case happyOut62 happy_x_1 of { happy_var_1 -> - case happyOut49 happy_x_2 of { happy_var_2 -> - happyIn46- (rmap CTypeQual happy_var_1 `snoc` CTypeSpec happy_var_2- )}}--happyReduce_150 = happySpecReduce_3 39# happyReduction_150-happyReduction_150 happy_x_3- happy_x_2- happy_x_1- = case happyOut62 happy_x_1 of { happy_var_1 -> - case happyOut127 happy_x_2 of { happy_var_2 -> - case happyOut49 happy_x_3 of { happy_var_3 -> - happyIn46- (rmap CTypeQual happy_var_1 `rappend` (liftCAttrs happy_var_2) `snoc` CTypeSpec happy_var_3- )}}}--happyReduce_151 = happySpecReduce_2 39# happyReduction_151-happyReduction_151 happy_x_2- happy_x_1- = case happyOut46 happy_x_1 of { happy_var_1 -> - case happyOut61 happy_x_2 of { happy_var_2 -> - happyIn46- (happy_var_1 `snoc` CTypeQual happy_var_2- )}}--happyReduce_152 = happySpecReduce_2 39# happyReduction_152-happyReduction_152 happy_x_2- happy_x_1- = case happyOut46 happy_x_1 of { happy_var_1 -> - case happyOut128 happy_x_2 of { happy_var_2 -> - happyIn46- (addTrailingAttrs happy_var_1 happy_var_2- )}}--happyReduce_153 = happySpecReduce_2 40# happyReduction_153-happyReduction_153 happy_x_2- happy_x_1- = case happyOut48 happy_x_1 of { happy_var_1 -> - case happyOut40 happy_x_2 of { happy_var_2 -> - happyIn47- (happy_var_1 `snoc` CStorageSpec happy_var_2- )}}--happyReduce_154 = happyMonadReduce 2# 40# happyReduction_154-happyReduction_154 (happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut38 happy_x_1 of { happy_var_1 -> - case happyOutTok happy_x_2 of { (CTokTyIdent _ happy_var_2) -> - ( withNodeInfo happy_var_1 $ \at -> happy_var_1 `snoc` CTypeSpec (CTypeDef happy_var_2 at))}}- ) (\r -> happyReturn (happyIn47 r))--happyReduce_155 = happyMonadReduce 5# 40# happyReduction_155-happyReduction_155 (happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut38 happy_x_1 of { happy_var_1 -> - case happyOut117 happy_x_4 of { happy_var_4 -> - ( withNodeInfo happy_var_1 $ \at -> happy_var_1 `snoc` CTypeSpec (CTypeOfExpr happy_var_4 at))}}- ) (\r -> happyReturn (happyIn47 r))--happyReduce_156 = happyMonadReduce 5# 40# happyReduction_156-happyReduction_156 (happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut38 happy_x_1 of { happy_var_1 -> - case happyOut83 happy_x_4 of { happy_var_4 -> - ( withNodeInfo happy_var_1 $ \at -> happy_var_1 `snoc` CTypeSpec (CTypeOfType happy_var_4 at))}}- ) (\r -> happyReturn (happyIn47 r))--happyReduce_157 = happySpecReduce_2 40# happyReduction_157-happyReduction_157 happy_x_2- happy_x_1- = case happyOut47 happy_x_1 of { happy_var_1 -> - case happyOut39 happy_x_2 of { happy_var_2 -> - happyIn47- (happy_var_1 `snoc` happy_var_2- )}}--happyReduce_158 = happySpecReduce_2 40# happyReduction_158-happyReduction_158 happy_x_2- happy_x_1- = case happyOut47 happy_x_1 of { happy_var_1 -> - case happyOut128 happy_x_2 of { happy_var_2 -> - happyIn47- (addTrailingAttrs happy_var_1 happy_var_2- )}}--happyReduce_159 = happyMonadReduce 1# 41# happyReduction_159-happyReduction_159 (happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { (CTokTyIdent _ happy_var_1) -> - ( withNodeInfo happy_var_1 $ \at -> singleton (CTypeSpec (CTypeDef happy_var_1 at)))}- ) (\r -> happyReturn (happyIn48 r))--happyReduce_160 = happyMonadReduce 4# 41# happyReduction_160-happyReduction_160 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut117 happy_x_3 of { happy_var_3 -> - ( withNodeInfo happy_var_1 $ \at -> singleton (CTypeSpec (CTypeOfExpr happy_var_3 at)))}}- ) (\r -> happyReturn (happyIn48 r))--happyReduce_161 = happyMonadReduce 4# 41# happyReduction_161-happyReduction_161 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut83 happy_x_3 of { happy_var_3 -> - ( withNodeInfo happy_var_1 $ \at -> singleton (CTypeSpec (CTypeOfType happy_var_3 at)))}}- ) (\r -> happyReturn (happyIn48 r))--happyReduce_162 = happyMonadReduce 2# 41# happyReduction_162-happyReduction_162 (happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut62 happy_x_1 of { happy_var_1 -> - case happyOutTok happy_x_2 of { (CTokTyIdent _ happy_var_2) -> - ( withNodeInfo happy_var_2 $ \at -> rmap CTypeQual happy_var_1 `snoc` CTypeSpec (CTypeDef happy_var_2 at))}}- ) (\r -> happyReturn (happyIn48 r))--happyReduce_163 = happyMonadReduce 5# 41# happyReduction_163-happyReduction_163 (happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut62 happy_x_1 of { happy_var_1 -> - case happyOutTok happy_x_2 of { happy_var_2 -> - case happyOut117 happy_x_4 of { happy_var_4 -> - ( withNodeInfo happy_var_2 $ \at -> rmap CTypeQual happy_var_1 `snoc` CTypeSpec (CTypeOfExpr happy_var_4 at))}}}- ) (\r -> happyReturn (happyIn48 r))--happyReduce_164 = happyMonadReduce 5# 41# happyReduction_164-happyReduction_164 (happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut62 happy_x_1 of { happy_var_1 -> - case happyOutTok happy_x_2 of { happy_var_2 -> - case happyOut83 happy_x_4 of { happy_var_4 -> - ( withNodeInfo happy_var_2 $ \at -> rmap CTypeQual happy_var_1 `snoc` CTypeSpec (CTypeOfType happy_var_4 at))}}}- ) (\r -> happyReturn (happyIn48 r))--happyReduce_165 = happyMonadReduce 2# 41# happyReduction_165-happyReduction_165 (happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut127 happy_x_1 of { happy_var_1 -> - case happyOutTok happy_x_2 of { (CTokTyIdent _ happy_var_2) -> - ( withNodeInfo happy_var_2 $ \at -> reverseList (liftCAttrs happy_var_1) `snoc` (CTypeSpec (CTypeDef happy_var_2 at)))}}- ) (\r -> happyReturn (happyIn48 r))--happyReduce_166 = happyMonadReduce 5# 41# happyReduction_166-happyReduction_166 (happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut127 happy_x_1 of { happy_var_1 -> - case happyOutTok happy_x_2 of { happy_var_2 -> - case happyOut117 happy_x_4 of { happy_var_4 -> - ( withNodeInfo happy_var_2 $ \at -> reverseList (liftCAttrs happy_var_1) `snoc` (CTypeSpec (CTypeOfExpr happy_var_4 at)))}}}- ) (\r -> happyReturn (happyIn48 r))--happyReduce_167 = happyMonadReduce 5# 41# happyReduction_167-happyReduction_167 (happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut127 happy_x_1 of { happy_var_1 -> - case happyOutTok happy_x_2 of { happy_var_2 -> - case happyOut83 happy_x_4 of { happy_var_4 -> - ( withNodeInfo happy_var_2 $ \at -> reverseList (liftCAttrs happy_var_1) `snoc` (CTypeSpec (CTypeOfType happy_var_4 at)))}}}- ) (\r -> happyReturn (happyIn48 r))--happyReduce_168 = happyMonadReduce 3# 41# happyReduction_168-happyReduction_168 (happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut62 happy_x_1 of { happy_var_1 -> - case happyOut127 happy_x_2 of { happy_var_2 -> - case happyOutTok happy_x_3 of { (CTokTyIdent _ happy_var_3) -> - ( withNodeInfo happy_var_2 $ \at -> rmap CTypeQual happy_var_1 `rappend` (liftCAttrs happy_var_2) `snoc` CTypeSpec (CTypeDef happy_var_3 at))}}}- ) (\r -> happyReturn (happyIn48 r))--happyReduce_169 = happyMonadReduce 6# 41# happyReduction_169-happyReduction_169 (happy_x_6 `HappyStk`- happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut62 happy_x_1 of { happy_var_1 -> - case happyOut127 happy_x_2 of { happy_var_2 -> - case happyOut117 happy_x_5 of { happy_var_5 -> - ( withNodeInfo happy_var_2 $ \at -> rmap CTypeQual happy_var_1 `rappend` (liftCAttrs happy_var_2) `snoc` CTypeSpec (CTypeOfExpr happy_var_5 at))}}}- ) (\r -> happyReturn (happyIn48 r))--happyReduce_170 = happyMonadReduce 6# 41# happyReduction_170-happyReduction_170 (happy_x_6 `HappyStk`- happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut62 happy_x_1 of { happy_var_1 -> - case happyOut127 happy_x_2 of { happy_var_2 -> - case happyOut83 happy_x_5 of { happy_var_5 -> - ( withNodeInfo happy_var_2 $ \at -> rmap CTypeQual happy_var_1 `rappend` (liftCAttrs happy_var_2) `snoc` CTypeSpec (CTypeOfType happy_var_5 at))}}}- ) (\r -> happyReturn (happyIn48 r))--happyReduce_171 = happySpecReduce_2 41# happyReduction_171-happyReduction_171 happy_x_2- happy_x_1- = case happyOut48 happy_x_1 of { happy_var_1 -> - case happyOut61 happy_x_2 of { happy_var_2 -> - happyIn48- (happy_var_1 `snoc` CTypeQual happy_var_2- )}}--happyReduce_172 = happySpecReduce_2 41# happyReduction_172-happyReduction_172 happy_x_2- happy_x_1- = case happyOut48 happy_x_1 of { happy_var_1 -> - case happyOut128 happy_x_2 of { happy_var_2 -> - happyIn48- (addTrailingAttrs happy_var_1 happy_var_2- )}}--happyReduce_173 = happyMonadReduce 1# 42# happyReduction_173-happyReduction_173 (happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut50 happy_x_1 of { happy_var_1 -> - ( withNodeInfo happy_var_1 $ CSUType happy_var_1)}- ) (\r -> happyReturn (happyIn49 r))--happyReduce_174 = happyMonadReduce 1# 42# happyReduction_174-happyReduction_174 (happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut58 happy_x_1 of { happy_var_1 -> - ( withNodeInfo happy_var_1 $ CEnumType happy_var_1)}- ) (\r -> happyReturn (happyIn49 r))--happyReduce_175 = happyMonadReduce 6# 43# happyReduction_175-happyReduction_175 (happy_x_6 `HappyStk`- happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut51 happy_x_1 of { happy_var_1 -> - case happyOut126 happy_x_2 of { happy_var_2 -> - case happyOut125 happy_x_3 of { happy_var_3 -> - case happyOut52 happy_x_5 of { happy_var_5 -> - ( withNodeInfo happy_var_1 $ CStruct (unL happy_var_1) (Just happy_var_3) (Just$ reverse happy_var_5) happy_var_2)}}}}- ) (\r -> happyReturn (happyIn50 r))--happyReduce_176 = happyMonadReduce 5# 43# happyReduction_176-happyReduction_176 (happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut51 happy_x_1 of { happy_var_1 -> - case happyOut126 happy_x_2 of { happy_var_2 -> - case happyOut52 happy_x_4 of { happy_var_4 -> - ( withNodeInfo happy_var_1 $ CStruct (unL happy_var_1) Nothing (Just$ reverse happy_var_4) happy_var_2)}}}- ) (\r -> happyReturn (happyIn50 r))--happyReduce_177 = happyMonadReduce 3# 43# happyReduction_177-happyReduction_177 (happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut51 happy_x_1 of { happy_var_1 -> - case happyOut126 happy_x_2 of { happy_var_2 -> - case happyOut125 happy_x_3 of { happy_var_3 -> - ( withNodeInfo happy_var_1 $ CStruct (unL happy_var_1) (Just happy_var_3) Nothing happy_var_2)}}}- ) (\r -> happyReturn (happyIn50 r))--happyReduce_178 = happySpecReduce_1 44# happyReduction_178-happyReduction_178 happy_x_1- = case happyOutTok happy_x_1 of { happy_var_1 -> - happyIn51- (L CStructTag (posOf happy_var_1)- )}--happyReduce_179 = happySpecReduce_1 44# happyReduction_179-happyReduction_179 happy_x_1- = case happyOutTok happy_x_1 of { happy_var_1 -> - happyIn51- (L CUnionTag (posOf happy_var_1)- )}--happyReduce_180 = happySpecReduce_0 45# happyReduction_180-happyReduction_180 = happyIn52- (empty- )--happyReduce_181 = happySpecReduce_2 45# happyReduction_181-happyReduction_181 happy_x_2- happy_x_1- = case happyOut52 happy_x_1 of { happy_var_1 -> - happyIn52- (happy_var_1- )}--happyReduce_182 = happySpecReduce_2 45# happyReduction_182-happyReduction_182 happy_x_2- happy_x_1- = case happyOut52 happy_x_1 of { happy_var_1 -> - case happyOut53 happy_x_2 of { happy_var_2 -> - happyIn52- (happy_var_1 `snoc` happy_var_2- )}}--happyReduce_183 = happySpecReduce_2 46# happyReduction_183-happyReduction_183 happy_x_2- happy_x_1- = case happyOut55 happy_x_1 of { happy_var_1 -> - happyIn53- (case happy_var_1 of CDecl declspecs dies at -> CDecl declspecs (List.reverse dies) at- )}--happyReduce_184 = happySpecReduce_2 46# happyReduction_184-happyReduction_184 happy_x_2- happy_x_1- = case happyOut54 happy_x_1 of { happy_var_1 -> - happyIn53- (case happy_var_1 of CDecl declspecs dies at -> CDecl declspecs (List.reverse dies) at- )}--happyReduce_185 = happySpecReduce_2 46# happyReduction_185-happyReduction_185 happy_x_2- happy_x_1- = case happyOut53 happy_x_2 of { happy_var_2 -> - happyIn53- (happy_var_2- )}--happyReduce_186 = happyMonadReduce 3# 47# happyReduction_186-happyReduction_186 (happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut62 happy_x_1 of { happy_var_1 -> - case happyOut126 happy_x_2 of { happy_var_2 -> - case happyOut57 happy_x_3 of { happy_var_3 -> - ( withNodeInfo happy_var_1 $ case happy_var_3 of (d,s) -> CDecl (liftTypeQuals happy_var_1 ++ liftCAttrs happy_var_2) [(d,Nothing,s)])}}}- ) (\r -> happyReturn (happyIn54 r))--happyReduce_187 = happyMonadReduce 2# 47# happyReduction_187-happyReduction_187 (happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut127 happy_x_1 of { happy_var_1 -> - case happyOut57 happy_x_2 of { happy_var_2 -> - ( withNodeInfo happy_var_1 $ case happy_var_2 of (d,s) -> CDecl (liftCAttrs happy_var_1) [(d,Nothing,s)])}}- ) (\r -> happyReturn (happyIn54 r))--happyReduce_188 = happyReduce 4# 47# happyReduction_188-happyReduction_188 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOut54 happy_x_1 of { happy_var_1 -> - case happyOut126 happy_x_3 of { happy_var_3 -> - case happyOut57 happy_x_4 of { happy_var_4 -> - happyIn54- (case happy_var_1 of- CDecl declspecs dies at ->- case happy_var_4 of- (Just d,s) -> CDecl declspecs ((Just $ appendObjAttrs happy_var_3 d,Nothing,s) : dies) at- (Nothing,s) -> CDecl declspecs ((Nothing,Nothing,s) : dies) at- ) `HappyStk` happyRest}}}--happyReduce_189 = happyMonadReduce 3# 48# happyReduction_189-happyReduction_189 (happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut41 happy_x_1 of { happy_var_1 -> - case happyOut56 happy_x_2 of { happy_var_2 -> - case happyOut126 happy_x_3 of { happy_var_3 -> - ( withNodeInfo happy_var_1 $ case happy_var_2 of { (Just d,s) -> CDecl happy_var_1 [(Just $! appendObjAttrs happy_var_3 d,Nothing,s)]- ; (Nothing,s) -> CDecl happy_var_1 [(Nothing,Nothing,s)] })}}}- ) (\r -> happyReturn (happyIn55 r))--happyReduce_190 = happyReduce 5# 48# happyReduction_190-happyReduction_190 (happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOut55 happy_x_1 of { happy_var_1 -> - case happyOut126 happy_x_3 of { happy_var_3 -> - case happyOut56 happy_x_4 of { happy_var_4 -> - case happyOut126 happy_x_5 of { happy_var_5 -> - happyIn55- (case happy_var_1 of- CDecl declspecs dies attr ->- case happy_var_4 of- (Just d,s) -> CDecl declspecs ((Just$ appendObjAttrs (happy_var_3++happy_var_5) d,Nothing,s) : dies) attr- (Nothing,s) -> CDecl declspecs ((Nothing,Nothing,s) : dies) attr- ) `HappyStk` happyRest}}}}--happyReduce_191 = happyMonadReduce 1# 48# happyReduction_191-happyReduction_191 (happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut41 happy_x_1 of { happy_var_1 -> - ( withNodeInfo happy_var_1 $ CDecl happy_var_1 [])}- ) (\r -> happyReturn (happyIn55 r))--happyReduce_192 = happySpecReduce_1 49# happyReduction_192-happyReduction_192 happy_x_1- = case happyOut63 happy_x_1 of { happy_var_1 -> - happyIn56- ((Just (reverseDeclr happy_var_1), Nothing)- )}--happyReduce_193 = happySpecReduce_2 49# happyReduction_193-happyReduction_193 happy_x_2- happy_x_1- = case happyOut121 happy_x_2 of { happy_var_2 -> - happyIn56- ((Nothing, Just happy_var_2)- )}--happyReduce_194 = happySpecReduce_3 49# happyReduction_194-happyReduction_194 happy_x_3- happy_x_2- happy_x_1- = case happyOut63 happy_x_1 of { happy_var_1 -> - case happyOut121 happy_x_3 of { happy_var_3 -> - happyIn56- ((Just (reverseDeclr happy_var_1), Just happy_var_3)- )}}--happyReduce_195 = happySpecReduce_1 50# happyReduction_195-happyReduction_195 happy_x_1- = case happyOut72 happy_x_1 of { happy_var_1 -> - happyIn57- ((Just (reverseDeclr happy_var_1), Nothing)- )}--happyReduce_196 = happySpecReduce_2 50# happyReduction_196-happyReduction_196 happy_x_2- happy_x_1- = case happyOut121 happy_x_2 of { happy_var_2 -> - happyIn57- ((Nothing, Just happy_var_2)- )}--happyReduce_197 = happySpecReduce_3 50# happyReduction_197-happyReduction_197 happy_x_3- happy_x_2- happy_x_1- = case happyOut72 happy_x_1 of { happy_var_1 -> - case happyOut121 happy_x_3 of { happy_var_3 -> - happyIn57- ((Just (reverseDeclr happy_var_1), Just happy_var_3)- )}}--happyReduce_198 = happySpecReduce_2 50# happyReduction_198-happyReduction_198 happy_x_2- happy_x_1- = case happyOut57 happy_x_1 of { happy_var_1 -> - case happyOut128 happy_x_2 of { happy_var_2 -> - happyIn57- (case happy_var_1 of { (Nothing,expr) -> (Nothing,expr) {- FIXME -}- ; (Just (CDeclr name derived asmname attrs node), bsz) ->- (Just (CDeclr name derived asmname (attrs++happy_var_2) node),bsz)- }- )}}--happyReduce_199 = happyMonadReduce 5# 51# happyReduction_199-happyReduction_199 (happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut126 happy_x_2 of { happy_var_2 -> - case happyOut59 happy_x_4 of { happy_var_4 -> - ( withNodeInfo happy_var_1 $ CEnum Nothing (Just$ reverse happy_var_4) happy_var_2)}}}- ) (\r -> happyReturn (happyIn58 r))--happyReduce_200 = happyMonadReduce 6# 51# happyReduction_200-happyReduction_200 (happy_x_6 `HappyStk`- happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut126 happy_x_2 of { happy_var_2 -> - case happyOut59 happy_x_4 of { happy_var_4 -> - ( withNodeInfo happy_var_1 $ CEnum Nothing (Just$ reverse happy_var_4) happy_var_2)}}}- ) (\r -> happyReturn (happyIn58 r))--happyReduce_201 = happyMonadReduce 6# 51# happyReduction_201-happyReduction_201 (happy_x_6 `HappyStk`- happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut126 happy_x_2 of { happy_var_2 -> - case happyOut125 happy_x_3 of { happy_var_3 -> - case happyOut59 happy_x_5 of { happy_var_5 -> - ( withNodeInfo happy_var_1 $ CEnum (Just happy_var_3) (Just$ reverse happy_var_5) happy_var_2)}}}}- ) (\r -> happyReturn (happyIn58 r))--happyReduce_202 = happyMonadReduce 7# 51# happyReduction_202-happyReduction_202 (happy_x_7 `HappyStk`- happy_x_6 `HappyStk`- happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut126 happy_x_2 of { happy_var_2 -> - case happyOut125 happy_x_3 of { happy_var_3 -> - case happyOut59 happy_x_5 of { happy_var_5 -> - ( withNodeInfo happy_var_1 $ CEnum (Just happy_var_3) (Just$ reverse happy_var_5) happy_var_2)}}}}- ) (\r -> happyReturn (happyIn58 r))--happyReduce_203 = happyMonadReduce 3# 51# happyReduction_203-happyReduction_203 (happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut126 happy_x_2 of { happy_var_2 -> - case happyOut125 happy_x_3 of { happy_var_3 -> - ( withNodeInfo happy_var_1 $ CEnum (Just happy_var_3) Nothing happy_var_2)}}}- ) (\r -> happyReturn (happyIn58 r))--happyReduce_204 = happySpecReduce_1 52# happyReduction_204-happyReduction_204 happy_x_1- = case happyOut60 happy_x_1 of { happy_var_1 -> - happyIn59- (singleton happy_var_1- )}--happyReduce_205 = happySpecReduce_3 52# happyReduction_205-happyReduction_205 happy_x_3- happy_x_2- happy_x_1- = case happyOut59 happy_x_1 of { happy_var_1 -> - case happyOut60 happy_x_3 of { happy_var_3 -> - happyIn59- (happy_var_1 `snoc` happy_var_3- )}}--happyReduce_206 = happySpecReduce_1 53# happyReduction_206-happyReduction_206 happy_x_1- = case happyOut125 happy_x_1 of { happy_var_1 -> - happyIn60- ((happy_var_1, Nothing)- )}--happyReduce_207 = happySpecReduce_3 53# happyReduction_207-happyReduction_207 happy_x_3- happy_x_2- happy_x_1- = case happyOut125 happy_x_1 of { happy_var_1 -> - case happyOut121 happy_x_3 of { happy_var_3 -> - happyIn60- ((happy_var_1, Just happy_var_3)- )}}--happyReduce_208 = happyMonadReduce 1# 54# happyReduction_208-happyReduction_208 (happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - ( withNodeInfo happy_var_1 $ CConstQual)}- ) (\r -> happyReturn (happyIn61 r))--happyReduce_209 = happyMonadReduce 1# 54# happyReduction_209-happyReduction_209 (happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - ( withNodeInfo happy_var_1 $ CVolatQual)}- ) (\r -> happyReturn (happyIn61 r))--happyReduce_210 = happyMonadReduce 1# 54# happyReduction_210-happyReduction_210 (happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - ( withNodeInfo happy_var_1 $ CRestrQual)}- ) (\r -> happyReturn (happyIn61 r))--happyReduce_211 = happyMonadReduce 1# 54# happyReduction_211-happyReduction_211 (happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - ( withNodeInfo happy_var_1 $ CInlineQual)}- ) (\r -> happyReturn (happyIn61 r))--happyReduce_212 = happySpecReduce_2 55# happyReduction_212-happyReduction_212 happy_x_2- happy_x_1- = case happyOut126 happy_x_1 of { happy_var_1 -> - case happyOut61 happy_x_2 of { happy_var_2 -> - happyIn62- (reverseList (map CAttrQual happy_var_1) `snoc` happy_var_2- )}}--happyReduce_213 = happySpecReduce_2 55# happyReduction_213-happyReduction_213 happy_x_2- happy_x_1- = case happyOut62 happy_x_1 of { happy_var_1 -> - case happyOut61 happy_x_2 of { happy_var_2 -> - happyIn62- (happy_var_1 `snoc` happy_var_2- )}}--happyReduce_214 = happySpecReduce_3 55# happyReduction_214-happyReduction_214 happy_x_3- happy_x_2- happy_x_1- = case happyOut62 happy_x_1 of { happy_var_1 -> - case happyOut127 happy_x_2 of { happy_var_2 -> - case happyOut61 happy_x_3 of { happy_var_3 -> - happyIn62- ((happy_var_1 `rappend` map CAttrQual happy_var_2) `snoc` happy_var_3- )}}}--happyReduce_215 = happySpecReduce_1 56# happyReduction_215-happyReduction_215 happy_x_1- = case happyOut72 happy_x_1 of { happy_var_1 -> - happyIn63- (happy_var_1- )}--happyReduce_216 = happySpecReduce_1 56# happyReduction_216-happyReduction_216 happy_x_1- = case happyOut65 happy_x_1 of { happy_var_1 -> - happyIn63- (happy_var_1- )}--happyReduce_217 = happySpecReduce_0 57# happyReduction_217-happyReduction_217 = happyIn64- (Nothing- )--happyReduce_218 = happyReduce 4# 57# happyReduction_218-happyReduction_218 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOut123 happy_x_3 of { happy_var_3 -> - happyIn64- (Just happy_var_3- ) `HappyStk` happyRest}--happyReduce_219 = happySpecReduce_1 58# happyReduction_219-happyReduction_219 happy_x_1- = case happyOut69 happy_x_1 of { happy_var_1 -> - happyIn65- (happy_var_1- )}--happyReduce_220 = happySpecReduce_1 58# happyReduction_220-happyReduction_220 happy_x_1- = case happyOut66 happy_x_1 of { happy_var_1 -> - happyIn65- (happy_var_1- )}--happyReduce_221 = happyMonadReduce 1# 59# happyReduction_221-happyReduction_221 (happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { (CTokTyIdent _ happy_var_1) -> - ( withNodeInfo happy_var_1 $ mkVarDeclr happy_var_1)}- ) (\r -> happyReturn (happyIn66 r))--happyReduce_222 = happyMonadReduce 2# 59# happyReduction_222-happyReduction_222 (happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { (CTokTyIdent _ happy_var_1) -> - case happyOut85 happy_x_2 of { happy_var_2 -> - ( withNodeInfo happy_var_1 $ \at -> happy_var_2 (mkVarDeclr happy_var_1 at))}}- ) (\r -> happyReturn (happyIn66 r))--happyReduce_223 = happySpecReduce_1 59# happyReduction_223-happyReduction_223 happy_x_1- = case happyOut67 happy_x_1 of { happy_var_1 -> - happyIn66- (happy_var_1- )}--happyReduce_224 = happySpecReduce_1 60# happyReduction_224-happyReduction_224 happy_x_1- = case happyOut68 happy_x_1 of { happy_var_1 -> - happyIn67- (happy_var_1- )}--happyReduce_225 = happyMonadReduce 2# 60# happyReduction_225-happyReduction_225 (happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut66 happy_x_2 of { happy_var_2 -> - ( withNodeInfo happy_var_1 $ ptrDeclr happy_var_2 [])}}- ) (\r -> happyReturn (happyIn67 r))--happyReduce_226 = happyMonadReduce 3# 60# happyReduction_226-happyReduction_226 (happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut127 happy_x_2 of { happy_var_2 -> - case happyOut66 happy_x_3 of { happy_var_3 -> - ( withAttribute happy_var_1 happy_var_2 $ ptrDeclr happy_var_3 [])}}}- ) (\r -> happyReturn (happyIn67 r))--happyReduce_227 = happyMonadReduce 3# 60# happyReduction_227-happyReduction_227 (happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut62 happy_x_2 of { happy_var_2 -> - case happyOut66 happy_x_3 of { happy_var_3 -> - ( withNodeInfo happy_var_1 $ ptrDeclr happy_var_3 (reverse happy_var_2))}}}- ) (\r -> happyReturn (happyIn67 r))--happyReduce_228 = happyMonadReduce 4# 60# happyReduction_228-happyReduction_228 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut62 happy_x_2 of { happy_var_2 -> - case happyOut127 happy_x_3 of { happy_var_3 -> - case happyOut66 happy_x_4 of { happy_var_4 -> - ( withAttribute happy_var_1 happy_var_3 $ ptrDeclr happy_var_4 (reverse happy_var_2))}}}}- ) (\r -> happyReturn (happyIn67 r))--happyReduce_229 = happySpecReduce_3 61# happyReduction_229-happyReduction_229 happy_x_3- happy_x_2- happy_x_1- = case happyOut67 happy_x_2 of { happy_var_2 -> - happyIn68- (happy_var_2- )}--happyReduce_230 = happyReduce 4# 61# happyReduction_230-happyReduction_230 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOut67 happy_x_2 of { happy_var_2 -> - case happyOut85 happy_x_4 of { happy_var_4 -> - happyIn68- (happy_var_4 happy_var_2- ) `HappyStk` happyRest}}--happyReduce_231 = happyReduce 4# 61# happyReduction_231-happyReduction_231 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOut127 happy_x_2 of { happy_var_2 -> - case happyOut67 happy_x_3 of { happy_var_3 -> - happyIn68- (appendDeclrAttrs happy_var_2 happy_var_3- ) `HappyStk` happyRest}}--happyReduce_232 = happyReduce 5# 61# happyReduction_232-happyReduction_232 (happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOut127 happy_x_2 of { happy_var_2 -> - case happyOut67 happy_x_3 of { happy_var_3 -> - case happyOut85 happy_x_5 of { happy_var_5 -> - happyIn68- (appendDeclrAttrs happy_var_2 (happy_var_5 happy_var_3)- ) `HappyStk` happyRest}}}--happyReduce_233 = happySpecReduce_1 62# happyReduction_233-happyReduction_233 happy_x_1- = case happyOut70 happy_x_1 of { happy_var_1 -> - happyIn69- (happy_var_1- )}--happyReduce_234 = happyMonadReduce 4# 62# happyReduction_234-happyReduction_234 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut71 happy_x_3 of { happy_var_3 -> - ( withNodeInfo happy_var_1 $ ptrDeclr happy_var_3 [])}}- ) (\r -> happyReturn (happyIn69 r))--happyReduce_235 = happyMonadReduce 5# 62# happyReduction_235-happyReduction_235 (happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut62 happy_x_2 of { happy_var_2 -> - case happyOut71 happy_x_4 of { happy_var_4 -> - ( withNodeInfo happy_var_1 $ ptrDeclr happy_var_4 (reverse happy_var_2))}}}- ) (\r -> happyReturn (happyIn69 r))--happyReduce_236 = happyMonadReduce 6# 62# happyReduction_236-happyReduction_236 (happy_x_6 `HappyStk`- happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut62 happy_x_2 of { happy_var_2 -> - case happyOut127 happy_x_3 of { happy_var_3 -> - case happyOut71 happy_x_5 of { happy_var_5 -> - ( withAttribute happy_var_1 happy_var_3 $ ptrDeclr happy_var_5 (reverse happy_var_2))}}}}- ) (\r -> happyReturn (happyIn69 r))--happyReduce_237 = happyMonadReduce 2# 62# happyReduction_237-happyReduction_237 (happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut69 happy_x_2 of { happy_var_2 -> - ( withNodeInfo happy_var_1 $ ptrDeclr happy_var_2 [])}}- ) (\r -> happyReturn (happyIn69 r))--happyReduce_238 = happyMonadReduce 3# 62# happyReduction_238-happyReduction_238 (happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut62 happy_x_2 of { happy_var_2 -> - case happyOut69 happy_x_3 of { happy_var_3 -> - ( withNodeInfo happy_var_1 $ ptrDeclr happy_var_3 (reverse happy_var_2))}}}- ) (\r -> happyReturn (happyIn69 r))--happyReduce_239 = happyMonadReduce 4# 62# happyReduction_239-happyReduction_239 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut62 happy_x_2 of { happy_var_2 -> - case happyOut127 happy_x_3 of { happy_var_3 -> - case happyOut69 happy_x_4 of { happy_var_4 -> - ( withAttribute happy_var_1 happy_var_3 $ ptrDeclr happy_var_4 (reverse happy_var_2))}}}}- ) (\r -> happyReturn (happyIn69 r))--happyReduce_240 = happySpecReduce_3 63# happyReduction_240-happyReduction_240 happy_x_3- happy_x_2- happy_x_1- = case happyOut69 happy_x_2 of { happy_var_2 -> - happyIn70- (happy_var_2- )}--happyReduce_241 = happyReduce 4# 63# happyReduction_241-happyReduction_241 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOut71 happy_x_2 of { happy_var_2 -> - case happyOut85 happy_x_3 of { happy_var_3 -> - happyIn70- (happy_var_3 happy_var_2- ) `HappyStk` happyRest}}--happyReduce_242 = happyReduce 4# 63# happyReduction_242-happyReduction_242 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOut69 happy_x_2 of { happy_var_2 -> - case happyOut85 happy_x_4 of { happy_var_4 -> - happyIn70- (happy_var_4 happy_var_2- ) `HappyStk` happyRest}}--happyReduce_243 = happyMonadReduce 1# 64# happyReduction_243-happyReduction_243 (happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { (CTokTyIdent _ happy_var_1) -> - ( withNodeInfo happy_var_1 $ mkVarDeclr happy_var_1)}- ) (\r -> happyReturn (happyIn71 r))--happyReduce_244 = happySpecReduce_3 64# happyReduction_244-happyReduction_244 happy_x_3- happy_x_2- happy_x_1- = case happyOut71 happy_x_2 of { happy_var_2 -> - happyIn71- (happy_var_2- )}--happyReduce_245 = happySpecReduce_1 65# happyReduction_245-happyReduction_245 happy_x_1- = case happyOut73 happy_x_1 of { happy_var_1 -> - happyIn72- (happy_var_1- )}--happyReduce_246 = happySpecReduce_1 65# happyReduction_246-happyReduction_246 happy_x_1- = case happyOut75 happy_x_1 of { happy_var_1 -> - happyIn72- (happy_var_1- )}--happyReduce_247 = happySpecReduce_1 66# happyReduction_247-happyReduction_247 happy_x_1- = case happyOut74 happy_x_1 of { happy_var_1 -> - happyIn73- (happy_var_1- )}--happyReduce_248 = happyMonadReduce 2# 66# happyReduction_248-happyReduction_248 (happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut72 happy_x_2 of { happy_var_2 -> - ( withNodeInfo happy_var_1 $ ptrDeclr happy_var_2 [])}}- ) (\r -> happyReturn (happyIn73 r))--happyReduce_249 = happyMonadReduce 3# 66# happyReduction_249-happyReduction_249 (happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut127 happy_x_2 of { happy_var_2 -> - case happyOut72 happy_x_3 of { happy_var_3 -> - ( withAttribute happy_var_1 happy_var_2 $ ptrDeclr happy_var_3 [])}}}- ) (\r -> happyReturn (happyIn73 r))--happyReduce_250 = happyMonadReduce 3# 66# happyReduction_250-happyReduction_250 (happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut62 happy_x_2 of { happy_var_2 -> - case happyOut72 happy_x_3 of { happy_var_3 -> - ( withNodeInfo happy_var_1 $ ptrDeclr happy_var_3 (reverse happy_var_2))}}}- ) (\r -> happyReturn (happyIn73 r))--happyReduce_251 = happyMonadReduce 4# 66# happyReduction_251-happyReduction_251 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut62 happy_x_2 of { happy_var_2 -> - case happyOut127 happy_x_3 of { happy_var_3 -> - case happyOut72 happy_x_4 of { happy_var_4 -> - ( withAttribute happy_var_1 happy_var_3 $ ptrDeclr happy_var_4 (reverse happy_var_2))}}}}- ) (\r -> happyReturn (happyIn73 r))--happyReduce_252 = happySpecReduce_2 67# happyReduction_252-happyReduction_252 happy_x_2- happy_x_1- = case happyOut75 happy_x_1 of { happy_var_1 -> - case happyOut85 happy_x_2 of { happy_var_2 -> - happyIn74- (happy_var_2 happy_var_1- )}}--happyReduce_253 = happySpecReduce_3 67# happyReduction_253-happyReduction_253 happy_x_3- happy_x_2- happy_x_1- = case happyOut73 happy_x_2 of { happy_var_2 -> - happyIn74- (happy_var_2- )}--happyReduce_254 = happyReduce 4# 67# happyReduction_254-happyReduction_254 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOut73 happy_x_2 of { happy_var_2 -> - case happyOut85 happy_x_4 of { happy_var_4 -> - happyIn74- (happy_var_4 happy_var_2- ) `HappyStk` happyRest}}--happyReduce_255 = happyReduce 4# 67# happyReduction_255-happyReduction_255 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOut127 happy_x_2 of { happy_var_2 -> - case happyOut73 happy_x_3 of { happy_var_3 -> - happyIn74- (appendDeclrAttrs happy_var_2 happy_var_3- ) `HappyStk` happyRest}}--happyReduce_256 = happyReduce 5# 67# happyReduction_256-happyReduction_256 (happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOut127 happy_x_2 of { happy_var_2 -> - case happyOut73 happy_x_3 of { happy_var_3 -> - case happyOut85 happy_x_5 of { happy_var_5 -> - happyIn74- (appendDeclrAttrs happy_var_2 (happy_var_5 happy_var_3)- ) `HappyStk` happyRest}}}--happyReduce_257 = happyMonadReduce 1# 68# happyReduction_257-happyReduction_257 (happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { (CTokIdent _ happy_var_1) -> - ( withNodeInfo happy_var_1 $ mkVarDeclr happy_var_1)}- ) (\r -> happyReturn (happyIn75 r))--happyReduce_258 = happySpecReduce_3 68# happyReduction_258-happyReduction_258 happy_x_3- happy_x_2- happy_x_1- = case happyOut75 happy_x_2 of { happy_var_2 -> - happyIn75- (happy_var_2- )}--happyReduce_259 = happyReduce 4# 68# happyReduction_259-happyReduction_259 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOut127 happy_x_2 of { happy_var_2 -> - case happyOut75 happy_x_3 of { happy_var_3 -> - happyIn75- (appendDeclrAttrs happy_var_2 happy_var_3- ) `HappyStk` happyRest}}--happyReduce_260 = happySpecReduce_1 69# happyReduction_260-happyReduction_260 happy_x_1- = case happyOut77 happy_x_1 of { happy_var_1 -> - happyIn76- (reverseDeclr happy_var_1- )}--happyReduce_261 = happySpecReduce_1 70# happyReduction_261-happyReduction_261 happy_x_1- = case happyOut78 happy_x_1 of { happy_var_1 -> - happyIn77- (happy_var_1- )}--happyReduce_262 = happyMonadReduce 2# 70# happyReduction_262-happyReduction_262 (happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut77 happy_x_2 of { happy_var_2 -> - ( withNodeInfo happy_var_1 $ ptrDeclr happy_var_2 [])}}- ) (\r -> happyReturn (happyIn77 r))--happyReduce_263 = happyMonadReduce 3# 70# happyReduction_263-happyReduction_263 (happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut62 happy_x_2 of { happy_var_2 -> - case happyOut77 happy_x_3 of { happy_var_3 -> - ( withNodeInfo happy_var_1 $ ptrDeclr happy_var_3 (reverse happy_var_2))}}}- ) (\r -> happyReturn (happyIn77 r))--happyReduce_264 = happyMonadReduce 4# 71# happyReduction_264-happyReduction_264 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut75 happy_x_1 of { happy_var_1 -> - case happyOutTok happy_x_2 of { happy_var_2 -> - case happyOut82 happy_x_3 of { happy_var_3 -> - ( withNodeInfo happy_var_2 $ funDeclr happy_var_1 (Left $ reverse happy_var_3) [])}}}- ) (\r -> happyReturn (happyIn78 r))--happyReduce_265 = happySpecReduce_3 71# happyReduction_265-happyReduction_265 happy_x_3- happy_x_2- happy_x_1- = case happyOut77 happy_x_2 of { happy_var_2 -> - happyIn78- (happy_var_2- )}--happyReduce_266 = happyReduce 4# 71# happyReduction_266-happyReduction_266 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOut77 happy_x_2 of { happy_var_2 -> - case happyOut85 happy_x_4 of { happy_var_4 -> - happyIn78- (happy_var_4 happy_var_2- ) `HappyStk` happyRest}}--happyReduce_267 = happySpecReduce_0 72# happyReduction_267-happyReduction_267 = happyIn79- (([], False)- )--happyReduce_268 = happySpecReduce_1 72# happyReduction_268-happyReduction_268 happy_x_1- = case happyOut80 happy_x_1 of { happy_var_1 -> - happyIn79- ((reverse happy_var_1, False)- )}--happyReduce_269 = happySpecReduce_3 72# happyReduction_269-happyReduction_269 happy_x_3- happy_x_2- happy_x_1- = case happyOut80 happy_x_1 of { happy_var_1 -> - happyIn79- ((reverse happy_var_1, True)- )}--happyReduce_270 = happySpecReduce_1 73# happyReduction_270-happyReduction_270 happy_x_1- = case happyOut81 happy_x_1 of { happy_var_1 -> - happyIn80- (singleton happy_var_1- )}--happyReduce_271 = happySpecReduce_3 73# happyReduction_271-happyReduction_271 happy_x_3- happy_x_2- happy_x_1- = case happyOut80 happy_x_1 of { happy_var_1 -> - case happyOut81 happy_x_3 of { happy_var_3 -> - happyIn80- (happy_var_1 `snoc` happy_var_3- )}}--happyReduce_272 = happyMonadReduce 1# 74# happyReduction_272-happyReduction_272 (happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut37 happy_x_1 of { happy_var_1 -> - ( withNodeInfo happy_var_1 $ CDecl happy_var_1 [])}- ) (\r -> happyReturn (happyIn81 r))--happyReduce_273 = happyMonadReduce 2# 74# happyReduction_273-happyReduction_273 (happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut37 happy_x_1 of { happy_var_1 -> - case happyOut84 happy_x_2 of { happy_var_2 -> - ( withNodeInfo happy_var_1 $ CDecl happy_var_1 [(Just (reverseDeclr happy_var_2), Nothing, Nothing)])}}- ) (\r -> happyReturn (happyIn81 r))--happyReduce_274 = happyMonadReduce 3# 74# happyReduction_274-happyReduction_274 (happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut37 happy_x_1 of { happy_var_1 -> - case happyOut72 happy_x_2 of { happy_var_2 -> - case happyOut126 happy_x_3 of { happy_var_3 -> - ( withNodeInfo happy_var_1 $ CDecl happy_var_1 [(Just (reverseDeclr $! appendDeclrAttrs happy_var_3 happy_var_2), Nothing, Nothing)])}}}- ) (\r -> happyReturn (happyIn81 r))--happyReduce_275 = happyMonadReduce 3# 74# happyReduction_275-happyReduction_275 (happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut37 happy_x_1 of { happy_var_1 -> - case happyOut66 happy_x_2 of { happy_var_2 -> - case happyOut126 happy_x_3 of { happy_var_3 -> - ( withNodeInfo happy_var_1 $ CDecl happy_var_1 [(Just (reverseDeclr $! appendDeclrAttrs happy_var_3 happy_var_2), Nothing, Nothing)])}}}- ) (\r -> happyReturn (happyIn81 r))--happyReduce_276 = happyMonadReduce 1# 74# happyReduction_276-happyReduction_276 (happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut38 happy_x_1 of { happy_var_1 -> - ( withNodeInfo happy_var_1 $ CDecl (reverse happy_var_1) [])}- ) (\r -> happyReturn (happyIn81 r))--happyReduce_277 = happyMonadReduce 2# 74# happyReduction_277-happyReduction_277 (happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut38 happy_x_1 of { happy_var_1 -> - case happyOut84 happy_x_2 of { happy_var_2 -> - ( withNodeInfo happy_var_1 $ CDecl (reverse happy_var_1) [(Just (reverseDeclr happy_var_2), Nothing, Nothing)])}}- ) (\r -> happyReturn (happyIn81 r))--happyReduce_278 = happyMonadReduce 3# 74# happyReduction_278-happyReduction_278 (happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut38 happy_x_1 of { happy_var_1 -> - case happyOut72 happy_x_2 of { happy_var_2 -> - case happyOut126 happy_x_3 of { happy_var_3 -> - ( withNodeInfo happy_var_1 $ CDecl (reverse happy_var_1) [(Just (reverseDeclr $! appendDeclrAttrs happy_var_3 happy_var_2), Nothing, Nothing)])}}}- ) (\r -> happyReturn (happyIn81 r))--happyReduce_279 = happyMonadReduce 1# 74# happyReduction_279-happyReduction_279 (happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut41 happy_x_1 of { happy_var_1 -> - ( withNodeInfo happy_var_1 $ CDecl happy_var_1 [])}- ) (\r -> happyReturn (happyIn81 r))--happyReduce_280 = happyMonadReduce 2# 74# happyReduction_280-happyReduction_280 (happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut41 happy_x_1 of { happy_var_1 -> - case happyOut84 happy_x_2 of { happy_var_2 -> - ( withNodeInfo happy_var_1 $ CDecl happy_var_1 [(Just (reverseDeclr happy_var_2), Nothing, Nothing)])}}- ) (\r -> happyReturn (happyIn81 r))--happyReduce_281 = happyMonadReduce 3# 74# happyReduction_281-happyReduction_281 (happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut41 happy_x_1 of { happy_var_1 -> - case happyOut72 happy_x_2 of { happy_var_2 -> - case happyOut126 happy_x_3 of { happy_var_3 -> - ( withNodeInfo happy_var_1 $ CDecl happy_var_1 [(Just (reverseDeclr $! appendDeclrAttrs happy_var_3 happy_var_2), Nothing, Nothing)])}}}- ) (\r -> happyReturn (happyIn81 r))--happyReduce_282 = happyMonadReduce 3# 74# happyReduction_282-happyReduction_282 (happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut41 happy_x_1 of { happy_var_1 -> - case happyOut66 happy_x_2 of { happy_var_2 -> - case happyOut126 happy_x_3 of { happy_var_3 -> - ( withNodeInfo happy_var_1 $ CDecl happy_var_1 [(Just (reverseDeclr $! appendDeclrAttrs happy_var_3 happy_var_2), Nothing, Nothing)])}}}- ) (\r -> happyReturn (happyIn81 r))--happyReduce_283 = happyMonadReduce 1# 74# happyReduction_283-happyReduction_283 (happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut62 happy_x_1 of { happy_var_1 -> - ( withNodeInfo happy_var_1 $ CDecl (liftTypeQuals happy_var_1) [])}- ) (\r -> happyReturn (happyIn81 r))--happyReduce_284 = happyMonadReduce 2# 74# happyReduction_284-happyReduction_284 (happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut62 happy_x_1 of { happy_var_1 -> - case happyOut128 happy_x_2 of { happy_var_2 -> - ( withNodeInfo happy_var_1 $ CDecl (liftTypeQuals happy_var_1 ++ liftCAttrs happy_var_2) [])}}- ) (\r -> happyReturn (happyIn81 r))--happyReduce_285 = happyMonadReduce 2# 74# happyReduction_285-happyReduction_285 (happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut62 happy_x_1 of { happy_var_1 -> - case happyOut84 happy_x_2 of { happy_var_2 -> - ( withNodeInfo happy_var_1 $ CDecl (liftTypeQuals happy_var_1) [(Just (reverseDeclr happy_var_2), Nothing, Nothing)])}}- ) (\r -> happyReturn (happyIn81 r))--happyReduce_286 = happyMonadReduce 3# 74# happyReduction_286-happyReduction_286 (happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut62 happy_x_1 of { happy_var_1 -> - case happyOut72 happy_x_2 of { happy_var_2 -> - case happyOut126 happy_x_3 of { happy_var_3 -> - ( withNodeInfo happy_var_1 $ CDecl (liftTypeQuals happy_var_1) [(Just (reverseDeclr$ appendDeclrAttrs happy_var_3 happy_var_2), Nothing, Nothing)])}}}- ) (\r -> happyReturn (happyIn81 r))--happyReduce_287 = happySpecReduce_1 75# happyReduction_287-happyReduction_287 happy_x_1- = case happyOutTok happy_x_1 of { (CTokIdent _ happy_var_1) -> - happyIn82- (singleton happy_var_1- )}--happyReduce_288 = happySpecReduce_3 75# happyReduction_288-happyReduction_288 happy_x_3- happy_x_2- happy_x_1- = case happyOut82 happy_x_1 of { happy_var_1 -> - case happyOutTok happy_x_3 of { (CTokIdent _ happy_var_3) -> - happyIn82- (happy_var_1 `snoc` happy_var_3- )}}--happyReduce_289 = happyMonadReduce 1# 76# happyReduction_289-happyReduction_289 (happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut41 happy_x_1 of { happy_var_1 -> - ( withNodeInfo happy_var_1 $ CDecl happy_var_1 [])}- ) (\r -> happyReturn (happyIn83 r))--happyReduce_290 = happyMonadReduce 2# 76# happyReduction_290-happyReduction_290 (happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut41 happy_x_1 of { happy_var_1 -> - case happyOut84 happy_x_2 of { happy_var_2 -> - ( withNodeInfo happy_var_1 $ CDecl happy_var_1 [(Just (reverseDeclr happy_var_2), Nothing, Nothing)])}}- ) (\r -> happyReturn (happyIn83 r))--happyReduce_291 = happyMonadReduce 2# 76# happyReduction_291-happyReduction_291 (happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut62 happy_x_1 of { happy_var_1 -> - case happyOut128 happy_x_2 of { happy_var_2 -> - ( withNodeInfo happy_var_1 $ CDecl (liftTypeQuals happy_var_1 ++ liftCAttrs happy_var_2) [])}}- ) (\r -> happyReturn (happyIn83 r))--happyReduce_292 = happyMonadReduce 2# 76# happyReduction_292-happyReduction_292 (happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut62 happy_x_1 of { happy_var_1 -> - case happyOut84 happy_x_2 of { happy_var_2 -> - ( withNodeInfo happy_var_1 $ CDecl (liftTypeQuals happy_var_1) [(Just (reverseDeclr happy_var_2), Nothing, Nothing)])}}- ) (\r -> happyReturn (happyIn83 r))--happyReduce_293 = happySpecReduce_1 77# happyReduction_293-happyReduction_293 happy_x_1- = case happyOut88 happy_x_1 of { happy_var_1 -> - happyIn84- (happy_var_1- )}--happyReduce_294 = happySpecReduce_1 77# happyReduction_294-happyReduction_294 happy_x_1- = case happyOut89 happy_x_1 of { happy_var_1 -> - happyIn84- (happy_var_1- )}--happyReduce_295 = happySpecReduce_1 77# happyReduction_295-happyReduction_295 happy_x_1- = case happyOut85 happy_x_1 of { happy_var_1 -> - happyIn84- (happy_var_1 emptyDeclr- )}--happyReduce_296 = happySpecReduce_1 78# happyReduction_296-happyReduction_296 happy_x_1- = case happyOut86 happy_x_1 of { happy_var_1 -> - happyIn85- (happy_var_1- )}--happyReduce_297 = happyMonadReduce 3# 78# happyReduction_297-happyReduction_297 (happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut79 happy_x_2 of { happy_var_2 -> - ( withNodeInfo happy_var_1 $ \at declr -> case happy_var_2 of- (params, variadic) -> funDeclr declr (Right (params,variadic)) [] at)}}- ) (\r -> happyReturn (happyIn85 r))--happyReduce_298 = happySpecReduce_1 79# happyReduction_298-happyReduction_298 happy_x_1- = case happyOut87 happy_x_1 of { happy_var_1 -> - happyIn86- (happy_var_1- )}--happyReduce_299 = happySpecReduce_2 79# happyReduction_299-happyReduction_299 happy_x_2- happy_x_1- = case happyOut86 happy_x_1 of { happy_var_1 -> - case happyOut87 happy_x_2 of { happy_var_2 -> - happyIn86- (\decl -> happy_var_2 (happy_var_1 decl)- )}}--happyReduce_300 = happyMonadReduce 3# 80# happyReduction_300-happyReduction_300 (happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut120 happy_x_2 of { happy_var_2 -> - ( withNodeInfo happy_var_1 $ \at declr -> arrDeclr declr [] False False happy_var_2 at)}}- ) (\r -> happyReturn (happyIn87 r))--happyReduce_301 = happyMonadReduce 4# 80# happyReduction_301-happyReduction_301 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut127 happy_x_2 of { happy_var_2 -> - case happyOut120 happy_x_3 of { happy_var_3 -> - ( withAttributePF happy_var_1 happy_var_2 $ \at declr -> arrDeclr declr [] False False happy_var_3 at)}}}- ) (\r -> happyReturn (happyIn87 r))--happyReduce_302 = happyMonadReduce 4# 80# happyReduction_302-happyReduction_302 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut62 happy_x_2 of { happy_var_2 -> - case happyOut120 happy_x_3 of { happy_var_3 -> - ( withNodeInfo happy_var_1 $ \at declr -> arrDeclr declr (reverse happy_var_2) False False happy_var_3 at)}}}- ) (\r -> happyReturn (happyIn87 r))--happyReduce_303 = happyMonadReduce 5# 80# happyReduction_303-happyReduction_303 (happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut62 happy_x_2 of { happy_var_2 -> - case happyOut127 happy_x_3 of { happy_var_3 -> - case happyOut120 happy_x_4 of { happy_var_4 -> - ( withAttributePF happy_var_1 happy_var_3 $ \at declr -> arrDeclr declr (reverse happy_var_2) False False happy_var_4 at)}}}}- ) (\r -> happyReturn (happyIn87 r))--happyReduce_304 = happyMonadReduce 5# 80# happyReduction_304-happyReduction_304 (happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut126 happy_x_3 of { happy_var_3 -> - case happyOut115 happy_x_4 of { happy_var_4 -> - ( withAttributePF happy_var_1 happy_var_3 $ \at declr -> arrDeclr declr [] False True (Just happy_var_4) at)}}}- ) (\r -> happyReturn (happyIn87 r))--happyReduce_305 = happyMonadReduce 6# 80# happyReduction_305-happyReduction_305 (happy_x_6 `HappyStk`- happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut62 happy_x_3 of { happy_var_3 -> - case happyOut126 happy_x_4 of { happy_var_4 -> - case happyOut115 happy_x_5 of { happy_var_5 -> - ( withAttributePF happy_var_1 happy_var_4 $ \at declr -> arrDeclr declr (reverse happy_var_3) False True (Just happy_var_5) at)}}}}- ) (\r -> happyReturn (happyIn87 r))--happyReduce_306 = happyMonadReduce 7# 80# happyReduction_306-happyReduction_306 (happy_x_7 `HappyStk`- happy_x_6 `HappyStk`- happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut62 happy_x_2 of { happy_var_2 -> - case happyOut126 happy_x_3 of { happy_var_3 -> - case happyOut126 happy_x_5 of { happy_var_5 -> - case happyOut115 happy_x_6 of { happy_var_6 -> - ( withAttributePF happy_var_1 (happy_var_3 ++ happy_var_5) $ \at declr -> arrDeclr declr (reverse happy_var_2) False True (Just happy_var_6) at)}}}}}- ) (\r -> happyReturn (happyIn87 r))--happyReduce_307 = happyMonadReduce 4# 80# happyReduction_307-happyReduction_307 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut126 happy_x_3 of { happy_var_3 -> - ( withAttributePF happy_var_1 happy_var_3 $ \at declr -> arrDeclr declr [] True False Nothing at)}}- ) (\r -> happyReturn (happyIn87 r))--happyReduce_308 = happyMonadReduce 5# 80# happyReduction_308-happyReduction_308 (happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut127 happy_x_2 of { happy_var_2 -> - case happyOut126 happy_x_4 of { happy_var_4 -> - ( withAttributePF happy_var_1 (happy_var_2 ++ happy_var_4) $ \at declr -> arrDeclr declr [] True False Nothing at)}}}- ) (\r -> happyReturn (happyIn87 r))--happyReduce_309 = happyMonadReduce 5# 80# happyReduction_309-happyReduction_309 (happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut62 happy_x_2 of { happy_var_2 -> - case happyOut126 happy_x_4 of { happy_var_4 -> - ( withAttributePF happy_var_1 happy_var_4 $ \at declr -> arrDeclr declr (reverse happy_var_2) True False Nothing at)}}}- ) (\r -> happyReturn (happyIn87 r))--happyReduce_310 = happyMonadReduce 6# 80# happyReduction_310-happyReduction_310 (happy_x_6 `HappyStk`- happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut62 happy_x_2 of { happy_var_2 -> - case happyOut127 happy_x_3 of { happy_var_3 -> - case happyOut126 happy_x_5 of { happy_var_5 -> - ( withAttributePF happy_var_1 (happy_var_3 ++ happy_var_5) $ \at declr -> arrDeclr declr (reverse happy_var_2) True False Nothing at)}}}}- ) (\r -> happyReturn (happyIn87 r))--happyReduce_311 = happyMonadReduce 1# 81# happyReduction_311-happyReduction_311 (happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - ( withNodeInfo happy_var_1 $ ptrDeclr emptyDeclr [])}- ) (\r -> happyReturn (happyIn88 r))--happyReduce_312 = happyMonadReduce 3# 81# happyReduction_312-happyReduction_312 (happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut62 happy_x_2 of { happy_var_2 -> - case happyOut126 happy_x_3 of { happy_var_3 -> - ( withAttribute happy_var_1 happy_var_3 $ ptrDeclr emptyDeclr (reverse happy_var_2))}}}- ) (\r -> happyReturn (happyIn88 r))--happyReduce_313 = happyMonadReduce 2# 81# happyReduction_313-happyReduction_313 (happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut84 happy_x_2 of { happy_var_2 -> - ( withNodeInfo happy_var_1 $ ptrDeclr happy_var_2 [])}}- ) (\r -> happyReturn (happyIn88 r))--happyReduce_314 = happyMonadReduce 3# 81# happyReduction_314-happyReduction_314 (happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut62 happy_x_2 of { happy_var_2 -> - case happyOut84 happy_x_3 of { happy_var_3 -> - ( withNodeInfo happy_var_1 $ ptrDeclr happy_var_3 (reverse happy_var_2))}}}- ) (\r -> happyReturn (happyIn88 r))--happyReduce_315 = happyMonadReduce 2# 81# happyReduction_315-happyReduction_315 (happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut127 happy_x_2 of { happy_var_2 -> - ( withAttribute happy_var_1 happy_var_2 $ ptrDeclr emptyDeclr [])}}- ) (\r -> happyReturn (happyIn88 r))--happyReduce_316 = happyMonadReduce 3# 81# happyReduction_316-happyReduction_316 (happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut127 happy_x_2 of { happy_var_2 -> - case happyOut84 happy_x_3 of { happy_var_3 -> - ( withAttribute happy_var_1 happy_var_2 $ ptrDeclr happy_var_3 [])}}}- ) (\r -> happyReturn (happyIn88 r))--happyReduce_317 = happySpecReduce_3 82# happyReduction_317-happyReduction_317 happy_x_3- happy_x_2- happy_x_1- = case happyOut88 happy_x_2 of { happy_var_2 -> - happyIn89- (happy_var_2- )}--happyReduce_318 = happySpecReduce_3 82# happyReduction_318-happyReduction_318 happy_x_3- happy_x_2- happy_x_1- = case happyOut89 happy_x_2 of { happy_var_2 -> - happyIn89- (happy_var_2- )}--happyReduce_319 = happySpecReduce_3 82# happyReduction_319-happyReduction_319 happy_x_3- happy_x_2- happy_x_1- = case happyOut85 happy_x_2 of { happy_var_2 -> - happyIn89- (happy_var_2 emptyDeclr- )}--happyReduce_320 = happyReduce 4# 82# happyReduction_320-happyReduction_320 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOut88 happy_x_2 of { happy_var_2 -> - case happyOut85 happy_x_4 of { happy_var_4 -> - happyIn89- (happy_var_4 happy_var_2- ) `HappyStk` happyRest}}--happyReduce_321 = happyReduce 4# 82# happyReduction_321-happyReduction_321 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOut127 happy_x_2 of { happy_var_2 -> - case happyOut88 happy_x_3 of { happy_var_3 -> - happyIn89- (appendDeclrAttrs happy_var_2 happy_var_3- ) `HappyStk` happyRest}}--happyReduce_322 = happyReduce 4# 82# happyReduction_322-happyReduction_322 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOut127 happy_x_2 of { happy_var_2 -> - case happyOut89 happy_x_3 of { happy_var_3 -> - happyIn89- (appendDeclrAttrs happy_var_2 happy_var_3- ) `HappyStk` happyRest}}--happyReduce_323 = happyReduce 4# 82# happyReduction_323-happyReduction_323 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOut127 happy_x_2 of { happy_var_2 -> - case happyOut85 happy_x_3 of { happy_var_3 -> - happyIn89- (appendDeclrAttrs happy_var_2 (happy_var_3 emptyDeclr)- ) `HappyStk` happyRest}}--happyReduce_324 = happyReduce 5# 82# happyReduction_324-happyReduction_324 (happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOut127 happy_x_2 of { happy_var_2 -> - case happyOut88 happy_x_3 of { happy_var_3 -> - case happyOut85 happy_x_5 of { happy_var_5 -> - happyIn89- (appendDeclrAttrs happy_var_2 (happy_var_5 happy_var_3)- ) `HappyStk` happyRest}}}--happyReduce_325 = happySpecReduce_2 82# happyReduction_325-happyReduction_325 happy_x_2- happy_x_1- = case happyOut89 happy_x_1 of { happy_var_1 -> - case happyOut128 happy_x_2 of { happy_var_2 -> - happyIn89- (appendDeclrAttrs happy_var_2 happy_var_1- )}}--happyReduce_326 = happyMonadReduce 1# 83# happyReduction_326-happyReduction_326 (happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut115 happy_x_1 of { happy_var_1 -> - ( withNodeInfo happy_var_1 $ CInitExpr happy_var_1)}- ) (\r -> happyReturn (happyIn90 r))--happyReduce_327 = happyMonadReduce 3# 83# happyReduction_327-happyReduction_327 (happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut92 happy_x_2 of { happy_var_2 -> - ( withNodeInfo happy_var_1 $ CInitList (reverse happy_var_2))}}- ) (\r -> happyReturn (happyIn90 r))--happyReduce_328 = happyMonadReduce 4# 83# happyReduction_328-happyReduction_328 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut92 happy_x_2 of { happy_var_2 -> - ( withNodeInfo happy_var_1 $ CInitList (reverse happy_var_2))}}- ) (\r -> happyReturn (happyIn90 r))--happyReduce_329 = happySpecReduce_0 84# happyReduction_329-happyReduction_329 = happyIn91- (Nothing- )--happyReduce_330 = happySpecReduce_2 84# happyReduction_330-happyReduction_330 happy_x_2- happy_x_1- = case happyOut90 happy_x_2 of { happy_var_2 -> - happyIn91- (Just happy_var_2- )}--happyReduce_331 = happySpecReduce_0 85# happyReduction_331-happyReduction_331 = happyIn92- (empty- )--happyReduce_332 = happySpecReduce_1 85# happyReduction_332-happyReduction_332 happy_x_1- = case happyOut90 happy_x_1 of { happy_var_1 -> - happyIn92- (singleton ([],happy_var_1)- )}--happyReduce_333 = happySpecReduce_2 85# happyReduction_333-happyReduction_333 happy_x_2- happy_x_1- = case happyOut93 happy_x_1 of { happy_var_1 -> - case happyOut90 happy_x_2 of { happy_var_2 -> - happyIn92- (singleton (happy_var_1,happy_var_2)- )}}--happyReduce_334 = happySpecReduce_3 85# happyReduction_334-happyReduction_334 happy_x_3- happy_x_2- happy_x_1- = case happyOut92 happy_x_1 of { happy_var_1 -> - case happyOut90 happy_x_3 of { happy_var_3 -> - happyIn92- (happy_var_1 `snoc` ([],happy_var_3)- )}}--happyReduce_335 = happyReduce 4# 85# happyReduction_335-happyReduction_335 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOut92 happy_x_1 of { happy_var_1 -> - case happyOut93 happy_x_3 of { happy_var_3 -> - case happyOut90 happy_x_4 of { happy_var_4 -> - happyIn92- (happy_var_1 `snoc` (happy_var_3,happy_var_4)- ) `HappyStk` happyRest}}}--happyReduce_336 = happySpecReduce_2 86# happyReduction_336-happyReduction_336 happy_x_2- happy_x_1- = case happyOut94 happy_x_1 of { happy_var_1 -> - happyIn93- (reverse happy_var_1- )}--happyReduce_337 = happyMonadReduce 2# 86# happyReduction_337-happyReduction_337 (happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut125 happy_x_1 of { happy_var_1 -> - ( withNodeInfo happy_var_1 $ \at -> [CMemberDesig happy_var_1 at])}- ) (\r -> happyReturn (happyIn93 r))--happyReduce_338 = happySpecReduce_1 86# happyReduction_338-happyReduction_338 happy_x_1- = case happyOut96 happy_x_1 of { happy_var_1 -> - happyIn93- ([happy_var_1]- )}--happyReduce_339 = happySpecReduce_1 87# happyReduction_339-happyReduction_339 happy_x_1- = case happyOut95 happy_x_1 of { happy_var_1 -> - happyIn94- (singleton happy_var_1- )}--happyReduce_340 = happySpecReduce_2 87# happyReduction_340-happyReduction_340 happy_x_2- happy_x_1- = case happyOut94 happy_x_1 of { happy_var_1 -> - case happyOut95 happy_x_2 of { happy_var_2 -> - happyIn94- (happy_var_1 `snoc` happy_var_2- )}}--happyReduce_341 = happyMonadReduce 3# 88# happyReduction_341-happyReduction_341 (happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut121 happy_x_2 of { happy_var_2 -> - ( withNodeInfo happy_var_1 $ CArrDesig happy_var_2)}}- ) (\r -> happyReturn (happyIn95 r))--happyReduce_342 = happyMonadReduce 2# 88# happyReduction_342-happyReduction_342 (happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut125 happy_x_2 of { happy_var_2 -> - ( withNodeInfo happy_var_1 $ CMemberDesig happy_var_2)}}- ) (\r -> happyReturn (happyIn95 r))--happyReduce_343 = happySpecReduce_1 88# happyReduction_343-happyReduction_343 happy_x_1- = case happyOut96 happy_x_1 of { happy_var_1 -> - happyIn95- (happy_var_1- )}--happyReduce_344 = happyMonadReduce 5# 89# happyReduction_344-happyReduction_344 (happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut121 happy_x_2 of { happy_var_2 -> - case happyOut121 happy_x_4 of { happy_var_4 -> - ( withNodeInfo happy_var_1 $ CRangeDesig happy_var_2 happy_var_4)}}}- ) (\r -> happyReturn (happyIn96 r))--happyReduce_345 = happyMonadReduce 1# 90# happyReduction_345-happyReduction_345 (happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { (CTokIdent _ happy_var_1) -> - ( withNodeInfo happy_var_1 $ CVar happy_var_1)}- ) (\r -> happyReturn (happyIn97 r))--happyReduce_346 = happySpecReduce_1 90# happyReduction_346-happyReduction_346 happy_x_1- = case happyOut122 happy_x_1 of { happy_var_1 -> - happyIn97- (CConst happy_var_1- )}--happyReduce_347 = happySpecReduce_1 90# happyReduction_347-happyReduction_347 happy_x_1- = case happyOut123 happy_x_1 of { happy_var_1 -> - happyIn97- (CConst (liftStrLit happy_var_1)- )}--happyReduce_348 = happySpecReduce_3 90# happyReduction_348-happyReduction_348 happy_x_3- happy_x_2- happy_x_1- = case happyOut117 happy_x_2 of { happy_var_2 -> - happyIn97- (happy_var_2- )}--happyReduce_349 = happyMonadReduce 3# 90# happyReduction_349-happyReduction_349 (happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut14 happy_x_2 of { happy_var_2 -> - ( withNodeInfo happy_var_1 $ CStatExpr happy_var_2)}}- ) (\r -> happyReturn (happyIn97 r))--happyReduce_350 = happyMonadReduce 6# 90# happyReduction_350-happyReduction_350 (happy_x_6 `HappyStk`- happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut115 happy_x_3 of { happy_var_3 -> - case happyOut83 happy_x_5 of { happy_var_5 -> - ( withNodeInfo happy_var_1 $ CBuiltinExpr . CBuiltinVaArg happy_var_3 happy_var_5)}}}- ) (\r -> happyReturn (happyIn97 r))--happyReduce_351 = happyMonadReduce 6# 90# happyReduction_351-happyReduction_351 (happy_x_6 `HappyStk`- happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut83 happy_x_3 of { happy_var_3 -> - case happyOut98 happy_x_5 of { happy_var_5 -> - ( withNodeInfo happy_var_1 $ CBuiltinExpr . CBuiltinOffsetOf happy_var_3 (reverse happy_var_5))}}}- ) (\r -> happyReturn (happyIn97 r))--happyReduce_352 = happyMonadReduce 6# 90# happyReduction_352-happyReduction_352 (happy_x_6 `HappyStk`- happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut83 happy_x_3 of { happy_var_3 -> - case happyOut83 happy_x_5 of { happy_var_5 -> - ( withNodeInfo happy_var_1 $ CBuiltinExpr . CBuiltinTypesCompatible happy_var_3 happy_var_5)}}}- ) (\r -> happyReturn (happyIn97 r))--happyReduce_353 = happyMonadReduce 1# 91# happyReduction_353-happyReduction_353 (happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut125 happy_x_1 of { happy_var_1 -> - ( withNodeInfo happy_var_1 $ singleton . CMemberDesig happy_var_1)}- ) (\r -> happyReturn (happyIn98 r))--happyReduce_354 = happyMonadReduce 3# 91# happyReduction_354-happyReduction_354 (happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut98 happy_x_1 of { happy_var_1 -> - case happyOut125 happy_x_3 of { happy_var_3 -> - ( withNodeInfo happy_var_3 $ (happy_var_1 `snoc`) . CMemberDesig happy_var_3)}}- ) (\r -> happyReturn (happyIn98 r))--happyReduce_355 = happyMonadReduce 4# 91# happyReduction_355-happyReduction_355 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut98 happy_x_1 of { happy_var_1 -> - case happyOut117 happy_x_3 of { happy_var_3 -> - ( withNodeInfo happy_var_3 $ (happy_var_1 `snoc`) . CArrDesig happy_var_3)}}- ) (\r -> happyReturn (happyIn98 r))--happyReduce_356 = happySpecReduce_1 92# happyReduction_356-happyReduction_356 happy_x_1- = case happyOut97 happy_x_1 of { happy_var_1 -> - happyIn99- (happy_var_1- )}--happyReduce_357 = happyMonadReduce 4# 92# happyReduction_357-happyReduction_357 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut99 happy_x_1 of { happy_var_1 -> - case happyOutTok happy_x_2 of { happy_var_2 -> - case happyOut117 happy_x_3 of { happy_var_3 -> - ( withNodeInfo happy_var_2 $ CIndex happy_var_1 happy_var_3)}}}- ) (\r -> happyReturn (happyIn99 r))--happyReduce_358 = happyMonadReduce 3# 92# happyReduction_358-happyReduction_358 (happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut99 happy_x_1 of { happy_var_1 -> - case happyOutTok happy_x_2 of { happy_var_2 -> - ( withNodeInfo happy_var_2 $ CCall happy_var_1 [])}}- ) (\r -> happyReturn (happyIn99 r))--happyReduce_359 = happyMonadReduce 4# 92# happyReduction_359-happyReduction_359 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut99 happy_x_1 of { happy_var_1 -> - case happyOutTok happy_x_2 of { happy_var_2 -> - case happyOut100 happy_x_3 of { happy_var_3 -> - ( withNodeInfo happy_var_2 $ CCall happy_var_1 (reverse happy_var_3))}}}- ) (\r -> happyReturn (happyIn99 r))--happyReduce_360 = happyMonadReduce 3# 92# happyReduction_360-happyReduction_360 (happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut99 happy_x_1 of { happy_var_1 -> - case happyOutTok happy_x_2 of { happy_var_2 -> - case happyOut125 happy_x_3 of { happy_var_3 -> - ( withNodeInfo happy_var_2 $ CMember happy_var_1 happy_var_3 False)}}}- ) (\r -> happyReturn (happyIn99 r))--happyReduce_361 = happyMonadReduce 3# 92# happyReduction_361-happyReduction_361 (happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut99 happy_x_1 of { happy_var_1 -> - case happyOutTok happy_x_2 of { happy_var_2 -> - case happyOut125 happy_x_3 of { happy_var_3 -> - ( withNodeInfo happy_var_2 $ CMember happy_var_1 happy_var_3 True)}}}- ) (\r -> happyReturn (happyIn99 r))--happyReduce_362 = happyMonadReduce 2# 92# happyReduction_362-happyReduction_362 (happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut99 happy_x_1 of { happy_var_1 -> - case happyOutTok happy_x_2 of { happy_var_2 -> - ( withNodeInfo happy_var_2 $ CUnary CPostIncOp happy_var_1)}}- ) (\r -> happyReturn (happyIn99 r))--happyReduce_363 = happyMonadReduce 2# 92# happyReduction_363-happyReduction_363 (happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut99 happy_x_1 of { happy_var_1 -> - case happyOutTok happy_x_2 of { happy_var_2 -> - ( withNodeInfo happy_var_2 $ CUnary CPostDecOp happy_var_1)}}- ) (\r -> happyReturn (happyIn99 r))--happyReduce_364 = happyMonadReduce 6# 92# happyReduction_364-happyReduction_364 (happy_x_6 `HappyStk`- happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut83 happy_x_2 of { happy_var_2 -> - case happyOutTok happy_x_4 of { happy_var_4 -> - case happyOut92 happy_x_5 of { happy_var_5 -> - ( withNodeInfo happy_var_4 $ CCompoundLit happy_var_2 (reverse happy_var_5))}}}- ) (\r -> happyReturn (happyIn99 r))--happyReduce_365 = happyMonadReduce 7# 92# happyReduction_365-happyReduction_365 (happy_x_7 `HappyStk`- happy_x_6 `HappyStk`- happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut83 happy_x_2 of { happy_var_2 -> - case happyOutTok happy_x_4 of { happy_var_4 -> - case happyOut92 happy_x_5 of { happy_var_5 -> - ( withNodeInfo happy_var_4 $ CCompoundLit happy_var_2 (reverse happy_var_5))}}}- ) (\r -> happyReturn (happyIn99 r))--happyReduce_366 = happySpecReduce_1 93# happyReduction_366-happyReduction_366 happy_x_1- = case happyOut115 happy_x_1 of { happy_var_1 -> - happyIn100- (singleton happy_var_1- )}--happyReduce_367 = happySpecReduce_3 93# happyReduction_367-happyReduction_367 happy_x_3- happy_x_2- happy_x_1- = case happyOut100 happy_x_1 of { happy_var_1 -> - case happyOut115 happy_x_3 of { happy_var_3 -> - happyIn100- (happy_var_1 `snoc` happy_var_3- )}}--happyReduce_368 = happySpecReduce_1 94# happyReduction_368-happyReduction_368 happy_x_1- = case happyOut99 happy_x_1 of { happy_var_1 -> - happyIn101- (happy_var_1- )}--happyReduce_369 = happyMonadReduce 2# 94# happyReduction_369-happyReduction_369 (happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut101 happy_x_2 of { happy_var_2 -> - ( withNodeInfo happy_var_1 $ CUnary CPreIncOp happy_var_2)}}- ) (\r -> happyReturn (happyIn101 r))--happyReduce_370 = happyMonadReduce 2# 94# happyReduction_370-happyReduction_370 (happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut101 happy_x_2 of { happy_var_2 -> - ( withNodeInfo happy_var_1 $ CUnary CPreDecOp happy_var_2)}}- ) (\r -> happyReturn (happyIn101 r))--happyReduce_371 = happySpecReduce_2 94# happyReduction_371-happyReduction_371 happy_x_2- happy_x_1- = case happyOut103 happy_x_2 of { happy_var_2 -> - happyIn101- (happy_var_2- )}--happyReduce_372 = happyMonadReduce 2# 94# happyReduction_372-happyReduction_372 (happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut102 happy_x_1 of { happy_var_1 -> - case happyOut103 happy_x_2 of { happy_var_2 -> - ( withNodeInfo happy_var_1 $ CUnary (unL happy_var_1) happy_var_2)}}- ) (\r -> happyReturn (happyIn101 r))--happyReduce_373 = happyMonadReduce 2# 94# happyReduction_373-happyReduction_373 (happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut101 happy_x_2 of { happy_var_2 -> - ( withNodeInfo happy_var_1 $ CSizeofExpr happy_var_2)}}- ) (\r -> happyReturn (happyIn101 r))--happyReduce_374 = happyMonadReduce 4# 94# happyReduction_374-happyReduction_374 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut83 happy_x_3 of { happy_var_3 -> - ( withNodeInfo happy_var_1 $ CSizeofType happy_var_3)}}- ) (\r -> happyReturn (happyIn101 r))--happyReduce_375 = happyMonadReduce 2# 94# happyReduction_375-happyReduction_375 (happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut101 happy_x_2 of { happy_var_2 -> - ( withNodeInfo happy_var_1 $ CAlignofExpr happy_var_2)}}- ) (\r -> happyReturn (happyIn101 r))--happyReduce_376 = happyMonadReduce 4# 94# happyReduction_376-happyReduction_376 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut83 happy_x_3 of { happy_var_3 -> - ( withNodeInfo happy_var_1 $ CAlignofType happy_var_3)}}- ) (\r -> happyReturn (happyIn101 r))--happyReduce_377 = happyMonadReduce 2# 94# happyReduction_377-happyReduction_377 (happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut101 happy_x_2 of { happy_var_2 -> - ( withNodeInfo happy_var_1 $ CComplexReal happy_var_2)}}- ) (\r -> happyReturn (happyIn101 r))--happyReduce_378 = happyMonadReduce 2# 94# happyReduction_378-happyReduction_378 (happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut101 happy_x_2 of { happy_var_2 -> - ( withNodeInfo happy_var_1 $ CComplexImag happy_var_2)}}- ) (\r -> happyReturn (happyIn101 r))--happyReduce_379 = happyMonadReduce 2# 94# happyReduction_379-happyReduction_379 (happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut125 happy_x_2 of { happy_var_2 -> - ( withNodeInfo happy_var_1 $ CLabAddrExpr happy_var_2)}}- ) (\r -> happyReturn (happyIn101 r))--happyReduce_380 = happySpecReduce_1 95# happyReduction_380-happyReduction_380 happy_x_1- = case happyOutTok happy_x_1 of { happy_var_1 -> - happyIn102- (L CAdrOp (posOf happy_var_1)- )}--happyReduce_381 = happySpecReduce_1 95# happyReduction_381-happyReduction_381 happy_x_1- = case happyOutTok happy_x_1 of { happy_var_1 -> - happyIn102- (L CIndOp (posOf happy_var_1)- )}--happyReduce_382 = happySpecReduce_1 95# happyReduction_382-happyReduction_382 happy_x_1- = case happyOutTok happy_x_1 of { happy_var_1 -> - happyIn102- (L CPlusOp (posOf happy_var_1)- )}--happyReduce_383 = happySpecReduce_1 95# happyReduction_383-happyReduction_383 happy_x_1- = case happyOutTok happy_x_1 of { happy_var_1 -> - happyIn102- (L CMinOp (posOf happy_var_1)- )}--happyReduce_384 = happySpecReduce_1 95# happyReduction_384-happyReduction_384 happy_x_1- = case happyOutTok happy_x_1 of { happy_var_1 -> - happyIn102- (L CCompOp (posOf happy_var_1)- )}--happyReduce_385 = happySpecReduce_1 95# happyReduction_385-happyReduction_385 happy_x_1- = case happyOutTok happy_x_1 of { happy_var_1 -> - happyIn102- (L CNegOp (posOf happy_var_1)- )}--happyReduce_386 = happySpecReduce_1 96# happyReduction_386-happyReduction_386 happy_x_1- = case happyOut101 happy_x_1 of { happy_var_1 -> - happyIn103- (happy_var_1- )}--happyReduce_387 = happyMonadReduce 4# 96# happyReduction_387-happyReduction_387 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut83 happy_x_2 of { happy_var_2 -> - case happyOut103 happy_x_4 of { happy_var_4 -> - ( withNodeInfo happy_var_1 $ CCast happy_var_2 happy_var_4)}}}- ) (\r -> happyReturn (happyIn103 r))--happyReduce_388 = happySpecReduce_1 97# happyReduction_388-happyReduction_388 happy_x_1- = case happyOut103 happy_x_1 of { happy_var_1 -> - happyIn104- (happy_var_1- )}--happyReduce_389 = happyMonadReduce 3# 97# happyReduction_389-happyReduction_389 (happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut104 happy_x_1 of { happy_var_1 -> - case happyOutTok happy_x_2 of { happy_var_2 -> - case happyOut103 happy_x_3 of { happy_var_3 -> - ( withNodeInfo happy_var_2 $ CBinary CMulOp happy_var_1 happy_var_3)}}}- ) (\r -> happyReturn (happyIn104 r))--happyReduce_390 = happyMonadReduce 3# 97# happyReduction_390-happyReduction_390 (happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut104 happy_x_1 of { happy_var_1 -> - case happyOutTok happy_x_2 of { happy_var_2 -> - case happyOut103 happy_x_3 of { happy_var_3 -> - ( withNodeInfo happy_var_2 $ CBinary CDivOp happy_var_1 happy_var_3)}}}- ) (\r -> happyReturn (happyIn104 r))--happyReduce_391 = happyMonadReduce 3# 97# happyReduction_391-happyReduction_391 (happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut104 happy_x_1 of { happy_var_1 -> - case happyOutTok happy_x_2 of { happy_var_2 -> - case happyOut103 happy_x_3 of { happy_var_3 -> - ( withNodeInfo happy_var_2 $ CBinary CRmdOp happy_var_1 happy_var_3)}}}- ) (\r -> happyReturn (happyIn104 r))--happyReduce_392 = happySpecReduce_1 98# happyReduction_392-happyReduction_392 happy_x_1- = case happyOut104 happy_x_1 of { happy_var_1 -> - happyIn105- (happy_var_1- )}--happyReduce_393 = happyMonadReduce 3# 98# happyReduction_393-happyReduction_393 (happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut105 happy_x_1 of { happy_var_1 -> - case happyOutTok happy_x_2 of { happy_var_2 -> - case happyOut104 happy_x_3 of { happy_var_3 -> - ( withNodeInfo happy_var_2 $ CBinary CAddOp happy_var_1 happy_var_3)}}}- ) (\r -> happyReturn (happyIn105 r))--happyReduce_394 = happyMonadReduce 3# 98# happyReduction_394-happyReduction_394 (happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut105 happy_x_1 of { happy_var_1 -> - case happyOutTok happy_x_2 of { happy_var_2 -> - case happyOut104 happy_x_3 of { happy_var_3 -> - ( withNodeInfo happy_var_2 $ CBinary CSubOp happy_var_1 happy_var_3)}}}- ) (\r -> happyReturn (happyIn105 r))--happyReduce_395 = happySpecReduce_1 99# happyReduction_395-happyReduction_395 happy_x_1- = case happyOut105 happy_x_1 of { happy_var_1 -> - happyIn106- (happy_var_1- )}--happyReduce_396 = happyMonadReduce 3# 99# happyReduction_396-happyReduction_396 (happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut106 happy_x_1 of { happy_var_1 -> - case happyOutTok happy_x_2 of { happy_var_2 -> - case happyOut105 happy_x_3 of { happy_var_3 -> - ( withNodeInfo happy_var_2 $ CBinary CShlOp happy_var_1 happy_var_3)}}}- ) (\r -> happyReturn (happyIn106 r))--happyReduce_397 = happyMonadReduce 3# 99# happyReduction_397-happyReduction_397 (happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut106 happy_x_1 of { happy_var_1 -> - case happyOutTok happy_x_2 of { happy_var_2 -> - case happyOut105 happy_x_3 of { happy_var_3 -> - ( withNodeInfo happy_var_2 $ CBinary CShrOp happy_var_1 happy_var_3)}}}- ) (\r -> happyReturn (happyIn106 r))--happyReduce_398 = happySpecReduce_1 100# happyReduction_398-happyReduction_398 happy_x_1- = case happyOut106 happy_x_1 of { happy_var_1 -> - happyIn107- (happy_var_1- )}--happyReduce_399 = happyMonadReduce 3# 100# happyReduction_399-happyReduction_399 (happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut107 happy_x_1 of { happy_var_1 -> - case happyOutTok happy_x_2 of { happy_var_2 -> - case happyOut106 happy_x_3 of { happy_var_3 -> - ( withNodeInfo happy_var_2 $ CBinary CLeOp happy_var_1 happy_var_3)}}}- ) (\r -> happyReturn (happyIn107 r))--happyReduce_400 = happyMonadReduce 3# 100# happyReduction_400-happyReduction_400 (happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut107 happy_x_1 of { happy_var_1 -> - case happyOutTok happy_x_2 of { happy_var_2 -> - case happyOut106 happy_x_3 of { happy_var_3 -> - ( withNodeInfo happy_var_2 $ CBinary CGrOp happy_var_1 happy_var_3)}}}- ) (\r -> happyReturn (happyIn107 r))--happyReduce_401 = happyMonadReduce 3# 100# happyReduction_401-happyReduction_401 (happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut107 happy_x_1 of { happy_var_1 -> - case happyOutTok happy_x_2 of { happy_var_2 -> - case happyOut106 happy_x_3 of { happy_var_3 -> - ( withNodeInfo happy_var_2 $ CBinary CLeqOp happy_var_1 happy_var_3)}}}- ) (\r -> happyReturn (happyIn107 r))--happyReduce_402 = happyMonadReduce 3# 100# happyReduction_402-happyReduction_402 (happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut107 happy_x_1 of { happy_var_1 -> - case happyOutTok happy_x_2 of { happy_var_2 -> - case happyOut106 happy_x_3 of { happy_var_3 -> - ( withNodeInfo happy_var_2 $ CBinary CGeqOp happy_var_1 happy_var_3)}}}- ) (\r -> happyReturn (happyIn107 r))--happyReduce_403 = happySpecReduce_1 101# happyReduction_403-happyReduction_403 happy_x_1- = case happyOut107 happy_x_1 of { happy_var_1 -> - happyIn108- (happy_var_1- )}--happyReduce_404 = happyMonadReduce 3# 101# happyReduction_404-happyReduction_404 (happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut108 happy_x_1 of { happy_var_1 -> - case happyOutTok happy_x_2 of { happy_var_2 -> - case happyOut107 happy_x_3 of { happy_var_3 -> - ( withNodeInfo happy_var_2 $ CBinary CEqOp happy_var_1 happy_var_3)}}}- ) (\r -> happyReturn (happyIn108 r))--happyReduce_405 = happyMonadReduce 3# 101# happyReduction_405-happyReduction_405 (happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut108 happy_x_1 of { happy_var_1 -> - case happyOutTok happy_x_2 of { happy_var_2 -> - case happyOut107 happy_x_3 of { happy_var_3 -> - ( withNodeInfo happy_var_2 $ CBinary CNeqOp happy_var_1 happy_var_3)}}}- ) (\r -> happyReturn (happyIn108 r))--happyReduce_406 = happySpecReduce_1 102# happyReduction_406-happyReduction_406 happy_x_1- = case happyOut108 happy_x_1 of { happy_var_1 -> - happyIn109- (happy_var_1- )}--happyReduce_407 = happyMonadReduce 3# 102# happyReduction_407-happyReduction_407 (happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut109 happy_x_1 of { happy_var_1 -> - case happyOutTok happy_x_2 of { happy_var_2 -> - case happyOut108 happy_x_3 of { happy_var_3 -> - ( withNodeInfo happy_var_2 $ CBinary CAndOp happy_var_1 happy_var_3)}}}- ) (\r -> happyReturn (happyIn109 r))--happyReduce_408 = happySpecReduce_1 103# happyReduction_408-happyReduction_408 happy_x_1- = case happyOut109 happy_x_1 of { happy_var_1 -> - happyIn110- (happy_var_1- )}--happyReduce_409 = happyMonadReduce 3# 103# happyReduction_409-happyReduction_409 (happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut110 happy_x_1 of { happy_var_1 -> - case happyOutTok happy_x_2 of { happy_var_2 -> - case happyOut109 happy_x_3 of { happy_var_3 -> - ( withNodeInfo happy_var_2 $ CBinary CXorOp happy_var_1 happy_var_3)}}}- ) (\r -> happyReturn (happyIn110 r))--happyReduce_410 = happySpecReduce_1 104# happyReduction_410-happyReduction_410 happy_x_1- = case happyOut110 happy_x_1 of { happy_var_1 -> - happyIn111- (happy_var_1- )}--happyReduce_411 = happyMonadReduce 3# 104# happyReduction_411-happyReduction_411 (happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut111 happy_x_1 of { happy_var_1 -> - case happyOutTok happy_x_2 of { happy_var_2 -> - case happyOut110 happy_x_3 of { happy_var_3 -> - ( withNodeInfo happy_var_2 $ CBinary COrOp happy_var_1 happy_var_3)}}}- ) (\r -> happyReturn (happyIn111 r))--happyReduce_412 = happySpecReduce_1 105# happyReduction_412-happyReduction_412 happy_x_1- = case happyOut111 happy_x_1 of { happy_var_1 -> - happyIn112- (happy_var_1- )}--happyReduce_413 = happyMonadReduce 3# 105# happyReduction_413-happyReduction_413 (happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut112 happy_x_1 of { happy_var_1 -> - case happyOutTok happy_x_2 of { happy_var_2 -> - case happyOut111 happy_x_3 of { happy_var_3 -> - ( withNodeInfo happy_var_2 $ CBinary CLndOp happy_var_1 happy_var_3)}}}- ) (\r -> happyReturn (happyIn112 r))--happyReduce_414 = happySpecReduce_1 106# happyReduction_414-happyReduction_414 happy_x_1- = case happyOut112 happy_x_1 of { happy_var_1 -> - happyIn113- (happy_var_1- )}--happyReduce_415 = happyMonadReduce 3# 106# happyReduction_415-happyReduction_415 (happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut113 happy_x_1 of { happy_var_1 -> - case happyOutTok happy_x_2 of { happy_var_2 -> - case happyOut112 happy_x_3 of { happy_var_3 -> - ( withNodeInfo happy_var_2 $ CBinary CLorOp happy_var_1 happy_var_3)}}}- ) (\r -> happyReturn (happyIn113 r))--happyReduce_416 = happySpecReduce_1 107# happyReduction_416-happyReduction_416 happy_x_1- = case happyOut113 happy_x_1 of { happy_var_1 -> - happyIn114- (happy_var_1- )}--happyReduce_417 = happyMonadReduce 5# 107# happyReduction_417-happyReduction_417 (happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut113 happy_x_1 of { happy_var_1 -> - case happyOutTok happy_x_2 of { happy_var_2 -> - case happyOut117 happy_x_3 of { happy_var_3 -> - case happyOut114 happy_x_5 of { happy_var_5 -> - ( withNodeInfo happy_var_2 $ CCond happy_var_1 (Just happy_var_3) happy_var_5)}}}}- ) (\r -> happyReturn (happyIn114 r))--happyReduce_418 = happyMonadReduce 4# 107# happyReduction_418-happyReduction_418 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut113 happy_x_1 of { happy_var_1 -> - case happyOutTok happy_x_2 of { happy_var_2 -> - case happyOut114 happy_x_4 of { happy_var_4 -> - ( withNodeInfo happy_var_2 $ CCond happy_var_1 Nothing happy_var_4)}}}- ) (\r -> happyReturn (happyIn114 r))--happyReduce_419 = happySpecReduce_1 108# happyReduction_419-happyReduction_419 happy_x_1- = case happyOut114 happy_x_1 of { happy_var_1 -> - happyIn115- (happy_var_1- )}--happyReduce_420 = happyMonadReduce 3# 108# happyReduction_420-happyReduction_420 (happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut101 happy_x_1 of { happy_var_1 -> - case happyOut116 happy_x_2 of { happy_var_2 -> - case happyOut115 happy_x_3 of { happy_var_3 -> - ( withNodeInfo happy_var_2 $ CAssign (unL happy_var_2) happy_var_1 happy_var_3)}}}- ) (\r -> happyReturn (happyIn115 r))--happyReduce_421 = happySpecReduce_1 109# happyReduction_421-happyReduction_421 happy_x_1- = case happyOutTok happy_x_1 of { happy_var_1 -> - happyIn116- (L CAssignOp (posOf happy_var_1)- )}--happyReduce_422 = happySpecReduce_1 109# happyReduction_422-happyReduction_422 happy_x_1- = case happyOutTok happy_x_1 of { happy_var_1 -> - happyIn116- (L CMulAssOp (posOf happy_var_1)- )}--happyReduce_423 = happySpecReduce_1 109# happyReduction_423-happyReduction_423 happy_x_1- = case happyOutTok happy_x_1 of { happy_var_1 -> - happyIn116- (L CDivAssOp (posOf happy_var_1)- )}--happyReduce_424 = happySpecReduce_1 109# happyReduction_424-happyReduction_424 happy_x_1- = case happyOutTok happy_x_1 of { happy_var_1 -> - happyIn116- (L CRmdAssOp (posOf happy_var_1)- )}--happyReduce_425 = happySpecReduce_1 109# happyReduction_425-happyReduction_425 happy_x_1- = case happyOutTok happy_x_1 of { happy_var_1 -> - happyIn116- (L CAddAssOp (posOf happy_var_1)- )}--happyReduce_426 = happySpecReduce_1 109# happyReduction_426-happyReduction_426 happy_x_1- = case happyOutTok happy_x_1 of { happy_var_1 -> - happyIn116- (L CSubAssOp (posOf happy_var_1)- )}--happyReduce_427 = happySpecReduce_1 109# happyReduction_427-happyReduction_427 happy_x_1- = case happyOutTok happy_x_1 of { happy_var_1 -> - happyIn116- (L CShlAssOp (posOf happy_var_1)- )}--happyReduce_428 = happySpecReduce_1 109# happyReduction_428-happyReduction_428 happy_x_1- = case happyOutTok happy_x_1 of { happy_var_1 -> - happyIn116- (L CShrAssOp (posOf happy_var_1)- )}--happyReduce_429 = happySpecReduce_1 109# happyReduction_429-happyReduction_429 happy_x_1- = case happyOutTok happy_x_1 of { happy_var_1 -> - happyIn116- (L CAndAssOp (posOf happy_var_1)- )}--happyReduce_430 = happySpecReduce_1 109# happyReduction_430-happyReduction_430 happy_x_1- = case happyOutTok happy_x_1 of { happy_var_1 -> - happyIn116- (L CXorAssOp (posOf happy_var_1)- )}--happyReduce_431 = happySpecReduce_1 109# happyReduction_431-happyReduction_431 happy_x_1- = case happyOutTok happy_x_1 of { happy_var_1 -> - happyIn116- (L COrAssOp (posOf happy_var_1)- )}--happyReduce_432 = happySpecReduce_1 110# happyReduction_432-happyReduction_432 happy_x_1- = case happyOut115 happy_x_1 of { happy_var_1 -> - happyIn117- (happy_var_1- )}--happyReduce_433 = happyMonadReduce 3# 110# happyReduction_433-happyReduction_433 (happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut115 happy_x_1 of { happy_var_1 -> - case happyOut118 happy_x_3 of { happy_var_3 -> - ( let es = reverse happy_var_3 in withNodeInfo es $ CComma (happy_var_1:es))}}- ) (\r -> happyReturn (happyIn117 r))--happyReduce_434 = happySpecReduce_1 111# happyReduction_434-happyReduction_434 happy_x_1- = case happyOut115 happy_x_1 of { happy_var_1 -> - happyIn118- (singleton happy_var_1- )}--happyReduce_435 = happySpecReduce_3 111# happyReduction_435-happyReduction_435 happy_x_3- happy_x_2- happy_x_1- = case happyOut118 happy_x_1 of { happy_var_1 -> - case happyOut115 happy_x_3 of { happy_var_3 -> - happyIn118- (happy_var_1 `snoc` happy_var_3- )}}--happyReduce_436 = happySpecReduce_0 112# happyReduction_436-happyReduction_436 = happyIn119- (Nothing- )--happyReduce_437 = happySpecReduce_1 112# happyReduction_437-happyReduction_437 happy_x_1- = case happyOut117 happy_x_1 of { happy_var_1 -> - happyIn119- (Just happy_var_1- )}--happyReduce_438 = happySpecReduce_0 113# happyReduction_438-happyReduction_438 = happyIn120- (Nothing- )--happyReduce_439 = happySpecReduce_1 113# happyReduction_439-happyReduction_439 happy_x_1- = case happyOut115 happy_x_1 of { happy_var_1 -> - happyIn120- (Just happy_var_1- )}--happyReduce_440 = happySpecReduce_1 114# happyReduction_440-happyReduction_440 happy_x_1- = case happyOut114 happy_x_1 of { happy_var_1 -> - happyIn121- (happy_var_1- )}--happyReduce_441 = happyMonadReduce 1# 115# happyReduction_441-happyReduction_441 (happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - ( withNodeInfo happy_var_1 $ case happy_var_1 of CTokILit _ i -> CIntConst i)}- ) (\r -> happyReturn (happyIn122 r))--happyReduce_442 = happyMonadReduce 1# 115# happyReduction_442-happyReduction_442 (happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - ( withNodeInfo happy_var_1 $ case happy_var_1 of CTokCLit _ c -> CCharConst c)}- ) (\r -> happyReturn (happyIn122 r))--happyReduce_443 = happyMonadReduce 1# 115# happyReduction_443-happyReduction_443 (happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - ( withNodeInfo happy_var_1 $ case happy_var_1 of CTokFLit _ f -> CFloatConst f)}- ) (\r -> happyReturn (happyIn122 r))--happyReduce_444 = happyMonadReduce 1# 116# happyReduction_444-happyReduction_444 (happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - ( withNodeInfo happy_var_1 $ case happy_var_1 of CTokSLit _ s -> CStrLit s)}- ) (\r -> happyReturn (happyIn123 r))--happyReduce_445 = happyMonadReduce 2# 116# happyReduction_445-happyReduction_445 (happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut124 happy_x_2 of { happy_var_2 -> - ( withNodeInfo happy_var_1 $ case happy_var_1 of CTokSLit _ s -> CStrLit (concatCStrings (s : reverse happy_var_2)))}}- ) (\r -> happyReturn (happyIn123 r))--happyReduce_446 = happySpecReduce_1 117# happyReduction_446-happyReduction_446 happy_x_1- = case happyOutTok happy_x_1 of { happy_var_1 -> - happyIn124- (case happy_var_1 of CTokSLit _ s -> singleton s- )}--happyReduce_447 = happySpecReduce_2 117# happyReduction_447-happyReduction_447 happy_x_2- happy_x_1- = case happyOut124 happy_x_1 of { happy_var_1 -> - case happyOutTok happy_x_2 of { happy_var_2 -> - happyIn124- (case happy_var_2 of CTokSLit _ s -> happy_var_1 `snoc` s- )}}--happyReduce_448 = happySpecReduce_1 118# happyReduction_448-happyReduction_448 happy_x_1- = case happyOutTok happy_x_1 of { (CTokIdent _ happy_var_1) -> - happyIn125- (happy_var_1- )}--happyReduce_449 = happySpecReduce_1 118# happyReduction_449-happyReduction_449 happy_x_1- = case happyOutTok happy_x_1 of { (CTokTyIdent _ happy_var_1) -> - happyIn125- (happy_var_1- )}--happyReduce_450 = happySpecReduce_0 119# happyReduction_450-happyReduction_450 = happyIn126- ([]- )--happyReduce_451 = happySpecReduce_1 119# happyReduction_451-happyReduction_451 happy_x_1- = case happyOut127 happy_x_1 of { happy_var_1 -> - happyIn126- (happy_var_1- )}--happyReduce_452 = happySpecReduce_1 120# happyReduction_452-happyReduction_452 happy_x_1- = case happyOut128 happy_x_1 of { happy_var_1 -> - happyIn127- (happy_var_1- )}--happyReduce_453 = happySpecReduce_2 120# happyReduction_453-happyReduction_453 happy_x_2- happy_x_1- = case happyOut127 happy_x_1 of { happy_var_1 -> - case happyOut128 happy_x_2 of { happy_var_2 -> - happyIn127- (happy_var_1 ++ happy_var_2- )}}--happyReduce_454 = happyReduce 6# 121# happyReduction_454-happyReduction_454 (happy_x_6 `HappyStk`- happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOut129 happy_x_4 of { happy_var_4 -> - happyIn128- (reverse happy_var_4- ) `HappyStk` happyRest}--happyReduce_455 = happySpecReduce_1 122# happyReduction_455-happyReduction_455 happy_x_1- = case happyOut130 happy_x_1 of { happy_var_1 -> - happyIn129- (case happy_var_1 of Nothing -> empty; Just attr -> singleton attr- )}--happyReduce_456 = happySpecReduce_3 122# happyReduction_456-happyReduction_456 happy_x_3- happy_x_2- happy_x_1- = case happyOut129 happy_x_1 of { happy_var_1 -> - case happyOut130 happy_x_3 of { happy_var_3 -> - happyIn129- ((maybe id (flip snoc) happy_var_3) happy_var_1- )}}--happyReduce_457 = happySpecReduce_0 123# happyReduction_457-happyReduction_457 = happyIn130- (Nothing- )--happyReduce_458 = happyMonadReduce 1# 123# happyReduction_458-happyReduction_458 (happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { (CTokIdent _ happy_var_1) -> - ( withNodeInfo happy_var_1 $ Just . CAttr happy_var_1 [])}- ) (\r -> happyReturn (happyIn130 r))--happyReduce_459 = happyMonadReduce 1# 123# happyReduction_459-happyReduction_459 (happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - ( withNodeInfo happy_var_1 $ Just . CAttr (internalIdent "const") [])}- ) (\r -> happyReturn (happyIn130 r))--happyReduce_460 = happyMonadReduce 4# 123# happyReduction_460-happyReduction_460 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { (CTokIdent _ happy_var_1) -> - case happyOut131 happy_x_3 of { happy_var_3 -> - ( withNodeInfo happy_var_1 $ Just . CAttr happy_var_1 (reverse happy_var_3))}}- ) (\r -> happyReturn (happyIn130 r))--happyReduce_461 = happyMonadReduce 3# 123# happyReduction_461-happyReduction_461 (happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { (CTokIdent _ happy_var_1) -> - ( withNodeInfo happy_var_1 $ Just . CAttr happy_var_1 [])}- ) (\r -> happyReturn (happyIn130 r))--happyReduce_462 = happySpecReduce_1 124# happyReduction_462-happyReduction_462 happy_x_1- = case happyOut121 happy_x_1 of { happy_var_1 -> - happyIn131- (singleton happy_var_1- )}--happyReduce_463 = happySpecReduce_3 124# happyReduction_463-happyReduction_463 happy_x_3- happy_x_2- happy_x_1- = case happyOut131 happy_x_1 of { happy_var_1 -> - case happyOut121 happy_x_3 of { happy_var_3 -> - happyIn131- (happy_var_1 `snoc` happy_var_3- )}}--happyNewToken action sts stk- = lexC(\tk -> - let cont i = happyDoAction i tk action sts stk in- case tk of {- CTokEof -> happyDoAction 101# tk action sts stk;- CTokLParen _ -> cont 1#;- CTokRParen _ -> cont 2#;- CTokLBracket _ -> cont 3#;- CTokRBracket _ -> cont 4#;- CTokArrow _ -> cont 5#;- CTokDot _ -> cont 6#;- CTokExclam _ -> cont 7#;- CTokTilde _ -> cont 8#;- CTokInc _ -> cont 9#;- CTokDec _ -> cont 10#;- CTokPlus _ -> cont 11#;- CTokMinus _ -> cont 12#;- CTokStar _ -> cont 13#;- CTokSlash _ -> cont 14#;- CTokPercent _ -> cont 15#;- CTokAmper _ -> cont 16#;- CTokShiftL _ -> cont 17#;- CTokShiftR _ -> cont 18#;- CTokLess _ -> cont 19#;- CTokLessEq _ -> cont 20#;- CTokHigh _ -> cont 21#;- CTokHighEq _ -> cont 22#;- CTokEqual _ -> cont 23#;- CTokUnequal _ -> cont 24#;- CTokHat _ -> cont 25#;- CTokBar _ -> cont 26#;- CTokAnd _ -> cont 27#;- CTokOr _ -> cont 28#;- CTokQuest _ -> cont 29#;- CTokColon _ -> cont 30#;- CTokAssign _ -> cont 31#;- CTokPlusAss _ -> cont 32#;- CTokMinusAss _ -> cont 33#;- CTokStarAss _ -> cont 34#;- CTokSlashAss _ -> cont 35#;- CTokPercAss _ -> cont 36#;- CTokAmpAss _ -> cont 37#;- CTokHatAss _ -> cont 38#;- CTokBarAss _ -> cont 39#;- CTokSLAss _ -> cont 40#;- CTokSRAss _ -> cont 41#;- CTokComma _ -> cont 42#;- CTokSemic _ -> cont 43#;- CTokLBrace _ -> cont 44#;- CTokRBrace _ -> cont 45#;- CTokEllipsis _ -> cont 46#;- CTokAlignof _ -> cont 47#;- CTokAsm _ -> cont 48#;- CTokAuto _ -> cont 49#;- CTokBreak _ -> cont 50#;- CTokBool _ -> cont 51#;- CTokCase _ -> cont 52#;- CTokChar _ -> cont 53#;- CTokConst _ -> cont 54#;- CTokContinue _ -> cont 55#;- CTokComplex _ -> cont 56#;- CTokDefault _ -> cont 57#;- CTokDo _ -> cont 58#;- CTokDouble _ -> cont 59#;- CTokElse _ -> cont 60#;- CTokEnum _ -> cont 61#;- CTokExtern _ -> cont 62#;- CTokFloat _ -> cont 63#;- CTokFor _ -> cont 64#;- CTokGoto _ -> cont 65#;- CTokIf _ -> cont 66#;- CTokInline _ -> cont 67#;- CTokInt _ -> cont 68#;- CTokLong _ -> cont 69#;- CTokLabel _ -> cont 70#;- CTokRegister _ -> cont 71#;- CTokRestrict _ -> cont 72#;- CTokReturn _ -> cont 73#;- CTokShort _ -> cont 74#;- CTokSigned _ -> cont 75#;- CTokSizeof _ -> cont 76#;- CTokStatic _ -> cont 77#;- CTokStruct _ -> cont 78#;- CTokSwitch _ -> cont 79#;- CTokTypedef _ -> cont 80#;- CTokTypeof _ -> cont 81#;- CTokThread _ -> cont 82#;- CTokUnion _ -> cont 83#;- CTokUnsigned _ -> cont 84#;- CTokVoid _ -> cont 85#;- CTokVolatile _ -> cont 86#;- CTokWhile _ -> cont 87#;- CTokCLit _ _ -> cont 88#;- CTokILit _ _ -> cont 89#;- CTokFLit _ _ -> cont 90#;- CTokSLit _ _ -> cont 91#;- CTokIdent _ happy_dollar_dollar -> cont 92#;- CTokTyIdent _ happy_dollar_dollar -> cont 93#;- CTokGnuC GnuCAttrTok _ -> cont 94#;- CTokGnuC GnuCExtTok _ -> cont 95#;- CTokGnuC GnuCComplexReal _ -> cont 96#;- CTokGnuC GnuCComplexImag _ -> cont 97#;- CTokGnuC GnuCVaArg _ -> cont 98#;- CTokGnuC GnuCOffsetof _ -> cont 99#;- CTokGnuC GnuCTyCompat _ -> cont 100#;- _ -> happyError' tk- })--happyError_ tk = happyError' tk--happyThen :: () => P a -> (a -> P b) -> P b-happyThen = (>>=)-happyReturn :: () => a -> P a-happyReturn = (return)-happyThen1 = happyThen-happyReturn1 :: () => a -> P a-happyReturn1 = happyReturn-happyError' :: () => (CToken) -> P a-happyError' tk = (\token -> happyError) tk--translation_unit = happySomeParser where- happySomeParser = happyThen (happyParse 0#) (\x -> happyReturn (happyOut7 x))--external_declaration = happySomeParser where- happySomeParser = happyThen (happyParse 1#) (\x -> happyReturn (happyOut9 x))--statement = happySomeParser where- happySomeParser = happyThen (happyParse 2#) (\x -> happyReturn (happyOut12 x))--expression = happySomeParser where- happySomeParser = happyThen (happyParse 3#) (\x -> happyReturn (happyOut117 x))--happySeq = happyDontSeq----- sometimes it is neccessary to reverse an unreversed list-reverseList :: [a] -> Reversed [a]-reverseList = Reversed . List.reverse---- We occasionally need things to have a location when they don't naturally--- have one built in as tokens and most AST elements do.----data Located a = L !a !Position--unL :: Located a -> a-unL (L a pos) = a--instance Pos (Located a) where- posOf (L _ pos) = pos--{-# INLINE withNodeInfo #-}-withNodeInfo :: Pos node => node -> (NodeInfo -> a) -> P a-withNodeInfo node mkAttributedNode = do- name <- getNewName- let attrs = mkNodeInfo (posOf node) name- attrs `seq` return (mkAttributedNode attrs)--data CDeclrR = CDeclrR (Maybe Ident) (Reversed [CDerivedDeclr]) (Maybe CStrLit) [CAttr] NodeInfo-reverseDeclr :: CDeclrR -> CDeclr-reverseDeclr (CDeclrR ide reversedDDs asmname cattrs at)- = CDeclr ide (reverse reversedDDs) asmname cattrs at--{-# INLINE withAttribute #-}-withAttribute :: Pos node => node -> [CAttr] -> (NodeInfo -> CDeclrR) -> P CDeclrR-withAttribute node cattrs mkDeclrNode = do- name <- getNewName- let attrs = mkNodeInfo (posOf node) name- let newDeclr = appendDeclrAttrs cattrs $ mkDeclrNode attrs- attrs `seq` newDeclr `seq` return newDeclr---- postfixing variant-{-# INLINE withAttributePF #-}-withAttributePF :: Pos node => node -> [CAttr] -> (NodeInfo -> CDeclrR -> CDeclrR) -> P (CDeclrR -> CDeclrR)-withAttributePF node cattrs mkDeclrCtor = do- name <- getNewName- let attrs = mkNodeInfo (posOf node) name- let newDeclr = appendDeclrAttrs cattrs . mkDeclrCtor attrs- attrs `seq` newDeclr `seq` return newDeclr---- add top level attributes for a declarator.------ In the following example------ > int declr1, __attribute__((a1)) * __attribute__((a2)) y() __asm__("$" "y") __attribute__((a3));------ the attributes `a1' and `a3' are top-level attributes for y.--- The (pseudo)-AST for the second declarator is------ > CDeclr "y"--- > [CFunDeclr ..., CPtrDeclr __attribute__((a2)) ... ]--- > (asm "$y")--- > [__attribute__((a1)), __attribute__((a3)) ]------ So assembler names and preceeding and trailing attributes are recorded in object declarator.----appendObjAttrs :: [CAttr] -> CDeclr -> CDeclr-appendObjAttrs newAttrs (CDeclr ident indirections asmname cAttrs at)- = CDeclr ident indirections asmname (cAttrs ++ newAttrs) at-appendObjAttrsR :: [CAttr] -> CDeclrR -> CDeclrR-appendObjAttrsR newAttrs (CDeclrR ident indirections asmname cAttrs at)- = CDeclrR ident indirections asmname (cAttrs ++ newAttrs) at--setAsmName :: Maybe CStrLit -> CDeclrR -> P CDeclrR-setAsmName mAsmName (CDeclrR ident indirections oldName cattrs at) =- case combineName mAsmName oldName of- Left (n1,n2) -> failP (posOf n2) ["Duplicate assembler name: ",showName n1,showName n2]- Right newName -> return $ CDeclrR ident indirections newName cattrs at- where- combineName Nothing Nothing = Right Nothing- combineName Nothing oldname@(Just _) = Right oldname- combineName newname@(Just _) Nothing = Right newname- combineName (Just n1) (Just n2) = Left (n1,n2)- showName (CStrLit cstr _) = show cstr--withAsmNameAttrs :: (Maybe CStrLit, [CAttr]) -> CDeclrR -> P CDeclrR-withAsmNameAttrs (mAsmName, newAttrs) declr = setAsmName mAsmName (appendObjAttrsR newAttrs declr)--appendDeclrAttrs :: [CAttr] -> CDeclrR -> CDeclrR-appendDeclrAttrs newAttrs (CDeclrR ident (Reversed []) asmname cattrs at)- = CDeclrR ident empty asmname (cattrs ++ newAttrs) at-appendDeclrAttrs newAttrs (CDeclrR ident (Reversed (x:xs)) asmname cattrs at)- = CDeclrR ident (Reversed (appendAttrs x : xs)) asmname cattrs at where- appendAttrs (CPtrDeclr typeQuals at) = CPtrDeclr (typeQuals ++ map CAttrQual newAttrs) at- appendAttrs (CArrDeclr typeQuals arraySize at) = CArrDeclr (typeQuals ++ map CAttrQual newAttrs) arraySize at- appendAttrs (CFunDeclr parameters cattrs at) = CFunDeclr parameters (cattrs ++ newAttrs) at--ptrDeclr :: CDeclrR -> [CTypeQual] -> NodeInfo -> CDeclrR-ptrDeclr (CDeclrR ident derivedDeclrs asmname cattrs dat) tyquals at- = CDeclrR ident (derivedDeclrs `snoc` CPtrDeclr tyquals at) asmname cattrs dat-funDeclr :: CDeclrR -> (Either [Ident] ([CDecl],Bool)) -> [CAttr] -> NodeInfo -> CDeclrR-funDeclr (CDeclrR ident derivedDeclrs asmname dcattrs dat) params cattrs at- = CDeclrR ident (derivedDeclrs `snoc` CFunDeclr params cattrs at) asmname dcattrs dat-arrDeclr :: CDeclrR -> [CTypeQual] -> Bool -> Bool -> Maybe CExpr -> NodeInfo -> CDeclrR-arrDeclr (CDeclrR ident derivedDeclrs asmname cattrs dat) tyquals var_sized static_size size_expr_opt at- = arr_sz `seq` ( CDeclrR ident (derivedDeclrs `snoc` CArrDeclr tyquals arr_sz at) asmname cattrs dat )- where- arr_sz = case size_expr_opt of- Just e -> CArrSize static_size e- Nothing -> CNoArrSize var_sized--liftTypeQuals :: Reversed [CTypeQual] -> [CDeclSpec]-liftTypeQuals (Reversed tyqs) = revmap [] tyqs- where revmap a [] = a- revmap a (x:xs) = revmap (CTypeQual x : a) xs---- lift CAttrs to DeclSpecs----liftCAttrs :: [CAttr] -> [CDeclSpec]-liftCAttrs = map (CTypeQual . CAttrQual)---- when we parsed (decl_spec_1,...,decl_spec_n,attrs), add the __attributes__s to the declspec list--- needs special care when @decl_spec_n@ is a SUE definition-addTrailingAttrs :: Reversed [CDeclSpec] -> [CAttr] -> Reversed [CDeclSpec]-addTrailingAttrs declspecs new_attrs =- case viewr declspecs of- (specs_init, CTypeSpec (CSUType (CStruct tag name (Just def) def_attrs su_node) node))- -> (specs_init `snoc` CTypeSpec (CSUType (CStruct tag name (Just def) (def_attrs ++ new_attrs) su_node) node))- (specs_init, CTypeSpec (CEnumType (CEnum name (Just def) def_attrs e_node) node))- -> (specs_init `snoc` CTypeSpec (CEnumType (CEnum name (Just def) (def_attrs ++ new_attrs) e_node) node))- _ -> declspecs `rappend` (liftCAttrs new_attrs)---- convenient instance, the position of a list of things is the position of--- the first thing in the list----instance Pos a => Pos [a] where- posOf (x:_) = posOf x--instance Pos a => Pos (Reversed a) where- posOf (Reversed x) = posOf x--emptyDeclr = CDeclrR Nothing empty Nothing [] (mkNodeInfoOnlyPos nopos)-mkVarDeclr ident = CDeclrR (Just ident) empty Nothing []---- Take the identifiers and use them to update the typedef'ed identifier set--- if the decl is defining a typedef then we add it to the set,--- if it's a var decl then that shadows typedefed identifiers----doDeclIdent :: [CDeclSpec] -> CDeclrR -> P ()-doDeclIdent declspecs (CDeclrR mIdent _ _ _ _) =- case mIdent of- Nothing -> return ()- Just ident | any iypedef declspecs -> addTypedef ident- | otherwise -> shadowTypedef ident-- where iypedef (CStorageSpec (CTypedef _)) = True- iypedef _ = False--doFuncParamDeclIdent :: CDeclr -> P ()-doFuncParamDeclIdent (CDeclr _ (CFunDeclr params _ _ : _) _ _ _) =- sequence_- [ case getCDeclrIdent declr of- Nothing -> return ()- Just ident -> shadowTypedef ident- | CDecl _ dle _ <- either (const []) fst params- , (Just declr, _, _) <- dle ]-doFuncParamDeclIdent _ = return ()---- extract all identifiers-getCDeclrIdent :: CDeclr -> Maybe Ident-getCDeclrIdent (CDeclr mIdent _ _ _ _) = mIdent--happyError :: P a-happyError = parseError---- * public interface---- | @parseC input initialPos@ parses the given preprocessed C-source input and returns the AST or a list of parse errors.-parseC :: InputStream -> Position -> Either ParseError CTranslUnit-parseC input initialPosition =- fmap fst $ execParser translUnitP input initialPosition builtinTypeNames (namesStartingFrom 0)---- | @translUnitP@ provides a parser for a complete C translation unit, i.e. a list of external declarations.-translUnitP :: P CTranslUnit-translUnitP = translation_unit--- | @extDeclP@ provides a parser for an external (file-scope) declaration-extDeclP :: P CExtDecl-extDeclP = external_declaration--- | @statementP@ provides a parser for C statements-statementP :: P CStat-statementP = statement--- | @expressionP@ provides a parser for C expressions-expressionP :: P CExpr-expressionP = expression-{-# LINE 1 "templates/GenericTemplate.hs" #-}-{-# LINE 1 "templates/GenericTemplate.hs" #-}-{-# LINE 1 "<built-in>" #-}-{-# LINE 1 "<command line>" #-}-{-# LINE 1 "templates/GenericTemplate.hs" #-}--- Id: GenericTemplate.hs,v 1.26 2005/01/14 14:47:22 simonmar Exp --{-# LINE 28 "templates/GenericTemplate.hs" #-}---data Happy_IntList = HappyCons Happy_GHC_Exts.Int# Happy_IntList------{-# LINE 49 "templates/GenericTemplate.hs" #-}--{-# LINE 59 "templates/GenericTemplate.hs" #-}--{-# LINE 68 "templates/GenericTemplate.hs" #-}--infixr 9 `HappyStk`-data HappyStk a = HappyStk a (HappyStk a)---------------------------------------------------------------------------------- starting the parse--happyParse start_state = happyNewToken start_state notHappyAtAll notHappyAtAll---------------------------------------------------------------------------------- Accepting the parse---- If the current token is 0#, it means we've just accepted a partial--- parse (a %partial parser). We must ignore the saved token on the top of--- the stack in this case.-happyAccept 0# tk st sts (_ `HappyStk` ans `HappyStk` _) =- happyReturn1 ans-happyAccept j tk st sts (HappyStk ans _) = - (happyTcHack j (happyTcHack st)) (happyReturn1 ans)---------------------------------------------------------------------------------- Arrays only: do the next action----happyDoAction i tk st- = {- nothing -}--- case action of- 0# -> {- nothing -}- happyFail i tk st- -1# -> {- nothing -}- happyAccept i tk st- n | (n Happy_GHC_Exts.<# (0# :: Happy_GHC_Exts.Int#)) -> {- nothing -}-- (happyReduceArr Happy_Data_Array.! rule) i tk st- where rule = (Happy_GHC_Exts.I# ((Happy_GHC_Exts.negateInt# ((n Happy_GHC_Exts.+# (1# :: Happy_GHC_Exts.Int#))))))- n -> {- nothing -}--- happyShift new_state i tk st- where new_state = (n Happy_GHC_Exts.-# (1# :: Happy_GHC_Exts.Int#))- where off = indexShortOffAddr happyActOffsets st- off_i = (off Happy_GHC_Exts.+# i)- check = if (off_i Happy_GHC_Exts.>=# (0# :: Happy_GHC_Exts.Int#))- then (indexShortOffAddr happyCheck off_i Happy_GHC_Exts.==# i)- else False- action | check = indexShortOffAddr happyTable off_i- | otherwise = indexShortOffAddr happyDefActions st--{-# LINE 127 "templates/GenericTemplate.hs" #-}---indexShortOffAddr (HappyA# arr) off =-#if __GLASGOW_HASKELL__ > 500- Happy_GHC_Exts.narrow16Int# i-#elif __GLASGOW_HASKELL__ == 500- Happy_GHC_Exts.intToInt16# i-#else- Happy_GHC_Exts.iShiftRA# (Happy_GHC_Exts.iShiftL# i 16#) 16#-#endif- where-#if __GLASGOW_HASKELL__ >= 503- i = Happy_GHC_Exts.word2Int# (Happy_GHC_Exts.or# (Happy_GHC_Exts.uncheckedShiftL# high 8#) low)-#else- i = Happy_GHC_Exts.word2Int# (Happy_GHC_Exts.or# (Happy_GHC_Exts.shiftL# high 8#) low)-#endif- high = Happy_GHC_Exts.int2Word# (Happy_GHC_Exts.ord# (Happy_GHC_Exts.indexCharOffAddr# arr (off' Happy_GHC_Exts.+# 1#)))- low = Happy_GHC_Exts.int2Word# (Happy_GHC_Exts.ord# (Happy_GHC_Exts.indexCharOffAddr# arr off'))- off' = off Happy_GHC_Exts.*# 2#------data HappyAddr = HappyA# Happy_GHC_Exts.Addr#------------------------------------------------------------------------------------- HappyState data type (not arrays)--{-# LINE 170 "templates/GenericTemplate.hs" #-}---------------------------------------------------------------------------------- Shifting a token--happyShift new_state 0# tk st sts stk@(x `HappyStk` _) =- let i = (case Happy_GHC_Exts.unsafeCoerce# x of { (Happy_GHC_Exts.I# (i)) -> i }) in--- trace "shifting the error token" $- happyDoAction i tk new_state (HappyCons (st) (sts)) (stk)--happyShift new_state i tk st sts stk =- happyNewToken new_state (HappyCons (st) (sts)) ((happyInTok (tk))`HappyStk`stk)---- happyReduce is specialised for the common cases.--happySpecReduce_0 i fn 0# tk st sts stk- = happyFail 0# tk st sts stk-happySpecReduce_0 nt fn j tk st@((action)) sts stk- = happyGoto nt j tk st (HappyCons (st) (sts)) (fn `HappyStk` stk)--happySpecReduce_1 i fn 0# tk st sts stk- = happyFail 0# tk st sts stk-happySpecReduce_1 nt fn j tk _ sts@((HappyCons (st@(action)) (_))) (v1`HappyStk`stk')- = let r = fn v1 in- happySeq r (happyGoto nt j tk st sts (r `HappyStk` stk'))--happySpecReduce_2 i fn 0# tk st sts stk- = happyFail 0# tk st sts stk-happySpecReduce_2 nt fn j tk _ (HappyCons (_) (sts@((HappyCons (st@(action)) (_))))) (v1`HappyStk`v2`HappyStk`stk')- = let r = fn v1 v2 in- happySeq r (happyGoto nt j tk st sts (r `HappyStk` stk'))--happySpecReduce_3 i fn 0# tk st sts stk- = happyFail 0# tk st sts stk-happySpecReduce_3 nt fn j tk _ (HappyCons (_) ((HappyCons (_) (sts@((HappyCons (st@(action)) (_))))))) (v1`HappyStk`v2`HappyStk`v3`HappyStk`stk')- = let r = fn v1 v2 v3 in- happySeq r (happyGoto nt j tk st sts (r `HappyStk` stk'))--happyReduce k i fn 0# tk st sts stk- = happyFail 0# tk st sts stk-happyReduce k nt fn j tk st sts stk- = case happyDrop (k Happy_GHC_Exts.-# (1# :: Happy_GHC_Exts.Int#)) sts of- sts1@((HappyCons (st1@(action)) (_))) ->- let r = fn stk in -- it doesn't hurt to always seq here...- happyDoSeq r (happyGoto nt j tk st1 sts1 r)--happyMonadReduce k nt fn 0# tk st sts stk- = happyFail 0# tk st sts stk-happyMonadReduce k nt fn j tk st sts stk =- happyThen1 (fn stk tk) (\r -> happyGoto nt j tk st1 sts1 (r `HappyStk` drop_stk))- where sts1@((HappyCons (st1@(action)) (_))) = happyDrop k (HappyCons (st) (sts))- drop_stk = happyDropStk k stk--happyMonad2Reduce k nt fn 0# tk st sts stk- = happyFail 0# tk st sts stk-happyMonad2Reduce k nt fn j tk st sts stk =- happyThen1 (fn stk tk) (\r -> happyNewToken new_state sts1 (r `HappyStk` drop_stk))- where sts1@((HappyCons (st1@(action)) (_))) = happyDrop k (HappyCons (st) (sts))- drop_stk = happyDropStk k stk-- off = indexShortOffAddr happyGotoOffsets st1- off_i = (off Happy_GHC_Exts.+# nt)- new_state = indexShortOffAddr happyTable off_i-----happyDrop 0# l = l-happyDrop n (HappyCons (_) (t)) = happyDrop (n Happy_GHC_Exts.-# (1# :: Happy_GHC_Exts.Int#)) t--happyDropStk 0# l = l-happyDropStk n (x `HappyStk` xs) = happyDropStk (n Happy_GHC_Exts.-# (1#::Happy_GHC_Exts.Int#)) xs---------------------------------------------------------------------------------- Moving to a new state after a reduction---happyGoto nt j tk st = - {- nothing -}- happyDoAction j tk new_state- where off = indexShortOffAddr happyGotoOffsets st- off_i = (off Happy_GHC_Exts.+# nt)- new_state = indexShortOffAddr happyTable off_i------------------------------------------------------------------------------------- Error recovery (0# is the error token)---- parse error if we are in recovery and we fail again-happyFail 0# tk old_st _ stk =--- trace "failing" $ - happyError_ tk--{- We don't need state discarding for our restricted implementation of- "error". In fact, it can cause some bogus parses, so I've disabled it- for now --SDM---- discard a state-happyFail 0# tk old_st (HappyCons ((action)) (sts)) - (saved_tok `HappyStk` _ `HappyStk` stk) =--- trace ("discarding state, depth " ++ show (length stk)) $- happyDoAction 0# tk action sts ((saved_tok`HappyStk`stk))--}---- Enter error recovery: generate an error token,--- save the old token and carry on.-happyFail i tk (action) sts stk =--- trace "entering error recovery" $- happyDoAction 0# tk action sts ( (Happy_GHC_Exts.unsafeCoerce# (Happy_GHC_Exts.I# (i))) `HappyStk` stk)---- Internal happy errors:--notHappyAtAll = error "Internal Happy error\n"---------------------------------------------------------------------------------- Hack to get the typechecker to accept our action functions---happyTcHack :: Happy_GHC_Exts.Int# -> a -> a-happyTcHack x y = y-{-# INLINE happyTcHack #-}----------------------------------------------------------------------------------- Seq-ing. If the --strict flag is given, then Happy emits --- happySeq = happyDoSeq--- otherwise it emits--- happySeq = happyDontSeq--happyDoSeq, happyDontSeq :: a -> b -> b-happyDoSeq a b = a `seq` b-happyDontSeq a b = b---------------------------------------------------------------------------------- Don't inline any functions from the template. GHC has a nasty habit--- of deciding to inline happyGoto everywhere, which increases the size of--- the generated parser quite a bit.---{-# NOINLINE happyDoAction #-}-{-# NOINLINE happyTable #-}-{-# NOINLINE happyCheck #-}-{-# NOINLINE happyActOffsets #-}-{-# NOINLINE happyGotoOffsets #-}-{-# NOINLINE happyDefActions #-}--{-# NOINLINE happyShift #-}-{-# NOINLINE happySpecReduce_0 #-}-{-# NOINLINE happySpecReduce_1 #-}-{-# NOINLINE happySpecReduce_2 #-}-{-# NOINLINE happySpecReduce_3 #-}-{-# NOINLINE happyReduce #-}-{-# NOINLINE happyMonadReduce #-}-{-# NOINLINE happyGoto #-}-{-# NOINLINE happyFail #-}---- end of Happy Template.
language-c.cabal view
@@ -1,97 +1,125 @@-Name: language-c-Version: 0.3.2.1-Cabal-Version: >= 1.2.3-Build-Type: Simple-License: BSD3-License-File: LICENSE-Copyright: LICENSE-Author: AUTHORS-Maintainer: benedikt.huber@gmail.com-Stability: experimental-Homepage: http://www.sivity.net/projects/language.c/-Bug-reports: http://www.sivity.net/projects/language.c/-Synopsis: Analysis and generation of C code-Description: Language C is a haskell library for the analysis and generation of C code.- It features a complete, well tested parser and pretty printer for all of C99 and a large- set of GNU extensions.-Category: Language+cabal-version: 2.2+name: language-c+version: 0.10.2+license: BSD-3-Clause+license-file: LICENSE+copyright: LICENSE+maintainer: language.c@monoid.al+author: AUTHORS+tested-with:+ ghc ==9.14.1 ghc ==9.12.2 ghc ==9.10.3 ghc ==9.8.4 ghc ==9.6.7+ ghc ==9.4.8 ghc ==9.2.8 ghc ==9.0.2 ghc ==8.10.7 ghc ==8.8.4+ ghc ==8.6.5 ghc ==8.4.4 ghc ==8.2.2 ghc ==8.0.2 -Extra-Source-Files: AUTHORS AUTHORS.c2hs ChangeLog README- src/Language/C/Parser/Lexer.x- src/Language/C/Parser/Parser.y-Flag splitBase- Description: Choose the new smaller, split-up base package.-Flag useByteStrings- Description: Use ByteString as InputStream datatype- Default: True-Flag separateSYB- description: Data.Generics available in separate package.+homepage: https://visq.github.io/language-c/+bug-reports: https://github.com/visq/language-c/issues/+synopsis: Analysis and generation of C code+description:+ Language C is a Haskell library for the analysis and generation of C code.+ It features a complete, well tested parser and pretty printer for all of C99 and a large+ set of C11 and clang/GNU extensions. -Library- Extensions: CPP, DeriveDataTypeable, PatternGuards, BangPatterns, ExistentialQuantification, GeneralizedNewtypeDeriving, ScopedTypeVariables- Build-Depends: filepath+category: Language+build-type: Simple+extra-doc-files:+ ChangeLog.md+ README.md+ AUTHORS+ AUTHORS.c2hs - if flag(splitBase)- Build-Depends: base >= 3 && < 5, process, directory, array, containers, pretty+source-repository head+ type: git+ location: https://github.com/visq/language-c.git - If flag(separateSYB)- Build-Depends:- base >=4 && <5,- syb- Else- Build-Depends:- base <4- else- Build-Depends: base < 3+flag usebytestrings+ description: Use ByteString as InputStream datatype+ manual: True - if flag(useByteStrings)- Build-Depends: bytestring >= 0.9.0+flag iecfpextension+ description:+ Support IEC 60559 floating point extension (defines _Float128)++ manual: True++library+ exposed-modules:+ Language.C+ Language.C.Data+ Language.C.Data.Position+ Language.C.Data.Ident+ Language.C.Data.Error+ Language.C.Data.Name+ Language.C.Data.Node+ Language.C.Data.InputStream+ Language.C.Syntax+ Language.C.Syntax.AST+ Language.C.Syntax.Constants+ Language.C.Syntax.Ops+ Language.C.Syntax.Utils+ Language.C.Parser+ Language.C.Pretty+ Language.C.System.Preprocess+ Language.C.System.GCC+ Language.C.Analysis+ Language.C.Analysis.ConstEval+ Language.C.Analysis.Builtins+ Language.C.Analysis.SemError+ Language.C.Analysis.SemRep+ Language.C.Analysis.DefTable+ Language.C.Analysis.TravMonad+ Language.C.Analysis.AstAnalysis+ Language.C.Analysis.DeclAnalysis+ Language.C.Analysis.Debug+ Language.C.Analysis.TypeCheck+ Language.C.Analysis.TypeConversions+ Language.C.Analysis.TypeUtils+ Language.C.Analysis.NameSpaceMap+ Language.C.Analysis.MachineDescs+ Language.C.Analysis.Export++ build-tool-depends: happy:happy, alex:alex+ hs-source-dirs: src+ other-modules:+ Language.C.Data.RList+ Language.C.Parser.Builtin+ Language.C.Parser.Lexer+ Language.C.Parser.ParserMonad+ Language.C.Parser.Tokens+ Language.C.Parser.Parser++ default-language: Haskell2010+ default-extensions:+ CPP DeriveDataTypeable DeriveGeneric PatternGuards BangPatterns+ ExistentialQuantification GeneralizedNewtypeDeriving+ ScopedTypeVariables++ ghc-options: -Wall -Wno-redundant-constraints+ build-depends:+ base >=4.9 && <5,+ array <0.6,+ containers >=0.3 && <0.9,+ deepseq >=1.4.0.0 && <1.6,+ directory <1.4,+ filepath <1.6,+ mtl <2.4,+ pretty <1.2,+ process <1.7++ if flag(usebytestrings)+ build-depends: bytestring >=0.9.0 && <0.13+ else cpp-options: -DNO_BYTESTRING- Build-Tools: happy, alex - Hs-Source-Dirs: src- Exposed-Modules:- -- top-level- Language.C- -- data- Language.C.Data- Language.C.Data.Position- Language.C.Data.Ident- Language.C.Data.Error- Language.C.Data.Name- Language.C.Data.Node- Language.C.Data.InputStream- -- syntax- Language.C.Syntax- Language.C.Syntax.AST- Language.C.Syntax.Constants- Language.C.Syntax.Ops- -- parser- Language.C.Parser- -- pretty printer- Language.C.Pretty- -- system- Language.C.System.Preprocess- Language.C.System.GCC- -- analysis [experimental]- Language.C.Analysis- Language.C.Analysis.SemError- Language.C.Analysis.SemRep- Language.C.Analysis.DefTable- Language.C.Analysis.TravMonad- Language.C.Analysis.AstAnalysis- Language.C.Analysis.DeclAnalysis- Language.C.Analysis.Debug- -- semrep -> code [alpha]- Language.C.Analysis.Export- Other-Modules:- Language.C.Analysis.NameSpaceMap- Language.C.Data.RList- -- parser implementation- Language.C.Parser.Builtin- Language.C.Parser.Lexer- Language.C.Parser.ParserMonad- Language.C.Parser.Tokens- Language.C.Parser.Parser+ if flag(iecfpextension)+ cpp-options: -DIEC_60559_TYPES_EXT +test-suite language-c-harness+ type: exitcode-stdio-1.0+ main-is: test/harness/run-harness.hs+ default-language: Haskell2010+ build-depends:+ base <5,+ directory,+ process,+ filepath
src/Language/C.hs view
@@ -29,11 +29,11 @@ import Language.C.Parser import Language.C.System.Preprocess --- | preprocess (if neccessary) and parse a C source file+-- | preprocess (if necessary) and parse a C source file -- -- > Synopsis: parseCFile preprocesssor tmp-dir? cpp-opts file -- > Example: parseCFile (newGCC "gcc") Nothing ["-I/usr/include/gtk-2.0"] my-gtk-exts.c-parseCFile :: (Preprocessor cpp) => cpp -> (Maybe FilePath) -> [String] -> FilePath -> IO (Either ParseError CTranslUnit)+parseCFile :: (Preprocessor cpp) => cpp -> Maybe FilePath -> [String] -> FilePath -> IO (Either ParseError CTranslUnit) parseCFile cpp tmp_dir_opt args input_file = do input_stream <- if not (isPreprocessed input_file) then let cpp_args = (rawCppArgs args input_file) { cppTmpDir = tmp_dir_opt }
src/Language/C/Analysis.hs view
@@ -61,7 +61,6 @@ import Language.C.Analysis.SemError import Language.C.Analysis.SemRep -import Language.C.Analysis.DefTable import Language.C.Analysis.TravMonad import Language.C.Analysis.AstAnalysis
src/Language/C/Analysis/AstAnalysis.hs view
@@ -1,4 +1,5 @@ {-# LANGUAGE ScopedTypeVariables, PatternGuards #-}+{-# OPTIONS_GHC -Wwarn=incomplete-patterns #-} ----------------------------------------------------------------------------- -- | -- Module : Language.C.Parser.Translation@@ -13,28 +14,44 @@ -- Traverses the AST, analyses declarations and invokes handlers. ----------------------------------------------------------------------------- module Language.C.Analysis.AstAnalysis (+ -- * Top-level analysis analyseAST,- analyseExt,analyseFunDef,analyseExtDecls,+ analyseExt,analyseFunDef,analyseDecl,+ -- * Building blocks for additional analyses+ analyseFunctionBody,+ defineParams,+ -- * Type checking+ tExpr, ExprSide(..),+ tStmt, StmtCtx(..),+ tDesignator,+ defaultMD ) where import Language.C.Analysis.SemError import Language.C.Analysis.SemRep import Language.C.Analysis.TravMonad-import Language.C.Analysis.DefTable+import Language.C.Analysis.ConstEval+import Language.C.Analysis.DefTable (globalDefs, defineLabel, inFileScope,+ lookupLabel, insertType, lookupType) import Language.C.Analysis.DeclAnalysis+import Language.C.Analysis.TypeUtils+import Language.C.Analysis.TypeCheck import Language.C.Data-import Language.C.Syntax+import Language.C.Pretty+import Language.C.Syntax.AST+import Language.C.Syntax.Constants+import Language.C.Syntax.Ops+import Language.C.Syntax.Utils+import Text.PrettyPrint.HughesPJ -import Control.Monad-import Prelude hiding (reverse)-import Data.Foldable (foldrM)-import Data.List hiding (reverse)-import Data.Maybe-import Data.Map (Map)-import qualified Data.Map as Map-import Debug.Trace +import Prelude hiding (mapM, mapM_, reverse)+import Control.Monad hiding (mapM, mapM_)+import qualified Data.Map as Map+import Data.Maybe+import Data.Traversable (mapM)+import Data.Foldable (mapM_) -- * analysis @@ -45,54 +62,72 @@ -- callbacks in the @MonadTrav@ @m@. -- -- Returns the set of global declarations and definitions which where successfully translated.--- It is the users responsibility to check whether any hard errors occured (@runTrav@ does this for you).+-- It is the users responsibility to check whether any hard errors occurred (@runTrav@ does this for you). analyseAST :: (MonadTrav m) => CTranslUnit -> m GlobalDecls analyseAST (CTranslUnit decls _file_node) = do+ -- analyse all declarations, but recover from errors mapRecoverM_ analyseExt decls+ -- check we are in global scope afterwards+ getDefTable >>= \dt -> unless (inFileScope dt) $+ error "Internal Error: Not in filescope after analysis"+ -- get the global definition table (XXX: remove ?) liftM globalDefs getDefTable where mapRecoverM_ f = mapM_ (handleTravError . f) -- | Analyse an top-level declaration analyseExt :: (MonadTrav m) => CExtDecl -> m ()-analyseExt (CAsmExt asm)+analyseExt (CAsmExt asm _) = handleAsmBlock asm analyseExt (CFDefExt fundef) = analyseFunDef fundef-analyseExt (CDeclExt decls)- = analyseExtDecls decls+analyseExt (CDeclExt decl)+ = analyseDecl False decl -- | Analyse a function definition analyseFunDef :: (MonadTrav m) => CFunDef -> m () analyseFunDef (CFunDef declspecs declr oldstyle_decls stmt node_info) = do -- analyse the declarator- var_decl_info <- analyseVarDecl True declspecs declr oldstyle_decls- let (VarDeclInfo name is_inline storage_spec attrs ty declr_node) = var_decl_info+ var_decl_info <- analyseVarDecl' True declspecs declr oldstyle_decls Nothing+ let (VarDeclInfo name fun_spec storage_spec attrs ty _declr_node) = var_decl_info+ when (isNoName name) $ astError node_info "NoName in analyseFunDef" let ident = identOfVarName name- -- compute storage- fun_storage <- computeFunDefStorage ident storage_spec- let var_decl = VarDecl name (DeclAttrs is_inline fun_storage attrs) ty -- improve incomplete type ty' <- improveFunDefType ty- -- callback- handleVarDecl (Decl var_decl node_info)- -- translate the body- stmt' <- analyseFunctionBody var_decl stmt- -- define the function+ -- compute storage+ fun_storage <- computeFunDefStorage ident storage_spec+ let var_decl = VarDecl name (DeclAttrs fun_spec fun_storage attrs) ty'+ -- callback for declaration+ handleVarDecl False (Decl var_decl node_info)+ -- process body+ stmt' <- analyseFunctionBody node_info var_decl stmt+ -- callback for definition handleFunDef ident (FunDef var_decl stmt' node_info) where- improveFunDefType (FunctionType (FunTypeIncomplete return_ty attrs)) =- return . FunctionType $ FunType return_ty [] False attrs- improveFunDefType ty = return $ ty+ improveFunDefType (FunctionType (FunTypeIncomplete return_ty) attrs) =+ return $ FunctionType (FunType return_ty [] False) attrs+ improveFunDefType ty = return ty --- | Analyse a top-level declaration other than a function definition-analyseExtDecls :: (MonadTrav m) => CDecl -> m ()-analyseExtDecls decl@(CDecl declspecs declrs node)+voidM :: Monad m => m a -> m ()+voidM m = m >> return ()++-- | Analyse a declaration other than a function definition+--+-- Note: static assertions are not analysed+analyseDecl :: (MonadTrav m) => Bool -> CDecl -> m ()+analyseDecl _is_local (CStaticAssert _expr _strlit _annot) = return () -- TODO+analyseDecl is_local decl@(CDecl declspecs declrs node) | null declrs = case typedef_spec of Just _ -> astError node "bad typedef declaration: missing declarator"- Nothing -> analyseTypeDecl decl >> return ()+ Nothing -> voidM$ analyseTypeDecl decl | (Just declspecs') <- typedef_spec = mapM_ (uncurry (analyseTyDef declspecs')) declr_list- | otherwise = mapM_ (uncurry analyseVarDeclr) declr_list+ | otherwise = do let (storage_specs, attrs, typequals, typespecs, funspecs, _alignspecs) =+ partitionDeclSpecs declspecs+ canonTySpecs <- canonicalTypeSpec typespecs+ -- TODO: alignspecs not yet processed+ let specs =+ (storage_specs, attrs, typequals, canonTySpecs, funspecs)+ mapM_ (uncurry (analyseVarDeclr specs)) declr_list where declr_list = zip (True : repeat False) declrs typedef_spec = hasTypeDef declspecs@@ -102,52 +137,39 @@ (Just tydeclr, Nothing , Nothing) -> analyseTypeDef handle_sue_def declspecs' tydeclr node _ -> astError node "bad typdef declaration: bitfieldsize or initializer present" - analyseVarDeclr handle_sue_def (Just declr, init_opt, Nothing) = do+ analyseVarDeclr specs handle_sue_def (Just declr, init_opt, Nothing) = do -- analyse the declarator- vardeclInfo@(VarDeclInfo _ _ _ _ typ _) <- analyseVarDecl handle_sue_def declspecs declr []+ let (storage_specs, attrs, typequals, canonTySpecs, inline) = specs+ vardeclInfo@(VarDeclInfo _ _ _ _ typ _) <-+ analyseVarDecl handle_sue_def storage_specs attrs typequals canonTySpecs inline+ declr [] Nothing -- declare / define the object- init_opt' <- mapMaybeM init_opt tInit- when (isTypeOfExpr typ) $ astError node "we cannot analyse typeof(expr) yet"- if (isFunctionType typ)+ if isFunctionType typ then extFunProto vardeclInfo- else extVarDecl vardeclInfo init_opt'- analyseVarDeclr _ (Nothing,_,_) = astError node "abstract declarator in object declaration"- analyseVarDeclr _ (_,_,Just bitfieldSz) = astError node "bitfield size in object declaration"-- isTypeOfExpr (TypeOfExpr _) = True- isTypeOfExpr _ = False+ else (if is_local then localVarDecl else extVarDecl)+ -- XXX: if Initializer becomes different from CInit, this+ -- will have to change.+ vardeclInfo init_opt+ _init_opt' <- mapMaybeM init_opt (tInit typ)+ return ()+ analyseVarDeclr _ _ (Nothing,_,_) = astError node "abstract declarator in object declaration"+ analyseVarDeclr _ _ (_,_,Just _bitfieldSz) = astError node "bitfield size in object declaration" -- | Analyse a typedef analyseTypeDef :: (MonadTrav m) => Bool -> [CDeclSpec] -> CDeclr -> NodeInfo -> m () analyseTypeDef handle_sue_def declspecs declr node_info = do -- analyse the declarator- (VarDeclInfo name is_inline storage_spec attrs ty declr_node) <- analyseVarDecl handle_sue_def declspecs declr []- checkValidTypeDef is_inline storage_spec attrs+ (VarDeclInfo name fun_attrs storage_spec attrs ty _node) <- analyseVarDecl' handle_sue_def declspecs declr [] Nothing+ checkValidTypeDef fun_attrs storage_spec attrs+ when (isNoName name) $ astError node_info "NoName in analyseTypeDef" let ident = identOfVarName name handleTypeDef (TypeDef ident ty attrs node_info) where- checkValidTypeDef True _ _ = astError node_info "inline specifier for typeDef"+ checkValidTypeDef fun_attrs _ _ | fun_attrs /= noFunctionAttrs =+ astError node_info "inline specifier for typeDef" checkValidTypeDef _ NoStorageSpec _ = return () checkValidTypeDef _ bad_storage _ = astError node_info $ "storage specified for typeDef: " ++ show bad_storage --- | Analyse declarators-analyseVarDecl :: (MonadTrav m) => Bool -> [CDeclSpec] -> CDeclr -> [CDecl] -> m VarDeclInfo-analyseVarDecl handle_sue_def declspecs declr oldstyle_params = do- let (storagespecs, decl_attrs, typequals, typespecs, inline) = partitionDeclSpecs declspecs- -- analyse the storage specifiers- storage_spec <- canonicalStorageSpec storagespecs- -- translate the type into semantic representation- typ <- tType handle_sue_def node typequals typespecs derived_declrs oldstyle_params- -- translate attributes- attrs' <- mapM tAttr (decl_attrs ++ declr_attrs)- -- create the variable name- name <- mkVarName node nameOpt asmname_opt- return $ VarDeclInfo name inline storage_spec attrs' typ node- where- (CDeclr nameOpt derived_declrs asmname_opt declr_attrs node) = declr- isInlineSpec (CInlineQual _) = True- isInlineSpec _ = False- -- | compute storage of a function definition -- -- a function definition has static storage with internal linkage if specified `static`,@@ -156,23 +178,34 @@ -- This function won't raise an Trav error if the declaration is incompatible with the existing one, -- this case is handled in 'handleFunDef'. computeFunDefStorage :: (MonadTrav m) => Ident -> StorageSpec -> m Storage-computeFunDefStorage _ (StaticSpec b) = return$ FunLinkage InternalLinkage+computeFunDefStorage _ (StaticSpec _) = return$ FunLinkage InternalLinkage computeFunDefStorage ident other_spec = do obj_opt <- lookupObject ident let defaultSpec = FunLinkage ExternalLinkage case other_spec of NoStorageSpec -> return$ maybe defaultSpec declStorage obj_opt+ ClKernelSpec -> return$ maybe defaultSpec declStorage obj_opt (ExternSpec False) -> return$ maybe defaultSpec declStorage obj_opt bad_spec -> throwTravError $ badSpecifierError (nodeInfo ident) $ "unexpected function storage specifier (only static or extern is allowed)" ++ show bad_spec +-- (private) Get parameters of a function type+getParams :: Type -> Maybe [ParamDecl]+getParams (FunctionType (FunType _ params _) _) = Just params+getParams _ = Nothing+ -- | handle a function prototype extFunProto :: (MonadTrav m) => VarDeclInfo -> m ()-extFunProto (VarDeclInfo var_name is_inline storage_spec attrs ty node_info) =- do old_fun <- lookupObject (identOfVarName var_name)+extFunProto (VarDeclInfo var_name fun_spec storage_spec attrs ty node_info) =+ do when (isNoName var_name) $ astError node_info "NoName in extFunProto"+ old_fun <- lookupObject (identOfVarName var_name) checkValidSpecs- let decl = VarDecl var_name (DeclAttrs is_inline (funDeclLinkage old_fun) attrs) ty- handleVarDecl (Decl decl node_info)+ let decl = VarDecl var_name (DeclAttrs fun_spec (funDeclLinkage old_fun) attrs) ty+ handleVarDecl False (Decl decl node_info)+ -- XXX: structs should be handled in 'function prototype scope' too+ enterPrototypeScope+ maybe (return ()) (mapM_ handleParamDecl) (getParams ty)+ leavePrototypeScope where funDeclLinkage old_fun = case storage_spec of@@ -184,57 +217,558 @@ _ -> error $ "funDeclLinkage: " ++ show storage_spec checkValidSpecs | hasThreadLocalSpec storage_spec = astError node_info "thread local storage specified for function"- | RegSpec <- storage_spec = astError node_info "invalid `register' storage specified for function"- | otherwise = return ()+ | RegSpec <- storage_spec = astError node_info "invalid `register' storage specified for function"+ | otherwise = return () -- | handle a object declaration \/ definition -- -- We have to check the storage specifiers here, as they determine wheter we're dealing with decalartions -- or definitions--- see [doc\/ExternalDefinitions.txt]-extVarDecl :: (MonadTrav m) => VarDeclInfo -> (Maybe Initializer) -> m ()-extVarDecl (VarDeclInfo var_name is_inline storage_spec attrs typ node_info) init_opt =- do let ident = identOfVarName var_name- old_decl <- lookupObject ident- checkValidVarDeclStorage- let vardecl linkage = VarDecl var_name (DeclAttrs is_inline linkage attrs) typ- let decl linkage = Decl (vardecl linkage) node_info- case storage_spec of- NoStorageSpec -- tentative if there is no initializer, external- -> handleObjectDef ident $ ObjDef (vardecl (Static ExternalLinkage False)) init_opt node_info- StaticSpec thread_local -- tentative if there is no initializer, internal- -> handleObjectDef ident $ ObjDef (vardecl (Static InternalLinkage thread_local)) init_opt node_info- ExternSpec thread_local- | Nothing <- init_opt -- declaration with either external or old storage- -> handleVarDecl $ decl $ maybe (Static ExternalLinkage thread_local) declStorage old_decl- | otherwise -- warning, external definition- -> do warn $ badSpecifierError node_info- "Both initializer and `extern` specifier given - treating as definition"- handleObjectDef ident $ ObjDef (vardecl (Static ExternalLinkage thread_local)) init_opt node_info- _ -> error$ "extVarDecl: storage_spec: "++show storage_spec+-- see [http://www.sivity.net/projects/language.c/wiki/ExternalDefinitions]+extVarDecl :: (MonadTrav m) => VarDeclInfo -> Maybe Initializer -> m ()+extVarDecl (VarDeclInfo var_name fun_spec storage_spec attrs typ node_info) init_opt =+ do when (isNoName var_name) $ astError node_info "NoName in extVarDecl"+ (storage,is_def) <- globalStorage storage_spec+ let vardecl = VarDecl var_name (DeclAttrs fun_spec storage attrs) typ+ if is_def+ then handleObjectDef False ident $ ObjDef vardecl init_opt node_info+ else handleVarDecl False $ Decl vardecl node_info where- checkValidVarDeclStorage- | is_inline = astError node_info "invalide `inline' specifier for non-function"- | RegSpec <- storage_spec = astError node_info "invalid `register' storage specified for external object"- | otherwise = return ()+ ident = identOfVarName var_name+ globalStorage _ | fun_spec /= noFunctionAttrs =+ astError node_info "invalid function specifier for external variable"+ globalStorage AutoSpec = astError node_info "file-scope declaration specifies storage `auto'"+ globalStorage RegSpec =+ do when (isJust init_opt) $ astError node_info "initializer given for global register variable"+ case var_name of+ NoName -> astError node_info "global register variable has no name"+ VarName _ Nothing -> astError node_info "no register specified for global register variable"+ _ -> return ()+ dt <- getDefTable+ when (hasFunDef dt) $ astError node_info "global register variable appears after a function definition"+ return (Static InternalLinkage False, False)+ -- tentative if there is no initializer, external+ globalStorage NoStorageSpec = return (Static ExternalLinkage False, True)+ globalStorage ThreadSpec = return (Static ExternalLinkage True, True)+ -- tentative if there is no initializer, internal+ globalStorage (StaticSpec thread_local) = return (Static InternalLinkage thread_local, True)+ globalStorage (ExternSpec thread_local) =+ case init_opt of+ -- declaration with either external or old storage+ Nothing -> do old_decl <- lookupObject ident+ return (maybe (Static ExternalLinkage thread_local) declStorage old_decl,False)+ -- warning, external definition+ Just _ -> do warn $ badSpecifierError node_info "Both initializer and `extern` specifier given - treating as definition"+ return (Static ExternalLinkage thread_local, True)+ hasFunDef dt = any (isFuncDef . snd) (Map.toList $ gObjs $ globalDefs dt)+ isFuncDef (FunctionDef fd) = not $ (isInline . functionAttrs) fd+ isFuncDef _ = False --- | /TODO/: Bogus-analyseFunctionBody :: (MonadTrav m) => VarDecl -> CStat -> m Stmt-analyseFunctionBody _ = return+-- | handle a function-scope object declaration \/ definition+-- see [http://www.sivity.net/projects/language.c/wiki/LocalDefinitions]+localVarDecl :: (MonadTrav m) => VarDeclInfo -> Maybe Initializer -> m ()+localVarDecl (VarDeclInfo var_name fun_attrs storage_spec attrs typ node_info) init_opt =+ do when (isNoName var_name) $ astError node_info "NoName in localVarDecl"+ (storage,is_def) <- localStorage storage_spec+ let vardecl = VarDecl var_name (DeclAttrs fun_attrs storage attrs) typ+ if is_def+ then handleObjectDef True ident (ObjDef vardecl init_opt node_info)+ else handleVarDecl True (Decl vardecl node_info)+ where+ ident = identOfVarName var_name+ localStorage NoStorageSpec = return (Auto False,True)+ localStorage ThreadSpec = return (Auto True,True)+ localStorage RegSpec = return (Auto True,True)+ -- static no linkage+ localStorage (StaticSpec thread_local) =+ return (Static NoLinkage thread_local,True)+ localStorage (ExternSpec thread_local)+ | isJust init_opt = astError node_info "extern keyword and initializer for local"+ | otherwise =+ do old_decl <- lookupObject ident+ return (maybe (Static ExternalLinkage thread_local) declStorage old_decl,False)+ localStorage _ = astError node_info "bad storage specifier for local" --- | /TODO/: Bogus-tStmt :: (MonadTrav m) => CStat -> m Stmt-tStmt = return+defineParams :: MonadTrav m => NodeInfo -> VarDecl -> m ()+defineParams ni decl =+ case getParams (declType decl) of+ Nothing -> astError ni+ "expecting complete function type in function definition"+ Just params -> mapM_ handleParamDecl params --- | /TODO/: Bogus-tExpr :: (MonadTrav m) => CExpr -> m Expr-tExpr = return+analyseFunctionBody :: (MonadTrav m) => NodeInfo -> VarDecl -> CStat -> m Stmt+analyseFunctionBody node_info decl s@(CCompound localLabels items _) =+ do enterFunctionScope+ mapM_ (withDefTable . defineLabel) (localLabels ++ getLabels s)+ defineParams node_info decl+ -- record parameters+ mapM_ (tBlockItem [FunCtx decl]) items+ leaveFunctionScope+ return s -- XXX: bogus --- | /TODO/: Bogus-tInit :: (MonadTrav m) => CInit -> m Initializer-tInit = return+analyseFunctionBody _ _ s = astError (nodeInfo s) "Function body is no compound statement" +data StmtCtx = FunCtx VarDecl+ | LoopCtx+ | SwitchCtx +-- | Given a context, determine the type declaration for the enclosing+-- function, if possible, given a context.+enclosingFunctionType :: [StmtCtx] -> Maybe Type+enclosingFunctionType [] = Nothing+enclosingFunctionType (FunCtx vd : _) = Just $ declType vd+enclosingFunctionType (_ : cs) = enclosingFunctionType cs++inLoop :: [StmtCtx] -> Bool+inLoop c = any isLoop c+ where isLoop LoopCtx = True+ isLoop _ = False++inSwitch :: [StmtCtx] -> Bool+inSwitch c = any isSwitch c+ where isSwitch SwitchCtx = True+ isSwitch _ = False++data ExprSide = LValue | RValue+ deriving (Eq, Show)++-- | Typecheck a statement, given a statement context. The type of a+-- statement is usually @void@, but expression statements and blocks+-- can sometimes have other types.+tStmt :: MonadTrav m => [StmtCtx] -> CStat -> m Type+tStmt c (CLabel _ s _ _) = tStmt c s+tStmt c (CExpr e _) =+ maybe (return voidType) (tExpr c RValue) e+tStmt c (CCompound ls body _) =+ do enterBlockScope+ mapM_ (withDefTable . defineLabel) ls+ t <- foldM (const $ tBlockItem c) voidType body+ leaveBlockScope+ return t+tStmt c (CIf e sthen selse _) =+ checkGuard c e >> tStmt c sthen+ >> maybe (return ()) (voidM . tStmt c) selse+ >> return voidType+tStmt c (CSwitch e s ni) =+ tExpr c RValue e >>= checkIntegral' ni >>+ tStmt (SwitchCtx : c) s+tStmt c (CWhile e s _ _) =+ checkGuard c e >> tStmt (LoopCtx : c) s+tStmt _ (CGoto l ni) =+ do dt <- getDefTable+ case lookupLabel l dt of+ Just _ -> return voidType+ Nothing -> typeError ni $ "undefined label in goto: " ++ identToString l+tStmt c (CCont ni) =+ do unless (inLoop c) $ astError ni "continue statement outside of loop"+ return voidType+tStmt c (CBreak ni) =+ do unless (inLoop c || inSwitch c) $+ astError ni "break statement outside of loop or switch statement"+ return voidType+tStmt c (CReturn (Just e) ni) =+ do t <- tExpr c RValue e+ rt <- case enclosingFunctionType c of+ Just (FunctionType (FunType rt _ _) _) -> return rt+ Just (FunctionType (FunTypeIncomplete rt) _) -> return rt+ Just ft -> astError ni $ "bad function type: " ++ pType ft+ Nothing -> astError ni "return statement outside function"+ case (rt, t) of+ -- apparently it's ok to return void from a void function?+ (DirectType TyVoid _ _, DirectType TyVoid _ _) -> return ()+ _ -> assignCompatible' ni CAssignOp rt t+ return voidType+tStmt _ (CReturn Nothing _) = return voidType+-- XXX: anything to do for assembly?+tStmt _ (CAsm _ _) = return voidType+tStmt c (CCase e s ni) =+ do unless (inSwitch c) $+ astError ni "case statement outside of switch statement"+ tExpr c RValue e >>= checkIntegral' ni+ tStmt c s+tStmt c (CCases e1 e2 s ni) =+ do unless (inSwitch c) $+ astError ni "case statement outside of switch statement"+ tExpr c RValue e1 >>= checkIntegral' ni+ tExpr c RValue e2 >>= checkIntegral' ni+ tStmt c s+tStmt c (CDefault s ni) =+ do unless (inSwitch c) $+ astError ni "default statement outside of switch statement"+ tStmt c s+tStmt c (CFor i g inc s _) =+ do enterBlockScope+ either (maybe (return ()) checkExpr) (analyseDecl True) i+ maybe (return ()) (checkGuard c) g+ maybe (return ()) checkExpr inc+ _ <- tStmt (LoopCtx : c) s+ leaveBlockScope+ return voidType+ where checkExpr e = voidM$ tExpr c RValue e+tStmt c (CGotoPtr e ni) =+ do t <- tExpr c RValue e+ case t of+ (PtrType _ _ _) -> return voidType+ _ -> typeError ni "can't goto non-pointer"++-- | Typecheck a block item. When statement expressions are blocks,+-- they have the type of their last expression statement, so this+-- needs to return a type.+tBlockItem :: MonadTrav m => [StmtCtx] -> CBlockItem -> m Type+tBlockItem c (CBlockStmt s) = tStmt c s+tBlockItem _ (CBlockDecl d) = analyseDecl True d >> return voidType+-- TODO: fixup analyseFunDef to handle nested functions+tBlockItem _ (CNestedFunDef fd) = analyseFunDef fd >> return voidType++checkGuard :: MonadTrav m => [StmtCtx] -> CExpr -> m ()+checkGuard c e = tExpr c RValue e >>= checkScalar' (nodeInfo e)++-- XXX: this is bogus, correct only for IA32. We should eventually+-- have a collection of these and allow people to choose one.+defaultMD :: MachineDesc+defaultMD =+ MachineDesc+ { iSize = \it ->+ case it of+ TyBool -> 1+ TyChar -> 1+ TySChar -> 1+ TyUChar -> 1+ TyShort -> 2+ TyUShort -> 2+ TyInt -> 4+ TyUInt -> 4+ TyLong -> 4+ TyULong -> 4+ TyLLong -> 8+ TyULLong -> 8+ TyInt128 -> 16+ TyUInt128 -> 16+ , fSize = \ft ->+ case ft of+ TyFloat -> 4+ TyDouble -> 8+ TyLDouble -> 16+ , builtinSize = \bt ->+ case bt of+ TyVaList -> 4+ TyAny -> 4+ , ptrSize = 4+ , voidSize = 1+ , iAlign = \it ->+ case it of+ TyBool -> 1+ TyChar -> 1+ TySChar -> 1+ TyUChar -> 1+ TyShort -> 2+ TyUShort -> 2+ TyInt -> 4+ TyUInt -> 4+ TyLong -> 4+ TyULong -> 4+ TyLLong -> 8+ TyULLong -> 8+ TyInt128 -> 16+ TyUInt128 -> 16+ , fAlign = \ft ->+ case ft of+ TyFloat -> 4+ TyDouble -> 8+ TyLDouble -> 16+ , builtinAlign = \bt ->+ case bt of+ TyVaList -> 4+ TyAny -> 4+ , ptrAlign = 4+ , voidAlign = 1+ }++tExpr :: MonadTrav m => [StmtCtx] -> ExprSide -> CExpr -> m Type+tExpr c side e =+ case nameOfNode (nodeInfo e) of+ Just n ->+ do dt <- getDefTable+ case lookupType dt n of+ Just t -> return t+ Nothing ->+ do t <- tExpr' c side e+ withDefTable (\dt' -> (t, insertType dt' n t))+ Nothing -> tExpr' c side e++-- | Typecheck an expression, with information about whether it+-- appears as an lvalue or an rvalue.+tExpr' :: MonadTrav m => [StmtCtx] -> ExprSide -> CExpr -> m Type+tExpr' c side (CBinary op le re ni) =+ do when (side == LValue) $ typeError ni "binary operator as lvalue"+ lt <- tExpr c RValue le+ rt <- tExpr c RValue re+ binopType' ni op lt rt+tExpr' c side (CUnary CAdrOp e ni) =+ do when (side == LValue) $+ typeError ni "address-of operator as lvalue"+ case e of+ CCompoundLit _ _ _ -> simplePtr `liftM` tExpr c RValue e+ CVar i _ -> lookupObject i >>=+ typeErrorOnLeft ni . maybe (notFound i) varAddrType+ _ -> simplePtr `liftM` tExpr c LValue e+tExpr' c _ (CUnary CIndOp e ni) =+ tExpr c RValue e >>= (typeErrorOnLeft ni . derefType)+tExpr' c _ (CUnary CCompOp e ni) =+ do t <- tExpr c RValue e+ checkIntegral' ni t+ return t+tExpr' c side (CUnary CNegOp e ni) =+ do when (side == LValue) $+ typeError ni "logical negation used as lvalue"+ tExpr c RValue e >>= checkScalar' ni+ return boolType+tExpr' c side (CUnary op e _) =+ tExpr c (if isEffectfulOp op then LValue else side) e+tExpr' c _ (CIndex b i ni) =+ do bt <- tExpr c RValue b+ it <- tExpr c RValue i+ addrTy <- binopType' ni CAddOp bt it+ typeErrorOnLeft ni $ derefType addrTy+tExpr' c side (CCond e1 me2 e3 ni) =+ do t1 <- tExpr c RValue e1+ checkScalar' (nodeInfo e1) t1+ t3 <- tExpr c side e3+ case me2 of+ Just e2 ->+ do t2 <- tExpr c side e2+ conditionalType' ni t2 t3+ Nothing -> conditionalType' ni t1 t3+tExpr' c _ (CMember e m deref ni) =+ do t <- tExpr c RValue e+ bt <- if deref then typeErrorOnLeft ni (derefType t) else return t+ fieldType ni m bt+tExpr' c side (CComma es _) =+ mapM (tExpr c side) es >>= return . last+tExpr' c side (CCast d e ni) =+ do dt <- analyseTypeDecl d+ et <- tExpr c side e+ typeErrorOnLeft ni $ castCompatible dt et+ return dt+tExpr' c side (CSizeofExpr e ni) =+ do when (side == LValue) $ typeError ni "sizeof as lvalue"+ _ <- tExpr c RValue e+ return size_tType+tExpr' c side (CAlignofExpr e ni) =+ do when (side == LValue) $ typeError ni "alignof as lvalue"+ _ <- tExpr c RValue e+ return size_tType+tExpr' c side (CComplexReal e ni) = complexBaseType ni c side e+tExpr' c side (CComplexImag e ni) = complexBaseType ni c side e+tExpr' _ side (CLabAddrExpr _ ni) =+ do when (side == LValue) $ typeError ni "label address as lvalue"+ return $ PtrType voidType noTypeQuals []+tExpr' _ side (CCompoundLit d initList ni) =+ do when (side == LValue) $ typeError ni "compound literal as lvalue"+ lt <- analyseTypeDecl d+ tInitList ni (canonicalType lt) initList+ return lt+tExpr' _ RValue (CAlignofType _ _) = return size_tType+tExpr' _ RValue (CSizeofType _ _) = return size_tType+tExpr' _ LValue (CAlignofType _ ni) =+ typeError ni "alignoftype as lvalue"+tExpr' _ LValue (CSizeofType _ ni) =+ typeError ni "sizeoftype as lvalue"+tExpr' ctx side (CGenericSelection expr list ni) = do+ ty_sel <- tExpr ctx side expr+ ty_list <- mapM analyseAssoc list+ def_expr_ty <-+ case dropWhile (isJust . fst) ty_list of+ [(Nothing,tExpr'')] -> return (Just tExpr'')+ [] -> return Nothing+ _ -> astError ni "more than one default clause in generic selection"+ case dropWhile (maybe True (not . typesMatch ty_sel) . fst) ty_list of+ ((_,expr_ty) : _ ) -> return expr_ty+ [] -> case def_expr_ty of+ (Just expr_ty) -> return expr_ty+ Nothing -> astError ni ("no clause matches for generic selection (not fully supported) - selector type is " ++ show (pretty ty_sel) +++ ", available types are " ++ show (map (pretty.fromJust.fst) (filter (isJust.fst) ty_list)))+ where+ analyseAssoc (mdecl,expr') = do+ tDecl <- mapM analyseTypeDecl mdecl+ tExpr'' <- tExpr ctx side expr'+ return (tDecl, tExpr'')+ typesMatch (DirectType tn1 _ _) (DirectType tn2 _ _) = directTypesMatch tn1 tn2+ typesMatch _ _ = False -- not fully supported+ directTypesMatch TyVoid TyVoid = True+ directTypesMatch (TyIntegral t1) (TyIntegral t2) = t1 == t2+ directTypesMatch (TyFloating t1) (TyFloating t2) = t1 == t2+ directTypesMatch (TyComplex t1) (TyComplex t2) = t1 == t2+ directTypesMatch _ _ = False -- TODO: not fully supported+tExpr' _ _ (CVar i ni) =+ lookupObject i >>=+ maybe (typeErrorOnLeft ni $ notFound i) (return . declType)+tExpr' _ _ (CConst c) = constType c+tExpr' _ _ (CBuiltinExpr b) = builtinType b+tExpr' c side (CCall (CVar i _) args ni)+ | identToString i == "__builtin_choose_expr" =+ case args of+ [g, e1, e2] ->+ -- XXX: the MachineDesc parameter below should be configurable+ do b <- constEval defaultMD Map.empty g+ case boolValue b of+ Just True -> tExpr c side e1+ Just False -> tExpr c side e2+ Nothing ->+ astError ni "non-constant argument to __builtin_choose_expr"+ _ -> astError ni "wrong number of arguments to __builtin_choose_expr"+tExpr' c _ (CCall fe args ni) =+ do let defType = FunctionType+ (FunTypeIncomplete+ (DirectType (TyIntegral TyInt) noTypeQuals noAttributes))+ noAttributes+ fallback i = do warn $ invalidAST ni $+ "unknown function: " ++ identToString i+ return defType+ t <- case fe of+ CVar i _ -> lookupObject i >>=+ maybe (fallback i) (const $ tExpr c RValue fe)+ _ -> tExpr c RValue fe+ atys <- mapM (tExpr c RValue) args+ -- XXX: we don't actually want to return the canonical return type here+ case canonicalType t of+ PtrType (FunctionType (FunType rt pdecls varargs) _) _ _ ->+ do let ptys = map declType pdecls+ mapM_ checkArg $ zip3 ptys atys args+ unless varargs $ when (length atys /= length ptys) $+ typeError ni "incorrect number of arguments"+ return $ canonicalType rt+ PtrType (FunctionType (FunTypeIncomplete rt) _) _ _ ->+ do -- warn $ invalidAST ni "incomplete function type"+ return $ canonicalType rt+ _ -> typeError ni $ "attempt to call non-function of type " ++ pType t+ where checkArg (pty, aty, arg) =+ do attrs <- deepTypeAttrs pty+ if isTransparentUnion attrs+ then+ case canonicalType pty of+ DirectType (TyComp ctr) _ _ ->+ do td <- lookupSUE (nodeInfo arg) (sueRef ctr)+ _ms <- tagMembers (nodeInfo arg) td+ {-+ when (null $ rights $ matches ms) $+ astError (nodeInfo arg) $+ "argument matches none of the elements " +++ "of transparent union"+ -}+ return ()+ -- where matches =+ -- map (\d -> assignCompatible+ -- CAssignOp+ -- (snd d)+ -- aty+ -- )+ _ -> astError (nodeInfo arg)+ "non-composite has __transparent_union__ attribute"+ else+ assignCompatible' (nodeInfo arg) CAssignOp pty aty+ isTransparentUnion =+ any (\(Attr n _ _) -> identToString n == "__transparent_union__")+tExpr' c _ (CAssign op le re ni) =+ do lt <- tExpr c LValue le+ rt <- tExpr c RValue re+ when (constant $ typeQuals lt) $+ typeError ni $ "assignment to lvalue with `constant' qualifier: "+ ++ (render . pretty) le+ case (canonicalType lt, re) of+ (lt', CConst (CIntConst i _))+ | isPointerType lt' && getCInteger i == 0 -> return ()+ (_, _) -> assignCompatible' ni op lt rt+ return lt+tExpr' c _ (CStatExpr s _) =+ do enterBlockScope+ mapM_ (withDefTable . defineLabel) (getLabels s)+ t <- tStmt c s+ leaveBlockScope+ return t++tInitList :: MonadTrav m => NodeInfo -> Type -> CInitList -> m ()+tInitList _ (ArrayType (DirectType (TyIntegral TyChar) _ _) _ _ _)+ [([], CInitExpr e@(CConst (CStrConst _ _)) _)] =+ tExpr [] RValue e >> return ()+tInitList ni t@(ArrayType _ _ _ _) initList =+ do let default_ds =+ repeat (CArrDesig (CConst (CIntConst (cInteger 0) ni)) ni)+ checkInits t default_ds initList+tInitList ni t@(DirectType (TyComp ctr) _ _) initList =+ do td <- lookupSUE ni (sueRef ctr)+ ms <- tagMembers ni td+ let default_ds = map (\m -> CMemberDesig (fst m) ni) ms+ checkInits t default_ds initList+tInitList _ (PtrType (DirectType TyVoid _ _) _ _ ) _ =+ return () -- XXX: more checking+tInitList _ t [([], i)] = voidM$ tInit t i+tInitList ni t _ = typeError ni $ "initializer list for type: " ++ pType t++checkInits :: MonadTrav m => Type -> [CDesignator] -> CInitList -> m ()+checkInits _ _ [] = return ()+checkInits t dds ((ds, i) : is) =+ do (dds', ds') <- case (dds, ds) of+ ([], []) ->+ typeError (nodeInfo i) "excess elements in initializer"+ (dd' : rest, []) -> return (rest, [dd'])+ (_, d : _) -> return (advanceDesigList dds d, ds)+ t' <- tDesignator t ds'+ _ <- tInit t' i+ checkInits t dds' is++advanceDesigList :: [CDesignator] -> CDesignator -> [CDesignator]+advanceDesigList ds d = drop 1 $ dropWhile (not . matchDesignator d) ds++matchDesignator :: CDesignator -> CDesignator -> Bool+matchDesignator (CMemberDesig m1 _) (CMemberDesig m2 _) = m1 == m2+matchDesignator _ _ = True -- XXX: for now, array ranges aren't checked++tDesignator :: MonadTrav m => Type -> [CDesignator] -> m Type+-- XXX: check that initializers are within array size+tDesignator (ArrayType bt _ _ _) (CArrDesig e ni : ds) =+ do tExpr [] RValue e >>= checkIntegral' ni+ tDesignator bt ds+tDesignator (ArrayType bt _ _ _) (CRangeDesig e1 e2 ni : ds) =+ do tExpr [] RValue e1 >>= checkIntegral' ni+ tExpr [] RValue e2 >>= checkIntegral' ni+ tDesignator bt ds+tDesignator (ArrayType _ _ _ _) (d : _) =+ typeError (nodeInfo d) "member designator in array initializer"+tDesignator t@(DirectType (TyComp _) _ _) (CMemberDesig m ni : ds) =+ do mt <- fieldType ni m t+ tDesignator (canonicalType mt) ds+tDesignator (DirectType (TyComp _) _ _) (d : _) =+ typeError (nodeInfo d) "array designator in compound initializer"+tDesignator t [] = return t+tDesignator _t _ =+ error "unepxected type with designator"++tInit :: MonadTrav m => Type -> CInit -> m Initializer+tInit t i@(CInitExpr e ni) =+ do it <- tExpr [] RValue e+ assignCompatible' ni CAssignOp t it+ return i+tInit t i@(CInitList initList ni) =+ tInitList ni (canonicalType t) initList >> return i++complexBaseType :: MonadTrav m => NodeInfo -> [StmtCtx] -> ExprSide -> CExpr -> m Type+complexBaseType ni c side e =+ do t <- tExpr c side e+ case canonicalType t of+ DirectType (TyComplex ft) quals attrs ->+ return $ DirectType (TyFloating ft) quals attrs+ _ -> typeError ni $ "expected complex type, got: " ++ pType t+++-- | Return the type of a builtin.+builtinType :: MonadTrav m => CBuiltin -> m Type+builtinType (CBuiltinVaArg _ d _) = analyseTypeDecl d+builtinType (CBuiltinOffsetOf _ _ _) = return size_tType+builtinType (CBuiltinTypesCompatible _ _ _) = return boolType+builtinType (CBuiltinConvertVector _expr ty _) = analyseTypeDecl ty+builtinType (CBuiltinBitCast ty _expr _) = analyseTypeDecl ty+ -- return @Just declspecs@ without @CTypedef@ if the declaration specifier contain @typedef@ hasTypeDef :: [CDeclSpec] -> Maybe [CDeclSpec] hasTypeDef declspecs =@@ -242,5 +776,5 @@ (True,specs') -> Just specs' (False,_) -> Nothing where- hasTypeDefSpec (CStorageSpec (CTypedef n)) (_,specs) = (True, specs)+ hasTypeDefSpec (CStorageSpec (CTypedef _)) (_,specs) = (True, specs) hasTypeDefSpec spec (b,specs) = (b,spec:specs)
+ src/Language/C/Analysis/AstAnalysis.hs-boot view
@@ -0,0 +1,13 @@+module Language.C.Analysis.AstAnalysis where++import Language.C.Analysis.SemRep+import Language.C.Analysis.TravMonad+import Language.C.Syntax.AST++data StmtCtx = FunCtx VarDecl+ | LoopCtx+ | SwitchCtx++data ExprSide = LValue | RValue++tExpr :: MonadTrav m => [StmtCtx] -> ExprSide -> CExpr -> m Type
+ src/Language/C/Analysis/Builtins.hs view
@@ -0,0 +1,226 @@+module Language.C.Analysis.Builtins (builtins) where++import Language.C.Analysis.DefTable+import Language.C.Analysis.SemRep+import Language.C.Analysis.TypeUtils+import Language.C.Data.Ident+import Language.C.Data.Node++builtins :: DefTable+builtins = foldr doIdent (foldr doTypeDef emptyDefTable typedefs) idents+ where doTypeDef d = snd . defineTypeDef (identOfTypeDef d) d+ doIdent d = snd . defineGlobalIdent (declIdent d) d+ dName s = VarName (builtinIdent s) Nothing+ param ty = ParamDecl (VarDecl+ NoName+ (DeclAttrs noFunctionAttrs (Auto False) [])+ ty) undefNode+ fnAttrs = DeclAttrs noFunctionAttrs (FunLinkage ExternalLinkage) []+ varAttrs = DeclAttrs noFunctionAttrs (Static InternalLinkage False) []+ fnType r as = FunctionType (FunType r (map param as) False) noAttributes+ fnType' r as = FunctionType (FunType r (map param as) True) noAttributes+ func n r as = Declaration+ (Decl+ (VarDecl (dName n) fnAttrs (fnType r as))+ undefNode)+ func' n r as = Declaration+ (Decl+ (VarDecl (dName n) fnAttrs (fnType' r as))+ undefNode)+ var n t = Declaration+ (Decl (VarDecl (dName n) varAttrs t) undefNode)+ typedef n t = TypeDef (builtinIdent n) t [] undefNode+ typedefs = [ typedef "__builtin_va_list"+ valistType+ ]+ idents = [ func "__builtin_expect"+ (integral TyLong)+ [integral TyLong, integral TyLong]+ , func "__builtin_bswap16"+ uint16_tType+ [uint16_tType]+ , func "__builtin_bswap32"+ uint32_tType+ [uint32_tType]+ , func "__builtin_bswap64"+ uint64_tType+ [uint64_tType]+ , func "__builtin_fabs"+ (floating TyDouble)+ [floating TyDouble]+ , func "__builtin_fabsf"+ (floating TyFloat)+ [floating TyFloat]+ , func "__builtin_fabsl"+ (floating TyLDouble)+ [floating TyLDouble]+ , func "__builtin_inf" (floating TyDouble) []+ , func "__builtin_inff" (floating TyFloat) []+ , func "__builtin_infl" (floating TyLDouble) []+ , func "__builtin_huge_val" (floating TyDouble) []+ , func "__builtin_huge_valf" (floating TyFloat) []+ , func "__builtin_huge_vall" (floating TyLDouble) []+ , func "__builtin_copysign"+ (floating TyDouble)+ [ floating TyDouble, floating TyDouble ]+ , func "__builtin_va_start"+ voidType+ [ valistType , voidPtr ]+ , func "__builtin_va_end"+ voidType+ [valistType]+ , func "__builtin_va_copy"+ voidType+ [ valistType, valistType ]+ , func "__builtin_va_arg_pack" (integral TyInt) []+ , func "__builtin_va_arg_pack_len" (integral TyInt) []+ , func "__builtin_alloca"+ voidPtr+ [ size_tType ]+ , func "__builtin_memcpy"+ voidPtr+ [ voidPtr+ , constVoidPtr+ , size_tType+ ]+ , func "__builtin_strspn"+ size_tType+ [ constCharPtr, constCharPtr ]+ , func "__builtin_strcspn"+ size_tType+ [ constCharPtr, constCharPtr ]+ , func "__builtin_strchr"+ charPtr+ [ constCharPtr, integral TyInt]+ , func "__builtin_strncpy"+ charPtr+ [ constCharPtr -- XXX: restrict+ , constCharPtr -- XXX: restrict+ , size_tType+ ]+ , func "__builtin_strncat"+ charPtr+ [ constCharPtr -- XXX: restrict+ , constCharPtr -- XXX: restrict+ , size_tType+ ]+ , func "__builtin_strcmp"+ (integral TyInt)+ [ constCharPtr, constCharPtr ]+ , func "__builtin_strpbrk"+ charPtr+ [ constCharPtr, constCharPtr ]+ , func "__builtin_bzero"+ voidType+ [ voidPtr, size_tType ]+ , func "__builtin_clz"+ (integral TyInt)+ [ integral TyUInt ]+ , func "__builtin_constant_p"+ (integral TyInt)+ [DirectType (TyBuiltin TyAny) noTypeQuals noAttributes]+ -- XXX: I don't know if the following has the+ -- correct type. It doesn't seem to be+ -- documented.+ , func "__builtin_extract_return_addr"+ voidPtr+ [ voidPtr ]+ , func "__builtin_return_address"+ voidPtr+ [ integral TyUInt ]+ , func "__builtin_frame_address"+ voidPtr+ [ integral TyUInt ]+ , func "__builtin_expect"+ (integral TyLong)+ [ integral TyLong, integral TyLong ]+ , func "__builtin_prefetch"+ voidType+ [ constVoidPtr ]+ , var "__func__"+ stringType+ , var "__PRETTY_FUNCTION__"+ stringType+ , var "__FUNCTION__"+ stringType+ -- Builtin GCC error checking functions+ , func "__builtin_object_size"+ size_tType+ [ voidPtr, integral TyInt ]+ , func "__builtin___memcpy_chk"+ voidPtr+ [ voidPtr, constVoidPtr, size_tType, size_tType ]+ , func "__builtin___mempcpy_chk"+ voidPtr+ [ voidPtr, constVoidPtr, size_tType, size_tType ]+ , func "__builtin___memmove_chk"+ voidPtr+ [ voidPtr, constVoidPtr, size_tType, size_tType ]+ , func "__builtin___memset_chk"+ voidPtr+ [ voidPtr, integral TyInt, size_tType, size_tType ]+ , func "__builtin___strcpy_chk"+ charPtr+ [ constCharPtr -- XXX: restrict+ , constCharPtr -- XXX: restrict+ , size_tType+ ]+ , func "__builtin___stpcpy_chk"+ charPtr+ [ constCharPtr -- XXX: restrict+ , constCharPtr -- XXX: restrict+ , size_tType+ ]+ , func "__builtin___strncpy_chk"+ charPtr+ [ constCharPtr -- XXX: restrict+ , constCharPtr -- XXX: restrict+ , size_tType+ , size_tType+ ]+ , func "__builtin___strcat_chk"+ charPtr+ [ constCharPtr -- XXX: restrict+ , constCharPtr -- XXX: restrict+ , size_tType+ ]+ , func "__builtin___strncat_chk"+ charPtr+ [ constCharPtr -- XXX: restrict+ , constCharPtr -- XXX: restrict+ , size_tType+ , size_tType+ ]+ , func' "__builtin___sprintf_chk"+ (integral TyInt)+ [ charPtr+ , integral TyInt+ , size_tType+ , constCharPtr+ ]+ , func' "__builtin___snprintf_chk"+ (integral TyInt)+ [ charPtr+ , size_tType+ , integral TyInt+ , size_tType+ , constCharPtr+ ]+ , func "__builtin___vsprintf_chk"+ (integral TyInt)+ [ charPtr+ , integral TyInt+ , size_tType+ , constCharPtr+ , valistType+ ]+ , func "__builtin___vsnprintf_chk"+ (integral TyInt)+ [ charPtr+ , size_tType+ , integral TyInt+ , size_tType+ , constCharPtr+ , valistType+ ]+ ]
+ src/Language/C/Analysis/ConstEval.hs view
@@ -0,0 +1,237 @@+{-# LANGUAGE RelaxedPolyRec #-}+module Language.C.Analysis.ConstEval where++import Prelude hiding (Foldable(..))+import Control.Monad+import Data.Bits+import Data.Foldable+import Data.Maybe+import qualified Data.Map as Map+import Language.C.Syntax.AST+import Language.C.Syntax.Constants+import {-# SOURCE #-} Language.C.Analysis.AstAnalysis (tExpr, ExprSide(..))+import Language.C.Analysis.Debug ()+import Language.C.Analysis.DeclAnalysis+import Language.C.Analysis.DefTable+import Language.C.Data+import Language.C.Pretty+import Language.C.Analysis.SemRep+import Language.C.Analysis.TravMonad+import Language.C.Analysis.TypeUtils+import Text.PrettyPrint.HughesPJ++data MachineDesc =+ MachineDesc+ { iSize :: IntType -> Integer+ , fSize :: FloatType -> Integer+ , builtinSize :: BuiltinType -> Integer+ , ptrSize :: Integer+ , voidSize :: Integer+ , iAlign :: IntType -> Integer+ , fAlign :: FloatType -> Integer+ , builtinAlign :: BuiltinType -> Integer+ , ptrAlign :: Integer+ , voidAlign :: Integer+ }++intExpr :: (Pos n, MonadName m) => n -> Integer -> m CExpr+intExpr n i =+ genName >>= \name ->+ return $ CConst $ CIntConst (cInteger i) (mkNodeInfo (posOf n) name)++sizeofType :: (MonadTrav m, CNode n) => MachineDesc -> n -> Type -> m Integer+sizeofType md _ (DirectType TyVoid _ _) = return $ voidSize md+sizeofType md _ (DirectType (TyIntegral it) _ _) = return $ iSize md it+sizeofType md _ (DirectType (TyFloating ft) _ _) = return $ fSize md ft+sizeofType md _ (DirectType (TyComplex ft) _ _) = return $ 2 * fSize md ft+sizeofType md _ (DirectType (TyComp ctr) _ _) = fst <$> compSizeAndAlign md ctr+sizeofType md _ (DirectType (TyEnum _) _ _) = return $ iSize md TyInt+sizeofType md _ (DirectType (TyBuiltin b) _ _) = return $ builtinSize md b+sizeofType md _ (PtrType _ _ _) = return $ ptrSize md+sizeofType md _ (ArrayType _ (UnknownArraySize _) _ _) = return $ ptrSize md+sizeofType md n (ArrayType bt (ArraySize _ sz) _ _) =+ do sz' <- constEval md Map.empty sz+ case sz' of+ CConst (CIntConst i _) ->+ do s <- sizeofType md n bt+ return $ getCInteger i * s+ _ -> return $ ptrSize md+ {-+ astError (nodeInfo sz) $+ "array size is not a constant: " ++ (render . pretty) sz+ -}+sizeofType md n (TypeDefType (TypeDefRef _ t _) _ _) = sizeofType md n t+sizeofType md _ (FunctionType _ _) = return $ ptrSize md++alignofType :: (MonadTrav m, CNode n) => MachineDesc -> n -> Type -> m Integer+alignofType md _ (DirectType TyVoid _ _) = return $ voidAlign md+alignofType md _ (DirectType (TyIntegral it) _ _) = return $ iAlign md it+alignofType md _ (DirectType (TyFloating ft) _ _) = return $ fAlign md ft+alignofType md _ (DirectType (TyComplex ft) _ _) = return $ fAlign md ft+alignofType md _ (DirectType (TyComp ctr) _ _) = snd <$> compSizeAndAlign md ctr+alignofType md _ (DirectType (TyEnum _) _ _) = return $ iAlign md TyInt+alignofType md _ (DirectType (TyBuiltin b) _ _) = return $ builtinAlign md b+alignofType md _ (PtrType _ _ _) = return $ ptrAlign md+alignofType md _ (ArrayType _ (UnknownArraySize _) _ _) = return $ ptrAlign md+alignofType md n (ArrayType bt (ArraySize _ _) _ _) = alignofType md n bt+alignofType md n (TypeDefType (TypeDefRef _ t _) _ _) = alignofType md n t+alignofType _ n t = astError (nodeInfo n) $+ "can't find alignment of type: " ++ (render . pretty) t++compSizeAndAlign+ :: MonadTrav m =>+ MachineDesc ->+ CompTypeRef ->+ m (Integer, Integer)+ -- ^ (size, alignment)+compSizeAndAlign md ctr =+ do dt <- getDefTable+ case lookupTag (sueRef ctr) dt of+ Just (Left _) -> astError (nodeInfo ctr)+ "composite declared but not defined"+ Just (Right (CompDef (CompType _ tag ms _ ni))) ->+ do let ts = map declType ms+ sizes <- mapM (sizeofType md ni) ts+ aligns <- mapM (alignofType md ni) ts+ let alignment = maximum (1 : aligns)+ size = case tag of+ UnionTag -> roundToAlignment alignment (maximum (0 : sizes))+ StructTag ->+ let sizeAndNextAlignment =+ zip sizes (drop 1 aligns ++ [alignment])+ offsets = foldl'+ (\offset (memberSize, nextAlign)+ -> roundToAlignment nextAlign (offset + memberSize))+ 0+ sizeAndNextAlignment+ in offsets+ return (size, alignment)+ Just (Right (EnumDef _)) -> return $ (iSize md TyInt, iAlign md TyInt)+ Nothing -> astError (nodeInfo ctr) "unknown composite"++-- | Find the next multiple of an alignment+roundToAlignment+ :: Integer+ -- ^ The alignment+ -> Integer+ -- ^ The value to align+ -> Integer+ -- ^ The next multiple of alignment+roundToAlignment alignment value =+ alignment * ((value + (alignment - 1)) `quot` alignment)++{- Expression evaluation -}++-- Use the withWordBytes function to wrap the results around to the+-- correct word size+intOp :: CBinaryOp -> Integer -> Integer -> Integer+intOp CAddOp i1 i2 = i1 + i2+intOp CSubOp i1 i2 = i1 - i2+intOp CMulOp i1 i2 = i1 * i2+intOp CDivOp i1 i2 = i1 `div` i2+intOp CRmdOp i1 i2 = i1 `mod` i2+intOp CShlOp i1 i2 = i1 `shiftL` fromInteger i2+intOp CShrOp i1 i2 = i1 `shiftR` fromInteger i2+intOp CLeOp i1 i2 = toInteger $ fromEnum $ i1 < i2+intOp CGrOp i1 i2 = toInteger $ fromEnum $ i1 > i2+intOp CLeqOp i1 i2 = toInteger $ fromEnum $ i1 <= i2+intOp CGeqOp i1 i2 = toInteger $ fromEnum $ i1 >= i2+intOp CEqOp i1 i2 = toInteger $ fromEnum $ i1 == i2+intOp CNeqOp i1 i2 = toInteger $ fromEnum $ i1 /= i2+intOp CAndOp i1 i2 = i1 .&. i2+intOp CXorOp i1 i2 = i1 `xor` i2+intOp COrOp i1 i2 = i1 .|. i2+intOp CLndOp i1 i2 = toInteger $ fromEnum $ (i1 /= 0) && (i2 /= 0)+intOp CLorOp i1 i2 = toInteger $ fromEnum $ (i1 /= 0) || (i2 /= 0)++-- Use the withWordBytes function to wrap the results around to the+-- correct word size+intUnOp :: CUnaryOp -> Integer -> Maybe Integer+intUnOp CPlusOp i = Just i+intUnOp CMinOp i = Just $ -i+intUnOp CCompOp i = Just $ complement i+intUnOp CNegOp i = Just $ toInteger $ fromEnum $ i == 0+intUnOp _ _ = Nothing++withWordBytes :: Int -> Integer -> Integer+withWordBytes bytes n = n `rem` (1 `shiftL` (bytes `shiftL` 3))++boolValue :: CExpr -> Maybe Bool+boolValue (CConst (CIntConst i _)) = Just $ getCInteger i /= 0+boolValue (CConst (CCharConst c _)) = Just $ getCCharAsInt c /= 0+boolValue (CConst (CStrConst _ _)) = Just True+boolValue _ = Nothing++intValue :: CExpr -> Maybe Integer+intValue (CConst (CIntConst i _)) = Just $ getCInteger i+intValue (CConst (CCharConst c _)) = Just $ getCCharAsInt c+intValue _ = Nothing++constEval :: (MonadTrav m) =>+ MachineDesc -> Map.Map Ident CExpr -> CExpr -> m CExpr+constEval md env (CCond e1 me2 e3 ni) =+ do e1' <- constEval md env e1+ me2' <- maybe (return Nothing) (\e -> Just `liftM` constEval md env e) me2+ e3' <- constEval md env e3+ case boolValue e1' of+ Just True -> return $ fromMaybe e1' me2'+ Just False -> return e3'+ Nothing -> return $ CCond e1' me2' e3' ni+constEval md env e@(CBinary op e1 e2 ni) =+ do e1' <- constEval md env e1+ e2' <- constEval md env e2+ t <- tExpr [] RValue e+ bytes <- fromIntegral `liftM` sizeofType md e t+ case (intValue e1', intValue e2') of+ (Just i1, Just i2) -> intExpr ni (withWordBytes bytes (intOp op i1 i2))+ (_, _) -> return $ CBinary op e1' e2' ni+constEval md env (CUnary op e ni) =+ do e' <- constEval md env e+ t <- tExpr [] RValue e+ bytes <- fromIntegral `liftM` sizeofType md e t+ case intValue e' of+ Just i -> case intUnOp op i of+ Just i' -> intExpr ni (withWordBytes bytes i')+ Nothing -> astError ni+ "invalid unary operator applied to constant"+ Nothing -> return $ CUnary op e' ni+constEval md env (CCast d e ni) =+ do e' <- constEval md env e+ t <- analyseTypeDecl d+ bytes <- fromIntegral `liftM` sizeofType md d t+ case intValue e' of+ Just i -> intExpr ni (withWordBytes bytes i)+ Nothing -> return $ CCast d e' ni+constEval md _ (CSizeofExpr e ni) =+ do t <- tExpr [] RValue e+ sz <- sizeofType md e t+ intExpr ni sz+constEval md _ (CSizeofType d ni) =+ do t <- analyseTypeDecl d+ sz <- sizeofType md d t+ intExpr ni sz+constEval md _ (CAlignofExpr e ni) =+ do t <- tExpr [] RValue e+ sz <- alignofType md e t+ intExpr ni sz+constEval md _ (CAlignofType d ni) =+ do t <- analyseTypeDecl d+ sz <- alignofType md d t+ intExpr ni sz+constEval _ env e@(CVar i _) | Map.member i env =+ return $ fromMaybe e $ Map.lookup i env+constEval md env e@(CVar i _) =+ do t <- tExpr [] RValue e+ case derefTypeDef t of+ DirectType (TyEnum etr) _ _ ->+ do dt <- getDefTable+ case lookupTag (sueRef etr) dt of+ Just (Right (EnumDef (EnumType _ es _ _))) ->+ do env' <- foldM enumConst env es+ return $ fromMaybe e $ Map.lookup i env'+ _ -> return e+ _ -> return e+ where enumConst env' (Enumerator n e' _ _) =+ do c <- constEval md env' e'+ return $ Map.insert n c env'+constEval _ _ e = return e
src/Language/C/Analysis/Debug.hs view
@@ -20,11 +20,13 @@ where import Language.C.Analysis.SemRep import Language.C.Analysis.Export+import Language.C.Analysis.DefTable+import Language.C.Analysis.NameSpaceMap import Language.C.Data import Language.C.Pretty-import Language.C.Syntax +import Prelude hiding ((<>)) import Text.PrettyPrint.HughesPJ import Data.Map (Map) ; import qualified Data.Map as Map @@ -32,10 +34,20 @@ prettyAssocs label = prettyAssocsWith label pretty pretty prettyAssocsWith :: String -> (k -> Doc) -> (v -> Doc) -> [(k,v)] -> Doc prettyAssocsWith label prettyKey prettyVal theMap =- text label $$ (nest 8) (vcat $ map prettyEntry theMap)+ text label $$ nest 8 (vcat $ map prettyEntry theMap) where prettyEntry (k,v) = prettyKey k <+> text " ~> " <+> prettyVal v +instance Pretty DefTable where+ pretty dt = text "DefTable" $$ nest 4 (vcat defMaps)+ where+ defMaps = [ prettyNSMap "idents" identDecls+ , prettyNSMap "tags" tagDecls+ , prettyNSMap "labels" labelDefs+ , prettyNSMap "members" memberDecls+ ]+ prettyNSMap label f = prettyAssocs label . nsMapToList $ f dt+ instance Pretty GlobalDecls where pretty gd = text "Global Declarations" $$ (nest 4 $ vcat declMaps) where@@ -60,17 +72,25 @@ (all_decls,(enumerators,objDefs,funDefs)) = splitIdentDecls True (gObjs gmap') (tagDefs,typeDefs) = (gTags gmap', gTypeDefs gmap') filterFile :: (CNode n) => n -> Bool- filterFile = file_filter . posFile . posOfNode . nodeInfo-+ filterFile = maybe True file_filter . fileOfNode . nodeInfo -instance Pretty (Either VarDecl ObjDef) where- pretty = either pretty pretty-instance Pretty (Either VarDecl FunDef) where+instance (Pretty a, Pretty b) => Pretty (Either a b) where pretty = either pretty pretty+instance Pretty TagFwdDecl where+ pretty (CompDecl ct) = pretty ct+ pretty (EnumDecl et) = pretty et+instance Pretty CompTyKind where+ pretty StructTag = text "struct"+ pretty UnionTag = text "union"+instance Pretty CompTypeRef where+ pretty (CompTypeRef sue kind _) = pretty kind <+> pretty sue+instance Pretty EnumTypeRef where+ pretty (EnumTypeRef sue _ ) = text "enum" <+> pretty sue instance Pretty Ident where pretty = text . identToString instance Pretty SUERef where- pretty ref = text (show ref)+ pretty (AnonymousRef name) = text $ "$" ++ show (nameId name)+ pretty (NamedRef ident) = pretty ident instance Pretty TagDef where pretty (CompDef compty) = pretty compty pretty (EnumDef enumty) = pretty enumty@@ -101,10 +121,13 @@ instance Pretty ParamDecl where pretty (ParamDecl (VarDecl name declattrs ty) _) = pretty declattrs <+> pretty name <+> text "::" <+> pretty ty+ pretty (AbstractParamDecl (VarDecl name declattrs ty) _) =+ text "abstract" <+> pretty declattrs <+> pretty name <+>+ text "::" <+> pretty ty instance Pretty DeclAttrs where- pretty (DeclAttrs inline storage attrs) =- (if inline then (text "inline") else empty) <+>- (hsep $ [ pretty storage, pretty attrs])+ pretty (DeclAttrs fun_attrs storage attrs) =+ hsep [ pretty fun_attrs, pretty storage, pretty attrs]+ instance Pretty Type where pretty ty = pretty (exportTypeDecl ty) instance Pretty TypeQuals where@@ -113,10 +136,11 @@ | otherwise = empty instance Pretty CompType where- pretty (CompType sue_ref tag members attrs node) =+ pretty (CompType sue_ref tag members attrs _node) = (text.show) tag <+> pretty sue_ref <+> braces (terminateSemi members) <+> pretty attrs+ instance Pretty MemberDecl where pretty (MemberDecl (VarDecl name declattrs ty) bitfield _) = pretty declattrs <+> pretty name <+> text "::" <+> pretty ty <+>@@ -128,12 +152,17 @@ pretty (EnumType sue_ref enumerators attrs _) = text "enum" <+> pretty sue_ref <+> braces (terminateSemi_ $ map prettyEnr enumerators) <+> pretty attrs where- prettyEnr (Enumerator ident expr enumty _) = pretty ident <+> text " = " <+> pretty expr+ prettyEnr (Enumerator ident expr _enumty _) = pretty ident <+> text " = " <+> pretty expr instance Pretty Enumerator where pretty (Enumerator ident expr enumty _) = text "<" <> text "econst" <+> pretty (sueRef enumty) <> text ">" <+> pretty ident <+> text " = " <+> pretty expr +instance Pretty FunctionAttrs where+ pretty fattrs = hsep [pIf isInline "inline", pIf isNoreturn "_Noreturn"]+ where+ pIf isMatch txt = if isMatch fattrs then text txt else empty+ instance Pretty Storage where pretty NoStorage = empty pretty (Auto reg) = text$ if reg then "auto/register" else "auto"@@ -144,6 +173,7 @@ instance Pretty Linkage where pretty InternalLinkage = text "internal" pretty ExternalLinkage = text "external"+ pretty NoLinkage = text "local" instance Pretty VarName where pretty NoName = text "<anonymous>" pretty (VarName ident asmname_opt) = pretty ident <+> (maybe empty pAsmName asmname_opt)
src/Language/C/Analysis/DeclAnalysis.hs view
@@ -1,4 +1,5 @@-{-# LANGUAGE PatternGuards #-}+{-# LANGUAGE PatternGuards, FlexibleContexts #-}+{-# OPTIONS_GHC -Wwarn=incomplete-patterns #-} ----------------------------------------------------------------------------- -- | -- Module : Language.C.Analysis.DeclAnalysis@@ -18,10 +19,10 @@ mergeOldStyle, -- * Dissecting type specs canonicalTypeSpec, NumBaseType(..),SignSpec(..),SizeMod(..),NumTypeSpec(..),TypeSpecAnalysis(..),- canonicalStorageSpec, StorageSpec(..),hasThreadLocalSpec,+ canonicalStorageSpec, StorageSpec(..), hasThreadLocalSpec, hasClKernelSpec, isTypeDef, -- * Helpers VarDeclInfo(..),- tAttr,mkVarName,getOnlyDeclr,nameOfDecl,+ tAttr,mkVarName,getOnlyDeclr,nameOfDecl,analyseVarDecl,analyseVarDecl' ) where import Language.C.Data.Error@@ -29,16 +30,15 @@ import Language.C.Data.Ident import Language.C.Pretty import Language.C.Syntax-import Language.C.Analysis.DefTable (TagFwdDecl(..))+import {-# SOURCE #-} Language.C.Analysis.AstAnalysis (tExpr, ExprSide(..))+import Language.C.Analysis.DefTable (TagFwdDecl(..), insertType) import Language.C.Analysis.SemError import Language.C.Analysis.SemRep import Language.C.Analysis.TravMonad import Data.Foldable as F (foldrM)-import qualified Data.Traversable as T-import Control.Monad (liftM,when,ap)-import Data.List (intersperse, mapAccumL)-import Data.Map (Map)+import Control.Monad (liftM,when,ap,unless,zipWithM)+import Data.List (intercalate, mapAccumL) import qualified Data.Map as Map import Text.PrettyPrint.HughesPJ @@ -48,16 +48,19 @@ -- | analyse and translate a parameter declaration -- Should be called in either prototype or block scope tParamDecl :: (MonadTrav m) => CDecl -> m ParamDecl+tParamDecl (CStaticAssert _ _ node) =+ astError node "expected parameter, not static assertion" tParamDecl (CDecl declspecs declrs node) = do declr <- getParamDeclr -- analyse the variable declaration- (VarDeclInfo name is_inline storage_spec attrs ty declr_node) <- analyseVarDecl True declspecs declr [] Nothing- when (is_inline) $ throwTravError (badSpecifierError node "parameter declaration with inline specifier")+ (VarDeclInfo name fun_spec storage_spec attrs ty declr_node) <- analyseVarDecl' True declspecs declr [] Nothing+ when (isInline fun_spec || isNoreturn fun_spec) $+ throwTravError (badSpecifierError node "parameter declaration with function specifier") -- compute storage of parameter (NoStorage, but might have a register specifier) storage <- throwOnLeft $ computeParamStorage node storage_spec let paramDecl = mkParamDecl name storage attrs ty declr_node- handleParamDecl paramDecl- return $ paramDecl+ -- XXX: we shouldn't modify the deftable here, just analyse and build representation+ return paramDecl where getParamDeclr = case declrs of@@ -65,74 +68,117 @@ [(Just declr,Nothing,Nothing)] -> return declr _ -> astError node "bad parameter declaration: multiple decls / bitfield or initializer present" mkParamDecl name storage attrs ty declr_node =- let vd = VarDecl name (DeclAttrs False storage attrs) ty in+ let vd = VarDecl name (DeclAttrs noFunctionAttrs storage attrs) ty in case name of NoName -> AbstractParamDecl vd declr_node _ -> ParamDecl vd declr_node+ -- | a parameter declaration has no linkage and either auto or register storage computeParamStorage :: NodeInfo -> StorageSpec -> Either BadSpecifierError Storage computeParamStorage _ NoStorageSpec = Right (Auto False) computeParamStorage _ RegSpec = Right (Auto True)+computeParamStorage _ ClGlobalSpec = Right (Static NoLinkage False)+computeParamStorage _ ClLocalSpec = Right (Static NoLinkage True) computeParamStorage node spec = Left . badSpecifierError node $ "Bad storage specified for parameter: " ++ show spec -- | analyse and translate a member declaration tMemberDecls :: (MonadTrav m) => CDecl -> m [MemberDecl]-tMemberDecls (CDecl declspecs declrs node) = mapM (uncurry tMemberDecl) (zip (True:repeat False) declrs)+-- Anonymous struct or union members+-- TODO storage specs, align specs and attributes are ignored+tMemberDecls (CStaticAssert _ _ node) =+ astError node "expected struct or union member, found static assertion"+tMemberDecls (CDecl declspecs [] node) =+ do let (_storage_specs, _attrs, typequals, typespecs, funspecs, _alignspecs) =+ partitionDeclSpecs declspecs+ unless (null funspecs) $ astError node "member declaration with function specifier"+ canonTySpecs <- canonicalTypeSpec typespecs+ ty <- tType True node typequals canonTySpecs [] []+ case ty of+ DirectType (TyComp _) _ _ ->+ return $ [MemberDecl+ -- XXX: are these DeclAttrs correct?+ (VarDecl NoName (DeclAttrs noFunctionAttrs NoStorage []) ty)+ Nothing node]+ _ -> astError node "anonymous member has a non-composite type"+-- Named members+tMemberDecls (CDecl declspecs declrs node) = zipWithM tMemberDecl (True:repeat False) declrs where tMemberDecl handle_sue_def (Just member_declr,Nothing,bit_field_size_opt) =- do var_decl <- analyseVarDecl handle_sue_def declspecs member_declr [] Nothing- let (VarDeclInfo name is_inline storage_spec attrs ty declr_node) = var_decl+ -- TODO: use analyseVarDecl here, not analyseVarDecl'+ do var_decl <- analyseVarDecl' handle_sue_def declspecs member_declr [] Nothing+ let (VarDeclInfo name fun_spec storage_spec attrs ty _node_info) = var_decl --- checkValidMemberSpec is_inline storage_spec- return $ MemberDecl (VarDecl name (DeclAttrs False NoStorage attrs) ty) bit_field_size_opt node+ checkValidMemberSpec fun_spec storage_spec+ return $ MemberDecl (VarDecl name (DeclAttrs noFunctionAttrs NoStorage attrs) ty)+ bit_field_size_opt node tMemberDecl handle_sue_def (Nothing,Nothing,Just bit_field_size) =- do let (storage_specs, _attrs, typequals, typespecs, is_inline) = partitionDeclSpecs declspecs- storage_spec <- canonicalStorageSpec storage_specs- typ <- tType handle_sue_def node typequals typespecs [] []+ do let (storage_specs, _attrs, typequals, typespecs, _funspecs, _alignspecs) = partitionDeclSpecs declspecs+ -- TODO: funspecs/alignspecs not yet processed+ _storage_spec <- canonicalStorageSpec storage_specs+ -- TODO: storage_spec not used+ canonTySpecs <- canonicalTypeSpec typespecs+ typ <- tType handle_sue_def node typequals canonTySpecs [] [] -- return $ AnonBitField typ bit_field_size node tMemberDecl _ _ = astError node "Bad member declaration"- checkValidMemberSpec is_inline storage_spec =- do when (is_inline) $ astError node "member declaration with inline specifier"+ checkValidMemberSpec fun_spec storage_spec =+ do when (fun_spec /= noFunctionAttrs) $ astError node "member declaration with inline specifier" when (storage_spec /= NoStorageSpec) $ astError node "storage specifier for member" return () data StorageSpec = NoStorageSpec | AutoSpec | RegSpec | ThreadSpec | StaticSpec Bool | ExternSpec Bool+ | ClKernelSpec | ClGlobalSpec | ClLocalSpec deriving (Eq,Ord,Show,Read) hasThreadLocalSpec :: StorageSpec -> Bool hasThreadLocalSpec ThreadSpec = True+hasThreadLocalSpec ClLocalSpec = True hasThreadLocalSpec (StaticSpec b) = b hasThreadLocalSpec (ExternSpec b) = b hasThreadLocalSpec _ = False -data VarDeclInfo = VarDeclInfo VarName Bool {- is-inline? -} StorageSpec Attributes Type NodeInfo+hasClKernelSpec :: StorageSpec -> Bool+hasClKernelSpec ClKernelSpec = True +data VarDeclInfo = VarDeclInfo VarName FunctionAttrs StorageSpec Attributes Type NodeInfo++analyseVarDecl' :: (MonadTrav m) =>+ Bool -> [CDeclSpec] ->+ CDeclr -> [CDecl] -> Maybe CInit -> m VarDeclInfo+analyseVarDecl' handle_sue_def declspecs declr oldstyle init_opt =+ do let (storage_specs, attrs, type_quals, type_specs, funspecs, _alignspecs) =+ partitionDeclSpecs declspecs+ canonTySpecs <- canonicalTypeSpec type_specs+ -- TODO: alignspecs not yet processed+ analyseVarDecl handle_sue_def storage_specs attrs type_quals canonTySpecs funspecs+ declr oldstyle init_opt+ -- | analyse declarators-analyseVarDecl :: (MonadTrav m) => Bool -> [CDeclSpec] -> CDeclr -> [CDecl] -> (Maybe CInit) -> m VarDeclInfo-analyseVarDecl handle_sue_def declspecs+analyseVarDecl :: (MonadTrav m) =>+ Bool -> [CStorageSpec] -> [CAttr] -> [CTypeQual] ->+ TypeSpecAnalysis -> [CFunSpec] ->+ CDeclr -> [CDecl] -> Maybe CInit -> m VarDeclInfo+analyseVarDecl handle_sue_def storage_specs decl_attrs typequals canonTySpecs fun_specs (CDeclr name_opt derived_declrs asmname_opt declr_attrs node)- oldstyle_params init_opt- = do let (storage_specs, decl_attrs, typequals, typespecs, inline) = partitionDeclSpecs declspecs- -- analyse the storage specifiers+ oldstyle_params _init_opt+ = do -- analyse the storage specifiers storage_spec <- canonicalStorageSpec storage_specs -- translate the type into semantic representation- typ <- tType handle_sue_def node typequals typespecs derived_declrs oldstyle_params+ typ <- tType handle_sue_def node typequals canonTySpecs derived_declrs oldstyle_params -- translate attributes attrs' <- mapM tAttr (decl_attrs ++ declr_attrs) -- make name name <- mkVarName node name_opt asmname_opt- return $ VarDeclInfo name inline storage_spec attrs' typ node+ return $ VarDeclInfo name function_spec storage_spec attrs' typ node where- isInlineSpec (CInlineQual _) = True- isInlineSpec _ = False-+ updateFunSpec (CInlineQual _) f = f { isInline = True }+ updateFunSpec (CNoreturnQual _) f = f { isNoreturn = True }+ function_spec = foldr updateFunSpec noFunctionAttrs fun_specs -- return @True@ if the declarations is a type def isTypeDef :: [CDeclSpec] -> Bool isTypeDef declspecs = not $ null [ n | (CStorageSpec (CTypedef n)) <- declspecs ] - -- * translation -- | get the type of a /type declaration/@@ -149,32 +195,44 @@ -- -- We move attributes to the type, as they have no meaning for the abstract declarator analyseTypeDecl :: (MonadTrav m) => CDecl -> m Type+analyseTypeDecl (CStaticAssert _ _ node) =+ astError node "Expected type declaration, found static assert" analyseTypeDecl (CDecl declspecs declrs node) | [] <- declrs = analyseTyDeclr (emptyDeclr node) | [(Just declr,Nothing,Nothing)] <- declrs = analyseTyDeclr declr | otherwise = astError node "Bad declarator for type declaration" where analyseTyDeclr (CDeclr Nothing derived_declrs Nothing attrs _declrnode)- | (not (null storagespec) || inline) = astError node "storage specifier for type declaration"- | otherwise = tType True node (map CAttrQual (attrs++attrs_decl) ++ typequals)- typespecs derived_declrs []+ | (not (null storagespec) || not (null funspecs) || not (null alignspecs)) =+ astError node "storage, function or alignment specifier for type declaration"+ | otherwise =+ do canonTySpecs <- canonicalTypeSpec typespecs+ t <- tType True node (map CAttrQual (attrs++attrs_decl) ++ typequals)+ canonTySpecs derived_declrs []+ case nameOfNode node of+ Just n -> withDefTable (\dt -> (t, insertType dt n t))+ Nothing -> return t where- (storagespec, attrs_decl, typequals, typespecs, inline) = partitionDeclSpecs declspecs+ (storagespec, attrs_decl, typequals, typespecs, funspecs, alignspecs) = partitionDeclSpecs declspecs analyseTyDeclr _ = astError node "Non-abstract declarator in type declaration" -- | translate a type-tType :: (MonadTrav m) => Bool -> NodeInfo -> [CTypeQual] -> [CTypeSpec] -> [CDerivedDeclr] -> [CDecl] -> m Type-tType handle_sue_def top_node typequals typespecs derived_declrs oldstyle_params+tType :: (MonadTrav m) => Bool -> NodeInfo -> [CTypeQual] -> TypeSpecAnalysis -> [CDerivedDeclr] -> [CDecl] -> m Type+tType handle_sue_def top_node typequals canonTySpecs derived_declrs oldstyle_params = mergeOldStyle top_node oldstyle_params derived_declrs >>= buildType where- buildType [] = tDirectType handle_sue_def top_node typequals typespecs+ buildType [] =+ tDirectType handle_sue_def top_node typequals canonTySpecs buildType (CPtrDeclr ptrquals node : dds) = buildType dds >>= buildPointerType ptrquals node buildType (CArrDeclr arrquals size node : dds) = buildType dds >>= buildArrayType arrquals size node- buildType (CFunDeclr ~(Right (params, isVariadic)) attrs node : dds)- = buildType dds >>= (liftM FunctionType . buildFunctionType params isVariadic attrs node)+ buildType (CFunDeclr (Right (params, isVariadic)) attrs node : dds)+ = buildType dds >>= (liftM (uncurry FunctionType) . buildFunctionType params isVariadic attrs node)+ buildType (CFunDeclr (Left _) _ _ : _)+ -- /FIXME/: this is really an internal error, not an AST error.+ = astError top_node "old-style parameters remaining after mergeOldStyle" buildPointerType ptrquals _node inner_ty = liftM (\(quals,attrs) -> PtrType inner_ty quals attrs) (tTypeQuals ptrquals) buildArrayType arr_quals size _node inner_ty@@ -187,19 +245,20 @@ = do enterPrototypeScope params' <- mapM tParamDecl params leavePrototypeScope- attrs' <- mapM tAttr attrs- return $ case (map declType params',is_variadic) of- ([],False) -> FunTypeIncomplete return_ty attrs' -- may be improved later on- ([DirectType TyVoid _],False) -> FunType return_ty [] False attrs'- _ -> FunType return_ty params' is_variadic attrs'+ attrs' <- mapM tAttr attrs+ return $ (\t -> (t,attrs')) $+ case (map declType params',is_variadic) of+ ([],False) -> FunTypeIncomplete return_ty -- may be improved later on+ ([DirectType TyVoid _ _],False) -> FunType return_ty [] False+ _ -> FunType return_ty params' is_variadic -- | translate a type without (syntactic) indirections -- Due to the GNU @typeof@ extension and typeDefs, this can be an arbitrary type-tDirectType :: (MonadTrav m) => Bool -> NodeInfo -> [CTypeQual] -> [CTypeSpec] -> m Type-tDirectType handle_sue_def node ty_quals ty_specs = do+tDirectType :: (MonadTrav m) =>+ Bool -> NodeInfo -> [CTypeQual] -> TypeSpecAnalysis -> m Type+tDirectType handle_sue_def node ty_quals canonTySpec = do (quals,attrs) <- tTypeQuals ty_quals- canonTySpec <- canonicalTypeSpec ty_specs- let baseType ty_name = DirectType ty_name quals+ let baseType ty_name = DirectType ty_name quals attrs case canonTySpec of TSNone -> return$ baseType (TyIntegral TyInt) TSVoid -> return$ baseType TyVoid@@ -211,13 +270,11 @@ Left (floatType,iscomplex) | iscomplex -> TyComplex floatType | otherwise -> TyFloating floatType Right intType -> TyIntegral intType- TSNonBasic (CSUType su _tnode) -> liftM (baseType . TyComp) $ tCompTypeDecl handle_sue_def su+ TSTypeDef tdr -> return$ TypeDefType tdr quals attrs+ TSNonBasic (CSUType su _tnode) -> liftM (baseType . TyComp) $ tCompTypeDecl handle_sue_def su TSNonBasic (CEnumType enum _tnode) -> liftM (baseType . TyEnum) $ tEnumTypeDecl handle_sue_def enum- TSNonBasic (CTypeDef name t_node) -> liftM TypeDefType $ typeDefRef t_node name- -- TODO: analyse type of expression- TSNonBasic (CTypeOfExpr expr _tnode) -> return $ TypeOfExpr expr- TSNonBasic (CTypeOfType decl t_node) -> analyseTypeDecl decl >>= mergeTypeAttributes t_node quals attrs- TSNonBasic _ -> astError node "Unexpected typespec"+ TSType t -> mergeTypeAttributes node quals attrs t+ TSNonBasic t -> astError node ("Unexpected typespec: " ++ show t) -- | Merge type attributes --@@ -225,22 +282,22 @@ -- -- > /* tyqual attr typeof(type) */ -- > const typeof(char volatile) x;-mergeTypeAttributes :: (MonadTrav m) => NodeInfo -> TypeQuals -> [Attr] -> Type -> m Type+mergeTypeAttributes :: (MonadCError m) => NodeInfo -> TypeQuals -> [Attr] -> Type -> m Type mergeTypeAttributes node_info quals attrs typ = case typ of- DirectType ty_name quals' -> merge quals' [] $ mkDirect ty_name+ DirectType ty_name quals' attrs' -> merge quals' attrs' $ DirectType ty_name PtrType ty quals' attrs' -> merge quals' attrs' $ PtrType ty ArrayType ty array_sz quals' attrs' -> merge quals' attrs' $ ArrayType ty array_sz- FunctionType (FunType return_ty params inline attrs')- | not (null attrs) -> astError node_info "type qualifiers for function type"- | otherwise -> return$ FunctionType (FunType return_ty params inline (attrs' ++ attrs))+ FunctionType fty attrs'+ | quals /= noTypeQuals -> astError node_info "type qualifiers for function type"+ | otherwise -> return$ FunctionType fty (attrs' ++ attrs)+ TypeDefType tdr quals' attrs'+ -> merge quals' attrs' $ TypeDefType tdr where- mkDirect ty_name quals' attrs' | null attrs' = DirectType ty_name quals'- | otherwise = error "_attribute__ s for DirectType" merge quals' attrs' tyf = return $ tyf (mergeTypeQuals quals quals') (attrs' ++ attrs) -typeDefRef :: (MonadTrav m) => NodeInfo -> Ident -> m TypeDefRef-typeDefRef t_node name = lookupTypeDef name >>= \ty -> return (TypeDefRef name (Just ty) t_node)+typeDefRef :: (MonadCError m, MonadSymtab m) => NodeInfo -> Ident -> m TypeDefRef+typeDefRef t_node name = lookupTypeDef name >>= \ty -> return (TypeDefRef name ty t_node) -- extract a struct\/union -- we emit @declStructUnion@ and @defStructUnion@ actions@@ -256,9 +313,9 @@ let decl = CompTypeRef sue_ref tag' node_info handleTagDecl (CompDecl decl) -- when handle_def is true, enter the definition- when (handle_def) $ do+ when handle_def $ maybeM member_decls_opt $ \decls ->- tCompType sue_ref tag' decls (attrs') node_info+ tCompType sue_ref tag' decls attrs' node_info >>= (handleTagDef.CompDef) return decl @@ -286,14 +343,15 @@ = do sue_ref <- createSUERef node_info ident_opt attrs' <- mapM tAttr attrs let decl = EnumTypeRef sue_ref node_info- when handle_def $ do+ when handle_def $ maybeM enumerators_opt $ \enumerators -> tEnumType sue_ref enumerators attrs' node_info >>= (handleTagDef . EnumDef) return decl -- | translate and analyse an enumeration type-tEnumType :: (MonadTrav m) => SUERef -> [(Ident, Maybe CExpr)] -> Attributes -> NodeInfo -> m EnumType+tEnumType :: (MonadCError m, MonadSymtab m) =>+ SUERef -> [(Ident, Maybe CExpr)] -> Attributes -> NodeInfo -> m EnumType tEnumType sue_ref enumerators attrs node = do mapM_ handleEnumeratorDef enumerators' return ty@@ -303,24 +361,28 @@ nextEnumerator memo (ident,e) = let (memo',expr) = nextEnrExpr memo e in (memo', Enumerator ident expr ty (nodeInfo ident))- nextEnrExpr :: (Either Integer (Expr,Integer)) -> Maybe CExpr -> (Either Integer (Expr,Integer), CExpr)+ nextEnrExpr :: Either Integer (Expr,Integer) -> Maybe CExpr -> (Either Integer (Expr,Integer), CExpr) nextEnrExpr (Left i) Nothing = (Left (succ i), intExpr i) nextEnrExpr (Right (e,offs)) Nothing = (Right (e, succ offs), offsExpr e offs) nextEnrExpr _ (Just e) = (Right (e,1), e)- intExpr i = CConst (CIntConst (cInteger i) internalNode)- offsExpr e offs = CBinary CAddOp e (intExpr offs) internalNode+ intExpr i = CConst (CIntConst (cInteger i) undefNode)+ offsExpr e offs = CBinary CAddOp e (intExpr offs) undefNode -- | Mapping from num type specs to C types (C99 6.7.2-2), ignoring the complex qualifier.-tNumType :: (MonadTrav m) => NumTypeSpec -> m (Either (FloatType,Bool) IntType)+tNumType :: (MonadCError m) => NumTypeSpec -> m (Either (FloatType,Bool) IntType) tNumType (NumTypeSpec basetype sgn sz iscomplex) = case (basetype,sgn,sz) of (BaseChar,_,NoSizeMod) | Signed <- sgn -> intType TySChar- | Unsigned <- sgn -> intType TyUChar- | otherwise -> intType TyChar+ | Unsigned <- sgn -> intType TyUChar+ | otherwise -> intType TyChar (intbase, _, NoSizeMod) | optBase BaseInt intbase -> intType$ case sgn of Unsigned -> TyUInt _ -> TyInt+ (intbase, _, NoSizeMod) | optBase BaseInt128 intbase ->+ intType$ case sgn of+ Unsigned -> TyUInt128+ _ -> TyInt128 (intbase, signed, sizemod) | optBase BaseInt intbase, optSign Signed signed -> intType$ case sizemod of ShortMod -> TyShort LongMod -> TyLong@@ -334,6 +396,8 @@ (BaseFloat, NoSignSpec, NoSizeMod) -> floatType TyFloat (BaseDouble, NoSignSpec, NoSizeMod) -> floatType TyDouble (BaseDouble, NoSignSpec, LongMod) -> floatType TyLDouble+ (BaseBFloat16, NoSignSpec, NoSizeMod) -> floatType TyBFloat16+ (BaseFloatN n x, NoSignSpec, NoSizeMod) -> floatType (TyFloatN n x) -- TODO: error analysis (_,_,_) -> error "Bad AST analysis" where@@ -352,27 +416,33 @@ tTypeQuals :: (MonadTrav m) => [CTypeQual] -> m (TypeQuals,Attributes) tTypeQuals = foldrM go (noTypeQuals,[]) where- go (CConstQual _) (tq,attrs) = return$ (tq { constant = True },attrs)- go (CVolatQual _) (tq,attrs) = return$ (tq { volatile = True },attrs)- go (CRestrQual _) (tq,attrs) = return$ (tq { restrict = True },attrs)+ go (CConstQual _) (tq,attrs) = return (tq { constant = True },attrs)+ go (CVolatQual _) (tq,attrs) = return (tq { volatile = True },attrs)+ go (CRestrQual _) (tq,attrs) = return (tq { restrict = True },attrs)+ go (CAtomicQual _) (tq,attrs) = return (tq { atomic = True },attrs) go (CAttrQual attr) (tq,attrs) = liftM (\attr' -> (tq,attr':attrs)) (tAttr attr)- go (CInlineQual node) (_tq,_attrs) = astError node "unexpected inline qualifier"-+ go (CNullableQual _) (tq,attrs) = return (tq { nullable = True }, attrs)+ go (CNonnullQual _) (tq,attrs) = return (tq { nonnull = True }, attrs)+ go (CClRdOnlyQual _) (tq,attrs) = return (tq { clrdonly = True },attrs)+ go (CClWrOnlyQual _) (tq,attrs) = return (tq { clwronly = True },attrs) -- * analysis {- To canoicalize type specifiers, we define a canonical form:-void | bool | (char|int|float|double) (signed|unsigned)? (long long?)? complex? | othertype+void | bool | (char|int|int128|float|double|floatNx)? (signed|unsigned)? (long long?)? complex? | othertype -}-data NumBaseType = NoBaseType | BaseChar | BaseInt | BaseFloat | BaseDouble deriving (Eq,Ord)+data NumBaseType = NoBaseType | BaseChar | BaseInt | BaseInt128 | BaseFloat | BaseBFloat16 |+ BaseFloatN Int Bool | BaseDouble deriving (Eq,Ord) data SignSpec = NoSignSpec | Signed | Unsigned deriving (Eq,Ord) data SizeMod = NoSizeMod | ShortMod | LongMod | LongLongMod deriving (Eq,Ord) data NumTypeSpec = NumTypeSpec { base :: NumBaseType, signSpec :: SignSpec, sizeMod :: SizeMod, isComplex :: Bool } emptyNumTypeSpec :: NumTypeSpec emptyNumTypeSpec = NumTypeSpec { base = NoBaseType, signSpec = NoSignSpec, sizeMod = NoSizeMod, isComplex = False }-data TypeSpecAnalysis = TSNone | TSVoid | TSBool | TSNum NumTypeSpec | TSNonBasic CTypeSpec+data TypeSpecAnalysis =+ TSNone | TSVoid | TSBool | TSNum NumTypeSpec |+ TSTypeDef TypeDefRef | TSType Type | TSNonBasic CTypeSpec canonicalTypeSpec :: (MonadTrav m) => [CTypeSpec] -> m TypeSpecAnalysis canonicalTypeSpec = foldrM go TSNone where@@ -382,14 +452,21 @@ updLongMod NoSizeMod = Just LongMod updLongMod LongMod = Just LongLongMod updLongMod _ = Nothing- go (CVoidType _) TSNone = return$ TSVoid- go (CBoolType _) TSNone = return$ TSBool+ go :: (MonadTrav m) => CTypeSpec -> TypeSpecAnalysis -> m TypeSpecAnalysis+ go (CVoidType _) TSNone = return TSVoid+ go (CBoolType _) TSNone = return TSBool go (CCharType _) tsa | (Just nts@(NumTypeSpec { base = NoBaseType })) <- getNTS tsa = return$ TSNum$ nts { base = BaseChar } go (CIntType _) tsa | (Just nts@(NumTypeSpec { base = NoBaseType })) <- getNTS tsa = return$ TSNum$ nts { base = BaseInt }+ go (CInt128Type _) tsa | (Just nts@(NumTypeSpec { base = NoBaseType })) <- getNTS tsa+ = return$ TSNum$ nts { base = BaseInt128 } go (CFloatType _) tsa | (Just nts@(NumTypeSpec { base = NoBaseType })) <- getNTS tsa = return$ TSNum$ nts { base = BaseFloat }+ go (CBFloat16Type _) tsa | (Just nts@(NumTypeSpec { base = NoBaseType })) <- getNTS tsa+ = return$ TSNum$ nts { base = BaseBFloat16 }+ go (CFloatNType n x _) tsa | (Just nts@(NumTypeSpec { base = NoBaseType })) <- getNTS tsa+ = return$ TSNum$ nts { base = BaseFloatN n x } go (CDoubleType _) tsa | (Just nts@(NumTypeSpec { base = NoBaseType })) <- getNTS tsa = return$ TSNum$ nts { base = BaseDouble } go (CShortType _) tsa | (Just nts@(NumTypeSpec { sizeMod = NoSizeMod })) <- getNTS tsa@@ -403,15 +480,23 @@ = return$ TSNum$ nts { signSpec = Unsigned } go (CComplexType _) tsa | (Just nts@(NumTypeSpec { isComplex = False })) <- getNTS tsa = return$ TSNum$ nts { isComplex = True }+ go (CTypeDef i ni) TSNone = liftM TSTypeDef $ typeDefRef ni i+ go (CTypeOfType d _ni) TSNone = liftM TSType $ analyseTypeDecl d+ go (CTypeOfExpr e _) TSNone = liftM TSType $ tExpr [] RValue e+ -- todo: atomic qualifier discarded+ go (CAtomicType d _ni) TSNone = liftM TSType $ analyseTypeDecl d go otherType TSNone = return$ TSNonBasic otherType go ty _ts = astError (nodeInfo ty) "Invalid type specifier" -- compute storage given storage specifiers-canonicalStorageSpec :: (MonadTrav m) =>[CStorageSpec] -> m StorageSpec+canonicalStorageSpec :: (MonadCError m) =>[CStorageSpec] -> m StorageSpec canonicalStorageSpec storagespecs = liftM elideAuto $ foldrM updStorage NoStorageSpec storagespecs where- updStorage (CAuto _) NoStorageSpec = return$ AutoSpec- updStorage (CRegister _) NoStorageSpec = return$ RegSpec- updStorage (CThread _) NoStorageSpec = return$ ThreadSpec+ updStorage (CAuto _) NoStorageSpec = return AutoSpec+ updStorage (CRegister _) NoStorageSpec = return RegSpec+ updStorage (CThread _) NoStorageSpec = return ThreadSpec+ updStorage (CClKernel _) NoStorageSpec = return ClKernelSpec+ updStorage (CClGlobal _) NoStorageSpec = return ClGlobalSpec+ updStorage (CClLocal _) NoStorageSpec = return ClLocalSpec updStorage (CThread _) (StaticSpec _) = return$ StaticSpec True updStorage (CThread _) (ExternSpec _) = return$ ExternSpec True updStorage (CStatic _) NoStorageSpec = return$ StaticSpec False@@ -437,7 +522,7 @@ -- > int f(int d, int c, char a, char* b) -- -- TODO: This could be moved to syntax, as it operates on the AST only-mergeOldStyle :: (MonadTrav m) => NodeInfo -> [CDecl] -> [CDerivedDeclr] -> m [CDerivedDeclr]+mergeOldStyle :: (MonadCError m) => NodeInfo -> [CDecl] -> [CDerivedDeclr] -> m [CDerivedDeclr] mergeOldStyle _node [] declrs = return declrs mergeOldStyle node oldstyle_params (CFunDeclr params attrs fdnode : dds) = case params of@@ -447,9 +532,9 @@ oldstyle_params' <- liftM concat $ mapM splitCDecl oldstyle_params param_map <- liftM Map.fromList $ mapM attachNameOfDecl oldstyle_params' (newstyle_params,param_map') <- foldrM insertParamDecl ([],param_map) list- when (not $ Map.null param_map') $- astError node $ "declarations for parameter(s) "++ showParamMap param_map' ++" but no such parameter"- return $ (CFunDeclr (Right (newstyle_params, False)) attrs fdnode : dds)+ unless (Map.null param_map') $+ astError node $ "declarations for parameter(s) "++ showParamMap param_map' ++" but no such parameter"+ return (CFunDeclr (Right (newstyle_params, False)) attrs fdnode : dds) Right _newstyle -> astError node "oldstyle parameter list, but newstyle function declaration" where attachNameOfDecl decl = nameOfDecl decl >>= \n -> return (n,decl)@@ -458,59 +543,64 @@ Just p -> return (p:ps, Map.delete param_name param_map) Nothing -> return (implicitIntParam param_name : ps, param_map) implicitIntParam param_name =- let node = (nodeInfo param_name) in- CDecl [CTypeSpec (CIntType node)] [(Just (CDeclr (Just param_name) [] Nothing [] node),Nothing,Nothing)] node- showParamMap = concat . intersperse ", " . map identToString . Map.keys+ let nInfo = nodeInfo param_name in+ CDecl [CTypeSpec (CIntType nInfo)] [(Just (CDeclr (Just param_name) [] Nothing [] nInfo),Nothing,Nothing)] nInfo+ showParamMap = intercalate ", " . map identToString . Map.keys mergeOldStyle node _ _ = astError node "oldstyle parameter list, but not function type" -- | split a CDecl into declarators, hereby eliding SUE defs from the second declarator on. ----- There are several reasons why this isn;t the preferred way for handling multiple-declarator declarations,+-- There are several reasons why this isn't the preferred way for handling multiple-declarator declarations, -- but it can be convinient some times. -- -- > splitCDecl [d| struct x { int z; } a,*b; |]--- > [ [d| struct x { int z; } a, struct x *b |] ]+-- > [ [d| struct x { int z; } a, struct x *b; |] ] -- -- /TODO/: This could be moved to syntax, as it operates on the AST only-splitCDecl :: (MonadTrav m) => CDecl -> m [CDecl]+splitCDecl :: (MonadCError m) => CDecl -> m [CDecl]+splitCDecl decl@(CStaticAssert _ _ _) = return [decl] splitCDecl decl@(CDecl declspecs declrs node) = case declrs of [] -> internalErr "splitCDecl applied to empty declaration"- [declr] -> return [decl]+ -- single declarator, not need to split+ [_declr] -> return [decl]+ -- more than one declarator (d1:ds) -> let declspecs' = map elideSUEDef declspecs in return$ (CDecl declspecs [d1] node) : [ CDecl declspecs' [declr] node | declr <- ds ] where elideSUEDef declspec@(CTypeSpec tyspec) = case tyspec of- (CEnumType (CEnum name def attrs enum_node) node) ->- CTypeSpec (CEnumType (CEnum name Nothing [] enum_node) node)- (CSUType (CStruct tag name def attrs su_node) node) ->- CTypeSpec (CSUType (CStruct tag name Nothing [] su_node) node)+ (CEnumType (CEnum name _def _attrs enum_node) node_info) ->+ CTypeSpec (CEnumType (CEnum name Nothing [] enum_node) node_info)+ (CSUType (CStruct tag name _def _attrs su_node) node_info) ->+ CTypeSpec (CSUType (CStruct tag name Nothing [] su_node) node_info) _ -> declspec elideSUEDef declspec = declspec -- | translate @__attribute__@ annotations -- TODO: This is a unwrap and wrap stub-tAttr :: (MonadTrav m) => CAttr -> m Attr+tAttr :: (MonadCError m, MonadSymtab m) => CAttr -> m Attr tAttr (CAttr name cexpr node) = return$ Attr name cexpr node -- | construct a name for a variable -- TODO: more or less bogus-mkVarName :: (MonadTrav m) => NodeInfo -> Maybe Ident -> Maybe AsmName -> m VarName-mkVarName node Nothing _ = return NoName-mkVarName node (Just n) asm = return $ VarName n Nothing+mkVarName :: (MonadCError m, MonadSymtab m) =>+ NodeInfo -> Maybe Ident -> Maybe AsmName -> m VarName+mkVarName _node Nothing _ = return NoName+mkVarName _node (Just n) asm = return $ VarName n asm -- helpers-nameOfDecl :: (MonadTrav m) => CDecl -> m Ident+nameOfDecl :: (MonadCError m) => CDecl -> m Ident nameOfDecl d = getOnlyDeclr d >>= \declr -> case declr of- (CDeclr (Just name) _ _ _ _) -> return name- (CDeclr Nothing _ _ _ node) -> internalErr "nameOfDecl: abstract declarator"+ (CDeclr (Just name) _ _ _ _node) -> return name+ (CDeclr Nothing _ _ _ _node) -> internalErr "nameOfDecl: abstract declarator" emptyDeclr :: NodeInfo -> CDeclr emptyDeclr node = CDeclr Nothing [] Nothing [] node-getOnlyDeclr :: (MonadTrav m) => CDecl -> m CDeclr+getOnlyDeclr :: (MonadCError m) => CDecl -> m CDeclr getOnlyDeclr (CDecl _ [(Just declr,_,_)] _) = return declr-getOnlyDeclr (CDecl _ _ node) = internalErr "getOnlyDeclr: declaration doesn't have a unique declarator"+getOnlyDeclr (CDecl _ _ _node) = internalErr "getOnlyDeclr: declaration doesn't have a unique declarator"+getOnlyDeclr (CStaticAssert _ _ _) = internalErr "getOnlyDeclr: static assertion doesn't have a unique declarator"
src/Language/C/Analysis/DefTable.hs view
@@ -22,24 +22,25 @@ DefTable(..), emptyDefTable, globalDefs,+ inFileScope, enterFunctionScope,leaveFunctionScope,enterBlockScope,leaveBlockScope, enterMemberDecl,leaveMemberDecl, DeclarationStatus(..),declStatusDescr, defineTypeDef, defineGlobalIdent, defineScopedIdent, defineScopedIdentWhen, declareTag,defineTag,defineLabel,lookupIdent, lookupTag,lookupLabel,lookupIdentInner,lookupTagInner,+ insertType, lookupType,+ mergeDefTable ) where import Language.C.Data import Language.C.Analysis.NameSpaceMap import Language.C.Analysis.SemRep -import Control.Applicative ((<|>))-import Data.Map (Map) import qualified Data.Map as Map-import Data.IntMap (IntMap)+import Data.IntMap (IntMap, union) import qualified Data.IntMap as IntMap-import Data.Generics+import Data.Data (Data) {- Name spaces, scopes and contexts [Scopes] @@ -91,26 +92,30 @@ -- | Table holding current definitions data DefTable = DefTable {- identDecls :: NameSpaceMap Ident IdentEntry, -- ^ declared `ordinary identifiers'- tagDecls :: NameSpaceMap SUERef TagEntry, -- ^ declared struct/union/enum tags+ identDecls :: NameSpaceMap Ident IdentEntry, -- ^ declared `ordinary identifiers'+ tagDecls :: NameSpaceMap SUERef TagEntry, -- ^ declared struct/union/enum tags labelDefs :: NameSpaceMap Ident Ident, -- ^ defined labels memberDecls :: NameSpaceMap Ident MemberDecl, -- ^ member declarations (only local)- refTable :: IntMap Name -- ^ link names with definitions+ refTable :: IntMap Name, -- ^ link names with definitions+ typeTable :: IntMap Type } -- | empty definition table, with all name space maps in global scope emptyDefTable :: DefTable-emptyDefTable = DefTable nameSpaceMap nameSpaceMap nameSpaceMap nameSpaceMap IntMap.empty+emptyDefTable = DefTable nameSpaceMap nameSpaceMap nameSpaceMap nameSpaceMap IntMap.empty IntMap.empty -- | get the globally defined entries of a definition table globalDefs :: DefTable -> GlobalDecls-globalDefs deftbl = Map.foldWithKey insertDecl (GlobalDecls e gtags e) (globalNames $ identDecls deftbl)+globalDefs deftbl = Map.foldrWithKey insertDecl (GlobalDecls e gtags e) (globalNames $ identDecls deftbl) where e = Map.empty (_fwd_decls,gtags) = Map.mapEither id $ globalNames (tagDecls deftbl) insertDecl ident (Left tydef) ds = ds { gTypeDefs = Map.insert ident tydef (gTypeDefs ds)} insertDecl ident (Right obj) ds = ds { gObjs = Map.insert ident obj (gObjs ds) } +inFileScope :: DefTable -> Bool+inFileScope dt = not (hasLocalNames (identDecls dt) || hasLocalNames (labelDefs dt))+ leaveScope_ :: (Ord k) => NameSpaceMap k a -> NameSpaceMap k a leaveScope_ = fst . leaveScope @@ -125,10 +130,9 @@ tagDecls = leaveScope_ (tagDecls deftbl) } --- | Enter function scope (and the corresponding block scope)+-- | Enter function scope (AND the corresponding block scope) enterFunctionScope :: DefTable -> DefTable-enterFunctionScope deftbl = enterLocalScope $- deftbl { labelDefs = enterNewScope (labelDefs deftbl) }+enterFunctionScope deftbl = enterLocalScope $ deftbl { labelDefs = enterNewScope (labelDefs deftbl) } -- | Leave function scope, and return the associated DefTable. -- Error if not in function scope.@@ -137,11 +141,11 @@ -- | Enter new block scope enterBlockScope :: DefTable -> DefTable-enterBlockScope = enterLocalScope+enterBlockScope deftbl = enterLocalScope $ deftbl { labelDefs = enterNewScope (labelDefs deftbl) } -- | Leave innermost block scope leaveBlockScope :: DefTable -> DefTable-leaveBlockScope = leaveLocalScope+leaveBlockScope deftbl = leaveLocalScope $ deftbl { labelDefs = leaveScope_ (labelDefs deftbl) } -- | Enter new member declaration scope enterMemberDecl :: DefTable -> DefTable@@ -163,7 +167,7 @@ | KeepDef t -- ^ new def was discarded | Shadowed t -- ^ new def shadows one in outer scope | KindMismatch t -- ^ kind mismatch- deriving (Data,Typeable)+ deriving (Data) declStatusDescr :: DeclarationStatus t -> String declStatusDescr NewDecl = "new" declStatusDescr (Redeclared _) = "redeclared"@@ -202,6 +206,7 @@ Just def' | def `sameKind` def' -> Redeclared def' | otherwise -> KindMismatch def' Nothing -> NewDecl+ defRedeclStatusLocal :: (Ord k) => (t -> t -> Bool) -> k -> t -> Maybe t -> NameSpaceMap k t -> DeclarationStatus t defRedeclStatusLocal sameKind ident def oldDecl nsm =@@ -215,7 +220,7 @@ defineTypeDef ident tydef deftbl = (defRedeclStatus compatIdentEntry (Left tydef) oldDecl, deftbl { identDecls = decls' }) where- (decls', oldDecl) = defGlobal (identDecls deftbl) ident (Left tydef)+ (decls', oldDecl) = defLocal (identDecls deftbl) ident (Left tydef) -- | declare\/define a global object\/function\/typeDef --@@ -237,7 +242,7 @@ -- entry. -- -- returns @Keep old_def@ if the old definition shouldn't be overwritten, and otherwise @Redeclared def@ or--- @DifferentKindRedec def@ if there is already an object\/function\/typeDef in the same scope.+-- @DifferentKindRedecl def@ if there is already an object\/function\/typeDef in the same scope. defineScopedIdentWhen :: (IdentDecl -> Bool) -> Ident -> IdentDecl -> DefTable -> (DeclarationStatus IdentEntry, DefTable) defineScopedIdentWhen override_def ident def deftbl@@ -254,7 +259,7 @@ = (old_decls, maybe NewDecl KeepDef old_decl_opt) new_decls = fst (defLocal old_decls ident new_def) doOverride (Left _) = False- doOverride (Right old_def) = (override_def old_def)+ doOverride (Right old_def) = override_def old_def redeclStatus' overriden_decl = defRedeclStatusLocal compatIdentEntry ident new_def overriden_decl old_decls -- | declare a tag (fwd decl in case the struct name isn't defined yet)@@ -273,8 +278,8 @@ (decls',olddecl) = defLocal (tagDecls deftbl) sueref (Right def) redeclStatus = case olddecl of- Just fwd_decl@(Left decl) | tagKind fwd_decl == tagKind (Right def) -> NewDecl -- should be NewDef- | otherwise -> KindMismatch fwd_decl+ Just fwd_decl@(Left _) | tagKind fwd_decl == tagKind (Right def) -> NewDecl -- should be NewDef+ | otherwise -> KindMismatch fwd_decl _ -> defRedeclStatusLocal compatTagEntry sueref (Right def) olddecl (tagDecls deftbl) -- | define a label@@ -303,4 +308,24 @@ -- | lookup an identifier in the innermost scope lookupTagInner :: SUERef -> DefTable -> Maybe TagEntry lookupTagInner sue_ref deftbl = lookupInnermostScope (tagDecls deftbl) sue_ref++-- | Record the type of a node.+insertType :: DefTable -> Name -> Type -> DefTable+insertType dt n t = dt { typeTable = IntMap.insert (nameId n) t (typeTable dt) }++-- | Lookup the type of a node.+lookupType :: DefTable -> Name -> Maybe Type+lookupType dt n = IntMap.lookup (nameId n) (typeTable dt)++-- | Merge two DefTables. If both tables contain an entry for a given+-- key, they must agree on its value.+mergeDefTable :: DefTable -> DefTable -> DefTable+mergeDefTable (DefTable i1 t1 l1 m1 r1 tt1) (DefTable i2 t2 l2 m2 r2 tt2) =+ DefTable+ (mergeNameSpace i1 i2)+ (mergeNameSpace t1 t2)+ (mergeNameSpace l1 l2)+ (mergeNameSpace m1 m2)+ (union r1 r2)+ (union tt1 tt2)
src/Language/C/Analysis/Export.hs view
@@ -12,18 +12,74 @@ -- Export 'SemRep' entities to 'AST' nodes. ----------------------------------------------------------------------------- module Language.C.Analysis.Export (+exportDeclr, exportType, exportTypeDecl, exportTypeSpec, exportTypeDef, exportCompType, exportCompTypeDecl, exportCompTypeRef, exportEnumType, exportEnumTypeDecl, exportEnumTypeRef,+export, ) where-import Language.C.Data.Ident-import Language.C.Data.Node-import Language.C.Syntax.AST-import Language.C.Analysis.SemRep-import Data.Maybe+import Data.List+import qualified Data.Map as Map+import Data.Maybe+import Language.C.Analysis.SemRep+import Language.C.Data.Ident+import Language.C.Data.Name (nameId)+import Language.C.Data.Node+import Language.C.Syntax.AST ++-- | Export global declarations+-- TODO: This does not export tags and type defs yet+export :: GlobalDecls -> CTranslUnit+export (GlobalDecls objs _tags _typedefs) = CTranslUnit (declarations ++ []) undefNode+ where declarations = fmap exportIdentDecl (filterBuiltins $ Map.toList objs)+ filterBuiltins = Prelude.filter noBuiltIns+ noBuiltIns (idn, _) = let n = identToString idn+ in not ("__builtin" `isPrefixOf` n) &&+ (n /= "__FUNCTION__") &&+ (n /= "__PRETTY_FUNCTION__") &&+ (n /= "__func__" )+++exportIdentDecl :: (Ident, IdentDecl) -> CExternalDeclaration NodeInfo+exportIdentDecl (_, Declaration decl) = CDeclExt $ exportDeclaration decl+exportIdentDecl (_, FunctionDef fundef) = CFDefExt $ exportFunDef fundef+exportIdentDecl (_, ObjectDef objdef) = CDeclExt $ exportObject objdef+exportIdentDecl (_, EnumeratorDef _) = error "not implemented: enumerator definition"++exportObject :: ObjDef -> CDeclaration NodeInfo+exportObject d@(ObjDef _ mInit nInf) = CDecl specs' [(Just decl, mInit, Nothing)] nInf+ where+ (DeclAttrs _ _ attrs) = declAttrs d+ specs = exportDeclarationSpecifiers (declAttrs d)+ (specs', decl) = exportDeclr specs (declType d) attrs (declName d)+++exportDeclaration :: Decl -> CDeclaration NodeInfo+exportDeclaration d = CDecl specs' [(Just decl, Nothing, Nothing)] undefNode+ where+ (DeclAttrs _ _ attrs) = declAttrs d+ specs = exportDeclarationSpecifiers (declAttrs d)+ (specs', decl) = exportDeclr specs (declType d) attrs (declName d)+++exportFunDef :: FunDef -> CFunctionDef NodeInfo+exportFunDef d@(FunDef _ stmt _) = CFunDef cDeclSpecs cDecl oldStyleParams stmt undefNode+ where+ (cDeclSpecs, cDecl) = exportDeclr specs (declType d) ([] :: Attributes) (declName d)+ oldStyleParams= [] :: [CDeclaration NodeInfo] -- TODO:?+ specs = exportDeclarationSpecifiers (declAttrs d):: [CDeclarationSpecifier NodeInfo]++exportDeclarationSpecifiers :: DeclAttrs -> [CDeclarationSpecifier NodeInfo]+exportDeclarationSpecifiers (DeclAttrs funcAttrs storage _attrs) = specifiers+ where specifiers = (CFunSpec <$> exportFunAttrs funcAttrs) ++ (CStorageSpec <$> exportStorage storage)+++-- |Export Declarator+--+-- Synopsis: @exportDeclr other_specs type attributes variable-name@ exportDeclr :: [CDeclSpec] -> Type -> Attributes -> VarName -> ([CDeclSpec],CDeclr) exportDeclr other_specs ty attrs name = (other_specs ++ specs, CDeclr ident derived asmname (exportAttrs attrs) ni)@@ -47,21 +103,30 @@ (declspecs,derived) = exportType ty declr = (Just $ CDeclr (Just ident) derived Nothing (exportAttrs attrs) ni, Nothing, Nothing) +-- |Export a type to syntax exportType :: Type -> ([CDeclSpec],[CDerivedDeclr]) exportType ty = exportTy [] ty- where- exportTy dd (PtrType ity tyquals attrs) = exportTy (ptr_declr : dd) ity where- ptr_declr = CPtrDeclr (exportTypeQualsAttrs tyquals attrs) ni- exportTy dd (ArrayType ity array_sz tyquals attrs) = exportTy (arr_declr : dd) ity where- arr_declr = CArrDeclr (exportTypeQualsAttrs tyquals attrs) (exportArraySize array_sz) ni- exportTy dd (FunctionType (FunType ity params variadic attrs)) = exportTy (fun_declr : dd) ity where- fun_declr = CFunDeclr (Right (map exportParamDecl params,variadic)) (exportAttrs attrs) ni- exportTy dd (FunctionType (FunTypeIncomplete ity attrs)) = exportTy (fun_declr : dd) ity where- fun_declr = CFunDeclr (Right ([],False)) (exportAttrs attrs) ni- exportTy dd (TypeDefType (TypeDefRef ty_ident _ node)) = ([CTypeSpec (CTypeDef ty_ident node)], reverse dd)- exportTy dd (DirectType ity quals) = (map CTypeQual (exportTypeQuals quals) ++- map CTypeSpec (exportTypeSpec ity), reverse dd)- exportTy _ (TypeOfExpr _) = error "export of TypeOfExpr isn't supported"+ where+ exportTy dd (PtrType ity tyquals attrs) =+ let ptr_declr = CPtrDeclr (exportTypeQualsAttrs tyquals attrs) ni+ in exportTy (ptr_declr : dd) ity+ exportTy dd (ArrayType ity array_sz tyquals attrs) =+ let arr_declr = CArrDeclr (exportTypeQualsAttrs tyquals attrs) (exportArraySize array_sz) ni+ in exportTy (arr_declr : dd) ity+ exportTy dd (FunctionType (FunType ity params variadic) attrs) =+ let fun_declr = CFunDeclr (Right (map exportParamDecl params,variadic)) (exportAttrs attrs) ni+ in exportTy (fun_declr : dd) ity+ exportTy dd (FunctionType (FunTypeIncomplete ity) attrs) =+ let fun_declr = CFunDeclr (Right ([],False)) (exportAttrs attrs) ni+ in exportTy (fun_declr : dd) ity+ exportTy dd (TypeDefType (TypeDefRef ty_ident _ node) quals attrs) =+ let declspecs = CTypeSpec (CTypeDef ty_ident node)+ : map CTypeQual (exportTypeQualsAttrs quals attrs)+ in (declspecs, reverse dd)+ exportTy dd (DirectType ity quals attrs) =+ let declspecs = map CTypeQual (exportTypeQualsAttrs quals attrs)+ ++ map CTypeSpec (exportTypeSpec ity)+ in (declspecs, reverse dd) exportTypeQuals :: TypeQuals -> [CTypeQual] exportTypeQuals quals = mapMaybe select [(constant,CConstQual ni),(volatile,CVolatQual ni),(restrict,CRestrQual ni)]@@ -73,19 +138,20 @@ exportTypeQualsAttrs tyqs attrs = (exportTypeQuals tyqs ++ map CAttrQual (exportAttrs attrs)) exportArraySize :: ArraySize -> CArrSize-exportArraySize (ArraySize static e) = CArrSize static e+exportArraySize (ArraySize static e) = CArrSize static e exportArraySize (UnknownArraySize complete) = CNoArrSize complete exportTypeSpec :: TypeName -> [CTypeSpec] exportTypeSpec tyname = case tyname of- TyVoid -> [CVoidType ni]- TyIntegral ity -> exportIntType ity- TyFloating fty -> exportFloatType fty- TyComplex fty -> exportComplexType fty- TyComp comp -> exportCompTypeDecl comp- TyEnum enum -> exportEnumTypeDecl enum+ TyVoid -> [CVoidType ni]+ TyIntegral ity -> exportIntType ity+ TyFloating fty -> exportFloatType fty+ TyComplex fty -> exportComplexType fty+ TyComp comp -> exportCompTypeDecl comp+ TyEnum enum -> exportEnumTypeDecl enum TyBuiltin TyVaList -> [CTypeDef (internalIdent "va_list") ni]+ TyBuiltin TyAny -> [CTypeDef (internalIdent "__ty_any") ni] exportIntType :: IntType -> [CTypeSpec] exportIntType ty =@@ -98,6 +164,8 @@ TyUShort -> [CUnsigType ni, CShortType ni] TyInt -> [CIntType ni] TyUInt -> [CUnsigType ni, CIntType ni]+ TyInt128 -> [CInt128Type ni]+ TyUInt128 -> [CUnsigType ni, CInt128Type ni] TyLong -> [CLongType ni] TyULong -> [CUnsigType ni,CLongType ni] TyLLong -> [CLongType ni, CLongType ni]@@ -106,9 +174,11 @@ exportFloatType :: FloatType -> [CTypeSpec] exportFloatType ty = case ty of- TyFloat -> [CFloatType ni]- TyDouble -> [CDoubleType ni]- TyLDouble -> [CLongType ni, CDoubleType ni]+ TyFloat -> [CFloatType ni]+ TyDouble -> [CDoubleType ni]+ TyLDouble -> [CLongType ni, CDoubleType ni]+ TyBFloat16 -> [CBFloat16Type ni]+ TyFloatN n x -> [CFloatNType n x ni] exportComplexType :: FloatType -> [CTypeSpec] exportComplexType ty = (CComplexType ni) : exportFloatType ty@@ -149,8 +219,10 @@ exportEnumTypeRef :: EnumType -> [CTypeSpec] exportEnumTypeRef (EnumType sue_ref _ _ node_info) = exportEnumTypeDecl (EnumTypeRef sue_ref node_info) +-- XXX: relies on a the source program not having any $'s in it exportSUERef :: SUERef -> Maybe Ident-exportSUERef = Just . internalIdent . show -- relies on a the source program not having any $'s in it+exportSUERef (AnonymousRef name) = Just (internalIdent $ "$" ++ show (nameId name))+exportSUERef (NamedRef ident) = Just ident exportMemberDecl :: MemberDecl -> CDecl exportMemberDecl (AnonBitField ty expr node_info) =@@ -168,11 +240,18 @@ in CDecl specs [(Just declr, Nothing , Nothing) ] (nodeInfo paramdecl) exportDeclAttrs :: DeclAttrs -> [CDeclSpec]-exportDeclAttrs (DeclAttrs inline storage attrs) =- (if inline then [CTypeQual (CInlineQual ni)] else [])- ++ map (CStorageSpec) (exportStorage storage)+exportDeclAttrs (DeclAttrs fun_attrs storage attrs) =+ map CFunSpec (exportFunAttrs fun_attrs)+ ++ map CStorageSpec (exportStorage storage) ++ map (CTypeQual . CAttrQual) (exportAttrs attrs) +-- | export function attributes to C function specifiers+exportFunAttrs :: FunctionAttrs -> [CFunSpec]+exportFunAttrs fattrs = catMaybes [inlQual, noretQual]+ where+ inlQual = if isInline fattrs then Just (CInlineQual ni) else Nothing+ noretQual = if isNoreturn fattrs then Just (CNoreturnQual ni) else Nothing+ -- | express storage in terms of storage specifiers. -- -- This isn't always possible and depends on the context the identifier is declared.@@ -184,21 +263,23 @@ exportStorage (Auto reg) = if reg then [CRegister ni] else [] exportStorage (Static InternalLinkage thread_local) = threadLocal thread_local [CStatic ni] exportStorage (Static ExternalLinkage thread_local) = threadLocal thread_local [CExtern ni]-exportStorage (FunLinkage ExternalLinkage) = []+exportStorage (Static NoLinkage _) = error "impossible storage: static without linkage" exportStorage (FunLinkage InternalLinkage) = [CStatic ni]+exportStorage (FunLinkage ExternalLinkage) = []+exportStorage (FunLinkage NoLinkage) = error "impossible storage: function without linkage" threadLocal :: Bool -> [CStorageSpec] -> [CStorageSpec] threadLocal False = id-threadLocal True = ((CThread ni) :)+threadLocal True = ((CThread ni) :) exportAttrs :: [Attr] -> [CAttr] exportAttrs = map exportAttr where exportAttr (Attr ident es n) = CAttr ident es n fromDirectType :: Type -> TypeName-fromDirectType (DirectType ty _) = ty-fromDirectType (TypeDefType (TypeDefRef _ ref _)) = maybe (error "undefined typeDef") fromDirectType ref-fromDirectType _ = error "fromDirectType"+fromDirectType (DirectType ty _ _) = ty+fromDirectType (TypeDefType (TypeDefRef _ ty _) _ _) = fromDirectType ty+fromDirectType _ = error "fromDirectType" ni :: NodeInfo-ni = internalNode+ni = undefNode
+ src/Language/C/Analysis/MachineDescs.hs view
@@ -0,0 +1,119 @@+{-# LANGUAGE LambdaCase #-}+{-# LANGUAGE RecordWildCards #-}+module Language.C.Analysis.MachineDescs+ where++import Language.C.Analysis.ConstEval+import Language.C.Analysis.SemRep++x86_64 :: MachineDesc+x86_64 =+ let iSize = \case+ TyBool -> 1+ TyChar -> 1+ TySChar -> 1+ TyUChar -> 1+ TyShort -> 2+ TyUShort -> 2+ TyInt -> 4+ TyUInt -> 4+ TyLong -> 8+ TyULong -> 8+ TyLLong -> 8+ TyULLong -> 8+ TyInt128 -> 16+ TyUInt128 -> 16+ fSize = \case+ TyFloat -> 4+ TyDouble -> 8+ TyLDouble -> 16+ TyBFloat16 -> error "TyBFloat16"+ TyFloatN{} -> error "TyFloatN"+ builtinSize = \case+ TyVaList -> 24+ TyAny -> error "TyAny"+ ptrSize = 8+ voidSize = 1+ iAlign = \case+ TyBool -> 1+ TyChar -> 1+ TySChar -> 1+ TyUChar -> 1+ TyShort -> 2+ TyUShort -> 2+ TyInt -> 4+ TyUInt -> 4+ TyLong -> 8+ TyULong -> 8+ TyLLong -> 8+ TyULLong -> 8+ TyInt128 -> 16+ TyUInt128 -> 16+ fAlign = \case+ TyFloat -> 4+ TyDouble -> 8+ TyLDouble -> 16+ TyBFloat16{} -> error "TyBFloat16"+ TyFloatN{} -> error "TyFloatN"+ builtinAlign = \case+ TyVaList -> 8+ TyAny -> error "TyAny"+ ptrAlign = 8+ voidAlign = 1+ in MachineDesc { .. }++armv7l :: MachineDesc+armv7l =+ let iSize = \case+ TyBool -> 1+ TyChar -> 1+ TySChar -> 1+ TyUChar -> 1+ TyShort -> 2+ TyUShort -> 2+ TyInt -> 4+ TyUInt -> 4+ TyLong -> 4+ TyULong -> 4+ TyLLong -> 8+ TyULLong -> 8+ TyInt128 -> error "TyInt128 on armv7l"+ TyUInt128 -> error "TyUInt128 on armv7l"+ fSize = \case+ TyFloat -> 4+ TyDouble -> 8+ TyLDouble -> 8+ TyBFloat16 -> 2+ TyFloatN{} -> error "TyFloatN"+ builtinSize = \case+ TyVaList -> 4+ TyAny -> error "TyAny"+ ptrSize = 4+ voidSize = 1+ iAlign = \case+ TyBool -> 1+ TyChar -> 1+ TySChar -> 1+ TyUChar -> 1+ TyShort -> 2+ TyUShort -> 2+ TyInt -> 4+ TyUInt -> 4+ TyLong -> 4+ TyULong -> 4+ TyLLong -> 8+ TyULLong -> 8+ TyInt128 -> error "TyInt128 on armv7l"+ TyUInt128 -> error "TyUInt128 on armv7l"+ fAlign = \case+ TyFloat -> 4+ TyDouble -> 8+ TyLDouble -> 8+ TyBFloat16 -> 2+ TyFloatN{} -> error "TyFloatN"+ builtinAlign = \case+ TyVaList -> 4+ TyAny -> error "TyAny"+ ptrAlign = 4+ voidAlign = 1+ in MachineDesc { .. }
src/Language/C/Analysis/NameSpaceMap.hs view
@@ -26,13 +26,14 @@ enterNewScope, leaveScope, defLocal, lookupName,lookupGlobal,lookupInnermostScope,+ mergeNameSpace ) where import Prelude hiding (lookup) import qualified Prelude-import qualified Data.Map as Map (empty, insert, lookup, toList)+import qualified Data.Map as Map (empty, insert, lookup, toList, union)+import qualified Data.List as List (unionBy) import Data.Map (Map)-import Language.C.Data.Ident (Ident) {- C Namespaces and scopes:@@ -119,14 +120,15 @@ -- if there is one. lookupName :: (Ord k) => NameSpaceMap k a -> k -> Maybe a lookupName ns@(NsMap _ localDefs) ident- = case (lookupLocal localDefs) of+ = case lookupLocal localDefs of Nothing -> lookupGlobal ns ident Just def -> Just def where lookupLocal [] = Nothing- lookupLocal (ls:lss) = case (Prelude.lookup ident ls) of- Nothing -> lookupLocal lss- Just def -> Just def+ lookupLocal (ls:lss) =+ case Prelude.lookup ident ls of+ Nothing -> lookupLocal lss+ Just def -> Just def lookupGlobal :: (Ord k) => NameSpaceMap k a -> k -> Maybe a lookupGlobal (NsMap gs _) ident = Map.lookup ident gs@@ -142,3 +144,16 @@ -- @nameSpaceToList ns = (localDefInnermost ns ++ .. ++ localDefsOutermost ns) ++ globalDefs ns@ nsMapToList :: (Ord k) => NameSpaceMap k a -> [(k, a)] nsMapToList (NsMap gs lss) = concat lss ++ Map.toList gs++-- | Merge two namespaces. If they disagree on the types of any+-- variables, all bets are off.+mergeNameSpace :: (Ord k) =>+ NameSpaceMap k a+ -> NameSpaceMap k a+ -> NameSpaceMap k a+mergeNameSpace (NsMap global1 local1) (NsMap global2 local2) =+ NsMap (Map.union global1 global2) (localUnion local1 local2)+ where localUnion (l1:ls1) (l2:ls2) =+ List.unionBy (\p1 p2 -> fst p1 == fst p2) l1 l2 : localUnion ls1 ls2+ localUnion [] ls2 = ls2+ localUnion ls1 [] = ls1
src/Language/C/Analysis/SemError.hs view
@@ -17,7 +17,6 @@ RedefError(..), RedefInfo(..), RedefKind(..), redefinition, ) where-import Data.Typeable -- this means we cannot use SemError in SemRep, but use rich types here import Language.C.Analysis.SemRep@@ -28,17 +27,26 @@ -- here are the errors available -- | InvalidASTError is caused by the violation of an invariant in the AST-newtype InvalidASTError = InvalidAST ErrorInfo deriving (Typeable,Error)+newtype InvalidASTError = InvalidAST ErrorInfo +instance Error InvalidASTError where+ errorInfo (InvalidAST ei) = ei+ changeErrorLevel (InvalidAST ei) lvl' = InvalidAST (changeErrorLevel ei lvl')+ -- | BadSpecifierError is caused by an invalid combination of specifiers-newtype BadSpecifierError = BadSpecifierError ErrorInfo deriving (Typeable,Error)+newtype BadSpecifierError = BadSpecifierError ErrorInfo +instance Error BadSpecifierError where+ errorInfo (BadSpecifierError ei) = ei+ changeErrorLevel (BadSpecifierError ei) lvl' = BadSpecifierError (changeErrorLevel ei lvl')+ -- | RedefError is caused by an invalid redefinition of the same identifier or type-data RedefError = RedefError ErrorLevel RedefInfo deriving Typeable+data RedefError = RedefError ErrorLevel RedefInfo data RedefInfo = RedefInfo String RedefKind NodeInfo NodeInfo-data RedefKind = DuplicateDef | DiffKindRedecl | ShadowedDef-data TypeMismatch = TypeMismatch String (NodeInfo,Type) (NodeInfo,Type) deriving Typeable+data RedefKind = DuplicateDef | DiffKindRedecl | ShadowedDef | DisagreeLinkage |+ NoLinkageOld+data TypeMismatch = TypeMismatch String (NodeInfo,Type) (NodeInfo,Type) -- Invalid AST -- ~~~~~~~~~~~@@ -89,6 +97,8 @@ redefErrReason (RedefInfo ident DuplicateDef _ _) = "duplicate definition of " ++ ident redefErrReason (RedefInfo ident ShadowedDef _ _) = "this declaration of " ++ ident ++ " shadows a previous one" redefErrReason (RedefInfo ident DiffKindRedecl _ _) = ident ++ " previously declared as a different kind of symbol"+redefErrReason (RedefInfo ident DisagreeLinkage _ _) = ident ++ " previously declared with different linkage"+redefErrReason (RedefInfo ident NoLinkageOld _ _) = ident ++ " previously declared without linkage" prevDeclMsg :: NodeInfo -> [String] prevDeclMsg old_node = ["The previous declaration was here: ", show (posOfNode old_node)]
src/Language/C/Analysis/SemRep.hs view
@@ -30,12 +30,12 @@ VarDecl(..), -- * Declaration attributes DeclAttrs(..),isExtDecl,+FunctionAttrs(..), functionAttrs, noFunctionAttrs, Storage(..),declStorage,ThreadLocal,Register,-Linkage(..),+Linkage(..),hasLinkage,declLinkage, -- * Types Type(..),-FunType(..),isFunctionType,-derefTypeDef,referencedType,hasTypeOfExpr,+FunType(..), ArraySize(..), TypeDefRef(..), TypeName(..),BuiltinType(..),@@ -46,21 +46,19 @@ Enumerator(..), TypeQuals(..),noTypeQuals,mergeTypeQuals, -- * Variable names-VarName(..),identOfVarName,AsmName,+VarName(..),identOfVarName,isNoName,AsmName, -- * Attributes (STUB, not yet analyzed)-Attr(..),Attributes,+Attr(..),Attributes,noAttributes,mergeAttributes, -- * Statements and Expressions (STUB, aliases to Syntax) Stmt,Expr,Initializer,AsmBlock, ) where import Language.C.Data import Language.C.Syntax-import Language.C.Syntax.Constants- import Data.Map (Map) import qualified Data.Map as Map-import Data.Generics-import Text.PrettyPrint.HughesPJ+import Data.Maybe+import Data.Data (Data) -- | accessor class : struct\/union\/enum names class HasSUERef a where@@ -71,9 +69,9 @@ compTag :: a -> CompTyKind -- | Composite type definitions (tags)-data TagDef = CompDef CompType --definition- | EnumDef EnumType -- enum definition- deriving (Typeable, Data {-! CNode !-})+data TagDef = CompDef CompType --composite definition+ | EnumDef EnumType --enum definition+ deriving (Data {-! ,CNode !-}, Show) instance HasSUERef TagDef where sueRef (CompDef ct) = sueRef ct@@ -112,10 +110,10 @@ -- | identifiers, typedefs and enumeration constants (namespace sum) data IdentDecl = Declaration Decl -- ^ object or function declaration- | ObjectDef ObjDef -- ^ object definition- | FunctionDef FunDef -- ^ function definition- | EnumeratorDef Enumerator -- ^ definition of an enumerator- deriving (Typeable, Data {-! CNode !-})+ | ObjectDef ObjDef -- ^ object definition+ | FunctionDef FunDef -- ^ function definition+ | EnumeratorDef Enumerator -- ^ definition of an enumerator+ deriving (Data {-! ,CNode !-}, Show) instance Declaration IdentDecl where getVarDecl (Declaration decl) = getVarDecl decl@@ -138,7 +136,7 @@ ( Map Ident Enumerator, Map Ident ObjDef, Map Ident FunDef ) )-splitIdentDecls include_all = Map.foldWithKey (if include_all then deal else deal') (Map.empty,(Map.empty,Map.empty,Map.empty))+splitIdentDecls include_all = Map.foldrWithKey (if include_all then deal else deal') (Map.empty,(Map.empty,Map.empty,Map.empty)) where deal ident entry (decls,defs) = (Map.insert ident (declOfDef entry) decls, addDef ident entry defs) deal' ident (Declaration d) (decls,defs) = (Map.insert ident d decls,defs)@@ -190,6 +188,10 @@ -- ^ file-scope struct\/union\/enum event | DeclEvent IdentDecl -- ^ file-scope declaration or definition+ | ParamEvent ParamDecl+ -- ^ parameter declaration+ | LocalEvent IdentDecl+ -- ^ local variable declaration or definition | TypeDefEvent TypeDef -- ^ a type definition | AsmEvent AsmBlock@@ -200,7 +202,7 @@ -- | Declarations, which aren't definitions data Decl = Decl VarDecl NodeInfo- deriving (Typeable, Data {-! CNode !-})+ deriving (Data {-! ,CNode !-}, Show) instance Declaration Decl where getVarDecl (Decl vd _) = vd@@ -212,20 +214,20 @@ -- If the initializer is missing, it is a tentative definition, i.e. a -- definition which might be overriden later on. data ObjDef = ObjDef VarDecl (Maybe Initializer) NodeInfo- deriving (Typeable, Data {-! CNode !-})+ deriving (Data {-! ,CNode !-}, Show) instance Declaration ObjDef where getVarDecl (ObjDef vd _ _) = vd -- | Returns @True@ if the given object definition is tentative. isTentative :: ObjDef -> Bool-isTentative (ObjDef decl init_opt _) | isExtDecl decl = maybe True (const False) init_opt+isTentative (ObjDef decl init_opt _) | isExtDecl decl = isNothing init_opt | otherwise = False -- | Function definitions -- -- A function definition is a declaration together with a statement (the function body). data FunDef = FunDef VarDecl Stmt NodeInfo- deriving (Typeable, Data {-! CNode !-})+ deriving (Data {-! ,CNode !-}, Show) instance Declaration FunDef where getVarDecl (FunDef vd _ _) = vd @@ -233,7 +235,7 @@ -- | Parameter declaration data ParamDecl = ParamDecl VarDecl NodeInfo | AbstractParamDecl VarDecl NodeInfo- deriving (Typeable, Data {-! CNode !-} )+ deriving (Data {-! ,CNode !-}, Show) instance Declaration ParamDecl where getVarDecl (ParamDecl vd _) = vd@@ -244,17 +246,17 @@ -- ^ @MemberDecl vardecl bitfieldsize node@ | AnonBitField Type Expr NodeInfo -- ^ @AnonBitField typ size@- deriving (Typeable, Data {-! CNode !-} )+ deriving (Data {-! ,CNode !-}, Show) instance Declaration MemberDecl where getVarDecl (MemberDecl vd _ _) = vd- getVarDecl (AnonBitField ty _ _) = VarDecl NoName (DeclAttrs False NoStorage []) ty+ getVarDecl (AnonBitField ty _ _) = VarDecl NoName (DeclAttrs noFunctionAttrs NoStorage []) ty -- | @typedef@ definitions. -- -- The identifier is a new name for the given type. data TypeDef = TypeDef Ident Type Attributes NodeInfo- deriving (Typeable, Data {-! CNode !-} )+ deriving (Data {-! ,CNode !-}, Show) -- | return the idenitifier of a @typedef@ identOfTypeDef :: TypeDef -> Ident@@ -262,7 +264,7 @@ -- | Generic variable declarations data VarDecl = VarDecl VarName DeclAttrs Type- deriving (Typeable, Data)+ deriving (Data, Show) instance Declaration VarDecl where getVarDecl = id@@ -274,14 +276,26 @@ -- | Declaration attributes of the form @DeclAttrs isInlineFunction storage linkage attrs@ -- -- They specify the storage and linkage of a declared object.-data DeclAttrs = DeclAttrs Bool Storage Attributes- -- ^ @DeclAttrs inline storage attrs@- deriving (Typeable, Data)+data DeclAttrs = DeclAttrs FunctionAttrs Storage Attributes+ -- ^ @DeclAttrs fspecs storage attrs@+ deriving (Data, Show) -- | get the 'Storage' of a declaration declStorage :: (Declaration d) => d -> Storage declStorage d = case declAttrs d of (DeclAttrs _ st _) -> st +-- | get the `function attributes' of a declaration+functionAttrs :: (Declaration d) => d -> FunctionAttrs+functionAttrs d = case declAttrs d of (DeclAttrs fa _ _) -> fa++-- Function attributes (inline, noreturn)+data FunctionAttrs = FunctionAttrs { isInline :: Bool, isNoreturn :: Bool }+ deriving (Eq, Ord, Data, Show)++noFunctionAttrs :: FunctionAttrs+noFunctionAttrs = FunctionAttrs { isInline = False, isNoreturn = False }++ -- In C we have -- Identifiers can either have internal, external or no linkage -- (same object everywhere, same object within the translation unit, unique).@@ -297,75 +311,55 @@ -- | Storage duration and linkage of a variable data Storage = NoStorage -- ^ no storage | Auto Register -- ^ automatic storage (optional: register)- | Static Linkage ThreadLocal -- ^ static storage, with linkage and thread local specifier (gnu c)+ | Static Linkage ThreadLocal -- ^ static storage, linkage spec and thread local specifier (gnu c) | FunLinkage Linkage -- ^ function, either internal or external linkage- deriving (Typeable, Data, Show, Eq, Ord)+ deriving (Data, Show, Eq, Ord) type ThreadLocal = Bool type Register = Bool --- | Linkage: Either internal to the translation unit or external-data Linkage = InternalLinkage | ExternalLinkage- deriving (Typeable, Data, Show, Eq, Ord)+-- | Linkage: Either no linkage, internal to the translation unit or external+data Linkage = NoLinkage | InternalLinkage | ExternalLinkage+ deriving (Data, Show, Eq, Ord) -- | return @True@ if the object has linkage hasLinkage :: Storage -> Bool-hasLinkage (Static _ _) = True-hasLinkage _ = False+hasLinkage (Auto _) = False+hasLinkage (Static NoLinkage _) = False+hasLinkage _ = True +-- | Get the linkage of a definition+declLinkage :: (Declaration d) => d -> Linkage+declLinkage decl =+ case declStorage decl of+ NoStorage -> undefined+ Auto _ -> NoLinkage+ Static linkage _ -> linkage+ FunLinkage linkage -> linkage++ -- * types -- | types of C objects data Type =- DirectType TypeName TypeQuals+ DirectType TypeName TypeQuals Attributes -- ^ a non-derived type | PtrType Type TypeQuals Attributes -- ^ pointer type | ArrayType Type ArraySize TypeQuals Attributes -- ^ array type- | FunctionType FunType+ | FunctionType FunType Attributes -- ^ function type- | TypeDefType TypeDefRef+ | TypeDefType TypeDefRef TypeQuals Attributes -- ^ a defined type- | TypeOfExpr Expr- -- ^ (GNU) typeof (/broken/ and should be removed, but we do not yet have expression type analysis)- deriving (Typeable, Data)+ deriving (Data, Show) --- | Function types are of the form @FunType return-type params isVariadic attrs@.+-- | Function types are of the form @FunType return-type params isVariadic@. -- -- If the parameter types aren't yet known, the function has type @FunTypeIncomplete type attrs@.-data FunType = FunType Type [ParamDecl] Bool Attributes- | FunTypeIncomplete Type Attributes- deriving (Typeable, Data)---- | resolve typedefs, if possible-derefTypeDef :: Type -> Type-derefTypeDef (TypeDefType (TypeDefRef _ (Just actual_ty) _)) = derefTypeDef actual_ty-derefTypeDef ty = ty---- may not be called on undefined typeDefs or typeof(expr)-referencedType :: Type -> Maybe Type-referencedType (PtrType ty _ _) = Just ty-referencedType (FunctionType (FunType ty _ _ _)) = Just ty-referencedType (ArrayType ty _ _ _) = Just ty-referencedType (TypeDefType (TypeDefRef _ (Just actual_ty) _)) = Just actual_ty-referencedType (DirectType _ _) = Nothing-referencedType _ = error "referencedType: failed to resolve type"--hasTypeOfExpr :: Type -> Bool-hasTypeOfExpr (TypeOfExpr _) = True-hasTypeOfExpr ty = maybe False hasTypeOfExpr (referencedType ty)---- | return @True@ if the given type is a function type------ Result is undefined in the presence of TypeOfExpr or undefined typeDefs-isFunctionType :: Type -> Bool-isFunctionType ty =- case ty of TypeDefType (TypeDefRef _ (Just actual_ty) _) -> isFunctionType actual_ty- TypeDefType _ -> error "isFunctionType: unresolved typeDef"- TypeOfExpr _ -> error "isFunctionType: typeof(expr)"- FunctionType _ -> True- _ -> False+data FunType = FunType Type [ParamDecl] Bool+ | FunTypeIncomplete Type+ deriving (Data, Show) -- | An array type may either have unknown size or a specified array size, the latter either variable or constant. -- Furthermore, when used as a function parameters, the size may be qualified as /static/.@@ -374,7 +368,7 @@ -- ^ @UnknownArraySize is-starred@ | ArraySize Bool Expr -- ^ @FixedSizeArray is-static size-expr@- deriving (Typeable, Data)+ deriving (Data, Show) -- | normalized type representation data TypeName =@@ -385,16 +379,17 @@ | TyComp CompTypeRef | TyEnum EnumTypeRef | TyBuiltin BuiltinType- deriving (Typeable, Data)+ deriving (Data, Show) --- | Builtin type (va_list)+-- | Builtin type (va_list, anything) data BuiltinType = TyVaList- deriving (Typeable, Data)+ | TyAny+ deriving (Data, Show) -- | typdef references -- If the actual type is known, it is attached for convenience-data TypeDefRef = TypeDefRef Ident (Maybe Type) NodeInfo- deriving (Typeable, Data {-! CNode !-})+data TypeDefRef = TypeDefRef Ident Type NodeInfo+ deriving (Data {-! ,CNode !-}, Show) -- | integral types (C99 6.7.2.2) data IntType =@@ -406,11 +401,13 @@ | TyUShort | TyInt | TyUInt+ | TyInt128+ | TyUInt128 | TyLong | TyULong | TyLLong | TyULLong- deriving (Typeable, Data, Eq, Ord)+ deriving (Data, Eq, Ord) instance Show IntType where show TyBool = "_Bool"@@ -421,6 +418,8 @@ show TyUShort = "unsigned short" show TyInt = "int" show TyUInt = "unsigned int"+ show TyInt128 = "__int128"+ show TyUInt128 = "unsigned __int128" show TyLong = "long" show TyULong = "unsigned long" show TyLLong = "long long"@@ -431,38 +430,42 @@ TyFloat | TyDouble | TyLDouble- deriving (Typeable, Data, Eq, Ord)+ | TyBFloat16+ | TyFloatN Int Bool+ deriving (Data, Eq, Ord) instance Show FloatType where show TyFloat = "float" show TyDouble = "double" show TyLDouble = "long double"+ show TyBFloat16 = "__bf16"+ show (TyFloatN n x) = "_Float" ++ (show n) ++ (if x then "x" else "") -- | composite type declarations data CompTypeRef = CompTypeRef SUERef CompTyKind NodeInfo- deriving (Typeable, Data {-! CNode !-})+ deriving (Data {-! ,CNode !-}, Show) instance HasSUERef CompTypeRef where sueRef (CompTypeRef ref _ _) = ref instance HasCompTyKind CompTypeRef where compTag (CompTypeRef _ tag _) = tag data EnumTypeRef = EnumTypeRef SUERef NodeInfo- deriving (Typeable, Data {-! CNode !-})+ deriving (Data {-! ,CNode !-}, Show) instance HasSUERef EnumTypeRef where sueRef (EnumTypeRef ref _) = ref -- | Composite type (struct or union). data CompType = CompType SUERef CompTyKind [MemberDecl] Attributes NodeInfo- deriving (Typeable, Data {-! CNode !-} )+ deriving (Data {-! ,CNode !-}, Show) instance HasSUERef CompType where sueRef (CompType ref _ _ _ _) = ref instance HasCompTyKind CompType where compTag (CompType _ tag _ _ _) = tag -- | return the type of a composite type definition typeOfCompDef :: CompType -> TypeName-typeOfCompDef (CompType ref tag _ _ _) = TyComp (CompTypeRef ref tag internalNode)+typeOfCompDef (CompType ref tag _ _ _) = TyComp (CompTypeRef ref tag undefNode) -- | a tag to determine wheter we refer to a @struct@ or @union@, see 'CompType'. data CompTyKind = StructTag | UnionTag- deriving (Eq,Ord,Typeable,Data)+ deriving (Eq,Ord,Data) instance Show CompTyKind where show StructTag = "struct"@@ -471,35 +474,51 @@ -- | Representation of C enumeration types data EnumType = EnumType SUERef [Enumerator] Attributes NodeInfo -- ^ @EnumType name enumeration-constants attrs node@- deriving (Typeable, Data {-! CNode !-} )+ deriving (Data {-! ,CNode !-}, Show) instance HasSUERef EnumType where sueRef (EnumType ref _ _ _) = ref -- | return the type of an enum definition typeOfEnumDef :: EnumType -> TypeName-typeOfEnumDef (EnumType ref _ _ _) = TyEnum (EnumTypeRef ref internalNode)+typeOfEnumDef (EnumType ref _ _ _) = TyEnum (EnumTypeRef ref undefNode) -- | An Enumerator consists of an identifier, a constant expressions and the link to its type data Enumerator = Enumerator Ident Expr EnumType NodeInfo- deriving (Typeable, Data {-! CNode !-})+ deriving (Data {-! ,CNode !-}, Show) instance Declaration Enumerator where getVarDecl (Enumerator ide _ enumty _) = VarDecl (VarName ide Nothing)- (DeclAttrs False NoStorage [])- (DirectType (typeOfEnumDef enumty) noTypeQuals)+ (DeclAttrs noFunctionAttrs NoStorage [])+ (DirectType (typeOfEnumDef enumty) noTypeQuals noAttributes) -- | Type qualifiers: constant, volatile and restrict-data TypeQuals = TypeQuals { constant :: Bool, volatile :: Bool, restrict :: Bool }- deriving (Typeable, Data)+data TypeQuals = TypeQuals { constant :: Bool, volatile :: Bool,+ restrict :: Bool, atomic :: Bool,+ nullable :: Bool, nonnull :: Bool,+ clrdonly :: Bool, clwronly :: Bool }+ deriving (Data, Show) +instance Eq TypeQuals where+ (==) (TypeQuals c1 v1 r1 a1 n1 nn1 rd1 wr1) (TypeQuals c2 v2 r2 a2 n2 nn2 rd2 wr2) =+ c1 == c2 && v1 == v2 && r1 == r2 && a1 == a2 && n1 == n2 && nn1 == nn2+ && rd1 == rd2 && wr1 == wr2++instance Ord TypeQuals where+ (<=) (TypeQuals c1 v1 r1 a1 n1 nn1 rd1 wr1) (TypeQuals c2 v2 r2 a2 n2 nn2 rd2 wr2) =+ c1 <= c2 && v1 <= v2 && r1 <= r2 && a1 <= a2 && n1 <= n2 && nn1 <= nn2+ && rd1 <= rd2 && wr1 <= wr2++ -- | no type qualifiers noTypeQuals :: TypeQuals-noTypeQuals = TypeQuals False False False+noTypeQuals = TypeQuals False False False False False False False False -- | merge (/&&/) two type qualifier sets mergeTypeQuals :: TypeQuals -> TypeQuals -> TypeQuals-mergeTypeQuals (TypeQuals c1 v1 r1) (TypeQuals c2 v2 r2) = TypeQuals (c1 && c2) (v1 && v2) (r1 && r2)+mergeTypeQuals (TypeQuals c1 v1 r1 a1 n1 nn1 rd1 wr1) (TypeQuals c2 v2 r2 a2 n2 nn2 rd2 wr2) =+ TypeQuals (c1 && c2) (v1 && v2) (r1 && r2) (a1 && a2) (n1 && n2) (nn1 && nn2)+ (rd1 && rd2) (wr1 && wr2) -- * initializers @@ -521,11 +540,15 @@ -- | @VarName name assembler-name@ is a name of an declared object data VarName = VarName Ident (Maybe AsmName) | NoName- deriving (Typeable, Data)+ deriving (Data, Show) identOfVarName :: VarName -> Ident identOfVarName NoName = error "identOfVarName: NoName" identOfVarName (VarName ident _) = ident +isNoName :: VarName -> Bool+isNoName NoName = True+isNoName _ = False+ -- | Top level assembler block (alias for @CStrLit@) type AsmBlock = CStrLit @@ -551,109 +574,115 @@ -- -- /TODO/: ultimatively, we want to parse attributes and represent them in a typed way data Attr = Attr Ident [Expr] NodeInfo- deriving (Typeable, Data {-! CNode !-})+ deriving (Data {-! ,CNode !-}, Show) type Attributes = [Attr] +-- |Empty attribute list+noAttributes :: Attributes+noAttributes = []++-- |Merge attribute lists+-- /TODO/: currently does not remove duplicates+mergeAttributes :: Attributes -> Attributes -> Attributes+mergeAttributes = (++)+ -- * statements and expressions (Type aliases) -- | 'Stmt' is an alias for 'CStat' (Syntax) type Stmt = CStat -- | 'Expr' is currently an alias for 'CExpr' (Syntax) type Expr = CExpr--------------------------------------------------------------- DERIVES GENERATED CODE--- DO NOT MODIFY BELOW THIS LINE--- CHECKSUM: 1672142450+-- GENERATED START -instance CNode TagDef- where nodeInfo (CompDef d) = nodeInfo d- nodeInfo (EnumDef d) = nodeInfo d-instance Pos TagDef- where posOf x = posOfNode (nodeInfo x)+instance CNode TagDef where+ nodeInfo (CompDef d) = nodeInfo d+ nodeInfo (EnumDef d) = nodeInfo d+instance Pos TagDef where+ posOf x = posOf (nodeInfo x) -instance CNode IdentDecl- where nodeInfo (Declaration d) = nodeInfo d- nodeInfo (ObjectDef d) = nodeInfo d- nodeInfo (FunctionDef d) = nodeInfo d- nodeInfo (EnumeratorDef d) = nodeInfo d-instance Pos IdentDecl- where posOf x = posOfNode (nodeInfo x)+instance CNode IdentDecl where+ nodeInfo (Declaration d) = nodeInfo d+ nodeInfo (ObjectDef d) = nodeInfo d+ nodeInfo (FunctionDef d) = nodeInfo d+ nodeInfo (EnumeratorDef d) = nodeInfo d+instance Pos IdentDecl where+ posOf x = posOf (nodeInfo x) -instance CNode DeclEvent- where nodeInfo (TagEvent d) = nodeInfo d- nodeInfo (DeclEvent d) = nodeInfo d- nodeInfo (TypeDefEvent d) = nodeInfo d- nodeInfo (AsmEvent d) = nodeInfo d-instance Pos DeclEvent- where posOf x = posOfNode (nodeInfo x)+instance CNode DeclEvent where+ nodeInfo (TagEvent d) = nodeInfo d+ nodeInfo (DeclEvent d) = nodeInfo d+ nodeInfo (ParamEvent d) = nodeInfo d+ nodeInfo (LocalEvent d) = nodeInfo d+ nodeInfo (TypeDefEvent d) = nodeInfo d+ nodeInfo (AsmEvent d) = nodeInfo d+instance Pos DeclEvent where+ posOf x = posOf (nodeInfo x) -instance CNode Decl- where nodeInfo (Decl _ nodeinfo) = nodeinfo-instance Pos Decl- where posOf x = posOfNode (nodeInfo x)+instance CNode Decl where+ nodeInfo (Decl _ n) = n+instance Pos Decl where+ posOf x = posOf (nodeInfo x) -instance CNode ObjDef- where nodeInfo (ObjDef _ _ nodeinfo) = nodeinfo-instance Pos ObjDef- where posOf x = posOfNode (nodeInfo x)+instance CNode ObjDef where+ nodeInfo (ObjDef _ _ n) = n+instance Pos ObjDef where+ posOf x = posOf (nodeInfo x) -instance CNode FunDef- where nodeInfo (FunDef _ _ nodeinfo) = nodeinfo-instance Pos FunDef- where posOf x = posOfNode (nodeInfo x)+instance CNode FunDef where+ nodeInfo (FunDef _ _ n) = n+instance Pos FunDef where+ posOf x = posOf (nodeInfo x) -instance CNode ParamDecl- where nodeInfo (ParamDecl _ nodeinfo) = nodeinfo- nodeInfo (AbstractParamDecl _ nodeinfo) = nodeinfo-instance Pos ParamDecl- where posOf x = posOfNode (nodeInfo x)+instance CNode ParamDecl where+ nodeInfo (ParamDecl _ n) = n+ nodeInfo (AbstractParamDecl _ n) = n+instance Pos ParamDecl where+ posOf x = posOf (nodeInfo x) -instance CNode MemberDecl- where nodeInfo (MemberDecl _ _ nodeinfo) = nodeinfo- nodeInfo (AnonBitField _ _ nodeinfo) = nodeinfo-instance Pos MemberDecl- where posOf x = posOfNode (nodeInfo x)+instance CNode MemberDecl where+ nodeInfo (MemberDecl _ _ n) = n+ nodeInfo (AnonBitField _ _ n) = n+instance Pos MemberDecl where+ posOf x = posOf (nodeInfo x) -instance CNode TypeDef- where nodeInfo (TypeDef _ _ _ nodeinfo) = nodeinfo-instance Pos TypeDef- where posOf x = posOfNode (nodeInfo x)+instance CNode TypeDef where+ nodeInfo (TypeDef _ _ _ n) = n+instance Pos TypeDef where+ posOf x = posOf (nodeInfo x) -instance CNode TypeDefRef- where nodeInfo (TypeDefRef _ _ nodeinfo) = nodeinfo-instance Pos TypeDefRef- where posOf x = posOfNode (nodeInfo x)+instance CNode TypeDefRef where+ nodeInfo (TypeDefRef _ _ n) = n+instance Pos TypeDefRef where+ posOf x = posOf (nodeInfo x) -instance CNode CompTypeRef- where nodeInfo (CompTypeRef _ _ nodeinfo) = nodeinfo-instance Pos CompTypeRef- where posOf x = posOfNode (nodeInfo x)+instance CNode CompTypeRef where+ nodeInfo (CompTypeRef _ _ n) = n+instance Pos CompTypeRef where+ posOf x = posOf (nodeInfo x) -instance CNode EnumTypeRef- where nodeInfo (EnumTypeRef _ nodeinfo) = nodeinfo-instance Pos EnumTypeRef- where posOf x = posOfNode (nodeInfo x)+instance CNode EnumTypeRef where+ nodeInfo (EnumTypeRef _ n) = n+instance Pos EnumTypeRef where+ posOf x = posOf (nodeInfo x) -instance CNode CompType- where nodeInfo (CompType _ _ _ _ nodeinfo) = nodeinfo-instance Pos CompType- where posOf x = posOfNode (nodeInfo x)+instance CNode CompType where+ nodeInfo (CompType _ _ _ _ n) = n+instance Pos CompType where+ posOf x = posOf (nodeInfo x) -instance CNode EnumType- where nodeInfo (EnumType _ _ _ nodeinfo) = nodeinfo-instance Pos EnumType- where posOf x = posOfNode (nodeInfo x)+instance CNode EnumType where+ nodeInfo (EnumType _ _ _ n) = n+instance Pos EnumType where+ posOf x = posOf (nodeInfo x) -instance CNode Enumerator- where nodeInfo (Enumerator _ _ _ nodeinfo) = nodeinfo-instance Pos Enumerator- where posOf x = posOfNode (nodeInfo x)+instance CNode Enumerator where+ nodeInfo (Enumerator _ _ _ n) = n+instance Pos Enumerator where+ posOf x = posOf (nodeInfo x) -instance CNode Attr- where nodeInfo (Attr _ _ nodeinfo) = nodeinfo-instance Pos Attr- where posOf x = posOfNode (nodeInfo x)+instance CNode Attr where+ nodeInfo (Attr _ _ n) = n+instance Pos Attr where+ posOf x = posOf (nodeInfo x)+-- GENERATED STOP
src/Language/C/Analysis/TravMonad.hs view
@@ -1,5 +1,6 @@-{-# LANGUAGE MultiParamTypeClasses, TypeSynonymInstances, FlexibleContexts,FlexibleInstances,- PatternSignatures, PatternGuards, RankNTypes, ScopedTypeVariables #-}+{-# LANGUAGE MultiParamTypeClasses, FlexibleContexts,FlexibleInstances,+ PatternGuards, RankNTypes, ScopedTypeVariables, LambdaCase #-}+{-# OPTIONS_GHC -Wwarn=incomplete-uni-patterns #-} ----------------------------------------------------------------------------- -- | -- Module : Language.C.Analysis.TravMonad@@ -16,6 +17,12 @@ -- Furthermore, the user may provide callbacks to handle declarations and definitions. ----------------------------------------------------------------------------- module Language.C.Analysis.TravMonad (+ -- * Name generation monad+ MonadName(..),+ -- * Symbol table monad+ MonadSymtab(..),+ -- * Specialized C error-handling monad+ MonadCError(..), -- * AST traversal monad MonadTrav(..), -- * Handling declarations@@ -34,57 +41,71 @@ hadHardErrors,handleTravError,throwOnLeft, astError, warn, -- * Trav - default MonadTrav implementation- Trav,- runTrav,runTrav_,+ Trav, TravT,+ runTravT, runTravTWithTravState, runTrav, runTrav_, TravState,initTravState,withExtDeclHandler,modifyUserState,userState,+ getUserState,+ TravOptions(..),modifyOptions, travErrors,+ -- * Language options+ CLanguage(..), -- * Helpers mapMaybeM,maybeM,mapSndM,concatMapM, ) where import Language.C.Data import Language.C.Data.RList as RList-import Language.C.Syntax +import Language.C.Analysis.Builtins import Language.C.Analysis.SemError import Language.C.Analysis.SemRep+import Language.C.Analysis.TypeUtils (sameType) import Language.C.Analysis.DefTable hiding (enterBlockScope,leaveBlockScope, enterFunctionScope,leaveFunctionScope) import qualified Language.C.Analysis.DefTable as ST +import Data.IntMap (insert) import Data.Maybe-import Control.Monad(liftM)+import Control.Applicative (Applicative(..))+import Control.Monad (liftM, ap)+import Control.Monad.Identity (Identity, runIdentity)+import Control.Monad.State.Class (MonadState, get, put, modify, gets)+import Control.Monad.Trans (MonadTrans, lift)+import Control.Monad.IO.Class (MonadIO, liftIO)+import Prelude hiding (Applicative(..), lookup) --- | Traversal monad-class (Monad m) => MonadTrav m where+class (Monad m) => MonadName m where+ -- | unique name generation+ genName :: m Name++class (Monad m) => MonadSymtab m where+ -- symbol table handling+ -- | return the definition table+ getDefTable :: m DefTable+ -- | perform an action modifying the definition table+ withDefTable :: (DefTable -> (a, DefTable)) -> m a++class (Monad m) => MonadCError m where -- error handling facilities -- | throw an 'Error' throwTravError :: Error e => e -> m a -- | catch an 'Error' (we could implement dynamically-typed catch here) catchTravError :: m a -> (CError -> m a) -> m a- -- | remember that an 'Error' occured (without throwing it)+ -- | remember that an 'Error' occurred (without throwing it) recordError :: Error e => e -> m () -- | return the list of recorded errors getErrors :: m [CError] - -- symbol table handling-- -- | return the definition table- getDefTable :: m DefTable- -- | perform an action modifying the definition table- withDefTable :: (DefTable -> (a, DefTable)) -> m a-- -- | unique name generation- genName :: m Name-+-- | Traversal monad+class (MonadName m, MonadSymtab m, MonadCError m) => MonadTrav m where -- | handling declarations and definitions handleDecl :: DeclEvent -> m () -- * handling declarations -- check wheter a redefinition is ok-checkRedef :: (MonadTrav m, CNode t, CNode t1) => String -> t -> (DeclarationStatus t1) -> m ()+checkRedef :: (MonadCError m, CNode t, CNode t1) => String -> t -> (DeclarationStatus t1) -> m () checkRedef subject new_decl redecl_status = case redecl_status of NewDecl -> return ()@@ -97,12 +118,12 @@ -- redefinition LevelWarn subject ShadowedDef (nodeInfo new_decl) (nodeInfo old_def) KeepDef _old_def -> return () --- | forward declaration of a tag. Only neccessary for name analysis, but otherwise no semantic+-- | forward declaration of a tag. Only necessary for name analysis, but otherwise no semantic -- consequences.-handleTagDecl :: (MonadTrav m) => TagFwdDecl -> m ()+handleTagDecl :: (MonadCError m, MonadSymtab m) => TagFwdDecl -> m () handleTagDecl decl = do redecl <- withDefTable $ declareTag (sueRef decl) decl- checkRedef (show $ sueRef decl) decl redecl+ checkRedef (sueRefToString $ sueRef decl) decl redecl -- | define the given composite type or enumeration -- If there is a declaration visible, overwrite it with the definition.@@ -111,82 +132,108 @@ handleTagDef :: (MonadTrav m) => TagDef -> m () handleTagDef def = do redecl <- withDefTable $ defineTag (sueRef def) def- checkRedef (show $ sueRef def) def redecl+ checkRedef (sueRefToString $ sueRef def) def redecl handleDecl (TagEvent def) -handleEnumeratorDef :: (MonadTrav m) => Enumerator -> m ()+handleEnumeratorDef :: (MonadCError m, MonadSymtab m) => Enumerator -> m () handleEnumeratorDef enumerator = do let ident = declIdent enumerator redecl <- withDefTable $ defineScopedIdent ident (EnumeratorDef enumerator)- checkRedef (show ident) ident redecl+ checkRedef (identToString ident) ident redecl return () handleTypeDef :: (MonadTrav m) => TypeDef -> m ()-handleTypeDef typeDef@(TypeDef ident _ _ _) = do+handleTypeDef typeDef@(TypeDef ident t1 _ _) = do redecl <- withDefTable $ defineTypeDef ident typeDef- checkRedef (show ident) typeDef redecl+ -- C11 6.7/3 If an identifier has no linkage, there shall be no more than+ -- one declaration of the identifier (in a declarator or type specifier)+ -- with the same scope and in the same name space, except that: a typedef+ -- name may be redefined to denote the same type as it currently does,+ -- provided that type is not a variably modified type;+ case redecl of+ Redeclared (Left (TypeDef _ t2 _ _)) | sameType t1 t2 -> return ()+ _ -> checkRedef (identToString ident) typeDef redecl handleDecl (TypeDefEvent typeDef) return () handleAsmBlock :: (MonadTrav m) => AsmBlock -> m () handleAsmBlock asm = handleDecl (AsmEvent asm) -redefErr :: (MonadTrav m, CNode old, CNode new) => Ident -> ErrorLevel -> new -> old -> RedefKind -> m ()+redefErr :: (MonadCError m, CNode old, CNode new) =>+ Ident -> ErrorLevel -> new -> old -> RedefKind -> m () redefErr name lvl new old kind =- throwTravError $ redefinition lvl (show name) kind (nodeInfo new) (nodeInfo old)+ throwTravError $ redefinition lvl (identToString name) kind (nodeInfo new) (nodeInfo old) -- TODO: unused-checkIdentTyRedef :: (MonadTrav m) => IdentEntry -> (DeclarationStatus IdentEntry) -> m ()-checkIdentTyRedef (Right decl) status = checkVarRedef decl status-checkIdentTyRedef (Left tydef) (KindMismatch old_def) =+_checkIdentTyRedef :: (MonadCError m) => IdentEntry -> (DeclarationStatus IdentEntry) -> m ()+_checkIdentTyRedef (Right decl) status = checkVarRedef decl status+_checkIdentTyRedef (Left tydef) (KindMismatch old_def) = redefErr (identOfTypeDef tydef) LevelError tydef old_def DiffKindRedecl-checkIdentTyRedef (Left tydef) (Redeclared old_def) =+_checkIdentTyRedef (Left tydef) (Redeclared old_def) = redefErr (identOfTypeDef tydef) LevelError tydef old_def DuplicateDef-checkIdentTyRedef (Left _tydef) _ = return ()+_checkIdentTyRedef (Left _tydef) _ = return () -checkVarRedef :: (MonadTrav m) => IdentDecl -> (DeclarationStatus IdentEntry) -> m ()+-- Check whether it is ok to declare a variable already in scope+checkVarRedef :: (MonadCError m) => IdentDecl -> (DeclarationStatus IdentEntry) -> m () checkVarRedef def redecl = case redecl of -- always an error KindMismatch old_def -> redefVarErr old_def DiffKindRedecl- -- types have to match- KeepDef (Right old_def) -> throwOnLeft $ checkCompatibleTypes new_ty (declType old_def)- -- redeclaration: old entry has to be a declaration or tentative, type have to match- Redeclared (Right old_def) | isTentativeG old_def ->- throwOnLeft $ checkCompatibleTypes new_ty (declType old_def)- | otherwise -> redefVarErr old_def DuplicateDef+ -- Declaration referencing definition:+ -- * new entry has to be a declaration+ -- * old entry and new entry have to have linkage and agree on linkage+ -- * types have to match+ KeepDef (Right old_def) | not (agreeOnLinkage def old_def) -> linkageErr def old_def+ | otherwise -> throwOnLeft $ checkCompatibleTypes new_ty (declType old_def)+ -- redefinition:+ -- * old entry has to be a declaration or tentative definition+ -- * old entry and new entry have to have linkage and agree on linkage+ -- * types have to match+ Redeclared (Right old_def) | not (agreeOnLinkage def old_def) -> linkageErr def old_def+ | not(canBeOverwritten old_def) -> redefVarErr old_def DuplicateDef+ | otherwise -> throwOnLeft $ checkCompatibleTypes new_ty (declType old_def) -- NewDecl/Shadowed is ok _ -> return () where redefVarErr old_def kind = redefErr (declIdent def) LevelError def old_def kind+ linkageErr new_def old_def =+ case (declLinkage new_def, declLinkage old_def) of+ (NoLinkage, _) -> redefErr (declIdent new_def) LevelError new_def old_def NoLinkageOld+ _ -> redefErr (declIdent new_def) LevelError new_def old_def DisagreeLinkage+ new_ty = declType def- isTentativeG (Declaration _) = True- isTentativeG (ObjectDef od) = isTentative od- isTentativeG _ = False+ canBeOverwritten (Declaration _) = True+ canBeOverwritten (ObjectDef od) = isTentative od+ canBeOverwritten _ = False+ agreeOnLinkage new_def old_def+ | declStorage old_def == FunLinkage InternalLinkage = True+ | not (hasLinkage $ declStorage new_def) || not (hasLinkage $ declStorage old_def) = False+ | (declLinkage new_def) /= (declLinkage old_def) = False+ | otherwise = True -- | handle variable declarations (external object declarations and function prototypes) -- variable declarations are either function prototypes, or external declarations, and not very -- interesting on their own. we only put them in the symbol table and call the handle. -- declarations never override definitions-handleVarDecl :: (MonadTrav m) => Decl -> m ()-handleVarDecl decl = do+handleVarDecl :: (MonadTrav m) => Bool -> Decl -> m ()+handleVarDecl is_local decl = do def <- enterDecl decl (const False)- handleDecl (DeclEvent def)+ handleDecl ((if is_local then LocalEvent else DeclEvent) def) -- | handle parameter declaration. The interesting part is that parameters can be abstract -- (if they are part of a type). If they have a name, we enter the name (usually in function prototype or function scope),--- checking if there are duplicate definitions. +-- checking if there are duplicate definitions. -- FIXME: I think it would be more transparent to handle parameter declarations in a special way handleParamDecl :: (MonadTrav m) => ParamDecl -> m ()-handleParamDecl (AbstractParamDecl _ _) = return ()-handleParamDecl (ParamDecl vardecl node) = do+handleParamDecl pd@(AbstractParamDecl _ _) = handleDecl (ParamEvent pd)+handleParamDecl pd@(ParamDecl vardecl node) = do let def = ObjectDef (ObjDef vardecl Nothing node) redecl <- withDefTable $ defineScopedIdent (declIdent def) def checkVarRedef def redecl- return ()+ handleDecl (ParamEvent pd) -- shared impl-enterDecl :: (MonadTrav m) => Decl -> (IdentDecl -> Bool) -> m IdentDecl+enterDecl :: (MonadCError m, MonadSymtab m) => Decl -> (IdentDecl -> Bool) -> m IdentDecl enterDecl decl cond = do let def = Declaration decl redecl <- withDefTable $@@ -211,20 +258,20 @@ checkCompatibleTypes _ _ = Right () -- | handle object defintions (maybe tentative)-handleObjectDef :: (MonadTrav m) => Ident -> ObjDef -> m ()-handleObjectDef ident obj_def = do+handleObjectDef :: (MonadTrav m) => Bool -> Ident -> ObjDef -> m ()+handleObjectDef local ident obj_def = do let def = ObjectDef obj_def redecl <- withDefTable $- defineScopedIdentWhen (\o -> shouldOverride def o) ident def+ defineScopedIdentWhen (shouldOverride def) ident def checkVarRedef def redecl- handleDecl (DeclEvent def)+ handleDecl ((if local then LocalEvent else DeclEvent) def) where isTentativeDef (ObjectDef object_def) = isTentative object_def isTentativeDef _ = False- shouldOverride def o | isDeclaration o = True- | not (isTentativeDef def) = True- | isTentativeDef o = True- | otherwise = False+ shouldOverride def old | isDeclaration old = True+ | not (isTentativeDef def) = True+ | isTentativeDef old = True+ | otherwise = False -- * scope manipulation --@@ -235,25 +282,25 @@ -- * function scope: labels are visible within the entire function, and declared implicitely -- -- * block scope-updDefTable :: (MonadTrav m) => (DefTable -> DefTable) -> m ()+updDefTable :: (MonadSymtab m) => (DefTable -> DefTable) -> m () updDefTable f = withDefTable (\st -> ((),f st)) -enterPrototypeScope :: (MonadTrav m) => m ()+enterPrototypeScope :: (MonadSymtab m) => m () enterPrototypeScope = updDefTable (ST.enterBlockScope) -leavePrototypeScope :: (MonadTrav m) => m ()+leavePrototypeScope :: (MonadSymtab m) => m () leavePrototypeScope = updDefTable (ST.leaveBlockScope) -enterFunctionScope :: (MonadTrav m) => m ()+enterFunctionScope :: (MonadSymtab m) => m () enterFunctionScope = updDefTable (ST.enterFunctionScope) -leaveFunctionScope :: (MonadTrav m) => m ()+leaveFunctionScope :: (MonadSymtab m) => m () leaveFunctionScope = updDefTable (ST.leaveFunctionScope) -enterBlockScope :: (MonadTrav m) => m ()+enterBlockScope :: (MonadSymtab m) => m () enterBlockScope = updDefTable (ST.enterBlockScope) -leaveBlockScope :: (MonadTrav m) => m ()+leaveBlockScope :: (MonadSymtab m) => m () leaveBlockScope = updDefTable (ST.leaveBlockScope) -- * Lookup@@ -262,27 +309,42 @@ -- the 'wrong kind of object' is an internal error here, -- because the parser should distinguish typeDefs and other -- objects-lookupTypeDef :: (MonadTrav m) => Ident -> m Type+lookupTypeDef :: (MonadCError m, MonadSymtab m) => Ident -> m Type lookupTypeDef ident = getDefTable >>= \symt -> case lookupIdent ident symt of- Nothing -> astError (nodeInfo ident) "unbound typeDef"- Just (Left (TypeDef _ident ty _ _)) -> return ty+ Nothing ->+ astError (nodeInfo ident) $ "unbound typeDef: " ++ identToString ident+ Just (Left (TypeDef def_ident ty _ _)) -> addRef ident def_ident >> return ty Just (Right d) -> astError (nodeInfo ident) (wrongKindErrMsg d) where- wrongKindErrMsg d = "wrong kind of object: excepcted typeDef but found: "++(objKindDescr d)+ wrongKindErrMsg d = "wrong kind of object: expected typedef but found "++ (objKindDescr d)+ ++ " (for identifier `" ++ identToString ident ++ "')" -- | lookup an object, function or enumerator-lookupObject :: (MonadTrav m) => Ident -> m (Maybe IdentDecl)+lookupObject :: (MonadCError m, MonadSymtab m) => Ident -> m (Maybe IdentDecl) lookupObject ident = do old_decl <- liftM (lookupIdent ident) getDefTable mapMaybeM old_decl $ \obj -> case obj of- Right objdef -> return objdef+ Right objdef -> addRef ident objdef >> return objdef Left _tydef -> astError (nodeInfo ident) (mismatchErr "lookupObject" "an object" "a typeDef") +-- | add link between use and definition (private)+addRef :: (MonadCError m, MonadSymtab m, CNode u, CNode d) => u -> d -> m ()+addRef use def =+ case (nodeInfo use, nodeInfo def) of+ (NodeInfo _ _ useName, NodeInfo _ _ defName) ->+ withDefTable+ (\dt ->+ ((),+ dt { refTable = insert (nameId useName) defName (refTable dt) }+ )+ )+ (_, _) -> return () -- Don't have Names for both, so can't record. + mismatchErr :: String -> String -> String -> String mismatchErr ctx expect found = ctx ++ ": Expected " ++ expect ++ ", but found: " ++ found @@ -293,84 +355,91 @@ -- This currently depends on the fact the structs are tagged with unique names. -- We could use the name generation of TravMonad as well, which might be the better -- choice when dealing with autogenerated code.-createSUERef :: (MonadTrav m) => NodeInfo -> Maybe Ident -> m SUERef+createSUERef :: (MonadCError m, MonadSymtab m) => NodeInfo -> Maybe Ident -> m SUERef createSUERef _node_info (Just ident) = return$ NamedRef ident createSUERef node_info Nothing | (Just name) <- nameOfNode node_info = return $ AnonymousRef name | otherwise = astError node_info "struct/union/enum definition without unique name" -- * error handling facilities -handleTravError :: (MonadTrav m) => m a -> m (Maybe a)+handleTravError :: (MonadCError m) => m a -> m (Maybe a) handleTravError a = liftM Just a `catchTravError` (\e -> recordError e >> return Nothing) --- | check wheter non-recoverable errors occured+-- | check wheter non-recoverable errors occurred hadHardErrors :: [CError] -> Bool-hadHardErrors = (not . null . filter isHardError)+hadHardErrors = any isHardError -- | raise an error caused by a malformed AST-astError :: (MonadTrav m) => NodeInfo -> String -> m a+astError :: (MonadCError m) => NodeInfo -> String -> m a astError node msg = throwTravError $ invalidAST node msg -- | raise an error based on an Either argument-throwOnLeft :: (MonadTrav m, Error e) => Either e a -> m a+throwOnLeft :: (MonadCError m, Error e) => Either e a -> m a throwOnLeft (Left err) = throwTravError err throwOnLeft (Right v) = return v -warn :: (Error e, MonadTrav m) => e -> m ()+warn :: (Error e, MonadCError m) => e -> m () warn err = recordError (changeErrorLevel err LevelWarn) -- * The Trav datatype -- | simple traversal monad, providing user state and callbacks-newtype Trav s a = Trav { unTrav :: TravState s -> Either CError (a, TravState s) }-modify :: (TravState s -> TravState s) -> Trav s ()-modify f = Trav (\s -> Right ((),f s))-gets :: (TravState s -> a) -> Trav s a-gets f = Trav (\s -> Right (f s, s))-get :: Trav s (TravState s)-get = Trav (\s -> Right (s,s))-put :: TravState s -> Trav s ()-put s = Trav (\_ -> Right ((),s))+newtype TravT s m a = TravT { unTravT :: TravState m s -> m (Either CError (a, TravState m s)) } -runTrav :: forall s a. s -> Trav s a -> Either [CError] (a, TravState s)-runTrav state traversal =- case unTrav action (initTravState state) of+instance Monad m => MonadState (TravState m s) (TravT s m) where+ get = TravT (\s -> return (Right (s,s)))+ put s = TravT (\_ -> return (Right ((),s)))++runTravT :: forall m s a. Monad m => s -> TravT s m a -> m (Either [CError] (a, TravState m s))+runTravT state traversal =+ runTravTWithTravState (initTravState state) $ do+ withDefTable (const ((), builtins))+ traversal++runTravTWithTravState :: forall s m a. Monad m => TravState m s -> TravT s m a -> m (Either [CError] (a, TravState m s))+runTravTWithTravState state traversal =+ unTravT traversal state >>= pure . \case Left trav_err -> Left [trav_err] Right (v, ts) | hadHardErrors (travErrors ts) -> Left (travErrors ts) | otherwise -> Right (v,ts)- where- action = do withDefTable $ defineTypeDef (identOfTypeDef va_list) va_list- traversal- va_list = (TypeDef (internalIdent "__builtin_va_list")- (DirectType (TyBuiltin TyVaList) noTypeQuals)- []- (internalNode)) +runTrav :: forall s a. s -> Trav s a -> Either [CError] (a, TravState Identity s)+runTrav state traversal = runIdentity (runTravT state (unTrav traversal))+ runTrav_ :: Trav () a -> Either [CError] (a,[CError]) runTrav_ t = fmap fst . runTrav () $ do r <- t es <- getErrors return (r,es) -withExtDeclHandler :: Trav s a -> (DeclEvent -> Trav s ()) -> Trav s a+withExtDeclHandler :: Monad m => TravT s m a -> (DeclEvent -> TravT s m ()) -> TravT s m a withExtDeclHandler action handler = do modify $ \st -> st { doHandleExtDecl = handler } action -instance Monad (Trav s) where- return x = Trav (\s -> Right (x,s))- m >>= k = Trav (\s -> case unTrav m s of- Right (x,s1) -> unTrav (k x) s1- Left e -> Left e)+instance Monad f => Functor (TravT s f) where+ fmap = liftM -instance MonadTrav (Trav s) where- -- error handling facilities- throwTravError e = Trav (\_ -> Left (toError e))- catchTravError a handler = Trav (\s -> case unTrav a s of- Left e -> unTrav (handler e) s- Right r -> Right r)- recordError e = modify $ \st -> st { rerrors = (rerrors st) `snoc` toError e }- getErrors = gets (RList.reverse . rerrors)+instance Monad f => Applicative (TravT s f) where+ pure x = TravT (\s -> return (Right (x,s)))+ (<*>) = ap++instance Monad m => Monad (TravT s m) where+ m >>= k = TravT (\s -> unTravT m s >>= \y -> case y of+ Right (x,s1) -> unTravT (k x) s1+ Left e -> return (Left e))++instance MonadTrans (TravT s) where+ lift m = TravT (\s -> (\x -> Right (x, s)) <$> m)++instance MonadIO m => MonadIO (TravT s m) where+ liftIO = lift . liftIO++instance Monad m => MonadName (TravT s m) where+ -- unique name generation+ genName = generateName++instance Monad m => MonadSymtab (TravT s m) where -- symbol table handling getDefTable = gets symbolTable withDefTable f = do@@ -378,38 +447,68 @@ let (r,symt') = f (symbolTable ts) put $ ts { symbolTable = symt' } return r- -- unique name generation- genName = generateName++instance Monad m => MonadCError (TravT s m) where+ -- error handling facilities+ throwTravError e = TravT (\_ -> return (Left (toError e)))+ catchTravError a handler = TravT (\s -> unTravT a s >>= \x -> case x of+ Left e -> unTravT (handler e) s+ Right r -> return (Right r))+ recordError e = modify $ \st -> st { rerrors = (rerrors st) `snoc` toError e }+ getErrors = gets (RList.reverse . rerrors)++instance Monad m => MonadTrav (TravT s m) where -- handling declarations and definitions handleDecl d = ($ d) =<< gets doHandleExtDecl -data TravState s =+type Trav s a = TravT s Identity a++unTrav :: Trav s a -> TravT s Identity a+unTrav = id++-- | The variety of the C language to accept. Note: this is not yet enforced.+data CLanguage = C89 | C99 | GNU89 | GNU99++data TravOptions =+ TravOptions {+ language :: CLanguage+ }++data TravState m s = TravState { symbolTable :: DefTable, rerrors :: RList CError, nameGenerator :: [Name],- doHandleExtDecl :: (DeclEvent -> Trav s ()),- userState :: s+ doHandleExtDecl :: (DeclEvent -> TravT s m ()),+ userState :: s,+ options :: TravOptions } -travErrors :: TravState s -> [CError]+travErrors :: TravState m s -> [CError] travErrors = RList.reverse . rerrors -initTravState :: s -> TravState s+initTravState :: Monad m => s -> TravState m s initTravState userst = TravState { symbolTable = emptyDefTable, rerrors = RList.empty, nameGenerator = newNameSupply, doHandleExtDecl = const (return ()),- userState = userst+ userState = userst,+ options = TravOptions { language = C99 } } -- * Trav specific operations modifyUserState :: (s -> s) -> Trav s () modifyUserState f = modify $ \ts -> ts { userState = f (userState ts) } -generateName :: Trav s Name+getUserState :: Trav s s+getUserState = userState `liftM` get++modifyOptions :: (TravOptions -> TravOptions) -> Trav s ()+modifyOptions f = modify $ \ts -> ts { options = f (options ts) }++generateName :: Monad m => TravT s m Name generateName = get >>= \ts -> do let (new_name : gen') = nameGenerator ts
+ src/Language/C/Analysis/TypeCheck.hs view
@@ -0,0 +1,443 @@+{-# LANGUAGE FlexibleInstances, CPP #-}+module Language.C.Analysis.TypeCheck where++import Control.Monad+import Data.Maybe+import Language.C.Data.Ident+import Language.C.Data.Node+import Language.C.Data.Position+import Language.C.Pretty+import Language.C.Syntax.AST+import Language.C.Syntax.Constants+import Language.C.Syntax.Ops+import Language.C.Analysis.DefTable+import Language.C.Analysis.SemRep+import Language.C.Analysis.TravMonad+import Language.C.Analysis.TypeConversions+import Language.C.Analysis.TypeUtils+import Language.C.Analysis.Debug ()+import Text.PrettyPrint.HughesPJ++-- We used to re-implement and export the standard Either instance for+-- Monad, which is bad, because as of GHC 7 it is in Control.Monad.Instances+-- in base >4.2. For backwards compatibility with ghc-6.X, we use CPP here.+#if __GLASGOW_HASKELL__ < 700+instance Monad (Either String) where+ return = Right+ Left l >>= _ = Left l+ Right r >>= k = k r+ fail msg = Left msg+#endif++pType :: Type -> String+pType = render . pretty++typeErrorOnLeft :: (MonadCError m) => NodeInfo -> Either String a -> m a+typeErrorOnLeft ni (Left err) = typeError ni err+typeErrorOnLeft _ (Right v) = return v++-- XXX: this should use a custom error type, but typeMismatch isn't always right+typeError :: MonadCError m => NodeInfo -> String -> m a+typeError = astError++notFound :: Ident -> Either String a+notFound i = Left $ "not found: " ++ identToString i++checkScalar' :: MonadCError m => NodeInfo -> Type -> m ()+checkScalar' ni = typeErrorOnLeft ni . checkScalar++checkIntegral' :: MonadCError m => NodeInfo -> Type -> m ()+checkIntegral' ni = typeErrorOnLeft ni . checkIntegral++assignCompatible' :: MonadCError m =>+ NodeInfo -> CAssignOp -> Type -> Type -> m ()+assignCompatible' ni op t1 t2 = typeErrorOnLeft ni (assignCompatible op t1 t2)++binopType' :: MonadCError m =>+ NodeInfo -> CBinaryOp -> Type -> Type -> m Type+binopType' ni op t1 t2 = typeErrorOnLeft ni (binopType op t1 t2)++conditionalType' :: MonadCError m => NodeInfo -> Type -> Type -> m Type+conditionalType' ni t1 t2 = typeErrorOnLeft ni $ conditionalType t1 t2++checkScalar :: Type -> Either String ()+checkScalar t =+ case canonicalType t of+ DirectType _ _ _ -> Right ()+ PtrType _ _ _ -> Right ()+ ArrayType _ _ _ _ -> Right () -- because it's just a pointer+ t' -> Left $+ "expected scalar type, got: "+ ++ pType t ++ " (" ++ pType t' ++ ")"++checkIntegral :: Type -> Either String ()+checkIntegral t | isIntegralType (canonicalType t) = Right ()+ | otherwise = Left $+ "expected integral type, got: " +++ pType t ++ " (" +++ pType (canonicalType t) ++ ")"++-- | Determine the type of a constant.+constType :: (MonadCError m, MonadName m) => CConst -> m Type+constType (CIntConst (CInteger _ _ flags) _) =+ return $ DirectType (TyIntegral (getIntType flags)) noTypeQuals noAttributes+constType (CCharConst (CChar _ True) _) =+ return $ DirectType (TyIntegral TyInt) noTypeQuals noAttributes+constType (CCharConst (CChar _ False) _) =+ return $ DirectType (TyIntegral TyChar) noTypeQuals noAttributes+constType (CCharConst (CChars _ _) _) =+ return $ DirectType (TyIntegral TyInt) noTypeQuals noAttributes -- XXX+constType (CFloatConst (CFloat fs) _) =+ return $ DirectType (TyFloating (getFloatType fs)) noTypeQuals noAttributes+-- XXX: should strings have any type qualifiers or attributes?+constType (CStrConst (CString chars wide) ni) =+ do n <- genName+ let charType | wide = TyInt -- XXX: this isn't universal+ | otherwise = TyChar+ ni' = mkNodeInfo (posOf ni) n+ arraySize = ArraySize+ True -- XXX: is it static?+ (CConst+ (CIntConst+ (cInteger (toInteger (length chars))) ni'))+ return $ ArrayType (DirectType (TyIntegral charType) noTypeQuals noAttributes)+ arraySize noTypeQuals []++-- | Determine whether two types are compatible.+compatible :: Type -> Type -> Either String ()+compatible t1 t2 = void$ compositeType t1 t2++-- | Determine the composite type of two compatible types.+compositeType :: Type -> Type -> Either String Type+compositeType t1 (DirectType (TyBuiltin TyAny) _ _) = Right t1+compositeType (DirectType (TyBuiltin TyAny) _ _) t2 = Right t2+compositeType t1@(DirectType tn1 q1 a1) t2@(DirectType tn2 q2 a2) =+ do tn <- case (tn1, tn2) of+ (TyVoid, TyVoid) -> Right TyVoid+ (TyIntegral _, TyEnum _) -> Right tn1+ (TyEnum _, TyIntegral _) -> Right tn2+ (TyIntegral i1, TyIntegral i2) ->+ Right $ TyIntegral (intConversion i1 i2)+ (TyFloating f1, TyFloating f2) ->+ Right $ TyFloating (floatConversion f1 f2)+ (TyComplex f1, TyComplex f2) ->+ Right $ TyComplex (floatConversion f1 f2)+ (TyComp c1, TyComp c2) ->+ do when (sueRef c1 /= sueRef c2) $+ Left $ "incompatible composite types: "+ ++ pType t1 ++ ", " ++ pType t2+ Right tn1+ (TyEnum e1, TyEnum e2) ->+ do when (sueRef e1 /= sueRef e2) $+ Left $ "incompatible enumeration types: "+ ++ pType t1 ++ ", " ++ pType t2+ Right $ TyEnum e1+ (TyBuiltin TyVaList, TyBuiltin TyVaList) ->+ Right $ TyBuiltin TyVaList+ (_, _) -> Left $ "incompatible direct types: "+ ++ pType t1 ++ ", " ++ pType t2+ Right $ DirectType tn (mergeTypeQuals q1 q2) (mergeAttributes a1 a2)+compositeType (PtrType t1 q1 a1) (PtrType (DirectType TyVoid _ _) q2 _) =+ Right $ PtrType t1 (mergeTypeQuals q1 q2) a1+compositeType (PtrType (DirectType TyVoid _ _) q1 _) (PtrType t2 q2 a2) =+ Right $ PtrType t2 (mergeTypeQuals q1 q2) a2+compositeType (PtrType t1 q1 a1) t2 | isIntegralType t2 =+ Right $ PtrType t1 (mergeTypeQuals q1 (typeQuals t2)) a1+compositeType t1 (PtrType t2 q2 a2) | isIntegralType t1 =+ Right $ PtrType t2 (mergeTypeQuals (typeQuals t1) q2) a2+compositeType (ArrayType t1 _sz1 q1 a1) t2 | isIntegralType t2 =+ Right $ PtrType t1 q1 a1+compositeType t1 (ArrayType t2 _sz2 q2 a2) | isIntegralType t1 =+ Right $ PtrType t2 q2 a2+compositeType (ArrayType t1 s1 q1 a1) (ArrayType t2 s2 q2 a2) =+ do t <- compositeType t1 t2+ s <- compositeSize s1 s2+ let quals = mergeTypeQuals q1 q2+ attrs = mergeAttrs a1 a2+ Right (ArrayType t s quals attrs)+compositeType t1 t2 | isPointerType t1 && isPointerType t2 =+ do t <- compositeType (baseType t1) (baseType t2)+ let quals = mergeTypeQuals (typeQuals t1) (typeQuals t2)+ attrs = mergeAttrs (typeAttrs t1) (typeAttrs t2)+ Right (PtrType t quals attrs)+compositeType (TypeDefType tdr1 _q1 _a1) (TypeDefType tdr2 _q2 _a2) =+ case (tdr1, tdr2) of+ (TypeDefRef _ t1 _, TypeDefRef _ t2 _) ->+ compositeType t1 t2+compositeType (FunctionType ft1 attrs1) (FunctionType ft2 attrs2) =+ case (ft1, ft2) of+ (FunType rt1 args1 varargs1, FunType rt2 args2 varargs2) ->+ do {- when (length args1 /= length args2) $+ Left "different numbers of arguments in function types" -}+ args <- zipWithM compositeParamDecl args1 args2+ when (varargs1 /= varargs2) $+ Left "incompatible varargs declarations"+ doFunType rt1 rt2 args varargs1+ (FunType rt1 args1 varargs1, FunTypeIncomplete rt2) ->+ doFunType rt1 rt2 args1 varargs1+ (FunTypeIncomplete rt1, FunType rt2 args2 varargs2) ->+ doFunType rt1 rt2 args2 varargs2+ (FunTypeIncomplete rt1, FunTypeIncomplete rt2) ->+ do rt <- compositeType rt1 rt2+ Right (FunctionType (FunTypeIncomplete rt) (mergeAttrs attrs1 attrs2))+ where doFunType rt1 rt2 args varargs =+ do rt <- compositeType rt1 rt2+ Right (FunctionType+ (FunType rt args varargs)+ (mergeAttrs attrs1 attrs2))+compositeType t1 t2 = Left $ "incompatible types: "+ ++ pType t1 ++ ", " ++ pType t2++-- XXX: this may not be correct+compositeSize :: ArraySize -> ArraySize -> Either String ArraySize+compositeSize (UnknownArraySize _) s2 = Right s2+compositeSize s1 (UnknownArraySize _) = Right s1+compositeSize (ArraySize s1 e1) (ArraySize s2 e2)+ | s1 == s2 && sizeEqual e1 e2 = Right $ ArraySize s1 e1+ | otherwise = Right $ ArraySize s1 e1+{-+ fail $ "incompatible array sizes: "+ ++ (render . pretty) e1 ++ ", " ++ (render . pretty) e2+-}++sizeEqual :: CExpr -> CExpr -> Bool+sizeEqual (CConst (CIntConst i1 _)) (CConst (CIntConst i2 _)) = i1 == i2+sizeEqual e1 e2 = nodeInfo e1 == nodeInfo e2++mergeAttrs :: Attributes -> Attributes -> Attributes+mergeAttrs = (++) -- XXX: ultimately this should be smarter++compositeParamDecl :: ParamDecl -> ParamDecl -> Either String ParamDecl+compositeParamDecl (ParamDecl vd1 ni1) (ParamDecl vd2 _) =+ compositeParamDecl' ParamDecl vd1 vd2 ni1+compositeParamDecl (AbstractParamDecl vd1 _) (ParamDecl vd2 ni2) =+ compositeParamDecl' ParamDecl vd1 vd2 ni2+compositeParamDecl (ParamDecl vd1 ni1) (AbstractParamDecl vd2 _) =+ compositeParamDecl' ParamDecl vd1 vd2 ni1+compositeParamDecl (AbstractParamDecl vd1 ni1) (AbstractParamDecl vd2 _) =+ compositeParamDecl' AbstractParamDecl vd1 vd2 ni1++compositeParamDecl' :: (VarDecl -> NodeInfo -> ParamDecl)+ -> VarDecl+ -> VarDecl+ -> NodeInfo+ -> Either String ParamDecl+compositeParamDecl' f (VarDecl n1 attrs1 t1) (VarDecl n2 attrs2 t2) dni =+ do vd <- compositeVarDecl (VarDecl n1 attrs1 t1') (VarDecl n2 attrs2 t2')+ Right $ f vd dni+ where t1' = canonicalType t1+ t2' = canonicalType t2++compositeVarDecl :: VarDecl -> VarDecl -> Either String VarDecl+compositeVarDecl (VarDecl n1 attrs1 t1) (VarDecl _ attrs2 t2) =+ do t <- compositeType t1 t2+ Right (VarDecl n1 (compositeDeclAttrs attrs1 attrs2) t)++-- XXX: bad treatement of inline and storage+compositeDeclAttrs :: DeclAttrs -> DeclAttrs -> DeclAttrs+compositeDeclAttrs (DeclAttrs inl stor attrs1) (DeclAttrs _ _ attrs2) =+ DeclAttrs inl stor (mergeAttrs attrs1 attrs2)++castCompatible :: Type -> Type -> Either String ()+castCompatible t1 t2 =+ case (canonicalType t1, canonicalType t2) of+ (DirectType TyVoid _ _, _) -> Right ()+ (_, _) -> checkScalar t1 >> checkScalar t2++-- | Determine whether two types are compatible in an assignment expression.+assignCompatible :: CAssignOp -> Type -> Type -> Either String ()+assignCompatible CAssignOp t1 t2 =+ case (canonicalType t1, canonicalType t2) of+ (DirectType (TyBuiltin TyAny) _ _, _) -> Right ()+ (_, DirectType (TyBuiltin TyAny) _ _) -> Right ()+ -- XXX: check qualifiers+ (PtrType (DirectType TyVoid _ _) _ _, t2') | isPointerType t2' -> Right ()+ -- XXX: check qualifiers+ (t1', PtrType (DirectType TyVoid _ _) _ _) | isPointerType t1' -> Right ()+ (PtrType _ _ _, t2') | isIntegralType t2' -> Right ()+ (t1', t2') | isPointerType t1' && isPointerType t2' ->+ compatible (baseType t1') (baseType t2')+ --unless (typeQuals t2 <= typeQuals t1) $+ -- Left $+ -- "incompatible qualifiers in pointer assignment: "+ -- ++ pType t1 ++ ", " ++ pType t2+ (DirectType (TyComp c1) _ _, DirectType (TyComp c2) _ _)+ | sueRef c1 == sueRef c2 -> Right ()+ | otherwise -> Left $+ "incompatible compound types in assignment: "+ ++ pType t1 ++ ", " ++ pType t2+ (DirectType (TyBuiltin TyVaList) _ _, DirectType (TyBuiltin TyVaList) _ _) ->+ Right ()+ (DirectType tn1 _ _, DirectType tn2 _ _)+ | isJust (arithmeticConversion tn1 tn2) -> Right ()+ | otherwise -> Left $ "incompatible direct types in assignment: "+ ++ pType t1 ++ ", " ++ pType t2+ (t1', t2') -> compatible t1' t2'+assignCompatible op t1 t2 = void$ binopType (assignBinop op) t1 t2++-- | Determine the type of a binary operation.+binopType :: CBinaryOp -> Type -> Type -> Either String Type+binopType op t1 t2 =+ case (op, canonicalType t1, canonicalType t2) of+ (_, t1', t2')+ | isLogicOp op ->+ checkScalar t1' >> checkScalar t2' >> Right boolType+ | isCmpOp op ->+ case (t1', t2') of+ (DirectType tn1 _ _, DirectType tn2 _ _) ->+ case arithmeticConversion tn1 tn2 of+ Just _ -> Right boolType+ Nothing -> Left $ render $+ text "incompatible arithmetic types in comparison: "+ <+> pretty t1 <+> text "and" <+> pretty t2+ (PtrType (DirectType TyVoid _ _) _ _, _)+ | isPointerType t2' -> Right boolType+ (_, PtrType (DirectType TyVoid _ _) _ _)+ | isPointerType t1' -> Right boolType+ (_, _)+ | isPointerType t1' && isIntegralType t2' -> Right boolType+ | isIntegralType t1' && isPointerType t2' -> Right boolType+ | isPointerType t1' && isPointerType t2' ->+ compatible t1' t2' >> Right boolType+ (_, _) -> Left "incompatible types in comparison"+ (CSubOp, ArrayType t1' _ _ _, ArrayType t2' _ _ _) ->+ compatible t1' t2' >> Right ptrDiffType+ (CSubOp, ArrayType t1' _ _ _, PtrType t2' _ _) ->+ compatible t1' t2' >> Right ptrDiffType+ (CSubOp, PtrType t1' _ _, ArrayType t2' _ _ _) ->+ compatible t1' t2' >> Right ptrDiffType+ (CSubOp, PtrType t1' _ _, PtrType t2' _ _) ->+ compatible t1' t2' >> Right ptrDiffType+ (_, PtrType _ _ _, t2')+ | isPtrOp op && isIntegralType t2' -> Right t1+ | otherwise -> Left $ "invalid pointer operation: " ++ render (pretty op)+ (CAddOp, t1', PtrType _ _ _) | isIntegralType t1' -> Right t2+ (_, ArrayType _ _ _ _, t2')+ | isPtrOp op && isIntegralType t2' -> Right t1+ | otherwise -> Left $ "invalid pointer operation: " ++ render (pretty op)+ (CAddOp, t1', ArrayType _ _ _ _) | isIntegralType t1' -> Right t2+ (_, DirectType tn1 q1 a1, DirectType tn2 q2 a2) ->+ do when (isBitOp op) (checkIntegral t1 >> checkIntegral t2)+ case arithmeticConversion tn1 tn2 of+ Just tn -> Right $ DirectType tn (mergeTypeQuals q1 q2) (mergeAttributes a1 a2)+ Nothing -> Left $ render $+ text "invalid binary operation:" <+> pretty t1 <+> pretty op <+> pretty t2+ (_, _, _) -> Left $ render $+ text "unhandled binary operation:" <+> pretty t1 <+> pretty op <+> pretty t2++-- | Determine the type of a conditional expression.+conditionalType :: Type -> Type -> Either String Type+conditionalType t1 t2 =+ case (canonicalType t1, canonicalType t2) of+ (PtrType (DirectType TyVoid _ _) _ _, t2') | isPointerType t2' -> Right t2+ (t1', PtrType (DirectType TyVoid _ _) _ _) | isPointerType t1' -> Right t1+ (ArrayType t1' _ q1 a1, ArrayType t2' _ q2 a2) ->+ do t <- compositeType t1' t2'+ Right $ ArrayType t (UnknownArraySize False)+ (mergeTypeQuals q1 q2) (mergeAttrs a1 a2)+ (t1'@(DirectType tn1 q1 a1), t2'@(DirectType tn2 q2 a2)) ->+ case arithmeticConversion tn1 tn2 of+ Just tn -> Right $ DirectType tn (mergeTypeQuals q1 q2) (mergeAttributes a1 a2)+ Nothing -> compositeType t1' t2'+ (t1', t2') -> compositeType t1' t2'++derefType :: Type -> Either String Type+derefType (PtrType t _ _) = Right t+derefType (ArrayType t _ _ _) = Right t+derefType t =+ -- XXX: is it good to use canonicalType here?+ case canonicalType t of+ PtrType t' _ _ -> Right t'+ ArrayType t' _ _ _ -> Right t'+ _ -> Left $ "dereferencing non-pointer: " ++ pType t++varAddrType :: IdentDecl -> Either String Type+varAddrType d =+ do case declStorage d of+ Auto True -> Left "address of register variable"+ _ -> Right ()+ case t of+ ArrayType _ _ q a -> Right $ PtrType t q a+ _ -> Right $ simplePtr t+ where t = declType d++-- | Get the type of field @m@ of type @t@+fieldType :: (MonadCError m, MonadSymtab m) => NodeInfo -> Ident -> Type -> m Type+fieldType ni m t =+ case canonicalType t of+ DirectType (TyComp ctr) _ _ ->+ do td <- lookupSUE ni (sueRef ctr)+ ms <- tagMembers ni td+ case lookup m ms of+ Just ft -> return ft+ Nothing -> typeError ni $ "field not found: " ++ identToString m+ _t' -> astError ni $+ "field of non-composite type: " ++ identToString m+ ++ ", " ++ pType t++-- | Get all members of a struct, union, or enum, with their+-- types. Collapse fields of anonymous members.+tagMembers :: (MonadCError m, MonadSymtab m) =>+ NodeInfo -> TagDef -> m [(Ident, Type)]+tagMembers ni td =+ case td of+ CompDef (CompType _ _ ms _ _) -> getMembers ms+ EnumDef (EnumType _ es _ _) -> getMembers es+ where getMembers ds =+ do let ts = map declType ds+ ns = map declName ds+ concat `liftM` mapM (expandAnonymous ni) (zip ns ts)++-- | Expand an anonymous composite type into a list of member names+-- and their associated types.+expandAnonymous :: (MonadCError m, MonadSymtab m) =>+ NodeInfo -> (VarName, Type)+ -> m [(Ident, Type)]+expandAnonymous ni (NoName, DirectType (TyComp ctr) _ _) =+ lookupSUE ni (sueRef ctr) >>= tagMembers ni+expandAnonymous _ (NoName, _) = return []+expandAnonymous _ (VarName n _, t) = return [(n, t)]++lookupSUE :: (MonadCError m, MonadSymtab m) =>+ NodeInfo -> SUERef -> m TagDef+lookupSUE ni sue =+ do dt <- getDefTable+ case lookupTag sue dt of+ Just (Right td) -> return td+ _ ->+ typeError ni $ "unknown composite type: " ++ (render . pretty) sue++deepTypeAttrs :: (MonadCError m, MonadSymtab m) =>+ Type -> m Attributes+deepTypeAttrs (DirectType (TyComp (CompTypeRef sue _ ni)) _ attrs) =+ (attrs ++) `liftM` sueAttrs ni sue+deepTypeAttrs (DirectType (TyEnum (EnumTypeRef sue ni)) _ attrs) =+ (attrs ++) `liftM` sueAttrs ni sue+deepTypeAttrs (DirectType _ _ attrs) = return attrs+deepTypeAttrs (PtrType t _ attrs) = (attrs ++) `liftM` deepTypeAttrs t+deepTypeAttrs (ArrayType t _ _ attrs) = (attrs ++) `liftM` deepTypeAttrs t+deepTypeAttrs (FunctionType (FunType t _ _) attrs) =+ (attrs ++) `liftM` deepTypeAttrs t+deepTypeAttrs (FunctionType (FunTypeIncomplete t) attrs) =+ (attrs ++) `liftM` deepTypeAttrs t+deepTypeAttrs (TypeDefType (TypeDefRef i _ ni) _ attrs) =+ (attrs ++) `liftM` typeDefAttrs ni i++typeDefAttrs :: (MonadCError m, MonadSymtab m) =>+ NodeInfo -> Ident -> m Attributes+typeDefAttrs ni i =+ do dt <- getDefTable+ case lookupIdent i dt of+ Nothing -> astError ni $ "can't find typedef name: " ++ identToString i+ Just (Left (TypeDef _ t attrs _)) -> (attrs ++) `liftM` deepTypeAttrs t+ Just (Right _) -> astError ni $ "not a typedef name: " ++ identToString i++sueAttrs :: (MonadCError m, MonadSymtab m) =>+ NodeInfo -> SUERef -> m Attributes+sueAttrs ni sue =+ do dt <- getDefTable+ case lookupTag sue dt of+ Nothing -> astError ni $ "SUE not found: " ++ render (pretty sue)+ Just (Left _) -> return []+ Just (Right (CompDef (CompType _ _ _ attrs _))) -> return attrs+ Just (Right (EnumDef (EnumType _ _ attrs _))) -> return attrs
+ src/Language/C/Analysis/TypeConversions.hs view
@@ -0,0 +1,39 @@+module Language.C.Analysis.TypeConversions (+ arithmeticConversion,+ floatConversion,+ intConversion+) where++import Language.C.Analysis.SemRep++-- | For an arithmetic operator, if the arguments are of the given+-- types, return the type of the full expression.+arithmeticConversion :: TypeName -> TypeName -> Maybe TypeName+-- XXX: I'm assuming that double `op` complex float = complex+-- double. The standard seems somewhat unclear on whether this is+-- really the case.+arithmeticConversion (TyComplex t1) (TyComplex t2) =+ Just $ TyComplex $ floatConversion t1 t2+arithmeticConversion (TyComplex t1) (TyFloating t2) =+ Just $ TyComplex $ floatConversion t1 t2+arithmeticConversion (TyFloating t1) (TyComplex t2) =+ Just $ TyComplex $ floatConversion t1 t2+arithmeticConversion t1@(TyComplex _) (TyIntegral _) = Just t1+arithmeticConversion (TyIntegral _) t2@(TyComplex _) = Just t2+arithmeticConversion (TyFloating t1) (TyFloating t2) =+ Just $ TyFloating $ floatConversion t1 t2+arithmeticConversion t1@(TyFloating _) (TyIntegral _) = Just t1+arithmeticConversion (TyIntegral _) t2@(TyFloating _) = Just t2+arithmeticConversion (TyIntegral t1) (TyIntegral t2) =+ Just $ TyIntegral $ intConversion t1 t2+arithmeticConversion (TyEnum _) (TyEnum _) = Just $ TyIntegral TyInt+arithmeticConversion (TyEnum _) t2 = Just t2+arithmeticConversion t1 (TyEnum _) = Just t1+arithmeticConversion _ _ = Nothing++floatConversion :: FloatType -> FloatType -> FloatType+floatConversion = max++intConversion :: IntType -> IntType -> IntType+intConversion t1 t2 = max TyInt (max t1 t2)+
+ src/Language/C/Analysis/TypeUtils.hs view
@@ -0,0 +1,343 @@+module Language.C.Analysis.TypeUtils (+ -- * Constructors+ integral,+ floating,+ simplePtr,+ uint16_tType,+ uint32_tType,+ uint64_tType,+ size_tType,+ ptrDiffType,+ boolType,+ voidType,+ voidPtr,+ constVoidPtr,+ charPtr,+ constCharPtr,+ stringType,+ valistType,+ -- * Classifiers+ isIntegralType,+ isFloatingType,+ isPointerType,+ isScalarType,+ isFunctionType,+ -- Extractors+ typeQuals,+ typeQualsUpd,+ typeAttrs,+ typeAttrsUpd,+ baseType,+ derefTypeDef,+ deepDerefTypeDef,+ canonicalType,+ -- * Type comparisons+ sameType,+ -- * Other utilities+ getIntType,+ getFloatType+) where++import Language.C.Analysis.SemRep+import Language.C.Data.Node (CNode(..))+import Language.C.Syntax.AST (CExpression (..), CConstant (..))+import Language.C.Syntax.Constants++-- | Constructor for a simple integral type.+integral :: IntType -> Type+integral ty = DirectType (TyIntegral ty) noTypeQuals noAttributes++-- | Constructor for a simple floating-point type.+floating :: FloatType -> Type+floating ty = DirectType (TyFloating ty) noTypeQuals noAttributes++-- | A simple pointer with no qualifiers+simplePtr :: Type -> Type+simplePtr t = PtrType t noTypeQuals []++-- | A pointer with the @const@ qualifier.+constPtr :: Type -> Type+constPtr t = PtrType t (noTypeQuals { constant = True }) []++-- | The underlying type for @uint16_t@. For now, this is just @unsigned short@.+uint16_tType :: Type+uint16_tType = integral TyUShort++-- | The underlying type for @uint32_t@. For now, this is just @unsigned int@.+uint32_tType :: Type+uint32_tType = integral TyUInt++-- | The underlying type for @uint64_t@. For now, this is just @unsigned long long@.+uint64_tType :: Type+uint64_tType = integral TyULLong++-- | The type returned by sizeof (size_t). For now, this is just @int@.+size_tType :: Type+size_tType = integral TyInt++-- | The type of pointer differences (ptrdiff_t). For now, this is just @int@.+ptrDiffType :: Type+ptrDiffType = integral TyInt++-- | The type of comparisons\/guards. This is always just @int@.+boolType :: Type+boolType = integral TyInt++-- | Simple @void@ type.+voidType :: Type+voidType = DirectType TyVoid noTypeQuals noAttributes++-- | An unqualified @void@ pointer.+voidPtr :: Type+voidPtr = simplePtr voidType++-- | A @const@-qualified @void@ pointer.+constVoidPtr :: Type+constVoidPtr = constPtr voidType++-- | An unqualified @char@ pointer.+charPtr :: Type+charPtr = simplePtr (integral TyChar)++-- | A @const@-qualified @char@ pointer.+constCharPtr :: Type+constCharPtr = constPtr (integral TyChar)++-- | The type of a constant string.+stringType :: Type+stringType = ArrayType+ (DirectType (TyIntegral TyChar)+ (noTypeQuals { constant = True })+ noAttributes)+ (UnknownArraySize False)+ noTypeQuals+ []++-- | The builtin type of variable-length argument lists.+valistType :: Type+valistType = DirectType (TyBuiltin TyVaList) noTypeQuals noAttributes++-- | Check whether a type is an integral type. This includes @enum@+-- types. This function does not attempt to resolve @typedef@ types.+isIntegralType :: Type -> Bool+isIntegralType (DirectType (TyIntegral _) _ _) = True+isIntegralType (DirectType (TyEnum _) _ _) = True+isIntegralType _ = False++-- | Check whether a type is a floating-point numeric type. This+-- function does not attempt to resolve @typedef@ types.+isFloatingType :: Type -> Bool+isFloatingType (DirectType (TyFloating _) _ _) = True+isFloatingType _ = False++-- | Check whether a type is an pointer type. This includes array+-- types. This function does not attempt to resolve @typedef@ types.+isPointerType :: Type -> Bool+isPointerType (PtrType _ _ _) = True+isPointerType (ArrayType _ _ _ _) = True+isPointerType _ = False++-- | Check whether a type is a scalar type. Scalar types include+-- arithmetic types and pointer types.+isScalarType :: Type -> Bool+isScalarType t = isIntegralType t || isPointerType t || isFloatingType t++-- | return @True@ if the given type is a function type+--+-- Result is undefined in the presence of undefined typeDefs+isFunctionType :: Type -> Bool+isFunctionType ty =+ case ty of TypeDefType (TypeDefRef _ actual_ty _) _ _ -> isFunctionType actual_ty+ FunctionType _ _ -> True+ _ -> False++-- | Return the qualifiers of a type.+typeQuals :: Type -> TypeQuals+typeQuals (DirectType _ q _) = q+typeQuals (PtrType _ q _) = q+typeQuals (ArrayType _ _ q _) = q+typeQuals (FunctionType _ _) = noTypeQuals+typeQuals (TypeDefType (TypeDefRef _ t _) q _) = mergeTypeQuals q (typeQuals t)++-- |Update type qualifiers+-- For function types, it is an error to change any type qualifiers+-- For typedef types, the result is stored in the typedef attribute field+typeQualsUpd :: (TypeQuals -> TypeQuals) -> Type -> Type+typeQualsUpd f ty =+ case ty of DirectType ty_name ty_quals ty_attrs -> DirectType ty_name (f ty_quals) ty_attrs+ PtrType ty_inner ty_quals ty_attrs -> PtrType ty_inner (f ty_quals) ty_attrs+ ArrayType ty_inner sz ty_quals ty_attrs -> ArrayType ty_inner sz (f ty_quals) ty_attrs+ FunctionType ty_inner ty_attrs -> FunctionType ty_inner ty_attrs+ TypeDefType ty_ref ty_quals ty_attrs -> TypeDefType ty_ref (f ty_quals) ty_attrs++-- | Return the attributes of a type.+typeAttrs :: Type -> Attributes+typeAttrs (DirectType _ _ a) = a+typeAttrs (PtrType _ _ a) = a+typeAttrs (ArrayType _ _ _ a) = a+typeAttrs (FunctionType _ a) = a+typeAttrs (TypeDefType (TypeDefRef _ t _) _ a) = mergeAttributes a (typeAttrs t)++-- |Update type attributes+typeAttrsUpd :: (Attributes -> Attributes) -> Type -> Type+typeAttrsUpd f ty =+ case ty of DirectType ty_name ty_quals ty_attrs -> DirectType ty_name ty_quals (f ty_attrs)+ PtrType ty_inner ty_quals ty_attrs -> PtrType ty_inner ty_quals (f ty_attrs)+ ArrayType ty_inner sz ty_quals ty_attrs -> ArrayType ty_inner sz ty_quals (f ty_attrs)+ FunctionType ty_inner ty_attrs -> FunctionType ty_inner (f ty_attrs)+ TypeDefType ty_ref ty_quals ty_attrs -> TypeDefType ty_ref ty_quals (f ty_attrs)++-- | Return the base type of a pointer or array type. It is an error+-- to call this function with a type that is not in one of those two+-- categories.+baseType :: Type -> Type+baseType (PtrType t _ _) = t+baseType (ArrayType t _ _ _) = t+baseType _ = error "base of non-pointer type"++-- | resolve typedefs, if possible+derefTypeDef :: Type -> Type+derefTypeDef (TypeDefType (TypeDefRef _ t _) q a) =+ (typeAttrsUpd (mergeAttributes a) . typeQualsUpd (mergeTypeQuals q))+ (derefTypeDef t)+derefTypeDef ty = ty++-- | Attempt to remove all references to @typedef@ types from a given type.+-- Note that this does not dereference the types of structure or union+-- fields, so there are still cases where further dereferencing is+-- needed.+deepDerefTypeDef :: Type -> Type+deepDerefTypeDef (PtrType t quals attrs) =+ PtrType (deepDerefTypeDef t) quals attrs+deepDerefTypeDef (ArrayType t size quals attrs) =+ ArrayType (deepDerefTypeDef t) size quals attrs+deepDerefTypeDef (FunctionType (FunType rt params varargs) attrs) =+ FunctionType (FunType (deepDerefTypeDef rt) params varargs) attrs+deepDerefTypeDef (FunctionType (FunTypeIncomplete rt) attrs) =+ FunctionType (FunTypeIncomplete (deepDerefTypeDef rt)) attrs+deepDerefTypeDef (TypeDefType (TypeDefRef _ t _) q a) =+ (typeAttrsUpd (mergeAttributes a) . typeQualsUpd (mergeTypeQuals q))+ (deepDerefTypeDef t)+deepDerefTypeDef t = t++-- | True iff Type is a variable length array or a derived type thereof.+-- Variably modified types have function or block scope, so only some+-- constructions are possible.+isVariablyModifiedType :: Type -> Bool+isVariablyModifiedType t =+ case derefTypeDef t of+ TypeDefType {} -> error "impossible: derefTypeDef t returned a TypeDefType"+ DirectType {} -> False+ PtrType ptr_ty _ _ -> isVariablyModifiedType ptr_ty+ ArrayType _ sz _ _ -> isVariableArraySize sz+ FunctionType {} -> False+ where+ isVariableArraySize :: ArraySize -> Bool+ isVariableArraySize (UnknownArraySize isStarred) = isStarred+ isVariableArraySize (ArraySize isStatic e) = isStatic || isConstantSize e++ isConstantSize :: Expr -> Bool+ isConstantSize (CConst (CIntConst {})) = True+ isConstantSize _ = False++-- | Two types denote the same type if they are identical, ignoring type+-- definitions, and neither is a variably modified type.+sameType :: Type -> Type -> Bool+sameType t1 t2 =+ not (isVariablyModifiedType t1 || isVariablyModifiedType t2) && sameType'+ where+ sameType' =+ case (derefTypeDef t1, derefTypeDef t2) of+ (TypeDefType {}, _) -> error "impossible: derefTypeDef t1 returned a TypeDefType"+ (_, TypeDefType {}) -> error "impossible: derefTypeDef t2 returned a TypeDefType"+ (DirectType tn1 q1 _a1, DirectType tn2 q2 _a2) ->+ sameTypeName tn1 tn2 && sameQuals q1 q2 {- FIXME: same attributes? -}+ (PtrType pt1 q1 _a1, PtrType pt2 q2 _a2) ->+ sameType pt1 pt2 && sameQuals q1 q2+ (ArrayType at1 sz1 q1 _a1, ArrayType at2 sz2 q2 _a2) ->+ sameType at1 at2 && sameArraySize sz1 sz2 && sameQuals q1 q2+ (FunctionType ft1 _a1, FunctionType ft2 _a2) ->+ sameFunType ft1 ft2+ _ -> False++sameTypeName :: TypeName -> TypeName -> Bool+sameTypeName t1 t2 =+ case (t1, t2) of+ (TyVoid, TyVoid) -> True+ (TyIntegral i1, TyIntegral i2) -> i1 == i2+ (TyFloating f1, TyFloating f2) -> f1 == f2+ (TyComplex f1, TyComplex f2) -> f1 == f2+ (TyComp ctr1, TyComp ctr2) -> sameCompTypeRef ctr1 ctr2+ (TyEnum etr1, TyEnum etr2) -> sameEnumTypeRef etr1 etr2+ (TyBuiltin b1, TyBuiltin b2) -> sameBuiltinType b1 b2+ _ -> False++sameBuiltinType :: BuiltinType -> BuiltinType -> Bool+sameBuiltinType TyVaList TyVaList = True+sameBuiltinType TyAny TyAny = False {- what does TyAny mean? -}+sameBuiltinType _ _ = False++sameCompTypeRef :: CompTypeRef -> CompTypeRef -> Bool+sameCompTypeRef (CompTypeRef sue1 kind1 _) (CompTypeRef sue2 kind2 _) =+ sue1 == sue2 && kind1 == kind2++sameEnumTypeRef :: EnumTypeRef -> EnumTypeRef -> Bool+sameEnumTypeRef (EnumTypeRef sue1 _) (EnumTypeRef sue2 _) = sue1 == sue2++sameFunType :: FunType -> FunType -> Bool+sameFunType (FunType rt1 params1 isVar1) (FunType rt2 params2 isVar2) =+ sameType rt1 rt2 && sameParamDecls params1 params2 && isVar1 == isVar2+ where+ sameParamDecls :: [ParamDecl] -> [ParamDecl] -> Bool+ sameParamDecls param_list1 param_list2 =+ length param_list1 == length param_list2+ && and (zipWith sameParamDecl param_list1 param_list2)+ -- ignores param identifiers, just compares types+ sameParamDecl :: ParamDecl -> ParamDecl -> Bool+ sameParamDecl p1 p2 = sameType (declType p1) (declType p2)+sameFunType (FunTypeIncomplete rt1) (FunTypeIncomplete rt2) =+ sameType rt1 rt2+sameFunType _ _ = False++-- | Returns 'True' iff both array sizes denote the same size. Assumes that+-- neither array type was a variably modified type.+sameArraySize :: ArraySize -> ArraySize -> Bool+sameArraySize (UnknownArraySize isStar1) (UnknownArraySize isStar2) = isStar1 == isStar2+sameArraySize (ArraySize s1 e1) (ArraySize s2 e2) = s1 == s2 && sizeEqual e1 e2+ where+ -- FIXME: Do something better, and combine with sizeEqual in Language.C.Analysis.TypeCheck+ sizeEqual :: Expr -> Expr -> Bool+ sizeEqual (CConst (CIntConst i1 _)) (CConst (CIntConst i2 _)) = i1 == i2+ sizeEqual oe1 oe2 = nodeInfo oe1 == nodeInfo oe2+sameArraySize _ _ = False++sameQuals :: TypeQuals -> TypeQuals -> Bool+sameQuals (TypeQuals {constant = c1, volatile = v1, restrict = r1})+ (TypeQuals {constant = c2, volatile = v2, restrict = r2}) =+ c1 == c2 && v1 == v2 && r1 == r2++canonicalType :: Type -> Type+canonicalType t =+ case deepDerefTypeDef t of+ FunctionType ft attrs -> simplePtr (FunctionType ft attrs)+ t' -> t'++-- XXX: move to be with other flag functions+testFlags :: Enum f => [f] -> Flags f -> Bool+testFlags flags fi = all (`testFlag` fi) flags++-- XXX: deal with FlagImag. No representation for it in Complex.+-- XXX: deal with invalid combinations of flags?+getIntType :: Flags CIntFlag -> IntType+getIntType flags | testFlags [FlagLongLong, FlagUnsigned] flags = TyULLong+ | testFlag FlagLongLong flags = TyLLong+ | testFlags [FlagLong, FlagUnsigned] flags = TyULong+ | testFlag FlagLong flags = TyLong+ | testFlag FlagUnsigned flags = TyUInt+ | otherwise = TyInt++getFloatType :: String -> FloatType+getFloatType fs | last fs `elem` ['f', 'F'] = TyFloat+ | last fs `elem` ['l', 'L'] = TyLDouble+ | otherwise = TyDouble+
src/Language/C/Data.hs view
@@ -14,19 +14,20 @@ -- * Input stream module Language.C.Data.InputStream, -- * Identifiers- SUERef(..), isAnonymousRef,+ SUERef(..), isAnonymousRef, sueRefToString, Ident,mkIdent, identToString, internalIdent, isInternalIdent, builtinIdent, -- * Unqiue names Name(..),newNameSupply, -- * Source code positions- Position(..),Pos(..),initPos,- posFile,posRow,posColumn,- nopos,builtinPos,internalPos,+ Position(..),posFile,posParent,+ Pos(..),+ initPos, nopos,builtinPos,internalPos, isSourcePos,isBuiltinPos,isInternalPos, -- * Syntax tree nodes NodeInfo(..),CNode(..), fileOfNode,posOfNode,nameOfNode,- internalNode,mkNodeInfoOnlyPos,mkNodeInfo,+ undefNode,mkNodeInfoOnlyPos,mkNodeInfo,+ internalNode, -- DEPRECATED -- * Extensible errors module Language.C.Data.Error )
src/Language/C/Data/Error.hs view
@@ -1,4 +1,4 @@-{-# LANGUAGE ExistentialQuantification, DeriveDataTypeable #-}+{-# LANGUAGE ExistentialQuantification #-} ----------------------------------------------------------------------------- -- | -- Module : Language.C.Data.Error@@ -8,7 +8,7 @@ -- Stability : experimental -- Portability : ghc ----- Base type for errors occuring in parsing, analysing and pretty-printing.+-- Base type for errors occurring in parsing, analysing and pretty-printing. -- With ideas from Simon Marlow's -- "An extensible dynamically-typed hierarchy of execeptions [2006]" -----------------------------------------------------------------------------@@ -28,8 +28,8 @@ internalErr, ) where-import Data.Typeable-import Data.Generics++import Data.Typeable (Typeable, cast) import Language.C.Data.Node import Language.C.Data.Position @@ -50,9 +50,9 @@ isHardError = ( > LevelWarn) . errorLevel -- | information attached to every error in Language.C-data ErrorInfo = ErrorInfo ErrorLevel Position [String] deriving Typeable+data ErrorInfo = ErrorInfo ErrorLevel Position [String] --- to faciliate newtype deriving+-- to facilitate newtype deriving instance Show ErrorInfo where show = showErrorInfo "error" instance Error ErrorInfo where errorInfo = id@@ -64,8 +64,8 @@ -- | `supertype' of all errors data CError = forall err. (Error err) => CError err- deriving Typeable + -- | errors in Language.C are instance of 'Error' class (Typeable e, Show e) => Error e where -- | obtain source location etc. of an error@@ -73,7 +73,7 @@ -- | wrap error in 'CError' toError :: e -> CError -- | try to cast a generic 'CError' to the specific error type- fromError :: CError -> (Maybe e)+ fromError :: CError -> Maybe e -- | modify the error level changeErrorLevel :: e -> ErrorLevel -> e @@ -106,7 +106,7 @@ errorMsgs = ( \(ErrorInfo _ _ msgs) -> msgs ) . errorInfo -- | error raised if a operation requires an unsupported or not yet implemented feature.-data UnsupportedFeature = UnsupportedFeature String Position deriving Typeable+data UnsupportedFeature = UnsupportedFeature String Position instance Error UnsupportedFeature where errorInfo (UnsupportedFeature msg pos) = ErrorInfo LevelError pos (lines msg) instance Show UnsupportedFeature where show = showError "Unsupported Feature"@@ -119,7 +119,7 @@ -- | unspecified error raised by the user (in case the user does not want to define -- her own error types).-newtype UserError = UserError ErrorInfo deriving Typeable+newtype UserError = UserError ErrorInfo instance Error UserError where errorInfo (UserError info) = info instance Show UserError where show = showError "User Error"@@ -147,9 +147,10 @@ showErrorInfo short_msg (ErrorInfo level pos msgs) = header ++ showMsgLines (if null short_msg then msgs else short_msg:msgs) where- header = (posFile pos) ++ ":" ++ show (posRow pos) ++ ": " ++- "(column " ++ show (posColumn pos) ++ ") " ++- "[" ++ show level ++ "]"+ header = showPos pos ++ "[" ++ show level ++ "]"+ showPos p | isSourcePos p = posFile p ++ ":" ++ show (posRow pos) ++ ": " +++ "(column " ++ show (posColumn pos) ++ ") "+ | otherwise = show p ++ ":: " showMsgLines [] = internalErr "No short message or error message provided." showMsgLines (x:xs) = indent ++ ">>> " ++ x ++ "\n" ++ unlines (map (indent++) xs)
src/Language/C/Data/Ident.hs view
@@ -10,35 +10,37 @@ -- Portability : ghc -- -- This module provides the notion of identifiers in C, speed up using hashing.--- Identifiers are associated optionally associated with a 'NodeInfo', i.e. with +-- Identifiers are associated optionally associated with a 'NodeInfo', i.e. with -- a unique 'Name' and a source location ('Position'). The ordering relation on -- identifiers is based on the hash and does not follow the lexical order. ----------------------------------------------------------------------------- module Language.C.Data.Ident ( Ident(..), SUERef(..), isAnonymousRef,- mkIdent, builtinIdent, internalIdent, internalIdentAt, isInternalIdent, identToString, dumpIdent)+ mkIdent, builtinIdent, internalIdent, internalIdentAt, isInternalIdent,+ identToString, sueRefToString, dumpIdent) where- + -- TODO (comment from manuel): -- * Hashing is not 8bit clean. import Data.Char import Language.C.Data.Position import Language.C.Data.Node-import Language.C.Data.Name (Name,nameId)-import Data.Generics+import Language.C.Data.Name (Name)+import Data.Data (Data)+import GHC.Generics (Generic)+import Control.DeepSeq (NFData) -- | References uniquely determining a struct, union or enum type. -- Those are either identified by an string identifier, or by a unique -- name (anonymous types). data SUERef = AnonymousRef Name | NamedRef Ident- deriving (Typeable, Data, Ord, Eq)-instance Show SUERef where- show (AnonymousRef name) = "$" ++ show (nameId name)- show (NamedRef ident) = identToString ident+ deriving (Data, Ord, Eq, Show, Generic) --, Read +instance NFData SUERef+ -- | Return true if the struct\/union\/enum reference is anonymous. isAnonymousRef :: SUERef -> Bool isAnonymousRef (AnonymousRef _) = True@@ -46,10 +48,12 @@ -- | C identifiers data Ident = Ident String -- lexeme- {-# UNPACK #-} !Int -- hash to speed up equality check- NodeInfo -- attributes of this ident. incl. position- deriving (Data,Typeable)+ {-# UNPACK #-} !Int -- hash to speed up equality check+ NodeInfo -- attributes of this ident. incl. position+ deriving (Data,Show, Generic) -- Read +instance NFData Ident+ -- the definition of the equality allows identifiers to be equal that are -- defined at different source text positions, and aims at speeding up the -- equality test, by comparing the lexemes only if the two numbers are equal@@ -62,10 +66,6 @@ instance Ord Ident where compare (Ident s h _) (Ident s' h' _) = compare (h, s) (h', s') --- for displaying identifiers-instance Show Ident where- showsPrec _ ide = showString ("`" ++ identToString ide ++ "'")- -- identifiers are attributed instance CNode Ident where nodeInfo (Ident _ _ at) = at@@ -108,7 +108,7 @@ -- -- * for reasons of simplicity the complete lexeme is hashed. mkIdent :: Position -> String -> Name -> Ident-mkIdent pos s name = Ident s (quad s) (mkNodeInfo pos name)+mkIdent pos s name = Ident s (quad s) (mkNodeInfo' pos (pos,length s) name) -- | returns an /internal/ identifier (has internal position and no unique name) internalIdent :: String -> Ident@@ -116,7 +116,7 @@ -- | return an /internal/ identifier with position info internalIdentAt :: Position -> String -> Ident-internalIdentAt pos s = Ident s (quad s) (mkNodeInfoOnlyPos pos)+internalIdentAt pos s = Ident s (quad s) (mkNodeInfoPosLen pos (pos, length s)) -- | returns a /builtin/ identifier (has builtin position and no unique name) builtinIdent :: String -> Ident@@ -129,6 +129,11 @@ -- | string of an identifier identToString :: Ident -> String identToString (Ident s _ _) = s++-- | string of a SUE ref (empty if anonymous)+sueRefToString :: SUERef -> String+sueRefToString (AnonymousRef _) = ""+sueRefToString (NamedRef ident) = identToString ident -- | dump the identifier string and its positions for debugging purposes dumpIdent :: Ident -> String
src/Language/C/Data/InputStream.hs view
@@ -3,24 +3,31 @@ ----------------------------------------------------------------------------- -- | -- Module : Language.C.Data.InputStream--- Copyright : (c) 2008 Benedikt Huber+-- Copyright : (c) 2008,2011 Benedikt Huber -- License : BSD-style -- Maintainer : benedikt.huber@gmail.com -- Stability : experimental -- Portability : ghc ----- Compile time input abstraction for the parser.--- Supports either ByteString or String.+-- Compile time input abstraction for the parser, relying on ByteString.+-- The String interface only supports Latin-1 since alex-3, as alex now requires+-- byte based access to the input stream. ------------------------------------------------------------------------------- module Language.C.Data.InputStream ( InputStream, readInputStream,inputStreamToString,inputStreamFromString,- takeChar,inputStreamEmpty,takeChars,+ takeByte, takeChar, inputStreamEmpty, takeChars, countLines, ) where++import Data.Word+ #ifndef NO_BYTESTRING-import Data.ByteString.Char8 (ByteString)-import qualified Data.ByteString.Char8 as BS+import Data.ByteString (ByteString)+import qualified Data.ByteString as BSW+import qualified Data.ByteString.Char8 as BSC+#else+import qualified Data.Char as Char #endif -- Generic InputStream stuff@@ -35,6 +42,11 @@ -- | convert a 'String' to an 'InputStream' inputStreamFromString :: String -> InputStream +-- | @(b,is') = takeByte is@ reads and removes+-- the first byte @b@ from the 'InputStream' @is@+takeByte :: InputStream -> (Word8, InputStream)+{-# INLINE takeByte #-}+ -- | @(c,is') = takeChar is@ reads and removes -- the first character @c@ from the 'InputStream' @is@ takeChar :: InputStream -> (Char, InputStream)@@ -54,18 +66,25 @@ countLines :: InputStream -> Int #ifndef NO_BYTESTRING+ type InputStream = ByteString-takeChar bs = BS.head bs `seq` (BS.head bs, BS.tail bs)-inputStreamEmpty = BS.null-#ifndef __HADDOCK__-takeChars !n bstr = BS.unpack $ BS.take n bstr --leaks-#endif-readInputStream = BS.readFile-inputStreamToString = BS.unpack-inputStreamFromString = BS.pack-countLines = length . BS.lines+takeByte bs = BSW.head bs `seq` (BSW.head bs, BSW.tail bs)+takeChar bs = BSC.head bs `seq` (BSC.head bs, BSC.tail bs)+inputStreamEmpty = BSW.null+takeChars !n bstr = BSC.unpack $ BSC.take n bstr+readInputStream = BSW.readFile++inputStreamToString = BSC.unpack+inputStreamFromString = BSC.pack+countLines = length . BSC.lines+ #else+ type InputStream = String+takeByte bs+ | Char.isLatin1 c = let b = fromIntegral (Char.ord c) in b `seq` (b, tail bs)+ | otherwise = error "takeByte: not a latin-1 character"+ where c = head bs takeChar bs = (head bs, tail bs) inputStreamEmpty = null takeChars n str = take n str
src/Language/C/Data/Name.hs view
@@ -12,13 +12,16 @@ module Language.C.Data.Name ( Name(..),newNameSupply, namesStartingFrom ) where+import Data.Data (Data) import Data.Ix-import Data.IntMap (IntMap)-import qualified Data.IntMap as IntMap-import Data.Generics+import GHC.Generics (Generic)+import Control.DeepSeq (NFData) -- | Name is a unique identifier-newtype Name = Name { nameId :: Int } deriving (Show, Read, Eq, Ord, Ix, Data, Typeable)+newtype Name = Name { nameId :: Int }+ deriving (Show, Read, Eq, Ord, Ix, Data, Generic)++instance NFData Name instance Enum Name where toEnum = Name
src/Language/C/Data/Node.hs view
@@ -12,36 +12,62 @@ -- source position and unqiue name ----------------------------------------------------------------------------- module Language.C.Data.Node (- NodeInfo(..), internalNode,mkNodeInfoOnlyPos,mkNodeInfo,+ NodeInfo(..), undefNode, isUndefNode,+ mkNodeInfoOnlyPos,mkNodeInfoPosLen, mkNodeInfo,mkNodeInfo',+ internalNode, -- deprecated, use undefNode CNode(nodeInfo), fileOfNode,- posOfNode, nameOfNode,+ posOfNode, nameOfNode, getLastTokenPos, lengthOfNode, eqByName, ) where import Language.C.Data.Position import Language.C.Data.Name (Name)-import Data.Generics+import Data.Data (Data)+import GHC.Generics (Generic)+import Control.DeepSeq (NFData) -- | Parsed entity attribute-data NodeInfo = OnlyPos Position -- only pos (for internal stuff only)- | NodeInfo Position Name -- pos and unique name- deriving (Show,Read,Data,Typeable)+data NodeInfo = OnlyPos Position {-# UNPACK #-} !PosLength -- only pos and last token (for internal stuff only)+ | NodeInfo Position {-# UNPACK #-} !PosLength !Name -- pos, last token and unique name+ deriving (Data,Eq,Ord, Generic) +instance NFData NodeInfo++instance Show NodeInfo where+ showsPrec d (OnlyPos p l) =+ (showString "(OnlyPos ") . (showsPrec d p) . (showString " ") . (showsPrec d l) . (showString ")")+ showsPrec d (NodeInfo p l n) =+ (showString "(NodeInfo ") . (showsPrec d p) . (showString " ") . (showsPrec d l) . (showString " ") . (showsPrec d n) . (showString ")")+ -- name equality of attributes, used to define (name) equality of objects-instance Eq NodeInfo where- (NodeInfo _ id1) == (NodeInfo _ id2) = id1 == id2- _ == _ =- error "Attributes: Attempt to compare `OnlyPos' attributes!"+--instance Eq NodeInfo where+-- (NodeInfo _ _ id1) == (NodeInfo _ _ id2) = id1 == id2+-- _ == _ =+-- error "Attributes: Attempt to compare `OnlyPos' attributes!" -- attribute ordering-instance Ord NodeInfo where- (NodeInfo _ id1) <= (NodeInfo _ id2) = id1 <= id2- _ <= _ =- error "Attributes: Attempt to compare `OnlyPos' attributes!"+--instance Ord NodeInfo where+-- (NodeInfo _ _ id1) <= (NodeInfo _ _ id2) = id1 <= id2+-- _ <= _ =+-- error "Attributes: Attempt to compare `OnlyPos' attributes!" instance Pos NodeInfo where- posOf (OnlyPos pos) = pos- posOf (NodeInfo pos _) = pos+ posOf (OnlyPos pos _) = pos+ posOf (NodeInfo pos _ _) = pos +-- | get the number of characters an AST node spans+lengthOfNode :: NodeInfo -> Maybe Int+lengthOfNode ni = len+ where+ len = case ni of NodeInfo firstPos lastTok _ -> computeLength firstPos lastTok+ OnlyPos firstPos lastTok -> computeLength firstPos lastTok+ computeLength pos (lastPos,lastTokLen) | lastTokLen < 0 = Nothing+ | otherwise = Just (posOffset lastPos + lastTokLen - posOffset pos)++-- | get the position and length of the last token+getLastTokenPos :: NodeInfo -> PosLength+getLastTokenPos (NodeInfo _ lastTok _) = lastTok+getLastTokenPos (OnlyPos _ lastTok) = lastTok+ -- | a class for convenient access to the attributes of an attributed object class CNode a where nodeInfo :: a -> NodeInfo@@ -51,12 +77,14 @@ nodeInfo = either nodeInfo nodeInfo nameOfNode :: NodeInfo -> Maybe Name-nameOfNode (OnlyPos _) = Nothing-nameOfNode (NodeInfo _ name) = Just name+nameOfNode (OnlyPos _ _) = Nothing+nameOfNode (NodeInfo _ _ name) = Just name posOfNode :: NodeInfo -> Position-posOfNode ni = case ni of (OnlyPos pos ) -> pos; (NodeInfo pos _) -> pos-fileOfNode :: (CNode a) => a -> FilePath-fileOfNode = posFile . posOfNode . nodeInfo+posOfNode ni = case ni of (OnlyPos pos _) -> pos; (NodeInfo pos _ _) -> pos+fileOfNode :: (CNode a) => a -> Maybe FilePath+fileOfNode = fmap posFile . justIf isSourcePos . posOfNode . nodeInfo where+ justIf predicate x | predicate x = Just x+ | otherwise = Nothing -- | equality by name eqByName :: CNode a => a -> a -> Bool@@ -65,16 +93,36 @@ -- attribute identifier creation -- ------------------------------+{-# DEPRECATED internalNode "use undefNode instead" #-} internalNode :: NodeInfo-internalNode = OnlyPos nopos+internalNode = undefNode --- | Given only a source position, create a new attribute identifier+-- | create a node with neither name nor positional information+undefNode :: NodeInfo+undefNode = OnlyPos nopos (nopos,-1)++-- | return True if the node carries neither name nor positional information+isUndefNode :: NodeInfo -> Bool+isUndefNode (OnlyPos p _) | isNoPos p = True+ | otherwise = False+isUndefNode _ = False++-- |+-- | Given only a source position, create a new node attribute mkNodeInfoOnlyPos :: Position -> NodeInfo-mkNodeInfoOnlyPos pos = OnlyPos pos+mkNodeInfoOnlyPos pos = OnlyPos pos (nopos,-1) +-- | Given a source position and the position and length of the last token, create a new node attribute+mkNodeInfoPosLen :: Position -> PosLength -> NodeInfo+mkNodeInfoPosLen = OnlyPos+ -- | Given a source position and a unique name, create a new attribute -- identifier mkNodeInfo :: Position -> Name -> NodeInfo-mkNodeInfo pos name = NodeInfo pos name+mkNodeInfo pos name = NodeInfo pos (nopos,-1) name++-- | Given a source position, the position and length of the last token and a unique name, create a new attribute+-- identifier. Strict in+mkNodeInfo' :: Position -> PosLength -> Name -> NodeInfo+mkNodeInfo' pos lasttok name = NodeInfo pos lasttok name
src/Language/C/Data/Position.hs view
@@ -1,8 +1,9 @@-{-# LANGUAGE DeriveDataTypeable, PatternGuards #-}+{-# LANGUAGE DeriveDataTypeable #-} ----------------------------------------------------------------------------- -- | -- Module : Language.C.Data.Position -- Copyright : (c) [1995..2000] Manuel M. T. Chakravarty+-- [2008..2009] Benedikt Huber -- License : BSD-style -- Maintainer : benedikt.huber@gmail.com -- Stability : experimental@@ -14,112 +15,121 @@ -- -- source text positions --- Position(Position),initPos,- posFile,posRow,posColumn,isSourcePos,+ Position(),+ position,+ PosLength,+ posFile,posRow,posColumn,posOffset,posParent,+ initPos, isSourcePos, nopos, isNoPos, builtinPos, isBuiltinPos, internalPos, isInternalPos,- incPos, tabPos, retPos, adjustPos,+ incPos, retPos,+ incOffset, Pos(..), ) where-import Data.Generics+import Data.Data (Data)+import GHC.Generics (Generic)+import Control.DeepSeq (NFData) --- | uniform representation of source file positions; the order of the arguments--- is important as it leads to the desired ordering of source positions-data Position = Position String -- file name- {-# UNPACK #-} !Int -- row- {-# UNPACK #-} !Int -- column- deriving (Eq, Ord, Typeable, Data)+-- | file position information+data FilePosition = FilePosition { posSrcFile :: String, -- ^ source file+ posParentFile :: (Maybe Position) -- ^ including file, if any+ }+ deriving (Eq, Ord, Data, Generic) -instance Show Position where- show pos@(Position fname row col)- | isNoPos pos = "<no file>"- | isBuiltinPos pos = "<builtin>"- | isInternalPos pos = "<internal>"- | otherwise = show (fname, row, col)-instance Read Position where- readsPrec p s = case s of- '<' : _ -> readInternal s- _ -> map (\((file,row,pos),r) -> (Position file row pos,r)) . readsPrec p $ s-readInternal :: ReadS Position-readInternal s | (Just rest) <- readString "<no file>" s = [(nopos,rest)]- | (Just rest) <- readString "<builtin>" s = [(builtinPos,rest)]- | (Just rest) <- readString "<internal>" s = [(internalPos,rest)]- | otherwise = []- where readString [] r = return r- readString (c:cs) (c':cs') | c == c' = readString cs cs'- | otherwise = Nothing- readString (_:_) [] = Nothing+instance NFData FilePosition --- | get the source file of the specified position. Fails unless @isSourcePos pos@.+-- | uniform representation of source file positions+data Position = Position { posOffset :: {-# UNPACK #-} !Int -- ^ absolute offset in the preprocessed file+ , posRow :: {-# UNPACK #-} !Int -- ^ row (line) in the original file. Affected by #LINE pragmas.+ , posColumn :: {-# UNPACK #-} !Int -- ^ column in the preprocessed file. Inaccurate w.r.t. to the original+ -- file in the presence of preprocessor macros.+ , posFileInfo :: FilePosition -- ^ position in source file, including files+ }+ | NoPosition+ | BuiltinPosition+ | InternalPosition+ deriving (Eq, Ord, Data, Generic)++instance NFData Position+ posFile :: Position -> String-posFile (Position fname _ _) = fname+posFile = posSrcFile . posFileInfo --- | get the line number of the specified position. Fails unless @isSourcePos pos@-posRow :: Position -> Int-posRow (Position _ row _) = row+posParent :: Position -> (Maybe Position)+posParent = posParentFile . posFileInfo --- | get the column of the specified position. Fails unless @isSourcePos pos@-posColumn :: Position -> Int-posColumn (Position _ _ col) = col+-- | Position and length of a token+type PosLength = (Position,Int) +instance Show Position where+ showsPrec _ (Position _ row _ (FilePosition fname mparent)) =+ showString "(" . showsPrec 0 fname . showString ": line " . showsPrec 0 row .+ maybe id (\p -> showString ", in file included from " . showsPrec 0 p) mparent .+ showString ")"+ showsPrec _ NoPosition = showString "<no file>"+ showsPrec _ BuiltinPosition = showString "<builtin>"+ showsPrec _ InternalPosition = showString "<internal>"++-- | @position absoluteOffset fileName lineNumber columnNumber@ initializes a @Position@ using the given arguments+position :: Int -> String -> Int -> Int -> Maybe Position -> Position+position offset fname row col mparent = Position offset row col (FilePosition fname mparent)+ -- | class of type which aggregate a source code location class Pos a where posOf :: a -> Position -- | initialize a Position to the start of the translation unit starting in the given file initPos :: FilePath -> Position-initPos file = Position file 1 1+initPos file = Position 0 1 1 (FilePosition file Nothing) -- | returns @True@ if the given position refers to an actual source file isSourcePos :: Position -> Bool-isSourcePos (Position _ row col) = row >= 0 && col >= 0+isSourcePos (Position _ _ _ _) = True+isSourcePos _ = False -- | no position (for unknown position information) nopos :: Position-nopos = Position "<no file>" (-1) 0+nopos = NoPosition +-- | returns @True@ if the there is no position information available isNoPos :: Position -> Bool-isNoPos (Position _ (-1) 0) = True-isNoPos _ = False+isNoPos NoPosition = True+isNoPos _ = False -- | position attached to built-in objects -- builtinPos :: Position-builtinPos = Position "<built into the parser>" (-1) 1+builtinPos = BuiltinPosition -- | returns @True@ if the given position refers to a builtin definition isBuiltinPos :: Position -> Bool-isBuiltinPos (Position _ (-1) 1) = True-isBuiltinPos _ = False+isBuiltinPos BuiltinPosition = True+isBuiltinPos _ = False -- | position used for internal errors internalPos :: Position-internalPos = Position "<internal error>" (-1) 2+internalPos = InternalPosition -- | returns @True@ if the given position is internal isInternalPos :: Position -> Bool-isInternalPos (Position _ (-1) 2) = True-isInternalPos _ = False+isInternalPos InternalPosition = True+isInternalPos _ = False {-# INLINE incPos #-} -- | advance column incPos :: Position -> Int -> Position-incPos (Position fname row col) n = Position fname row (col + n)--{-# DEPRECATED tabPos "Use 'incPos column-adjustment' instead" #-}--- | advance column to next tab positions (tabs are considered to be at every 8th column)-tabPos :: Position -> Position-tabPos (Position fname row col) =- Position fname row (col + 8 - (col - 1) `mod` 8)+incPos (Position offs row col fpos) n = Position (offs + n) row (col + n) fpos+incPos p _ = p {-# INLINE retPos #-} -- | advance to next line retPos :: Position -> Position-retPos (Position fname row _col) = Position fname (row + 1) 1+retPos (Position offs row _ fpos) = Position (offs+1) (row + 1) 1 fpos+retPos p = p -{-# INLINE adjustPos #-}--- | adjust position: change file and line number, reseting column to 1. This is usually --- used for #LINE pragmas.-adjustPos :: FilePath -> Int -> Position -> Position-adjustPos fname row (Position _ _ _) = Position fname row 1+{-# INLINE incOffset #-}+-- | advance just the offset+incOffset :: Position -> Int -> Position+incOffset (Position o r c f) n = Position (o + n) r c f+incOffset pos _ = pos
src/Language/C/Data/RList.hs view
@@ -30,7 +30,7 @@ snoc :: Reversed [a] -> a -> Reversed [a] snoc (Reversed xs) x = Reversed (x : xs)-infixr 5 `snoc`+infixl 5 `snoc` rappend :: Reversed [a] -> [a] -> Reversed [a] rappend (Reversed xs) ys = Reversed (List.reverse ys ++ xs)
src/Language/C/Parser/Builtin.hs view
@@ -18,4 +18,6 @@ -- predefined type names -- builtinTypeNames :: [Ident]-builtinTypeNames = [builtinIdent "__builtin_va_list"]+builtinTypeNames = [+ builtinIdent "__builtin_va_list"+ ]
src/Language/C/Parser/Lexer.x view
@@ -50,11 +50,19 @@ module Language.C.Parser.Lexer (lexC, parseError) where -import Data.Char (isDigit)-import Control.Monad (liftM)+import Data.Char (chr, isDigit)+import Data.List (uncons)+import Data.Word (Word8)+import Control.Monad (liftM, when) import Language.C.Data.InputStream-import Language.C.Data.Position (Position(..),posOf)+ (InputStream, inputStreamEmpty, takeByte, takeChar, takeChars)++-- ( InputStream, readInputStream,inputStreamToString,inputStreamFromString,+-- takeByte, takeChar, inputStreamEmpty, takeChars,+-- countLines,+-- )+import Language.C.Data.Position import Language.C.Data.Ident (mkIdent) import Language.C.Syntax.Constants@@ -73,10 +81,9 @@ $digitNZ = 1-9 $hexdigit = [0-9a-fA-F] -$inchar = \0-\255 # [ \\ \' \n \r ] -- valid character in char constant-$instr = \0-\255 # [ \\ \" \n \r ] -- valid character in a string literal-$anyButNL = \0-\255 # \n-$infname = \ -\127 # [ \\ \" ] -- valid character in a filename+$inchar = . # [ \\ \' \n \r ] -- valid character in char constant+$instr = . # [ \\ \" \n \r ] -- valid character in a string literal+$infname = . # [ \\ \" ] -- valid character in a filename @sp = $space* @@ -113,10 +120,13 @@ @hexmant = @hexdigits?\.@hexdigits|@hexdigits\. @binexp = [pP][\+\-]?@digits -@floatsuffix = [fFlL]+-- Suffixes `qQwW` are GNU floating type extensions: <https://gcc.gnu.org/onlinedocs/gcc/Floating-Types.html>+@iec60559suffix = (16|32|64|128)[x]?+@floatsuffix = [fFlLqQwW]@iec60559suffix? @floatgnusuffix = @floatsuffix@gnusuffix?|@gnusuffix@floatsuffix? -+-- clang version literals with a major.minor.rev+@clangversion = @intpart\.@intpart\.@intpart tokens :- @@ -129,27 +139,31 @@ -- $white+ ; --- #line directive (K&R A12.6)+-- #line directive (C11 6.10.4, GCC Line Control) ----- * allows further ints after the file name a la GCC; as the GCC CPP docu--- doesn't say how many ints there can be, we allow an unbound number+-- * standard form: int => change line number+-- * standard form: int string => change source file and line number+-- * preprocessor (gcc/clang): int string int => change source file and line number,+-- push or pop item from stack ---\#$space*@int$space*(\"($infname|@charesc)*\"$space*)?(@int$space*)*\r?$eol- { \pos len str -> setPos (linePragmaAdjust (takeChars len str) pos) >> lexToken }+-- * see https://gcc.gnu.org/onlinedocs/cpp/Preprocessor-Output.html+--+\#$space*@digits$space*(\"($infname|@charesc)*\"$space*)?(@int$space*)*\r?$eol+ { \pos len str -> setPos (adjustLineDirective len (takeChars len str) pos) >> lexToken' False } -- #pragma directive (K&R A12.8) -- -- * we simply ignore any #pragma (but take care to update the position -- information) ---\#$space*pragma$anyButNL*$eol ;+\#$space*pragma.*$eol ; -- #ident directive, eg used by rcs/cvs -- -- * we simply ignore any #ident (but take care to update the position -- information) ---\#$space*ident$anyButNL*$eol ;+\#$space*ident.*$eol ; -- identifiers and keywords (follows K&R A2.3 and A2.4) --@@ -172,11 +186,14 @@ -- character constants (follows K&R A2.5.2, C99 6.4.4.4) -- -- * Universal Character Names are unsupported and cause an error.-\'($inchar|@charesc)\' { token CTokCLit (cChar . fst . unescapeChar . tail) }-L\'($inchar|@charesc)\' { token CTokCLit (cChar_w . fst . unescapeChar . tail . tail) }-\'($inchar|@charesc){2,}\' { token CTokCLit (flip cChars False . unescapeMultiChars .tail) }-L\'($inchar|@charesc){2,}\' { token CTokCLit (flip cChars True . unescapeMultiChars . tail . tail) }+\'($inchar|@charesc)\' { token CTokCLit (cChar . fst . unescapeChar . drop 1) }+L\'($inchar|@charesc)\' { token CTokCLit (cChar_w . fst . unescapeChar . drop 2) }+\'($inchar|@charesc){2,}\' { token CTokCLit (flip cChars False . unescapeMultiChars . drop 1) }+L\'($inchar|@charesc){2,}\' { token CTokCLit (flip cChars True . unescapeMultiChars . drop 2) } +-- Clang version literals+@clangversion { token (\pos -> CTokClangC pos . ClangCVersionTok) readClangCVersion }+ -- float constants (follows K&R A2.5.3. C99 6.4.4.2) -- -- * NOTE: Hexadecimal floating constants without binary exponents are forbidden.@@ -187,8 +204,8 @@ -- string literal (follows K&R A2.6) -- C99: 6.4.5.-\"($instr|@charesc)*\" { token CTokSLit (cString . unescapeString . init . tail) }-L\"($instr|@charesc)*\" { token CTokSLit (cString_w . unescapeString . init . tail . tail) }+\"($instr|@charesc)*\" { token CTokSLit (cString . unescapeString . init . drop 1) }+L\"($instr|@charesc)*\" { token CTokSLit (cString_w . unescapeString . init . drop 2) } L?\'@ucn\' { token_fail "Universal character names are unsupported" } L?\'\\[^0-7'\"\?\\abfnrtvuUx]\' { token_fail "Invalid escape sequence" }@@ -196,52 +213,52 @@ -- operators and separators ---"(" { token_ CTokLParen }-")" { token_ CTokRParen }-"[" { token_ CTokLBracket }-"]" { token_ CTokRBracket }-"->" { token_ CTokArrow }-"." { token_ CTokDot }-"!" { token_ CTokExclam }-"~" { token_ CTokTilde }-"++" { token_ CTokInc }-"--" { token_ CTokDec }-"+" { token_ CTokPlus }-"-" { token_ CTokMinus }-"*" { token_ CTokStar }-"/" { token_ CTokSlash }-"%" { token_ CTokPercent }-"&" { token_ CTokAmper }-"<<" { token_ CTokShiftL }-">>" { token_ CTokShiftR }-"<" { token_ CTokLess }-"<=" { token_ CTokLessEq }-">" { token_ CTokHigh }-">=" { token_ CTokHighEq }-"==" { token_ CTokEqual }-"!=" { token_ CTokUnequal }-"^" { token_ CTokHat }-"|" { token_ CTokBar }-"&&" { token_ CTokAnd }-"||" { token_ CTokOr }-"?" { token_ CTokQuest }-":" { token_ CTokColon }-"=" { token_ CTokAssign }-"+=" { token_ CTokPlusAss }-"-=" { token_ CTokMinusAss }-"*=" { token_ CTokStarAss }-"/=" { token_ CTokSlashAss }-"%=" { token_ CTokPercAss }-"&=" { token_ CTokAmpAss }-"^=" { token_ CTokHatAss }-"|=" { token_ CTokBarAss }-"<<=" { token_ CTokSLAss }-">>=" { token_ CTokSRAss }-"," { token_ CTokComma }-\; { token_ CTokSemic }-"{" { token_ CTokLBrace }-"}" { token_ CTokRBrace }-"..." { token_ CTokEllipsis }+"(" { token_ 1 CTokLParen }+")" { token_ 1 CTokRParen }+"[" { token_ 1 CTokLBracket }+"]" { token_ 1 CTokRBracket }+"->" { token_ 2 CTokArrow }+"." { token_ 1 CTokDot }+"!" { token_ 1 CTokExclam }+"~" { token_ 1 CTokTilde }+"++" { token_ 2 CTokInc }+"--" { token_ 2 CTokDec }+"+" { token_ 1 CTokPlus }+"-" { token_ 1 CTokMinus }+"*" { token_ 1 CTokStar }+"/" { token_ 1 CTokSlash }+"%" { token_ 1 CTokPercent }+"&" { token_ 1 CTokAmper }+"<<" { token_ 2 CTokShiftL }+">>" { token_ 2 CTokShiftR }+"<" { token_ 1 CTokLess }+"<=" { token_ 2 CTokLessEq }+">" { token_ 1 CTokHigh }+">=" { token_ 2 CTokHighEq }+"==" { token_ 2 CTokEqual }+"!=" { token_ 2 CTokUnequal }+"^" { token_ 1 CTokHat }+"|" { token_ 1 CTokBar }+"&&" { token_ 2 CTokAnd }+"||" { token_ 2 CTokOr }+"?" { token_ 1 CTokQuest }+":" { token_ 1 CTokColon }+"=" { token_ 1 CTokAssign }+"+=" { token_ 2 CTokPlusAss }+"-=" { token_ 2 CTokMinusAss }+"*=" { token_ 2 CTokStarAss }+"/=" { token_ 2 CTokSlashAss }+"%=" { token_ 2 CTokPercAss }+"&=" { token_ 2 CTokAmpAss }+"^=" { token_ 2 CTokHatAss }+"|=" { token_ 2 CTokBarAss }+"<<=" { token_ 3 CTokSLAss }+">>=" { token_ 3 CTokSRAss }+"," { token_ 1 CTokComma }+\; { token_ 1 CTokSemic }+"{" { token_ 1 CTokLBrace }+"}" { token_ 1 CTokRBrace }+"..." { token_ 3 CTokEllipsis } {@@ -251,118 +268,235 @@ case r of (c:_) | isDigit c -> readCInteger OctalRepr r _ -> readCInteger DecRepr s+readCOctal _ = error "ReadOctal: string does not start with `0'" + -- We use the odd looking list of string patterns here rather than normal -- string literals since GHC converts the latter into a sequence of string -- comparisons (ie a linear search) but it translates the former using its -- effecient pattern matching which gives us the expected radix-style search.--- This gives change makes a significant performance difference.+-- This change makes a significant performance difference [chak] ---idkwtok :: String -> Position -> P CToken-idkwtok ('a':'l':'i':'g':'n':'o':'f':[]) = tok CTokAlignof-idkwtok ('_':'_':'a':'l':'i':'g':'n':'o':'f':[]) = tok CTokAlignof-idkwtok ('_':'_':'a':'l':'i':'g':'n':'o':'f':'_':'_':[]) = tok CTokAlignof-idkwtok ('a':'s':'m':[]) = tok CTokAsm-idkwtok ('_':'_':'a':'s':'m':[]) = tok CTokAsm-idkwtok ('_':'_':'a':'s':'m':'_':'_':[]) = tok CTokAsm-idkwtok ('a':'u':'t':'o':[]) = tok CTokAuto-idkwtok ('b':'r':'e':'a':'k':[]) = tok CTokBreak-idkwtok ('_':'B':'o':'o':'l':[]) = tok CTokBool-idkwtok ('c':'a':'s':'e':[]) = tok CTokCase-idkwtok ('c':'h':'a':'r':[]) = tok CTokChar-idkwtok ('c':'o':'n':'s':'t':[]) = tok CTokConst-idkwtok ('_':'_':'c':'o':'n':'s':'t':[]) = tok CTokConst-idkwtok ('_':'_':'c':'o':'n':'s':'t':'_':'_':[]) = tok CTokConst-idkwtok ('c':'o':'n':'t':'i':'n':'u':'e':[]) = tok CTokContinue-idkwtok ('_':'C':'o':'m':'p':'l':'e':'x':[]) = tok CTokComplex-idkwtok ('_':'_':'c':'o':'m':'p':'l':'e':'x':'_':'_':[]) = tok CTokComplex-idkwtok ('d':'e':'f':'a':'u':'l':'t':[]) = tok CTokDefault-idkwtok ('d':'o':[]) = tok CTokDo-idkwtok ('d':'o':'u':'b':'l':'e':[]) = tok CTokDouble-idkwtok ('e':'l':'s':'e':[]) = tok CTokElse-idkwtok ('e':'n':'u':'m':[]) = tok CTokEnum-idkwtok ('e':'x':'t':'e':'r':'n':[]) = tok CTokExtern-idkwtok ('f':'l':'o':'a':'t':[]) = tok CTokFloat-idkwtok ('f':'o':'r':[]) = tok CTokFor-idkwtok ('g':'o':'t':'o':[]) = tok CTokGoto-idkwtok ('i':'f':[]) = tok CTokIf-idkwtok ('i':'n':'l':'i':'n':'e':[]) = tok CTokInline-idkwtok ('_':'_':'i':'n':'l':'i':'n':'e':[]) = tok CTokInline-idkwtok ('_':'_':'i':'n':'l':'i':'n':'e':'_':'_':[]) = tok CTokInline-idkwtok ('i':'n':'t':[]) = tok CTokInt-idkwtok ('l':'o':'n':'g':[]) = tok CTokLong-idkwtok ('r':'e':'g':'i':'s':'t':'e':'r':[]) = tok CTokRegister-idkwtok ('r':'e':'s':'t':'r':'i':'c':'t':[]) = tok CTokRestrict-idkwtok ('_':'_':'r':'e':'s':'t':'r':'i':'c':'t':[]) = tok CTokRestrict-idkwtok ('_':'_':'r':'e':'s':'t':'r':'i':'c':'t':'_':'_':[]) = tok CTokRestrict-idkwtok ('r':'e':'t':'u':'r':'n':[]) = tok CTokReturn-idkwtok ('s':'h':'o':'r':'t':[]) = tok CTokShort-idkwtok ('s':'i':'g':'n':'e':'d':[]) = tok CTokSigned-idkwtok ('_':'_':'s':'i':'g':'n':'e':'d':[]) = tok CTokSigned-idkwtok ('_':'_':'s':'i':'g':'n':'e':'d':'_':'_':[]) = tok CTokSigned-idkwtok ('s':'i':'z':'e':'o':'f':[]) = tok CTokSizeof-idkwtok ('s':'t':'a':'t':'i':'c':[]) = tok CTokStatic-idkwtok ('s':'t':'r':'u':'c':'t':[]) = tok CTokStruct-idkwtok ('s':'w':'i':'t':'c':'h':[]) = tok CTokSwitch-idkwtok ('t':'y':'p':'e':'d':'e':'f':[]) = tok CTokTypedef-idkwtok ('t':'y':'p':'e':'o':'f':[]) = tok CTokTypeof-idkwtok ('_':'_':'t':'y':'p':'e':'o':'f':[]) = tok CTokTypeof-idkwtok ('_':'_':'t':'y':'p':'e':'o':'f':'_':'_':[]) = tok CTokTypeof-idkwtok ('_':'_':'t':'h':'r':'e':'a':'d':[]) = tok CTokThread-idkwtok ('u':'n':'i':'o':'n':[]) = tok CTokUnion-idkwtok ('u':'n':'s':'i':'g':'n':'e':'d':[]) = tok CTokUnsigned-idkwtok ('v':'o':'i':'d':[]) = tok CTokVoid-idkwtok ('v':'o':'l':'a':'t':'i':'l':'e':[]) = tok CTokVolatile-idkwtok ('_':'_':'v':'o':'l':'a':'t':'i':'l':'e':[]) = tok CTokVolatile-idkwtok ('_':'_':'v':'o':'l':'a':'t':'i':'l':'e':'_':'_':[]) = tok CTokVolatile-idkwtok ('w':'h':'i':'l':'e':[]) = tok CTokWhile-idkwtok ('_':'_':'l':'a':'b':'e':'l':'_':'_':[]) = tok CTokLabel-idkwtok ('_':'_':'a':'t':'t':'r':'i':'b':'u':'t':'e':[]) = tok (CTokGnuC GnuCAttrTok)-idkwtok ('_':'_':'a':'t':'t':'r':'i':'b':'u':'t':'e':'_':'_':[]) = tok (CTokGnuC GnuCAttrTok)-idkwtok ('_':'_':'e':'x':'t':'e':'n':'s':'i':'o':'n':'_':'_':[]) = tok (CTokGnuC GnuCExtTok)-idkwtok ('_':'_':'r':'e':'a':'l':[]) = tok (CTokGnuC GnuCComplexReal)-idkwtok ('_':'_':'r':'e':'a':'l':'_':'_':[]) = tok (CTokGnuC GnuCComplexReal)-idkwtok ('_':'_':'i':'m':'a':'g':[]) = tok (CTokGnuC GnuCComplexImag)-idkwtok ('_':'_':'i':'m':'a':'g':'_':'_':[]) = tok (CTokGnuC GnuCComplexImag)-idkwtok ('_':'_':'b':'u':'i':'l':'t':'i':'n':'_':rest)- | rest == "va_arg" = tok (CTokGnuC GnuCVaArg)- | rest == "offsetof" = tok (CTokGnuC GnuCOffsetof)- | rest == "types_compatible_p" = tok (CTokGnuC GnuCTyCompat)+-- To make this a little more maintainable, we autogenerate it from this list,+-- using the script GenerateKeywords.hs (in /scripts)+{-+alignas _Alignas,+alignof _Alignof __alignof alignof __alignof__,+asm @__,+atomic _Atomic,+auto, break, bool _Bool bool,+case, char, const @__, continue,+complex _Complex __complex__+default, do, double,+else, enum, extern,+float, for,+generic _Generic,+goto,+if, inline @__, int,+int128 __int128 __int128_t,+long,+noreturn _Noreturn,+nullable _Nullable __nullable,+nonnull _Nonnull __nonnull,+register, restrict @__, return+short, signed @__, sizeof, static,+staticAssert _Static_assert,+struct, switch,+typedef, typeof @__,+thread __thread _Thread_local+(CTokUInt128) __uint128 __uint128_t,+union,+unsigned,+void,+volatile @__,+while,+label __label__+BFloat16 __bf16+(CTokFloatN 16 False) __fp16+(CTokFloatN 16 False) _Float16+(CTokFloatN 16 True) _Float16x+(CTokFloatN 32 False) _Float32+(CTokFloatN 32 True) _Float32x+(CTokFloatN 64 False) _Float64+(CTokFloatN 64 True) _Float64x+(CTokFloatN 128 False) _Float128 __float128+(CTokFloatN 128 True) _Float128x+(CTokGnuC GnuCAttrTok) __attribute __attribute__+(CTokGnuC GnuCExtTok) __extension__+(CTokGnuC GnuCComplexReal) __real __real__+(CTokGnuC GnuCComplexImag) __imag __imag__+(CTokGnuC GnuCVaArg) __builtin_va_arg+(CTokGnuC GnuCOffsetof) __builtin_offsetof+(CTokGnuC GnuCTyCompat) __builtin_types_compatible_p+(CTokGnuC GnuBitCast) __builtin_bit_cast+(flip CTokClangC ClangBuiltinConvertVector) __builtin_convertvector+-} +-- Tokens: _Alignas _Alignof __alignof alignof __alignof__ __asm asm __asm__ _Atomic auto break _Bool bool case char __const const __const__ continue _Complex __complex__ default do double else enum extern float for _Generic goto if __inline inline __inline__ int __int128 __int128_t long _Noreturn _Nullable __nullable _Nonnull __nonnull register __restrict restrict __restrict__ return short __signed signed __signed__ sizeof static _Static_assert struct switch typedef __typeof typeof __typeof__ __thread _Thread_local __uint128 __uint128_t union unsigned void __volatile volatile __volatile__ while __label__ __bf16 __fp16 _Float16 _Float16x _Float32 _Float32x _Float64 _Float64x _Float128 __float128 _Float128x __attribute __attribute__ __extension__ __real __real__ __imag __imag__ __builtin_va_arg __builtin_offsetof __builtin_types_compatible_p __builtin_bit_cast __builtin_convertvector+idkwtok ('_' : 'A' : 'l' : 'i' : 'g' : 'n' : 'a' : 's' : []) = tok 8 CTokAlignas+idkwtok ('_' : 'A' : 'l' : 'i' : 'g' : 'n' : 'o' : 'f' : []) = tok 8 CTokAlignof+idkwtok ('_' : 'A' : 't' : 'o' : 'm' : 'i' : 'c' : []) = tok 7 CTokAtomic+idkwtok ('_' : 'B' : 'o' : 'o' : 'l' : []) = tok 5 CTokBool+idkwtok ('_' : 'C' : 'o' : 'm' : 'p' : 'l' : 'e' : 'x' : []) = tok 8 CTokComplex+#ifdef IEC_60559_TYPES_EXT+idkwtok ('_' : 'F' : 'l' : 'o' : 'a' : 't' : '1' : '2' : '8' : []) = tok 9 (CTokFloatN 128 False)+idkwtok ('_' : 'F' : 'l' : 'o' : 'a' : 't' : '1' : '2' : '8' : 'x' : []) = tok 10 (CTokFloatN 128 True)+idkwtok ('_' : 'F' : 'l' : 'o' : 'a' : 't' : '1' : '6' : []) = tok 8 (CTokFloatN 16 False)+idkwtok ('_' : 'F' : 'l' : 'o' : 'a' : 't' : '1' : '6' : 'x' : []) = tok 9 (CTokFloatN 16 True)+idkwtok ('_' : 'F' : 'l' : 'o' : 'a' : 't' : '3' : '2' : []) = tok 8 (CTokFloatN 32 False)+idkwtok ('_' : 'F' : 'l' : 'o' : 'a' : 't' : '3' : '2' : 'x' : []) = tok 9 (CTokFloatN 32 True)+idkwtok ('_' : 'F' : 'l' : 'o' : 'a' : 't' : '6' : '4' : []) = tok 8 (CTokFloatN 64 False)+idkwtok ('_' : 'F' : 'l' : 'o' : 'a' : 't' : '6' : '4' : 'x' : []) = tok 9 (CTokFloatN 64 True)+#endif+idkwtok ('_' : 'G' : 'e' : 'n' : 'e' : 'r' : 'i' : 'c' : []) = tok 8 CTokGeneric+idkwtok ('_' : 'N' : 'o' : 'n' : 'n' : 'u' : 'l' : 'l' : []) = tok 8 CTokNonnull+idkwtok ('_' : 'N' : 'o' : 'r' : 'e' : 't' : 'u' : 'r' : 'n' : []) = tok 9 CTokNoreturn+idkwtok ('_' : 'N' : 'u' : 'l' : 'l' : 'a' : 'b' : 'l' : 'e' : []) = tok 9 CTokNullable+idkwtok ('_' : 'S' : 't' : 'a' : 't' : 'i' : 'c' : '_' : 'a' : 's' : 's' : 'e' : 'r' : 't' : []) = tok 14 CTokStaticAssert+idkwtok ('_' : 'T' : 'h' : 'r' : 'e' : 'a' : 'd' : '_' : 'l' : 'o' : 'c' : 'a' : 'l' : []) = tok 13 CTokThread+idkwtok ('_' : '_' : 'a' : 'l' : 'i' : 'g' : 'n' : 'o' : 'f' : []) = tok 9 CTokAlignof+idkwtok ('a' : 'l' : 'i' : 'g' : 'n' : 'o' : 'f' : []) = tok 7 CTokAlignof+idkwtok ('_' : '_' : 'a' : 'l' : 'i' : 'g' : 'n' : 'o' : 'f' : '_' : '_' : []) = tok 11 CTokAlignof+idkwtok ('_' : '_' : 'a' : 's' : 'm' : []) = tok 5 CTokAsm+idkwtok ('a' : 's' : 'm' : []) = tok 3 CTokAsm+idkwtok ('_' : '_' : 'a' : 's' : 'm' : '_' : '_' : []) = tok 7 CTokAsm+idkwtok ('_' : '_' : 'a' : 't' : 't' : 'r' : 'i' : 'b' : 'u' : 't' : 'e' : []) = tok 11 (CTokGnuC GnuCAttrTok)+idkwtok ('_' : '_' : 'a' : 't' : 't' : 'r' : 'i' : 'b' : 'u' : 't' : 'e' : '_' : '_' : []) = tok 13 (CTokGnuC GnuCAttrTok)+idkwtok ('a' : 'u' : 't' : 'o' : []) = tok 4 CTokAuto+idkwtok ('_' : '_' : 'b' : 'f' : '1' : '6' : []) = tok 6 CTokBFloat16+idkwtok ('b' : 'o' : 'o' : 'l' : []) = tok 4 CTokBool+idkwtok ('b' : 'r' : 'e' : 'a' : 'k' : []) = tok 5 CTokBreak+idkwtok ('_' : '_' : 'b' : 'u' : 'i' : 'l' : 't' : 'i' : 'n' : '_' : 'b' : 'i' : 't' : '_' : 'c' : 'a' : 's' : 't' : []) = tok 18 (flip CTokClangC ClangCBitCast)+idkwtok ('_' : '_' : 'b' : 'u' : 'i' : 'l' : 't' : 'i' : 'n' : '_' : 'c' : 'o' : 'n' : 'v' : 'e' : 'r' : 't' : 'v' : 'e' : 'c' : 't' : 'o' : 'r' : []) = tok 23 (flip CTokClangC ClangBuiltinConvertVector)+idkwtok ('_' : '_' : 'b' : 'u' : 'i' : 'l' : 't' : 'i' : 'n' : '_' : 'o' : 'f' : 'f' : 's' : 'e' : 't' : 'o' : 'f' : []) = tok 18 (CTokGnuC GnuCOffsetof)+idkwtok ('_' : '_' : 'b' : 'u' : 'i' : 'l' : 't' : 'i' : 'n' : '_' : 't' : 'y' : 'p' : 'e' : 's' : '_' : 'c' : 'o' : 'm' : 'p' : 'a' : 't' : 'i' : 'b' : 'l' : 'e' : '_' : 'p' : []) = tok 28 (CTokGnuC GnuCTyCompat)+idkwtok ('_' : '_' : 'b' : 'u' : 'i' : 'l' : 't' : 'i' : 'n' : '_' : 'v' : 'a' : '_' : 'a' : 'r' : 'g' : []) = tok 16 (CTokGnuC GnuCVaArg)+idkwtok ('c' : 'a' : 's' : 'e' : []) = tok 4 CTokCase+idkwtok ('c' : 'h' : 'a' : 'r' : []) = tok 4 CTokChar+idkwtok ('_' : '_' : 'c' : 'o' : 'm' : 'p' : 'l' : 'e' : 'x' : '_' : '_' : []) = tok 11 CTokComplex+idkwtok ('_' : '_' : 'c' : 'o' : 'n' : 's' : 't' : []) = tok 7 CTokConst+idkwtok ('c' : 'o' : 'n' : 's' : 't' : []) = tok 5 CTokConst+idkwtok ('_' : '_' : 'c' : 'o' : 'n' : 's' : 't' : '_' : '_' : []) = tok 9 CTokConst+idkwtok ('c' : 'o' : 'n' : 't' : 'i' : 'n' : 'u' : 'e' : []) = tok 8 CTokContinue+idkwtok ('d' : 'e' : 'f' : 'a' : 'u' : 'l' : 't' : []) = tok 7 CTokDefault+idkwtok ('d' : 'o' : []) = tok 2 CTokDo+idkwtok ('d' : 'o' : 'u' : 'b' : 'l' : 'e' : []) = tok 6 CTokDouble+idkwtok ('e' : 'l' : 's' : 'e' : []) = tok 4 CTokElse+idkwtok ('e' : 'n' : 'u' : 'm' : []) = tok 4 CTokEnum+idkwtok ('_' : '_' : 'e' : 'x' : 't' : 'e' : 'n' : 's' : 'i' : 'o' : 'n' : '_' : '_' : []) = tok 13 (CTokGnuC GnuCExtTok)+idkwtok ('e' : 'x' : 't' : 'e' : 'r' : 'n' : []) = tok 6 CTokExtern+idkwtok ('f' : 'l' : 'o' : 'a' : 't' : []) = tok 5 CTokFloat+idkwtok ('_' : '_' : 'f' : 'l' : 'o' : 'a' : 't' : '1' : '2' : '8' : []) = tok 10 (CTokFloatN 128 False)+idkwtok ('f' : 'o' : 'r' : []) = tok 3 CTokFor+idkwtok ('_' : '_' : 'f' : 'p' : '1' : '6' : []) = tok 6 (CTokFloatN 16 False)+idkwtok ('g' : 'o' : 't' : 'o' : []) = tok 4 CTokGoto+idkwtok ('i' : 'f' : []) = tok 2 CTokIf+idkwtok ('_' : '_' : 'i' : 'm' : 'a' : 'g' : []) = tok 6 (CTokGnuC GnuCComplexImag)+idkwtok ('_' : '_' : 'i' : 'm' : 'a' : 'g' : '_' : '_' : []) = tok 8 (CTokGnuC GnuCComplexImag)+idkwtok ('_' : '_' : 'i' : 'n' : 'l' : 'i' : 'n' : 'e' : []) = tok 8 CTokInline+idkwtok ('i' : 'n' : 'l' : 'i' : 'n' : 'e' : []) = tok 6 CTokInline+idkwtok ('_' : '_' : 'i' : 'n' : 'l' : 'i' : 'n' : 'e' : '_' : '_' : []) = tok 10 CTokInline+idkwtok ('i' : 'n' : 't' : []) = tok 3 CTokInt+idkwtok ('_' : '_' : 'i' : 'n' : 't' : '1' : '2' : '8' : []) = tok 8 CTokInt128+idkwtok ('_' : '_' : 'i' : 'n' : 't' : '1' : '2' : '8' : '_' : 't' : []) = tok 10 CTokInt128+idkwtok ('_' : '_' : 'l' : 'a' : 'b' : 'e' : 'l' : '_' : '_' : []) = tok 9 CTokLabel+idkwtok ('l' : 'o' : 'n' : 'g' : []) = tok 4 CTokLong+idkwtok ('_' : '_' : 'n' : 'o' : 'n' : 'n' : 'u' : 'l' : 'l' : []) = tok 9 CTokNonnull+idkwtok ('_' : '_' : 'n' : 'u' : 'l' : 'l' : 'a' : 'b' : 'l' : 'e' : []) = tok 10 CTokNullable+idkwtok ('_' : '_' : 'r' : 'e' : 'a' : 'l' : []) = tok 6 (CTokGnuC GnuCComplexReal)+idkwtok ('_' : '_' : 'r' : 'e' : 'a' : 'l' : '_' : '_' : []) = tok 8 (CTokGnuC GnuCComplexReal)+idkwtok ('r' : 'e' : 'g' : 'i' : 's' : 't' : 'e' : 'r' : []) = tok 8 CTokRegister+idkwtok ('_' : '_' : 'r' : 'e' : 's' : 't' : 'r' : 'i' : 'c' : 't' : []) = tok 10 CTokRestrict+idkwtok ('r' : 'e' : 's' : 't' : 'r' : 'i' : 'c' : 't' : []) = tok 8 CTokRestrict+idkwtok ('_' : '_' : 'r' : 'e' : 's' : 't' : 'r' : 'i' : 'c' : 't' : '_' : '_' : []) = tok 12 CTokRestrict+idkwtok ('r' : 'e' : 't' : 'u' : 'r' : 'n' : []) = tok 6 CTokReturn+idkwtok ('s' : 'h' : 'o' : 'r' : 't' : []) = tok 5 CTokShort+idkwtok ('_' : '_' : 's' : 'i' : 'g' : 'n' : 'e' : 'd' : []) = tok 8 CTokSigned+idkwtok ('s' : 'i' : 'g' : 'n' : 'e' : 'd' : []) = tok 6 CTokSigned+idkwtok ('_' : '_' : 's' : 'i' : 'g' : 'n' : 'e' : 'd' : '_' : '_' : []) = tok 10 CTokSigned+idkwtok ('s' : 'i' : 'z' : 'e' : 'o' : 'f' : []) = tok 6 CTokSizeof+idkwtok ('s' : 't' : 'a' : 't' : 'i' : 'c' : []) = tok 6 CTokStatic+idkwtok ('s' : 't' : 'r' : 'u' : 'c' : 't' : []) = tok 6 CTokStruct+idkwtok ('s' : 'w' : 'i' : 't' : 'c' : 'h' : []) = tok 6 CTokSwitch+idkwtok ('_' : '_' : 't' : 'h' : 'r' : 'e' : 'a' : 'd' : []) = tok 8 CTokThread+idkwtok ('t' : 'y' : 'p' : 'e' : 'd' : 'e' : 'f' : []) = tok 7 CTokTypedef+idkwtok ('_' : '_' : 't' : 'y' : 'p' : 'e' : 'o' : 'f' : []) = tok 8 CTokTypeof+idkwtok ('t' : 'y' : 'p' : 'e' : 'o' : 'f' : []) = tok 6 CTokTypeof+idkwtok ('_' : '_' : 't' : 'y' : 'p' : 'e' : 'o' : 'f' : '_' : '_' : []) = tok 10 CTokTypeof+idkwtok ('_' : '_' : 'u' : 'i' : 'n' : 't' : '1' : '2' : '8' : []) = tok 9 (CTokUInt128)+idkwtok ('_' : '_' : 'u' : 'i' : 'n' : 't' : '1' : '2' : '8' : '_' : 't' : []) = tok 11 (CTokUInt128)+idkwtok ('u' : 'n' : 'i' : 'o' : 'n' : []) = tok 5 CTokUnion+idkwtok ('u' : 'n' : 's' : 'i' : 'g' : 'n' : 'e' : 'd' : []) = tok 8 CTokUnsigned+idkwtok ('v' : 'o' : 'i' : 'd' : []) = tok 4 CTokVoid+idkwtok ('_' : '_' : 'v' : 'o' : 'l' : 'a' : 't' : 'i' : 'l' : 'e' : []) = tok 10 CTokVolatile+idkwtok ('v' : 'o' : 'l' : 'a' : 't' : 'i' : 'l' : 'e' : []) = tok 8 CTokVolatile+idkwtok ('_' : '_' : 'v' : 'o' : 'l' : 'a' : 't' : 'i' : 'l' : 'e' : '_' : '_' : []) = tok 12 CTokVolatile+idkwtok ('w' : 'h' : 'i' : 'l' : 'e' : []) = tok 5 CTokWhile++-- For OpenCL tokens+idkwtok ('_' : '_' : 'k' : 'e' : 'r' : 'n' : 'e' : 'l' : []) = tok 8 CTokClKernel+idkwtok ('_' : '_' : 'r' : 'e' : 'a' : 'd' : '_' : 'o' : 'n' : 'l' : 'y' : []) = tok 11 CTokClRdOnly+idkwtok ('_' : '_' : 'w' : 'r' : 'i' : 't' : 'e' : '_' : 'o' : 'n' : 'l' : 'y' : []) = tok 12 CTokClWrOnly+idkwtok ('_' : '_' : 'g' : 'l' : 'o' : 'b' : 'a' : 'l' : []) = tok 8 CTokClGlobal+idkwtok ('_' : '_' : 'l' : 'o' : 'c' : 'a' : 'l' : []) = tok 7 CTokClLocal+ idkwtok cs = \pos -> do name <- getNewName+ let len = case length cs of l -> l let ident = mkIdent pos cs name tyident <- isTypeIdent ident if tyident- then return (CTokTyIdent pos ident)- else return (CTokIdent pos ident)+ then return (CTokTyIdent (pos,len) ident)+ else return (CTokIdent (pos,len) ident) ignoreAttribute :: P () ignoreAttribute = skipTokens (0::Int) where skipTokens :: Int -> P () skipTokens n = do- tok <- lexToken- case tok of+ ntok <- lexToken' False+ case ntok of CTokRParen _ | n == 1 -> return () | otherwise -> skipTokens (n-1) CTokLParen _ -> skipTokens (n+1) _ -> skipTokens n -tok :: (Position -> CToken) -> Position -> P CToken-tok tc pos = return (tc pos)+tok :: Int -> (PosLength -> CToken) -> Position -> P CToken+tok len tc pos = return (tc (pos,len)) -linePragmaAdjust :: String -> Position -> Position-linePragmaAdjust str p@(Position fname row _) = Position fname' row' 1+adjustLineDirective :: Int -> String -> Position -> Position+adjustLineDirective pragmaLen str pos =+ offs' `seq` fname' `seq` row' `seq` parent' `seq` (position offs' fname' row' 1 parent') where+ -- offset changes by length of #line pragma+ offs' = (posOffset pos) + pragmaLen str' = dropWhite . drop 1 $ str (rowStr, str'') = span isDigit str'+ -- row changes to the first number in the line pragma row' = read rowStr str''' = dropWhite str''- fnameStr = takeWhile (/= '"') . drop 1 $ str'''- fname' | null str''' || head str''' /= '"' = fname- -- try and get more sharing of file name strings- | fnameStr == fname = fname- | otherwise = fnameStr+ (fnameStr,str'''') = span (/= '"') . drop 1 $ str'''+ fname = posFile pos+ no_fn = null str''' || (fmap fst (uncons str''') /= Just '"') || (fmap fst (uncons str'''') /= Just '"')+ -- filename changes to new filename, if specified+ fname' | no_fn = fname+ -- try and get more sharing of file name strings+ | fnameStr == fname = fname+ | otherwise = fnameStr+ -- analye flags+ min_flag = find_min_flag (5 :: Int) (drop 1 str'''')+ find_min_flag cur_min = select_min . span isDigit . dropWhile (not . isDigit)+ where+ select_min (numStr, fstr') | null numStr = cur_min+ | otherwise = find_min_flag (read numStr `min` cur_min) fstr'+ parent = posParent pos+ parent' = case min_flag of+ 1 -> Just pos -- push+ 2 -> case parent >>= posParent of+ Nothing -> Nothing -- pop/underflow+ Just gp -> gp `seq` Just gp -- pop+ 3 -> parent -- unchanged stack, system header info+ 4 -> parent -- unchanged stack, extern C info+ _ -> Nothing -- dropWhite = dropWhile (\c -> c == ' ' || c == '\t') @@ -374,8 +508,8 @@ {-# INLINE token_ #-} -- token that ignores the string-token_ :: (Position -> CToken) -> Position -> Int -> InputStream -> P CToken-token_ tok pos _ _ = return (tok pos)+token_ :: Int -> (PosLength -> CToken) -> Position -> Int -> InputStream -> P CToken+token_ len mkTok pos _ _ = return (mkTok (pos,len)) {-# INLINE token_fail #-} -- error token@@ -386,17 +520,17 @@ {-# INLINE token #-} -- token that uses the string-token :: (Position -> a -> CToken) -> (String -> a)+token :: (PosLength -> a -> CToken) -> (String -> a) -> Position -> Int -> InputStream -> P CToken-token tok read pos len str = return (tok pos (read $ takeChars len str))+token mkTok fromStr pos len str = return (mkTok (pos,len) (fromStr $ takeChars len str)) {-# INLINE token_plus #-} -- token that may fail-token_plus :: (Position -> a -> CToken) -> (String -> Either String a)+token_plus :: (PosLength -> a -> CToken) -> (String -> Either String a) -> Position -> Int -> InputStream -> P CToken-token_plus tok read pos len str =- case read (takeChars len str) of Left err -> failP pos [ "Lexical error ! ", err ]- Right ok -> return $! tok pos ok+token_plus mkTok fromStr pos len str =+ case fromStr (takeChars len str) of Left err -> failP pos [ "Lexical error ! ", err ]+ Right ok -> return $! mkTok (pos,len) ok -- ----------------------------------------------------------------------------- -- The input type@@ -407,6 +541,14 @@ alexInputPrevChar :: AlexInput -> Char alexInputPrevChar _ = error "alexInputPrevChar not used" +-- for alex-3.0+alexGetByte :: AlexInput -> Maybe (Word8, AlexInput)+alexGetByte (p,is) | inputStreamEmpty is = Nothing+ | otherwise = let (b,s) = takeByte is in+ -- this is safe for latin-1, but ugly+ let p' = alexMove p (chr (fromIntegral b)) in p' `seq`+ Just (b, (p', s))+ alexGetChar :: AlexInput -> Maybe (Char,AlexInput) alexGetChar (p,is) | inputStreamEmpty is = Nothing | otherwise = let (c,s) = takeChar is in@@ -414,47 +556,63 @@ Just (c, (p', s)) alexMove :: Position -> Char -> Position-alexMove (Position f l c) ' ' = Position f l (c+1)-alexMove (Position f l c) '\n' = Position f (l+1) 1-alexMove (Position f l c) '\t' = Position f l (((c+7) `div` 8)*8+1)-alexMove p '\r' = p-alexMove (Position f l c) _ = Position f l (c+1)+alexMove pos ' ' = incPos pos 1+alexMove pos '\n' = retPos pos+alexMove pos '\r' = incOffset pos 1+alexMove pos _ = incPos pos 1 lexicalError :: P a lexicalError = do pos <- getPos- (c,cs) <- liftM takeChar getInput+ (c,_) <- liftM takeChar getInput failP pos ["Lexical error !", "The character " ++ show c ++ " does not fit here."] parseError :: P a parseError = do- tok <- getLastToken- failP (posOf tok)+ lastTok <- getLastToken+ failP (posOf lastTok) ["Syntax error !",- "The symbol `" ++ show tok ++ "' does not fit here."]+ "The symbol `" ++ show lastTok ++ "' does not fit here."] +-- there is a problem with ignored tokens here (that aren't skipped)+-- consider+-- 1 > int x;+-- 2 > LINE "ex.c" 4+-- 4 > int y;+-- when we get to LINE, we have [int (1,1),x (1,4)] in the token cache.+-- Now we run+-- > action (pos 2,0) 14 "LINE \"ex.c\" 3\n"+-- which in turn adjusts the position and then calls lexToken again+-- we get `int (pos 4,0)', and have [x (1,4), int (4,1) ] in the token cache (fine)+-- but then, we again call setLastToken when returning and get [int (4,1),int (4,1)] in the token cache (bad)+-- to resolve this, recursive calls invoke lexToken' False. lexToken :: P CToken-lexToken = do+lexToken = lexToken' True++lexToken' :: Bool -> P CToken+lexToken' modifyCache = do pos <- getPos inp <- getInput case alexScan (pos, inp) 0 of- AlexEOF -> return CTokEof- AlexError inp' -> lexicalError- AlexSkip (pos', inp') len -> do+ AlexEOF -> do+ handleEofToken+ return CTokEof+ AlexError _inp -> lexicalError+ AlexSkip (pos', inp') _len -> do setPos pos' setInput inp'- lexToken+ lexToken' modifyCache AlexToken (pos', inp') len action -> do setPos pos' setInput inp'- tok <- action pos len inp- setLastToken tok- return tok+ nextTok <- action pos len inp+ when modifyCache $ setLastToken nextTok+ return nextTok lexC :: (CToken -> P a) -> P a lexC cont = do- tok <- lexToken- cont tok+ nextTok <- lexToken+ cont nextTok }
src/Language/C/Parser/Parser.y view
@@ -29,6 +29,8 @@ -- <http://www.sivity.net/projects/language.c/wiki/Cee> ------------------------------------------------------------------ {+{-# LANGUAGE LambdaCase #-}+ module Language.C.Parser.Parser ( -- * Parse a C translation unit parseC,@@ -94,6 +96,7 @@ -- --- TODO ---------------------------------------------------------------------- --+-- !* We ignore C11 _Atomic type annotations -- !* We ignore the C99 static keyword (see C99 6.7.5.3) -- !* We do not distinguish in the AST between incomplete array types and -- complete variable length arrays ([ '*' ] means the latter). (see C99 6.7.5.2)@@ -102,16 +105,18 @@ -- !* see `We're being far to liberal here' (... struct definition within structs) -- * Documentation isn't complete and consistent yet. -import Prelude hiding (reverse)+import Prelude import qualified Data.List as List-+import Control.Monad (mplus)+import Data.Maybe (listToMaybe, mapMaybe) import Language.C.Parser.Builtin (builtinTypeNames) import Language.C.Parser.Lexer (lexC, parseError)-import Language.C.Parser.Tokens (CToken(..), GnuCTok(..))-import Language.C.Parser.ParserMonad (P, failP, execParser, getNewName, addTypedef, shadowTypedef,- enterScope, leaveScope, ParseError(..))+import Language.C.Parser.Tokens (CToken(..), GnuCTok(..), ClangCTok (..), posLenOfTok)+import Language.C.Parser.ParserMonad (P, failP, execParser, getNewName, addTypedef, shadowTypedef, getCurrentPosition,+ enterScope, leaveScope, getLastToken, getSavedToken, ParseError(..)) -import Language.C.Data.RList+import Language.C.Data.RList (Reversed(..))+import qualified Language.C.Data.RList as RList import Language.C.Data.InputStream import Language.C.Data.Ident import Language.C.Data.Name@@ -182,6 +187,8 @@ '}' { CTokRBrace _ } "..." { CTokEllipsis _ } alignof { CTokAlignof _ }+alignas { CTokAlignas _ }+"_Atomic" { CTokAtomic _ } asm { CTokAsm _ } auto { CTokAuto _ } break { CTokBreak _ }@@ -198,13 +205,30 @@ enum { CTokEnum _ } extern { CTokExtern _ } float { CTokFloat _ }+"__bf16" { CTokBFloat16 _ }+"__fp16" { CTokFloatN 16 False _ }+"_Float16" { CTokFloatN 16 False _ }+"_Float16x" { CTokFloatN 16 True _ }+"_Float32" { CTokFloatN 32 False _ }+"_Float32x" { CTokFloatN 32 True _ }+"_Float64" { CTokFloatN 64 False _ }+"_Float64x" { CTokFloatN 64 True _ }+"_Float128" { CTokFloatN 128 False _ }+"_Float128x" { CTokFloatN 128 True _ }+"__float128" { CTokFloatN 128 False _ } for { CTokFor _ }+"_Generic" { CTokGeneric _ } goto { CTokGoto _ } if { CTokIf _ } inline { CTokInline _ } int { CTokInt _ }+"__int128" { CTokInt128 _ }+"__int128_t" { CTokInt128 _ } long { CTokLong _ } "__label__" { CTokLabel _ }+"_Noreturn" { CTokNoreturn _ }+"_Nullable" { CTokNullable _ }+"_Nonnull" { CTokNonnull _ } register { CTokRegister _ } restrict { CTokRestrict _ } return { CTokReturn _ }@@ -212,12 +236,15 @@ signed { CTokSigned _ } sizeof { CTokSizeof _ } static { CTokStatic _ }+"_Static_assert"{ CTokStaticAssert _ } struct { CTokStruct _ } switch { CTokSwitch _ } typedef { CTokTypedef _ } typeof { CTokTypeof _ } "__thread" { CTokThread _ } union { CTokUnion _ }+"__uint128" { CTokUInt128 _ }+"__uint128_t" { CTokUInt128 _ } unsigned { CTokUnsigned _ } void { CTokVoid _ } volatile { CTokVolatile _ }@@ -236,15 +263,26 @@ "__builtin_va_arg" { CTokGnuC GnuCVaArg _ } "__builtin_offsetof" { CTokGnuC GnuCOffsetof _ } "__builtin_types_compatible_p" { CTokGnuC GnuCTyCompat _ }+"__builtin_convertvector" { CTokClangC _ ClangBuiltinConvertVector }+clangcversion { CTokClangC _ (ClangCVersionTok $$) } -- Clang version literal+"__builtin_bit_cast" { CTokClangC _ ClangCBitCast }+"__kernel" { CTokClKernel _ } -- OpenCL kernel function+"__read_only" { CTokClRdOnly _ } -- OpenCL read only qualifier+"__write_only" { CTokClWrOnly _ } -- OpenCL write only qualifier+"__global" { CTokClGlobal _ } -- OpenCL global variable+"__local" { CTokClLocal _ } -- OpenCL local variable %% -- parse a complete C translation unit---+-- we have to take special care of empty translation units translation_unit :: { CTranslUnit } translation_unit- : ext_decl_list {% withNodeInfo $1 $ CTranslUnit (reverse $1) }+ : ext_decl_list {% let decls = RList.reverse $1 in+ case decls of+ [] -> do{ n <- getNewName; p <- getCurrentPosition; return $ CTranslUnit decls (mkNodeInfo' p (p,0) n) }+ (d:ds) -> withNodeInfo d $ CTranslUnit decls } -- parse a list of external declarations, making up a C translation unit (C99 6.9)@@ -252,25 +290,24 @@ -- * GNU extensions: -- allow empty translation_unit -- allow redundant ';'--- ext_decl_list :: { Reversed [CExtDecl] } ext_decl_list- : {- empty -} { empty }- | ext_decl_list ';' { $1 }- | ext_decl_list external_declaration { $1 `snoc` $2 }+ : {- empty -} { RList.empty }+ | ext_decl_list ';' { $1 }+ | ext_decl_list external_declaration { $1 `RList.snoc` $2 } -- parse external C declaration (C99 6.9) -- -- * GNU extensions:--- allow extension keyword before external declaration+-- allow extension keyword before external declaration (TODO: discarded) -- asm definitions external_declaration :: { CExtDecl } external_declaration- : function_definition { CFDefExt $1 }+ : function_definition { CFDefExt $1 } | declaration { CDeclExt $1 }- | "__extension__" external_declaration { $2 }- | asm '(' string_literal ')' ';' { CAsmExt $3 }+ | "__extension__" external_declaration { $2 }+ | asm '(' string_literal ')' ';' {% withNodeInfo $1 $ CAsmExt $3 } -- parse C function definition (C99 6.9.1)@@ -292,10 +329,10 @@ function_definition :: { CFunDef } function_definition : function_declarator compound_statement- {% leaveScope >> (withNodeInfo $1 $ CFunDef [] $1 [] $2) }+ {% leaveScope >> (withNodeInfo $1 $ CFunDef [] $1 [] $2) } - | attrs function_declarator compound_statement- {% leaveScope >> (withNodeInfo $2 $ CFunDef (liftCAttrs $1) $2 [] $3) }+ | attrs function_declarator compound_statement+ {% leaveScope >> (withNodeInfo $1 $ CFunDef (liftCAttrs $1) $2 [] $3) } | declaration_specifier function_declarator compound_statement {% leaveScope >> (withNodeInfo $1 $ CFunDef $1 $2 [] $3) }@@ -304,36 +341,36 @@ {% leaveScope >> (withNodeInfo $1 $ CFunDef $1 $2 [] $3) } | declaration_qualifier_list function_declarator compound_statement- {% leaveScope >> (withNodeInfo $1 $ CFunDef (reverse $1) $2 [] $3) }+ {% leaveScope >> (withNodeInfo $1 $ CFunDef (RList.reverse $1) $2 [] $3) } - | type_qualifier_list function_declarator compound_statement+ | type_qualifier_list function_declarator compound_statement {% leaveScope >> (withNodeInfo $1 $ CFunDef (liftTypeQuals $1) $2 [] $3) } - | type_qualifier_list attrs function_declarator compound_statement+ | type_qualifier_list attrs function_declarator compound_statement {% leaveScope >> (withNodeInfo $1 $ CFunDef (liftTypeQuals $1 ++ liftCAttrs $2) $3 [] $4) } -- old function declarators | function_declarator_old declaration_list compound_statement- {% withNodeInfo $1 $ CFunDef [] $1 (reverse $2) $3 }+ {% withNodeInfo $1 $ CFunDef [] $1 (RList.reverse $2) $3 } | attrs function_declarator_old declaration_list compound_statement- {% withNodeInfo $2 $ CFunDef (liftCAttrs $1) $2 (reverse $3) $4 }+ {% withNodeInfo $2 $ CFunDef (liftCAttrs $1) $2 (RList.reverse $3) $4 } | declaration_specifier function_declarator_old declaration_list compound_statement- {% withNodeInfo $1 $ CFunDef $1 $2 (reverse $3) $4 }+ {% withNodeInfo $1 $ CFunDef $1 $2 (RList.reverse $3) $4 } | type_specifier function_declarator_old declaration_list compound_statement- {% withNodeInfo $1 $ CFunDef $1 $2 (reverse $3) $4 }+ {% withNodeInfo $1 $ CFunDef $1 $2 (RList.reverse $3) $4 } | declaration_qualifier_list function_declarator_old declaration_list compound_statement- {% withNodeInfo $1 $ CFunDef (reverse $1) $2 (reverse $3) $4 }+ {% withNodeInfo $1 $ CFunDef (RList.reverse $1) $2 (RList.reverse $3) $4 } | type_qualifier_list function_declarator_old declaration_list compound_statement- {% withNodeInfo $1 $ CFunDef (liftTypeQuals $1) $2 (reverse $3) $4 }+ {% withNodeInfo $1 $ CFunDef (liftTypeQuals $1) $2 (RList.reverse $3) $4 } | type_qualifier_list attrs function_declarator_old declaration_list compound_statement- {% withNodeInfo $1 $ CFunDef (liftTypeQuals $1 ++ liftCAttrs $2) $3 (reverse $4) $5 }+ {% withNodeInfo $1 $ CFunDef (liftTypeQuals $1 ++ liftCAttrs $2) $3 (RList.reverse $4) $5 } -- Read declarator and put function function_declarator :: { CDeclr }@@ -364,7 +401,7 @@ -- labeled_statement :: { CStat } labeled_statement- : identifier ':' attrs_opt statement {% withNodeInfo $2 $ CLabel $1 $4 $3 }+ : identifier ':' attrs_opt statement {% withNodeInfo $1 $ CLabel $1 $4 $3 } | case constant_expression ':' statement {% withNodeInfo $1 $ CCase $2 $4 } | default ':' statement {% withNodeInfo $1 $ CDefault $3 } | case constant_expression "..." constant_expression ':' statement@@ -378,10 +415,10 @@ compound_statement :: { CStat } compound_statement : '{' enter_scope block_item_list leave_scope '}'- {% withNodeInfo $1 $ CCompound [] (reverse $3) }+ {% withNodeInfo $1 $ CCompound [] (RList.reverse $3) } | '{' enter_scope label_declarations block_item_list leave_scope '}'- {% withNodeInfo $1 $ CCompound (reverse $3) (reverse $4) }+ {% withNodeInfo $1 $ CCompound (RList.reverse $3) (RList.reverse $4) } -- No syntax for these, just side effecting semantic actions.@@ -394,8 +431,8 @@ block_item_list :: { Reversed [CBlockItem] } block_item_list- : {- empty -} { empty }- | block_item_list block_item { $1 `snoc` $2 }+ : {- empty -} { RList.empty }+ | block_item_list block_item { $1 `RList.snoc` $2 } block_item :: { CBlockItem } block_item@@ -417,7 +454,7 @@ {% leaveScope >> (withNodeInfo $1 $ CFunDef $1 $2 [] $3) } | declaration_qualifier_list function_declarator compound_statement- {% leaveScope >> (withNodeInfo $1 $ CFunDef (reverse $1) $2 [] $3) }+ {% leaveScope >> (withNodeInfo $1 $ CFunDef (RList.reverse $1) $2 [] $3) } | type_qualifier_list function_declarator compound_statement {% leaveScope >> (withNodeInfo $1 $ CFunDef (liftTypeQuals $1) $2 [] $3) }@@ -428,8 +465,8 @@ label_declarations :: { Reversed [Ident] } label_declarations- : "__label__" identifier_list ';' { $2 }- | label_declarations "__label__" identifier_list ';' { $1 `rappendr` $3 }+ : "__label__" identifier_list ';' { $2 }+ | label_declarations "__label__" identifier_list ';' { $1 `RList.rappendr` $3 } -- parse C expression statement (C99 6.8.3)@@ -450,7 +487,7 @@ | if '(' expression ')' statement else statement {% withNodeInfo $1 $ CIf $3 $5 (Just $7) } - | switch '(' expression ')' statement + | switch '(' expression ')' statement {% withNodeInfo $1 $ CSwitch $3 $5 } @@ -479,9 +516,9 @@ jump_statement : goto identifier ';' {% withNodeInfo $1 $ CGoto $2 } | goto '*' expression ';' {% withNodeInfo $1 $ CGotoPtr $3 }- | continue ';' {% withNodeInfo $1 $ CCont }- | break ';' {% withNodeInfo $1 $ CBreak }- | return expression_opt ';' {% withNodeInfo $1 $ CReturn $2 }+ | continue ';' {% withNodeInfo $1 $ CCont }+ | break ';' {% withNodeInfo $1 $ CBreak }+ | return expression_opt ';' {% withNodeInfo $1 $ CReturn $2 } -- parse GNU C __asm__ statement (compatible with C99: J.5.10)@@ -502,36 +539,40 @@ {% withNodeInfo $1 $ CAsmStmt $2 $4 $6 $8 [] } | asm maybe_type_qualifier '(' string_literal ':' asm_operands ':' asm_operands ':' asm_clobbers ')' ';'- {% withNodeInfo $1 $ CAsmStmt $2 $4 $6 $8 (reverse $10) }+ {% withNodeInfo $1 $ CAsmStmt $2 $4 $6 $8 $10 } maybe_type_qualifier :: { Maybe CTypeQual } maybe_type_qualifier : {- empty -} { Nothing }- | type_qualifier { Just $1 }+ | type_qualifier { Just $1 } asm_operands :: { [CAsmOperand] } asm_operands : {- empty -} { [] }- | nonnull_asm_operands { reverse $1 }+ | nonnull_asm_operands { RList.reverse $1 } nonnull_asm_operands :: { Reversed [CAsmOperand] } nonnull_asm_operands- : asm_operand { singleton $1 }- | nonnull_asm_operands ',' asm_operand { $1 `snoc` $3 }+ : asm_operand { RList.singleton $1 }+ | nonnull_asm_operands ',' asm_operand { $1 `RList.snoc` $3 } asm_operand :: { CAsmOperand } asm_operand- : string_literal '(' expression ')' {% withNodeInfo $1 $ CAsmOperand Nothing $1 $3 }- | '[' ident ']' string_literal '(' expression ')' {% withNodeInfo $4 $ CAsmOperand (Just $2) $4 $6 }- | '[' tyident ']' string_literal '(' expression ')' {% withNodeInfo $4 $ CAsmOperand (Just $2) $4 $6 }-+ : string_literal '(' expression ')' {% withNodeInfo $1 $ CAsmOperand Nothing $1 $3 }+ | '[' ident ']' string_literal '(' expression ')' {% withNodeInfo $1 $ CAsmOperand (Just $2) $4 $6 }+ | '[' tyident ']' string_literal '(' expression ')' {% withNodeInfo $1 $ CAsmOperand (Just $2) $4 $6 } -asm_clobbers :: { Reversed [CStrLit] }+asm_clobbers :: { [CStrLit] } asm_clobbers- : string_literal { singleton $1 }- | asm_clobbers ',' string_literal { $1 `snoc` $3 }+ : {- empty -} { [] }+ | nonnull_asm_clobbers { RList.reverse $1 } +nonnull_asm_clobbers :: { Reversed [CStrLit] }+nonnull_asm_clobbers+ : string_literal { RList.singleton $1 }+ | nonnull_asm_clobbers ',' string_literal { $1 `RList.snoc` $3 }+ {- --------------------------------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------------------@@ -540,18 +581,20 @@ --------------------------------------------------------------------------------------------------------------- Declarations are the most complicated part of the grammar, and shall be summarized here.-To allow a lightweight notation, we will use the modifier <permute> to indicate that the order of the immidieate right-hand-sides doesn't matter.+To allow a lightweight notation, we will use the modifier <permute> to indicate that the order of the immidieate right-hand sides doesn't matter. - <permute> a* b+ c === any sequence of a's, b's and c's, which contains exactly 1 'c' and at least one 'b' -- storage class and type qualifier --------------------------------------------------------------------------------------------------------------- attr :- __attribute__((..))-storage_class :- typedef | extern | static | auto | register | __thread-type_qualifier :- const | volatile | restrict | inline+storage_class :- typedef | extern | static | auto | register | _Thread_local | __kernel | __global | __local+function_specifier :- inline | _Noreturn+alignment_specifier :- _Alignas (type_name) | _Alignas (constant_expr)++type_qualifier :- const | volatile | restrict | _Atomic | _Nullable | _Nonnull | __read_only | __write_only type_qualifier_list :- type_qualifier+ -declaration_qualifier :- storage_class | type_qualifier+declaration_qualifier :- storage_class | type_qualifier | function_specifier | alginment_specifier declaration_qualifier_list :- <permute> type_qualifier* storage_class+ qualifiers :- declaration_qualifier_list | type_qualifier_list@@ -590,7 +633,7 @@ -- Declaration ----------------------------------------------------------------------------------------------------------------declaration = sue_declaration | declaration_list+declaration = sue_declaration | declaration_list | _Static_assert(..) --------------------------------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------------------@@ -637,37 +680,32 @@ --- parse C declaration (C99 6.7)+-- parse C declaration (C11 6.7)+--+-- * new form in C11+-- _Static_assert(expr,string_literal) declaration :: { CDecl } declaration : sue_declaration_specifier ';'- {% withNodeInfo $1 $ CDecl (reverse $1) [] }+ {% withNodeInfo $1 $ CDecl (RList.reverse $1) [] } | sue_type_specifier ';'- {% withNodeInfo $1 $ CDecl (reverse $1) [] }+ {% withNodeInfo $1 $ CDecl (RList.reverse $1) [] } | declaring_list ';'- { case $1 of- CDecl declspecs dies at ->- CDecl declspecs (List.reverse dies) at }+ {% case $1 of CDecl declspecs dies at -> withLength at (CDecl declspecs (List.reverse dies)) } | default_declaring_list ';'- { case $1 of- CDecl declspecs dies at ->- CDecl declspecs (List.reverse dies) at }-+ {% case $1 of CDecl declspecs dies at -> withLength at (CDecl declspecs (List.reverse dies)) }+ | "_Static_assert" '(' constant_expression ',' string_literal ')' ';'+ {% withNodeInfo $1 $ CStaticAssert $3 $5 } declaration_list :: { Reversed [CDecl] } declaration_list- : {- empty -} { empty }- | declaration_list declaration { $1 `snoc` $2 }+ : {- empty -} { RList.empty }+ | declaration_list declaration { $1 `RList.snoc` $2 } --- Note that if a typedef were redeclared, then a declaration--- specifier must be supplied------ Can't redeclare typedef names--- -- * SUMMARY: default_declaring_list :- qualifier* identifier_declarator asm_attrs initializer? -- { ',' identifier_declarator asm_attrs initializer? } --@@ -679,10 +717,11 @@ default_declaring_list :: { CDecl } default_declaring_list : declaration_qualifier_list identifier_declarator asm_attrs_opt {-{}-} initializer_opt- {% let declspecs = reverse $1 in+ {% let declspecs = RList.reverse $1 in do{ declr <- withAsmNameAttrs $3 $2 ; doDeclIdent declspecs declr- ; withNodeInfo $1 $ CDecl declspecs [(Just (reverseDeclr declr), $4, Nothing)] }}+ ; withNodeInfo $1 $+ CDecl declspecs [(Just (reverseDeclr declr), $4, Nothing)] }} | type_qualifier_list identifier_declarator asm_attrs_opt {-{}-} initializer_opt {% let declspecs = liftTypeQuals $1 in@@ -708,7 +747,7 @@ CDecl declspecs dies at -> do declr <- withAsmNameAttrs (fst $5, snd $5 ++ $3) $4 doDeclIdent declspecs declr- return (CDecl declspecs ((Just (reverseDeclr declr), $6, Nothing) : dies) at) }+ withLength at $ CDecl declspecs ((Just (reverseDeclr declr), $6, Nothing) : dies) } -- assembler, followed by attribute annotation asm_attrs_opt :: { (Maybe CStrLit, [CAttr]) }@@ -754,48 +793,59 @@ -- declaration_specifier :: { [CDeclSpec] } declaration_specifier- : basic_declaration_specifier { reverse $1 } -- Arithmetic or void- | sue_declaration_specifier { reverse $1 } -- Struct/Union/Enum- | typedef_declaration_specifier { reverse $1 } -- Typedef+ : basic_declaration_specifier { RList.reverse $1 } -- Arithmetic or void+ | sue_declaration_specifier { RList.reverse $1 } -- Struct/Union/Enum+ | typedef_declaration_specifier { RList.reverse $1 } -- Typedef --- A mixture of type qualifiers (const, volatile, restrict, inline) and storage class specifiers--- (extern, static, auto, register, __thread), in any order, but containing at least one storage class specifier.+-- A mixture of type qualifiers (const, volatile, restrict, _Atomic, _Nonnull, _Nullable, __read_only, __write_only),+-- function specifiers (inline, _Noreturn),+-- alignment specifiers (_Alignas) and+-- storage class specifiers (extern, static, auto, register, _Thread_local, __kernel, __global, __local),+-- in any order, but containing at least one storage class specifier. ----- declaration_qualifier_list :- <permute> type_qualifier* storage_class++-- declaration_qualifier_list :- <permute> type_qualifier* alignment_specifier* function_specifier* storage_class+ -- -- GNU extensions -- * arbitrary interleaved __attribute__ annotations -- declaration_qualifier_list :: { Reversed [CDeclSpec] } declaration_qualifier_list- : storage_class- { singleton (CStorageSpec $1) }+ : declaration_qualifier_without_types+ { RList.singleton $1 } - | attrs storage_class- { reverseList (liftCAttrs $1) `snoc` (CStorageSpec $2) }+ | attrs declaration_qualifier_without_types+ { reverseList (liftCAttrs $1) `RList.snoc` $2 } - | type_qualifier_list storage_class- { rmap CTypeQual $1 `snoc` CStorageSpec $2 }+ | type_qualifier_list declaration_qualifier_without_types+ { RList.rmap CTypeQual $1 `RList.snoc` $2 } - | type_qualifier_list attrs storage_class- { (rmap CTypeQual $1 `rappend` liftCAttrs $2) `snoc` CStorageSpec $3 }+ | type_qualifier_list attrs declaration_qualifier_without_types+ { (RList.rmap CTypeQual $1 `RList.rappend` liftCAttrs $2) `RList.snoc` $3 } | declaration_qualifier_list declaration_qualifier- { $1 `snoc` $2 }+ { $1 `RList.snoc` $2 } | declaration_qualifier_list attr { addTrailingAttrs $1 $2 } ----- declaration_qualifier :- storage_class | type_qualifier+-- declaration_qualifier :- storage_class | type_qualifier | function_specifier | alignment_specifier -- declaration_qualifier :: { CDeclSpec } declaration_qualifier- : storage_class { CStorageSpec $1 }- | type_qualifier { CTypeQual $1 } -- const or volatile+ : storage_class { CStorageSpec $1 }+ | type_qualifier { CTypeQual $1 }+ | function_specifier { CFunSpec $1 }+ | alignment_specifier { CAlignSpec $1 } +declaration_qualifier_without_types :: { CDeclSpec }+ : storage_class { CStorageSpec $1 }+ | function_specifier { CFunSpec $1 }+ | alignment_specifier { CAlignSpec $1 }++ -- parse C storage class specifier (C99 6.7.1) -- -- * GNU extensions: '__thread' thread local storage@@ -808,20 +858,37 @@ | auto {% withNodeInfo $1 $ CAuto } | register {% withNodeInfo $1 $ CRegister } | "__thread" {% withNodeInfo $1 $ CThread }+ | "__kernel" {% withNodeInfo $1 $ CClKernel }+ | "__global" {% withNodeInfo $1 $ CClGlobal }+ | "__local" {% withNodeInfo $1 $ CClLocal } +-- parse C function specifier (C11 6.7.4)+function_specifier :: { CFunSpec }+function_specifier+ : inline {% withNodeInfo $1 $ CInlineQual }+ | "_Noreturn" {% withNodeInfo $1 $ CNoreturnQual } +-- parse C alignment specifier (C11 6.7.5)+alignment_specifier :: { CAlignSpec }+alignment_specifier+ : alignas '(' type_name ')' {% withNodeInfo $1 $ CAlignAsType $3 }+ | alignas '(' constant_expression ')' {% withNodeInfo $1 $ CAlignAsExpr $3 }+ -- parse C type specifier (C99 6.7.2) -- -- This recignises a whole list of type specifiers rather than just one -- as in the C99 grammar. ----- type_specifier :- <permute> type_qualifier* (basic_type_name+ | elaborated_type_name | tyident)+-- type_specifier :- <permute> type_qualifier* (basic_type_name+ | elaborated_type_name | g) --+-- Type specifier _Atomic(type) is not yet supported because of conflicts with type qualifier _Atomic type_specifier :: { [CDeclSpec] } type_specifier- : basic_type_specifier { reverse $1 } -- Arithmetic or void- | sue_type_specifier { reverse $1 } -- Struct/Union/Enum- | typedef_type_specifier { reverse $1 } -- Typedef+ : basic_type_specifier { RList.reverse $1 } -- Arithmetic or void+ | sue_type_specifier { RList.reverse $1 } -- Struct/Union/Enum+ | typedef_type_specifier { RList.reverse $1 } -- Typedef+-- | "_Atomic" '(' type_name ')' -- _Atomic(type)+-- {% withNodeInfo $1 $ \at -> [CTypeSpec (CAtomicType $3 at)] } basic_type_name :: { CTypeSpec } basic_type_name@@ -836,8 +903,24 @@ | unsigned {% withNodeInfo $1 $ CUnsigType } | "_Bool" {% withNodeInfo $1 $ CBoolType } | "_Complex" {% withNodeInfo $1 $ CComplexType }+ | "__int128" {% withNodeInfo $1 $ CInt128Type }+ | "__int128_t" {% withNodeInfo $1 $ CInt128Type }+ | "__uint128" {% withNodeInfo $1 $ CUInt128Type }+ | "__uint128_t" {% withNodeInfo $1 $ CUInt128Type }+ | "__bf16" {% withNodeInfo $1 $ CBFloat16Type }+ | "__fp16" {% withNodeInfo $1 $ (CFloatNType 16 False) }+ | "_Float16" {% withNodeInfo $1 $ (CFloatNType 16 False) }+ | "_Float16x" {% withNodeInfo $1 $ (CFloatNType 16 True) }+ | "_Float32" {% withNodeInfo $1 $ (CFloatNType 32 False) }+ | "_Float32x" {% withNodeInfo $1 $ (CFloatNType 32 True) }+ | "_Float64" {% withNodeInfo $1 $ (CFloatNType 64 False) }+ | "_Float64x" {% withNodeInfo $1 $ (CFloatNType 64 True) }+ | "_Float128" {% withNodeInfo $1 $ (CFloatNType 128 False) }+ | "_Float128x" {% withNodeInfo $1 $ (CFloatNType 128 True) }+ | "__float128" {% withNodeInfo $1 $ (CFloatNType 128 False) } + -- A mixture of type qualifiers, storage class and basic type names in any -- order, but containing at least one basic type name and at least one storage -- class specifier.@@ -850,16 +933,16 @@ basic_declaration_specifier :: { Reversed [CDeclSpec] } basic_declaration_specifier : declaration_qualifier_list basic_type_name- { $1 `snoc` CTypeSpec $2 }+ { $1 `RList.snoc` CTypeSpec $2 } | basic_type_specifier storage_class- { $1 `snoc` CStorageSpec $2 }+ { $1 `RList.snoc` CStorageSpec $2 } | basic_declaration_specifier declaration_qualifier- { $1 `snoc` $2 }+ { $1 `RList.snoc` $2 } | basic_declaration_specifier basic_type_name- { $1 `snoc` CTypeSpec $2 }+ { $1 `RList.snoc` CTypeSpec $2 } | basic_declaration_specifier attr { addTrailingAttrs $1 $2 }@@ -877,22 +960,22 @@ basic_type_specifier -- Arithmetic or void : basic_type_name- { singleton (CTypeSpec $1) }+ { RList.singleton (CTypeSpec $1) } | attrs basic_type_name- { (reverseList $ liftCAttrs $1) `snoc` (CTypeSpec $2) }+ { (reverseList $ liftCAttrs $1) `RList.snoc` (CTypeSpec $2) } | type_qualifier_list basic_type_name- { rmap CTypeQual $1 `snoc` CTypeSpec $2 }+ { RList.rmap CTypeQual $1 `RList.snoc` CTypeSpec $2 } | type_qualifier_list attrs basic_type_name- { rmap CTypeQual $1 `rappend` (liftCAttrs $2) `snoc` CTypeSpec $3 }+ { RList.rmap CTypeQual $1 `RList.rappend` (liftCAttrs $2) `RList.snoc` CTypeSpec $3 } | basic_type_specifier type_qualifier- { $1 `snoc` CTypeQual $2 }+ { $1 `RList.snoc` CTypeQual $2 } | basic_type_specifier basic_type_name- { $1 `snoc` CTypeSpec $2 }+ { $1 `RList.snoc` CTypeSpec $2 } | basic_type_specifier attr { addTrailingAttrs $1 $2 }@@ -907,14 +990,14 @@ sue_declaration_specifier :: { Reversed [CDeclSpec] } sue_declaration_specifier : declaration_qualifier_list elaborated_type_name- { $1 `snoc` CTypeSpec $2 }+ { $1 `RList.snoc` CTypeSpec $2 } | sue_type_specifier storage_class- { $1 `snoc` CStorageSpec $2 }+ { $1 `RList.snoc` CStorageSpec $2 } | sue_declaration_specifier declaration_qualifier- { $1 `snoc` $2 }- + { $1 `RList.snoc` $2 }+ | sue_declaration_specifier attr { addTrailingAttrs $1 $2 } @@ -931,20 +1014,20 @@ sue_type_specifier -- struct/union/enum : elaborated_type_name- { singleton (CTypeSpec $1) }+ { RList.singleton (CTypeSpec $1) } | attrs elaborated_type_name- { (reverseList $ liftCAttrs $1) `snoc` (CTypeSpec $2) }+ { (reverseList $ liftCAttrs $1) `RList.snoc` (CTypeSpec $2) } | type_qualifier_list elaborated_type_name- { rmap CTypeQual $1 `snoc` CTypeSpec $2 }+ { RList.rmap CTypeQual $1 `RList.snoc` CTypeSpec $2 } | type_qualifier_list attrs elaborated_type_name- { rmap CTypeQual $1 `rappend` (liftCAttrs $2) `snoc` CTypeSpec $3 }+ { RList.rmap CTypeQual $1 `RList.rappend` (liftCAttrs $2) `RList.snoc` CTypeSpec $3 } | sue_type_specifier type_qualifier- { $1 `snoc` CTypeQual $2 }- + { $1 `RList.snoc` CTypeQual $2 }+ | sue_type_specifier attr { addTrailingAttrs $1 $2 } @@ -960,19 +1043,19 @@ typedef_declaration_specifier :: { Reversed [CDeclSpec] } typedef_declaration_specifier : typedef_type_specifier storage_class- { $1 `snoc` CStorageSpec $2 }- + { $1 `RList.snoc` CStorageSpec $2 }+ | declaration_qualifier_list tyident- {% withNodeInfo $1 $ \at -> $1 `snoc` CTypeSpec (CTypeDef $2 at) }+ {% withNodeInfo $2 $ \at -> $1 `RList.snoc` CTypeSpec (CTypeDef $2 at) } | declaration_qualifier_list typeof '(' expression ')'- {% withNodeInfo $1 $ \at -> $1 `snoc` CTypeSpec (CTypeOfExpr $4 at) }+ {% withNodeInfo $2 $ \at -> $1 `RList.snoc` CTypeSpec (CTypeOfExpr $4 at) } | declaration_qualifier_list typeof '(' type_name ')'- {% withNodeInfo $1 $ \at -> $1 `snoc` CTypeSpec (CTypeOfType $4 at) }+ {% withNodeInfo $2 $ \at -> $1 `RList.snoc` CTypeSpec (CTypeOfType $4 at) } | typedef_declaration_specifier declaration_qualifier- { $1 `snoc` $2 }+ { $1 `RList.snoc` $2 } | typedef_declaration_specifier attr { addTrailingAttrs $1 $2 }@@ -986,44 +1069,44 @@ typedef_type_specifier :: { Reversed [CDeclSpec] } typedef_type_specifier : tyident- {% withNodeInfo $1 $ \at -> singleton (CTypeSpec (CTypeDef $1 at)) }+ {% withNodeInfo $1 $ \at -> RList.singleton (CTypeSpec (CTypeDef $1 at)) } | typeof '(' expression ')'- {% withNodeInfo $1 $ \at -> singleton (CTypeSpec (CTypeOfExpr $3 at)) }+ {% withNodeInfo $1 $ \at -> RList.singleton (CTypeSpec (CTypeOfExpr $3 at)) } | typeof '(' type_name ')'- {% withNodeInfo $1 $ \at -> singleton (CTypeSpec (CTypeOfType $3 at)) }+ {% withNodeInfo $1 $ \at -> RList.singleton (CTypeSpec (CTypeOfType $3 at)) } | type_qualifier_list tyident- {% withNodeInfo $2 $ \at -> rmap CTypeQual $1 `snoc` CTypeSpec (CTypeDef $2 at) }+ {% withNodeInfo $2 $ \at -> RList.rmap CTypeQual $1 `RList.snoc` CTypeSpec (CTypeDef $2 at) } | type_qualifier_list typeof '(' expression ')'- {% withNodeInfo $2 $ \at -> rmap CTypeQual $1 `snoc` CTypeSpec (CTypeOfExpr $4 at) }+ {% withNodeInfo $2 $ \at -> RList.rmap CTypeQual $1 `RList.snoc` CTypeSpec (CTypeOfExpr $4 at) } | type_qualifier_list typeof '(' type_name ')'- {% withNodeInfo $2 $ \at -> rmap CTypeQual $1 `snoc` CTypeSpec (CTypeOfType $4 at) }+ {% withNodeInfo $2 $ \at -> RList.rmap CTypeQual $1 `RList.snoc` CTypeSpec (CTypeOfType $4 at) } -- repeat with attrs (this could be easier if type qualifier list wouldn't allow leading attributes) | attrs tyident- {% withNodeInfo $2 $ \at -> reverseList (liftCAttrs $1) `snoc` (CTypeSpec (CTypeDef $2 at)) }+ {% withNodeInfo $2 $ \at -> reverseList (liftCAttrs $1) `RList.snoc` (CTypeSpec (CTypeDef $2 at)) } | attrs typeof '(' expression ')'- {% withNodeInfo $2 $ \at -> reverseList (liftCAttrs $1) `snoc` (CTypeSpec (CTypeOfExpr $4 at)) }+ {% withNodeInfo $1 $ \at -> reverseList (liftCAttrs $1) `RList.snoc` (CTypeSpec (CTypeOfExpr $4 at)) } | attrs typeof '(' type_name ')'- {% withNodeInfo $2 $ \at -> reverseList (liftCAttrs $1) `snoc` (CTypeSpec (CTypeOfType $4 at)) }+ {% withNodeInfo $2 $ \at -> reverseList (liftCAttrs $1) `RList.snoc` (CTypeSpec (CTypeOfType $4 at)) } | type_qualifier_list attrs tyident- {% withNodeInfo $2 $ \at -> rmap CTypeQual $1 `rappend` (liftCAttrs $2) `snoc` CTypeSpec (CTypeDef $3 at) }+ {% withNodeInfo $3 $ \at -> RList.rmap CTypeQual $1 `RList.rappend` (liftCAttrs $2) `RList.snoc` CTypeSpec (CTypeDef $3 at) } | type_qualifier_list attrs typeof '(' expression ')'- {% withNodeInfo $2 $ \at -> rmap CTypeQual $1 `rappend` (liftCAttrs $2) `snoc` CTypeSpec (CTypeOfExpr $5 at) }+ {% withNodeInfo $3 $ \at -> RList.rmap CTypeQual $1 `RList.rappend` (liftCAttrs $2) `RList.snoc` CTypeSpec (CTypeOfExpr $5 at) } | type_qualifier_list attrs typeof '(' type_name ')'- {% withNodeInfo $2 $ \at -> rmap CTypeQual $1 `rappend` (liftCAttrs $2) `snoc` CTypeSpec (CTypeOfType $5 at) }+ {% withNodeInfo $3 $ \at -> RList.rmap CTypeQual $1 `RList.rappend` (liftCAttrs $2) `RList.snoc` CTypeSpec (CTypeOfType $5 at) } | typedef_type_specifier type_qualifier- { $1 `snoc` CTypeQual $2 }+ { $1 `RList.snoc` CTypeQual $2 } | typedef_type_specifier attr { addTrailingAttrs $1 $2 }@@ -1048,11 +1131,9 @@ struct_or_union_specifier :: { CStructUnion } struct_or_union_specifier : struct_or_union attrs_opt identifier '{' struct_declaration_list '}'- {% withNodeInfo $1 $ CStruct (unL $1) (Just $3) (Just$ reverse $5) $2 }-+ {% withNodeInfo $1 $ CStruct (unL $1) (Just $3) (Just$ RList.reverse $5) $2 } | struct_or_union attrs_opt '{' struct_declaration_list '}'- {% withNodeInfo $1 $ CStruct (unL $1) Nothing (Just$ reverse $4) $2 }-+ {% withNodeInfo $1 $ CStruct (unL $1) Nothing (Just$ RList.reverse $4) $2 } | struct_or_union attrs_opt identifier {% withNodeInfo $1 $ CStruct (unL $1) (Just $3) Nothing $2 } @@ -1065,9 +1146,10 @@ struct_declaration_list :: { Reversed [CDecl] } struct_declaration_list- : {- empty -} { empty }+ : {- empty -} { RList.empty } | struct_declaration_list ';' { $1 }- | struct_declaration_list struct_declaration { $1 `snoc` $2 }+ | struct_declaration_list struct_declaration { $1 `RList.snoc` maybe $2 (addAlign $2) (containsAlign $1) }+ | struct_declaration_list alignment_specifier struct_declaration { $1 `RList.snoc` ( addAlign $3 $2 )} -- parse C structure declaration (C99 6.7.2.1)@@ -1159,48 +1241,56 @@ enum_specifier :: { CEnum } enum_specifier : enum attrs_opt '{' enumerator_list '}'- {% withNodeInfo $1 $ CEnum Nothing (Just$ reverse $4) $2 }+ {% withNodeInfo $1 $ CEnum Nothing (Just$ RList.reverse $4) $2 } | enum attrs_opt '{' enumerator_list ',' '}'- {% withNodeInfo $1 $ CEnum Nothing (Just$ reverse $4) $2 }+ {% withNodeInfo $1 $ CEnum Nothing (Just$ RList.reverse $4) $2 } | enum attrs_opt identifier '{' enumerator_list '}'- {% withNodeInfo $1 $ CEnum (Just $3) (Just$ reverse $5) $2 }+ {% withNodeInfo $1 $ CEnum (Just $3) (Just$ RList.reverse $5) $2 } | enum attrs_opt identifier '{' enumerator_list ',' '}'- {% withNodeInfo $1 $ CEnum (Just $3) (Just$ reverse $5) $2 }+ {% withNodeInfo $1 $ CEnum (Just $3) (Just$ RList.reverse $5) $2 } | enum attrs_opt identifier {% withNodeInfo $1 $ CEnum (Just $3) Nothing $2 } enumerator_list :: { Reversed [(Ident, Maybe CExpr)] } enumerator_list- : enumerator { singleton $1 }- | enumerator_list ',' enumerator { $1 `snoc` $3 }+ : enumerator { RList.singleton $1 }+ | enumerator_list ',' enumerator { $1 `RList.snoc` $3 } enumerator :: { (Ident, Maybe CExpr) } enumerator- : identifier { ($1, Nothing) }- | identifier '=' constant_expression { ($1, Just $3) }+ : identifier { ($1, Nothing) }+ | identifier attrs { ($1, Nothing) }+ | identifier attrs '=' constant_expression { ($1, Just $4) }+ | identifier '=' constant_expression { ($1, Just $3) } --- parse C type qualifier (C99 6.7.3)+-- parse C type qualifier (C11 6.7.3) --+-- concerning atomic, note: If the _Atomic keyword is immediately followed by a left+-- parenthesis, it should be interpreted as a type specifier (with a type name), not as a type qualifier type_qualifier :: { CTypeQual } type_qualifier : const {% withNodeInfo $1 $ CConstQual } | volatile {% withNodeInfo $1 $ CVolatQual } | restrict {% withNodeInfo $1 $ CRestrQual }- | inline {% withNodeInfo $1 $ CInlineQual }+ | "_Nullable" {% withNodeInfo $1 $ CNullableQual }+ | "_Nonnull" {% withNodeInfo $1 $ CNonnullQual }+ | "_Atomic" {% withNodeInfo $1 $ CAtomicQual }+ | "__read_only" {% withNodeInfo $1 $ CClRdOnlyQual }+ | "__write_only" {% withNodeInfo $1 $ CClWrOnlyQual } --- a list containing at least one type_qualifier (const, volatile, restrict, inline)+-- a list containing at least one type_qualifier (const, volatile, restrict, inline, _Noreturn, __read_only, __write_only) -- and additionally CAttrs type_qualifier_list :: { Reversed [CTypeQual] } type_qualifier_list- : attrs_opt type_qualifier { reverseList (map CAttrQual $1) `snoc` $2 }- | type_qualifier_list type_qualifier { $1 `snoc` $2 }- | type_qualifier_list attrs type_qualifier { ($1 `rappend` map CAttrQual $2) `snoc` $3} + : attrs_opt type_qualifier { reverseList (map CAttrQual $1) `RList.snoc` $2 }+ | type_qualifier_list type_qualifier { $1 `RList.snoc` $2 }+ | type_qualifier_list attrs type_qualifier { ($1 `RList.rappend` map CAttrQual $2) `RList.snoc` $3} -- parse C declarator (C99 6.7.5) --@@ -1264,10 +1354,10 @@ {% withAttribute $1 $2 $ ptrDeclr $3 [] } | '*' type_qualifier_list parameter_typedef_declarator- {% withNodeInfo $1 $ ptrDeclr $3 (reverse $2) }+ {% withNodeInfo $1 $ ptrDeclr $3 (RList.reverse $2) } | '*' type_qualifier_list attrs parameter_typedef_declarator- {% withAttribute $1 $3 $ ptrDeclr $4 (reverse $2) }+ {% withAttribute $1 $3 $ ptrDeclr $4 (RList.reverse $2) } -- clean_postfix_typedef_declarator :- ( attrs? clean_typedef_declarator ) declarator_postfix? --@@ -1292,17 +1382,17 @@ {% withNodeInfo $1 $ ptrDeclr $3 [] } | '*' type_qualifier_list '(' simple_paren_typedef_declarator ')'- {% withNodeInfo $1 $ ptrDeclr $4 (reverse $2) }+ {% withNodeInfo $1 $ ptrDeclr $4 (RList.reverse $2) } | '*' type_qualifier_list attrs '(' simple_paren_typedef_declarator ')'- {% withAttribute $1 $3 $ ptrDeclr $5 (reverse $2) }+ {% withAttribute $1 $3 $ ptrDeclr $5 (RList.reverse $2) } | '*' paren_typedef_declarator {% withNodeInfo $1 $ ptrDeclr $2 [] } | '*' type_qualifier_list paren_typedef_declarator- {% withNodeInfo $1 $ ptrDeclr $3 (reverse $2) }+ {% withNodeInfo $1 $ ptrDeclr $3 (RList.reverse $2) } | '*' type_qualifier_list attrs paren_typedef_declarator- {% withAttribute $1 $3 $ ptrDeclr $4 (reverse $2) }+ {% withAttribute $1 $3 $ ptrDeclr $4 (RList.reverse $2) } -- redundant paren to left of tname paren_postfix_typedef_declarator :: { CDeclrR }@@ -1352,10 +1442,10 @@ {% withAttribute $1 $2 $ ptrDeclr $3 [] } | '*' type_qualifier_list identifier_declarator- {% withNodeInfo $1 $ ptrDeclr $3 (reverse $2) }+ {% withNodeInfo $1 $ ptrDeclr $3 (RList.reverse $2) } | '*' type_qualifier_list attrs identifier_declarator- {% withAttribute $1 $3 $ ptrDeclr $4 (reverse $2) }+ {% withAttribute $1 $3 $ ptrDeclr $4 (RList.reverse $2) } postfix_identifier_declarator :: { CDeclrR } postfix_identifier_declarator@@ -1401,12 +1491,12 @@ {% withNodeInfo $1 $ ptrDeclr $2 [] } -- FIXME: no attr possible here ??? | '*' type_qualifier_list old_function_declarator- {% withNodeInfo $1 $ ptrDeclr $3 (reverse $2) }+ {% withNodeInfo $1 $ ptrDeclr $3 (RList.reverse $2) } postfix_old_function_declarator :: { CDeclrR } postfix_old_function_declarator : paren_identifier_declarator '(' identifier_list ')'- {% withNodeInfo $2 $ funDeclr $1 (Left $ reverse $3) [] }+ {% withNodeInfo $1 $ funDeclr $1 (Left $ RList.reverse $3) [] } | '(' old_function_declarator ')' { $2 }@@ -1420,13 +1510,13 @@ parameter_type_list :: { ([CDecl], Bool) } parameter_type_list : {- empty -} { ([], False)}- | parameter_list { (reverse $1, False) }- | parameter_list ',' "..." { (reverse $1, True) }+ | parameter_list { (RList.reverse $1, False) }+ | parameter_list ',' "..." { (RList.reverse $1, True) } parameter_list :: { Reversed [CDecl] } parameter_list- : parameter_declaration { singleton $1 }- | parameter_list ',' parameter_declaration { $1 `snoc` $3 }+ : parameter_declaration { RList.singleton $1 }+ | parameter_list ',' parameter_declaration { $1 `RList.snoc` $3 } parameter_declaration :: { CDecl } parameter_declaration@@ -1443,13 +1533,13 @@ {% withNodeInfo $1 $ CDecl $1 [(Just (reverseDeclr $! appendDeclrAttrs $3 $2), Nothing, Nothing)] } | declaration_qualifier_list- {% withNodeInfo $1 $ CDecl (reverse $1) [] }+ {% withNodeInfo $1 $ CDecl (RList.reverse $1) [] } | declaration_qualifier_list abstract_declarator- {% withNodeInfo $1 $ CDecl (reverse $1) [(Just (reverseDeclr $2), Nothing, Nothing)] }+ {% withNodeInfo $1 $ CDecl (RList.reverse $1) [(Just (reverseDeclr $2), Nothing, Nothing)] } | declaration_qualifier_list identifier_declarator attrs_opt- {% withNodeInfo $1 $ CDecl (reverse $1) [(Just (reverseDeclr $! appendDeclrAttrs $3 $2), Nothing, Nothing)] }+ {% withNodeInfo $1 $ CDecl (RList.reverse $1) [(Just (reverseDeclr $! appendDeclrAttrs $3 $2), Nothing, Nothing)] } | type_specifier {% withNodeInfo $1 $ CDecl $1 [] }@@ -1477,8 +1567,8 @@ identifier_list :: { Reversed [Ident] } identifier_list- : ident { singleton $1 }- | identifier_list ',' ident { $1 `snoc` $3 }+ : ident { RList.singleton $1 }+ | identifier_list ',' ident { $1 `RList.snoc` $3 } -- parse C type name (C99 6.7.6)@@ -1547,19 +1637,19 @@ {% withAttributePF $1 $2 $ \at declr -> arrDeclr declr [] False False $3 at } | '[' type_qualifier_list assignment_expression_opt ']'- {% withNodeInfo $1 $ \at declr -> arrDeclr declr (reverse $2) False False $3 at }+ {% withNodeInfo $1 $ \at declr -> arrDeclr declr (RList.reverse $2) False False $3 at } | '[' type_qualifier_list attrs assignment_expression_opt ']'- {% withAttributePF $1 $3 $ \at declr -> arrDeclr declr (reverse $2) False False $4 at }+ {% withAttributePF $1 $3 $ \at declr -> arrDeclr declr (RList.reverse $2) False False $4 at } | '[' static attrs_opt assignment_expression ']' {% withAttributePF $1 $3 $ \at declr -> arrDeclr declr [] False True (Just $4) at } | '[' static type_qualifier_list attrs_opt assignment_expression ']'- {% withAttributePF $1 $4 $ \at declr -> arrDeclr declr (reverse $3) False True (Just $5) at }+ {% withAttributePF $1 $4 $ \at declr -> arrDeclr declr (RList.reverse $3) False True (Just $5) at } | '[' type_qualifier_list attrs_opt static attrs_opt assignment_expression ']'- {% withAttributePF $1 ($3 ++ $5) $ \at declr -> arrDeclr declr (reverse $2) False True (Just $6) at }+ {% withAttributePF $1 ($3 ++ $5) $ \at declr -> arrDeclr declr (RList.reverse $2) False True (Just $6) at } | '[' '*' attrs_opt ']' {% withAttributePF $1 $3 $ \at declr -> arrDeclr declr [] True False Nothing at }@@ -1567,9 +1657,9 @@ {% withAttributePF $1 ($2 ++ $4) $ \at declr -> arrDeclr declr [] True False Nothing at } | '[' type_qualifier_list '*' attrs_opt ']'- {% withAttributePF $1 $4 $ \at declr -> arrDeclr declr (reverse $2) True False Nothing at }+ {% withAttributePF $1 $4 $ \at declr -> arrDeclr declr (RList.reverse $2) True False Nothing at } | '[' type_qualifier_list attrs '*' attrs_opt ']'- {% withAttributePF $1 ($3 ++ $5) $ \at declr -> arrDeclr declr (reverse $2) True False Nothing at }+ {% withAttributePF $1 ($3 ++ $5) $ \at declr -> arrDeclr declr (RList.reverse $2) True False Nothing at } unary_abstract_declarator :: { CDeclrR } unary_abstract_declarator@@ -1577,13 +1667,13 @@ {% withNodeInfo $1 $ ptrDeclr emptyDeclr [] } | '*' type_qualifier_list attrs_opt- {% withAttribute $1 $3 $ ptrDeclr emptyDeclr (reverse $2) }+ {% withAttribute $1 $3 $ ptrDeclr emptyDeclr (RList.reverse $2) } | '*' abstract_declarator {% withNodeInfo $1 $ ptrDeclr $2 [] } | '*' type_qualifier_list abstract_declarator- {% withNodeInfo $1 $ ptrDeclr $3 (reverse $2) }+ {% withNodeInfo $1 $ ptrDeclr $3 (RList.reverse $2) } | '*' attrs {% withAttribute $1 $2 $ ptrDeclr emptyDeclr [] }@@ -1611,8 +1701,8 @@ initializer :: { CInit } initializer : assignment_expression {% withNodeInfo $1 $ CInitExpr $1 }- | '{' initializer_list '}' {% withNodeInfo $1 $ CInitList (reverse $2) }- | '{' initializer_list ',' '}' {% withNodeInfo $1 $ CInitList (reverse $2) }+ | '{' initializer_list '}' {% withNodeInfo $1 $ CInitList (RList.reverse $2) }+ | '{' initializer_list ',' '}' {% withNodeInfo $1 $ CInitList (RList.reverse $2) } initializer_opt :: { Maybe CInit }@@ -1623,11 +1713,11 @@ initializer_list :: { Reversed CInitList } initializer_list- : {- empty -} { empty }- | initializer { singleton ([],$1) }- | designation initializer { singleton ($1,$2) }- | initializer_list ',' initializer { $1 `snoc` ([],$3) }- | initializer_list ',' designation initializer { $1 `snoc` ($3,$4) }+ : {- empty -} { RList.empty }+ | initializer { RList.singleton ([],$1) }+ | designation initializer { RList.singleton ($1,$2) }+ | initializer_list ',' initializer { $1 `RList.snoc` ([],$3) }+ | initializer_list ',' designation initializer { $1 `RList.snoc` ($3,$4) } -- designation@@ -1638,15 +1728,15 @@ -- designation :: { [CDesignator] } designation- : designator_list '=' { reverse $1 }+ : designator_list '=' { RList.reverse $1 } | identifier ':' {% withNodeInfo $1 $ \at -> [CMemberDesig $1 at] } | array_designator { [$1] } designator_list :: { Reversed [CDesignator] } designator_list- : designator { singleton $1 }- | designator_list designator { $1 `snoc` $2 }+ : designator { RList.singleton $1 }+ | designator_list designator { $1 `RList.snoc` $2 } designator :: { CDesignator }@@ -1662,10 +1752,11 @@ {% withNodeInfo $1 $ CRangeDesig $2 $4 } --- parse C primary expression (C99 6.5.1)+-- parse C primary expression (C11 6.5.1) -- -- We cannot use a typedef name as a variable --+-- * C11: generic selection -- * GNU extensions: -- allow a compound statement as an expression -- __builtin_va_arg@@ -1673,11 +1764,12 @@ -- __builtin_types_compatible_p primary_expression :: { CExpr } primary_expression- : ident {% withNodeInfo $1 $ CVar $1 }+ : ident {% withNodeInfo $1 $ CVar $1 } | constant { CConst $1 }- | string_literal { CConst (liftStrLit $1) }- | '(' expression ')' { $2 }-+ | string_literal { CConst (liftStrLit $1) }+ | '(' expression ')' { $2 }+ | "_Generic" '(' assignment_expression ',' generic_assoc_list ')'+ {% withNodeInfo $1 $ CGenericSelection $3 (RList.reverse $5) } -- GNU extensions | '(' compound_statement ')' {% withNodeInfo $1 $ CStatExpr $2 }@@ -1686,17 +1778,33 @@ {% withNodeInfo $1 $ CBuiltinExpr . CBuiltinVaArg $3 $5 } | "__builtin_offsetof" '(' type_name ',' offsetof_member_designator ')'- {% withNodeInfo $1 $ CBuiltinExpr . CBuiltinOffsetOf $3 (reverse $5) }+ {% withNodeInfo $1 $ CBuiltinExpr . CBuiltinOffsetOf $3 (RList.reverse $5) } | "__builtin_types_compatible_p" '(' type_name ',' type_name ')' {% withNodeInfo $1 $ CBuiltinExpr . CBuiltinTypesCompatible $3 $5 } + | "__builtin_convertvector" '(' assignment_expression ',' type_name ')'+ {% withNodeInfo $1 $ CBuiltinExpr . CBuiltinConvertVector $3 $5 } + | "__builtin_bit_cast" '(' type_name ',' assignment_expression ')'+ {% withNodeInfo $1 $ CBuiltinExpr . CBuiltinBitCast $3 $5 }++-- Generic Selection association list (C11 6.5.1.1)+--+-- TODO: introduce AST type for generic association+generic_assoc_list :: { Reversed [(Maybe CDecl, CExpr)] }+ : generic_assoc_list ',' generic_assoc { $1 `RList.snoc` $3 }+ | generic_assoc { RList.singleton $1 }+generic_assoc :: { (Maybe CDecl, CExpr) }+generic_assoc+ : type_name ':' assignment_expression { (Just $1, $3) }+ | default ':' assignment_expression { (Nothing, $3) }+ offsetof_member_designator :: { Reversed [CDesignator] } offsetof_member_designator- : identifier {% withNodeInfo $1 $ singleton . CMemberDesig $1 }- | offsetof_member_designator '.' identifier {% withNodeInfo $3 $ ($1 `snoc`) . CMemberDesig $3 }- | offsetof_member_designator '[' expression ']' {% withNodeInfo $3 $ ($1 `snoc`) . CArrDesig $3 }+ : identifier {% withNodeInfo $1 $ RList.singleton . CMemberDesig $1 }+ | offsetof_member_designator '.' identifier {% withNodeInfo $3 $ ($1 `RList.snoc`) . CMemberDesig $3 }+ | offsetof_member_designator '[' expression ']' {% withNodeInfo $3 $ ($1 `RList.snoc`) . CArrDesig $3 } -- parse C postfix expression (C99 6.5.2)@@ -1707,37 +1815,37 @@ { $1 } | postfix_expression '[' expression ']'- {% withNodeInfo $2 $ CIndex $1 $3 }+ {% withNodeInfo $1 $ CIndex $1 $3 } | postfix_expression '(' ')'- {% withNodeInfo $2 $ CCall $1 [] }+ {% withNodeInfo $1 $ CCall $1 [] } | postfix_expression '(' argument_expression_list ')'- {% withNodeInfo $2 $ CCall $1 (reverse $3) }+ {% withNodeInfo $1 $ CCall $1 (RList.reverse $3) } | postfix_expression '.' identifier- {% withNodeInfo $2 $ CMember $1 $3 False }+ {% withNodeInfo $1 $ CMember $1 $3 False } | postfix_expression "->" identifier- {% withNodeInfo $2 $ CMember $1 $3 True }+ {% withNodeInfo $1 $ CMember $1 $3 True } | postfix_expression "++"- {% withNodeInfo $2 $ CUnary CPostIncOp $1 }+ {% withNodeInfo $1 $ CUnary CPostIncOp $1 } | postfix_expression "--"- {% withNodeInfo $2 $ CUnary CPostDecOp $1 }+ {% withNodeInfo $1 $ CUnary CPostDecOp $1 } | '(' type_name ')' '{' initializer_list '}'- {% withNodeInfo $4 $ CCompoundLit $2 (reverse $5) }+ {% withNodeInfo $1 $ CCompoundLit $2 (RList.reverse $5) } | '(' type_name ')' '{' initializer_list ',' '}'- {% withNodeInfo $4 $ CCompoundLit $2 (reverse $5) }+ {% withNodeInfo $1 $ CCompoundLit $2 (RList.reverse $5) } argument_expression_list :: { Reversed [CExpr] } argument_expression_list- : assignment_expression { singleton $1 }- | argument_expression_list ',' assignment_expression { $1 `snoc` $3 }+ : assignment_expression { RList.singleton $1 }+ | argument_expression_list ',' assignment_expression { $1 `RList.snoc` $3 } -- parse C unary expression (C99 6.5.3)@@ -1791,13 +1899,13 @@ { $1 } | multiplicative_expression '*' cast_expression- {% withNodeInfo $2 $ CBinary CMulOp $1 $3 }+ {% withNodeInfo $1 $ CBinary CMulOp $1 $3 } | multiplicative_expression '/' cast_expression- {% withNodeInfo $2 $ CBinary CDivOp $1 $3 }+ {% withNodeInfo $1 $ CBinary CDivOp $1 $3 } | multiplicative_expression '%' cast_expression- {% withNodeInfo $2 $ CBinary CRmdOp $1 $3 }+ {% withNodeInfo $1 $ CBinary CRmdOp $1 $3 } -- parse C additive expression (C99 6.5.6)@@ -1808,10 +1916,10 @@ { $1 } | additive_expression '+' multiplicative_expression- {% withNodeInfo $2 $ CBinary CAddOp $1 $3 }+ {% withNodeInfo $1 $ CBinary CAddOp $1 $3 } | additive_expression '-' multiplicative_expression- {% withNodeInfo $2 $ CBinary CSubOp $1 $3 }+ {% withNodeInfo $1 $ CBinary CSubOp $1 $3 } -- parse C shift expression (C99 6.5.7)@@ -1822,10 +1930,10 @@ { $1 } | shift_expression "<<" additive_expression- {% withNodeInfo $2 $ CBinary CShlOp $1 $3 }+ {% withNodeInfo $1 $ CBinary CShlOp $1 $3 } | shift_expression ">>" additive_expression- {% withNodeInfo $2 $ CBinary CShrOp $1 $3 }+ {% withNodeInfo $1 $ CBinary CShrOp $1 $3 } -- parse C relational expression (C99 6.5.8)@@ -1836,16 +1944,16 @@ { $1 } | relational_expression '<' shift_expression- {% withNodeInfo $2 $ CBinary CLeOp $1 $3 }+ {% withNodeInfo $1 $ CBinary CLeOp $1 $3 } | relational_expression '>' shift_expression- {% withNodeInfo $2 $ CBinary CGrOp $1 $3 }+ {% withNodeInfo $1 $ CBinary CGrOp $1 $3 } | relational_expression "<=" shift_expression- {% withNodeInfo $2 $ CBinary CLeqOp $1 $3 }+ {% withNodeInfo $1 $ CBinary CLeqOp $1 $3 } | relational_expression ">=" shift_expression- {% withNodeInfo $2 $ CBinary CGeqOp $1 $3 }+ {% withNodeInfo $1 $ CBinary CGeqOp $1 $3 } -- parse C equality expression (C99 6.5.9)@@ -1856,10 +1964,10 @@ { $1 } | equality_expression "==" relational_expression- {% withNodeInfo $2 $ CBinary CEqOp $1 $3 }+ {% withNodeInfo $1 $ CBinary CEqOp $1 $3 } | equality_expression "!=" relational_expression- {% withNodeInfo $2 $ CBinary CNeqOp $1 $3 }+ {% withNodeInfo $1 $ CBinary CNeqOp $1 $3 } -- parse C bitwise and expression (C99 6.5.10)@@ -1870,7 +1978,7 @@ { $1 } | and_expression '&' equality_expression- {% withNodeInfo $2 $ CBinary CAndOp $1 $3 }+ {% withNodeInfo $1 $ CBinary CAndOp $1 $3 } -- parse C bitwise exclusive or expression (C99 6.5.11)@@ -1881,7 +1989,7 @@ { $1 } | exclusive_or_expression '^' and_expression- {% withNodeInfo $2 $ CBinary CXorOp $1 $3 }+ {% withNodeInfo $1 $ CBinary CXorOp $1 $3 } -- parse C bitwise or expression (C99 6.5.12)@@ -1892,7 +2000,7 @@ { $1 } | inclusive_or_expression '|' exclusive_or_expression- {% withNodeInfo $2 $ CBinary COrOp $1 $3 }+ {% withNodeInfo $1 $ CBinary COrOp $1 $3 } -- parse C logical and expression (C99 6.5.13)@@ -1903,7 +2011,7 @@ { $1 } | logical_and_expression "&&" inclusive_or_expression- {% withNodeInfo $2 $ CBinary CLndOp $1 $3 }+ {% withNodeInfo $1 $ CBinary CLndOp $1 $3 } -- parse C logical or expression (C99 6.5.14)@@ -1914,7 +2022,7 @@ { $1 } | logical_or_expression "||" logical_and_expression- {% withNodeInfo $2 $ CBinary CLorOp $1 $3 }+ {% withNodeInfo $1 $ CBinary CLorOp $1 $3 } -- parse C conditional expression (C99 6.5.15)@@ -1927,10 +2035,10 @@ { $1 } | logical_or_expression '?' expression ':' conditional_expression- {% withNodeInfo $2 $ CCond $1 (Just $3) $5 }+ {% withNodeInfo $1 $ CCond $1 (Just $3) $5 } | logical_or_expression '?' ':' conditional_expression- {% withNodeInfo $2 $ CCond $1 Nothing $4 }+ {% withNodeInfo $1 $ CCond $1 Nothing $4 } -- parse C assignment expression (C99 6.5.16)@@ -1944,7 +2052,7 @@ { $1 } | unary_expression assignment_operator assignment_expression- {% withNodeInfo $2 $ CAssign (unL $2) $1 $3 }+ {% withNodeInfo $1 $ CAssign (unL $2) $1 $3 } assignment_operator :: { Located CAssignOp }@@ -1970,12 +2078,12 @@ { $1 } | assignment_expression ',' comma_expression- {% let es = reverse $3 in withNodeInfo es $ CComma ($1:es) }+ {% let es = RList.reverse $3 in withNodeInfo es $ CComma ($1:es) } comma_expression :: { Reversed [CExpr] } comma_expression- : assignment_expression { singleton $1 }- | comma_expression ',' assignment_expression { $1 `snoc` $3 }+ : assignment_expression { RList.singleton $1 }+ | comma_expression ',' assignment_expression { $1 `RList.snoc` $3 } -- The following was used for clarity@@ -2005,7 +2113,7 @@ constant : cint {% withNodeInfo $1 $ case $1 of CTokILit _ i -> CIntConst i } | cchar {% withNodeInfo $1 $ case $1 of CTokCLit _ c -> CCharConst c }- | cfloat {% withNodeInfo $1 $ case $1 of CTokFLit _ f -> CFloatConst f }+ | cfloat {% withNodeInfo $1 $ case $1 of CTokFLit _ f -> CFloatConst f } string_literal :: { CStrLit }@@ -2014,14 +2122,16 @@ {% withNodeInfo $1 $ case $1 of CTokSLit _ s -> CStrLit s } | cstr string_literal_list- {% withNodeInfo $1 $ case $1 of CTokSLit _ s -> CStrLit (concatCStrings (s : reverse $2)) }+ {% withNodeInfo $1 $ case $1 of CTokSLit _ s -> CStrLit (concatCStrings (s : RList.reverse $2)) } string_literal_list :: { Reversed [CString] } string_literal_list- : cstr { case $1 of CTokSLit _ s -> singleton s }- | string_literal_list cstr { case $2 of CTokSLit _ s -> $1 `snoc` s }+ : cstr { case $1 of CTokSLit _ s -> RList.singleton s }+ | string_literal_list cstr { case $2 of CTokSLit _ s -> $1 `RList.snoc` s } +clang_version_literal :: { ClangCVersion }+ : clangcversion { $1 } identifier :: { Ident } identifier@@ -2043,11 +2153,11 @@ attr :: { [CAttr] } attr- : "__attribute__" '(' '(' attribute_list ')' ')' { reverse $4 }+ : "__attribute__" '(' '(' attribute_list ')' ')' { RList.reverse $4 } attribute_list :: { Reversed [CAttr] }- : attribute { case $1 of Nothing -> empty; Just attr -> singleton attr }- | attribute_list ',' attribute { (maybe id (flip snoc) $3) $1 }+ : attribute { case $1 of Nothing -> RList.empty; Just attr -> RList.singleton attr }+ | attribute_list ',' attribute { (maybe id (flip RList.snoc) $3) $1 } attribute :: { Maybe CAttr }@@ -2055,17 +2165,40 @@ : {- empty -} { Nothing } | ident {% withNodeInfo $1 $ Just . CAttr $1 [] } | const {% withNodeInfo $1 $ Just . CAttr (internalIdent "const") [] }- | ident '(' attribute_params ')' {% withNodeInfo $1 $ Just . CAttr $1 (reverse $3) }+ | ident '(' attribute_params ')' {% withNodeInfo $1 $ Just . CAttr $1 (RList.reverse $3) } | ident '(' ')' {% withNodeInfo $1 $ Just . CAttr $1 [] } +-- OS X 10.9 (Mavericks) makes use of more liberal attribute syntax+-- that includes assignment-like expressions referencing version+-- numbers.+ attribute_params :: { Reversed [CExpr] } attribute_params- : constant_expression { singleton $1 }- | attribute_params ',' constant_expression { $1 `snoc` $3 }-+ : constant_expression { RList.singleton $1 }+ | unary_expression assignment_operator clang_version_literal { Reversed [] }+ | unary_expression assignment_operator unary_expression { Reversed [] }+ | attribute_params ',' constant_expression { $1 `RList.snoc` $3 }+ | attribute_params ',' unary_expression assignment_operator unary_expression { $1 }+ | attribute_params ',' unary_expression assignment_operator clang_version_literal { $1 } { +containsAlign :: Reversed [CDecl] -> Maybe CAlignSpec+containsAlign (Reversed input) = listToMaybe $ mapMaybe checkDecl input+ where+ checkDecl :: CDecl -> Maybe CAlignSpec+ checkDecl = \case+ CDecl list _ _ -> listToMaybe $ mapMaybe isAlignSpec list+ _ -> Nothing++ isAlignSpec :: CDeclSpec -> Maybe CAlignSpec+ isAlignSpec = \case+ CAlignSpec x -> Just x+ _ -> Nothing++addAlign :: CDecl -> CAlignmentSpecifier NodeInfo -> CDecl+addAlign (CDecl list list2 a) align = CDecl (CAlignSpec align : list) list2 a+ -- sometimes it is neccessary to reverse an unreversed list reverseList :: [a] -> Reversed [a] reverseList = Reversed . List.reverse@@ -2081,17 +2214,34 @@ instance Pos (Located a) where posOf (L _ pos) = pos +-- FIXME: the next 3 inlines here increase the object file size by 70%+-- Check whether the speed win is worth it {-# INLINE withNodeInfo #-} withNodeInfo :: Pos node => node -> (NodeInfo -> a) -> P a-withNodeInfo node mkAttributedNode = do+withNodeInfo node mkAttrNode = do name <- getNewName- let attrs = mkNodeInfo (posOf node) name- attrs `seq` return (mkAttributedNode attrs)+ lastTok <- getSavedToken+ let firstPos = posOf node+ let attrs = mkNodeInfo' firstPos (posLenOfTok $! lastTok) name+ attrs `seq` return (mkAttrNode attrs) +{-# INLINE withLength #-}+withLength :: NodeInfo -> (NodeInfo -> a) -> P a+withLength nodeinfo mkAttrNode = do+ lastTok <- getSavedToken+ let firstPos = posOfNode nodeinfo+ let attrs = mkNodeInfo' firstPos (posLenOfTok $! lastTok)+ (maybe (error "nameOfNode") id (nameOfNode nodeinfo))+ attrs `seq` return (mkAttrNode attrs)+ data CDeclrR = CDeclrR (Maybe Ident) (Reversed [CDerivedDeclr]) (Maybe CStrLit) [CAttr] NodeInfo reverseDeclr :: CDeclrR -> CDeclr reverseDeclr (CDeclrR ide reversedDDs asmname cattrs at)- = CDeclr ide (reverse reversedDDs) asmname cattrs at+ = CDeclr ide (RList.reverse reversedDDs) asmname cattrs at+instance CNode (CDeclrR) where+ nodeInfo (CDeclrR _ _ _ _ n) = n+instance Pos (CDeclrR) where+ posOf (CDeclrR _ _ _ _ n) = posOf n {-# INLINE withAttribute #-} withAttribute :: Pos node => node -> [CAttr] -> (NodeInfo -> CDeclrR) -> P CDeclrR@@ -2150,7 +2300,7 @@ appendDeclrAttrs :: [CAttr] -> CDeclrR -> CDeclrR appendDeclrAttrs newAttrs (CDeclrR ident (Reversed []) asmname cattrs at)- = CDeclrR ident empty asmname (cattrs ++ newAttrs) at+ = CDeclrR ident RList.empty asmname (cattrs ++ newAttrs) at appendDeclrAttrs newAttrs (CDeclrR ident (Reversed (x:xs)) asmname cattrs at) = CDeclrR ident (Reversed (appendAttrs x : xs)) asmname cattrs at where appendAttrs (CPtrDeclr typeQuals at) = CPtrDeclr (typeQuals ++ map CAttrQual newAttrs) at@@ -2159,22 +2309,20 @@ ptrDeclr :: CDeclrR -> [CTypeQual] -> NodeInfo -> CDeclrR ptrDeclr (CDeclrR ident derivedDeclrs asmname cattrs dat) tyquals at- = CDeclrR ident (derivedDeclrs `snoc` CPtrDeclr tyquals at) asmname cattrs dat+ = CDeclrR ident (derivedDeclrs `RList.snoc` CPtrDeclr tyquals at) asmname cattrs dat funDeclr :: CDeclrR -> (Either [Ident] ([CDecl],Bool)) -> [CAttr] -> NodeInfo -> CDeclrR funDeclr (CDeclrR ident derivedDeclrs asmname dcattrs dat) params cattrs at- = CDeclrR ident (derivedDeclrs `snoc` CFunDeclr params cattrs at) asmname dcattrs dat+ = CDeclrR ident (derivedDeclrs `RList.snoc` CFunDeclr params cattrs at) asmname dcattrs dat arrDeclr :: CDeclrR -> [CTypeQual] -> Bool -> Bool -> Maybe CExpr -> NodeInfo -> CDeclrR arrDeclr (CDeclrR ident derivedDeclrs asmname cattrs dat) tyquals var_sized static_size size_expr_opt at- = arr_sz `seq` ( CDeclrR ident (derivedDeclrs `snoc` CArrDeclr tyquals arr_sz at) asmname cattrs dat )+ = arr_sz `seq` ( CDeclrR ident (derivedDeclrs `RList.snoc` CArrDeclr tyquals arr_sz at) asmname cattrs dat ) where arr_sz = case size_expr_opt of Just e -> CArrSize static_size e Nothing -> CNoArrSize var_sized liftTypeQuals :: Reversed [CTypeQual] -> [CDeclSpec]-liftTypeQuals (Reversed tyqs) = revmap [] tyqs- where revmap a [] = a- revmap a (x:xs) = revmap (CTypeQual x : a) xs+liftTypeQuals = map CTypeQual . RList.reverse -- lift CAttrs to DeclSpecs --@@ -2185,12 +2333,12 @@ -- needs special care when @decl_spec_n@ is a SUE definition addTrailingAttrs :: Reversed [CDeclSpec] -> [CAttr] -> Reversed [CDeclSpec] addTrailingAttrs declspecs new_attrs =- case viewr declspecs of+ case RList.viewr declspecs of (specs_init, CTypeSpec (CSUType (CStruct tag name (Just def) def_attrs su_node) node))- -> (specs_init `snoc` CTypeSpec (CSUType (CStruct tag name (Just def) (def_attrs ++ new_attrs) su_node) node))+ -> (specs_init `RList.snoc` CTypeSpec (CSUType (CStruct tag name (Just def) (def_attrs ++ new_attrs) su_node) node)) (specs_init, CTypeSpec (CEnumType (CEnum name (Just def) def_attrs e_node) node))- -> (specs_init `snoc` CTypeSpec (CEnumType (CEnum name (Just def) (def_attrs ++ new_attrs) e_node) node))- _ -> declspecs `rappend` (liftCAttrs new_attrs)+ -> (specs_init `RList.snoc` CTypeSpec (CEnumType (CEnum name (Just def) (def_attrs ++ new_attrs) e_node) node))+ _ -> declspecs `RList.rappend` (liftCAttrs new_attrs) -- convenient instance, the position of a list of things is the position of -- the first thing in the list@@ -2201,8 +2349,10 @@ instance Pos a => Pos (Reversed a) where posOf (Reversed x) = posOf x -emptyDeclr = CDeclrR Nothing empty Nothing [] (mkNodeInfoOnlyPos nopos)-mkVarDeclr ident = CDeclrR (Just ident) empty Nothing []+emptyDeclr :: CDeclrR+emptyDeclr = CDeclrR Nothing RList.empty Nothing [] undefNode+mkVarDeclr :: Ident -> NodeInfo -> CDeclrR+mkVarDeclr ident = CDeclrR (Just ident) RList.empty Nothing [] -- Take the identifiers and use them to update the typedef'ed identifier set -- if the decl is defining a typedef then we add it to the set,@@ -2213,7 +2363,7 @@ case mIdent of Nothing -> return () Just ident | any iypedef declspecs -> addTypedef ident- | otherwise -> shadowTypedef ident+ | otherwise -> shadowTypedef ident where iypedef (CStorageSpec (CTypedef _)) = True iypedef _ = False
src/Language/C/Parser/ParserMonad.hs view
@@ -1,3 +1,5 @@+{-# LANGUAGE CPP #-}+{-# OPTIONS_GHC -Wwarn=incomplete-uni-patterns #-} ----------------------------------------------------------------------------- -- | -- Module : Language.C.Syntax.ParserMonad@@ -33,7 +35,10 @@ getInput, -- :: P String setInput, -- :: String -> P () getLastToken, -- :: P CToken+ getSavedToken, -- :: P CToken setLastToken, -- :: CToken -> P ()+ handleEofToken, -- :: P ()+ getCurrentPosition,-- :: P Position ParseError(..), ) where import Language.C.Data.Error (internalErr, showErrorInfo,ErrorInfo(..),ErrorLevel(..))@@ -41,8 +46,12 @@ import Language.C.Data.InputStream import Language.C.Data.Name (Name) import Language.C.Data.Ident (Ident)-import Language.C.Parser.Tokens (CToken)+import Language.C.Parser.Tokens (CToken(CTokEof)) +import Prelude hiding (Applicative(..), MonadFail(..))+import Control.Applicative (Applicative(..))+import Control.Monad (liftM, ap)+import Control.Monad.Fail (MonadFail (..)) import Data.Set (Set) import qualified Data.Set as Set (fromList, insert, member, delete) @@ -59,6 +68,7 @@ curPos :: !Position, -- position at current input location curInput :: !InputStream, -- the current input prevToken :: CToken, -- the previous token+ savedToken :: CToken, -- and the token before that namesupply :: ![Name], -- the name unique supply tyidents :: !(Set Ident), -- the set of typedef'ed identifiers scopes :: ![Set Ident] -- the tyident sets for outer scopes@@ -66,11 +76,23 @@ newtype P a = P { unP :: PState -> ParseResult a } +instance Functor P where+ fmap = liftM++instance Applicative P where+ pure = returnP+ (<*>) = ap+ instance Monad P where- return = returnP (>>=) = thenP+#if !MIN_VERSION_base(4,13,0) fail m = getPos >>= \pos -> failP pos [m]+#endif +#if MIN_VERSION_base(4,9,0)+instance MonadFail P where+ fail m = getPos >>= \pos -> failP pos [m]+#endif -- | execute the given parser on the supplied input stream. -- returns 'ParseError' if the parser failed, and a pair of@@ -87,6 +109,7 @@ curPos = pos, curInput = input, prevToken = internalErr "CLexer.execParser: Touched undefined token!",+ savedToken = internalErr "CLexer.execParser: Touched undefined token (safed token)!", namesupply = names, tyidents = Set.fromList builtins, scopes = []@@ -107,7 +130,7 @@ failP pos msg = P $ \_ -> PFailed msg pos getNewName :: P Name-getNewName = P $ \s@PState{namesupply=(n:ns)} -> POk s{namesupply=ns} n+getNewName = P $ \s@PState{namesupply=(n:ns)} -> n `seq` POk s{namesupply=ns} n setPos :: Position -> P () setPos pos = P $ \s -> POk s{curPos=pos} ()@@ -151,5 +174,17 @@ getLastToken :: P CToken getLastToken = P $ \s@PState{prevToken=tok} -> POk s tok +getSavedToken :: P CToken+getSavedToken = P $ \s@PState{savedToken=tok} -> POk s tok++-- | @setLastToken modifyCache tok@ setLastToken :: CToken -> P ()-setLastToken tok = P $ \s -> POk s{prevToken=tok} ()+setLastToken CTokEof = P $ \s -> POk s{savedToken=(prevToken s)} ()+setLastToken tok = P $ \s -> POk s{prevToken=tok,savedToken=(prevToken s)} ()++-- | handle an End-Of-File token (changes savedToken)+handleEofToken :: P ()+handleEofToken = P $ \s -> POk s{savedToken=(prevToken s)} ()++getCurrentPosition :: P Position+getCurrentPosition = P $ \s@PState{curPos=pos} -> POk s pos
src/Language/C/Parser/Tokens.hs view
@@ -11,126 +11,147 @@ -- C Tokens for the C lexer. -- ------------------------------------------------------------------------------module Language.C.Parser.Tokens (CToken(..), GnuCTok(..)) where+module Language.C.Parser.Tokens (CToken(..), posLenOfTok, GnuCTok(..), ClangCTok(..)) where -import Language.C.Data.Position (Position, Pos(..))-import Language.C.Data.Ident (Ident, identToString)-import Language.C.Syntax.Constants (CChar, CInteger, CFloat, CString)+import Language.C.Data.Position (Position, Pos(..), PosLength)+import Language.C.Data.Ident (Ident, identToString)+import Language.C.Syntax.Constants (CChar, CInteger, CFloat, CString, ClangCVersion) -- token definition -- ---------------- -- possible tokens (EXPORTED) ---data CToken = CTokLParen !Position -- `('- | CTokRParen !Position -- `)'- | CTokLBracket !Position -- `['- | CTokRBracket !Position -- `]'- | CTokArrow !Position -- `->'- | CTokDot !Position -- `.'- | CTokExclam !Position -- `!'- | CTokTilde !Position -- `~'- | CTokInc !Position -- `++'- | CTokDec !Position -- `--'- | CTokPlus !Position -- `+'- | CTokMinus !Position -- `-'- | CTokStar !Position -- `*'- | CTokSlash !Position -- `/'- | CTokPercent !Position -- `%'- | CTokAmper !Position -- `&'- | CTokShiftL !Position -- `<<'- | CTokShiftR !Position -- `>>'- | CTokLess !Position -- `<'- | CTokLessEq !Position -- `<='- | CTokHigh !Position -- `>'- | CTokHighEq !Position -- `>='- | CTokEqual !Position -- `=='- | CTokUnequal !Position -- `!='- | CTokHat !Position -- `^'- | CTokBar !Position -- `|'- | CTokAnd !Position -- `&&'- | CTokOr !Position -- `||'- | CTokQuest !Position -- `?'- | CTokColon !Position -- `:'- | CTokAssign !Position -- `='- | CTokPlusAss !Position -- `+='- | CTokMinusAss !Position -- `-='- | CTokStarAss !Position -- `*='- | CTokSlashAss !Position -- `/='- | CTokPercAss !Position -- `%='- | CTokAmpAss !Position -- `&='- | CTokHatAss !Position -- `^='- | CTokBarAss !Position -- `|='- | CTokSLAss !Position -- `<<='- | CTokSRAss !Position -- `>>='- | CTokComma !Position -- `,'- | CTokSemic !Position -- `;'- | CTokLBrace !Position -- `{'- | CTokRBrace !Position --- | CTokEllipsis !Position -- `...'- | CTokAlignof !Position -- `alignof'+data CToken = CTokLParen !PosLength -- `('+ | CTokRParen !PosLength -- `)'+ | CTokLBracket !PosLength -- `['+ | CTokRBracket !PosLength -- `]'+ | CTokArrow !PosLength -- `->'+ | CTokDot !PosLength -- `.'+ | CTokExclam !PosLength -- `!'+ | CTokTilde !PosLength -- `~'+ | CTokInc !PosLength -- `++'+ | CTokDec !PosLength -- `--'+ | CTokPlus !PosLength -- `+'+ | CTokMinus !PosLength -- `-'+ | CTokStar !PosLength -- `*'+ | CTokSlash !PosLength -- `/'+ | CTokPercent !PosLength -- `%'+ | CTokAmper !PosLength -- `&'+ | CTokShiftL !PosLength -- `<<'+ | CTokShiftR !PosLength -- `>>'+ | CTokLess !PosLength -- `<'+ | CTokLessEq !PosLength -- `<='+ | CTokHigh !PosLength -- `>'+ | CTokHighEq !PosLength -- `>='+ | CTokEqual !PosLength -- `=='+ | CTokUnequal !PosLength -- `!='+ | CTokHat !PosLength -- `^'+ | CTokBar !PosLength -- `|'+ | CTokAnd !PosLength -- `&&'+ | CTokOr !PosLength -- `||'+ | CTokQuest !PosLength -- `?'+ | CTokColon !PosLength -- `:'+ | CTokAssign !PosLength -- `='+ | CTokPlusAss !PosLength -- `+='+ | CTokMinusAss !PosLength -- `-='+ | CTokStarAss !PosLength -- `*='+ | CTokSlashAss !PosLength -- `/='+ | CTokPercAss !PosLength -- `%='+ | CTokAmpAss !PosLength -- `&='+ | CTokHatAss !PosLength -- `^='+ | CTokBarAss !PosLength -- `|='+ | CTokSLAss !PosLength -- `<<='+ | CTokSRAss !PosLength -- `>>='+ | CTokComma !PosLength -- `,'+ | CTokSemic !PosLength -- `;'+ | CTokLBrace !PosLength -- `{'+ | CTokRBrace !PosLength -- `}'+ | CTokEllipsis !PosLength -- `...'+ | CTokAlignof !PosLength -- `alignof' -- (or `__alignof', -- `__alignof__')- | CTokAsm !Position -- `asm'+ | CTokAlignas !PosLength -- `_Alignas'+ | CTokAsm !PosLength -- `asm' -- (or `__asm', -- `__asm__')- | CTokAuto !Position -- `auto'- | CTokBreak !Position -- `break'- | CTokBool !Position -- `_Bool'- | CTokCase !Position -- `case'- | CTokChar !Position -- `char'- | CTokConst !Position -- `const'+ | CTokAtomic !PosLength -- `_Atomic'+ | CTokAuto !PosLength -- `auto'+ | CTokBreak !PosLength -- `break'+ | CTokBool !PosLength -- `_Bool'+ | CTokCase !PosLength -- `case'+ | CTokChar !PosLength -- `char'+ | CTokConst !PosLength -- `const' -- (or `__const', `__const__')- | CTokContinue !Position -- `continue'- | CTokComplex !Position -- `_Complex'- | CTokDefault !Position -- `default'- | CTokDo !Position -- `do'- | CTokDouble !Position -- `double'- | CTokElse !Position -- `else'- | CTokEnum !Position -- `enum'- | CTokExtern !Position -- `extern'- | CTokFloat !Position -- `float'- | CTokFor !Position -- `for'- | CTokGoto !Position -- `goto'- | CTokIf !Position -- `if'- | CTokInline !Position -- `inline'+ | CTokContinue !PosLength -- `continue'+ | CTokComplex !PosLength -- `_Complex'+ | CTokDefault !PosLength -- `default'+ | CTokDo !PosLength -- `do'+ | CTokDouble !PosLength -- `double'+ | CTokElse !PosLength -- `else'+ | CTokEnum !PosLength -- `enum'+ | CTokExtern !PosLength -- `extern'+ | CTokFloat !PosLength -- `float'+ | CTokBFloat16 !PosLength -- `__bf16'+ | CTokFloatN !Int !Bool !PosLength -- (or `__float128',+ -- `__fp16',+ -- `_Float{16,32,64,128}{,x}`)+ | CTokFor !PosLength -- `for'+ | CTokGeneric !PosLength -- `_Generic'+ | CTokGoto !PosLength -- `goto'+ | CTokIf !PosLength -- `if'+ | CTokInline !PosLength -- `inline' -- (or `__inline', -- `__inline__')- | CTokInt !Position -- `int'- | CTokLong !Position -- `long'- | CTokLabel !Position -- `__label__'- | CTokRegister !Position -- `register'- | CTokRestrict !Position -- `restrict'+ | CTokInt !PosLength -- `int'+ | CTokInt128 !PosLength -- `__int128`+ -- (or `__int128_t`)+ | CTokLong !PosLength -- `long'+ | CTokLabel !PosLength -- `__label__+ | CTokNoreturn !PosLength -- `_Noreturn'+ | CTokNullable !PosLength -- `_Nullable'+ | CTokNonnull !PosLength -- `_Nonnull'+ | CTokRegister !PosLength -- `register'+ | CTokRestrict !PosLength -- `restrict' -- (or `__restrict', -- `__restrict__')- | CTokReturn !Position -- `return'- | CTokShort !Position -- `short'- | CTokSigned !Position -- `signed'+ | CTokReturn !PosLength -- `return'+ | CTokShort !PosLength -- `short'+ | CTokSigned !PosLength -- `signed' -- (or `__signed', -- `__signed__')- | CTokSizeof !Position -- `sizeof'- | CTokStatic !Position -- `static'- | CTokStruct !Position -- `struct'- | CTokSwitch !Position -- `switch'- | CTokTypedef !Position -- `typedef'- | CTokTypeof !Position -- `typeof'- | CTokThread !Position -- `__thread'- | CTokUnion !Position -- `union'- | CTokUnsigned !Position -- `unsigned'- | CTokVoid !Position -- `void'- | CTokVolatile !Position -- `volatile'+ | CTokSizeof !PosLength -- `sizeof'+ | CTokStatic !PosLength -- `static'+ | CTokStaticAssert !PosLength -- `_Static_assert'+ | CTokStruct !PosLength -- `struct'+ | CTokSwitch !PosLength -- `switch'+ | CTokTypedef !PosLength -- `typedef'+ | CTokTypeof !PosLength -- `typeof'+ | CTokThread !PosLength -- `__thread'+ | CTokUInt128 !PosLength -- `__uint128`+ -- (or `__uint128_t`)+ | CTokUnion !PosLength -- `union'+ | CTokUnsigned !PosLength -- `unsigned'+ | CTokVoid !PosLength -- `void'+ | CTokVolatile !PosLength -- `volatile' -- (or `__volatile', -- `__volatile__')- | CTokWhile !Position -- `while'- | CTokCLit !Position !CChar -- character constant- | CTokILit !Position !CInteger -- integer constant- | CTokFLit !Position CFloat -- float constant- | CTokSLit !Position CString -- string constant- | CTokIdent !Position !Ident -- identifier+ | CTokWhile !PosLength -- `while'+ | CTokCLit !PosLength !CChar -- character constant+ | CTokILit !PosLength !CInteger -- integer constant+ | CTokFLit !PosLength CFloat -- float constant+ | CTokSLit !PosLength CString -- string constant+ | CTokIdent !PosLength !Ident -- identifier -- not generated here, but in `CParser.parseCHeader'- | CTokTyIdent !Position !Ident -- `typedef-name' identifier- | CTokGnuC !GnuCTok !Position -- special GNU C tokens+ | CTokTyIdent !PosLength !Ident -- `typedef-name' identifier+ | CTokGnuC !GnuCTok !PosLength -- special GNU C tokens+ | CTokClangC !PosLength !ClangCTok -- special Clang C tokens+ | CTokClKernel !PosLength -- OpenCL `__kernel'+ | CTokClRdOnly !PosLength -- OpenCL `__read_only'+ | CTokClWrOnly !PosLength -- OpenCL `__write_only'+ | CTokClGlobal !PosLength -- OpenCL `__Global'+ | CTokClLocal !PosLength -- OpenCL `__Local' | CTokEof -- end of file -- special tokens used in GNU C extensions to ANSI C@@ -143,102 +164,128 @@ | GnuCComplexReal -- `__real__' | GnuCComplexImag -- `__imag__' +data ClangCTok = ClangCVersionTok !ClangCVersion -- version constant from 'availability' attribute+ | ClangBuiltinConvertVector+ | ClangCBitCast -- `__builtin_bit_cast`+ instance Pos CToken where- posOf (CTokLParen pos ) = pos- posOf (CTokRParen pos ) = pos- posOf (CTokLBracket pos ) = pos- posOf (CTokRBracket pos ) = pos- posOf (CTokArrow pos ) = pos- posOf (CTokDot pos ) = pos- posOf (CTokExclam pos ) = pos- posOf (CTokTilde pos ) = pos- posOf (CTokInc pos ) = pos- posOf (CTokDec pos ) = pos- posOf (CTokPlus pos ) = pos- posOf (CTokMinus pos ) = pos- posOf (CTokStar pos ) = pos- posOf (CTokSlash pos ) = pos- posOf (CTokPercent pos ) = pos- posOf (CTokAmper pos ) = pos- posOf (CTokShiftL pos ) = pos- posOf (CTokShiftR pos ) = pos- posOf (CTokLess pos ) = pos- posOf (CTokLessEq pos ) = pos- posOf (CTokHigh pos ) = pos- posOf (CTokHighEq pos ) = pos- posOf (CTokEqual pos ) = pos- posOf (CTokUnequal pos ) = pos- posOf (CTokHat pos ) = pos- posOf (CTokBar pos ) = pos- posOf (CTokAnd pos ) = pos- posOf (CTokOr pos ) = pos- posOf (CTokQuest pos ) = pos- posOf (CTokColon pos ) = pos- posOf (CTokAssign pos ) = pos- posOf (CTokPlusAss pos ) = pos- posOf (CTokMinusAss pos ) = pos- posOf (CTokStarAss pos ) = pos- posOf (CTokSlashAss pos ) = pos- posOf (CTokPercAss pos ) = pos- posOf (CTokAmpAss pos ) = pos- posOf (CTokHatAss pos ) = pos- posOf (CTokBarAss pos ) = pos- posOf (CTokSLAss pos ) = pos- posOf (CTokSRAss pos ) = pos- posOf (CTokComma pos ) = pos- posOf (CTokSemic pos ) = pos- posOf (CTokLBrace pos ) = pos- posOf (CTokRBrace pos ) = pos- posOf (CTokEllipsis pos ) = pos- posOf (CTokAlignof pos ) = pos- posOf (CTokAsm pos ) = pos- posOf (CTokAuto pos ) = pos- posOf (CTokBreak pos ) = pos- posOf (CTokBool pos ) = pos- posOf (CTokCase pos ) = pos- posOf (CTokChar pos ) = pos- posOf (CTokConst pos ) = pos- posOf (CTokContinue pos ) = pos- posOf (CTokComplex pos ) = pos- posOf (CTokDefault pos ) = pos- posOf (CTokDo pos ) = pos- posOf (CTokDouble pos ) = pos- posOf (CTokElse pos ) = pos- posOf (CTokEnum pos ) = pos- posOf (CTokExtern pos ) = pos- posOf (CTokFloat pos ) = pos- posOf (CTokFor pos ) = pos- posOf (CTokGoto pos ) = pos- posOf (CTokInt pos ) = pos- posOf (CTokInline pos ) = pos- posOf (CTokIf pos ) = pos- posOf (CTokLong pos ) = pos- posOf (CTokLabel pos ) = pos- posOf (CTokRegister pos ) = pos- posOf (CTokRestrict pos ) = pos- posOf (CTokReturn pos ) = pos- posOf (CTokShort pos ) = pos- posOf (CTokSigned pos ) = pos- posOf (CTokSizeof pos ) = pos- posOf (CTokStatic pos ) = pos- posOf (CTokStruct pos ) = pos- posOf (CTokSwitch pos ) = pos- posOf (CTokTypedef pos ) = pos- posOf (CTokTypeof pos ) = pos- posOf (CTokThread pos ) = pos- posOf (CTokUnion pos ) = pos- posOf (CTokUnsigned pos ) = pos- posOf (CTokVoid pos ) = pos- posOf (CTokVolatile pos ) = pos- posOf (CTokWhile pos ) = pos- posOf (CTokCLit pos _) = pos- posOf (CTokILit pos _) = pos- posOf (CTokFLit pos _) = pos- posOf (CTokSLit pos _) = pos- posOf (CTokIdent pos _) = pos- posOf (CTokTyIdent pos _) = pos- posOf (CTokGnuC _ pos ) = pos- posOf CTokEof = error "tokenPos: Eof"+ posOf = fst . posLenOfTok++-- token position and length+posLenOfTok :: CToken -> (Position,Int)+posLenOfTok (CTokLParen pos ) = pos+posLenOfTok (CTokRParen pos ) = pos+posLenOfTok (CTokLBracket pos ) = pos+posLenOfTok (CTokRBracket pos ) = pos+posLenOfTok (CTokArrow pos ) = pos+posLenOfTok (CTokDot pos ) = pos+posLenOfTok (CTokExclam pos ) = pos+posLenOfTok (CTokTilde pos ) = pos+posLenOfTok (CTokInc pos ) = pos+posLenOfTok (CTokDec pos ) = pos+posLenOfTok (CTokPlus pos ) = pos+posLenOfTok (CTokMinus pos ) = pos+posLenOfTok (CTokStar pos ) = pos+posLenOfTok (CTokSlash pos ) = pos+posLenOfTok (CTokPercent pos ) = pos+posLenOfTok (CTokAmper pos ) = pos+posLenOfTok (CTokShiftL pos ) = pos+posLenOfTok (CTokShiftR pos ) = pos+posLenOfTok (CTokLess pos ) = pos+posLenOfTok (CTokLessEq pos ) = pos+posLenOfTok (CTokHigh pos ) = pos+posLenOfTok (CTokHighEq pos ) = pos+posLenOfTok (CTokEqual pos ) = pos+posLenOfTok (CTokUnequal pos ) = pos+posLenOfTok (CTokHat pos ) = pos+posLenOfTok (CTokBar pos ) = pos+posLenOfTok (CTokAnd pos ) = pos+posLenOfTok (CTokOr pos ) = pos+posLenOfTok (CTokQuest pos ) = pos+posLenOfTok (CTokColon pos ) = pos+posLenOfTok (CTokAssign pos ) = pos+posLenOfTok (CTokPlusAss pos ) = pos+posLenOfTok (CTokMinusAss pos ) = pos+posLenOfTok (CTokStarAss pos ) = pos+posLenOfTok (CTokSlashAss pos ) = pos+posLenOfTok (CTokPercAss pos ) = pos+posLenOfTok (CTokAmpAss pos ) = pos+posLenOfTok (CTokHatAss pos ) = pos+posLenOfTok (CTokBarAss pos ) = pos+posLenOfTok (CTokSLAss pos ) = pos+posLenOfTok (CTokSRAss pos ) = pos+posLenOfTok (CTokComma pos ) = pos+posLenOfTok (CTokSemic pos ) = pos+posLenOfTok (CTokLBrace pos ) = pos+posLenOfTok (CTokRBrace pos ) = pos+posLenOfTok (CTokEllipsis pos ) = pos+posLenOfTok (CTokAlignof pos ) = pos+posLenOfTok (CTokAlignas pos ) = pos+posLenOfTok (CTokAsm pos ) = pos+posLenOfTok (CTokAtomic pos ) = pos+posLenOfTok (CTokAuto pos ) = pos+posLenOfTok (CTokBreak pos ) = pos+posLenOfTok (CTokBool pos ) = pos+posLenOfTok (CTokCase pos ) = pos+posLenOfTok (CTokChar pos ) = pos+posLenOfTok (CTokConst pos ) = pos+posLenOfTok (CTokContinue pos ) = pos+posLenOfTok (CTokComplex pos ) = pos+posLenOfTok (CTokDefault pos ) = pos+posLenOfTok (CTokDo pos ) = pos+posLenOfTok (CTokDouble pos ) = pos+posLenOfTok (CTokElse pos ) = pos+posLenOfTok (CTokEnum pos ) = pos+posLenOfTok (CTokExtern pos ) = pos+posLenOfTok (CTokFloat pos ) = pos+posLenOfTok (CTokBFloat16 pos ) = pos+posLenOfTok (CTokFloatN _ _ pos) = pos+posLenOfTok (CTokFor pos ) = pos+posLenOfTok (CTokGeneric pos ) = pos+posLenOfTok (CTokGoto pos ) = pos+posLenOfTok (CTokInt pos ) = pos+posLenOfTok (CTokInt128 pos ) = pos+posLenOfTok (CTokInline pos ) = pos+posLenOfTok (CTokIf pos ) = pos+posLenOfTok (CTokLong pos ) = pos+posLenOfTok (CTokLabel pos ) = pos+posLenOfTok (CTokNoreturn pos ) = pos+posLenOfTok (CTokNullable pos ) = pos+posLenOfTok (CTokNonnull pos ) = pos+posLenOfTok (CTokRegister pos ) = pos+posLenOfTok (CTokRestrict pos ) = pos+posLenOfTok (CTokReturn pos ) = pos+posLenOfTok (CTokShort pos ) = pos+posLenOfTok (CTokSigned pos ) = pos+posLenOfTok (CTokSizeof pos ) = pos+posLenOfTok (CTokStatic pos ) = pos+posLenOfTok (CTokStaticAssert pos) = pos+posLenOfTok (CTokStruct pos ) = pos+posLenOfTok (CTokSwitch pos ) = pos+posLenOfTok (CTokTypedef pos ) = pos+posLenOfTok (CTokTypeof pos ) = pos+posLenOfTok (CTokThread pos ) = pos+posLenOfTok (CTokUInt128 pos ) = pos+posLenOfTok (CTokUnion pos ) = pos+posLenOfTok (CTokUnsigned pos ) = pos+posLenOfTok (CTokVoid pos ) = pos+posLenOfTok (CTokVolatile pos ) = pos+posLenOfTok (CTokWhile pos ) = pos+posLenOfTok (CTokCLit pos _) = pos+posLenOfTok (CTokILit pos _) = pos+posLenOfTok (CTokFLit pos _) = pos+posLenOfTok (CTokSLit pos _) = pos+posLenOfTok (CTokIdent pos _) = pos+posLenOfTok (CTokTyIdent pos _) = pos+posLenOfTok (CTokGnuC _ pos ) = pos+posLenOfTok (CTokClangC pos _) = pos+posLenOfTok (CTokClKernel pos ) = pos+posLenOfTok (CTokClRdOnly pos ) = pos+posLenOfTok (CTokClWrOnly pos ) = pos+posLenOfTok (CTokClGlobal pos ) = pos+posLenOfTok (CTokClLocal pos ) = pos+posLenOfTok CTokEof = error "tokenPos: Eof"+ instance Show CToken where showsPrec _ (CTokLParen _ ) = showString "(" showsPrec _ (CTokRParen _ ) = showString ")"@@ -287,7 +334,9 @@ showsPrec _ (CTokRBrace _ ) = showString "}" showsPrec _ (CTokEllipsis _ ) = showString "..." showsPrec _ (CTokAlignof _ ) = showString "alignof"+ showsPrec _ (CTokAlignas _ ) = showString "_Alignas" showsPrec _ (CTokAsm _ ) = showString "asm"+ showsPrec _ (CTokAtomic _ ) = showString "_Atomic" showsPrec _ (CTokAuto _ ) = showString "auto" showsPrec _ (CTokBool _) = showString "_Bool" showsPrec _ (CTokBreak _ ) = showString "break"@@ -303,13 +352,21 @@ showsPrec _ (CTokEnum _ ) = showString "enum" showsPrec _ (CTokExtern _ ) = showString "extern" showsPrec _ (CTokFloat _ ) = showString "float"+ showsPrec _ (CTokBFloat16 _ ) = showString "__bf16"+ showsPrec _ (CTokFloatN n x _) = showString "_Float" . shows n .+ showString (if x then "x" else "") showsPrec _ (CTokFor _ ) = showString "for"+ showsPrec _ (CTokGeneric _ ) = showString "_Generic" showsPrec _ (CTokGoto _ ) = showString "goto" showsPrec _ (CTokIf _ ) = showString "if" showsPrec _ (CTokInline _ ) = showString "inline" showsPrec _ (CTokInt _ ) = showString "int"+ showsPrec _ (CTokInt128 _ ) = showString "__int128" showsPrec _ (CTokLong _ ) = showString "long" showsPrec _ (CTokLabel _ ) = showString "__label__"+ showsPrec _ (CTokNoreturn _ ) = showString "_Noreturn"+ showsPrec _ (CTokNullable _ ) = showString "_Nullable"+ showsPrec _ (CTokNonnull _ ) = showString "_Nonnull" showsPrec _ (CTokRegister _ ) = showString "register" showsPrec _ (CTokRestrict _ ) = showString "restrict" showsPrec _ (CTokReturn _ ) = showString "return"@@ -317,11 +374,13 @@ showsPrec _ (CTokSigned _ ) = showString "signed" showsPrec _ (CTokSizeof _ ) = showString "sizeof" showsPrec _ (CTokStatic _ ) = showString "static"+ showsPrec _ (CTokStaticAssert _ ) = showString "_Static_assert" showsPrec _ (CTokStruct _ ) = showString "struct" showsPrec _ (CTokSwitch _ ) = showString "switch" showsPrec _ (CTokTypedef _ ) = showString "typedef" showsPrec _ (CTokTypeof _ ) = showString "typeof"- showsPrec _ (CTokThread _ ) = showString "__thread"+ showsPrec _ (CTokThread _ ) = showString "_Thread_local"+ showsPrec _ (CTokUInt128 _ ) = showString "__uint128" showsPrec _ (CTokUnion _ ) = showString "union" showsPrec _ (CTokUnsigned _ ) = showString "unsigned" showsPrec _ (CTokVoid _ ) = showString "void"@@ -340,5 +399,12 @@ showsPrec _ (CTokGnuC GnuCVaArg _) = showString "__builtin_va_arg" showsPrec _ (CTokGnuC GnuCOffsetof _) = showString "__builtin_offsetof" showsPrec _ (CTokGnuC GnuCTyCompat _) = showString "__builtin_types_compatible_p"+ showsPrec _ (CTokClangC _ (ClangCVersionTok v)) = shows v+ showsPrec _ (CTokClangC _ ClangBuiltinConvertVector) = showString "__builtin_convertvector"+ showsPrec _ (CTokClangC _ ClangCBitCast) = showString "__builtin_bit_cast"+ showsPrec _ (CTokClKernel _ ) = showString "__kernel"+ showsPrec _ (CTokClRdOnly _ ) = showString "__read_only"+ showsPrec _ (CTokClWrOnly _ ) = showString "__write_only"+ showsPrec _ (CTokClGlobal _ ) = showString "__global"+ showsPrec _ (CTokClLocal _ ) = showString "__Local" showsPrec _ CTokEof = error "show CToken : CTokEof"-
src/Language/C/Pretty.hs view
@@ -1,4 +1,4 @@-{-# OPTIONS #-}+{-# LANGUAGE TypeSynonymInstances, FlexibleInstances, FlexibleContexts #-} ----------------------------------------------------------------------------- -- | -- Module : Language.C.Pretty@@ -18,10 +18,11 @@ -- * Testing prettyUsingInclude ) where-import Data.List (partition,nub,isSuffixOf)+import Data.List (isSuffixOf) import qualified Data.Set as Set import Text.PrettyPrint.HughesPJ import Debug.Trace {- for warnings -}+import Prelude hiding ((<>)) import Language.C.Data import Language.C.Syntax@@ -73,16 +74,16 @@ -- | Pretty print the given tranlation unit, but replace declarations from header files with @#include@ directives. ----- The resulting file may not compile (because of missing @#define@ directives and similar things), but is very usefull+-- The resulting file may not compile (because of missing @#define@ directives and similar things), but is very useful -- for testing, as otherwise the pretty printed file will be cluttered with declarations from system headers. prettyUsingInclude :: CTranslUnit -> Doc prettyUsingInclude (CTranslUnit edecls _) = includeWarning headerFiles $$- (vcat $ map (either includeHeader pretty) mappedDecls)+ vcat (map (either includeHeader pretty) mappedDecls) where- (headerFiles,mappedDecls) = foldr addDecl (Set.empty,[]) $ map tagIncludedDecls edecls- tagIncludedDecls edecl | isHeaderFile ((posFile . posOf) edecl) = Left ((posFile . posOf) edecl)+ (headerFiles,mappedDecls) = foldr (addDecl . tagIncludedDecls) (Set.empty,[]) edecls+ tagIncludedDecls edecl | maybe False isHeaderFile (fileOfNode edecl) = Left ((posFile . posOf) edecl) | otherwise = Right edecl addDecl decl@(Left headerRef) (headerSet, ds) | Set.member headerRef headerSet = (headerSet, ds)@@ -91,20 +92,20 @@ includeHeader hFile = text "#include" <+> doubleQuotes (text hFile) isHeaderFile = (".h" `isSuffixOf`) includeWarning hs | Set.null hs = empty- | otherwise = text "/* Warning: The #include directives in this file aren't neccessarily correct. */"+ | otherwise = text "/* Warning: The #include directives in this file aren't necessarily correct. */" -- TODO: Check need of __extension__ instance Pretty CExtDecl where pretty (CDeclExt decl) = pretty decl <> semi pretty (CFDefExt fund) = pretty fund- pretty (CAsmExt asmStmt) = text "asm" <> parens (pretty asmStmt) <> semi+ pretty (CAsmExt asmStmt _) = text "asm" <> parens (pretty asmStmt) <> semi -- TODO: Check that old-style and new-style aren't mixed instance Pretty CFunDef where pretty (CFunDef declspecs declr decls stat _) = -- Example: hsep (map pretty declspecs) -- __attribute__((noreturn)) static long <+> pretty declr -- foo(b)- $+$ (ii . vcat . map (<> semi) . map pretty) decls -- register long b;+ $+$ (ii . vcat . map ((<> semi) . pretty)) decls -- register long b; $$ prettyPrec (-1) stat -- { ... -- } @@ -119,18 +120,19 @@ pretty (CExpr expr _) = ii $ maybeP pretty expr <> semi pretty c@(CCompound _ _ _) = prettyPrec 0 c pretty (CIf expr stat estat _) =- ii $ text "if" <+> text "(" <> pretty expr <> text ")"- $+$ prettyThen stat+ ii $ text "if" <+> parens (pretty expr)+ $+$ prettyBody stat $$ maybeP prettyElse estat where- prettyThen stat@(CIf _ _ _ _) = text "{" $+$ prettyPrec (-1) stat $$ text "}"- prettyThen stat = prettyPrec (-1) stat+ prettyBody c@(CCompound _ _ _) = prettyPrec (-1) c+ prettyBody nonCompound = prettyPrec (-1) (CCompound [] [CBlockStmt nonCompound] undefined) prettyElse (CIf else_if_expr else_if_stat else_stat _) =- text "else if" <+> text "(" <> pretty else_if_expr <> text ")"- $+$ prettyPrec (-1) else_if_stat- $$ maybeP prettyElse else_stat+ text "else if" <+> parens (pretty else_if_expr)+ $+$ prettyBody else_if_stat+ $$ maybeP prettyElse else_stat prettyElse else_stmt =- text "else" $+$ prettyPrec (-1) else_stmt+ text "else"+ $+$ prettyBody else_stmt pretty (CSwitch expr stat _) = ii $ text "switch" <+> text "(" <> pretty expr <> text ")"@@ -202,29 +204,42 @@ attrlistP (getAttrs declr) <+> maybeP ((text "=" <+>) . pretty) initializer checked_specs =- case any isAttrAfterSUE (zip specs (tail specs)) of- True -> trace- ("Warning: AST Invariant violated: __attribute__ specifier following struct/union/enum:"++- (show $ map pretty specs))- specs- False -> specs+ if any isAttrAfterSUE (zip specs (drop 1 specs))+ then trace+ ("Warning: AST Invariant violated: __attribute__ specifier following struct/union/enum:" +++ show (map pretty specs))+ specs+ else specs isAttrAfterSUE (CTypeSpec ty,CTypeQual (CAttrQual _)) = isSUEDef ty isAttrAfterSUE _ = False getAttrs Nothing = [] getAttrs (Just (CDeclr _ _ _ cattrs _)) = cattrs+ pretty (CStaticAssert expr str _) =+ text "_Static_assert" <> parens (hsep (punctuate comma [pretty expr, pretty str])) instance Pretty CDeclSpec where pretty (CStorageSpec sp) = pretty sp pretty (CTypeSpec sp) = pretty sp pretty (CTypeQual qu) = pretty qu+ pretty (CFunSpec fs) = pretty fs+ pretty (CAlignSpec sa) = pretty sa +instance Pretty CAlignSpec where+ pretty (CAlignAsType decl _) =+ text "_Alignas" <> parens (pretty decl)+ pretty (CAlignAsExpr expr _) =+ text "_Alignas" <> parens (pretty expr)+ instance Pretty CStorageSpec where pretty (CAuto _) = text "auto" pretty (CRegister _) = text "register" pretty (CStatic _) = text "static" pretty (CExtern _) = text "extern" pretty (CTypedef _) = text "typedef"- pretty (CThread _) = text "__thread"+ pretty (CThread _) = text "_Thread_local"+ pretty (CClKernel _) = text "__kernel"+ pretty (CClGlobal _) = text "__global"+ pretty (CClLocal _) = text "__local" instance Pretty CTypeSpec where pretty (CVoidType _) = text "void"@@ -233,33 +248,48 @@ pretty (CIntType _) = text "int" pretty (CLongType _) = text "long" pretty (CFloatType _) = text "float"+ pretty (CBFloat16Type _) = text "__bf16"+ pretty (CFloatNType n x _) = text "_Float" <> text (show n) <>+ (if x then text "x" else empty) pretty (CDoubleType _) = text "double" pretty (CSignedType _) = text "signed" pretty (CUnsigType _) = text "unsigned" pretty (CBoolType _) = text "_Bool" pretty (CComplexType _) = text "_Complex"+ pretty (CInt128Type _) = text "__int128"+ pretty (CUInt128Type _) = text "__uint128" pretty (CSUType union _) = pretty union pretty (CEnumType enum _) = pretty enum pretty (CTypeDef ident _) = identP ident pretty (CTypeOfExpr expr _) =- text "typeof" <> text "(" <> pretty expr <> text ")"+ text "typeof" <> parens (pretty expr) pretty (CTypeOfType decl _) =- text "typeof" <> text "(" <> pretty decl <> text ")"+ text "typeof" <> parens (pretty decl)+ pretty (CAtomicType decl _) =+ text "_Atomic" <> parens (pretty decl) instance Pretty CTypeQual where pretty (CConstQual _) = text "const" pretty (CVolatQual _) = text "volatile" pretty (CRestrQual _) = text "__restrict"- pretty (CInlineQual _) = text "inline"+ pretty (CAtomicQual _) = text "_Atomic" pretty (CAttrQual a) = attrlistP [a]+ pretty (CNullableQual _) = text "_Nullable"+ pretty (CNonnullQual _) = text "_Nonnull"+ pretty (CClRdOnlyQual _) = text "__read_only"+ pretty (CClWrOnlyQual _) = text "__write_only" +instance Pretty CFunSpec where+ pretty (CInlineQual _) = text "inline"+ pretty (CNoreturnQual _) = text "_Noreturn"+ instance Pretty CStructUnion where pretty (CStruct tag ident Nothing cattrs _) = pretty tag <+> attrlistP cattrs <+> maybeP identP ident pretty (CStruct tag ident (Just []) cattrs _) = pretty tag <+> attrlistP cattrs <+> maybeP identP ident <+> text "{ }" pretty (CStruct tag ident (Just decls) cattrs _) = vcat [ pretty tag <+> attrlistP cattrs <+> maybeP identP ident <+> text "{",- ii $ sep (map (<> semi) (map pretty decls)),+ ii $ sep (map ((<> semi) . pretty) decls), text "}"] instance Pretty CStructTag where@@ -384,7 +414,7 @@ prettyPrec p (CUnary CPostDecOp expr _) = parenPrec p 26 $ prettyPrec 26 expr <> text "--" prettyPrec p (CUnary op expr@(CUnary _ _ _) _) =- -- parens aren't neccessary, but look nicer imho+ -- parens aren't necessary, but look nicer imho parenPrec p 25 $ pretty op <+> parens (prettyPrec 25 expr) prettyPrec p (CUnary op expr _) = parenPrec p 25 $ pretty op <> prettyPrec 25 expr@@ -414,38 +444,87 @@ prettyPrec _p (CCompoundLit decl initl _) = parens (pretty decl) <+> (braces . hsep . punctuate comma) (map p initl) where p ([], initializer) = pretty initializer- p (mems, initializer) = hcat (punctuate (text ".") (map pretty mems)) <+> text "=" <+> pretty initializer+ p (mems, initializer) = hcat (map pretty mems) <+> text "=" <+> pretty initializer prettyPrec _p (CStatExpr stat _) = text "(" <> pretty stat <> text ")" -- unary_expr :- && ident {- address of label -} prettyPrec _p (CLabAddrExpr ident _) = text "&&" <> identP ident-+ prettyPrec _p (CGenericSelection expr assoc_list _) =+ text "_Generic" <> (parens.hsep.punctuate comma) (pretty expr : map pAssoc assoc_list)+ where+ pAssoc (mty, expr1) = maybe (text "default") pretty mty <> text ":" <+> pretty expr1 prettyPrec _p (CBuiltinExpr builtin) = pretty builtin instance Pretty CBuiltin where pretty (CBuiltinVaArg expr ty_name _) = text "__builtin_va_arg" <+>- (parens $ pretty expr <> comma <+> pretty ty_name)+ parens (pretty expr <> comma <+> pretty ty_name) -- The first desig has to be a member field. pretty (CBuiltinOffsetOf ty_name (CMemberDesig field1 _ : desigs) _) = text "__builtin_offsetof" <+>- (parens $ pretty ty_name <> comma <+> identP field1 <> hcat (map pretty desigs) )+ parens (pretty ty_name <> comma <+> identP field1 <> hcat (map pretty desigs) ) pretty (CBuiltinOffsetOf _ty_name otherDesigs _) =- error $ "Inconsistent AST: Cannot interpret designators in offsetOf: "++ show (hcat$ map pretty otherDesigs)+ error $ "Inconsistent AST: Cannot interpret designators in offsetOf: " +++ show (hcat $ map pretty otherDesigs) pretty (CBuiltinTypesCompatible ty1 ty2 _) = text "__builtin_types_compatible_p" <+>- (parens $ pretty ty1 <> comma <+> pretty ty2)+ parens (pretty ty1 <> comma <+> pretty ty2)+ pretty (CBuiltinConvertVector expr ty _) =+ text "__builtin_convertvector" <+>+ parens (pretty expr <> comma <+> pretty ty)+ pretty (CBuiltinBitCast ty expr _) =+ text "__builtin_bit_cast" <+>+ parens (pretty ty <> comma <+> pretty expr) instance Pretty CAssignOp where- pretty = text . show+ pretty op = text $ case op of+ CAssignOp -> "="+ CMulAssOp -> "*="+ CDivAssOp -> "/="+ CRmdAssOp -> "%="+ CAddAssOp -> "+="+ CSubAssOp -> "-="+ CShlAssOp -> "<<="+ CShrAssOp -> ">>="+ CAndAssOp -> "&="+ CXorAssOp -> "^="+ COrAssOp -> "|=" instance Pretty CBinaryOp where- pretty = text . show+ pretty op = text $ case op of+ CMulOp -> "*"+ CDivOp -> "/"+ CRmdOp -> "%"+ CAddOp -> "+"+ CSubOp -> "-"+ CShlOp -> "<<"+ CShrOp -> ">>"+ CLeOp -> "<"+ CGrOp -> ">"+ CLeqOp -> "<="+ CGeqOp -> ">="+ CEqOp -> "=="+ CNeqOp -> "!="+ CAndOp -> "&"+ CXorOp -> "^"+ COrOp -> "|"+ CLndOp -> "&&"+ CLorOp -> "||" instance Pretty CUnaryOp where- pretty = text . show+ pretty op = text $ case op of+ CPreIncOp -> "++"+ CPreDecOp -> "--"+ CPostIncOp -> "++"+ CPostDecOp -> "--"+ CAdrOp -> "&"+ CIndOp -> "*"+ CPlusOp -> "+"+ CMinOp -> "-"+ CCompOp -> "~"+ CNegOp -> "!" instance Pretty CConst where pretty (CIntConst int_const _) = text (show int_const)
src/Language/C/Syntax/AST.hs view
@@ -1,738 +1,1476 @@ {-# LANGUAGE DeriveDataTypeable #-}--------------------------------------------------------------------------------- |--- Module : Language.C.Syntax.AST--- Copyright : (c) [1999..2007] Manuel M T Chakravarty--- (c) 2008 Benedikt Huber--- License : BSD-style--- Maintainer : benedikt.huber@gmail.com--- Stability : experimental--- Portability : ghc------ Abstract syntax of C source and header files.------ The tree structure is based on the grammar in Appendix A of K&R. The--- abstract syntax simplifies the concrete syntax by merging similar concrete--- constructs into a single type of abstract tree structure: declarations are--- merged with structure declarations, parameter declarations and type names,--- and declarators are merged with abstract declarators.------ With K&R we refer to ``The C Programming Language'', second edition, Brain--- W. Kernighan and Dennis M. Ritchie, Prentice Hall, 1988. The AST supports all--- of C99 <http://www.open-std.org/JTC1/SC22/WG14/www/docs/n1256.pdf> and several--- GNU extensions <http://gcc.gnu.org/onlinedocs/gcc/C-Extensions.html>.-------------------------------------------------------------------------------module Language.C.Syntax.AST (- -- * C translation units- CTranslUnit(..), CExtDecl(..),- -- * Declarations- CFunDef(..), CDecl(..),- CStructUnion(..), CStructTag(..), CEnum(..),- -- * Declaration attributes- CDeclSpec(..), partitionDeclSpecs,- CStorageSpec(..), CTypeSpec(..), isSUEDef, CTypeQual(..), CAttr(..),- -- * Declarators- CDeclr(..),CDerivedDeclr(..),CArrSize(..),- -- * Initialization- CInit(..), CInitList, CDesignator(..),- -- * Statements- CStat(..), CBlockItem(..),- CAsmStmt(..), CAsmOperand(..),- -- * Expressions- CExpr(..),- CAssignOp(..), CBinaryOp(..), CUnaryOp(..),- CBuiltin(..),- -- * Constants- CConst(..),CStrLit(..),cstringOfLit,liftStrLit,-) where-import Data.List-import Language.C.Syntax.Constants-import Language.C.Syntax.Ops-import Language.C.Data.Ident-import Language.C.Data.Node-import Language.C.Data.Position-import Data.Generics---- | Complete C tranlsation unit (C99 6.9, K&R A10)------ A complete C translation unit, for example representing a C header or source file.--- It consists of a list of external (i.e. toplevel) declarations.-data CTranslUnit = CTranslUnit [CExtDecl] NodeInfo- deriving (Data,Typeable {-! CNode !-})---- | External C declaration (C99 6.9, K&R A10)------ Either a toplevel declaration, function definition or external assembler.-data CExtDecl = CDeclExt CDecl- | CFDefExt CFunDef- | CAsmExt CStrLit- deriving (Data,Typeable {-! CNode !-})---- | C function definition (C99 6.9.1, K&R A10.1)------ A function definition is of the form @CFunDef specifiers declarator decllist? stmt@.------ * @specifiers@ are the type and storage-class specifiers of the function.--- The only storage-class specifiers allowed are /extern/ and /static/.------ * The @declarator@ must be such that the declared identifier has /function type/.--- The return type shall be void or an object type other than array type.------ * The optional declaration list @decllist@ is for old-style function declarations.------ * The statement @stmt@ is a compound statement.-data CFunDef = CFunDef [CDeclSpec] -- type specifier and qualifier- CDeclr -- declarator- [CDecl] -- optional declaration list- CStat -- compound statement- NodeInfo- deriving (Data,Typeable {-! CNode !-})---- | C declarations (K&R A8, C99 6.7), including structure declarations, parameter--- declarations and type names.------ A declaration is of the form @CDecl specifiers init-declarator-list@, where the form of the declarator list's--- elements depends on the kind of declaration:------ 1) Toplevel declarations (K&R A8, C99 6.7 declaration)------ * C99 requires that there is at least one specifier, though this is merely a syntactic restriction------ * at most one storage class specifier is allowed per declaration------ * the elements of the non-empty @init-declarator-list@ are of the form @(Just declr, init?, Nothing)@.--- The declarator @declr@ has to be present and non-abstract and the initialization expression is--- optional.------ 2) Structure declarations (K&R A8.3, C99 6.7.2.1 struct-declaration)------ Those are the declarations of a structure's members.------ * do not allow storage specifiers------ * in strict C99, the list of declarators has to be non-empty------ * the elements of @init-declarator-list@ are either of the form @(Just declr, Nothing, size?)@,--- representing a member with optional bit-field size, or of the form @(Nothing, Nothing, Just size)@,--- for unnamed bitfields. @declr@ has to be non-abstract.------ * no member of a structure shall have incomplete type------ 3) Parameter declarations (K&R A8.6.3, C99 6.7.5 parameter-declaration)------ * @init-declarator-list@ must contain at most one triple of the form @(Just declr, Nothing, Nothing)@,--- i.e. consist of a single declarator, which is allowed to be abstract (i.e. unnamed).------ 4) Type names (A8.8, C99 6.7.6)------ * do not allow storage specifiers------ * @init-declarator-list@ must contain at most one triple of the form @(Just declr, Nothing, Nothing)@.--- where @declr@ is an abstract declarator (i.e. doesn't contain a declared identifier)----data CDecl = CDecl [CDeclSpec] -- type specifier and qualifier, __attribute__- [(Maybe CDeclr, -- declarator (may be omitted)- Maybe CInit, -- optional initialize- Maybe CExpr)] -- optional size (const expr)- NodeInfo- deriving (Data,Typeable {-! CNode !-})---- | C declarator (K&R A8.5, C99 6.7.5) and abstract declarator (K&R A8.8, C99 6.7.6)------ A declarator declares a single object, function, or type. It is always associated with--- a declaration ('CDecl'), which specifies the declaration's type and the additional storage qualifiers and--- attributes, which apply to the declared object.------ A declarator is of the form @CDeclr name? indirections asm-name? attrs _@, where--- @name@ is the name of the declared object (missing for abstract declarators),--- @declquals@ is a set of additional declaration specifiers,--- @asm-name@ is the optional assembler name and attributes is a set of--- attrs is a set of @__attribute__@ annotations for the declared object.------ @indirections@ is a set of pointer, array and function declarators, which modify the type of the declared object as--- described below. If the /declaration/ specifies the non-derived type @T@,--- and we have @indirections = [D1, D2, ..., Dn]@ than the declared object has type--- @(D1 `indirect` (D2 `indirect` ... (Dn `indirect` T)))@, where------ * @(CPtrDeclr attrs) `indirect` T@ is /attributed pointer to T/------ * @(CFunDeclr attrs) `indirect` T@ is /attributed function returning T/------ * @(CArrayDeclr attrs) `indirect` T@ is /attributed array of elemements of type T/------ Examples (simplified attributes):------ * /x/ is an int------ > int x;--- > CDeclr "x" []------ * /x/ is a restrict pointer to a const pointer to int------ > const int * const * restrict x;--- > CDeclr "x" [CPtrDeclr [restrict], CPtrDeclr [const]]------ * /f/ is an function return a constant pointer to int------ > int* const f();--- > CDeclr "f" [CFunDeclr [],CPtrDeclr [const]]------ * /f/ is a constant pointer to a function returning int------ > int (* const f)(); ==>--- > CDeclr "f" [CPtrDeclr [const], CFunDeclr []]-data CDeclr = CDeclr (Maybe Ident) [CDerivedDeclr] (Maybe CStrLit) [CAttr] NodeInfo- deriving (Data,Typeable {-! CNode !-})---- | Derived declarators, see 'CDeclr'------ Indirections are qualified using type-qualifiers and generic attributes, and additionally------ * The size of an array is either a constant expression, variable length ('*') or missing; in the last case, the--- type of the array is incomplete. The qualifier static is allowed for function arguments only, indicating that--- the supplied argument is an array of at least the given size.------ * New style parameter lists have the form @Right (declarations, isVariadic)@, old style parameter lists have the--- form @Left (parameter-names)@-data CDerivedDeclr =- CPtrDeclr [CTypeQual] NodeInfo- -- ^ Pointer declarator @CPtrDeclr tyquals declr@- | CArrDeclr [CTypeQual] (CArrSize) NodeInfo- -- ^ Array declarator @CArrDeclr declr tyquals size-expr?@- | CFunDeclr (Either [Ident] ([CDecl],Bool)) [CAttr] NodeInfo- -- ^ Function declarator @CFunDeclr declr (old-style-params | new-style-params) c-attrs@- deriving (Data,Typeable {-! CNode !-})---- | Size of an array-data CArrSize = CNoArrSize Bool -- ^ @CUnknownSize isCompleteType@- | CArrSize Bool CExpr -- ^ @CArrSize isStatic expr@- deriving (Data,Typeable)---- | C statement (K&R A9, C99 6.8)----data CStat = CLabel Ident CStat [CAttr] NodeInfo -- ^ An (attributed) label followed by a statement- | CCase CExpr CStat NodeInfo -- ^ A statement of the form @case expr : stmt@- | CCases CExpr CExpr CStat NodeInfo -- ^ A case range of the form @case lower ... upper : stmt@- | CDefault CStat NodeInfo -- ^ The default case @default : stmt@- | CExpr (Maybe CExpr) NodeInfo- -- ^ A simple statement, that is in C: evaluating an expression with side-effects- -- and discarding the result.- | CCompound [Ident] [CBlockItem] NodeInfo -- ^ compound statement @CCompound localLabels blockItems at@- | CIf CExpr CStat (Maybe CStat) NodeInfo -- ^ conditional statement @CIf ifExpr thenStmt maybeElseStmt at@- | CSwitch CExpr CStat NodeInfo- -- ^ switch statement @CSwitch selectorExpr switchStmt@, where @switchStmt@ usually includes- -- /case/, /break/ and /default/ statements- | CWhile CExpr CStat Bool NodeInfo -- ^ while or do-while statement @CWhile guard stmt isDoWhile at@- | CFor (Either (Maybe CExpr) CDecl)- (Maybe CExpr)- (Maybe CExpr)- CStat- NodeInfo- -- ^ for statement @CFor init expr-2 expr-3 stmt@, where @init@ is either a declaration or- -- initializing expression- | CGoto Ident NodeInfo -- ^ goto statement @CGoto label@- | CGotoPtr CExpr NodeInfo -- ^ computed goto @CGotoPtr labelExpr@- | CCont NodeInfo -- ^ continue statement- | CBreak NodeInfo -- ^ break statement- | CReturn (Maybe CExpr)NodeInfo -- ^ return statement @CReturn returnExpr@- | CAsm CAsmStmt NodeInfo -- ^ assembly statement- deriving (Data,Typeable {-! CNode !-})---- | GNU Assembler statement------ > CAsmStatement type-qual? asm-expr out-ops in-ops clobbers _------ is an inline assembler statement.--- The only type-qualifier (if any) allowed is /volatile/.--- @asm-expr@ is the actual assembler epxression (a string), @out-ops@ and @in-ops@ are the input--- and output operands of the statement.--- @clobbers@ is a list of registers which are clobbered when executing the assembler statement-data CAsmStmt- = CAsmStmt (Maybe CTypeQual) -- maybe volatile- CStrLit -- assembler expression (String)- [CAsmOperand] -- output operands- [CAsmOperand] -- input operands- [CStrLit] -- Clobbers- NodeInfo- deriving (Data,Typeable {-! CNode !-})--- | Assembler operand------ @CAsmOperand argName? constraintExpr arg@ specifies an operand for an assembler--- statement.-data CAsmOperand = CAsmOperand (Maybe Ident) -- argument name- CStrLit -- constraint expr- CExpr -- argument- NodeInfo- deriving (Data,Typeable {-! CNode !-})--- | C99 Block items------ Things that may appear in compound statements: either statements, declarations--- or nested function definitions.-data CBlockItem = CBlockStmt CStat -- ^ A statement- | CBlockDecl CDecl -- ^ A local declaration- | CNestedFunDef CFunDef -- ^ A nested function (GNU C)- deriving (Data,Typeable {-! CNode !-})--- | C declaration specifiers and qualifiers------ Declaration specifiers include at most one storage-class specifier (C99 6.7.1),--- type specifiers (6.7.2) and type qualifiers (6.7.3).-data CDeclSpec = CStorageSpec CStorageSpec -- ^ storage-class specifier or typedef- | CTypeSpec CTypeSpec -- ^ type name- | CTypeQual CTypeQual -- ^ type qualifier- deriving (Data,Typeable {-! CNode !-})---- | Seperate the declaration specifiers------ Note that inline isn't actually a type qualifier, but a function specifier.--- @__attribute__@ of a declaration qualify declarations or declarators (but not types),--- and are therefore seperated as well.-partitionDeclSpecs :: [CDeclSpec] -> ([CStorageSpec], [CAttr], [CTypeQual], [CTypeSpec], Bool)-partitionDeclSpecs = foldr deals ([],[],[],[],False) where- deals (CTypeQual (CInlineQual _)) (sts,ats,tqs,tss,_) = (sts,ats,tqs,tss,True)- deals (CStorageSpec sp) (sts,ats,tqs,tss,inline) = (sp:sts,ats,tqs,tss,inline)- deals (CTypeQual (CAttrQual attr)) (sts,ats,tqs,tss,inline) = (sts,attr:ats,tqs,tss,inline)- deals (CTypeQual tq) (sts,ats,tqs,tss,inline) = (sts,ats,tq:tqs,tss,inline)- deals (CTypeSpec ts) (sts,ats,tqs,tss,inline) = (sts,ats,tqs,ts:tss,inline)---- | C storage class specifier (and typedefs) (K&R A8.1, C99 6.7.1)-data CStorageSpec = CAuto NodeInfo -- ^ auto- | CRegister NodeInfo -- ^ register- | CStatic NodeInfo -- ^ static- | CExtern NodeInfo -- ^ extern- | CTypedef NodeInfo -- ^ typedef- | CThread NodeInfo -- ^ GNUC thread local storage- deriving (Eq,Ord,Data,Typeable {-! CNode !-})---- Compatibility instance (will be removed) so we do not violate the PvP for 0.3.2-instance Show CStorageSpec where- show (CAuto _) = "auto"- show (CRegister _) = "register"- show (CStatic _) = "static"- show (CExtern _) = "extern"- show (CTypedef _) = "typedef"- show (CThread _) = "__thread"---- | C type specifier (K&R A8.2, C99 6.7.2)------ Type specifiers are either basic types such as @char@ or @int@,--- @struct@, @union@ or @enum@ specifiers or typedef names.------ As a GNU extension, a @typeof@ expression also is a type specifier.-data CTypeSpec = CVoidType NodeInfo- | CCharType NodeInfo- | CShortType NodeInfo- | CIntType NodeInfo- | CLongType NodeInfo- | CFloatType NodeInfo- | CDoubleType NodeInfo- | CSignedType NodeInfo- | CUnsigType NodeInfo- | CBoolType NodeInfo- | CComplexType NodeInfo- | CSUType CStructUnion NodeInfo -- ^ Struct or Union specifier- | CEnumType CEnum NodeInfo -- ^ Enumeration specifier- | CTypeDef Ident NodeInfo -- ^ Typedef name- | CTypeOfExpr CExpr NodeInfo -- ^ @typeof(expr)@- | CTypeOfType CDecl NodeInfo -- ^ @typeof(type)@- deriving (Data,Typeable {-! CNode !-})---- | returns @True@ if the given typespec is a struct, union or enum /definition/-isSUEDef :: CTypeSpec -> Bool-isSUEDef (CSUType (CStruct _ _ (Just _) _ _) _) = True-isSUEDef (CEnumType (CEnum _ (Just _) _ _) _) = True-isSUEDef _ = False---- | C type qualifiers (K&R A8.2, C99 6.7.3), function specifiers (C99 6.7.4), and attributes.------ @const@, @volatile@ and @restrict@ type qualifiers and @inline@ function specifier.--- Additionally, @__attribute__@ annotations for declarations and declarators.-data CTypeQual = CConstQual NodeInfo- | CVolatQual NodeInfo- | CRestrQual NodeInfo- | CInlineQual NodeInfo- | CAttrQual CAttr- deriving (Data,Typeable {-! CNode !-})---- | C structure or union specifiers (K&R A8.3, C99 6.7.2.1)------ @CStruct tag identifier struct-decls c-attrs@ represents a struct or union specifier (depending on @tag@).------ * either @identifier@ or the declaration list @struct-decls@ (or both) have to be present.------ Example: in @struct foo x;@, the identifier is present, in @struct { int y; } x@ the declaration list, and--- in @struct foo { int y; } x;@ both of them.------ * @c-attrs@ is a list of @__attribute__@ annotations associated with the struct or union specifier-data CStructUnion = CStruct CStructTag- (Maybe Ident)- (Maybe [CDecl]) -- member declarations- [CAttr] -- __attribute__s- NodeInfo- deriving (Data,Typeable {-! CNode !-})---- | A tag to determine wheter we refer to a @struct@ or @union@, see 'CStructUnion'.-data CStructTag = CStructTag- | CUnionTag- deriving (Eq,Data,Typeable)---- | C enumeration specifier (K&R A8.4, C99 6.7.2.2)------ @CEnum identifier enumerator-list attrs@ represent as enum specifier------ * Either the identifier or the enumerator-list (or both) have to be present.------ * If @enumerator-list@ is present, it has to be non-empty.------ * The enumerator list is of the form @(enumeration-constant, enumeration-value?)@, where the latter--- is an optional constant integral expression.------ * @attrs@ is a list of @__attribute__@ annotations associated with the enumeration specifier-data CEnum = CEnum (Maybe Ident)- (Maybe [(Ident, -- variant name- Maybe CExpr)]) -- explicit variant value- [CAttr] -- __attribute__s- NodeInfo- deriving (Data,Typeable {-! CNode !-})----- | C initialization (K&R A8.7, C99 6.7.8)------ Initializers are either assignment expressions or initializer lists--- (surrounded in curly braces), whose elements are themselves--- initializers, paired with an optional list of designators.-data CInit = CInitExpr CExpr- NodeInfo -- ^ assignment expression- | CInitList CInitList- NodeInfo -- ^ initialization list (see 'CInitList')- deriving (Data,Typeable {-! CNode !-})---- | Initializer List------ The members of an initializer list are of the form @(designator-list,initializer)@.--- The @designator-list@ specifies one member of the compound type which is initialized.--- It is allowed to be empty - in this case the initializer refers to the--- ''next'' member of the compound type (see C99 6.7.8).------ Examples (simplified expressions and identifiers):------ > -- int x[3][4] = { [0][3] = 4, [2] = 5, 8 };--- > -- corresponds to the assignments--- > -- x[0][3] = 4; x[2][0] = 5; x[2][1] = 8;--- > let init1 = ([CArrDesig 0, CArrDesig 3], CInitExpr 4)--- > init2 = ([CArrDesig 2] , CInitExpr 5)--- > init3 = ([] , CInitExpr 8)--- > in CInitList [init1, init2, init3]------ > -- struct { struct { int a[2]; int b[2]; int c[2]; } s; } x = { .s = { {2,3} , .c[0] = 1 } };--- > -- corresponds to the assignments--- > -- x.s.a[0] = 2; x.s.a[1] = 3; x.s.c[0] = 1;--- > let init_s_0 = CInitList [ ([], CInitExpr 2), ([], CInitExpr 3)]--- > init_s = CInitList [--- > ([], init_s_0),--- > ([CMemberDesig "c", CArrDesig 0], CInitExpr 1)--- > ]--- > in CInitList [(CMemberDesig "s", init_s)]-type CInitList = [([CDesignator], CInit)]---- | Designators------ A designator specifies a member of an object, either an element or range of an array,--- or the named member of a struct \/ union.-data CDesignator = CArrDesig CExpr- NodeInfo -- ^ array position designator- | CMemberDesig Ident- NodeInfo -- ^ member designator- | CRangeDesig CExpr- CExpr- NodeInfo -- ^ array range designator @CRangeDesig from to _@ (GNU C)- deriving (Data,Typeable {-! CNode !-})---- | @__attribute__@ annotations------ Those are of the form @CAttr attribute-name attribute-parameters@,--- and serve as generic properties of some syntax tree elements.-data CAttr = CAttr Ident [CExpr] NodeInfo- deriving (Data,Typeable {-! CNode !-})---- | C expression (K&R A7)------ * these can be arbitrary expression, as the argument of `sizeof' can be--- arbitrary, even if appearing in a constant expression------ * GNU C extensions: @alignof@, @__real@, @__imag@, @({ stmt-expr })@, @&& label@ and built-ins----data CExpr = CComma [CExpr] -- comma expression list, n >= 2- NodeInfo- | CAssign CAssignOp -- assignment operator- CExpr -- l-value- CExpr -- r-value- NodeInfo- | CCond CExpr -- conditional- (Maybe CExpr) -- true-expression (GNU allows omitting)- CExpr -- false-expression- NodeInfo- | CBinary CBinaryOp -- binary operator- CExpr -- lhs- CExpr -- rhs- NodeInfo- | CCast CDecl -- type name- CExpr- NodeInfo- | CUnary CUnaryOp -- unary operator- CExpr- NodeInfo- | CSizeofExpr CExpr- NodeInfo- | CSizeofType CDecl -- type name- NodeInfo- | CAlignofExpr CExpr- NodeInfo- | CAlignofType CDecl -- type name- NodeInfo- | CComplexReal CExpr -- real part of complex number- NodeInfo- | CComplexImag CExpr -- imaginary part of complex number- NodeInfo- | CIndex CExpr -- array- CExpr -- index- NodeInfo- | CCall CExpr -- function- [CExpr] -- arguments- NodeInfo- | CMember CExpr -- structure- Ident -- member name- Bool -- deref structure? (True for `->')- NodeInfo- | CVar Ident -- identifier (incl. enumeration const)- NodeInfo- | CConst CConst -- ^ integer, character, floating point and string constants- | CCompoundLit CDecl- CInitList -- type name & initialiser list- NodeInfo -- ^ C99 compound literal- | CStatExpr CStat NodeInfo -- ^ GNU C compound statement as expr- | CLabAddrExpr Ident NodeInfo -- ^ GNU C address of label- | CBuiltinExpr CBuiltin -- ^ builtin expressions, see 'CBuiltin'- deriving (Data,Typeable {-! CNode !-})----- | GNU Builtins, which cannot be typed in C99-data CBuiltin =- CBuiltinVaArg CExpr CDecl NodeInfo -- ^ @(expr, type)@- | CBuiltinOffsetOf CDecl [CDesignator] NodeInfo -- ^ @(type, designator-list)@- | CBuiltinTypesCompatible CDecl CDecl NodeInfo -- ^ @(type,type)@- deriving (Data,Typeable {-! CNode !-})---- | C constant (K&R A2.5 & A7.2)-data CConst = CIntConst CInteger NodeInfo- | CCharConst CChar NodeInfo- | CFloatConst CFloat NodeInfo- | CStrConst CString NodeInfo- deriving (Data,Typeable {-! CNode !-})---- | Attributed string literals-data CStrLit = CStrLit CString NodeInfo- deriving (Data,Typeable {-! CNode !-})--cstringOfLit :: CStrLit -> CString-cstringOfLit (CStrLit cstr _) = cstr---- | Lift a string literal to a C constant-liftStrLit :: CStrLit -> CConst-liftStrLit (CStrLit str at) = CStrConst str at--------------------------------------------------------------- DERIVES GENERATED CODE--- DO NOT MODIFY BELOW THIS LINE--- CHECKSUM: 1181183062--instance CNode CTranslUnit- where nodeInfo (CTranslUnit _ nodeinfo) = nodeinfo-instance Pos CTranslUnit- where posOf x = posOfNode (nodeInfo x)--instance CNode CExtDecl- where nodeInfo (CDeclExt d) = nodeInfo d- nodeInfo (CFDefExt d) = nodeInfo d- nodeInfo (CAsmExt d) = nodeInfo d-instance Pos CExtDecl- where posOf x = posOfNode (nodeInfo x)--instance CNode CFunDef- where nodeInfo (CFunDef _ _ _ _ nodeinfo) = nodeinfo-instance Pos CFunDef- where posOf x = posOfNode (nodeInfo x)--instance CNode CDecl- where nodeInfo (CDecl _ _ nodeinfo) = nodeinfo-instance Pos CDecl- where posOf x = posOfNode (nodeInfo x)--instance CNode CDeclr- where nodeInfo (CDeclr _ _ _ _ nodeinfo) = nodeinfo-instance Pos CDeclr- where posOf x = posOfNode (nodeInfo x)--instance CNode CDerivedDeclr- where nodeInfo (CPtrDeclr _ nodeinfo) = nodeinfo- nodeInfo (CArrDeclr _ _ nodeinfo) = nodeinfo- nodeInfo (CFunDeclr _ _ nodeinfo) = nodeinfo-instance Pos CDerivedDeclr- where posOf x = posOfNode (nodeInfo x)--instance CNode CStat- where nodeInfo (CLabel _ _ _ nodeinfo) = nodeinfo- nodeInfo (CCase _ _ nodeinfo) = nodeinfo- nodeInfo (CCases _ _ _ nodeinfo) = nodeinfo- nodeInfo (CDefault _ nodeinfo) = nodeinfo- nodeInfo (CExpr _ nodeinfo) = nodeinfo- nodeInfo (CCompound _ _ nodeinfo) = nodeinfo- nodeInfo (CIf _ _ _ nodeinfo) = nodeinfo- nodeInfo (CSwitch _ _ nodeinfo) = nodeinfo- nodeInfo (CWhile _ _ _ nodeinfo) = nodeinfo- nodeInfo (CFor _ _ _ _ nodeinfo) = nodeinfo- nodeInfo (CGoto _ nodeinfo) = nodeinfo- nodeInfo (CGotoPtr _ nodeinfo) = nodeinfo- nodeInfo (CCont nodeinfo) = nodeinfo- nodeInfo (CBreak nodeinfo) = nodeinfo- nodeInfo (CReturn _ nodeinfo) = nodeinfo- nodeInfo (CAsm _ nodeinfo) = nodeinfo-instance Pos CStat- where posOf x = posOfNode (nodeInfo x)--instance CNode CAsmStmt- where nodeInfo (CAsmStmt _ _ _ _ _ nodeinfo) = nodeinfo-instance Pos CAsmStmt- where posOf x = posOfNode (nodeInfo x)--instance CNode CAsmOperand- where nodeInfo (CAsmOperand _ _ _ nodeinfo) = nodeinfo-instance Pos CAsmOperand- where posOf x = posOfNode (nodeInfo x)--instance CNode CBlockItem- where nodeInfo (CBlockStmt d) = nodeInfo d- nodeInfo (CBlockDecl d) = nodeInfo d- nodeInfo (CNestedFunDef d) = nodeInfo d-instance Pos CBlockItem- where posOf x = posOfNode (nodeInfo x)--instance CNode CDeclSpec- where nodeInfo (CStorageSpec d) = nodeInfo d- nodeInfo (CTypeSpec d) = nodeInfo d- nodeInfo (CTypeQual d) = nodeInfo d-instance Pos CDeclSpec- where posOf x = posOfNode (nodeInfo x)--instance CNode CStorageSpec- where nodeInfo (CAuto nodeinfo) = nodeinfo- nodeInfo (CRegister nodeinfo) = nodeinfo- nodeInfo (CStatic nodeinfo) = nodeinfo- nodeInfo (CExtern nodeinfo) = nodeinfo- nodeInfo (CTypedef nodeinfo) = nodeinfo- nodeInfo (CThread nodeinfo) = nodeinfo-instance Pos CStorageSpec- where posOf x = posOfNode (nodeInfo x)--instance CNode CTypeSpec- where nodeInfo (CVoidType nodeinfo) = nodeinfo- nodeInfo (CCharType nodeinfo) = nodeinfo- nodeInfo (CShortType nodeinfo) = nodeinfo- nodeInfo (CIntType nodeinfo) = nodeinfo- nodeInfo (CLongType nodeinfo) = nodeinfo- nodeInfo (CFloatType nodeinfo) = nodeinfo- nodeInfo (CDoubleType nodeinfo) = nodeinfo- nodeInfo (CSignedType nodeinfo) = nodeinfo- nodeInfo (CUnsigType nodeinfo) = nodeinfo- nodeInfo (CBoolType nodeinfo) = nodeinfo- nodeInfo (CComplexType nodeinfo) = nodeinfo- nodeInfo (CSUType _ nodeinfo) = nodeinfo- nodeInfo (CEnumType _ nodeinfo) = nodeinfo- nodeInfo (CTypeDef _ nodeinfo) = nodeinfo- nodeInfo (CTypeOfExpr _ nodeinfo) = nodeinfo- nodeInfo (CTypeOfType _ nodeinfo) = nodeinfo-instance Pos CTypeSpec- where posOf x = posOfNode (nodeInfo x)--instance CNode CTypeQual- where nodeInfo (CConstQual nodeinfo) = nodeinfo- nodeInfo (CVolatQual nodeinfo) = nodeinfo- nodeInfo (CRestrQual nodeinfo) = nodeinfo- nodeInfo (CInlineQual nodeinfo) = nodeinfo- nodeInfo (CAttrQual d) = nodeInfo d-instance Pos CTypeQual- where posOf x = posOfNode (nodeInfo x)--instance CNode CStructUnion- where nodeInfo (CStruct _ _ _ _ nodeinfo) = nodeinfo-instance Pos CStructUnion- where posOf x = posOfNode (nodeInfo x)--instance CNode CEnum- where nodeInfo (CEnum _ _ _ nodeinfo) = nodeinfo-instance Pos CEnum- where posOf x = posOfNode (nodeInfo x)--instance CNode CInit- where nodeInfo (CInitExpr _ nodeinfo) = nodeinfo- nodeInfo (CInitList _ nodeinfo) = nodeinfo-instance Pos CInit- where posOf x = posOfNode (nodeInfo x)--instance CNode CDesignator- where nodeInfo (CArrDesig _ nodeinfo) = nodeinfo- nodeInfo (CMemberDesig _ nodeinfo) = nodeinfo- nodeInfo (CRangeDesig _ _ nodeinfo) = nodeinfo-instance Pos CDesignator- where posOf x = posOfNode (nodeInfo x)--instance CNode CAttr- where nodeInfo (CAttr _ _ nodeinfo) = nodeinfo-instance Pos CAttr- where posOf x = posOfNode (nodeInfo x)--instance CNode CExpr- where nodeInfo (CComma _ nodeinfo) = nodeinfo- nodeInfo (CAssign _ _ _ nodeinfo) = nodeinfo- nodeInfo (CCond _ _ _ nodeinfo) = nodeinfo- nodeInfo (CBinary _ _ _ nodeinfo) = nodeinfo- nodeInfo (CCast _ _ nodeinfo) = nodeinfo- nodeInfo (CUnary _ _ nodeinfo) = nodeinfo- nodeInfo (CSizeofExpr _ nodeinfo) = nodeinfo- nodeInfo (CSizeofType _ nodeinfo) = nodeinfo- nodeInfo (CAlignofExpr _ nodeinfo) = nodeinfo- nodeInfo (CAlignofType _ nodeinfo) = nodeinfo- nodeInfo (CComplexReal _ nodeinfo) = nodeinfo- nodeInfo (CComplexImag _ nodeinfo) = nodeinfo- nodeInfo (CIndex _ _ nodeinfo) = nodeinfo- nodeInfo (CCall _ _ nodeinfo) = nodeinfo- nodeInfo (CMember _ _ _ nodeinfo) = nodeinfo- nodeInfo (CVar _ nodeinfo) = nodeinfo- nodeInfo (CConst d) = nodeInfo d- nodeInfo (CCompoundLit _ _ nodeinfo) = nodeinfo- nodeInfo (CStatExpr _ nodeinfo) = nodeinfo- nodeInfo (CLabAddrExpr _ nodeinfo) = nodeinfo- nodeInfo (CBuiltinExpr d) = nodeInfo d-instance Pos CExpr- where posOf x = posOfNode (nodeInfo x)--instance CNode CBuiltin- where nodeInfo (CBuiltinVaArg _ _ nodeinfo) = nodeinfo- nodeInfo (CBuiltinOffsetOf _ _ nodeinfo) = nodeinfo- nodeInfo (CBuiltinTypesCompatible _ _ nodeinfo) = nodeinfo-instance Pos CBuiltin- where posOf x = posOfNode (nodeInfo x)--instance CNode CConst- where nodeInfo (CIntConst _ nodeinfo) = nodeinfo- nodeInfo (CCharConst _ nodeinfo) = nodeinfo- nodeInfo (CFloatConst _ nodeinfo) = nodeinfo- nodeInfo (CStrConst _ nodeinfo) = nodeinfo-instance Pos CConst- where posOf x = posOfNode (nodeInfo x)--instance CNode CStrLit- where nodeInfo (CStrLit _ nodeinfo) = nodeinfo-instance Pos CStrLit- where posOf x = posOfNode (nodeInfo x)+{-# LANGUAGE TypeSynonymInstances #-}+-----------------------------------------------------------------------------+-- |+-- Module : Language.C.Syntax.AST+-- Copyright : (c) [1999..2007] Manuel M T Chakravarty+-- (c) 2008 Benedikt Huber+-- License : BSD-style+-- Maintainer : benedikt.huber@gmail.com+-- Stability : experimental+-- Portability : ghc+--+-- Abstract syntax of C source and header files.+--+-- The tree structure is based on the grammar in Appendix A of K&R. The+-- abstract syntax simplifies the concrete syntax by merging similar concrete+-- constructs into a single type of abstract tree structure: declarations are+-- merged with structure declarations, parameter declarations and type names,+-- and declarators are merged with abstract declarators.+--+-- With K&R we refer to ``The C Programming Language'', second edition, Brain+-- W. Kernighan and Dennis M. Ritchie, Prentice Hall, 1988. The AST supports all+-- of C99 <http://www.open-std.org/JTC1/SC22/WG14/www/docs/n1256.pdf> and several+-- GNU extensions <http://gcc.gnu.org/onlinedocs/gcc/C-Extensions.html>.+-----------------------------------------------------------------------------+module Language.C.Syntax.AST (+ -- * C translation units+ CTranslUnit, CExtDecl,+ CTranslationUnit(..), CExternalDeclaration(..),+ -- * Declarations+ CFunDef, CDecl, CStructUnion, CEnum,+ CFunctionDef(..), CDeclaration(..),+ CStructTag(..), CStructureUnion(..), CEnumeration(..),+ -- * Declaration attributes+ CDeclSpec, partitionDeclSpecs,+ CStorageSpec, CTypeSpec, isSUEDef, CTypeQual, CFunSpec, CAlignSpec, CAttr,+ CFunctionSpecifier(..), CDeclarationSpecifier(..), CStorageSpecifier(..), CTypeSpecifier(..),+ CAlignmentSpecifier(..),+ CTypeQualifier(..), CAttribute(..),+ -- * Declarators+ CDeclr,CDerivedDeclr,CArrSize,+ CDeclarator(..), CDerivedDeclarator(..), CArraySize(..),+ -- * Initialization+ CInit, CInitList, CDesignator,+ CInitializer(..), CInitializerList, CPartDesignator(..),+ -- * Statements+ CStat, CBlockItem, CAsmStmt, CAsmOperand,+ CStatement(..), CCompoundBlockItem(..),+ CAssemblyStatement(..), CAssemblyOperand(..),+ -- * Expressions+ CExpr, CExpression(..),+ CAssignOp(..), CBinaryOp(..), CUnaryOp(..),+ CBuiltin, CBuiltinThing(..),+ -- * Constants+ CConst, CStrLit, cstringOfLit, liftStrLit,+ CConstant(..), CStringLiteral(..),+ -- * Annoated type class+ Annotated(..)+) where+import Language.C.Syntax.Constants+import Language.C.Syntax.Ops+import Language.C.Data.Ident+import Language.C.Data.Node+import Language.C.Data.Position+import Data.Data (Data)+import GHC.Generics (Generic, Generic1)+import Control.DeepSeq (NFData)++-- | Complete C tranlsation unit (C99 6.9, K&R A10)+--+-- A complete C translation unit, for example representing a C header or source file.+-- It consists of a list of external (i.e. toplevel) declarations.+type CTranslUnit = CTranslationUnit NodeInfo+data CTranslationUnit a+ = CTranslUnit [CExternalDeclaration a] a+ deriving (Show, Data, Generic, Generic1 {-! ,CNode ,Functor, Annotated !-})++instance NFData a => NFData (CTranslationUnit a)++-- | External C declaration (C99 6.9, K&R A10)+--+-- Either a toplevel declaration, function definition or external assembler.+type CExtDecl = CExternalDeclaration NodeInfo+data CExternalDeclaration a+ = CDeclExt (CDeclaration a)+ | CFDefExt (CFunctionDef a)+ | CAsmExt (CStringLiteral a) a+ deriving (Show, Data, Generic, Generic1 {-! ,CNode ,Functor, Annotated !-})++instance NFData a => NFData (CExternalDeclaration a)++-- | C function definition (C99 6.9.1, K&R A10.1)+--+-- A function definition is of the form @CFunDef specifiers declarator decllist? stmt@.+--+-- * @specifiers@ are the type and storage-class specifiers of the function.+-- The only storage-class specifiers allowed are /extern/ and /static/.+--+-- * The @declarator@ must be such that the declared identifier has /function type/.+-- The return type shall be void or an object type other than array type.+--+-- * The optional declaration list @decllist@ is for old-style function declarations.+--+-- * The statement @stmt@ is a compound statement.+type CFunDef = CFunctionDef NodeInfo+data CFunctionDef a+ = CFunDef+ [CDeclarationSpecifier a] -- type specifier and qualifier+ (CDeclarator a) -- declarator+ [CDeclaration a] -- optional declaration list+ (CStatement a) -- compound statement+ a+ deriving (Show, Data, Generic, Generic1 {-! ,CNode ,Functor ,Annotated !-})++instance NFData a => NFData (CFunctionDef a)++-- | C declarations (K&R A8, C99 6.7), including structure declarations, parameter+-- declarations and type names.+--+-- A declaration is of the form @CDecl specifiers init-declarator-list@, where the form of the declarator list's+-- elements depends on the kind of declaration:+--+-- 1) Toplevel declarations (K&R A8, C99 6.7 declaration)+--+-- * C99 requires that there is at least one specifier, though this is merely a syntactic restriction+--+-- * at most one storage class specifier is allowed per declaration+--+-- * the elements of the non-empty @init-declarator-list@ are of the form @(Just declr, init?, Nothing)@.+-- The declarator @declr@ has to be present and non-abstract and the initialization expression is+-- optional.+--+-- 2) Structure declarations (K&R A8.3, C99 6.7.2.1 struct-declaration)+--+-- Those are the declarations of a structure's members.+--+-- * do not allow storage specifiers+--+-- * in strict C99, the list of declarators has to be non-empty+--+-- * the elements of @init-declarator-list@ are either of the form @(Just declr, Nothing, size?)@,+-- representing a member with optional bit-field size, or of the form @(Nothing, Nothing, Just size)@,+-- for unnamed bitfields. @declr@ has to be non-abstract.+--+-- * no member of a structure shall have incomplete type+--+-- 3) Parameter declarations (K&R A8.6.3, C99 6.7.5 parameter-declaration)+--+-- * @init-declarator-list@ must contain at most one triple of the form @(Just declr, Nothing, Nothing)@,+-- i.e. consist of a single declarator, which is allowed to be abstract (i.e. unnamed).+--+-- 4) Type names (A8.8, C99 6.7.6)+--+-- * do not allow storage specifiers+--+-- * @init-declarator-list@ must contain at most one triple of the form @(Just declr, Nothing, Nothing)@.+-- where @declr@ is an abstract declarator (i.e. doesn't contain a declared identifier)+--+type CDecl = CDeclaration NodeInfo+data CDeclaration a+ = CDecl+ [CDeclarationSpecifier a] -- type specifier and qualifier, __attribute__+ [(Maybe (CDeclarator a), -- declarator (may be omitted)+ Maybe (CInitializer a), -- optional initialize+ Maybe (CExpression a))] -- optional size (const expr)+ a -- annotation+ | CStaticAssert+ (CExpression a) -- assert expression+ (CStringLiteral a) -- assert text+ a -- annotation+ deriving (Show, Data, Generic {-! ,CNode ,Annotated !-})++instance NFData a => NFData (CDeclaration a)++-- Derive instance is a little bit ugly+instance Functor CDeclaration where+ fmap f (CDecl specs declarators annot) =+ CDecl (map (fmap f) specs) (map fmap3m declarators) (f annot)+ where fmap3m (a,b,c) = (fmap (fmap f) a, fmap (fmap f) b, fmap (fmap f) c)+ fmap f (CStaticAssert expression strlit annot) =+ CStaticAssert (fmap f expression) (fmap f strlit) (f annot)++-- | C declarator (K&R A8.5, C99 6.7.5) and abstract declarator (K&R A8.8, C99 6.7.6)+--+-- A declarator declares a single object, function, or type. It is always associated with+-- a declaration ('CDecl'), which specifies the declaration's type and the additional storage qualifiers and+-- attributes, which apply to the declared object.+--+-- A declarator is of the form @CDeclr name? indirections asm-name? attrs _@, where+-- @name@ is the name of the declared object (missing for abstract declarators),+-- @declquals@ is a set of additional declaration specifiers,+-- @asm-name@ is the optional assembler name and attributes is a set of+-- attrs is a set of @__attribute__@ annotations for the declared object.+--+-- @indirections@ is a set of pointer, array and function declarators, which modify the type of the declared object as+-- described below. If the /declaration/ specifies the non-derived type @T@,+-- and we have @indirections = [D1, D2, ..., Dn]@ than the declared object has type+-- @(D1 `indirect` (D2 `indirect` ... (Dn `indirect` T)))@, where+--+-- * @(CPtrDeclr attrs) `indirect` T@ is /attributed pointer to T/+--+-- * @(CFunDeclr attrs) `indirect` T@ is /attributed function returning T/+--+-- * @(CArrayDeclr attrs) `indirect` T@ is /attributed array of elemements of type T/+--+-- Examples (simplified attributes):+--+-- * /x/ is an int+--+-- > int x;+-- > CDeclr "x" []+--+-- * /x/ is a restrict pointer to a const pointer to int+--+-- > const int * const * restrict x;+-- > CDeclr "x" [CPtrDeclr [restrict], CPtrDeclr [const]]+--+-- * /f/ is an function return a constant pointer to int+--+-- > int* const f();+-- > CDeclr "f" [CFunDeclr [],CPtrDeclr [const]]+--+-- * /f/ is a constant pointer to a function returning int+--+-- > int (* const f)(); ==>+-- > CDeclr "f" [CPtrDeclr [const], CFunDeclr []]+type CDeclr = CDeclarator NodeInfo+data CDeclarator a+ = CDeclr (Maybe Ident) [CDerivedDeclarator a] (Maybe (CStringLiteral a)) [CAttribute a] a+ deriving (Show, Data, Generic, Generic1 {-! ,CNode ,Functor ,Annotated !-})++instance NFData a => NFData (CDeclarator a)+++-- | Derived declarators, see 'CDeclr'+--+-- Indirections are qualified using type-qualifiers and generic attributes, and additionally+--+-- * The size of an array is either a constant expression, variable length ('*') or missing; in the last case, the+-- type of the array is incomplete. The qualifier static is allowed for function arguments only, indicating that+-- the supplied argument is an array of at least the given size.+--+-- * New style parameter lists have the form @Right (declarations, isVariadic)@, old style parameter lists have the+-- form @Left (parameter-names)@+type CDerivedDeclr = CDerivedDeclarator NodeInfo+data CDerivedDeclarator a+ = CPtrDeclr [CTypeQualifier a] a+ -- ^ Pointer declarator @CPtrDeclr tyquals declr@+ | CArrDeclr [CTypeQualifier a] (CArraySize a) a+ -- ^ Array declarator @CArrDeclr declr tyquals size-expr?@+ | CFunDeclr (Either [Ident] ([CDeclaration a],Bool)) [CAttribute a] a+ -- ^ Function declarator @CFunDeclr declr (old-style-params | new-style-params) c-attrs@+ deriving (Show, Data, Generic {-! ,CNode , Annotated !-})++instance NFData a => NFData (CDerivedDeclarator a)++-- Derived instance relies on fmap2+instance Functor CDerivedDeclarator where+ fmap _f (CPtrDeclr a1 a2) = CPtrDeclr (fmap (fmap _f) a1) (_f a2)+ fmap _f (CArrDeclr a1 a2 a3)+ = CArrDeclr (fmap (fmap _f) a1) (fmap _f a2) (_f a3)+ fmap _f (CFunDeclr a1 a2 a3)+ = CFunDeclr (fmap (fmapFirst (fmap (fmap _f))) a1) (fmap (fmap _f) a2)+ (_f a3)+ where fmapFirst f (a,b) = (f a, b)++-- | Size of an array+type CArrSize = CArraySize NodeInfo+data CArraySize a+ = CNoArrSize Bool -- ^ @CUnknownSize isCompleteType@+ | CArrSize Bool (CExpression a) -- ^ @CArrSize isStatic expr@+ deriving (Show, Data, Generic, Generic1 {-! , Functor !-})++instance NFData a => NFData (CArraySize a)++-- | C statement (K&R A9, C99 6.8)+--+type CStat = CStatement NodeInfo+data CStatement a+ -- | An (attributed) label followed by a statement+ = CLabel Ident (CStatement a) [CAttribute a] a+ -- | A statement of the form @case expr : stmt@+ | CCase (CExpression a) (CStatement a) a+ -- | A case range of the form @case lower ... upper : stmt@+ | CCases (CExpression a) (CExpression a) (CStatement a) a+ -- | The default case @default : stmt@+ | CDefault (CStatement a) a+ -- | A simple statement, that is in C: evaluating an expression with+ -- side-effects and discarding the result.+ | CExpr (Maybe (CExpression a)) a+ -- | compound statement @CCompound localLabels blockItems at@+ | CCompound [Ident] [CCompoundBlockItem a] a+ -- | conditional statement @CIf ifExpr thenStmt maybeElseStmt at@+ | CIf (CExpression a) (CStatement a) (Maybe (CStatement a)) a+ -- | switch statement @CSwitch selectorExpr switchStmt@, where+ -- @switchStmt@ usually includes /case/, /break/ and /default/+ -- statements+ | CSwitch (CExpression a) (CStatement a) a+ -- | while or do-while statement @CWhile guard stmt isDoWhile at@+ | CWhile (CExpression a) (CStatement a) Bool a+ -- | for statement @CFor init expr-2 expr-3 stmt@, where @init@ is+ -- either a declaration or initializing expression+ | CFor (Either (Maybe (CExpression a)) (CDeclaration a))+ (Maybe (CExpression a))+ (Maybe (CExpression a))+ (CStatement a)+ a+ -- | goto statement @CGoto label@+ | CGoto Ident a+ -- | computed goto @CGotoPtr labelExpr@+ | CGotoPtr (CExpression a) a+ -- | continue statement+ | CCont a+ -- | break statement+ | CBreak a+ -- | return statement @CReturn returnExpr@+ | CReturn (Maybe (CExpression a)) a+ -- | assembly statement+ | CAsm (CAssemblyStatement a) a+ deriving (Show, Data, Generic {-! , CNode , Annotated !-})++instance NFData a => NFData (CStatement a)++-- Derived instance relies on fmap2 :(+instance Functor CStatement where+ fmap _f (CLabel a1 a2 a3 a4)+ = CLabel a1 (fmap _f a2) (fmap (fmap _f) a3) (_f a4)+ fmap _f (CCase a1 a2 a3) = CCase (fmap _f a1) (fmap _f a2) (_f a3)+ fmap _f (CCases a1 a2 a3 a4)+ = CCases (fmap _f a1) (fmap _f a2) (fmap _f a3) (_f a4)+ fmap _f (CDefault a1 a2) = CDefault (fmap _f a1) (_f a2)+ fmap _f (CExpr a1 a2) = CExpr (fmap (fmap _f) a1) (_f a2)+ fmap _f (CCompound a1 a2 a3)+ = CCompound a1 (fmap (fmap _f) a2) (_f a3)+ fmap _f (CIf a1 a2 a3 a4)+ = CIf (fmap _f a1) (fmap _f a2) (fmap (fmap _f) a3) (_f a4)+ fmap _f (CSwitch a1 a2 a3)+ = CSwitch (fmap _f a1) (fmap _f a2) (_f a3)+ fmap _f (CWhile a1 a2 a3 a4)+ = CWhile (fmap _f a1) (fmap _f a2) a3 (_f a4)+ fmap _f (CFor a1 a2 a3 a4 a5)+ = CFor (mapEither (fmap (fmap _f)) (fmap _f) a1)+ (fmap (fmap _f) a2) (fmap (fmap _f) a3) (fmap _f a4)+ (_f a5)+ where mapEither f1 f2 = either (Left . f1) (Right . f2)+ fmap _f (CGoto a1 a2) = CGoto a1 (_f a2)+ fmap _f (CGotoPtr a1 a2) = CGotoPtr (fmap _f a1) (_f a2)+ fmap _f (CCont a1) = CCont (_f a1)+ fmap _f (CBreak a1) = CBreak (_f a1)+ fmap _f (CReturn a1 a2) = CReturn (fmap (fmap _f) a1) (_f a2)+ fmap _f (CAsm a1 a2) = CAsm (fmap _f a1) (_f a2)++-- | GNU Assembler statement+--+-- > CAssemblyStatement type-qual? asm-expr out-ops in-ops clobbers _+--+-- is an inline assembler statement.+-- The only type-qualifier (if any) allowed is /volatile/.+-- @asm-expr@ is the actual assembler epxression (a string), @out-ops@ and @in-ops@ are the input+-- and output operands of the statement.+-- @clobbers@ is a list of registers which are clobbered when executing the assembler statement+type CAsmStmt = CAssemblyStatement NodeInfo+data CAssemblyStatement a+ = CAsmStmt+ (Maybe (CTypeQualifier a)) -- maybe volatile+ (CStringLiteral a) -- assembler expression (String)+ [CAssemblyOperand a] -- output operands+ [CAssemblyOperand a] -- input operands+ [CStringLiteral a] -- Clobbers+ a+ deriving (Show, Data, Generic, Generic1 {-! ,CNode ,Functor ,Annotated !-})++instance NFData a => NFData (CAssemblyStatement a)++-- | Assembler operand+--+-- @CAsmOperand argName? constraintExpr arg@ specifies an operand for an assembler+-- statement.+type CAsmOperand = CAssemblyOperand NodeInfo+data CAssemblyOperand a+ = CAsmOperand+ (Maybe Ident) -- argument name+ (CStringLiteral a) -- constraint expr+ (CExpression a) -- argument+ a+ deriving (Show, Data, Generic, Generic1 {-! ,CNode ,Functor ,Annotated !-})++instance NFData a => NFData (CAssemblyOperand a)++-- | C99 Block items+--+-- Things that may appear in compound statements: either statements, declarations+-- or nested function definitions.+type CBlockItem = CCompoundBlockItem NodeInfo+data CCompoundBlockItem a+ = CBlockStmt (CStatement a) -- ^ A statement+ | CBlockDecl (CDeclaration a) -- ^ A local declaration+ | CNestedFunDef (CFunctionDef a) -- ^ A nested function (GNU C)+ deriving (Show, Data, Generic, Generic1 {-! , CNode , Functor, Annotated !-})++instance NFData a => NFData (CCompoundBlockItem a)++-- | C declaration specifiers and qualifiers+--+-- Declaration specifiers include at most one storage-class specifier (C99 6.7.1),+-- type specifiers (6.7.2) and type qualifiers (6.7.3).+type CDeclSpec = CDeclarationSpecifier NodeInfo+data CDeclarationSpecifier a+ = CStorageSpec (CStorageSpecifier a) -- ^ storage-class specifier or typedef+ | CTypeSpec (CTypeSpecifier a) -- ^ type name+ | CTypeQual (CTypeQualifier a) -- ^ type qualifier+ | CFunSpec (CFunctionSpecifier a) -- ^ function specifier+ | CAlignSpec (CAlignmentSpecifier a) -- ^ alignment specifier+ deriving (Show, Data, Generic, Generic1 {-! ,CNode ,Functor, Annotated !-})++instance NFData a => NFData (CDeclarationSpecifier a)++-- | Separate the declaration specifiers+--+-- @__attribute__@ of a declaration qualify declarations or declarators (but not types),+-- and are therefore separated as well.+partitionDeclSpecs :: [CDeclarationSpecifier a]+ -> ( [CStorageSpecifier a], [CAttribute a]+ , [CTypeQualifier a], [CTypeSpecifier a]+ , [CFunctionSpecifier a], [CAlignmentSpecifier a])+partitionDeclSpecs = foldr deals ([],[],[],[],[],[]) where+ deals (CStorageSpec sp) (sts,ats,tqs,tss,fss,ass) = (sp:sts,ats,tqs,tss,fss,ass)+ deals (CTypeQual (CAttrQual attr)) (sts,ats,tqs,tss,fss,ass) = (sts,attr:ats,tqs,tss,fss,ass)+ deals (CTypeQual tq) (sts,ats,tqs,tss,fss,ass) = (sts,ats,tq:tqs,tss,fss,ass)+ deals (CTypeSpec ts) (sts,ats,tqs,tss,fss,ass) = (sts,ats,tqs,ts:tss,fss,ass)+ deals (CFunSpec fs) (sts,ats,tqs,tss,fss,ass) = (sts,ats,tqs,tss,fs:fss,ass)+ deals (CAlignSpec as) (sts,ats,tqs,tss,fss,ass) = (sts,ats,tqs,tss,fss,as:ass)++-- | C storage class specifier (and typedefs) (K&R A8.1, C99 6.7.1)+type CStorageSpec = CStorageSpecifier NodeInfo+data CStorageSpecifier a+ = CAuto a -- ^ auto+ | CRegister a -- ^ register+ | CStatic a -- ^ static+ | CExtern a -- ^ extern+ | CTypedef a -- ^ typedef+ | CThread a -- ^ C11/GNUC thread local storage+ | CClKernel a -- ^ OpenCL kernel function+ | CClGlobal a -- ^ OpenCL __global variable+ | CClLocal a -- ^ OpenCL __local variable+ deriving (Show, Eq,Ord,Data, Generic, Generic1 {-! ,CNode ,Functor ,Annotated !-})++instance NFData a => NFData (CStorageSpecifier a)++-- | C type specifier (K&R A8.2, C99 6.7.2)+--+-- Type specifiers are either basic types such as @char@ or @int@,+-- @struct@, @union@ or @enum@ specifiers or typedef names.+--+-- As a GNU extension, a @typeof@ expression also is a type specifier.+type CTypeSpec = CTypeSpecifier NodeInfo+data CTypeSpecifier a+ = CVoidType a+ | CCharType a+ | CShortType a+ | CIntType a+ | CLongType a+ | CFloatType a+ | CDoubleType a+ | CSignedType a+ | CUnsigType a+ | CBoolType a+ | CComplexType a+ | CInt128Type a+ | CUInt128Type a+ | CBFloat16Type a+ | CFloatNType Int Bool a -- ^ IEC 60227: width (32,64,128), extended flag+ | CSUType (CStructureUnion a) a -- ^ Struct or Union specifier+ | CEnumType (CEnumeration a) a -- ^ Enumeration specifier+ | CTypeDef Ident a -- ^ Typedef name+ | CTypeOfExpr (CExpression a) a -- ^ @typeof(expr)@+ | CTypeOfType (CDeclaration a) a -- ^ @typeof(type)@+ | CAtomicType (CDeclaration a) a -- ^ @_Atomic(type)@+ deriving (Show, Data, Generic, Generic1 {-! ,CNode ,Functor ,Annotated !-})++instance NFData a => NFData (CTypeSpecifier a)++-- | returns @True@ if the given typespec is a struct, union or enum /definition/+isSUEDef :: CTypeSpecifier a -> Bool+isSUEDef (CSUType (CStruct _ _ (Just _) _ _) _) = True+isSUEDef (CEnumType (CEnum _ (Just _) _ _) _) = True+isSUEDef _ = False++-- | C type qualifiers (K&R A8.2, C99 6.7.3) and attributes.+--+-- @const@, @volatile@ and @restrict@ type qualifiers+-- Additionally, @__attribute__@ annotations for declarations and declarators, and+-- function specifiers+type CTypeQual = CTypeQualifier NodeInfo+data CTypeQualifier a+ = CConstQual a+ | CVolatQual a+ | CRestrQual a+ | CAtomicQual a+ | CAttrQual (CAttribute a)+ | CNullableQual a+ | CNonnullQual a+ | CClRdOnlyQual a+ | CClWrOnlyQual a+ deriving (Show, Data, Generic, Generic1 {-! ,CNode ,Functor ,Annotated !-})++instance NFData a => NFData (CTypeQualifier a)++-- | C function specifiers (C99 6.7.4)+--+-- function specifiers @inline@ and @_Noreturn@+type CFunSpec = CFunctionSpecifier NodeInfo+data CFunctionSpecifier a+ = CInlineQual a+ | CNoreturnQual a+ deriving (Show, Data, Generic, Generic1 {-! ,CNode ,Functor ,Annotated !-})++instance NFData a => NFData (CFunctionSpecifier a)++-- | C alignment specifiers (C99 6.7.5)+--+type CAlignSpec = CAlignmentSpecifier NodeInfo+data CAlignmentSpecifier a+ = CAlignAsType (CDeclaration a) a -- ^ @_Alignas(type)@+ | CAlignAsExpr (CExpression a) a -- ^ @_Alignas(expr)@+ deriving (Show, Data, Generic, Generic1 {-! ,CNode ,Functor ,Annotated !-})++instance NFData a => NFData (CAlignmentSpecifier a)++-- | C structure or union specifiers (K&R A8.3, C99 6.7.2.1)+--+-- @CStruct tag identifier struct-decls c-attrs@ represents a struct or union specifier (depending on @tag@).+--+-- * either @identifier@ or the declaration list @struct-decls@ (or both) have to be present.+--+-- Example: in @struct foo x;@, the identifier is present, in @struct { int y; } x@ the declaration list, and+-- in @struct foo { int y; } x;@ both of them.+--+-- * @c-attrs@ is a list of @__attribute__@ annotations associated with the struct or union specifier+type CStructUnion = CStructureUnion NodeInfo+data CStructureUnion a+ = CStruct+ CStructTag+ (Maybe Ident)+ (Maybe [CDeclaration a]) -- member declarations+ [CAttribute a] -- __attribute__s+ a+ deriving (Show, Data, Generic, Generic1 {-! ,CNode ,Functor ,Annotated !-})++instance NFData a => NFData (CStructureUnion a)++-- | A tag to determine wheter we refer to a @struct@ or @union@, see 'CStructUnion'.+data CStructTag = CStructTag+ | CUnionTag+ deriving (Show, Eq,Data, Generic)++instance NFData CStructTag++-- | C enumeration specifier (K&R A8.4, C99 6.7.2.2)+--+-- @CEnum identifier enumerator-list attrs@ represent as enum specifier+--+-- * Either the identifier or the enumerator-list (or both) have to be present.+--+-- * If @enumerator-list@ is present, it has to be non-empty.+--+-- * The enumerator list is of the form @(enumeration-constant, enumeration-value?)@, where the latter+-- is an optional constant integral expression.+--+-- * @attrs@ is a list of @__attribute__@ annotations associated with the enumeration specifier+type CEnum = CEnumeration NodeInfo+data CEnumeration a+ = CEnum+ (Maybe Ident)+ (Maybe [(Ident, -- variant name+ Maybe (CExpression a))]) -- explicit variant value+ [CAttribute a] -- __attribute__s+ a+ deriving (Show, Data, Generic, Generic1 {-! ,CNode ,Functor ,Annotated !-})++instance NFData a => NFData (CEnumeration a)++-- | C initialization (K&R A8.7, C99 6.7.8)+--+-- Initializers are either assignment expressions or initializer lists+-- (surrounded in curly braces), whose elements are themselves+-- initializers, paired with an optional list of designators.+type CInit = CInitializer NodeInfo+data CInitializer a+ -- | assignment expression+ = CInitExpr (CExpression a) a+ -- | initialization list (see 'CInitList')+ | CInitList (CInitializerList a) a+ deriving (Show, Data, Generic {-! ,CNode , Annotated !-})++instance NFData a => NFData (CInitializer a)++-- deriving Functor does not work (type synonym)+instance Functor CInitializer where+ fmap _f (CInitExpr a1 a2) = CInitExpr (fmap _f a1) (_f a2)+ fmap _f (CInitList a1 a2) = CInitList (fmapInitList _f a1) (_f a2)+fmapInitList :: (a->b) -> (CInitializerList a) -> (CInitializerList b)+fmapInitList _f = map (\(desigs, initializer) -> (fmap (fmap _f) desigs, fmap _f initializer))++-- | Initializer List+--+-- The members of an initializer list are of the form @(designator-list,initializer)@.+-- The @designator-list@ specifies one member of the compound type which is initialized.+-- It is allowed to be empty - in this case the initializer refers to the+-- ''next'' member of the compound type (see C99 6.7.8).+--+-- Examples (simplified expressions and identifiers):+--+-- > -- int x[3][4] = { [0][3] = 4, [2] = 5, 8 };+-- > -- corresponds to the assignments+-- > -- x[0][3] = 4; x[2][0] = 5; x[2][1] = 8;+-- > let init1 = ([CArrDesig 0, CArrDesig 3], CInitExpr 4)+-- > init2 = ([CArrDesig 2] , CInitExpr 5)+-- > init3 = ([] , CInitExpr 8)+-- > in CInitList [init1, init2, init3]+--+-- > -- struct { struct { int a[2]; int b[2]; int c[2]; } s; } x = { .s = { {2,3} , .c[0] = 1 } };+-- > -- corresponds to the assignments+-- > -- x.s.a[0] = 2; x.s.a[1] = 3; x.s.c[0] = 1;+-- > let init_s_0 = CInitList [ ([], CInitExpr 2), ([], CInitExpr 3)]+-- > init_s = CInitList [+-- > ([], init_s_0),+-- > ([CMemberDesig "c", CArrDesig 0], CInitExpr 1)+-- > ]+-- > in CInitList [(CMemberDesig "s", init_s)]+type CInitList = CInitializerList NodeInfo+type CInitializerList a = [([CPartDesignator a], CInitializer a)]++-- | Designators+--+-- A designator specifies a member of an object, either an element or range of an array,+-- or the named member of a struct \/ union.+type CDesignator = CPartDesignator NodeInfo+data CPartDesignator a+ -- | array position designator+ = CArrDesig (CExpression a) a+ -- | member designator+ | CMemberDesig Ident a+ -- | array range designator @CRangeDesig from to _@ (GNU C)+ | CRangeDesig (CExpression a) (CExpression a) a+ deriving (Show, Data, Generic {-! ,CNode ,Functor ,Annotated !-})++instance NFData a => NFData (CPartDesignator a)++-- | @__attribute__@ annotations+--+-- Those are of the form @CAttr attribute-name attribute-parameters@,+-- and serve as generic properties of some syntax tree elements.+type CAttr = CAttribute NodeInfo+data CAttribute a = CAttr Ident [CExpression a] a+ deriving (Show, Data, Generic, Generic1 {-! ,CNode ,Functor ,Annotated !-})++instance NFData a => NFData (CAttribute a)++-- | C expression (K&R A7)+--+-- * these can be arbitrary expression, as the argument of `sizeof' can be+-- arbitrary, even if appearing in a constant expression+--+-- * GNU C extensions: @alignof@, @__real@, @__imag@, @({ stmt-expr })@, @&& label@ and built-ins+--+type CExpr = CExpression NodeInfo+data CExpression a+ = CComma [CExpression a] -- comma expression list, n >= 2+ a+ | CAssign CAssignOp -- assignment operator+ (CExpression a) -- l-value+ (CExpression a) -- r-value+ a+ | CCond (CExpression a) -- conditional+ (Maybe (CExpression a)) -- true-expression (GNU allows omitting)+ (CExpression a) -- false-expression+ a+ | CBinary CBinaryOp -- binary operator+ (CExpression a) -- lhs+ (CExpression a) -- rhs+ a+ | CCast (CDeclaration a) -- type name+ (CExpression a)+ a+ | CUnary CUnaryOp -- unary operator+ (CExpression a)+ a+ | CSizeofExpr (CExpression a)+ a+ | CSizeofType (CDeclaration a) -- type name+ a+ | CAlignofExpr (CExpression a)+ a+ | CAlignofType (CDeclaration a) -- type name+ a+ | CComplexReal (CExpression a) -- real part of complex number+ a+ | CComplexImag (CExpression a) -- imaginary part of complex number+ a+ | CIndex (CExpression a) -- array+ (CExpression a) -- index+ a+ | CCall (CExpression a) -- function+ [CExpression a] -- arguments+ a+ | CMember (CExpression a) -- structure+ Ident -- member name+ Bool -- deref structure? (True for `->')+ a+ | CVar Ident -- identifier (incl. enumeration const)+ a+ | CConst (CConstant a) -- ^ integer, character, floating point and string constants+ | CCompoundLit (CDeclaration a)+ (CInitializerList a) -- type name & initialiser list+ a -- ^ C99 compound literal+ | CGenericSelection (CExpression a) [(Maybe (CDeclaration a), CExpression a)] a -- ^ C11 generic selection+ | CStatExpr (CStatement a) a -- ^ GNU C compound statement as expr+ | CLabAddrExpr Ident a -- ^ GNU C address of label+ | CBuiltinExpr (CBuiltinThing a) -- ^ builtin expressions, see 'CBuiltin'+ deriving (Data,Show, Generic {-! ,CNode , Annotated !-})++instance NFData a => NFData (CExpression a)++-- deriving Functor does not work (type synonyms)+instance Functor CExpression where+ fmap _f (CComma a1 a2) = CComma (fmap (fmap _f) a1) (_f a2)+ fmap _f (CAssign a1 a2 a3 a4)+ = CAssign a1 (fmap _f a2) (fmap _f a3) (_f a4)+ fmap _f (CCond a1 a2 a3 a4)+ = CCond (fmap _f a1) (fmap (fmap _f) a2) (fmap _f a3) (_f a4)+ fmap _f (CBinary a1 a2 a3 a4)+ = CBinary a1 (fmap _f a2) (fmap _f a3) (_f a4)+ fmap _f (CCast a1 a2 a3) = CCast (fmap _f a1) (fmap _f a2) (_f a3)+ fmap _f (CUnary a1 a2 a3) = CUnary a1 (fmap _f a2) (_f a3)+ fmap _f (CSizeofExpr a1 a2) = CSizeofExpr (fmap _f a1) (_f a2)+ fmap _f (CSizeofType a1 a2) = CSizeofType (fmap _f a1) (_f a2)+ fmap _f (CAlignofExpr a1 a2) = CAlignofExpr (fmap _f a1) (_f a2)+ fmap _f (CAlignofType a1 a2) = CAlignofType (fmap _f a1) (_f a2)+ fmap _f (CComplexReal a1 a2) = CComplexReal (fmap _f a1) (_f a2)+ fmap _f (CComplexImag a1 a2) = CComplexImag (fmap _f a1) (_f a2)+ fmap _f (CIndex a1 a2 a3)+ = CIndex (fmap _f a1) (fmap _f a2) (_f a3)+ fmap _f (CCall a1 a2 a3)+ = CCall (fmap _f a1) (fmap (fmap _f) a2) (_f a3)+ fmap _f (CMember a1 a2 a3 a4) = CMember (fmap _f a1) a2 a3 (_f a4)+ fmap _f (CVar a1 a2) = CVar a1 (_f a2)+ fmap _f (CConst a1) = CConst (fmap _f a1)+ fmap _f (CCompoundLit a1 a2 a3)+ = CCompoundLit (fmap _f a1) (fmapInitList _f a2) (_f a3)+ fmap _f (CStatExpr a1 a2) = CStatExpr (fmap _f a1) (_f a2)+ fmap _f (CLabAddrExpr a1 a2) = CLabAddrExpr a1 (_f a2)+ fmap _f (CBuiltinExpr a1) = CBuiltinExpr (fmap _f a1)+ fmap _f (CGenericSelection expr list annot) =+ CGenericSelection (fmap _f expr) (map fmap_helper list) (_f annot)+ where+ fmap_helper (ma1, a2) = (fmap (fmap _f) ma1, fmap _f a2)++-- | GNU Builtins, which cannot be typed in C99+type CBuiltin = CBuiltinThing NodeInfo+data CBuiltinThing a+ = CBuiltinVaArg (CExpression a) (CDeclaration a) a -- ^ @(expr, type)@+ | CBuiltinOffsetOf (CDeclaration a) [CPartDesignator a] a -- ^ @(type, designator-list)@+ | CBuiltinTypesCompatible (CDeclaration a) (CDeclaration a) a -- ^ @(type,type)@+ | CBuiltinConvertVector (CExpression a) (CDeclaration a) a -- ^ @(expr, type)@+ | CBuiltinBitCast (CDeclaration a) (CExpression a) a -- ^ @(type, expr)@+ deriving (Show, Data, Generic {-! ,CNode ,Functor ,Annotated !-})++instance NFData a => NFData (CBuiltinThing a)++-- | C constant (K&R A2.5 & A7.2)+type CConst = CConstant NodeInfo+data CConstant a+ = CIntConst CInteger a+ | CCharConst CChar a+ | CFloatConst CFloat a+ | CStrConst CString a+ deriving (Show, Data, Generic, Generic1 {-! ,CNode ,Functor ,Annotated !-})++instance NFData a => NFData (CConstant a)++-- | Attributed string literals+type CStrLit = CStringLiteral NodeInfo+data CStringLiteral a = CStrLit CString a+ deriving (Show, Data, Generic, Generic1 {-! ,CNode ,Functor ,Annotated !-})++instance NFData a => NFData (CStringLiteral a)++cstringOfLit :: CStringLiteral a -> CString+cstringOfLit (CStrLit cstr _) = cstr++-- | Lift a string literal to a C constant+liftStrLit :: CStringLiteral a -> CConstant a+liftStrLit (CStrLit str at) = CStrConst str at++-- | All AST nodes are annotated. Inspired by the Annotated+-- class of Niklas Broberg's haskell-src-exts package.+-- In principle, we could have Copointed superclass instead+-- of @ann@, for the price of another dependency.+class (Functor ast) => Annotated ast where+ -- | get the annotation of an AST node+ annotation :: ast a -> a+ -- | change the annotation (non-recursively)+ -- of an AST node. Use fmap for recursively+ -- modifying the annotation.+ amap :: (a->a) -> ast a -> ast a++-- fmap2 :: (a->a') -> (a,b) -> (a',b)+-- fmap2 f (a,b) = (f a, b)++-- Instances generated using derive-2.*+-- GENERATED START++instance CNode t1 => CNode (CTranslationUnit t1) where+ nodeInfo (CTranslUnit _ n) = nodeInfo n+instance CNode t1 => Pos (CTranslationUnit t1) where+ posOf x = posOf (nodeInfo x)++instance Functor CTranslationUnit where+ fmap _f (CTranslUnit a1 a2)+ = CTranslUnit (fmap (fmap _f) a1) (_f a2)++instance Annotated CTranslationUnit where+ annotation (CTranslUnit _ n) = n+ amap f (CTranslUnit a_1 a_2) = CTranslUnit a_1 (f a_2)++instance CNode t1 => CNode (CExternalDeclaration t1) where+ nodeInfo (CDeclExt d) = nodeInfo d+ nodeInfo (CFDefExt d) = nodeInfo d+ nodeInfo (CAsmExt _ n) = nodeInfo n+instance CNode t1 => Pos (CExternalDeclaration t1) where+ posOf x = posOf (nodeInfo x)++instance Functor CExternalDeclaration where+ fmap _f (CDeclExt a1) = CDeclExt (fmap _f a1)+ fmap _f (CFDefExt a1) = CFDefExt (fmap _f a1)+ fmap _f (CAsmExt a1 a2) = CAsmExt (fmap _f a1) (_f a2)++instance Annotated CExternalDeclaration where+ annotation (CDeclExt n) = annotation n+ annotation (CFDefExt n) = annotation n+ annotation (CAsmExt _ n) = n+ amap f (CDeclExt n) = CDeclExt (amap f n)+ amap f (CFDefExt n) = CFDefExt (amap f n)+ amap f (CAsmExt a_1 a_2) = CAsmExt a_1 (f a_2)++instance CNode t1 => CNode (CFunctionDef t1) where+ nodeInfo (CFunDef _ _ _ _ n) = nodeInfo n+instance CNode t1 => Pos (CFunctionDef t1) where+ posOf x = posOf (nodeInfo x)++instance Functor CFunctionDef where+ fmap _f (CFunDef a1 a2 a3 a4 a5)+ = CFunDef (fmap (fmap _f) a1) (fmap _f a2) (fmap (fmap _f) a3)+ (fmap _f a4)+ (_f a5)++instance Annotated CFunctionDef where+ annotation (CFunDef _ _ _ _ n) = n+ amap f (CFunDef a_1 a_2 a_3 a_4 a_5)+ = CFunDef a_1 a_2 a_3 a_4 (f a_5)++instance CNode t1 => CNode (CDeclaration t1) where+ nodeInfo (CDecl _ _ n) = nodeInfo n+ nodeInfo (CStaticAssert _ _ n) = nodeInfo n+instance CNode t1 => Pos (CDeclaration t1) where+ posOf x = posOf (nodeInfo x)++instance Annotated CDeclaration where+ annotation (CDecl _ _ n) = n+ annotation (CStaticAssert _ _ n) = n+ amap f (CDecl a_1 a_2 a_3) = CDecl a_1 a_2 (f a_3)+ amap f (CStaticAssert a_1 a_2 a_3) = CStaticAssert a_1 a_2 (f a_3)++instance CNode t1 => CNode (CDeclarator t1) where+ nodeInfo (CDeclr _ _ _ _ n) = nodeInfo n+instance CNode t1 => Pos (CDeclarator t1) where+ posOf x = posOf (nodeInfo x)++instance Functor CDeclarator where+ fmap _f (CDeclr a1 a2 a3 a4 a5)+ = CDeclr a1 (fmap (fmap _f) a2) (fmap (fmap _f) a3)+ (fmap (fmap _f) a4)+ (_f a5)++instance Annotated CDeclarator where+ annotation (CDeclr _ _ _ _ n) = n+ amap f (CDeclr a_1 a_2 a_3 a_4 a_5)+ = CDeclr a_1 a_2 a_3 a_4 (f a_5)++instance CNode t1 => CNode (CDerivedDeclarator t1) where+ nodeInfo (CPtrDeclr _ n) = nodeInfo n+ nodeInfo (CArrDeclr _ _ n) = nodeInfo n+ nodeInfo (CFunDeclr _ _ n) = nodeInfo n+instance CNode t1 => Pos (CDerivedDeclarator t1) where+ posOf x = posOf (nodeInfo x)++instance Annotated CDerivedDeclarator where+ annotation (CPtrDeclr _ n) = n+ annotation (CArrDeclr _ _ n) = n+ annotation (CFunDeclr _ _ n) = n+ amap f (CPtrDeclr a_1 a_2) = CPtrDeclr a_1 (f a_2)+ amap f (CArrDeclr a_1 a_2 a_3) = CArrDeclr a_1 a_2 (f a_3)+ amap f (CFunDeclr a_1 a_2 a_3) = CFunDeclr a_1 a_2 (f a_3)++instance Functor CArraySize where+ fmap _ (CNoArrSize a1) = CNoArrSize a1+ fmap _f (CArrSize a1 a2) = CArrSize a1 (fmap _f a2)++instance CNode t1 => CNode (CStatement t1) where+ nodeInfo (CLabel _ _ _ n) = nodeInfo n+ nodeInfo (CCase _ _ n) = nodeInfo n+ nodeInfo (CCases _ _ _ n) = nodeInfo n+ nodeInfo (CDefault _ n) = nodeInfo n+ nodeInfo (CExpr _ n) = nodeInfo n+ nodeInfo (CCompound _ _ n) = nodeInfo n+ nodeInfo (CIf _ _ _ n) = nodeInfo n+ nodeInfo (CSwitch _ _ n) = nodeInfo n+ nodeInfo (CWhile _ _ _ n) = nodeInfo n+ nodeInfo (CFor _ _ _ _ n) = nodeInfo n+ nodeInfo (CGoto _ n) = nodeInfo n+ nodeInfo (CGotoPtr _ n) = nodeInfo n+ nodeInfo (CCont d) = nodeInfo d+ nodeInfo (CBreak d) = nodeInfo d+ nodeInfo (CReturn _ n) = nodeInfo n+ nodeInfo (CAsm _ n) = nodeInfo n+instance CNode t1 => Pos (CStatement t1) where+ posOf x = posOf (nodeInfo x)++instance Annotated CStatement where+ annotation (CLabel _ _ _ n) = n+ annotation (CCase _ _ n) = n+ annotation (CCases _ _ _ n) = n+ annotation (CDefault _ n) = n+ annotation (CExpr _ n) = n+ annotation (CCompound _ _ n) = n+ annotation (CIf _ _ _ n) = n+ annotation (CSwitch _ _ n) = n+ annotation (CWhile _ _ _ n) = n+ annotation (CFor _ _ _ _ n) = n+ annotation (CGoto _ n) = n+ annotation (CGotoPtr _ n) = n+ annotation (CCont n) = n+ annotation (CBreak n) = n+ annotation (CReturn _ n) = n+ annotation (CAsm _ n) = n+ amap f (CLabel a_1 a_2 a_3 a_4) = CLabel a_1 a_2 a_3 (f a_4)+ amap f (CCase a_1 a_2 a_3) = CCase a_1 a_2 (f a_3)+ amap f (CCases a_1 a_2 a_3 a_4) = CCases a_1 a_2 a_3 (f a_4)+ amap f (CDefault a_1 a_2) = CDefault a_1 (f a_2)+ amap f (CExpr a_1 a_2) = CExpr a_1 (f a_2)+ amap f (CCompound a_1 a_2 a_3) = CCompound a_1 a_2 (f a_3)+ amap f (CIf a_1 a_2 a_3 a_4) = CIf a_1 a_2 a_3 (f a_4)+ amap f (CSwitch a_1 a_2 a_3) = CSwitch a_1 a_2 (f a_3)+ amap f (CWhile a_1 a_2 a_3 a_4) = CWhile a_1 a_2 a_3 (f a_4)+ amap f (CFor a_1 a_2 a_3 a_4 a_5) = CFor a_1 a_2 a_3 a_4 (f a_5)+ amap f (CGoto a_1 a_2) = CGoto a_1 (f a_2)+ amap f (CGotoPtr a_1 a_2) = CGotoPtr a_1 (f a_2)+ amap f (CCont a_1) = CCont (f a_1)+ amap f (CBreak a_1) = CBreak (f a_1)+ amap f (CReturn a_1 a_2) = CReturn a_1 (f a_2)+ amap f (CAsm a_1 a_2) = CAsm a_1 (f a_2)++instance CNode t1 => CNode (CAssemblyStatement t1) where+ nodeInfo (CAsmStmt _ _ _ _ _ n) = nodeInfo n+instance CNode t1 => Pos (CAssemblyStatement t1) where+ posOf x = posOf (nodeInfo x)++instance Functor CAssemblyStatement where+ fmap _f (CAsmStmt a1 a2 a3 a4 a5 a6)+ = CAsmStmt (fmap (fmap _f) a1) (fmap _f a2) (fmap (fmap _f) a3)+ (fmap (fmap _f) a4)+ (fmap (fmap _f) a5)+ (_f a6)++instance Annotated CAssemblyStatement where+ annotation (CAsmStmt _ _ _ _ _ n) = n+ amap f (CAsmStmt a_1 a_2 a_3 a_4 a_5 a_6)+ = CAsmStmt a_1 a_2 a_3 a_4 a_5 (f a_6)++instance CNode t1 => CNode (CAssemblyOperand t1) where+ nodeInfo (CAsmOperand _ _ _ n) = nodeInfo n+instance CNode t1 => Pos (CAssemblyOperand t1) where+ posOf x = posOf (nodeInfo x)++instance Functor CAssemblyOperand where+ fmap _f (CAsmOperand a1 a2 a3 a4)+ = CAsmOperand a1 (fmap _f a2) (fmap _f a3) (_f a4)++instance Annotated CAssemblyOperand where+ annotation (CAsmOperand _ _ _ n) = n+ amap f (CAsmOperand a_1 a_2 a_3 a_4)+ = CAsmOperand a_1 a_2 a_3 (f a_4)++instance CNode t1 => CNode (CCompoundBlockItem t1) where+ nodeInfo (CBlockStmt d) = nodeInfo d+ nodeInfo (CBlockDecl d) = nodeInfo d+ nodeInfo (CNestedFunDef d) = nodeInfo d+instance CNode t1 => Pos (CCompoundBlockItem t1) where+ posOf x = posOf (nodeInfo x)++instance Functor CCompoundBlockItem where+ fmap _f (CBlockStmt a1) = CBlockStmt (fmap _f a1)+ fmap _f (CBlockDecl a1) = CBlockDecl (fmap _f a1)+ fmap _f (CNestedFunDef a1) = CNestedFunDef (fmap _f a1)++instance Annotated CCompoundBlockItem where+ annotation (CBlockStmt n) = annotation n+ annotation (CBlockDecl n) = annotation n+ annotation (CNestedFunDef n) = annotation n+ amap f (CBlockStmt n) = CBlockStmt (amap f n)+ amap f (CBlockDecl n) = CBlockDecl (amap f n)+ amap f (CNestedFunDef n) = CNestedFunDef (amap f n)++instance CNode t1 => CNode (CDeclarationSpecifier t1) where+ nodeInfo (CStorageSpec d) = nodeInfo d+ nodeInfo (CTypeSpec d) = nodeInfo d+ nodeInfo (CTypeQual d) = nodeInfo d+ nodeInfo (CFunSpec d) = nodeInfo d+ nodeInfo (CAlignSpec d) = nodeInfo d+instance CNode t1 => Pos (CDeclarationSpecifier t1) where+ posOf x = posOf (nodeInfo x)++instance Functor CDeclarationSpecifier where+ fmap _f (CStorageSpec a1) = CStorageSpec (fmap _f a1)+ fmap _f (CTypeSpec a1) = CTypeSpec (fmap _f a1)+ fmap _f (CTypeQual a1) = CTypeQual (fmap _f a1)+ fmap _f (CFunSpec a1) = CFunSpec (fmap _f a1)+ fmap _f (CAlignSpec a1) = CAlignSpec (fmap _f a1)++instance Annotated CDeclarationSpecifier where+ annotation (CStorageSpec n) = annotation n+ annotation (CTypeSpec n) = annotation n+ annotation (CTypeQual n) = annotation n+ annotation (CFunSpec n) = annotation n+ annotation (CAlignSpec n) = annotation n+ amap f (CStorageSpec n) = CStorageSpec (amap f n)+ amap f (CTypeSpec n) = CTypeSpec (amap f n)+ amap f (CTypeQual n) = CTypeQual (amap f n)+ amap f (CFunSpec n) = CFunSpec (amap f n)+ amap f (CAlignSpec n) = CAlignSpec (amap f n)++instance CNode t1 => CNode (CStorageSpecifier t1) where+ nodeInfo (CAuto d) = nodeInfo d+ nodeInfo (CRegister d) = nodeInfo d+ nodeInfo (CStatic d) = nodeInfo d+ nodeInfo (CExtern d) = nodeInfo d+ nodeInfo (CTypedef d) = nodeInfo d+ nodeInfo (CThread d) = nodeInfo d+ nodeInfo (CClKernel d) = nodeInfo d+ nodeInfo (CClGlobal d) = nodeInfo d+ nodeInfo (CClLocal d) = nodeInfo d+instance CNode t1 => Pos (CStorageSpecifier t1) where+ posOf x = posOf (nodeInfo x)++instance Functor CStorageSpecifier where+ fmap _f (CAuto a1) = CAuto (_f a1)+ fmap _f (CRegister a1) = CRegister (_f a1)+ fmap _f (CStatic a1) = CStatic (_f a1)+ fmap _f (CExtern a1) = CExtern (_f a1)+ fmap _f (CTypedef a1) = CTypedef (_f a1)+ fmap _f (CThread a1) = CThread (_f a1)+ fmap _f (CClKernel a1) = CClKernel (_f a1)+ fmap _f (CClGlobal a1) = CClGlobal (_f a1)+ fmap _f (CClLocal a1) = CClLocal (_f a1)++instance Annotated CStorageSpecifier where+ annotation (CAuto n) = n+ annotation (CRegister n) = n+ annotation (CStatic n) = n+ annotation (CExtern n) = n+ annotation (CTypedef n) = n+ annotation (CThread n) = n+ annotation (CClKernel n) = n+ annotation (CClGlobal n) = n+ annotation (CClLocal n) = n+ amap f (CAuto a_1) = CAuto (f a_1)+ amap f (CRegister a_1) = CRegister (f a_1)+ amap f (CStatic a_1) = CStatic (f a_1)+ amap f (CExtern a_1) = CExtern (f a_1)+ amap f (CTypedef a_1) = CTypedef (f a_1)+ amap f (CThread a_1) = CThread (f a_1)+ amap f (CClKernel a_1) = CClKernel (f a_1)+ amap f (CClGlobal a_1) = CClGlobal (f a_1)+ amap f (CClLocal a_1) = CClLocal (f a_1)++instance CNode t1 => CNode (CTypeSpecifier t1) where+ nodeInfo (CVoidType d) = nodeInfo d+ nodeInfo (CCharType d) = nodeInfo d+ nodeInfo (CShortType d) = nodeInfo d+ nodeInfo (CIntType d) = nodeInfo d+ nodeInfo (CLongType d) = nodeInfo d+ nodeInfo (CBFloat16Type d) = nodeInfo d+ nodeInfo (CFloatType d) = nodeInfo d+ nodeInfo (CFloatNType _ _ d) = nodeInfo d+ nodeInfo (CDoubleType d) = nodeInfo d+ nodeInfo (CSignedType d) = nodeInfo d+ nodeInfo (CUnsigType d) = nodeInfo d+ nodeInfo (CBoolType d) = nodeInfo d+ nodeInfo (CComplexType d) = nodeInfo d+ nodeInfo (CInt128Type d) = nodeInfo d+ nodeInfo (CUInt128Type d) = nodeInfo d+ nodeInfo (CSUType _ n) = nodeInfo n+ nodeInfo (CEnumType _ n) = nodeInfo n+ nodeInfo (CTypeDef _ n) = nodeInfo n+ nodeInfo (CTypeOfExpr _ n) = nodeInfo n+ nodeInfo (CTypeOfType _ n) = nodeInfo n+ nodeInfo (CAtomicType _ n) = nodeInfo n+instance CNode t1 => Pos (CTypeSpecifier t1) where+ posOf x = posOf (nodeInfo x)++instance Functor CTypeSpecifier where+ fmap _f (CVoidType a1) = CVoidType (_f a1)+ fmap _f (CCharType a1) = CCharType (_f a1)+ fmap _f (CShortType a1) = CShortType (_f a1)+ fmap _f (CIntType a1) = CIntType (_f a1)+ fmap _f (CLongType a1) = CLongType (_f a1)+ fmap _f (CFloatType a1) = CFloatType (_f a1)+ fmap _f (CBFloat16Type a1) = CBFloat16Type (_f a1)+ fmap _f (CFloatNType n x a1) = CFloatNType n x (_f a1)+ fmap _f (CDoubleType a1) = CDoubleType (_f a1)+ fmap _f (CSignedType a1) = CSignedType (_f a1)+ fmap _f (CUnsigType a1) = CUnsigType (_f a1)+ fmap _f (CBoolType a1) = CBoolType (_f a1)+ fmap _f (CComplexType a1) = CComplexType (_f a1)+ fmap _f (CInt128Type a1) = CInt128Type (_f a1)+ fmap _f (CUInt128Type a1) = CUInt128Type (_f a1)+ fmap _f (CSUType a1 a2) = CSUType (fmap _f a1) (_f a2)+ fmap _f (CEnumType a1 a2) = CEnumType (fmap _f a1) (_f a2)+ fmap _f (CTypeDef a1 a2) = CTypeDef a1 (_f a2)+ fmap _f (CTypeOfExpr a1 a2) = CTypeOfExpr (fmap _f a1) (_f a2)+ fmap _f (CTypeOfType a1 a2) = CTypeOfType (fmap _f a1) (_f a2)+ fmap _f (CAtomicType a1 a2) = CAtomicType (fmap _f a1) (_f a2)++instance Annotated CTypeSpecifier where+ annotation (CVoidType n) = n+ annotation (CCharType n) = n+ annotation (CShortType n) = n+ annotation (CIntType n) = n+ annotation (CLongType n) = n+ annotation (CFloatType n) = n+ annotation (CBFloat16Type n) = n+ annotation (CFloatNType _ _ n) = n+ annotation (CDoubleType n) = n+ annotation (CSignedType n) = n+ annotation (CUnsigType n) = n+ annotation (CBoolType n) = n+ annotation (CComplexType n) = n+ annotation (CInt128Type n) = n+ annotation (CUInt128Type n) = n+ annotation (CSUType _ n) = n+ annotation (CEnumType _ n) = n+ annotation (CTypeDef _ n) = n+ annotation (CTypeOfExpr _ n) = n+ annotation (CTypeOfType _ n) = n+ annotation (CAtomicType _ n) = n+ amap f (CVoidType a_1) = CVoidType (f a_1)+ amap f (CCharType a_1) = CCharType (f a_1)+ amap f (CShortType a_1) = CShortType (f a_1)+ amap f (CIntType a_1) = CIntType (f a_1)+ amap f (CLongType a_1) = CLongType (f a_1)+ amap f (CFloatType a_1) = CFloatType (f a_1)+ amap f (CBFloat16Type a_1) = CBFloat16Type (f a_1)+ amap f (CFloatNType n x a_1) = CFloatNType n x (f a_1)+ amap f (CDoubleType a_1) = CDoubleType (f a_1)+ amap f (CSignedType a_1) = CSignedType (f a_1)+ amap f (CUnsigType a_1) = CUnsigType (f a_1)+ amap f (CBoolType a_1) = CBoolType (f a_1)+ amap f (CComplexType a_1) = CComplexType (f a_1)+ amap f (CInt128Type a_1) = CInt128Type (f a_1)+ amap f (CUInt128Type a_1) = CUInt128Type (f a_1)+ amap f (CSUType a_1 a_2) = CSUType a_1 (f a_2)+ amap f (CEnumType a_1 a_2) = CEnumType a_1 (f a_2)+ amap f (CTypeDef a_1 a_2) = CTypeDef a_1 (f a_2)+ amap f (CTypeOfExpr a_1 a_2) = CTypeOfExpr a_1 (f a_2)+ amap f (CTypeOfType a_1 a_2) = CTypeOfType a_1 (f a_2)+ amap f (CAtomicType a_1 a_2) = CAtomicType a_1 (f a_2)++instance CNode t1 => CNode (CTypeQualifier t1) where+ nodeInfo (CConstQual d) = nodeInfo d+ nodeInfo (CVolatQual d) = nodeInfo d+ nodeInfo (CRestrQual d) = nodeInfo d+ nodeInfo (CAtomicQual d) = nodeInfo d+ nodeInfo (CAttrQual d) = nodeInfo d+ nodeInfo (CNullableQual d) = nodeInfo d+ nodeInfo (CNonnullQual d) = nodeInfo d+ nodeInfo (CClRdOnlyQual d) = nodeInfo d+ nodeInfo (CClWrOnlyQual d) = nodeInfo d++instance CNode t1 => Pos (CTypeQualifier t1) where+ posOf x = posOf (nodeInfo x)++instance Functor CTypeQualifier where+ fmap _f (CConstQual a1) = CConstQual (_f a1)+ fmap _f (CVolatQual a1) = CVolatQual (_f a1)+ fmap _f (CRestrQual a1) = CRestrQual (_f a1)+ fmap _f (CAtomicQual a1) = CAtomicQual (_f a1)+ fmap _f (CAttrQual a1) = CAttrQual (fmap _f a1)+ fmap _f (CNullableQual a1) = CNullableQual (_f a1)+ fmap _f (CNonnullQual a1) = CNonnullQual (_f a1)+ fmap _f (CClRdOnlyQual a1) = CClRdOnlyQual (_f a1)+ fmap _f (CClWrOnlyQual a1) = CClWrOnlyQual (_f a1)++instance Annotated CTypeQualifier where+ annotation (CConstQual n) = n+ annotation (CVolatQual n) = n+ annotation (CRestrQual n) = n+ annotation (CAtomicQual n) = n+ annotation (CAttrQual n) = annotation n+ annotation (CNullableQual n) = n+ annotation (CNonnullQual n) = n+ annotation (CClRdOnlyQual n) = n+ annotation (CClWrOnlyQual n) = n+ amap f (CConstQual a_1) = CConstQual (f a_1)+ amap f (CVolatQual a_1) = CVolatQual (f a_1)+ amap f (CRestrQual a_1) = CRestrQual (f a_1)+ amap f (CAtomicQual a_1) = CAtomicQual (f a_1)+ amap f (CAttrQual n) = CAttrQual (amap f n)+ amap f (CNullableQual a_1) = CNullableQual (f a_1)+ amap f (CNonnullQual a_1) = CNonnullQual (f a_1)+ amap f (CClRdOnlyQual a_1) = CClRdOnlyQual (f a_1)+ amap f (CClWrOnlyQual a_1) = CClWrOnlyQual (f a_1)++instance CNode t1 => CNode (CFunctionSpecifier t1) where+ nodeInfo (CInlineQual d) = nodeInfo d+ nodeInfo (CNoreturnQual d) = nodeInfo d+instance CNode t1 => Pos (CFunctionSpecifier t1) where+ posOf x = posOf (nodeInfo x)++instance Functor CFunctionSpecifier where+ fmap _f (CInlineQual a1) = CInlineQual (_f a1)+ fmap _f (CNoreturnQual a1) = CNoreturnQual (_f a1)++instance Annotated CFunctionSpecifier where+ annotation (CInlineQual n) = n+ annotation (CNoreturnQual n) = n+ amap f (CInlineQual a_1) = CInlineQual (f a_1)+ amap f (CNoreturnQual a_1) = CNoreturnQual (f a_1)++instance CNode t1 => CNode (CAlignmentSpecifier t1) where+ nodeInfo (CAlignAsType _ n) = nodeInfo n+ nodeInfo (CAlignAsExpr _ n) = nodeInfo n+instance CNode t1 => Pos (CAlignmentSpecifier t1) where+ posOf x = posOf (nodeInfo x)++instance Functor CAlignmentSpecifier where+ fmap _f (CAlignAsType a1 a2) = CAlignAsType (fmap _f a1) (_f a2)+ fmap _f (CAlignAsExpr a1 a2) = CAlignAsExpr (fmap _f a1) (_f a2)++instance Annotated CAlignmentSpecifier where+ annotation (CAlignAsType _ n) = n+ annotation (CAlignAsExpr _ n) = n+ amap f (CAlignAsType a_1 a_2) = CAlignAsType a_1 (f a_2)+ amap f (CAlignAsExpr a_1 a_2) = CAlignAsExpr a_1 (f a_2)++instance CNode t1 => CNode (CStructureUnion t1) where+ nodeInfo (CStruct _ _ _ _ n) = nodeInfo n+instance CNode t1 => Pos (CStructureUnion t1) where+ posOf x = posOf (nodeInfo x)++instance Functor CStructureUnion where+ fmap _f (CStruct a1 a2 a3 a4 a5)+ = CStruct a1 a2 (fmap (fmap (fmap _f)) a3) (fmap (fmap _f) a4)+ (_f a5)++instance Annotated CStructureUnion where+ annotation (CStruct _ _ _ _ n) = n+ amap f (CStruct a_1 a_2 a_3 a_4 a_5)+ = CStruct a_1 a_2 a_3 a_4 (f a_5)++instance CNode t1 => CNode (CEnumeration t1) where+ nodeInfo (CEnum _ _ _ n) = nodeInfo n+instance CNode t1 => Pos (CEnumeration t1) where+ posOf x = posOf (nodeInfo x)++instance Functor CEnumeration where+ fmap _f (CEnum a1 a2 a3 a4)+ = CEnum a1 (fmap (fmap (fmap (fmap (fmap _f)))) a2)+ (fmap (fmap _f) a3)+ (_f a4)++instance Annotated CEnumeration where+ annotation (CEnum _ _ _ n) = n+ amap f (CEnum a_1 a_2 a_3 a_4) = CEnum a_1 a_2 a_3 (f a_4)++instance CNode t1 => CNode (CInitializer t1) where+ nodeInfo (CInitExpr _ n) = nodeInfo n+ nodeInfo (CInitList _ n) = nodeInfo n+instance CNode t1 => Pos (CInitializer t1) where+ posOf x = posOf (nodeInfo x)++instance Annotated CInitializer where+ annotation (CInitExpr _ n) = n+ annotation (CInitList _ n) = n+ amap f (CInitExpr a_1 a_2) = CInitExpr a_1 (f a_2)+ amap f (CInitList a_1 a_2) = CInitList a_1 (f a_2)++instance CNode t1 => CNode (CPartDesignator t1) where+ nodeInfo (CArrDesig _ n) = nodeInfo n+ nodeInfo (CMemberDesig _ n) = nodeInfo n+ nodeInfo (CRangeDesig _ _ n) = nodeInfo n+instance CNode t1 => Pos (CPartDesignator t1) where+ posOf x = posOf (nodeInfo x)++instance Functor CPartDesignator where+ fmap _f (CArrDesig a1 a2) = CArrDesig (fmap _f a1) (_f a2)+ fmap _f (CMemberDesig a1 a2) = CMemberDesig a1 (_f a2)+ fmap _f (CRangeDesig a1 a2 a3)+ = CRangeDesig (fmap _f a1) (fmap _f a2) (_f a3)++instance Annotated CPartDesignator where+ annotation (CArrDesig _ n) = n+ annotation (CMemberDesig _ n) = n+ annotation (CRangeDesig _ _ n) = n+ amap f (CArrDesig a_1 a_2) = CArrDesig a_1 (f a_2)+ amap f (CMemberDesig a_1 a_2) = CMemberDesig a_1 (f a_2)+ amap f (CRangeDesig a_1 a_2 a_3) = CRangeDesig a_1 a_2 (f a_3)++instance CNode t1 => CNode (CAttribute t1) where+ nodeInfo (CAttr _ _ n) = nodeInfo n+instance CNode t1 => Pos (CAttribute t1) where+ posOf x = posOf (nodeInfo x)++instance Functor CAttribute where+ fmap _f (CAttr a1 a2 a3) = CAttr a1 (fmap (fmap _f) a2) (_f a3)++instance Annotated CAttribute where+ annotation (CAttr _ _ n) = n+ amap f (CAttr a_1 a_2 a_3) = CAttr a_1 a_2 (f a_3)++instance CNode t1 => CNode (CExpression t1) where+ nodeInfo (CComma _ n) = nodeInfo n+ nodeInfo (CAssign _ _ _ n) = nodeInfo n+ nodeInfo (CCond _ _ _ n) = nodeInfo n+ nodeInfo (CBinary _ _ _ n) = nodeInfo n+ nodeInfo (CCast _ _ n) = nodeInfo n+ nodeInfo (CUnary _ _ n) = nodeInfo n+ nodeInfo (CSizeofExpr _ n) = nodeInfo n+ nodeInfo (CSizeofType _ n) = nodeInfo n+ nodeInfo (CAlignofExpr _ n) = nodeInfo n+ nodeInfo (CAlignofType _ n) = nodeInfo n+ nodeInfo (CComplexReal _ n) = nodeInfo n+ nodeInfo (CComplexImag _ n) = nodeInfo n+ nodeInfo (CIndex _ _ n) = nodeInfo n+ nodeInfo (CCall _ _ n) = nodeInfo n+ nodeInfo (CMember _ _ _ n) = nodeInfo n+ nodeInfo (CVar _ n) = nodeInfo n+ nodeInfo (CConst d) = nodeInfo d+ nodeInfo (CCompoundLit _ _ n) = nodeInfo n+ nodeInfo (CGenericSelection _ _ n) = nodeInfo n+ nodeInfo (CStatExpr _ n) = nodeInfo n+ nodeInfo (CLabAddrExpr _ n) = nodeInfo n+ nodeInfo (CBuiltinExpr d) = nodeInfo d+instance CNode t1 => Pos (CExpression t1) where+ posOf x = posOf (nodeInfo x)++instance Annotated CExpression where+ annotation (CComma _ n) = n+ annotation (CAssign _ _ _ n) = n+ annotation (CCond _ _ _ n) = n+ annotation (CBinary _ _ _ n) = n+ annotation (CCast _ _ n) = n+ annotation (CUnary _ _ n) = n+ annotation (CSizeofExpr _ n) = n+ annotation (CSizeofType _ n) = n+ annotation (CAlignofExpr _ n) = n+ annotation (CAlignofType _ n) = n+ annotation (CComplexReal _ n) = n+ annotation (CComplexImag _ n) = n+ annotation (CIndex _ _ n) = n+ annotation (CCall _ _ n) = n+ annotation (CMember _ _ _ n) = n+ annotation (CVar _ n) = n+ annotation (CConst n) = annotation n+ annotation (CCompoundLit _ _ n) = n+ annotation (CGenericSelection _ _ n) = n+ annotation (CStatExpr _ n) = n+ annotation (CLabAddrExpr _ n) = n+ annotation (CBuiltinExpr n) = annotation n+ amap f (CComma a_1 a_2) = CComma a_1 (f a_2)+ amap f (CAssign a_1 a_2 a_3 a_4) = CAssign a_1 a_2 a_3 (f a_4)+ amap f (CCond a_1 a_2 a_3 a_4) = CCond a_1 a_2 a_3 (f a_4)+ amap f (CBinary a_1 a_2 a_3 a_4) = CBinary a_1 a_2 a_3 (f a_4)+ amap f (CCast a_1 a_2 a_3) = CCast a_1 a_2 (f a_3)+ amap f (CUnary a_1 a_2 a_3) = CUnary a_1 a_2 (f a_3)+ amap f (CSizeofExpr a_1 a_2) = CSizeofExpr a_1 (f a_2)+ amap f (CSizeofType a_1 a_2) = CSizeofType a_1 (f a_2)+ amap f (CAlignofExpr a_1 a_2) = CAlignofExpr a_1 (f a_2)+ amap f (CAlignofType a_1 a_2) = CAlignofType a_1 (f a_2)+ amap f (CComplexReal a_1 a_2) = CComplexReal a_1 (f a_2)+ amap f (CComplexImag a_1 a_2) = CComplexImag a_1 (f a_2)+ amap f (CIndex a_1 a_2 a_3) = CIndex a_1 a_2 (f a_3)+ amap f (CCall a_1 a_2 a_3) = CCall a_1 a_2 (f a_3)+ amap f (CMember a_1 a_2 a_3 a_4) = CMember a_1 a_2 a_3 (f a_4)+ amap f (CVar a_1 a_2) = CVar a_1 (f a_2)+ amap f (CConst n) = CConst (amap f n)+ amap f (CCompoundLit a_1 a_2 a_3) = CCompoundLit a_1 a_2 (f a_3)+ amap f (CGenericSelection a_1 a_2 a_3)+ = CGenericSelection a_1 a_2 (f a_3)+ amap f (CStatExpr a_1 a_2) = CStatExpr a_1 (f a_2)+ amap f (CLabAddrExpr a_1 a_2) = CLabAddrExpr a_1 (f a_2)+ amap f (CBuiltinExpr n) = CBuiltinExpr (amap f n)++instance CNode t1 => CNode (CBuiltinThing t1) where+ nodeInfo (CBuiltinVaArg _ _ n) = nodeInfo n+ nodeInfo (CBuiltinOffsetOf _ _ n) = nodeInfo n+ nodeInfo (CBuiltinTypesCompatible _ _ n) = nodeInfo n+ nodeInfo (CBuiltinConvertVector _ _ n) = nodeInfo n+ nodeInfo (CBuiltinBitCast _ _ n) = nodeInfo n+instance CNode t1 => Pos (CBuiltinThing t1) where+ posOf x = posOf (nodeInfo x)++instance Functor CBuiltinThing where+ fmap _f (CBuiltinVaArg a1 a2 a3)+ = CBuiltinVaArg (fmap _f a1) (fmap _f a2) (_f a3)+ fmap _f (CBuiltinOffsetOf a1 a2 a3)+ = CBuiltinOffsetOf (fmap _f a1) (fmap (fmap _f) a2) (_f a3)+ fmap _f (CBuiltinTypesCompatible a1 a2 a3)+ = CBuiltinTypesCompatible (fmap _f a1) (fmap _f a2) (_f a3)+ fmap _f (CBuiltinConvertVector a1 a2 a3)+ = CBuiltinConvertVector (fmap _f a1) (fmap _f a2) (_f a3)+ fmap _f (CBuiltinBitCast a1 a2 a3)+ = CBuiltinBitCast (fmap _f a1) (fmap _f a2) (_f a3)++instance Annotated CBuiltinThing where+ annotation (CBuiltinVaArg _ _ n) = n+ annotation (CBuiltinOffsetOf _ _ n) = n+ annotation (CBuiltinTypesCompatible _ _ n) = n+ annotation (CBuiltinConvertVector _ _ n) = n+ annotation (CBuiltinBitCast _ _ n) = n+ amap f (CBuiltinVaArg a_1 a_2 a_3) = CBuiltinVaArg a_1 a_2 (f a_3)+ amap f (CBuiltinOffsetOf a_1 a_2 a_3)+ = CBuiltinOffsetOf a_1 a_2 (f a_3)+ amap f (CBuiltinTypesCompatible a_1 a_2 a_3)+ = CBuiltinTypesCompatible a_1 a_2 (f a_3)+ amap f (CBuiltinConvertVector a_1 a_2 a_3) =+ CBuiltinConvertVector a_1 a_2 (f a_3)+ amap f (CBuiltinBitCast a_1 a_2 a_3) =+ CBuiltinBitCast a_1 a_2 (f a_3)++instance CNode t1 => CNode (CConstant t1) where+ nodeInfo (CIntConst _ n) = nodeInfo n+ nodeInfo (CCharConst _ n) = nodeInfo n+ nodeInfo (CFloatConst _ n) = nodeInfo n+ nodeInfo (CStrConst _ n) = nodeInfo n+instance CNode t1 => Pos (CConstant t1) where+ posOf x = posOf (nodeInfo x)++instance Functor CConstant where+ fmap _f (CIntConst a1 a2) = CIntConst a1 (_f a2)+ fmap _f (CCharConst a1 a2) = CCharConst a1 (_f a2)+ fmap _f (CFloatConst a1 a2) = CFloatConst a1 (_f a2)+ fmap _f (CStrConst a1 a2) = CStrConst a1 (_f a2)++instance Annotated CConstant where+ annotation (CIntConst _ n) = n+ annotation (CCharConst _ n) = n+ annotation (CFloatConst _ n) = n+ annotation (CStrConst _ n) = n+ amap f (CIntConst a_1 a_2) = CIntConst a_1 (f a_2)+ amap f (CCharConst a_1 a_2) = CCharConst a_1 (f a_2)+ amap f (CFloatConst a_1 a_2) = CFloatConst a_1 (f a_2)+ amap f (CStrConst a_1 a_2) = CStrConst a_1 (f a_2)++instance CNode t1 => CNode (CStringLiteral t1) where+ nodeInfo (CStrLit _ n) = nodeInfo n+instance CNode t1 => Pos (CStringLiteral t1) where+ posOf x = posOf (nodeInfo x)++instance Functor CStringLiteral where+ fmap _f (CStrLit a1 a2) = CStrLit a1 (_f a2)++instance Annotated CStringLiteral where+ annotation (CStrLit _ n) = n+ amap f (CStrLit a_1 a_2) = CStrLit a_1 (f a_2)+-- GENERATED STOP
src/Language/C/Syntax/Constants.hs view
@@ -23,14 +23,16 @@ cFloat, CFloat(..), readCFloat, -- * C string literals cString, cString_w, CString(..), getCString, showStringLit, concatCStrings,+ -- * Clang C version literals+ ClangCVersion(..), readClangCVersion, ) where import Data.Bits import Data.Char import Numeric (showOct, showHex, readHex, readOct, readDec)-import Language.C.Data.Node-import Language.C.Data.Position-import Data.Generics+import Data.Data (Data)+import GHC.Generics (Generic, Generic1)+import Control.DeepSeq (NFData) -- | C char constants (abstract) data CChar = CChar@@ -39,14 +41,16 @@ | CChars [Char] -- multi-character character constant !Bool -- wide flag- deriving (Eq,Ord,Data,Typeable)+ deriving (Eq,Ord,Data,Generic) instance Show CChar where showsPrec _ (CChar c wideflag) = _showWideFlag wideflag . showCharConst c- showsPrec _ (CChars cs wideflag) = _showWideFlag wideflag . (sQuote $ concatMap escapeCChar cs)+ showsPrec _ (CChars cs wideflag) = _showWideFlag wideflag . sQuote (concatMap escapeCChar cs) +instance NFData CChar+ -- | @showCharConst c@ prepends _a_ String representing the C char constant corresponding to @c@.--- If neccessary uses octal or hexadecimal escape sequences.+-- If necessary uses octal or hexadecimal escape sequences. showCharConst :: Char -> ShowS showCharConst c = sQuote $ escapeCChar c @@ -54,7 +58,7 @@ _showWideFlag flag = if flag then showString "L" else id -- | get the haskell representation of a char constant-getCChar :: CChar -> [Char]+getCChar :: CChar -> String getCChar (CChar c _) = [c] getCChar (CChars cs _) = cs @@ -79,19 +83,24 @@ cChar_w c = CChar c True -- | create a multi-character character constant-cChars :: [Char] -> Bool -> CChar+cChars :: String -> Bool -> CChar cChars = CChars -- | datatype for memorizing the representation of an integer-data CIntRepr = DecRepr | HexRepr | OctalRepr deriving (Eq,Ord,Enum,Bounded,Data,Typeable)+data CIntRepr = DecRepr | HexRepr | OctalRepr+ deriving (Eq,Ord,Enum,Bounded,Data,Generic) +instance NFData CIntRepr+ -- | datatype representing type flags for integers-data CIntFlag = FlagUnsigned | FlagLong | FlagLongLong | FlagImag deriving (Eq,Ord,Enum,Bounded,Data,Typeable)+data CIntFlag = FlagUnsigned | FlagLong | FlagLongLong | FlagImag+ deriving (Eq,Ord,Enum,Bounded,Data,Generic) instance Show CIntFlag where show FlagUnsigned = "u" show FlagLong = "L" show FlagLongLong = "LL" show FlagImag = "i"+instance NFData CIntFlag {-# SPECIALIZE setFlag :: CIntFlag -> Flags CIntFlag -> Flags CIntFlag #-} {-# SPECIALIZE clearFlag :: CIntFlag -> Flags CIntFlag -> Flags CIntFlag #-}@@ -101,13 +110,14 @@ !Integer !CIntRepr !(Flags CIntFlag) -- integer flags- deriving (Eq,Ord,Data,Typeable)+ deriving (Eq,Ord,Data,Generic) instance Show CInteger where- showsPrec _ (CInteger i repr flags) = showInt i . showString (concatMap showIFlag [FlagUnsigned .. ]) where+ showsPrec _ (CInteger ig repr flags) = showInt ig . showString (concatMap showIFlag [FlagUnsigned .. ]) where showIFlag f = if testFlag f flags then show f else []- showInt i = case repr of DecRepr -> shows i- OctalRepr -> showString "0" . showOct i- HexRepr -> showString "0x" . showHex i+ showInt num = case repr of DecRepr -> shows num+ OctalRepr -> showString "0" . showOct num+ HexRepr -> showString "0x" . showHex num+instance NFData CInteger -- To be used in the lexer -- Note that the flag lexer won't scale@@ -142,9 +152,10 @@ -- | Floats (represented as strings) data CFloat = CFloat !String- deriving (Eq,Ord,Data,Typeable)+ deriving (Eq,Ord,Data,Generic) instance Show CFloat where showsPrec _ (CFloat internal) = showString internal+instance NFData CFloat cFloat :: Float -> CFloat cFloat = CFloat . show@@ -153,13 +164,25 @@ readCFloat :: String -> CFloat readCFloat = CFloat +-- | Clang dotted version literal+-- <https://clang.llvm.org/docs/AttributeReference.html#availability>+data ClangCVersion = ClangCVersion+ !String+ deriving (Eq,Ord,Data)+instance Show ClangCVersion where+ showsPrec _ (ClangCVersion internal) = showString internal++readClangCVersion :: String -> ClangCVersion+readClangCVersion = ClangCVersion+ -- | C String literals data CString = CString- [Char] -- characters+ String -- characters Bool -- wide flag- deriving (Eq,Ord,Data,Typeable)+ deriving (Eq,Ord,Data, Generic) instance Show CString where showsPrec _ (CString str wideflag) = _showWideFlag wideflag . showStringLit str+instance NFData CString -- construction cString :: String -> CString@@ -178,7 +201,7 @@ concatCStrings cs = CString (concatMap getCString cs) (any isWideString cs) -- | @showStringLiteral s@ prepends a String representing the C string literal corresponding to @s@.--- If neccessary it uses octal or hexadecimal escape sequences.+-- If necessary it uses octal or hexadecimal escape sequences. showStringLit :: String -> ShowS showStringLit = dQuote . concatMap showStringChar where@@ -215,17 +238,20 @@ isSChar '\n' = False isSChar c = isAsciiSourceChar c +showOct' :: Int -> String+showOct' i = replicate (3 - length s) '0' ++ s+ where s = showOct i ""+ escapeChar :: Char -> String escapeChar '\\' = "\\\\" escapeChar '\a' = "\\a" escapeChar '\b' = "\\b"-escapeChar '\ESC' = "\\e"; escapeChar '\f' = "\\f" escapeChar '\n' = "\\n" escapeChar '\r' = "\\r" escapeChar '\t' = "\\t" escapeChar '\v' = "\\v"-escapeChar c | (ord c) < 512 = '\\' : showOct (ord c) ""+escapeChar c | (ord c) < 512 = '\\' : showOct' (ord c) | otherwise = '\\' : 'x' : showHex (ord c) "" unescapeChar :: String -> (Char, String)@@ -245,11 +271,16 @@ '"' -> ('"', cs) 'x' -> case head' "bad escape sequence" (readHex cs) of (i, cs') -> (toEnum i, cs')- _ -> case head' "bad escape sequence" (readOct (c:cs)) of+ _ -> case head' "bad escape sequence" (readOct' (c:cs)) of (i, cs') -> (toEnum i, cs') unescapeChar (c :cs) = (c, cs) unescapeChar [] = error $ "unescape char: empty string" +readOct' :: ReadS Int+readOct' s = map (\(i, cs) -> (i, cs ++ rest)) (readOct octStr)+ where octStr = takeWhile isOctDigit $ take 3 s+ rest = drop (length octStr) s+ unescapeString :: String -> String unescapeString [] = [] unescapeString cs = case unescapeChar cs of@@ -264,8 +295,9 @@ head' err [] = error err head' _ (x:_) = x --- TODO: Move to seperate file ?-newtype Flags f = Flags Integer deriving (Eq,Ord,Data,Typeable)+-- TODO: Move to separate file ?+newtype Flags f = Flags Integer deriving (Eq,Ord,Data,Generic,Generic1)+instance NFData (Flags f) noFlags :: Flags f noFlags = Flags 0 setFlag :: (Enum f) => f -> Flags f -> Flags f@@ -274,6 +306,3 @@ clearFlag flag (Flags k) = Flags$ k `clearBit` fromEnum flag testFlag :: (Enum f) => f -> Flags f -> Bool testFlag flag (Flags k) = k `testBit` fromEnum flag---
src/Language/C/Syntax/Ops.hs view
@@ -13,13 +13,21 @@ module Language.C.Syntax.Ops ( -- * Assignment operators CAssignOp(..),--- * Unary operators-CUnaryOp(..),+assignBinop, -- * Binary operators CBinaryOp(..),+isCmpOp,+isPtrOp,+isBitOp,+isLogicOp,+-- * Unary operators+CUnaryOp(..),+isEffectfulOp ) where-import Data.Generics+import Data.Data (Data)+import GHC.Generics (Generic)+import Control.DeepSeq (NFData) -- | C assignment operators (K&R A7.17) data CAssignOp = CAssignOp | CMulAssOp@@ -32,20 +40,23 @@ | CAndAssOp | CXorAssOp | COrAssOp- deriving (Eq, Ord,Data,Typeable)-instance Show CAssignOp where- show CAssignOp = "="- show CMulAssOp = "*="- show CDivAssOp = "/="- show CRmdAssOp = "%="- show CAddAssOp = "+="- show CSubAssOp = "-="- show CShlAssOp = "<<="- show CShrAssOp = ">>="- show CAndAssOp = "&="- show CXorAssOp = "^="- show COrAssOp = "|="+ deriving (Eq,Ord,Show,Data,Generic) +instance NFData CAssignOp++assignBinop :: CAssignOp -> CBinaryOp+assignBinop CAssignOp = error "direct assignment has no binary operator"+assignBinop CMulAssOp = CMulOp+assignBinop CDivAssOp = CDivOp+assignBinop CRmdAssOp = CRmdOp+assignBinop CAddAssOp = CAddOp+assignBinop CSubAssOp = CSubOp+assignBinop CShlAssOp = CShlOp+assignBinop CShrAssOp = CShrOp+assignBinop CAndAssOp = CAndOp+assignBinop CXorAssOp = CXorOp+assignBinop COrAssOp = COrOp+ -- | C binary operators (K&R A7.6-15) -- data CBinaryOp = CMulOp@@ -66,27 +77,22 @@ | COrOp -- ^ inclusive bitwise or | CLndOp -- ^ logical and | CLorOp -- ^ logical or- deriving (Eq,Ord,Data,Typeable)-instance Show CBinaryOp where- show CMulOp = "*"- show CDivOp = "/"- show CRmdOp = "%"- show CAddOp = "+"- show CSubOp = "-"- show CShlOp = "<<"- show CShrOp = ">>"- show CLeOp = "<"- show CGrOp = ">"- show CLeqOp = "<="- show CGeqOp = ">="- show CEqOp = "=="- show CNeqOp = "!="- show CAndOp = "&"- show CXorOp = "^"- show COrOp = "|"- show CLndOp = "&&"- show CLorOp = "||"+ deriving (Eq,Ord,Show,Data,Generic) +instance NFData CBinaryOp++isCmpOp :: CBinaryOp -> Bool+isCmpOp op = op `elem` [ CLeqOp, CGeqOp, CLeOp, CGrOp, CEqOp, CNeqOp ]++isPtrOp :: CBinaryOp -> Bool+isPtrOp op = op `elem` [ CAddOp, CSubOp ]++isBitOp :: CBinaryOp -> Bool+isBitOp op = op `elem` [ CShlOp, CShrOp, CAndOp, COrOp, CXorOp ]++isLogicOp :: CBinaryOp -> Bool+isLogicOp op = op `elem` [ CLndOp, CLorOp ]+ -- | C unary operator (K&R A7.3-4) -- data CUnaryOp = CPreIncOp -- ^ prefix increment operator@@ -99,15 +105,9 @@ | CMinOp -- ^ prefix minus | CCompOp -- ^ one's complement | CNegOp -- ^ logical negation- deriving (Eq,Ord,Data,Typeable)-instance Show CUnaryOp where- show CPreIncOp = "++"- show CPreDecOp = "--"- show CPostIncOp = "++"- show CPostDecOp = "--"- show CAdrOp = "&"- show CIndOp = "*"- show CPlusOp = "+"- show CMinOp = "-"- show CCompOp = "~"- show CNegOp = "!"+ deriving (Eq,Ord,Show,Data,Generic)++instance NFData CUnaryOp++isEffectfulOp :: CUnaryOp -> Bool+isEffectfulOp op = op `elem` [ CPreIncOp, CPreDecOp, CPostIncOp, CPostDecOp ]
+ src/Language/C/Syntax/Utils.hs view
@@ -0,0 +1,76 @@+module Language.C.Syntax.Utils (+ -- * Generic operations+ getSubStmts,+ mapSubStmts,+ mapBlockItemStmts,+ -- * Concrete operations+ getLabels+) where++import Data.List+import Language.C.Data.Ident+import Language.C.Syntax.AST++-- XXX: This is should be generalized !!!+-- Data.Generics sounds attractive, but we really need to control the evaluation order+-- XXX: Expression statements (which are somewhat problematic anyway), aren't handled yet+getSubStmts :: CStat -> [CStat]+getSubStmts (CLabel _ s _ _) = [s]+getSubStmts (CCase _ s _) = [s]+getSubStmts (CCases _ _ s _) = [s]+getSubStmts (CDefault s _) = [s]+getSubStmts (CExpr _ _) = []+getSubStmts (CCompound _ body _) = concatMap compoundSubStmts body+getSubStmts (CIf _ sthen selse _) = maybe [sthen] (\s -> [sthen,s]) selse+getSubStmts (CSwitch _ s _) = [s]+getSubStmts (CWhile _ s _ _) = [s]+getSubStmts (CFor _ _ _ s _) = [s]+getSubStmts (CGoto _ _) = []+getSubStmts (CGotoPtr _ _) = []+getSubStmts (CCont _) = []+getSubStmts (CBreak _) = []+getSubStmts (CReturn _ _) = []+getSubStmts (CAsm _ _) = []++mapSubStmts :: (CStat -> Bool) -> (CStat -> CStat) -> CStat -> CStat+mapSubStmts stop _ s | stop s = s+mapSubStmts stop f (CLabel i s attrs ni) =+ f (CLabel i (mapSubStmts stop f s) attrs ni)+mapSubStmts stop f (CCase e s ni) =+ f (CCase e (mapSubStmts stop f s) ni)+mapSubStmts stop f (CCases e1 e2 s ni) =+ f (CCases e1 e2 (mapSubStmts stop f s) ni)+mapSubStmts stop f (CDefault s ni) =+ f (CDefault (mapSubStmts stop f s) ni)+mapSubStmts stop f (CCompound ls body ni) =+ f (CCompound ls (map (mapBlockItemStmts stop f) body) ni)+mapSubStmts stop f (CIf e sthen selse ni) =+ f (CIf e+ (mapSubStmts stop f sthen)+ (fmap (mapSubStmts stop f) selse)+ ni)+mapSubStmts stop f (CSwitch e s ni) =+ f (CSwitch e (mapSubStmts stop f s) ni)+mapSubStmts stop f (CWhile e s isdo ni) =+ f (CWhile e (mapSubStmts stop f s) isdo ni)+mapSubStmts stop f (CFor i t a s ni) =+ f (CFor i t a (mapSubStmts stop f s) ni)+mapSubStmts _ f s = f s++mapBlockItemStmts :: (CStat -> Bool)+ -> (CStat -> CStat)+ -> CBlockItem+ -> CBlockItem+mapBlockItemStmts stop f (CBlockStmt s) = CBlockStmt (mapSubStmts stop f s)+mapBlockItemStmts _ _ bi = bi++compoundSubStmts :: CBlockItem -> [CStat]+compoundSubStmts (CBlockStmt s) = [s]+compoundSubStmts (CBlockDecl _) = []+compoundSubStmts (CNestedFunDef _) = []++getLabels :: CStat -> [Ident]+getLabels (CLabel l s _ _) = l : getLabels s+getLabels (CCompound ls body _) =+ concatMap (concatMap getLabels . compoundSubStmts) body \\ ls+getLabels stmt = concatMap getLabels (getSubStmts stmt)
src/Language/C/System/GCC.hs view
@@ -17,7 +17,7 @@ import Language.C.Data.RList as RList import Language.C.System.Preprocess import Data.Maybe-import System.Cmd+import System.Process import System.Directory import Data.List @@ -64,6 +64,11 @@ case unparsed_args of ("-E":rest) -> mungeArgs parsed rest + (flag:flagArg:rest) | flag == "-MF"+ || flag == "-MT"+ || flag == "-MQ"+ -> mungeArgs (cpp_args,(extra,other `snoc` flag `snoc` flagArg)) rest+ (flag:rest) | flag == "-c" || flag == "-S" || "-M" `isPrefixOf` flag@@ -75,7 +80,7 @@ (cpp_opt:rest) | Just (opt,rest') <- getArgOpt cpp_opt rest -> mungeArgs ((inp,out,cpp_opts `snoc` opt),unparsed) rest' - (cfile:rest) | any (flip isSuffixOf cfile) (words ".c .hc .h")+ (cfile:rest) | any (`isSuffixOf` cfile) (words ".c .hc .h") -> if isJust inp then Left "two input files given" else mungeArgs ((Just cfile,out,cpp_opts),unparsed) rest@@ -89,13 +94,13 @@ | "-D" `isPrefixOf` cpp_opt = Just (getDefine (drop 2 cpp_opt),rest) getArgOpt "-include" (f:rest') = Just (IncludeFile f, rest') getArgOpt _ _ = Nothing- getDefine opt = let (key,val) = break (== '=') opt in Define key (if null val then "" else tail val)+ getDefine opt = let (key,val) = break (== '=') opt in Define key (drop 1 val) type ParseArgsState = ((Maybe FilePath, Maybe FilePath, RList CppOption), (RList String, RList String)) buildCppArgs :: CppArgs -> [String]-buildCppArgs (CppArgs options extra_args _tmpdir input_file output_file_opt) = do+buildCppArgs (CppArgs options extra_args _tmpdir input_file output_file_opt) = (concatMap tOption options) ++ outputFileOpt ++ ["-E", input_file]
src/Language/C/System/Preprocess.hs view
@@ -12,7 +12,7 @@ module Language.C.System.Preprocess ( Preprocessor(..), CppOption(..),- CppArgs(..),rawCppArgs,addCppOption,addExtraOption,+ CppArgs(..),rawCppArgs,addCppOption,addExtraOption,cppFile, runPreprocessor, isPreprocessed, )@@ -21,7 +21,6 @@ import System.Exit import System.Directory import System.FilePath-import System.Environment import System.IO import Control.Exception import Control.Monad@@ -58,6 +57,7 @@ cppFile :: FilePath -> CppArgs cppFile input_file = CppArgs { cppOptions = [], extraOptions = [], cppTmpDir = Nothing, inputFile = input_file, outputFile = Nothing } + -- | use the given preprocessor arguments without analyzing them rawCppArgs :: [String] -> FilePath -> CppArgs rawCppArgs opts input_file =@@ -66,16 +66,16 @@ -- | add a typed option to the given preprocessor arguments addCppOption :: CppArgs -> CppOption -> CppArgs addCppOption cpp_args opt =- cpp_args { cppOptions = opt : (cppOptions cpp_args) }+ cpp_args { cppOptions = opt : cppOptions cpp_args } -- | add a string option to the given preprocessor arguments addExtraOption :: CppArgs -> String -> CppArgs addExtraOption cpp_args extra =- cpp_args { extraOptions = extra : (extraOptions cpp_args) }+ cpp_args { extraOptions = extra : extraOptions cpp_args } -- | run the preprocessor and return an 'InputStream' if preprocesssing succeeded runPreprocessor :: (Preprocessor cpp) => cpp -> CppArgs -> IO (Either ExitCode InputStream)-runPreprocessor cpp cpp_args = do+runPreprocessor cpp cpp_args = bracket getActualOutFile -- remove outfile if it was temporary
+ test/harness/run-harness.hs view
@@ -0,0 +1,70 @@+module Main where++import Data.List (intercalate)+import System.Exit (ExitCode(..), exitFailure, exitSuccess, exitWith)+import System.Directory (doesDirectoryExist, doesFileExist, getCurrentDirectory, setCurrentDirectory,+ getDirectoryContents)+import System.FilePath ((</>))+import System.Process (readProcessWithExitCode, callProcess)+import System.IO (hPutStrLn, hPrint, stderr)+import Control.Monad (filterM, liftM, when)++testDirs :: [String]+testDirs = ["test/harness","harness","."]++getActualTestDirectory :: [String] -> IO FilePath+getActualTestDirectory test_dirs = do+ validDirs <- filterM (doesFileExist . (</> "run-harness.hs")) test_dirs+ case validDirs of+ [] -> ioError (userError ("run-harness.hs not found in " ++ intercalate " or " test_dirs))+ (d:_) -> return d++subdirectoriesOf :: FilePath -> IO [FilePath]+subdirectoriesOf fp = do+ entries <- getDirectoryContents fp+ filterM (doesDirectoryExist . (fp </>)) (filter (not . isSpecialDir) entries)+ where+ isSpecialDir "." = True+ isSpecialDir ".." = True+ isSpecialDir _ = False++-- from Control.Monad.Extra+findM :: Monad m => (a -> m Bool) -> [a] -> m (Maybe a)+findM _ [] = return Nothing+findM p (x:xs) = do guard <- p x ; if guard then (return $ Just x) else (findM p xs)++main :: IO ExitCode+main = do+ actual_test_dir <- getActualTestDirectory testDirs+ has_makefile <- doesFileExist (actual_test_dir </> "Makefile")+ when (not has_makefile) $ do+ hPutStrLn stderr "No Makefile found (out of source tree)"+ hPutStrLn stderr "Skipping harness test"+ exitWith ExitSuccess+ tests <- subdirectoriesOf actual_test_dir+ cdir <- getCurrentDirectory+ hPutStrLn stderr ("Changing to test directory " ++ actual_test_dir ++ " and compiling")+ -- build test executables+ setCurrentDirectory (cdir</>actual_test_dir)+ callProcess "make" ["prepare"]+ -- run harness tests+ hasFailure <- findM (liftM (/= ExitSuccess) . runTest . (cdir</>) . (actual_test_dir</>)) tests+ setCurrentDirectory cdir+ case hasFailure of+ Nothing -> exitSuccess+ Just _failed -> exitFailure+ where+ runTest :: FilePath -> IO ExitCode+ runTest dir = do+ setCurrentDirectory dir+ (exitCode, _outp, _errp) <- readProcessWithExitCode "make" [] ""+ hPutStrLn stderr ("cd " ++ dir ++ " && make: " ++ show exitCode)+ when (exitCode /= ExitSuccess) $ do+ hPutStrLn stderr "=== Standard Output ==="+ hPutStrLn stderr _outp+ hPutStrLn stderr "=== Error Output ==="+ hPutStrLn stderr _errp+ hPutStrLn stderr "=== End of Output ==="+ return exitCode++