packages feed

tagstew (empty) → 0

raw patch · 8 files changed

+2558/−0 lines, 8 filesdep +basedep +bytestringdep +compactsetup-changed

Dependencies added: base, bytestring, compact, tagsoup, tagstew, text, unicode-show, unordered-containers, utf8-string

Files

+ CHANGELOG.md view
@@ -0,0 +1,5 @@+# Revision history for tagstew++## 0 -- YYYY-mm-dd++* First version. Released on an unsuspecting world.
+ LICENSE view
@@ -0,0 +1,30 @@+Copyright Fumiaki Kinoshita (c) 2018++All rights reserved.++Redistribution and use in source and binary forms, with or without+modification, are permitted provided that the following conditions are met:++    * Redistributions of source code must retain the above copyright+      notice, this list of conditions and the following disclaimer.++    * Redistributions in binary form must reproduce the above+      copyright notice, this list of conditions and the following+      disclaimer in the documentation and/or other materials provided+      with the distribution.++    * Neither the name of Fumiaki Kinoshita nor the names of other+      contributors may be used to endorse or promote products derived+      from this software without specific prior written permission.++THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ README.md view
@@ -0,0 +1,7 @@+tagstew+====++tagstew is an HTML decoder which produces a stream of tags defined in the+[tagsoup](http://hackage.haskell.org/package/tagsoup-0.14.8/docs/Text-HTML-TagSoup.html) package. It is ~25% faster than tagsoup.++__It's likely to be incorrect; avoid using it in production.__
+ Setup.hs view
@@ -0,0 +1,2 @@+import Distribution.Simple+main = defaultMain
+ Text/HTML/TagStew.hs view
@@ -0,0 +1,144 @@+{-# LANGUAGE LambdaCase, BangPatterns, OverloadedStrings #-}+{-# LANGUAGE PatternSynonyms #-}+{-# LANGUAGE ViewPatterns #-}+{-# OPTIONS -ddump-simpl -dsuppress-all -ddump-to-file #-}+module Text.HTML.TagStew (parseTags) where++import qualified Data.ByteString.Unsafe as B+import qualified Data.ByteString.Char8 as BC+import qualified Data.ByteString as B+import qualified Text.HTML.TagSoup as S+import Text.HTML.TagStew.Entity (lookupEntity)+import Data.Bits+import Data.Char+import Data.Word (Word8)++data Stack = Text !Int+  | Entity !Int+  | TagOpen !Int+  | TagClose !Int+  | Attrs !Range !Attrs+  | AttrName !Range !Int !Attrs+  | AttrValue !Quote !Range !Range !Int !Attrs+  | Comment !Int+  | Script !Int+  deriving Show++newtype Range = MkRange Int deriving Show+data Quote = QNone | QSingle | QDouble+  deriving Show++type Attrs = [(Range, Range)]++pattern Range :: Int -> Int -> Range+pattern Range i j <- (unpack -> (i, j)) where+  Range i j = MkRange $ i `shiftL` 32 .|. j+{-# COMPLETE Range #-}++unpack :: Range -> (Int, Int)+unpack (MkRange x) = (x `shiftR` 32, x .&. 0xffffffff)+{-# INLINE unpack #-}++parseTags :: B.ByteString -> [S.Tag B.ByteString]+parseTags bs = go 0 (Text 0) where+  slice (Range i j) = B.unsafeTake (j - i) $ B.unsafeDrop i bs+  isScript (Range i j) = BC.map toLower (B.unsafeTake (j - i) (B.unsafeDrop i bs)) == "script"+  {-# INLINE isScript #-}+  go :: Int -> Stack -> [S.Tag B.ByteString]+  go loc _ | loc >= B.length bs = []+  go !loc !st = case st of+    Comment i+      | B.take 3 (B.drop loc bs) == "-->" ->+        S.TagComment (slice $ Range i loc)+          : go (loc + 3) (Text (loc + 3))+      | otherwise -> char+    Entity i -> case ch of+      C_SC -> do+        case lookupEntity (B.take (loc - i) $ B.drop i bs) of+          Just x -> S.TagText x : next (Text loc')+          Nothing -> S.TagText (slice $ Range i loc) : next (Text loc')+      C_NS -> char+      _ | isAlphaNum (toEnum (fromEnum ch)) -> char+      _ -> go loc $ Text (i - 1)+    Text i -> case ch of+      C_LT -> pushText (Range i loc) $ next (TagOpen loc')+      C_AMP -> pushText (Range i loc) $ next (Entity loc')+      _ -> char+    TagOpen i -> case ch of+      C_GT -> pushOpen 1 (Range i loc) []+      C_SL -> next $ TagClose loc'+      _ | isSpace' ch -> next $ AttrName (Range i loc) loc' []+      33 | B.unsafeIndex bs loc' == c2w '-',+          B.unsafeIndex bs (loc + 2) == c2w '-' -> go (loc + 3) (Comment (loc + 3))+      _ -> char+    Attrs tname attrs -> case ch of+      C_GT -> pushOpen 1 tname attrs+      C_SL -> pushOpen 2 tname attrs+      _ | isSpace' ch -> next $ AttrName tname loc' attrs+      _ -> char+    AttrName tname i attrs -> case ch of+      C_SQ -> next $ AttrValue QSingle tname (Range 0 0) loc' attrs+      C_DQ -> next $ AttrValue QDouble tname (Range 0 0) loc' attrs+      C_EQ -> next $ AttrValue QNone tname (Range i loc) loc' attrs+      C_SL -> pushOpen 2 tname attrs+      C_GT -> pushOpen 1 tname attrs+      _ | isSpace' ch -> next $ AttrName tname loc' ((Range i loc, Range 0 0) : attrs)+      _ -> char+    AttrValue QSingle tname aname i attrs -> case ch of+      C_SQ -> next $ Attrs tname $ (aname, Range i loc) : attrs+      C_BS -> go (loc + 2) st+      _ -> char+    AttrValue QDouble tname aname i attrs -> case ch of+      C_DQ -> next $ Attrs tname $ (aname, Range i loc) : attrs+      C_BS -> go (loc + 2) st+      _ -> char+    AttrValue QNone tname aname i attrs -> case ch of+      C_SQ -> next $ AttrValue QSingle tname aname (i + 1) attrs+      C_DQ -> next $ AttrValue QDouble tname aname (i + 1) attrs+      C_SL -> pushOpen 2 tname $ (aname, Range i loc) : attrs+      C_GT -> pushOpen 1 tname $ (aname, Range i loc) : attrs+      _ | isSpace' ch -> next $ AttrName tname loc' $ (aname, Range i loc) : attrs+      _ -> char+    TagClose i -> case ch of+      C_GT -> (S.TagClose $! slice $ Range i loc) : next (Text $ loc + 1)+      _ -> char+    Script i+      | map toLower (BC.unpack (B.take 9 (B.drop loc bs))) == "</script>" -> do+        pushText (Range i loc)+          $ S.TagClose (slice $ Range (loc + 2) (loc + 8))+          : next (Text $ loc + 9)+      | otherwise -> char+    where+      pushText str@(Range i j) cont+        | i == j = cont+        | otherwise = S.TagText (slice str) : cont+      pushOpen ofs tname attrs =+        fmap slice (S.TagOpen tname attrs)+        : if isScript tname+          then go (loc + ofs) $ Script loc'+          else next $ Text $ loc + ofs+      {-# INLINE pushOpen #-}+      loc' = loc + 1+      next = go loc'+      ch = B.unsafeIndex bs loc+      byteCount = max 1 $ countLeadingZeros (complement ch)+      char = go (loc + byteCount) st++isSpace' :: Word8 -> Bool+isSpace' ch = ch == 13 || ch == 10 || ch == 32++pattern C_LT, C_EQ, C_GT, C_SL, C_SQ, C_DQ, C_BS, C_AMP, C_SC, C_NS :: Word8+pattern C_LT = 60+pattern C_EQ = 61+pattern C_GT = 62+pattern C_SL = 47+pattern C_SQ = 39+pattern C_DQ = 34+pattern C_BS = 92+pattern C_AMP = 38+pattern C_SC = 59+pattern C_NS = 35+++c2w :: Char -> Word8+c2w = toEnum . fromEnum
+ Text/HTML/TagStew/Entity.hs view
@@ -0,0 +1,2303 @@+{-# LANGUAGE OverloadedStrings #-}+{-# OPTIONS -Wno-name-shadowing #-}+-- | This module converts between HTML/XML entities (i.e. @&amp;@) and+--   the characters they represent.+module Text.HTML.TagStew.Entity(+    lookupEntity+    ) where++import Data.Char (chr, ord)+import Data.Ix+import qualified Data.HashMap.Strict as HM+import Numeric (readHex)+import qualified Data.ByteString.Short as SB+import qualified Data.ByteString.Char8 as B+import Data.Compact+import Data.Text.Encoding (encodeUtf8)+import qualified Data.Text as T+import System.IO.Unsafe+++-- | Lookup an entity, using 'lookupNumericEntity' if it starts with+--   @#@ and 'lookupNamedEntity' otherwise+lookupEntity :: B.ByteString -> Maybe B.ByteString+lookupEntity bs+  | B.head bs == '#' = lookupNumericEntity (B.tail bs)+  | otherwise = lookupNamedEntity bs++-- | Lookup a numeric entity, the leading @\'#\'@ must have already been removed.+--+-- > lookupNumericEntity "65" == Just "A"+-- > lookupNumericEntity "x41" == Just "A"+-- > lookupNumericEntity "x4E" === Just "N"+-- > lookupNumericEntity "x4e" === Just "N"+-- > lookupNumericEntity "X4e" === Just "N"+-- > lookupNumericEntity "Haskell" == Nothing+-- > lookupNumericEntity "" == Nothing+-- > lookupNumericEntity "89439085908539082" == Nothing+lookupNumericEntity :: B.ByteString -> Maybe B.ByteString+lookupNumericEntity = fmap (encodeUtf8 . T.pack) . f . B.unpack+        -- entity = '&#' [0-9]+ ';' | '&#x' [0-9a-fA-F]+ ';'+    where+        f (x:xs) | x `elem` ("xX" :: String) = g [('0','9'),('a','f'),('A','F')] readHex xs+        f xs = g [('0','9')] reads xs++        g :: [(Char,Char)] -> ReadS Integer -> String -> Maybe String+        g valid reader xs = do+            let test b = if b then Just () else Nothing+            test $ isValid valid xs+            test $ not $ null xs+            case reader xs of+                [(a,"")] -> do+                    test $ inRange (toInteger $ ord minBound, toInteger $ ord maxBound) a+                    return [chr $ fromInteger a]+                _ -> Nothing++        isValid :: [(Char,Char)] -> String -> Bool+        isValid valid xs = all (\x -> any (`inRange` x) valid) xs+++-- | Lookup a named entity, using 'htmlEntities'+--+-- > lookupNamedEntity "amp" == Just "&"+-- > lookupNamedEntity "haskell" == Nothing+lookupNamedEntity :: B.ByteString -> Maybe B.ByteString+lookupNamedEntity x = SB.fromShort <$> HM.lookup (SB.toShort x) (getCompact htmlEntities)++-- | A table mapping HTML entity names to resolved strings. Most resolved strings are a single character long,+--   but some (e.g. @"ngeqq"@) are two characters long. The list is taken from+--   <http://www.w3.org/TR/html5/syntax.html#named-character-references>.+htmlEntities :: Compact (HM.HashMap SB.ShortByteString SB.ShortByteString)+htmlEntities = unsafePerformIO $ compact $ HM.fromList $ let a * b = (a, SB.toShort $ encodeUtf8 b) in+    ["Aacute" * "\x00C1"+    ,"aacute" * "\x00E1"+    ,"Aacute;" * "\x00C1"+    ,"aacute;" * "\x00E1"+    ,"Abreve;" * "\x0102"+    ,"abreve;" * "\x0103"+    ,"ac;" * "\x223E"+    ,"acd;" * "\x223F"+    ,"acE;" * "\x223E\x0333"+    ,"Acirc" * "\x00C2"+    ,"acirc" * "\x00E2"+    ,"Acirc;" * "\x00C2"+    ,"acirc;" * "\x00E2"+    ,"acute" * "\x00B4"+    ,"acute;" * "\x00B4"+    ,"Acy;" * "\x0410"+    ,"acy;" * "\x0430"+    ,"AElig" * "\x00C6"+    ,"aelig" * "\x00E6"+    ,"AElig;" * "\x00C6"+    ,"aelig;" * "\x00E6"+    ,"af;" * "\x2061"+    ,"Afr;" * "\x1D504"+    ,"afr;" * "\x1D51E"+    ,"Agrave" * "\x00C0"+    ,"agrave" * "\x00E0"+    ,"Agrave;" * "\x00C0"+    ,"agrave;" * "\x00E0"+    ,"alefsym;" * "\x2135"+    ,"aleph;" * "\x2135"+    ,"Alpha;" * "\x0391"+    ,"alpha;" * "\x03B1"+    ,"Amacr;" * "\x0100"+    ,"amacr;" * "\x0101"+    ,"amalg;" * "\x2A3F"+    ,"AMP" * "\x0026"+    ,"amp" * "\x0026"+    ,"AMP;" * "\x0026"+    ,"amp;" * "\x0026"+    ,"and;" * "\x2227"+    ,"And;" * "\x2A53"+    ,"andand;" * "\x2A55"+    ,"andd;" * "\x2A5C"+    ,"andslope;" * "\x2A58"+    ,"andv;" * "\x2A5A"+    ,"ang;" * "\x2220"+    ,"ange;" * "\x29A4"+    ,"angle;" * "\x2220"+    ,"angmsd;" * "\x2221"+    ,"angmsdaa;" * "\x29A8"+    ,"angmsdab;" * "\x29A9"+    ,"angmsdac;" * "\x29AA"+    ,"angmsdad;" * "\x29AB"+    ,"angmsdae;" * "\x29AC"+    ,"angmsdaf;" * "\x29AD"+    ,"angmsdag;" * "\x29AE"+    ,"angmsdah;" * "\x29AF"+    ,"angrt;" * "\x221F"+    ,"angrtvb;" * "\x22BE"+    ,"angrtvbd;" * "\x299D"+    ,"angsph;" * "\x2222"+    ,"angst;" * "\x00C5"+    ,"angzarr;" * "\x237C"+    ,"Aogon;" * "\x0104"+    ,"aogon;" * "\x0105"+    ,"Aopf;" * "\x1D538"+    ,"aopf;" * "\x1D552"+    ,"ap;" * "\x2248"+    ,"apacir;" * "\x2A6F"+    ,"ape;" * "\x224A"+    ,"apE;" * "\x2A70"+    ,"apid;" * "\x224B"+    ,"apos;" * "\x0027"+    ,"ApplyFunction;" * "\x2061"+    ,"approx;" * "\x2248"+    ,"approxeq;" * "\x224A"+    ,"Aring" * "\x00C5"+    ,"aring" * "\x00E5"+    ,"Aring;" * "\x00C5"+    ,"aring;" * "\x00E5"+    ,"Ascr;" * "\x1D49C"+    ,"ascr;" * "\x1D4B6"+    ,"Assign;" * "\x2254"+    ,"ast;" * "\x002A"+    ,"asymp;" * "\x2248"+    ,"asympeq;" * "\x224D"+    ,"Atilde" * "\x00C3"+    ,"atilde" * "\x00E3"+    ,"Atilde;" * "\x00C3"+    ,"atilde;" * "\x00E3"+    ,"Auml" * "\x00C4"+    ,"auml" * "\x00E4"+    ,"Auml;" * "\x00C4"+    ,"auml;" * "\x00E4"+    ,"awconint;" * "\x2233"+    ,"awint;" * "\x2A11"+    ,"backcong;" * "\x224C"+    ,"backepsilon;" * "\x03F6"+    ,"backprime;" * "\x2035"+    ,"backsim;" * "\x223D"+    ,"backsimeq;" * "\x22CD"+    ,"Backslash;" * "\x2216"+    ,"Barv;" * "\x2AE7"+    ,"barvee;" * "\x22BD"+    ,"barwed;" * "\x2305"+    ,"Barwed;" * "\x2306"+    ,"barwedge;" * "\x2305"+    ,"bbrk;" * "\x23B5"+    ,"bbrktbrk;" * "\x23B6"+    ,"bcong;" * "\x224C"+    ,"Bcy;" * "\x0411"+    ,"bcy;" * "\x0431"+    ,"bdquo;" * "\x201E"+    ,"becaus;" * "\x2235"+    ,"Because;" * "\x2235"+    ,"because;" * "\x2235"+    ,"bemptyv;" * "\x29B0"+    ,"bepsi;" * "\x03F6"+    ,"bernou;" * "\x212C"+    ,"Bernoullis;" * "\x212C"+    ,"Beta;" * "\x0392"+    ,"beta;" * "\x03B2"+    ,"beth;" * "\x2136"+    ,"between;" * "\x226C"+    ,"Bfr;" * "\x1D505"+    ,"bfr;" * "\x1D51F"+    ,"bigcap;" * "\x22C2"+    ,"bigcirc;" * "\x25EF"+    ,"bigcup;" * "\x22C3"+    ,"bigodot;" * "\x2A00"+    ,"bigoplus;" * "\x2A01"+    ,"bigotimes;" * "\x2A02"+    ,"bigsqcup;" * "\x2A06"+    ,"bigstar;" * "\x2605"+    ,"bigtriangledown;" * "\x25BD"+    ,"bigtriangleup;" * "\x25B3"+    ,"biguplus;" * "\x2A04"+    ,"bigvee;" * "\x22C1"+    ,"bigwedge;" * "\x22C0"+    ,"bkarow;" * "\x290D"+    ,"blacklozenge;" * "\x29EB"+    ,"blacksquare;" * "\x25AA"+    ,"blacktriangle;" * "\x25B4"+    ,"blacktriangledown;" * "\x25BE"+    ,"blacktriangleleft;" * "\x25C2"+    ,"blacktriangleright;" * "\x25B8"+    ,"blank;" * "\x2423"+    ,"blk12;" * "\x2592"+    ,"blk14;" * "\x2591"+    ,"blk34;" * "\x2593"+    ,"block;" * "\x2588"+    ,"bne;" * "\x003D\x20E5"+    ,"bnequiv;" * "\x2261\x20E5"+    ,"bnot;" * "\x2310"+    ,"bNot;" * "\x2AED"+    ,"Bopf;" * "\x1D539"+    ,"bopf;" * "\x1D553"+    ,"bot;" * "\x22A5"+    ,"bottom;" * "\x22A5"+    ,"bowtie;" * "\x22C8"+    ,"boxbox;" * "\x29C9"+    ,"boxdl;" * "\x2510"+    ,"boxdL;" * "\x2555"+    ,"boxDl;" * "\x2556"+    ,"boxDL;" * "\x2557"+    ,"boxdr;" * "\x250C"+    ,"boxdR;" * "\x2552"+    ,"boxDr;" * "\x2553"+    ,"boxDR;" * "\x2554"+    ,"boxh;" * "\x2500"+    ,"boxH;" * "\x2550"+    ,"boxhd;" * "\x252C"+    ,"boxHd;" * "\x2564"+    ,"boxhD;" * "\x2565"+    ,"boxHD;" * "\x2566"+    ,"boxhu;" * "\x2534"+    ,"boxHu;" * "\x2567"+    ,"boxhU;" * "\x2568"+    ,"boxHU;" * "\x2569"+    ,"boxminus;" * "\x229F"+    ,"boxplus;" * "\x229E"+    ,"boxtimes;" * "\x22A0"+    ,"boxul;" * "\x2518"+    ,"boxuL;" * "\x255B"+    ,"boxUl;" * "\x255C"+    ,"boxUL;" * "\x255D"+    ,"boxur;" * "\x2514"+    ,"boxuR;" * "\x2558"+    ,"boxUr;" * "\x2559"+    ,"boxUR;" * "\x255A"+    ,"boxv;" * "\x2502"+    ,"boxV;" * "\x2551"+    ,"boxvh;" * "\x253C"+    ,"boxvH;" * "\x256A"+    ,"boxVh;" * "\x256B"+    ,"boxVH;" * "\x256C"+    ,"boxvl;" * "\x2524"+    ,"boxvL;" * "\x2561"+    ,"boxVl;" * "\x2562"+    ,"boxVL;" * "\x2563"+    ,"boxvr;" * "\x251C"+    ,"boxvR;" * "\x255E"+    ,"boxVr;" * "\x255F"+    ,"boxVR;" * "\x2560"+    ,"bprime;" * "\x2035"+    ,"Breve;" * "\x02D8"+    ,"breve;" * "\x02D8"+    ,"brvbar" * "\x00A6"+    ,"brvbar;" * "\x00A6"+    ,"Bscr;" * "\x212C"+    ,"bscr;" * "\x1D4B7"+    ,"bsemi;" * "\x204F"+    ,"bsim;" * "\x223D"+    ,"bsime;" * "\x22CD"+    ,"bsol;" * "\x005C"+    ,"bsolb;" * "\x29C5"+    ,"bsolhsub;" * "\x27C8"+    ,"bull;" * "\x2022"+    ,"bullet;" * "\x2022"+    ,"bump;" * "\x224E"+    ,"bumpe;" * "\x224F"+    ,"bumpE;" * "\x2AAE"+    ,"Bumpeq;" * "\x224E"+    ,"bumpeq;" * "\x224F"+    ,"Cacute;" * "\x0106"+    ,"cacute;" * "\x0107"+    ,"cap;" * "\x2229"+    ,"Cap;" * "\x22D2"+    ,"capand;" * "\x2A44"+    ,"capbrcup;" * "\x2A49"+    ,"capcap;" * "\x2A4B"+    ,"capcup;" * "\x2A47"+    ,"capdot;" * "\x2A40"+    ,"CapitalDifferentialD;" * "\x2145"+    ,"caps;" * "\x2229\xFE00"+    ,"caret;" * "\x2041"+    ,"caron;" * "\x02C7"+    ,"Cayleys;" * "\x212D"+    ,"ccaps;" * "\x2A4D"+    ,"Ccaron;" * "\x010C"+    ,"ccaron;" * "\x010D"+    ,"Ccedil" * "\x00C7"+    ,"ccedil" * "\x00E7"+    ,"Ccedil;" * "\x00C7"+    ,"ccedil;" * "\x00E7"+    ,"Ccirc;" * "\x0108"+    ,"ccirc;" * "\x0109"+    ,"Cconint;" * "\x2230"+    ,"ccups;" * "\x2A4C"+    ,"ccupssm;" * "\x2A50"+    ,"Cdot;" * "\x010A"+    ,"cdot;" * "\x010B"+    ,"cedil" * "\x00B8"+    ,"cedil;" * "\x00B8"+    ,"Cedilla;" * "\x00B8"+    ,"cemptyv;" * "\x29B2"+    ,"cent" * "\x00A2"+    ,"cent;" * "\x00A2"+    ,"CenterDot;" * "\x00B7"+    ,"centerdot;" * "\x00B7"+    ,"Cfr;" * "\x212D"+    ,"cfr;" * "\x1D520"+    ,"CHcy;" * "\x0427"+    ,"chcy;" * "\x0447"+    ,"check;" * "\x2713"+    ,"checkmark;" * "\x2713"+    ,"Chi;" * "\x03A7"+    ,"chi;" * "\x03C7"+    ,"cir;" * "\x25CB"+    ,"circ;" * "\x02C6"+    ,"circeq;" * "\x2257"+    ,"circlearrowleft;" * "\x21BA"+    ,"circlearrowright;" * "\x21BB"+    ,"circledast;" * "\x229B"+    ,"circledcirc;" * "\x229A"+    ,"circleddash;" * "\x229D"+    ,"CircleDot;" * "\x2299"+    ,"circledR;" * "\x00AE"+    ,"circledS;" * "\x24C8"+    ,"CircleMinus;" * "\x2296"+    ,"CirclePlus;" * "\x2295"+    ,"CircleTimes;" * "\x2297"+    ,"cire;" * "\x2257"+    ,"cirE;" * "\x29C3"+    ,"cirfnint;" * "\x2A10"+    ,"cirmid;" * "\x2AEF"+    ,"cirscir;" * "\x29C2"+    ,"ClockwiseContourIntegral;" * "\x2232"+    ,"CloseCurlyDoubleQuote;" * "\x201D"+    ,"CloseCurlyQuote;" * "\x2019"+    ,"clubs;" * "\x2663"+    ,"clubsuit;" * "\x2663"+    ,"colon;" * "\x003A"+    ,"Colon;" * "\x2237"+    ,"colone;" * "\x2254"+    ,"Colone;" * "\x2A74"+    ,"coloneq;" * "\x2254"+    ,"comma;" * "\x002C"+    ,"commat;" * "\x0040"+    ,"comp;" * "\x2201"+    ,"compfn;" * "\x2218"+    ,"complement;" * "\x2201"+    ,"complexes;" * "\x2102"+    ,"cong;" * "\x2245"+    ,"congdot;" * "\x2A6D"+    ,"Congruent;" * "\x2261"+    ,"conint;" * "\x222E"+    ,"Conint;" * "\x222F"+    ,"ContourIntegral;" * "\x222E"+    ,"Copf;" * "\x2102"+    ,"copf;" * "\x1D554"+    ,"coprod;" * "\x2210"+    ,"Coproduct;" * "\x2210"+    ,"COPY" * "\x00A9"+    ,"copy" * "\x00A9"+    ,"COPY;" * "\x00A9"+    ,"copy;" * "\x00A9"+    ,"copysr;" * "\x2117"+    ,"CounterClockwiseContourIntegral;" * "\x2233"+    ,"crarr;" * "\x21B5"+    ,"cross;" * "\x2717"+    ,"Cross;" * "\x2A2F"+    ,"Cscr;" * "\x1D49E"+    ,"cscr;" * "\x1D4B8"+    ,"csub;" * "\x2ACF"+    ,"csube;" * "\x2AD1"+    ,"csup;" * "\x2AD0"+    ,"csupe;" * "\x2AD2"+    ,"ctdot;" * "\x22EF"+    ,"cudarrl;" * "\x2938"+    ,"cudarrr;" * "\x2935"+    ,"cuepr;" * "\x22DE"+    ,"cuesc;" * "\x22DF"+    ,"cularr;" * "\x21B6"+    ,"cularrp;" * "\x293D"+    ,"cup;" * "\x222A"+    ,"Cup;" * "\x22D3"+    ,"cupbrcap;" * "\x2A48"+    ,"CupCap;" * "\x224D"+    ,"cupcap;" * "\x2A46"+    ,"cupcup;" * "\x2A4A"+    ,"cupdot;" * "\x228D"+    ,"cupor;" * "\x2A45"+    ,"cups;" * "\x222A\xFE00"+    ,"curarr;" * "\x21B7"+    ,"curarrm;" * "\x293C"+    ,"curlyeqprec;" * "\x22DE"+    ,"curlyeqsucc;" * "\x22DF"+    ,"curlyvee;" * "\x22CE"+    ,"curlywedge;" * "\x22CF"+    ,"curren" * "\x00A4"+    ,"curren;" * "\x00A4"+    ,"curvearrowleft;" * "\x21B6"+    ,"curvearrowright;" * "\x21B7"+    ,"cuvee;" * "\x22CE"+    ,"cuwed;" * "\x22CF"+    ,"cwconint;" * "\x2232"+    ,"cwint;" * "\x2231"+    ,"cylcty;" * "\x232D"+    ,"dagger;" * "\x2020"+    ,"Dagger;" * "\x2021"+    ,"daleth;" * "\x2138"+    ,"darr;" * "\x2193"+    ,"Darr;" * "\x21A1"+    ,"dArr;" * "\x21D3"+    ,"dash;" * "\x2010"+    ,"dashv;" * "\x22A3"+    ,"Dashv;" * "\x2AE4"+    ,"dbkarow;" * "\x290F"+    ,"dblac;" * "\x02DD"+    ,"Dcaron;" * "\x010E"+    ,"dcaron;" * "\x010F"+    ,"Dcy;" * "\x0414"+    ,"dcy;" * "\x0434"+    ,"DD;" * "\x2145"+    ,"dd;" * "\x2146"+    ,"ddagger;" * "\x2021"+    ,"ddarr;" * "\x21CA"+    ,"DDotrahd;" * "\x2911"+    ,"ddotseq;" * "\x2A77"+    ,"deg" * "\x00B0"+    ,"deg;" * "\x00B0"+    ,"Del;" * "\x2207"+    ,"Delta;" * "\x0394"+    ,"delta;" * "\x03B4"+    ,"demptyv;" * "\x29B1"+    ,"dfisht;" * "\x297F"+    ,"Dfr;" * "\x1D507"+    ,"dfr;" * "\x1D521"+    ,"dHar;" * "\x2965"+    ,"dharl;" * "\x21C3"+    ,"dharr;" * "\x21C2"+    ,"DiacriticalAcute;" * "\x00B4"+    ,"DiacriticalDot;" * "\x02D9"+    ,"DiacriticalDoubleAcute;" * "\x02DD"+    ,"DiacriticalGrave;" * "\x0060"+    ,"DiacriticalTilde;" * "\x02DC"+    ,"diam;" * "\x22C4"+    ,"Diamond;" * "\x22C4"+    ,"diamond;" * "\x22C4"+    ,"diamondsuit;" * "\x2666"+    ,"diams;" * "\x2666"+    ,"die;" * "\x00A8"+    ,"DifferentialD;" * "\x2146"+    ,"digamma;" * "\x03DD"+    ,"disin;" * "\x22F2"+    ,"div;" * "\x00F7"+    ,"divide" * "\x00F7"+    ,"divide;" * "\x00F7"+    ,"divideontimes;" * "\x22C7"+    ,"divonx;" * "\x22C7"+    ,"DJcy;" * "\x0402"+    ,"djcy;" * "\x0452"+    ,"dlcorn;" * "\x231E"+    ,"dlcrop;" * "\x230D"+    ,"dollar;" * "\x0024"+    ,"Dopf;" * "\x1D53B"+    ,"dopf;" * "\x1D555"+    ,"Dot;" * "\x00A8"+    ,"dot;" * "\x02D9"+    ,"DotDot;" * "\x20DC"+    ,"doteq;" * "\x2250"+    ,"doteqdot;" * "\x2251"+    ,"DotEqual;" * "\x2250"+    ,"dotminus;" * "\x2238"+    ,"dotplus;" * "\x2214"+    ,"dotsquare;" * "\x22A1"+    ,"doublebarwedge;" * "\x2306"+    ,"DoubleContourIntegral;" * "\x222F"+    ,"DoubleDot;" * "\x00A8"+    ,"DoubleDownArrow;" * "\x21D3"+    ,"DoubleLeftArrow;" * "\x21D0"+    ,"DoubleLeftRightArrow;" * "\x21D4"+    ,"DoubleLeftTee;" * "\x2AE4"+    ,"DoubleLongLeftArrow;" * "\x27F8"+    ,"DoubleLongLeftRightArrow;" * "\x27FA"+    ,"DoubleLongRightArrow;" * "\x27F9"+    ,"DoubleRightArrow;" * "\x21D2"+    ,"DoubleRightTee;" * "\x22A8"+    ,"DoubleUpArrow;" * "\x21D1"+    ,"DoubleUpDownArrow;" * "\x21D5"+    ,"DoubleVerticalBar;" * "\x2225"+    ,"DownArrow;" * "\x2193"+    ,"downarrow;" * "\x2193"+    ,"Downarrow;" * "\x21D3"+    ,"DownArrowBar;" * "\x2913"+    ,"DownArrowUpArrow;" * "\x21F5"+    ,"DownBreve;" * "\x0311"+    ,"downdownarrows;" * "\x21CA"+    ,"downharpoonleft;" * "\x21C3"+    ,"downharpoonright;" * "\x21C2"+    ,"DownLeftRightVector;" * "\x2950"+    ,"DownLeftTeeVector;" * "\x295E"+    ,"DownLeftVector;" * "\x21BD"+    ,"DownLeftVectorBar;" * "\x2956"+    ,"DownRightTeeVector;" * "\x295F"+    ,"DownRightVector;" * "\x21C1"+    ,"DownRightVectorBar;" * "\x2957"+    ,"DownTee;" * "\x22A4"+    ,"DownTeeArrow;" * "\x21A7"+    ,"drbkarow;" * "\x2910"+    ,"drcorn;" * "\x231F"+    ,"drcrop;" * "\x230C"+    ,"Dscr;" * "\x1D49F"+    ,"dscr;" * "\x1D4B9"+    ,"DScy;" * "\x0405"+    ,"dscy;" * "\x0455"+    ,"dsol;" * "\x29F6"+    ,"Dstrok;" * "\x0110"+    ,"dstrok;" * "\x0111"+    ,"dtdot;" * "\x22F1"+    ,"dtri;" * "\x25BF"+    ,"dtrif;" * "\x25BE"+    ,"duarr;" * "\x21F5"+    ,"duhar;" * "\x296F"+    ,"dwangle;" * "\x29A6"+    ,"DZcy;" * "\x040F"+    ,"dzcy;" * "\x045F"+    ,"dzigrarr;" * "\x27FF"+    ,"Eacute" * "\x00C9"+    ,"eacute" * "\x00E9"+    ,"Eacute;" * "\x00C9"+    ,"eacute;" * "\x00E9"+    ,"easter;" * "\x2A6E"+    ,"Ecaron;" * "\x011A"+    ,"ecaron;" * "\x011B"+    ,"ecir;" * "\x2256"+    ,"Ecirc" * "\x00CA"+    ,"ecirc" * "\x00EA"+    ,"Ecirc;" * "\x00CA"+    ,"ecirc;" * "\x00EA"+    ,"ecolon;" * "\x2255"+    ,"Ecy;" * "\x042D"+    ,"ecy;" * "\x044D"+    ,"eDDot;" * "\x2A77"+    ,"Edot;" * "\x0116"+    ,"edot;" * "\x0117"+    ,"eDot;" * "\x2251"+    ,"ee;" * "\x2147"+    ,"efDot;" * "\x2252"+    ,"Efr;" * "\x1D508"+    ,"efr;" * "\x1D522"+    ,"eg;" * "\x2A9A"+    ,"Egrave" * "\x00C8"+    ,"egrave" * "\x00E8"+    ,"Egrave;" * "\x00C8"+    ,"egrave;" * "\x00E8"+    ,"egs;" * "\x2A96"+    ,"egsdot;" * "\x2A98"+    ,"el;" * "\x2A99"+    ,"Element;" * "\x2208"+    ,"elinters;" * "\x23E7"+    ,"ell;" * "\x2113"+    ,"els;" * "\x2A95"+    ,"elsdot;" * "\x2A97"+    ,"Emacr;" * "\x0112"+    ,"emacr;" * "\x0113"+    ,"empty;" * "\x2205"+    ,"emptyset;" * "\x2205"+    ,"EmptySmallSquare;" * "\x25FB"+    ,"emptyv;" * "\x2205"+    ,"EmptyVerySmallSquare;" * "\x25AB"+    ,"emsp13;" * "\x2004"+    ,"emsp14;" * "\x2005"+    ,"emsp;" * "\x2003"+    ,"ENG;" * "\x014A"+    ,"eng;" * "\x014B"+    ,"ensp;" * "\x2002"+    ,"Eogon;" * "\x0118"+    ,"eogon;" * "\x0119"+    ,"Eopf;" * "\x1D53C"+    ,"eopf;" * "\x1D556"+    ,"epar;" * "\x22D5"+    ,"eparsl;" * "\x29E3"+    ,"eplus;" * "\x2A71"+    ,"epsi;" * "\x03B5"+    ,"Epsilon;" * "\x0395"+    ,"epsilon;" * "\x03B5"+    ,"epsiv;" * "\x03F5"+    ,"eqcirc;" * "\x2256"+    ,"eqcolon;" * "\x2255"+    ,"eqsim;" * "\x2242"+    ,"eqslantgtr;" * "\x2A96"+    ,"eqslantless;" * "\x2A95"+    ,"Equal;" * "\x2A75"+    ,"equals;" * "\x003D"+    ,"EqualTilde;" * "\x2242"+    ,"equest;" * "\x225F"+    ,"Equilibrium;" * "\x21CC"+    ,"equiv;" * "\x2261"+    ,"equivDD;" * "\x2A78"+    ,"eqvparsl;" * "\x29E5"+    ,"erarr;" * "\x2971"+    ,"erDot;" * "\x2253"+    ,"escr;" * "\x212F"+    ,"Escr;" * "\x2130"+    ,"esdot;" * "\x2250"+    ,"esim;" * "\x2242"+    ,"Esim;" * "\x2A73"+    ,"Eta;" * "\x0397"+    ,"eta;" * "\x03B7"+    ,"ETH" * "\x00D0"+    ,"eth" * "\x00F0"+    ,"ETH;" * "\x00D0"+    ,"eth;" * "\x00F0"+    ,"Euml" * "\x00CB"+    ,"euml" * "\x00EB"+    ,"Euml;" * "\x00CB"+    ,"euml;" * "\x00EB"+    ,"euro;" * "\x20AC"+    ,"excl;" * "\x0021"+    ,"exist;" * "\x2203"+    ,"Exists;" * "\x2203"+    ,"expectation;" * "\x2130"+    ,"ExponentialE;" * "\x2147"+    ,"exponentiale;" * "\x2147"+    ,"fallingdotseq;" * "\x2252"+    ,"Fcy;" * "\x0424"+    ,"fcy;" * "\x0444"+    ,"female;" * "\x2640"+    ,"ffilig;" * "\xFB03"+    ,"fflig;" * "\xFB00"+    ,"ffllig;" * "\xFB04"+    ,"Ffr;" * "\x1D509"+    ,"ffr;" * "\x1D523"+    ,"filig;" * "\xFB01"+    ,"FilledSmallSquare;" * "\x25FC"+    ,"FilledVerySmallSquare;" * "\x25AA"+    ,"fjlig;" * "\x0066\x006A"+    ,"flat;" * "\x266D"+    ,"fllig;" * "\xFB02"+    ,"fltns;" * "\x25B1"+    ,"fnof;" * "\x0192"+    ,"Fopf;" * "\x1D53D"+    ,"fopf;" * "\x1D557"+    ,"ForAll;" * "\x2200"+    ,"forall;" * "\x2200"+    ,"fork;" * "\x22D4"+    ,"forkv;" * "\x2AD9"+    ,"Fouriertrf;" * "\x2131"+    ,"fpartint;" * "\x2A0D"+    ,"frac12" * "\x00BD"+    ,"frac12;" * "\x00BD"+    ,"frac13;" * "\x2153"+    ,"frac14" * "\x00BC"+    ,"frac14;" * "\x00BC"+    ,"frac15;" * "\x2155"+    ,"frac16;" * "\x2159"+    ,"frac18;" * "\x215B"+    ,"frac23;" * "\x2154"+    ,"frac25;" * "\x2156"+    ,"frac34" * "\x00BE"+    ,"frac34;" * "\x00BE"+    ,"frac35;" * "\x2157"+    ,"frac38;" * "\x215C"+    ,"frac45;" * "\x2158"+    ,"frac56;" * "\x215A"+    ,"frac58;" * "\x215D"+    ,"frac78;" * "\x215E"+    ,"frasl;" * "\x2044"+    ,"frown;" * "\x2322"+    ,"Fscr;" * "\x2131"+    ,"fscr;" * "\x1D4BB"+    ,"gacute;" * "\x01F5"+    ,"Gamma;" * "\x0393"+    ,"gamma;" * "\x03B3"+    ,"Gammad;" * "\x03DC"+    ,"gammad;" * "\x03DD"+    ,"gap;" * "\x2A86"+    ,"Gbreve;" * "\x011E"+    ,"gbreve;" * "\x011F"+    ,"Gcedil;" * "\x0122"+    ,"Gcirc;" * "\x011C"+    ,"gcirc;" * "\x011D"+    ,"Gcy;" * "\x0413"+    ,"gcy;" * "\x0433"+    ,"Gdot;" * "\x0120"+    ,"gdot;" * "\x0121"+    ,"ge;" * "\x2265"+    ,"gE;" * "\x2267"+    ,"gel;" * "\x22DB"+    ,"gEl;" * "\x2A8C"+    ,"geq;" * "\x2265"+    ,"geqq;" * "\x2267"+    ,"geqslant;" * "\x2A7E"+    ,"ges;" * "\x2A7E"+    ,"gescc;" * "\x2AA9"+    ,"gesdot;" * "\x2A80"+    ,"gesdoto;" * "\x2A82"+    ,"gesdotol;" * "\x2A84"+    ,"gesl;" * "\x22DB\xFE00"+    ,"gesles;" * "\x2A94"+    ,"Gfr;" * "\x1D50A"+    ,"gfr;" * "\x1D524"+    ,"gg;" * "\x226B"+    ,"Gg;" * "\x22D9"+    ,"ggg;" * "\x22D9"+    ,"gimel;" * "\x2137"+    ,"GJcy;" * "\x0403"+    ,"gjcy;" * "\x0453"+    ,"gl;" * "\x2277"+    ,"gla;" * "\x2AA5"+    ,"glE;" * "\x2A92"+    ,"glj;" * "\x2AA4"+    ,"gnap;" * "\x2A8A"+    ,"gnapprox;" * "\x2A8A"+    ,"gnE;" * "\x2269"+    ,"gne;" * "\x2A88"+    ,"gneq;" * "\x2A88"+    ,"gneqq;" * "\x2269"+    ,"gnsim;" * "\x22E7"+    ,"Gopf;" * "\x1D53E"+    ,"gopf;" * "\x1D558"+    ,"grave;" * "\x0060"+    ,"GreaterEqual;" * "\x2265"+    ,"GreaterEqualLess;" * "\x22DB"+    ,"GreaterFullEqual;" * "\x2267"+    ,"GreaterGreater;" * "\x2AA2"+    ,"GreaterLess;" * "\x2277"+    ,"GreaterSlantEqual;" * "\x2A7E"+    ,"GreaterTilde;" * "\x2273"+    ,"gscr;" * "\x210A"+    ,"Gscr;" * "\x1D4A2"+    ,"gsim;" * "\x2273"+    ,"gsime;" * "\x2A8E"+    ,"gsiml;" * "\x2A90"+    ,"GT" * "\x003E"+    ,"gt" * "\x003E"+    ,"GT;" * "\x003E"+    ,"gt;" * "\x003E"+    ,"Gt;" * "\x226B"+    ,"gtcc;" * "\x2AA7"+    ,"gtcir;" * "\x2A7A"+    ,"gtdot;" * "\x22D7"+    ,"gtlPar;" * "\x2995"+    ,"gtquest;" * "\x2A7C"+    ,"gtrapprox;" * "\x2A86"+    ,"gtrarr;" * "\x2978"+    ,"gtrdot;" * "\x22D7"+    ,"gtreqless;" * "\x22DB"+    ,"gtreqqless;" * "\x2A8C"+    ,"gtrless;" * "\x2277"+    ,"gtrsim;" * "\x2273"+    ,"gvertneqq;" * "\x2269\xFE00"+    ,"gvnE;" * "\x2269\xFE00"+    ,"Hacek;" * "\x02C7"+    ,"hairsp;" * "\x200A"+    ,"half;" * "\x00BD"+    ,"hamilt;" * "\x210B"+    ,"HARDcy;" * "\x042A"+    ,"hardcy;" * "\x044A"+    ,"harr;" * "\x2194"+    ,"hArr;" * "\x21D4"+    ,"harrcir;" * "\x2948"+    ,"harrw;" * "\x21AD"+    ,"Hat;" * "\x005E"+    ,"hbar;" * "\x210F"+    ,"Hcirc;" * "\x0124"+    ,"hcirc;" * "\x0125"+    ,"hearts;" * "\x2665"+    ,"heartsuit;" * "\x2665"+    ,"hellip;" * "\x2026"+    ,"hercon;" * "\x22B9"+    ,"Hfr;" * "\x210C"+    ,"hfr;" * "\x1D525"+    ,"HilbertSpace;" * "\x210B"+    ,"hksearow;" * "\x2925"+    ,"hkswarow;" * "\x2926"+    ,"hoarr;" * "\x21FF"+    ,"homtht;" * "\x223B"+    ,"hookleftarrow;" * "\x21A9"+    ,"hookrightarrow;" * "\x21AA"+    ,"Hopf;" * "\x210D"+    ,"hopf;" * "\x1D559"+    ,"horbar;" * "\x2015"+    ,"HorizontalLine;" * "\x2500"+    ,"Hscr;" * "\x210B"+    ,"hscr;" * "\x1D4BD"+    ,"hslash;" * "\x210F"+    ,"Hstrok;" * "\x0126"+    ,"hstrok;" * "\x0127"+    ,"HumpDownHump;" * "\x224E"+    ,"HumpEqual;" * "\x224F"+    ,"hybull;" * "\x2043"+    ,"hyphen;" * "\x2010"+    ,"Iacute" * "\x00CD"+    ,"iacute" * "\x00ED"+    ,"Iacute;" * "\x00CD"+    ,"iacute;" * "\x00ED"+    ,"ic;" * "\x2063"+    ,"Icirc" * "\x00CE"+    ,"icirc" * "\x00EE"+    ,"Icirc;" * "\x00CE"+    ,"icirc;" * "\x00EE"+    ,"Icy;" * "\x0418"+    ,"icy;" * "\x0438"+    ,"Idot;" * "\x0130"+    ,"IEcy;" * "\x0415"+    ,"iecy;" * "\x0435"+    ,"iexcl" * "\x00A1"+    ,"iexcl;" * "\x00A1"+    ,"iff;" * "\x21D4"+    ,"Ifr;" * "\x2111"+    ,"ifr;" * "\x1D526"+    ,"Igrave" * "\x00CC"+    ,"igrave" * "\x00EC"+    ,"Igrave;" * "\x00CC"+    ,"igrave;" * "\x00EC"+    ,"ii;" * "\x2148"+    ,"iiiint;" * "\x2A0C"+    ,"iiint;" * "\x222D"+    ,"iinfin;" * "\x29DC"+    ,"iiota;" * "\x2129"+    ,"IJlig;" * "\x0132"+    ,"ijlig;" * "\x0133"+    ,"Im;" * "\x2111"+    ,"Imacr;" * "\x012A"+    ,"imacr;" * "\x012B"+    ,"image;" * "\x2111"+    ,"ImaginaryI;" * "\x2148"+    ,"imagline;" * "\x2110"+    ,"imagpart;" * "\x2111"+    ,"imath;" * "\x0131"+    ,"imof;" * "\x22B7"+    ,"imped;" * "\x01B5"+    ,"Implies;" * "\x21D2"+    ,"in;" * "\x2208"+    ,"incare;" * "\x2105"+    ,"infin;" * "\x221E"+    ,"infintie;" * "\x29DD"+    ,"inodot;" * "\x0131"+    ,"int;" * "\x222B"+    ,"Int;" * "\x222C"+    ,"intcal;" * "\x22BA"+    ,"integers;" * "\x2124"+    ,"Integral;" * "\x222B"+    ,"intercal;" * "\x22BA"+    ,"Intersection;" * "\x22C2"+    ,"intlarhk;" * "\x2A17"+    ,"intprod;" * "\x2A3C"+    ,"InvisibleComma;" * "\x2063"+    ,"InvisibleTimes;" * "\x2062"+    ,"IOcy;" * "\x0401"+    ,"iocy;" * "\x0451"+    ,"Iogon;" * "\x012E"+    ,"iogon;" * "\x012F"+    ,"Iopf;" * "\x1D540"+    ,"iopf;" * "\x1D55A"+    ,"Iota;" * "\x0399"+    ,"iota;" * "\x03B9"+    ,"iprod;" * "\x2A3C"+    ,"iquest" * "\x00BF"+    ,"iquest;" * "\x00BF"+    ,"Iscr;" * "\x2110"+    ,"iscr;" * "\x1D4BE"+    ,"isin;" * "\x2208"+    ,"isindot;" * "\x22F5"+    ,"isinE;" * "\x22F9"+    ,"isins;" * "\x22F4"+    ,"isinsv;" * "\x22F3"+    ,"isinv;" * "\x2208"+    ,"it;" * "\x2062"+    ,"Itilde;" * "\x0128"+    ,"itilde;" * "\x0129"+    ,"Iukcy;" * "\x0406"+    ,"iukcy;" * "\x0456"+    ,"Iuml" * "\x00CF"+    ,"iuml" * "\x00EF"+    ,"Iuml;" * "\x00CF"+    ,"iuml;" * "\x00EF"+    ,"Jcirc;" * "\x0134"+    ,"jcirc;" * "\x0135"+    ,"Jcy;" * "\x0419"+    ,"jcy;" * "\x0439"+    ,"Jfr;" * "\x1D50D"+    ,"jfr;" * "\x1D527"+    ,"jmath;" * "\x0237"+    ,"Jopf;" * "\x1D541"+    ,"jopf;" * "\x1D55B"+    ,"Jscr;" * "\x1D4A5"+    ,"jscr;" * "\x1D4BF"+    ,"Jsercy;" * "\x0408"+    ,"jsercy;" * "\x0458"+    ,"Jukcy;" * "\x0404"+    ,"jukcy;" * "\x0454"+    ,"Kappa;" * "\x039A"+    ,"kappa;" * "\x03BA"+    ,"kappav;" * "\x03F0"+    ,"Kcedil;" * "\x0136"+    ,"kcedil;" * "\x0137"+    ,"Kcy;" * "\x041A"+    ,"kcy;" * "\x043A"+    ,"Kfr;" * "\x1D50E"+    ,"kfr;" * "\x1D528"+    ,"kgreen;" * "\x0138"+    ,"KHcy;" * "\x0425"+    ,"khcy;" * "\x0445"+    ,"KJcy;" * "\x040C"+    ,"kjcy;" * "\x045C"+    ,"Kopf;" * "\x1D542"+    ,"kopf;" * "\x1D55C"+    ,"Kscr;" * "\x1D4A6"+    ,"kscr;" * "\x1D4C0"+    ,"lAarr;" * "\x21DA"+    ,"Lacute;" * "\x0139"+    ,"lacute;" * "\x013A"+    ,"laemptyv;" * "\x29B4"+    ,"lagran;" * "\x2112"+    ,"Lambda;" * "\x039B"+    ,"lambda;" * "\x03BB"+    ,"lang;" * "\x27E8"+    ,"Lang;" * "\x27EA"+    ,"langd;" * "\x2991"+    ,"langle;" * "\x27E8"+    ,"lap;" * "\x2A85"+    ,"Laplacetrf;" * "\x2112"+    ,"laquo" * "\x00AB"+    ,"laquo;" * "\x00AB"+    ,"larr;" * "\x2190"+    ,"Larr;" * "\x219E"+    ,"lArr;" * "\x21D0"+    ,"larrb;" * "\x21E4"+    ,"larrbfs;" * "\x291F"+    ,"larrfs;" * "\x291D"+    ,"larrhk;" * "\x21A9"+    ,"larrlp;" * "\x21AB"+    ,"larrpl;" * "\x2939"+    ,"larrsim;" * "\x2973"+    ,"larrtl;" * "\x21A2"+    ,"lat;" * "\x2AAB"+    ,"latail;" * "\x2919"+    ,"lAtail;" * "\x291B"+    ,"late;" * "\x2AAD"+    ,"lates;" * "\x2AAD\xFE00"+    ,"lbarr;" * "\x290C"+    ,"lBarr;" * "\x290E"+    ,"lbbrk;" * "\x2772"+    ,"lbrace;" * "\x007B"+    ,"lbrack;" * "\x005B"+    ,"lbrke;" * "\x298B"+    ,"lbrksld;" * "\x298F"+    ,"lbrkslu;" * "\x298D"+    ,"Lcaron;" * "\x013D"+    ,"lcaron;" * "\x013E"+    ,"Lcedil;" * "\x013B"+    ,"lcedil;" * "\x013C"+    ,"lceil;" * "\x2308"+    ,"lcub;" * "\x007B"+    ,"Lcy;" * "\x041B"+    ,"lcy;" * "\x043B"+    ,"ldca;" * "\x2936"+    ,"ldquo;" * "\x201C"+    ,"ldquor;" * "\x201E"+    ,"ldrdhar;" * "\x2967"+    ,"ldrushar;" * "\x294B"+    ,"ldsh;" * "\x21B2"+    ,"le;" * "\x2264"+    ,"lE;" * "\x2266"+    ,"LeftAngleBracket;" * "\x27E8"+    ,"LeftArrow;" * "\x2190"+    ,"leftarrow;" * "\x2190"+    ,"Leftarrow;" * "\x21D0"+    ,"LeftArrowBar;" * "\x21E4"+    ,"LeftArrowRightArrow;" * "\x21C6"+    ,"leftarrowtail;" * "\x21A2"+    ,"LeftCeiling;" * "\x2308"+    ,"LeftDoubleBracket;" * "\x27E6"+    ,"LeftDownTeeVector;" * "\x2961"+    ,"LeftDownVector;" * "\x21C3"+    ,"LeftDownVectorBar;" * "\x2959"+    ,"LeftFloor;" * "\x230A"+    ,"leftharpoondown;" * "\x21BD"+    ,"leftharpoonup;" * "\x21BC"+    ,"leftleftarrows;" * "\x21C7"+    ,"LeftRightArrow;" * "\x2194"+    ,"leftrightarrow;" * "\x2194"+    ,"Leftrightarrow;" * "\x21D4"+    ,"leftrightarrows;" * "\x21C6"+    ,"leftrightharpoons;" * "\x21CB"+    ,"leftrightsquigarrow;" * "\x21AD"+    ,"LeftRightVector;" * "\x294E"+    ,"LeftTee;" * "\x22A3"+    ,"LeftTeeArrow;" * "\x21A4"+    ,"LeftTeeVector;" * "\x295A"+    ,"leftthreetimes;" * "\x22CB"+    ,"LeftTriangle;" * "\x22B2"+    ,"LeftTriangleBar;" * "\x29CF"+    ,"LeftTriangleEqual;" * "\x22B4"+    ,"LeftUpDownVector;" * "\x2951"+    ,"LeftUpTeeVector;" * "\x2960"+    ,"LeftUpVector;" * "\x21BF"+    ,"LeftUpVectorBar;" * "\x2958"+    ,"LeftVector;" * "\x21BC"+    ,"LeftVectorBar;" * "\x2952"+    ,"leg;" * "\x22DA"+    ,"lEg;" * "\x2A8B"+    ,"leq;" * "\x2264"+    ,"leqq;" * "\x2266"+    ,"leqslant;" * "\x2A7D"+    ,"les;" * "\x2A7D"+    ,"lescc;" * "\x2AA8"+    ,"lesdot;" * "\x2A7F"+    ,"lesdoto;" * "\x2A81"+    ,"lesdotor;" * "\x2A83"+    ,"lesg;" * "\x22DA\xFE00"+    ,"lesges;" * "\x2A93"+    ,"lessapprox;" * "\x2A85"+    ,"lessdot;" * "\x22D6"+    ,"lesseqgtr;" * "\x22DA"+    ,"lesseqqgtr;" * "\x2A8B"+    ,"LessEqualGreater;" * "\x22DA"+    ,"LessFullEqual;" * "\x2266"+    ,"LessGreater;" * "\x2276"+    ,"lessgtr;" * "\x2276"+    ,"LessLess;" * "\x2AA1"+    ,"lesssim;" * "\x2272"+    ,"LessSlantEqual;" * "\x2A7D"+    ,"LessTilde;" * "\x2272"+    ,"lfisht;" * "\x297C"+    ,"lfloor;" * "\x230A"+    ,"Lfr;" * "\x1D50F"+    ,"lfr;" * "\x1D529"+    ,"lg;" * "\x2276"+    ,"lgE;" * "\x2A91"+    ,"lHar;" * "\x2962"+    ,"lhard;" * "\x21BD"+    ,"lharu;" * "\x21BC"+    ,"lharul;" * "\x296A"+    ,"lhblk;" * "\x2584"+    ,"LJcy;" * "\x0409"+    ,"ljcy;" * "\x0459"+    ,"ll;" * "\x226A"+    ,"Ll;" * "\x22D8"+    ,"llarr;" * "\x21C7"+    ,"llcorner;" * "\x231E"+    ,"Lleftarrow;" * "\x21DA"+    ,"llhard;" * "\x296B"+    ,"lltri;" * "\x25FA"+    ,"Lmidot;" * "\x013F"+    ,"lmidot;" * "\x0140"+    ,"lmoust;" * "\x23B0"+    ,"lmoustache;" * "\x23B0"+    ,"lnap;" * "\x2A89"+    ,"lnapprox;" * "\x2A89"+    ,"lnE;" * "\x2268"+    ,"lne;" * "\x2A87"+    ,"lneq;" * "\x2A87"+    ,"lneqq;" * "\x2268"+    ,"lnsim;" * "\x22E6"+    ,"loang;" * "\x27EC"+    ,"loarr;" * "\x21FD"+    ,"lobrk;" * "\x27E6"+    ,"LongLeftArrow;" * "\x27F5"+    ,"longleftarrow;" * "\x27F5"+    ,"Longleftarrow;" * "\x27F8"+    ,"LongLeftRightArrow;" * "\x27F7"+    ,"longleftrightarrow;" * "\x27F7"+    ,"Longleftrightarrow;" * "\x27FA"+    ,"longmapsto;" * "\x27FC"+    ,"LongRightArrow;" * "\x27F6"+    ,"longrightarrow;" * "\x27F6"+    ,"Longrightarrow;" * "\x27F9"+    ,"looparrowleft;" * "\x21AB"+    ,"looparrowright;" * "\x21AC"+    ,"lopar;" * "\x2985"+    ,"Lopf;" * "\x1D543"+    ,"lopf;" * "\x1D55D"+    ,"loplus;" * "\x2A2D"+    ,"lotimes;" * "\x2A34"+    ,"lowast;" * "\x2217"+    ,"lowbar;" * "\x005F"+    ,"LowerLeftArrow;" * "\x2199"+    ,"LowerRightArrow;" * "\x2198"+    ,"loz;" * "\x25CA"+    ,"lozenge;" * "\x25CA"+    ,"lozf;" * "\x29EB"+    ,"lpar;" * "\x0028"+    ,"lparlt;" * "\x2993"+    ,"lrarr;" * "\x21C6"+    ,"lrcorner;" * "\x231F"+    ,"lrhar;" * "\x21CB"+    ,"lrhard;" * "\x296D"+    ,"lrm;" * "\x200E"+    ,"lrtri;" * "\x22BF"+    ,"lsaquo;" * "\x2039"+    ,"Lscr;" * "\x2112"+    ,"lscr;" * "\x1D4C1"+    ,"Lsh;" * "\x21B0"+    ,"lsh;" * "\x21B0"+    ,"lsim;" * "\x2272"+    ,"lsime;" * "\x2A8D"+    ,"lsimg;" * "\x2A8F"+    ,"lsqb;" * "\x005B"+    ,"lsquo;" * "\x2018"+    ,"lsquor;" * "\x201A"+    ,"Lstrok;" * "\x0141"+    ,"lstrok;" * "\x0142"+    ,"LT" * "\x003C"+    ,"lt" * "\x003C"+    ,"LT;" * "\x003C"+    ,"lt;" * "\x003C"+    ,"Lt;" * "\x226A"+    ,"ltcc;" * "\x2AA6"+    ,"ltcir;" * "\x2A79"+    ,"ltdot;" * "\x22D6"+    ,"lthree;" * "\x22CB"+    ,"ltimes;" * "\x22C9"+    ,"ltlarr;" * "\x2976"+    ,"ltquest;" * "\x2A7B"+    ,"ltri;" * "\x25C3"+    ,"ltrie;" * "\x22B4"+    ,"ltrif;" * "\x25C2"+    ,"ltrPar;" * "\x2996"+    ,"lurdshar;" * "\x294A"+    ,"luruhar;" * "\x2966"+    ,"lvertneqq;" * "\x2268\xFE00"+    ,"lvnE;" * "\x2268\xFE00"+    ,"macr" * "\x00AF"+    ,"macr;" * "\x00AF"+    ,"male;" * "\x2642"+    ,"malt;" * "\x2720"+    ,"maltese;" * "\x2720"+    ,"map;" * "\x21A6"+    ,"Map;" * "\x2905"+    ,"mapsto;" * "\x21A6"+    ,"mapstodown;" * "\x21A7"+    ,"mapstoleft;" * "\x21A4"+    ,"mapstoup;" * "\x21A5"+    ,"marker;" * "\x25AE"+    ,"mcomma;" * "\x2A29"+    ,"Mcy;" * "\x041C"+    ,"mcy;" * "\x043C"+    ,"mdash;" * "\x2014"+    ,"mDDot;" * "\x223A"+    ,"measuredangle;" * "\x2221"+    ,"MediumSpace;" * "\x205F"+    ,"Mellintrf;" * "\x2133"+    ,"Mfr;" * "\x1D510"+    ,"mfr;" * "\x1D52A"+    ,"mho;" * "\x2127"+    ,"micro" * "\x00B5"+    ,"micro;" * "\x00B5"+    ,"mid;" * "\x2223"+    ,"midast;" * "\x002A"+    ,"midcir;" * "\x2AF0"+    ,"middot" * "\x00B7"+    ,"middot;" * "\x00B7"+    ,"minus;" * "\x2212"+    ,"minusb;" * "\x229F"+    ,"minusd;" * "\x2238"+    ,"minusdu;" * "\x2A2A"+    ,"MinusPlus;" * "\x2213"+    ,"mlcp;" * "\x2ADB"+    ,"mldr;" * "\x2026"+    ,"mnplus;" * "\x2213"+    ,"models;" * "\x22A7"+    ,"Mopf;" * "\x1D544"+    ,"mopf;" * "\x1D55E"+    ,"mp;" * "\x2213"+    ,"Mscr;" * "\x2133"+    ,"mscr;" * "\x1D4C2"+    ,"mstpos;" * "\x223E"+    ,"Mu;" * "\x039C"+    ,"mu;" * "\x03BC"+    ,"multimap;" * "\x22B8"+    ,"mumap;" * "\x22B8"+    ,"nabla;" * "\x2207"+    ,"Nacute;" * "\x0143"+    ,"nacute;" * "\x0144"+    ,"nang;" * "\x2220\x20D2"+    ,"nap;" * "\x2249"+    ,"napE;" * "\x2A70\x0338"+    ,"napid;" * "\x224B\x0338"+    ,"napos;" * "\x0149"+    ,"napprox;" * "\x2249"+    ,"natur;" * "\x266E"+    ,"natural;" * "\x266E"+    ,"naturals;" * "\x2115"+    ,"nbsp" * "\x00A0"+    ,"nbsp;" * "\x00A0"+    ,"nbump;" * "\x224E\x0338"+    ,"nbumpe;" * "\x224F\x0338"+    ,"ncap;" * "\x2A43"+    ,"Ncaron;" * "\x0147"+    ,"ncaron;" * "\x0148"+    ,"Ncedil;" * "\x0145"+    ,"ncedil;" * "\x0146"+    ,"ncong;" * "\x2247"+    ,"ncongdot;" * "\x2A6D\x0338"+    ,"ncup;" * "\x2A42"+    ,"Ncy;" * "\x041D"+    ,"ncy;" * "\x043D"+    ,"ndash;" * "\x2013"+    ,"ne;" * "\x2260"+    ,"nearhk;" * "\x2924"+    ,"nearr;" * "\x2197"+    ,"neArr;" * "\x21D7"+    ,"nearrow;" * "\x2197"+    ,"nedot;" * "\x2250\x0338"+    ,"NegativeMediumSpace;" * "\x200B"+    ,"NegativeThickSpace;" * "\x200B"+    ,"NegativeThinSpace;" * "\x200B"+    ,"NegativeVeryThinSpace;" * "\x200B"+    ,"nequiv;" * "\x2262"+    ,"nesear;" * "\x2928"+    ,"nesim;" * "\x2242\x0338"+    ,"NestedGreaterGreater;" * "\x226B"+    ,"NestedLessLess;" * "\x226A"+    ,"NewLine;" * "\x000A"+    ,"nexist;" * "\x2204"+    ,"nexists;" * "\x2204"+    ,"Nfr;" * "\x1D511"+    ,"nfr;" * "\x1D52B"+    ,"ngE;" * "\x2267\x0338"+    ,"nge;" * "\x2271"+    ,"ngeq;" * "\x2271"+    ,"ngeqq;" * "\x2267\x0338"+    ,"ngeqslant;" * "\x2A7E\x0338"+    ,"nges;" * "\x2A7E\x0338"+    ,"nGg;" * "\x22D9\x0338"+    ,"ngsim;" * "\x2275"+    ,"nGt;" * "\x226B\x20D2"+    ,"ngt;" * "\x226F"+    ,"ngtr;" * "\x226F"+    ,"nGtv;" * "\x226B\x0338"+    ,"nharr;" * "\x21AE"+    ,"nhArr;" * "\x21CE"+    ,"nhpar;" * "\x2AF2"+    ,"ni;" * "\x220B"+    ,"nis;" * "\x22FC"+    ,"nisd;" * "\x22FA"+    ,"niv;" * "\x220B"+    ,"NJcy;" * "\x040A"+    ,"njcy;" * "\x045A"+    ,"nlarr;" * "\x219A"+    ,"nlArr;" * "\x21CD"+    ,"nldr;" * "\x2025"+    ,"nlE;" * "\x2266\x0338"+    ,"nle;" * "\x2270"+    ,"nleftarrow;" * "\x219A"+    ,"nLeftarrow;" * "\x21CD"+    ,"nleftrightarrow;" * "\x21AE"+    ,"nLeftrightarrow;" * "\x21CE"+    ,"nleq;" * "\x2270"+    ,"nleqq;" * "\x2266\x0338"+    ,"nleqslant;" * "\x2A7D\x0338"+    ,"nles;" * "\x2A7D\x0338"+    ,"nless;" * "\x226E"+    ,"nLl;" * "\x22D8\x0338"+    ,"nlsim;" * "\x2274"+    ,"nLt;" * "\x226A\x20D2"+    ,"nlt;" * "\x226E"+    ,"nltri;" * "\x22EA"+    ,"nltrie;" * "\x22EC"+    ,"nLtv;" * "\x226A\x0338"+    ,"nmid;" * "\x2224"+    ,"NoBreak;" * "\x2060"+    ,"NonBreakingSpace;" * "\x00A0"+    ,"Nopf;" * "\x2115"+    ,"nopf;" * "\x1D55F"+    ,"not" * "\x00AC"+    ,"not;" * "\x00AC"+    ,"Not;" * "\x2AEC"+    ,"NotCongruent;" * "\x2262"+    ,"NotCupCap;" * "\x226D"+    ,"NotDoubleVerticalBar;" * "\x2226"+    ,"NotElement;" * "\x2209"+    ,"NotEqual;" * "\x2260"+    ,"NotEqualTilde;" * "\x2242\x0338"+    ,"NotExists;" * "\x2204"+    ,"NotGreater;" * "\x226F"+    ,"NotGreaterEqual;" * "\x2271"+    ,"NotGreaterFullEqual;" * "\x2267\x0338"+    ,"NotGreaterGreater;" * "\x226B\x0338"+    ,"NotGreaterLess;" * "\x2279"+    ,"NotGreaterSlantEqual;" * "\x2A7E\x0338"+    ,"NotGreaterTilde;" * "\x2275"+    ,"NotHumpDownHump;" * "\x224E\x0338"+    ,"NotHumpEqual;" * "\x224F\x0338"+    ,"notin;" * "\x2209"+    ,"notindot;" * "\x22F5\x0338"+    ,"notinE;" * "\x22F9\x0338"+    ,"notinva;" * "\x2209"+    ,"notinvb;" * "\x22F7"+    ,"notinvc;" * "\x22F6"+    ,"NotLeftTriangle;" * "\x22EA"+    ,"NotLeftTriangleBar;" * "\x29CF\x0338"+    ,"NotLeftTriangleEqual;" * "\x22EC"+    ,"NotLess;" * "\x226E"+    ,"NotLessEqual;" * "\x2270"+    ,"NotLessGreater;" * "\x2278"+    ,"NotLessLess;" * "\x226A\x0338"+    ,"NotLessSlantEqual;" * "\x2A7D\x0338"+    ,"NotLessTilde;" * "\x2274"+    ,"NotNestedGreaterGreater;" * "\x2AA2\x0338"+    ,"NotNestedLessLess;" * "\x2AA1\x0338"+    ,"notni;" * "\x220C"+    ,"notniva;" * "\x220C"+    ,"notnivb;" * "\x22FE"+    ,"notnivc;" * "\x22FD"+    ,"NotPrecedes;" * "\x2280"+    ,"NotPrecedesEqual;" * "\x2AAF\x0338"+    ,"NotPrecedesSlantEqual;" * "\x22E0"+    ,"NotReverseElement;" * "\x220C"+    ,"NotRightTriangle;" * "\x22EB"+    ,"NotRightTriangleBar;" * "\x29D0\x0338"+    ,"NotRightTriangleEqual;" * "\x22ED"+    ,"NotSquareSubset;" * "\x228F\x0338"+    ,"NotSquareSubsetEqual;" * "\x22E2"+    ,"NotSquareSuperset;" * "\x2290\x0338"+    ,"NotSquareSupersetEqual;" * "\x22E3"+    ,"NotSubset;" * "\x2282\x20D2"+    ,"NotSubsetEqual;" * "\x2288"+    ,"NotSucceeds;" * "\x2281"+    ,"NotSucceedsEqual;" * "\x2AB0\x0338"+    ,"NotSucceedsSlantEqual;" * "\x22E1"+    ,"NotSucceedsTilde;" * "\x227F\x0338"+    ,"NotSuperset;" * "\x2283\x20D2"+    ,"NotSupersetEqual;" * "\x2289"+    ,"NotTilde;" * "\x2241"+    ,"NotTildeEqual;" * "\x2244"+    ,"NotTildeFullEqual;" * "\x2247"+    ,"NotTildeTilde;" * "\x2249"+    ,"NotVerticalBar;" * "\x2224"+    ,"npar;" * "\x2226"+    ,"nparallel;" * "\x2226"+    ,"nparsl;" * "\x2AFD\x20E5"+    ,"npart;" * "\x2202\x0338"+    ,"npolint;" * "\x2A14"+    ,"npr;" * "\x2280"+    ,"nprcue;" * "\x22E0"+    ,"npre;" * "\x2AAF\x0338"+    ,"nprec;" * "\x2280"+    ,"npreceq;" * "\x2AAF\x0338"+    ,"nrarr;" * "\x219B"+    ,"nrArr;" * "\x21CF"+    ,"nrarrc;" * "\x2933\x0338"+    ,"nrarrw;" * "\x219D\x0338"+    ,"nrightarrow;" * "\x219B"+    ,"nRightarrow;" * "\x21CF"+    ,"nrtri;" * "\x22EB"+    ,"nrtrie;" * "\x22ED"+    ,"nsc;" * "\x2281"+    ,"nsccue;" * "\x22E1"+    ,"nsce;" * "\x2AB0\x0338"+    ,"Nscr;" * "\x1D4A9"+    ,"nscr;" * "\x1D4C3"+    ,"nshortmid;" * "\x2224"+    ,"nshortparallel;" * "\x2226"+    ,"nsim;" * "\x2241"+    ,"nsime;" * "\x2244"+    ,"nsimeq;" * "\x2244"+    ,"nsmid;" * "\x2224"+    ,"nspar;" * "\x2226"+    ,"nsqsube;" * "\x22E2"+    ,"nsqsupe;" * "\x22E3"+    ,"nsub;" * "\x2284"+    ,"nsube;" * "\x2288"+    ,"nsubE;" * "\x2AC5\x0338"+    ,"nsubset;" * "\x2282\x20D2"+    ,"nsubseteq;" * "\x2288"+    ,"nsubseteqq;" * "\x2AC5\x0338"+    ,"nsucc;" * "\x2281"+    ,"nsucceq;" * "\x2AB0\x0338"+    ,"nsup;" * "\x2285"+    ,"nsupe;" * "\x2289"+    ,"nsupE;" * "\x2AC6\x0338"+    ,"nsupset;" * "\x2283\x20D2"+    ,"nsupseteq;" * "\x2289"+    ,"nsupseteqq;" * "\x2AC6\x0338"+    ,"ntgl;" * "\x2279"+    ,"Ntilde" * "\x00D1"+    ,"ntilde" * "\x00F1"+    ,"Ntilde;" * "\x00D1"+    ,"ntilde;" * "\x00F1"+    ,"ntlg;" * "\x2278"+    ,"ntriangleleft;" * "\x22EA"+    ,"ntrianglelefteq;" * "\x22EC"+    ,"ntriangleright;" * "\x22EB"+    ,"ntrianglerighteq;" * "\x22ED"+    ,"Nu;" * "\x039D"+    ,"nu;" * "\x03BD"+    ,"num;" * "\x0023"+    ,"numero;" * "\x2116"+    ,"numsp;" * "\x2007"+    ,"nvap;" * "\x224D\x20D2"+    ,"nvdash;" * "\x22AC"+    ,"nvDash;" * "\x22AD"+    ,"nVdash;" * "\x22AE"+    ,"nVDash;" * "\x22AF"+    ,"nvge;" * "\x2265\x20D2"+    ,"nvgt;" * "\x003E\x20D2"+    ,"nvHarr;" * "\x2904"+    ,"nvinfin;" * "\x29DE"+    ,"nvlArr;" * "\x2902"+    ,"nvle;" * "\x2264\x20D2"+    ,"nvlt;" * "\x003C\x20D2"+    ,"nvltrie;" * "\x22B4\x20D2"+    ,"nvrArr;" * "\x2903"+    ,"nvrtrie;" * "\x22B5\x20D2"+    ,"nvsim;" * "\x223C\x20D2"+    ,"nwarhk;" * "\x2923"+    ,"nwarr;" * "\x2196"+    ,"nwArr;" * "\x21D6"+    ,"nwarrow;" * "\x2196"+    ,"nwnear;" * "\x2927"+    ,"Oacute" * "\x00D3"+    ,"oacute" * "\x00F3"+    ,"Oacute;" * "\x00D3"+    ,"oacute;" * "\x00F3"+    ,"oast;" * "\x229B"+    ,"ocir;" * "\x229A"+    ,"Ocirc" * "\x00D4"+    ,"ocirc" * "\x00F4"+    ,"Ocirc;" * "\x00D4"+    ,"ocirc;" * "\x00F4"+    ,"Ocy;" * "\x041E"+    ,"ocy;" * "\x043E"+    ,"odash;" * "\x229D"+    ,"Odblac;" * "\x0150"+    ,"odblac;" * "\x0151"+    ,"odiv;" * "\x2A38"+    ,"odot;" * "\x2299"+    ,"odsold;" * "\x29BC"+    ,"OElig;" * "\x0152"+    ,"oelig;" * "\x0153"+    ,"ofcir;" * "\x29BF"+    ,"Ofr;" * "\x1D512"+    ,"ofr;" * "\x1D52C"+    ,"ogon;" * "\x02DB"+    ,"Ograve" * "\x00D2"+    ,"ograve" * "\x00F2"+    ,"Ograve;" * "\x00D2"+    ,"ograve;" * "\x00F2"+    ,"ogt;" * "\x29C1"+    ,"ohbar;" * "\x29B5"+    ,"ohm;" * "\x03A9"+    ,"oint;" * "\x222E"+    ,"olarr;" * "\x21BA"+    ,"olcir;" * "\x29BE"+    ,"olcross;" * "\x29BB"+    ,"oline;" * "\x203E"+    ,"olt;" * "\x29C0"+    ,"Omacr;" * "\x014C"+    ,"omacr;" * "\x014D"+    ,"Omega;" * "\x03A9"+    ,"omega;" * "\x03C9"+    ,"Omicron;" * "\x039F"+    ,"omicron;" * "\x03BF"+    ,"omid;" * "\x29B6"+    ,"ominus;" * "\x2296"+    ,"Oopf;" * "\x1D546"+    ,"oopf;" * "\x1D560"+    ,"opar;" * "\x29B7"+    ,"OpenCurlyDoubleQuote;" * "\x201C"+    ,"OpenCurlyQuote;" * "\x2018"+    ,"operp;" * "\x29B9"+    ,"oplus;" * "\x2295"+    ,"or;" * "\x2228"+    ,"Or;" * "\x2A54"+    ,"orarr;" * "\x21BB"+    ,"ord;" * "\x2A5D"+    ,"order;" * "\x2134"+    ,"orderof;" * "\x2134"+    ,"ordf" * "\x00AA"+    ,"ordf;" * "\x00AA"+    ,"ordm" * "\x00BA"+    ,"ordm;" * "\x00BA"+    ,"origof;" * "\x22B6"+    ,"oror;" * "\x2A56"+    ,"orslope;" * "\x2A57"+    ,"orv;" * "\x2A5B"+    ,"oS;" * "\x24C8"+    ,"oscr;" * "\x2134"+    ,"Oscr;" * "\x1D4AA"+    ,"Oslash" * "\x00D8"+    ,"oslash" * "\x00F8"+    ,"Oslash;" * "\x00D8"+    ,"oslash;" * "\x00F8"+    ,"osol;" * "\x2298"+    ,"Otilde" * "\x00D5"+    ,"otilde" * "\x00F5"+    ,"Otilde;" * "\x00D5"+    ,"otilde;" * "\x00F5"+    ,"otimes;" * "\x2297"+    ,"Otimes;" * "\x2A37"+    ,"otimesas;" * "\x2A36"+    ,"Ouml" * "\x00D6"+    ,"ouml" * "\x00F6"+    ,"Ouml;" * "\x00D6"+    ,"ouml;" * "\x00F6"+    ,"ovbar;" * "\x233D"+    ,"OverBar;" * "\x203E"+    ,"OverBrace;" * "\x23DE"+    ,"OverBracket;" * "\x23B4"+    ,"OverParenthesis;" * "\x23DC"+    ,"par;" * "\x2225"+    ,"para" * "\x00B6"+    ,"para;" * "\x00B6"+    ,"parallel;" * "\x2225"+    ,"parsim;" * "\x2AF3"+    ,"parsl;" * "\x2AFD"+    ,"part;" * "\x2202"+    ,"PartialD;" * "\x2202"+    ,"Pcy;" * "\x041F"+    ,"pcy;" * "\x043F"+    ,"percnt;" * "\x0025"+    ,"period;" * "\x002E"+    ,"permil;" * "\x2030"+    ,"perp;" * "\x22A5"+    ,"pertenk;" * "\x2031"+    ,"Pfr;" * "\x1D513"+    ,"pfr;" * "\x1D52D"+    ,"Phi;" * "\x03A6"+    ,"phi;" * "\x03C6"+    ,"phiv;" * "\x03D5"+    ,"phmmat;" * "\x2133"+    ,"phone;" * "\x260E"+    ,"Pi;" * "\x03A0"+    ,"pi;" * "\x03C0"+    ,"pitchfork;" * "\x22D4"+    ,"piv;" * "\x03D6"+    ,"planck;" * "\x210F"+    ,"planckh;" * "\x210E"+    ,"plankv;" * "\x210F"+    ,"plus;" * "\x002B"+    ,"plusacir;" * "\x2A23"+    ,"plusb;" * "\x229E"+    ,"pluscir;" * "\x2A22"+    ,"plusdo;" * "\x2214"+    ,"plusdu;" * "\x2A25"+    ,"pluse;" * "\x2A72"+    ,"PlusMinus;" * "\x00B1"+    ,"plusmn" * "\x00B1"+    ,"plusmn;" * "\x00B1"+    ,"plussim;" * "\x2A26"+    ,"plustwo;" * "\x2A27"+    ,"pm;" * "\x00B1"+    ,"Poincareplane;" * "\x210C"+    ,"pointint;" * "\x2A15"+    ,"Popf;" * "\x2119"+    ,"popf;" * "\x1D561"+    ,"pound" * "\x00A3"+    ,"pound;" * "\x00A3"+    ,"pr;" * "\x227A"+    ,"Pr;" * "\x2ABB"+    ,"prap;" * "\x2AB7"+    ,"prcue;" * "\x227C"+    ,"pre;" * "\x2AAF"+    ,"prE;" * "\x2AB3"+    ,"prec;" * "\x227A"+    ,"precapprox;" * "\x2AB7"+    ,"preccurlyeq;" * "\x227C"+    ,"Precedes;" * "\x227A"+    ,"PrecedesEqual;" * "\x2AAF"+    ,"PrecedesSlantEqual;" * "\x227C"+    ,"PrecedesTilde;" * "\x227E"+    ,"preceq;" * "\x2AAF"+    ,"precnapprox;" * "\x2AB9"+    ,"precneqq;" * "\x2AB5"+    ,"precnsim;" * "\x22E8"+    ,"precsim;" * "\x227E"+    ,"prime;" * "\x2032"+    ,"Prime;" * "\x2033"+    ,"primes;" * "\x2119"+    ,"prnap;" * "\x2AB9"+    ,"prnE;" * "\x2AB5"+    ,"prnsim;" * "\x22E8"+    ,"prod;" * "\x220F"+    ,"Product;" * "\x220F"+    ,"profalar;" * "\x232E"+    ,"profline;" * "\x2312"+    ,"profsurf;" * "\x2313"+    ,"prop;" * "\x221D"+    ,"Proportion;" * "\x2237"+    ,"Proportional;" * "\x221D"+    ,"propto;" * "\x221D"+    ,"prsim;" * "\x227E"+    ,"prurel;" * "\x22B0"+    ,"Pscr;" * "\x1D4AB"+    ,"pscr;" * "\x1D4C5"+    ,"Psi;" * "\x03A8"+    ,"psi;" * "\x03C8"+    ,"puncsp;" * "\x2008"+    ,"Qfr;" * "\x1D514"+    ,"qfr;" * "\x1D52E"+    ,"qint;" * "\x2A0C"+    ,"Qopf;" * "\x211A"+    ,"qopf;" * "\x1D562"+    ,"qprime;" * "\x2057"+    ,"Qscr;" * "\x1D4AC"+    ,"qscr;" * "\x1D4C6"+    ,"quaternions;" * "\x210D"+    ,"quatint;" * "\x2A16"+    ,"quest;" * "\x003F"+    ,"questeq;" * "\x225F"+    ,"QUOT" * "\x0022"+    ,"quot" * "\x0022"+    ,"QUOT;" * "\x0022"+    ,"quot;" * "\x0022"+    ,"rAarr;" * "\x21DB"+    ,"race;" * "\x223D\x0331"+    ,"Racute;" * "\x0154"+    ,"racute;" * "\x0155"+    ,"radic;" * "\x221A"+    ,"raemptyv;" * "\x29B3"+    ,"rang;" * "\x27E9"+    ,"Rang;" * "\x27EB"+    ,"rangd;" * "\x2992"+    ,"range;" * "\x29A5"+    ,"rangle;" * "\x27E9"+    ,"raquo" * "\x00BB"+    ,"raquo;" * "\x00BB"+    ,"rarr;" * "\x2192"+    ,"Rarr;" * "\x21A0"+    ,"rArr;" * "\x21D2"+    ,"rarrap;" * "\x2975"+    ,"rarrb;" * "\x21E5"+    ,"rarrbfs;" * "\x2920"+    ,"rarrc;" * "\x2933"+    ,"rarrfs;" * "\x291E"+    ,"rarrhk;" * "\x21AA"+    ,"rarrlp;" * "\x21AC"+    ,"rarrpl;" * "\x2945"+    ,"rarrsim;" * "\x2974"+    ,"rarrtl;" * "\x21A3"+    ,"Rarrtl;" * "\x2916"+    ,"rarrw;" * "\x219D"+    ,"ratail;" * "\x291A"+    ,"rAtail;" * "\x291C"+    ,"ratio;" * "\x2236"+    ,"rationals;" * "\x211A"+    ,"rbarr;" * "\x290D"+    ,"rBarr;" * "\x290F"+    ,"RBarr;" * "\x2910"+    ,"rbbrk;" * "\x2773"+    ,"rbrace;" * "\x007D"+    ,"rbrack;" * "\x005D"+    ,"rbrke;" * "\x298C"+    ,"rbrksld;" * "\x298E"+    ,"rbrkslu;" * "\x2990"+    ,"Rcaron;" * "\x0158"+    ,"rcaron;" * "\x0159"+    ,"Rcedil;" * "\x0156"+    ,"rcedil;" * "\x0157"+    ,"rceil;" * "\x2309"+    ,"rcub;" * "\x007D"+    ,"Rcy;" * "\x0420"+    ,"rcy;" * "\x0440"+    ,"rdca;" * "\x2937"+    ,"rdldhar;" * "\x2969"+    ,"rdquo;" * "\x201D"+    ,"rdquor;" * "\x201D"+    ,"rdsh;" * "\x21B3"+    ,"Re;" * "\x211C"+    ,"real;" * "\x211C"+    ,"realine;" * "\x211B"+    ,"realpart;" * "\x211C"+    ,"reals;" * "\x211D"+    ,"rect;" * "\x25AD"+    ,"REG" * "\x00AE"+    ,"reg" * "\x00AE"+    ,"REG;" * "\x00AE"+    ,"reg;" * "\x00AE"+    ,"ReverseElement;" * "\x220B"+    ,"ReverseEquilibrium;" * "\x21CB"+    ,"ReverseUpEquilibrium;" * "\x296F"+    ,"rfisht;" * "\x297D"+    ,"rfloor;" * "\x230B"+    ,"Rfr;" * "\x211C"+    ,"rfr;" * "\x1D52F"+    ,"rHar;" * "\x2964"+    ,"rhard;" * "\x21C1"+    ,"rharu;" * "\x21C0"+    ,"rharul;" * "\x296C"+    ,"Rho;" * "\x03A1"+    ,"rho;" * "\x03C1"+    ,"rhov;" * "\x03F1"+    ,"RightAngleBracket;" * "\x27E9"+    ,"RightArrow;" * "\x2192"+    ,"rightarrow;" * "\x2192"+    ,"Rightarrow;" * "\x21D2"+    ,"RightArrowBar;" * "\x21E5"+    ,"RightArrowLeftArrow;" * "\x21C4"+    ,"rightarrowtail;" * "\x21A3"+    ,"RightCeiling;" * "\x2309"+    ,"RightDoubleBracket;" * "\x27E7"+    ,"RightDownTeeVector;" * "\x295D"+    ,"RightDownVector;" * "\x21C2"+    ,"RightDownVectorBar;" * "\x2955"+    ,"RightFloor;" * "\x230B"+    ,"rightharpoondown;" * "\x21C1"+    ,"rightharpoonup;" * "\x21C0"+    ,"rightleftarrows;" * "\x21C4"+    ,"rightleftharpoons;" * "\x21CC"+    ,"rightrightarrows;" * "\x21C9"+    ,"rightsquigarrow;" * "\x219D"+    ,"RightTee;" * "\x22A2"+    ,"RightTeeArrow;" * "\x21A6"+    ,"RightTeeVector;" * "\x295B"+    ,"rightthreetimes;" * "\x22CC"+    ,"RightTriangle;" * "\x22B3"+    ,"RightTriangleBar;" * "\x29D0"+    ,"RightTriangleEqual;" * "\x22B5"+    ,"RightUpDownVector;" * "\x294F"+    ,"RightUpTeeVector;" * "\x295C"+    ,"RightUpVector;" * "\x21BE"+    ,"RightUpVectorBar;" * "\x2954"+    ,"RightVector;" * "\x21C0"+    ,"RightVectorBar;" * "\x2953"+    ,"ring;" * "\x02DA"+    ,"risingdotseq;" * "\x2253"+    ,"rlarr;" * "\x21C4"+    ,"rlhar;" * "\x21CC"+    ,"rlm;" * "\x200F"+    ,"rmoust;" * "\x23B1"+    ,"rmoustache;" * "\x23B1"+    ,"rnmid;" * "\x2AEE"+    ,"roang;" * "\x27ED"+    ,"roarr;" * "\x21FE"+    ,"robrk;" * "\x27E7"+    ,"ropar;" * "\x2986"+    ,"Ropf;" * "\x211D"+    ,"ropf;" * "\x1D563"+    ,"roplus;" * "\x2A2E"+    ,"rotimes;" * "\x2A35"+    ,"RoundImplies;" * "\x2970"+    ,"rpar;" * "\x0029"+    ,"rpargt;" * "\x2994"+    ,"rppolint;" * "\x2A12"+    ,"rrarr;" * "\x21C9"+    ,"Rrightarrow;" * "\x21DB"+    ,"rsaquo;" * "\x203A"+    ,"Rscr;" * "\x211B"+    ,"rscr;" * "\x1D4C7"+    ,"Rsh;" * "\x21B1"+    ,"rsh;" * "\x21B1"+    ,"rsqb;" * "\x005D"+    ,"rsquo;" * "\x2019"+    ,"rsquor;" * "\x2019"+    ,"rthree;" * "\x22CC"+    ,"rtimes;" * "\x22CA"+    ,"rtri;" * "\x25B9"+    ,"rtrie;" * "\x22B5"+    ,"rtrif;" * "\x25B8"+    ,"rtriltri;" * "\x29CE"+    ,"RuleDelayed;" * "\x29F4"+    ,"ruluhar;" * "\x2968"+    ,"rx;" * "\x211E"+    ,"Sacute;" * "\x015A"+    ,"sacute;" * "\x015B"+    ,"sbquo;" * "\x201A"+    ,"sc;" * "\x227B"+    ,"Sc;" * "\x2ABC"+    ,"scap;" * "\x2AB8"+    ,"Scaron;" * "\x0160"+    ,"scaron;" * "\x0161"+    ,"sccue;" * "\x227D"+    ,"sce;" * "\x2AB0"+    ,"scE;" * "\x2AB4"+    ,"Scedil;" * "\x015E"+    ,"scedil;" * "\x015F"+    ,"Scirc;" * "\x015C"+    ,"scirc;" * "\x015D"+    ,"scnap;" * "\x2ABA"+    ,"scnE;" * "\x2AB6"+    ,"scnsim;" * "\x22E9"+    ,"scpolint;" * "\x2A13"+    ,"scsim;" * "\x227F"+    ,"Scy;" * "\x0421"+    ,"scy;" * "\x0441"+    ,"sdot;" * "\x22C5"+    ,"sdotb;" * "\x22A1"+    ,"sdote;" * "\x2A66"+    ,"searhk;" * "\x2925"+    ,"searr;" * "\x2198"+    ,"seArr;" * "\x21D8"+    ,"searrow;" * "\x2198"+    ,"sect" * "\x00A7"+    ,"sect;" * "\x00A7"+    ,"semi;" * "\x003B"+    ,"seswar;" * "\x2929"+    ,"setminus;" * "\x2216"+    ,"setmn;" * "\x2216"+    ,"sext;" * "\x2736"+    ,"Sfr;" * "\x1D516"+    ,"sfr;" * "\x1D530"+    ,"sfrown;" * "\x2322"+    ,"sharp;" * "\x266F"+    ,"SHCHcy;" * "\x0429"+    ,"shchcy;" * "\x0449"+    ,"SHcy;" * "\x0428"+    ,"shcy;" * "\x0448"+    ,"ShortDownArrow;" * "\x2193"+    ,"ShortLeftArrow;" * "\x2190"+    ,"shortmid;" * "\x2223"+    ,"shortparallel;" * "\x2225"+    ,"ShortRightArrow;" * "\x2192"+    ,"ShortUpArrow;" * "\x2191"+    ,"shy" * "\x00AD"+    ,"shy;" * "\x00AD"+    ,"Sigma;" * "\x03A3"+    ,"sigma;" * "\x03C3"+    ,"sigmaf;" * "\x03C2"+    ,"sigmav;" * "\x03C2"+    ,"sim;" * "\x223C"+    ,"simdot;" * "\x2A6A"+    ,"sime;" * "\x2243"+    ,"simeq;" * "\x2243"+    ,"simg;" * "\x2A9E"+    ,"simgE;" * "\x2AA0"+    ,"siml;" * "\x2A9D"+    ,"simlE;" * "\x2A9F"+    ,"simne;" * "\x2246"+    ,"simplus;" * "\x2A24"+    ,"simrarr;" * "\x2972"+    ,"slarr;" * "\x2190"+    ,"SmallCircle;" * "\x2218"+    ,"smallsetminus;" * "\x2216"+    ,"smashp;" * "\x2A33"+    ,"smeparsl;" * "\x29E4"+    ,"smid;" * "\x2223"+    ,"smile;" * "\x2323"+    ,"smt;" * "\x2AAA"+    ,"smte;" * "\x2AAC"+    ,"smtes;" * "\x2AAC\xFE00"+    ,"SOFTcy;" * "\x042C"+    ,"softcy;" * "\x044C"+    ,"sol;" * "\x002F"+    ,"solb;" * "\x29C4"+    ,"solbar;" * "\x233F"+    ,"Sopf;" * "\x1D54A"+    ,"sopf;" * "\x1D564"+    ,"spades;" * "\x2660"+    ,"spadesuit;" * "\x2660"+    ,"spar;" * "\x2225"+    ,"sqcap;" * "\x2293"+    ,"sqcaps;" * "\x2293\xFE00"+    ,"sqcup;" * "\x2294"+    ,"sqcups;" * "\x2294\xFE00"+    ,"Sqrt;" * "\x221A"+    ,"sqsub;" * "\x228F"+    ,"sqsube;" * "\x2291"+    ,"sqsubset;" * "\x228F"+    ,"sqsubseteq;" * "\x2291"+    ,"sqsup;" * "\x2290"+    ,"sqsupe;" * "\x2292"+    ,"sqsupset;" * "\x2290"+    ,"sqsupseteq;" * "\x2292"+    ,"squ;" * "\x25A1"+    ,"Square;" * "\x25A1"+    ,"square;" * "\x25A1"+    ,"SquareIntersection;" * "\x2293"+    ,"SquareSubset;" * "\x228F"+    ,"SquareSubsetEqual;" * "\x2291"+    ,"SquareSuperset;" * "\x2290"+    ,"SquareSupersetEqual;" * "\x2292"+    ,"SquareUnion;" * "\x2294"+    ,"squarf;" * "\x25AA"+    ,"squf;" * "\x25AA"+    ,"srarr;" * "\x2192"+    ,"Sscr;" * "\x1D4AE"+    ,"sscr;" * "\x1D4C8"+    ,"ssetmn;" * "\x2216"+    ,"ssmile;" * "\x2323"+    ,"sstarf;" * "\x22C6"+    ,"Star;" * "\x22C6"+    ,"star;" * "\x2606"+    ,"starf;" * "\x2605"+    ,"straightepsilon;" * "\x03F5"+    ,"straightphi;" * "\x03D5"+    ,"strns;" * "\x00AF"+    ,"sub;" * "\x2282"+    ,"Sub;" * "\x22D0"+    ,"subdot;" * "\x2ABD"+    ,"sube;" * "\x2286"+    ,"subE;" * "\x2AC5"+    ,"subedot;" * "\x2AC3"+    ,"submult;" * "\x2AC1"+    ,"subne;" * "\x228A"+    ,"subnE;" * "\x2ACB"+    ,"subplus;" * "\x2ABF"+    ,"subrarr;" * "\x2979"+    ,"subset;" * "\x2282"+    ,"Subset;" * "\x22D0"+    ,"subseteq;" * "\x2286"+    ,"subseteqq;" * "\x2AC5"+    ,"SubsetEqual;" * "\x2286"+    ,"subsetneq;" * "\x228A"+    ,"subsetneqq;" * "\x2ACB"+    ,"subsim;" * "\x2AC7"+    ,"subsub;" * "\x2AD5"+    ,"subsup;" * "\x2AD3"+    ,"succ;" * "\x227B"+    ,"succapprox;" * "\x2AB8"+    ,"succcurlyeq;" * "\x227D"+    ,"Succeeds;" * "\x227B"+    ,"SucceedsEqual;" * "\x2AB0"+    ,"SucceedsSlantEqual;" * "\x227D"+    ,"SucceedsTilde;" * "\x227F"+    ,"succeq;" * "\x2AB0"+    ,"succnapprox;" * "\x2ABA"+    ,"succneqq;" * "\x2AB6"+    ,"succnsim;" * "\x22E9"+    ,"succsim;" * "\x227F"+    ,"SuchThat;" * "\x220B"+    ,"Sum;" * "\x2211"+    ,"sum;" * "\x2211"+    ,"sung;" * "\x266A"+    ,"sup1" * "\x00B9"+    ,"sup1;" * "\x00B9"+    ,"sup2" * "\x00B2"+    ,"sup2;" * "\x00B2"+    ,"sup3" * "\x00B3"+    ,"sup3;" * "\x00B3"+    ,"sup;" * "\x2283"+    ,"Sup;" * "\x22D1"+    ,"supdot;" * "\x2ABE"+    ,"supdsub;" * "\x2AD8"+    ,"supe;" * "\x2287"+    ,"supE;" * "\x2AC6"+    ,"supedot;" * "\x2AC4"+    ,"Superset;" * "\x2283"+    ,"SupersetEqual;" * "\x2287"+    ,"suphsol;" * "\x27C9"+    ,"suphsub;" * "\x2AD7"+    ,"suplarr;" * "\x297B"+    ,"supmult;" * "\x2AC2"+    ,"supne;" * "\x228B"+    ,"supnE;" * "\x2ACC"+    ,"supplus;" * "\x2AC0"+    ,"supset;" * "\x2283"+    ,"Supset;" * "\x22D1"+    ,"supseteq;" * "\x2287"+    ,"supseteqq;" * "\x2AC6"+    ,"supsetneq;" * "\x228B"+    ,"supsetneqq;" * "\x2ACC"+    ,"supsim;" * "\x2AC8"+    ,"supsub;" * "\x2AD4"+    ,"supsup;" * "\x2AD6"+    ,"swarhk;" * "\x2926"+    ,"swarr;" * "\x2199"+    ,"swArr;" * "\x21D9"+    ,"swarrow;" * "\x2199"+    ,"swnwar;" * "\x292A"+    ,"szlig" * "\x00DF"+    ,"szlig;" * "\x00DF"+    ,"Tab;" * "\x0009"+    ,"target;" * "\x2316"+    ,"Tau;" * "\x03A4"+    ,"tau;" * "\x03C4"+    ,"tbrk;" * "\x23B4"+    ,"Tcaron;" * "\x0164"+    ,"tcaron;" * "\x0165"+    ,"Tcedil;" * "\x0162"+    ,"tcedil;" * "\x0163"+    ,"Tcy;" * "\x0422"+    ,"tcy;" * "\x0442"+    ,"tdot;" * "\x20DB"+    ,"telrec;" * "\x2315"+    ,"Tfr;" * "\x1D517"+    ,"tfr;" * "\x1D531"+    ,"there4;" * "\x2234"+    ,"Therefore;" * "\x2234"+    ,"therefore;" * "\x2234"+    ,"Theta;" * "\x0398"+    ,"theta;" * "\x03B8"+    ,"thetasym;" * "\x03D1"+    ,"thetav;" * "\x03D1"+    ,"thickapprox;" * "\x2248"+    ,"thicksim;" * "\x223C"+    ,"ThickSpace;" * "\x205F\x200A"+    ,"thinsp;" * "\x2009"+    ,"ThinSpace;" * "\x2009"+    ,"thkap;" * "\x2248"+    ,"thksim;" * "\x223C"+    ,"THORN" * "\x00DE"+    ,"thorn" * "\x00FE"+    ,"THORN;" * "\x00DE"+    ,"thorn;" * "\x00FE"+    ,"tilde;" * "\x02DC"+    ,"Tilde;" * "\x223C"+    ,"TildeEqual;" * "\x2243"+    ,"TildeFullEqual;" * "\x2245"+    ,"TildeTilde;" * "\x2248"+    ,"times" * "\x00D7"+    ,"times;" * "\x00D7"+    ,"timesb;" * "\x22A0"+    ,"timesbar;" * "\x2A31"+    ,"timesd;" * "\x2A30"+    ,"tint;" * "\x222D"+    ,"toea;" * "\x2928"+    ,"top;" * "\x22A4"+    ,"topbot;" * "\x2336"+    ,"topcir;" * "\x2AF1"+    ,"Topf;" * "\x1D54B"+    ,"topf;" * "\x1D565"+    ,"topfork;" * "\x2ADA"+    ,"tosa;" * "\x2929"+    ,"tprime;" * "\x2034"+    ,"TRADE;" * "\x2122"+    ,"trade;" * "\x2122"+    ,"triangle;" * "\x25B5"+    ,"triangledown;" * "\x25BF"+    ,"triangleleft;" * "\x25C3"+    ,"trianglelefteq;" * "\x22B4"+    ,"triangleq;" * "\x225C"+    ,"triangleright;" * "\x25B9"+    ,"trianglerighteq;" * "\x22B5"+    ,"tridot;" * "\x25EC"+    ,"trie;" * "\x225C"+    ,"triminus;" * "\x2A3A"+    ,"TripleDot;" * "\x20DB"+    ,"triplus;" * "\x2A39"+    ,"trisb;" * "\x29CD"+    ,"tritime;" * "\x2A3B"+    ,"trpezium;" * "\x23E2"+    ,"Tscr;" * "\x1D4AF"+    ,"tscr;" * "\x1D4C9"+    ,"TScy;" * "\x0426"+    ,"tscy;" * "\x0446"+    ,"TSHcy;" * "\x040B"+    ,"tshcy;" * "\x045B"+    ,"Tstrok;" * "\x0166"+    ,"tstrok;" * "\x0167"+    ,"twixt;" * "\x226C"+    ,"twoheadleftarrow;" * "\x219E"+    ,"twoheadrightarrow;" * "\x21A0"+    ,"Uacute" * "\x00DA"+    ,"uacute" * "\x00FA"+    ,"Uacute;" * "\x00DA"+    ,"uacute;" * "\x00FA"+    ,"uarr;" * "\x2191"+    ,"Uarr;" * "\x219F"+    ,"uArr;" * "\x21D1"+    ,"Uarrocir;" * "\x2949"+    ,"Ubrcy;" * "\x040E"+    ,"ubrcy;" * "\x045E"+    ,"Ubreve;" * "\x016C"+    ,"ubreve;" * "\x016D"+    ,"Ucirc" * "\x00DB"+    ,"ucirc" * "\x00FB"+    ,"Ucirc;" * "\x00DB"+    ,"ucirc;" * "\x00FB"+    ,"Ucy;" * "\x0423"+    ,"ucy;" * "\x0443"+    ,"udarr;" * "\x21C5"+    ,"Udblac;" * "\x0170"+    ,"udblac;" * "\x0171"+    ,"udhar;" * "\x296E"+    ,"ufisht;" * "\x297E"+    ,"Ufr;" * "\x1D518"+    ,"ufr;" * "\x1D532"+    ,"Ugrave" * "\x00D9"+    ,"ugrave" * "\x00F9"+    ,"Ugrave;" * "\x00D9"+    ,"ugrave;" * "\x00F9"+    ,"uHar;" * "\x2963"+    ,"uharl;" * "\x21BF"+    ,"uharr;" * "\x21BE"+    ,"uhblk;" * "\x2580"+    ,"ulcorn;" * "\x231C"+    ,"ulcorner;" * "\x231C"+    ,"ulcrop;" * "\x230F"+    ,"ultri;" * "\x25F8"+    ,"Umacr;" * "\x016A"+    ,"umacr;" * "\x016B"+    ,"uml" * "\x00A8"+    ,"uml;" * "\x00A8"+    ,"UnderBar;" * "\x005F"+    ,"UnderBrace;" * "\x23DF"+    ,"UnderBracket;" * "\x23B5"+    ,"UnderParenthesis;" * "\x23DD"+    ,"Union;" * "\x22C3"+    ,"UnionPlus;" * "\x228E"+    ,"Uogon;" * "\x0172"+    ,"uogon;" * "\x0173"+    ,"Uopf;" * "\x1D54C"+    ,"uopf;" * "\x1D566"+    ,"UpArrow;" * "\x2191"+    ,"uparrow;" * "\x2191"+    ,"Uparrow;" * "\x21D1"+    ,"UpArrowBar;" * "\x2912"+    ,"UpArrowDownArrow;" * "\x21C5"+    ,"UpDownArrow;" * "\x2195"+    ,"updownarrow;" * "\x2195"+    ,"Updownarrow;" * "\x21D5"+    ,"UpEquilibrium;" * "\x296E"+    ,"upharpoonleft;" * "\x21BF"+    ,"upharpoonright;" * "\x21BE"+    ,"uplus;" * "\x228E"+    ,"UpperLeftArrow;" * "\x2196"+    ,"UpperRightArrow;" * "\x2197"+    ,"upsi;" * "\x03C5"+    ,"Upsi;" * "\x03D2"+    ,"upsih;" * "\x03D2"+    ,"Upsilon;" * "\x03A5"+    ,"upsilon;" * "\x03C5"+    ,"UpTee;" * "\x22A5"+    ,"UpTeeArrow;" * "\x21A5"+    ,"upuparrows;" * "\x21C8"+    ,"urcorn;" * "\x231D"+    ,"urcorner;" * "\x231D"+    ,"urcrop;" * "\x230E"+    ,"Uring;" * "\x016E"+    ,"uring;" * "\x016F"+    ,"urtri;" * "\x25F9"+    ,"Uscr;" * "\x1D4B0"+    ,"uscr;" * "\x1D4CA"+    ,"utdot;" * "\x22F0"+    ,"Utilde;" * "\x0168"+    ,"utilde;" * "\x0169"+    ,"utri;" * "\x25B5"+    ,"utrif;" * "\x25B4"+    ,"uuarr;" * "\x21C8"+    ,"Uuml" * "\x00DC"+    ,"uuml" * "\x00FC"+    ,"Uuml;" * "\x00DC"+    ,"uuml;" * "\x00FC"+    ,"uwangle;" * "\x29A7"+    ,"vangrt;" * "\x299C"+    ,"varepsilon;" * "\x03F5"+    ,"varkappa;" * "\x03F0"+    ,"varnothing;" * "\x2205"+    ,"varphi;" * "\x03D5"+    ,"varpi;" * "\x03D6"+    ,"varpropto;" * "\x221D"+    ,"varr;" * "\x2195"+    ,"vArr;" * "\x21D5"+    ,"varrho;" * "\x03F1"+    ,"varsigma;" * "\x03C2"+    ,"varsubsetneq;" * "\x228A\xFE00"+    ,"varsubsetneqq;" * "\x2ACB\xFE00"+    ,"varsupsetneq;" * "\x228B\xFE00"+    ,"varsupsetneqq;" * "\x2ACC\xFE00"+    ,"vartheta;" * "\x03D1"+    ,"vartriangleleft;" * "\x22B2"+    ,"vartriangleright;" * "\x22B3"+    ,"vBar;" * "\x2AE8"+    ,"Vbar;" * "\x2AEB"+    ,"vBarv;" * "\x2AE9"+    ,"Vcy;" * "\x0412"+    ,"vcy;" * "\x0432"+    ,"vdash;" * "\x22A2"+    ,"vDash;" * "\x22A8"+    ,"Vdash;" * "\x22A9"+    ,"VDash;" * "\x22AB"+    ,"Vdashl;" * "\x2AE6"+    ,"vee;" * "\x2228"+    ,"Vee;" * "\x22C1"+    ,"veebar;" * "\x22BB"+    ,"veeeq;" * "\x225A"+    ,"vellip;" * "\x22EE"+    ,"verbar;" * "\x007C"+    ,"Verbar;" * "\x2016"+    ,"vert;" * "\x007C"+    ,"Vert;" * "\x2016"+    ,"VerticalBar;" * "\x2223"+    ,"VerticalLine;" * "\x007C"+    ,"VerticalSeparator;" * "\x2758"+    ,"VerticalTilde;" * "\x2240"+    ,"VeryThinSpace;" * "\x200A"+    ,"Vfr;" * "\x1D519"+    ,"vfr;" * "\x1D533"+    ,"vltri;" * "\x22B2"+    ,"vnsub;" * "\x2282\x20D2"+    ,"vnsup;" * "\x2283\x20D2"+    ,"Vopf;" * "\x1D54D"+    ,"vopf;" * "\x1D567"+    ,"vprop;" * "\x221D"+    ,"vrtri;" * "\x22B3"+    ,"Vscr;" * "\x1D4B1"+    ,"vscr;" * "\x1D4CB"+    ,"vsubne;" * "\x228A\xFE00"+    ,"vsubnE;" * "\x2ACB\xFE00"+    ,"vsupne;" * "\x228B\xFE00"+    ,"vsupnE;" * "\x2ACC\xFE00"+    ,"Vvdash;" * "\x22AA"+    ,"vzigzag;" * "\x299A"+    ,"Wcirc;" * "\x0174"+    ,"wcirc;" * "\x0175"+    ,"wedbar;" * "\x2A5F"+    ,"wedge;" * "\x2227"+    ,"Wedge;" * "\x22C0"+    ,"wedgeq;" * "\x2259"+    ,"weierp;" * "\x2118"+    ,"Wfr;" * "\x1D51A"+    ,"wfr;" * "\x1D534"+    ,"Wopf;" * "\x1D54E"+    ,"wopf;" * "\x1D568"+    ,"wp;" * "\x2118"+    ,"wr;" * "\x2240"+    ,"wreath;" * "\x2240"+    ,"Wscr;" * "\x1D4B2"+    ,"wscr;" * "\x1D4CC"+    ,"xcap;" * "\x22C2"+    ,"xcirc;" * "\x25EF"+    ,"xcup;" * "\x22C3"+    ,"xdtri;" * "\x25BD"+    ,"Xfr;" * "\x1D51B"+    ,"xfr;" * "\x1D535"+    ,"xharr;" * "\x27F7"+    ,"xhArr;" * "\x27FA"+    ,"Xi;" * "\x039E"+    ,"xi;" * "\x03BE"+    ,"xlarr;" * "\x27F5"+    ,"xlArr;" * "\x27F8"+    ,"xmap;" * "\x27FC"+    ,"xnis;" * "\x22FB"+    ,"xodot;" * "\x2A00"+    ,"Xopf;" * "\x1D54F"+    ,"xopf;" * "\x1D569"+    ,"xoplus;" * "\x2A01"+    ,"xotime;" * "\x2A02"+    ,"xrarr;" * "\x27F6"+    ,"xrArr;" * "\x27F9"+    ,"Xscr;" * "\x1D4B3"+    ,"xscr;" * "\x1D4CD"+    ,"xsqcup;" * "\x2A06"+    ,"xuplus;" * "\x2A04"+    ,"xutri;" * "\x25B3"+    ,"xvee;" * "\x22C1"+    ,"xwedge;" * "\x22C0"+    ,"Yacute" * "\x00DD"+    ,"yacute" * "\x00FD"+    ,"Yacute;" * "\x00DD"+    ,"yacute;" * "\x00FD"+    ,"YAcy;" * "\x042F"+    ,"yacy;" * "\x044F"+    ,"Ycirc;" * "\x0176"+    ,"ycirc;" * "\x0177"+    ,"Ycy;" * "\x042B"+    ,"ycy;" * "\x044B"+    ,"yen" * "\x00A5"+    ,"yen;" * "\x00A5"+    ,"Yfr;" * "\x1D51C"+    ,"yfr;" * "\x1D536"+    ,"YIcy;" * "\x0407"+    ,"yicy;" * "\x0457"+    ,"Yopf;" * "\x1D550"+    ,"yopf;" * "\x1D56A"+    ,"Yscr;" * "\x1D4B4"+    ,"yscr;" * "\x1D4CE"+    ,"YUcy;" * "\x042E"+    ,"yucy;" * "\x044E"+    ,"yuml" * "\x00FF"+    ,"yuml;" * "\x00FF"+    ,"Yuml;" * "\x0178"+    ,"Zacute;" * "\x0179"+    ,"zacute;" * "\x017A"+    ,"Zcaron;" * "\x017D"+    ,"zcaron;" * "\x017E"+    ,"Zcy;" * "\x0417"+    ,"zcy;" * "\x0437"+    ,"Zdot;" * "\x017B"+    ,"zdot;" * "\x017C"+    ,"zeetrf;" * "\x2128"+    ,"ZeroWidthSpace;" * "\x200B"+    ,"Zeta;" * "\x0396"+    ,"zeta;" * "\x03B6"+    ,"Zfr;" * "\x2128"+    ,"zfr;" * "\x1D537"+    ,"ZHcy;" * "\x0416"+    ,"zhcy;" * "\x0436"+    ,"zigrarr;" * "\x21DD"+    ,"Zopf;" * "\x2124"+    ,"zopf;" * "\x1D56B"+    ,"Zscr;" * "\x1D4B5"+    ,"zscr;" * "\x1D4CF"+    ,"zwj;" * "\x200D"+    ,"zwnj;" * "\x200C"+    ]
+ app/Main.hs view
@@ -0,0 +1,28 @@+{-# LANGUAGE OverloadedStrings #-}+module Main where++import Text.HTML.TagSoup as Soup+import Text.HTML.TagStew as Stew+import qualified Data.ByteString as B+import qualified Data.ByteString.Builder as BB+import qualified Data.ByteString.UTF8 as BU+import System.Environment (getArgs)+import Control.Monad+import Text.Show.Unicode+import System.IO (stdout)++fromTag :: Tag B.ByteString -> BB.Builder+fromTag = go where+  f = BB.byteString+  go (TagOpen t xs) = "\ESC[34m<" <> f t+    <> foldMap (\(k, v) -> " " <> f k <> "=" <> f v) xs+    <> ">\ESC[0m"+  go (TagClose t) = "\ESC[34m</" <> f t <> ">\ESC[0m"+  go (TagText t) = f t+  go (TagComment t) = "<!--" <> f t <> "-->"+{-# INLINE fromTag #-}++main :: IO ()+main = getArgs >>= \paths -> forM_ paths $ \path -> do+  bs <- B.readFile path+  BB.hPutBuilder stdout $ foldMap ((<>"\n") . fromTag) $ Soup.parseTags bs
+ tagstew.cabal view
@@ -0,0 +1,39 @@+cabal-version:       2.4+-- Initial package description 'tagstew.cabal' generated by 'cabal init'.+-- For further documentation, see http://haskell.org/cabal/users-guide/++name:                tagstew+version:             0+synopsis:            Black magic tagsoup+description:         Fast alternative HTML decoder for tagsoup+bug-reports:         https://github.com/fumieval/tagstew+license:             BSD-3-Clause+license-file:        LICENSE+author:              Fumiaki Kinoshita+maintainer:          fumiexcel@gmail.com+copyright:           Copyright (c) 2020 Fumiaki Kinoshita+category:            Text+extra-source-files:  CHANGELOG.md, README.md++library+  exposed-modules:     Text.HTML.TagStew, Text.HTML.TagStew.Entity+  ghc-options: -Wall -O2+  build-depends:       base == 4.*, bytestring, compact, unordered-containers+    , tagsoup, text+  default-language:    Haskell2010++executable tagstew+  main-is:             Main.hs+  -- other-modules:+  -- other-extensions:+  build-depends:       base == 4.*, bytestring+    , tagstew+    , tagsoup+    , utf8-string+    , unicode-show+  hs-source-dirs: app+  default-language:    Haskell2010++source-repository head+  type: git+  location: https://github.com/fumieval/tagstew