[project @ 2005-03-14 12:18:05 by simonmar]
authorsimonmar <unknown>
Mon, 14 Mar 2005 12:18:08 +0000 (12:18 +0000)
committersimonmar <unknown>
Mon, 14 Mar 2005 12:18:08 +0000 (12:18 +0000)
Add Dimitry Golubovsky <dimitry@golubovsky.org>'s Unicode character
class implementation.  This will remove the dependency on libc's
locale code and give us much more consistent support for Unicode
across platforms.

GHC/Unicode.hs
cbits/WCsubst.c [new file with mode: 0644]
include/HsBase.h
include/WCsubst.h [new file with mode: 0644]

index 52d14f3..8aefad5 100644 (file)
@@ -1,4 +1,5 @@
-{-# OPTIONS_GHC -fno-implicit-prelude #-}
+{-# OPTIONS -fno-implicit-prelude #-}
+{-# OPTIONS -#include "WCsubst.h" #-}
 -----------------------------------------------------------------------------
 -- |
 -- Module      :  GHC.Unicde
 --
 -----------------------------------------------------------------------------
 
--- #hide
 module GHC.Unicode (
+    GeneralCategory (..),
+    generalCategory,
     isAscii, isLatin1, isControl,
     isAsciiUpper, isAsciiLower,
     isPrint, isSpace,  isUpper,
     isLower, isAlpha,  isDigit,
     isOctDigit, isHexDigit, isAlphaNum,
-    toUpper, toLower,
+    toUpper, toLower, toTitle,
+    isLetter,               -- :: Char -> Bool
+    isMark,                 -- :: Char -> Bool
+    isNumber,               -- :: Char -> Bool
+    isPunctuation,          -- :: Char -> Bool
+    isSymbol,               -- :: Char -> Bool
+    isSeparator,            -- :: Char -> Bool
   ) where
 
 import GHC.Base
@@ -30,9 +38,106 @@ import GHC.Real  (fromIntegral)
 import GHC.Int
 import GHC.Word
 import GHC.Num  (fromInteger)
+import GHC.Read
+import GHC.Show
+import GHC.Enum
 
 #include "HsBaseConfig.h"
 
+-- | Unicode General Categories (column 2 of the UnicodeData table)
+-- in the order they are listed in the Unicode standard.
+
+data GeneralCategory
+        = UppercaseLetter       -- Lu  Letter, Uppercase
+        | LowercaseLetter       -- Ll  Letter, Lowercase
+        | TitlecaseLetter       -- Lt  Letter, Titlecase
+        | ModifierLetter        -- Lm  Letter, Modifier
+        | OtherLetter           -- Lo  Letter, Other
+        | NonSpacingMark        -- Mn  Mark, Non-Spacing
+        | SpacingCombiningMark  -- Mc  Mark, Spacing Combining
+        | EnclosingMark         -- Me  Mark, Enclosing
+        | DecimalNumber         -- Nd  Number, Decimal
+        | LetterNumber          -- Nl  Number, Letter
+        | OtherNumber           -- No  Number, Other
+        | ConnectorPunctuation  -- Pc  Punctuation, Connector
+        | DashPunctuation       -- Pd  Punctuation, Dash
+        | OpenPunctuation       -- Ps  Punctuation, Open
+        | ClosePunctuation      -- Pe  Punctuation, Close
+        | InitialQuote          -- Pi  Punctuation, Initial quote
+        | FinalQuote            -- Pf  Punctuation, Final quote
+        | OtherPunctuation      -- Po  Punctuation, Other
+        | MathSymbol            -- Sm  Symbol, Math
+        | CurrencySymbol        -- Sc  Symbol, Currency
+        | ModifierSymbol        -- Sk  Symbol, Modifier
+        | OtherSymbol           -- So  Symbol, Other
+        | Space                 -- Zs  Separator, Space
+        | LineSeparator         -- Zl  Separator, Line
+        | ParagraphSeparator    -- Zp  Separator, Paragraph
+        | Control               -- Cc  Other, Control
+        | Format                -- Cf  Other, Format
+        | Surrogate             -- Cs  Other, Surrogate
+        | PrivateUse            -- Co  Other, Private Use
+        | NotAssigned           -- Cn  Other, Not Assigned
+        deriving (Eq, Ord, Enum, Read, Show, Bounded)
+
+-- | Retrieves the general Unicode category of the character.
+generalCategory :: Char -> GeneralCategory
+generalCategory c = toEnum (wgencat (fromIntegral (ord c)))
+
+-- ------------------------------------------------------------------------
+-- These are copied from Hugs Unicode.hs
+
+-- derived character classifiers
+
+isLetter :: Char -> Bool
+isLetter c = case generalCategory c of
+        UppercaseLetter         -> True
+        LowercaseLetter         -> True
+        TitlecaseLetter         -> True
+        ModifierLetter          -> True
+        OtherLetter             -> True
+        _                       -> False
+
+isMark :: Char -> Bool
+isMark c = case generalCategory c of
+        NonSpacingMark          -> True
+        SpacingCombiningMark    -> True
+        EnclosingMark           -> True
+        _                       -> False
+
+isNumber :: Char -> Bool
+isNumber c = case generalCategory c of
+        DecimalNumber           -> True
+        LetterNumber            -> True
+        OtherNumber             -> True
+        _                       -> False
+
+isPunctuation :: Char -> Bool
+isPunctuation c = case generalCategory c of
+        ConnectorPunctuation    -> True
+        DashPunctuation         -> True
+        OpenPunctuation         -> True
+        ClosePunctuation        -> True
+        InitialQuote            -> True
+        FinalQuote              -> True
+        OtherPunctuation        -> True
+        _                       -> False
+
+isSymbol :: Char -> Bool
+isSymbol c = case generalCategory c of
+        MathSymbol              -> True
+        CurrencySymbol          -> True
+        ModifierSymbol          -> True
+        OtherSymbol             -> True
+        _                       -> False
+
+isSeparator :: Char -> Bool
+isSeparator c = case generalCategory c of
+        Space                   -> True
+        LineSeparator           -> True
+        ParagraphSeparator      -> True
+        _                       -> False
+
 -- | Selects the first 128 characters of the Unicode character set,
 -- corresponding to the ASCII character set.
 isAscii                 :: Char -> Bool
@@ -67,7 +172,8 @@ isSpace c            =  c == ' '     ||
                           c == '\r'    ||
                           c == '\f'    ||
                           c == '\v'    ||
-                          c == '\xa0'
+                          c == '\xa0'  ||
+                          iswspace (fromIntegral (ord c)) /= 0
 
 -- | Selects alphabetic Unicode characters (letters) that are not lower-case.
 -- (In Unicode terms, this includes letters in upper and title cases,
@@ -78,15 +184,6 @@ isUpper                 :: Char -> Bool
 isLower                 :: Char -> Bool
 
 -- | Selects alphabetic Unicode characters (letters).
---
--- Note: the Haskell 98 definition of 'isAlpha' is:
---
--- >   isAlpha c = isUpper c || isLower c
---
--- the implementation here diverges from the Haskell 98
--- definition in the sense that Unicode alphabetic characters which
--- are neither upper nor lower case will still be identified as
--- alphabetic by 'isAlpha'.
 isAlpha                 :: Char -> Bool
 
 -- | Selects alphabetic or numeric digit Unicode characters.
@@ -120,21 +217,14 @@ toUpper                 :: Char -> Char
 toLower                 :: Char -> Char
 
 -- -----------------------------------------------------------------------------
--- Win32 implementation
+-- Implementation with the supplied auto-generated Unicode character properties
+-- table (default)
 
-#if (defined(HAVE_WCTYPE_H) && HAVE_ISWSPACE && defined(HTYPE_WINT_T)) || mingw32_HOST_OS
+#if 1
 
--- Use the wide-char classification functions if available.  Glibc
--- seems to implement these properly, even for chars > 0xffff, as long
--- as you call setlocale() to set the locale to something other than
--- "C".  Therefore, we call setlocale() in hs_init().
-
--- Win32 uses UTF-16, so presumably the system-supplied iswlower() and
--- friends won't work properly with characters > 0xffff.  These
--- characters are represented as surrogate pairs in UTF-16.
+-- Regardless of the O/S and Library, use the functions contained in WCsubst.c
 
 type WInt = HTYPE_WINT_T
-type CInt = HTYPE_INT
 
 isDigit    c = iswdigit (fromIntegral (ord c)) /= 0
 isAlpha    c = iswalpha (fromIntegral (ord c)) /= 0
@@ -147,39 +237,46 @@ isLower    c = iswlower (fromIntegral (ord c)) /= 0
 
 toLower c = chr (fromIntegral (towlower (fromIntegral (ord c))))
 toUpper c = chr (fromIntegral (towupper (fromIntegral (ord c))))
+toTitle c = chr (fromIntegral (towtitle (fromIntegral (ord c))))
+
+foreign import ccall unsafe "u_iswdigit"
+  iswdigit :: CInt -> CInt
+
+foreign import ccall unsafe "u_iswalpha"
+  iswalpha :: CInt -> CInt
 
-foreign import ccall unsafe "iswdigit"
-  iswdigit :: WInt -> CInt
+foreign import ccall unsafe "u_iswalnum"
+  iswalnum :: CInt -> CInt
 
-foreign import ccall unsafe "iswalpha"
-  iswalpha :: WInt -> CInt
+foreign import ccall unsafe "u_iswcntrl"
+  iswcntrl :: CInt -> CInt
 
-foreign import ccall unsafe "iswalnum"
-  iswalnum :: WInt -> CInt
+foreign import ccall unsafe "u_iswspace"
+  iswspace :: CInt -> CInt
 
-foreign import ccall unsafe "iswcntrl"
-  iswcntrl :: WInt -> CInt
+foreign import ccall unsafe "u_iswprint"
+  iswprint :: CInt -> CInt
 
-foreign import ccall unsafe "iswspace"
-  iswspace :: WInt -> CInt
+foreign import ccall unsafe "u_iswlower"
+  iswlower :: CInt -> CInt
 
-foreign import ccall unsafe "iswprint"
-  iswprint :: WInt -> CInt
+foreign import ccall unsafe "u_iswupper"
+  iswupper :: CInt -> CInt
 
-foreign import ccall unsafe "iswlower"
-  iswlower :: WInt -> CInt
+foreign import ccall unsafe "u_towlower"
+  towlower :: CInt -> CInt
 
-foreign import ccall unsafe "iswupper"
-  iswupper :: WInt -> CInt
+foreign import ccall unsafe "u_towupper"
+  towupper :: CInt -> CInt
 
-foreign import ccall unsafe "towlower"
-  towlower :: WInt -> WInt
+foreign import ccall unsafe "u_towtitle"
+  towtitle :: CInt -> CInt
 
-foreign import ccall unsafe "towupper"
-  towupper :: WInt -> WInt
+foreign import ccall unsafe "u_gencat"
+  wgencat :: CInt -> Int
 
 -- -----------------------------------------------------------------------------
--- No libunicode, so fall back to the ASCII-only implementation
+-- No libunicode, so fall back to the ASCII-only implementation (never used, indeed)
 
 #else
 
diff --git a/cbits/WCsubst.c b/cbits/WCsubst.c
new file mode 100644 (file)
index 0000000..18752b9
--- /dev/null
@@ -0,0 +1,3095 @@
+/*-------------------------------------------------------------------------
+This is an automatically generated file: do not edit
+Generated by udconfc at Mon Jan 31 23:37:36 EST 2005
+-------------------------------------------------------------------------*/
+
+#include "WCsubst.h"
+
+/* Unicode general categories, listed in the same order as in the Unicode
+ * standard -- this must be the same order as in GHC.Unicode.
+ */
+
+enum {
+    NUMCAT_LU,  /* Letter, Uppercase */
+    NUMCAT_LL,  /* Letter, Lowercase */
+    NUMCAT_LT,  /* Letter, Titlecase */
+    NUMCAT_LM,  /* Letter, Modifier */
+    NUMCAT_LO,  /* Letter, Other */
+    NUMCAT_MN,  /* Mark, Non-Spacing */
+    NUMCAT_MC,  /* Mark, Spacing Combining */
+    NUMCAT_ME,  /* Mark, Enclosing */
+    NUMCAT_ND,  /* Number, Decimal */
+    NUMCAT_NL,  /* Number, Letter */
+    NUMCAT_NO,  /* Number, Other */
+    NUMCAT_PC,  /* Punctuation, Connector */
+    NUMCAT_PD,  /* Punctuation, Dash */
+    NUMCAT_PS,  /* Punctuation, Open */
+    NUMCAT_PE,  /* Punctuation, Close */
+    NUMCAT_PI,  /* Punctuation, Initial quote */
+    NUMCAT_PF,  /* Punctuation, Final quote */
+    NUMCAT_PO,  /* Punctuation, Other */
+    NUMCAT_SM,  /* Symbol, Math */
+    NUMCAT_SC,  /* Symbol, Currency */
+    NUMCAT_SK,  /* Symbol, Modifier */
+    NUMCAT_SO,  /* Symbol, Other */
+    NUMCAT_ZS,  /* Separator, Space */
+    NUMCAT_ZL,  /* Separator, Line */
+    NUMCAT_ZP,  /* Separator, Paragraph */
+    NUMCAT_CC,  /* Other, Control */
+    NUMCAT_CF,  /* Other, Format */
+    NUMCAT_CS,  /* Other, Surrogate */
+    NUMCAT_CO,  /* Other, Private Use */
+    NUMCAT_CN   /* Other, Not Assigned */
+};
+
+struct _convrule_ 
+{ 
+       unsigned int category;
+       unsigned int catnumber;
+       int possible;
+       int updist;
+       int lowdist; 
+       int titledist;
+};
+
+struct _charblock_ 
+{ 
+       int start;
+       int length;
+       const struct _convrule_ *rule;
+};
+
+#define GENCAT_ZP 67108864
+#define GENCAT_MC 8388608
+#define GENCAT_NO 65536
+#define GENCAT_SK 1024
+#define GENCAT_CO 268435456
+#define GENCAT_ME 4194304
+#define GENCAT_ND 256
+#define GENCAT_PO 4
+#define GENCAT_LT 524288
+#define GENCAT_PC 2048
+#define GENCAT_SM 64
+#define GENCAT_ZS 2
+#define GENCAT_CC 1
+#define GENCAT_LU 512
+#define GENCAT_PD 128
+#define GENCAT_SO 8192
+#define GENCAT_PE 32
+#define GENCAT_CS 134217728
+#define GENCAT_PF 131072
+#define GENCAT_CF 32768
+#define GENCAT_PS 16
+#define GENCAT_SC 8
+#define GENCAT_LL 4096
+#define GENCAT_ZL 33554432
+#define GENCAT_LM 1048576
+#define GENCAT_PI 16384
+#define GENCAT_NL 16777216
+#define GENCAT_MN 2097152
+#define GENCAT_LO 262144
+#define MAX_UNI_CHAR 1114109
+#define NUM_BLOCKS 1916
+#define NUM_CONVBLOCKS 835
+#define NUM_SPACEBLOCKS 8
+#define NUM_LAT1BLOCKS 63
+#define NUM_RULES 126
+static const struct _convrule_ rule116={GENCAT_LU, NUMCAT_LU, 1, 0, -8383, 0};
+static const struct _convrule_ rule108={GENCAT_LU, NUMCAT_LU, 1, 0, -86, 0};
+static const struct _convrule_ rule88={GENCAT_LU, NUMCAT_LU, 1, 0, 80, 0};
+static const struct _convrule_ rule86={GENCAT_LL, NUMCAT_LL, 1, -96, 0, -96};
+static const struct _convrule_ rule79={GENCAT_LU, NUMCAT_LU, 0, 0, 0, 0};
+static const struct _convrule_ rule56={GENCAT_LL, NUMCAT_LL, 1, -203, 0, -203};
+static const struct _convrule_ rule54={GENCAT_LL, NUMCAT_LL, 1, -205, 0, -205};
+static const struct _convrule_ rule48={GENCAT_LL, NUMCAT_LL, 1, -79, 0, -79};
+static const struct _convrule_ rule40={GENCAT_LU, NUMCAT_LU, 1, 0, 218, 0};
+static const struct _convrule_ rule113={GENCAT_ZL, NUMCAT_ZL, 0, 0, 0, 0};
+static const struct _convrule_ rule103={GENCAT_LT, NUMCAT_LT, 1, 0, -8, 0};
+static const struct _convrule_ rule98={GENCAT_LL, NUMCAT_LL, 1, 86, 0, 86};
+static const struct _convrule_ rule95={GENCAT_LL, NUMCAT_LL, 1, 8, 0, 8};
+static const struct _convrule_ rule39={GENCAT_LU, NUMCAT_LU, 1, 0, 214, 0};
+static const struct _convrule_ rule119={GENCAT_NL, NUMCAT_NL, 1, -16, 0, -16};
+static const struct _convrule_ rule101={GENCAT_LL, NUMCAT_LL, 1, 112, 0, 112};
+static const struct _convrule_ rule93={GENCAT_NL, NUMCAT_NL, 0, 0, 0, 0};
+static const struct _convrule_ rule60={GENCAT_LL, NUMCAT_LL, 1, -213, 0, -213};
+static const struct _convrule_ rule59={GENCAT_LL, NUMCAT_LL, 1, -211, 0, -211};
+static const struct _convrule_ rule42={GENCAT_LU, NUMCAT_LU, 1, 0, 219, 0};
+static const struct _convrule_ rule38={GENCAT_LL, NUMCAT_LL, 1, 130, 0, 130};
+static const struct _convrule_ rule34={GENCAT_LL, NUMCAT_LL, 1, 97, 0, 97};
+static const struct _convrule_ rule25={GENCAT_LU, NUMCAT_LU, 1, 0, -121, 0};
+static const struct _convrule_ rule24={GENCAT_LL, NUMCAT_LL, 1, -232, 0, -232};
+static const struct _convrule_ rule20={GENCAT_LL, NUMCAT_LL, 1, 121, 0, 121};
+static const struct _convrule_ rule16={GENCAT_CF, NUMCAT_CF, 0, 0, 0, 0};
+static const struct _convrule_ rule4={GENCAT_PS, NUMCAT_PS, 0, 0, 0, 0};
+static const struct _convrule_ rule123={GENCAT_CO, NUMCAT_CO, 0, 0, 0, 0};
+static const struct _convrule_ rule112={GENCAT_LU, NUMCAT_LU, 1, 0, -126, 0};
+static const struct _convrule_ rule106={GENCAT_LT, NUMCAT_LT, 1, 0, -9, 0};
+static const struct _convrule_ rule105={GENCAT_LU, NUMCAT_LU, 1, 0, -74, 0};
+static const struct _convrule_ rule97={GENCAT_LL, NUMCAT_LL, 1, 74, 0, 74};
+static const struct _convrule_ rule65={GENCAT_LM, NUMCAT_LM, 0, 0, 0, 0};
+static const struct _convrule_ rule30={GENCAT_LU, NUMCAT_LU, 1, 0, 79, 0};
+static const struct _convrule_ rule5={GENCAT_PE, NUMCAT_PE, 0, 0, 0, 0};
+static const struct _convrule_ rule114={GENCAT_ZP, NUMCAT_ZP, 0, 0, 0, 0};
+static const struct _convrule_ rule104={GENCAT_LL, NUMCAT_LL, 1, 9, 0, 9};
+static const struct _convrule_ rule94={GENCAT_LL, NUMCAT_LL, 1, -59, 0, -59};
+static const struct _convrule_ rule92={GENCAT_MC, NUMCAT_MC, 0, 0, 0, 0};
+static const struct _convrule_ rule91={GENCAT_LL, NUMCAT_LL, 1, -48, 0, -48};
+static const struct _convrule_ rule82={GENCAT_LL, NUMCAT_LL, 1, -86, 0, -86};
+static const struct _convrule_ rule78={GENCAT_LL, NUMCAT_LL, 1, -57, 0, -57};
+static const struct _convrule_ rule66={GENCAT_MN, NUMCAT_MN, 0, 0, 0, 0};
+static const struct _convrule_ rule55={GENCAT_LL, NUMCAT_LL, 1, -202, 0, -202};
+static const struct _convrule_ rule50={GENCAT_LU, NUMCAT_LU, 1, 0, -56, 0};
+static const struct _convrule_ rule45={GENCAT_LU, NUMCAT_LU, 1, 0, 2, 1};
+static const struct _convrule_ rule31={GENCAT_LU, NUMCAT_LU, 1, 0, 202, 0};
+static const struct _convrule_ rule6={GENCAT_SM, NUMCAT_SM, 0, 0, 0, 0};
+static const struct _convrule_ rule107={GENCAT_LL, NUMCAT_LL, 1, -7205, 0, -7205};
+static const struct _convrule_ rule90={GENCAT_LU, NUMCAT_LU, 1, 0, 48, 0};
+static const struct _convrule_ rule87={GENCAT_LU, NUMCAT_LU, 1, 0, -7, 0};
+static const struct _convrule_ rule44={GENCAT_LL, NUMCAT_LL, 1, 56, 0, 56};
+static const struct _convrule_ rule33={GENCAT_LU, NUMCAT_LU, 1, 0, 207, 0};
+static const struct _convrule_ rule18={GENCAT_LL, NUMCAT_LL, 1, 743, 0, 743};
+static const struct _convrule_ rule17={GENCAT_NO, NUMCAT_NO, 0, 0, 0, 0};
+static const struct _convrule_ rule10={GENCAT_SK, NUMCAT_SK, 0, 0, 0, 0};
+static const struct _convrule_ rule8={GENCAT_ND, NUMCAT_ND, 0, 0, 0, 0};
+static const struct _convrule_ rule122={GENCAT_CS, NUMCAT_CS, 0, 0, 0, 0};
+static const struct _convrule_ rule99={GENCAT_LL, NUMCAT_LL, 1, 100, 0, 100};
+static const struct _convrule_ rule67={GENCAT_MN, NUMCAT_MN, 1, 84, 0, 84};
+static const struct _convrule_ rule52={GENCAT_LL, NUMCAT_LL, 1, -210, 0, -210};
+static const struct _convrule_ rule51={GENCAT_LU, NUMCAT_LU, 1, 0, -130, 0};
+static const struct _convrule_ rule32={GENCAT_LU, NUMCAT_LU, 1, 0, 203, 0};
+static const struct _convrule_ rule27={GENCAT_LU, NUMCAT_LU, 1, 0, 210, 0};
+static const struct _convrule_ rule15={GENCAT_PI, NUMCAT_PI, 0, 0, 0, 0};
+static const struct _convrule_ rule111={GENCAT_LU, NUMCAT_LU, 1, 0, -128, 0};
+static const struct _convrule_ rule96={GENCAT_LU, NUMCAT_LU, 1, 0, -8, 0};
+static const struct _convrule_ rule71={GENCAT_LU, NUMCAT_LU, 1, 0, 63, 0};
+static const struct _convrule_ rule64={GENCAT_LL, NUMCAT_LL, 1, -219, 0, -219};
+static const struct _convrule_ rule62={GENCAT_LL, NUMCAT_LL, 1, -218, 0, -218};
+static const struct _convrule_ rule23={GENCAT_LU, NUMCAT_LU, 1, 0, -199, 0};
+static const struct _convrule_ rule19={GENCAT_PF, NUMCAT_PF, 0, 0, 0, 0};
+static const struct _convrule_ rule1={GENCAT_ZS, NUMCAT_ZS, 0, 0, 0, 0};
+static const struct _convrule_ rule120={GENCAT_SO, NUMCAT_SO, 1, 0, 26, 0};
+static const struct _convrule_ rule115={GENCAT_LU, NUMCAT_LU, 1, 0, -7517, 0};
+static const struct _convrule_ rule83={GENCAT_LL, NUMCAT_LL, 1, -80, 0, -80};
+static const struct _convrule_ rule81={GENCAT_LL, NUMCAT_LL, 1, -54, 0, -54};
+static const struct _convrule_ rule80={GENCAT_LL, NUMCAT_LL, 1, -47, 0, -47};
+static const struct _convrule_ rule77={GENCAT_LL, NUMCAT_LL, 1, -62, 0, -62};
+static const struct _convrule_ rule76={GENCAT_LL, NUMCAT_LL, 1, -63, 0, -63};
+static const struct _convrule_ rule75={GENCAT_LL, NUMCAT_LL, 1, -64, 0, -64};
+static const struct _convrule_ rule73={GENCAT_LL, NUMCAT_LL, 1, -37, 0, -37};
+static const struct _convrule_ rule72={GENCAT_LL, NUMCAT_LL, 1, -38, 0, -38};
+static const struct _convrule_ rule35={GENCAT_LU, NUMCAT_LU, 1, 0, 211, 0};
+static const struct _convrule_ rule14={GENCAT_LL, NUMCAT_LL, 0, 0, 0, 0};
+static const struct _convrule_ rule11={GENCAT_PC, NUMCAT_PC, 0, 0, 0, 0};
+static const struct _convrule_ rule3={GENCAT_SC, NUMCAT_SC, 0, 0, 0, 0};
+static const struct _convrule_ rule2={GENCAT_PO, NUMCAT_PO, 0, 0, 0, 0};
+static const struct _convrule_ rule70={GENCAT_LU, NUMCAT_LU, 1, 0, 64, 0};
+static const struct _convrule_ rule58={GENCAT_LL, NUMCAT_LL, 1, -209, 0, -209};
+static const struct _convrule_ rule57={GENCAT_LL, NUMCAT_LL, 1, -207, 0, -207};
+static const struct _convrule_ rule53={GENCAT_LL, NUMCAT_LL, 1, -206, 0, -206};
+static const struct _convrule_ rule46={GENCAT_LT, NUMCAT_LT, 1, -1, 1, 0};
+static const struct _convrule_ rule36={GENCAT_LU, NUMCAT_LU, 1, 0, 209, 0};
+static const struct _convrule_ rule26={GENCAT_LL, NUMCAT_LL, 1, -300, 0, -300};
+static const struct _convrule_ rule9={GENCAT_LU, NUMCAT_LU, 1, 0, 32, 0};
+static const struct _convrule_ rule121={GENCAT_SO, NUMCAT_SO, 1, -26, 0, -26};
+static const struct _convrule_ rule117={GENCAT_LU, NUMCAT_LU, 1, 0, -8262, 0};
+static const struct _convrule_ rule109={GENCAT_LU, NUMCAT_LU, 1, 0, -100, 0};
+static const struct _convrule_ rule69={GENCAT_LU, NUMCAT_LU, 1, 0, 37, 0};
+static const struct _convrule_ rule29={GENCAT_LU, NUMCAT_LU, 1, 0, 205, 0};
+static const struct _convrule_ rule21={GENCAT_LU, NUMCAT_LU, 1, 0, 1, 0};
+static const struct _convrule_ rule124={GENCAT_LU, NUMCAT_LU, 1, 0, 40, 0};
+static const struct _convrule_ rule110={GENCAT_LU, NUMCAT_LU, 1, 0, -112, 0};
+static const struct _convrule_ rule102={GENCAT_LL, NUMCAT_LL, 1, 126, 0, 126};
+static const struct _convrule_ rule100={GENCAT_LL, NUMCAT_LL, 1, 128, 0, 128};
+static const struct _convrule_ rule85={GENCAT_LU, NUMCAT_LU, 1, 0, -60, 0};
+static const struct _convrule_ rule84={GENCAT_LL, NUMCAT_LL, 1, 7, 0, 7};
+static const struct _convrule_ rule63={GENCAT_LL, NUMCAT_LL, 1, -217, 0, -217};
+static const struct _convrule_ rule61={GENCAT_LL, NUMCAT_LL, 1, -214, 0, -214};
+static const struct _convrule_ rule43={GENCAT_LO, NUMCAT_LO, 0, 0, 0, 0};
+static const struct _convrule_ rule41={GENCAT_LU, NUMCAT_LU, 1, 0, 217, 0};
+static const struct _convrule_ rule125={GENCAT_LL, NUMCAT_LL, 1, -40, 0, -40};
+static const struct _convrule_ rule118={GENCAT_NL, NUMCAT_NL, 1, 0, 16, 0};
+static const struct _convrule_ rule89={GENCAT_ME, NUMCAT_ME, 0, 0, 0, 0};
+static const struct _convrule_ rule74={GENCAT_LL, NUMCAT_LL, 1, -31, 0, -31};
+static const struct _convrule_ rule68={GENCAT_LU, NUMCAT_LU, 1, 0, 38, 0};
+static const struct _convrule_ rule49={GENCAT_LU, NUMCAT_LU, 1, 0, -97, 0};
+static const struct _convrule_ rule47={GENCAT_LL, NUMCAT_LL, 1, -2, 0, -1};
+static const struct _convrule_ rule37={GENCAT_LU, NUMCAT_LU, 1, 0, 213, 0};
+static const struct _convrule_ rule28={GENCAT_LU, NUMCAT_LU, 1, 0, 206, 0};
+static const struct _convrule_ rule22={GENCAT_LL, NUMCAT_LL, 1, -1, 0, -1};
+static const struct _convrule_ rule13={GENCAT_SO, NUMCAT_SO, 0, 0, 0, 0};
+static const struct _convrule_ rule12={GENCAT_LL, NUMCAT_LL, 1, -32, 0, -32};
+static const struct _convrule_ rule7={GENCAT_PD, NUMCAT_PD, 0, 0, 0, 0};
+static const struct _convrule_ rule0={GENCAT_CC, NUMCAT_CC, 0, 0, 0, 0};
+static const struct _charblock_ allchars[]={
+       {0, 32, &rule0},
+       {32, 1, &rule1},
+       {33, 3, &rule2},
+       {36, 1, &rule3},
+       {37, 3, &rule2},
+       {40, 1, &rule4},
+       {41, 1, &rule5},
+       {42, 1, &rule2},
+       {43, 1, &rule6},
+       {44, 1, &rule2},
+       {45, 1, &rule7},
+       {46, 2, &rule2},
+       {48, 10, &rule8},
+       {58, 2, &rule2},
+       {60, 3, &rule6},
+       {63, 2, &rule2},
+       {65, 26, &rule9},
+       {91, 1, &rule4},
+       {92, 1, &rule2},
+       {93, 1, &rule5},
+       {94, 1, &rule10},
+       {95, 1, &rule11},
+       {96, 1, &rule10},
+       {97, 26, &rule12},
+       {123, 1, &rule4},
+       {124, 1, &rule6},
+       {125, 1, &rule5},
+       {126, 1, &rule6},
+       {127, 33, &rule0},
+       {160, 1, &rule1},
+       {161, 1, &rule2},
+       {162, 4, &rule3},
+       {166, 2, &rule13},
+       {168, 1, &rule10},
+       {169, 1, &rule13},
+       {170, 1, &rule14},
+       {171, 1, &rule15},
+       {172, 1, &rule6},
+       {173, 1, &rule16},
+       {174, 1, &rule13},
+       {175, 1, &rule10},
+       {176, 1, &rule13},
+       {177, 1, &rule6},
+       {178, 2, &rule17},
+       {180, 1, &rule10},
+       {181, 1, &rule18},
+       {182, 1, &rule13},
+       {183, 1, &rule2},
+       {184, 1, &rule10},
+       {185, 1, &rule17},
+       {186, 1, &rule14},
+       {187, 1, &rule19},
+       {188, 3, &rule17},
+       {191, 1, &rule2},
+       {192, 23, &rule9},
+       {215, 1, &rule6},
+       {216, 7, &rule9},
+       {223, 1, &rule14},
+       {224, 23, &rule12},
+       {247, 1, &rule6},
+       {248, 7, &rule12},
+       {255, 1, &rule20},
+       {256, 1, &rule21},
+       {257, 1, &rule22},
+       {258, 1, &rule21},
+       {259, 1, &rule22},
+       {260, 1, &rule21},
+       {261, 1, &rule22},
+       {262, 1, &rule21},
+       {263, 1, &rule22},
+       {264, 1, &rule21},
+       {265, 1, &rule22},
+       {266, 1, &rule21},
+       {267, 1, &rule22},
+       {268, 1, &rule21},
+       {269, 1, &rule22},
+       {270, 1, &rule21},
+       {271, 1, &rule22},
+       {272, 1, &rule21},
+       {273, 1, &rule22},
+       {274, 1, &rule21},
+       {275, 1, &rule22},
+       {276, 1, &rule21},
+       {277, 1, &rule22},
+       {278, 1, &rule21},
+       {279, 1, &rule22},
+       {280, 1, &rule21},
+       {281, 1, &rule22},
+       {282, 1, &rule21},
+       {283, 1, &rule22},
+       {284, 1, &rule21},
+       {285, 1, &rule22},
+       {286, 1, &rule21},
+       {287, 1, &rule22},
+       {288, 1, &rule21},
+       {289, 1, &rule22},
+       {290, 1, &rule21},
+       {291, 1, &rule22},
+       {292, 1, &rule21},
+       {293, 1, &rule22},
+       {294, 1, &rule21},
+       {295, 1, &rule22},
+       {296, 1, &rule21},
+       {297, 1, &rule22},
+       {298, 1, &rule21},
+       {299, 1, &rule22},
+       {300, 1, &rule21},
+       {301, 1, &rule22},
+       {302, 1, &rule21},
+       {303, 1, &rule22},
+       {304, 1, &rule23},
+       {305, 1, &rule24},
+       {306, 1, &rule21},
+       {307, 1, &rule22},
+       {308, 1, &rule21},
+       {309, 1, &rule22},
+       {310, 1, &rule21},
+       {311, 1, &rule22},
+       {312, 1, &rule14},
+       {313, 1, &rule21},
+       {314, 1, &rule22},
+       {315, 1, &rule21},
+       {316, 1, &rule22},
+       {317, 1, &rule21},
+       {318, 1, &rule22},
+       {319, 1, &rule21},
+       {320, 1, &rule22},
+       {321, 1, &rule21},
+       {322, 1, &rule22},
+       {323, 1, &rule21},
+       {324, 1, &rule22},
+       {325, 1, &rule21},
+       {326, 1, &rule22},
+       {327, 1, &rule21},
+       {328, 1, &rule22},
+       {329, 1, &rule14},
+       {330, 1, &rule21},
+       {331, 1, &rule22},
+       {332, 1, &rule21},
+       {333, 1, &rule22},
+       {334, 1, &rule21},
+       {335, 1, &rule22},
+       {336, 1, &rule21},
+       {337, 1, &rule22},
+       {338, 1, &rule21},
+       {339, 1, &rule22},
+       {340, 1, &rule21},
+       {341, 1, &rule22},
+       {342, 1, &rule21},
+       {343, 1, &rule22},
+       {344, 1, &rule21},
+       {345, 1, &rule22},
+       {346, 1, &rule21},
+       {347, 1, &rule22},
+       {348, 1, &rule21},
+       {349, 1, &rule22},
+       {350, 1, &rule21},
+       {351, 1, &rule22},
+       {352, 1, &rule21},
+       {353, 1, &rule22},
+       {354, 1, &rule21},
+       {355, 1, &rule22},
+       {356, 1, &rule21},
+       {357, 1, &rule22},
+       {358, 1, &rule21},
+       {359, 1, &rule22},
+       {360, 1, &rule21},
+       {361, 1, &rule22},
+       {362, 1, &rule21},
+       {363, 1, &rule22},
+       {364, 1, &rule21},
+       {365, 1, &rule22},
+       {366, 1, &rule21},
+       {367, 1, &rule22},
+       {368, 1, &rule21},
+       {369, 1, &rule22},
+       {370, 1, &rule21},
+       {371, 1, &rule22},
+       {372, 1, &rule21},
+       {373, 1, &rule22},
+       {374, 1, &rule21},
+       {375, 1, &rule22},
+       {376, 1, &rule25},
+       {377, 1, &rule21},
+       {378, 1, &rule22},
+       {379, 1, &rule21},
+       {380, 1, &rule22},
+       {381, 1, &rule21},
+       {382, 1, &rule22},
+       {383, 1, &rule26},
+       {384, 1, &rule14},
+       {385, 1, &rule27},
+       {386, 1, &rule21},
+       {387, 1, &rule22},
+       {388, 1, &rule21},
+       {389, 1, &rule22},
+       {390, 1, &rule28},
+       {391, 1, &rule21},
+       {392, 1, &rule22},
+       {393, 2, &rule29},
+       {395, 1, &rule21},
+       {396, 1, &rule22},
+       {397, 1, &rule14},
+       {398, 1, &rule30},
+       {399, 1, &rule31},
+       {400, 1, &rule32},
+       {401, 1, &rule21},
+       {402, 1, &rule22},
+       {403, 1, &rule29},
+       {404, 1, &rule33},
+       {405, 1, &rule34},
+       {406, 1, &rule35},
+       {407, 1, &rule36},
+       {408, 1, &rule21},
+       {409, 1, &rule22},
+       {410, 2, &rule14},
+       {412, 1, &rule35},
+       {413, 1, &rule37},
+       {414, 1, &rule38},
+       {415, 1, &rule39},
+       {416, 1, &rule21},
+       {417, 1, &rule22},
+       {418, 1, &rule21},
+       {419, 1, &rule22},
+       {420, 1, &rule21},
+       {421, 1, &rule22},
+       {422, 1, &rule40},
+       {423, 1, &rule21},
+       {424, 1, &rule22},
+       {425, 1, &rule40},
+       {426, 2, &rule14},
+       {428, 1, &rule21},
+       {429, 1, &rule22},
+       {430, 1, &rule40},
+       {431, 1, &rule21},
+       {432, 1, &rule22},
+       {433, 2, &rule41},
+       {435, 1, &rule21},
+       {436, 1, &rule22},
+       {437, 1, &rule21},
+       {438, 1, &rule22},
+       {439, 1, &rule42},
+       {440, 1, &rule21},
+       {441, 1, &rule22},
+       {442, 1, &rule14},
+       {443, 1, &rule43},
+       {444, 1, &rule21},
+       {445, 1, &rule22},
+       {446, 1, &rule14},
+       {447, 1, &rule44},
+       {448, 4, &rule43},
+       {452, 1, &rule45},
+       {453, 1, &rule46},
+       {454, 1, &rule47},
+       {455, 1, &rule45},
+       {456, 1, &rule46},
+       {457, 1, &rule47},
+       {458, 1, &rule45},
+       {459, 1, &rule46},
+       {460, 1, &rule47},
+       {461, 1, &rule21},
+       {462, 1, &rule22},
+       {463, 1, &rule21},
+       {464, 1, &rule22},
+       {465, 1, &rule21},
+       {466, 1, &rule22},
+       {467, 1, &rule21},
+       {468, 1, &rule22},
+       {469, 1, &rule21},
+       {470, 1, &rule22},
+       {471, 1, &rule21},
+       {472, 1, &rule22},
+       {473, 1, &rule21},
+       {474, 1, &rule22},
+       {475, 1, &rule21},
+       {476, 1, &rule22},
+       {477, 1, &rule48},
+       {478, 1, &rule21},
+       {479, 1, &rule22},
+       {480, 1, &rule21},
+       {481, 1, &rule22},
+       {482, 1, &rule21},
+       {483, 1, &rule22},
+       {484, 1, &rule21},
+       {485, 1, &rule22},
+       {486, 1, &rule21},
+       {487, 1, &rule22},
+       {488, 1, &rule21},
+       {489, 1, &rule22},
+       {490, 1, &rule21},
+       {491, 1, &rule22},
+       {492, 1, &rule21},
+       {493, 1, &rule22},
+       {494, 1, &rule21},
+       {495, 1, &rule22},
+       {496, 1, &rule14},
+       {497, 1, &rule45},
+       {498, 1, &rule46},
+       {499, 1, &rule47},
+       {500, 1, &rule21},
+       {501, 1, &rule22},
+       {502, 1, &rule49},
+       {503, 1, &rule50},
+       {504, 1, &rule21},
+       {505, 1, &rule22},
+       {506, 1, &rule21},
+       {507, 1, &rule22},
+       {508, 1, &rule21},
+       {509, 1, &rule22},
+       {510, 1, &rule21},
+       {511, 1, &rule22},
+       {512, 1, &rule21},
+       {513, 1, &rule22},
+       {514, 1, &rule21},
+       {515, 1, &rule22},
+       {516, 1, &rule21},
+       {517, 1, &rule22},
+       {518, 1, &rule21},
+       {519, 1, &rule22},
+       {520, 1, &rule21},
+       {521, 1, &rule22},
+       {522, 1, &rule21},
+       {523, 1, &rule22},
+       {524, 1, &rule21},
+       {525, 1, &rule22},
+       {526, 1, &rule21},
+       {527, 1, &rule22},
+       {528, 1, &rule21},
+       {529, 1, &rule22},
+       {530, 1, &rule21},
+       {531, 1, &rule22},
+       {532, 1, &rule21},
+       {533, 1, &rule22},
+       {534, 1, &rule21},
+       {535, 1, &rule22},
+       {536, 1, &rule21},
+       {537, 1, &rule22},
+       {538, 1, &rule21},
+       {539, 1, &rule22},
+       {540, 1, &rule21},
+       {541, 1, &rule22},
+       {542, 1, &rule21},
+       {543, 1, &rule22},
+       {544, 1, &rule51},
+       {545, 1, &rule14},
+       {546, 1, &rule21},
+       {547, 1, &rule22},
+       {548, 1, &rule21},
+       {549, 1, &rule22},
+       {550, 1, &rule21},
+       {551, 1, &rule22},
+       {552, 1, &rule21},
+       {553, 1, &rule22},
+       {554, 1, &rule21},
+       {555, 1, &rule22},
+       {556, 1, &rule21},
+       {557, 1, &rule22},
+       {558, 1, &rule21},
+       {559, 1, &rule22},
+       {560, 1, &rule21},
+       {561, 1, &rule22},
+       {562, 1, &rule21},
+       {563, 1, &rule22},
+       {564, 3, &rule14},
+       {592, 3, &rule14},
+       {595, 1, &rule52},
+       {596, 1, &rule53},
+       {597, 1, &rule14},
+       {598, 2, &rule54},
+       {600, 1, &rule14},
+       {601, 1, &rule55},
+       {602, 1, &rule14},
+       {603, 1, &rule56},
+       {604, 4, &rule14},
+       {608, 1, &rule54},
+       {609, 2, &rule14},
+       {611, 1, &rule57},
+       {612, 4, &rule14},
+       {616, 1, &rule58},
+       {617, 1, &rule59},
+       {618, 5, &rule14},
+       {623, 1, &rule59},
+       {624, 2, &rule14},
+       {626, 1, &rule60},
+       {627, 2, &rule14},
+       {629, 1, &rule61},
+       {630, 10, &rule14},
+       {640, 1, &rule62},
+       {641, 2, &rule14},
+       {643, 1, &rule62},
+       {644, 4, &rule14},
+       {648, 1, &rule62},
+       {649, 1, &rule14},
+       {650, 2, &rule63},
+       {652, 6, &rule14},
+       {658, 1, &rule64},
+       {659, 29, &rule14},
+       {688, 18, &rule65},
+       {706, 4, &rule10},
+       {710, 12, &rule65},
+       {722, 14, &rule10},
+       {736, 5, &rule65},
+       {741, 9, &rule10},
+       {750, 1, &rule65},
+       {751, 17, &rule10},
+       {768, 69, &rule66},
+       {837, 1, &rule67},
+       {838, 18, &rule66},
+       {861, 19, &rule66},
+       {884, 2, &rule10},
+       {890, 1, &rule65},
+       {894, 1, &rule2},
+       {900, 2, &rule10},
+       {902, 1, &rule68},
+       {903, 1, &rule2},
+       {904, 3, &rule69},
+       {908, 1, &rule70},
+       {910, 2, &rule71},
+       {912, 1, &rule14},
+       {913, 17, &rule9},
+       {931, 9, &rule9},
+       {940, 1, &rule72},
+       {941, 3, &rule73},
+       {944, 1, &rule14},
+       {945, 17, &rule12},
+       {962, 1, &rule74},
+       {963, 9, &rule12},
+       {972, 1, &rule75},
+       {973, 2, &rule76},
+       {976, 1, &rule77},
+       {977, 1, &rule78},
+       {978, 3, &rule79},
+       {981, 1, &rule80},
+       {982, 1, &rule81},
+       {983, 1, &rule14},
+       {984, 1, &rule21},
+       {985, 1, &rule22},
+       {986, 1, &rule21},
+       {987, 1, &rule22},
+       {988, 1, &rule21},
+       {989, 1, &rule22},
+       {990, 1, &rule21},
+       {991, 1, &rule22},
+       {992, 1, &rule21},
+       {993, 1, &rule22},
+       {994, 1, &rule21},
+       {995, 1, &rule22},
+       {996, 1, &rule21},
+       {997, 1, &rule22},
+       {998, 1, &rule21},
+       {999, 1, &rule22},
+       {1000, 1, &rule21},
+       {1001, 1, &rule22},
+       {1002, 1, &rule21},
+       {1003, 1, &rule22},
+       {1004, 1, &rule21},
+       {1005, 1, &rule22},
+       {1006, 1, &rule21},
+       {1007, 1, &rule22},
+       {1008, 1, &rule82},
+       {1009, 1, &rule83},
+       {1010, 1, &rule84},
+       {1011, 1, &rule14},
+       {1012, 1, &rule85},
+       {1013, 1, &rule86},
+       {1014, 1, &rule6},
+       {1015, 1, &rule21},
+       {1016, 1, &rule22},
+       {1017, 1, &rule87},
+       {1018, 1, &rule21},
+       {1019, 1, &rule22},
+       {1024, 16, &rule88},
+       {1040, 32, &rule9},
+       {1072, 32, &rule12},
+       {1104, 16, &rule83},
+       {1120, 1, &rule21},
+       {1121, 1, &rule22},
+       {1122, 1, &rule21},
+       {1123, 1, &rule22},
+       {1124, 1, &rule21},
+       {1125, 1, &rule22},
+       {1126, 1, &rule21},
+       {1127, 1, &rule22},
+       {1128, 1, &rule21},
+       {1129, 1, &rule22},
+       {1130, 1, &rule21},
+       {1131, 1, &rule22},
+       {1132, 1, &rule21},
+       {1133, 1, &rule22},
+       {1134, 1, &rule21},
+       {1135, 1, &rule22},
+       {1136, 1, &rule21},
+       {1137, 1, &rule22},
+       {1138, 1, &rule21},
+       {1139, 1, &rule22},
+       {1140, 1, &rule21},
+       {1141, 1, &rule22},
+       {1142, 1, &rule21},
+       {1143, 1, &rule22},
+       {1144, 1, &rule21},
+       {1145, 1, &rule22},
+       {1146, 1, &rule21},
+       {1147, 1, &rule22},
+       {1148, 1, &rule21},
+       {1149, 1, &rule22},
+       {1150, 1, &rule21},
+       {1151, 1, &rule22},
+       {1152, 1, &rule21},
+       {1153, 1, &rule22},
+       {1154, 1, &rule13},
+       {1155, 4, &rule66},
+       {1160, 2, &rule89},
+       {1162, 1, &rule21},
+       {1163, 1, &rule22},
+       {1164, 1, &rule21},
+       {1165, 1, &rule22},
+       {1166, 1, &rule21},
+       {1167, 1, &rule22},
+       {1168, 1, &rule21},
+       {1169, 1, &rule22},
+       {1170, 1, &rule21},
+       {1171, 1, &rule22},
+       {1172, 1, &rule21},
+       {1173, 1, &rule22},
+       {1174, 1, &rule21},
+       {1175, 1, &rule22},
+       {1176, 1, &rule21},
+       {1177, 1, &rule22},
+       {1178, 1, &rule21},
+       {1179, 1, &rule22},
+       {1180, 1, &rule21},
+       {1181, 1, &rule22},
+       {1182, 1, &rule21},
+       {1183, 1, &rule22},
+       {1184, 1, &rule21},
+       {1185, 1, &rule22},
+       {1186, 1, &rule21},
+       {1187, 1, &rule22},
+       {1188, 1, &rule21},
+       {1189, 1, &rule22},
+       {1190, 1, &rule21},
+       {1191, 1, &rule22},
+       {1192, 1, &rule21},
+       {1193, 1, &rule22},
+       {1194, 1, &rule21},
+       {1195, 1, &rule22},
+       {1196, 1, &rule21},
+       {1197, 1, &rule22},
+       {1198, 1, &rule21},
+       {1199, 1, &rule22},
+       {1200, 1, &rule21},
+       {1201, 1, &rule22},
+       {1202, 1, &rule21},
+       {1203, 1, &rule22},
+       {1204, 1, &rule21},
+       {1205, 1, &rule22},
+       {1206, 1, &rule21},
+       {1207, 1, &rule22},
+       {1208, 1, &rule21},
+       {1209, 1, &rule22},
+       {1210, 1, &rule21},
+       {1211, 1, &rule22},
+       {1212, 1, &rule21},
+       {1213, 1, &rule22},
+       {1214, 1, &rule21},
+       {1215, 1, &rule22},
+       {1216, 1, &rule79},
+       {1217, 1, &rule21},
+       {1218, 1, &rule22},
+       {1219, 1, &rule21},
+       {1220, 1, &rule22},
+       {1221, 1, &rule21},
+       {1222, 1, &rule22},
+       {1223, 1, &rule21},
+       {1224, 1, &rule22},
+       {1225, 1, &rule21},
+       {1226, 1, &rule22},
+       {1227, 1, &rule21},
+       {1228, 1, &rule22},
+       {1229, 1, &rule21},
+       {1230, 1, &rule22},
+       {1232, 1, &rule21},
+       {1233, 1, &rule22},
+       {1234, 1, &rule21},
+       {1235, 1, &rule22},
+       {1236, 1, &rule21},
+       {1237, 1, &rule22},
+       {1238, 1, &rule21},
+       {1239, 1, &rule22},
+       {1240, 1, &rule21},
+       {1241, 1, &rule22},
+       {1242, 1, &rule21},
+       {1243, 1, &rule22},
+       {1244, 1, &rule21},
+       {1245, 1, &rule22},
+       {1246, 1, &rule21},
+       {1247, 1, &rule22},
+       {1248, 1, &rule21},
+       {1249, 1, &rule22},
+       {1250, 1, &rule21},
+       {1251, 1, &rule22},
+       {1252, 1, &rule21},
+       {1253, 1, &rule22},
+       {1254, 1, &rule21},
+       {1255, 1, &rule22},
+       {1256, 1, &rule21},
+       {1257, 1, &rule22},
+       {1258, 1, &rule21},
+       {1259, 1, &rule22},
+       {1260, 1, &rule21},
+       {1261, 1, &rule22},
+       {1262, 1, &rule21},
+       {1263, 1, &rule22},
+       {1264, 1, &rule21},
+       {1265, 1, &rule22},
+       {1266, 1, &rule21},
+       {1267, 1, &rule22},
+       {1268, 1, &rule21},
+       {1269, 1, &rule22},
+       {1272, 1, &rule21},
+       {1273, 1, &rule22},
+       {1280, 1, &rule21},
+       {1281, 1, &rule22},
+       {1282, 1, &rule21},
+       {1283, 1, &rule22},
+       {1284, 1, &rule21},
+       {1285, 1, &rule22},
+       {1286, 1, &rule21},
+       {1287, 1, &rule22},
+       {1288, 1, &rule21},
+       {1289, 1, &rule22},
+       {1290, 1, &rule21},
+       {1291, 1, &rule22},
+       {1292, 1, &rule21},
+       {1293, 1, &rule22},
+       {1294, 1, &rule21},
+       {1295, 1, &rule22},
+       {1329, 38, &rule90},
+       {1369, 1, &rule65},
+       {1370, 6, &rule2},
+       {1377, 38, &rule91},
+       {1415, 1, &rule14},
+       {1417, 1, &rule2},
+       {1418, 1, &rule7},
+       {1425, 17, &rule66},
+       {1443, 23, &rule66},
+       {1467, 3, &rule66},
+       {1470, 1, &rule2},
+       {1471, 1, &rule66},
+       {1472, 1, &rule2},
+       {1473, 2, &rule66},
+       {1475, 1, &rule2},
+       {1476, 1, &rule66},
+       {1488, 27, &rule43},
+       {1520, 3, &rule43},
+       {1523, 2, &rule2},
+       {1536, 4, &rule16},
+       {1548, 2, &rule2},
+       {1550, 2, &rule13},
+       {1552, 6, &rule66},
+       {1563, 1, &rule2},
+       {1567, 1, &rule2},
+       {1569, 26, &rule43},
+       {1600, 1, &rule65},
+       {1601, 10, &rule43},
+       {1611, 14, &rule66},
+       {1632, 10, &rule8},
+       {1642, 4, &rule2},
+       {1646, 2, &rule43},
+       {1648, 1, &rule66},
+       {1649, 99, &rule43},
+       {1748, 1, &rule2},
+       {1749, 1, &rule43},
+       {1750, 7, &rule66},
+       {1757, 1, &rule16},
+       {1758, 1, &rule89},
+       {1759, 6, &rule66},
+       {1765, 2, &rule65},
+       {1767, 2, &rule66},
+       {1769, 1, &rule13},
+       {1770, 4, &rule66},
+       {1774, 2, &rule43},
+       {1776, 10, &rule8},
+       {1786, 3, &rule43},
+       {1789, 2, &rule13},
+       {1791, 1, &rule43},
+       {1792, 14, &rule2},
+       {1807, 1, &rule16},
+       {1808, 1, &rule43},
+       {1809, 1, &rule66},
+       {1810, 30, &rule43},
+       {1840, 27, &rule66},
+       {1869, 3, &rule43},
+       {1920, 38, &rule43},
+       {1958, 11, &rule66},
+       {1969, 1, &rule43},
+       {2305, 2, &rule66},
+       {2307, 1, &rule92},
+       {2308, 54, &rule43},
+       {2364, 1, &rule66},
+       {2365, 1, &rule43},
+       {2366, 3, &rule92},
+       {2369, 8, &rule66},
+       {2377, 4, &rule92},
+       {2381, 1, &rule66},
+       {2384, 1, &rule43},
+       {2385, 4, &rule66},
+       {2392, 10, &rule43},
+       {2402, 2, &rule66},
+       {2404, 2, &rule2},
+       {2406, 10, &rule8},
+       {2416, 1, &rule2},
+       {2433, 1, &rule66},
+       {2434, 2, &rule92},
+       {2437, 8, &rule43},
+       {2447, 2, &rule43},
+       {2451, 22, &rule43},
+       {2474, 7, &rule43},
+       {2482, 1, &rule43},
+       {2486, 4, &rule43},
+       {2492, 1, &rule66},
+       {2493, 1, &rule43},
+       {2494, 3, &rule92},
+       {2497, 4, &rule66},
+       {2503, 2, &rule92},
+       {2507, 2, &rule92},
+       {2509, 1, &rule66},
+       {2519, 1, &rule92},
+       {2524, 2, &rule43},
+       {2527, 3, &rule43},
+       {2530, 2, &rule66},
+       {2534, 10, &rule8},
+       {2544, 2, &rule43},
+       {2546, 2, &rule3},
+       {2548, 6, &rule17},
+       {2554, 1, &rule13},
+       {2561, 2, &rule66},
+       {2563, 1, &rule92},
+       {2565, 6, &rule43},
+       {2575, 2, &rule43},
+       {2579, 22, &rule43},
+       {2602, 7, &rule43},
+       {2610, 2, &rule43},
+       {2613, 2, &rule43},
+       {2616, 2, &rule43},
+       {2620, 1, &rule66},
+       {2622, 3, &rule92},
+       {2625, 2, &rule66},
+       {2631, 2, &rule66},
+       {2635, 3, &rule66},
+       {2649, 4, &rule43},
+       {2654, 1, &rule43},
+       {2662, 10, &rule8},
+       {2672, 2, &rule66},
+       {2674, 3, &rule43},
+       {2689, 2, &rule66},
+       {2691, 1, &rule92},
+       {2693, 9, &rule43},
+       {2703, 3, &rule43},
+       {2707, 22, &rule43},
+       {2730, 7, &rule43},
+       {2738, 2, &rule43},
+       {2741, 5, &rule43},
+       {2748, 1, &rule66},
+       {2749, 1, &rule43},
+       {2750, 3, &rule92},
+       {2753, 5, &rule66},
+       {2759, 2, &rule66},
+       {2761, 1, &rule92},
+       {2763, 2, &rule92},
+       {2765, 1, &rule66},
+       {2768, 1, &rule43},
+       {2784, 2, &rule43},
+       {2786, 2, &rule66},
+       {2790, 10, &rule8},
+       {2801, 1, &rule3},
+       {2817, 1, &rule66},
+       {2818, 2, &rule92},
+       {2821, 8, &rule43},
+       {2831, 2, &rule43},
+       {2835, 22, &rule43},
+       {2858, 7, &rule43},
+       {2866, 2, &rule43},
+       {2869, 5, &rule43},
+       {2876, 1, &rule66},
+       {2877, 1, &rule43},
+       {2878, 1, &rule92},
+       {2879, 1, &rule66},
+       {2880, 1, &rule92},
+       {2881, 3, &rule66},
+       {2887, 2, &rule92},
+       {2891, 2, &rule92},
+       {2893, 1, &rule66},
+       {2902, 1, &rule66},
+       {2903, 1, &rule92},
+       {2908, 2, &rule43},
+       {2911, 3, &rule43},
+       {2918, 10, &rule8},
+       {2928, 1, &rule13},
+       {2929, 1, &rule43},
+       {2946, 1, &rule66},
+       {2947, 1, &rule43},
+       {2949, 6, &rule43},
+       {2958, 3, &rule43},
+       {2962, 4, &rule43},
+       {2969, 2, &rule43},
+       {2972, 1, &rule43},
+       {2974, 2, &rule43},
+       {2979, 2, &rule43},
+       {2984, 3, &rule43},
+       {2990, 8, &rule43},
+       {2999, 3, &rule43},
+       {3006, 2, &rule92},
+       {3008, 1, &rule66},
+       {3009, 2, &rule92},
+       {3014, 3, &rule92},
+       {3018, 3, &rule92},
+       {3021, 1, &rule66},
+       {3031, 1, &rule92},
+       {3047, 9, &rule8},
+       {3056, 3, &rule17},
+       {3059, 6, &rule13},
+       {3065, 1, &rule3},
+       {3066, 1, &rule13},
+       {3073, 3, &rule92},
+       {3077, 8, &rule43},
+       {3086, 3, &rule43},
+       {3090, 23, &rule43},
+       {3114, 10, &rule43},
+       {3125, 5, &rule43},
+       {3134, 3, &rule66},
+       {3137, 4, &rule92},
+       {3142, 3, &rule66},
+       {3146, 4, &rule66},
+       {3157, 2, &rule66},
+       {3168, 2, &rule43},
+       {3174, 10, &rule8},
+       {3202, 2, &rule92},
+       {3205, 8, &rule43},
+       {3214, 3, &rule43},
+       {3218, 23, &rule43},
+       {3242, 10, &rule43},
+       {3253, 5, &rule43},
+       {3260, 1, &rule66},
+       {3261, 1, &rule43},
+       {3262, 1, &rule92},
+       {3263, 1, &rule66},
+       {3264, 5, &rule92},
+       {3270, 1, &rule66},
+       {3271, 2, &rule92},
+       {3274, 2, &rule92},
+       {3276, 2, &rule66},
+       {3285, 2, &rule92},
+       {3294, 1, &rule43},
+       {3296, 2, &rule43},
+       {3302, 10, &rule8},
+       {3330, 2, &rule92},
+       {3333, 8, &rule43},
+       {3342, 3, &rule43},
+       {3346, 23, &rule43},
+       {3370, 16, &rule43},
+       {3390, 3, &rule92},
+       {3393, 3, &rule66},
+       {3398, 3, &rule92},
+       {3402, 3, &rule92},
+       {3405, 1, &rule66},
+       {3415, 1, &rule92},
+       {3424, 2, &rule43},
+       {3430, 10, &rule8},
+       {3458, 2, &rule92},
+       {3461, 18, &rule43},
+       {3482, 24, &rule43},
+       {3507, 9, &rule43},
+       {3517, 1, &rule43},
+       {3520, 7, &rule43},
+       {3530, 1, &rule66},
+       {3535, 3, &rule92},
+       {3538, 3, &rule66},
+       {3542, 1, &rule66},
+       {3544, 8, &rule92},
+       {3570, 2, &rule92},
+       {3572, 1, &rule2},
+       {3585, 48, &rule43},
+       {3633, 1, &rule66},
+       {3634, 2, &rule43},
+       {3636, 7, &rule66},
+       {3647, 1, &rule3},
+       {3648, 6, &rule43},
+       {3654, 1, &rule65},
+       {3655, 8, &rule66},
+       {3663, 1, &rule2},
+       {3664, 10, &rule8},
+       {3674, 2, &rule2},
+       {3713, 2, &rule43},
+       {3716, 1, &rule43},
+       {3719, 2, &rule43},
+       {3722, 1, &rule43},
+       {3725, 1, &rule43},
+       {3732, 4, &rule43},
+       {3737, 7, &rule43},
+       {3745, 3, &rule43},
+       {3749, 1, &rule43},
+       {3751, 1, &rule43},
+       {3754, 2, &rule43},
+       {3757, 4, &rule43},
+       {3761, 1, &rule66},
+       {3762, 2, &rule43},
+       {3764, 6, &rule66},
+       {3771, 2, &rule66},
+       {3773, 1, &rule43},
+       {3776, 5, &rule43},
+       {3782, 1, &rule65},
+       {3784, 6, &rule66},
+       {3792, 10, &rule8},
+       {3804, 2, &rule43},
+       {3840, 1, &rule43},
+       {3841, 3, &rule13},
+       {3844, 15, &rule2},
+       {3859, 5, &rule13},
+       {3864, 2, &rule66},
+       {3866, 6, &rule13},
+       {3872, 10, &rule8},
+       {3882, 10, &rule17},
+       {3892, 1, &rule13},
+       {3893, 1, &rule66},
+       {3894, 1, &rule13},
+       {3895, 1, &rule66},
+       {3896, 1, &rule13},
+       {3897, 1, &rule66},
+       {3898, 1, &rule4},
+       {3899, 1, &rule5},
+       {3900, 1, &rule4},
+       {3901, 1, &rule5},
+       {3902, 2, &rule92},
+       {3904, 8, &rule43},
+       {3913, 34, &rule43},
+       {3953, 14, &rule66},
+       {3967, 1, &rule92},
+       {3968, 5, &rule66},
+       {3973, 1, &rule2},
+       {3974, 2, &rule66},
+       {3976, 4, &rule43},
+       {3984, 8, &rule66},
+       {3993, 36, &rule66},
+       {4030, 8, &rule13},
+       {4038, 1, &rule66},
+       {4039, 6, &rule13},
+       {4047, 1, &rule13},
+       {4096, 34, &rule43},
+       {4131, 5, &rule43},
+       {4137, 2, &rule43},
+       {4140, 1, &rule92},
+       {4141, 4, &rule66},
+       {4145, 1, &rule92},
+       {4146, 1, &rule66},
+       {4150, 2, &rule66},
+       {4152, 1, &rule92},
+       {4153, 1, &rule66},
+       {4160, 10, &rule8},
+       {4170, 6, &rule2},
+       {4176, 6, &rule43},
+       {4182, 2, &rule92},
+       {4184, 2, &rule66},
+       {4256, 38, &rule79},
+       {4304, 41, &rule43},
+       {4347, 1, &rule2},
+       {4352, 90, &rule43},
+       {4447, 68, &rule43},
+       {4520, 82, &rule43},
+       {4608, 7, &rule43},
+       {4616, 63, &rule43},
+       {4680, 1, &rule43},
+       {4682, 4, &rule43},
+       {4688, 7, &rule43},
+       {4696, 1, &rule43},
+       {4698, 4, &rule43},
+       {4704, 39, &rule43},
+       {4744, 1, &rule43},
+       {4746, 4, &rule43},
+       {4752, 31, &rule43},
+       {4784, 1, &rule43},
+       {4786, 4, &rule43},
+       {4792, 7, &rule43},
+       {4800, 1, &rule43},
+       {4802, 4, &rule43},
+       {4808, 7, &rule43},
+       {4816, 7, &rule43},
+       {4824, 23, &rule43},
+       {4848, 31, &rule43},
+       {4880, 1, &rule43},
+       {4882, 4, &rule43},
+       {4888, 7, &rule43},
+       {4896, 39, &rule43},
+       {4936, 19, &rule43},
+       {4961, 8, &rule2},
+       {4969, 9, &rule8},
+       {4978, 11, &rule17},
+       {5024, 85, &rule43},
+       {5121, 620, &rule43},
+       {5741, 2, &rule2},
+       {5743, 8, &rule43},
+       {5760, 1, &rule1},
+       {5761, 26, &rule43},
+       {5787, 1, &rule4},
+       {5788, 1, &rule5},
+       {5792, 75, &rule43},
+       {5867, 3, &rule2},
+       {5870, 3, &rule93},
+       {5888, 13, &rule43},
+       {5902, 4, &rule43},
+       {5906, 3, &rule66},
+       {5920, 18, &rule43},
+       {5938, 3, &rule66},
+       {5941, 2, &rule2},
+       {5952, 18, &rule43},
+       {5970, 2, &rule66},
+       {5984, 13, &rule43},
+       {5998, 3, &rule43},
+       {6002, 2, &rule66},
+       {6016, 52, &rule43},
+       {6068, 2, &rule16},
+       {6070, 1, &rule92},
+       {6071, 7, &rule66},
+       {6078, 8, &rule92},
+       {6086, 1, &rule66},
+       {6087, 2, &rule92},
+       {6089, 11, &rule66},
+       {6100, 3, &rule2},
+       {6103, 1, &rule65},
+       {6104, 3, &rule2},
+       {6107, 1, &rule3},
+       {6108, 1, &rule43},
+       {6109, 1, &rule66},
+       {6112, 10, &rule8},
+       {6128, 10, &rule17},
+       {6144, 6, &rule2},
+       {6150, 1, &rule7},
+       {6151, 4, &rule2},
+       {6155, 3, &rule66},
+       {6158, 1, &rule1},
+       {6160, 10, &rule8},
+       {6176, 35, &rule43},
+       {6211, 1, &rule65},
+       {6212, 52, &rule43},
+       {6272, 41, &rule43},
+       {6313, 1, &rule66},
+       {6400, 29, &rule43},
+       {6432, 3, &rule66},
+       {6435, 4, &rule92},
+       {6439, 2, &rule66},
+       {6441, 3, &rule92},
+       {6448, 2, &rule92},
+       {6450, 1, &rule66},
+       {6451, 6, &rule92},
+       {6457, 3, &rule66},
+       {6464, 1, &rule13},
+       {6468, 2, &rule2},
+       {6470, 10, &rule8},
+       {6480, 30, &rule43},
+       {6512, 5, &rule43},
+       {6624, 32, &rule13},
+       {7424, 44, &rule14},
+       {7468, 54, &rule65},
+       {7522, 10, &rule14},
+       {7680, 1, &rule21},
+       {7681, 1, &rule22},
+       {7682, 1, &rule21},
+       {7683, 1, &rule22},
+       {7684, 1, &rule21},
+       {7685, 1, &rule22},
+       {7686, 1, &rule21},
+       {7687, 1, &rule22},
+       {7688, 1, &rule21},
+       {7689, 1, &rule22},
+       {7690, 1, &rule21},
+       {7691, 1, &rule22},
+       {7692, 1, &rule21},
+       {7693, 1, &rule22},
+       {7694, 1, &rule21},
+       {7695, 1, &rule22},
+       {7696, 1, &rule21},
+       {7697, 1, &rule22},
+       {7698, 1, &rule21},
+       {7699, 1, &rule22},
+       {7700, 1, &rule21},
+       {7701, 1, &rule22},
+       {7702, 1, &rule21},
+       {7703, 1, &rule22},
+       {7704, 1, &rule21},
+       {7705, 1, &rule22},
+       {7706, 1, &rule21},
+       {7707, 1, &rule22},
+       {7708, 1, &rule21},
+       {7709, 1, &rule22},
+       {7710, 1, &rule21},
+       {7711, 1, &rule22},
+       {7712, 1, &rule21},
+       {7713, 1, &rule22},
+       {7714, 1, &rule21},
+       {7715, 1, &rule22},
+       {7716, 1, &rule21},
+       {7717, 1, &rule22},
+       {7718, 1, &rule21},
+       {7719, 1, &rule22},
+       {7720, 1, &rule21},
+       {7721, 1, &rule22},
+       {7722, 1, &rule21},
+       {7723, 1, &rule22},
+       {7724, 1, &rule21},
+       {7725, 1, &rule22},
+       {7726, 1, &rule21},
+       {7727, 1, &rule22},
+       {7728, 1, &rule21},
+       {7729, 1, &rule22},
+       {7730, 1, &rule21},
+       {7731, 1, &rule22},
+       {7732, 1, &rule21},
+       {7733, 1, &rule22},
+       {7734, 1, &rule21},
+       {7735, 1, &rule22},
+       {7736, 1, &rule21},
+       {7737, 1, &rule22},
+       {7738, 1, &rule21},
+       {7739, 1, &rule22},
+       {7740, 1, &rule21},
+       {7741, 1, &rule22},
+       {7742, 1, &rule21},
+       {7743, 1, &rule22},
+       {7744, 1, &rule21},
+       {7745, 1, &rule22},
+       {7746, 1, &rule21},
+       {7747, 1, &rule22},
+       {7748, 1, &rule21},
+       {7749, 1, &rule22},
+       {7750, 1, &rule21},
+       {7751, 1, &rule22},
+       {7752, 1, &rule21},
+       {7753, 1, &rule22},
+       {7754, 1, &rule21},
+       {7755, 1, &rule22},
+       {7756, 1, &rule21},
+       {7757, 1, &rule22},
+       {7758, 1, &rule21},
+       {7759, 1, &rule22},
+       {7760, 1, &rule21},
+       {7761, 1, &rule22},
+       {7762, 1, &rule21},
+       {7763, 1, &rule22},
+       {7764, 1, &rule21},
+       {7765, 1, &rule22},
+       {7766, 1, &rule21},
+       {7767, 1, &rule22},
+       {7768, 1, &rule21},
+       {7769, 1, &rule22},
+       {7770, 1, &rule21},
+       {7771, 1, &rule22},
+       {7772, 1, &rule21},
+       {7773, 1, &rule22},
+       {7774, 1, &rule21},
+       {7775, 1, &rule22},
+       {7776, 1, &rule21},
+       {7777, 1, &rule22},
+       {7778, 1, &rule21},
+       {7779, 1, &rule22},
+       {7780, 1, &rule21},
+       {7781, 1, &rule22},
+       {7782, 1, &rule21},
+       {7783, 1, &rule22},
+       {7784, 1, &rule21},
+       {7785, 1, &rule22},
+       {7786, 1, &rule21},
+       {7787, 1, &rule22},
+       {7788, 1, &rule21},
+       {7789, 1, &rule22},
+       {7790, 1, &rule21},
+       {7791, 1, &rule22},
+       {7792, 1, &rule21},
+       {7793, 1, &rule22},
+       {7794, 1, &rule21},
+       {7795, 1, &rule22},
+       {7796, 1, &rule21},
+       {7797, 1, &rule22},
+       {7798, 1, &rule21},
+       {7799, 1, &rule22},
+       {7800, 1, &rule21},
+       {7801, 1, &rule22},
+       {7802, 1, &rule21},
+       {7803, 1, &rule22},
+       {7804, 1, &rule21},
+       {7805, 1, &rule22},
+       {7806, 1, &rule21},
+       {7807, 1, &rule22},
+       {7808, 1, &rule21},
+       {7809, 1, &rule22},
+       {7810, 1, &rule21},
+       {7811, 1, &rule22},
+       {7812, 1, &rule21},
+       {7813, 1, &rule22},
+       {7814, 1, &rule21},
+       {7815, 1, &rule22},
+       {7816, 1, &rule21},
+       {7817, 1, &rule22},
+       {7818, 1, &rule21},
+       {7819, 1, &rule22},
+       {7820, 1, &rule21},
+       {7821, 1, &rule22},
+       {7822, 1, &rule21},
+       {7823, 1, &rule22},
+       {7824, 1, &rule21},
+       {7825, 1, &rule22},
+       {7826, 1, &rule21},
+       {7827, 1, &rule22},
+       {7828, 1, &rule21},
+       {7829, 1, &rule22},
+       {7830, 5, &rule14},
+       {7835, 1, &rule94},
+       {7840, 1, &rule21},
+       {7841, 1, &rule22},
+       {7842, 1, &rule21},
+       {7843, 1, &rule22},
+       {7844, 1, &rule21},
+       {7845, 1, &rule22},
+       {7846, 1, &rule21},
+       {7847, 1, &rule22},
+       {7848, 1, &rule21},
+       {7849, 1, &rule22},
+       {7850, 1, &rule21},
+       {7851, 1, &rule22},
+       {7852, 1, &rule21},
+       {7853, 1, &rule22},
+       {7854, 1, &rule21},
+       {7855, 1, &rule22},
+       {7856, 1, &rule21},
+       {7857, 1, &rule22},
+       {7858, 1, &rule21},
+       {7859, 1, &rule22},
+       {7860, 1, &rule21},
+       {7861, 1, &rule22},
+       {7862, 1, &rule21},
+       {7863, 1, &rule22},
+       {7864, 1, &rule21},
+       {7865, 1, &rule22},
+       {7866, 1, &rule21},
+       {7867, 1, &rule22},
+       {7868, 1, &rule21},
+       {7869, 1, &rule22},
+       {7870, 1, &rule21},
+       {7871, 1, &rule22},
+       {7872, 1, &rule21},
+       {7873, 1, &rule22},
+       {7874, 1, &rule21},
+       {7875, 1, &rule22},
+       {7876, 1, &rule21},
+       {7877, 1, &rule22},
+       {7878, 1, &rule21},
+       {7879, 1, &rule22},
+       {7880, 1, &rule21},
+       {7881, 1, &rule22},
+       {7882, 1, &rule21},
+       {7883, 1, &rule22},
+       {7884, 1, &rule21},
+       {7885, 1, &rule22},
+       {7886, 1, &rule21},
+       {7887, 1, &rule22},
+       {7888, 1, &rule21},
+       {7889, 1, &rule22},
+       {7890, 1, &rule21},
+       {7891, 1, &rule22},
+       {7892, 1, &rule21},
+       {7893, 1, &rule22},
+       {7894, 1, &rule21},
+       {7895, 1, &rule22},
+       {7896, 1, &rule21},
+       {7897, 1, &rule22},
+       {7898, 1, &rule21},
+       {7899, 1, &rule22},
+       {7900, 1, &rule21},
+       {7901, 1, &rule22},
+       {7902, 1, &rule21},
+       {7903, 1, &rule22},
+       {7904, 1, &rule21},
+       {7905, 1, &rule22},
+       {7906, 1, &rule21},
+       {7907, 1, &rule22},
+       {7908, 1, &rule21},
+       {7909, 1, &rule22},
+       {7910, 1, &rule21},
+       {7911, 1, &rule22},
+       {7912, 1, &rule21},
+       {7913, 1, &rule22},
+       {7914, 1, &rule21},
+       {7915, 1, &rule22},
+       {7916, 1, &rule21},
+       {7917, 1, &rule22},
+       {7918, 1, &rule21},
+       {7919, 1, &rule22},
+       {7920, 1, &rule21},
+       {7921, 1, &rule22},
+       {7922, 1, &rule21},
+       {7923, 1, &rule22},
+       {7924, 1, &rule21},
+       {7925, 1, &rule22},
+       {7926, 1, &rule21},
+       {7927, 1, &rule22},
+       {7928, 1, &rule21},
+       {7929, 1, &rule22},
+       {7936, 8, &rule95},
+       {7944, 8, &rule96},
+       {7952, 6, &rule95},
+       {7960, 6, &rule96},
+       {7968, 8, &rule95},
+       {7976, 8, &rule96},
+       {7984, 8, &rule95},
+       {7992, 8, &rule96},
+       {8000, 6, &rule95},
+       {8008, 6, &rule96},
+       {8016, 1, &rule14},
+       {8017, 1, &rule95},
+       {8018, 1, &rule14},
+       {8019, 1, &rule95},
+       {8020, 1, &rule14},
+       {8021, 1, &rule95},
+       {8022, 1, &rule14},
+       {8023, 1, &rule95},
+       {8025, 1, &rule96},
+       {8027, 1, &rule96},
+       {8029, 1, &rule96},
+       {8031, 1, &rule96},
+       {8032, 8, &rule95},
+       {8040, 8, &rule96},
+       {8048, 2, &rule97},
+       {8050, 4, &rule98},
+       {8054, 2, &rule99},
+       {8056, 2, &rule100},
+       {8058, 2, &rule101},
+       {8060, 2, &rule102},
+       {8064, 8, &rule95},
+       {8072, 8, &rule103},
+       {8080, 8, &rule95},
+       {8088, 8, &rule103},
+       {8096, 8, &rule95},
+       {8104, 8, &rule103},
+       {8112, 2, &rule95},
+       {8114, 1, &rule14},
+       {8115, 1, &rule104},
+       {8116, 1, &rule14},
+       {8118, 2, &rule14},
+       {8120, 2, &rule96},
+       {8122, 2, &rule105},
+       {8124, 1, &rule106},
+       {8125, 1, &rule10},
+       {8126, 1, &rule107},
+       {8127, 3, &rule10},
+       {8130, 1, &rule14},
+       {8131, 1, &rule104},
+       {8132, 1, &rule14},
+       {8134, 2, &rule14},
+       {8136, 4, &rule108},
+       {8140, 1, &rule106},
+       {8141, 3, &rule10},
+       {8144, 2, &rule95},
+       {8146, 2, &rule14},
+       {8150, 2, &rule14},
+       {8152, 2, &rule96},
+       {8154, 2, &rule109},
+       {8157, 3, &rule10},
+       {8160, 2, &rule95},
+       {8162, 3, &rule14},
+       {8165, 1, &rule84},
+       {8166, 2, &rule14},
+       {8168, 2, &rule96},
+       {8170, 2, &rule110},
+       {8172, 1, &rule87},
+       {8173, 3, &rule10},
+       {8178, 1, &rule14},
+       {8179, 1, &rule104},
+       {8180, 1, &rule14},
+       {8182, 2, &rule14},
+       {8184, 2, &rule111},
+       {8186, 2, &rule112},
+       {8188, 1, &rule106},
+       {8189, 2, &rule10},
+       {8192, 12, &rule1},
+       {8204, 4, &rule16},
+       {8208, 6, &rule7},
+       {8214, 2, &rule2},
+       {8216, 1, &rule15},
+       {8217, 1, &rule19},
+       {8218, 1, &rule4},
+       {8219, 2, &rule15},
+       {8221, 1, &rule19},
+       {8222, 1, &rule4},
+       {8223, 1, &rule15},
+       {8224, 8, &rule2},
+       {8232, 1, &rule113},
+       {8233, 1, &rule114},
+       {8234, 5, &rule16},
+       {8239, 1, &rule1},
+       {8240, 9, &rule2},
+       {8249, 1, &rule15},
+       {8250, 1, &rule19},
+       {8251, 4, &rule2},
+       {8255, 2, &rule11},
+       {8257, 3, &rule2},
+       {8260, 1, &rule6},
+       {8261, 1, &rule4},
+       {8262, 1, &rule5},
+       {8263, 11, &rule2},
+       {8274, 1, &rule6},
+       {8275, 1, &rule2},
+       {8276, 1, &rule11},
+       {8279, 1, &rule2},
+       {8287, 1, &rule1},
+       {8288, 4, &rule16},
+       {8298, 6, &rule16},
+       {8304, 1, &rule17},
+       {8305, 1, &rule14},
+       {8308, 6, &rule17},
+       {8314, 3, &rule6},
+       {8317, 1, &rule4},
+       {8318, 1, &rule5},
+       {8319, 1, &rule14},
+       {8320, 10, &rule17},
+       {8330, 3, &rule6},
+       {8333, 1, &rule4},
+       {8334, 1, &rule5},
+       {8352, 18, &rule3},
+       {8400, 13, &rule66},
+       {8413, 4, &rule89},
+       {8417, 1, &rule66},
+       {8418, 3, &rule89},
+       {8421, 6, &rule66},
+       {8448, 2, &rule13},
+       {8450, 1, &rule79},
+       {8451, 4, &rule13},
+       {8455, 1, &rule79},
+       {8456, 2, &rule13},
+       {8458, 1, &rule14},
+       {8459, 3, &rule79},
+       {8462, 2, &rule14},
+       {8464, 3, &rule79},
+       {8467, 1, &rule14},
+       {8468, 1, &rule13},
+       {8469, 1, &rule79},
+       {8470, 3, &rule13},
+       {8473, 5, &rule79},
+       {8478, 6, &rule13},
+       {8484, 1, &rule79},
+       {8485, 1, &rule13},
+       {8486, 1, &rule115},
+       {8487, 1, &rule13},
+       {8488, 1, &rule79},
+       {8489, 1, &rule13},
+       {8490, 1, &rule116},
+       {8491, 1, &rule117},
+       {8492, 2, &rule79},
+       {8494, 1, &rule13},
+       {8495, 1, &rule14},
+       {8496, 2, &rule79},
+       {8498, 1, &rule13},
+       {8499, 1, &rule79},
+       {8500, 1, &rule14},
+       {8501, 4, &rule43},
+       {8505, 1, &rule14},
+       {8506, 2, &rule13},
+       {8509, 1, &rule14},
+       {8510, 2, &rule79},
+       {8512, 5, &rule6},
+       {8517, 1, &rule79},
+       {8518, 4, &rule14},
+       {8522, 1, &rule13},
+       {8523, 1, &rule6},
+       {8531, 13, &rule17},
+       {8544, 16, &rule118},
+       {8560, 16, &rule119},
+       {8576, 4, &rule93},
+       {8592, 5, &rule6},
+       {8597, 5, &rule13},
+       {8602, 2, &rule6},
+       {8604, 4, &rule13},
+       {8608, 1, &rule6},
+       {8609, 2, &rule13},
+       {8611, 1, &rule6},
+       {8612, 2, &rule13},
+       {8614, 1, &rule6},
+       {8615, 7, &rule13},
+       {8622, 1, &rule6},
+       {8623, 31, &rule13},
+       {8654, 2, &rule6},
+       {8656, 2, &rule13},
+       {8658, 1, &rule6},
+       {8659, 1, &rule13},
+       {8660, 1, &rule6},
+       {8661, 31, &rule13},
+       {8692, 268, &rule6},
+       {8960, 8, &rule13},
+       {8968, 4, &rule6},
+       {8972, 20, &rule13},
+       {8992, 2, &rule6},
+       {8994, 7, &rule13},
+       {9001, 1, &rule4},
+       {9002, 1, &rule5},
+       {9003, 81, &rule13},
+       {9084, 1, &rule6},
+       {9085, 30, &rule13},
+       {9115, 25, &rule6},
+       {9140, 1, &rule4},
+       {9141, 1, &rule5},
+       {9142, 1, &rule2},
+       {9143, 26, &rule13},
+       {9216, 39, &rule13},
+       {9280, 11, &rule13},
+       {9312, 60, &rule17},
+       {9372, 26, &rule13},
+       {9398, 26, &rule120},
+       {9424, 26, &rule121},
+       {9450, 22, &rule17},
+       {9472, 183, &rule13},
+       {9655, 1, &rule6},
+       {9656, 9, &rule13},
+       {9665, 1, &rule6},
+       {9666, 54, &rule13},
+       {9720, 8, &rule6},
+       {9728, 24, &rule13},
+       {9753, 86, &rule13},
+       {9839, 1, &rule6},
+       {9840, 14, &rule13},
+       {9856, 18, &rule13},
+       {9888, 2, &rule13},
+       {9985, 4, &rule13},
+       {9990, 4, &rule13},
+       {9996, 28, &rule13},
+       {10025, 35, &rule13},
+       {10061, 1, &rule13},
+       {10063, 4, &rule13},
+       {10070, 1, &rule13},
+       {10072, 7, &rule13},
+       {10081, 7, &rule13},
+       {10088, 1, &rule4},
+       {10089, 1, &rule5},
+       {10090, 1, &rule4},
+       {10091, 1, &rule5},
+       {10092, 1, &rule4},
+       {10093, 1, &rule5},
+       {10094, 1, &rule4},
+       {10095, 1, &rule5},
+       {10096, 1, &rule4},
+       {10097, 1, &rule5},
+       {10098, 1, &rule4},
+       {10099, 1, &rule5},
+       {10100, 1, &rule4},
+       {10101, 1, &rule5},
+       {10102, 30, &rule17},
+       {10132, 1, &rule13},
+       {10136, 24, &rule13},
+       {10161, 14, &rule13},
+       {10192, 22, &rule6},
+       {10214, 1, &rule4},
+       {10215, 1, &rule5},
+       {10216, 1, &rule4},
+       {10217, 1, &rule5},
+       {10218, 1, &rule4},
+       {10219, 1, &rule5},
+       {10224, 16, &rule6},
+       {10240, 256, &rule13},
+       {10496, 131, &rule6},
+       {10627, 1, &rule4},
+       {10628, 1, &rule5},
+       {10629, 1, &rule4},
+       {10630, 1, &rule5},
+       {10631, 1, &rule4},
+       {10632, 1, &rule5},
+       {10633, 1, &rule4},
+       {10634, 1, &rule5},
+       {10635, 1, &rule4},
+       {10636, 1, &rule5},
+       {10637, 1, &rule4},
+       {10638, 1, &rule5},
+       {10639, 1, &rule4},
+       {10640, 1, &rule5},
+       {10641, 1, &rule4},
+       {10642, 1, &rule5},
+       {10643, 1, &rule4},
+       {10644, 1, &rule5},
+       {10645, 1, &rule4},
+       {10646, 1, &rule5},
+       {10647, 1, &rule4},
+       {10648, 1, &rule5},
+       {10649, 63, &rule6},
+       {10712, 1, &rule4},
+       {10713, 1, &rule5},
+       {10714, 1, &rule4},
+       {10715, 1, &rule5},
+       {10716, 32, &rule6},
+       {10748, 1, &rule4},
+       {10749, 1, &rule5},
+       {10750, 258, &rule6},
+       {11008, 14, &rule13},
+       {11904, 26, &rule13},
+       {11931, 89, &rule13},
+       {12032, 214, &rule13},
+       {12272, 12, &rule13},
+       {12288, 1, &rule1},
+       {12289, 3, &rule2},
+       {12292, 1, &rule13},
+       {12293, 1, &rule65},
+       {12294, 1, &rule43},
+       {12295, 1, &rule93},
+       {12296, 1, &rule4},
+       {12297, 1, &rule5},
+       {12298, 1, &rule4},
+       {12299, 1, &rule5},
+       {12300, 1, &rule4},
+       {12301, 1, &rule5},
+       {12302, 1, &rule4},
+       {12303, 1, &rule5},
+       {12304, 1, &rule4},
+       {12305, 1, &rule5},
+       {12306, 2, &rule13},
+       {12308, 1, &rule4},
+       {12309, 1, &rule5},
+       {12310, 1, &rule4},
+       {12311, 1, &rule5},
+       {12312, 1, &rule4},
+       {12313, 1, &rule5},
+       {12314, 1, &rule4},
+       {12315, 1, &rule5},
+       {12316, 1, &rule7},
+       {12317, 1, &rule4},
+       {12318, 2, &rule5},
+       {12320, 1, &rule13},
+       {12321, 9, &rule93},
+       {12330, 6, &rule66},
+       {12336, 1, &rule7},
+       {12337, 5, &rule65},
+       {12342, 2, &rule13},
+       {12344, 3, &rule93},
+       {12347, 1, &rule65},
+       {12348, 1, &rule43},
+       {12349, 1, &rule2},
+       {12350, 2, &rule13},
+       {12353, 86, &rule43},
+       {12441, 2, &rule66},
+       {12443, 2, &rule10},
+       {12445, 2, &rule65},
+       {12447, 1, &rule43},
+       {12448, 1, &rule7},
+       {12449, 90, &rule43},
+       {12539, 1, &rule11},
+       {12540, 3, &rule65},
+       {12543, 1, &rule43},
+       {12549, 40, &rule43},
+       {12593, 94, &rule43},
+       {12688, 2, &rule13},
+       {12690, 4, &rule17},
+       {12694, 10, &rule13},
+       {12704, 24, &rule43},
+       {12784, 16, &rule43},
+       {12800, 31, &rule13},
+       {12832, 10, &rule17},
+       {12842, 26, &rule13},
+       {12880, 1, &rule13},
+       {12881, 15, &rule17},
+       {12896, 30, &rule13},
+       {12927, 1, &rule13},
+       {12928, 10, &rule17},
+       {12938, 39, &rule13},
+       {12977, 15, &rule17},
+       {12992, 63, &rule13},
+       {13056, 256, &rule13},
+       {13312, 6582, &rule43},
+       {19904, 64, &rule13},
+       {19968, 20902, &rule43},
+       {40960, 1165, &rule43},
+       {42128, 55, &rule13},
+       {44032, 11172, &rule43},
+       {55296, 896, &rule122},
+       {56192, 128, &rule122},
+       {56320, 1024, &rule122},
+       {57344, 6400, &rule123},
+       {63744, 302, &rule43},
+       {64048, 59, &rule43},
+       {64256, 7, &rule14},
+       {64275, 5, &rule14},
+       {64285, 1, &rule43},
+       {64286, 1, &rule66},
+       {64287, 10, &rule43},
+       {64297, 1, &rule6},
+       {64298, 13, &rule43},
+       {64312, 5, &rule43},
+       {64318, 1, &rule43},
+       {64320, 2, &rule43},
+       {64323, 2, &rule43},
+       {64326, 108, &rule43},
+       {64467, 363, &rule43},
+       {64830, 1, &rule4},
+       {64831, 1, &rule5},
+       {64848, 64, &rule43},
+       {64914, 54, &rule43},
+       {65008, 12, &rule43},
+       {65020, 1, &rule3},
+       {65021, 1, &rule13},
+       {65024, 16, &rule66},
+       {65056, 4, &rule66},
+       {65072, 1, &rule2},
+       {65073, 2, &rule7},
+       {65075, 2, &rule11},
+       {65077, 1, &rule4},
+       {65078, 1, &rule5},
+       {65079, 1, &rule4},
+       {65080, 1, &rule5},
+       {65081, 1, &rule4},
+       {65082, 1, &rule5},
+       {65083, 1, &rule4},
+       {65084, 1, &rule5},
+       {65085, 1, &rule4},
+       {65086, 1, &rule5},
+       {65087, 1, &rule4},
+       {65088, 1, &rule5},
+       {65089, 1, &rule4},
+       {65090, 1, &rule5},
+       {65091, 1, &rule4},
+       {65092, 1, &rule5},
+       {65093, 2, &rule2},
+       {65095, 1, &rule4},
+       {65096, 1, &rule5},
+       {65097, 4, &rule2},
+       {65101, 3, &rule11},
+       {65104, 3, &rule2},
+       {65108, 4, &rule2},
+       {65112, 1, &rule7},
+       {65113, 1, &rule4},
+       {65114, 1, &rule5},
+       {65115, 1, &rule4},
+       {65116, 1, &rule5},
+       {65117, 1, &rule4},
+       {65118, 1, &rule5},
+       {65119, 3, &rule2},
+       {65122, 1, &rule6},
+       {65123, 1, &rule7},
+       {65124, 3, &rule6},
+       {65128, 1, &rule2},
+       {65129, 1, &rule3},
+       {65130, 2, &rule2},
+       {65136, 5, &rule43},
+       {65142, 135, &rule43},
+       {65279, 1, &rule16},
+       {65281, 3, &rule2},
+       {65284, 1, &rule3},
+       {65285, 3, &rule2},
+       {65288, 1, &rule4},
+       {65289, 1, &rule5},
+       {65290, 1, &rule2},
+       {65291, 1, &rule6},
+       {65292, 1, &rule2},
+       {65293, 1, &rule7},
+       {65294, 2, &rule2},
+       {65296, 10, &rule8},
+       {65306, 2, &rule2},
+       {65308, 3, &rule6},
+       {65311, 2, &rule2},
+       {65313, 26, &rule9},
+       {65339, 1, &rule4},
+       {65340, 1, &rule2},
+       {65341, 1, &rule5},
+       {65342, 1, &rule10},
+       {65343, 1, &rule11},
+       {65344, 1, &rule10},
+       {65345, 26, &rule12},
+       {65371, 1, &rule4},
+       {65372, 1, &rule6},
+       {65373, 1, &rule5},
+       {65374, 1, &rule6},
+       {65375, 1, &rule4},
+       {65376, 1, &rule5},
+       {65377, 1, &rule2},
+       {65378, 1, &rule4},
+       {65379, 1, &rule5},
+       {65380, 1, &rule2},
+       {65381, 1, &rule11},
+       {65382, 10, &rule43},
+       {65392, 1, &rule65},
+       {65393, 45, &rule43},
+       {65438, 2, &rule65},
+       {65440, 31, &rule43},
+       {65474, 6, &rule43},
+       {65482, 6, &rule43},
+       {65490, 6, &rule43},
+       {65498, 3, &rule43},
+       {65504, 2, &rule3},
+       {65506, 1, &rule6},
+       {65507, 1, &rule10},
+       {65508, 1, &rule13},
+       {65509, 2, &rule3},
+       {65512, 1, &rule13},
+       {65513, 4, &rule6},
+       {65517, 2, &rule13},
+       {65529, 3, &rule16},
+       {65532, 2, &rule13},
+       {65536, 12, &rule43},
+       {65549, 26, &rule43},
+       {65576, 19, &rule43},
+       {65596, 2, &rule43},
+       {65599, 15, &rule43},
+       {65616, 14, &rule43},
+       {65664, 123, &rule43},
+       {65792, 2, &rule2},
+       {65794, 1, &rule13},
+       {65799, 45, &rule17},
+       {65847, 9, &rule13},
+       {66304, 31, &rule43},
+       {66336, 4, &rule17},
+       {66352, 26, &rule43},
+       {66378, 1, &rule93},
+       {66432, 30, &rule43},
+       {66463, 1, &rule2},
+       {66560, 40, &rule124},
+       {66600, 40, &rule125},
+       {66640, 78, &rule43},
+       {66720, 10, &rule8},
+       {67584, 6, &rule43},
+       {67592, 1, &rule43},
+       {67594, 44, &rule43},
+       {67639, 2, &rule43},
+       {67644, 1, &rule43},
+       {67647, 1, &rule43},
+       {118784, 246, &rule13},
+       {119040, 39, &rule13},
+       {119082, 59, &rule13},
+       {119141, 2, &rule92},
+       {119143, 3, &rule66},
+       {119146, 3, &rule13},
+       {119149, 6, &rule92},
+       {119155, 8, &rule16},
+       {119163, 8, &rule66},
+       {119171, 2, &rule13},
+       {119173, 7, &rule66},
+       {119180, 30, &rule13},
+       {119210, 4, &rule66},
+       {119214, 48, &rule13},
+       {119552, 87, &rule13},
+       {119808, 26, &rule79},
+       {119834, 26, &rule14},
+       {119860, 26, &rule79},
+       {119886, 7, &rule14},
+       {119894, 18, &rule14},
+       {119912, 26, &rule79},
+       {119938, 26, &rule14},
+       {119964, 1, &rule79},
+       {119966, 2, &rule79},
+       {119970, 1, &rule79},
+       {119973, 2, &rule79},
+       {119977, 4, &rule79},
+       {119982, 8, &rule79},
+       {119990, 4, &rule14},
+       {119995, 1, &rule14},
+       {119997, 7, &rule14},
+       {120005, 11, &rule14},
+       {120016, 26, &rule79},
+       {120042, 26, &rule14},
+       {120068, 2, &rule79},
+       {120071, 4, &rule79},
+       {120077, 8, &rule79},
+       {120086, 7, &rule79},
+       {120094, 26, &rule14},
+       {120120, 2, &rule79},
+       {120123, 4, &rule79},
+       {120128, 5, &rule79},
+       {120134, 1, &rule79},
+       {120138, 7, &rule79},
+       {120146, 26, &rule14},
+       {120172, 26, &rule79},
+       {120198, 26, &rule14},
+       {120224, 26, &rule79},
+       {120250, 26, &rule14},
+       {120276, 26, &rule79},
+       {120302, 26, &rule14},
+       {120328, 26, &rule79},
+       {120354, 26, &rule14},
+       {120380, 26, &rule79},
+       {120406, 26, &rule14},
+       {120432, 26, &rule79},
+       {120458, 26, &rule14},
+       {120488, 25, &rule79},
+       {120513, 1, &rule6},
+       {120514, 25, &rule14},
+       {120539, 1, &rule6},
+       {120540, 6, &rule14},
+       {120546, 25, &rule79},
+       {120571, 1, &rule6},
+       {120572, 25, &rule14},
+       {120597, 1, &rule6},
+       {120598, 6, &rule14},
+       {120604, 25, &rule79},
+       {120629, 1, &rule6},
+       {120630, 25, &rule14},
+       {120655, 1, &rule6},
+       {120656, 6, &rule14},
+       {120662, 25, &rule79},
+       {120687, 1, &rule6},
+       {120688, 25, &rule14},
+       {120713, 1, &rule6},
+       {120714, 6, &rule14},
+       {120720, 25, &rule79},
+       {120745, 1, &rule6},
+       {120746, 25, &rule14},
+       {120771, 1, &rule6},
+       {120772, 6, &rule14},
+       {120782, 50, &rule8},
+       {131072, 42711, &rule43},
+       {194560, 542, &rule43},
+       {917505, 1, &rule16},
+       {917536, 96, &rule16},
+       {917760, 240, &rule66},
+       {983040, 65534, &rule123},
+       {1048576, 65534, &rule123}
+};
+static const struct _charblock_ convchars[]={
+       {65, 26, &rule9},
+       {97, 26, &rule12},
+       {181, 1, &rule18},
+       {192, 23, &rule9},
+       {216, 7, &rule9},
+       {224, 23, &rule12},
+       {248, 7, &rule12},
+       {255, 1, &rule20},
+       {256, 1, &rule21},
+       {257, 1, &rule22},
+       {258, 1, &rule21},
+       {259, 1, &rule22},
+       {260, 1, &rule21},
+       {261, 1, &rule22},
+       {262, 1, &rule21},
+       {263, 1, &rule22},
+       {264, 1, &rule21},
+       {265, 1, &rule22},
+       {266, 1, &rule21},
+       {267, 1, &rule22},
+       {268, 1, &rule21},
+       {269, 1, &rule22},
+       {270, 1, &rule21},
+       {271, 1, &rule22},
+       {272, 1, &rule21},
+       {273, 1, &rule22},
+       {274, 1, &rule21},
+       {275, 1, &rule22},
+       {276, 1, &rule21},
+       {277, 1, &rule22},
+       {278, 1, &rule21},
+       {279, 1, &rule22},
+       {280, 1, &rule21},
+       {281, 1, &rule22},
+       {282, 1, &rule21},
+       {283, 1, &rule22},
+       {284, 1, &rule21},
+       {285, 1, &rule22},
+       {286, 1, &rule21},
+       {287, 1, &rule22},
+       {288, 1, &rule21},
+       {289, 1, &rule22},
+       {290, 1, &rule21},
+       {291, 1, &rule22},
+       {292, 1, &rule21},
+       {293, 1, &rule22},
+       {294, 1, &rule21},
+       {295, 1, &rule22},
+       {296, 1, &rule21},
+       {297, 1, &rule22},
+       {298, 1, &rule21},
+       {299, 1, &rule22},
+       {300, 1, &rule21},
+       {301, 1, &rule22},
+       {302, 1, &rule21},
+       {303, 1, &rule22},
+       {304, 1, &rule23},
+       {305, 1, &rule24},
+       {306, 1, &rule21},
+       {307, 1, &rule22},
+       {308, 1, &rule21},
+       {309, 1, &rule22},
+       {310, 1, &rule21},
+       {311, 1, &rule22},
+       {313, 1, &rule21},
+       {314, 1, &rule22},
+       {315, 1, &rule21},
+       {316, 1, &rule22},
+       {317, 1, &rule21},
+       {318, 1, &rule22},
+       {319, 1, &rule21},
+       {320, 1, &rule22},
+       {321, 1, &rule21},
+       {322, 1, &rule22},
+       {323, 1, &rule21},
+       {324, 1, &rule22},
+       {325, 1, &rule21},
+       {326, 1, &rule22},
+       {327, 1, &rule21},
+       {328, 1, &rule22},
+       {330, 1, &rule21},
+       {331, 1, &rule22},
+       {332, 1, &rule21},
+       {333, 1, &rule22},
+       {334, 1, &rule21},
+       {335, 1, &rule22},
+       {336, 1, &rule21},
+       {337, 1, &rule22},
+       {338, 1, &rule21},
+       {339, 1, &rule22},
+       {340, 1, &rule21},
+       {341, 1, &rule22},
+       {342, 1, &rule21},
+       {343, 1, &rule22},
+       {344, 1, &rule21},
+       {345, 1, &rule22},
+       {346, 1, &rule21},
+       {347, 1, &rule22},
+       {348, 1, &rule21},
+       {349, 1, &rule22},
+       {350, 1, &rule21},
+       {351, 1, &rule22},
+       {352, 1, &rule21},
+       {353, 1, &rule22},
+       {354, 1, &rule21},
+       {355, 1, &rule22},
+       {356, 1, &rule21},
+       {357, 1, &rule22},
+       {358, 1, &rule21},
+       {359, 1, &rule22},
+       {360, 1, &rule21},
+       {361, 1, &rule22},
+       {362, 1, &rule21},
+       {363, 1, &rule22},
+       {364, 1, &rule21},
+       {365, 1, &rule22},
+       {366, 1, &rule21},
+       {367, 1, &rule22},
+       {368, 1, &rule21},
+       {369, 1, &rule22},
+       {370, 1, &rule21},
+       {371, 1, &rule22},
+       {372, 1, &rule21},
+       {373, 1, &rule22},
+       {374, 1, &rule21},
+       {375, 1, &rule22},
+       {376, 1, &rule25},
+       {377, 1, &rule21},
+       {378, 1, &rule22},
+       {379, 1, &rule21},
+       {380, 1, &rule22},
+       {381, 1, &rule21},
+       {382, 1, &rule22},
+       {383, 1, &rule26},
+       {385, 1, &rule27},
+       {386, 1, &rule21},
+       {387, 1, &rule22},
+       {388, 1, &rule21},
+       {389, 1, &rule22},
+       {390, 1, &rule28},
+       {391, 1, &rule21},
+       {392, 1, &rule22},
+       {393, 2, &rule29},
+       {395, 1, &rule21},
+       {396, 1, &rule22},
+       {398, 1, &rule30},
+       {399, 1, &rule31},
+       {400, 1, &rule32},
+       {401, 1, &rule21},
+       {402, 1, &rule22},
+       {403, 1, &rule29},
+       {404, 1, &rule33},
+       {405, 1, &rule34},
+       {406, 1, &rule35},
+       {407, 1, &rule36},
+       {408, 1, &rule21},
+       {409, 1, &rule22},
+       {412, 1, &rule35},
+       {413, 1, &rule37},
+       {414, 1, &rule38},
+       {415, 1, &rule39},
+       {416, 1, &rule21},
+       {417, 1, &rule22},
+       {418, 1, &rule21},
+       {419, 1, &rule22},
+       {420, 1, &rule21},
+       {421, 1, &rule22},
+       {422, 1, &rule40},
+       {423, 1, &rule21},
+       {424, 1, &rule22},
+       {425, 1, &rule40},
+       {428, 1, &rule21},
+       {429, 1, &rule22},
+       {430, 1, &rule40},
+       {431, 1, &rule21},
+       {432, 1, &rule22},
+       {433, 2, &rule41},
+       {435, 1, &rule21},
+       {436, 1, &rule22},
+       {437, 1, &rule21},
+       {438, 1, &rule22},
+       {439, 1, &rule42},
+       {440, 1, &rule21},
+       {441, 1, &rule22},
+       {444, 1, &rule21},
+       {445, 1, &rule22},
+       {447, 1, &rule44},
+       {452, 1, &rule45},
+       {453, 1, &rule46},
+       {454, 1, &rule47},
+       {455, 1, &rule45},
+       {456, 1, &rule46},
+       {457, 1, &rule47},
+       {458, 1, &rule45},
+       {459, 1, &rule46},
+       {460, 1, &rule47},
+       {461, 1, &rule21},
+       {462, 1, &rule22},
+       {463, 1, &rule21},
+       {464, 1, &rule22},
+       {465, 1, &rule21},
+       {466, 1, &rule22},
+       {467, 1, &rule21},
+       {468, 1, &rule22},
+       {469, 1, &rule21},
+       {470, 1, &rule22},
+       {471, 1, &rule21},
+       {472, 1, &rule22},
+       {473, 1, &rule21},
+       {474, 1, &rule22},
+       {475, 1, &rule21},
+       {476, 1, &rule22},
+       {477, 1, &rule48},
+       {478, 1, &rule21},
+       {479, 1, &rule22},
+       {480, 1, &rule21},
+       {481, 1, &rule22},
+       {482, 1, &rule21},
+       {483, 1, &rule22},
+       {484, 1, &rule21},
+       {485, 1, &rule22},
+       {486, 1, &rule21},
+       {487, 1, &rule22},
+       {488, 1, &rule21},
+       {489, 1, &rule22},
+       {490, 1, &rule21},
+       {491, 1, &rule22},
+       {492, 1, &rule21},
+       {493, 1, &rule22},
+       {494, 1, &rule21},
+       {495, 1, &rule22},
+       {497, 1, &rule45},
+       {498, 1, &rule46},
+       {499, 1, &rule47},
+       {500, 1, &rule21},
+       {501, 1, &rule22},
+       {502, 1, &rule49},
+       {503, 1, &rule50},
+       {504, 1, &rule21},
+       {505, 1, &rule22},
+       {506, 1, &rule21},
+       {507, 1, &rule22},
+       {508, 1, &rule21},
+       {509, 1, &rule22},
+       {510, 1, &rule21},
+       {511, 1, &rule22},
+       {512, 1, &rule21},
+       {513, 1, &rule22},
+       {514, 1, &rule21},
+       {515, 1, &rule22},
+       {516, 1, &rule21},
+       {517, 1, &rule22},
+       {518, 1, &rule21},
+       {519, 1, &rule22},
+       {520, 1, &rule21},
+       {521, 1, &rule22},
+       {522, 1, &rule21},
+       {523, 1, &rule22},
+       {524, 1, &rule21},
+       {525, 1, &rule22},
+       {526, 1, &rule21},
+       {527, 1, &rule22},
+       {528, 1, &rule21},
+       {529, 1, &rule22},
+       {530, 1, &rule21},
+       {531, 1, &rule22},
+       {532, 1, &rule21},
+       {533, 1, &rule22},
+       {534, 1, &rule21},
+       {535, 1, &rule22},
+       {536, 1, &rule21},
+       {537, 1, &rule22},
+       {538, 1, &rule21},
+       {539, 1, &rule22},
+       {540, 1, &rule21},
+       {541, 1, &rule22},
+       {542, 1, &rule21},
+       {543, 1, &rule22},
+       {544, 1, &rule51},
+       {546, 1, &rule21},
+       {547, 1, &rule22},
+       {548, 1, &rule21},
+       {549, 1, &rule22},
+       {550, 1, &rule21},
+       {551, 1, &rule22},
+       {552, 1, &rule21},
+       {553, 1, &rule22},
+       {554, 1, &rule21},
+       {555, 1, &rule22},
+       {556, 1, &rule21},
+       {557, 1, &rule22},
+       {558, 1, &rule21},
+       {559, 1, &rule22},
+       {560, 1, &rule21},
+       {561, 1, &rule22},
+       {562, 1, &rule21},
+       {563, 1, &rule22},
+       {595, 1, &rule52},
+       {596, 1, &rule53},
+       {598, 2, &rule54},
+       {601, 1, &rule55},
+       {603, 1, &rule56},
+       {608, 1, &rule54},
+       {611, 1, &rule57},
+       {616, 1, &rule58},
+       {617, 1, &rule59},
+       {623, 1, &rule59},
+       {626, 1, &rule60},
+       {629, 1, &rule61},
+       {640, 1, &rule62},
+       {643, 1, &rule62},
+       {648, 1, &rule62},
+       {650, 2, &rule63},
+       {658, 1, &rule64},
+       {837, 1, &rule67},
+       {902, 1, &rule68},
+       {904, 3, &rule69},
+       {908, 1, &rule70},
+       {910, 2, &rule71},
+       {913, 17, &rule9},
+       {931, 9, &rule9},
+       {940, 1, &rule72},
+       {941, 3, &rule73},
+       {945, 17, &rule12},
+       {962, 1, &rule74},
+       {963, 9, &rule12},
+       {972, 1, &rule75},
+       {973, 2, &rule76},
+       {976, 1, &rule77},
+       {977, 1, &rule78},
+       {981, 1, &rule80},
+       {982, 1, &rule81},
+       {984, 1, &rule21},
+       {985, 1, &rule22},
+       {986, 1, &rule21},
+       {987, 1, &rule22},
+       {988, 1, &rule21},
+       {989, 1, &rule22},
+       {990, 1, &rule21},
+       {991, 1, &rule22},
+       {992, 1, &rule21},
+       {993, 1, &rule22},
+       {994, 1, &rule21},
+       {995, 1, &rule22},
+       {996, 1, &rule21},
+       {997, 1, &rule22},
+       {998, 1, &rule21},
+       {999, 1, &rule22},
+       {1000, 1, &rule21},
+       {1001, 1, &rule22},
+       {1002, 1, &rule21},
+       {1003, 1, &rule22},
+       {1004, 1, &rule21},
+       {1005, 1, &rule22},
+       {1006, 1, &rule21},
+       {1007, 1, &rule22},
+       {1008, 1, &rule82},
+       {1009, 1, &rule83},
+       {1010, 1, &rule84},
+       {1012, 1, &rule85},
+       {1013, 1, &rule86},
+       {1015, 1, &rule21},
+       {1016, 1, &rule22},
+       {1017, 1, &rule87},
+       {1018, 1, &rule21},
+       {1019, 1, &rule22},
+       {1024, 16, &rule88},
+       {1040, 32, &rule9},
+       {1072, 32, &rule12},
+       {1104, 16, &rule83},
+       {1120, 1, &rule21},
+       {1121, 1, &rule22},
+       {1122, 1, &rule21},
+       {1123, 1, &rule22},
+       {1124, 1, &rule21},
+       {1125, 1, &rule22},
+       {1126, 1, &rule21},
+       {1127, 1, &rule22},
+       {1128, 1, &rule21},
+       {1129, 1, &rule22},
+       {1130, 1, &rule21},
+       {1131, 1, &rule22},
+       {1132, 1, &rule21},
+       {1133, 1, &rule22},
+       {1134, 1, &rule21},
+       {1135, 1, &rule22},
+       {1136, 1, &rule21},
+       {1137, 1, &rule22},
+       {1138, 1, &rule21},
+       {1139, 1, &rule22},
+       {1140, 1, &rule21},
+       {1141, 1, &rule22},
+       {1142, 1, &rule21},
+       {1143, 1, &rule22},
+       {1144, 1, &rule21},
+       {1145, 1, &rule22},
+       {1146, 1, &rule21},
+       {1147, 1, &rule22},
+       {1148, 1, &rule21},
+       {1149, 1, &rule22},
+       {1150, 1, &rule21},
+       {1151, 1, &rule22},
+       {1152, 1, &rule21},
+       {1153, 1, &rule22},
+       {1162, 1, &rule21},
+       {1163, 1, &rule22},
+       {1164, 1, &rule21},
+       {1165, 1, &rule22},
+       {1166, 1, &rule21},
+       {1167, 1, &rule22},
+       {1168, 1, &rule21},
+       {1169, 1, &rule22},
+       {1170, 1, &rule21},
+       {1171, 1, &rule22},
+       {1172, 1, &rule21},
+       {1173, 1, &rule22},
+       {1174, 1, &rule21},
+       {1175, 1, &rule22},
+       {1176, 1, &rule21},
+       {1177, 1, &rule22},
+       {1178, 1, &rule21},
+       {1179, 1, &rule22},
+       {1180, 1, &rule21},
+       {1181, 1, &rule22},
+       {1182, 1, &rule21},
+       {1183, 1, &rule22},
+       {1184, 1, &rule21},
+       {1185, 1, &rule22},
+       {1186, 1, &rule21},
+       {1187, 1, &rule22},
+       {1188, 1, &rule21},
+       {1189, 1, &rule22},
+       {1190, 1, &rule21},
+       {1191, 1, &rule22},
+       {1192, 1, &rule21},
+       {1193, 1, &rule22},
+       {1194, 1, &rule21},
+       {1195, 1, &rule22},
+       {1196, 1, &rule21},
+       {1197, 1, &rule22},
+       {1198, 1, &rule21},
+       {1199, 1, &rule22},
+       {1200, 1, &rule21},
+       {1201, 1, &rule22},
+       {1202, 1, &rule21},
+       {1203, 1, &rule22},
+       {1204, 1, &rule21},
+       {1205, 1, &rule22},
+       {1206, 1, &rule21},
+       {1207, 1, &rule22},
+       {1208, 1, &rule21},
+       {1209, 1, &rule22},
+       {1210, 1, &rule21},
+       {1211, 1, &rule22},
+       {1212, 1, &rule21},
+       {1213, 1, &rule22},
+       {1214, 1, &rule21},
+       {1215, 1, &rule22},
+       {1217, 1, &rule21},
+       {1218, 1, &rule22},
+       {1219, 1, &rule21},
+       {1220, 1, &rule22},
+       {1221, 1, &rule21},
+       {1222, 1, &rule22},
+       {1223, 1, &rule21},
+       {1224, 1, &rule22},
+       {1225, 1, &rule21},
+       {1226, 1, &rule22},
+       {1227, 1, &rule21},
+       {1228, 1, &rule22},
+       {1229, 1, &rule21},
+       {1230, 1, &rule22},
+       {1232, 1, &rule21},
+       {1233, 1, &rule22},
+       {1234, 1, &rule21},
+       {1235, 1, &rule22},
+       {1236, 1, &rule21},
+       {1237, 1, &rule22},
+       {1238, 1, &rule21},
+       {1239, 1, &rule22},
+       {1240, 1, &rule21},
+       {1241, 1, &rule22},
+       {1242, 1, &rule21},
+       {1243, 1, &rule22},
+       {1244, 1, &rule21},
+       {1245, 1, &rule22},
+       {1246, 1, &rule21},
+       {1247, 1, &rule22},
+       {1248, 1, &rule21},
+       {1249, 1, &rule22},
+       {1250, 1, &rule21},
+       {1251, 1, &rule22},
+       {1252, 1, &rule21},
+       {1253, 1, &rule22},
+       {1254, 1, &rule21},
+       {1255, 1, &rule22},
+       {1256, 1, &rule21},
+       {1257, 1, &rule22},
+       {1258, 1, &rule21},
+       {1259, 1, &rule22},
+       {1260, 1, &rule21},
+       {1261, 1, &rule22},
+       {1262, 1, &rule21},
+       {1263, 1, &rule22},
+       {1264, 1, &rule21},
+       {1265, 1, &rule22},
+       {1266, 1, &rule21},
+       {1267, 1, &rule22},
+       {1268, 1, &rule21},
+       {1269, 1, &rule22},
+       {1272, 1, &rule21},
+       {1273, 1, &rule22},
+       {1280, 1, &rule21},
+       {1281, 1, &rule22},
+       {1282, 1, &rule21},
+       {1283, 1, &rule22},
+       {1284, 1, &rule21},
+       {1285, 1, &rule22},
+       {1286, 1, &rule21},
+       {1287, 1, &rule22},
+       {1288, 1, &rule21},
+       {1289, 1, &rule22},
+       {1290, 1, &rule21},
+       {1291, 1, &rule22},
+       {1292, 1, &rule21},
+       {1293, 1, &rule22},
+       {1294, 1, &rule21},
+       {1295, 1, &rule22},
+       {1329, 38, &rule90},
+       {1377, 38, &rule91},
+       {7680, 1, &rule21},
+       {7681, 1, &rule22},
+       {7682, 1, &rule21},
+       {7683, 1, &rule22},
+       {7684, 1, &rule21},
+       {7685, 1, &rule22},
+       {7686, 1, &rule21},
+       {7687, 1, &rule22},
+       {7688, 1, &rule21},
+       {7689, 1, &rule22},
+       {7690, 1, &rule21},
+       {7691, 1, &rule22},
+       {7692, 1, &rule21},
+       {7693, 1, &rule22},
+       {7694, 1, &rule21},
+       {7695, 1, &rule22},
+       {7696, 1, &rule21},
+       {7697, 1, &rule22},
+       {7698, 1, &rule21},
+       {7699, 1, &rule22},
+       {7700, 1, &rule21},
+       {7701, 1, &rule22},
+       {7702, 1, &rule21},
+       {7703, 1, &rule22},
+       {7704, 1, &rule21},
+       {7705, 1, &rule22},
+       {7706, 1, &rule21},
+       {7707, 1, &rule22},
+       {7708, 1, &rule21},
+       {7709, 1, &rule22},
+       {7710, 1, &rule21},
+       {7711, 1, &rule22},
+       {7712, 1, &rule21},
+       {7713, 1, &rule22},
+       {7714, 1, &rule21},
+       {7715, 1, &rule22},
+       {7716, 1, &rule21},
+       {7717, 1, &rule22},
+       {7718, 1, &rule21},
+       {7719, 1, &rule22},
+       {7720, 1, &rule21},
+       {7721, 1, &rule22},
+       {7722, 1, &rule21},
+       {7723, 1, &rule22},
+       {7724, 1, &rule21},
+       {7725, 1, &rule22},
+       {7726, 1, &rule21},
+       {7727, 1, &rule22},
+       {7728, 1, &rule21},
+       {7729, 1, &rule22},
+       {7730, 1, &rule21},
+       {7731, 1, &rule22},
+       {7732, 1, &rule21},
+       {7733, 1, &rule22},
+       {7734, 1, &rule21},
+       {7735, 1, &rule22},
+       {7736, 1, &rule21},
+       {7737, 1, &rule22},
+       {7738, 1, &rule21},
+       {7739, 1, &rule22},
+       {7740, 1, &rule21},
+       {7741, 1, &rule22},
+       {7742, 1, &rule21},
+       {7743, 1, &rule22},
+       {7744, 1, &rule21},
+       {7745, 1, &rule22},
+       {7746, 1, &rule21},
+       {7747, 1, &rule22},
+       {7748, 1, &rule21},
+       {7749, 1, &rule22},
+       {7750, 1, &rule21},
+       {7751, 1, &rule22},
+       {7752, 1, &rule21},
+       {7753, 1, &rule22},
+       {7754, 1, &rule21},
+       {7755, 1, &rule22},
+       {7756, 1, &rule21},
+       {7757, 1, &rule22},
+       {7758, 1, &rule21},
+       {7759, 1, &rule22},
+       {7760, 1, &rule21},
+       {7761, 1, &rule22},
+       {7762, 1, &rule21},
+       {7763, 1, &rule22},
+       {7764, 1, &rule21},
+       {7765, 1, &rule22},
+       {7766, 1, &rule21},
+       {7767, 1, &rule22},
+       {7768, 1, &rule21},
+       {7769, 1, &rule22},
+       {7770, 1, &rule21},
+       {7771, 1, &rule22},
+       {7772, 1, &rule21},
+       {7773, 1, &rule22},
+       {7774, 1, &rule21},
+       {7775, 1, &rule22},
+       {7776, 1, &rule21},
+       {7777, 1, &rule22},
+       {7778, 1, &rule21},
+       {7779, 1, &rule22},
+       {7780, 1, &rule21},
+       {7781, 1, &rule22},
+       {7782, 1, &rule21},
+       {7783, 1, &rule22},
+       {7784, 1, &rule21},
+       {7785, 1, &rule22},
+       {7786, 1, &rule21},
+       {7787, 1, &rule22},
+       {7788, 1, &rule21},
+       {7789, 1, &rule22},
+       {7790, 1, &rule21},
+       {7791, 1, &rule22},
+       {7792, 1, &rule21},
+       {7793, 1, &rule22},
+       {7794, 1, &rule21},
+       {7795, 1, &rule22},
+       {7796, 1, &rule21},
+       {7797, 1, &rule22},
+       {7798, 1, &rule21},
+       {7799, 1, &rule22},
+       {7800, 1, &rule21},
+       {7801, 1, &rule22},
+       {7802, 1, &rule21},
+       {7803, 1, &rule22},
+       {7804, 1, &rule21},
+       {7805, 1, &rule22},
+       {7806, 1, &rule21},
+       {7807, 1, &rule22},
+       {7808, 1, &rule21},
+       {7809, 1, &rule22},
+       {7810, 1, &rule21},
+       {7811, 1, &rule22},
+       {7812, 1, &rule21},
+       {7813, 1, &rule22},
+       {7814, 1, &rule21},
+       {7815, 1, &rule22},
+       {7816, 1, &rule21},
+       {7817, 1, &rule22},
+       {7818, 1, &rule21},
+       {7819, 1, &rule22},
+       {7820, 1, &rule21},
+       {7821, 1, &rule22},
+       {7822, 1, &rule21},
+       {7823, 1, &rule22},
+       {7824, 1, &rule21},
+       {7825, 1, &rule22},
+       {7826, 1, &rule21},
+       {7827, 1, &rule22},
+       {7828, 1, &rule21},
+       {7829, 1, &rule22},
+       {7835, 1, &rule94},
+       {7840, 1, &rule21},
+       {7841, 1, &rule22},
+       {7842, 1, &rule21},
+       {7843, 1, &rule22},
+       {7844, 1, &rule21},
+       {7845, 1, &rule22},
+       {7846, 1, &rule21},
+       {7847, 1, &rule22},
+       {7848, 1, &rule21},
+       {7849, 1, &rule22},
+       {7850, 1, &rule21},
+       {7851, 1, &rule22},
+       {7852, 1, &rule21},
+       {7853, 1, &rule22},
+       {7854, 1, &rule21},
+       {7855, 1, &rule22},
+       {7856, 1, &rule21},
+       {7857, 1, &rule22},
+       {7858, 1, &rule21},
+       {7859, 1, &rule22},
+       {7860, 1, &rule21},
+       {7861, 1, &rule22},
+       {7862, 1, &rule21},
+       {7863, 1, &rule22},
+       {7864, 1, &rule21},
+       {7865, 1, &rule22},
+       {7866, 1, &rule21},
+       {7867, 1, &rule22},
+       {7868, 1, &rule21},
+       {7869, 1, &rule22},
+       {7870, 1, &rule21},
+       {7871, 1, &rule22},
+       {7872, 1, &rule21},
+       {7873, 1, &rule22},
+       {7874, 1, &rule21},
+       {7875, 1, &rule22},
+       {7876, 1, &rule21},
+       {7877, 1, &rule22},
+       {7878, 1, &rule21},
+       {7879, 1, &rule22},
+       {7880, 1, &rule21},
+       {7881, 1, &rule22},
+       {7882, 1, &rule21},
+       {7883, 1, &rule22},
+       {7884, 1, &rule21},
+       {7885, 1, &rule22},
+       {7886, 1, &rule21},
+       {7887, 1, &rule22},
+       {7888, 1, &rule21},
+       {7889, 1, &rule22},
+       {7890, 1, &rule21},
+       {7891, 1, &rule22},
+       {7892, 1, &rule21},
+       {7893, 1, &rule22},
+       {7894, 1, &rule21},
+       {7895, 1, &rule22},
+       {7896, 1, &rule21},
+       {7897, 1, &rule22},
+       {7898, 1, &rule21},
+       {7899, 1, &rule22},
+       {7900, 1, &rule21},
+       {7901, 1, &rule22},
+       {7902, 1, &rule21},
+       {7903, 1, &rule22},
+       {7904, 1, &rule21},
+       {7905, 1, &rule22},
+       {7906, 1, &rule21},
+       {7907, 1, &rule22},
+       {7908, 1, &rule21},
+       {7909, 1, &rule22},
+       {7910, 1, &rule21},
+       {7911, 1, &rule22},
+       {7912, 1, &rule21},
+       {7913, 1, &rule22},
+       {7914, 1, &rule21},
+       {7915, 1, &rule22},
+       {7916, 1, &rule21},
+       {7917, 1, &rule22},
+       {7918, 1, &rule21},
+       {7919, 1, &rule22},
+       {7920, 1, &rule21},
+       {7921, 1, &rule22},
+       {7922, 1, &rule21},
+       {7923, 1, &rule22},
+       {7924, 1, &rule21},
+       {7925, 1, &rule22},
+       {7926, 1, &rule21},
+       {7927, 1, &rule22},
+       {7928, 1, &rule21},
+       {7929, 1, &rule22},
+       {7936, 8, &rule95},
+       {7944, 8, &rule96},
+       {7952, 6, &rule95},
+       {7960, 6, &rule96},
+       {7968, 8, &rule95},
+       {7976, 8, &rule96},
+       {7984, 8, &rule95},
+       {7992, 8, &rule96},
+       {8000, 6, &rule95},
+       {8008, 6, &rule96},
+       {8017, 1, &rule95},
+       {8019, 1, &rule95},
+       {8021, 1, &rule95},
+       {8023, 1, &rule95},
+       {8025, 1, &rule96},
+       {8027, 1, &rule96},
+       {8029, 1, &rule96},
+       {8031, 1, &rule96},
+       {8032, 8, &rule95},
+       {8040, 8, &rule96},
+       {8048, 2, &rule97},
+       {8050, 4, &rule98},
+       {8054, 2, &rule99},
+       {8056, 2, &rule100},
+       {8058, 2, &rule101},
+       {8060, 2, &rule102},
+       {8064, 8, &rule95},
+       {8072, 8, &rule103},
+       {8080, 8, &rule95},
+       {8088, 8, &rule103},
+       {8096, 8, &rule95},
+       {8104, 8, &rule103},
+       {8112, 2, &rule95},
+       {8115, 1, &rule104},
+       {8120, 2, &rule96},
+       {8122, 2, &rule105},
+       {8124, 1, &rule106},
+       {8126, 1, &rule107},
+       {8131, 1, &rule104},
+       {8136, 4, &rule108},
+       {8140, 1, &rule106},
+       {8144, 2, &rule95},
+       {8152, 2, &rule96},
+       {8154, 2, &rule109},
+       {8160, 2, &rule95},
+       {8165, 1, &rule84},
+       {8168, 2, &rule96},
+       {8170, 2, &rule110},
+       {8172, 1, &rule87},
+       {8179, 1, &rule104},
+       {8184, 2, &rule111},
+       {8186, 2, &rule112},
+       {8188, 1, &rule106},
+       {8486, 1, &rule115},
+       {8490, 1, &rule116},
+       {8491, 1, &rule117},
+       {8544, 16, &rule118},
+       {8560, 16, &rule119},
+       {9398, 26, &rule120},
+       {9424, 26, &rule121},
+       {65313, 26, &rule9},
+       {65345, 26, &rule12},
+       {66560, 40, &rule124},
+       {66600, 40, &rule125}
+};
+static const struct _charblock_ spacechars[]={
+       {32, 1, &rule1},
+       {160, 1, &rule1},
+       {5760, 1, &rule1},
+       {6158, 1, &rule1},
+       {8192, 12, &rule1},
+       {8239, 1, &rule1},
+       {8287, 1, &rule1},
+       {12288, 1, &rule1}
+};
+
+/*
+       Obtain the reference to character rule by doing
+       binary search over the specified array of blocks.
+       To make checkattr shorter, the address of
+       nullrule is returned if the search fails:
+       this rule defines no category and no conversion
+       distances. The compare function returns 0 when
+       key->start is within the block. Otherwise
+       result of comparison of key->start and start of the
+       current block is returned as usual.
+*/
+
+static const struct _convrule_ nullrule={0,NUMCAT_CN,0,0,0,0};
+
+int blkcmp(const void *vk,const void *vb)
+{
+       const struct _charblock_ *key,*cur;
+       key=vk;
+       cur=vb;
+       if((key->start>=cur->start)&&(key->start<(cur->start+cur->length)))
+       {
+               return 0;
+       }
+       if(key->start>cur->start) return 1;
+       return -1;
+}
+
+static const struct _convrule_ *getrule(
+       const struct _charblock_ *blocks,
+       int numblocks,
+       int unichar)
+{
+       struct _charblock_ key={unichar,1,(void *)0};
+       struct _charblock_ *cb=bsearch(&key,blocks,numblocks,sizeof(key),blkcmp);
+       if(cb==(void *)0) return &nullrule;
+       return cb->rule;
+}
+       
+
+
+/*
+       Check whether a character (internal code) has certain attributes.
+       Attributes (category flags) may be ORed. The function ANDs
+       character category flags and the mask and returns the result.
+       If the character belongs to one of the categories requested,
+       the result will be nonzero.
+*/
+
+inline static int checkattr(int c,unsigned int catmask)
+{
+       return (catmask & (getrule(allchars,(c<256)?NUM_LAT1BLOCKS:NUM_BLOCKS,c)->category));
+}
+
+inline static int checkattr_s(int c,unsigned int catmask)
+{
+        return (catmask & (getrule(spacechars,NUM_SPACEBLOCKS,c)->category));
+}
+
+/*
+       Define predicate functions for some combinations of categories.
+*/
+
+#define unipred(p,m) \
+int p(int c) \
+{ \
+       return checkattr(c,m); \
+}
+
+#define unipred_s(p,m) \
+int p(int c) \
+{ \
+        return checkattr_s(c,m); \
+}
+
+/*
+       Make these rules as close to Hugs as possible.
+*/
+
+unipred(u_iswcntrl,GENCAT_CC)
+unipred(u_iswprint,~(GENCAT_ZL|GENCAT_ZP|GENCAT_CC|GENCAT_CF|GENCAT_CS|GENCAT_CO))
+unipred_s(u_iswspace,GENCAT_ZS)
+unipred(u_iswupper,(GENCAT_LU|GENCAT_LT))
+unipred(u_iswlower,GENCAT_LL)
+unipred(u_iswalpha,(GENCAT_LL|GENCAT_LU|GENCAT_LT|GENCAT_LM|GENCAT_LO))
+unipred(u_iswdigit,GENCAT_ND)
+
+unipred(u_iswalnum,(GENCAT_LT|GENCAT_LU|GENCAT_LL|GENCAT_LM|GENCAT_LO|
+                   GENCAT_MC|GENCAT_ME|GENCAT_MN|
+                   GENCAT_NO|GENCAT_ND|GENCAT_NL))
+
+#define caseconv(p,to) \
+int p(int c) \
+{ \
+       const struct _convrule_ *rule=getrule(convchars,NUM_CONVBLOCKS,c);\
+       if(rule==&nullrule) return c;\
+       return c+rule->to;\
+}
+
+caseconv(u_towupper,updist)
+caseconv(u_towlower,lowdist)
+caseconv(u_towtitle,titledist)
+
+int u_gencat(int c)
+{
+       return getrule(allchars,NUM_BLOCKS,c)->catnumber;
+}
+
index a559774..6471aa1 100644 (file)
 #endif
 #include "lockFile.h"
 #include "dirUtils.h"
+#include "WCsubst.h"
 
 #include "runProcess.h"
 
diff --git a/include/WCsubst.h b/include/WCsubst.h
new file mode 100644 (file)
index 0000000..f2436dd
--- /dev/null
@@ -0,0 +1,24 @@
+#ifndef WCSUBST_INCL
+
+#define WCSUBST_INCL
+
+#include <stdlib.h>
+
+int u_iswupper(int wc);
+int u_iswdigit(int wc);
+int u_iswalpha(int wc);
+int u_iswcntrl(int wc);
+int u_iswspace(int wc);
+int u_iswprint(int wc);
+int u_iswlower(int wc);
+
+int u_iswalnum(int wc);
+
+int u_towlower(int wc);
+int u_towupper(int wc);
+int u_towtitle(int wc);
+
+int u_gencat(int wc);
+
+#endif
+