diff --git a/.travis.yml b/.travis.yml index 2fc34a29..66df9d6e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -15,6 +15,10 @@ matrix: - env: BUILD=hlint language: generic compiler: hlint + - env: BUILD=weeder + language: generic + addons: { apt: { packages: [ libgmp-dev ] } } + compiler: weeder - env: BUILD=stack RESOLVER=ghc-8.0 language: generic addons: { apt: { packages: [ libgmp-dev ] } } @@ -31,6 +35,10 @@ matrix: language: generic addons: { apt: { packages: [ libgmp-dev ] } } compiler: ghc-7.10 + - env: BUILD=stack RESOLVER=ghc-7.8 HADDOCK="--no-haddock" + language: generic + addons: { apt: { packages: [ libgmp-dev ] } } + compiler: ghc-7.8 - env: BUILD=stack RESOLVER=ghc-8.0 os: osx language: generic @@ -45,6 +53,10 @@ matrix: language: generic addons: { apt: { packages: [ libgmp-dev ] } } compiler: ghc-8.0 + - env: BUILD=weeder + language: generic + addons: { apt: { packages: [ libgmp-dev ] } } + compiler: weeder - env: BUILD=hlint language: generic compiler: hlint @@ -54,7 +66,7 @@ install: - mkdir -p ~/.local/bin - | case "$BUILD" in - stack) + stack|weeder) if [ `uname` = "Darwin" ] then travis_retry curl --insecure -L https://www.stackage.org/stack/osx-x86_64 | tar xz --strip-components=1 --include '*/stack' -C ~/.local/bin @@ -77,7 +89,7 @@ script: --flag foundation:bounds-check ${EXPERIMENTAL} \ --install-ghc \ --coverage --bench --no-run-benchmarks \ - --haddock --no-haddock-deps + ${HADDOCK---haddock --no-haddock-deps} ;; cabal) cabal install --only-dependencies --enable-tests @@ -88,6 +100,12 @@ script: hlint) curl -sL https://raw.github.com/ndmitchell/hlint/master/misc/travis.sh | sh -s . --cpp-define=__GLASGOW_HASKELL__=800 --cpp-define=x86_64_HOST_ARCH=1 --cpp-define=mingw32_HOST_OS=1 ;; + weeder) + stack --no-terminal build \ + --flag foundation:bounds-check ${EXPERIMENTAL} \ + --install-ghc + curl -sL https://raw.github.com/ndmitchell/weeder/master/misc/travis.sh | sh -s . + ;; esac set +ex diff --git a/.weeder.yaml b/.weeder.yaml new file mode 100644 index 00000000..1f6afcd9 --- /dev/null +++ b/.weeder.yaml @@ -0,0 +1,202 @@ +- package: + - name: foundation + - section: + - name: bench:bench + - message: + - name: Module not compiled + - module: + - BenchUtil.Common + - BenchUtil.RefData + - Fake.ByteString + - Fake.Text + - Fake.Vector + - Main.hs + - Sys + - message: + - name: Redundant build-depends entry + - depends: + - attoparsec + - base + - basement + - bytestring + - foundation + - gauge + - text + - vector + - section: + - name: library + - message: + - name: Excessive other-modules entry + - module: + - Foundation.System.Bindings.Hs + - Foundation.System.Bindings.Network + - message: + - name: Module not compiled + - module: + - Foundation.Foreign.MemoryMap.Windows + - Foundation.Network.HostName + - Foundation.System.Bindings.Macos + - Foundation.System.Bindings.Windows + - Foundation.System.Entropy.Windows + - message: + - name: Weeds exported + - module: + - name: Foundation.Array.Bitmap + - identifier: + - append + - concat + - cons + - empty + - index + - read + - snoc + - unsafeIndex + - unsafeRead + - unsafeWrite + - write + - module: + - name: Foundation.Check.Print + - identifier: diffBlame + - module: + - name: Foundation.Check.Property + - identifier: checkHasSucceed + - module: + - name: Foundation.Collection.Mappable + - identifier: sequence_ + - module: + - name: Foundation.Conduit.Internal + - identifier: + - Await + - Done + - Leftover + - Pipe + - PipeM + - Yield + - liftResourceT + - runResourceT + - module: + - name: Foundation.Foreign.MemoryMap.Posix + - identifier: + - MemoryAdvice + - MemoryAdviceDontNeed + - MemoryAdviceNormal + - MemoryAdviceRandom + - MemoryAdviceSequential + - MemoryAdviceWillNeed + - MemoryMapFlag + - MemoryMapPrivate + - MemoryMapShared + - MemoryProtection + - MemoryProtectionExecute + - MemoryProtectionNone + - MemoryProtectionRead + - MemoryProtectionWrite + - MemorySyncAsync + - MemorySyncFlag + - MemorySyncInvalidate + - MemorySyncSync + - memoryAdvise + - memoryLock + - memoryMap + - memoryProtect + - memorySync + - memoryUnlock + - memoryUnmap + - sysconfPageSize + - module: + - name: Foundation.Hashing.FNV + - identifier: + - FNV1Hash32 + - FNV1Hash64 + - module: + - name: Foundation.Hashing.Hasher + - identifier: hashNew + - module: + - name: Foundation.IO.File + - identifier: + - hGetNonBlocking + - hGetSome + - module: + - name: Foundation.Monad.Identity + - identifier: IdentityT + - module: + - name: Foundation.Partial + - identifier: + - fromJust + - fromLeft + - fromRight + - head + - partialError + - module: + - name: Foundation.Random.ChaChaDRG + - identifier: keySize + - module: + - name: Foundation.Random.XorShift + - identifier: + - next + - nextDouble + - nextList + - module: + - name: Foundation.System.Bindings.Hs + - identifier: sysHsCoreGetErrno + - module: + - name: Foundation.System.Bindings.Network + - identifier: + - getHErrno + - herr_HostNotFound + - herr_NoData + - herr_NoRecovery + - herr_TryAgain + - module: + - name: Foundation.System.Bindings.Time + - identifier: + - CTimeVal + - CTimeZone + - size_CTimeT + - size_CTimeVal + - size_CTimeZone + - sysTimeClockGetRes + - sysTimeGetTimeOfDay + - sysTime_CLOCK_BOOTTIME + - sysTime_CLOCK_BOOTTIME_ALARM + - sysTime_CLOCK_MONOTONIC_RAW + - sysTime_CLOCK_PROCESS_CPUTIME_ID + - sysTime_CLOCK_REALTIME + - sysTime_CLOCK_REALTIME_ALARM + - sysTime_CLOCK_REALTIME_COARSE + - sysTime_CLOCK_TAI + - sysTime_CLOCK_THREAD_CPUTIME_ID + - section: + - name: test:check-foundation + - message: + - name: Weeds exported + - module: + - name: Test.Checks.Property.Collection + - identifier: + - testCollectionProperties + - testEqualityProperties + - testIsListPropertyies + - testMonoidProperties + - testOrderingProperties + - testSequentialProperties + - toListP + - module: + - name: Test.Data.List + - identifier: + - generateListOfElement + - generateListOfElementMaxN + - generateNonEmptyListOfElement + - module: + - name: Test.Foundation.Number + - identifier: testNumber + - section: + - name: test:doctest + - message: + - name: Module not compiled + - module: DocTest.hs + - message: + - name: Redundant build-depends entry + - depends: + - base + - doctest + diff --git a/CHANGELOG.md b/CHANGELOG.md index 522c8ea4..de51da1f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +## 0.0.19 + +* Add Block, UArray, String Builder +* Improve concat for Block andd UArray +* Add unicode case mapping +* Re-add compatibility with ghc 7.8 + ## 0.0.18 * Add missing lowlevel Block functionality diff --git a/Foundation/Array/Bitmap.hs b/Foundation/Array/Bitmap.hs index f1c8b0ae..7117ef4c 100644 --- a/Foundation/Array/Bitmap.hs +++ b/Foundation/Array/Bitmap.hs @@ -13,6 +13,7 @@ -- unnecessary churn. -- {-# LANGUAGE BangPatterns #-} +{-# LANGUAGE DeriveDataTypeable #-} module Foundation.Array.Bitmap ( Bitmap , MutableBitmap @@ -46,6 +47,7 @@ import GHC.ST import qualified Data.List data Bitmap = Bitmap (CountOf Bool) (UArray Word32) + deriving (Typeable) data MutableBitmap st = MutableBitmap (CountOf Bool) (MUArray Word32 st) diff --git a/Foundation/Exception.hs b/Foundation/Exception.hs index 516d3d01..d4c35b45 100644 --- a/Foundation/Exception.hs +++ b/Foundation/Exception.hs @@ -9,7 +9,7 @@ import Control.Exception (Exception, SomeException) import Foundation.Monad.Exception finally :: MonadBracket m => m a -> m b -> m a -finally f g = generalBracket (pure ()) (\() a -> g >> pure a) (\() _ -> g) (const f) +finally f g = generalBracket (return ()) (\() a -> g >> return a) (\() _ -> g) (const f) try :: (MonadCatch m, Exception e) => m a -> m (Either e a) try a = catch (a >>= \ v -> return (Right v)) (\e -> return (Left e)) diff --git a/Foundation/Format/CSV.hs b/Foundation/Format/CSV.hs new file mode 100644 index 00000000..76ff3bac --- /dev/null +++ b/Foundation/Format/CSV.hs @@ -0,0 +1,231 @@ +-- | +-- Module : Foundation.Format.CSV +-- License : BSD-style +-- Maintainer : Foundation +-- Stability : experimental +-- Portability : portable +-- +-- Provies the support for Comma Separated Value + +{-# LANGUAGE FlexibleContexts #-} +{-# LANGUAGE GeneralizedNewtypeDeriving #-} +{-# LANGUAGE OverloadedStrings #-} +{-# LANGUAGE FlexibleInstances #-} + +module Foundation.Format.CSV + (-- * CSV + CSV + + -- ** Builder + -- ** String Bulider + , csvStringBuilder + , rowStringBuilder + , fieldStringBuilder + -- ** Block Builder + , csvBlockBuilder + , rowBlockBuilder + , fieldBlockBuilder + -- ** Conduit + , rowC + -- * Row + , Row + , ToRow(..) + -- * Field + , Field(..) + , Escaping(..) + , ToField(..) + -- ** helpers + , integral + , float + , string + ) where + +import Basement.Imports -- hiding (throw) +import Basement.BoxedArray (Array) +import Basement.NormalForm (NormalForm(..)) +import Basement.From (Into, into) +import Basement.String (String, replace, any, elem) +import qualified Basement.String as String (singleton) +import Basement.Types.Word128 (Word128) +import Basement.Types.Word256 (Word256) +import Basement.Types.OffsetSize (Offset, CountOf) +import Foundation.Collection.Element (Element) +import Foundation.Collection.Collection (Collection, nonEmpty_) +import Foundation.Collection.Sequential (Sequential(intersperse)) +import Foundation.Collection.Indexed (IndexedCollection) +import Foundation.Check.Arbitrary (Arbitrary(..), frequency) +import Foundation.Conduit.Internal + +import qualified Foundation.String.Builder as String +import Basement.Block (Block) +import qualified Basement.Block.Builder as Block + +import GHC.ST (runST) + +-- | CSV field +data Field + = FieldInteger Integer + | FieldDouble Double + | FieldString String Escaping + deriving (Eq, Show, Typeable) +instance NormalForm Field where + toNormalForm (FieldInteger i) = toNormalForm i + toNormalForm (FieldDouble d) = toNormalForm d + toNormalForm (FieldString s e) = toNormalForm s `seq` toNormalForm e +instance Arbitrary Field where + arbitrary = frequency $ nonEmpty_ [ (1, FieldInteger <$> arbitrary) + , (1, FieldDouble <$> arbitrary) + , (3, string <$> arbitrary) + ] + +data Escaping = NoEscape | Escape | DoubleEscape + deriving (Eq, Ord, Enum, Bounded, Show, Typeable) +instance NormalForm Escaping where + toNormalForm !_ = () + +class ToField a where + toField :: a -> Field +instance ToField Field where + toField = id +instance ToField a => ToField (Maybe a) where + toField Nothing = FieldString mempty NoEscape + toField (Just a) = toField a + +instance ToField Int8 where + toField = FieldInteger . into +instance ToField Int16 where + toField = FieldInteger . into +instance ToField Int32 where + toField = FieldInteger . into +instance ToField Int64 where + toField = FieldInteger . into +instance ToField Int where + toField = FieldInteger . into + +instance ToField Word8 where + toField = FieldInteger . into +instance ToField Word16 where + toField = FieldInteger . into +instance ToField Word32 where + toField = FieldInteger . into +instance ToField Word64 where + toField = FieldInteger . into +instance ToField Word where + toField = FieldInteger . into +instance ToField Word128 where + toField = FieldInteger . into +instance ToField Word256 where + toField = FieldInteger . into + +instance ToField Integer where + toField = FieldInteger +instance ToField Natural where + toField = FieldInteger . into + +instance ToField Double where + toField = FieldDouble + +instance ToField Char where + toField = string . String.singleton + +instance ToField (Offset a) where + toField = FieldInteger . into +instance ToField (CountOf a) where + toField = FieldInteger . into + +instance ToField [Char] where + toField = string . fromString +instance ToField String where + toField = string + +-- | helper function to create a `FieldInteger` +-- +integral :: Into Integer a => a -> Field +integral = FieldInteger . into + +float :: Double -> Field +float = FieldDouble + +-- | heler function to create a FieldString. +-- +-- This function will findout automatically if an escaping is needed. +-- if you wish to perform the escaping manually, do not used this function +-- +string :: String -> Field +string s = FieldString s encoding + where + encoding + | any g s = DoubleEscape + | any f s = Escape + | otherwise = NoEscape + f c = c == '\"' + g c = c `elem` ",\r\n" + +-- | CSV Row +-- +newtype Row = Row { unRow :: Array Field } + deriving (Eq, Show, Typeable, Monoid, Collection, NormalForm, Sequential, IndexedCollection) +type instance Element Row = Field +instance IsList Row where + type Item Row = Field + toList = toList . unRow + fromList = Row . fromList + +class ToRow a where + toRow :: a -> Row +instance ToRow Row where + toRow = id +instance (ToField a, ToField b) => ToRow (a,b) where + toRow (a,b) = fromList [toField a, toField b] +instance (ToField a, ToField b, ToField c) => ToRow (a,b,c) where + toRow (a,b,c) = fromList [toField a, toField b, toField c] +instance (ToField a, ToField b, ToField c, ToField d) => ToRow (a,b,c,d) where + toRow (a,b,c,d) = fromList [toField a, toField b, toField c, toField d] +instance (ToField a, ToField b, ToField c, ToField d, ToField e) => ToRow (a,b,c,d,e) where + toRow (a,b,c,d,e) = fromList [toField a, toField b, toField c, toField d, toField e] +instance (ToField a, ToField b, ToField c, ToField d, ToField e, ToField f) => ToRow (a,b,c,d,e,f) where + toRow (a,b,c,d,e,f) = fromList [toField a, toField b, toField c, toField d, toField e, toField f] + +-- | CSV Type +newtype CSV = CSV { unCSV :: Array Row } + deriving (Eq, Show, Typeable, Monoid, Collection, NormalForm, Sequential, IndexedCollection) + +type instance Element CSV = Row + +instance IsList CSV where + type Item CSV = Row + toList = toList . unCSV + fromList = CSV . fromList + +-- | serialise the CSV document into a UTF8 string +csvStringBuilder :: CSV -> String.Builder +csvStringBuilder = String.unsafeStringBuilder . csvBlockBuilder + +rowStringBuilder :: Row -> String.Builder +rowStringBuilder = String.unsafeStringBuilder . rowBlockBuilder + +fieldStringBuilder :: Field -> String.Builder +fieldStringBuilder = String.unsafeStringBuilder . fieldBlockBuilder + +-- | serialise the CSV document into a UTF8 encoded (Block Word8) +csvBlockBuilder :: CSV -> Block.Builder +csvBlockBuilder = mconcat . intersperse (Block.emitString "\r\n") . fmap rowBlockBuilder . toList . unCSV + +rowBlockBuilder :: Row -> Block.Builder +rowBlockBuilder = mconcat . intersperse (Block.emitUTF8Char ',') . fmap fieldBlockBuilder . toList . unRow + +fieldBlockBuilder :: Field -> Block.Builder +fieldBlockBuilder (FieldInteger i) = Block.emitString $ show i +fieldBlockBuilder (FieldDouble d) = Block.emitString $ show d +fieldBlockBuilder (FieldString s e) = case e of + NoEscape -> Block.emitString s + Escape -> Block.emitUTF8Char '"' <> Block.emitString s <> Block.emitUTF8Char '"' + DoubleEscape -> Block.emitUTF8Char '"' <> Block.emitString (replace "\"" "\"\"" s) <> Block.emitUTF8Char '"' + +rowC :: (ToRow row, Monad m) => Conduit row (Block Word8) m () +rowC = await >>= go + where + go Nothing = pure () + go (Just r) = + let bytes = runST (Block.run $ rowBlockBuilder (toRow r) <> Block.emitString "\r\n") + in yield bytes >> await >>= go diff --git a/Foundation/Monad/Except.hs b/Foundation/Monad/Except.hs index f4b63e4d..4eafd5a8 100644 --- a/Foundation/Monad/Except.hs +++ b/Foundation/Monad/Except.hs @@ -1,9 +1,11 @@ {-# LANGUAGE TypeFamilies #-} +{-# LANGUAGE ConstraintKinds #-} module Foundation.Monad.Except ( ExceptT(..) ) where import Basement.Imports +import Basement.Compat.AMP import Foundation.Monad.Base import Foundation.Monad.Reader @@ -12,7 +14,7 @@ newtype ExceptT e m a = ExceptT { runExceptT :: m (Either e a) } instance Functor m => Functor (ExceptT e m) where fmap f = ExceptT . fmap (fmap f) . runExceptT -instance (Functor m, Monad m) => Applicative (ExceptT e m) where +instance AMPMonad m => Applicative (ExceptT e m) where pure a = ExceptT $ pure (Right a) ExceptT f <*> ExceptT v = ExceptT $ do mf <- f @@ -24,11 +26,11 @@ instance (Functor m, Monad m) => Applicative (ExceptT e m) where Left e -> pure (Left e) Right x -> pure (Right (k x)) -instance Monad m => MonadFailure (ExceptT e m) where +instance AMPMonad m => MonadFailure (ExceptT e m) where type Failure (ExceptT e m) = e mFail = ExceptT . pure . Left -instance Monad m => Monad (ExceptT e m) where +instance AMPMonad m => Monad (ExceptT e m) where return a = ExceptT $ return (Right a) m >>= k = ExceptT $ do a <- runExceptT m diff --git a/Foundation/Monad/Exception.hs b/Foundation/Monad/Exception.hs index 95b31017..212da152 100644 --- a/Foundation/Monad/Exception.hs +++ b/Foundation/Monad/Exception.hs @@ -1,4 +1,5 @@ {-# LANGUAGE ScopedTypeVariables #-} +{-# LANGUAGE ConstraintKinds #-} module Foundation.Monad.Exception ( MonadThrow(..) , MonadCatch(..) @@ -6,10 +7,11 @@ module Foundation.Monad.Exception ) where import Basement.Compat.Base +import Basement.Compat.AMP import qualified Control.Exception as E -- | Monad that can throw exception -class Monad m => MonadThrow m where +class AMPMonad m => MonadThrow m where -- | Throw immediatity an exception. -- Only a 'MonadCatch' monad will be able to catch the exception using 'catch' throw :: Exception e => e -> m a diff --git a/Foundation/Monad/MonadIO.hs b/Foundation/Monad/MonadIO.hs index e25a5fda..914791af 100644 --- a/Foundation/Monad/MonadIO.hs +++ b/Foundation/Monad/MonadIO.hs @@ -1,4 +1,5 @@ {-# LANGUAGE CPP #-} +{-# LANGUAGE ConstraintKinds #-} module Foundation.Monad.MonadIO ( MonadIO(..) ) where @@ -7,9 +8,10 @@ module Foundation.Monad.MonadIO import Control.Monad.IO.Class #else import Basement.Compat.Base +import Basement.Compat.AMP -- | Monads in which 'IO' computations may be embedded. -class Monad m => MonadIO m where +class AMPMonad m => MonadIO m where -- | Lift a computation from the 'IO' monad. liftIO :: IO a -> m a diff --git a/Foundation/Monad/Reader.hs b/Foundation/Monad/Reader.hs index 8f7b2d56..a9472e2f 100644 --- a/Foundation/Monad/Reader.hs +++ b/Foundation/Monad/Reader.hs @@ -3,6 +3,7 @@ -- -- This is useful to keep a non-modifiable value -- in a context +{-# LANGUAGE ConstraintKinds #-} module Foundation.Monad.Reader ( -- * MonadReader MonadReader(..) @@ -12,10 +13,11 @@ module Foundation.Monad.Reader ) where import Basement.Compat.Base (($), (.), const) +import Basement.Compat.AMP import Foundation.Monad.Base import Foundation.Monad.Exception -class Monad m => MonadReader m where +class AMPMonad m => MonadReader m where type ReaderContext m ask :: m (ReaderContext m) @@ -32,7 +34,7 @@ instance Applicative m => Applicative (ReaderT r m) where fab <*> fa = ReaderT $ \r -> runReaderT fab r <*> runReaderT fa r {-# INLINE (<*>) #-} -instance Monad m => Monad (ReaderT r m) where +instance AMPMonad m => Monad (ReaderT r m) where return a = ReaderT $ const (return a) {-# INLINE return #-} ma >>= mab = ReaderT $ \r -> runReaderT ma r >>= \a -> runReaderT (mab a) r @@ -64,6 +66,6 @@ instance MonadBracket m => MonadBracket (ReaderT r m) where (\a exn -> runReaderT (cleanupExcept a exn) c) (\a -> runReaderT (innerAction a) c) -instance Monad m => MonadReader (ReaderT r m) where +instance AMPMonad m => MonadReader (ReaderT r m) where type ReaderContext (ReaderT r m) = r ask = ReaderT return diff --git a/Foundation/Monad/Transformer.hs b/Foundation/Monad/Transformer.hs index ec23bd97..fd9b8fe9 100644 --- a/Foundation/Monad/Transformer.hs +++ b/Foundation/Monad/Transformer.hs @@ -1,10 +1,12 @@ +{-# LANGUAGE ConstraintKinds #-} module Foundation.Monad.Transformer ( MonadTrans(..) ) where import Basement.Compat.Base +import Basement.Compat.AMP -- | Basic Transformer class class MonadTrans trans where -- | Lift a computation from an inner monad to the current transformer monad - lift :: Monad m => m a -> trans m a + lift :: AMPMonad m => m a -> trans m a diff --git a/LICENSE b/LICENSE index 8b157390..039ce268 100644 --- a/LICENSE +++ b/LICENSE @@ -1,5 +1,5 @@ Copyright (c) 2015-2017 Vincent Hanquez -Copyright (c) 2017 Foundation Maintainers +Copyright (c) 2017-2018 Foundation Maintainers All rights reserved. diff --git a/basement/Basement/Block/Base.hs b/basement/Basement/Block/Base.hs index 02b23c61..1ac54e14 100644 --- a/basement/Basement/Block/Base.hs +++ b/basement/Basement/Block/Base.hs @@ -231,29 +231,26 @@ append a b !la = lengthBytes a !lb = lengthBytes b -concat :: [Block ty] -> Block ty -concat [] = empty -concat l = - case filterAndSum 0 [] l of - (_,[]) -> empty - (_,[x]) -> x - (totalLen,chunks) -> runST $ do - r <- unsafeNew Unpinned totalLen - doCopy r 0 chunks - unsafeFreeze r +concat :: forall ty . [Block ty] -> Block ty +concat original = runST $ do + r <- unsafeNew Unpinned total + goCopy r zero original + unsafeFreeze r where - -- TODO would go faster not to reverse but pack from the end instead - filterAndSum !totalLen acc [] = (totalLen, Data.List.reverse acc) - filterAndSum !totalLen acc (x:xs) - | len == 0 = filterAndSum totalLen acc xs - | otherwise = filterAndSum (len+totalLen) (x:acc) xs - where len = lengthBytes x - - doCopy _ _ [] = return () - doCopy r i (x:xs) = do - unsafeCopyBytesRO r i x 0 lx - doCopy r (i `offsetPlusE` lx) xs - where !lx = lengthBytes x + !total = size 0 original + -- size + size !sz [] = sz + size !sz (x:xs) = size (lengthBytes x + sz) xs + + zero = Offset 0 + + goCopy r = loop + where + loop _ [] = pure () + loop !i (x:xs) = do + unsafeCopyBytesRO r i x zero lx + loop (i `offsetPlusE` lx) xs + where !lx = lengthBytes x -- | Freeze a mutable block into a block. -- @@ -266,9 +263,10 @@ unsafeFreeze (MutableBlock mba) = primitive $ \s1 -> (# s2, ba #) -> (# s2, Block ba #) {-# INLINE unsafeFreeze #-} -unsafeShrink :: PrimMonad prim => MutableBlock ty (PrimState prim) -> CountOf ty -> prim () +unsafeShrink :: PrimMonad prim => MutableBlock ty (PrimState prim) -> CountOf ty -> prim (MutableBlock ty (PrimState prim)) unsafeShrink (MutableBlock mba) (CountOf (I# nsz)) = primitive $ \s -> - (# shrinkMutableByteArray# mba nsz s, () #) + case compatShrinkMutableByteArray# mba nsz s of + (# s, mba' #) -> (# s, MutableBlock mba' #) -- | Thaw an immutable block. -- diff --git a/basement/Basement/Block/Builder.hs b/basement/Basement/Block/Builder.hs index 5677511b..66f0cb74 100644 --- a/basement/Basement/Block/Builder.hs +++ b/basement/Basement/Block/Builder.hs @@ -60,6 +60,8 @@ instance Monoid Builder where {-# INLINE mempty #-} mappend = append {-# INLINABLE mappend #-} + mconcat = concat + {-# INLINABLE mconcat #-} -- | create an empty builder -- @@ -79,13 +81,21 @@ append (Builder size1 (Action action1)) (Builder size2 (Action action2)) = size = size1 + size2 {-# INLINABLE append #-} +-- | concatenate the list of builder +concat :: [Builder] -> Builder +concat = loop 0 (Action $ \_ !off -> pure off) + where + loop !sz acc [] = Builder sz acc + loop !sz (Action acc) (Builder !s (Action action):xs) = + loop (sz + s) (Action $ \arr off -> acc arr off >>= action arr) xs +{-# INLINABLE concat #-} + -- | run the given builder and return the generated block run :: PrimMonad prim => Builder -> prim (Block Word8) run (Builder sz action) = do mb <- B.new sz off <- runAction_ action mb 0 - B.unsafeShrink mb (offsetAsSize off) - B.unsafeFreeze mb + B.unsafeShrink mb (offsetAsSize off) >>= B.unsafeFreeze -- | run the given builder and return a UTF8String -- diff --git a/basement/Basement/Compat/AMP.hs b/basement/Basement/Compat/AMP.hs new file mode 100644 index 00000000..e3f9d58f --- /dev/null +++ b/basement/Basement/Compat/AMP.hs @@ -0,0 +1,14 @@ +{-# LANGUAGE CPP #-} +{-# LANGUAGE ConstraintKinds #-} +-- a compat module for ghc < 7.10 to handle the AMP change smoothly +module Basement.Compat.AMP + ( AMPMonad + ) where + +import Basement.Compat.Base + +#if MIN_VERSION_base(4,8,0) +type AMPMonad m = Monad m +#else +type AMPMonad m = (Functor m, Applicative m, Monad m) +#endif diff --git a/basement/Basement/Compat/Primitive.hs b/basement/Basement/Compat/Primitive.hs index 2b3f6064..1bc286cb 100644 --- a/basement/Basement/Compat/Primitive.hs +++ b/basement/Basement/Compat/Primitive.hs @@ -140,7 +140,7 @@ compatShrinkMutableByteArray# mba i s = compatShrinkMutableByteArray# src i s = -- not check whether i is smaller than the size of the buffer case newAlignedPinnedByteArray# i 8# s of { (# s2, dst #) -> - case copyMutableByteArray# dst 0# src 0# i s2 of { s3 -> (# s3, dst #) }} + case copyMutableByteArray# src 0# dst 0# i s2 of { s3 -> (# s3, dst #) }} #endif {-# INLINE compatShrinkMutableByteArray# #-} @@ -151,7 +151,7 @@ compatResizeMutableByteArray# mba i s = resizeMutableByteArray# mba i s #else compatResizeMutableByteArray# src i s = case newAlignedPinnedByteArray# i 8# s of { (# s2, dst #) -> - case copyMutableByteArray# dst 0# src 0# nbBytes s2 of { s3 -> (# s3, dst #) }} + case copyMutableByteArray# src 0# dst 0# nbBytes s2 of { s3 -> (# s3, dst #) }} where isGrow = bool# (i ># len) nbBytes diff --git a/basement/Basement/Monad.hs b/basement/Basement/Monad.hs index 96b92a0f..c1529be0 100644 --- a/basement/Basement/Monad.hs +++ b/basement/Basement/Monad.hs @@ -16,6 +16,7 @@ {-# LANGUAGE MagicHash #-} {-# LANGUAGE UnboxedTuples #-} {-# LANGUAGE ExistentialQuantification #-} +{-# LANGUAGE ConstraintKinds #-} module Basement.Monad ( PrimMonad(..) , MonadFailure(..) @@ -34,6 +35,7 @@ import GHC.IORef import GHC.IO import GHC.Prim import Basement.Compat.Base (Exception, (.), ($), Applicative) +import Basement.Compat.AMP -- | Primitive monad that can handle mutation. -- @@ -120,7 +122,7 @@ primTouch x = unsafePrimFromIO $ primitive $ \s -> case touch# x s of { s2 -> (# -- | Monad that can represent failure -- -- Similar to MonadFail but with a parametrized Failure linked to the Monad -class Prelude.Monad m => MonadFailure m where +class AMPMonad m => MonadFailure m where -- | The associated type with the MonadFailure, representing what -- failure can be encoded in this monad type Failure m diff --git a/basement/Basement/String.hs b/basement/Basement/String.hs index 3ea0eeba..0255f27c 100644 --- a/basement/Basement/String.hs +++ b/basement/Basement/String.hs @@ -116,6 +116,7 @@ import Basement.FinalPtr import Basement.IntegralConv import Basement.Floating import Basement.MutableBuilder +import Basement.String.CaseMapping (upperMapping, lowerMapping) import Basement.UTF8.Table import Basement.UTF8.Helper import Basement.UTF8.Base @@ -1318,15 +1319,68 @@ decimalDigitsPtr startAcc ptr !endOfs !startOfs = loop startAcc startOfs {-# SPECIALIZE decimalDigitsPtr :: Int -> Addr# -> Offset Word8 -> Offset Word8 -> (# Int, Bool, Offset Word8 #) #-} {-# SPECIALIZE decimalDigitsPtr :: Word -> Addr# -> Offset Word8 -> Offset Word8 -> (# Word, Bool, Offset Word8 #) #-} +-- | A unicode string size may vary during a case conversion operation. +-- This function calculates the new buffer size for a case conversion. +-- Returns Nothing if no case conversion is needed. +caseConvertNBuff :: (Char -> CM) -> String -> Maybe (CountOf Word8) +caseConvertNBuff op s@(String ba) = runST $ Vec.unsafeIndexer ba go + where + !sz = size s + !end = azero `offsetPlusE` sz + go :: (Offset Word8 -> Word8) -> ST st (Maybe (CountOf Word8)) + go getIdx = loop (Offset 0) 0 False + where + !nextI = nextWithIndexer getIdx + eSize !e = if e == '\0' + then 0 + else charToBytes (fromEnum e) + loop !idx ns changed + | idx == end = if changed + then return $ Just ns + else return Nothing + | otherwise = do + let !(c, idx') = nextI idx + !cm@(CM c1 c2 c3) = op c + !cSize = if c2 == '\0' -- if c2 is empty, c3 will be empty as well. + then charToBytes (fromEnum c1) + else eSize c1 + eSize c2 + eSize c3 + !nchanged = changed || c1 /= c || c2 /= '\0' + loop idx' (ns + cSize) nchanged + +-- | Convert a 'String' 'Char' by 'Char' using a case mapping function. +caseConvert :: (Char -> CM) -> String -> String +caseConvert op s@(String ba) + = case nBuff of + Nothing -> s + Just nLen -> runST $ unsafeCopyFrom s nLen go + where + !nBuff = caseConvertNBuff op s + go :: String -> Offset Char -> Offset8 -> MutableString s -> Offset8 -> ST s (Offset8, Offset8) + go src' srcI srcIdx dst dstIdx = do + let !(CM c1 c2 c3) = op c + dstIdx <- write dst dstIdx c1 + nextDstIdx <- + if c2 == '\0' -- We don't want to check C3 if C2 is empty. + then return dstIdx + else do + dstIdx <- writeValidChar c2 dstIdx + writeValidChar c3 dstIdx + return (nextSrcIdx, nextDstIdx) + where + !(Step c nextSrcIdx) = next src' srcIdx + writeValidChar cc wIdx = + if cc == '\0' + then return wIdx + else do + write dst wIdx cc + -- | Convert a 'String' to the upper-case equivalent. --- Does not properly support multicharacter Unicode conversions. upper :: String -> String -upper = charMap toUpper +upper = caseConvert upperMapping -- | Convert a 'String' to the upper-case equivalent. --- Does not properly support multicharacter Unicode conversions. lower :: String -> String -lower = charMap toLower +lower = caseConvert lowerMapping -- | Check whether the first string is a prefix of the second string. isPrefixOf :: String -> String -> Bool diff --git a/basement/Basement/String/Builder.hs b/basement/Basement/String/Builder.hs index e0d2ad3f..562b49f2 100644 --- a/basement/Basement/String/Builder.hs +++ b/basement/Basement/String/Builder.hs @@ -15,6 +15,9 @@ module Basement.String.Builder -- * Emit functions , emit , emitChar + + -- * unsafe + , unsafeStringBuilder ) where @@ -30,6 +33,10 @@ import qualified Basement.UArray.Base as A newtype Builder = Builder Block.Builder deriving (Semigroup, Monoid) +unsafeStringBuilder :: Block.Builder -> Builder +unsafeStringBuilder = Builder +{-# INLINE unsafeStringBuilder #-} + run :: PrimMonad prim => Builder -> prim (String, Maybe ValidationFailure, UArray Word8) run (Builder builder) = do block <- Block.run builder diff --git a/basement/Basement/String/CaseMapping.hs b/basement/Basement/String/CaseMapping.hs new file mode 100644 index 00000000..db82f997 --- /dev/null +++ b/basement/Basement/String/CaseMapping.hs @@ -0,0 +1,3240 @@ +{-# LANGUAGE Rank2Types #-} +-- AUTOMATICALLY GENERATED - DO NOT EDIT +-- Generated by scripts/caseMapping/generateCaseMapping.sh +-- CaseFolding-10.0.0.txt +-- Date: 2017-04-14, 05:40:18 GMT +-- SpecialCasing-10.0.0.txt +-- Date: 2017-04-14, 05:40:43 GMT + +module Basement.String.CaseMapping where + +import Data.Char +import Basement.UTF8.Types + +upperMapping :: Char -> CM +{-# NOINLINE upperMapping #-} +-- LATIN SMALL LETTER SHARP S +upperMapping '\x00DF' = CM '\x0053' '\x0053' '\0' +-- LATIN SMALL LIGATURE FF +upperMapping '\xFB00' = CM '\x0046' '\x0046' '\0' +-- LATIN SMALL LIGATURE FI +upperMapping '\xFB01' = CM '\x0046' '\x0049' '\0' +-- LATIN SMALL LIGATURE FL +upperMapping '\xFB02' = CM '\x0046' '\x004C' '\0' +-- LATIN SMALL LIGATURE FFI +upperMapping '\xFB03' = CM '\x0046' '\x0046' '\x0049' +-- LATIN SMALL LIGATURE FFL +upperMapping '\xFB04' = CM '\x0046' '\x0046' '\x004C' +-- LATIN SMALL LIGATURE LONG S T +upperMapping '\xFB05' = CM '\x0053' '\x0054' '\0' +-- LATIN SMALL LIGATURE ST +upperMapping '\xFB06' = CM '\x0053' '\x0054' '\0' +-- ARMENIAN SMALL LIGATURE ECH YIWN +upperMapping '\x0587' = CM '\x0535' '\x0552' '\0' +-- ARMENIAN SMALL LIGATURE MEN NOW +upperMapping '\xFB13' = CM '\x0544' '\x0546' '\0' +-- ARMENIAN SMALL LIGATURE MEN ECH +upperMapping '\xFB14' = CM '\x0544' '\x0535' '\0' +-- ARMENIAN SMALL LIGATURE MEN INI +upperMapping '\xFB15' = CM '\x0544' '\x053B' '\0' +-- ARMENIAN SMALL LIGATURE VEW NOW +upperMapping '\xFB16' = CM '\x054E' '\x0546' '\0' +-- ARMENIAN SMALL LIGATURE MEN XEH +upperMapping '\xFB17' = CM '\x0544' '\x053D' '\0' +-- LATIN SMALL LETTER N PRECEDED BY APOSTROPHE +upperMapping '\x0149' = CM '\x02BC' '\x004E' '\0' +-- GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS +upperMapping '\x0390' = CM '\x0399' '\x0308' '\x0301' +-- GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS +upperMapping '\x03B0' = CM '\x03A5' '\x0308' '\x0301' +-- LATIN SMALL LETTER J WITH CARON +upperMapping '\x01F0' = CM '\x004A' '\x030C' '\0' +-- LATIN SMALL LETTER H WITH LINE BELOW +upperMapping '\x1E96' = CM '\x0048' '\x0331' '\0' +-- LATIN SMALL LETTER T WITH DIAERESIS +upperMapping '\x1E97' = CM '\x0054' '\x0308' '\0' +-- LATIN SMALL LETTER W WITH RING ABOVE +upperMapping '\x1E98' = CM '\x0057' '\x030A' '\0' +-- LATIN SMALL LETTER Y WITH RING ABOVE +upperMapping '\x1E99' = CM '\x0059' '\x030A' '\0' +-- LATIN SMALL LETTER A WITH RIGHT HALF RING +upperMapping '\x1E9A' = CM '\x0041' '\x02BE' '\0' +-- GREEK SMALL LETTER UPSILON WITH PSILI +upperMapping '\x1F50' = CM '\x03A5' '\x0313' '\0' +-- GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA +upperMapping '\x1F52' = CM '\x03A5' '\x0313' '\x0300' +-- GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA +upperMapping '\x1F54' = CM '\x03A5' '\x0313' '\x0301' +-- GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI +upperMapping '\x1F56' = CM '\x03A5' '\x0313' '\x0342' +-- GREEK SMALL LETTER ALPHA WITH PERISPOMENI +upperMapping '\x1FB6' = CM '\x0391' '\x0342' '\0' +-- GREEK SMALL LETTER ETA WITH PERISPOMENI +upperMapping '\x1FC6' = CM '\x0397' '\x0342' '\0' +-- GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA +upperMapping '\x1FD2' = CM '\x0399' '\x0308' '\x0300' +-- GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA +upperMapping '\x1FD3' = CM '\x0399' '\x0308' '\x0301' +-- GREEK SMALL LETTER IOTA WITH PERISPOMENI +upperMapping '\x1FD6' = CM '\x0399' '\x0342' '\0' +-- GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI +upperMapping '\x1FD7' = CM '\x0399' '\x0308' '\x0342' +-- GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA +upperMapping '\x1FE2' = CM '\x03A5' '\x0308' '\x0300' +-- GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA +upperMapping '\x1FE3' = CM '\x03A5' '\x0308' '\x0301' +-- GREEK SMALL LETTER RHO WITH PSILI +upperMapping '\x1FE4' = CM '\x03A1' '\x0313' '\0' +-- GREEK SMALL LETTER UPSILON WITH PERISPOMENI +upperMapping '\x1FE6' = CM '\x03A5' '\x0342' '\0' +-- GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI +upperMapping '\x1FE7' = CM '\x03A5' '\x0308' '\x0342' +-- GREEK SMALL LETTER OMEGA WITH PERISPOMENI +upperMapping '\x1FF6' = CM '\x03A9' '\x0342' '\0' +-- GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI +upperMapping '\x1F80' = CM '\x1F08' '\x0399' '\0' +-- GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI +upperMapping '\x1F81' = CM '\x1F09' '\x0399' '\0' +-- GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI +upperMapping '\x1F82' = CM '\x1F0A' '\x0399' '\0' +-- GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI +upperMapping '\x1F83' = CM '\x1F0B' '\x0399' '\0' +-- GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI +upperMapping '\x1F84' = CM '\x1F0C' '\x0399' '\0' +-- GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI +upperMapping '\x1F85' = CM '\x1F0D' '\x0399' '\0' +-- GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI +upperMapping '\x1F86' = CM '\x1F0E' '\x0399' '\0' +-- GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI +upperMapping '\x1F87' = CM '\x1F0F' '\x0399' '\0' +-- GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI +upperMapping '\x1F88' = CM '\x1F08' '\x0399' '\0' +-- GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI +upperMapping '\x1F89' = CM '\x1F09' '\x0399' '\0' +-- GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI +upperMapping '\x1F8A' = CM '\x1F0A' '\x0399' '\0' +-- GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI +upperMapping '\x1F8B' = CM '\x1F0B' '\x0399' '\0' +-- GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI +upperMapping '\x1F8C' = CM '\x1F0C' '\x0399' '\0' +-- GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI +upperMapping '\x1F8D' = CM '\x1F0D' '\x0399' '\0' +-- GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI +upperMapping '\x1F8E' = CM '\x1F0E' '\x0399' '\0' +-- GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI +upperMapping '\x1F8F' = CM '\x1F0F' '\x0399' '\0' +-- GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI +upperMapping '\x1F90' = CM '\x1F28' '\x0399' '\0' +-- GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI +upperMapping '\x1F91' = CM '\x1F29' '\x0399' '\0' +-- GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI +upperMapping '\x1F92' = CM '\x1F2A' '\x0399' '\0' +-- GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI +upperMapping '\x1F93' = CM '\x1F2B' '\x0399' '\0' +-- GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI +upperMapping '\x1F94' = CM '\x1F2C' '\x0399' '\0' +-- GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI +upperMapping '\x1F95' = CM '\x1F2D' '\x0399' '\0' +-- GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI +upperMapping '\x1F96' = CM '\x1F2E' '\x0399' '\0' +-- GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI +upperMapping '\x1F97' = CM '\x1F2F' '\x0399' '\0' +-- GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI +upperMapping '\x1F98' = CM '\x1F28' '\x0399' '\0' +-- GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI +upperMapping '\x1F99' = CM '\x1F29' '\x0399' '\0' +-- GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI +upperMapping '\x1F9A' = CM '\x1F2A' '\x0399' '\0' +-- GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI +upperMapping '\x1F9B' = CM '\x1F2B' '\x0399' '\0' +-- GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI +upperMapping '\x1F9C' = CM '\x1F2C' '\x0399' '\0' +-- GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI +upperMapping '\x1F9D' = CM '\x1F2D' '\x0399' '\0' +-- GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI +upperMapping '\x1F9E' = CM '\x1F2E' '\x0399' '\0' +-- GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI +upperMapping '\x1F9F' = CM '\x1F2F' '\x0399' '\0' +-- GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI +upperMapping '\x1FA0' = CM '\x1F68' '\x0399' '\0' +-- GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI +upperMapping '\x1FA1' = CM '\x1F69' '\x0399' '\0' +-- GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI +upperMapping '\x1FA2' = CM '\x1F6A' '\x0399' '\0' +-- GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI +upperMapping '\x1FA3' = CM '\x1F6B' '\x0399' '\0' +-- GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI +upperMapping '\x1FA4' = CM '\x1F6C' '\x0399' '\0' +-- GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI +upperMapping '\x1FA5' = CM '\x1F6D' '\x0399' '\0' +-- GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI +upperMapping '\x1FA6' = CM '\x1F6E' '\x0399' '\0' +-- GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI +upperMapping '\x1FA7' = CM '\x1F6F' '\x0399' '\0' +-- GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI +upperMapping '\x1FA8' = CM '\x1F68' '\x0399' '\0' +-- GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI +upperMapping '\x1FA9' = CM '\x1F69' '\x0399' '\0' +-- GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI +upperMapping '\x1FAA' = CM '\x1F6A' '\x0399' '\0' +-- GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI +upperMapping '\x1FAB' = CM '\x1F6B' '\x0399' '\0' +-- GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI +upperMapping '\x1FAC' = CM '\x1F6C' '\x0399' '\0' +-- GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI +upperMapping '\x1FAD' = CM '\x1F6D' '\x0399' '\0' +-- GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI +upperMapping '\x1FAE' = CM '\x1F6E' '\x0399' '\0' +-- GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI +upperMapping '\x1FAF' = CM '\x1F6F' '\x0399' '\0' +-- GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI +upperMapping '\x1FB3' = CM '\x0391' '\x0399' '\0' +-- GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI +upperMapping '\x1FBC' = CM '\x0391' '\x0399' '\0' +-- GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI +upperMapping '\x1FC3' = CM '\x0397' '\x0399' '\0' +-- GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI +upperMapping '\x1FCC' = CM '\x0397' '\x0399' '\0' +-- GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI +upperMapping '\x1FF3' = CM '\x03A9' '\x0399' '\0' +-- GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI +upperMapping '\x1FFC' = CM '\x03A9' '\x0399' '\0' +-- GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI +upperMapping '\x1FB2' = CM '\x1FBA' '\x0399' '\0' +-- GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI +upperMapping '\x1FB4' = CM '\x0386' '\x0399' '\0' +-- GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI +upperMapping '\x1FC2' = CM '\x1FCA' '\x0399' '\0' +-- GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI +upperMapping '\x1FC4' = CM '\x0389' '\x0399' '\0' +-- GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI +upperMapping '\x1FF2' = CM '\x1FFA' '\x0399' '\0' +-- GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI +upperMapping '\x1FF4' = CM '\x038F' '\x0399' '\0' +-- GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI +upperMapping '\x1FB7' = CM '\x0391' '\x0342' '\x0399' +-- GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI +upperMapping '\x1FC7' = CM '\x0397' '\x0342' '\x0399' +-- GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI +upperMapping '\x1FF7' = CM '\x03A9' '\x0342' '\x0399' +upperMapping c = CM (toUpper c) '\0' '\0' + +lowerMapping :: Char -> CM +{-# NOINLINE lowerMapping #-} +-- LATIN CAPITAL LETTER I WITH DOT ABOVE +lowerMapping '\x0130' = CM '\x0069' '\x0307' '\0' +-- GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI +lowerMapping '\x1F88' = CM '\x1F80' '\0' '\0' +-- GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI +lowerMapping '\x1F89' = CM '\x1F81' '\0' '\0' +-- GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI +lowerMapping '\x1F8A' = CM '\x1F82' '\0' '\0' +-- GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI +lowerMapping '\x1F8B' = CM '\x1F83' '\0' '\0' +-- GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI +lowerMapping '\x1F8C' = CM '\x1F84' '\0' '\0' +-- GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI +lowerMapping '\x1F8D' = CM '\x1F85' '\0' '\0' +-- GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI +lowerMapping '\x1F8E' = CM '\x1F86' '\0' '\0' +-- GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI +lowerMapping '\x1F8F' = CM '\x1F87' '\0' '\0' +-- GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI +lowerMapping '\x1F98' = CM '\x1F90' '\0' '\0' +-- GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI +lowerMapping '\x1F99' = CM '\x1F91' '\0' '\0' +-- GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI +lowerMapping '\x1F9A' = CM '\x1F92' '\0' '\0' +-- GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI +lowerMapping '\x1F9B' = CM '\x1F93' '\0' '\0' +-- GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI +lowerMapping '\x1F9C' = CM '\x1F94' '\0' '\0' +-- GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI +lowerMapping '\x1F9D' = CM '\x1F95' '\0' '\0' +-- GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI +lowerMapping '\x1F9E' = CM '\x1F96' '\0' '\0' +-- GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI +lowerMapping '\x1F9F' = CM '\x1F97' '\0' '\0' +-- GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI +lowerMapping '\x1FA8' = CM '\x1FA0' '\0' '\0' +-- GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI +lowerMapping '\x1FA9' = CM '\x1FA1' '\0' '\0' +-- GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI +lowerMapping '\x1FAA' = CM '\x1FA2' '\0' '\0' +-- GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI +lowerMapping '\x1FAB' = CM '\x1FA3' '\0' '\0' +-- GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI +lowerMapping '\x1FAC' = CM '\x1FA4' '\0' '\0' +-- GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI +lowerMapping '\x1FAD' = CM '\x1FA5' '\0' '\0' +-- GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI +lowerMapping '\x1FAE' = CM '\x1FA6' '\0' '\0' +-- GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI +lowerMapping '\x1FAF' = CM '\x1FA7' '\0' '\0' +-- GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI +lowerMapping '\x1FBC' = CM '\x1FB3' '\0' '\0' +-- GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI +lowerMapping '\x1FCC' = CM '\x1FC3' '\0' '\0' +-- GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI +lowerMapping '\x1FFC' = CM '\x1FF3' '\0' '\0' +lowerMapping c = CM (toLower c) '\0' '\0' + +titleMapping :: Char -> CM +{-# NOINLINE titleMapping #-} +-- LATIN SMALL LETTER SHARP S +titleMapping '\x00DF' = CM '\x0053' '\x0073' '\0' +-- LATIN SMALL LIGATURE FF +titleMapping '\xFB00' = CM '\x0046' '\x0066' '\0' +-- LATIN SMALL LIGATURE FI +titleMapping '\xFB01' = CM '\x0046' '\x0069' '\0' +-- LATIN SMALL LIGATURE FL +titleMapping '\xFB02' = CM '\x0046' '\x006C' '\0' +-- LATIN SMALL LIGATURE FFI +titleMapping '\xFB03' = CM '\x0046' '\x0066' '\x0069' +-- LATIN SMALL LIGATURE FFL +titleMapping '\xFB04' = CM '\x0046' '\x0066' '\x006C' +-- LATIN SMALL LIGATURE LONG S T +titleMapping '\xFB05' = CM '\x0053' '\x0074' '\0' +-- LATIN SMALL LIGATURE ST +titleMapping '\xFB06' = CM '\x0053' '\x0074' '\0' +-- ARMENIAN SMALL LIGATURE ECH YIWN +titleMapping '\x0587' = CM '\x0535' '\x0582' '\0' +-- ARMENIAN SMALL LIGATURE MEN NOW +titleMapping '\xFB13' = CM '\x0544' '\x0576' '\0' +-- ARMENIAN SMALL LIGATURE MEN ECH +titleMapping '\xFB14' = CM '\x0544' '\x0565' '\0' +-- ARMENIAN SMALL LIGATURE MEN INI +titleMapping '\xFB15' = CM '\x0544' '\x056B' '\0' +-- ARMENIAN SMALL LIGATURE VEW NOW +titleMapping '\xFB16' = CM '\x054E' '\x0576' '\0' +-- ARMENIAN SMALL LIGATURE MEN XEH +titleMapping '\xFB17' = CM '\x0544' '\x056D' '\0' +-- LATIN SMALL LETTER N PRECEDED BY APOSTROPHE +titleMapping '\x0149' = CM '\x02BC' '\x004E' '\0' +-- GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS +titleMapping '\x0390' = CM '\x0399' '\x0308' '\x0301' +-- GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS +titleMapping '\x03B0' = CM '\x03A5' '\x0308' '\x0301' +-- LATIN SMALL LETTER J WITH CARON +titleMapping '\x01F0' = CM '\x004A' '\x030C' '\0' +-- LATIN SMALL LETTER H WITH LINE BELOW +titleMapping '\x1E96' = CM '\x0048' '\x0331' '\0' +-- LATIN SMALL LETTER T WITH DIAERESIS +titleMapping '\x1E97' = CM '\x0054' '\x0308' '\0' +-- LATIN SMALL LETTER W WITH RING ABOVE +titleMapping '\x1E98' = CM '\x0057' '\x030A' '\0' +-- LATIN SMALL LETTER Y WITH RING ABOVE +titleMapping '\x1E99' = CM '\x0059' '\x030A' '\0' +-- LATIN SMALL LETTER A WITH RIGHT HALF RING +titleMapping '\x1E9A' = CM '\x0041' '\x02BE' '\0' +-- GREEK SMALL LETTER UPSILON WITH PSILI +titleMapping '\x1F50' = CM '\x03A5' '\x0313' '\0' +-- GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA +titleMapping '\x1F52' = CM '\x03A5' '\x0313' '\x0300' +-- GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA +titleMapping '\x1F54' = CM '\x03A5' '\x0313' '\x0301' +-- GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI +titleMapping '\x1F56' = CM '\x03A5' '\x0313' '\x0342' +-- GREEK SMALL LETTER ALPHA WITH PERISPOMENI +titleMapping '\x1FB6' = CM '\x0391' '\x0342' '\0' +-- GREEK SMALL LETTER ETA WITH PERISPOMENI +titleMapping '\x1FC6' = CM '\x0397' '\x0342' '\0' +-- GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA +titleMapping '\x1FD2' = CM '\x0399' '\x0308' '\x0300' +-- GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA +titleMapping '\x1FD3' = CM '\x0399' '\x0308' '\x0301' +-- GREEK SMALL LETTER IOTA WITH PERISPOMENI +titleMapping '\x1FD6' = CM '\x0399' '\x0342' '\0' +-- GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI +titleMapping '\x1FD7' = CM '\x0399' '\x0308' '\x0342' +-- GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA +titleMapping '\x1FE2' = CM '\x03A5' '\x0308' '\x0300' +-- GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA +titleMapping '\x1FE3' = CM '\x03A5' '\x0308' '\x0301' +-- GREEK SMALL LETTER RHO WITH PSILI +titleMapping '\x1FE4' = CM '\x03A1' '\x0313' '\0' +-- GREEK SMALL LETTER UPSILON WITH PERISPOMENI +titleMapping '\x1FE6' = CM '\x03A5' '\x0342' '\0' +-- GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI +titleMapping '\x1FE7' = CM '\x03A5' '\x0308' '\x0342' +-- GREEK SMALL LETTER OMEGA WITH PERISPOMENI +titleMapping '\x1FF6' = CM '\x03A9' '\x0342' '\0' +-- GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI +titleMapping '\x1F80' = CM '\x1F88' '\0' '\0' +-- GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI +titleMapping '\x1F81' = CM '\x1F89' '\0' '\0' +-- GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI +titleMapping '\x1F82' = CM '\x1F8A' '\0' '\0' +-- GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI +titleMapping '\x1F83' = CM '\x1F8B' '\0' '\0' +-- GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI +titleMapping '\x1F84' = CM '\x1F8C' '\0' '\0' +-- GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI +titleMapping '\x1F85' = CM '\x1F8D' '\0' '\0' +-- GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI +titleMapping '\x1F86' = CM '\x1F8E' '\0' '\0' +-- GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI +titleMapping '\x1F87' = CM '\x1F8F' '\0' '\0' +-- GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI +titleMapping '\x1F90' = CM '\x1F98' '\0' '\0' +-- GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI +titleMapping '\x1F91' = CM '\x1F99' '\0' '\0' +-- GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI +titleMapping '\x1F92' = CM '\x1F9A' '\0' '\0' +-- GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI +titleMapping '\x1F93' = CM '\x1F9B' '\0' '\0' +-- GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI +titleMapping '\x1F94' = CM '\x1F9C' '\0' '\0' +-- GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI +titleMapping '\x1F95' = CM '\x1F9D' '\0' '\0' +-- GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI +titleMapping '\x1F96' = CM '\x1F9E' '\0' '\0' +-- GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI +titleMapping '\x1F97' = CM '\x1F9F' '\0' '\0' +-- GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI +titleMapping '\x1FA0' = CM '\x1FA8' '\0' '\0' +-- GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI +titleMapping '\x1FA1' = CM '\x1FA9' '\0' '\0' +-- GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI +titleMapping '\x1FA2' = CM '\x1FAA' '\0' '\0' +-- GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI +titleMapping '\x1FA3' = CM '\x1FAB' '\0' '\0' +-- GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI +titleMapping '\x1FA4' = CM '\x1FAC' '\0' '\0' +-- GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI +titleMapping '\x1FA5' = CM '\x1FAD' '\0' '\0' +-- GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI +titleMapping '\x1FA6' = CM '\x1FAE' '\0' '\0' +-- GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI +titleMapping '\x1FA7' = CM '\x1FAF' '\0' '\0' +-- GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI +titleMapping '\x1FB3' = CM '\x1FBC' '\0' '\0' +-- GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI +titleMapping '\x1FC3' = CM '\x1FCC' '\0' '\0' +-- GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI +titleMapping '\x1FF3' = CM '\x1FFC' '\0' '\0' +-- GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI +titleMapping '\x1FB2' = CM '\x1FBA' '\x0345' '\0' +-- GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI +titleMapping '\x1FB4' = CM '\x0386' '\x0345' '\0' +-- GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI +titleMapping '\x1FC2' = CM '\x1FCA' '\x0345' '\0' +-- GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI +titleMapping '\x1FC4' = CM '\x0389' '\x0345' '\0' +-- GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI +titleMapping '\x1FF2' = CM '\x1FFA' '\x0345' '\0' +-- GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI +titleMapping '\x1FF4' = CM '\x038F' '\x0345' '\0' +-- GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI +titleMapping '\x1FB7' = CM '\x0391' '\x0342' '\x0345' +-- GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI +titleMapping '\x1FC7' = CM '\x0397' '\x0342' '\x0345' +-- GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI +titleMapping '\x1FF7' = CM '\x03A9' '\x0342' '\x0345' +titleMapping c = CM (toTitle c) '\0' '\0' + +foldMapping :: Char -> CM +{-# NOINLINE foldMapping #-} +-- LATIN CAPITAL LETTER A +foldMapping '\x0041' = CM '\x0061' '\0' '\0' +-- LATIN CAPITAL LETTER B +foldMapping '\x0042' = CM '\x0062' '\0' '\0' +-- LATIN CAPITAL LETTER C +foldMapping '\x0043' = CM '\x0063' '\0' '\0' +-- LATIN CAPITAL LETTER D +foldMapping '\x0044' = CM '\x0064' '\0' '\0' +-- LATIN CAPITAL LETTER E +foldMapping '\x0045' = CM '\x0065' '\0' '\0' +-- LATIN CAPITAL LETTER F +foldMapping '\x0046' = CM '\x0066' '\0' '\0' +-- LATIN CAPITAL LETTER G +foldMapping '\x0047' = CM '\x0067' '\0' '\0' +-- LATIN CAPITAL LETTER H +foldMapping '\x0048' = CM '\x0068' '\0' '\0' +-- LATIN CAPITAL LETTER I +foldMapping '\x0049' = CM '\x0069' '\0' '\0' +-- LATIN CAPITAL LETTER J +foldMapping '\x004A' = CM '\x006A' '\0' '\0' +-- LATIN CAPITAL LETTER K +foldMapping '\x004B' = CM '\x006B' '\0' '\0' +-- LATIN CAPITAL LETTER L +foldMapping '\x004C' = CM '\x006C' '\0' '\0' +-- LATIN CAPITAL LETTER M +foldMapping '\x004D' = CM '\x006D' '\0' '\0' +-- LATIN CAPITAL LETTER N +foldMapping '\x004E' = CM '\x006E' '\0' '\0' +-- LATIN CAPITAL LETTER O +foldMapping '\x004F' = CM '\x006F' '\0' '\0' +-- LATIN CAPITAL LETTER P +foldMapping '\x0050' = CM '\x0070' '\0' '\0' +-- LATIN CAPITAL LETTER Q +foldMapping '\x0051' = CM '\x0071' '\0' '\0' +-- LATIN CAPITAL LETTER R +foldMapping '\x0052' = CM '\x0072' '\0' '\0' +-- LATIN CAPITAL LETTER S +foldMapping '\x0053' = CM '\x0073' '\0' '\0' +-- LATIN CAPITAL LETTER T +foldMapping '\x0054' = CM '\x0074' '\0' '\0' +-- LATIN CAPITAL LETTER U +foldMapping '\x0055' = CM '\x0075' '\0' '\0' +-- LATIN CAPITAL LETTER V +foldMapping '\x0056' = CM '\x0076' '\0' '\0' +-- LATIN CAPITAL LETTER W +foldMapping '\x0057' = CM '\x0077' '\0' '\0' +-- LATIN CAPITAL LETTER X +foldMapping '\x0058' = CM '\x0078' '\0' '\0' +-- LATIN CAPITAL LETTER Y +foldMapping '\x0059' = CM '\x0079' '\0' '\0' +-- LATIN CAPITAL LETTER Z +foldMapping '\x005A' = CM '\x007A' '\0' '\0' +-- MICRO SIGN +foldMapping '\x00B5' = CM '\x03BC' '\0' '\0' +-- LATIN CAPITAL LETTER A WITH GRAVE +foldMapping '\x00C0' = CM '\x00E0' '\0' '\0' +-- LATIN CAPITAL LETTER A WITH ACUTE +foldMapping '\x00C1' = CM '\x00E1' '\0' '\0' +-- LATIN CAPITAL LETTER A WITH CIRCUMFLEX +foldMapping '\x00C2' = CM '\x00E2' '\0' '\0' +-- LATIN CAPITAL LETTER A WITH TILDE +foldMapping '\x00C3' = CM '\x00E3' '\0' '\0' +-- LATIN CAPITAL LETTER A WITH DIAERESIS +foldMapping '\x00C4' = CM '\x00E4' '\0' '\0' +-- LATIN CAPITAL LETTER A WITH RING ABOVE +foldMapping '\x00C5' = CM '\x00E5' '\0' '\0' +-- LATIN CAPITAL LETTER AE +foldMapping '\x00C6' = CM '\x00E6' '\0' '\0' +-- LATIN CAPITAL LETTER C WITH CEDILLA +foldMapping '\x00C7' = CM '\x00E7' '\0' '\0' +-- LATIN CAPITAL LETTER E WITH GRAVE +foldMapping '\x00C8' = CM '\x00E8' '\0' '\0' +-- LATIN CAPITAL LETTER E WITH ACUTE +foldMapping '\x00C9' = CM '\x00E9' '\0' '\0' +-- LATIN CAPITAL LETTER E WITH CIRCUMFLEX +foldMapping '\x00CA' = CM '\x00EA' '\0' '\0' +-- LATIN CAPITAL LETTER E WITH DIAERESIS +foldMapping '\x00CB' = CM '\x00EB' '\0' '\0' +-- LATIN CAPITAL LETTER I WITH GRAVE +foldMapping '\x00CC' = CM '\x00EC' '\0' '\0' +-- LATIN CAPITAL LETTER I WITH ACUTE +foldMapping '\x00CD' = CM '\x00ED' '\0' '\0' +-- LATIN CAPITAL LETTER I WITH CIRCUMFLEX +foldMapping '\x00CE' = CM '\x00EE' '\0' '\0' +-- LATIN CAPITAL LETTER I WITH DIAERESIS +foldMapping '\x00CF' = CM '\x00EF' '\0' '\0' +-- LATIN CAPITAL LETTER ETH +foldMapping '\x00D0' = CM '\x00F0' '\0' '\0' +-- LATIN CAPITAL LETTER N WITH TILDE +foldMapping '\x00D1' = CM '\x00F1' '\0' '\0' +-- LATIN CAPITAL LETTER O WITH GRAVE +foldMapping '\x00D2' = CM '\x00F2' '\0' '\0' +-- LATIN CAPITAL LETTER O WITH ACUTE +foldMapping '\x00D3' = CM '\x00F3' '\0' '\0' +-- LATIN CAPITAL LETTER O WITH CIRCUMFLEX +foldMapping '\x00D4' = CM '\x00F4' '\0' '\0' +-- LATIN CAPITAL LETTER O WITH TILDE +foldMapping '\x00D5' = CM '\x00F5' '\0' '\0' +-- LATIN CAPITAL LETTER O WITH DIAERESIS +foldMapping '\x00D6' = CM '\x00F6' '\0' '\0' +-- LATIN CAPITAL LETTER O WITH STROKE +foldMapping '\x00D8' = CM '\x00F8' '\0' '\0' +-- LATIN CAPITAL LETTER U WITH GRAVE +foldMapping '\x00D9' = CM '\x00F9' '\0' '\0' +-- LATIN CAPITAL LETTER U WITH ACUTE +foldMapping '\x00DA' = CM '\x00FA' '\0' '\0' +-- LATIN CAPITAL LETTER U WITH CIRCUMFLEX +foldMapping '\x00DB' = CM '\x00FB' '\0' '\0' +-- LATIN CAPITAL LETTER U WITH DIAERESIS +foldMapping '\x00DC' = CM '\x00FC' '\0' '\0' +-- LATIN CAPITAL LETTER Y WITH ACUTE +foldMapping '\x00DD' = CM '\x00FD' '\0' '\0' +-- LATIN CAPITAL LETTER THORN +foldMapping '\x00DE' = CM '\x00FE' '\0' '\0' +-- LATIN SMALL LETTER SHARP S +foldMapping '\x00DF' = CM '\x0073' '\x0073' '\0' +-- LATIN CAPITAL LETTER A WITH MACRON +foldMapping '\x0100' = CM '\x0101' '\0' '\0' +-- LATIN CAPITAL LETTER A WITH BREVE +foldMapping '\x0102' = CM '\x0103' '\0' '\0' +-- LATIN CAPITAL LETTER A WITH OGONEK +foldMapping '\x0104' = CM '\x0105' '\0' '\0' +-- LATIN CAPITAL LETTER C WITH ACUTE +foldMapping '\x0106' = CM '\x0107' '\0' '\0' +-- LATIN CAPITAL LETTER C WITH CIRCUMFLEX +foldMapping '\x0108' = CM '\x0109' '\0' '\0' +-- LATIN CAPITAL LETTER C WITH DOT ABOVE +foldMapping '\x010A' = CM '\x010B' '\0' '\0' +-- LATIN CAPITAL LETTER C WITH CARON +foldMapping '\x010C' = CM '\x010D' '\0' '\0' +-- LATIN CAPITAL LETTER D WITH CARON +foldMapping '\x010E' = CM '\x010F' '\0' '\0' +-- LATIN CAPITAL LETTER D WITH STROKE +foldMapping '\x0110' = CM '\x0111' '\0' '\0' +-- LATIN CAPITAL LETTER E WITH MACRON +foldMapping '\x0112' = CM '\x0113' '\0' '\0' +-- LATIN CAPITAL LETTER E WITH BREVE +foldMapping '\x0114' = CM '\x0115' '\0' '\0' +-- LATIN CAPITAL LETTER E WITH DOT ABOVE +foldMapping '\x0116' = CM '\x0117' '\0' '\0' +-- LATIN CAPITAL LETTER E WITH OGONEK +foldMapping '\x0118' = CM '\x0119' '\0' '\0' +-- LATIN CAPITAL LETTER E WITH CARON +foldMapping '\x011A' = CM '\x011B' '\0' '\0' +-- LATIN CAPITAL LETTER G WITH CIRCUMFLEX +foldMapping '\x011C' = CM '\x011D' '\0' '\0' +-- LATIN CAPITAL LETTER G WITH BREVE +foldMapping '\x011E' = CM '\x011F' '\0' '\0' +-- LATIN CAPITAL LETTER G WITH DOT ABOVE +foldMapping '\x0120' = CM '\x0121' '\0' '\0' +-- LATIN CAPITAL LETTER G WITH CEDILLA +foldMapping '\x0122' = CM '\x0123' '\0' '\0' +-- LATIN CAPITAL LETTER H WITH CIRCUMFLEX +foldMapping '\x0124' = CM '\x0125' '\0' '\0' +-- LATIN CAPITAL LETTER H WITH STROKE +foldMapping '\x0126' = CM '\x0127' '\0' '\0' +-- LATIN CAPITAL LETTER I WITH TILDE +foldMapping '\x0128' = CM '\x0129' '\0' '\0' +-- LATIN CAPITAL LETTER I WITH MACRON +foldMapping '\x012A' = CM '\x012B' '\0' '\0' +-- LATIN CAPITAL LETTER I WITH BREVE +foldMapping '\x012C' = CM '\x012D' '\0' '\0' +-- LATIN CAPITAL LETTER I WITH OGONEK +foldMapping '\x012E' = CM '\x012F' '\0' '\0' +-- LATIN CAPITAL LETTER I WITH DOT ABOVE +foldMapping '\x0130' = CM '\x0069' '\x0307' '\0' +-- LATIN CAPITAL LIGATURE IJ +foldMapping '\x0132' = CM '\x0133' '\0' '\0' +-- LATIN CAPITAL LETTER J WITH CIRCUMFLEX +foldMapping '\x0134' = CM '\x0135' '\0' '\0' +-- LATIN CAPITAL LETTER K WITH CEDILLA +foldMapping '\x0136' = CM '\x0137' '\0' '\0' +-- LATIN CAPITAL LETTER L WITH ACUTE +foldMapping '\x0139' = CM '\x013A' '\0' '\0' +-- LATIN CAPITAL LETTER L WITH CEDILLA +foldMapping '\x013B' = CM '\x013C' '\0' '\0' +-- LATIN CAPITAL LETTER L WITH CARON +foldMapping '\x013D' = CM '\x013E' '\0' '\0' +-- LATIN CAPITAL LETTER L WITH MIDDLE DOT +foldMapping '\x013F' = CM '\x0140' '\0' '\0' +-- LATIN CAPITAL LETTER L WITH STROKE +foldMapping '\x0141' = CM '\x0142' '\0' '\0' +-- LATIN CAPITAL LETTER N WITH ACUTE +foldMapping '\x0143' = CM '\x0144' '\0' '\0' +-- LATIN CAPITAL LETTER N WITH CEDILLA +foldMapping '\x0145' = CM '\x0146' '\0' '\0' +-- LATIN CAPITAL LETTER N WITH CARON +foldMapping '\x0147' = CM '\x0148' '\0' '\0' +-- LATIN SMALL LETTER N PRECEDED BY APOSTROPHE +foldMapping '\x0149' = CM '\x02BC' '\x006E' '\0' +-- LATIN CAPITAL LETTER ENG +foldMapping '\x014A' = CM '\x014B' '\0' '\0' +-- LATIN CAPITAL LETTER O WITH MACRON +foldMapping '\x014C' = CM '\x014D' '\0' '\0' +-- LATIN CAPITAL LETTER O WITH BREVE +foldMapping '\x014E' = CM '\x014F' '\0' '\0' +-- LATIN CAPITAL LETTER O WITH DOUBLE ACUTE +foldMapping '\x0150' = CM '\x0151' '\0' '\0' +-- LATIN CAPITAL LIGATURE OE +foldMapping '\x0152' = CM '\x0153' '\0' '\0' +-- LATIN CAPITAL LETTER R WITH ACUTE +foldMapping '\x0154' = CM '\x0155' '\0' '\0' +-- LATIN CAPITAL LETTER R WITH CEDILLA +foldMapping '\x0156' = CM '\x0157' '\0' '\0' +-- LATIN CAPITAL LETTER R WITH CARON +foldMapping '\x0158' = CM '\x0159' '\0' '\0' +-- LATIN CAPITAL LETTER S WITH ACUTE +foldMapping '\x015A' = CM '\x015B' '\0' '\0' +-- LATIN CAPITAL LETTER S WITH CIRCUMFLEX +foldMapping '\x015C' = CM '\x015D' '\0' '\0' +-- LATIN CAPITAL LETTER S WITH CEDILLA +foldMapping '\x015E' = CM '\x015F' '\0' '\0' +-- LATIN CAPITAL LETTER S WITH CARON +foldMapping '\x0160' = CM '\x0161' '\0' '\0' +-- LATIN CAPITAL LETTER T WITH CEDILLA +foldMapping '\x0162' = CM '\x0163' '\0' '\0' +-- LATIN CAPITAL LETTER T WITH CARON +foldMapping '\x0164' = CM '\x0165' '\0' '\0' +-- LATIN CAPITAL LETTER T WITH STROKE +foldMapping '\x0166' = CM '\x0167' '\0' '\0' +-- LATIN CAPITAL LETTER U WITH TILDE +foldMapping '\x0168' = CM '\x0169' '\0' '\0' +-- LATIN CAPITAL LETTER U WITH MACRON +foldMapping '\x016A' = CM '\x016B' '\0' '\0' +-- LATIN CAPITAL LETTER U WITH BREVE +foldMapping '\x016C' = CM '\x016D' '\0' '\0' +-- LATIN CAPITAL LETTER U WITH RING ABOVE +foldMapping '\x016E' = CM '\x016F' '\0' '\0' +-- LATIN CAPITAL LETTER U WITH DOUBLE ACUTE +foldMapping '\x0170' = CM '\x0171' '\0' '\0' +-- LATIN CAPITAL LETTER U WITH OGONEK +foldMapping '\x0172' = CM '\x0173' '\0' '\0' +-- LATIN CAPITAL LETTER W WITH CIRCUMFLEX +foldMapping '\x0174' = CM '\x0175' '\0' '\0' +-- LATIN CAPITAL LETTER Y WITH CIRCUMFLEX +foldMapping '\x0176' = CM '\x0177' '\0' '\0' +-- LATIN CAPITAL LETTER Y WITH DIAERESIS +foldMapping '\x0178' = CM '\x00FF' '\0' '\0' +-- LATIN CAPITAL LETTER Z WITH ACUTE +foldMapping '\x0179' = CM '\x017A' '\0' '\0' +-- LATIN CAPITAL LETTER Z WITH DOT ABOVE +foldMapping '\x017B' = CM '\x017C' '\0' '\0' +-- LATIN CAPITAL LETTER Z WITH CARON +foldMapping '\x017D' = CM '\x017E' '\0' '\0' +-- LATIN SMALL LETTER LONG S +foldMapping '\x017F' = CM '\x0073' '\0' '\0' +-- LATIN CAPITAL LETTER B WITH HOOK +foldMapping '\x0181' = CM '\x0253' '\0' '\0' +-- LATIN CAPITAL LETTER B WITH TOPBAR +foldMapping '\x0182' = CM '\x0183' '\0' '\0' +-- LATIN CAPITAL LETTER TONE SIX +foldMapping '\x0184' = CM '\x0185' '\0' '\0' +-- LATIN CAPITAL LETTER OPEN O +foldMapping '\x0186' = CM '\x0254' '\0' '\0' +-- LATIN CAPITAL LETTER C WITH HOOK +foldMapping '\x0187' = CM '\x0188' '\0' '\0' +-- LATIN CAPITAL LETTER AFRICAN D +foldMapping '\x0189' = CM '\x0256' '\0' '\0' +-- LATIN CAPITAL LETTER D WITH HOOK +foldMapping '\x018A' = CM '\x0257' '\0' '\0' +-- LATIN CAPITAL LETTER D WITH TOPBAR +foldMapping '\x018B' = CM '\x018C' '\0' '\0' +-- LATIN CAPITAL LETTER REVERSED E +foldMapping '\x018E' = CM '\x01DD' '\0' '\0' +-- LATIN CAPITAL LETTER SCHWA +foldMapping '\x018F' = CM '\x0259' '\0' '\0' +-- LATIN CAPITAL LETTER OPEN E +foldMapping '\x0190' = CM '\x025B' '\0' '\0' +-- LATIN CAPITAL LETTER F WITH HOOK +foldMapping '\x0191' = CM '\x0192' '\0' '\0' +-- LATIN CAPITAL LETTER G WITH HOOK +foldMapping '\x0193' = CM '\x0260' '\0' '\0' +-- LATIN CAPITAL LETTER GAMMA +foldMapping '\x0194' = CM '\x0263' '\0' '\0' +-- LATIN CAPITAL LETTER IOTA +foldMapping '\x0196' = CM '\x0269' '\0' '\0' +-- LATIN CAPITAL LETTER I WITH STROKE +foldMapping '\x0197' = CM '\x0268' '\0' '\0' +-- LATIN CAPITAL LETTER K WITH HOOK +foldMapping '\x0198' = CM '\x0199' '\0' '\0' +-- LATIN CAPITAL LETTER TURNED M +foldMapping '\x019C' = CM '\x026F' '\0' '\0' +-- LATIN CAPITAL LETTER N WITH LEFT HOOK +foldMapping '\x019D' = CM '\x0272' '\0' '\0' +-- LATIN CAPITAL LETTER O WITH MIDDLE TILDE +foldMapping '\x019F' = CM '\x0275' '\0' '\0' +-- LATIN CAPITAL LETTER O WITH HORN +foldMapping '\x01A0' = CM '\x01A1' '\0' '\0' +-- LATIN CAPITAL LETTER OI +foldMapping '\x01A2' = CM '\x01A3' '\0' '\0' +-- LATIN CAPITAL LETTER P WITH HOOK +foldMapping '\x01A4' = CM '\x01A5' '\0' '\0' +-- LATIN LETTER YR +foldMapping '\x01A6' = CM '\x0280' '\0' '\0' +-- LATIN CAPITAL LETTER TONE TWO +foldMapping '\x01A7' = CM '\x01A8' '\0' '\0' +-- LATIN CAPITAL LETTER ESH +foldMapping '\x01A9' = CM '\x0283' '\0' '\0' +-- LATIN CAPITAL LETTER T WITH HOOK +foldMapping '\x01AC' = CM '\x01AD' '\0' '\0' +-- LATIN CAPITAL LETTER T WITH RETROFLEX HOOK +foldMapping '\x01AE' = CM '\x0288' '\0' '\0' +-- LATIN CAPITAL LETTER U WITH HORN +foldMapping '\x01AF' = CM '\x01B0' '\0' '\0' +-- LATIN CAPITAL LETTER UPSILON +foldMapping '\x01B1' = CM '\x028A' '\0' '\0' +-- LATIN CAPITAL LETTER V WITH HOOK +foldMapping '\x01B2' = CM '\x028B' '\0' '\0' +-- LATIN CAPITAL LETTER Y WITH HOOK +foldMapping '\x01B3' = CM '\x01B4' '\0' '\0' +-- LATIN CAPITAL LETTER Z WITH STROKE +foldMapping '\x01B5' = CM '\x01B6' '\0' '\0' +-- LATIN CAPITAL LETTER EZH +foldMapping '\x01B7' = CM '\x0292' '\0' '\0' +-- LATIN CAPITAL LETTER EZH REVERSED +foldMapping '\x01B8' = CM '\x01B9' '\0' '\0' +-- LATIN CAPITAL LETTER TONE FIVE +foldMapping '\x01BC' = CM '\x01BD' '\0' '\0' +-- LATIN CAPITAL LETTER DZ WITH CARON +foldMapping '\x01C4' = CM '\x01C6' '\0' '\0' +-- LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON +foldMapping '\x01C5' = CM '\x01C6' '\0' '\0' +-- LATIN CAPITAL LETTER LJ +foldMapping '\x01C7' = CM '\x01C9' '\0' '\0' +-- LATIN CAPITAL LETTER L WITH SMALL LETTER J +foldMapping '\x01C8' = CM '\x01C9' '\0' '\0' +-- LATIN CAPITAL LETTER NJ +foldMapping '\x01CA' = CM '\x01CC' '\0' '\0' +-- LATIN CAPITAL LETTER N WITH SMALL LETTER J +foldMapping '\x01CB' = CM '\x01CC' '\0' '\0' +-- LATIN CAPITAL LETTER A WITH CARON +foldMapping '\x01CD' = CM '\x01CE' '\0' '\0' +-- LATIN CAPITAL LETTER I WITH CARON +foldMapping '\x01CF' = CM '\x01D0' '\0' '\0' +-- LATIN CAPITAL LETTER O WITH CARON +foldMapping '\x01D1' = CM '\x01D2' '\0' '\0' +-- LATIN CAPITAL LETTER U WITH CARON +foldMapping '\x01D3' = CM '\x01D4' '\0' '\0' +-- LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON +foldMapping '\x01D5' = CM '\x01D6' '\0' '\0' +-- LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE +foldMapping '\x01D7' = CM '\x01D8' '\0' '\0' +-- LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON +foldMapping '\x01D9' = CM '\x01DA' '\0' '\0' +-- LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE +foldMapping '\x01DB' = CM '\x01DC' '\0' '\0' +-- LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON +foldMapping '\x01DE' = CM '\x01DF' '\0' '\0' +-- LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON +foldMapping '\x01E0' = CM '\x01E1' '\0' '\0' +-- LATIN CAPITAL LETTER AE WITH MACRON +foldMapping '\x01E2' = CM '\x01E3' '\0' '\0' +-- LATIN CAPITAL LETTER G WITH STROKE +foldMapping '\x01E4' = CM '\x01E5' '\0' '\0' +-- LATIN CAPITAL LETTER G WITH CARON +foldMapping '\x01E6' = CM '\x01E7' '\0' '\0' +-- LATIN CAPITAL LETTER K WITH CARON +foldMapping '\x01E8' = CM '\x01E9' '\0' '\0' +-- LATIN CAPITAL LETTER O WITH OGONEK +foldMapping '\x01EA' = CM '\x01EB' '\0' '\0' +-- LATIN CAPITAL LETTER O WITH OGONEK AND MACRON +foldMapping '\x01EC' = CM '\x01ED' '\0' '\0' +-- LATIN CAPITAL LETTER EZH WITH CARON +foldMapping '\x01EE' = CM '\x01EF' '\0' '\0' +-- LATIN SMALL LETTER J WITH CARON +foldMapping '\x01F0' = CM '\x006A' '\x030C' '\0' +-- LATIN CAPITAL LETTER DZ +foldMapping '\x01F1' = CM '\x01F3' '\0' '\0' +-- LATIN CAPITAL LETTER D WITH SMALL LETTER Z +foldMapping '\x01F2' = CM '\x01F3' '\0' '\0' +-- LATIN CAPITAL LETTER G WITH ACUTE +foldMapping '\x01F4' = CM '\x01F5' '\0' '\0' +-- LATIN CAPITAL LETTER HWAIR +foldMapping '\x01F6' = CM '\x0195' '\0' '\0' +-- LATIN CAPITAL LETTER WYNN +foldMapping '\x01F7' = CM '\x01BF' '\0' '\0' +-- LATIN CAPITAL LETTER N WITH GRAVE +foldMapping '\x01F8' = CM '\x01F9' '\0' '\0' +-- LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE +foldMapping '\x01FA' = CM '\x01FB' '\0' '\0' +-- LATIN CAPITAL LETTER AE WITH ACUTE +foldMapping '\x01FC' = CM '\x01FD' '\0' '\0' +-- LATIN CAPITAL LETTER O WITH STROKE AND ACUTE +foldMapping '\x01FE' = CM '\x01FF' '\0' '\0' +-- LATIN CAPITAL LETTER A WITH DOUBLE GRAVE +foldMapping '\x0200' = CM '\x0201' '\0' '\0' +-- LATIN CAPITAL LETTER A WITH INVERTED BREVE +foldMapping '\x0202' = CM '\x0203' '\0' '\0' +-- LATIN CAPITAL LETTER E WITH DOUBLE GRAVE +foldMapping '\x0204' = CM '\x0205' '\0' '\0' +-- LATIN CAPITAL LETTER E WITH INVERTED BREVE +foldMapping '\x0206' = CM '\x0207' '\0' '\0' +-- LATIN CAPITAL LETTER I WITH DOUBLE GRAVE +foldMapping '\x0208' = CM '\x0209' '\0' '\0' +-- LATIN CAPITAL LETTER I WITH INVERTED BREVE +foldMapping '\x020A' = CM '\x020B' '\0' '\0' +-- LATIN CAPITAL LETTER O WITH DOUBLE GRAVE +foldMapping '\x020C' = CM '\x020D' '\0' '\0' +-- LATIN CAPITAL LETTER O WITH INVERTED BREVE +foldMapping '\x020E' = CM '\x020F' '\0' '\0' +-- LATIN CAPITAL LETTER R WITH DOUBLE GRAVE +foldMapping '\x0210' = CM '\x0211' '\0' '\0' +-- LATIN CAPITAL LETTER R WITH INVERTED BREVE +foldMapping '\x0212' = CM '\x0213' '\0' '\0' +-- LATIN CAPITAL LETTER U WITH DOUBLE GRAVE +foldMapping '\x0214' = CM '\x0215' '\0' '\0' +-- LATIN CAPITAL LETTER U WITH INVERTED BREVE +foldMapping '\x0216' = CM '\x0217' '\0' '\0' +-- LATIN CAPITAL LETTER S WITH COMMA BELOW +foldMapping '\x0218' = CM '\x0219' '\0' '\0' +-- LATIN CAPITAL LETTER T WITH COMMA BELOW +foldMapping '\x021A' = CM '\x021B' '\0' '\0' +-- LATIN CAPITAL LETTER YOGH +foldMapping '\x021C' = CM '\x021D' '\0' '\0' +-- LATIN CAPITAL LETTER H WITH CARON +foldMapping '\x021E' = CM '\x021F' '\0' '\0' +-- LATIN CAPITAL LETTER N WITH LONG RIGHT LEG +foldMapping '\x0220' = CM '\x019E' '\0' '\0' +-- LATIN CAPITAL LETTER OU +foldMapping '\x0222' = CM '\x0223' '\0' '\0' +-- LATIN CAPITAL LETTER Z WITH HOOK +foldMapping '\x0224' = CM '\x0225' '\0' '\0' +-- LATIN CAPITAL LETTER A WITH DOT ABOVE +foldMapping '\x0226' = CM '\x0227' '\0' '\0' +-- LATIN CAPITAL LETTER E WITH CEDILLA +foldMapping '\x0228' = CM '\x0229' '\0' '\0' +-- LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON +foldMapping '\x022A' = CM '\x022B' '\0' '\0' +-- LATIN CAPITAL LETTER O WITH TILDE AND MACRON +foldMapping '\x022C' = CM '\x022D' '\0' '\0' +-- LATIN CAPITAL LETTER O WITH DOT ABOVE +foldMapping '\x022E' = CM '\x022F' '\0' '\0' +-- LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON +foldMapping '\x0230' = CM '\x0231' '\0' '\0' +-- LATIN CAPITAL LETTER Y WITH MACRON +foldMapping '\x0232' = CM '\x0233' '\0' '\0' +-- LATIN CAPITAL LETTER A WITH STROKE +foldMapping '\x023A' = CM '\x2C65' '\0' '\0' +-- LATIN CAPITAL LETTER C WITH STROKE +foldMapping '\x023B' = CM '\x023C' '\0' '\0' +-- LATIN CAPITAL LETTER L WITH BAR +foldMapping '\x023D' = CM '\x019A' '\0' '\0' +-- LATIN CAPITAL LETTER T WITH DIAGONAL STROKE +foldMapping '\x023E' = CM '\x2C66' '\0' '\0' +-- LATIN CAPITAL LETTER GLOTTAL STOP +foldMapping '\x0241' = CM '\x0242' '\0' '\0' +-- LATIN CAPITAL LETTER B WITH STROKE +foldMapping '\x0243' = CM '\x0180' '\0' '\0' +-- LATIN CAPITAL LETTER U BAR +foldMapping '\x0244' = CM '\x0289' '\0' '\0' +-- LATIN CAPITAL LETTER TURNED V +foldMapping '\x0245' = CM '\x028C' '\0' '\0' +-- LATIN CAPITAL LETTER E WITH STROKE +foldMapping '\x0246' = CM '\x0247' '\0' '\0' +-- LATIN CAPITAL LETTER J WITH STROKE +foldMapping '\x0248' = CM '\x0249' '\0' '\0' +-- LATIN CAPITAL LETTER SMALL Q WITH HOOK TAIL +foldMapping '\x024A' = CM '\x024B' '\0' '\0' +-- LATIN CAPITAL LETTER R WITH STROKE +foldMapping '\x024C' = CM '\x024D' '\0' '\0' +-- LATIN CAPITAL LETTER Y WITH STROKE +foldMapping '\x024E' = CM '\x024F' '\0' '\0' +-- COMBINING GREEK YPOGEGRAMMENI +foldMapping '\x0345' = CM '\x03B9' '\0' '\0' +-- GREEK CAPITAL LETTER HETA +foldMapping '\x0370' = CM '\x0371' '\0' '\0' +-- GREEK CAPITAL LETTER ARCHAIC SAMPI +foldMapping '\x0372' = CM '\x0373' '\0' '\0' +-- GREEK CAPITAL LETTER PAMPHYLIAN DIGAMMA +foldMapping '\x0376' = CM '\x0377' '\0' '\0' +-- GREEK CAPITAL LETTER YOT +foldMapping '\x037F' = CM '\x03F3' '\0' '\0' +-- GREEK CAPITAL LETTER ALPHA WITH TONOS +foldMapping '\x0386' = CM '\x03AC' '\0' '\0' +-- GREEK CAPITAL LETTER EPSILON WITH TONOS +foldMapping '\x0388' = CM '\x03AD' '\0' '\0' +-- GREEK CAPITAL LETTER ETA WITH TONOS +foldMapping '\x0389' = CM '\x03AE' '\0' '\0' +-- GREEK CAPITAL LETTER IOTA WITH TONOS +foldMapping '\x038A' = CM '\x03AF' '\0' '\0' +-- GREEK CAPITAL LETTER OMICRON WITH TONOS +foldMapping '\x038C' = CM '\x03CC' '\0' '\0' +-- GREEK CAPITAL LETTER UPSILON WITH TONOS +foldMapping '\x038E' = CM '\x03CD' '\0' '\0' +-- GREEK CAPITAL LETTER OMEGA WITH TONOS +foldMapping '\x038F' = CM '\x03CE' '\0' '\0' +-- GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS +foldMapping '\x0390' = CM '\x03B9' '\x0308' '\x0301' +-- GREEK CAPITAL LETTER ALPHA +foldMapping '\x0391' = CM '\x03B1' '\0' '\0' +-- GREEK CAPITAL LETTER BETA +foldMapping '\x0392' = CM '\x03B2' '\0' '\0' +-- GREEK CAPITAL LETTER GAMMA +foldMapping '\x0393' = CM '\x03B3' '\0' '\0' +-- GREEK CAPITAL LETTER DELTA +foldMapping '\x0394' = CM '\x03B4' '\0' '\0' +-- GREEK CAPITAL LETTER EPSILON +foldMapping '\x0395' = CM '\x03B5' '\0' '\0' +-- GREEK CAPITAL LETTER ZETA +foldMapping '\x0396' = CM '\x03B6' '\0' '\0' +-- GREEK CAPITAL LETTER ETA +foldMapping '\x0397' = CM '\x03B7' '\0' '\0' +-- GREEK CAPITAL LETTER THETA +foldMapping '\x0398' = CM '\x03B8' '\0' '\0' +-- GREEK CAPITAL LETTER IOTA +foldMapping '\x0399' = CM '\x03B9' '\0' '\0' +-- GREEK CAPITAL LETTER KAPPA +foldMapping '\x039A' = CM '\x03BA' '\0' '\0' +-- GREEK CAPITAL LETTER LAMDA +foldMapping '\x039B' = CM '\x03BB' '\0' '\0' +-- GREEK CAPITAL LETTER MU +foldMapping '\x039C' = CM '\x03BC' '\0' '\0' +-- GREEK CAPITAL LETTER NU +foldMapping '\x039D' = CM '\x03BD' '\0' '\0' +-- GREEK CAPITAL LETTER XI +foldMapping '\x039E' = CM '\x03BE' '\0' '\0' +-- GREEK CAPITAL LETTER OMICRON +foldMapping '\x039F' = CM '\x03BF' '\0' '\0' +-- GREEK CAPITAL LETTER PI +foldMapping '\x03A0' = CM '\x03C0' '\0' '\0' +-- GREEK CAPITAL LETTER RHO +foldMapping '\x03A1' = CM '\x03C1' '\0' '\0' +-- GREEK CAPITAL LETTER SIGMA +foldMapping '\x03A3' = CM '\x03C3' '\0' '\0' +-- GREEK CAPITAL LETTER TAU +foldMapping '\x03A4' = CM '\x03C4' '\0' '\0' +-- GREEK CAPITAL LETTER UPSILON +foldMapping '\x03A5' = CM '\x03C5' '\0' '\0' +-- GREEK CAPITAL LETTER PHI +foldMapping '\x03A6' = CM '\x03C6' '\0' '\0' +-- GREEK CAPITAL LETTER CHI +foldMapping '\x03A7' = CM '\x03C7' '\0' '\0' +-- GREEK CAPITAL LETTER PSI +foldMapping '\x03A8' = CM '\x03C8' '\0' '\0' +-- GREEK CAPITAL LETTER OMEGA +foldMapping '\x03A9' = CM '\x03C9' '\0' '\0' +-- GREEK CAPITAL LETTER IOTA WITH DIALYTIKA +foldMapping '\x03AA' = CM '\x03CA' '\0' '\0' +-- GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA +foldMapping '\x03AB' = CM '\x03CB' '\0' '\0' +-- GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS +foldMapping '\x03B0' = CM '\x03C5' '\x0308' '\x0301' +-- GREEK SMALL LETTER FINAL SIGMA +foldMapping '\x03C2' = CM '\x03C3' '\0' '\0' +-- GREEK CAPITAL KAI SYMBOL +foldMapping '\x03CF' = CM '\x03D7' '\0' '\0' +-- GREEK BETA SYMBOL +foldMapping '\x03D0' = CM '\x03B2' '\0' '\0' +-- GREEK THETA SYMBOL +foldMapping '\x03D1' = CM '\x03B8' '\0' '\0' +-- GREEK PHI SYMBOL +foldMapping '\x03D5' = CM '\x03C6' '\0' '\0' +-- GREEK PI SYMBOL +foldMapping '\x03D6' = CM '\x03C0' '\0' '\0' +-- GREEK LETTER ARCHAIC KOPPA +foldMapping '\x03D8' = CM '\x03D9' '\0' '\0' +-- GREEK LETTER STIGMA +foldMapping '\x03DA' = CM '\x03DB' '\0' '\0' +-- GREEK LETTER DIGAMMA +foldMapping '\x03DC' = CM '\x03DD' '\0' '\0' +-- GREEK LETTER KOPPA +foldMapping '\x03DE' = CM '\x03DF' '\0' '\0' +-- GREEK LETTER SAMPI +foldMapping '\x03E0' = CM '\x03E1' '\0' '\0' +-- COPTIC CAPITAL LETTER SHEI +foldMapping '\x03E2' = CM '\x03E3' '\0' '\0' +-- COPTIC CAPITAL LETTER FEI +foldMapping '\x03E4' = CM '\x03E5' '\0' '\0' +-- COPTIC CAPITAL LETTER KHEI +foldMapping '\x03E6' = CM '\x03E7' '\0' '\0' +-- COPTIC CAPITAL LETTER HORI +foldMapping '\x03E8' = CM '\x03E9' '\0' '\0' +-- COPTIC CAPITAL LETTER GANGIA +foldMapping '\x03EA' = CM '\x03EB' '\0' '\0' +-- COPTIC CAPITAL LETTER SHIMA +foldMapping '\x03EC' = CM '\x03ED' '\0' '\0' +-- COPTIC CAPITAL LETTER DEI +foldMapping '\x03EE' = CM '\x03EF' '\0' '\0' +-- GREEK KAPPA SYMBOL +foldMapping '\x03F0' = CM '\x03BA' '\0' '\0' +-- GREEK RHO SYMBOL +foldMapping '\x03F1' = CM '\x03C1' '\0' '\0' +-- GREEK CAPITAL THETA SYMBOL +foldMapping '\x03F4' = CM '\x03B8' '\0' '\0' +-- GREEK LUNATE EPSILON SYMBOL +foldMapping '\x03F5' = CM '\x03B5' '\0' '\0' +-- GREEK CAPITAL LETTER SHO +foldMapping '\x03F7' = CM '\x03F8' '\0' '\0' +-- GREEK CAPITAL LUNATE SIGMA SYMBOL +foldMapping '\x03F9' = CM '\x03F2' '\0' '\0' +-- GREEK CAPITAL LETTER SAN +foldMapping '\x03FA' = CM '\x03FB' '\0' '\0' +-- GREEK CAPITAL REVERSED LUNATE SIGMA SYMBOL +foldMapping '\x03FD' = CM '\x037B' '\0' '\0' +-- GREEK CAPITAL DOTTED LUNATE SIGMA SYMBOL +foldMapping '\x03FE' = CM '\x037C' '\0' '\0' +-- GREEK CAPITAL REVERSED DOTTED LUNATE SIGMA SYMBOL +foldMapping '\x03FF' = CM '\x037D' '\0' '\0' +-- CYRILLIC CAPITAL LETTER IE WITH GRAVE +foldMapping '\x0400' = CM '\x0450' '\0' '\0' +-- CYRILLIC CAPITAL LETTER IO +foldMapping '\x0401' = CM '\x0451' '\0' '\0' +-- CYRILLIC CAPITAL LETTER DJE +foldMapping '\x0402' = CM '\x0452' '\0' '\0' +-- CYRILLIC CAPITAL LETTER GJE +foldMapping '\x0403' = CM '\x0453' '\0' '\0' +-- CYRILLIC CAPITAL LETTER UKRAINIAN IE +foldMapping '\x0404' = CM '\x0454' '\0' '\0' +-- CYRILLIC CAPITAL LETTER DZE +foldMapping '\x0405' = CM '\x0455' '\0' '\0' +-- CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I +foldMapping '\x0406' = CM '\x0456' '\0' '\0' +-- CYRILLIC CAPITAL LETTER YI +foldMapping '\x0407' = CM '\x0457' '\0' '\0' +-- CYRILLIC CAPITAL LETTER JE +foldMapping '\x0408' = CM '\x0458' '\0' '\0' +-- CYRILLIC CAPITAL LETTER LJE +foldMapping '\x0409' = CM '\x0459' '\0' '\0' +-- CYRILLIC CAPITAL LETTER NJE +foldMapping '\x040A' = CM '\x045A' '\0' '\0' +-- CYRILLIC CAPITAL LETTER TSHE +foldMapping '\x040B' = CM '\x045B' '\0' '\0' +-- CYRILLIC CAPITAL LETTER KJE +foldMapping '\x040C' = CM '\x045C' '\0' '\0' +-- CYRILLIC CAPITAL LETTER I WITH GRAVE +foldMapping '\x040D' = CM '\x045D' '\0' '\0' +-- CYRILLIC CAPITAL LETTER SHORT U +foldMapping '\x040E' = CM '\x045E' '\0' '\0' +-- CYRILLIC CAPITAL LETTER DZHE +foldMapping '\x040F' = CM '\x045F' '\0' '\0' +-- CYRILLIC CAPITAL LETTER A +foldMapping '\x0410' = CM '\x0430' '\0' '\0' +-- CYRILLIC CAPITAL LETTER BE +foldMapping '\x0411' = CM '\x0431' '\0' '\0' +-- CYRILLIC CAPITAL LETTER VE +foldMapping '\x0412' = CM '\x0432' '\0' '\0' +-- CYRILLIC CAPITAL LETTER GHE +foldMapping '\x0413' = CM '\x0433' '\0' '\0' +-- CYRILLIC CAPITAL LETTER DE +foldMapping '\x0414' = CM '\x0434' '\0' '\0' +-- CYRILLIC CAPITAL LETTER IE +foldMapping '\x0415' = CM '\x0435' '\0' '\0' +-- CYRILLIC CAPITAL LETTER ZHE +foldMapping '\x0416' = CM '\x0436' '\0' '\0' +-- CYRILLIC CAPITAL LETTER ZE +foldMapping '\x0417' = CM '\x0437' '\0' '\0' +-- CYRILLIC CAPITAL LETTER I +foldMapping '\x0418' = CM '\x0438' '\0' '\0' +-- CYRILLIC CAPITAL LETTER SHORT I +foldMapping '\x0419' = CM '\x0439' '\0' '\0' +-- CYRILLIC CAPITAL LETTER KA +foldMapping '\x041A' = CM '\x043A' '\0' '\0' +-- CYRILLIC CAPITAL LETTER EL +foldMapping '\x041B' = CM '\x043B' '\0' '\0' +-- CYRILLIC CAPITAL LETTER EM +foldMapping '\x041C' = CM '\x043C' '\0' '\0' +-- CYRILLIC CAPITAL LETTER EN +foldMapping '\x041D' = CM '\x043D' '\0' '\0' +-- CYRILLIC CAPITAL LETTER O +foldMapping '\x041E' = CM '\x043E' '\0' '\0' +-- CYRILLIC CAPITAL LETTER PE +foldMapping '\x041F' = CM '\x043F' '\0' '\0' +-- CYRILLIC CAPITAL LETTER ER +foldMapping '\x0420' = CM '\x0440' '\0' '\0' +-- CYRILLIC CAPITAL LETTER ES +foldMapping '\x0421' = CM '\x0441' '\0' '\0' +-- CYRILLIC CAPITAL LETTER TE +foldMapping '\x0422' = CM '\x0442' '\0' '\0' +-- CYRILLIC CAPITAL LETTER U +foldMapping '\x0423' = CM '\x0443' '\0' '\0' +-- CYRILLIC CAPITAL LETTER EF +foldMapping '\x0424' = CM '\x0444' '\0' '\0' +-- CYRILLIC CAPITAL LETTER HA +foldMapping '\x0425' = CM '\x0445' '\0' '\0' +-- CYRILLIC CAPITAL LETTER TSE +foldMapping '\x0426' = CM '\x0446' '\0' '\0' +-- CYRILLIC CAPITAL LETTER CHE +foldMapping '\x0427' = CM '\x0447' '\0' '\0' +-- CYRILLIC CAPITAL LETTER SHA +foldMapping '\x0428' = CM '\x0448' '\0' '\0' +-- CYRILLIC CAPITAL LETTER SHCHA +foldMapping '\x0429' = CM '\x0449' '\0' '\0' +-- CYRILLIC CAPITAL LETTER HARD SIGN +foldMapping '\x042A' = CM '\x044A' '\0' '\0' +-- CYRILLIC CAPITAL LETTER YERU +foldMapping '\x042B' = CM '\x044B' '\0' '\0' +-- CYRILLIC CAPITAL LETTER SOFT SIGN +foldMapping '\x042C' = CM '\x044C' '\0' '\0' +-- CYRILLIC CAPITAL LETTER E +foldMapping '\x042D' = CM '\x044D' '\0' '\0' +-- CYRILLIC CAPITAL LETTER YU +foldMapping '\x042E' = CM '\x044E' '\0' '\0' +-- CYRILLIC CAPITAL LETTER YA +foldMapping '\x042F' = CM '\x044F' '\0' '\0' +-- CYRILLIC CAPITAL LETTER OMEGA +foldMapping '\x0460' = CM '\x0461' '\0' '\0' +-- CYRILLIC CAPITAL LETTER YAT +foldMapping '\x0462' = CM '\x0463' '\0' '\0' +-- CYRILLIC CAPITAL LETTER IOTIFIED E +foldMapping '\x0464' = CM '\x0465' '\0' '\0' +-- CYRILLIC CAPITAL LETTER LITTLE YUS +foldMapping '\x0466' = CM '\x0467' '\0' '\0' +-- CYRILLIC CAPITAL LETTER IOTIFIED LITTLE YUS +foldMapping '\x0468' = CM '\x0469' '\0' '\0' +-- CYRILLIC CAPITAL LETTER BIG YUS +foldMapping '\x046A' = CM '\x046B' '\0' '\0' +-- CYRILLIC CAPITAL LETTER IOTIFIED BIG YUS +foldMapping '\x046C' = CM '\x046D' '\0' '\0' +-- CYRILLIC CAPITAL LETTER KSI +foldMapping '\x046E' = CM '\x046F' '\0' '\0' +-- CYRILLIC CAPITAL LETTER PSI +foldMapping '\x0470' = CM '\x0471' '\0' '\0' +-- CYRILLIC CAPITAL LETTER FITA +foldMapping '\x0472' = CM '\x0473' '\0' '\0' +-- CYRILLIC CAPITAL LETTER IZHITSA +foldMapping '\x0474' = CM '\x0475' '\0' '\0' +-- CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT +foldMapping '\x0476' = CM '\x0477' '\0' '\0' +-- CYRILLIC CAPITAL LETTER UK +foldMapping '\x0478' = CM '\x0479' '\0' '\0' +-- CYRILLIC CAPITAL LETTER ROUND OMEGA +foldMapping '\x047A' = CM '\x047B' '\0' '\0' +-- CYRILLIC CAPITAL LETTER OMEGA WITH TITLO +foldMapping '\x047C' = CM '\x047D' '\0' '\0' +-- CYRILLIC CAPITAL LETTER OT +foldMapping '\x047E' = CM '\x047F' '\0' '\0' +-- CYRILLIC CAPITAL LETTER KOPPA +foldMapping '\x0480' = CM '\x0481' '\0' '\0' +-- CYRILLIC CAPITAL LETTER SHORT I WITH TAIL +foldMapping '\x048A' = CM '\x048B' '\0' '\0' +-- CYRILLIC CAPITAL LETTER SEMISOFT SIGN +foldMapping '\x048C' = CM '\x048D' '\0' '\0' +-- CYRILLIC CAPITAL LETTER ER WITH TICK +foldMapping '\x048E' = CM '\x048F' '\0' '\0' +-- CYRILLIC CAPITAL LETTER GHE WITH UPTURN +foldMapping '\x0490' = CM '\x0491' '\0' '\0' +-- CYRILLIC CAPITAL LETTER GHE WITH STROKE +foldMapping '\x0492' = CM '\x0493' '\0' '\0' +-- CYRILLIC CAPITAL LETTER GHE WITH MIDDLE HOOK +foldMapping '\x0494' = CM '\x0495' '\0' '\0' +-- CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER +foldMapping '\x0496' = CM '\x0497' '\0' '\0' +-- CYRILLIC CAPITAL LETTER ZE WITH DESCENDER +foldMapping '\x0498' = CM '\x0499' '\0' '\0' +-- CYRILLIC CAPITAL LETTER KA WITH DESCENDER +foldMapping '\x049A' = CM '\x049B' '\0' '\0' +-- CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE +foldMapping '\x049C' = CM '\x049D' '\0' '\0' +-- CYRILLIC CAPITAL LETTER KA WITH STROKE +foldMapping '\x049E' = CM '\x049F' '\0' '\0' +-- CYRILLIC CAPITAL LETTER BASHKIR KA +foldMapping '\x04A0' = CM '\x04A1' '\0' '\0' +-- CYRILLIC CAPITAL LETTER EN WITH DESCENDER +foldMapping '\x04A2' = CM '\x04A3' '\0' '\0' +-- CYRILLIC CAPITAL LIGATURE EN GHE +foldMapping '\x04A4' = CM '\x04A5' '\0' '\0' +-- CYRILLIC CAPITAL LETTER PE WITH MIDDLE HOOK +foldMapping '\x04A6' = CM '\x04A7' '\0' '\0' +-- CYRILLIC CAPITAL LETTER ABKHASIAN HA +foldMapping '\x04A8' = CM '\x04A9' '\0' '\0' +-- CYRILLIC CAPITAL LETTER ES WITH DESCENDER +foldMapping '\x04AA' = CM '\x04AB' '\0' '\0' +-- CYRILLIC CAPITAL LETTER TE WITH DESCENDER +foldMapping '\x04AC' = CM '\x04AD' '\0' '\0' +-- CYRILLIC CAPITAL LETTER STRAIGHT U +foldMapping '\x04AE' = CM '\x04AF' '\0' '\0' +-- CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE +foldMapping '\x04B0' = CM '\x04B1' '\0' '\0' +-- CYRILLIC CAPITAL LETTER HA WITH DESCENDER +foldMapping '\x04B2' = CM '\x04B3' '\0' '\0' +-- CYRILLIC CAPITAL LIGATURE TE TSE +foldMapping '\x04B4' = CM '\x04B5' '\0' '\0' +-- CYRILLIC CAPITAL LETTER CHE WITH DESCENDER +foldMapping '\x04B6' = CM '\x04B7' '\0' '\0' +-- CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE +foldMapping '\x04B8' = CM '\x04B9' '\0' '\0' +-- CYRILLIC CAPITAL LETTER SHHA +foldMapping '\x04BA' = CM '\x04BB' '\0' '\0' +-- CYRILLIC CAPITAL LETTER ABKHASIAN CHE +foldMapping '\x04BC' = CM '\x04BD' '\0' '\0' +-- CYRILLIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDER +foldMapping '\x04BE' = CM '\x04BF' '\0' '\0' +-- CYRILLIC LETTER PALOCHKA +foldMapping '\x04C0' = CM '\x04CF' '\0' '\0' +-- CYRILLIC CAPITAL LETTER ZHE WITH BREVE +foldMapping '\x04C1' = CM '\x04C2' '\0' '\0' +-- CYRILLIC CAPITAL LETTER KA WITH HOOK +foldMapping '\x04C3' = CM '\x04C4' '\0' '\0' +-- CYRILLIC CAPITAL LETTER EL WITH TAIL +foldMapping '\x04C5' = CM '\x04C6' '\0' '\0' +-- CYRILLIC CAPITAL LETTER EN WITH HOOK +foldMapping '\x04C7' = CM '\x04C8' '\0' '\0' +-- CYRILLIC CAPITAL LETTER EN WITH TAIL +foldMapping '\x04C9' = CM '\x04CA' '\0' '\0' +-- CYRILLIC CAPITAL LETTER KHAKASSIAN CHE +foldMapping '\x04CB' = CM '\x04CC' '\0' '\0' +-- CYRILLIC CAPITAL LETTER EM WITH TAIL +foldMapping '\x04CD' = CM '\x04CE' '\0' '\0' +-- CYRILLIC CAPITAL LETTER A WITH BREVE +foldMapping '\x04D0' = CM '\x04D1' '\0' '\0' +-- CYRILLIC CAPITAL LETTER A WITH DIAERESIS +foldMapping '\x04D2' = CM '\x04D3' '\0' '\0' +-- CYRILLIC CAPITAL LIGATURE A IE +foldMapping '\x04D4' = CM '\x04D5' '\0' '\0' +-- CYRILLIC CAPITAL LETTER IE WITH BREVE +foldMapping '\x04D6' = CM '\x04D7' '\0' '\0' +-- CYRILLIC CAPITAL LETTER SCHWA +foldMapping '\x04D8' = CM '\x04D9' '\0' '\0' +-- CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS +foldMapping '\x04DA' = CM '\x04DB' '\0' '\0' +-- CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS +foldMapping '\x04DC' = CM '\x04DD' '\0' '\0' +-- CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS +foldMapping '\x04DE' = CM '\x04DF' '\0' '\0' +-- CYRILLIC CAPITAL LETTER ABKHASIAN DZE +foldMapping '\x04E0' = CM '\x04E1' '\0' '\0' +-- CYRILLIC CAPITAL LETTER I WITH MACRON +foldMapping '\x04E2' = CM '\x04E3' '\0' '\0' +-- CYRILLIC CAPITAL LETTER I WITH DIAERESIS +foldMapping '\x04E4' = CM '\x04E5' '\0' '\0' +-- CYRILLIC CAPITAL LETTER O WITH DIAERESIS +foldMapping '\x04E6' = CM '\x04E7' '\0' '\0' +-- CYRILLIC CAPITAL LETTER BARRED O +foldMapping '\x04E8' = CM '\x04E9' '\0' '\0' +-- CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS +foldMapping '\x04EA' = CM '\x04EB' '\0' '\0' +-- CYRILLIC CAPITAL LETTER E WITH DIAERESIS +foldMapping '\x04EC' = CM '\x04ED' '\0' '\0' +-- CYRILLIC CAPITAL LETTER U WITH MACRON +foldMapping '\x04EE' = CM '\x04EF' '\0' '\0' +-- CYRILLIC CAPITAL LETTER U WITH DIAERESIS +foldMapping '\x04F0' = CM '\x04F1' '\0' '\0' +-- CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE +foldMapping '\x04F2' = CM '\x04F3' '\0' '\0' +-- CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS +foldMapping '\x04F4' = CM '\x04F5' '\0' '\0' +-- CYRILLIC CAPITAL LETTER GHE WITH DESCENDER +foldMapping '\x04F6' = CM '\x04F7' '\0' '\0' +-- CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS +foldMapping '\x04F8' = CM '\x04F9' '\0' '\0' +-- CYRILLIC CAPITAL LETTER GHE WITH STROKE AND HOOK +foldMapping '\x04FA' = CM '\x04FB' '\0' '\0' +-- CYRILLIC CAPITAL LETTER HA WITH HOOK +foldMapping '\x04FC' = CM '\x04FD' '\0' '\0' +-- CYRILLIC CAPITAL LETTER HA WITH STROKE +foldMapping '\x04FE' = CM '\x04FF' '\0' '\0' +-- CYRILLIC CAPITAL LETTER KOMI DE +foldMapping '\x0500' = CM '\x0501' '\0' '\0' +-- CYRILLIC CAPITAL LETTER KOMI DJE +foldMapping '\x0502' = CM '\x0503' '\0' '\0' +-- CYRILLIC CAPITAL LETTER KOMI ZJE +foldMapping '\x0504' = CM '\x0505' '\0' '\0' +-- CYRILLIC CAPITAL LETTER KOMI DZJE +foldMapping '\x0506' = CM '\x0507' '\0' '\0' +-- CYRILLIC CAPITAL LETTER KOMI LJE +foldMapping '\x0508' = CM '\x0509' '\0' '\0' +-- CYRILLIC CAPITAL LETTER KOMI NJE +foldMapping '\x050A' = CM '\x050B' '\0' '\0' +-- CYRILLIC CAPITAL LETTER KOMI SJE +foldMapping '\x050C' = CM '\x050D' '\0' '\0' +-- CYRILLIC CAPITAL LETTER KOMI TJE +foldMapping '\x050E' = CM '\x050F' '\0' '\0' +-- CYRILLIC CAPITAL LETTER REVERSED ZE +foldMapping '\x0510' = CM '\x0511' '\0' '\0' +-- CYRILLIC CAPITAL LETTER EL WITH HOOK +foldMapping '\x0512' = CM '\x0513' '\0' '\0' +-- CYRILLIC CAPITAL LETTER LHA +foldMapping '\x0514' = CM '\x0515' '\0' '\0' +-- CYRILLIC CAPITAL LETTER RHA +foldMapping '\x0516' = CM '\x0517' '\0' '\0' +-- CYRILLIC CAPITAL LETTER YAE +foldMapping '\x0518' = CM '\x0519' '\0' '\0' +-- CYRILLIC CAPITAL LETTER QA +foldMapping '\x051A' = CM '\x051B' '\0' '\0' +-- CYRILLIC CAPITAL LETTER WE +foldMapping '\x051C' = CM '\x051D' '\0' '\0' +-- CYRILLIC CAPITAL LETTER ALEUT KA +foldMapping '\x051E' = CM '\x051F' '\0' '\0' +-- CYRILLIC CAPITAL LETTER EL WITH MIDDLE HOOK +foldMapping '\x0520' = CM '\x0521' '\0' '\0' +-- CYRILLIC CAPITAL LETTER EN WITH MIDDLE HOOK +foldMapping '\x0522' = CM '\x0523' '\0' '\0' +-- CYRILLIC CAPITAL LETTER PE WITH DESCENDER +foldMapping '\x0524' = CM '\x0525' '\0' '\0' +-- CYRILLIC CAPITAL LETTER SHHA WITH DESCENDER +foldMapping '\x0526' = CM '\x0527' '\0' '\0' +-- CYRILLIC CAPITAL LETTER EN WITH LEFT HOOK +foldMapping '\x0528' = CM '\x0529' '\0' '\0' +-- CYRILLIC CAPITAL LETTER DZZHE +foldMapping '\x052A' = CM '\x052B' '\0' '\0' +-- CYRILLIC CAPITAL LETTER DCHE +foldMapping '\x052C' = CM '\x052D' '\0' '\0' +-- CYRILLIC CAPITAL LETTER EL WITH DESCENDER +foldMapping '\x052E' = CM '\x052F' '\0' '\0' +-- ARMENIAN CAPITAL LETTER AYB +foldMapping '\x0531' = CM '\x0561' '\0' '\0' +-- ARMENIAN CAPITAL LETTER BEN +foldMapping '\x0532' = CM '\x0562' '\0' '\0' +-- ARMENIAN CAPITAL LETTER GIM +foldMapping '\x0533' = CM '\x0563' '\0' '\0' +-- ARMENIAN CAPITAL LETTER DA +foldMapping '\x0534' = CM '\x0564' '\0' '\0' +-- ARMENIAN CAPITAL LETTER ECH +foldMapping '\x0535' = CM '\x0565' '\0' '\0' +-- ARMENIAN CAPITAL LETTER ZA +foldMapping '\x0536' = CM '\x0566' '\0' '\0' +-- ARMENIAN CAPITAL LETTER EH +foldMapping '\x0537' = CM '\x0567' '\0' '\0' +-- ARMENIAN CAPITAL LETTER ET +foldMapping '\x0538' = CM '\x0568' '\0' '\0' +-- ARMENIAN CAPITAL LETTER TO +foldMapping '\x0539' = CM '\x0569' '\0' '\0' +-- ARMENIAN CAPITAL LETTER ZHE +foldMapping '\x053A' = CM '\x056A' '\0' '\0' +-- ARMENIAN CAPITAL LETTER INI +foldMapping '\x053B' = CM '\x056B' '\0' '\0' +-- ARMENIAN CAPITAL LETTER LIWN +foldMapping '\x053C' = CM '\x056C' '\0' '\0' +-- ARMENIAN CAPITAL LETTER XEH +foldMapping '\x053D' = CM '\x056D' '\0' '\0' +-- ARMENIAN CAPITAL LETTER CA +foldMapping '\x053E' = CM '\x056E' '\0' '\0' +-- ARMENIAN CAPITAL LETTER KEN +foldMapping '\x053F' = CM '\x056F' '\0' '\0' +-- ARMENIAN CAPITAL LETTER HO +foldMapping '\x0540' = CM '\x0570' '\0' '\0' +-- ARMENIAN CAPITAL LETTER JA +foldMapping '\x0541' = CM '\x0571' '\0' '\0' +-- ARMENIAN CAPITAL LETTER GHAD +foldMapping '\x0542' = CM '\x0572' '\0' '\0' +-- ARMENIAN CAPITAL LETTER CHEH +foldMapping '\x0543' = CM '\x0573' '\0' '\0' +-- ARMENIAN CAPITAL LETTER MEN +foldMapping '\x0544' = CM '\x0574' '\0' '\0' +-- ARMENIAN CAPITAL LETTER YI +foldMapping '\x0545' = CM '\x0575' '\0' '\0' +-- ARMENIAN CAPITAL LETTER NOW +foldMapping '\x0546' = CM '\x0576' '\0' '\0' +-- ARMENIAN CAPITAL LETTER SHA +foldMapping '\x0547' = CM '\x0577' '\0' '\0' +-- ARMENIAN CAPITAL LETTER VO +foldMapping '\x0548' = CM '\x0578' '\0' '\0' +-- ARMENIAN CAPITAL LETTER CHA +foldMapping '\x0549' = CM '\x0579' '\0' '\0' +-- ARMENIAN CAPITAL LETTER PEH +foldMapping '\x054A' = CM '\x057A' '\0' '\0' +-- ARMENIAN CAPITAL LETTER JHEH +foldMapping '\x054B' = CM '\x057B' '\0' '\0' +-- ARMENIAN CAPITAL LETTER RA +foldMapping '\x054C' = CM '\x057C' '\0' '\0' +-- ARMENIAN CAPITAL LETTER SEH +foldMapping '\x054D' = CM '\x057D' '\0' '\0' +-- ARMENIAN CAPITAL LETTER VEW +foldMapping '\x054E' = CM '\x057E' '\0' '\0' +-- ARMENIAN CAPITAL LETTER TIWN +foldMapping '\x054F' = CM '\x057F' '\0' '\0' +-- ARMENIAN CAPITAL LETTER REH +foldMapping '\x0550' = CM '\x0580' '\0' '\0' +-- ARMENIAN CAPITAL LETTER CO +foldMapping '\x0551' = CM '\x0581' '\0' '\0' +-- ARMENIAN CAPITAL LETTER YIWN +foldMapping '\x0552' = CM '\x0582' '\0' '\0' +-- ARMENIAN CAPITAL LETTER PIWR +foldMapping '\x0553' = CM '\x0583' '\0' '\0' +-- ARMENIAN CAPITAL LETTER KEH +foldMapping '\x0554' = CM '\x0584' '\0' '\0' +-- ARMENIAN CAPITAL LETTER OH +foldMapping '\x0555' = CM '\x0585' '\0' '\0' +-- ARMENIAN CAPITAL LETTER FEH +foldMapping '\x0556' = CM '\x0586' '\0' '\0' +-- ARMENIAN SMALL LIGATURE ECH YIWN +foldMapping '\x0587' = CM '\x0565' '\x0582' '\0' +-- GEORGIAN CAPITAL LETTER AN +foldMapping '\x10A0' = CM '\x2D00' '\0' '\0' +-- GEORGIAN CAPITAL LETTER BAN +foldMapping '\x10A1' = CM '\x2D01' '\0' '\0' +-- GEORGIAN CAPITAL LETTER GAN +foldMapping '\x10A2' = CM '\x2D02' '\0' '\0' +-- GEORGIAN CAPITAL LETTER DON +foldMapping '\x10A3' = CM '\x2D03' '\0' '\0' +-- GEORGIAN CAPITAL LETTER EN +foldMapping '\x10A4' = CM '\x2D04' '\0' '\0' +-- GEORGIAN CAPITAL LETTER VIN +foldMapping '\x10A5' = CM '\x2D05' '\0' '\0' +-- GEORGIAN CAPITAL LETTER ZEN +foldMapping '\x10A6' = CM '\x2D06' '\0' '\0' +-- GEORGIAN CAPITAL LETTER TAN +foldMapping '\x10A7' = CM '\x2D07' '\0' '\0' +-- GEORGIAN CAPITAL LETTER IN +foldMapping '\x10A8' = CM '\x2D08' '\0' '\0' +-- GEORGIAN CAPITAL LETTER KAN +foldMapping '\x10A9' = CM '\x2D09' '\0' '\0' +-- GEORGIAN CAPITAL LETTER LAS +foldMapping '\x10AA' = CM '\x2D0A' '\0' '\0' +-- GEORGIAN CAPITAL LETTER MAN +foldMapping '\x10AB' = CM '\x2D0B' '\0' '\0' +-- GEORGIAN CAPITAL LETTER NAR +foldMapping '\x10AC' = CM '\x2D0C' '\0' '\0' +-- GEORGIAN CAPITAL LETTER ON +foldMapping '\x10AD' = CM '\x2D0D' '\0' '\0' +-- GEORGIAN CAPITAL LETTER PAR +foldMapping '\x10AE' = CM '\x2D0E' '\0' '\0' +-- GEORGIAN CAPITAL LETTER ZHAR +foldMapping '\x10AF' = CM '\x2D0F' '\0' '\0' +-- GEORGIAN CAPITAL LETTER RAE +foldMapping '\x10B0' = CM '\x2D10' '\0' '\0' +-- GEORGIAN CAPITAL LETTER SAN +foldMapping '\x10B1' = CM '\x2D11' '\0' '\0' +-- GEORGIAN CAPITAL LETTER TAR +foldMapping '\x10B2' = CM '\x2D12' '\0' '\0' +-- GEORGIAN CAPITAL LETTER UN +foldMapping '\x10B3' = CM '\x2D13' '\0' '\0' +-- GEORGIAN CAPITAL LETTER PHAR +foldMapping '\x10B4' = CM '\x2D14' '\0' '\0' +-- GEORGIAN CAPITAL LETTER KHAR +foldMapping '\x10B5' = CM '\x2D15' '\0' '\0' +-- GEORGIAN CAPITAL LETTER GHAN +foldMapping '\x10B6' = CM '\x2D16' '\0' '\0' +-- GEORGIAN CAPITAL LETTER QAR +foldMapping '\x10B7' = CM '\x2D17' '\0' '\0' +-- GEORGIAN CAPITAL LETTER SHIN +foldMapping '\x10B8' = CM '\x2D18' '\0' '\0' +-- GEORGIAN CAPITAL LETTER CHIN +foldMapping '\x10B9' = CM '\x2D19' '\0' '\0' +-- GEORGIAN CAPITAL LETTER CAN +foldMapping '\x10BA' = CM '\x2D1A' '\0' '\0' +-- GEORGIAN CAPITAL LETTER JIL +foldMapping '\x10BB' = CM '\x2D1B' '\0' '\0' +-- GEORGIAN CAPITAL LETTER CIL +foldMapping '\x10BC' = CM '\x2D1C' '\0' '\0' +-- GEORGIAN CAPITAL LETTER CHAR +foldMapping '\x10BD' = CM '\x2D1D' '\0' '\0' +-- GEORGIAN CAPITAL LETTER XAN +foldMapping '\x10BE' = CM '\x2D1E' '\0' '\0' +-- GEORGIAN CAPITAL LETTER JHAN +foldMapping '\x10BF' = CM '\x2D1F' '\0' '\0' +-- GEORGIAN CAPITAL LETTER HAE +foldMapping '\x10C0' = CM '\x2D20' '\0' '\0' +-- GEORGIAN CAPITAL LETTER HE +foldMapping '\x10C1' = CM '\x2D21' '\0' '\0' +-- GEORGIAN CAPITAL LETTER HIE +foldMapping '\x10C2' = CM '\x2D22' '\0' '\0' +-- GEORGIAN CAPITAL LETTER WE +foldMapping '\x10C3' = CM '\x2D23' '\0' '\0' +-- GEORGIAN CAPITAL LETTER HAR +foldMapping '\x10C4' = CM '\x2D24' '\0' '\0' +-- GEORGIAN CAPITAL LETTER HOE +foldMapping '\x10C5' = CM '\x2D25' '\0' '\0' +-- GEORGIAN CAPITAL LETTER YN +foldMapping '\x10C7' = CM '\x2D27' '\0' '\0' +-- GEORGIAN CAPITAL LETTER AEN +foldMapping '\x10CD' = CM '\x2D2D' '\0' '\0' +-- CHEROKEE SMALL LETTER YE +foldMapping '\x13F8' = CM '\x13F0' '\0' '\0' +-- CHEROKEE SMALL LETTER YI +foldMapping '\x13F9' = CM '\x13F1' '\0' '\0' +-- CHEROKEE SMALL LETTER YO +foldMapping '\x13FA' = CM '\x13F2' '\0' '\0' +-- CHEROKEE SMALL LETTER YU +foldMapping '\x13FB' = CM '\x13F3' '\0' '\0' +-- CHEROKEE SMALL LETTER YV +foldMapping '\x13FC' = CM '\x13F4' '\0' '\0' +-- CHEROKEE SMALL LETTER MV +foldMapping '\x13FD' = CM '\x13F5' '\0' '\0' +-- CYRILLIC SMALL LETTER ROUNDED VE +foldMapping '\x1C80' = CM '\x0432' '\0' '\0' +-- CYRILLIC SMALL LETTER LONG-LEGGED DE +foldMapping '\x1C81' = CM '\x0434' '\0' '\0' +-- CYRILLIC SMALL LETTER NARROW O +foldMapping '\x1C82' = CM '\x043E' '\0' '\0' +-- CYRILLIC SMALL LETTER WIDE ES +foldMapping '\x1C83' = CM '\x0441' '\0' '\0' +-- CYRILLIC SMALL LETTER TALL TE +foldMapping '\x1C84' = CM '\x0442' '\0' '\0' +-- CYRILLIC SMALL LETTER THREE-LEGGED TE +foldMapping '\x1C85' = CM '\x0442' '\0' '\0' +-- CYRILLIC SMALL LETTER TALL HARD SIGN +foldMapping '\x1C86' = CM '\x044A' '\0' '\0' +-- CYRILLIC SMALL LETTER TALL YAT +foldMapping '\x1C87' = CM '\x0463' '\0' '\0' +-- CYRILLIC SMALL LETTER UNBLENDED UK +foldMapping '\x1C88' = CM '\xA64B' '\0' '\0' +-- LATIN CAPITAL LETTER A WITH RING BELOW +foldMapping '\x1E00' = CM '\x1E01' '\0' '\0' +-- LATIN CAPITAL LETTER B WITH DOT ABOVE +foldMapping '\x1E02' = CM '\x1E03' '\0' '\0' +-- LATIN CAPITAL LETTER B WITH DOT BELOW +foldMapping '\x1E04' = CM '\x1E05' '\0' '\0' +-- LATIN CAPITAL LETTER B WITH LINE BELOW +foldMapping '\x1E06' = CM '\x1E07' '\0' '\0' +-- LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE +foldMapping '\x1E08' = CM '\x1E09' '\0' '\0' +-- LATIN CAPITAL LETTER D WITH DOT ABOVE +foldMapping '\x1E0A' = CM '\x1E0B' '\0' '\0' +-- LATIN CAPITAL LETTER D WITH DOT BELOW +foldMapping '\x1E0C' = CM '\x1E0D' '\0' '\0' +-- LATIN CAPITAL LETTER D WITH LINE BELOW +foldMapping '\x1E0E' = CM '\x1E0F' '\0' '\0' +-- LATIN CAPITAL LETTER D WITH CEDILLA +foldMapping '\x1E10' = CM '\x1E11' '\0' '\0' +-- LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW +foldMapping '\x1E12' = CM '\x1E13' '\0' '\0' +-- LATIN CAPITAL LETTER E WITH MACRON AND GRAVE +foldMapping '\x1E14' = CM '\x1E15' '\0' '\0' +-- LATIN CAPITAL LETTER E WITH MACRON AND ACUTE +foldMapping '\x1E16' = CM '\x1E17' '\0' '\0' +-- LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW +foldMapping '\x1E18' = CM '\x1E19' '\0' '\0' +-- LATIN CAPITAL LETTER E WITH TILDE BELOW +foldMapping '\x1E1A' = CM '\x1E1B' '\0' '\0' +-- LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE +foldMapping '\x1E1C' = CM '\x1E1D' '\0' '\0' +-- LATIN CAPITAL LETTER F WITH DOT ABOVE +foldMapping '\x1E1E' = CM '\x1E1F' '\0' '\0' +-- LATIN CAPITAL LETTER G WITH MACRON +foldMapping '\x1E20' = CM '\x1E21' '\0' '\0' +-- LATIN CAPITAL LETTER H WITH DOT ABOVE +foldMapping '\x1E22' = CM '\x1E23' '\0' '\0' +-- LATIN CAPITAL LETTER H WITH DOT BELOW +foldMapping '\x1E24' = CM '\x1E25' '\0' '\0' +-- LATIN CAPITAL LETTER H WITH DIAERESIS +foldMapping '\x1E26' = CM '\x1E27' '\0' '\0' +-- LATIN CAPITAL LETTER H WITH CEDILLA +foldMapping '\x1E28' = CM '\x1E29' '\0' '\0' +-- LATIN CAPITAL LETTER H WITH BREVE BELOW +foldMapping '\x1E2A' = CM '\x1E2B' '\0' '\0' +-- LATIN CAPITAL LETTER I WITH TILDE BELOW +foldMapping '\x1E2C' = CM '\x1E2D' '\0' '\0' +-- LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE +foldMapping '\x1E2E' = CM '\x1E2F' '\0' '\0' +-- LATIN CAPITAL LETTER K WITH ACUTE +foldMapping '\x1E30' = CM '\x1E31' '\0' '\0' +-- LATIN CAPITAL LETTER K WITH DOT BELOW +foldMapping '\x1E32' = CM '\x1E33' '\0' '\0' +-- LATIN CAPITAL LETTER K WITH LINE BELOW +foldMapping '\x1E34' = CM '\x1E35' '\0' '\0' +-- LATIN CAPITAL LETTER L WITH DOT BELOW +foldMapping '\x1E36' = CM '\x1E37' '\0' '\0' +-- LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON +foldMapping '\x1E38' = CM '\x1E39' '\0' '\0' +-- LATIN CAPITAL LETTER L WITH LINE BELOW +foldMapping '\x1E3A' = CM '\x1E3B' '\0' '\0' +-- LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW +foldMapping '\x1E3C' = CM '\x1E3D' '\0' '\0' +-- LATIN CAPITAL LETTER M WITH ACUTE +foldMapping '\x1E3E' = CM '\x1E3F' '\0' '\0' +-- LATIN CAPITAL LETTER M WITH DOT ABOVE +foldMapping '\x1E40' = CM '\x1E41' '\0' '\0' +-- LATIN CAPITAL LETTER M WITH DOT BELOW +foldMapping '\x1E42' = CM '\x1E43' '\0' '\0' +-- LATIN CAPITAL LETTER N WITH DOT ABOVE +foldMapping '\x1E44' = CM '\x1E45' '\0' '\0' +-- LATIN CAPITAL LETTER N WITH DOT BELOW +foldMapping '\x1E46' = CM '\x1E47' '\0' '\0' +-- LATIN CAPITAL LETTER N WITH LINE BELOW +foldMapping '\x1E48' = CM '\x1E49' '\0' '\0' +-- LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW +foldMapping '\x1E4A' = CM '\x1E4B' '\0' '\0' +-- LATIN CAPITAL LETTER O WITH TILDE AND ACUTE +foldMapping '\x1E4C' = CM '\x1E4D' '\0' '\0' +-- LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS +foldMapping '\x1E4E' = CM '\x1E4F' '\0' '\0' +-- LATIN CAPITAL LETTER O WITH MACRON AND GRAVE +foldMapping '\x1E50' = CM '\x1E51' '\0' '\0' +-- LATIN CAPITAL LETTER O WITH MACRON AND ACUTE +foldMapping '\x1E52' = CM '\x1E53' '\0' '\0' +-- LATIN CAPITAL LETTER P WITH ACUTE +foldMapping '\x1E54' = CM '\x1E55' '\0' '\0' +-- LATIN CAPITAL LETTER P WITH DOT ABOVE +foldMapping '\x1E56' = CM '\x1E57' '\0' '\0' +-- LATIN CAPITAL LETTER R WITH DOT ABOVE +foldMapping '\x1E58' = CM '\x1E59' '\0' '\0' +-- LATIN CAPITAL LETTER R WITH DOT BELOW +foldMapping '\x1E5A' = CM '\x1E5B' '\0' '\0' +-- LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON +foldMapping '\x1E5C' = CM '\x1E5D' '\0' '\0' +-- LATIN CAPITAL LETTER R WITH LINE BELOW +foldMapping '\x1E5E' = CM '\x1E5F' '\0' '\0' +-- LATIN CAPITAL LETTER S WITH DOT ABOVE +foldMapping '\x1E60' = CM '\x1E61' '\0' '\0' +-- LATIN CAPITAL LETTER S WITH DOT BELOW +foldMapping '\x1E62' = CM '\x1E63' '\0' '\0' +-- LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE +foldMapping '\x1E64' = CM '\x1E65' '\0' '\0' +-- LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE +foldMapping '\x1E66' = CM '\x1E67' '\0' '\0' +-- LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE +foldMapping '\x1E68' = CM '\x1E69' '\0' '\0' +-- LATIN CAPITAL LETTER T WITH DOT ABOVE +foldMapping '\x1E6A' = CM '\x1E6B' '\0' '\0' +-- LATIN CAPITAL LETTER T WITH DOT BELOW +foldMapping '\x1E6C' = CM '\x1E6D' '\0' '\0' +-- LATIN CAPITAL LETTER T WITH LINE BELOW +foldMapping '\x1E6E' = CM '\x1E6F' '\0' '\0' +-- LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW +foldMapping '\x1E70' = CM '\x1E71' '\0' '\0' +-- LATIN CAPITAL LETTER U WITH DIAERESIS BELOW +foldMapping '\x1E72' = CM '\x1E73' '\0' '\0' +-- LATIN CAPITAL LETTER U WITH TILDE BELOW +foldMapping '\x1E74' = CM '\x1E75' '\0' '\0' +-- LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW +foldMapping '\x1E76' = CM '\x1E77' '\0' '\0' +-- LATIN CAPITAL LETTER U WITH TILDE AND ACUTE +foldMapping '\x1E78' = CM '\x1E79' '\0' '\0' +-- LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS +foldMapping '\x1E7A' = CM '\x1E7B' '\0' '\0' +-- LATIN CAPITAL LETTER V WITH TILDE +foldMapping '\x1E7C' = CM '\x1E7D' '\0' '\0' +-- LATIN CAPITAL LETTER V WITH DOT BELOW +foldMapping '\x1E7E' = CM '\x1E7F' '\0' '\0' +-- LATIN CAPITAL LETTER W WITH GRAVE +foldMapping '\x1E80' = CM '\x1E81' '\0' '\0' +-- LATIN CAPITAL LETTER W WITH ACUTE +foldMapping '\x1E82' = CM '\x1E83' '\0' '\0' +-- LATIN CAPITAL LETTER W WITH DIAERESIS +foldMapping '\x1E84' = CM '\x1E85' '\0' '\0' +-- LATIN CAPITAL LETTER W WITH DOT ABOVE +foldMapping '\x1E86' = CM '\x1E87' '\0' '\0' +-- LATIN CAPITAL LETTER W WITH DOT BELOW +foldMapping '\x1E88' = CM '\x1E89' '\0' '\0' +-- LATIN CAPITAL LETTER X WITH DOT ABOVE +foldMapping '\x1E8A' = CM '\x1E8B' '\0' '\0' +-- LATIN CAPITAL LETTER X WITH DIAERESIS +foldMapping '\x1E8C' = CM '\x1E8D' '\0' '\0' +-- LATIN CAPITAL LETTER Y WITH DOT ABOVE +foldMapping '\x1E8E' = CM '\x1E8F' '\0' '\0' +-- LATIN CAPITAL LETTER Z WITH CIRCUMFLEX +foldMapping '\x1E90' = CM '\x1E91' '\0' '\0' +-- LATIN CAPITAL LETTER Z WITH DOT BELOW +foldMapping '\x1E92' = CM '\x1E93' '\0' '\0' +-- LATIN CAPITAL LETTER Z WITH LINE BELOW +foldMapping '\x1E94' = CM '\x1E95' '\0' '\0' +-- LATIN SMALL LETTER H WITH LINE BELOW +foldMapping '\x1E96' = CM '\x0068' '\x0331' '\0' +-- LATIN SMALL LETTER T WITH DIAERESIS +foldMapping '\x1E97' = CM '\x0074' '\x0308' '\0' +-- LATIN SMALL LETTER W WITH RING ABOVE +foldMapping '\x1E98' = CM '\x0077' '\x030A' '\0' +-- LATIN SMALL LETTER Y WITH RING ABOVE +foldMapping '\x1E99' = CM '\x0079' '\x030A' '\0' +-- LATIN SMALL LETTER A WITH RIGHT HALF RING +foldMapping '\x1E9A' = CM '\x0061' '\x02BE' '\0' +-- LATIN SMALL LETTER LONG S WITH DOT ABOVE +foldMapping '\x1E9B' = CM '\x1E61' '\0' '\0' +-- LATIN CAPITAL LETTER SHARP S +foldMapping '\x1E9E' = CM '\x0073' '\x0073' '\0' +-- LATIN CAPITAL LETTER A WITH DOT BELOW +foldMapping '\x1EA0' = CM '\x1EA1' '\0' '\0' +-- LATIN CAPITAL LETTER A WITH HOOK ABOVE +foldMapping '\x1EA2' = CM '\x1EA3' '\0' '\0' +-- LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE +foldMapping '\x1EA4' = CM '\x1EA5' '\0' '\0' +-- LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE +foldMapping '\x1EA6' = CM '\x1EA7' '\0' '\0' +-- LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE +foldMapping '\x1EA8' = CM '\x1EA9' '\0' '\0' +-- LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE +foldMapping '\x1EAA' = CM '\x1EAB' '\0' '\0' +-- LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW +foldMapping '\x1EAC' = CM '\x1EAD' '\0' '\0' +-- LATIN CAPITAL LETTER A WITH BREVE AND ACUTE +foldMapping '\x1EAE' = CM '\x1EAF' '\0' '\0' +-- LATIN CAPITAL LETTER A WITH BREVE AND GRAVE +foldMapping '\x1EB0' = CM '\x1EB1' '\0' '\0' +-- LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE +foldMapping '\x1EB2' = CM '\x1EB3' '\0' '\0' +-- LATIN CAPITAL LETTER A WITH BREVE AND TILDE +foldMapping '\x1EB4' = CM '\x1EB5' '\0' '\0' +-- LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW +foldMapping '\x1EB6' = CM '\x1EB7' '\0' '\0' +-- LATIN CAPITAL LETTER E WITH DOT BELOW +foldMapping '\x1EB8' = CM '\x1EB9' '\0' '\0' +-- LATIN CAPITAL LETTER E WITH HOOK ABOVE +foldMapping '\x1EBA' = CM '\x1EBB' '\0' '\0' +-- LATIN CAPITAL LETTER E WITH TILDE +foldMapping '\x1EBC' = CM '\x1EBD' '\0' '\0' +-- LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE +foldMapping '\x1EBE' = CM '\x1EBF' '\0' '\0' +-- LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE +foldMapping '\x1EC0' = CM '\x1EC1' '\0' '\0' +-- LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE +foldMapping '\x1EC2' = CM '\x1EC3' '\0' '\0' +-- LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE +foldMapping '\x1EC4' = CM '\x1EC5' '\0' '\0' +-- LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW +foldMapping '\x1EC6' = CM '\x1EC7' '\0' '\0' +-- LATIN CAPITAL LETTER I WITH HOOK ABOVE +foldMapping '\x1EC8' = CM '\x1EC9' '\0' '\0' +-- LATIN CAPITAL LETTER I WITH DOT BELOW +foldMapping '\x1ECA' = CM '\x1ECB' '\0' '\0' +-- LATIN CAPITAL LETTER O WITH DOT BELOW +foldMapping '\x1ECC' = CM '\x1ECD' '\0' '\0' +-- LATIN CAPITAL LETTER O WITH HOOK ABOVE +foldMapping '\x1ECE' = CM '\x1ECF' '\0' '\0' +-- LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE +foldMapping '\x1ED0' = CM '\x1ED1' '\0' '\0' +-- LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE +foldMapping '\x1ED2' = CM '\x1ED3' '\0' '\0' +-- LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE +foldMapping '\x1ED4' = CM '\x1ED5' '\0' '\0' +-- LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE +foldMapping '\x1ED6' = CM '\x1ED7' '\0' '\0' +-- LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW +foldMapping '\x1ED8' = CM '\x1ED9' '\0' '\0' +-- LATIN CAPITAL LETTER O WITH HORN AND ACUTE +foldMapping '\x1EDA' = CM '\x1EDB' '\0' '\0' +-- LATIN CAPITAL LETTER O WITH HORN AND GRAVE +foldMapping '\x1EDC' = CM '\x1EDD' '\0' '\0' +-- LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE +foldMapping '\x1EDE' = CM '\x1EDF' '\0' '\0' +-- LATIN CAPITAL LETTER O WITH HORN AND TILDE +foldMapping '\x1EE0' = CM '\x1EE1' '\0' '\0' +-- LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW +foldMapping '\x1EE2' = CM '\x1EE3' '\0' '\0' +-- LATIN CAPITAL LETTER U WITH DOT BELOW +foldMapping '\x1EE4' = CM '\x1EE5' '\0' '\0' +-- LATIN CAPITAL LETTER U WITH HOOK ABOVE +foldMapping '\x1EE6' = CM '\x1EE7' '\0' '\0' +-- LATIN CAPITAL LETTER U WITH HORN AND ACUTE +foldMapping '\x1EE8' = CM '\x1EE9' '\0' '\0' +-- LATIN CAPITAL LETTER U WITH HORN AND GRAVE +foldMapping '\x1EEA' = CM '\x1EEB' '\0' '\0' +-- LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE +foldMapping '\x1EEC' = CM '\x1EED' '\0' '\0' +-- LATIN CAPITAL LETTER U WITH HORN AND TILDE +foldMapping '\x1EEE' = CM '\x1EEF' '\0' '\0' +-- LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW +foldMapping '\x1EF0' = CM '\x1EF1' '\0' '\0' +-- LATIN CAPITAL LETTER Y WITH GRAVE +foldMapping '\x1EF2' = CM '\x1EF3' '\0' '\0' +-- LATIN CAPITAL LETTER Y WITH DOT BELOW +foldMapping '\x1EF4' = CM '\x1EF5' '\0' '\0' +-- LATIN CAPITAL LETTER Y WITH HOOK ABOVE +foldMapping '\x1EF6' = CM '\x1EF7' '\0' '\0' +-- LATIN CAPITAL LETTER Y WITH TILDE +foldMapping '\x1EF8' = CM '\x1EF9' '\0' '\0' +-- LATIN CAPITAL LETTER MIDDLE-WELSH LL +foldMapping '\x1EFA' = CM '\x1EFB' '\0' '\0' +-- LATIN CAPITAL LETTER MIDDLE-WELSH V +foldMapping '\x1EFC' = CM '\x1EFD' '\0' '\0' +-- LATIN CAPITAL LETTER Y WITH LOOP +foldMapping '\x1EFE' = CM '\x1EFF' '\0' '\0' +-- GREEK CAPITAL LETTER ALPHA WITH PSILI +foldMapping '\x1F08' = CM '\x1F00' '\0' '\0' +-- GREEK CAPITAL LETTER ALPHA WITH DASIA +foldMapping '\x1F09' = CM '\x1F01' '\0' '\0' +-- GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA +foldMapping '\x1F0A' = CM '\x1F02' '\0' '\0' +-- GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA +foldMapping '\x1F0B' = CM '\x1F03' '\0' '\0' +-- GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA +foldMapping '\x1F0C' = CM '\x1F04' '\0' '\0' +-- GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA +foldMapping '\x1F0D' = CM '\x1F05' '\0' '\0' +-- GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI +foldMapping '\x1F0E' = CM '\x1F06' '\0' '\0' +-- GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI +foldMapping '\x1F0F' = CM '\x1F07' '\0' '\0' +-- GREEK CAPITAL LETTER EPSILON WITH PSILI +foldMapping '\x1F18' = CM '\x1F10' '\0' '\0' +-- GREEK CAPITAL LETTER EPSILON WITH DASIA +foldMapping '\x1F19' = CM '\x1F11' '\0' '\0' +-- GREEK CAPITAL LETTER EPSILON WITH PSILI AND VARIA +foldMapping '\x1F1A' = CM '\x1F12' '\0' '\0' +-- GREEK CAPITAL LETTER EPSILON WITH DASIA AND VARIA +foldMapping '\x1F1B' = CM '\x1F13' '\0' '\0' +-- GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA +foldMapping '\x1F1C' = CM '\x1F14' '\0' '\0' +-- GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA +foldMapping '\x1F1D' = CM '\x1F15' '\0' '\0' +-- GREEK CAPITAL LETTER ETA WITH PSILI +foldMapping '\x1F28' = CM '\x1F20' '\0' '\0' +-- GREEK CAPITAL LETTER ETA WITH DASIA +foldMapping '\x1F29' = CM '\x1F21' '\0' '\0' +-- GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA +foldMapping '\x1F2A' = CM '\x1F22' '\0' '\0' +-- GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA +foldMapping '\x1F2B' = CM '\x1F23' '\0' '\0' +-- GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA +foldMapping '\x1F2C' = CM '\x1F24' '\0' '\0' +-- GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA +foldMapping '\x1F2D' = CM '\x1F25' '\0' '\0' +-- GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI +foldMapping '\x1F2E' = CM '\x1F26' '\0' '\0' +-- GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI +foldMapping '\x1F2F' = CM '\x1F27' '\0' '\0' +-- GREEK CAPITAL LETTER IOTA WITH PSILI +foldMapping '\x1F38' = CM '\x1F30' '\0' '\0' +-- GREEK CAPITAL LETTER IOTA WITH DASIA +foldMapping '\x1F39' = CM '\x1F31' '\0' '\0' +-- GREEK CAPITAL LETTER IOTA WITH PSILI AND VARIA +foldMapping '\x1F3A' = CM '\x1F32' '\0' '\0' +-- GREEK CAPITAL LETTER IOTA WITH DASIA AND VARIA +foldMapping '\x1F3B' = CM '\x1F33' '\0' '\0' +-- GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA +foldMapping '\x1F3C' = CM '\x1F34' '\0' '\0' +-- GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA +foldMapping '\x1F3D' = CM '\x1F35' '\0' '\0' +-- GREEK CAPITAL LETTER IOTA WITH PSILI AND PERISPOMENI +foldMapping '\x1F3E' = CM '\x1F36' '\0' '\0' +-- GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI +foldMapping '\x1F3F' = CM '\x1F37' '\0' '\0' +-- GREEK CAPITAL LETTER OMICRON WITH PSILI +foldMapping '\x1F48' = CM '\x1F40' '\0' '\0' +-- GREEK CAPITAL LETTER OMICRON WITH DASIA +foldMapping '\x1F49' = CM '\x1F41' '\0' '\0' +-- GREEK CAPITAL LETTER OMICRON WITH PSILI AND VARIA +foldMapping '\x1F4A' = CM '\x1F42' '\0' '\0' +-- GREEK CAPITAL LETTER OMICRON WITH DASIA AND VARIA +foldMapping '\x1F4B' = CM '\x1F43' '\0' '\0' +-- GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA +foldMapping '\x1F4C' = CM '\x1F44' '\0' '\0' +-- GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA +foldMapping '\x1F4D' = CM '\x1F45' '\0' '\0' +-- GREEK SMALL LETTER UPSILON WITH PSILI +foldMapping '\x1F50' = CM '\x03C5' '\x0313' '\0' +-- GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA +foldMapping '\x1F52' = CM '\x03C5' '\x0313' '\x0300' +-- GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA +foldMapping '\x1F54' = CM '\x03C5' '\x0313' '\x0301' +-- GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI +foldMapping '\x1F56' = CM '\x03C5' '\x0313' '\x0342' +-- GREEK CAPITAL LETTER UPSILON WITH DASIA +foldMapping '\x1F59' = CM '\x1F51' '\0' '\0' +-- GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA +foldMapping '\x1F5B' = CM '\x1F53' '\0' '\0' +-- GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA +foldMapping '\x1F5D' = CM '\x1F55' '\0' '\0' +-- GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI +foldMapping '\x1F5F' = CM '\x1F57' '\0' '\0' +-- GREEK CAPITAL LETTER OMEGA WITH PSILI +foldMapping '\x1F68' = CM '\x1F60' '\0' '\0' +-- GREEK CAPITAL LETTER OMEGA WITH DASIA +foldMapping '\x1F69' = CM '\x1F61' '\0' '\0' +-- GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA +foldMapping '\x1F6A' = CM '\x1F62' '\0' '\0' +-- GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA +foldMapping '\x1F6B' = CM '\x1F63' '\0' '\0' +-- GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA +foldMapping '\x1F6C' = CM '\x1F64' '\0' '\0' +-- GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA +foldMapping '\x1F6D' = CM '\x1F65' '\0' '\0' +-- GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI +foldMapping '\x1F6E' = CM '\x1F66' '\0' '\0' +-- GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI +foldMapping '\x1F6F' = CM '\x1F67' '\0' '\0' +-- GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI +foldMapping '\x1F80' = CM '\x1F00' '\x03B9' '\0' +-- GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI +foldMapping '\x1F81' = CM '\x1F01' '\x03B9' '\0' +-- GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI +foldMapping '\x1F82' = CM '\x1F02' '\x03B9' '\0' +-- GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI +foldMapping '\x1F83' = CM '\x1F03' '\x03B9' '\0' +-- GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI +foldMapping '\x1F84' = CM '\x1F04' '\x03B9' '\0' +-- GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI +foldMapping '\x1F85' = CM '\x1F05' '\x03B9' '\0' +-- GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI +foldMapping '\x1F86' = CM '\x1F06' '\x03B9' '\0' +-- GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI +foldMapping '\x1F87' = CM '\x1F07' '\x03B9' '\0' +-- GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI +foldMapping '\x1F88' = CM '\x1F00' '\x03B9' '\0' +-- GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI +foldMapping '\x1F89' = CM '\x1F01' '\x03B9' '\0' +-- GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI +foldMapping '\x1F8A' = CM '\x1F02' '\x03B9' '\0' +-- GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI +foldMapping '\x1F8B' = CM '\x1F03' '\x03B9' '\0' +-- GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI +foldMapping '\x1F8C' = CM '\x1F04' '\x03B9' '\0' +-- GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI +foldMapping '\x1F8D' = CM '\x1F05' '\x03B9' '\0' +-- GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI +foldMapping '\x1F8E' = CM '\x1F06' '\x03B9' '\0' +-- GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI +foldMapping '\x1F8F' = CM '\x1F07' '\x03B9' '\0' +-- GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI +foldMapping '\x1F90' = CM '\x1F20' '\x03B9' '\0' +-- GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI +foldMapping '\x1F91' = CM '\x1F21' '\x03B9' '\0' +-- GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI +foldMapping '\x1F92' = CM '\x1F22' '\x03B9' '\0' +-- GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI +foldMapping '\x1F93' = CM '\x1F23' '\x03B9' '\0' +-- GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI +foldMapping '\x1F94' = CM '\x1F24' '\x03B9' '\0' +-- GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI +foldMapping '\x1F95' = CM '\x1F25' '\x03B9' '\0' +-- GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI +foldMapping '\x1F96' = CM '\x1F26' '\x03B9' '\0' +-- GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI +foldMapping '\x1F97' = CM '\x1F27' '\x03B9' '\0' +-- GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI +foldMapping '\x1F98' = CM '\x1F20' '\x03B9' '\0' +-- GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI +foldMapping '\x1F99' = CM '\x1F21' '\x03B9' '\0' +-- GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI +foldMapping '\x1F9A' = CM '\x1F22' '\x03B9' '\0' +-- GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI +foldMapping '\x1F9B' = CM '\x1F23' '\x03B9' '\0' +-- GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI +foldMapping '\x1F9C' = CM '\x1F24' '\x03B9' '\0' +-- GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI +foldMapping '\x1F9D' = CM '\x1F25' '\x03B9' '\0' +-- GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI +foldMapping '\x1F9E' = CM '\x1F26' '\x03B9' '\0' +-- GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI +foldMapping '\x1F9F' = CM '\x1F27' '\x03B9' '\0' +-- GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI +foldMapping '\x1FA0' = CM '\x1F60' '\x03B9' '\0' +-- GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI +foldMapping '\x1FA1' = CM '\x1F61' '\x03B9' '\0' +-- GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI +foldMapping '\x1FA2' = CM '\x1F62' '\x03B9' '\0' +-- GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI +foldMapping '\x1FA3' = CM '\x1F63' '\x03B9' '\0' +-- GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI +foldMapping '\x1FA4' = CM '\x1F64' '\x03B9' '\0' +-- GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI +foldMapping '\x1FA5' = CM '\x1F65' '\x03B9' '\0' +-- GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI +foldMapping '\x1FA6' = CM '\x1F66' '\x03B9' '\0' +-- GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI +foldMapping '\x1FA7' = CM '\x1F67' '\x03B9' '\0' +-- GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI +foldMapping '\x1FA8' = CM '\x1F60' '\x03B9' '\0' +-- GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI +foldMapping '\x1FA9' = CM '\x1F61' '\x03B9' '\0' +-- GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI +foldMapping '\x1FAA' = CM '\x1F62' '\x03B9' '\0' +-- GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI +foldMapping '\x1FAB' = CM '\x1F63' '\x03B9' '\0' +-- GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI +foldMapping '\x1FAC' = CM '\x1F64' '\x03B9' '\0' +-- GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI +foldMapping '\x1FAD' = CM '\x1F65' '\x03B9' '\0' +-- GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI +foldMapping '\x1FAE' = CM '\x1F66' '\x03B9' '\0' +-- GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI +foldMapping '\x1FAF' = CM '\x1F67' '\x03B9' '\0' +-- GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI +foldMapping '\x1FB2' = CM '\x1F70' '\x03B9' '\0' +-- GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI +foldMapping '\x1FB3' = CM '\x03B1' '\x03B9' '\0' +-- GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI +foldMapping '\x1FB4' = CM '\x03AC' '\x03B9' '\0' +-- GREEK SMALL LETTER ALPHA WITH PERISPOMENI +foldMapping '\x1FB6' = CM '\x03B1' '\x0342' '\0' +-- GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI +foldMapping '\x1FB7' = CM '\x03B1' '\x0342' '\x03B9' +-- GREEK CAPITAL LETTER ALPHA WITH VRACHY +foldMapping '\x1FB8' = CM '\x1FB0' '\0' '\0' +-- GREEK CAPITAL LETTER ALPHA WITH MACRON +foldMapping '\x1FB9' = CM '\x1FB1' '\0' '\0' +-- GREEK CAPITAL LETTER ALPHA WITH VARIA +foldMapping '\x1FBA' = CM '\x1F70' '\0' '\0' +-- GREEK CAPITAL LETTER ALPHA WITH OXIA +foldMapping '\x1FBB' = CM '\x1F71' '\0' '\0' +-- GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI +foldMapping '\x1FBC' = CM '\x03B1' '\x03B9' '\0' +-- GREEK PROSGEGRAMMENI +foldMapping '\x1FBE' = CM '\x03B9' '\0' '\0' +-- GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI +foldMapping '\x1FC2' = CM '\x1F74' '\x03B9' '\0' +-- GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI +foldMapping '\x1FC3' = CM '\x03B7' '\x03B9' '\0' +-- GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI +foldMapping '\x1FC4' = CM '\x03AE' '\x03B9' '\0' +-- GREEK SMALL LETTER ETA WITH PERISPOMENI +foldMapping '\x1FC6' = CM '\x03B7' '\x0342' '\0' +-- GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI +foldMapping '\x1FC7' = CM '\x03B7' '\x0342' '\x03B9' +-- GREEK CAPITAL LETTER EPSILON WITH VARIA +foldMapping '\x1FC8' = CM '\x1F72' '\0' '\0' +-- GREEK CAPITAL LETTER EPSILON WITH OXIA +foldMapping '\x1FC9' = CM '\x1F73' '\0' '\0' +-- GREEK CAPITAL LETTER ETA WITH VARIA +foldMapping '\x1FCA' = CM '\x1F74' '\0' '\0' +-- GREEK CAPITAL LETTER ETA WITH OXIA +foldMapping '\x1FCB' = CM '\x1F75' '\0' '\0' +-- GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI +foldMapping '\x1FCC' = CM '\x03B7' '\x03B9' '\0' +-- GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA +foldMapping '\x1FD2' = CM '\x03B9' '\x0308' '\x0300' +-- GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA +foldMapping '\x1FD3' = CM '\x03B9' '\x0308' '\x0301' +-- GREEK SMALL LETTER IOTA WITH PERISPOMENI +foldMapping '\x1FD6' = CM '\x03B9' '\x0342' '\0' +-- GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI +foldMapping '\x1FD7' = CM '\x03B9' '\x0308' '\x0342' +-- GREEK CAPITAL LETTER IOTA WITH VRACHY +foldMapping '\x1FD8' = CM '\x1FD0' '\0' '\0' +-- GREEK CAPITAL LETTER IOTA WITH MACRON +foldMapping '\x1FD9' = CM '\x1FD1' '\0' '\0' +-- GREEK CAPITAL LETTER IOTA WITH VARIA +foldMapping '\x1FDA' = CM '\x1F76' '\0' '\0' +-- GREEK CAPITAL LETTER IOTA WITH OXIA +foldMapping '\x1FDB' = CM '\x1F77' '\0' '\0' +-- GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA +foldMapping '\x1FE2' = CM '\x03C5' '\x0308' '\x0300' +-- GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA +foldMapping '\x1FE3' = CM '\x03C5' '\x0308' '\x0301' +-- GREEK SMALL LETTER RHO WITH PSILI +foldMapping '\x1FE4' = CM '\x03C1' '\x0313' '\0' +-- GREEK SMALL LETTER UPSILON WITH PERISPOMENI +foldMapping '\x1FE6' = CM '\x03C5' '\x0342' '\0' +-- GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI +foldMapping '\x1FE7' = CM '\x03C5' '\x0308' '\x0342' +-- GREEK CAPITAL LETTER UPSILON WITH VRACHY +foldMapping '\x1FE8' = CM '\x1FE0' '\0' '\0' +-- GREEK CAPITAL LETTER UPSILON WITH MACRON +foldMapping '\x1FE9' = CM '\x1FE1' '\0' '\0' +-- GREEK CAPITAL LETTER UPSILON WITH VARIA +foldMapping '\x1FEA' = CM '\x1F7A' '\0' '\0' +-- GREEK CAPITAL LETTER UPSILON WITH OXIA +foldMapping '\x1FEB' = CM '\x1F7B' '\0' '\0' +-- GREEK CAPITAL LETTER RHO WITH DASIA +foldMapping '\x1FEC' = CM '\x1FE5' '\0' '\0' +-- GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI +foldMapping '\x1FF2' = CM '\x1F7C' '\x03B9' '\0' +-- GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI +foldMapping '\x1FF3' = CM '\x03C9' '\x03B9' '\0' +-- GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI +foldMapping '\x1FF4' = CM '\x03CE' '\x03B9' '\0' +-- GREEK SMALL LETTER OMEGA WITH PERISPOMENI +foldMapping '\x1FF6' = CM '\x03C9' '\x0342' '\0' +-- GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI +foldMapping '\x1FF7' = CM '\x03C9' '\x0342' '\x03B9' +-- GREEK CAPITAL LETTER OMICRON WITH VARIA +foldMapping '\x1FF8' = CM '\x1F78' '\0' '\0' +-- GREEK CAPITAL LETTER OMICRON WITH OXIA +foldMapping '\x1FF9' = CM '\x1F79' '\0' '\0' +-- GREEK CAPITAL LETTER OMEGA WITH VARIA +foldMapping '\x1FFA' = CM '\x1F7C' '\0' '\0' +-- GREEK CAPITAL LETTER OMEGA WITH OXIA +foldMapping '\x1FFB' = CM '\x1F7D' '\0' '\0' +-- GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI +foldMapping '\x1FFC' = CM '\x03C9' '\x03B9' '\0' +-- OHM SIGN +foldMapping '\x2126' = CM '\x03C9' '\0' '\0' +-- KELVIN SIGN +foldMapping '\x212A' = CM '\x006B' '\0' '\0' +-- ANGSTROM SIGN +foldMapping '\x212B' = CM '\x00E5' '\0' '\0' +-- TURNED CAPITAL F +foldMapping '\x2132' = CM '\x214E' '\0' '\0' +-- ROMAN NUMERAL ONE +foldMapping '\x2160' = CM '\x2170' '\0' '\0' +-- ROMAN NUMERAL TWO +foldMapping '\x2161' = CM '\x2171' '\0' '\0' +-- ROMAN NUMERAL THREE +foldMapping '\x2162' = CM '\x2172' '\0' '\0' +-- ROMAN NUMERAL FOUR +foldMapping '\x2163' = CM '\x2173' '\0' '\0' +-- ROMAN NUMERAL FIVE +foldMapping '\x2164' = CM '\x2174' '\0' '\0' +-- ROMAN NUMERAL SIX +foldMapping '\x2165' = CM '\x2175' '\0' '\0' +-- ROMAN NUMERAL SEVEN +foldMapping '\x2166' = CM '\x2176' '\0' '\0' +-- ROMAN NUMERAL EIGHT +foldMapping '\x2167' = CM '\x2177' '\0' '\0' +-- ROMAN NUMERAL NINE +foldMapping '\x2168' = CM '\x2178' '\0' '\0' +-- ROMAN NUMERAL TEN +foldMapping '\x2169' = CM '\x2179' '\0' '\0' +-- ROMAN NUMERAL ELEVEN +foldMapping '\x216A' = CM '\x217A' '\0' '\0' +-- ROMAN NUMERAL TWELVE +foldMapping '\x216B' = CM '\x217B' '\0' '\0' +-- ROMAN NUMERAL FIFTY +foldMapping '\x216C' = CM '\x217C' '\0' '\0' +-- ROMAN NUMERAL ONE HUNDRED +foldMapping '\x216D' = CM '\x217D' '\0' '\0' +-- ROMAN NUMERAL FIVE HUNDRED +foldMapping '\x216E' = CM '\x217E' '\0' '\0' +-- ROMAN NUMERAL ONE THOUSAND +foldMapping '\x216F' = CM '\x217F' '\0' '\0' +-- ROMAN NUMERAL REVERSED ONE HUNDRED +foldMapping '\x2183' = CM '\x2184' '\0' '\0' +-- CIRCLED LATIN CAPITAL LETTER A +foldMapping '\x24B6' = CM '\x24D0' '\0' '\0' +-- CIRCLED LATIN CAPITAL LETTER B +foldMapping '\x24B7' = CM '\x24D1' '\0' '\0' +-- CIRCLED LATIN CAPITAL LETTER C +foldMapping '\x24B8' = CM '\x24D2' '\0' '\0' +-- CIRCLED LATIN CAPITAL LETTER D +foldMapping '\x24B9' = CM '\x24D3' '\0' '\0' +-- CIRCLED LATIN CAPITAL LETTER E +foldMapping '\x24BA' = CM '\x24D4' '\0' '\0' +-- CIRCLED LATIN CAPITAL LETTER F +foldMapping '\x24BB' = CM '\x24D5' '\0' '\0' +-- CIRCLED LATIN CAPITAL LETTER G +foldMapping '\x24BC' = CM '\x24D6' '\0' '\0' +-- CIRCLED LATIN CAPITAL LETTER H +foldMapping '\x24BD' = CM '\x24D7' '\0' '\0' +-- CIRCLED LATIN CAPITAL LETTER I +foldMapping '\x24BE' = CM '\x24D8' '\0' '\0' +-- CIRCLED LATIN CAPITAL LETTER J +foldMapping '\x24BF' = CM '\x24D9' '\0' '\0' +-- CIRCLED LATIN CAPITAL LETTER K +foldMapping '\x24C0' = CM '\x24DA' '\0' '\0' +-- CIRCLED LATIN CAPITAL LETTER L +foldMapping '\x24C1' = CM '\x24DB' '\0' '\0' +-- CIRCLED LATIN CAPITAL LETTER M +foldMapping '\x24C2' = CM '\x24DC' '\0' '\0' +-- CIRCLED LATIN CAPITAL LETTER N +foldMapping '\x24C3' = CM '\x24DD' '\0' '\0' +-- CIRCLED LATIN CAPITAL LETTER O +foldMapping '\x24C4' = CM '\x24DE' '\0' '\0' +-- CIRCLED LATIN CAPITAL LETTER P +foldMapping '\x24C5' = CM '\x24DF' '\0' '\0' +-- CIRCLED LATIN CAPITAL LETTER Q +foldMapping '\x24C6' = CM '\x24E0' '\0' '\0' +-- CIRCLED LATIN CAPITAL LETTER R +foldMapping '\x24C7' = CM '\x24E1' '\0' '\0' +-- CIRCLED LATIN CAPITAL LETTER S +foldMapping '\x24C8' = CM '\x24E2' '\0' '\0' +-- CIRCLED LATIN CAPITAL LETTER T +foldMapping '\x24C9' = CM '\x24E3' '\0' '\0' +-- CIRCLED LATIN CAPITAL LETTER U +foldMapping '\x24CA' = CM '\x24E4' '\0' '\0' +-- CIRCLED LATIN CAPITAL LETTER V +foldMapping '\x24CB' = CM '\x24E5' '\0' '\0' +-- CIRCLED LATIN CAPITAL LETTER W +foldMapping '\x24CC' = CM '\x24E6' '\0' '\0' +-- CIRCLED LATIN CAPITAL LETTER X +foldMapping '\x24CD' = CM '\x24E7' '\0' '\0' +-- CIRCLED LATIN CAPITAL LETTER Y +foldMapping '\x24CE' = CM '\x24E8' '\0' '\0' +-- CIRCLED LATIN CAPITAL LETTER Z +foldMapping '\x24CF' = CM '\x24E9' '\0' '\0' +-- GLAGOLITIC CAPITAL LETTER AZU +foldMapping '\x2C00' = CM '\x2C30' '\0' '\0' +-- GLAGOLITIC CAPITAL LETTER BUKY +foldMapping '\x2C01' = CM '\x2C31' '\0' '\0' +-- GLAGOLITIC CAPITAL LETTER VEDE +foldMapping '\x2C02' = CM '\x2C32' '\0' '\0' +-- GLAGOLITIC CAPITAL LETTER GLAGOLI +foldMapping '\x2C03' = CM '\x2C33' '\0' '\0' +-- GLAGOLITIC CAPITAL LETTER DOBRO +foldMapping '\x2C04' = CM '\x2C34' '\0' '\0' +-- GLAGOLITIC CAPITAL LETTER YESTU +foldMapping '\x2C05' = CM '\x2C35' '\0' '\0' +-- GLAGOLITIC CAPITAL LETTER ZHIVETE +foldMapping '\x2C06' = CM '\x2C36' '\0' '\0' +-- GLAGOLITIC CAPITAL LETTER DZELO +foldMapping '\x2C07' = CM '\x2C37' '\0' '\0' +-- GLAGOLITIC CAPITAL LETTER ZEMLJA +foldMapping '\x2C08' = CM '\x2C38' '\0' '\0' +-- GLAGOLITIC CAPITAL LETTER IZHE +foldMapping '\x2C09' = CM '\x2C39' '\0' '\0' +-- GLAGOLITIC CAPITAL LETTER INITIAL IZHE +foldMapping '\x2C0A' = CM '\x2C3A' '\0' '\0' +-- GLAGOLITIC CAPITAL LETTER I +foldMapping '\x2C0B' = CM '\x2C3B' '\0' '\0' +-- GLAGOLITIC CAPITAL LETTER DJERVI +foldMapping '\x2C0C' = CM '\x2C3C' '\0' '\0' +-- GLAGOLITIC CAPITAL LETTER KAKO +foldMapping '\x2C0D' = CM '\x2C3D' '\0' '\0' +-- GLAGOLITIC CAPITAL LETTER LJUDIJE +foldMapping '\x2C0E' = CM '\x2C3E' '\0' '\0' +-- GLAGOLITIC CAPITAL LETTER MYSLITE +foldMapping '\x2C0F' = CM '\x2C3F' '\0' '\0' +-- GLAGOLITIC CAPITAL LETTER NASHI +foldMapping '\x2C10' = CM '\x2C40' '\0' '\0' +-- GLAGOLITIC CAPITAL LETTER ONU +foldMapping '\x2C11' = CM '\x2C41' '\0' '\0' +-- GLAGOLITIC CAPITAL LETTER POKOJI +foldMapping '\x2C12' = CM '\x2C42' '\0' '\0' +-- GLAGOLITIC CAPITAL LETTER RITSI +foldMapping '\x2C13' = CM '\x2C43' '\0' '\0' +-- GLAGOLITIC CAPITAL LETTER SLOVO +foldMapping '\x2C14' = CM '\x2C44' '\0' '\0' +-- GLAGOLITIC CAPITAL LETTER TVRIDO +foldMapping '\x2C15' = CM '\x2C45' '\0' '\0' +-- GLAGOLITIC CAPITAL LETTER UKU +foldMapping '\x2C16' = CM '\x2C46' '\0' '\0' +-- GLAGOLITIC CAPITAL LETTER FRITU +foldMapping '\x2C17' = CM '\x2C47' '\0' '\0' +-- GLAGOLITIC CAPITAL LETTER HERU +foldMapping '\x2C18' = CM '\x2C48' '\0' '\0' +-- GLAGOLITIC CAPITAL LETTER OTU +foldMapping '\x2C19' = CM '\x2C49' '\0' '\0' +-- GLAGOLITIC CAPITAL LETTER PE +foldMapping '\x2C1A' = CM '\x2C4A' '\0' '\0' +-- GLAGOLITIC CAPITAL LETTER SHTA +foldMapping '\x2C1B' = CM '\x2C4B' '\0' '\0' +-- GLAGOLITIC CAPITAL LETTER TSI +foldMapping '\x2C1C' = CM '\x2C4C' '\0' '\0' +-- GLAGOLITIC CAPITAL LETTER CHRIVI +foldMapping '\x2C1D' = CM '\x2C4D' '\0' '\0' +-- GLAGOLITIC CAPITAL LETTER SHA +foldMapping '\x2C1E' = CM '\x2C4E' '\0' '\0' +-- GLAGOLITIC CAPITAL LETTER YERU +foldMapping '\x2C1F' = CM '\x2C4F' '\0' '\0' +-- GLAGOLITIC CAPITAL LETTER YERI +foldMapping '\x2C20' = CM '\x2C50' '\0' '\0' +-- GLAGOLITIC CAPITAL LETTER YATI +foldMapping '\x2C21' = CM '\x2C51' '\0' '\0' +-- GLAGOLITIC CAPITAL LETTER SPIDERY HA +foldMapping '\x2C22' = CM '\x2C52' '\0' '\0' +-- GLAGOLITIC CAPITAL LETTER YU +foldMapping '\x2C23' = CM '\x2C53' '\0' '\0' +-- GLAGOLITIC CAPITAL LETTER SMALL YUS +foldMapping '\x2C24' = CM '\x2C54' '\0' '\0' +-- GLAGOLITIC CAPITAL LETTER SMALL YUS WITH TAIL +foldMapping '\x2C25' = CM '\x2C55' '\0' '\0' +-- GLAGOLITIC CAPITAL LETTER YO +foldMapping '\x2C26' = CM '\x2C56' '\0' '\0' +-- GLAGOLITIC CAPITAL LETTER IOTATED SMALL YUS +foldMapping '\x2C27' = CM '\x2C57' '\0' '\0' +-- GLAGOLITIC CAPITAL LETTER BIG YUS +foldMapping '\x2C28' = CM '\x2C58' '\0' '\0' +-- GLAGOLITIC CAPITAL LETTER IOTATED BIG YUS +foldMapping '\x2C29' = CM '\x2C59' '\0' '\0' +-- GLAGOLITIC CAPITAL LETTER FITA +foldMapping '\x2C2A' = CM '\x2C5A' '\0' '\0' +-- GLAGOLITIC CAPITAL LETTER IZHITSA +foldMapping '\x2C2B' = CM '\x2C5B' '\0' '\0' +-- GLAGOLITIC CAPITAL LETTER SHTAPIC +foldMapping '\x2C2C' = CM '\x2C5C' '\0' '\0' +-- GLAGOLITIC CAPITAL LETTER TROKUTASTI A +foldMapping '\x2C2D' = CM '\x2C5D' '\0' '\0' +-- GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE +foldMapping '\x2C2E' = CM '\x2C5E' '\0' '\0' +-- LATIN CAPITAL LETTER L WITH DOUBLE BAR +foldMapping '\x2C60' = CM '\x2C61' '\0' '\0' +-- LATIN CAPITAL LETTER L WITH MIDDLE TILDE +foldMapping '\x2C62' = CM '\x026B' '\0' '\0' +-- LATIN CAPITAL LETTER P WITH STROKE +foldMapping '\x2C63' = CM '\x1D7D' '\0' '\0' +-- LATIN CAPITAL LETTER R WITH TAIL +foldMapping '\x2C64' = CM '\x027D' '\0' '\0' +-- LATIN CAPITAL LETTER H WITH DESCENDER +foldMapping '\x2C67' = CM '\x2C68' '\0' '\0' +-- LATIN CAPITAL LETTER K WITH DESCENDER +foldMapping '\x2C69' = CM '\x2C6A' '\0' '\0' +-- LATIN CAPITAL LETTER Z WITH DESCENDER +foldMapping '\x2C6B' = CM '\x2C6C' '\0' '\0' +-- LATIN CAPITAL LETTER ALPHA +foldMapping '\x2C6D' = CM '\x0251' '\0' '\0' +-- LATIN CAPITAL LETTER M WITH HOOK +foldMapping '\x2C6E' = CM '\x0271' '\0' '\0' +-- LATIN CAPITAL LETTER TURNED A +foldMapping '\x2C6F' = CM '\x0250' '\0' '\0' +-- LATIN CAPITAL LETTER TURNED ALPHA +foldMapping '\x2C70' = CM '\x0252' '\0' '\0' +-- LATIN CAPITAL LETTER W WITH HOOK +foldMapping '\x2C72' = CM '\x2C73' '\0' '\0' +-- LATIN CAPITAL LETTER HALF H +foldMapping '\x2C75' = CM '\x2C76' '\0' '\0' +-- LATIN CAPITAL LETTER S WITH SWASH TAIL +foldMapping '\x2C7E' = CM '\x023F' '\0' '\0' +-- LATIN CAPITAL LETTER Z WITH SWASH TAIL +foldMapping '\x2C7F' = CM '\x0240' '\0' '\0' +-- COPTIC CAPITAL LETTER ALFA +foldMapping '\x2C80' = CM '\x2C81' '\0' '\0' +-- COPTIC CAPITAL LETTER VIDA +foldMapping '\x2C82' = CM '\x2C83' '\0' '\0' +-- COPTIC CAPITAL LETTER GAMMA +foldMapping '\x2C84' = CM '\x2C85' '\0' '\0' +-- COPTIC CAPITAL LETTER DALDA +foldMapping '\x2C86' = CM '\x2C87' '\0' '\0' +-- COPTIC CAPITAL LETTER EIE +foldMapping '\x2C88' = CM '\x2C89' '\0' '\0' +-- COPTIC CAPITAL LETTER SOU +foldMapping '\x2C8A' = CM '\x2C8B' '\0' '\0' +-- COPTIC CAPITAL LETTER ZATA +foldMapping '\x2C8C' = CM '\x2C8D' '\0' '\0' +-- COPTIC CAPITAL LETTER HATE +foldMapping '\x2C8E' = CM '\x2C8F' '\0' '\0' +-- COPTIC CAPITAL LETTER THETHE +foldMapping '\x2C90' = CM '\x2C91' '\0' '\0' +-- COPTIC CAPITAL LETTER IAUDA +foldMapping '\x2C92' = CM '\x2C93' '\0' '\0' +-- COPTIC CAPITAL LETTER KAPA +foldMapping '\x2C94' = CM '\x2C95' '\0' '\0' +-- COPTIC CAPITAL LETTER LAULA +foldMapping '\x2C96' = CM '\x2C97' '\0' '\0' +-- COPTIC CAPITAL LETTER MI +foldMapping '\x2C98' = CM '\x2C99' '\0' '\0' +-- COPTIC CAPITAL LETTER NI +foldMapping '\x2C9A' = CM '\x2C9B' '\0' '\0' +-- COPTIC CAPITAL LETTER KSI +foldMapping '\x2C9C' = CM '\x2C9D' '\0' '\0' +-- COPTIC CAPITAL LETTER O +foldMapping '\x2C9E' = CM '\x2C9F' '\0' '\0' +-- COPTIC CAPITAL LETTER PI +foldMapping '\x2CA0' = CM '\x2CA1' '\0' '\0' +-- COPTIC CAPITAL LETTER RO +foldMapping '\x2CA2' = CM '\x2CA3' '\0' '\0' +-- COPTIC CAPITAL LETTER SIMA +foldMapping '\x2CA4' = CM '\x2CA5' '\0' '\0' +-- COPTIC CAPITAL LETTER TAU +foldMapping '\x2CA6' = CM '\x2CA7' '\0' '\0' +-- COPTIC CAPITAL LETTER UA +foldMapping '\x2CA8' = CM '\x2CA9' '\0' '\0' +-- COPTIC CAPITAL LETTER FI +foldMapping '\x2CAA' = CM '\x2CAB' '\0' '\0' +-- COPTIC CAPITAL LETTER KHI +foldMapping '\x2CAC' = CM '\x2CAD' '\0' '\0' +-- COPTIC CAPITAL LETTER PSI +foldMapping '\x2CAE' = CM '\x2CAF' '\0' '\0' +-- COPTIC CAPITAL LETTER OOU +foldMapping '\x2CB0' = CM '\x2CB1' '\0' '\0' +-- COPTIC CAPITAL LETTER DIALECT-P ALEF +foldMapping '\x2CB2' = CM '\x2CB3' '\0' '\0' +-- COPTIC CAPITAL LETTER OLD COPTIC AIN +foldMapping '\x2CB4' = CM '\x2CB5' '\0' '\0' +-- COPTIC CAPITAL LETTER CRYPTOGRAMMIC EIE +foldMapping '\x2CB6' = CM '\x2CB7' '\0' '\0' +-- COPTIC CAPITAL LETTER DIALECT-P KAPA +foldMapping '\x2CB8' = CM '\x2CB9' '\0' '\0' +-- COPTIC CAPITAL LETTER DIALECT-P NI +foldMapping '\x2CBA' = CM '\x2CBB' '\0' '\0' +-- COPTIC CAPITAL LETTER CRYPTOGRAMMIC NI +foldMapping '\x2CBC' = CM '\x2CBD' '\0' '\0' +-- COPTIC CAPITAL LETTER OLD COPTIC OOU +foldMapping '\x2CBE' = CM '\x2CBF' '\0' '\0' +-- COPTIC CAPITAL LETTER SAMPI +foldMapping '\x2CC0' = CM '\x2CC1' '\0' '\0' +-- COPTIC CAPITAL LETTER CROSSED SHEI +foldMapping '\x2CC2' = CM '\x2CC3' '\0' '\0' +-- COPTIC CAPITAL LETTER OLD COPTIC SHEI +foldMapping '\x2CC4' = CM '\x2CC5' '\0' '\0' +-- COPTIC CAPITAL LETTER OLD COPTIC ESH +foldMapping '\x2CC6' = CM '\x2CC7' '\0' '\0' +-- COPTIC CAPITAL LETTER AKHMIMIC KHEI +foldMapping '\x2CC8' = CM '\x2CC9' '\0' '\0' +-- COPTIC CAPITAL LETTER DIALECT-P HORI +foldMapping '\x2CCA' = CM '\x2CCB' '\0' '\0' +-- COPTIC CAPITAL LETTER OLD COPTIC HORI +foldMapping '\x2CCC' = CM '\x2CCD' '\0' '\0' +-- COPTIC CAPITAL LETTER OLD COPTIC HA +foldMapping '\x2CCE' = CM '\x2CCF' '\0' '\0' +-- COPTIC CAPITAL LETTER L-SHAPED HA +foldMapping '\x2CD0' = CM '\x2CD1' '\0' '\0' +-- COPTIC CAPITAL LETTER OLD COPTIC HEI +foldMapping '\x2CD2' = CM '\x2CD3' '\0' '\0' +-- COPTIC CAPITAL LETTER OLD COPTIC HAT +foldMapping '\x2CD4' = CM '\x2CD5' '\0' '\0' +-- COPTIC CAPITAL LETTER OLD COPTIC GANGIA +foldMapping '\x2CD6' = CM '\x2CD7' '\0' '\0' +-- COPTIC CAPITAL LETTER OLD COPTIC DJA +foldMapping '\x2CD8' = CM '\x2CD9' '\0' '\0' +-- COPTIC CAPITAL LETTER OLD COPTIC SHIMA +foldMapping '\x2CDA' = CM '\x2CDB' '\0' '\0' +-- COPTIC CAPITAL LETTER OLD NUBIAN SHIMA +foldMapping '\x2CDC' = CM '\x2CDD' '\0' '\0' +-- COPTIC CAPITAL LETTER OLD NUBIAN NGI +foldMapping '\x2CDE' = CM '\x2CDF' '\0' '\0' +-- COPTIC CAPITAL LETTER OLD NUBIAN NYI +foldMapping '\x2CE0' = CM '\x2CE1' '\0' '\0' +-- COPTIC CAPITAL LETTER OLD NUBIAN WAU +foldMapping '\x2CE2' = CM '\x2CE3' '\0' '\0' +-- COPTIC CAPITAL LETTER CRYPTOGRAMMIC SHEI +foldMapping '\x2CEB' = CM '\x2CEC' '\0' '\0' +-- COPTIC CAPITAL LETTER CRYPTOGRAMMIC GANGIA +foldMapping '\x2CED' = CM '\x2CEE' '\0' '\0' +-- COPTIC CAPITAL LETTER BOHAIRIC KHEI +foldMapping '\x2CF2' = CM '\x2CF3' '\0' '\0' +-- CYRILLIC CAPITAL LETTER ZEMLYA +foldMapping '\xA640' = CM '\xA641' '\0' '\0' +-- CYRILLIC CAPITAL LETTER DZELO +foldMapping '\xA642' = CM '\xA643' '\0' '\0' +-- CYRILLIC CAPITAL LETTER REVERSED DZE +foldMapping '\xA644' = CM '\xA645' '\0' '\0' +-- CYRILLIC CAPITAL LETTER IOTA +foldMapping '\xA646' = CM '\xA647' '\0' '\0' +-- CYRILLIC CAPITAL LETTER DJERV +foldMapping '\xA648' = CM '\xA649' '\0' '\0' +-- CYRILLIC CAPITAL LETTER MONOGRAPH UK +foldMapping '\xA64A' = CM '\xA64B' '\0' '\0' +-- CYRILLIC CAPITAL LETTER BROAD OMEGA +foldMapping '\xA64C' = CM '\xA64D' '\0' '\0' +-- CYRILLIC CAPITAL LETTER NEUTRAL YER +foldMapping '\xA64E' = CM '\xA64F' '\0' '\0' +-- CYRILLIC CAPITAL LETTER YERU WITH BACK YER +foldMapping '\xA650' = CM '\xA651' '\0' '\0' +-- CYRILLIC CAPITAL LETTER IOTIFIED YAT +foldMapping '\xA652' = CM '\xA653' '\0' '\0' +-- CYRILLIC CAPITAL LETTER REVERSED YU +foldMapping '\xA654' = CM '\xA655' '\0' '\0' +-- CYRILLIC CAPITAL LETTER IOTIFIED A +foldMapping '\xA656' = CM '\xA657' '\0' '\0' +-- CYRILLIC CAPITAL LETTER CLOSED LITTLE YUS +foldMapping '\xA658' = CM '\xA659' '\0' '\0' +-- CYRILLIC CAPITAL LETTER BLENDED YUS +foldMapping '\xA65A' = CM '\xA65B' '\0' '\0' +-- CYRILLIC CAPITAL LETTER IOTIFIED CLOSED LITTLE YUS +foldMapping '\xA65C' = CM '\xA65D' '\0' '\0' +-- CYRILLIC CAPITAL LETTER YN +foldMapping '\xA65E' = CM '\xA65F' '\0' '\0' +-- CYRILLIC CAPITAL LETTER REVERSED TSE +foldMapping '\xA660' = CM '\xA661' '\0' '\0' +-- CYRILLIC CAPITAL LETTER SOFT DE +foldMapping '\xA662' = CM '\xA663' '\0' '\0' +-- CYRILLIC CAPITAL LETTER SOFT EL +foldMapping '\xA664' = CM '\xA665' '\0' '\0' +-- CYRILLIC CAPITAL LETTER SOFT EM +foldMapping '\xA666' = CM '\xA667' '\0' '\0' +-- CYRILLIC CAPITAL LETTER MONOCULAR O +foldMapping '\xA668' = CM '\xA669' '\0' '\0' +-- CYRILLIC CAPITAL LETTER BINOCULAR O +foldMapping '\xA66A' = CM '\xA66B' '\0' '\0' +-- CYRILLIC CAPITAL LETTER DOUBLE MONOCULAR O +foldMapping '\xA66C' = CM '\xA66D' '\0' '\0' +-- CYRILLIC CAPITAL LETTER DWE +foldMapping '\xA680' = CM '\xA681' '\0' '\0' +-- CYRILLIC CAPITAL LETTER DZWE +foldMapping '\xA682' = CM '\xA683' '\0' '\0' +-- CYRILLIC CAPITAL LETTER ZHWE +foldMapping '\xA684' = CM '\xA685' '\0' '\0' +-- CYRILLIC CAPITAL LETTER CCHE +foldMapping '\xA686' = CM '\xA687' '\0' '\0' +-- CYRILLIC CAPITAL LETTER DZZE +foldMapping '\xA688' = CM '\xA689' '\0' '\0' +-- CYRILLIC CAPITAL LETTER TE WITH MIDDLE HOOK +foldMapping '\xA68A' = CM '\xA68B' '\0' '\0' +-- CYRILLIC CAPITAL LETTER TWE +foldMapping '\xA68C' = CM '\xA68D' '\0' '\0' +-- CYRILLIC CAPITAL LETTER TSWE +foldMapping '\xA68E' = CM '\xA68F' '\0' '\0' +-- CYRILLIC CAPITAL LETTER TSSE +foldMapping '\xA690' = CM '\xA691' '\0' '\0' +-- CYRILLIC CAPITAL LETTER TCHE +foldMapping '\xA692' = CM '\xA693' '\0' '\0' +-- CYRILLIC CAPITAL LETTER HWE +foldMapping '\xA694' = CM '\xA695' '\0' '\0' +-- CYRILLIC CAPITAL LETTER SHWE +foldMapping '\xA696' = CM '\xA697' '\0' '\0' +-- CYRILLIC CAPITAL LETTER DOUBLE O +foldMapping '\xA698' = CM '\xA699' '\0' '\0' +-- CYRILLIC CAPITAL LETTER CROSSED O +foldMapping '\xA69A' = CM '\xA69B' '\0' '\0' +-- LATIN CAPITAL LETTER EGYPTOLOGICAL ALEF +foldMapping '\xA722' = CM '\xA723' '\0' '\0' +-- LATIN CAPITAL LETTER EGYPTOLOGICAL AIN +foldMapping '\xA724' = CM '\xA725' '\0' '\0' +-- LATIN CAPITAL LETTER HENG +foldMapping '\xA726' = CM '\xA727' '\0' '\0' +-- LATIN CAPITAL LETTER TZ +foldMapping '\xA728' = CM '\xA729' '\0' '\0' +-- LATIN CAPITAL LETTER TRESILLO +foldMapping '\xA72A' = CM '\xA72B' '\0' '\0' +-- LATIN CAPITAL LETTER CUATRILLO +foldMapping '\xA72C' = CM '\xA72D' '\0' '\0' +-- LATIN CAPITAL LETTER CUATRILLO WITH COMMA +foldMapping '\xA72E' = CM '\xA72F' '\0' '\0' +-- LATIN CAPITAL LETTER AA +foldMapping '\xA732' = CM '\xA733' '\0' '\0' +-- LATIN CAPITAL LETTER AO +foldMapping '\xA734' = CM '\xA735' '\0' '\0' +-- LATIN CAPITAL LETTER AU +foldMapping '\xA736' = CM '\xA737' '\0' '\0' +-- LATIN CAPITAL LETTER AV +foldMapping '\xA738' = CM '\xA739' '\0' '\0' +-- LATIN CAPITAL LETTER AV WITH HORIZONTAL BAR +foldMapping '\xA73A' = CM '\xA73B' '\0' '\0' +-- LATIN CAPITAL LETTER AY +foldMapping '\xA73C' = CM '\xA73D' '\0' '\0' +-- LATIN CAPITAL LETTER REVERSED C WITH DOT +foldMapping '\xA73E' = CM '\xA73F' '\0' '\0' +-- LATIN CAPITAL LETTER K WITH STROKE +foldMapping '\xA740' = CM '\xA741' '\0' '\0' +-- LATIN CAPITAL LETTER K WITH DIAGONAL STROKE +foldMapping '\xA742' = CM '\xA743' '\0' '\0' +-- LATIN CAPITAL LETTER K WITH STROKE AND DIAGONAL STROKE +foldMapping '\xA744' = CM '\xA745' '\0' '\0' +-- LATIN CAPITAL LETTER BROKEN L +foldMapping '\xA746' = CM '\xA747' '\0' '\0' +-- LATIN CAPITAL LETTER L WITH HIGH STROKE +foldMapping '\xA748' = CM '\xA749' '\0' '\0' +-- LATIN CAPITAL LETTER O WITH LONG STROKE OVERLAY +foldMapping '\xA74A' = CM '\xA74B' '\0' '\0' +-- LATIN CAPITAL LETTER O WITH LOOP +foldMapping '\xA74C' = CM '\xA74D' '\0' '\0' +-- LATIN CAPITAL LETTER OO +foldMapping '\xA74E' = CM '\xA74F' '\0' '\0' +-- LATIN CAPITAL LETTER P WITH STROKE THROUGH DESCENDER +foldMapping '\xA750' = CM '\xA751' '\0' '\0' +-- LATIN CAPITAL LETTER P WITH FLOURISH +foldMapping '\xA752' = CM '\xA753' '\0' '\0' +-- LATIN CAPITAL LETTER P WITH SQUIRREL TAIL +foldMapping '\xA754' = CM '\xA755' '\0' '\0' +-- LATIN CAPITAL LETTER Q WITH STROKE THROUGH DESCENDER +foldMapping '\xA756' = CM '\xA757' '\0' '\0' +-- LATIN CAPITAL LETTER Q WITH DIAGONAL STROKE +foldMapping '\xA758' = CM '\xA759' '\0' '\0' +-- LATIN CAPITAL LETTER R ROTUNDA +foldMapping '\xA75A' = CM '\xA75B' '\0' '\0' +-- LATIN CAPITAL LETTER RUM ROTUNDA +foldMapping '\xA75C' = CM '\xA75D' '\0' '\0' +-- LATIN CAPITAL LETTER V WITH DIAGONAL STROKE +foldMapping '\xA75E' = CM '\xA75F' '\0' '\0' +-- LATIN CAPITAL LETTER VY +foldMapping '\xA760' = CM '\xA761' '\0' '\0' +-- LATIN CAPITAL LETTER VISIGOTHIC Z +foldMapping '\xA762' = CM '\xA763' '\0' '\0' +-- LATIN CAPITAL LETTER THORN WITH STROKE +foldMapping '\xA764' = CM '\xA765' '\0' '\0' +-- LATIN CAPITAL LETTER THORN WITH STROKE THROUGH DESCENDER +foldMapping '\xA766' = CM '\xA767' '\0' '\0' +-- LATIN CAPITAL LETTER VEND +foldMapping '\xA768' = CM '\xA769' '\0' '\0' +-- LATIN CAPITAL LETTER ET +foldMapping '\xA76A' = CM '\xA76B' '\0' '\0' +-- LATIN CAPITAL LETTER IS +foldMapping '\xA76C' = CM '\xA76D' '\0' '\0' +-- LATIN CAPITAL LETTER CON +foldMapping '\xA76E' = CM '\xA76F' '\0' '\0' +-- LATIN CAPITAL LETTER INSULAR D +foldMapping '\xA779' = CM '\xA77A' '\0' '\0' +-- LATIN CAPITAL LETTER INSULAR F +foldMapping '\xA77B' = CM '\xA77C' '\0' '\0' +-- LATIN CAPITAL LETTER INSULAR G +foldMapping '\xA77D' = CM '\x1D79' '\0' '\0' +-- LATIN CAPITAL LETTER TURNED INSULAR G +foldMapping '\xA77E' = CM '\xA77F' '\0' '\0' +-- LATIN CAPITAL LETTER TURNED L +foldMapping '\xA780' = CM '\xA781' '\0' '\0' +-- LATIN CAPITAL LETTER INSULAR R +foldMapping '\xA782' = CM '\xA783' '\0' '\0' +-- LATIN CAPITAL LETTER INSULAR S +foldMapping '\xA784' = CM '\xA785' '\0' '\0' +-- LATIN CAPITAL LETTER INSULAR T +foldMapping '\xA786' = CM '\xA787' '\0' '\0' +-- LATIN CAPITAL LETTER SALTILLO +foldMapping '\xA78B' = CM '\xA78C' '\0' '\0' +-- LATIN CAPITAL LETTER TURNED H +foldMapping '\xA78D' = CM '\x0265' '\0' '\0' +-- LATIN CAPITAL LETTER N WITH DESCENDER +foldMapping '\xA790' = CM '\xA791' '\0' '\0' +-- LATIN CAPITAL LETTER C WITH BAR +foldMapping '\xA792' = CM '\xA793' '\0' '\0' +-- LATIN CAPITAL LETTER B WITH FLOURISH +foldMapping '\xA796' = CM '\xA797' '\0' '\0' +-- LATIN CAPITAL LETTER F WITH STROKE +foldMapping '\xA798' = CM '\xA799' '\0' '\0' +-- LATIN CAPITAL LETTER VOLAPUK AE +foldMapping '\xA79A' = CM '\xA79B' '\0' '\0' +-- LATIN CAPITAL LETTER VOLAPUK OE +foldMapping '\xA79C' = CM '\xA79D' '\0' '\0' +-- LATIN CAPITAL LETTER VOLAPUK UE +foldMapping '\xA79E' = CM '\xA79F' '\0' '\0' +-- LATIN CAPITAL LETTER G WITH OBLIQUE STROKE +foldMapping '\xA7A0' = CM '\xA7A1' '\0' '\0' +-- LATIN CAPITAL LETTER K WITH OBLIQUE STROKE +foldMapping '\xA7A2' = CM '\xA7A3' '\0' '\0' +-- LATIN CAPITAL LETTER N WITH OBLIQUE STROKE +foldMapping '\xA7A4' = CM '\xA7A5' '\0' '\0' +-- LATIN CAPITAL LETTER R WITH OBLIQUE STROKE +foldMapping '\xA7A6' = CM '\xA7A7' '\0' '\0' +-- LATIN CAPITAL LETTER S WITH OBLIQUE STROKE +foldMapping '\xA7A8' = CM '\xA7A9' '\0' '\0' +-- LATIN CAPITAL LETTER H WITH HOOK +foldMapping '\xA7AA' = CM '\x0266' '\0' '\0' +-- LATIN CAPITAL LETTER REVERSED OPEN E +foldMapping '\xA7AB' = CM '\x025C' '\0' '\0' +-- LATIN CAPITAL LETTER SCRIPT G +foldMapping '\xA7AC' = CM '\x0261' '\0' '\0' +-- LATIN CAPITAL LETTER L WITH BELT +foldMapping '\xA7AD' = CM '\x026C' '\0' '\0' +-- LATIN CAPITAL LETTER SMALL CAPITAL I +foldMapping '\xA7AE' = CM '\x026A' '\0' '\0' +-- LATIN CAPITAL LETTER TURNED K +foldMapping '\xA7B0' = CM '\x029E' '\0' '\0' +-- LATIN CAPITAL LETTER TURNED T +foldMapping '\xA7B1' = CM '\x0287' '\0' '\0' +-- LATIN CAPITAL LETTER J WITH CROSSED-TAIL +foldMapping '\xA7B2' = CM '\x029D' '\0' '\0' +-- LATIN CAPITAL LETTER CHI +foldMapping '\xA7B3' = CM '\xAB53' '\0' '\0' +-- LATIN CAPITAL LETTER BETA +foldMapping '\xA7B4' = CM '\xA7B5' '\0' '\0' +-- LATIN CAPITAL LETTER OMEGA +foldMapping '\xA7B6' = CM '\xA7B7' '\0' '\0' +-- CHEROKEE SMALL LETTER A +foldMapping '\xAB70' = CM '\x13A0' '\0' '\0' +-- CHEROKEE SMALL LETTER E +foldMapping '\xAB71' = CM '\x13A1' '\0' '\0' +-- CHEROKEE SMALL LETTER I +foldMapping '\xAB72' = CM '\x13A2' '\0' '\0' +-- CHEROKEE SMALL LETTER O +foldMapping '\xAB73' = CM '\x13A3' '\0' '\0' +-- CHEROKEE SMALL LETTER U +foldMapping '\xAB74' = CM '\x13A4' '\0' '\0' +-- CHEROKEE SMALL LETTER V +foldMapping '\xAB75' = CM '\x13A5' '\0' '\0' +-- CHEROKEE SMALL LETTER GA +foldMapping '\xAB76' = CM '\x13A6' '\0' '\0' +-- CHEROKEE SMALL LETTER KA +foldMapping '\xAB77' = CM '\x13A7' '\0' '\0' +-- CHEROKEE SMALL LETTER GE +foldMapping '\xAB78' = CM '\x13A8' '\0' '\0' +-- CHEROKEE SMALL LETTER GI +foldMapping '\xAB79' = CM '\x13A9' '\0' '\0' +-- CHEROKEE SMALL LETTER GO +foldMapping '\xAB7A' = CM '\x13AA' '\0' '\0' +-- CHEROKEE SMALL LETTER GU +foldMapping '\xAB7B' = CM '\x13AB' '\0' '\0' +-- CHEROKEE SMALL LETTER GV +foldMapping '\xAB7C' = CM '\x13AC' '\0' '\0' +-- CHEROKEE SMALL LETTER HA +foldMapping '\xAB7D' = CM '\x13AD' '\0' '\0' +-- CHEROKEE SMALL LETTER HE +foldMapping '\xAB7E' = CM '\x13AE' '\0' '\0' +-- CHEROKEE SMALL LETTER HI +foldMapping '\xAB7F' = CM '\x13AF' '\0' '\0' +-- CHEROKEE SMALL LETTER HO +foldMapping '\xAB80' = CM '\x13B0' '\0' '\0' +-- CHEROKEE SMALL LETTER HU +foldMapping '\xAB81' = CM '\x13B1' '\0' '\0' +-- CHEROKEE SMALL LETTER HV +foldMapping '\xAB82' = CM '\x13B2' '\0' '\0' +-- CHEROKEE SMALL LETTER LA +foldMapping '\xAB83' = CM '\x13B3' '\0' '\0' +-- CHEROKEE SMALL LETTER LE +foldMapping '\xAB84' = CM '\x13B4' '\0' '\0' +-- CHEROKEE SMALL LETTER LI +foldMapping '\xAB85' = CM '\x13B5' '\0' '\0' +-- CHEROKEE SMALL LETTER LO +foldMapping '\xAB86' = CM '\x13B6' '\0' '\0' +-- CHEROKEE SMALL LETTER LU +foldMapping '\xAB87' = CM '\x13B7' '\0' '\0' +-- CHEROKEE SMALL LETTER LV +foldMapping '\xAB88' = CM '\x13B8' '\0' '\0' +-- CHEROKEE SMALL LETTER MA +foldMapping '\xAB89' = CM '\x13B9' '\0' '\0' +-- CHEROKEE SMALL LETTER ME +foldMapping '\xAB8A' = CM '\x13BA' '\0' '\0' +-- CHEROKEE SMALL LETTER MI +foldMapping '\xAB8B' = CM '\x13BB' '\0' '\0' +-- CHEROKEE SMALL LETTER MO +foldMapping '\xAB8C' = CM '\x13BC' '\0' '\0' +-- CHEROKEE SMALL LETTER MU +foldMapping '\xAB8D' = CM '\x13BD' '\0' '\0' +-- CHEROKEE SMALL LETTER NA +foldMapping '\xAB8E' = CM '\x13BE' '\0' '\0' +-- CHEROKEE SMALL LETTER HNA +foldMapping '\xAB8F' = CM '\x13BF' '\0' '\0' +-- CHEROKEE SMALL LETTER NAH +foldMapping '\xAB90' = CM '\x13C0' '\0' '\0' +-- CHEROKEE SMALL LETTER NE +foldMapping '\xAB91' = CM '\x13C1' '\0' '\0' +-- CHEROKEE SMALL LETTER NI +foldMapping '\xAB92' = CM '\x13C2' '\0' '\0' +-- CHEROKEE SMALL LETTER NO +foldMapping '\xAB93' = CM '\x13C3' '\0' '\0' +-- CHEROKEE SMALL LETTER NU +foldMapping '\xAB94' = CM '\x13C4' '\0' '\0' +-- CHEROKEE SMALL LETTER NV +foldMapping '\xAB95' = CM '\x13C5' '\0' '\0' +-- CHEROKEE SMALL LETTER QUA +foldMapping '\xAB96' = CM '\x13C6' '\0' '\0' +-- CHEROKEE SMALL LETTER QUE +foldMapping '\xAB97' = CM '\x13C7' '\0' '\0' +-- CHEROKEE SMALL LETTER QUI +foldMapping '\xAB98' = CM '\x13C8' '\0' '\0' +-- CHEROKEE SMALL LETTER QUO +foldMapping '\xAB99' = CM '\x13C9' '\0' '\0' +-- CHEROKEE SMALL LETTER QUU +foldMapping '\xAB9A' = CM '\x13CA' '\0' '\0' +-- CHEROKEE SMALL LETTER QUV +foldMapping '\xAB9B' = CM '\x13CB' '\0' '\0' +-- CHEROKEE SMALL LETTER SA +foldMapping '\xAB9C' = CM '\x13CC' '\0' '\0' +-- CHEROKEE SMALL LETTER S +foldMapping '\xAB9D' = CM '\x13CD' '\0' '\0' +-- CHEROKEE SMALL LETTER SE +foldMapping '\xAB9E' = CM '\x13CE' '\0' '\0' +-- CHEROKEE SMALL LETTER SI +foldMapping '\xAB9F' = CM '\x13CF' '\0' '\0' +-- CHEROKEE SMALL LETTER SO +foldMapping '\xABA0' = CM '\x13D0' '\0' '\0' +-- CHEROKEE SMALL LETTER SU +foldMapping '\xABA1' = CM '\x13D1' '\0' '\0' +-- CHEROKEE SMALL LETTER SV +foldMapping '\xABA2' = CM '\x13D2' '\0' '\0' +-- CHEROKEE SMALL LETTER DA +foldMapping '\xABA3' = CM '\x13D3' '\0' '\0' +-- CHEROKEE SMALL LETTER TA +foldMapping '\xABA4' = CM '\x13D4' '\0' '\0' +-- CHEROKEE SMALL LETTER DE +foldMapping '\xABA5' = CM '\x13D5' '\0' '\0' +-- CHEROKEE SMALL LETTER TE +foldMapping '\xABA6' = CM '\x13D6' '\0' '\0' +-- CHEROKEE SMALL LETTER DI +foldMapping '\xABA7' = CM '\x13D7' '\0' '\0' +-- CHEROKEE SMALL LETTER TI +foldMapping '\xABA8' = CM '\x13D8' '\0' '\0' +-- CHEROKEE SMALL LETTER DO +foldMapping '\xABA9' = CM '\x13D9' '\0' '\0' +-- CHEROKEE SMALL LETTER DU +foldMapping '\xABAA' = CM '\x13DA' '\0' '\0' +-- CHEROKEE SMALL LETTER DV +foldMapping '\xABAB' = CM '\x13DB' '\0' '\0' +-- CHEROKEE SMALL LETTER DLA +foldMapping '\xABAC' = CM '\x13DC' '\0' '\0' +-- CHEROKEE SMALL LETTER TLA +foldMapping '\xABAD' = CM '\x13DD' '\0' '\0' +-- CHEROKEE SMALL LETTER TLE +foldMapping '\xABAE' = CM '\x13DE' '\0' '\0' +-- CHEROKEE SMALL LETTER TLI +foldMapping '\xABAF' = CM '\x13DF' '\0' '\0' +-- CHEROKEE SMALL LETTER TLO +foldMapping '\xABB0' = CM '\x13E0' '\0' '\0' +-- CHEROKEE SMALL LETTER TLU +foldMapping '\xABB1' = CM '\x13E1' '\0' '\0' +-- CHEROKEE SMALL LETTER TLV +foldMapping '\xABB2' = CM '\x13E2' '\0' '\0' +-- CHEROKEE SMALL LETTER TSA +foldMapping '\xABB3' = CM '\x13E3' '\0' '\0' +-- CHEROKEE SMALL LETTER TSE +foldMapping '\xABB4' = CM '\x13E4' '\0' '\0' +-- CHEROKEE SMALL LETTER TSI +foldMapping '\xABB5' = CM '\x13E5' '\0' '\0' +-- CHEROKEE SMALL LETTER TSO +foldMapping '\xABB6' = CM '\x13E6' '\0' '\0' +-- CHEROKEE SMALL LETTER TSU +foldMapping '\xABB7' = CM '\x13E7' '\0' '\0' +-- CHEROKEE SMALL LETTER TSV +foldMapping '\xABB8' = CM '\x13E8' '\0' '\0' +-- CHEROKEE SMALL LETTER WA +foldMapping '\xABB9' = CM '\x13E9' '\0' '\0' +-- CHEROKEE SMALL LETTER WE +foldMapping '\xABBA' = CM '\x13EA' '\0' '\0' +-- CHEROKEE SMALL LETTER WI +foldMapping '\xABBB' = CM '\x13EB' '\0' '\0' +-- CHEROKEE SMALL LETTER WO +foldMapping '\xABBC' = CM '\x13EC' '\0' '\0' +-- CHEROKEE SMALL LETTER WU +foldMapping '\xABBD' = CM '\x13ED' '\0' '\0' +-- CHEROKEE SMALL LETTER WV +foldMapping '\xABBE' = CM '\x13EE' '\0' '\0' +-- CHEROKEE SMALL LETTER YA +foldMapping '\xABBF' = CM '\x13EF' '\0' '\0' +-- LATIN SMALL LIGATURE FF +foldMapping '\xFB00' = CM '\x0066' '\x0066' '\0' +-- LATIN SMALL LIGATURE FI +foldMapping '\xFB01' = CM '\x0066' '\x0069' '\0' +-- LATIN SMALL LIGATURE FL +foldMapping '\xFB02' = CM '\x0066' '\x006C' '\0' +-- LATIN SMALL LIGATURE FFI +foldMapping '\xFB03' = CM '\x0066' '\x0066' '\x0069' +-- LATIN SMALL LIGATURE FFL +foldMapping '\xFB04' = CM '\x0066' '\x0066' '\x006C' +-- LATIN SMALL LIGATURE LONG S T +foldMapping '\xFB05' = CM '\x0073' '\x0074' '\0' +-- LATIN SMALL LIGATURE ST +foldMapping '\xFB06' = CM '\x0073' '\x0074' '\0' +-- ARMENIAN SMALL LIGATURE MEN NOW +foldMapping '\xFB13' = CM '\x0574' '\x0576' '\0' +-- ARMENIAN SMALL LIGATURE MEN ECH +foldMapping '\xFB14' = CM '\x0574' '\x0565' '\0' +-- ARMENIAN SMALL LIGATURE MEN INI +foldMapping '\xFB15' = CM '\x0574' '\x056B' '\0' +-- ARMENIAN SMALL LIGATURE VEW NOW +foldMapping '\xFB16' = CM '\x057E' '\x0576' '\0' +-- ARMENIAN SMALL LIGATURE MEN XEH +foldMapping '\xFB17' = CM '\x0574' '\x056D' '\0' +-- FULLWIDTH LATIN CAPITAL LETTER A +foldMapping '\xFF21' = CM '\xFF41' '\0' '\0' +-- FULLWIDTH LATIN CAPITAL LETTER B +foldMapping '\xFF22' = CM '\xFF42' '\0' '\0' +-- FULLWIDTH LATIN CAPITAL LETTER C +foldMapping '\xFF23' = CM '\xFF43' '\0' '\0' +-- FULLWIDTH LATIN CAPITAL LETTER D +foldMapping '\xFF24' = CM '\xFF44' '\0' '\0' +-- FULLWIDTH LATIN CAPITAL LETTER E +foldMapping '\xFF25' = CM '\xFF45' '\0' '\0' +-- FULLWIDTH LATIN CAPITAL LETTER F +foldMapping '\xFF26' = CM '\xFF46' '\0' '\0' +-- FULLWIDTH LATIN CAPITAL LETTER G +foldMapping '\xFF27' = CM '\xFF47' '\0' '\0' +-- FULLWIDTH LATIN CAPITAL LETTER H +foldMapping '\xFF28' = CM '\xFF48' '\0' '\0' +-- FULLWIDTH LATIN CAPITAL LETTER I +foldMapping '\xFF29' = CM '\xFF49' '\0' '\0' +-- FULLWIDTH LATIN CAPITAL LETTER J +foldMapping '\xFF2A' = CM '\xFF4A' '\0' '\0' +-- FULLWIDTH LATIN CAPITAL LETTER K +foldMapping '\xFF2B' = CM '\xFF4B' '\0' '\0' +-- FULLWIDTH LATIN CAPITAL LETTER L +foldMapping '\xFF2C' = CM '\xFF4C' '\0' '\0' +-- FULLWIDTH LATIN CAPITAL LETTER M +foldMapping '\xFF2D' = CM '\xFF4D' '\0' '\0' +-- FULLWIDTH LATIN CAPITAL LETTER N +foldMapping '\xFF2E' = CM '\xFF4E' '\0' '\0' +-- FULLWIDTH LATIN CAPITAL LETTER O +foldMapping '\xFF2F' = CM '\xFF4F' '\0' '\0' +-- FULLWIDTH LATIN CAPITAL LETTER P +foldMapping '\xFF30' = CM '\xFF50' '\0' '\0' +-- FULLWIDTH LATIN CAPITAL LETTER Q +foldMapping '\xFF31' = CM '\xFF51' '\0' '\0' +-- FULLWIDTH LATIN CAPITAL LETTER R +foldMapping '\xFF32' = CM '\xFF52' '\0' '\0' +-- FULLWIDTH LATIN CAPITAL LETTER S +foldMapping '\xFF33' = CM '\xFF53' '\0' '\0' +-- FULLWIDTH LATIN CAPITAL LETTER T +foldMapping '\xFF34' = CM '\xFF54' '\0' '\0' +-- FULLWIDTH LATIN CAPITAL LETTER U +foldMapping '\xFF35' = CM '\xFF55' '\0' '\0' +-- FULLWIDTH LATIN CAPITAL LETTER V +foldMapping '\xFF36' = CM '\xFF56' '\0' '\0' +-- FULLWIDTH LATIN CAPITAL LETTER W +foldMapping '\xFF37' = CM '\xFF57' '\0' '\0' +-- FULLWIDTH LATIN CAPITAL LETTER X +foldMapping '\xFF38' = CM '\xFF58' '\0' '\0' +-- FULLWIDTH LATIN CAPITAL LETTER Y +foldMapping '\xFF39' = CM '\xFF59' '\0' '\0' +-- FULLWIDTH LATIN CAPITAL LETTER Z +foldMapping '\xFF3A' = CM '\xFF5A' '\0' '\0' +-- DESERET CAPITAL LETTER LONG I +foldMapping '\x10400' = CM '\x10428' '\0' '\0' +-- DESERET CAPITAL LETTER LONG E +foldMapping '\x10401' = CM '\x10429' '\0' '\0' +-- DESERET CAPITAL LETTER LONG A +foldMapping '\x10402' = CM '\x1042A' '\0' '\0' +-- DESERET CAPITAL LETTER LONG AH +foldMapping '\x10403' = CM '\x1042B' '\0' '\0' +-- DESERET CAPITAL LETTER LONG O +foldMapping '\x10404' = CM '\x1042C' '\0' '\0' +-- DESERET CAPITAL LETTER LONG OO +foldMapping '\x10405' = CM '\x1042D' '\0' '\0' +-- DESERET CAPITAL LETTER SHORT I +foldMapping '\x10406' = CM '\x1042E' '\0' '\0' +-- DESERET CAPITAL LETTER SHORT E +foldMapping '\x10407' = CM '\x1042F' '\0' '\0' +-- DESERET CAPITAL LETTER SHORT A +foldMapping '\x10408' = CM '\x10430' '\0' '\0' +-- DESERET CAPITAL LETTER SHORT AH +foldMapping '\x10409' = CM '\x10431' '\0' '\0' +-- DESERET CAPITAL LETTER SHORT O +foldMapping '\x1040A' = CM '\x10432' '\0' '\0' +-- DESERET CAPITAL LETTER SHORT OO +foldMapping '\x1040B' = CM '\x10433' '\0' '\0' +-- DESERET CAPITAL LETTER AY +foldMapping '\x1040C' = CM '\x10434' '\0' '\0' +-- DESERET CAPITAL LETTER OW +foldMapping '\x1040D' = CM '\x10435' '\0' '\0' +-- DESERET CAPITAL LETTER WU +foldMapping '\x1040E' = CM '\x10436' '\0' '\0' +-- DESERET CAPITAL LETTER YEE +foldMapping '\x1040F' = CM '\x10437' '\0' '\0' +-- DESERET CAPITAL LETTER H +foldMapping '\x10410' = CM '\x10438' '\0' '\0' +-- DESERET CAPITAL LETTER PEE +foldMapping '\x10411' = CM '\x10439' '\0' '\0' +-- DESERET CAPITAL LETTER BEE +foldMapping '\x10412' = CM '\x1043A' '\0' '\0' +-- DESERET CAPITAL LETTER TEE +foldMapping '\x10413' = CM '\x1043B' '\0' '\0' +-- DESERET CAPITAL LETTER DEE +foldMapping '\x10414' = CM '\x1043C' '\0' '\0' +-- DESERET CAPITAL LETTER CHEE +foldMapping '\x10415' = CM '\x1043D' '\0' '\0' +-- DESERET CAPITAL LETTER JEE +foldMapping '\x10416' = CM '\x1043E' '\0' '\0' +-- DESERET CAPITAL LETTER KAY +foldMapping '\x10417' = CM '\x1043F' '\0' '\0' +-- DESERET CAPITAL LETTER GAY +foldMapping '\x10418' = CM '\x10440' '\0' '\0' +-- DESERET CAPITAL LETTER EF +foldMapping '\x10419' = CM '\x10441' '\0' '\0' +-- DESERET CAPITAL LETTER VEE +foldMapping '\x1041A' = CM '\x10442' '\0' '\0' +-- DESERET CAPITAL LETTER ETH +foldMapping '\x1041B' = CM '\x10443' '\0' '\0' +-- DESERET CAPITAL LETTER THEE +foldMapping '\x1041C' = CM '\x10444' '\0' '\0' +-- DESERET CAPITAL LETTER ES +foldMapping '\x1041D' = CM '\x10445' '\0' '\0' +-- DESERET CAPITAL LETTER ZEE +foldMapping '\x1041E' = CM '\x10446' '\0' '\0' +-- DESERET CAPITAL LETTER ESH +foldMapping '\x1041F' = CM '\x10447' '\0' '\0' +-- DESERET CAPITAL LETTER ZHEE +foldMapping '\x10420' = CM '\x10448' '\0' '\0' +-- DESERET CAPITAL LETTER ER +foldMapping '\x10421' = CM '\x10449' '\0' '\0' +-- DESERET CAPITAL LETTER EL +foldMapping '\x10422' = CM '\x1044A' '\0' '\0' +-- DESERET CAPITAL LETTER EM +foldMapping '\x10423' = CM '\x1044B' '\0' '\0' +-- DESERET CAPITAL LETTER EN +foldMapping '\x10424' = CM '\x1044C' '\0' '\0' +-- DESERET CAPITAL LETTER ENG +foldMapping '\x10425' = CM '\x1044D' '\0' '\0' +-- DESERET CAPITAL LETTER OI +foldMapping '\x10426' = CM '\x1044E' '\0' '\0' +-- DESERET CAPITAL LETTER EW +foldMapping '\x10427' = CM '\x1044F' '\0' '\0' +-- OSAGE CAPITAL LETTER A +foldMapping '\x104B0' = CM '\x104D8' '\0' '\0' +-- OSAGE CAPITAL LETTER AI +foldMapping '\x104B1' = CM '\x104D9' '\0' '\0' +-- OSAGE CAPITAL LETTER AIN +foldMapping '\x104B2' = CM '\x104DA' '\0' '\0' +-- OSAGE CAPITAL LETTER AH +foldMapping '\x104B3' = CM '\x104DB' '\0' '\0' +-- OSAGE CAPITAL LETTER BRA +foldMapping '\x104B4' = CM '\x104DC' '\0' '\0' +-- OSAGE CAPITAL LETTER CHA +foldMapping '\x104B5' = CM '\x104DD' '\0' '\0' +-- OSAGE CAPITAL LETTER EHCHA +foldMapping '\x104B6' = CM '\x104DE' '\0' '\0' +-- OSAGE CAPITAL LETTER E +foldMapping '\x104B7' = CM '\x104DF' '\0' '\0' +-- OSAGE CAPITAL LETTER EIN +foldMapping '\x104B8' = CM '\x104E0' '\0' '\0' +-- OSAGE CAPITAL LETTER HA +foldMapping '\x104B9' = CM '\x104E1' '\0' '\0' +-- OSAGE CAPITAL LETTER HYA +foldMapping '\x104BA' = CM '\x104E2' '\0' '\0' +-- OSAGE CAPITAL LETTER I +foldMapping '\x104BB' = CM '\x104E3' '\0' '\0' +-- OSAGE CAPITAL LETTER KA +foldMapping '\x104BC' = CM '\x104E4' '\0' '\0' +-- OSAGE CAPITAL LETTER EHKA +foldMapping '\x104BD' = CM '\x104E5' '\0' '\0' +-- OSAGE CAPITAL LETTER KYA +foldMapping '\x104BE' = CM '\x104E6' '\0' '\0' +-- OSAGE CAPITAL LETTER LA +foldMapping '\x104BF' = CM '\x104E7' '\0' '\0' +-- OSAGE CAPITAL LETTER MA +foldMapping '\x104C0' = CM '\x104E8' '\0' '\0' +-- OSAGE CAPITAL LETTER NA +foldMapping '\x104C1' = CM '\x104E9' '\0' '\0' +-- OSAGE CAPITAL LETTER O +foldMapping '\x104C2' = CM '\x104EA' '\0' '\0' +-- OSAGE CAPITAL LETTER OIN +foldMapping '\x104C3' = CM '\x104EB' '\0' '\0' +-- OSAGE CAPITAL LETTER PA +foldMapping '\x104C4' = CM '\x104EC' '\0' '\0' +-- OSAGE CAPITAL LETTER EHPA +foldMapping '\x104C5' = CM '\x104ED' '\0' '\0' +-- OSAGE CAPITAL LETTER SA +foldMapping '\x104C6' = CM '\x104EE' '\0' '\0' +-- OSAGE CAPITAL LETTER SHA +foldMapping '\x104C7' = CM '\x104EF' '\0' '\0' +-- OSAGE CAPITAL LETTER TA +foldMapping '\x104C8' = CM '\x104F0' '\0' '\0' +-- OSAGE CAPITAL LETTER EHTA +foldMapping '\x104C9' = CM '\x104F1' '\0' '\0' +-- OSAGE CAPITAL LETTER TSA +foldMapping '\x104CA' = CM '\x104F2' '\0' '\0' +-- OSAGE CAPITAL LETTER EHTSA +foldMapping '\x104CB' = CM '\x104F3' '\0' '\0' +-- OSAGE CAPITAL LETTER TSHA +foldMapping '\x104CC' = CM '\x104F4' '\0' '\0' +-- OSAGE CAPITAL LETTER DHA +foldMapping '\x104CD' = CM '\x104F5' '\0' '\0' +-- OSAGE CAPITAL LETTER U +foldMapping '\x104CE' = CM '\x104F6' '\0' '\0' +-- OSAGE CAPITAL LETTER WA +foldMapping '\x104CF' = CM '\x104F7' '\0' '\0' +-- OSAGE CAPITAL LETTER KHA +foldMapping '\x104D0' = CM '\x104F8' '\0' '\0' +-- OSAGE CAPITAL LETTER GHA +foldMapping '\x104D1' = CM '\x104F9' '\0' '\0' +-- OSAGE CAPITAL LETTER ZA +foldMapping '\x104D2' = CM '\x104FA' '\0' '\0' +-- OSAGE CAPITAL LETTER ZHA +foldMapping '\x104D3' = CM '\x104FB' '\0' '\0' +-- OLD HUNGARIAN CAPITAL LETTER A +foldMapping '\x10C80' = CM '\x10CC0' '\0' '\0' +-- OLD HUNGARIAN CAPITAL LETTER AA +foldMapping '\x10C81' = CM '\x10CC1' '\0' '\0' +-- OLD HUNGARIAN CAPITAL LETTER EB +foldMapping '\x10C82' = CM '\x10CC2' '\0' '\0' +-- OLD HUNGARIAN CAPITAL LETTER AMB +foldMapping '\x10C83' = CM '\x10CC3' '\0' '\0' +-- OLD HUNGARIAN CAPITAL LETTER EC +foldMapping '\x10C84' = CM '\x10CC4' '\0' '\0' +-- OLD HUNGARIAN CAPITAL LETTER ENC +foldMapping '\x10C85' = CM '\x10CC5' '\0' '\0' +-- OLD HUNGARIAN CAPITAL LETTER ECS +foldMapping '\x10C86' = CM '\x10CC6' '\0' '\0' +-- OLD HUNGARIAN CAPITAL LETTER ED +foldMapping '\x10C87' = CM '\x10CC7' '\0' '\0' +-- OLD HUNGARIAN CAPITAL LETTER AND +foldMapping '\x10C88' = CM '\x10CC8' '\0' '\0' +-- OLD HUNGARIAN CAPITAL LETTER E +foldMapping '\x10C89' = CM '\x10CC9' '\0' '\0' +-- OLD HUNGARIAN CAPITAL LETTER CLOSE E +foldMapping '\x10C8A' = CM '\x10CCA' '\0' '\0' +-- OLD HUNGARIAN CAPITAL LETTER EE +foldMapping '\x10C8B' = CM '\x10CCB' '\0' '\0' +-- OLD HUNGARIAN CAPITAL LETTER EF +foldMapping '\x10C8C' = CM '\x10CCC' '\0' '\0' +-- OLD HUNGARIAN CAPITAL LETTER EG +foldMapping '\x10C8D' = CM '\x10CCD' '\0' '\0' +-- OLD HUNGARIAN CAPITAL LETTER EGY +foldMapping '\x10C8E' = CM '\x10CCE' '\0' '\0' +-- OLD HUNGARIAN CAPITAL LETTER EH +foldMapping '\x10C8F' = CM '\x10CCF' '\0' '\0' +-- OLD HUNGARIAN CAPITAL LETTER I +foldMapping '\x10C90' = CM '\x10CD0' '\0' '\0' +-- OLD HUNGARIAN CAPITAL LETTER II +foldMapping '\x10C91' = CM '\x10CD1' '\0' '\0' +-- OLD HUNGARIAN CAPITAL LETTER EJ +foldMapping '\x10C92' = CM '\x10CD2' '\0' '\0' +-- OLD HUNGARIAN CAPITAL LETTER EK +foldMapping '\x10C93' = CM '\x10CD3' '\0' '\0' +-- OLD HUNGARIAN CAPITAL LETTER AK +foldMapping '\x10C94' = CM '\x10CD4' '\0' '\0' +-- OLD HUNGARIAN CAPITAL LETTER UNK +foldMapping '\x10C95' = CM '\x10CD5' '\0' '\0' +-- OLD HUNGARIAN CAPITAL LETTER EL +foldMapping '\x10C96' = CM '\x10CD6' '\0' '\0' +-- OLD HUNGARIAN CAPITAL LETTER ELY +foldMapping '\x10C97' = CM '\x10CD7' '\0' '\0' +-- OLD HUNGARIAN CAPITAL LETTER EM +foldMapping '\x10C98' = CM '\x10CD8' '\0' '\0' +-- OLD HUNGARIAN CAPITAL LETTER EN +foldMapping '\x10C99' = CM '\x10CD9' '\0' '\0' +-- OLD HUNGARIAN CAPITAL LETTER ENY +foldMapping '\x10C9A' = CM '\x10CDA' '\0' '\0' +-- OLD HUNGARIAN CAPITAL LETTER O +foldMapping '\x10C9B' = CM '\x10CDB' '\0' '\0' +-- OLD HUNGARIAN CAPITAL LETTER OO +foldMapping '\x10C9C' = CM '\x10CDC' '\0' '\0' +-- OLD HUNGARIAN CAPITAL LETTER NIKOLSBURG OE +foldMapping '\x10C9D' = CM '\x10CDD' '\0' '\0' +-- OLD HUNGARIAN CAPITAL LETTER RUDIMENTA OE +foldMapping '\x10C9E' = CM '\x10CDE' '\0' '\0' +-- OLD HUNGARIAN CAPITAL LETTER OEE +foldMapping '\x10C9F' = CM '\x10CDF' '\0' '\0' +-- OLD HUNGARIAN CAPITAL LETTER EP +foldMapping '\x10CA0' = CM '\x10CE0' '\0' '\0' +-- OLD HUNGARIAN CAPITAL LETTER EMP +foldMapping '\x10CA1' = CM '\x10CE1' '\0' '\0' +-- OLD HUNGARIAN CAPITAL LETTER ER +foldMapping '\x10CA2' = CM '\x10CE2' '\0' '\0' +-- OLD HUNGARIAN CAPITAL LETTER SHORT ER +foldMapping '\x10CA3' = CM '\x10CE3' '\0' '\0' +-- OLD HUNGARIAN CAPITAL LETTER ES +foldMapping '\x10CA4' = CM '\x10CE4' '\0' '\0' +-- OLD HUNGARIAN CAPITAL LETTER ESZ +foldMapping '\x10CA5' = CM '\x10CE5' '\0' '\0' +-- OLD HUNGARIAN CAPITAL LETTER ET +foldMapping '\x10CA6' = CM '\x10CE6' '\0' '\0' +-- OLD HUNGARIAN CAPITAL LETTER ENT +foldMapping '\x10CA7' = CM '\x10CE7' '\0' '\0' +-- OLD HUNGARIAN CAPITAL LETTER ETY +foldMapping '\x10CA8' = CM '\x10CE8' '\0' '\0' +-- OLD HUNGARIAN CAPITAL LETTER ECH +foldMapping '\x10CA9' = CM '\x10CE9' '\0' '\0' +-- OLD HUNGARIAN CAPITAL LETTER U +foldMapping '\x10CAA' = CM '\x10CEA' '\0' '\0' +-- OLD HUNGARIAN CAPITAL LETTER UU +foldMapping '\x10CAB' = CM '\x10CEB' '\0' '\0' +-- OLD HUNGARIAN CAPITAL LETTER NIKOLSBURG UE +foldMapping '\x10CAC' = CM '\x10CEC' '\0' '\0' +-- OLD HUNGARIAN CAPITAL LETTER RUDIMENTA UE +foldMapping '\x10CAD' = CM '\x10CED' '\0' '\0' +-- OLD HUNGARIAN CAPITAL LETTER EV +foldMapping '\x10CAE' = CM '\x10CEE' '\0' '\0' +-- OLD HUNGARIAN CAPITAL LETTER EZ +foldMapping '\x10CAF' = CM '\x10CEF' '\0' '\0' +-- OLD HUNGARIAN CAPITAL LETTER EZS +foldMapping '\x10CB0' = CM '\x10CF0' '\0' '\0' +-- OLD HUNGARIAN CAPITAL LETTER ENT-SHAPED SIGN +foldMapping '\x10CB1' = CM '\x10CF1' '\0' '\0' +-- OLD HUNGARIAN CAPITAL LETTER US +foldMapping '\x10CB2' = CM '\x10CF2' '\0' '\0' +-- WARANG CITI CAPITAL LETTER NGAA +foldMapping '\x118A0' = CM '\x118C0' '\0' '\0' +-- WARANG CITI CAPITAL LETTER A +foldMapping '\x118A1' = CM '\x118C1' '\0' '\0' +-- WARANG CITI CAPITAL LETTER WI +foldMapping '\x118A2' = CM '\x118C2' '\0' '\0' +-- WARANG CITI CAPITAL LETTER YU +foldMapping '\x118A3' = CM '\x118C3' '\0' '\0' +-- WARANG CITI CAPITAL LETTER YA +foldMapping '\x118A4' = CM '\x118C4' '\0' '\0' +-- WARANG CITI CAPITAL LETTER YO +foldMapping '\x118A5' = CM '\x118C5' '\0' '\0' +-- WARANG CITI CAPITAL LETTER II +foldMapping '\x118A6' = CM '\x118C6' '\0' '\0' +-- WARANG CITI CAPITAL LETTER UU +foldMapping '\x118A7' = CM '\x118C7' '\0' '\0' +-- WARANG CITI CAPITAL LETTER E +foldMapping '\x118A8' = CM '\x118C8' '\0' '\0' +-- WARANG CITI CAPITAL LETTER O +foldMapping '\x118A9' = CM '\x118C9' '\0' '\0' +-- WARANG CITI CAPITAL LETTER ANG +foldMapping '\x118AA' = CM '\x118CA' '\0' '\0' +-- WARANG CITI CAPITAL LETTER GA +foldMapping '\x118AB' = CM '\x118CB' '\0' '\0' +-- WARANG CITI CAPITAL LETTER KO +foldMapping '\x118AC' = CM '\x118CC' '\0' '\0' +-- WARANG CITI CAPITAL LETTER ENY +foldMapping '\x118AD' = CM '\x118CD' '\0' '\0' +-- WARANG CITI CAPITAL LETTER YUJ +foldMapping '\x118AE' = CM '\x118CE' '\0' '\0' +-- WARANG CITI CAPITAL LETTER UC +foldMapping '\x118AF' = CM '\x118CF' '\0' '\0' +-- WARANG CITI CAPITAL LETTER ENN +foldMapping '\x118B0' = CM '\x118D0' '\0' '\0' +-- WARANG CITI CAPITAL LETTER ODD +foldMapping '\x118B1' = CM '\x118D1' '\0' '\0' +-- WARANG CITI CAPITAL LETTER TTE +foldMapping '\x118B2' = CM '\x118D2' '\0' '\0' +-- WARANG CITI CAPITAL LETTER NUNG +foldMapping '\x118B3' = CM '\x118D3' '\0' '\0' +-- WARANG CITI CAPITAL LETTER DA +foldMapping '\x118B4' = CM '\x118D4' '\0' '\0' +-- WARANG CITI CAPITAL LETTER AT +foldMapping '\x118B5' = CM '\x118D5' '\0' '\0' +-- WARANG CITI CAPITAL LETTER AM +foldMapping '\x118B6' = CM '\x118D6' '\0' '\0' +-- WARANG CITI CAPITAL LETTER BU +foldMapping '\x118B7' = CM '\x118D7' '\0' '\0' +-- WARANG CITI CAPITAL LETTER PU +foldMapping '\x118B8' = CM '\x118D8' '\0' '\0' +-- WARANG CITI CAPITAL LETTER HIYO +foldMapping '\x118B9' = CM '\x118D9' '\0' '\0' +-- WARANG CITI CAPITAL LETTER HOLO +foldMapping '\x118BA' = CM '\x118DA' '\0' '\0' +-- WARANG CITI CAPITAL LETTER HORR +foldMapping '\x118BB' = CM '\x118DB' '\0' '\0' +-- WARANG CITI CAPITAL LETTER HAR +foldMapping '\x118BC' = CM '\x118DC' '\0' '\0' +-- WARANG CITI CAPITAL LETTER SSUU +foldMapping '\x118BD' = CM '\x118DD' '\0' '\0' +-- WARANG CITI CAPITAL LETTER SII +foldMapping '\x118BE' = CM '\x118DE' '\0' '\0' +-- WARANG CITI CAPITAL LETTER VIYO +foldMapping '\x118BF' = CM '\x118DF' '\0' '\0' +-- ADLAM CAPITAL LETTER ALIF +foldMapping '\x1E900' = CM '\x1E922' '\0' '\0' +-- ADLAM CAPITAL LETTER DAALI +foldMapping '\x1E901' = CM '\x1E923' '\0' '\0' +-- ADLAM CAPITAL LETTER LAAM +foldMapping '\x1E902' = CM '\x1E924' '\0' '\0' +-- ADLAM CAPITAL LETTER MIIM +foldMapping '\x1E903' = CM '\x1E925' '\0' '\0' +-- ADLAM CAPITAL LETTER BA +foldMapping '\x1E904' = CM '\x1E926' '\0' '\0' +-- ADLAM CAPITAL LETTER SINNYIIYHE +foldMapping '\x1E905' = CM '\x1E927' '\0' '\0' +-- ADLAM CAPITAL LETTER PE +foldMapping '\x1E906' = CM '\x1E928' '\0' '\0' +-- ADLAM CAPITAL LETTER BHE +foldMapping '\x1E907' = CM '\x1E929' '\0' '\0' +-- ADLAM CAPITAL LETTER RA +foldMapping '\x1E908' = CM '\x1E92A' '\0' '\0' +-- ADLAM CAPITAL LETTER E +foldMapping '\x1E909' = CM '\x1E92B' '\0' '\0' +-- ADLAM CAPITAL LETTER FA +foldMapping '\x1E90A' = CM '\x1E92C' '\0' '\0' +-- ADLAM CAPITAL LETTER I +foldMapping '\x1E90B' = CM '\x1E92D' '\0' '\0' +-- ADLAM CAPITAL LETTER O +foldMapping '\x1E90C' = CM '\x1E92E' '\0' '\0' +-- ADLAM CAPITAL LETTER DHA +foldMapping '\x1E90D' = CM '\x1E92F' '\0' '\0' +-- ADLAM CAPITAL LETTER YHE +foldMapping '\x1E90E' = CM '\x1E930' '\0' '\0' +-- ADLAM CAPITAL LETTER WAW +foldMapping '\x1E90F' = CM '\x1E931' '\0' '\0' +-- ADLAM CAPITAL LETTER NUN +foldMapping '\x1E910' = CM '\x1E932' '\0' '\0' +-- ADLAM CAPITAL LETTER KAF +foldMapping '\x1E911' = CM '\x1E933' '\0' '\0' +-- ADLAM CAPITAL LETTER YA +foldMapping '\x1E912' = CM '\x1E934' '\0' '\0' +-- ADLAM CAPITAL LETTER U +foldMapping '\x1E913' = CM '\x1E935' '\0' '\0' +-- ADLAM CAPITAL LETTER JIIM +foldMapping '\x1E914' = CM '\x1E936' '\0' '\0' +-- ADLAM CAPITAL LETTER CHI +foldMapping '\x1E915' = CM '\x1E937' '\0' '\0' +-- ADLAM CAPITAL LETTER HA +foldMapping '\x1E916' = CM '\x1E938' '\0' '\0' +-- ADLAM CAPITAL LETTER QAAF +foldMapping '\x1E917' = CM '\x1E939' '\0' '\0' +-- ADLAM CAPITAL LETTER GA +foldMapping '\x1E918' = CM '\x1E93A' '\0' '\0' +-- ADLAM CAPITAL LETTER NYA +foldMapping '\x1E919' = CM '\x1E93B' '\0' '\0' +-- ADLAM CAPITAL LETTER TU +foldMapping '\x1E91A' = CM '\x1E93C' '\0' '\0' +-- ADLAM CAPITAL LETTER NHA +foldMapping '\x1E91B' = CM '\x1E93D' '\0' '\0' +-- ADLAM CAPITAL LETTER VA +foldMapping '\x1E91C' = CM '\x1E93E' '\0' '\0' +-- ADLAM CAPITAL LETTER KHA +foldMapping '\x1E91D' = CM '\x1E93F' '\0' '\0' +-- ADLAM CAPITAL LETTER GBE +foldMapping '\x1E91E' = CM '\x1E940' '\0' '\0' +-- ADLAM CAPITAL LETTER ZAL +foldMapping '\x1E91F' = CM '\x1E941' '\0' '\0' +-- ADLAM CAPITAL LETTER KPO +foldMapping '\x1E920' = CM '\x1E942' '\0' '\0' +-- ADLAM CAPITAL LETTER SHA +foldMapping '\x1E921' = CM '\x1E943' '\0' '\0' +foldMapping c = CM (toLower c) '\0' '\0' \ No newline at end of file diff --git a/basement/Basement/Types/Word128.hs b/basement/Basement/Types/Word128.hs index 608805cd..d22dd31b 100644 --- a/basement/Basement/Types/Word128.hs +++ b/basement/Basement/Types/Word128.hs @@ -1,6 +1,7 @@ -{-# LANGUAGE CPP #-} -{-# LANGUAGE MagicHash #-} -{-# LANGUAGE UnboxedTuples #-} +{-# LANGUAGE CPP #-} +{-# LANGUAGE MagicHash #-} +{-# LANGUAGE UnboxedTuples #-} +{-# LANGUAGE DeriveDataTypeable #-} module Basement.Types.Word128 ( Word128(..) , (+) @@ -37,7 +38,7 @@ import Basement.Numerical.Number -- | 128 bits Word data Word128 = Word128 {-# UNPACK #-} !Word64 {-# UNPACK #-} !Word64 - deriving (Eq) + deriving (Eq, Typeable) instance Show Word128 where show w = Prelude.show (toNatural w) diff --git a/basement/Basement/Types/Word256.hs b/basement/Basement/Types/Word256.hs index e1aa8857..daaa1032 100644 --- a/basement/Basement/Types/Word256.hs +++ b/basement/Basement/Types/Word256.hs @@ -1,6 +1,7 @@ -{-# LANGUAGE CPP #-} -{-# LANGUAGE MagicHash #-} -{-# LANGUAGE UnboxedTuples #-} +{-# LANGUAGE CPP #-} +{-# LANGUAGE MagicHash #-} +{-# LANGUAGE UnboxedTuples #-} +{-# LANGUAGE DeriveDataTypeable #-} module Basement.Types.Word256 ( Word256(..) , (+) @@ -39,7 +40,7 @@ data Word256 = Word256 {-# UNPACK #-} !Word64 {-# UNPACK #-} !Word64 {-# UNPACK #-} !Word64 {-# UNPACK #-} !Word64 - deriving (Eq) + deriving (Eq, Typeable) instance Show Word256 where show w = Prelude.show (toNatural w) diff --git a/basement/Basement/UArray/Base.hs b/basement/Basement/UArray/Base.hs index 48d9e36b..10dc4e06 100644 --- a/basement/Basement/UArray/Base.hs +++ b/basement/Basement/UArray/Base.hs @@ -605,29 +605,26 @@ append a b !la = length a !lb = length b -concat :: PrimType ty => [UArray ty] -> UArray ty -concat [] = empty -concat l = - case filterAndSum (CountOf 0) [] l of - (_,[]) -> empty - (_,[x]) -> x - (totalLen,chunks) -> runST $ do - r <- new totalLen - doCopy r (Offset 0) chunks - unsafeFreeze r +concat :: forall ty . PrimType ty => [UArray ty] -> UArray ty +concat original = runST $ do + r <- new total + goCopy r 0 original + unsafeFreeze r where - -- TODO would go faster not to reverse but pack from the end instead - filterAndSum !totalLen acc [] = (totalLen, List.reverse acc) - filterAndSum !totalLen acc (x:xs) - | len == CountOf 0 = filterAndSum totalLen acc xs - | otherwise = filterAndSum (len+totalLen) (x:acc) xs - where len = length x - - doCopy _ _ [] = return () - doCopy r i (x:xs) = do - unsafeCopyAtRO r i x (Offset 0) lx - doCopy r (i `offsetPlusE` lx) xs - where lx = length x + !total = size 0 original + -- size + size !sz [] = sz + size !sz (x:xs) = size (length x + sz) xs + + zero = Offset 0 + + goCopy r = loop + where + loop _ [] = pure () + loop !i (x:xs) = do + unsafeCopyAtRO r i x zero lx + loop (i `offsetPlusE` lx) xs + where !lx = length x -- | Create a Block from a UArray. -- diff --git a/basement/Basement/UTF8/Types.hs b/basement/Basement/UTF8/Types.hs index 774b9e14..0091abb6 100644 --- a/basement/Basement/UTF8/Types.hs +++ b/basement/Basement/UTF8/Types.hs @@ -9,6 +9,8 @@ module Basement.UTF8.Types , isValidStepDigit -- * Unicode Errors , ValidationFailure(..) + -- * Case Conversion + , CM (..) ) where import Basement.Compat.Base @@ -34,6 +36,9 @@ newtype StepDigit = StepDigit Word8 -- | Step when processing ASCII character newtype StepASCII = StepASCII Word8 +-- | Specialized tuple used for case mapping. +data CM = CM {-# UNPACK #-} !Char {-# UNPACK #-} !Char {-# UNPACK #-} !Char deriving (Eq) + isValidStepASCII :: StepASCII -> Bool isValidStepASCII (StepASCII w) = w < 0x80 diff --git a/basement/basement.cabal b/basement/basement.cabal index c9ec237b..3a7341b6 100644 --- a/basement/basement.cabal +++ b/basement/basement.cabal @@ -1,12 +1,12 @@ name: basement -version: 0.0.5 +version: 0.0.6 synopsis: Foundation scrap box of array & string description: Foundation most basic primitives without any dependencies homepage: https://github.com/haskell-foundation/foundation#readme license: BSD3 license-file: LICENSE copyright: 2015-2017 Vincent Hanquez - 2017 Foundation Maintainers + 2017-2018 Foundation Maintainers maintainer: vincent@snarc.org copyright: Vincent Hanquez category: Web @@ -80,6 +80,7 @@ library Basement.Alg.XorShift -- compat / base redefinition + Basement.Compat.AMP Basement.Compat.Base Basement.Compat.Bifunctor Basement.Compat.CallStack @@ -131,6 +132,7 @@ library Basement.UArray.Base + Basement.String.CaseMapping Basement.String.Encoding.Encoding Basement.String.Encoding.UTF16 Basement.String.Encoding.UTF32 diff --git a/benchs/Fake/ByteString.hs b/benchs/Fake/ByteString.hs index cee50fe4..ba5afac2 100644 --- a/benchs/Fake/ByteString.hs +++ b/benchs/Fake/ByteString.hs @@ -17,6 +17,7 @@ module Fake.ByteString , readInt , readInteger , unpack + , concat ) where import Prelude (undefined, Maybe(..)) @@ -41,6 +42,8 @@ foldr _ _ _ = undefined and _ _ = undefined all _ _ = undefined any _ _ = undefined +concat :: [ByteString] -> ByteString +concat _ = undefined unpack :: ByteString -> [Word8] unpack = undefined diff --git a/benchs/Fake/Vector.hs b/benchs/Fake/Vector.hs index cc7850be..311dcd66 100644 --- a/benchs/Fake/Vector.hs +++ b/benchs/Fake/Vector.hs @@ -15,6 +15,7 @@ module Fake.Vector , and , all , any + , concat ) where import Prelude (undefined) @@ -40,3 +41,4 @@ foldr _ _ _ = undefined and _ _ = undefined all _ _ = undefined any _ _ = undefined +concat = undefined diff --git a/benchs/Main.hs b/benchs/Main.hs index 92b79a8b..9b58e6ce 100644 --- a/benchs/Main.hs +++ b/benchs/Main.hs @@ -13,6 +13,7 @@ import Foundation.String.Read import Foundation.String import BenchUtil.Common import BenchUtil.RefData +import qualified Basement.Block.Builder as Builder import Sys @@ -179,6 +180,8 @@ benchsByteArray = bgroup "ByteArray" , benchFoldr , benchReverse , benchFilter + , benchMonoidConcat + , benchBuilderBlock , benchAll , benchSort , benchSort32 @@ -204,11 +207,36 @@ benchsByteArray = bgroup "ByteArray" t = ByteString.pack dat v = Vector.fromList dat + diffListByteArray :: ([UArray Word8] -> a) + -> ([Block Word8] -> b) + -> ([ByteString.ByteString] -> c) + -> ([Vector.Vector Word8] -> d) + -> [[Word8]] + -> [Benchmark] + diffListByteArray uarrayBench blockBench bsBench vectorBench dat = + [ bench "[UArray_W8]" $ whnf uarrayBench s + , bench "[Block_W8]" $ whnf blockBench s' +#ifdef BENCH_ALL + , bench "[ByteString]" $ whnf bsBench t + , bench "[Vector_W8]" $ whnf vectorBench v +#endif + ] + where + s = fromList <$> dat + s' = fromList <$> dat + t = ByteString.pack <$> dat + v = Vector.fromList <$> dat + allDat = [ ("bs20", rdBytes20) , ("bs200", rdBytes200) , ("bs2000", rdBytes2000) ] + allListDat = + [ ("listBs20", Prelude.replicate 20 rdBytes20) + , ("listBs200", Prelude.replicate 200 rdBytes200) + , ("listBs2000", Prelude.replicate 2000 rdBytes2000) + ] allDatSuffix s = fmap (first (\x -> x <> "-" <> s)) allDat benchLength = bgroup "Length" $ @@ -270,6 +298,15 @@ benchsByteArray = bgroup "ByteArray" (ByteString.filter (> 100)) (Vector.filter (> 100)) dat) allDat + benchMonoidConcat = bgroup "Monoid/mconcat" $ + fmap (\(n, dat) -> bgroup n $ diffListByteArray mconcat mconcat ByteString.concat Vector.concat dat) allListDat + benchBuilderBlock = bgroup "Monoid/builder" $ + [ bench "[block Word8]" $ whnf builderConcat (Prelude.replicate 2000 (fromList rdBytes2000)) + ] + where + builderConcat :: [Block Word8] -> Block Word8 + builderConcat l = runST $ Builder.run $ mconcat (fmap Builder.emit l) + benchSort = bgroup "Sort" $ fmap (\(n, dat) -> bgroup n $ [ bench "UArray_W8" $ whnf uarrayBench (fromList dat) diff --git a/foundation.cabal b/foundation.cabal index 633335d9..b8553a14 100644 --- a/foundation.cabal +++ b/foundation.cabal @@ -1,5 +1,5 @@ name: foundation -version: 0.0.18 +version: 0.0.19 synopsis: Alternative prelude with batteries and no dependencies description: A custom prelude with no dependencies apart from base. @@ -74,6 +74,7 @@ library Foundation.Conduit Foundation.Conduit.Textual Foundation.Exception + Foundation.Format.CSV Foundation.String Foundation.String.Read Foundation.String.Builder @@ -191,7 +192,7 @@ library BangPatterns DeriveDataTypeable build-depends: base >= 4.7 && < 5 - , basement == 0.0.5 + , basement == 0.0.6 , ghc-prim -- FIXME add suport for armel mipsel -- CPP-options: -DARCH_IS_LITTLE_ENDIAN @@ -228,6 +229,8 @@ test-suite check-foundation Test.Data.List Test.Foundation.Network.IPv4 Test.Foundation.Network.IPv6 + Test.Foundation.Format + Test.Foundation.Format.CSV default-extensions: NoImplicitPrelude RebindableSyntax OverloadedStrings diff --git a/scripts/caseMapping/CaseFolding.hs b/scripts/caseMapping/CaseFolding.hs new file mode 100644 index 00000000..bff8dd74 --- /dev/null +++ b/scripts/caseMapping/CaseFolding.hs @@ -0,0 +1,52 @@ +{-# LANGUAGE OverloadedStrings #-} + +module CaseFolding + ( + CaseFolding(..) + , Fold(..) + , parseCF + , mapCF + ) where + +import Foundation +import Foundation.IO +import qualified Foundation.Parser as P +import qualified Foundation.String as S (lower, fromBytesUnsafe) +import Foundation.VFS.FilePath + +import UnicodeParsers + +data Fold = Fold { + code :: String + , status :: Char + , mapping :: [String] + , name :: String + } deriving (Eq, Ord, Show) + +data CaseFolding = CF { cfComments :: [Comment], cfFolding :: [Fold] } + deriving (Show) + +entries :: P.Parser String CaseFolding +entries = CF <$> P.many comment <*> P.some entry + where + entry = Fold <$> unichar <* semiCol + <*> oneOf "CFST" <* P.string ";" + <*> unichars <* semiCol + <*> (P.string "# " *> P.takeWhile (/= '\n')) <* P.string "\n" + +parseCF :: FilePath -> IO (Either (P.ParseError String) CaseFolding) +parseCF name = P.parseOnly entries . S.fromBytesUnsafe <$> readFile name + +mapCF :: (String -> String) -> CaseFolding -> [String] +mapCF twiddle (CF _ ms) = typ <> (fmap nice . filter p $ ms) <> [last] + where + typ = ["foldMapping :: Char -> CM", + "{-# NOINLINE foldMapping #-}"] + last = "foldMapping c = CM (toLower c) '\\0' '\\0'" + p f = status f `elem` ("CF" :: String) && + mapping f /= [twiddle (code f)] + nice c = "-- " <> name c <> "\n" <> + "foldMapping " <> niceMap (code c) <> " = CM " <> x <> " " <> y <> " " <> z + where pMap = (niceMap <$> mapping c) <> ["'\\0'","'\\0'","'\\0'"] + niceMap x = "'\\x" <> x <> "'" + [x,y,z] = take (CountOf 3) pMap diff --git a/scripts/caseMapping/CaseMapping.hs b/scripts/caseMapping/CaseMapping.hs new file mode 100644 index 00000000..ea16c945 --- /dev/null +++ b/scripts/caseMapping/CaseMapping.hs @@ -0,0 +1,42 @@ +{-# LANGUAGE OverloadedStrings #-} +module CaseMapping ( + main +) where + +import qualified Basement.String as BS (charMap) +import Data.Char (toUpper, toLower) +import Foundation +import Foundation.IO +import qualified Foundation.String as S + +import CaseFolding +import SpecialCasing + +main = do + psc <- parseSC "SpecialCasing.txt" + pcf <- parseCF "CaseFolding.txt" + scs <- case psc of + Left err -> putStrLn (show err) >> undefined + Right sc -> return sc + cfs <- case pcf of + Left err -> putStrLn (show err) >> undefined + Right cf -> return cf + h <- openFile ("../../basement/Basement/String/CaseMapping.hs") WriteMode + let comments = ("--" <>) <$> + take 2 (cfComments cfs) <> take 2 (scComments scs) + (hPut h) . S.toBytes S.UTF8 . intercalate "\n" $ + ["{-# LANGUAGE Rank2Types #-}" + ,"-- AUTOMATICALLY GENERATED - DO NOT EDIT" + ,"-- Generated by scripts/caseMapping/generateCaseMapping.sh"] + <> comments <> + ["" + ,"module Basement.String.CaseMapping where" + ,"" + ,"import Data.Char" + ,"import Basement.UTF8.Types" + ,"",""] + (hPut h) . S.toBytes S.UTF8 . intercalate "\n" $ (mapSC "upper" upper) (BS.charMap toUpper) scs + (hPut h) . S.toBytes S.UTF8 . intercalate "\n" $ (mapSC "lower" lower) (BS.charMap toLower) scs + (hPut h) . S.toBytes S.UTF8 . intercalate "\n" $ (mapSC "title" title) (BS.charMap toUpper) scs + (hPut h) . S.toBytes S.UTF8 . intercalate "\n" $ mapCF (BS.charMap toLower) cfs + closeFile h diff --git a/scripts/caseMapping/SpecialCasing.hs b/scripts/caseMapping/SpecialCasing.hs new file mode 100644 index 00000000..3551ed9b --- /dev/null +++ b/scripts/caseMapping/SpecialCasing.hs @@ -0,0 +1,70 @@ +{-# LANGUAGE OverloadedStrings #-} + +module SpecialCasing + ( + SpecialCasing(..) + , Case(..) + , parseSC + , mapSC + ) where + +import qualified Data.Char as C (toUpper) + +import Foundation +import Foundation.IO +import qualified Foundation.Parser as P +import Foundation.VFS.FilePath +import Foundation.Collection (nonEmpty_) +import qualified Foundation.String as S + +import UnicodeParsers + +data SpecialCasing = SC {scComments :: [Comment], scCasing :: [Case]} + deriving (Show) + +data Case = Case { + code :: String + , lower :: [String] + , title :: [String] + , upper :: [String] + , conditions :: String + , name :: String +} deriving (Eq, Ord, Show) + + +entries :: P.Parser String SpecialCasing +entries = SC <$> P.many comment <*> P.many (entry <* P.many comment) + where + entry = Case <$> unichar <* P.string ";" + <*> unichars <* P.string ";" + <*> unichars <* P.string ";" + <*> unichars <* P.string "; " + <*> (P.takeWhile (/= '#') <* P.string "# ") + <*> P.takeWhile (/= '\n') <* P.string "\n" + +parseSC :: FilePath -> IO (Either (P.ParseError String) SpecialCasing) +parseSC name = P.parseOnly entries . S.fromBytesUnsafe <$> readFile name + +mapSC :: String -> (Case -> [String]) -> (String -> String) -> SpecialCasing -> [String] +mapSC wich access twiddle (SC _ ms) = + typ `mappend` (fmap nice . filter p $ ms) `mappend` last + where + typ = [wich <> "Mapping :: Char -> CM", + "{-# NOINLINE " <> wich <> "Mapping #-}"] + last = [wich <> "Mapping c = CM (to" <> ucFst wich + <> " c) '\\0' '\\0'","",""] + p c = [k] /= a && a /= [twiddle k] && null (conditions c) + where a = access c + k = code c + nice c = "-- " <> name c <> "\n" <> + wich <> "Mapping " <> pHex(code c) <> " = CM " + <> x <> " " <> y <> " " <> z + where pMap = (pHex <$> access c) <> ["'\\0'","'\\0'","'\\0'"] + pHex x = "'\\x" <> x <> "'" + [x,y,z] = take (CountOf 3) pMap + +ucFst :: String -> String +ucFst s + | null s = "" + | otherwise = (fromString [C.toUpper (head neS)]) <> tail neS + where neS = nonEmpty_ s diff --git a/scripts/caseMapping/UnicodeParsers.hs b/scripts/caseMapping/UnicodeParsers.hs new file mode 100644 index 00000000..d6105567 --- /dev/null +++ b/scripts/caseMapping/UnicodeParsers.hs @@ -0,0 +1,31 @@ +{-# LANGUAGE OverloadedStrings #-} +module UnicodeParsers where + +import Foundation +import qualified Foundation.Parser as P +import Foundation.String as S +import Foundation.Collection (Element) + +type Comment = String + +hexDigits :: String +hexDigits = "1234567890ABCDEF" + +comment :: P.Parser String Comment +comment = (P.string "#" *> P.takeWhile (/= '\n') <* P.string "\n") <|> (P.string "\n" *> pure "") + +unichar :: P.Parser String String +unichar = P.takeWhile (`elem` hexDigits) + +unichars :: P.Parser String [String] +unichars = P.some elemz + where elemz = P.string " " *> unichar + +semiCol :: P.Parser String () +semiCol = P.string "; " + +oneOf :: String -> P.Parser String Char +oneOf s = P.satisfy_ (`elem` s) + +spaces :: P.Parser String () +spaces = P.skipWhile (== ' ') diff --git a/scripts/caseMapping/generateCaseMapping.sh b/scripts/caseMapping/generateCaseMapping.sh new file mode 100755 index 00000000..37babb0b --- /dev/null +++ b/scripts/caseMapping/generateCaseMapping.sh @@ -0,0 +1,9 @@ +#!/bin/sh + +# This script will generate the unicode case mappings tables using unicode's +# CaseFolding +# and SpecialCasing.txt files. +# +# Those two files should be downloaded and placed in the same directory as this script. +# +stack runghc -- -XNoImplicitPrelude -XRebindableSyntax -XTypeFamilies -XBangPatterns -XDeriveDataTypeable CaseMapping.hs diff --git a/tests/Checks.hs b/tests/Checks.hs index 7a6478ef..68e35093 100644 --- a/tests/Checks.hs +++ b/tests/Checks.hs @@ -28,6 +28,7 @@ import Test.Foundation.Network.IPv4 import Test.Foundation.Network.IPv6 import Test.Foundation.String.Base64 import Test.Checks.Property.Collection +import Test.Foundation.Format import qualified Test.Foundation.Bits as Bits #if MIN_VERSION_base(4,9,0) @@ -204,4 +205,5 @@ main = defaultMain $ Group "foundation" #if MIN_VERSION_base(4,9,0) , testBlockN #endif + , testFormat ] diff --git a/tests/Test/Foundation/Format.hs b/tests/Test/Foundation/Format.hs new file mode 100644 index 00000000..3547ed5c --- /dev/null +++ b/tests/Test/Foundation/Format.hs @@ -0,0 +1,14 @@ +{-# LANGUAGE OverloadedStrings #-} +module Test.Foundation.Format + ( testFormat + ) where + +import Foundation +import Foundation.Check +import Test.Foundation.Format.CSV + + +testFormat :: Test +testFormat = Group "Format" + [ testFormatCSV + ] diff --git a/tests/Test/Foundation/Format/CSV.hs b/tests/Test/Foundation/Format/CSV.hs new file mode 100644 index 00000000..a2496207 --- /dev/null +++ b/tests/Test/Foundation/Format/CSV.hs @@ -0,0 +1,64 @@ +{-# LANGUAGE NoImplicitPrelude #-} +{-# LANGUAGE OverloadedStrings #-} +module Test.Foundation.Format.CSV + ( testFormatCSV + ) where + +import Foundation +import Foundation.Format.CSV +import Foundation.Check +import Foundation.String.Builder (toString) + +testFormatCSV :: Test +testFormatCSV = Group "CSV" + [ Group "field unit tests" $ testFieldEncoding <$> fieldUnitTests + , Group "row unit tests" $ testRowEncoding <$> rowUnitTests + ] + + where + testFieldEncoding (f,r) = Property (show f) $ + let str = toString (fieldStringBuilder f) + in r === str + testRowEncoding (row,result) = Property (show row) $ + let str = toString (rowStringBuilder row) + in result === str + +fieldUnitTests :: [(Field, String)] +fieldUnitTests = + [ (FieldInteger 42, "42") + , (FieldDouble 1, "1.0") + , (FieldDouble 0.000001, "1.0e-6") + , (FieldString "String" NoEscape, "String") + , (string "String", "String") + , (string "with comma,string", "\"with comma,string\"") + , (FieldString "multiline\nstring" Escape, "\"multiline\nstring\"") + , (FieldString "piece of 12\" by 23\"" DoubleEscape, "\"piece of 12\"\" by 23\"\"\"") + , (string "supported sizes are: 12\", 13\" and 14\"", "\"supported sizes are: 12\"\", 13\"\" and 14\"\"\"") + ] + +rowUnitTests :: [(Row, String)] +rowUnitTests = + [ (fromList [toField (42 :: Int), toField ("some string" :: String)], "42,some string") + , (toRow (42 :: Int, "some string" :: String), "42,some string") + , ( toRow ( 42 :: Int + , "some string" :: String + , "supported sizes are: 12\", 13\" and 14\"" :: String + ) + , "42,some string,\"supported sizes are: 12\"\", 13\"\" and 14\"\"\"" + ) + , ( toRow ( 42 :: Int + , "some string" :: String + , "supported sizes are: 12\", 13\" and 14\"" :: String + , Just 0.000001 :: Maybe Double + ) + , "42,some string,\"supported sizes are: 12\"\", 13\"\" and 14\"\"\",1.0e-6" + ) + , ( toRow ( 42 :: Int + , "some string" :: String + , "supported sizes are: 12\", 13\" and 14\"" :: String + , Just 0.000001 :: Maybe Double + , Nothing :: Maybe Char + ) + , "42,some string,\"supported sizes are: 12\"\", 13\"\" and 14\"\"\",1.0e-6," + ) + ] diff --git a/tests/Test/Foundation/Network/IPv6.hs b/tests/Test/Foundation/Network/IPv6.hs index a45174ba..6d2db8af 100644 --- a/tests/Test/Foundation/Network/IPv6.hs +++ b/tests/Test/Foundation/Network/IPv6.hs @@ -1,3 +1,4 @@ +{-# LANGUAGE CPP #-} {-# LANGUAGE NoImplicitPrelude #-} {-# LANGUAGE OverloadedStrings #-} module Test.Foundation.Network.IPv6 @@ -27,6 +28,7 @@ testOrdering genElement = Property "ordering" $ testNetworkIPv6 :: Test testNetworkIPv6 = Group "IPv6" +#if __GLASGOW_HASKELL__ >= 710 [ Property "toTuple . fromTuple == id" $ forAll genIPv6Tuple $ \x -> x === toTuple (fromTuple x) , Property "toString . fromString == id" $ @@ -46,3 +48,6 @@ testNetworkIPv6 = Group "IPv6" , Property "0:0::FFFF:129.144.52.38" $ (fromTuple (0,0,0,0,0,0xffff,0x8190,0x3426)) === (fromString "0:0::FFFF:129.144.52.38") ] ] +#else + [] +#endif diff --git a/tests/Test/Foundation/String.hs b/tests/Test/Foundation/String.hs index 8ebd2bbc..c1939ae7 100644 --- a/tests/Test/Foundation/String.hs +++ b/tests/Test/Foundation/String.hs @@ -59,6 +59,21 @@ testStringCases = "this is only a simple string but quite longer than the 64 bytes used in the modified UTF8 parser" "this is only a simple string but quite longer than the 64 bytes used in the modified UTF8 parser" ] + , Group "CaseMapping" + [ Property "upper . upper == upper" $ \l -> + let s = fromList l + in upper (upper s) === upper s + , CheckPlan "a should capitalize to A" $ validate "a" $ upper "a" == "A" + , CheckPlan "b should capitalize to B" $ validate "b" $ upper "b" == "B" + , CheckPlan "B should not capitalize" $ validate "B" $ upper "B" == "B" + , CheckPlan "é should capitalize to É" $ validate "é" $ upper "é" == "É" + , CheckPlan "ß should capitalize to SS" $ validate "ß" $ upper "ß" == "SS" + , CheckPlan "ffl should capitalize to FFL" $ validate "ffl" $ upper "ffl" == "FFL" + , CheckPlan "0a should capitalize to 0A" $ validate "0a" $ upper "\0a" == "\0A" + , CheckPlan "0a should capitalize to 0A" $ validate "0a" $ upper "a\0a" == "A\0A" + , CheckPlan "0a should capitalize to 0A" $ validate "0a" $ upper "\0\0" == "\0\0" + , CheckPlan "00 should not capitalize" $ validate "00" $ upper "00" == "00" + ] {- , testGroup "replace" [ testCase "indices '' 'bb' should raise an error" $ do