diff options
| author | Khaled Hosny <khaledhosny@eglug.org> | 2011-03-02 20:10:46 +0200 | 
|---|---|---|
| committer | Khaled Hosny <khaledhosny@eglug.org> | 2011-03-02 20:57:11 +0200 | 
| commit | 654f5f46c8c7bc43b73ce46035f3f6c1d5e9bbe5 (patch) | |
| tree | 3df613c3e05ca044d521bfc872f0d28028cb15f8 | |
| parent | a0e1a5594231d9f3789c51f04fdfb24680ca2516 (diff) | |
| download | luaotfload-654f5f46c8c7bc43b73ce46035f3f6c1d5e9bbe5.tar.gz | |
Sync with ConTeXt 2011.02.25 22:03
This commit overrides all our local modification to ConTeXt file and is
not tested at all.
| -rw-r--r-- | luaotfload.dtx | 31 | ||||
| -rw-r--r-- | otfl-data-con.lua | 4 | ||||
| -rw-r--r-- | otfl-font-age.lua | 3743 | ||||
| -rw-r--r-- | otfl-font-agl.lua | 3699 | ||||
| -rw-r--r-- | otfl-font-cid.lua | 2 | ||||
| -rw-r--r-- | otfl-font-def.lua | 308 | ||||
| -rw-r--r-- | otfl-font-dum.lua | 48 | ||||
| -rw-r--r-- | otfl-font-ini.lua | 37 | ||||
| -rw-r--r-- | otfl-font-lua.lua | 45 | ||||
| -rw-r--r-- | otfl-font-map.lua | 10 | ||||
| -rw-r--r-- | otfl-font-ota.lua | 2 | ||||
| -rw-r--r-- | otfl-font-otb.lua | 2 | ||||
| -rw-r--r-- | otfl-font-otc.lua | 24 | ||||
| -rw-r--r-- | otfl-font-otd.lua | 4 | ||||
| -rw-r--r-- | otfl-font-otf.lua | 225 | ||||
| -rw-r--r-- | otfl-font-otn.lua | 14 | ||||
| -rw-r--r-- | otfl-font-tfm.lua | 89 | ||||
| -rw-r--r-- | otfl-font-xtx.lua | 142 | ||||
| -rw-r--r-- | otfl-luat-dum.lua | 54 | ||||
| -rw-r--r-- | otfl-node-inj.lua | 24 | 
20 files changed, 4271 insertions, 4236 deletions
diff --git a/luaotfload.dtx b/luaotfload.dtx index 68750df..3fd9812 100644 --- a/luaotfload.dtx +++ b/luaotfload.dtx @@ -394,25 +394,27 @@ and the derived files  %  % \begin{multicols}{3}  % \begin{itemize*} -% \item |luat-dum.lua|  % \item |data-con.lua| -% \item |node-inj.lua| -% \item |node-dum.lua| -% \item |font-ini.lua| -% \item |font-tfm.lua| +% \item |font-age.lua|  % \item |font-cid.lua| -% \item |font-ott.lua| -% \item |font-otf.lua| +% \item |font-def.lua| +% \item |font-dum.lua| +% \item |font-ini.lua| +% \item |font-lua.lua| +% \item |font-map.lua| +% \item |font-ota.lua| +% \item |font-otb.lua| +% \item |font-otc.lua|  % \item |font-otd.lua| +% \item |font-otf.lua|  % \item |font-oti.lua| -% \item |font-otb.lua|  % \item |font-otn.lua| -% \item |font-ota.lua| -% \item |font-otc.lua| -% \item |font-def.lua| +% \item |font-ott.lua| +% \item |font-tfm.lua|  % \item |font-xtx.lua| -% \item |font-map.lua| -% \item |font-dum.lua| +% \item |luat-dum.lua| +% \item |node-dum.lua| +% \item |node-inj.lua|  % \end{itemize*}  % \end{multicols}  % @@ -570,6 +572,7 @@ luaotfload.loadmodule('font-tfm.lua')  luaotfload.loadmodule('font-cid.lua')  luaotfload.loadmodule('font-ott.lua')  luaotfload.loadmodule('font-map.lua') +luaotfload.loadmodule('font-lua.lua')  luaotfload.loadmodule('font-otf.lua')  luaotfload.loadmodule('font-otd.lua')  luaotfload.loadmodule('font-oti.lua') @@ -577,7 +580,7 @@ luaotfload.loadmodule('font-otb.lua')  luaotfload.loadmodule('font-otn.lua')  luaotfload.loadmodule('font-ota.lua')  luaotfload.loadmodule('font-otc.lua') -luaotfload.loadmodule('font-agl.lua') +luaotfload.loadmodule('font-age.lua')  luaotfload.loadmodule('font-def.lua')  luaotfload.loadmodule('font-xtx.lua')  luaotfload.loadmodule('font-dum.lua') diff --git a/otfl-data-con.lua b/otfl-data-con.lua index 5d9650f..ed4f2de 100644 --- a/otfl-data-con.lua +++ b/otfl-data-con.lua @@ -29,11 +29,11 @@ containers          = containers or { }  local containers    = containers  containers.usecache = true -local report_cache = logs.new("cache") +local report_containers = logs.reporter("resolvers","containers")  local function report(container,tag,name)      if trace_cache or trace_containers then -        report_cache("container: %s, tag: %s, name: %s",container.subcategory,tag,name or 'invalid') +        report_containers("container: %s, tag: %s, name: %s",container.subcategory,tag,name or 'invalid')      end  end diff --git a/otfl-font-age.lua b/otfl-font-age.lua new file mode 100644 index 0000000..5c19d41 --- /dev/null +++ b/otfl-font-age.lua @@ -0,0 +1,3743 @@ +if not modules then modules = { } end modules ['font-map'] = { +    version   = 1.001, +    comment   = "companion to font-ini.mkiv", +    author    = "Hans Hagen, PRAGMA-ADE, Hasselt NL", +    copyright = "derived from http://www.adobe.com/devnet/opentype/archives/glyphlist.txt", +    original  = "Adobe Glyph List, version 2.0, September 20, 2002", +} + +fonts         = fonts or { } +fonts.enc     = fonts.enc or { } +fonts.enc.agl = fonts.enc.agl or { } + +fonts.enc.agl.unicodes = { -- generated +    ["A"]=65, +    ["AE"]=198, +    ["AEacute"]=508, +    ["AEmacron"]=482, +    ["Aacute"]=193, +    ["Abreve"]=258, +    ["Abreveacute"]=7854, +    ["Abrevecyrillic"]=1232, +    ["Abrevedotbelow"]=7862, +    ["Abrevegrave"]=7856, +    ["Abrevehookabove"]=7858, +    ["Abrevetilde"]=7860, +    ["Acaron"]=461, +    ["Acircle"]=9398, +    ["Acircumflex"]=194, +    ["Acircumflexacute"]=7844, +    ["Acircumflexdotbelow"]=7852, +    ["Acircumflexgrave"]=7846, +    ["Acircumflexhookabove"]=7848, +    ["Acircumflextilde"]=7850, +    ["Adblgrave"]=512, +    ["Adieresis"]=196, +    ["Adieresiscyrillic"]=1234, +    ["Adieresismacron"]=478, +    ["Adotbelow"]=7840, +    ["Adotmacron"]=480, +    ["Agrave"]=192, +    ["Ahookabove"]=7842, +    ["Aiecyrillic"]=1236, +    ["Ainvertedbreve"]=514, +    ["Alpha"]=913, +    ["Alphatonos"]=902, +    ["Amacron"]=256, +    ["Amonospace"]=65313, +    ["Aogonek"]=260, +    ["Aring"]=197, +    ["Aringacute"]=506, +    ["Aringbelow"]=7680, +    ["Atilde"]=195, +    ["Aybarmenian"]=1329, +    ["B"]=66, +    ["Bcircle"]=9399, +    ["Bdotaccent"]=7682, +    ["Bdotbelow"]=7684, +    ["Benarmenian"]=1330, +    ["Beta"]=914, +    ["Bhook"]=385, +    ["Blinebelow"]=7686, +    ["Bmonospace"]=65314, +    ["Btopbar"]=386, +    ["C"]=67, +    ["Caarmenian"]=1342, +    ["Cacute"]=262, +    ["Ccaron"]=268, +    ["Ccedilla"]=199, +    ["Ccedillaacute"]=7688, +    ["Ccircle"]=9400, +    ["Ccircumflex"]=264, +    ["Cdotaccent"]=266, +    ["Chaarmenian"]=1353, +    ["Cheabkhasiancyrillic"]=1212, +    ["Chedescenderabkhasiancyrillic"]=1214, +    ["Chedescendercyrillic"]=1206, +    ["Chedieresiscyrillic"]=1268, +    ["Cheharmenian"]=1347, +    ["Chekhakassiancyrillic"]=1227, +    ["Cheverticalstrokecyrillic"]=1208, +    ["Chi"]=935, +    ["Chook"]=391, +    ["Cmonospace"]=65315, +    ["Coarmenian"]=1361, +    ["D"]=68, +    ["DZ"]=497, +    ["DZcaron"]=452, +    ["Daarmenian"]=1332, +    ["Dafrican"]=393, +    ["Dcaron"]=270, +    ["Dcedilla"]=7696, +    ["Dcircle"]=9401, +    ["Dcircumflexbelow"]=7698, +    ["Ddotaccent"]=7690, +    ["Ddotbelow"]=7692, +    ["Deicoptic"]=1006, +    ["Deltagreek"]=916, +    ["Dhook"]=394, +    ["Digammagreek"]=988, +    ["Dlinebelow"]=7694, +    ["Dmonospace"]=65316, +    ["Dslash"]=272, +    ["Dtopbar"]=395, +    ["Dz"]=498, +    ["Dzcaron"]=453, +    ["Dzeabkhasiancyrillic"]=1248, +    ["E"]=69, +    ["Eacute"]=201, +    ["Ebreve"]=276, +    ["Ecaron"]=282, +    ["Ecedillabreve"]=7708, +    ["Echarmenian"]=1333, +    ["Ecircle"]=9402, +    ["Ecircumflex"]=202, +    ["Ecircumflexacute"]=7870, +    ["Ecircumflexbelow"]=7704, +    ["Ecircumflexdotbelow"]=7878, +    ["Ecircumflexgrave"]=7872, +    ["Ecircumflexhookabove"]=7874, +    ["Ecircumflextilde"]=7876, +    ["Edblgrave"]=516, +    ["Edieresis"]=203, +    ["Edotaccent"]=278, +    ["Edotbelow"]=7864, +    ["Egrave"]=200, +    ["Eharmenian"]=1335, +    ["Ehookabove"]=7866, +    ["Eightroman"]=8551, +    ["Einvertedbreve"]=518, +    ["Eiotifiedcyrillic"]=1124, +    ["Elevenroman"]=8554, +    ["Emacron"]=274, +    ["Emacronacute"]=7702, +    ["Emacrongrave"]=7700, +    ["Emonospace"]=65317, +    ["Endescendercyrillic"]=1186, +    ["Eng"]=330, +    ["Enghecyrillic"]=1188, +    ["Enhookcyrillic"]=1223, +    ["Eogonek"]=280, +    ["Eopen"]=400, +    ["Epsilon"]=917, +    ["Epsilontonos"]=904, +    ["Ereversed"]=398, +    ["Esdescendercyrillic"]=1194, +    ["Esh"]=425, +    ["Eta"]=919, +    ["Etarmenian"]=1336, +    ["Etatonos"]=905, +    ["Eth"]=208, +    ["Etilde"]=7868, +    ["Etildebelow"]=7706, +    ["Ezh"]=439, +    ["Ezhcaron"]=494, +    ["Ezhreversed"]=440, +    ["F"]=70, +    ["Fcircle"]=9403, +    ["Fdotaccent"]=7710, +    ["Feharmenian"]=1366, +    ["Feicoptic"]=996, +    ["Fhook"]=401, +    ["Fiveroman"]=8548, +    ["Fmonospace"]=65318, +    ["Fourroman"]=8547, +    ["G"]=71, +    ["GBsquare"]=13191, +    ["Gacute"]=500, +    ["Gamma"]=915, +    ["Gammaafrican"]=404, +    ["Gangiacoptic"]=1002, +    ["Gbreve"]=286, +    ["Gcaron"]=486, +    ["Gcircle"]=9404, +    ["Gcircumflex"]=284, +    ["Gcommaaccent"]=290, +    ["Gdotaccent"]=288, +    ["Ghadarmenian"]=1346, +    ["Ghemiddlehookcyrillic"]=1172, +    ["Ghestrokecyrillic"]=1170, +    ["Ghook"]=403, +    ["Gimarmenian"]=1331, +    ["Gmacron"]=7712, +    ["Gmonospace"]=65319, +    ["Gsmallhook"]=667, +    ["Gstroke"]=484, +    ["H"]=72, +    ["HPsquare"]=13259, +    ["Haabkhasiancyrillic"]=1192, +    ["Hadescendercyrillic"]=1202, +    ["Hbar"]=294, +    ["Hbrevebelow"]=7722, +    ["Hcedilla"]=7720, +    ["Hcircle"]=9405, +    ["Hcircumflex"]=292, +    ["Hdieresis"]=7718, +    ["Hdotaccent"]=7714, +    ["Hdotbelow"]=7716, +    ["Hmonospace"]=65320, +    ["Hoarmenian"]=1344, +    ["Horicoptic"]=1000, +    ["Hzsquare"]=13200, +    ["I"]=73, +    ["IJ"]=306, +    ["Iacute"]=205, +    ["Ibreve"]=300, +    ["Icaron"]=463, +    ["Icircle"]=9406, +    ["Icircumflex"]=206, +    ["Idblgrave"]=520, +    ["Idieresis"]=207, +    ["Idieresisacute"]=7726, +    ["Idieresiscyrillic"]=1252, +    ["Idotaccent"]=304, +    ["Idotbelow"]=7882, +    ["Iebrevecyrillic"]=1238, +    ["Ifraktur"]=8465, +    ["Igrave"]=204, +    ["Ihookabove"]=7880, +    ["Iinvertedbreve"]=522, +    ["Imacron"]=298, +    ["Imacroncyrillic"]=1250, +    ["Imonospace"]=65321, +    ["Iniarmenian"]=1339, +    ["Iogonek"]=302, +    ["Iota"]=921, +    ["Iotaafrican"]=406, +    ["Iotadieresis"]=938, +    ["Iotatonos"]=906, +    ["Istroke"]=407, +    ["Itilde"]=296, +    ["Itildebelow"]=7724, +    ["Izhitsadblgravecyrillic"]=1142, +    ["J"]=74, +    ["Jaarmenian"]=1345, +    ["Jcircle"]=9407, +    ["Jcircumflex"]=308, +    ["Jheharmenian"]=1355, +    ["Jmonospace"]=65322, +    ["K"]=75, +    ["KBsquare"]=13189, +    ["KKsquare"]=13261, +    ["Kabashkircyrillic"]=1184, +    ["Kacute"]=7728, +    ["Kadescendercyrillic"]=1178, +    ["Kahookcyrillic"]=1219, +    ["Kappa"]=922, +    ["Kastrokecyrillic"]=1182, +    ["Kaverticalstrokecyrillic"]=1180, +    ["Kcaron"]=488, +    ["Kcircle"]=9408, +    ["Kcommaaccent"]=310, +    ["Kdotbelow"]=7730, +    ["Keharmenian"]=1364, +    ["Kenarmenian"]=1343, +    ["Kheicoptic"]=998, +    ["Khook"]=408, +    ["Klinebelow"]=7732, +    ["Kmonospace"]=65323, +    ["Koppacyrillic"]=1152, +    ["Koppagreek"]=990, +    ["Ksicyrillic"]=1134, +    ["L"]=76, +    ["LJ"]=455, +    ["Lacute"]=313, +    ["Lambda"]=923, +    ["Lcaron"]=317, +    ["Lcircle"]=9409, +    ["Lcircumflexbelow"]=7740, +    ["Lcommaaccent"]=315, +    ["Ldotaccent"]=319, +    ["Ldotbelow"]=7734, +    ["Ldotbelowmacron"]=7736, +    ["Liwnarmenian"]=1340, +    ["Lj"]=456, +    ["Llinebelow"]=7738, +    ["Lmonospace"]=65324, +    ["Lslash"]=321, +    ["M"]=77, +    ["MBsquare"]=13190, +    ["Macute"]=7742, +    ["Mcircle"]=9410, +    ["Mdotaccent"]=7744, +    ["Mdotbelow"]=7746, +    ["Menarmenian"]=1348, +    ["Mmonospace"]=65325, +    ["Mturned"]=412, +    ["Mu"]=924, +    ["N"]=78, +    ["NJ"]=458, +    ["Nacute"]=323, +    ["Ncaron"]=327, +    ["Ncircle"]=9411, +    ["Ncircumflexbelow"]=7754, +    ["Ncommaaccent"]=325, +    ["Ndotaccent"]=7748, +    ["Ndotbelow"]=7750, +    ["Nhookleft"]=413, +    ["Nineroman"]=8552, +    ["Nj"]=459, +    ["Nlinebelow"]=7752, +    ["Nmonospace"]=65326, +    ["Nowarmenian"]=1350, +    ["Ntilde"]=209, +    ["Nu"]=925, +    ["O"]=79, +    ["OE"]=338, +    ["Oacute"]=211, +    ["Obarredcyrillic"]=1256, +    ["Obarreddieresiscyrillic"]=1258, +    ["Obreve"]=334, +    ["Ocaron"]=465, +    ["Ocenteredtilde"]=415, +    ["Ocircle"]=9412, +    ["Ocircumflex"]=212, +    ["Ocircumflexacute"]=7888, +    ["Ocircumflexdotbelow"]=7896, +    ["Ocircumflexgrave"]=7890, +    ["Ocircumflexhookabove"]=7892, +    ["Ocircumflextilde"]=7894, +    ["Odblgrave"]=524, +    ["Odieresis"]=214, +    ["Odieresiscyrillic"]=1254, +    ["Odotbelow"]=7884, +    ["Ograve"]=210, +    ["Oharmenian"]=1365, +    ["Ohookabove"]=7886, +    ["Ohorn"]=416, +    ["Ohornacute"]=7898, +    ["Ohorndotbelow"]=7906, +    ["Ohorngrave"]=7900, +    ["Ohornhookabove"]=7902, +    ["Ohorntilde"]=7904, +    ["Ohungarumlaut"]=336, +    ["Oi"]=418, +    ["Oinvertedbreve"]=526, +    ["Omacron"]=332, +    ["Omacronacute"]=7762, +    ["Omacrongrave"]=7760, +    ["Omega"]=8486, +    ["Omegacyrillic"]=1120, +    ["Omegagreek"]=937, +    ["Omegaroundcyrillic"]=1146, +    ["Omegatitlocyrillic"]=1148, +    ["Omegatonos"]=911, +    ["Omicron"]=927, +    ["Omicrontonos"]=908, +    ["Omonospace"]=65327, +    ["Oneroman"]=8544, +    ["Oogonek"]=490, +    ["Oogonekmacron"]=492, +    ["Oopen"]=390, +    ["Oslash"]=216, +    ["Ostrokeacute"]=510, +    ["Otcyrillic"]=1150, +    ["Otilde"]=213, +    ["Otildeacute"]=7756, +    ["Otildedieresis"]=7758, +    ["P"]=80, +    ["Pacute"]=7764, +    ["Pcircle"]=9413, +    ["Pdotaccent"]=7766, +    ["Peharmenian"]=1354, +    ["Pemiddlehookcyrillic"]=1190, +    ["Phi"]=934, +    ["Phook"]=420, +    ["Pi"]=928, +    ["Piwrarmenian"]=1363, +    ["Pmonospace"]=65328, +    ["Psi"]=936, +    ["Psicyrillic"]=1136, +    ["Q"]=81, +    ["Qcircle"]=9414, +    ["Qmonospace"]=65329, +    ["R"]=82, +    ["Raarmenian"]=1356, +    ["Racute"]=340, +    ["Rcaron"]=344, +    ["Rcircle"]=9415, +    ["Rcommaaccent"]=342, +    ["Rdblgrave"]=528, +    ["Rdotaccent"]=7768, +    ["Rdotbelow"]=7770, +    ["Rdotbelowmacron"]=7772, +    ["Reharmenian"]=1360, +    ["Rfraktur"]=8476, +    ["Rho"]=929, +    ["Rinvertedbreve"]=530, +    ["Rlinebelow"]=7774, +    ["Rmonospace"]=65330, +    ["Rsmallinverted"]=641, +    ["Rsmallinvertedsuperior"]=694, +    ["S"]=83, +    ["SF010000"]=9484, +    ["SF020000"]=9492, +    ["SF030000"]=9488, +    ["SF040000"]=9496, +    ["SF050000"]=9532, +    ["SF060000"]=9516, +    ["SF070000"]=9524, +    ["SF080000"]=9500, +    ["SF090000"]=9508, +    ["SF100000"]=9472, +    ["SF110000"]=9474, +    ["SF190000"]=9569, +    ["SF200000"]=9570, +    ["SF210000"]=9558, +    ["SF220000"]=9557, +    ["SF230000"]=9571, +    ["SF240000"]=9553, +    ["SF250000"]=9559, +    ["SF260000"]=9565, +    ["SF270000"]=9564, +    ["SF280000"]=9563, +    ["SF360000"]=9566, +    ["SF370000"]=9567, +    ["SF380000"]=9562, +    ["SF390000"]=9556, +    ["SF400000"]=9577, +    ["SF410000"]=9574, +    ["SF420000"]=9568, +    ["SF430000"]=9552, +    ["SF440000"]=9580, +    ["SF450000"]=9575, +    ["SF460000"]=9576, +    ["SF470000"]=9572, +    ["SF480000"]=9573, +    ["SF490000"]=9561, +    ["SF500000"]=9560, +    ["SF510000"]=9554, +    ["SF520000"]=9555, +    ["SF530000"]=9579, +    ["SF540000"]=9578, +    ["Sacute"]=346, +    ["Sacutedotaccent"]=7780, +    ["Sampigreek"]=992, +    ["Scaron"]=352, +    ["Scarondotaccent"]=7782, +    ["Scedilla"]=350, +    ["Schwa"]=399, +    ["Schwacyrillic"]=1240, +    ["Schwadieresiscyrillic"]=1242, +    ["Scircle"]=9416, +    ["Scircumflex"]=348, +    ["Scommaaccent"]=536, +    ["Sdotaccent"]=7776, +    ["Sdotbelow"]=7778, +    ["Sdotbelowdotaccent"]=7784, +    ["Seharmenian"]=1357, +    ["Sevenroman"]=8550, +    ["Shaarmenian"]=1351, +    ["Sheicoptic"]=994, +    ["Shhacyrillic"]=1210, +    ["Shimacoptic"]=1004, +    ["Sigma"]=931, +    ["Sixroman"]=8549, +    ["Smonospace"]=65331, +    ["Stigmagreek"]=986, +    ["T"]=84, +    ["Tau"]=932, +    ["Tbar"]=358, +    ["Tcaron"]=356, +    ["Tcircle"]=9417, +    ["Tcircumflexbelow"]=7792, +    ["Tcommaaccent"]=354, +    ["Tdotaccent"]=7786, +    ["Tdotbelow"]=7788, +    ["Tedescendercyrillic"]=1196, +    ["Tenroman"]=8553, +    ["Tetsecyrillic"]=1204, +    ["Theta"]=920, +    ["Thook"]=428, +    ["Thorn"]=222, +    ["Threeroman"]=8546, +    ["Tiwnarmenian"]=1359, +    ["Tlinebelow"]=7790, +    ["Tmonospace"]=65332, +    ["Toarmenian"]=1337, +    ["Tonefive"]=444, +    ["Tonesix"]=388, +    ["Tonetwo"]=423, +    ["Tretroflexhook"]=430, +    ["Twelveroman"]=8555, +    ["Tworoman"]=8545, +    ["U"]=85, +    ["Uacute"]=218, +    ["Ubreve"]=364, +    ["Ucaron"]=467, +    ["Ucircle"]=9418, +    ["Ucircumflex"]=219, +    ["Ucircumflexbelow"]=7798, +    ["Udblgrave"]=532, +    ["Udieresis"]=220, +    ["Udieresisacute"]=471, +    ["Udieresisbelow"]=7794, +    ["Udieresiscaron"]=473, +    ["Udieresiscyrillic"]=1264, +    ["Udieresisgrave"]=475, +    ["Udieresismacron"]=469, +    ["Udotbelow"]=7908, +    ["Ugrave"]=217, +    ["Uhookabove"]=7910, +    ["Uhorn"]=431, +    ["Uhornacute"]=7912, +    ["Uhorndotbelow"]=7920, +    ["Uhorngrave"]=7914, +    ["Uhornhookabove"]=7916, +    ["Uhorntilde"]=7918, +    ["Uhungarumlaut"]=368, +    ["Uhungarumlautcyrillic"]=1266, +    ["Uinvertedbreve"]=534, +    ["Ukcyrillic"]=1144, +    ["Umacron"]=362, +    ["Umacroncyrillic"]=1262, +    ["Umacrondieresis"]=7802, +    ["Umonospace"]=65333, +    ["Uogonek"]=370, +    ["Upsilon"]=933, +    ["Upsilonacutehooksymbolgreek"]=979, +    ["Upsilonafrican"]=433, +    ["Upsilondieresis"]=939, +    ["Upsilondieresishooksymbolgreek"]=980, +    ["Upsilonhooksymbol"]=978, +    ["Upsilontonos"]=910, +    ["Uring"]=366, +    ["Ustraightcyrillic"]=1198, +    ["Ustraightstrokecyrillic"]=1200, +    ["Utilde"]=360, +    ["Utildeacute"]=7800, +    ["Utildebelow"]=7796, +    ["V"]=86, +    ["Vcircle"]=9419, +    ["Vdotbelow"]=7806, +    ["Vewarmenian"]=1358, +    ["Vhook"]=434, +    ["Vmonospace"]=65334, +    ["Voarmenian"]=1352, +    ["Vtilde"]=7804, +    ["W"]=87, +    ["Wacute"]=7810, +    ["Wcircle"]=9420, +    ["Wcircumflex"]=372, +    ["Wdieresis"]=7812, +    ["Wdotaccent"]=7814, +    ["Wdotbelow"]=7816, +    ["Wgrave"]=7808, +    ["Wmonospace"]=65335, +    ["X"]=88, +    ["Xcircle"]=9421, +    ["Xdieresis"]=7820, +    ["Xdotaccent"]=7818, +    ["Xeharmenian"]=1341, +    ["Xi"]=926, +    ["Xmonospace"]=65336, +    ["Y"]=89, +    ["Yacute"]=221, +    ["Ycircle"]=9422, +    ["Ycircumflex"]=374, +    ["Ydieresis"]=376, +    ["Ydotaccent"]=7822, +    ["Ydotbelow"]=7924, +    ["Yerudieresiscyrillic"]=1272, +    ["Ygrave"]=7922, +    ["Yhook"]=435, +    ["Yhookabove"]=7926, +    ["Yiarmenian"]=1349, +    ["Yiwnarmenian"]=1362, +    ["Ymonospace"]=65337, +    ["Ytilde"]=7928, +    ["Yusbigcyrillic"]=1130, +    ["Yusbigiotifiedcyrillic"]=1132, +    ["Yuslittlecyrillic"]=1126, +    ["Yuslittleiotifiedcyrillic"]=1128, +    ["Z"]=90, +    ["Zaarmenian"]=1334, +    ["Zacute"]=377, +    ["Zcaron"]=381, +    ["Zcircle"]=9423, +    ["Zcircumflex"]=7824, +    ["Zdotaccent"]=379, +    ["Zdotbelow"]=7826, +    ["Zedescendercyrillic"]=1176, +    ["Zedieresiscyrillic"]=1246, +    ["Zeta"]=918, +    ["Zhearmenian"]=1338, +    ["Zhebrevecyrillic"]=1217, +    ["Zhedescendercyrillic"]=1174, +    ["Zhedieresiscyrillic"]=1244, +    ["Zlinebelow"]=7828, +    ["Zmonospace"]=65338, +    ["Zstroke"]=437, +    ["a"]=97, +    ["aabengali"]=2438, +    ["aacute"]=225, +    ["aadeva"]=2310, +    ["aagujarati"]=2694, +    ["aagurmukhi"]=2566, +    ["aamatragurmukhi"]=2622, +    ["aarusquare"]=13059, +    ["aavowelsignbengali"]=2494, +    ["aavowelsigndeva"]=2366, +    ["aavowelsigngujarati"]=2750, +    ["abbreviationmarkarmenian"]=1375, +    ["abbreviationsigndeva"]=2416, +    ["abengali"]=2437, +    ["abopomofo"]=12570, +    ["abreve"]=259, +    ["abreveacute"]=7855, +    ["abrevecyrillic"]=1233, +    ["abrevedotbelow"]=7863, +    ["abrevegrave"]=7857, +    ["abrevehookabove"]=7859, +    ["abrevetilde"]=7861, +    ["acaron"]=462, +    ["acircle"]=9424, +    ["acircumflex"]=226, +    ["acircumflexacute"]=7845, +    ["acircumflexdotbelow"]=7853, +    ["acircumflexgrave"]=7847, +    ["acircumflexhookabove"]=7849, +    ["acircumflextilde"]=7851, +    ["acute"]=180, +    ["acutebelowcmb"]=791, +    ["acutecomb"]=769, +    ["acutedeva"]=2388, +    ["acutelowmod"]=719, +    ["acutetonecmb"]=833, +    ["adblgrave"]=513, +    ["addakgurmukhi"]=2673, +    ["adeva"]=2309, +    ["adieresis"]=228, +    ["adieresiscyrillic"]=1235, +    ["adieresismacron"]=479, +    ["adotbelow"]=7841, +    ["adotmacron"]=481, +    ["ae"]=230, +    ["aeacute"]=509, +    ["aekorean"]=12624, +    ["aemacron"]=483, +    ["afii10017"]=1040, +    ["afii10018"]=1041, +    ["afii10019"]=1042, +    ["afii10020"]=1043, +    ["afii10021"]=1044, +    ["afii10022"]=1045, +    ["afii10023"]=1025, +    ["afii10024"]=1046, +    ["afii10025"]=1047, +    ["afii10026"]=1048, +    ["afii10027"]=1049, +    ["afii10028"]=1050, +    ["afii10029"]=1051, +    ["afii10030"]=1052, +    ["afii10031"]=1053, +    ["afii10032"]=1054, +    ["afii10033"]=1055, +    ["afii10034"]=1056, +    ["afii10035"]=1057, +    ["afii10036"]=1058, +    ["afii10037"]=1059, +    ["afii10038"]=1060, +    ["afii10039"]=1061, +    ["afii10040"]=1062, +    ["afii10041"]=1063, +    ["afii10042"]=1064, +    ["afii10043"]=1065, +    ["afii10044"]=1066, +    ["afii10045"]=1067, +    ["afii10046"]=1068, +    ["afii10047"]=1069, +    ["afii10048"]=1070, +    ["afii10049"]=1071, +    ["afii10050"]=1168, +    ["afii10051"]=1026, +    ["afii10052"]=1027, +    ["afii10053"]=1028, +    ["afii10054"]=1029, +    ["afii10055"]=1030, +    ["afii10056"]=1031, +    ["afii10057"]=1032, +    ["afii10058"]=1033, +    ["afii10059"]=1034, +    ["afii10060"]=1035, +    ["afii10061"]=1036, +    ["afii10062"]=1038, +    ["afii10065"]=1072, +    ["afii10145"]=1039, +    ["afii10146"]=1122, +    ["afii10147"]=1138, +    ["afii10148"]=1140, +    ["afii299"]=8206, +    ["afii300"]=8207, +    ["afii301"]=8205, +    ["afii57534"]=1749, +    ["afii61573"]=8236, +    ["afii61574"]=8237, +    ["afii61575"]=8238, +    ["agrave"]=224, +    ["agujarati"]=2693, +    ["agurmukhi"]=2565, +    ["ahiragana"]=12354, +    ["ahookabove"]=7843, +    ["aibengali"]=2448, +    ["aibopomofo"]=12574, +    ["aideva"]=2320, +    ["aiecyrillic"]=1237, +    ["aigujarati"]=2704, +    ["aigurmukhi"]=2576, +    ["aimatragurmukhi"]=2632, +    ["ainarabic"]=1593, +    ["ainfinalarabic"]=65226, +    ["aininitialarabic"]=65227, +    ["ainmedialarabic"]=65228, +    ["ainvertedbreve"]=515, +    ["aivowelsignbengali"]=2504, +    ["aivowelsigndeva"]=2376, +    ["aivowelsigngujarati"]=2760, +    ["akatakana"]=12450, +    ["akatakanahalfwidth"]=65393, +    ["akorean"]=12623, +    ["alefarabic"]=1575, +    ["alefdageshhebrew"]=64304, +    ["aleffinalarabic"]=65166, +    ["alefhamzaabovearabic"]=1571, +    ["alefhamzaabovefinalarabic"]=65156, +    ["alefhamzabelowarabic"]=1573, +    ["alefhamzabelowfinalarabic"]=65160, +    ["alefhebrew"]=1488, +    ["aleflamedhebrew"]=64335, +    ["alefmaddaabovearabic"]=1570, +    ["alefmaddaabovefinalarabic"]=65154, +    ["alefmaksuraarabic"]=1609, +    ["alefmaksurafinalarabic"]=65264, +    ["alefpatahhebrew"]=64302, +    ["alefqamatshebrew"]=64303, +    ["aleph"]=8501, +    ["allequal"]=8780, +    ["alpha"]=945, +    ["alphatonos"]=940, +    ["amacron"]=257, +    ["amonospace"]=65345, +    ["ampersand"]=38, +    ["ampersandmonospace"]=65286, +    ["amsquare"]=13250, +    ["anbopomofo"]=12578, +    ["angbopomofo"]=12580, +    ["angkhankhuthai"]=3674, +    ["angle"]=8736, +    ["anglebracketleft"]=12296, +    ["anglebracketleftvertical"]=65087, +    ["anglebracketright"]=12297, +    ["anglebracketrightvertical"]=65088, +    ["angleleft"]=9001, +    ["angleright"]=9002, +    ["angstrom"]=8491, +    ["anoteleia"]=903, +    ["anudattadeva"]=2386, +    ["anusvarabengali"]=2434, +    ["anusvaradeva"]=2306, +    ["anusvaragujarati"]=2690, +    ["aogonek"]=261, +    ["apaatosquare"]=13056, +    ["aparen"]=9372, +    ["apostrophearmenian"]=1370, +    ["apostrophemod"]=700, +    ["apple"]=63743, +    ["approaches"]=8784, +    ["approxequal"]=8776, +    ["approxequalorimage"]=8786, +    ["araeaekorean"]=12686, +    ["araeakorean"]=12685, +    ["arc"]=8978, +    ["arighthalfring"]=7834, +    ["aring"]=229, +    ["aringacute"]=507, +    ["aringbelow"]=7681, +    ["arrowboth"]=8596, +    ["arrowdashdown"]=8675, +    ["arrowdashleft"]=8672, +    ["arrowdashright"]=8674, +    ["arrowdashup"]=8673, +    ["arrowdbldown"]=8659, +    ["arrowdblup"]=8657, +    ["arrowdown"]=8595, +    ["arrowdownleft"]=8601, +    ["arrowdownright"]=8600, +    ["arrowdownwhite"]=8681, +    ["arrowheaddownmod"]=709, +    ["arrowheadleftmod"]=706, +    ["arrowheadrightmod"]=707, +    ["arrowheadupmod"]=708, +    ["arrowleft"]=8592, +    ["arrowleftdbl"]=8656, +    ["arrowleftdblstroke"]=8653, +    ["arrowleftoverright"]=8646, +    ["arrowleftwhite"]=8678, +    ["arrowright"]=8594, +    ["arrowrightdblstroke"]=8655, +    ["arrowrightheavy"]=10142, +    ["arrowrightoverleft"]=8644, +    ["arrowrightwhite"]=8680, +    ["arrowtableft"]=8676, +    ["arrowtabright"]=8677, +    ["arrowup"]=8593, +    ["arrowupdn"]=8597, +    ["arrowupdownbase"]=8616, +    ["arrowupleft"]=8598, +    ["arrowupleftofdown"]=8645, +    ["arrowupright"]=8599, +    ["arrowupwhite"]=8679, +    ["asciicircum"]=94, +    ["asciicircummonospace"]=65342, +    ["asciitilde"]=126, +    ["asciitildemonospace"]=65374, +    ["ascript"]=593, +    ["ascriptturned"]=594, +    ["asmallhiragana"]=12353, +    ["asmallkatakana"]=12449, +    ["asmallkatakanahalfwidth"]=65383, +    ["asterisk"]=42, +    ["asteriskarabic"]=1645, +    ["asteriskmath"]=8727, +    ["asteriskmonospace"]=65290, +    ["asterisksmall"]=65121, +    ["asterism"]=8258, +    ["asymptoticallyequal"]=8771, +    ["at"]=64, +    ["atilde"]=227, +    ["atmonospace"]=65312, +    ["atsmall"]=65131, +    ["aturned"]=592, +    ["aubengali"]=2452, +    ["aubopomofo"]=12576, +    ["audeva"]=2324, +    ["augujarati"]=2708, +    ["augurmukhi"]=2580, +    ["aulengthmarkbengali"]=2519, +    ["aumatragurmukhi"]=2636, +    ["auvowelsignbengali"]=2508, +    ["auvowelsigndeva"]=2380, +    ["auvowelsigngujarati"]=2764, +    ["avagrahadeva"]=2365, +    ["aybarmenian"]=1377, +    ["ayinaltonehebrew"]=64288, +    ["ayinhebrew"]=1506, +    ["b"]=98, +    ["babengali"]=2476, +    ["backslash"]=92, +    ["backslashmonospace"]=65340, +    ["badeva"]=2348, +    ["bagujarati"]=2732, +    ["bagurmukhi"]=2604, +    ["bahiragana"]=12400, +    ["bahtthai"]=3647, +    ["bakatakana"]=12496, +    ["barmonospace"]=65372, +    ["bbopomofo"]=12549, +    ["bcircle"]=9425, +    ["bdotaccent"]=7683, +    ["bdotbelow"]=7685, +    ["beamedsixteenthnotes"]=9836, +    ["because"]=8757, +    ["becyrillic"]=1073, +    ["beharabic"]=1576, +    ["behfinalarabic"]=65168, +    ["behinitialarabic"]=65169, +    ["behiragana"]=12409, +    ["behmedialarabic"]=65170, +    ["behmeeminitialarabic"]=64671, +    ["behmeemisolatedarabic"]=64520, +    ["behnoonfinalarabic"]=64621, +    ["bekatakana"]=12505, +    ["benarmenian"]=1378, +    ["beta"]=946, +    ["betasymbolgreek"]=976, +    ["betdageshhebrew"]=64305, +    ["bethebrew"]=1489, +    ["betrafehebrew"]=64332, +    ["bhabengali"]=2477, +    ["bhadeva"]=2349, +    ["bhagujarati"]=2733, +    ["bhagurmukhi"]=2605, +    ["bhook"]=595, +    ["bihiragana"]=12403, +    ["bikatakana"]=12499, +    ["bilabialclick"]=664, +    ["bindigurmukhi"]=2562, +    ["birusquare"]=13105, +    ["blackcircle"]=9679, +    ["blackdiamond"]=9670, +    ["blackleftpointingtriangle"]=9664, +    ["blacklenticularbracketleft"]=12304, +    ["blacklenticularbracketleftvertical"]=65083, +    ["blacklenticularbracketright"]=12305, +    ["blacklenticularbracketrightvertical"]=65084, +    ["blacklowerlefttriangle"]=9699, +    ["blacklowerrighttriangle"]=9698, +    ["blackrightpointingtriangle"]=9654, +    ["blacksmallsquare"]=9642, +    ["blackstar"]=9733, +    ["blackupperlefttriangle"]=9700, +    ["blackupperrighttriangle"]=9701, +    ["blackuppointingsmalltriangle"]=9652, +    ["blank"]=9251, +    ["blinebelow"]=7687, +    ["block"]=9608, +    ["bmonospace"]=65346, +    ["bobaimaithai"]=3610, +    ["bohiragana"]=12412, +    ["bokatakana"]=12508, +    ["bparen"]=9373, +    ["bqsquare"]=13251, +    ["braceleft"]=123, +    ["braceleftmonospace"]=65371, +    ["braceleftsmall"]=65115, +    ["braceleftvertical"]=65079, +    ["braceright"]=125, +    ["bracerightmonospace"]=65373, +    ["bracerightsmall"]=65116, +    ["bracerightvertical"]=65080, +    ["bracketleft"]=91, +    ["bracketleftmonospace"]=65339, +    ["bracketright"]=93, +    ["bracketrightmonospace"]=65341, +    ["breve"]=728, +    ["brevebelowcmb"]=814, +    ["brevecmb"]=774, +    ["breveinvertedbelowcmb"]=815, +    ["breveinvertedcmb"]=785, +    ["breveinverteddoublecmb"]=865, +    ["bridgebelowcmb"]=810, +    ["bridgeinvertedbelowcmb"]=826, +    ["brokenbar"]=166, +    ["bstroke"]=384, +    ["btopbar"]=387, +    ["buhiragana"]=12406, +    ["bukatakana"]=12502, +    ["bullet"]=8226, +    ["bulletoperator"]=8729, +    ["bullseye"]=9678, +    ["c"]=99, +    ["caarmenian"]=1390, +    ["cabengali"]=2458, +    ["cacute"]=263, +    ["cadeva"]=2330, +    ["cagujarati"]=2714, +    ["cagurmukhi"]=2586, +    ["calsquare"]=13192, +    ["candrabindubengali"]=2433, +    ["candrabinducmb"]=784, +    ["candrabindudeva"]=2305, +    ["candrabindugujarati"]=2689, +    ["capslock"]=8682, +    ["careof"]=8453, +    ["caron"]=711, +    ["caronbelowcmb"]=812, +    ["caroncmb"]=780, +    ["carriagereturn"]=8629, +    ["cbopomofo"]=12568, +    ["ccaron"]=269, +    ["ccedilla"]=231, +    ["ccedillaacute"]=7689, +    ["ccircle"]=9426, +    ["ccircumflex"]=265, +    ["ccurl"]=597, +    ["cdotaccent"]=267, +    ["cdsquare"]=13253, +    ["cedilla"]=184, +    ["cedillacmb"]=807, +    ["cent"]=162, +    ["centigrade"]=8451, +    ["centmonospace"]=65504, +    ["chaarmenian"]=1401, +    ["chabengali"]=2459, +    ["chadeva"]=2331, +    ["chagujarati"]=2715, +    ["chagurmukhi"]=2587, +    ["chbopomofo"]=12564, +    ["cheabkhasiancyrillic"]=1213, +    ["checkmark"]=10003, +    ["checyrillic"]=1095, +    ["chedescenderabkhasiancyrillic"]=1215, +    ["chedescendercyrillic"]=1207, +    ["chedieresiscyrillic"]=1269, +    ["cheharmenian"]=1395, +    ["chekhakassiancyrillic"]=1228, +    ["cheverticalstrokecyrillic"]=1209, +    ["chi"]=967, +    ["chieuchacirclekorean"]=12919, +    ["chieuchaparenkorean"]=12823, +    ["chieuchcirclekorean"]=12905, +    ["chieuchkorean"]=12618, +    ["chieuchparenkorean"]=12809, +    ["chochangthai"]=3594, +    ["chochanthai"]=3592, +    ["chochingthai"]=3593, +    ["chochoethai"]=3596, +    ["chook"]=392, +    ["cieucacirclekorean"]=12918, +    ["cieucaparenkorean"]=12822, +    ["cieuccirclekorean"]=12904, +    ["cieuckorean"]=12616, +    ["cieucparenkorean"]=12808, +    ["cieucuparenkorean"]=12828, +    ["circleot"]=8857, +    ["circlepostalmark"]=12342, +    ["circlewithlefthalfblack"]=9680, +    ["circlewithrighthalfblack"]=9681, +    ["circumflex"]=710, +    ["circumflexbelowcmb"]=813, +    ["circumflexcmb"]=770, +    ["clear"]=8999, +    ["clickalveolar"]=450, +    ["clickdental"]=448, +    ["clicklateral"]=449, +    ["clickretroflex"]=451, +    ["clubsuitblack"]=9827, +    ["clubsuitwhite"]=9831, +    ["cmcubedsquare"]=13220, +    ["cmonospace"]=65347, +    ["cmsquaredsquare"]=13216, +    ["coarmenian"]=1409, +    ["colon"]=58, +    ["colonmonospace"]=65306, +    ["colonsign"]=8353, +    ["colonsmall"]=65109, +    ["colontriangularhalfmod"]=721, +    ["colontriangularmod"]=720, +    ["comma"]=44, +    ["commaabovecmb"]=787, +    ["commaaboverightcmb"]=789, +    ["commaarabic"]=1548, +    ["commaarmenian"]=1373, +    ["commamonospace"]=65292, +    ["commareversedabovecmb"]=788, +    ["commareversedmod"]=701, +    ["commasmall"]=65104, +    ["commaturnedabovecmb"]=786, +    ["commaturnedmod"]=699, +    ["congruent"]=8773, +    ["contourintegral"]=8750, +    ["control"]=8963, +    ["controlACK"]=6, +    ["controlBEL"]=7, +    ["controlBS"]=8, +    ["controlCAN"]=24, +    ["controlCR"]=13, +    ["controlDC1"]=17, +    ["controlDC2"]=18, +    ["controlDC3"]=19, +    ["controlDC4"]=20, +    ["controlDEL"]=127, +    ["controlDLE"]=16, +    ["controlEM"]=25, +    ["controlENQ"]=5, +    ["controlEOT"]=4, +    ["controlESC"]=27, +    ["controlETB"]=23, +    ["controlETX"]=3, +    ["controlFF"]=12, +    ["controlFS"]=28, +    ["controlGS"]=29, +    ["controlHT"]=9, +    ["controlLF"]=10, +    ["controlNAK"]=21, +    ["controlRS"]=30, +    ["controlSI"]=15, +    ["controlSO"]=14, +    ["controlSOT"]=2, +    ["controlSTX"]=1, +    ["controlSUB"]=26, +    ["controlSYN"]=22, +    ["controlUS"]=31, +    ["controlVT"]=11, +    ["copyright"]=169, +    ["cornerbracketleft"]=12300, +    ["cornerbracketlefthalfwidth"]=65378, +    ["cornerbracketleftvertical"]=65089, +    ["cornerbracketright"]=12301, +    ["cornerbracketrighthalfwidth"]=65379, +    ["cornerbracketrightvertical"]=65090, +    ["corporationsquare"]=13183, +    ["cosquare"]=13255, +    ["coverkgsquare"]=13254, +    ["cparen"]=9374, +    ["cruzeiro"]=8354, +    ["cstretched"]=663, +    ["curlyand"]=8911, +    ["curlyor"]=8910, +    ["currency"]=164, +    ["d"]=100, +    ["daarmenian"]=1380, +    ["dabengali"]=2470, +    ["dadarabic"]=1590, +    ["dadeva"]=2342, +    ["dadfinalarabic"]=65214, +    ["dadinitialarabic"]=65215, +    ["dadmedialarabic"]=65216, +    ["dageshhebrew"]=1468, +    ["dagger"]=8224, +    ["daggerdbl"]=8225, +    ["dagujarati"]=2726, +    ["dagurmukhi"]=2598, +    ["dahiragana"]=12384, +    ["dakatakana"]=12480, +    ["dalarabic"]=1583, +    ["daletdageshhebrew"]=64307, +    ["dalettserehebrew"]=1491, +    ["dalfinalarabic"]=65194, +    ["dammalowarabic"]=1615, +    ["dammatanarabic"]=1612, +    ["danda"]=2404, +    ["dargalefthebrew"]=1447, +    ["dasiapneumatacyrilliccmb"]=1157, +    ["dblanglebracketleft"]=12298, +    ["dblanglebracketleftvertical"]=65085, +    ["dblanglebracketright"]=12299, +    ["dblanglebracketrightvertical"]=65086, +    ["dblarchinvertedbelowcmb"]=811, +    ["dblarrowleft"]=8660, +    ["dblarrowright"]=8658, +    ["dbldanda"]=2405, +    ["dblgravecmb"]=783, +    ["dblintegral"]=8748, +    ["dbllowlinecmb"]=819, +    ["dbloverlinecmb"]=831, +    ["dblprimemod"]=698, +    ["dblverticalbar"]=8214, +    ["dblverticallineabovecmb"]=782, +    ["dbopomofo"]=12553, +    ["dbsquare"]=13256, +    ["dcaron"]=271, +    ["dcedilla"]=7697, +    ["dcircle"]=9427, +    ["dcircumflexbelow"]=7699, +    ["ddabengali"]=2465, +    ["ddadeva"]=2337, +    ["ddagujarati"]=2721, +    ["ddagurmukhi"]=2593, +    ["ddalarabic"]=1672, +    ["ddalfinalarabic"]=64393, +    ["dddhadeva"]=2396, +    ["ddhabengali"]=2466, +    ["ddhadeva"]=2338, +    ["ddhagujarati"]=2722, +    ["ddhagurmukhi"]=2594, +    ["ddotaccent"]=7691, +    ["ddotbelow"]=7693, +    ["decimalseparatorpersian"]=1643, +    ["decyrillic"]=1076, +    ["degree"]=176, +    ["dehihebrew"]=1453, +    ["dehiragana"]=12391, +    ["deicoptic"]=1007, +    ["dekatakana"]=12487, +    ["deleteleft"]=9003, +    ["deleteright"]=8998, +    ["delta"]=948, +    ["deltaturned"]=397, +    ["denominatorminusonenumeratorbengali"]=2552, +    ["dezh"]=676, +    ["dhabengali"]=2471, +    ["dhadeva"]=2343, +    ["dhagujarati"]=2727, +    ["dhagurmukhi"]=2599, +    ["dhook"]=599, +    ["dialytikatonoscmb"]=836, +    ["diamond"]=9830, +    ["diamondsuitwhite"]=9826, +    ["dieresis"]=168, +    ["dieresisbelowcmb"]=804, +    ["dieresiscmb"]=776, +    ["dieresistonos"]=901, +    ["dihiragana"]=12386, +    ["dikatakana"]=12482, +    ["dittomark"]=12291, +    ["divide"]=247, +    ["divides"]=8739, +    ["divisionslash"]=8725, +    ["djecyrillic"]=1106, +    ["dlinebelow"]=7695, +    ["dlsquare"]=13207, +    ["dmacron"]=273, +    ["dmonospace"]=65348, +    ["dnblock"]=9604, +    ["dochadathai"]=3598, +    ["dodekthai"]=3604, +    ["dohiragana"]=12393, +    ["dokatakana"]=12489, +    ["dollar"]=36, +    ["dollarmonospace"]=65284, +    ["dollarsmall"]=65129, +    ["dong"]=8363, +    ["dorusquare"]=13094, +    ["dotaccent"]=729, +    ["dotaccentcmb"]=775, +    ["dotbelowcomb"]=803, +    ["dotkatakana"]=12539, +    ["dotlessi"]=305, +    ["dotlessjstrokehook"]=644, +    ["dotmath"]=8901, +    ["dottedcircle"]=9676, +    ["downtackbelowcmb"]=798, +    ["downtackmod"]=725, +    ["dparen"]=9375, +    ["dtail"]=598, +    ["dtopbar"]=396, +    ["duhiragana"]=12389, +    ["dukatakana"]=12485, +    ["dz"]=499, +    ["dzaltone"]=675, +    ["dzcaron"]=454, +    ["dzcurl"]=677, +    ["dzeabkhasiancyrillic"]=1249, +    ["dzecyrillic"]=1109, +    ["dzhecyrillic"]=1119, +    ["e"]=101, +    ["eacute"]=233, +    ["earth"]=9793, +    ["ebengali"]=2447, +    ["ebopomofo"]=12572, +    ["ebreve"]=277, +    ["ecandradeva"]=2317, +    ["ecandragujarati"]=2701, +    ["ecandravowelsigndeva"]=2373, +    ["ecandravowelsigngujarati"]=2757, +    ["ecaron"]=283, +    ["ecedillabreve"]=7709, +    ["echarmenian"]=1381, +    ["echyiwnarmenian"]=1415, +    ["ecircle"]=9428, +    ["ecircumflex"]=234, +    ["ecircumflexacute"]=7871, +    ["ecircumflexbelow"]=7705, +    ["ecircumflexdotbelow"]=7879, +    ["ecircumflexgrave"]=7873, +    ["ecircumflexhookabove"]=7875, +    ["ecircumflextilde"]=7877, +    ["ecyrillic"]=1108, +    ["edblgrave"]=517, +    ["edeva"]=2319, +    ["edieresis"]=235, +    ["edotaccent"]=279, +    ["edotbelow"]=7865, +    ["eegurmukhi"]=2575, +    ["eematragurmukhi"]=2631, +    ["efcyrillic"]=1092, +    ["egrave"]=232, +    ["egujarati"]=2703, +    ["eharmenian"]=1383, +    ["ehbopomofo"]=12573, +    ["ehiragana"]=12360, +    ["ehookabove"]=7867, +    ["eibopomofo"]=12575, +    ["eight"]=56, +    ["eightbengali"]=2542, +    ["eightcircle"]=9319, +    ["eightcircleinversesansserif"]=10129, +    ["eightdeva"]=2414, +    ["eighteencircle"]=9329, +    ["eighteenparen"]=9349, +    ["eighteenperiod"]=9369, +    ["eightgujarati"]=2798, +    ["eightgurmukhi"]=2670, +    ["eighthackarabic"]=1640, +    ["eighthangzhou"]=12328, +    ["eightideographicparen"]=12839, +    ["eightinferior"]=8328, +    ["eightmonospace"]=65304, +    ["eightparen"]=9339, +    ["eightperiod"]=9359, +    ["eightpersian"]=1784, +    ["eightroman"]=8567, +    ["eightsuperior"]=8312, +    ["eightthai"]=3672, +    ["einvertedbreve"]=519, +    ["eiotifiedcyrillic"]=1125, +    ["ekatakana"]=12456, +    ["ekatakanahalfwidth"]=65396, +    ["ekonkargurmukhi"]=2676, +    ["ekorean"]=12628, +    ["elcyrillic"]=1083, +    ["element"]=8712, +    ["elevencircle"]=9322, +    ["elevenparen"]=9342, +    ["elevenperiod"]=9362, +    ["elevenroman"]=8570, +    ["ellipsis"]=8230, +    ["ellipsisvertical"]=8942, +    ["emacron"]=275, +    ["emacronacute"]=7703, +    ["emacrongrave"]=7701, +    ["emcyrillic"]=1084, +    ["emdash"]=8212, +    ["emdashvertical"]=65073, +    ["emonospace"]=65349, +    ["emphasismarkarmenian"]=1371, +    ["emptyset"]=8709, +    ["enbopomofo"]=12579, +    ["encyrillic"]=1085, +    ["endash"]=8211, +    ["endashvertical"]=65074, +    ["endescendercyrillic"]=1187, +    ["eng"]=331, +    ["engbopomofo"]=12581, +    ["enghecyrillic"]=1189, +    ["enhookcyrillic"]=1224, +    ["enspace"]=8194, +    ["eogonek"]=281, +    ["eokorean"]=12627, +    ["eopen"]=603, +    ["eopenclosed"]=666, +    ["eopenreversed"]=604, +    ["eopenreversedclosed"]=606, +    ["eopenreversedhook"]=605, +    ["eparen"]=9376, +    ["epsilon"]=949, +    ["epsilontonos"]=941, +    ["equal"]=61, +    ["equalmonospace"]=65309, +    ["equalsmall"]=65126, +    ["equalsuperior"]=8316, +    ["equivalence"]=8801, +    ["erbopomofo"]=12582, +    ["ercyrillic"]=1088, +    ["ereversed"]=600, +    ["ereversedcyrillic"]=1101, +    ["escyrillic"]=1089, +    ["esdescendercyrillic"]=1195, +    ["esh"]=643, +    ["eshcurl"]=646, +    ["eshortdeva"]=2318, +    ["eshortvowelsigndeva"]=2374, +    ["eshreversedloop"]=426, +    ["eshsquatreversed"]=645, +    ["esmallhiragana"]=12359, +    ["esmallkatakana"]=12455, +    ["esmallkatakanahalfwidth"]=65386, +    ["estimated"]=8494, +    ["eta"]=951, +    ["etarmenian"]=1384, +    ["etatonos"]=942, +    ["eth"]=240, +    ["etilde"]=7869, +    ["etildebelow"]=7707, +    ["etnahtalefthebrew"]=1425, +    ["eturned"]=477, +    ["eukorean"]=12641, +    ["euro"]=8364, +    ["evowelsignbengali"]=2503, +    ["evowelsigndeva"]=2375, +    ["evowelsigngujarati"]=2759, +    ["exclam"]=33, +    ["exclamarmenian"]=1372, +    ["exclamdbl"]=8252, +    ["exclamdown"]=161, +    ["exclammonospace"]=65281, +    ["ezh"]=658, +    ["ezhcaron"]=495, +    ["ezhcurl"]=659, +    ["ezhreversed"]=441, +    ["ezhtail"]=442, +    ["f"]=102, +    ["fadeva"]=2398, +    ["fagurmukhi"]=2654, +    ["fahrenheit"]=8457, +    ["fathalowarabic"]=1614, +    ["fathatanarabic"]=1611, +    ["fbopomofo"]=12552, +    ["fcircle"]=9429, +    ["fdotaccent"]=7711, +    ["feharabic"]=1601, +    ["feharmenian"]=1414, +    ["fehfinalarabic"]=65234, +    ["fehinitialarabic"]=65235, +    ["fehmedialarabic"]=65236, +    ["feicoptic"]=997, +    ["ff"]=64256, +    ["ffi"]=64259, +    ["ffl"]=64260, +    ["fi"]=64257, +    ["fifteencircle"]=9326, +    ["fifteenparen"]=9346, +    ["fifteenperiod"]=9366, +    ["figuredash"]=8210, +    ["filledbox"]=9632, +    ["filledrect"]=9644, +    ["finalkafdageshhebrew"]=64314, +    ["finalkafshevahebrew"]=1498, +    ["finalmemhebrew"]=1501, +    ["finalnunhebrew"]=1503, +    ["finalpehebrew"]=1507, +    ["finaltsadihebrew"]=1509, +    ["firsttonechinese"]=713, +    ["fisheye"]=9673, +    ["fitacyrillic"]=1139, +    ["five"]=53, +    ["fivebengali"]=2539, +    ["fivecircle"]=9316, +    ["fivecircleinversesansserif"]=10126, +    ["fivedeva"]=2411, +    ["fiveeighths"]=8541, +    ["fivegujarati"]=2795, +    ["fivegurmukhi"]=2667, +    ["fivehackarabic"]=1637, +    ["fivehangzhou"]=12325, +    ["fiveideographicparen"]=12836, +    ["fiveinferior"]=8325, +    ["fivemonospace"]=65301, +    ["fiveparen"]=9336, +    ["fiveperiod"]=9356, +    ["fivepersian"]=1781, +    ["fiveroman"]=8564, +    ["fivesuperior"]=8309, +    ["fivethai"]=3669, +    ["fl"]=64258, +    ["florin"]=402, +    ["fmonospace"]=65350, +    ["fmsquare"]=13209, +    ["fofanthai"]=3615, +    ["fofathai"]=3613, +    ["fongmanthai"]=3663, +    ["four"]=52, +    ["fourbengali"]=2538, +    ["fourcircle"]=9315, +    ["fourcircleinversesansserif"]=10125, +    ["fourdeva"]=2410, +    ["fourgujarati"]=2794, +    ["fourgurmukhi"]=2666, +    ["fourhackarabic"]=1636, +    ["fourhangzhou"]=12324, +    ["fourideographicparen"]=12835, +    ["fourinferior"]=8324, +    ["fourmonospace"]=65300, +    ["fournumeratorbengali"]=2551, +    ["fourparen"]=9335, +    ["fourperiod"]=9355, +    ["fourpersian"]=1780, +    ["fourroman"]=8563, +    ["foursuperior"]=8308, +    ["fourteencircle"]=9325, +    ["fourteenparen"]=9345, +    ["fourteenperiod"]=9365, +    ["fourthai"]=3668, +    ["fourthtonechinese"]=715, +    ["fparen"]=9377, +    ["fraction"]=8260, +    ["franc"]=8355, +    ["g"]=103, +    ["gabengali"]=2455, +    ["gacute"]=501, +    ["gadeva"]=2327, +    ["gafarabic"]=1711, +    ["gaffinalarabic"]=64403, +    ["gafinitialarabic"]=64404, +    ["gafmedialarabic"]=64405, +    ["gagujarati"]=2711, +    ["gagurmukhi"]=2583, +    ["gahiragana"]=12364, +    ["gakatakana"]=12460, +    ["gamma"]=947, +    ["gammalatinsmall"]=611, +    ["gammasuperior"]=736, +    ["gangiacoptic"]=1003, +    ["gbopomofo"]=12557, +    ["gbreve"]=287, +    ["gcaron"]=487, +    ["gcircle"]=9430, +    ["gcircumflex"]=285, +    ["gcommaaccent"]=291, +    ["gdotaccent"]=289, +    ["gecyrillic"]=1075, +    ["gehiragana"]=12370, +    ["gekatakana"]=12466, +    ["geometricallyequal"]=8785, +    ["gereshaccenthebrew"]=1436, +    ["gereshhebrew"]=1523, +    ["gereshmuqdamhebrew"]=1437, +    ["germandbls"]=223, +    ["gershayimaccenthebrew"]=1438, +    ["gershayimhebrew"]=1524, +    ["getamark"]=12307, +    ["ghabengali"]=2456, +    ["ghadarmenian"]=1394, +    ["ghadeva"]=2328, +    ["ghagujarati"]=2712, +    ["ghagurmukhi"]=2584, +    ["ghainarabic"]=1594, +    ["ghainfinalarabic"]=65230, +    ["ghaininitialarabic"]=65231, +    ["ghainmedialarabic"]=65232, +    ["ghemiddlehookcyrillic"]=1173, +    ["ghestrokecyrillic"]=1171, +    ["gheupturncyrillic"]=1169, +    ["ghhadeva"]=2394, +    ["ghhagurmukhi"]=2650, +    ["ghook"]=608, +    ["ghzsquare"]=13203, +    ["gihiragana"]=12366, +    ["gikatakana"]=12462, +    ["gimarmenian"]=1379, +    ["gimeldageshhebrew"]=64306, +    ["gimelhebrew"]=1490, +    ["gjecyrillic"]=1107, +    ["glottalinvertedstroke"]=446, +    ["glottalstop"]=660, +    ["glottalstopinverted"]=662, +    ["glottalstopmod"]=704, +    ["glottalstopreversed"]=661, +    ["glottalstopreversedmod"]=705, +    ["glottalstopreversedsuperior"]=740, +    ["glottalstopstroke"]=673, +    ["glottalstopstrokereversed"]=674, +    ["gmacron"]=7713, +    ["gmonospace"]=65351, +    ["gohiragana"]=12372, +    ["gokatakana"]=12468, +    ["gparen"]=9378, +    ["gpasquare"]=13228, +    ["grave"]=96, +    ["gravebelowcmb"]=790, +    ["gravecomb"]=768, +    ["gravedeva"]=2387, +    ["gravelowmod"]=718, +    ["gravemonospace"]=65344, +    ["gravetonecmb"]=832, +    ["greater"]=62, +    ["greaterequal"]=8805, +    ["greaterequalorless"]=8923, +    ["greatermonospace"]=65310, +    ["greaterorequivalent"]=8819, +    ["greaterorless"]=8823, +    ["greateroverequal"]=8807, +    ["greatersmall"]=65125, +    ["gscript"]=609, +    ["gstroke"]=485, +    ["guhiragana"]=12368, +    ["guillemotleft"]=171, +    ["guillemotright"]=187, +    ["guilsinglleft"]=8249, +    ["guilsinglright"]=8250, +    ["gukatakana"]=12464, +    ["guramusquare"]=13080, +    ["gysquare"]=13257, +    ["h"]=104, +    ["haabkhasiancyrillic"]=1193, +    ["habengali"]=2489, +    ["hadescendercyrillic"]=1203, +    ["hadeva"]=2361, +    ["hagujarati"]=2745, +    ["hagurmukhi"]=2617, +    ["haharabic"]=1581, +    ["hahfinalarabic"]=65186, +    ["hahinitialarabic"]=65187, +    ["hahiragana"]=12399, +    ["hahmedialarabic"]=65188, +    ["haitusquare"]=13098, +    ["hakatakana"]=12495, +    ["hakatakanahalfwidth"]=65418, +    ["halantgurmukhi"]=2637, +    ["hamzasukunarabic"]=1569, +    ["hangulfiller"]=12644, +    ["hardsigncyrillic"]=1098, +    ["harpoonleftbarbup"]=8636, +    ["harpoonrightbarbup"]=8640, +    ["hasquare"]=13258, +    ["hatafpatahwidehebrew"]=1458, +    ["hatafqamatswidehebrew"]=1459, +    ["hatafsegolwidehebrew"]=1457, +    ["hbar"]=295, +    ["hbopomofo"]=12559, +    ["hbrevebelow"]=7723, +    ["hcedilla"]=7721, +    ["hcircle"]=9431, +    ["hcircumflex"]=293, +    ["hdieresis"]=7719, +    ["hdotaccent"]=7715, +    ["hdotbelow"]=7717, +    ["heartsuitblack"]=9829, +    ["heartsuitwhite"]=9825, +    ["hedageshhebrew"]=64308, +    ["hehaltonearabic"]=1729, +    ["heharabic"]=1607, +    ["hehebrew"]=1492, +    ["hehfinalaltonearabic"]=64423, +    ["hehfinalarabic"]=65258, +    ["hehhamzaabovefinalarabic"]=64421, +    ["hehhamzaaboveisolatedarabic"]=64420, +    ["hehinitialaltonearabic"]=64424, +    ["hehinitialarabic"]=65259, +    ["hehiragana"]=12408, +    ["hehmedialaltonearabic"]=64425, +    ["hehmedialarabic"]=65260, +    ["heiseierasquare"]=13179, +    ["hekatakana"]=12504, +    ["hekatakanahalfwidth"]=65421, +    ["hekutaarusquare"]=13110, +    ["henghook"]=615, +    ["herutusquare"]=13113, +    ["hethebrew"]=1495, +    ["hhook"]=614, +    ["hhooksuperior"]=689, +    ["hieuhacirclekorean"]=12923, +    ["hieuhaparenkorean"]=12827, +    ["hieuhcirclekorean"]=12909, +    ["hieuhkorean"]=12622, +    ["hieuhparenkorean"]=12813, +    ["hihiragana"]=12402, +    ["hikatakana"]=12498, +    ["hikatakanahalfwidth"]=65419, +    ["hiriqwidehebrew"]=1460, +    ["hlinebelow"]=7830, +    ["hmonospace"]=65352, +    ["hoarmenian"]=1392, +    ["hohipthai"]=3627, +    ["hohiragana"]=12411, +    ["hokatakana"]=12507, +    ["hokatakanahalfwidth"]=65422, +    ["holamwidehebrew"]=1465, +    ["honokhukthai"]=3630, +    ["hookcmb"]=777, +    ["hookpalatalizedbelowcmb"]=801, +    ["hookretroflexbelowcmb"]=802, +    ["hoonsquare"]=13122, +    ["horicoptic"]=1001, +    ["horizontalbar"]=8213, +    ["horncmb"]=795, +    ["hotsprings"]=9832, +    ["house"]=8962, +    ["hparen"]=9379, +    ["hsuperior"]=688, +    ["hturned"]=613, +    ["huhiragana"]=12405, +    ["huiitosquare"]=13107, +    ["hukatakana"]=12501, +    ["hukatakanahalfwidth"]=65420, +    ["hungarumlaut"]=733, +    ["hungarumlautcmb"]=779, +    ["hv"]=405, +    ["hyphen"]=45, +    ["hyphenmonospace"]=65293, +    ["hyphensmall"]=65123, +    ["hyphentwo"]=8208, +    ["i"]=105, +    ["iacute"]=237, +    ["iacyrillic"]=1103, +    ["ibengali"]=2439, +    ["ibopomofo"]=12583, +    ["ibreve"]=301, +    ["icaron"]=464, +    ["icircle"]=9432, +    ["icircumflex"]=238, +    ["icyrillic"]=1110, +    ["idblgrave"]=521, +    ["ideographearthcircle"]=12943, +    ["ideographfirecircle"]=12939, +    ["ideographicallianceparen"]=12863, +    ["ideographiccallparen"]=12858, +    ["ideographiccentrecircle"]=12965, +    ["ideographicclose"]=12294, +    ["ideographiccomma"]=12289, +    ["ideographiccommaleft"]=65380, +    ["ideographiccongratulationparen"]=12855, +    ["ideographiccorrectcircle"]=12963, +    ["ideographicearthparen"]=12847, +    ["ideographicenterpriseparen"]=12861, +    ["ideographicexcellentcircle"]=12957, +    ["ideographicfestivalparen"]=12864, +    ["ideographicfinancialcircle"]=12950, +    ["ideographicfinancialparen"]=12854, +    ["ideographicfireparen"]=12843, +    ["ideographichaveparen"]=12850, +    ["ideographichighcircle"]=12964, +    ["ideographiciterationmark"]=12293, +    ["ideographiclaborcircle"]=12952, +    ["ideographiclaborparen"]=12856, +    ["ideographicleftcircle"]=12967, +    ["ideographiclowcircle"]=12966, +    ["ideographicmedicinecircle"]=12969, +    ["ideographicmetalparen"]=12846, +    ["ideographicmoonparen"]=12842, +    ["ideographicnameparen"]=12852, +    ["ideographicperiod"]=12290, +    ["ideographicprintcircle"]=12958, +    ["ideographicreachparen"]=12867, +    ["ideographicrepresentparen"]=12857, +    ["ideographicresourceparen"]=12862, +    ["ideographicrightcircle"]=12968, +    ["ideographicsecretcircle"]=12953, +    ["ideographicselfparen"]=12866, +    ["ideographicsocietyparen"]=12851, +    ["ideographicspace"]=12288, +    ["ideographicspecialparen"]=12853, +    ["ideographicstockparen"]=12849, +    ["ideographicstudyparen"]=12859, +    ["ideographicsunparen"]=12848, +    ["ideographicsuperviseparen"]=12860, +    ["ideographicwaterparen"]=12844, +    ["ideographicwoodparen"]=12845, +    ["ideographiczero"]=12295, +    ["ideographmetalcircle"]=12942, +    ["ideographmooncircle"]=12938, +    ["ideographnamecircle"]=12948, +    ["ideographsuncircle"]=12944, +    ["ideographwatercircle"]=12940, +    ["ideographwoodcircle"]=12941, +    ["ideva"]=2311, +    ["idieresis"]=239, +    ["idieresisacute"]=7727, +    ["idieresiscyrillic"]=1253, +    ["idotbelow"]=7883, +    ["iebrevecyrillic"]=1239, +    ["iecyrillic"]=1077, +    ["ieungacirclekorean"]=12917, +    ["ieungaparenkorean"]=12821, +    ["ieungcirclekorean"]=12903, +    ["ieungkorean"]=12615, +    ["ieungparenkorean"]=12807, +    ["igrave"]=236, +    ["igujarati"]=2695, +    ["igurmukhi"]=2567, +    ["ihiragana"]=12356, +    ["ihookabove"]=7881, +    ["iibengali"]=2440, +    ["iicyrillic"]=1080, +    ["iideva"]=2312, +    ["iigujarati"]=2696, +    ["iigurmukhi"]=2568, +    ["iimatragurmukhi"]=2624, +    ["iinvertedbreve"]=523, +    ["iishortcyrillic"]=1081, +    ["iivowelsignbengali"]=2496, +    ["iivowelsigndeva"]=2368, +    ["iivowelsigngujarati"]=2752, +    ["ij"]=307, +    ["ikatakana"]=12452, +    ["ikatakanahalfwidth"]=65394, +    ["ikorean"]=12643, +    ["iluyhebrew"]=1452, +    ["imacron"]=299, +    ["imacroncyrillic"]=1251, +    ["imageorapproximatelyequal"]=8787, +    ["imatragurmukhi"]=2623, +    ["imonospace"]=65353, +    ["increment"]=8710, +    ["infinity"]=8734, +    ["iniarmenian"]=1387, +    ["integral"]=8747, +    ["integralbt"]=8993, +    ["integraltp"]=8992, +    ["intersection"]=8745, +    ["intisquare"]=13061, +    ["invbullet"]=9688, +    ["invsmileface"]=9787, +    ["iocyrillic"]=1105, +    ["iogonek"]=303, +    ["iota"]=953, +    ["iotadieresis"]=970, +    ["iotadieresistonos"]=912, +    ["iotalatin"]=617, +    ["iotatonos"]=943, +    ["iparen"]=9380, +    ["irigurmukhi"]=2674, +    ["ismallhiragana"]=12355, +    ["ismallkatakana"]=12451, +    ["ismallkatakanahalfwidth"]=65384, +    ["issharbengali"]=2554, +    ["istroke"]=616, +    ["iterationhiragana"]=12445, +    ["iterationkatakana"]=12541, +    ["itilde"]=297, +    ["itildebelow"]=7725, +    ["iubopomofo"]=12585, +    ["iucyrillic"]=1102, +    ["ivowelsignbengali"]=2495, +    ["ivowelsigndeva"]=2367, +    ["ivowelsigngujarati"]=2751, +    ["izhitsacyrillic"]=1141, +    ["izhitsadblgravecyrillic"]=1143, +    ["j"]=106, +    ["jaarmenian"]=1393, +    ["jabengali"]=2460, +    ["jadeva"]=2332, +    ["jagujarati"]=2716, +    ["jagurmukhi"]=2588, +    ["jbopomofo"]=12560, +    ["jcaron"]=496, +    ["jcircle"]=9433, +    ["jcircumflex"]=309, +    ["jcrossedtail"]=669, +    ["jdotlessstroke"]=607, +    ["jecyrillic"]=1112, +    ["jeemarabic"]=1580, +    ["jeemfinalarabic"]=65182, +    ["jeeminitialarabic"]=65183, +    ["jeemmedialarabic"]=65184, +    ["jeharabic"]=1688, +    ["jehfinalarabic"]=64395, +    ["jhabengali"]=2461, +    ["jhadeva"]=2333, +    ["jhagujarati"]=2717, +    ["jhagurmukhi"]=2589, +    ["jheharmenian"]=1403, +    ["jis"]=12292, +    ["jmonospace"]=65354, +    ["jparen"]=9381, +    ["jsuperior"]=690, +    ["k"]=107, +    ["kabashkircyrillic"]=1185, +    ["kabengali"]=2453, +    ["kacute"]=7729, +    ["kacyrillic"]=1082, +    ["kadescendercyrillic"]=1179, +    ["kadeva"]=2325, +    ["kafarabic"]=1603, +    ["kafdageshhebrew"]=64315, +    ["kaffinalarabic"]=65242, +    ["kafhebrew"]=1499, +    ["kafinitialarabic"]=65243, +    ["kafmedialarabic"]=65244, +    ["kafrafehebrew"]=64333, +    ["kagujarati"]=2709, +    ["kagurmukhi"]=2581, +    ["kahiragana"]=12363, +    ["kahookcyrillic"]=1220, +    ["kakatakana"]=12459, +    ["kakatakanahalfwidth"]=65398, +    ["kappa"]=954, +    ["kappasymbolgreek"]=1008, +    ["kapyeounmieumkorean"]=12657, +    ["kapyeounphieuphkorean"]=12676, +    ["kapyeounpieupkorean"]=12664, +    ["kapyeounssangpieupkorean"]=12665, +    ["karoriisquare"]=13069, +    ["kasmallkatakana"]=12533, +    ["kasquare"]=13188, +    ["kasraarabic"]=1616, +    ["kasratanarabic"]=1613, +    ["kastrokecyrillic"]=1183, +    ["katahiraprolongmarkhalfwidth"]=65392, +    ["kaverticalstrokecyrillic"]=1181, +    ["kbopomofo"]=12558, +    ["kcalsquare"]=13193, +    ["kcaron"]=489, +    ["kcircle"]=9434, +    ["kcommaaccent"]=311, +    ["kdotbelow"]=7731, +    ["keharmenian"]=1412, +    ["kehiragana"]=12369, +    ["kekatakana"]=12465, +    ["kekatakanahalfwidth"]=65401, +    ["kenarmenian"]=1391, +    ["kesmallkatakana"]=12534, +    ["kgreenlandic"]=312, +    ["khabengali"]=2454, +    ["khacyrillic"]=1093, +    ["khadeva"]=2326, +    ["khagujarati"]=2710, +    ["khagurmukhi"]=2582, +    ["khaharabic"]=1582, +    ["khahfinalarabic"]=65190, +    ["khahinitialarabic"]=65191, +    ["khahmedialarabic"]=65192, +    ["kheicoptic"]=999, +    ["khhadeva"]=2393, +    ["khhagurmukhi"]=2649, +    ["khieukhacirclekorean"]=12920, +    ["khieukhaparenkorean"]=12824, +    ["khieukhcirclekorean"]=12906, +    ["khieukhkorean"]=12619, +    ["khieukhparenkorean"]=12810, +    ["khokhaithai"]=3586, +    ["khokhonthai"]=3589, +    ["khokhuatthai"]=3587, +    ["khokhwaithai"]=3588, +    ["khomutthai"]=3675, +    ["khook"]=409, +    ["khorakhangthai"]=3590, +    ["khzsquare"]=13201, +    ["kihiragana"]=12365, +    ["kikatakana"]=12461, +    ["kikatakanahalfwidth"]=65399, +    ["kiroguramusquare"]=13077, +    ["kiromeetorusquare"]=13078, +    ["kirosquare"]=13076, +    ["kiyeokacirclekorean"]=12910, +    ["kiyeokaparenkorean"]=12814, +    ["kiyeokcirclekorean"]=12896, +    ["kiyeokkorean"]=12593, +    ["kiyeokparenkorean"]=12800, +    ["kiyeoksioskorean"]=12595, +    ["kjecyrillic"]=1116, +    ["klinebelow"]=7733, +    ["klsquare"]=13208, +    ["kmcubedsquare"]=13222, +    ["kmonospace"]=65355, +    ["kmsquaredsquare"]=13218, +    ["kohiragana"]=12371, +    ["kohmsquare"]=13248, +    ["kokaithai"]=3585, +    ["kokatakana"]=12467, +    ["kokatakanahalfwidth"]=65402, +    ["kooposquare"]=13086, +    ["koppacyrillic"]=1153, +    ["koreanstandardsymbol"]=12927, +    ["koroniscmb"]=835, +    ["kparen"]=9382, +    ["kpasquare"]=13226, +    ["ksicyrillic"]=1135, +    ["ktsquare"]=13263, +    ["kturned"]=670, +    ["kuhiragana"]=12367, +    ["kukatakana"]=12463, +    ["kukatakanahalfwidth"]=65400, +    ["kvsquare"]=13240, +    ["kwsquare"]=13246, +    ["l"]=108, +    ["labengali"]=2482, +    ["lacute"]=314, +    ["ladeva"]=2354, +    ["lagujarati"]=2738, +    ["lagurmukhi"]=2610, +    ["lakkhangyaothai"]=3653, +    ["lamaleffinalarabic"]=65276, +    ["lamalefhamzaabovefinalarabic"]=65272, +    ["lamalefhamzaaboveisolatedarabic"]=65271, +    ["lamalefhamzabelowfinalarabic"]=65274, +    ["lamalefhamzabelowisolatedarabic"]=65273, +    ["lamalefisolatedarabic"]=65275, +    ["lamalefmaddaabovefinalarabic"]=65270, +    ["lamalefmaddaaboveisolatedarabic"]=65269, +    ["lamarabic"]=1604, +    ["lambda"]=955, +    ["lambdastroke"]=411, +    ["lameddageshhebrew"]=64316, +    ["lamedholamhebrew"]=1500, +    ["lamfinalarabic"]=65246, +    ["lamhahinitialarabic"]=64714, +    ["lamjeeminitialarabic"]=64713, +    ["lamkhahinitialarabic"]=64715, +    ["lamlamhehisolatedarabic"]=65010, +    ["lammedialarabic"]=65248, +    ["lammeemhahinitialarabic"]=64904, +    ["lammeeminitialarabic"]=64716, +    ["lammeemkhahinitialarabic"]=65247, +    ["largecircle"]=9711, +    ["lbar"]=410, +    ["lbelt"]=620, +    ["lbopomofo"]=12556, +    ["lcaron"]=318, +    ["lcircle"]=9435, +    ["lcircumflexbelow"]=7741, +    ["lcommaaccent"]=316, +    ["ldotaccent"]=320, +    ["ldotbelow"]=7735, +    ["ldotbelowmacron"]=7737, +    ["leftangleabovecmb"]=794, +    ["lefttackbelowcmb"]=792, +    ["less"]=60, +    ["lessequal"]=8804, +    ["lessequalorgreater"]=8922, +    ["lessmonospace"]=65308, +    ["lessorequivalent"]=8818, +    ["lessorgreater"]=8822, +    ["lessoverequal"]=8806, +    ["lesssmall"]=65124, +    ["lezh"]=622, +    ["lfblock"]=9612, +    ["lhookretroflex"]=621, +    ["lira"]=8356, +    ["liwnarmenian"]=1388, +    ["lj"]=457, +    ["ljecyrillic"]=1113, +    ["lladeva"]=2355, +    ["llagujarati"]=2739, +    ["llinebelow"]=7739, +    ["llladeva"]=2356, +    ["llvocalicbengali"]=2529, +    ["llvocalicdeva"]=2401, +    ["llvocalicvowelsignbengali"]=2531, +    ["llvocalicvowelsigndeva"]=2403, +    ["lmiddletilde"]=619, +    ["lmonospace"]=65356, +    ["lmsquare"]=13264, +    ["lochulathai"]=3628, +    ["logicaland"]=8743, +    ["logicalnot"]=172, +    ["logicalor"]=8744, +    ["lolingthai"]=3621, +    ["lowlinecenterline"]=65102, +    ["lowlinecmb"]=818, +    ["lowlinedashed"]=65101, +    ["lozenge"]=9674, +    ["lparen"]=9383, +    ["lslash"]=322, +    ["lsquare"]=8467, +    ["luthai"]=3622, +    ["lvocalicbengali"]=2444, +    ["lvocalicdeva"]=2316, +    ["lvocalicvowelsignbengali"]=2530, +    ["lvocalicvowelsigndeva"]=2402, +    ["lxsquare"]=13267, +    ["m"]=109, +    ["mabengali"]=2478, +    ["macron"]=175, +    ["macronbelowcmb"]=817, +    ["macroncmb"]=772, +    ["macronlowmod"]=717, +    ["macronmonospace"]=65507, +    ["macute"]=7743, +    ["madeva"]=2350, +    ["magujarati"]=2734, +    ["magurmukhi"]=2606, +    ["mahapakhlefthebrew"]=1444, +    ["mahiragana"]=12414, +    ["maichattawathai"]=3659, +    ["maiekthai"]=3656, +    ["maihanakatthai"]=3633, +    ["maitaikhuthai"]=3655, +    ["maithothai"]=3657, +    ["maitrithai"]=3658, +    ["maiyamokthai"]=3654, +    ["makatakana"]=12510, +    ["makatakanahalfwidth"]=65423, +    ["mansyonsquare"]=13127, +    ["maqafhebrew"]=1470, +    ["mars"]=9794, +    ["masoracirclehebrew"]=1455, +    ["masquare"]=13187, +    ["mbopomofo"]=12551, +    ["mbsquare"]=13268, +    ["mcircle"]=9436, +    ["mcubedsquare"]=13221, +    ["mdotaccent"]=7745, +    ["mdotbelow"]=7747, +    ["meemarabic"]=1605, +    ["meemfinalarabic"]=65250, +    ["meeminitialarabic"]=65251, +    ["meemmedialarabic"]=65252, +    ["meemmeeminitialarabic"]=64721, +    ["meemmeemisolatedarabic"]=64584, +    ["meetorusquare"]=13133, +    ["mehiragana"]=12417, +    ["meizierasquare"]=13182, +    ["mekatakana"]=12513, +    ["mekatakanahalfwidth"]=65426, +    ["memdageshhebrew"]=64318, +    ["memhebrew"]=1502, +    ["menarmenian"]=1396, +    ["merkhakefulalefthebrew"]=1446, +    ["merkhalefthebrew"]=1445, +    ["mhook"]=625, +    ["mhzsquare"]=13202, +    ["middledotkatakanahalfwidth"]=65381, +    ["mieumacirclekorean"]=12914, +    ["mieumaparenkorean"]=12818, +    ["mieumcirclekorean"]=12900, +    ["mieumkorean"]=12609, +    ["mieumpansioskorean"]=12656, +    ["mieumparenkorean"]=12804, +    ["mieumpieupkorean"]=12654, +    ["mieumsioskorean"]=12655, +    ["mihiragana"]=12415, +    ["mikatakana"]=12511, +    ["mikatakanahalfwidth"]=65424, +    ["minus"]=8722, +    ["minusbelowcmb"]=800, +    ["minuscircle"]=8854, +    ["minusmod"]=727, +    ["minusplus"]=8723, +    ["minute"]=8242, +    ["miribaarusquare"]=13130, +    ["mirisquare"]=13129, +    ["mlonglegturned"]=624, +    ["mlsquare"]=13206, +    ["mmcubedsquare"]=13219, +    ["mmonospace"]=65357, +    ["mmsquaredsquare"]=13215, +    ["mohiragana"]=12418, +    ["mohmsquare"]=13249, +    ["mokatakana"]=12514, +    ["mokatakanahalfwidth"]=65427, +    ["molsquare"]=13270, +    ["momathai"]=3617, +    ["moverssquare"]=13223, +    ["moverssquaredsquare"]=13224, +    ["mparen"]=9384, +    ["mpasquare"]=13227, +    ["mssquare"]=13235, +    ["mturned"]=623, +    ["mu1"]=181, +    ["muasquare"]=13186, +    ["muchgreater"]=8811, +    ["muchless"]=8810, +    ["mufsquare"]=13196, +    ["mugreek"]=956, +    ["mugsquare"]=13197, +    ["muhiragana"]=12416, +    ["mukatakana"]=12512, +    ["mukatakanahalfwidth"]=65425, +    ["mulsquare"]=13205, +    ["multiply"]=215, +    ["mumsquare"]=13211, +    ["munahlefthebrew"]=1443, +    ["musicalnote"]=9834, +    ["musicalnotedbl"]=9835, +    ["musicflatsign"]=9837, +    ["musicsharpsign"]=9839, +    ["mussquare"]=13234, +    ["muvsquare"]=13238, +    ["muwsquare"]=13244, +    ["mvmegasquare"]=13241, +    ["mvsquare"]=13239, +    ["mwmegasquare"]=13247, +    ["mwsquare"]=13245, +    ["n"]=110, +    ["nabengali"]=2472, +    ["nabla"]=8711, +    ["nacute"]=324, +    ["nadeva"]=2344, +    ["nagujarati"]=2728, +    ["nagurmukhi"]=2600, +    ["nahiragana"]=12394, +    ["nakatakana"]=12490, +    ["nakatakanahalfwidth"]=65413, +    ["nasquare"]=13185, +    ["nbopomofo"]=12555, +    ["ncaron"]=328, +    ["ncircle"]=9437, +    ["ncircumflexbelow"]=7755, +    ["ncommaaccent"]=326, +    ["ndotaccent"]=7749, +    ["ndotbelow"]=7751, +    ["nehiragana"]=12397, +    ["nekatakana"]=12493, +    ["nekatakanahalfwidth"]=65416, +    ["nfsquare"]=13195, +    ["ngabengali"]=2457, +    ["ngadeva"]=2329, +    ["ngagujarati"]=2713, +    ["ngagurmukhi"]=2585, +    ["ngonguthai"]=3591, +    ["nhiragana"]=12435, +    ["nhookleft"]=626, +    ["nhookretroflex"]=627, +    ["nieunacirclekorean"]=12911, +    ["nieunaparenkorean"]=12815, +    ["nieuncieuckorean"]=12597, +    ["nieuncirclekorean"]=12897, +    ["nieunhieuhkorean"]=12598, +    ["nieunkorean"]=12596, +    ["nieunpansioskorean"]=12648, +    ["nieunparenkorean"]=12801, +    ["nieunsioskorean"]=12647, +    ["nieuntikeutkorean"]=12646, +    ["nihiragana"]=12395, +    ["nikatakana"]=12491, +    ["nikatakanahalfwidth"]=65414, +    ["nikhahitthai"]=3661, +    ["nine"]=57, +    ["ninebengali"]=2543, +    ["ninecircle"]=9320, +    ["ninecircleinversesansserif"]=10130, +    ["ninedeva"]=2415, +    ["ninegujarati"]=2799, +    ["ninegurmukhi"]=2671, +    ["ninehackarabic"]=1641, +    ["ninehangzhou"]=12329, +    ["nineideographicparen"]=12840, +    ["nineinferior"]=8329, +    ["ninemonospace"]=65305, +    ["nineparen"]=9340, +    ["nineperiod"]=9360, +    ["ninepersian"]=1785, +    ["nineroman"]=8568, +    ["ninesuperior"]=8313, +    ["nineteencircle"]=9330, +    ["nineteenparen"]=9350, +    ["nineteenperiod"]=9370, +    ["ninethai"]=3673, +    ["nj"]=460, +    ["njecyrillic"]=1114, +    ["nkatakana"]=12531, +    ["nkatakanahalfwidth"]=65437, +    ["nlegrightlong"]=414, +    ["nlinebelow"]=7753, +    ["nmonospace"]=65358, +    ["nmsquare"]=13210, +    ["nnabengali"]=2467, +    ["nnadeva"]=2339, +    ["nnagujarati"]=2723, +    ["nnagurmukhi"]=2595, +    ["nnnadeva"]=2345, +    ["nohiragana"]=12398, +    ["nokatakana"]=12494, +    ["nokatakanahalfwidth"]=65417, +    ["nonbreakingspace"]=160, +    ["nonenthai"]=3603, +    ["nonuthai"]=3609, +    ["noonarabic"]=1606, +    ["noonfinalarabic"]=65254, +    ["noonghunnaarabic"]=1722, +    ["noonghunnafinalarabic"]=64415, +    ["nooninitialarabic"]=65255, +    ["noonjeeminitialarabic"]=64722, +    ["noonjeemisolatedarabic"]=64587, +    ["noonmedialarabic"]=65256, +    ["noonmeeminitialarabic"]=64725, +    ["noonmeemisolatedarabic"]=64590, +    ["noonnoonfinalarabic"]=64653, +    ["notcontains"]=8716, +    ["notelementof"]=8713, +    ["notequal"]=8800, +    ["notgreater"]=8815, +    ["notgreaternorequal"]=8817, +    ["notgreaternorless"]=8825, +    ["notidentical"]=8802, +    ["notless"]=8814, +    ["notlessnorequal"]=8816, +    ["notparallel"]=8742, +    ["notprecedes"]=8832, +    ["notsubset"]=8836, +    ["notsucceeds"]=8833, +    ["notsuperset"]=8837, +    ["nowarmenian"]=1398, +    ["nparen"]=9385, +    ["nssquare"]=13233, +    ["nsuperior"]=8319, +    ["ntilde"]=241, +    ["nu"]=957, +    ["nuhiragana"]=12396, +    ["nukatakana"]=12492, +    ["nukatakanahalfwidth"]=65415, +    ["nuktabengali"]=2492, +    ["nuktadeva"]=2364, +    ["nuktagujarati"]=2748, +    ["nuktagurmukhi"]=2620, +    ["numbersign"]=35, +    ["numbersignmonospace"]=65283, +    ["numbersignsmall"]=65119, +    ["numeralsigngreek"]=884, +    ["numeralsignlowergreek"]=885, +    ["numero"]=8470, +    ["nundageshhebrew"]=64320, +    ["nunhebrew"]=1504, +    ["nvsquare"]=13237, +    ["nwsquare"]=13243, +    ["nyabengali"]=2462, +    ["nyadeva"]=2334, +    ["nyagujarati"]=2718, +    ["nyagurmukhi"]=2590, +    ["o"]=111, +    ["oacute"]=243, +    ["oangthai"]=3629, +    ["obarred"]=629, +    ["obarredcyrillic"]=1257, +    ["obarreddieresiscyrillic"]=1259, +    ["obengali"]=2451, +    ["obopomofo"]=12571, +    ["obreve"]=335, +    ["ocandradeva"]=2321, +    ["ocandragujarati"]=2705, +    ["ocandravowelsigndeva"]=2377, +    ["ocandravowelsigngujarati"]=2761, +    ["ocaron"]=466, +    ["ocircle"]=9438, +    ["ocircumflex"]=244, +    ["ocircumflexacute"]=7889, +    ["ocircumflexdotbelow"]=7897, +    ["ocircumflexgrave"]=7891, +    ["ocircumflexhookabove"]=7893, +    ["ocircumflextilde"]=7895, +    ["ocyrillic"]=1086, +    ["odblgrave"]=525, +    ["odeva"]=2323, +    ["odieresis"]=246, +    ["odieresiscyrillic"]=1255, +    ["odotbelow"]=7885, +    ["oe"]=339, +    ["oekorean"]=12634, +    ["ogonek"]=731, +    ["ogonekcmb"]=808, +    ["ograve"]=242, +    ["ogujarati"]=2707, +    ["oharmenian"]=1413, +    ["ohiragana"]=12362, +    ["ohookabove"]=7887, +    ["ohorn"]=417, +    ["ohornacute"]=7899, +    ["ohorndotbelow"]=7907, +    ["ohorngrave"]=7901, +    ["ohornhookabove"]=7903, +    ["ohorntilde"]=7905, +    ["ohungarumlaut"]=337, +    ["oi"]=419, +    ["oinvertedbreve"]=527, +    ["okatakana"]=12458, +    ["okatakanahalfwidth"]=65397, +    ["okorean"]=12631, +    ["olehebrew"]=1451, +    ["omacron"]=333, +    ["omacronacute"]=7763, +    ["omacrongrave"]=7761, +    ["omdeva"]=2384, +    ["omega"]=969, +    ["omegacyrillic"]=1121, +    ["omegalatinclosed"]=631, +    ["omegaroundcyrillic"]=1147, +    ["omegatitlocyrillic"]=1149, +    ["omegatonos"]=974, +    ["omgujarati"]=2768, +    ["omicron"]=959, +    ["omicrontonos"]=972, +    ["omonospace"]=65359, +    ["one"]=49, +    ["onebengali"]=2535, +    ["onecircle"]=9312, +    ["onecircleinversesansserif"]=10122, +    ["onedeva"]=2407, +    ["onedotenleader"]=8228, +    ["oneeighth"]=8539, +    ["onegujarati"]=2791, +    ["onegurmukhi"]=2663, +    ["onehackarabic"]=1633, +    ["onehalf"]=189, +    ["onehangzhou"]=12321, +    ["oneideographicparen"]=12832, +    ["oneinferior"]=8321, +    ["onemonospace"]=65297, +    ["onenumeratorbengali"]=2548, +    ["oneparen"]=9332, +    ["oneperiod"]=9352, +    ["onepersian"]=1777, +    ["onequarter"]=188, +    ["oneroman"]=8560, +    ["onesuperior"]=185, +    ["onethai"]=3665, +    ["onethird"]=8531, +    ["oogonek"]=491, +    ["oogonekmacron"]=493, +    ["oogurmukhi"]=2579, +    ["oomatragurmukhi"]=2635, +    ["oopen"]=596, +    ["oparen"]=9386, +    ["option"]=8997, +    ["ordfeminine"]=170, +    ["ordmasculine"]=186, +    ["oshortdeva"]=2322, +    ["oshortvowelsigndeva"]=2378, +    ["oslash"]=248, +    ["osmallhiragana"]=12361, +    ["osmallkatakana"]=12457, +    ["osmallkatakanahalfwidth"]=65387, +    ["ostrokeacute"]=511, +    ["otcyrillic"]=1151, +    ["otilde"]=245, +    ["otildeacute"]=7757, +    ["otildedieresis"]=7759, +    ["oubopomofo"]=12577, +    ["overline"]=8254, +    ["overlinecenterline"]=65098, +    ["overlinecmb"]=773, +    ["overlinedashed"]=65097, +    ["overlinedblwavy"]=65100, +    ["overlinewavy"]=65099, +    ["ovowelsignbengali"]=2507, +    ["ovowelsigndeva"]=2379, +    ["ovowelsigngujarati"]=2763, +    ["p"]=112, +    ["paampssquare"]=13184, +    ["paasentosquare"]=13099, +    ["pabengali"]=2474, +    ["pacute"]=7765, +    ["padeva"]=2346, +    ["pagedown"]=8671, +    ["pageup"]=8670, +    ["pagujarati"]=2730, +    ["pagurmukhi"]=2602, +    ["pahiragana"]=12401, +    ["paiyannoithai"]=3631, +    ["pakatakana"]=12497, +    ["palatalizationcyrilliccmb"]=1156, +    ["palochkacyrillic"]=1216, +    ["pansioskorean"]=12671, +    ["paragraph"]=182, +    ["parallel"]=8741, +    ["parenleft"]=40, +    ["parenleftaltonearabic"]=64830, +    ["parenleftinferior"]=8333, +    ["parenleftmonospace"]=65288, +    ["parenleftsmall"]=65113, +    ["parenleftsuperior"]=8317, +    ["parenleftvertical"]=65077, +    ["parenright"]=41, +    ["parenrightaltonearabic"]=64831, +    ["parenrightinferior"]=8334, +    ["parenrightmonospace"]=65289, +    ["parenrightsmall"]=65114, +    ["parenrightsuperior"]=8318, +    ["parenrightvertical"]=65078, +    ["partialdiff"]=8706, +    ["paseqhebrew"]=1472, +    ["pashtahebrew"]=1433, +    ["pasquare"]=13225, +    ["patahwidehebrew"]=1463, +    ["pazerhebrew"]=1441, +    ["pbopomofo"]=12550, +    ["pcircle"]=9439, +    ["pdotaccent"]=7767, +    ["pecyrillic"]=1087, +    ["pedageshhebrew"]=64324, +    ["peezisquare"]=13115, +    ["pefinaldageshhebrew"]=64323, +    ["peharabic"]=1662, +    ["peharmenian"]=1402, +    ["pehebrew"]=1508, +    ["pehfinalarabic"]=64343, +    ["pehinitialarabic"]=64344, +    ["pehiragana"]=12410, +    ["pehmedialarabic"]=64345, +    ["pekatakana"]=12506, +    ["pemiddlehookcyrillic"]=1191, +    ["perafehebrew"]=64334, +    ["percent"]=37, +    ["percentarabic"]=1642, +    ["percentmonospace"]=65285, +    ["percentsmall"]=65130, +    ["period"]=46, +    ["periodarmenian"]=1417, +    ["periodcentered"]=183, +    ["periodhalfwidth"]=65377, +    ["periodmonospace"]=65294, +    ["periodsmall"]=65106, +    ["perispomenigreekcmb"]=834, +    ["perpendicular"]=8869, +    ["perthousand"]=8240, +    ["peseta"]=8359, +    ["pfsquare"]=13194, +    ["phabengali"]=2475, +    ["phadeva"]=2347, +    ["phagujarati"]=2731, +    ["phagurmukhi"]=2603, +    ["phi"]=966, +    ["phieuphacirclekorean"]=12922, +    ["phieuphaparenkorean"]=12826, +    ["phieuphcirclekorean"]=12908, +    ["phieuphkorean"]=12621, +    ["phieuphparenkorean"]=12812, +    ["philatin"]=632, +    ["phinthuthai"]=3642, +    ["phisymbolgreek"]=981, +    ["phook"]=421, +    ["phophanthai"]=3614, +    ["phophungthai"]=3612, +    ["phosamphaothai"]=3616, +    ["pi"]=960, +    ["pieupacirclekorean"]=12915, +    ["pieupaparenkorean"]=12819, +    ["pieupcieuckorean"]=12662, +    ["pieupcirclekorean"]=12901, +    ["pieupkiyeokkorean"]=12658, +    ["pieupkorean"]=12610, +    ["pieupparenkorean"]=12805, +    ["pieupsioskiyeokkorean"]=12660, +    ["pieupsioskorean"]=12612, +    ["pieupsiostikeutkorean"]=12661, +    ["pieupthieuthkorean"]=12663, +    ["pieuptikeutkorean"]=12659, +    ["pihiragana"]=12404, +    ["pikatakana"]=12500, +    ["pisymbolgreek"]=982, +    ["piwrarmenian"]=1411, +    ["plus"]=43, +    ["plusbelowcmb"]=799, +    ["pluscircle"]=8853, +    ["plusminus"]=177, +    ["plusmod"]=726, +    ["plusmonospace"]=65291, +    ["plussmall"]=65122, +    ["plussuperior"]=8314, +    ["pmonospace"]=65360, +    ["pmsquare"]=13272, +    ["pohiragana"]=12413, +    ["pointingindexdownwhite"]=9759, +    ["pointingindexleftwhite"]=9756, +    ["pointingindexrightwhite"]=9758, +    ["pointingindexupwhite"]=9757, +    ["pokatakana"]=12509, +    ["poplathai"]=3611, +    ["postalmark"]=12306, +    ["postalmarkface"]=12320, +    ["pparen"]=9387, +    ["precedes"]=8826, +    ["prescription"]=8478, +    ["primemod"]=697, +    ["primereversed"]=8245, +    ["product"]=8719, +    ["projective"]=8965, +    ["prolongedkana"]=12540, +    ["propellor"]=8984, +    ["proportion"]=8759, +    ["proportional"]=8733, +    ["psi"]=968, +    ["psicyrillic"]=1137, +    ["psilipneumatacyrilliccmb"]=1158, +    ["pssquare"]=13232, +    ["puhiragana"]=12407, +    ["pukatakana"]=12503, +    ["pvsquare"]=13236, +    ["pwsquare"]=13242, +    ["q"]=113, +    ["qadeva"]=2392, +    ["qadmahebrew"]=1448, +    ["qafarabic"]=1602, +    ["qaffinalarabic"]=65238, +    ["qafinitialarabic"]=65239, +    ["qafmedialarabic"]=65240, +    ["qamatswidehebrew"]=1464, +    ["qarneyparahebrew"]=1439, +    ["qbopomofo"]=12561, +    ["qcircle"]=9440, +    ["qhook"]=672, +    ["qmonospace"]=65361, +    ["qofdageshhebrew"]=64327, +    ["qoftserehebrew"]=1511, +    ["qparen"]=9388, +    ["quarternote"]=9833, +    ["qubutswidehebrew"]=1467, +    ["question"]=63, +    ["questionarabic"]=1567, +    ["questionarmenian"]=1374, +    ["questiondown"]=191, +    ["questiongreek"]=894, +    ["questionmonospace"]=65311, +    ["quotedbl"]=34, +    ["quotedblbase"]=8222, +    ["quotedblleft"]=8220, +    ["quotedblmonospace"]=65282, +    ["quotedblprime"]=12318, +    ["quotedblprimereversed"]=12317, +    ["quotedblright"]=8221, +    ["quoteleft"]=8216, +    ["quotereversed"]=8219, +    ["quoteright"]=8217, +    ["quoterightn"]=329, +    ["quotesinglbase"]=8218, +    ["quotesingle"]=39, +    ["quotesinglemonospace"]=65287, +    ["r"]=114, +    ["raarmenian"]=1404, +    ["rabengali"]=2480, +    ["racute"]=341, +    ["radeva"]=2352, +    ["radical"]=8730, +    ["radoverssquare"]=13230, +    ["radoverssquaredsquare"]=13231, +    ["radsquare"]=13229, +    ["rafehebrew"]=1471, +    ["ragujarati"]=2736, +    ["ragurmukhi"]=2608, +    ["rahiragana"]=12425, +    ["rakatakana"]=12521, +    ["rakatakanahalfwidth"]=65431, +    ["ralowerdiagonalbengali"]=2545, +    ["ramiddlediagonalbengali"]=2544, +    ["ramshorn"]=612, +    ["ratio"]=8758, +    ["rbopomofo"]=12566, +    ["rcaron"]=345, +    ["rcircle"]=9441, +    ["rcommaaccent"]=343, +    ["rdblgrave"]=529, +    ["rdotaccent"]=7769, +    ["rdotbelow"]=7771, +    ["rdotbelowmacron"]=7773, +    ["referencemark"]=8251, +    ["registered"]=174, +    ["reharmenian"]=1408, +    ["rehfinalarabic"]=65198, +    ["rehiragana"]=12428, +    ["rehyehaleflamarabic"]=1585, +    ["rekatakana"]=12524, +    ["rekatakanahalfwidth"]=65434, +    ["reshdageshhebrew"]=64328, +    ["reshtserehebrew"]=1512, +    ["reversedtilde"]=8765, +    ["reviamugrashhebrew"]=1431, +    ["revlogicalnot"]=8976, +    ["rfishhook"]=638, +    ["rfishhookreversed"]=639, +    ["rhabengali"]=2525, +    ["rhadeva"]=2397, +    ["rho"]=961, +    ["rhook"]=637, +    ["rhookturned"]=635, +    ["rhookturnedsuperior"]=693, +    ["rhosymbolgreek"]=1009, +    ["rhotichookmod"]=734, +    ["rieulacirclekorean"]=12913, +    ["rieulaparenkorean"]=12817, +    ["rieulcirclekorean"]=12899, +    ["rieulhieuhkorean"]=12608, +    ["rieulkiyeokkorean"]=12602, +    ["rieulkiyeoksioskorean"]=12649, +    ["rieulkorean"]=12601, +    ["rieulmieumkorean"]=12603, +    ["rieulpansioskorean"]=12652, +    ["rieulparenkorean"]=12803, +    ["rieulphieuphkorean"]=12607, +    ["rieulpieupkorean"]=12604, +    ["rieulpieupsioskorean"]=12651, +    ["rieulsioskorean"]=12605, +    ["rieulthieuthkorean"]=12606, +    ["rieultikeutkorean"]=12650, +    ["rieulyeorinhieuhkorean"]=12653, +    ["rightangle"]=8735, +    ["righttackbelowcmb"]=793, +    ["righttriangle"]=8895, +    ["rihiragana"]=12426, +    ["rikatakana"]=12522, +    ["rikatakanahalfwidth"]=65432, +    ["ring"]=730, +    ["ringbelowcmb"]=805, +    ["ringcmb"]=778, +    ["ringhalfleft"]=703, +    ["ringhalfleftarmenian"]=1369, +    ["ringhalfleftbelowcmb"]=796, +    ["ringhalfleftcentered"]=723, +    ["ringhalfright"]=702, +    ["ringhalfrightbelowcmb"]=825, +    ["ringhalfrightcentered"]=722, +    ["rinvertedbreve"]=531, +    ["rittorusquare"]=13137, +    ["rlinebelow"]=7775, +    ["rlongleg"]=636, +    ["rlonglegturned"]=634, +    ["rmonospace"]=65362, +    ["rohiragana"]=12429, +    ["rokatakana"]=12525, +    ["rokatakanahalfwidth"]=65435, +    ["roruathai"]=3619, +    ["rparen"]=9389, +    ["rrabengali"]=2524, +    ["rradeva"]=2353, +    ["rragurmukhi"]=2652, +    ["rreharabic"]=1681, +    ["rrehfinalarabic"]=64397, +    ["rrvocalicbengali"]=2528, +    ["rrvocalicdeva"]=2400, +    ["rrvocalicgujarati"]=2784, +    ["rrvocalicvowelsignbengali"]=2500, +    ["rrvocalicvowelsigndeva"]=2372, +    ["rrvocalicvowelsigngujarati"]=2756, +    ["rtblock"]=9616, +    ["rturned"]=633, +    ["rturnedsuperior"]=692, +    ["ruhiragana"]=12427, +    ["rukatakana"]=12523, +    ["rukatakanahalfwidth"]=65433, +    ["rupeemarkbengali"]=2546, +    ["rupeesignbengali"]=2547, +    ["ruthai"]=3620, +    ["rvocalicbengali"]=2443, +    ["rvocalicdeva"]=2315, +    ["rvocalicgujarati"]=2699, +    ["rvocalicvowelsignbengali"]=2499, +    ["rvocalicvowelsigndeva"]=2371, +    ["rvocalicvowelsigngujarati"]=2755, +    ["s"]=115, +    ["sabengali"]=2488, +    ["sacute"]=347, +    ["sacutedotaccent"]=7781, +    ["sadarabic"]=1589, +    ["sadeva"]=2360, +    ["sadfinalarabic"]=65210, +    ["sadinitialarabic"]=65211, +    ["sadmedialarabic"]=65212, +    ["sagujarati"]=2744, +    ["sagurmukhi"]=2616, +    ["sahiragana"]=12373, +    ["sakatakana"]=12469, +    ["sakatakanahalfwidth"]=65403, +    ["sallallahoualayhewasallamarabic"]=65018, +    ["samekhdageshhebrew"]=64321, +    ["samekhhebrew"]=1505, +    ["saraaathai"]=3634, +    ["saraaethai"]=3649, +    ["saraaimaimalaithai"]=3652, +    ["saraaimaimuanthai"]=3651, +    ["saraamthai"]=3635, +    ["saraathai"]=3632, +    ["saraethai"]=3648, +    ["saraiithai"]=3637, +    ["saraithai"]=3636, +    ["saraothai"]=3650, +    ["saraueethai"]=3639, +    ["sarauethai"]=3638, +    ["sarauthai"]=3640, +    ["sarauuthai"]=3641, +    ["sbopomofo"]=12569, +    ["scaron"]=353, +    ["scarondotaccent"]=7783, +    ["scedilla"]=351, +    ["schwa"]=601, +    ["schwacyrillic"]=1241, +    ["schwadieresiscyrillic"]=1243, +    ["schwahook"]=602, +    ["scircle"]=9442, +    ["scircumflex"]=349, +    ["scommaaccent"]=537, +    ["sdotaccent"]=7777, +    ["sdotbelow"]=7779, +    ["sdotbelowdotaccent"]=7785, +    ["seagullbelowcmb"]=828, +    ["second"]=8243, +    ["secondtonechinese"]=714, +    ["section"]=167, +    ["seenarabic"]=1587, +    ["seenfinalarabic"]=65202, +    ["seeninitialarabic"]=65203, +    ["seenmedialarabic"]=65204, +    ["segoltahebrew"]=1426, +    ["segolwidehebrew"]=1462, +    ["seharmenian"]=1405, +    ["sehiragana"]=12379, +    ["sekatakana"]=12475, +    ["sekatakanahalfwidth"]=65406, +    ["semicolon"]=59, +    ["semicolonarabic"]=1563, +    ["semicolonmonospace"]=65307, +    ["semicolonsmall"]=65108, +    ["semivoicedmarkkana"]=12444, +    ["semivoicedmarkkanahalfwidth"]=65439, +    ["sentisquare"]=13090, +    ["sentosquare"]=13091, +    ["seven"]=55, +    ["sevenbengali"]=2541, +    ["sevencircle"]=9318, +    ["sevencircleinversesansserif"]=10128, +    ["sevendeva"]=2413, +    ["seveneighths"]=8542, +    ["sevengujarati"]=2797, +    ["sevengurmukhi"]=2669, +    ["sevenhackarabic"]=1639, +    ["sevenhangzhou"]=12327, +    ["sevenideographicparen"]=12838, +    ["seveninferior"]=8327, +    ["sevenmonospace"]=65303, +    ["sevenparen"]=9338, +    ["sevenperiod"]=9358, +    ["sevenpersian"]=1783, +    ["sevenroman"]=8566, +    ["sevensuperior"]=8311, +    ["seventeencircle"]=9328, +    ["seventeenparen"]=9348, +    ["seventeenperiod"]=9368, +    ["seventhai"]=3671, +    ["shaarmenian"]=1399, +    ["shabengali"]=2486, +    ["shacyrillic"]=1096, +    ["shaddadammaarabic"]=64609, +    ["shaddadammatanarabic"]=64606, +    ["shaddafathaarabic"]=64608, +    ["shaddafathatanarabic"]=1617, +    ["shaddakasraarabic"]=64610, +    ["shaddakasratanarabic"]=64607, +    ["shadedark"]=9619, +    ["shadelight"]=9617, +    ["shademedium"]=9618, +    ["shadeva"]=2358, +    ["shagujarati"]=2742, +    ["shagurmukhi"]=2614, +    ["shalshelethebrew"]=1427, +    ["shbopomofo"]=12565, +    ["shchacyrillic"]=1097, +    ["sheenarabic"]=1588, +    ["sheenfinalarabic"]=65206, +    ["sheeninitialarabic"]=65207, +    ["sheenmedialarabic"]=65208, +    ["sheicoptic"]=995, +    ["sheqelhebrew"]=8362, +    ["shevawidehebrew"]=1456, +    ["shhacyrillic"]=1211, +    ["shimacoptic"]=1005, +    ["shindageshhebrew"]=64329, +    ["shindageshshindothebrew"]=64300, +    ["shindageshsindothebrew"]=64301, +    ["shindothebrew"]=1473, +    ["shinhebrew"]=1513, +    ["shinshindothebrew"]=64298, +    ["shinsindothebrew"]=64299, +    ["shook"]=642, +    ["sigma"]=963, +    ["sigmafinal"]=962, +    ["sigmalunatesymbolgreek"]=1010, +    ["sihiragana"]=12375, +    ["sikatakana"]=12471, +    ["sikatakanahalfwidth"]=65404, +    ["siluqlefthebrew"]=1469, +    ["sindothebrew"]=1474, +    ["siosacirclekorean"]=12916, +    ["siosaparenkorean"]=12820, +    ["sioscieuckorean"]=12670, +    ["sioscirclekorean"]=12902, +    ["sioskiyeokkorean"]=12666, +    ["sioskorean"]=12613, +    ["siosnieunkorean"]=12667, +    ["siosparenkorean"]=12806, +    ["siospieupkorean"]=12669, +    ["siostikeutkorean"]=12668, +    ["six"]=54, +    ["sixbengali"]=2540, +    ["sixcircle"]=9317, +    ["sixcircleinversesansserif"]=10127, +    ["sixdeva"]=2412, +    ["sixgujarati"]=2796, +    ["sixgurmukhi"]=2668, +    ["sixhackarabic"]=1638, +    ["sixhangzhou"]=12326, +    ["sixideographicparen"]=12837, +    ["sixinferior"]=8326, +    ["sixmonospace"]=65302, +    ["sixparen"]=9337, +    ["sixperiod"]=9357, +    ["sixpersian"]=1782, +    ["sixroman"]=8565, +    ["sixsuperior"]=8310, +    ["sixteencircle"]=9327, +    ["sixteencurrencydenominatorbengali"]=2553, +    ["sixteenparen"]=9347, +    ["sixteenperiod"]=9367, +    ["sixthai"]=3670, +    ["slash"]=47, +    ["slashmonospace"]=65295, +    ["slong"]=383, +    ["slongdotaccent"]=7835, +    ["smonospace"]=65363, +    ["sofpasuqhebrew"]=1475, +    ["softhyphen"]=173, +    ["softsigncyrillic"]=1100, +    ["sohiragana"]=12381, +    ["sokatakana"]=12477, +    ["sokatakanahalfwidth"]=65407, +    ["soliduslongoverlaycmb"]=824, +    ["solidusshortoverlaycmb"]=823, +    ["sorusithai"]=3625, +    ["sosalathai"]=3624, +    ["sosothai"]=3595, +    ["sosuathai"]=3626, +    ["space"]=32, +    ["spadesuitblack"]=9824, +    ["spadesuitwhite"]=9828, +    ["sparen"]=9390, +    ["squarebelowcmb"]=827, +    ["squarecc"]=13252, +    ["squarecm"]=13213, +    ["squarediagonalcrosshatchfill"]=9641, +    ["squarehorizontalfill"]=9636, +    ["squarekg"]=13199, +    ["squarekm"]=13214, +    ["squarekmcapital"]=13262, +    ["squareln"]=13265, +    ["squarelog"]=13266, +    ["squaremg"]=13198, +    ["squaremil"]=13269, +    ["squaremm"]=13212, +    ["squaremsquared"]=13217, +    ["squareorthogonalcrosshatchfill"]=9638, +    ["squareupperlefttolowerrightfill"]=9639, +    ["squareupperrighttolowerleftfill"]=9640, +    ["squareverticalfill"]=9637, +    ["squarewhitewithsmallblack"]=9635, +    ["srsquare"]=13275, +    ["ssabengali"]=2487, +    ["ssadeva"]=2359, +    ["ssagujarati"]=2743, +    ["ssangcieuckorean"]=12617, +    ["ssanghieuhkorean"]=12677, +    ["ssangieungkorean"]=12672, +    ["ssangkiyeokkorean"]=12594, +    ["ssangnieunkorean"]=12645, +    ["ssangpieupkorean"]=12611, +    ["ssangsioskorean"]=12614, +    ["ssangtikeutkorean"]=12600, +    ["sterling"]=163, +    ["sterlingmonospace"]=65505, +    ["strokelongoverlaycmb"]=822, +    ["strokeshortoverlaycmb"]=821, +    ["subset"]=8834, +    ["subsetnotequal"]=8842, +    ["subsetorequal"]=8838, +    ["succeeds"]=8827, +    ["suchthat"]=8715, +    ["suhiragana"]=12377, +    ["sukatakana"]=12473, +    ["sukatakanahalfwidth"]=65405, +    ["sukunarabic"]=1618, +    ["summation"]=8721, +    ["sun"]=9788, +    ["superset"]=8835, +    ["supersetnotequal"]=8843, +    ["supersetorequal"]=8839, +    ["svsquare"]=13276, +    ["syouwaerasquare"]=13180, +    ["t"]=116, +    ["tabengali"]=2468, +    ["tackdown"]=8868, +    ["tackleft"]=8867, +    ["tadeva"]=2340, +    ["tagujarati"]=2724, +    ["tagurmukhi"]=2596, +    ["taharabic"]=1591, +    ["tahfinalarabic"]=65218, +    ["tahinitialarabic"]=65219, +    ["tahiragana"]=12383, +    ["tahmedialarabic"]=65220, +    ["taisyouerasquare"]=13181, +    ["takatakana"]=12479, +    ["takatakanahalfwidth"]=65408, +    ["tatweelarabic"]=1600, +    ["tau"]=964, +    ["tavdageshhebrew"]=64330, +    ["tavhebrew"]=1514, +    ["tbar"]=359, +    ["tbopomofo"]=12554, +    ["tcaron"]=357, +    ["tccurl"]=680, +    ["tcheharabic"]=1670, +    ["tchehfinalarabic"]=64379, +    ["tchehmedialarabic"]=64381, +    ["tchehmeeminitialarabic"]=64380, +    ["tcircle"]=9443, +    ["tcircumflexbelow"]=7793, +    ["tcommaaccent"]=355, +    ["tdieresis"]=7831, +    ["tdotaccent"]=7787, +    ["tdotbelow"]=7789, +    ["tecyrillic"]=1090, +    ["tedescendercyrillic"]=1197, +    ["teharabic"]=1578, +    ["tehfinalarabic"]=65174, +    ["tehhahinitialarabic"]=64674, +    ["tehhahisolatedarabic"]=64524, +    ["tehinitialarabic"]=65175, +    ["tehiragana"]=12390, +    ["tehjeeminitialarabic"]=64673, +    ["tehjeemisolatedarabic"]=64523, +    ["tehmarbutaarabic"]=1577, +    ["tehmarbutafinalarabic"]=65172, +    ["tehmedialarabic"]=65176, +    ["tehmeeminitialarabic"]=64676, +    ["tehmeemisolatedarabic"]=64526, +    ["tehnoonfinalarabic"]=64627, +    ["tekatakana"]=12486, +    ["tekatakanahalfwidth"]=65411, +    ["telephone"]=8481, +    ["telephoneblack"]=9742, +    ["telishagedolahebrew"]=1440, +    ["telishaqetanahebrew"]=1449, +    ["tencircle"]=9321, +    ["tenideographicparen"]=12841, +    ["tenparen"]=9341, +    ["tenperiod"]=9361, +    ["tenroman"]=8569, +    ["tesh"]=679, +    ["tetdageshhebrew"]=64312, +    ["tethebrew"]=1496, +    ["tetsecyrillic"]=1205, +    ["tevirlefthebrew"]=1435, +    ["thabengali"]=2469, +    ["thadeva"]=2341, +    ["thagujarati"]=2725, +    ["thagurmukhi"]=2597, +    ["thalarabic"]=1584, +    ["thalfinalarabic"]=65196, +    ["thanthakhatthai"]=3660, +    ["theharabic"]=1579, +    ["thehfinalarabic"]=65178, +    ["thehinitialarabic"]=65179, +    ["thehmedialarabic"]=65180, +    ["thereexists"]=8707, +    ["therefore"]=8756, +    ["theta"]=952, +    ["thetasymbolgreek"]=977, +    ["thieuthacirclekorean"]=12921, +    ["thieuthaparenkorean"]=12825, +    ["thieuthcirclekorean"]=12907, +    ["thieuthkorean"]=12620, +    ["thieuthparenkorean"]=12811, +    ["thirteencircle"]=9324, +    ["thirteenparen"]=9344, +    ["thirteenperiod"]=9364, +    ["thonangmonthothai"]=3601, +    ["thook"]=429, +    ["thophuthaothai"]=3602, +    ["thorn"]=254, +    ["thothahanthai"]=3607, +    ["thothanthai"]=3600, +    ["thothongthai"]=3608, +    ["thothungthai"]=3606, +    ["thousandcyrillic"]=1154, +    ["thousandsseparatorpersian"]=1644, +    ["three"]=51, +    ["threebengali"]=2537, +    ["threecircle"]=9314, +    ["threecircleinversesansserif"]=10124, +    ["threedeva"]=2409, +    ["threeeighths"]=8540, +    ["threegujarati"]=2793, +    ["threegurmukhi"]=2665, +    ["threehackarabic"]=1635, +    ["threehangzhou"]=12323, +    ["threeideographicparen"]=12834, +    ["threeinferior"]=8323, +    ["threemonospace"]=65299, +    ["threenumeratorbengali"]=2550, +    ["threeparen"]=9334, +    ["threeperiod"]=9354, +    ["threepersian"]=1779, +    ["threequarters"]=190, +    ["threeroman"]=8562, +    ["threesuperior"]=179, +    ["threethai"]=3667, +    ["thzsquare"]=13204, +    ["tihiragana"]=12385, +    ["tikatakana"]=12481, +    ["tikatakanahalfwidth"]=65409, +    ["tikeutacirclekorean"]=12912, +    ["tikeutaparenkorean"]=12816, +    ["tikeutcirclekorean"]=12898, +    ["tikeutkorean"]=12599, +    ["tikeutparenkorean"]=12802, +    ["tilde"]=732, +    ["tildebelowcmb"]=816, +    ["tildecomb"]=771, +    ["tildedoublecmb"]=864, +    ["tildeoperator"]=8764, +    ["tildeoverlaycmb"]=820, +    ["tildeverticalcmb"]=830, +    ["timescircle"]=8855, +    ["tipehalefthebrew"]=1430, +    ["tippigurmukhi"]=2672, +    ["titlocyrilliccmb"]=1155, +    ["tiwnarmenian"]=1407, +    ["tlinebelow"]=7791, +    ["tmonospace"]=65364, +    ["toarmenian"]=1385, +    ["tohiragana"]=12392, +    ["tokatakana"]=12488, +    ["tokatakanahalfwidth"]=65412, +    ["tonebarextrahighmod"]=741, +    ["tonebarextralowmod"]=745, +    ["tonebarhighmod"]=742, +    ["tonebarlowmod"]=744, +    ["tonebarmidmod"]=743, +    ["tonefive"]=445, +    ["tonesix"]=389, +    ["tonetwo"]=424, +    ["tonos"]=900, +    ["tonsquare"]=13095, +    ["topatakthai"]=3599, +    ["tortoiseshellbracketleft"]=12308, +    ["tortoiseshellbracketleftsmall"]=65117, +    ["tortoiseshellbracketleftvertical"]=65081, +    ["tortoiseshellbracketright"]=12309, +    ["tortoiseshellbracketrightsmall"]=65118, +    ["tortoiseshellbracketrightvertical"]=65082, +    ["totaothai"]=3605, +    ["tpalatalhook"]=427, +    ["tparen"]=9391, +    ["trademark"]=8482, +    ["tretroflexhook"]=648, +    ["triagdn"]=9660, +    ["triaglf"]=9668, +    ["triagrt"]=9658, +    ["triagup"]=9650, +    ["ts"]=678, +    ["tsadidageshhebrew"]=64326, +    ["tsadihebrew"]=1510, +    ["tsecyrillic"]=1094, +    ["tserewidehebrew"]=1461, +    ["tshecyrillic"]=1115, +    ["ttabengali"]=2463, +    ["ttadeva"]=2335, +    ["ttagujarati"]=2719, +    ["ttagurmukhi"]=2591, +    ["tteharabic"]=1657, +    ["ttehfinalarabic"]=64359, +    ["ttehinitialarabic"]=64360, +    ["ttehmedialarabic"]=64361, +    ["tthabengali"]=2464, +    ["tthadeva"]=2336, +    ["tthagujarati"]=2720, +    ["tthagurmukhi"]=2592, +    ["tturned"]=647, +    ["tuhiragana"]=12388, +    ["tukatakana"]=12484, +    ["tukatakanahalfwidth"]=65410, +    ["tusmallhiragana"]=12387, +    ["tusmallkatakana"]=12483, +    ["tusmallkatakanahalfwidth"]=65391, +    ["twelvecircle"]=9323, +    ["twelveparen"]=9343, +    ["twelveperiod"]=9363, +    ["twelveroman"]=8571, +    ["twentycircle"]=9331, +    ["twentyparen"]=9351, +    ["twentyperiod"]=9371, +    ["two"]=50, +    ["twobengali"]=2536, +    ["twocircle"]=9313, +    ["twocircleinversesansserif"]=10123, +    ["twodeva"]=2408, +    ["twodotleader"]=8229, +    ["twodotleadervertical"]=65072, +    ["twogujarati"]=2792, +    ["twogurmukhi"]=2664, +    ["twohackarabic"]=1634, +    ["twohangzhou"]=12322, +    ["twoideographicparen"]=12833, +    ["twoinferior"]=8322, +    ["twomonospace"]=65298, +    ["twonumeratorbengali"]=2549, +    ["twoparen"]=9333, +    ["twoperiod"]=9353, +    ["twopersian"]=1778, +    ["tworoman"]=8561, +    ["twostroke"]=443, +    ["twosuperior"]=178, +    ["twothai"]=3666, +    ["twothirds"]=8532, +    ["u"]=117, +    ["uacute"]=250, +    ["ubar"]=649, +    ["ubengali"]=2441, +    ["ubopomofo"]=12584, +    ["ubreve"]=365, +    ["ucaron"]=468, +    ["ucircle"]=9444, +    ["ucircumflex"]=251, +    ["ucircumflexbelow"]=7799, +    ["ucyrillic"]=1091, +    ["udattadeva"]=2385, +    ["udblgrave"]=533, +    ["udeva"]=2313, +    ["udieresis"]=252, +    ["udieresisacute"]=472, +    ["udieresisbelow"]=7795, +    ["udieresiscaron"]=474, +    ["udieresiscyrillic"]=1265, +    ["udieresisgrave"]=476, +    ["udieresismacron"]=470, +    ["udotbelow"]=7909, +    ["ugrave"]=249, +    ["ugujarati"]=2697, +    ["ugurmukhi"]=2569, +    ["uhiragana"]=12358, +    ["uhookabove"]=7911, +    ["uhorn"]=432, +    ["uhornacute"]=7913, +    ["uhorndotbelow"]=7921, +    ["uhorngrave"]=7915, +    ["uhornhookabove"]=7917, +    ["uhorntilde"]=7919, +    ["uhungarumlaut"]=369, +    ["uhungarumlautcyrillic"]=1267, +    ["uinvertedbreve"]=535, +    ["ukatakana"]=12454, +    ["ukatakanahalfwidth"]=65395, +    ["ukcyrillic"]=1145, +    ["ukorean"]=12636, +    ["umacron"]=363, +    ["umacroncyrillic"]=1263, +    ["umacrondieresis"]=7803, +    ["umatragurmukhi"]=2625, +    ["umonospace"]=65365, +    ["underscore"]=95, +    ["underscoredbl"]=8215, +    ["underscoremonospace"]=65343, +    ["underscorevertical"]=65075, +    ["underscorewavy"]=65103, +    ["union"]=8746, +    ["universal"]=8704, +    ["uogonek"]=371, +    ["uparen"]=9392, +    ["upblock"]=9600, +    ["upperdothebrew"]=1476, +    ["upsilon"]=965, +    ["upsilondieresis"]=971, +    ["upsilondieresistonos"]=944, +    ["upsilonlatin"]=650, +    ["upsilontonos"]=973, +    ["uptackbelowcmb"]=797, +    ["uptackmod"]=724, +    ["uragurmukhi"]=2675, +    ["uring"]=367, +    ["ushortcyrillic"]=1118, +    ["usmallhiragana"]=12357, +    ["usmallkatakana"]=12453, +    ["usmallkatakanahalfwidth"]=65385, +    ["ustraightcyrillic"]=1199, +    ["ustraightstrokecyrillic"]=1201, +    ["utilde"]=361, +    ["utildeacute"]=7801, +    ["utildebelow"]=7797, +    ["uubengali"]=2442, +    ["uudeva"]=2314, +    ["uugujarati"]=2698, +    ["uugurmukhi"]=2570, +    ["uumatragurmukhi"]=2626, +    ["uuvowelsignbengali"]=2498, +    ["uuvowelsigndeva"]=2370, +    ["uuvowelsigngujarati"]=2754, +    ["uvowelsignbengali"]=2497, +    ["uvowelsigndeva"]=2369, +    ["uvowelsigngujarati"]=2753, +    ["v"]=118, +    ["vadeva"]=2357, +    ["vagujarati"]=2741, +    ["vagurmukhi"]=2613, +    ["vakatakana"]=12535, +    ["vavdageshhebrew"]=64309, +    ["vavhebrew"]=1493, +    ["vavholamhebrew"]=64331, +    ["vavvavhebrew"]=1520, +    ["vavyodhebrew"]=1521, +    ["vcircle"]=9445, +    ["vdotbelow"]=7807, +    ["vecyrillic"]=1074, +    ["veharabic"]=1700, +    ["vehfinalarabic"]=64363, +    ["vehinitialarabic"]=64364, +    ["vehmedialarabic"]=64365, +    ["vekatakana"]=12537, +    ["venus"]=9792, +    ["verticalbar"]=124, +    ["verticallineabovecmb"]=781, +    ["verticallinebelowcmb"]=809, +    ["verticallinelowmod"]=716, +    ["verticallinemod"]=712, +    ["vewarmenian"]=1406, +    ["vhook"]=651, +    ["vikatakana"]=12536, +    ["viramabengali"]=2509, +    ["viramadeva"]=2381, +    ["viramagujarati"]=2765, +    ["visargabengali"]=2435, +    ["visargadeva"]=2307, +    ["visargagujarati"]=2691, +    ["vmonospace"]=65366, +    ["voarmenian"]=1400, +    ["voicediterationhiragana"]=12446, +    ["voicediterationkatakana"]=12542, +    ["voicedmarkkana"]=12443, +    ["voicedmarkkanahalfwidth"]=65438, +    ["vokatakana"]=12538, +    ["vparen"]=9393, +    ["vtilde"]=7805, +    ["vturned"]=652, +    ["vuhiragana"]=12436, +    ["vukatakana"]=12532, +    ["w"]=119, +    ["wacute"]=7811, +    ["waekorean"]=12633, +    ["wahiragana"]=12431, +    ["wakatakana"]=12527, +    ["wakatakanahalfwidth"]=65436, +    ["wakorean"]=12632, +    ["wasmallhiragana"]=12430, +    ["wasmallkatakana"]=12526, +    ["wattosquare"]=13143, +    ["wavedash"]=12316, +    ["wavyunderscorevertical"]=65076, +    ["wawarabic"]=1608, +    ["wawfinalarabic"]=65262, +    ["wawhamzaabovearabic"]=1572, +    ["wawhamzaabovefinalarabic"]=65158, +    ["wbsquare"]=13277, +    ["wcircle"]=9446, +    ["wcircumflex"]=373, +    ["wdieresis"]=7813, +    ["wdotaccent"]=7815, +    ["wdotbelow"]=7817, +    ["wehiragana"]=12433, +    ["weierstrass"]=8472, +    ["wekatakana"]=12529, +    ["wekorean"]=12638, +    ["weokorean"]=12637, +    ["wgrave"]=7809, +    ["whitebullet"]=9702, +    ["whitecircle"]=9675, +    ["whitecircleinverse"]=9689, +    ["whitecornerbracketleft"]=12302, +    ["whitecornerbracketleftvertical"]=65091, +    ["whitecornerbracketright"]=12303, +    ["whitecornerbracketrightvertical"]=65092, +    ["whitediamond"]=9671, +    ["whitediamondcontainingblacksmalldiamond"]=9672, +    ["whitedownpointingsmalltriangle"]=9663, +    ["whitedownpointingtriangle"]=9661, +    ["whiteleftpointingsmalltriangle"]=9667, +    ["whiteleftpointingtriangle"]=9665, +    ["whitelenticularbracketleft"]=12310, +    ["whitelenticularbracketright"]=12311, +    ["whiterightpointingsmalltriangle"]=9657, +    ["whiterightpointingtriangle"]=9655, +    ["whitesmallsquare"]=9643, +    ["whitesmilingface"]=9786, +    ["whitesquare"]=9633, +    ["whitestar"]=9734, +    ["whitetelephone"]=9743, +    ["whitetortoiseshellbracketleft"]=12312, +    ["whitetortoiseshellbracketright"]=12313, +    ["whiteuppointingsmalltriangle"]=9653, +    ["whiteuppointingtriangle"]=9651, +    ["wihiragana"]=12432, +    ["wikatakana"]=12528, +    ["wikorean"]=12639, +    ["wmonospace"]=65367, +    ["wohiragana"]=12434, +    ["wokatakana"]=12530, +    ["wokatakanahalfwidth"]=65382, +    ["won"]=8361, +    ["wonmonospace"]=65510, +    ["wowaenthai"]=3623, +    ["wparen"]=9394, +    ["wring"]=7832, +    ["wsuperior"]=695, +    ["wturned"]=653, +    ["wynn"]=447, +    ["x"]=120, +    ["xabovecmb"]=829, +    ["xbopomofo"]=12562, +    ["xcircle"]=9447, +    ["xdieresis"]=7821, +    ["xdotaccent"]=7819, +    ["xeharmenian"]=1389, +    ["xi"]=958, +    ["xmonospace"]=65368, +    ["xparen"]=9395, +    ["xsuperior"]=739, +    ["y"]=121, +    ["yaadosquare"]=13134, +    ["yabengali"]=2479, +    ["yacute"]=253, +    ["yadeva"]=2351, +    ["yaekorean"]=12626, +    ["yagujarati"]=2735, +    ["yagurmukhi"]=2607, +    ["yahiragana"]=12420, +    ["yakatakana"]=12516, +    ["yakatakanahalfwidth"]=65428, +    ["yakorean"]=12625, +    ["yamakkanthai"]=3662, +    ["yasmallhiragana"]=12419, +    ["yasmallkatakana"]=12515, +    ["yasmallkatakanahalfwidth"]=65388, +    ["yatcyrillic"]=1123, +    ["ycircle"]=9448, +    ["ycircumflex"]=375, +    ["ydieresis"]=255, +    ["ydotaccent"]=7823, +    ["ydotbelow"]=7925, +    ["yeharabic"]=1610, +    ["yehbarreearabic"]=1746, +    ["yehbarreefinalarabic"]=64431, +    ["yehfinalarabic"]=65266, +    ["yehhamzaabovearabic"]=1574, +    ["yehhamzaabovefinalarabic"]=65162, +    ["yehhamzaaboveinitialarabic"]=65163, +    ["yehhamzaabovemedialarabic"]=65164, +    ["yehinitialarabic"]=65267, +    ["yehmedialarabic"]=65268, +    ["yehmeeminitialarabic"]=64733, +    ["yehmeemisolatedarabic"]=64600, +    ["yehnoonfinalarabic"]=64660, +    ["yehthreedotsbelowarabic"]=1745, +    ["yekorean"]=12630, +    ["yen"]=165, +    ["yenmonospace"]=65509, +    ["yeokorean"]=12629, +    ["yeorinhieuhkorean"]=12678, +    ["yerahbenyomolefthebrew"]=1450, +    ["yericyrillic"]=1099, +    ["yerudieresiscyrillic"]=1273, +    ["yesieungkorean"]=12673, +    ["yesieungpansioskorean"]=12675, +    ["yesieungsioskorean"]=12674, +    ["yetivhebrew"]=1434, +    ["ygrave"]=7923, +    ["yhook"]=436, +    ["yhookabove"]=7927, +    ["yiarmenian"]=1397, +    ["yicyrillic"]=1111, +    ["yikorean"]=12642, +    ["yinyang"]=9775, +    ["yiwnarmenian"]=1410, +    ["ymonospace"]=65369, +    ["yoddageshhebrew"]=64313, +    ["yodhebrew"]=1497, +    ["yodyodhebrew"]=1522, +    ["yodyodpatahhebrew"]=64287, +    ["yohiragana"]=12424, +    ["yoikorean"]=12681, +    ["yokatakana"]=12520, +    ["yokatakanahalfwidth"]=65430, +    ["yokorean"]=12635, +    ["yosmallhiragana"]=12423, +    ["yosmallkatakana"]=12519, +    ["yosmallkatakanahalfwidth"]=65390, +    ["yotgreek"]=1011, +    ["yoyaekorean"]=12680, +    ["yoyakorean"]=12679, +    ["yoyakthai"]=3618, +    ["yoyingthai"]=3597, +    ["yparen"]=9396, +    ["ypogegrammeni"]=890, +    ["ypogegrammenigreekcmb"]=837, +    ["yr"]=422, +    ["yring"]=7833, +    ["ysuperior"]=696, +    ["ytilde"]=7929, +    ["yturned"]=654, +    ["yuhiragana"]=12422, +    ["yuikorean"]=12684, +    ["yukatakana"]=12518, +    ["yukatakanahalfwidth"]=65429, +    ["yukorean"]=12640, +    ["yusbigcyrillic"]=1131, +    ["yusbigiotifiedcyrillic"]=1133, +    ["yuslittlecyrillic"]=1127, +    ["yuslittleiotifiedcyrillic"]=1129, +    ["yusmallhiragana"]=12421, +    ["yusmallkatakana"]=12517, +    ["yusmallkatakanahalfwidth"]=65389, +    ["yuyekorean"]=12683, +    ["yuyeokorean"]=12682, +    ["yyabengali"]=2527, +    ["yyadeva"]=2399, +    ["z"]=122, +    ["zaarmenian"]=1382, +    ["zacute"]=378, +    ["zadeva"]=2395, +    ["zagurmukhi"]=2651, +    ["zaharabic"]=1592, +    ["zahfinalarabic"]=65222, +    ["zahinitialarabic"]=65223, +    ["zahiragana"]=12374, +    ["zahmedialarabic"]=65224, +    ["zainarabic"]=1586, +    ["zainfinalarabic"]=65200, +    ["zakatakana"]=12470, +    ["zaqefgadolhebrew"]=1429, +    ["zaqefqatanhebrew"]=1428, +    ["zarqahebrew"]=1432, +    ["zayindageshhebrew"]=64310, +    ["zayinhebrew"]=1494, +    ["zbopomofo"]=12567, +    ["zcaron"]=382, +    ["zcircle"]=9449, +    ["zcircumflex"]=7825, +    ["zcurl"]=657, +    ["zdotaccent"]=380, +    ["zdotbelow"]=7827, +    ["zecyrillic"]=1079, +    ["zedescendercyrillic"]=1177, +    ["zedieresiscyrillic"]=1247, +    ["zehiragana"]=12380, +    ["zekatakana"]=12476, +    ["zero"]=48, +    ["zerobengali"]=2534, +    ["zerodeva"]=2406, +    ["zerogujarati"]=2790, +    ["zerogurmukhi"]=2662, +    ["zerohackarabic"]=1632, +    ["zeroinferior"]=8320, +    ["zeromonospace"]=65296, +    ["zeropersian"]=1776, +    ["zerosuperior"]=8304, +    ["zerothai"]=3664, +    ["zerowidthjoiner"]=65279, +    ["zerowidthnonjoiner"]=8204, +    ["zerowidthspace"]=8203, +    ["zeta"]=950, +    ["zhbopomofo"]=12563, +    ["zhearmenian"]=1386, +    ["zhebrevecyrillic"]=1218, +    ["zhecyrillic"]=1078, +    ["zhedescendercyrillic"]=1175, +    ["zhedieresiscyrillic"]=1245, +    ["zihiragana"]=12376, +    ["zikatakana"]=12472, +    ["zinorhebrew"]=1454, +    ["zlinebelow"]=7829, +    ["zmonospace"]=65370, +    ["zohiragana"]=12382, +    ["zokatakana"]=12478, +    ["zparen"]=9397, +    ["zretroflexhook"]=656, +    ["zstroke"]=438, +    ["zuhiragana"]=12378, +    ["zukatakana"]=12474, + +    -- extras + +    ["Dcroat"]=272, +    ["Delta"]=8710, +    ["Euro"]=8364, +    ["H18533"]=9679, +    ["H18543"]=9642, +    ["H18551"]=9643, +    ["H22073"]=9633, +    ["Ldot"]=319, +    ["Oslashacute"]=510, +    ["SF10000"]=9484, +    ["SF20000"]=9492, +    ["SF30000"]=9488, +    ["SF40000"]=9496, +    ["SF50000"]=9532, +    ["SF60000"]=9516, +    ["SF70000"]=9524, +    ["SF80000"]=9500, +    ["SF90000"]=9508, +    ["Upsilon1"]=978, +    ["afii10066"]=1073, +    ["afii10067"]=1074, +    ["afii10068"]=1075, +    ["afii10069"]=1076, +    ["afii10070"]=1077, +    ["afii10071"]=1105, +    ["afii10072"]=1078, +    ["afii10073"]=1079, +    ["afii10074"]=1080, +    ["afii10075"]=1081, +    ["afii10076"]=1082, +    ["afii10077"]=1083, +    ["afii10078"]=1084, +    ["afii10079"]=1085, +    ["afii10080"]=1086, +    ["afii10081"]=1087, +    ["afii10082"]=1088, +    ["afii10083"]=1089, +    ["afii10084"]=1090, +    ["afii10085"]=1091, +    ["afii10086"]=1092, +    ["afii10087"]=1093, +    ["afii10088"]=1094, +    ["afii10089"]=1095, +    ["afii10090"]=1096, +    ["afii10091"]=1097, +    ["afii10092"]=1098, +    ["afii10093"]=1099, +    ["afii10094"]=1100, +    ["afii10095"]=1101, +    ["afii10096"]=1102, +    ["afii10097"]=1103, +    ["afii10098"]=1169, +    ["afii10099"]=1106, +    ["afii10100"]=1107, +    ["afii10101"]=1108, +    ["afii10102"]=1109, +    ["afii10103"]=1110, +    ["afii10104"]=1111, +    ["afii10105"]=1112, +    ["afii10106"]=1113, +    ["afii10107"]=1114, +    ["afii10108"]=1115, +    ["afii10109"]=1116, +    ["afii10110"]=1118, +    ["afii10193"]=1119, +    ["afii10194"]=1123, +    ["afii10195"]=1139, +    ["afii10196"]=1141, +    ["afii10846"]=1241, +    ["afii208"]=8213, +    ["afii57381"]=1642, +    ["afii57388"]=1548, +    ["afii57392"]=1632, +    ["afii57393"]=1633, +    ["afii57394"]=1634, +    ["afii57395"]=1635, +    ["afii57396"]=1636, +    ["afii57397"]=1637, +    ["afii57398"]=1638, +    ["afii57399"]=1639, +    ["afii57400"]=1640, +    ["afii57401"]=1641, +    ["afii57403"]=1563, +    ["afii57407"]=1567, +    ["afii57409"]=1569, +    ["afii57410"]=1570, +    ["afii57411"]=1571, +    ["afii57412"]=1572, +    ["afii57413"]=1573, +    ["afii57414"]=1574, +    ["afii57415"]=1575, +    ["afii57416"]=1576, +    ["afii57417"]=1577, +    ["afii57418"]=1578, +    ["afii57419"]=1579, +    ["afii57420"]=1580, +    ["afii57421"]=1581, +    ["afii57422"]=1582, +    ["afii57423"]=1583, +    ["afii57424"]=1584, +    ["afii57425"]=1585, +    ["afii57426"]=1586, +    ["afii57427"]=1587, +    ["afii57428"]=1588, +    ["afii57429"]=1589, +    ["afii57430"]=1590, +    ["afii57431"]=1591, +    ["afii57432"]=1592, +    ["afii57433"]=1593, +    ["afii57434"]=1594, +    ["afii57440"]=1600, +    ["afii57441"]=1601, +    ["afii57442"]=1602, +    ["afii57443"]=1603, +    ["afii57444"]=1604, +    ["afii57445"]=1605, +    ["afii57446"]=1606, +    ["afii57448"]=1608, +    ["afii57449"]=1609, +    ["afii57450"]=1610, +    ["afii57451"]=1611, +    ["afii57452"]=1612, +    ["afii57453"]=1613, +    ["afii57454"]=1614, +    ["afii57455"]=1615, +    ["afii57456"]=1616, +    ["afii57457"]=1617, +    ["afii57458"]=1618, +    ["afii57470"]=1607, +    ["afii57505"]=1700, +    ["afii57506"]=1662, +    ["afii57507"]=1670, +    ["afii57508"]=1688, +    ["afii57509"]=1711, +    ["afii57511"]=1657, +    ["afii57512"]=1672, +    ["afii57513"]=1681, +    ["afii57514"]=1722, +    ["afii57519"]=1746, +    ["afii57636"]=8362, +    ["afii57645"]=1470, +    ["afii57658"]=1475, +    ["afii57664"]=1488, +    ["afii57665"]=1489, +    ["afii57666"]=1490, +    ["afii57667"]=1491, +    ["afii57668"]=1492, +    ["afii57669"]=1493, +    ["afii57670"]=1494, +    ["afii57671"]=1495, +    ["afii57672"]=1496, +    ["afii57673"]=1497, +    ["afii57674"]=1498, +    ["afii57675"]=1499, +    ["afii57676"]=1500, +    ["afii57677"]=1501, +    ["afii57678"]=1502, +    ["afii57679"]=1503, +    ["afii57680"]=1504, +    ["afii57681"]=1505, +    ["afii57682"]=1506, +    ["afii57683"]=1507, +    ["afii57684"]=1508, +    ["afii57685"]=1509, +    ["afii57686"]=1510, +    ["afii57687"]=1511, +    ["afii57688"]=1512, +    ["afii57689"]=1513, +    ["afii57690"]=1514, +    ["afii57716"]=1520, +    ["afii57717"]=1521, +    ["afii57718"]=1522, +    ["afii57793"]=1460, +    ["afii57794"]=1461, +    ["afii57795"]=1462, +    ["afii57796"]=1467, +    ["afii57797"]=1464, +    ["afii57798"]=1463, +    ["afii57799"]=1456, +    ["afii57800"]=1458, +    ["afii57801"]=1457, +    ["afii57802"]=1459, +    ["afii57803"]=1474, +    ["afii57804"]=1473, +    ["afii57806"]=1465, +    ["afii57807"]=1468, +    ["afii57839"]=1469, +    ["afii57841"]=1471, +    ["afii57842"]=1472, +    ["afii57929"]=700, +    ["afii61248"]=8453, +    ["afii61289"]=8467, +    ["afii61352"]=8470, +    ["afii61664"]=8204, +    ["afii63167"]=1645, +    ["afii64937"]=701, +    ["arrowdblboth"]=8660, +    ["arrowdblleft"]=8656, +    ["arrowdblright"]=8658, +    ["arrowupdnbse"]=8616, +    ["bar"]=124, +    ["circle"]=9675, +    ["circlemultiply"]=8855, +    ["circleplus"]=8853, +    ["club"]=9827, +    ["colonmonetary"]=8353, +    ["dcroat"]=273, +    ["dkshade"]=9619, +    ["existential"]=8707, +    ["female"]=9792, +    ["gradient"]=8711, +    ["heart"]=9829, +    ["hookabovecomb"]=777, +    ["invcircle"]=9689, +    ["ldot"]=320, +    ["longs"]=383, +    ["ltshade"]=9617, +    ["male"]=9794, +    ["mu"]=181, +    ["napostrophe"]=329, +    ["notelement"]=8713, +    ["omega1"]=982, +    ["openbullet"]=9702, +    ["orthogonal"]=8735, +    ["oslashacute"]=511, +    ["phi1"]=981, +    ["propersubset"]=8834, +    ["propersuperset"]=8835, +    ["reflexsubset"]=8838, +    ["reflexsuperset"]=8839, +    ["shade"]=9618, +    ["sigma1"]=962, +    ["similar"]=8764, +    ["smileface"]=9786, +    ["spacehackarabic"]=32, +    ["spade"]=9824, +    ["theta1"]=977, +    ["twodotenleader"]=8229, +} diff --git a/otfl-font-agl.lua b/otfl-font-agl.lua deleted file mode 100644 index 820600a..0000000 --- a/otfl-font-agl.lua +++ /dev/null @@ -1,3699 +0,0 @@ -if not modules then modules = { } end modules ['font-map'] = { -    version   = 1.001, -    comment   = "companion to font-ini.mkiv", -    author    = "Hans Hagen, PRAGMA-ADE, Hasselt NL", -    copyright = "derived from http://www.adobe.com/devnet/opentype/archives/glyphlist.txt", -    comment   = "Adobe Glyph List, version 2.0, September 20, 2002", -} - -local allocate = utilities.storage.allocate - -fonts.enc = fonts.enc or { } -local enc = fonts.enc -local agl = { } -enc.agl   = agl - -agl.names = allocate { -- to name -    "controlSTX", -    "controlSOT", -    "controlETX", -    "controlEOT", -    "controlENQ", -    "controlACK", -    "controlBEL", -    "controlBS", -    "controlHT", -    "controlLF", -    "controlVT", -    "controlFF", -    "controlCR", -    "controlSO", -    "controlSI", -    "controlDLE", -    "controlDC1", -    "controlDC2", -    "controlDC3", -    "controlDC4", -    "controlNAK", -    "controlSYN", -    "controlETB", -    "controlCAN", -    "controlEM", -    "controlSUB", -    "controlESC", -    "controlFS", -    "controlGS", -    "controlRS", -    "controlUS", -    "spacehackarabic", -    "exclam", -    "quotedbl", -    "numbersign", -    "dollar", -    "percent", -    "ampersand", -    "quotesingle", -    "parenleft", -    "parenright", -    "asterisk", -    "plus", -    "comma", -    "hyphen", -    "period", -    "slash", -    "zero", -    "one", -    "two", -    "three", -    "four", -    "five", -    "six", -    "seven", -    "eight", -    "nine", -    "colon", -    "semicolon", -    "less", -    "equal", -    "greater", -    "question", -    "at", -    "A", -    "B", -    "C", -    "D", -    "E", -    "F", -    "G", -    "H", -    "I", -    "J", -    "K", -    "L", -    "M", -    "N", -    "O", -    "P", -    "Q", -    "R", -    "S", -    "T", -    "U", -    "V", -    "W", -    "X", -    "Y", -    "Z", -    "bracketleft", -    "backslash", -    "bracketright", -    "asciicircum", -    "underscore", -    "grave", -    "a", -    "b", -    "c", -    "d", -    "e", -    "f", -    "g", -    "h", -    "i", -    "j", -    "k", -    "l", -    "m", -    "n", -    "o", -    "p", -    "q", -    "r", -    "s", -    "t", -    "u", -    "v", -    "w", -    "x", -    "y", -    "z", -    "braceleft", -    "verticalbar", -    "braceright", -    "asciitilde", -    "controlDEL", -    [0x00A0] = "nonbreakingspace", -    [0x00A1] = "exclamdown", -    [0x00A2] = "cent", -    [0x00A3] = "sterling", -    [0x00A4] = "currency", -    [0x00A5] = "yen", -    [0x00A6] = "brokenbar", -    [0x00A7] = "section", -    [0x00A8] = "dieresis", -    [0x00A9] = "copyright", -    [0x00AA] = "ordfeminine", -    [0x00AB] = "guillemotleft", -    [0x00AC] = "logicalnot", -    [0x00AD] = "softhyphen", -    [0x00AE] = "registered", -    [0x00AF] = "overscore", -    [0x00B0] = "degree", -    [0x00B1] = "plusminus", -    [0x00B2] = "twosuperior", -    [0x00B3] = "threesuperior", -    [0x00B4] = "acute", -    [0x00B5] = "mu1", -    [0x00B6] = "paragraph", -    [0x00B7] = "periodcentered", -    [0x00B8] = "cedilla", -    [0x00B9] = "onesuperior", -    [0x00BA] = "ordmasculine", -    [0x00BB] = "guillemotright", -    [0x00BC] = "onequarter", -    [0x00BD] = "onehalf", -    [0x00BE] = "threequarters", -    [0x00BF] = "questiondown", -    [0x00C0] = "Agrave", -    [0x00C1] = "Aacute", -    [0x00C2] = "Acircumflex", -    [0x00C3] = "Atilde", -    [0x00C4] = "Adieresis", -    [0x00C5] = "Aring", -    [0x00C6] = "AE", -    [0x00C7] = "Ccedilla", -    [0x00C8] = "Egrave", -    [0x00C9] = "Eacute", -    [0x00CA] = "Ecircumflex", -    [0x00CB] = "Edieresis", -    [0x00CC] = "Igrave", -    [0x00CD] = "Iacute", -    [0x00CE] = "Icircumflex", -    [0x00CF] = "Idieresis", -    [0x00D0] = "Eth", -    [0x00D1] = "Ntilde", -    [0x00D2] = "Ograve", -    [0x00D3] = "Oacute", -    [0x00D4] = "Ocircumflex", -    [0x00D5] = "Otilde", -    [0x00D6] = "Odieresis", -    [0x00D7] = "multiply", -    [0x00D8] = "Oslash", -    [0x00D9] = "Ugrave", -    [0x00DA] = "Uacute", -    [0x00DB] = "Ucircumflex", -    [0x00DC] = "Udieresis", -    [0x00DD] = "Yacute", -    [0x00DE] = "Thorn", -    [0x00DF] = "germandbls", -    [0x00E0] = "agrave", -    [0x00E1] = "aacute", -    [0x00E2] = "acircumflex", -    [0x00E3] = "atilde", -    [0x00E4] = "adieresis", -    [0x00E5] = "aring", -    [0x00E6] = "ae", -    [0x00E7] = "ccedilla", -    [0x00E8] = "egrave", -    [0x00E9] = "eacute", -    [0x00EA] = "ecircumflex", -    [0x00EB] = "edieresis", -    [0x00EC] = "igrave", -    [0x00ED] = "iacute", -    [0x00EE] = "icircumflex", -    [0x00EF] = "idieresis", -    [0x00F0] = "eth", -    [0x00F1] = "ntilde", -    [0x00F2] = "ograve", -    [0x00F3] = "oacute", -    [0x00F4] = "ocircumflex", -    [0x00F5] = "otilde", -    [0x00F6] = "odieresis", -    [0x00F7] = "divide", -    [0x00F8] = "oslash", -    [0x00F9] = "ugrave", -    [0x00FA] = "uacute", -    [0x00FB] = "ucircumflex", -    [0x00FC] = "udieresis", -    [0x00FD] = "yacute", -    [0x00FE] = "thorn", -    [0x00FF] = "ydieresis", -    [0x0100] = "Amacron", -    [0x0101] = "amacron", -    [0x0102] = "Abreve", -    [0x0103] = "abreve", -    [0x0104] = "Aogonek", -    [0x0105] = "aogonek", -    [0x0106] = "Cacute", -    [0x0107] = "cacute", -    [0x0108] = "Ccircumflex", -    [0x0109] = "ccircumflex", -    [0x010A] = "Cdotaccent", -    [0x010B] = "cdotaccent", -    [0x010C] = "Ccaron", -    [0x010D] = "ccaron", -    [0x010E] = "Dcaron", -    [0x010F] = "dcaron", -    [0x0110] = "Dslash", -    [0x0111] = "dmacron", -    [0x0112] = "Emacron", -    [0x0113] = "emacron", -    [0x0114] = "Ebreve", -    [0x0115] = "ebreve", -    [0x0116] = "Edotaccent", -    [0x0117] = "edotaccent", -    [0x0118] = "Eogonek", -    [0x0119] = "eogonek", -    [0x011A] = "Ecaron", -    [0x011B] = "ecaron", -    [0x011C] = "Gcircumflex", -    [0x011D] = "gcircumflex", -    [0x011E] = "Gbreve", -    [0x011F] = "gbreve", -    [0x0120] = "Gdotaccent", -    [0x0121] = "gdotaccent", -    [0x0122] = "Gcommaaccent", -    [0x0123] = "gcommaaccent", -    [0x0124] = "Hcircumflex", -    [0x0125] = "hcircumflex", -    [0x0126] = "Hbar", -    [0x0127] = "hbar", -    [0x0128] = "Itilde", -    [0x0129] = "itilde", -    [0x012A] = "Imacron", -    [0x012B] = "imacron", -    [0x012C] = "Ibreve", -    [0x012D] = "ibreve", -    [0x012E] = "Iogonek", -    [0x012F] = "iogonek", -    [0x0130] = "Idotaccent", -    [0x0131] = "dotlessi", -    [0x0132] = "IJ", -    [0x0133] = "ij", -    [0x0134] = "Jcircumflex", -    [0x0135] = "jcircumflex", -    [0x0136] = "Kcommaaccent", -    [0x0137] = "kcommaaccent", -    [0x0138] = "kgreenlandic", -    [0x0139] = "Lacute", -    [0x013A] = "lacute", -    [0x013B] = "Lcommaaccent", -    [0x013C] = "lcommaaccent", -    [0x013D] = "Lcaron", -    [0x013E] = "lcaron", -    [0x013F] = "Ldotaccent", -    [0x0140] = "ldotaccent", -    [0x0141] = "Lslash", -    [0x0142] = "lslash", -    [0x0143] = "Nacute", -    [0x0144] = "nacute", -    [0x0145] = "Ncommaaccent", -    [0x0146] = "ncommaaccent", -    [0x0147] = "Ncaron", -    [0x0148] = "ncaron", -    [0x0149] = "quoterightn", -    [0x014A] = "Eng", -    [0x014B] = "eng", -    [0x014C] = "Omacron", -    [0x014D] = "omacron", -    [0x014E] = "Obreve", -    [0x014F] = "obreve", -    [0x0150] = "Ohungarumlaut", -    [0x0151] = "ohungarumlaut", -    [0x0152] = "OE", -    [0x0153] = "oe", -    [0x0154] = "Racute", -    [0x0155] = "racute", -    [0x0156] = "Rcommaaccent", -    [0x0157] = "rcommaaccent", -    [0x0158] = "Rcaron", -    [0x0159] = "rcaron", -    [0x015A] = "Sacute", -    [0x015B] = "sacute", -    [0x015C] = "Scircumflex", -    [0x015D] = "scircumflex", -    [0x015E] = "Scedilla", -    [0x015F] = "scedilla", -    [0x0160] = "Scaron", -    [0x0161] = "scaron", -    [0x0162] = "Tcommaaccent", -    [0x0163] = "tcommaaccent", -    [0x0164] = "Tcaron", -    [0x0165] = "tcaron", -    [0x0166] = "Tbar", -    [0x0167] = "tbar", -    [0x0168] = "Utilde", -    [0x0169] = "utilde", -    [0x016A] = "Umacron", -    [0x016B] = "umacron", -    [0x016C] = "Ubreve", -    [0x016D] = "ubreve", -    [0x016E] = "Uring", -    [0x016F] = "uring", -    [0x0170] = "Uhungarumlaut", -    [0x0171] = "uhungarumlaut", -    [0x0172] = "Uogonek", -    [0x0173] = "uogonek", -    [0x0174] = "Wcircumflex", -    [0x0175] = "wcircumflex", -    [0x0176] = "Ycircumflex", -    [0x0177] = "ycircumflex", -    [0x0178] = "Ydieresis", -    [0x0179] = "Zacute", -    [0x017A] = "zacute", -    [0x017B] = "Zdotaccent", -    [0x017C] = "zdotaccent", -    [0x017D] = "Zcaron", -    [0x017E] = "zcaron", -    [0x017F] = "slong", -    [0x0180] = "bstroke", -    [0x0181] = "Bhook", -    [0x0182] = "Btopbar", -    [0x0183] = "btopbar", -    [0x0184] = "Tonesix", -    [0x0185] = "tonesix", -    [0x0186] = "Oopen", -    [0x0187] = "Chook", -    [0x0188] = "chook", -    [0x0189] = "Dafrican", -    [0x018A] = "Dhook", -    [0x018B] = "Dtopbar", -    [0x018C] = "dtopbar", -    [0x018D] = "deltaturned", -    [0x018E] = "Ereversed", -    [0x018F] = "Schwa", -    [0x0190] = "Eopen", -    [0x0191] = "Fhook", -    [0x0192] = "florin", -    [0x0193] = "Ghook", -    [0x0194] = "Gammaafrican", -    [0x0195] = "hv", -    [0x0196] = "Iotaafrican", -    [0x0197] = "Istroke", -    [0x0198] = "Khook", -    [0x0199] = "khook", -    [0x019A] = "lbar", -    [0x019B] = "lambdastroke", -    [0x019C] = "Mturned", -    [0x019D] = "Nhookleft", -    [0x019E] = "nlegrightlong", -    [0x019F] = "Ocenteredtilde", -    [0x01A0] = "Ohorn", -    [0x01A1] = "ohorn", -    [0x01A2] = "Oi", -    [0x01A3] = "oi", -    [0x01A4] = "Phook", -    [0x01A5] = "phook", -    [0x01A6] = "yr", -    [0x01A7] = "Tonetwo", -    [0x01A8] = "tonetwo", -    [0x01A9] = "Esh", -    [0x01AA] = "eshreversedloop", -    [0x01AB] = "tpalatalhook", -    [0x01AC] = "Thook", -    [0x01AD] = "thook", -    [0x01AE] = "Tretroflexhook", -    [0x01AF] = "Uhorn", -    [0x01B0] = "uhorn", -    [0x01B1] = "Upsilonafrican", -    [0x01B2] = "Vhook", -    [0x01B3] = "Yhook", -    [0x01B4] = "yhook", -    [0x01B5] = "Zstroke", -    [0x01B6] = "zstroke", -    [0x01B7] = "Ezh", -    [0x01B8] = "Ezhreversed", -    [0x01B9] = "ezhreversed", -    [0x01BA] = "ezhtail", -    [0x01BB] = "twostroke", -    [0x01BC] = "Tonefive", -    [0x01BD] = "tonefive", -    [0x01BE] = "glottalinvertedstroke", -    [0x01BF] = "wynn", -    [0x01C0] = "clickdental", -    [0x01C1] = "clicklateral", -    [0x01C2] = "clickalveolar", -    [0x01C3] = "clickretroflex", -    [0x01C4] = "DZcaron", -    [0x01C5] = "Dzcaron", -    [0x01C6] = "dzcaron", -    [0x01C7] = "LJ", -    [0x01C8] = "Lj", -    [0x01C9] = "lj", -    [0x01CA] = "NJ", -    [0x01CB] = "Nj", -    [0x01CC] = "nj", -    [0x01CD] = "Acaron", -    [0x01CE] = "acaron", -    [0x01CF] = "Icaron", -    [0x01D0] = "icaron", -    [0x01D1] = "Ocaron", -    [0x01D2] = "ocaron", -    [0x01D3] = "Ucaron", -    [0x01D4] = "ucaron", -    [0x01D5] = "Udieresismacron", -    [0x01D6] = "udieresismacron", -    [0x01D7] = "Udieresisacute", -    [0x01D8] = "udieresisacute", -    [0x01D9] = "Udieresiscaron", -    [0x01DA] = "udieresiscaron", -    [0x01DB] = "Udieresisgrave", -    [0x01DC] = "udieresisgrave", -    [0x01DD] = "eturned", -    [0x01DE] = "Adieresismacron", -    [0x01DF] = "adieresismacron", -    [0x01E0] = "Adotmacron", -    [0x01E1] = "adotmacron", -    [0x01E2] = "AEmacron", -    [0x01E3] = "aemacron", -    [0x01E4] = "Gstroke", -    [0x01E5] = "gstroke", -    [0x01E6] = "Gcaron", -    [0x01E7] = "gcaron", -    [0x01E8] = "Kcaron", -    [0x01E9] = "kcaron", -    [0x01EA] = "Oogonek", -    [0x01EB] = "oogonek", -    [0x01EC] = "Oogonekmacron", -    [0x01ED] = "oogonekmacron", -    [0x01EE] = "Ezhcaron", -    [0x01EF] = "ezhcaron", -    [0x01F0] = "jcaron", -    [0x01F1] = "DZ", -    [0x01F2] = "Dz", -    [0x01F3] = "dz", -    [0x01F4] = "Gacute", -    [0x01F5] = "gacute", -    [0x01FA] = "Aringacute", -    [0x01FB] = "aringacute", -    [0x01FC] = "AEacute", -    [0x01FD] = "aeacute", -    [0x01FE] = "Ostrokeacute", -    [0x01FF] = "ostrokeacute", -    [0x0200] = "Adblgrave", -    [0x0201] = "adblgrave", -    [0x0202] = "Ainvertedbreve", -    [0x0203] = "ainvertedbreve", -    [0x0204] = "Edblgrave", -    [0x0205] = "edblgrave", -    [0x0206] = "Einvertedbreve", -    [0x0207] = "einvertedbreve", -    [0x0208] = "Idblgrave", -    [0x0209] = "idblgrave", -    [0x020A] = "Iinvertedbreve", -    [0x020B] = "iinvertedbreve", -    [0x020C] = "Odblgrave", -    [0x020D] = "odblgrave", -    [0x020E] = "Oinvertedbreve", -    [0x020F] = "oinvertedbreve", -    [0x0210] = "Rdblgrave", -    [0x0211] = "rdblgrave", -    [0x0212] = "Rinvertedbreve", -    [0x0213] = "rinvertedbreve", -    [0x0214] = "Udblgrave", -    [0x0215] = "udblgrave", -    [0x0216] = "Uinvertedbreve", -    [0x0217] = "uinvertedbreve", -    [0x0218] = "Scommaaccent", -    [0x0219] = "scommaaccent", -    [0x0250] = "aturned", -    [0x0251] = "ascript", -    [0x0252] = "ascriptturned", -    [0x0253] = "bhook", -    [0x0254] = "oopen", -    [0x0255] = "ccurl", -    [0x0256] = "dtail", -    [0x0257] = "dhook", -    [0x0258] = "ereversed", -    [0x0259] = "schwa", -    [0x025A] = "schwahook", -    [0x025B] = "eopen", -    [0x025C] = "eopenreversed", -    [0x025D] = "eopenreversedhook", -    [0x025E] = "eopenreversedclosed", -    [0x025F] = "jdotlessstroke", -    [0x0260] = "ghook", -    [0x0261] = "gscript", -    [0x0263] = "gammalatinsmall", -    [0x0264] = "ramshorn", -    [0x0265] = "hturned", -    [0x0266] = "hhook", -    [0x0267] = "henghook", -    [0x0268] = "istroke", -    [0x0269] = "iotalatin", -    [0x026B] = "lmiddletilde", -    [0x026C] = "lbelt", -    [0x026D] = "lhookretroflex", -    [0x026E] = "lezh", -    [0x026F] = "mturned", -    [0x0270] = "mlonglegturned", -    [0x0271] = "mhook", -    [0x0272] = "nhookleft", -    [0x0273] = "nhookretroflex", -    [0x0275] = "obarred", -    [0x0277] = "omegalatinclosed", -    [0x0278] = "philatin", -    [0x0279] = "rturned", -    [0x027A] = "rlonglegturned", -    [0x027B] = "rhookturned", -    [0x027C] = "rlongleg", -    [0x027D] = "rhook", -    [0x027E] = "rfishhook", -    [0x027F] = "rfishhookreversed", -    [0x0281] = "Rsmallinverted", -    [0x0282] = "shook", -    [0x0283] = "esh", -    [0x0284] = "dotlessjstrokehook", -    [0x0285] = "eshsquatreversed", -    [0x0286] = "eshcurl", -    [0x0287] = "tturned", -    [0x0288] = "tretroflexhook", -    [0x0289] = "ubar", -    [0x028A] = "upsilonlatin", -    [0x028B] = "vhook", -    [0x028C] = "vturned", -    [0x028D] = "wturned", -    [0x028E] = "yturned", -    [0x0290] = "zretroflexhook", -    [0x0291] = "zcurl", -    [0x0292] = "ezh", -    [0x0293] = "ezhcurl", -    [0x0294] = "glottalstop", -    [0x0295] = "glottalstopreversed", -    [0x0296] = "glottalstopinverted", -    [0x0297] = "cstretched", -    [0x0298] = "bilabialclick", -    [0x029A] = "eopenclosed", -    [0x029B] = "Gsmallhook", -    [0x029D] = "jcrossedtail", -    [0x029E] = "kturned", -    [0x02A0] = "qhook", -    [0x02A1] = "glottalstopstroke", -    [0x02A2] = "glottalstopstrokereversed", -    [0x02A3] = "dzaltone", -    [0x02A4] = "dezh", -    [0x02A5] = "dzcurl", -    [0x02A6] = "ts", -    [0x02A7] = "tesh", -    [0x02A8] = "tccurl", -    [0x02B0] = "hsuperior", -    [0x02B1] = "hhooksuperior", -    [0x02B2] = "jsuperior", -    [0x02B4] = "rturnedsuperior", -    [0x02B5] = "rhookturnedsuperior", -    [0x02B6] = "Rsmallinvertedsuperior", -    [0x02B7] = "wsuperior", -    [0x02B8] = "ysuperior", -    [0x02B9] = "primemod", -    [0x02BA] = "dblprimemod", -    [0x02BB] = "commaturnedmod", -    [0x02BC] = "apostrophemod", -    [0x02BD] = "commareversedmod", -    [0x02BE] = "ringhalfright", -    [0x02BF] = "ringhalfleft", -    [0x02C0] = "glottalstopmod", -    [0x02C1] = "glottalstopreversedmod", -    [0x02C2] = "arrowheadleftmod", -    [0x02C3] = "arrowheadrightmod", -    [0x02C4] = "arrowheadupmod", -    [0x02C5] = "arrowheaddownmod", -    [0x02C6] = "circumflex", -    [0x02C7] = "caron", -    [0x02C8] = "verticallinemod", -    [0x02C9] = "firsttonechinese", -    [0x02CA] = "secondtonechinese", -    [0x02CB] = "fourthtonechinese", -    [0x02CC] = "verticallinelowmod", -    [0x02CD] = "macronlowmod", -    [0x02CE] = "gravelowmod", -    [0x02CF] = "acutelowmod", -    [0x02D0] = "colontriangularmod", -    [0x02D1] = "colontriangularhalfmod", -    [0x02D2] = "ringhalfrightcentered", -    [0x02D3] = "ringhalfleftcentered", -    [0x02D4] = "uptackmod", -    [0x02D5] = "downtackmod", -    [0x02D6] = "plusmod", -    [0x02D7] = "minusmod", -    [0x02D8] = "breve", -    [0x02D9] = "dotaccent", -    [0x02DA] = "ring", -    [0x02DB] = "ogonek", -    [0x02DC] = "tilde", -    [0x02DD] = "hungarumlaut", -    [0x02DE] = "rhotichookmod", -    [0x02E0] = "gammasuperior", -    [0x02E3] = "xsuperior", -    [0x02E4] = "glottalstopreversedsuperior", -    [0x02E5] = "tonebarextrahighmod", -    [0x02E6] = "tonebarhighmod", -    [0x02E7] = "tonebarmidmod", -    [0x02E8] = "tonebarlowmod", -    [0x02E9] = "tonebarextralowmod", -    [0x0300] = "gravecomb", -    [0x0301] = "acutecomb", -    [0x0302] = "circumflexcmb", -    [0x0303] = "tildecomb", -    [0x0304] = "macroncmb", -    [0x0305] = "overlinecmb", -    [0x0306] = "brevecmb", -    [0x0307] = "dotaccentcmb", -    [0x0308] = "dieresiscmb", -    [0x0309] = "hookcmb", -    [0x030A] = "ringcmb", -    [0x030B] = "hungarumlautcmb", -    [0x030C] = "caroncmb", -    [0x030D] = "verticallineabovecmb", -    [0x030E] = "dblverticallineabovecmb", -    [0x030F] = "dblgravecmb", -    [0x0310] = "candrabinducmb", -    [0x0311] = "breveinvertedcmb", -    [0x0312] = "commaturnedabovecmb", -    [0x0313] = "commaabovecmb", -    [0x0314] = "commareversedabovecmb", -    [0x0315] = "commaaboverightcmb", -    [0x0316] = "gravebelowcmb", -    [0x0317] = "acutebelowcmb", -    [0x0318] = "lefttackbelowcmb", -    [0x0319] = "righttackbelowcmb", -    [0x031A] = "leftangleabovecmb", -    [0x031B] = "horncmb", -    [0x031C] = "ringhalfleftbelowcmb", -    [0x031D] = "uptackbelowcmb", -    [0x031E] = "downtackbelowcmb", -    [0x031F] = "plusbelowcmb", -    [0x0320] = "minusbelowcmb", -    [0x0321] = "hookpalatalizedbelowcmb", -    [0x0322] = "hookretroflexbelowcmb", -    [0x0323] = "dotbelowcomb", -    [0x0324] = "dieresisbelowcmb", -    [0x0325] = "ringbelowcmb", -    [0x0327] = "cedillacmb", -    [0x0328] = "ogonekcmb", -    [0x0329] = "verticallinebelowcmb", -    [0x032A] = "bridgebelowcmb", -    [0x032B] = "dblarchinvertedbelowcmb", -    [0x032C] = "caronbelowcmb", -    [0x032D] = "circumflexbelowcmb", -    [0x032E] = "brevebelowcmb", -    [0x032F] = "breveinvertedbelowcmb", -    [0x0330] = "tildebelowcmb", -    [0x0331] = "macronbelowcmb", -    [0x0332] = "lowlinecmb", -    [0x0333] = "dbllowlinecmb", -    [0x0334] = "tildeoverlaycmb", -    [0x0335] = "strokeshortoverlaycmb", -    [0x0336] = "strokelongoverlaycmb", -    [0x0337] = "solidusshortoverlaycmb", -    [0x0338] = "soliduslongoverlaycmb", -    [0x0339] = "ringhalfrightbelowcmb", -    [0x033A] = "bridgeinvertedbelowcmb", -    [0x033B] = "squarebelowcmb", -    [0x033C] = "seagullbelowcmb", -    [0x033D] = "xabovecmb", -    [0x033E] = "tildeverticalcmb", -    [0x033F] = "dbloverlinecmb", -    [0x0340] = "gravetonecmb", -    [0x0341] = "acutetonecmb", -    [0x0342] = "perispomenigreekcmb", -    [0x0343] = "koroniscmb", -    [0x0344] = "dialytikatonoscmb", -    [0x0345] = "ypogegrammenigreekcmb", -    [0x0360] = "tildedoublecmb", -    [0x0361] = "breveinverteddoublecmb", -    [0x0374] = "numeralsigngreek", -    [0x0375] = "numeralsignlowergreek", -    [0x037A] = "ypogegrammeni", -    [0x037E] = "questiongreek", -    [0x0384] = "tonos", -    [0x0385] = "dieresistonos", -    [0x0386] = "Alphatonos", -    [0x0387] = "anoteleia", -    [0x0388] = "Epsilontonos", -    [0x0389] = "Etatonos", -    [0x038A] = "Iotatonos", -    [0x038C] = "Omicrontonos", -    [0x038E] = "Upsilontonos", -    [0x038F] = "Omegatonos", -    [0x0390] = "iotadieresistonos", -    [0x0391] = "Alpha", -    [0x0392] = "Beta", -    [0x0393] = "Gamma", -    [0x0394] = "Deltagreek", -    [0x0395] = "Epsilon", -    [0x0396] = "Zeta", -    [0x0397] = "Eta", -    [0x0398] = "Theta", -    [0x0399] = "Iota", -    [0x039A] = "Kappa", -    [0x039B] = "Lambda", -    [0x039C] = "Mu", -    [0x039D] = "Nu", -    [0x039E] = "Xi", -    [0x039F] = "Omicron", -    [0x03A0] = "Pi", -    [0x03A1] = "Rho", -    [0x03A3] = "Sigma", -    [0x03A4] = "Tau", -    [0x03A5] = "Upsilon", -    [0x03A6] = "Phi", -    [0x03A7] = "Chi", -    [0x03A8] = "Psi", -    [0x03A9] = "Omegagreek", -    [0x03AA] = "Iotadieresis", -    [0x03AB] = "Upsilondieresis", -    [0x03AC] = "alphatonos", -    [0x03AD] = "epsilontonos", -    [0x03AE] = "etatonos", -    [0x03AF] = "iotatonos", -    [0x03B0] = "upsilondieresistonos", -    [0x03B1] = "alpha", -    [0x03B2] = "beta", -    [0x03B3] = "gamma", -    [0x03B4] = "delta", -    [0x03B5] = "epsilon", -    [0x03B6] = "zeta", -    [0x03B7] = "eta", -    [0x03B8] = "theta", -    [0x03B9] = "iota", -    [0x03BA] = "kappa", -    [0x03BB] = "lambda", -    [0x03BC] = "mugreek", -    [0x03BD] = "nu", -    [0x03BE] = "xi", -    [0x03BF] = "omicron", -    [0x03C0] = "pi", -    [0x03C1] = "rho", -    [0x03C2] = "sigmafinal", -    [0x03C3] = "sigma", -    [0x03C4] = "tau", -    [0x03C5] = "upsilon", -    [0x03C6] = "phi", -    [0x03C7] = "chi", -    [0x03C8] = "psi", -    [0x03C9] = "omega", -    [0x03CA] = "iotadieresis", -    [0x03CB] = "upsilondieresis", -    [0x03CC] = "omicrontonos", -    [0x03CD] = "upsilontonos", -    [0x03CE] = "omegatonos", -    [0x03D0] = "betasymbolgreek", -    [0x03D1] = "thetasymbolgreek", -    [0x03D2] = "Upsilonhooksymbol", -    [0x03D3] = "Upsilonacutehooksymbolgreek", -    [0x03D4] = "Upsilondieresishooksymbolgreek", -    [0x03D5] = "phisymbolgreek", -    [0x03D6] = "pisymbolgreek", -    [0x03DA] = "Stigmagreek", -    [0x03DC] = "Digammagreek", -    [0x03DE] = "Koppagreek", -    [0x03E0] = "Sampigreek", -    [0x03E2] = "Sheicoptic", -    [0x03E3] = "sheicoptic", -    [0x03E4] = "Feicoptic", -    [0x03E5] = "feicoptic", -    [0x03E6] = "Kheicoptic", -    [0x03E7] = "kheicoptic", -    [0x03E8] = "Horicoptic", -    [0x03E9] = "horicoptic", -    [0x03EA] = "Gangiacoptic", -    [0x03EB] = "gangiacoptic", -    [0x03EC] = "Shimacoptic", -    [0x03ED] = "shimacoptic", -    [0x03EE] = "Deicoptic", -    [0x03EF] = "deicoptic", -    [0x03F0] = "kappasymbolgreek", -    [0x03F1] = "rhosymbolgreek", -    [0x03F2] = "sigmalunatesymbolgreek", -    [0x03F3] = "yotgreek", -    [0x0401] = "afii10023", -    [0x0402] = "afii10051", -    [0x0403] = "afii10052", -    [0x0404] = "afii10053", -    [0x0405] = "afii10054", -    [0x0406] = "afii10055", -    [0x0407] = "afii10056", -    [0x0408] = "afii10057", -    [0x0409] = "afii10058", -    [0x040A] = "afii10059", -    [0x040B] = "afii10060", -    [0x040C] = "afii10061", -    [0x040E] = "afii10062", -    [0x040F] = "afii10145", -    [0x0410] = "afii10017", -    [0x0411] = "afii10018", -    [0x0412] = "afii10019", -    [0x0413] = "afii10020", -    [0x0414] = "afii10021", -    [0x0415] = "afii10022", -    [0x0416] = "afii10024", -    [0x0417] = "afii10025", -    [0x0418] = "afii10026", -    [0x0419] = "afii10027", -    [0x041A] = "afii10028", -    [0x041B] = "afii10029", -    [0x041C] = "afii10030", -    [0x041D] = "afii10031", -    [0x041E] = "afii10032", -    [0x041F] = "afii10033", -    [0x0420] = "afii10034", -    [0x0421] = "afii10035", -    [0x0422] = "afii10036", -    [0x0423] = "afii10037", -    [0x0424] = "afii10038", -    [0x0425] = "afii10039", -    [0x0426] = "afii10040", -    [0x0427] = "afii10041", -    [0x0428] = "afii10042", -    [0x0429] = "afii10043", -    [0x042A] = "afii10044", -    [0x042B] = "afii10045", -    [0x042C] = "afii10046", -    [0x042D] = "afii10047", -    [0x042E] = "afii10048", -    [0x042F] = "afii10049", -    [0x0430] = "afii10065", -    [0x0431] = "becyrillic", -    [0x0432] = "vecyrillic", -    [0x0433] = "gecyrillic", -    [0x0434] = "decyrillic", -    [0x0435] = "iecyrillic", -    [0x0436] = "zhecyrillic", -    [0x0437] = "zecyrillic", -    [0x0438] = "iicyrillic", -    [0x0439] = "iishortcyrillic", -    [0x043A] = "kacyrillic", -    [0x043B] = "elcyrillic", -    [0x043C] = "emcyrillic", -    [0x043D] = "encyrillic", -    [0x043E] = "ocyrillic", -    [0x043F] = "pecyrillic", -    [0x0440] = "ercyrillic", -    [0x0441] = "escyrillic", -    [0x0442] = "tecyrillic", -    [0x0443] = "ucyrillic", -    [0x0444] = "efcyrillic", -    [0x0445] = "khacyrillic", -    [0x0446] = "tsecyrillic", -    [0x0447] = "checyrillic", -    [0x0448] = "shacyrillic", -    [0x0449] = "shchacyrillic", -    [0x044A] = "hardsigncyrillic", -    [0x044B] = "yericyrillic", -    [0x044C] = "softsigncyrillic", -    [0x044D] = "ereversedcyrillic", -    [0x044E] = "iucyrillic", -    [0x044F] = "iacyrillic", -    [0x0451] = "iocyrillic", -    [0x0452] = "djecyrillic", -    [0x0453] = "gjecyrillic", -    [0x0454] = "ecyrillic", -    [0x0455] = "dzecyrillic", -    [0x0456] = "icyrillic", -    [0x0457] = "yicyrillic", -    [0x0458] = "jecyrillic", -    [0x0459] = "ljecyrillic", -    [0x045A] = "njecyrillic", -    [0x045B] = "tshecyrillic", -    [0x045C] = "kjecyrillic", -    [0x045E] = "ushortcyrillic", -    [0x045F] = "dzhecyrillic", -    [0x0460] = "Omegacyrillic", -    [0x0461] = "omegacyrillic", -    [0x0462] = "afii10146", -    [0x0463] = "yatcyrillic", -    [0x0464] = "Eiotifiedcyrillic", -    [0x0465] = "eiotifiedcyrillic", -    [0x0466] = "Yuslittlecyrillic", -    [0x0467] = "yuslittlecyrillic", -    [0x0468] = "Yuslittleiotifiedcyrillic", -    [0x0469] = "yuslittleiotifiedcyrillic", -    [0x046A] = "Yusbigcyrillic", -    [0x046B] = "yusbigcyrillic", -    [0x046C] = "Yusbigiotifiedcyrillic", -    [0x046D] = "yusbigiotifiedcyrillic", -    [0x046E] = "Ksicyrillic", -    [0x046F] = "ksicyrillic", -    [0x0470] = "Psicyrillic", -    [0x0471] = "psicyrillic", -    [0x0472] = "afii10147", -    [0x0473] = "fitacyrillic", -    [0x0474] = "afii10148", -    [0x0475] = "izhitsacyrillic", -    [0x0476] = "Izhitsadblgravecyrillic", -    [0x0477] = "izhitsadblgravecyrillic", -    [0x0478] = "Ukcyrillic", -    [0x0479] = "ukcyrillic", -    [0x047A] = "Omegaroundcyrillic", -    [0x047B] = "omegaroundcyrillic", -    [0x047C] = "Omegatitlocyrillic", -    [0x047D] = "omegatitlocyrillic", -    [0x047E] = "Otcyrillic", -    [0x047F] = "otcyrillic", -    [0x0480] = "Koppacyrillic", -    [0x0481] = "koppacyrillic", -    [0x0482] = "thousandcyrillic", -    [0x0483] = "titlocyrilliccmb", -    [0x0484] = "palatalizationcyrilliccmb", -    [0x0485] = "dasiapneumatacyrilliccmb", -    [0x0486] = "psilipneumatacyrilliccmb", -    [0x0490] = "afii10050", -    [0x0491] = "gheupturncyrillic", -    [0x0492] = "Ghestrokecyrillic", -    [0x0493] = "ghestrokecyrillic", -    [0x0494] = "Ghemiddlehookcyrillic", -    [0x0495] = "ghemiddlehookcyrillic", -    [0x0496] = "Zhedescendercyrillic", -    [0x0497] = "zhedescendercyrillic", -    [0x0498] = "Zedescendercyrillic", -    [0x0499] = "zedescendercyrillic", -    [0x049A] = "Kadescendercyrillic", -    [0x049B] = "kadescendercyrillic", -    [0x049C] = "Kaverticalstrokecyrillic", -    [0x049D] = "kaverticalstrokecyrillic", -    [0x049E] = "Kastrokecyrillic", -    [0x049F] = "kastrokecyrillic", -    [0x04A0] = "Kabashkircyrillic", -    [0x04A1] = "kabashkircyrillic", -    [0x04A2] = "Endescendercyrillic", -    [0x04A3] = "endescendercyrillic", -    [0x04A4] = "Enghecyrillic", -    [0x04A5] = "enghecyrillic", -    [0x04A6] = "Pemiddlehookcyrillic", -    [0x04A7] = "pemiddlehookcyrillic", -    [0x04A8] = "Haabkhasiancyrillic", -    [0x04A9] = "haabkhasiancyrillic", -    [0x04AA] = "Esdescendercyrillic", -    [0x04AB] = "esdescendercyrillic", -    [0x04AC] = "Tedescendercyrillic", -    [0x04AD] = "tedescendercyrillic", -    [0x04AE] = "Ustraightcyrillic", -    [0x04AF] = "ustraightcyrillic", -    [0x04B0] = "Ustraightstrokecyrillic", -    [0x04B1] = "ustraightstrokecyrillic", -    [0x04B2] = "Hadescendercyrillic", -    [0x04B3] = "hadescendercyrillic", -    [0x04B4] = "Tetsecyrillic", -    [0x04B5] = "tetsecyrillic", -    [0x04B6] = "Chedescendercyrillic", -    [0x04B7] = "chedescendercyrillic", -    [0x04B8] = "Cheverticalstrokecyrillic", -    [0x04B9] = "cheverticalstrokecyrillic", -    [0x04BA] = "Shhacyrillic", -    [0x04BB] = "shhacyrillic", -    [0x04BC] = "Cheabkhasiancyrillic", -    [0x04BD] = "cheabkhasiancyrillic", -    [0x04BE] = "Chedescenderabkhasiancyrillic", -    [0x04BF] = "chedescenderabkhasiancyrillic", -    [0x04C0] = "palochkacyrillic", -    [0x04C1] = "Zhebrevecyrillic", -    [0x04C2] = "zhebrevecyrillic", -    [0x04C3] = "Kahookcyrillic", -    [0x04C4] = "kahookcyrillic", -    [0x04C7] = "Enhookcyrillic", -    [0x04C8] = "enhookcyrillic", -    [0x04CB] = "Chekhakassiancyrillic", -    [0x04CC] = "chekhakassiancyrillic", -    [0x04D0] = "Abrevecyrillic", -    [0x04D1] = "abrevecyrillic", -    [0x04D2] = "Adieresiscyrillic", -    [0x04D3] = "adieresiscyrillic", -    [0x04D4] = "Aiecyrillic", -    [0x04D5] = "aiecyrillic", -    [0x04D6] = "Iebrevecyrillic", -    [0x04D7] = "iebrevecyrillic", -    [0x04D8] = "Schwacyrillic", -    [0x04D9] = "schwacyrillic", -    [0x04DA] = "Schwadieresiscyrillic", -    [0x04DB] = "schwadieresiscyrillic", -    [0x04DC] = "Zhedieresiscyrillic", -    [0x04DD] = "zhedieresiscyrillic", -    [0x04DE] = "Zedieresiscyrillic", -    [0x04DF] = "zedieresiscyrillic", -    [0x04E0] = "Dzeabkhasiancyrillic", -    [0x04E1] = "dzeabkhasiancyrillic", -    [0x04E2] = "Imacroncyrillic", -    [0x04E3] = "imacroncyrillic", -    [0x04E4] = "Idieresiscyrillic", -    [0x04E5] = "idieresiscyrillic", -    [0x04E6] = "Odieresiscyrillic", -    [0x04E7] = "odieresiscyrillic", -    [0x04E8] = "Obarredcyrillic", -    [0x04E9] = "obarredcyrillic", -    [0x04EA] = "Obarreddieresiscyrillic", -    [0x04EB] = "obarreddieresiscyrillic", -    [0x04EE] = "Umacroncyrillic", -    [0x04EF] = "umacroncyrillic", -    [0x04F0] = "Udieresiscyrillic", -    [0x04F1] = "udieresiscyrillic", -    [0x04F2] = "Uhungarumlautcyrillic", -    [0x04F3] = "uhungarumlautcyrillic", -    [0x04F4] = "Chedieresiscyrillic", -    [0x04F5] = "chedieresiscyrillic", -    [0x04F8] = "Yerudieresiscyrillic", -    [0x04F9] = "yerudieresiscyrillic", -    [0x0531] = "Aybarmenian", -    [0x0532] = "Benarmenian", -    [0x0533] = "Gimarmenian", -    [0x0534] = "Daarmenian", -    [0x0535] = "Echarmenian", -    [0x0536] = "Zaarmenian", -    [0x0537] = "Eharmenian", -    [0x0538] = "Etarmenian", -    [0x0539] = "Toarmenian", -    [0x053A] = "Zhearmenian", -    [0x053B] = "Iniarmenian", -    [0x053C] = "Liwnarmenian", -    [0x053D] = "Xeharmenian", -    [0x053E] = "Caarmenian", -    [0x053F] = "Kenarmenian", -    [0x0540] = "Hoarmenian", -    [0x0541] = "Jaarmenian", -    [0x0542] = "Ghadarmenian", -    [0x0543] = "Cheharmenian", -    [0x0544] = "Menarmenian", -    [0x0545] = "Yiarmenian", -    [0x0546] = "Nowarmenian", -    [0x0547] = "Shaarmenian", -    [0x0548] = "Voarmenian", -    [0x0549] = "Chaarmenian", -    [0x054A] = "Peharmenian", -    [0x054B] = "Jheharmenian", -    [0x054C] = "Raarmenian", -    [0x054D] = "Seharmenian", -    [0x054E] = "Vewarmenian", -    [0x054F] = "Tiwnarmenian", -    [0x0550] = "Reharmenian", -    [0x0551] = "Coarmenian", -    [0x0552] = "Yiwnarmenian", -    [0x0553] = "Piwrarmenian", -    [0x0554] = "Keharmenian", -    [0x0555] = "Oharmenian", -    [0x0556] = "Feharmenian", -    [0x0559] = "ringhalfleftarmenian", -    [0x055A] = "apostrophearmenian", -    [0x055B] = "emphasismarkarmenian", -    [0x055C] = "exclamarmenian", -    [0x055D] = "commaarmenian", -    [0x055E] = "questionarmenian", -    [0x055F] = "abbreviationmarkarmenian", -    [0x0561] = "aybarmenian", -    [0x0562] = "benarmenian", -    [0x0563] = "gimarmenian", -    [0x0564] = "daarmenian", -    [0x0565] = "echarmenian", -    [0x0566] = "zaarmenian", -    [0x0567] = "eharmenian", -    [0x0568] = "etarmenian", -    [0x0569] = "toarmenian", -    [0x056A] = "zhearmenian", -    [0x056B] = "iniarmenian", -    [0x056C] = "liwnarmenian", -    [0x056D] = "xeharmenian", -    [0x056E] = "caarmenian", -    [0x056F] = "kenarmenian", -    [0x0570] = "hoarmenian", -    [0x0571] = "jaarmenian", -    [0x0572] = "ghadarmenian", -    [0x0573] = "cheharmenian", -    [0x0574] = "menarmenian", -    [0x0575] = "yiarmenian", -    [0x0576] = "nowarmenian", -    [0x0577] = "shaarmenian", -    [0x0578] = "voarmenian", -    [0x0579] = "chaarmenian", -    [0x057A] = "peharmenian", -    [0x057B] = "jheharmenian", -    [0x057C] = "raarmenian", -    [0x057D] = "seharmenian", -    [0x057E] = "vewarmenian", -    [0x057F] = "tiwnarmenian", -    [0x0580] = "reharmenian", -    [0x0581] = "coarmenian", -    [0x0582] = "yiwnarmenian", -    [0x0583] = "piwrarmenian", -    [0x0584] = "keharmenian", -    [0x0585] = "oharmenian", -    [0x0586] = "feharmenian", -    [0x0587] = "echyiwnarmenian", -    [0x0589] = "periodarmenian", -    [0x0591] = "etnahtalefthebrew", -    [0x0592] = "segoltahebrew", -    [0x0593] = "shalshelethebrew", -    [0x0594] = "zaqefqatanhebrew", -    [0x0595] = "zaqefgadolhebrew", -    [0x0596] = "tipehalefthebrew", -    [0x0597] = "reviamugrashhebrew", -    [0x0598] = "zarqahebrew", -    [0x0599] = "pashtahebrew", -    [0x059A] = "yetivhebrew", -    [0x059B] = "tevirlefthebrew", -    [0x059C] = "gereshaccenthebrew", -    [0x059D] = "gereshmuqdamhebrew", -    [0x059E] = "gershayimaccenthebrew", -    [0x059F] = "qarneyparahebrew", -    [0x05A0] = "telishagedolahebrew", -    [0x05A1] = "pazerhebrew", -    [0x05A3] = "munahlefthebrew", -    [0x05A4] = "mahapakhlefthebrew", -    [0x05A5] = "merkhalefthebrew", -    [0x05A6] = "merkhakefulalefthebrew", -    [0x05A7] = "dargalefthebrew", -    [0x05A8] = "qadmahebrew", -    [0x05A9] = "telishaqetanahebrew", -    [0x05AA] = "yerahbenyomolefthebrew", -    [0x05AB] = "olehebrew", -    [0x05AC] = "iluyhebrew", -    [0x05AD] = "dehihebrew", -    [0x05AE] = "zinorhebrew", -    [0x05AF] = "masoracirclehebrew", -    [0x05B0] = "shevawidehebrew", -    [0x05B1] = "hatafsegolwidehebrew", -    [0x05B2] = "hatafpatahwidehebrew", -    [0x05B3] = "hatafqamatswidehebrew", -    [0x05B4] = "hiriqwidehebrew", -    [0x05B5] = "tserewidehebrew", -    [0x05B6] = "segolwidehebrew", -    [0x05B7] = "patahwidehebrew", -    [0x05B8] = "qamatswidehebrew", -    [0x05B9] = "holamwidehebrew", -    [0x05BB] = "qubutswidehebrew", -    [0x05BC] = "dageshhebrew", -    [0x05BD] = "siluqlefthebrew", -    [0x05BE] = "maqafhebrew", -    [0x05BF] = "rafehebrew", -    [0x05C0] = "paseqhebrew", -    [0x05C1] = "shindothebrew", -    [0x05C2] = "sindothebrew", -    [0x05C3] = "sofpasuqhebrew", -    [0x05C4] = "upperdothebrew", -    [0x05D0] = "alefhebrew", -    [0x05D1] = "bethebrew", -    [0x05D2] = "gimelhebrew", -    [0x05D3] = "dalettserehebrew", -    [0x05D4] = "hehebrew", -    [0x05D5] = "vavhebrew", -    [0x05D6] = "zayinhebrew", -    [0x05D7] = "hethebrew", -    [0x05D8] = "tethebrew", -    [0x05D9] = "yodhebrew", -    [0x05DA] = "finalkafshevahebrew", -    [0x05DB] = "kafhebrew", -    [0x05DC] = "lamedholamhebrew", -    [0x05DD] = "finalmemhebrew", -    [0x05DE] = "memhebrew", -    [0x05DF] = "finalnunhebrew", -    [0x05E0] = "nunhebrew", -    [0x05E1] = "samekhhebrew", -    [0x05E2] = "ayinhebrew", -    [0x05E3] = "finalpehebrew", -    [0x05E4] = "pehebrew", -    [0x05E5] = "finaltsadihebrew", -    [0x05E6] = "tsadihebrew", -    [0x05E7] = "qoftserehebrew", -    [0x05E8] = "reshtserehebrew", -    [0x05E9] = "shinhebrew", -    [0x05EA] = "tavhebrew", -    [0x05F0] = "vavvavhebrew", -    [0x05F1] = "vavyodhebrew", -    [0x05F2] = "yodyodhebrew", -    [0x05F3] = "gereshhebrew", -    [0x05F4] = "gershayimhebrew", -    [0x060C] = "commaarabic", -    [0x061B] = "semicolonarabic", -    [0x061F] = "questionarabic", -    [0x0621] = "hamzasukunarabic", -    [0x0622] = "alefmaddaabovearabic", -    [0x0623] = "alefhamzaabovearabic", -    [0x0624] = "wawhamzaabovearabic", -    [0x0625] = "alefhamzabelowarabic", -    [0x0626] = "yehhamzaabovearabic", -    [0x0627] = "alefarabic", -    [0x0628] = "beharabic", -    [0x0629] = "tehmarbutaarabic", -    [0x062A] = "teharabic", -    [0x062B] = "theharabic", -    [0x062C] = "jeemarabic", -    [0x062D] = "haharabic", -    [0x062E] = "khaharabic", -    [0x062F] = "dalarabic", -    [0x0630] = "thalarabic", -    [0x0631] = "rehyehaleflamarabic", -    [0x0632] = "zainarabic", -    [0x0633] = "seenarabic", -    [0x0634] = "sheenarabic", -    [0x0635] = "sadarabic", -    [0x0636] = "dadarabic", -    [0x0637] = "taharabic", -    [0x0638] = "zaharabic", -    [0x0639] = "ainarabic", -    [0x063A] = "ghainarabic", -    [0x0640] = "tatweelarabic", -    [0x0641] = "feharabic", -    [0x0642] = "qafarabic", -    [0x0643] = "kafarabic", -    [0x0644] = "lamarabic", -    [0x0645] = "meemarabic", -    [0x0646] = "noonarabic", -    [0x0647] = "heharabic", -    [0x0648] = "wawarabic", -    [0x0649] = "alefmaksuraarabic", -    [0x064A] = "yeharabic", -    [0x064B] = "fathatanarabic", -    [0x064C] = "dammatanarabic", -    [0x064D] = "kasratanarabic", -    [0x064E] = "fathalowarabic", -    [0x064F] = "dammalowarabic", -    [0x0650] = "kasraarabic", -    [0x0651] = "shaddafathatanarabic", -    [0x0652] = "sukunarabic", -    [0x0660] = "zerohackarabic", -    [0x0661] = "onehackarabic", -    [0x0662] = "twohackarabic", -    [0x0663] = "threehackarabic", -    [0x0664] = "fourhackarabic", -    [0x0665] = "fivehackarabic", -    [0x0666] = "sixhackarabic", -    [0x0667] = "sevenhackarabic", -    [0x0668] = "eighthackarabic", -    [0x0669] = "ninehackarabic", -    [0x066A] = "percentarabic", -    [0x066B] = "decimalseparatorpersian", -    [0x066C] = "thousandsseparatorpersian", -    [0x066D] = "asteriskarabic", -    [0x0679] = "tteharabic", -    [0x067E] = "peharabic", -    [0x0686] = "tcheharabic", -    [0x0688] = "ddalarabic", -    [0x0691] = "rreharabic", -    [0x0698] = "jeharabic", -    [0x06A4] = "veharabic", -    [0x06AF] = "gafarabic", -    [0x06BA] = "noonghunnaarabic", -    [0x06C1] = "hehaltonearabic", -    [0x06D1] = "yehthreedotsbelowarabic", -    [0x06D2] = "yehbarreearabic", -    [0x06D5] = "afii57534", -    [0x06F0] = "zeropersian", -    [0x06F1] = "onepersian", -    [0x06F2] = "twopersian", -    [0x06F3] = "threepersian", -    [0x06F4] = "fourpersian", -    [0x06F5] = "fivepersian", -    [0x06F6] = "sixpersian", -    [0x06F7] = "sevenpersian", -    [0x06F8] = "eightpersian", -    [0x06F9] = "ninepersian", -    [0x0901] = "candrabindudeva", -    [0x0902] = "anusvaradeva", -    [0x0903] = "visargadeva", -    [0x0905] = "adeva", -    [0x0906] = "aadeva", -    [0x0907] = "ideva", -    [0x0908] = "iideva", -    [0x0909] = "udeva", -    [0x090A] = "uudeva", -    [0x090B] = "rvocalicdeva", -    [0x090C] = "lvocalicdeva", -    [0x090D] = "ecandradeva", -    [0x090E] = "eshortdeva", -    [0x090F] = "edeva", -    [0x0910] = "aideva", -    [0x0911] = "ocandradeva", -    [0x0912] = "oshortdeva", -    [0x0913] = "odeva", -    [0x0914] = "audeva", -    [0x0915] = "kadeva", -    [0x0916] = "khadeva", -    [0x0917] = "gadeva", -    [0x0918] = "ghadeva", -    [0x0919] = "ngadeva", -    [0x091A] = "cadeva", -    [0x091B] = "chadeva", -    [0x091C] = "jadeva", -    [0x091D] = "jhadeva", -    [0x091E] = "nyadeva", -    [0x091F] = "ttadeva", -    [0x0920] = "tthadeva", -    [0x0921] = "ddadeva", -    [0x0922] = "ddhadeva", -    [0x0923] = "nnadeva", -    [0x0924] = "tadeva", -    [0x0925] = "thadeva", -    [0x0926] = "dadeva", -    [0x0927] = "dhadeva", -    [0x0928] = "nadeva", -    [0x0929] = "nnnadeva", -    [0x092A] = "padeva", -    [0x092B] = "phadeva", -    [0x092C] = "badeva", -    [0x092D] = "bhadeva", -    [0x092E] = "madeva", -    [0x092F] = "yadeva", -    [0x0930] = "radeva", -    [0x0931] = "rradeva", -    [0x0932] = "ladeva", -    [0x0933] = "lladeva", -    [0x0934] = "llladeva", -    [0x0935] = "vadeva", -    [0x0936] = "shadeva", -    [0x0937] = "ssadeva", -    [0x0938] = "sadeva", -    [0x0939] = "hadeva", -    [0x093C] = "nuktadeva", -    [0x093D] = "avagrahadeva", -    [0x093E] = "aavowelsigndeva", -    [0x093F] = "ivowelsigndeva", -    [0x0940] = "iivowelsigndeva", -    [0x0941] = "uvowelsigndeva", -    [0x0942] = "uuvowelsigndeva", -    [0x0943] = "rvocalicvowelsigndeva", -    [0x0944] = "rrvocalicvowelsigndeva", -    [0x0945] = "ecandravowelsigndeva", -    [0x0946] = "eshortvowelsigndeva", -    [0x0947] = "evowelsigndeva", -    [0x0948] = "aivowelsigndeva", -    [0x0949] = "ocandravowelsigndeva", -    [0x094A] = "oshortvowelsigndeva", -    [0x094B] = "ovowelsigndeva", -    [0x094C] = "auvowelsigndeva", -    [0x094D] = "viramadeva", -    [0x0950] = "omdeva", -    [0x0951] = "udattadeva", -    [0x0952] = "anudattadeva", -    [0x0953] = "gravedeva", -    [0x0954] = "acutedeva", -    [0x0958] = "qadeva", -    [0x0959] = "khhadeva", -    [0x095A] = "ghhadeva", -    [0x095B] = "zadeva", -    [0x095C] = "dddhadeva", -    [0x095D] = "rhadeva", -    [0x095E] = "fadeva", -    [0x095F] = "yyadeva", -    [0x0960] = "rrvocalicdeva", -    [0x0961] = "llvocalicdeva", -    [0x0962] = "lvocalicvowelsigndeva", -    [0x0963] = "llvocalicvowelsigndeva", -    [0x0964] = "danda", -    [0x0965] = "dbldanda", -    [0x0966] = "zerodeva", -    [0x0967] = "onedeva", -    [0x0968] = "twodeva", -    [0x0969] = "threedeva", -    [0x096A] = "fourdeva", -    [0x096B] = "fivedeva", -    [0x096C] = "sixdeva", -    [0x096D] = "sevendeva", -    [0x096E] = "eightdeva", -    [0x096F] = "ninedeva", -    [0x0970] = "abbreviationsigndeva", -    [0x0981] = "candrabindubengali", -    [0x0982] = "anusvarabengali", -    [0x0983] = "visargabengali", -    [0x0985] = "abengali", -    [0x0986] = "aabengali", -    [0x0987] = "ibengali", -    [0x0988] = "iibengali", -    [0x0989] = "ubengali", -    [0x098A] = "uubengali", -    [0x098B] = "rvocalicbengali", -    [0x098C] = "lvocalicbengali", -    [0x098F] = "ebengali", -    [0x0990] = "aibengali", -    [0x0993] = "obengali", -    [0x0994] = "aubengali", -    [0x0995] = "kabengali", -    [0x0996] = "khabengali", -    [0x0997] = "gabengali", -    [0x0998] = "ghabengali", -    [0x0999] = "ngabengali", -    [0x099A] = "cabengali", -    [0x099B] = "chabengali", -    [0x099C] = "jabengali", -    [0x099D] = "jhabengali", -    [0x099E] = "nyabengali", -    [0x099F] = "ttabengali", -    [0x09A0] = "tthabengali", -    [0x09A1] = "ddabengali", -    [0x09A2] = "ddhabengali", -    [0x09A3] = "nnabengali", -    [0x09A4] = "tabengali", -    [0x09A5] = "thabengali", -    [0x09A6] = "dabengali", -    [0x09A7] = "dhabengali", -    [0x09A8] = "nabengali", -    [0x09AA] = "pabengali", -    [0x09AB] = "phabengali", -    [0x09AC] = "babengali", -    [0x09AD] = "bhabengali", -    [0x09AE] = "mabengali", -    [0x09AF] = "yabengali", -    [0x09B0] = "rabengali", -    [0x09B2] = "labengali", -    [0x09B6] = "shabengali", -    [0x09B7] = "ssabengali", -    [0x09B8] = "sabengali", -    [0x09B9] = "habengali", -    [0x09BC] = "nuktabengali", -    [0x09BE] = "aavowelsignbengali", -    [0x09BF] = "ivowelsignbengali", -    [0x09C0] = "iivowelsignbengali", -    [0x09C1] = "uvowelsignbengali", -    [0x09C2] = "uuvowelsignbengali", -    [0x09C3] = "rvocalicvowelsignbengali", -    [0x09C4] = "rrvocalicvowelsignbengali", -    [0x09C7] = "evowelsignbengali", -    [0x09C8] = "aivowelsignbengali", -    [0x09CB] = "ovowelsignbengali", -    [0x09CC] = "auvowelsignbengali", -    [0x09CD] = "viramabengali", -    [0x09D7] = "aulengthmarkbengali", -    [0x09DC] = "rrabengali", -    [0x09DD] = "rhabengali", -    [0x09DF] = "yyabengali", -    [0x09E0] = "rrvocalicbengali", -    [0x09E1] = "llvocalicbengali", -    [0x09E2] = "lvocalicvowelsignbengali", -    [0x09E3] = "llvocalicvowelsignbengali", -    [0x09E6] = "zerobengali", -    [0x09E7] = "onebengali", -    [0x09E8] = "twobengali", -    [0x09E9] = "threebengali", -    [0x09EA] = "fourbengali", -    [0x09EB] = "fivebengali", -    [0x09EC] = "sixbengali", -    [0x09ED] = "sevenbengali", -    [0x09EE] = "eightbengali", -    [0x09EF] = "ninebengali", -    [0x09F0] = "ramiddlediagonalbengali", -    [0x09F1] = "ralowerdiagonalbengali", -    [0x09F2] = "rupeemarkbengali", -    [0x09F3] = "rupeesignbengali", -    [0x09F4] = "onenumeratorbengali", -    [0x09F5] = "twonumeratorbengali", -    [0x09F6] = "threenumeratorbengali", -    [0x09F7] = "fournumeratorbengali", -    [0x09F8] = "denominatorminusonenumeratorbengali", -    [0x09F9] = "sixteencurrencydenominatorbengali", -    [0x09FA] = "issharbengali", -    [0x0A02] = "bindigurmukhi", -    [0x0A05] = "agurmukhi", -    [0x0A06] = "aagurmukhi", -    [0x0A07] = "igurmukhi", -    [0x0A08] = "iigurmukhi", -    [0x0A09] = "ugurmukhi", -    [0x0A0A] = "uugurmukhi", -    [0x0A0F] = "eegurmukhi", -    [0x0A10] = "aigurmukhi", -    [0x0A13] = "oogurmukhi", -    [0x0A14] = "augurmukhi", -    [0x0A15] = "kagurmukhi", -    [0x0A16] = "khagurmukhi", -    [0x0A17] = "gagurmukhi", -    [0x0A18] = "ghagurmukhi", -    [0x0A19] = "ngagurmukhi", -    [0x0A1A] = "cagurmukhi", -    [0x0A1B] = "chagurmukhi", -    [0x0A1C] = "jagurmukhi", -    [0x0A1D] = "jhagurmukhi", -    [0x0A1E] = "nyagurmukhi", -    [0x0A1F] = "ttagurmukhi", -    [0x0A20] = "tthagurmukhi", -    [0x0A21] = "ddagurmukhi", -    [0x0A22] = "ddhagurmukhi", -    [0x0A23] = "nnagurmukhi", -    [0x0A24] = "tagurmukhi", -    [0x0A25] = "thagurmukhi", -    [0x0A26] = "dagurmukhi", -    [0x0A27] = "dhagurmukhi", -    [0x0A28] = "nagurmukhi", -    [0x0A2A] = "pagurmukhi", -    [0x0A2B] = "phagurmukhi", -    [0x0A2C] = "bagurmukhi", -    [0x0A2D] = "bhagurmukhi", -    [0x0A2E] = "magurmukhi", -    [0x0A2F] = "yagurmukhi", -    [0x0A30] = "ragurmukhi", -    [0x0A32] = "lagurmukhi", -    [0x0A35] = "vagurmukhi", -    [0x0A36] = "shagurmukhi", -    [0x0A38] = "sagurmukhi", -    [0x0A39] = "hagurmukhi", -    [0x0A3C] = "nuktagurmukhi", -    [0x0A3E] = "aamatragurmukhi", -    [0x0A3F] = "imatragurmukhi", -    [0x0A40] = "iimatragurmukhi", -    [0x0A41] = "umatragurmukhi", -    [0x0A42] = "uumatragurmukhi", -    [0x0A47] = "eematragurmukhi", -    [0x0A48] = "aimatragurmukhi", -    [0x0A4B] = "oomatragurmukhi", -    [0x0A4C] = "aumatragurmukhi", -    [0x0A4D] = "halantgurmukhi", -    [0x0A59] = "khhagurmukhi", -    [0x0A5A] = "ghhagurmukhi", -    [0x0A5B] = "zagurmukhi", -    [0x0A5C] = "rragurmukhi", -    [0x0A5E] = "fagurmukhi", -    [0x0A66] = "zerogurmukhi", -    [0x0A67] = "onegurmukhi", -    [0x0A68] = "twogurmukhi", -    [0x0A69] = "threegurmukhi", -    [0x0A6A] = "fourgurmukhi", -    [0x0A6B] = "fivegurmukhi", -    [0x0A6C] = "sixgurmukhi", -    [0x0A6D] = "sevengurmukhi", -    [0x0A6E] = "eightgurmukhi", -    [0x0A6F] = "ninegurmukhi", -    [0x0A70] = "tippigurmukhi", -    [0x0A71] = "addakgurmukhi", -    [0x0A72] = "irigurmukhi", -    [0x0A73] = "uragurmukhi", -    [0x0A74] = "ekonkargurmukhi", -    [0x0A81] = "candrabindugujarati", -    [0x0A82] = "anusvaragujarati", -    [0x0A83] = "visargagujarati", -    [0x0A85] = "agujarati", -    [0x0A86] = "aagujarati", -    [0x0A87] = "igujarati", -    [0x0A88] = "iigujarati", -    [0x0A89] = "ugujarati", -    [0x0A8A] = "uugujarati", -    [0x0A8B] = "rvocalicgujarati", -    [0x0A8D] = "ecandragujarati", -    [0x0A8F] = "egujarati", -    [0x0A90] = "aigujarati", -    [0x0A91] = "ocandragujarati", -    [0x0A93] = "ogujarati", -    [0x0A94] = "augujarati", -    [0x0A95] = "kagujarati", -    [0x0A96] = "khagujarati", -    [0x0A97] = "gagujarati", -    [0x0A98] = "ghagujarati", -    [0x0A99] = "ngagujarati", -    [0x0A9A] = "cagujarati", -    [0x0A9B] = "chagujarati", -    [0x0A9C] = "jagujarati", -    [0x0A9D] = "jhagujarati", -    [0x0A9E] = "nyagujarati", -    [0x0A9F] = "ttagujarati", -    [0x0AA0] = "tthagujarati", -    [0x0AA1] = "ddagujarati", -    [0x0AA2] = "ddhagujarati", -    [0x0AA3] = "nnagujarati", -    [0x0AA4] = "tagujarati", -    [0x0AA5] = "thagujarati", -    [0x0AA6] = "dagujarati", -    [0x0AA7] = "dhagujarati", -    [0x0AA8] = "nagujarati", -    [0x0AAA] = "pagujarati", -    [0x0AAB] = "phagujarati", -    [0x0AAC] = "bagujarati", -    [0x0AAD] = "bhagujarati", -    [0x0AAE] = "magujarati", -    [0x0AAF] = "yagujarati", -    [0x0AB0] = "ragujarati", -    [0x0AB2] = "lagujarati", -    [0x0AB3] = "llagujarati", -    [0x0AB5] = "vagujarati", -    [0x0AB6] = "shagujarati", -    [0x0AB7] = "ssagujarati", -    [0x0AB8] = "sagujarati", -    [0x0AB9] = "hagujarati", -    [0x0ABC] = "nuktagujarati", -    [0x0ABE] = "aavowelsigngujarati", -    [0x0ABF] = "ivowelsigngujarati", -    [0x0AC0] = "iivowelsigngujarati", -    [0x0AC1] = "uvowelsigngujarati", -    [0x0AC2] = "uuvowelsigngujarati", -    [0x0AC3] = "rvocalicvowelsigngujarati", -    [0x0AC4] = "rrvocalicvowelsigngujarati", -    [0x0AC5] = "ecandravowelsigngujarati", -    [0x0AC7] = "evowelsigngujarati", -    [0x0AC8] = "aivowelsigngujarati", -    [0x0AC9] = "ocandravowelsigngujarati", -    [0x0ACB] = "ovowelsigngujarati", -    [0x0ACC] = "auvowelsigngujarati", -    [0x0ACD] = "viramagujarati", -    [0x0AD0] = "omgujarati", -    [0x0AE0] = "rrvocalicgujarati", -    [0x0AE6] = "zerogujarati", -    [0x0AE7] = "onegujarati", -    [0x0AE8] = "twogujarati", -    [0x0AE9] = "threegujarati", -    [0x0AEA] = "fourgujarati", -    [0x0AEB] = "fivegujarati", -    [0x0AEC] = "sixgujarati", -    [0x0AED] = "sevengujarati", -    [0x0AEE] = "eightgujarati", -    [0x0AEF] = "ninegujarati", -    [0x0E01] = "kokaithai", -    [0x0E02] = "khokhaithai", -    [0x0E03] = "khokhuatthai", -    [0x0E04] = "khokhwaithai", -    [0x0E05] = "khokhonthai", -    [0x0E06] = "khorakhangthai", -    [0x0E07] = "ngonguthai", -    [0x0E08] = "chochanthai", -    [0x0E09] = "chochingthai", -    [0x0E0A] = "chochangthai", -    [0x0E0B] = "sosothai", -    [0x0E0C] = "chochoethai", -    [0x0E0D] = "yoyingthai", -    [0x0E0E] = "dochadathai", -    [0x0E0F] = "topatakthai", -    [0x0E10] = "thothanthai", -    [0x0E11] = "thonangmonthothai", -    [0x0E12] = "thophuthaothai", -    [0x0E13] = "nonenthai", -    [0x0E14] = "dodekthai", -    [0x0E15] = "totaothai", -    [0x0E16] = "thothungthai", -    [0x0E17] = "thothahanthai", -    [0x0E18] = "thothongthai", -    [0x0E19] = "nonuthai", -    [0x0E1A] = "bobaimaithai", -    [0x0E1B] = "poplathai", -    [0x0E1C] = "phophungthai", -    [0x0E1D] = "fofathai", -    [0x0E1E] = "phophanthai", -    [0x0E1F] = "fofanthai", -    [0x0E20] = "phosamphaothai", -    [0x0E21] = "momathai", -    [0x0E22] = "yoyakthai", -    [0x0E23] = "roruathai", -    [0x0E24] = "ruthai", -    [0x0E25] = "lolingthai", -    [0x0E26] = "luthai", -    [0x0E27] = "wowaenthai", -    [0x0E28] = "sosalathai", -    [0x0E29] = "sorusithai", -    [0x0E2A] = "sosuathai", -    [0x0E2B] = "hohipthai", -    [0x0E2C] = "lochulathai", -    [0x0E2D] = "oangthai", -    [0x0E2E] = "honokhukthai", -    [0x0E2F] = "paiyannoithai", -    [0x0E30] = "saraathai", -    [0x0E31] = "maihanakatthai", -    [0x0E32] = "saraaathai", -    [0x0E33] = "saraamthai", -    [0x0E34] = "saraithai", -    [0x0E35] = "saraiithai", -    [0x0E36] = "sarauethai", -    [0x0E37] = "saraueethai", -    [0x0E38] = "sarauthai", -    [0x0E39] = "sarauuthai", -    [0x0E3A] = "phinthuthai", -    [0x0E3F] = "bahtthai", -    [0x0E40] = "saraethai", -    [0x0E41] = "saraaethai", -    [0x0E42] = "saraothai", -    [0x0E43] = "saraaimaimuanthai", -    [0x0E44] = "saraaimaimalaithai", -    [0x0E45] = "lakkhangyaothai", -    [0x0E46] = "maiyamokthai", -    [0x0E47] = "maitaikhuthai", -    [0x0E48] = "maiekthai", -    [0x0E49] = "maithothai", -    [0x0E4A] = "maitrithai", -    [0x0E4B] = "maichattawathai", -    [0x0E4C] = "thanthakhatthai", -    [0x0E4D] = "nikhahitthai", -    [0x0E4E] = "yamakkanthai", -    [0x0E4F] = "fongmanthai", -    [0x0E50] = "zerothai", -    [0x0E51] = "onethai", -    [0x0E52] = "twothai", -    [0x0E53] = "threethai", -    [0x0E54] = "fourthai", -    [0x0E55] = "fivethai", -    [0x0E56] = "sixthai", -    [0x0E57] = "seventhai", -    [0x0E58] = "eightthai", -    [0x0E59] = "ninethai", -    [0x0E5A] = "angkhankhuthai", -    [0x0E5B] = "khomutthai", -    [0x1E00] = "Aringbelow", -    [0x1E01] = "aringbelow", -    [0x1E02] = "Bdotaccent", -    [0x1E03] = "bdotaccent", -    [0x1E04] = "Bdotbelow", -    [0x1E05] = "bdotbelow", -    [0x1E06] = "Blinebelow", -    [0x1E07] = "blinebelow", -    [0x1E08] = "Ccedillaacute", -    [0x1E09] = "ccedillaacute", -    [0x1E0A] = "Ddotaccent", -    [0x1E0B] = "ddotaccent", -    [0x1E0C] = "Ddotbelow", -    [0x1E0D] = "ddotbelow", -    [0x1E0E] = "Dlinebelow", -    [0x1E0F] = "dlinebelow", -    [0x1E10] = "Dcedilla", -    [0x1E11] = "dcedilla", -    [0x1E12] = "Dcircumflexbelow", -    [0x1E13] = "dcircumflexbelow", -    [0x1E14] = "Emacrongrave", -    [0x1E15] = "emacrongrave", -    [0x1E16] = "Emacronacute", -    [0x1E17] = "emacronacute", -    [0x1E18] = "Ecircumflexbelow", -    [0x1E19] = "ecircumflexbelow", -    [0x1E1A] = "Etildebelow", -    [0x1E1B] = "etildebelow", -    [0x1E1C] = "Ecedillabreve", -    [0x1E1D] = "ecedillabreve", -    [0x1E1E] = "Fdotaccent", -    [0x1E1F] = "fdotaccent", -    [0x1E20] = "Gmacron", -    [0x1E21] = "gmacron", -    [0x1E22] = "Hdotaccent", -    [0x1E23] = "hdotaccent", -    [0x1E24] = "Hdotbelow", -    [0x1E25] = "hdotbelow", -    [0x1E26] = "Hdieresis", -    [0x1E27] = "hdieresis", -    [0x1E28] = "Hcedilla", -    [0x1E29] = "hcedilla", -    [0x1E2A] = "Hbrevebelow", -    [0x1E2B] = "hbrevebelow", -    [0x1E2C] = "Itildebelow", -    [0x1E2D] = "itildebelow", -    [0x1E2E] = "Idieresisacute", -    [0x1E2F] = "idieresisacute", -    [0x1E30] = "Kacute", -    [0x1E31] = "kacute", -    [0x1E32] = "Kdotbelow", -    [0x1E33] = "kdotbelow", -    [0x1E34] = "Klinebelow", -    [0x1E35] = "klinebelow", -    [0x1E36] = "Ldotbelow", -    [0x1E37] = "ldotbelow", -    [0x1E38] = "Ldotbelowmacron", -    [0x1E39] = "ldotbelowmacron", -    [0x1E3A] = "Llinebelow", -    [0x1E3B] = "llinebelow", -    [0x1E3C] = "Lcircumflexbelow", -    [0x1E3D] = "lcircumflexbelow", -    [0x1E3E] = "Macute", -    [0x1E3F] = "macute", -    [0x1E40] = "Mdotaccent", -    [0x1E41] = "mdotaccent", -    [0x1E42] = "Mdotbelow", -    [0x1E43] = "mdotbelow", -    [0x1E44] = "Ndotaccent", -    [0x1E45] = "ndotaccent", -    [0x1E46] = "Ndotbelow", -    [0x1E47] = "ndotbelow", -    [0x1E48] = "Nlinebelow", -    [0x1E49] = "nlinebelow", -    [0x1E4A] = "Ncircumflexbelow", -    [0x1E4B] = "ncircumflexbelow", -    [0x1E4C] = "Otildeacute", -    [0x1E4D] = "otildeacute", -    [0x1E4E] = "Otildedieresis", -    [0x1E4F] = "otildedieresis", -    [0x1E50] = "Omacrongrave", -    [0x1E51] = "omacrongrave", -    [0x1E52] = "Omacronacute", -    [0x1E53] = "omacronacute", -    [0x1E54] = "Pacute", -    [0x1E55] = "pacute", -    [0x1E56] = "Pdotaccent", -    [0x1E57] = "pdotaccent", -    [0x1E58] = "Rdotaccent", -    [0x1E59] = "rdotaccent", -    [0x1E5A] = "Rdotbelow", -    [0x1E5B] = "rdotbelow", -    [0x1E5C] = "Rdotbelowmacron", -    [0x1E5D] = "rdotbelowmacron", -    [0x1E5E] = "Rlinebelow", -    [0x1E5F] = "rlinebelow", -    [0x1E60] = "Sdotaccent", -    [0x1E61] = "sdotaccent", -    [0x1E62] = "Sdotbelow", -    [0x1E63] = "sdotbelow", -    [0x1E64] = "Sacutedotaccent", -    [0x1E65] = "sacutedotaccent", -    [0x1E66] = "Scarondotaccent", -    [0x1E67] = "scarondotaccent", -    [0x1E68] = "Sdotbelowdotaccent", -    [0x1E69] = "sdotbelowdotaccent", -    [0x1E6A] = "Tdotaccent", -    [0x1E6B] = "tdotaccent", -    [0x1E6C] = "Tdotbelow", -    [0x1E6D] = "tdotbelow", -    [0x1E6E] = "Tlinebelow", -    [0x1E6F] = "tlinebelow", -    [0x1E70] = "Tcircumflexbelow", -    [0x1E71] = "tcircumflexbelow", -    [0x1E72] = "Udieresisbelow", -    [0x1E73] = "udieresisbelow", -    [0x1E74] = "Utildebelow", -    [0x1E75] = "utildebelow", -    [0x1E76] = "Ucircumflexbelow", -    [0x1E77] = "ucircumflexbelow", -    [0x1E78] = "Utildeacute", -    [0x1E79] = "utildeacute", -    [0x1E7A] = "Umacrondieresis", -    [0x1E7B] = "umacrondieresis", -    [0x1E7C] = "Vtilde", -    [0x1E7D] = "vtilde", -    [0x1E7E] = "Vdotbelow", -    [0x1E7F] = "vdotbelow", -    [0x1E80] = "Wgrave", -    [0x1E81] = "wgrave", -    [0x1E82] = "Wacute", -    [0x1E83] = "wacute", -    [0x1E84] = "Wdieresis", -    [0x1E85] = "wdieresis", -    [0x1E86] = "Wdotaccent", -    [0x1E87] = "wdotaccent", -    [0x1E88] = "Wdotbelow", -    [0x1E89] = "wdotbelow", -    [0x1E8A] = "Xdotaccent", -    [0x1E8B] = "xdotaccent", -    [0x1E8C] = "Xdieresis", -    [0x1E8D] = "xdieresis", -    [0x1E8E] = "Ydotaccent", -    [0x1E8F] = "ydotaccent", -    [0x1E90] = "Zcircumflex", -    [0x1E91] = "zcircumflex", -    [0x1E92] = "Zdotbelow", -    [0x1E93] = "zdotbelow", -    [0x1E94] = "Zlinebelow", -    [0x1E95] = "zlinebelow", -    [0x1E96] = "hlinebelow", -    [0x1E97] = "tdieresis", -    [0x1E98] = "wring", -    [0x1E99] = "yring", -    [0x1E9A] = "arighthalfring", -    [0x1E9B] = "slongdotaccent", -    [0x1EA0] = "Adotbelow", -    [0x1EA1] = "adotbelow", -    [0x1EA2] = "Ahookabove", -    [0x1EA3] = "ahookabove", -    [0x1EA4] = "Acircumflexacute", -    [0x1EA5] = "acircumflexacute", -    [0x1EA6] = "Acircumflexgrave", -    [0x1EA7] = "acircumflexgrave", -    [0x1EA8] = "Acircumflexhookabove", -    [0x1EA9] = "acircumflexhookabove", -    [0x1EAA] = "Acircumflextilde", -    [0x1EAB] = "acircumflextilde", -    [0x1EAC] = "Acircumflexdotbelow", -    [0x1EAD] = "acircumflexdotbelow", -    [0x1EAE] = "Abreveacute", -    [0x1EAF] = "abreveacute", -    [0x1EB0] = "Abrevegrave", -    [0x1EB1] = "abrevegrave", -    [0x1EB2] = "Abrevehookabove", -    [0x1EB3] = "abrevehookabove", -    [0x1EB4] = "Abrevetilde", -    [0x1EB5] = "abrevetilde", -    [0x1EB6] = "Abrevedotbelow", -    [0x1EB7] = "abrevedotbelow", -    [0x1EB8] = "Edotbelow", -    [0x1EB9] = "edotbelow", -    [0x1EBA] = "Ehookabove", -    [0x1EBB] = "ehookabove", -    [0x1EBC] = "Etilde", -    [0x1EBD] = "etilde", -    [0x1EBE] = "Ecircumflexacute", -    [0x1EBF] = "ecircumflexacute", -    [0x1EC0] = "Ecircumflexgrave", -    [0x1EC1] = "ecircumflexgrave", -    [0x1EC2] = "Ecircumflexhookabove", -    [0x1EC3] = "ecircumflexhookabove", -    [0x1EC4] = "Ecircumflextilde", -    [0x1EC5] = "ecircumflextilde", -    [0x1EC6] = "Ecircumflexdotbelow", -    [0x1EC7] = "ecircumflexdotbelow", -    [0x1EC8] = "Ihookabove", -    [0x1EC9] = "ihookabove", -    [0x1ECA] = "Idotbelow", -    [0x1ECB] = "idotbelow", -    [0x1ECC] = "Odotbelow", -    [0x1ECD] = "odotbelow", -    [0x1ECE] = "Ohookabove", -    [0x1ECF] = "ohookabove", -    [0x1ED0] = "Ocircumflexacute", -    [0x1ED1] = "ocircumflexacute", -    [0x1ED2] = "Ocircumflexgrave", -    [0x1ED3] = "ocircumflexgrave", -    [0x1ED4] = "Ocircumflexhookabove", -    [0x1ED5] = "ocircumflexhookabove", -    [0x1ED6] = "Ocircumflextilde", -    [0x1ED7] = "ocircumflextilde", -    [0x1ED8] = "Ocircumflexdotbelow", -    [0x1ED9] = "ocircumflexdotbelow", -    [0x1EDA] = "Ohornacute", -    [0x1EDB] = "ohornacute", -    [0x1EDC] = "Ohorngrave", -    [0x1EDD] = "ohorngrave", -    [0x1EDE] = "Ohornhookabove", -    [0x1EDF] = "ohornhookabove", -    [0x1EE0] = "Ohorntilde", -    [0x1EE1] = "ohorntilde", -    [0x1EE2] = "Ohorndotbelow", -    [0x1EE3] = "ohorndotbelow", -    [0x1EE4] = "Udotbelow", -    [0x1EE5] = "udotbelow", -    [0x1EE6] = "Uhookabove", -    [0x1EE7] = "uhookabove", -    [0x1EE8] = "Uhornacute", -    [0x1EE9] = "uhornacute", -    [0x1EEA] = "Uhorngrave", -    [0x1EEB] = "uhorngrave", -    [0x1EEC] = "Uhornhookabove", -    [0x1EED] = "uhornhookabove", -    [0x1EEE] = "Uhorntilde", -    [0x1EEF] = "uhorntilde", -    [0x1EF0] = "Uhorndotbelow", -    [0x1EF1] = "uhorndotbelow", -    [0x1EF2] = "Ygrave", -    [0x1EF3] = "ygrave", -    [0x1EF4] = "Ydotbelow", -    [0x1EF5] = "ydotbelow", -    [0x1EF6] = "Yhookabove", -    [0x1EF7] = "yhookabove", -    [0x1EF8] = "Ytilde", -    [0x1EF9] = "ytilde", -    [0x2002] = "enspace", -    [0x200B] = "zerowidthspace", -    [0x200C] = "zerowidthnonjoiner", -    [0x200D] = "afii301", -    [0x200E] = "afii299", -    [0x200F] = "afii300", -    [0x2010] = "hyphentwo", -    [0x2012] = "figuredash", -    [0x2013] = "endash", -    [0x2014] = "emdash", -    [0x2015] = "horizontalbar", -    [0x2016] = "dblverticalbar", -    [0x2017] = "underscoredbl", -    [0x2018] = "quoteleft", -    [0x2019] = "quoteright", -    [0x201A] = "quotesinglbase", -    [0x201B] = "quotereversed", -    [0x201C] = "quotedblleft", -    [0x201D] = "quotedblright", -    [0x201E] = "quotedblbase", -    [0x2020] = "dagger", -    [0x2021] = "daggerdbl", -    [0x2022] = "bullet", -    [0x2024] = "onedotenleader", -    [0x2025] = "twodotleader", -    [0x2026] = "ellipsis", -    [0x202C] = "afii61573", -    [0x202D] = "afii61574", -    [0x202E] = "afii61575", -    [0x2030] = "perthousand", -    [0x2032] = "minute", -    [0x2033] = "second", -    [0x2035] = "primereversed", -    [0x2039] = "guilsinglleft", -    [0x203A] = "guilsinglright", -    [0x203B] = "referencemark", -    [0x203C] = "exclamdbl", -    [0x203E] = "overline", -    [0x2042] = "asterism", -    [0x2044] = "fraction", -    [0x2070] = "zerosuperior", -    [0x2074] = "foursuperior", -    [0x2075] = "fivesuperior", -    [0x2076] = "sixsuperior", -    [0x2077] = "sevensuperior", -    [0x2078] = "eightsuperior", -    [0x2079] = "ninesuperior", -    [0x207A] = "plussuperior", -    [0x207C] = "equalsuperior", -    [0x207D] = "parenleftsuperior", -    [0x207E] = "parenrightsuperior", -    [0x207F] = "nsuperior", -    [0x2080] = "zeroinferior", -    [0x2081] = "oneinferior", -    [0x2082] = "twoinferior", -    [0x2083] = "threeinferior", -    [0x2084] = "fourinferior", -    [0x2085] = "fiveinferior", -    [0x2086] = "sixinferior", -    [0x2087] = "seveninferior", -    [0x2088] = "eightinferior", -    [0x2089] = "nineinferior", -    [0x208D] = "parenleftinferior", -    [0x208E] = "parenrightinferior", -    [0x20A1] = "colonsign", -    [0x20A2] = "cruzeiro", -    [0x20A3] = "franc", -    [0x20A4] = "lira", -    [0x20A7] = "peseta", -    [0x20A9] = "won", -    [0x20AA] = "sheqelhebrew", -    [0x20AB] = "dong", -    [0x20AC] = "euro", -    [0x2103] = "centigrade", -    [0x2105] = "careof", -    [0x2109] = "fahrenheit", -    [0x2111] = "Ifraktur", -    [0x2113] = "lsquare", -    [0x2116] = "numero", -    [0x2118] = "weierstrass", -    [0x211C] = "Rfraktur", -    [0x211E] = "prescription", -    [0x2121] = "telephone", -    [0x2122] = "trademark", -    [0x2126] = "Omega", -    [0x212B] = "angstrom", -    [0x212E] = "estimated", -    [0x2135] = "aleph", -    [0x2153] = "onethird", -    [0x2154] = "twothirds", -    [0x215B] = "oneeighth", -    [0x215C] = "threeeighths", -    [0x215D] = "fiveeighths", -    [0x215E] = "seveneighths", -    [0x2160] = "Oneroman", -    [0x2161] = "Tworoman", -    [0x2162] = "Threeroman", -    [0x2163] = "Fourroman", -    [0x2164] = "Fiveroman", -    [0x2165] = "Sixroman", -    [0x2166] = "Sevenroman", -    [0x2167] = "Eightroman", -    [0x2168] = "Nineroman", -    [0x2169] = "Tenroman", -    [0x216A] = "Elevenroman", -    [0x216B] = "Twelveroman", -    [0x2170] = "oneroman", -    [0x2171] = "tworoman", -    [0x2172] = "threeroman", -    [0x2173] = "fourroman", -    [0x2174] = "fiveroman", -    [0x2175] = "sixroman", -    [0x2176] = "sevenroman", -    [0x2177] = "eightroman", -    [0x2178] = "nineroman", -    [0x2179] = "tenroman", -    [0x217A] = "elevenroman", -    [0x217B] = "twelveroman", -    [0x2190] = "arrowleft", -    [0x2191] = "arrowup", -    [0x2192] = "arrowright", -    [0x2193] = "arrowdown", -    [0x2194] = "arrowboth", -    [0x2195] = "arrowupdn", -    [0x2196] = "arrowupleft", -    [0x2197] = "arrowupright", -    [0x2198] = "arrowdownright", -    [0x2199] = "arrowdownleft", -    [0x21A8] = "arrowupdownbase", -    [0x21B5] = "carriagereturn", -    [0x21BC] = "harpoonleftbarbup", -    [0x21C0] = "harpoonrightbarbup", -    [0x21C4] = "arrowrightoverleft", -    [0x21C5] = "arrowupleftofdown", -    [0x21C6] = "arrowleftoverright", -    [0x21CD] = "arrowleftdblstroke", -    [0x21CF] = "arrowrightdblstroke", -    [0x21D0] = "arrowleftdbl", -    [0x21D1] = "arrowdblup", -    [0x21D2] = "dblarrowright", -    [0x21D3] = "arrowdbldown", -    [0x21D4] = "dblarrowleft", -    [0x21DE] = "pageup", -    [0x21DF] = "pagedown", -    [0x21E0] = "arrowdashleft", -    [0x21E1] = "arrowdashup", -    [0x21E2] = "arrowdashright", -    [0x21E3] = "arrowdashdown", -    [0x21E4] = "arrowtableft", -    [0x21E5] = "arrowtabright", -    [0x21E6] = "arrowleftwhite", -    [0x21E7] = "arrowupwhite", -    [0x21E8] = "arrowrightwhite", -    [0x21E9] = "arrowdownwhite", -    [0x21EA] = "capslock", -    [0x2200] = "universal", -    [0x2202] = "partialdiff", -    [0x2203] = "thereexists", -    [0x2205] = "emptyset", -    [0x2206] = "increment", -    [0x2207] = "nabla", -    [0x2208] = "element", -    [0x2209] = "notelementof", -    [0x220B] = "suchthat", -    [0x220C] = "notcontains", -    [0x220F] = "product", -    [0x2211] = "summation", -    [0x2212] = "minus", -    [0x2213] = "minusplus", -    [0x2215] = "divisionslash", -    [0x2217] = "asteriskmath", -    [0x2219] = "bulletoperator", -    [0x221A] = "radical", -    [0x221D] = "proportional", -    [0x221E] = "infinity", -    [0x221F] = "rightangle", -    [0x2220] = "angle", -    [0x2223] = "divides", -    [0x2225] = "parallel", -    [0x2226] = "notparallel", -    [0x2227] = "logicaland", -    [0x2228] = "logicalor", -    [0x2229] = "intersection", -    [0x222A] = "union", -    [0x222B] = "integral", -    [0x222C] = "dblintegral", -    [0x222E] = "contourintegral", -    [0x2234] = "therefore", -    [0x2235] = "because", -    [0x2236] = "ratio", -    [0x2237] = "proportion", -    [0x223C] = "tildeoperator", -    [0x223D] = "reversedtilde", -    [0x2243] = "asymptoticallyequal", -    [0x2245] = "congruent", -    [0x2248] = "approxequal", -    [0x224C] = "allequal", -    [0x2250] = "approaches", -    [0x2251] = "geometricallyequal", -    [0x2252] = "approxequalorimage", -    [0x2253] = "imageorapproximatelyequal", -    [0x2260] = "notequal", -    [0x2261] = "equivalence", -    [0x2262] = "notidentical", -    [0x2264] = "lessequal", -    [0x2265] = "greaterequal", -    [0x2266] = "lessoverequal", -    [0x2267] = "greateroverequal", -    [0x226A] = "muchless", -    [0x226B] = "muchgreater", -    [0x226E] = "notless", -    [0x226F] = "notgreater", -    [0x2270] = "notlessnorequal", -    [0x2271] = "notgreaternorequal", -    [0x2272] = "lessorequivalent", -    [0x2273] = "greaterorequivalent", -    [0x2276] = "lessorgreater", -    [0x2277] = "greaterorless", -    [0x2279] = "notgreaternorless", -    [0x227A] = "precedes", -    [0x227B] = "succeeds", -    [0x2280] = "notprecedes", -    [0x2281] = "notsucceeds", -    [0x2282] = "subset", -    [0x2283] = "superset", -    [0x2284] = "notsubset", -    [0x2285] = "notsuperset", -    [0x2286] = "subsetorequal", -    [0x2287] = "supersetorequal", -    [0x228A] = "subsetnotequal", -    [0x228B] = "supersetnotequal", -    [0x2295] = "pluscircle", -    [0x2296] = "minuscircle", -    [0x2297] = "timescircle", -    [0x2299] = "circleot", -    [0x22A3] = "tackleft", -    [0x22A4] = "tackdown", -    [0x22A5] = "perpendicular", -    [0x22BF] = "righttriangle", -    [0x22C5] = "dotmath", -    [0x22CE] = "curlyor", -    [0x22CF] = "curlyand", -    [0x22DA] = "lessequalorgreater", -    [0x22DB] = "greaterequalorless", -    [0x22EE] = "ellipsisvertical", -    [0x2302] = "house", -    [0x2303] = "control", -    [0x2305] = "projective", -    [0x2310] = "revlogicalnot", -    [0x2312] = "arc", -    [0x2318] = "propellor", -    [0x2320] = "integraltp", -    [0x2321] = "integralbt", -    [0x2325] = "option", -    [0x2326] = "deleteright", -    [0x2327] = "clear", -    [0x2329] = "angleleft", -    [0x232A] = "angleright", -    [0x232B] = "deleteleft", -    [0x2423] = "blank", -    [0x2460] = "onecircle", -    [0x2461] = "twocircle", -    [0x2462] = "threecircle", -    [0x2463] = "fourcircle", -    [0x2464] = "fivecircle", -    [0x2465] = "sixcircle", -    [0x2466] = "sevencircle", -    [0x2467] = "eightcircle", -    [0x2468] = "ninecircle", -    [0x2469] = "tencircle", -    [0x246A] = "elevencircle", -    [0x246B] = "twelvecircle", -    [0x246C] = "thirteencircle", -    [0x246D] = "fourteencircle", -    [0x246E] = "fifteencircle", -    [0x246F] = "sixteencircle", -    [0x2470] = "seventeencircle", -    [0x2471] = "eighteencircle", -    [0x2472] = "nineteencircle", -    [0x2473] = "twentycircle", -    [0x2474] = "oneparen", -    [0x2475] = "twoparen", -    [0x2476] = "threeparen", -    [0x2477] = "fourparen", -    [0x2478] = "fiveparen", -    [0x2479] = "sixparen", -    [0x247A] = "sevenparen", -    [0x247B] = "eightparen", -    [0x247C] = "nineparen", -    [0x247D] = "tenparen", -    [0x247E] = "elevenparen", -    [0x247F] = "twelveparen", -    [0x2480] = "thirteenparen", -    [0x2481] = "fourteenparen", -    [0x2482] = "fifteenparen", -    [0x2483] = "sixteenparen", -    [0x2484] = "seventeenparen", -    [0x2485] = "eighteenparen", -    [0x2486] = "nineteenparen", -    [0x2487] = "twentyparen", -    [0x2488] = "oneperiod", -    [0x2489] = "twoperiod", -    [0x248A] = "threeperiod", -    [0x248B] = "fourperiod", -    [0x248C] = "fiveperiod", -    [0x248D] = "sixperiod", -    [0x248E] = "sevenperiod", -    [0x248F] = "eightperiod", -    [0x2490] = "nineperiod", -    [0x2491] = "tenperiod", -    [0x2492] = "elevenperiod", -    [0x2493] = "twelveperiod", -    [0x2494] = "thirteenperiod", -    [0x2495] = "fourteenperiod", -    [0x2496] = "fifteenperiod", -    [0x2497] = "sixteenperiod", -    [0x2498] = "seventeenperiod", -    [0x2499] = "eighteenperiod", -    [0x249A] = "nineteenperiod", -    [0x249B] = "twentyperiod", -    [0x249C] = "aparen", -    [0x249D] = "bparen", -    [0x249E] = "cparen", -    [0x249F] = "dparen", -    [0x24A0] = "eparen", -    [0x24A1] = "fparen", -    [0x24A2] = "gparen", -    [0x24A3] = "hparen", -    [0x24A4] = "iparen", -    [0x24A5] = "jparen", -    [0x24A6] = "kparen", -    [0x24A7] = "lparen", -    [0x24A8] = "mparen", -    [0x24A9] = "nparen", -    [0x24AA] = "oparen", -    [0x24AB] = "pparen", -    [0x24AC] = "qparen", -    [0x24AD] = "rparen", -    [0x24AE] = "sparen", -    [0x24AF] = "tparen", -    [0x24B0] = "uparen", -    [0x24B1] = "vparen", -    [0x24B2] = "wparen", -    [0x24B3] = "xparen", -    [0x24B4] = "yparen", -    [0x24B5] = "zparen", -    [0x24B6] = "Acircle", -    [0x24B7] = "Bcircle", -    [0x24B8] = "Ccircle", -    [0x24B9] = "Dcircle", -    [0x24BA] = "Ecircle", -    [0x24BB] = "Fcircle", -    [0x24BC] = "Gcircle", -    [0x24BD] = "Hcircle", -    [0x24BE] = "Icircle", -    [0x24BF] = "Jcircle", -    [0x24C0] = "Kcircle", -    [0x24C1] = "Lcircle", -    [0x24C2] = "Mcircle", -    [0x24C3] = "Ncircle", -    [0x24C4] = "Ocircle", -    [0x24C5] = "Pcircle", -    [0x24C6] = "Qcircle", -    [0x24C7] = "Rcircle", -    [0x24C8] = "Scircle", -    [0x24C9] = "Tcircle", -    [0x24CA] = "Ucircle", -    [0x24CB] = "Vcircle", -    [0x24CC] = "Wcircle", -    [0x24CD] = "Xcircle", -    [0x24CE] = "Ycircle", -    [0x24CF] = "Zcircle", -    [0x24D0] = "acircle", -    [0x24D1] = "bcircle", -    [0x24D2] = "ccircle", -    [0x24D3] = "dcircle", -    [0x24D4] = "ecircle", -    [0x24D5] = "fcircle", -    [0x24D6] = "gcircle", -    [0x24D7] = "hcircle", -    [0x24D8] = "icircle", -    [0x24D9] = "jcircle", -    [0x24DA] = "kcircle", -    [0x24DB] = "lcircle", -    [0x24DC] = "mcircle", -    [0x24DD] = "ncircle", -    [0x24DE] = "ocircle", -    [0x24DF] = "pcircle", -    [0x24E0] = "qcircle", -    [0x24E1] = "rcircle", -    [0x24E2] = "scircle", -    [0x24E3] = "tcircle", -    [0x24E4] = "ucircle", -    [0x24E5] = "vcircle", -    [0x24E6] = "wcircle", -    [0x24E7] = "xcircle", -    [0x24E8] = "ycircle", -    [0x24E9] = "zcircle", -    [0x2500] = "SF100000", -    [0x2502] = "SF110000", -    [0x250C] = "SF010000", -    [0x2510] = "SF030000", -    [0x2514] = "SF020000", -    [0x2518] = "SF040000", -    [0x251C] = "SF080000", -    [0x2524] = "SF090000", -    [0x252C] = "SF060000", -    [0x2534] = "SF070000", -    [0x253C] = "SF050000", -    [0x2550] = "SF430000", -    [0x2551] = "SF240000", -    [0x2552] = "SF510000", -    [0x2553] = "SF520000", -    [0x2554] = "SF390000", -    [0x2555] = "SF220000", -    [0x2556] = "SF210000", -    [0x2557] = "SF250000", -    [0x2558] = "SF500000", -    [0x2559] = "SF490000", -    [0x255A] = "SF380000", -    [0x255B] = "SF280000", -    [0x255C] = "SF270000", -    [0x255D] = "SF260000", -    [0x255E] = "SF360000", -    [0x255F] = "SF370000", -    [0x2560] = "SF420000", -    [0x2561] = "SF190000", -    [0x2562] = "SF200000", -    [0x2563] = "SF230000", -    [0x2564] = "SF470000", -    [0x2565] = "SF480000", -    [0x2566] = "SF410000", -    [0x2567] = "SF450000", -    [0x2568] = "SF460000", -    [0x2569] = "SF400000", -    [0x256A] = "SF540000", -    [0x256B] = "SF530000", -    [0x256C] = "SF440000", -    [0x2580] = "upblock", -    [0x2584] = "dnblock", -    [0x2588] = "block", -    [0x258C] = "lfblock", -    [0x2590] = "rtblock", -    [0x2591] = "shadelight", -    [0x2592] = "shademedium", -    [0x2593] = "shadedark", -    [0x25A0] = "filledbox", -    [0x25A1] = "whitesquare", -    [0x25A3] = "squarewhitewithsmallblack", -    [0x25A4] = "squarehorizontalfill", -    [0x25A5] = "squareverticalfill", -    [0x25A6] = "squareorthogonalcrosshatchfill", -    [0x25A7] = "squareupperlefttolowerrightfill", -    [0x25A8] = "squareupperrighttolowerleftfill", -    [0x25A9] = "squarediagonalcrosshatchfill", -    [0x25AA] = "blacksmallsquare", -    [0x25AB] = "whitesmallsquare", -    [0x25AC] = "filledrect", -    [0x25B2] = "triagup", -    [0x25B3] = "whiteuppointingtriangle", -    [0x25B4] = "blackuppointingsmalltriangle", -    [0x25B5] = "whiteuppointingsmalltriangle", -    [0x25B6] = "blackrightpointingtriangle", -    [0x25B7] = "whiterightpointingtriangle", -    [0x25B9] = "whiterightpointingsmalltriangle", -    [0x25BA] = "triagrt", -    [0x25BC] = "triagdn", -    [0x25BD] = "whitedownpointingtriangle", -    [0x25BF] = "whitedownpointingsmalltriangle", -    [0x25C0] = "blackleftpointingtriangle", -    [0x25C1] = "whiteleftpointingtriangle", -    [0x25C3] = "whiteleftpointingsmalltriangle", -    [0x25C4] = "triaglf", -    [0x25C6] = "blackdiamond", -    [0x25C7] = "whitediamond", -    [0x25C8] = "whitediamondcontainingblacksmalldiamond", -    [0x25C9] = "fisheye", -    [0x25CA] = "lozenge", -    [0x25CB] = "whitecircle", -    [0x25CC] = "dottedcircle", -    [0x25CE] = "bullseye", -    [0x25CF] = "blackcircle", -    [0x25D0] = "circlewithlefthalfblack", -    [0x25D1] = "circlewithrighthalfblack", -    [0x25D8] = "invbullet", -    [0x25D9] = "whitecircleinverse", -    [0x25E2] = "blacklowerrighttriangle", -    [0x25E3] = "blacklowerlefttriangle", -    [0x25E4] = "blackupperlefttriangle", -    [0x25E5] = "blackupperrighttriangle", -    [0x25E6] = "whitebullet", -    [0x25EF] = "largecircle", -    [0x2605] = "blackstar", -    [0x2606] = "whitestar", -    [0x260E] = "telephoneblack", -    [0x260F] = "whitetelephone", -    [0x261C] = "pointingindexleftwhite", -    [0x261D] = "pointingindexupwhite", -    [0x261E] = "pointingindexrightwhite", -    [0x261F] = "pointingindexdownwhite", -    [0x262F] = "yinyang", -    [0x263A] = "whitesmilingface", -    [0x263B] = "invsmileface", -    [0x263C] = "sun", -    [0x2640] = "venus", -    [0x2641] = "earth", -    [0x2642] = "mars", -    [0x2660] = "spadesuitblack", -    [0x2661] = "heartsuitwhite", -    [0x2662] = "diamondsuitwhite", -    [0x2663] = "clubsuitblack", -    [0x2664] = "spadesuitwhite", -    [0x2665] = "heartsuitblack", -    [0x2666] = "diamond", -    [0x2667] = "clubsuitwhite", -    [0x2668] = "hotsprings", -    [0x2669] = "quarternote", -    [0x266A] = "musicalnote", -    [0x266B] = "musicalnotedbl", -    [0x266C] = "beamedsixteenthnotes", -    [0x266D] = "musicflatsign", -    [0x266F] = "musicsharpsign", -    [0x2713] = "checkmark", -    [0x278A] = "onecircleinversesansserif", -    [0x278B] = "twocircleinversesansserif", -    [0x278C] = "threecircleinversesansserif", -    [0x278D] = "fourcircleinversesansserif", -    [0x278E] = "fivecircleinversesansserif", -    [0x278F] = "sixcircleinversesansserif", -    [0x2790] = "sevencircleinversesansserif", -    [0x2791] = "eightcircleinversesansserif", -    [0x2792] = "ninecircleinversesansserif", -    [0x279E] = "arrowrightheavy", -    [0x3000] = "ideographicspace", -    [0x3001] = "ideographiccomma", -    [0x3002] = "ideographicperiod", -    [0x3003] = "dittomark", -    [0x3004] = "jis", -    [0x3005] = "ideographiciterationmark", -    [0x3006] = "ideographicclose", -    [0x3007] = "ideographiczero", -    [0x3008] = "anglebracketleft", -    [0x3009] = "anglebracketright", -    [0x300A] = "dblanglebracketleft", -    [0x300B] = "dblanglebracketright", -    [0x300C] = "cornerbracketleft", -    [0x300D] = "cornerbracketright", -    [0x300E] = "whitecornerbracketleft", -    [0x300F] = "whitecornerbracketright", -    [0x3010] = "blacklenticularbracketleft", -    [0x3011] = "blacklenticularbracketright", -    [0x3012] = "postalmark", -    [0x3013] = "getamark", -    [0x3014] = "tortoiseshellbracketleft", -    [0x3015] = "tortoiseshellbracketright", -    [0x3016] = "whitelenticularbracketleft", -    [0x3017] = "whitelenticularbracketright", -    [0x3018] = "whitetortoiseshellbracketleft", -    [0x3019] = "whitetortoiseshellbracketright", -    [0x301C] = "wavedash", -    [0x301D] = "quotedblprimereversed", -    [0x301E] = "quotedblprime", -    [0x3020] = "postalmarkface", -    [0x3021] = "onehangzhou", -    [0x3022] = "twohangzhou", -    [0x3023] = "threehangzhou", -    [0x3024] = "fourhangzhou", -    [0x3025] = "fivehangzhou", -    [0x3026] = "sixhangzhou", -    [0x3027] = "sevenhangzhou", -    [0x3028] = "eighthangzhou", -    [0x3029] = "ninehangzhou", -    [0x3036] = "circlepostalmark", -    [0x3041] = "asmallhiragana", -    [0x3042] = "ahiragana", -    [0x3043] = "ismallhiragana", -    [0x3044] = "ihiragana", -    [0x3045] = "usmallhiragana", -    [0x3046] = "uhiragana", -    [0x3047] = "esmallhiragana", -    [0x3048] = "ehiragana", -    [0x3049] = "osmallhiragana", -    [0x304A] = "ohiragana", -    [0x304B] = "kahiragana", -    [0x304C] = "gahiragana", -    [0x304D] = "kihiragana", -    [0x304E] = "gihiragana", -    [0x304F] = "kuhiragana", -    [0x3050] = "guhiragana", -    [0x3051] = "kehiragana", -    [0x3052] = "gehiragana", -    [0x3053] = "kohiragana", -    [0x3054] = "gohiragana", -    [0x3055] = "sahiragana", -    [0x3056] = "zahiragana", -    [0x3057] = "sihiragana", -    [0x3058] = "zihiragana", -    [0x3059] = "suhiragana", -    [0x305A] = "zuhiragana", -    [0x305B] = "sehiragana", -    [0x305C] = "zehiragana", -    [0x305D] = "sohiragana", -    [0x305E] = "zohiragana", -    [0x305F] = "tahiragana", -    [0x3060] = "dahiragana", -    [0x3061] = "tihiragana", -    [0x3062] = "dihiragana", -    [0x3063] = "tusmallhiragana", -    [0x3064] = "tuhiragana", -    [0x3065] = "duhiragana", -    [0x3066] = "tehiragana", -    [0x3067] = "dehiragana", -    [0x3068] = "tohiragana", -    [0x3069] = "dohiragana", -    [0x306A] = "nahiragana", -    [0x306B] = "nihiragana", -    [0x306C] = "nuhiragana", -    [0x306D] = "nehiragana", -    [0x306E] = "nohiragana", -    [0x306F] = "hahiragana", -    [0x3070] = "bahiragana", -    [0x3071] = "pahiragana", -    [0x3072] = "hihiragana", -    [0x3073] = "bihiragana", -    [0x3074] = "pihiragana", -    [0x3075] = "huhiragana", -    [0x3076] = "buhiragana", -    [0x3077] = "puhiragana", -    [0x3078] = "hehiragana", -    [0x3079] = "behiragana", -    [0x307A] = "pehiragana", -    [0x307B] = "hohiragana", -    [0x307C] = "bohiragana", -    [0x307D] = "pohiragana", -    [0x307E] = "mahiragana", -    [0x307F] = "mihiragana", -    [0x3080] = "muhiragana", -    [0x3081] = "mehiragana", -    [0x3082] = "mohiragana", -    [0x3083] = "yasmallhiragana", -    [0x3084] = "yahiragana", -    [0x3085] = "yusmallhiragana", -    [0x3086] = "yuhiragana", -    [0x3087] = "yosmallhiragana", -    [0x3088] = "yohiragana", -    [0x3089] = "rahiragana", -    [0x308A] = "rihiragana", -    [0x308B] = "ruhiragana", -    [0x308C] = "rehiragana", -    [0x308D] = "rohiragana", -    [0x308E] = "wasmallhiragana", -    [0x308F] = "wahiragana", -    [0x3090] = "wihiragana", -    [0x3091] = "wehiragana", -    [0x3092] = "wohiragana", -    [0x3093] = "nhiragana", -    [0x3094] = "vuhiragana", -    [0x309B] = "voicedmarkkana", -    [0x309C] = "semivoicedmarkkana", -    [0x309D] = "iterationhiragana", -    [0x309E] = "voicediterationhiragana", -    [0x30A1] = "asmallkatakana", -    [0x30A2] = "akatakana", -    [0x30A3] = "ismallkatakana", -    [0x30A4] = "ikatakana", -    [0x30A5] = "usmallkatakana", -    [0x30A6] = "ukatakana", -    [0x30A7] = "esmallkatakana", -    [0x30A8] = "ekatakana", -    [0x30A9] = "osmallkatakana", -    [0x30AA] = "okatakana", -    [0x30AB] = "kakatakana", -    [0x30AC] = "gakatakana", -    [0x30AD] = "kikatakana", -    [0x30AE] = "gikatakana", -    [0x30AF] = "kukatakana", -    [0x30B0] = "gukatakana", -    [0x30B1] = "kekatakana", -    [0x30B2] = "gekatakana", -    [0x30B3] = "kokatakana", -    [0x30B4] = "gokatakana", -    [0x30B5] = "sakatakana", -    [0x30B6] = "zakatakana", -    [0x30B7] = "sikatakana", -    [0x30B8] = "zikatakana", -    [0x30B9] = "sukatakana", -    [0x30BA] = "zukatakana", -    [0x30BB] = "sekatakana", -    [0x30BC] = "zekatakana", -    [0x30BD] = "sokatakana", -    [0x30BE] = "zokatakana", -    [0x30BF] = "takatakana", -    [0x30C0] = "dakatakana", -    [0x30C1] = "tikatakana", -    [0x30C2] = "dikatakana", -    [0x30C3] = "tusmallkatakana", -    [0x30C4] = "tukatakana", -    [0x30C5] = "dukatakana", -    [0x30C6] = "tekatakana", -    [0x30C7] = "dekatakana", -    [0x30C8] = "tokatakana", -    [0x30C9] = "dokatakana", -    [0x30CA] = "nakatakana", -    [0x30CB] = "nikatakana", -    [0x30CC] = "nukatakana", -    [0x30CD] = "nekatakana", -    [0x30CE] = "nokatakana", -    [0x30CF] = "hakatakana", -    [0x30D0] = "bakatakana", -    [0x30D1] = "pakatakana", -    [0x30D2] = "hikatakana", -    [0x30D3] = "bikatakana", -    [0x30D4] = "pikatakana", -    [0x30D5] = "hukatakana", -    [0x30D6] = "bukatakana", -    [0x30D7] = "pukatakana", -    [0x30D8] = "hekatakana", -    [0x30D9] = "bekatakana", -    [0x30DA] = "pekatakana", -    [0x30DB] = "hokatakana", -    [0x30DC] = "bokatakana", -    [0x30DD] = "pokatakana", -    [0x30DE] = "makatakana", -    [0x30DF] = "mikatakana", -    [0x30E0] = "mukatakana", -    [0x30E1] = "mekatakana", -    [0x30E2] = "mokatakana", -    [0x30E3] = "yasmallkatakana", -    [0x30E4] = "yakatakana", -    [0x30E5] = "yusmallkatakana", -    [0x30E6] = "yukatakana", -    [0x30E7] = "yosmallkatakana", -    [0x30E8] = "yokatakana", -    [0x30E9] = "rakatakana", -    [0x30EA] = "rikatakana", -    [0x30EB] = "rukatakana", -    [0x30EC] = "rekatakana", -    [0x30ED] = "rokatakana", -    [0x30EE] = "wasmallkatakana", -    [0x30EF] = "wakatakana", -    [0x30F0] = "wikatakana", -    [0x30F1] = "wekatakana", -    [0x30F2] = "wokatakana", -    [0x30F3] = "nkatakana", -    [0x30F4] = "vukatakana", -    [0x30F5] = "kasmallkatakana", -    [0x30F6] = "kesmallkatakana", -    [0x30F7] = "vakatakana", -    [0x30F8] = "vikatakana", -    [0x30F9] = "vekatakana", -    [0x30FA] = "vokatakana", -    [0x30FB] = "dotkatakana", -    [0x30FC] = "prolongedkana", -    [0x30FD] = "iterationkatakana", -    [0x30FE] = "voicediterationkatakana", -    [0x3105] = "bbopomofo", -    [0x3106] = "pbopomofo", -    [0x3107] = "mbopomofo", -    [0x3108] = "fbopomofo", -    [0x3109] = "dbopomofo", -    [0x310A] = "tbopomofo", -    [0x310B] = "nbopomofo", -    [0x310C] = "lbopomofo", -    [0x310D] = "gbopomofo", -    [0x310E] = "kbopomofo", -    [0x310F] = "hbopomofo", -    [0x3110] = "jbopomofo", -    [0x3111] = "qbopomofo", -    [0x3112] = "xbopomofo", -    [0x3113] = "zhbopomofo", -    [0x3114] = "chbopomofo", -    [0x3115] = "shbopomofo", -    [0x3116] = "rbopomofo", -    [0x3117] = "zbopomofo", -    [0x3118] = "cbopomofo", -    [0x3119] = "sbopomofo", -    [0x311A] = "abopomofo", -    [0x311B] = "obopomofo", -    [0x311C] = "ebopomofo", -    [0x311D] = "ehbopomofo", -    [0x311E] = "aibopomofo", -    [0x311F] = "eibopomofo", -    [0x3120] = "aubopomofo", -    [0x3121] = "oubopomofo", -    [0x3122] = "anbopomofo", -    [0x3123] = "enbopomofo", -    [0x3124] = "angbopomofo", -    [0x3125] = "engbopomofo", -    [0x3126] = "erbopomofo", -    [0x3127] = "ibopomofo", -    [0x3128] = "ubopomofo", -    [0x3129] = "iubopomofo", -    [0x3131] = "kiyeokkorean", -    [0x3132] = "ssangkiyeokkorean", -    [0x3133] = "kiyeoksioskorean", -    [0x3134] = "nieunkorean", -    [0x3135] = "nieuncieuckorean", -    [0x3136] = "nieunhieuhkorean", -    [0x3137] = "tikeutkorean", -    [0x3138] = "ssangtikeutkorean", -    [0x3139] = "rieulkorean", -    [0x313A] = "rieulkiyeokkorean", -    [0x313B] = "rieulmieumkorean", -    [0x313C] = "rieulpieupkorean", -    [0x313D] = "rieulsioskorean", -    [0x313E] = "rieulthieuthkorean", -    [0x313F] = "rieulphieuphkorean", -    [0x3140] = "rieulhieuhkorean", -    [0x3141] = "mieumkorean", -    [0x3142] = "pieupkorean", -    [0x3143] = "ssangpieupkorean", -    [0x3144] = "pieupsioskorean", -    [0x3145] = "sioskorean", -    [0x3146] = "ssangsioskorean", -    [0x3147] = "ieungkorean", -    [0x3148] = "cieuckorean", -    [0x3149] = "ssangcieuckorean", -    [0x314A] = "chieuchkorean", -    [0x314B] = "khieukhkorean", -    [0x314C] = "thieuthkorean", -    [0x314D] = "phieuphkorean", -    [0x314E] = "hieuhkorean", -    [0x314F] = "akorean", -    [0x3150] = "aekorean", -    [0x3151] = "yakorean", -    [0x3152] = "yaekorean", -    [0x3153] = "eokorean", -    [0x3154] = "ekorean", -    [0x3155] = "yeokorean", -    [0x3156] = "yekorean", -    [0x3157] = "okorean", -    [0x3158] = "wakorean", -    [0x3159] = "waekorean", -    [0x315A] = "oekorean", -    [0x315B] = "yokorean", -    [0x315C] = "ukorean", -    [0x315D] = "weokorean", -    [0x315E] = "wekorean", -    [0x315F] = "wikorean", -    [0x3160] = "yukorean", -    [0x3161] = "eukorean", -    [0x3162] = "yikorean", -    [0x3163] = "ikorean", -    [0x3164] = "hangulfiller", -    [0x3165] = "ssangnieunkorean", -    [0x3166] = "nieuntikeutkorean", -    [0x3167] = "nieunsioskorean", -    [0x3168] = "nieunpansioskorean", -    [0x3169] = "rieulkiyeoksioskorean", -    [0x316A] = "rieultikeutkorean", -    [0x316B] = "rieulpieupsioskorean", -    [0x316C] = "rieulpansioskorean", -    [0x316D] = "rieulyeorinhieuhkorean", -    [0x316E] = "mieumpieupkorean", -    [0x316F] = "mieumsioskorean", -    [0x3170] = "mieumpansioskorean", -    [0x3171] = "kapyeounmieumkorean", -    [0x3172] = "pieupkiyeokkorean", -    [0x3173] = "pieuptikeutkorean", -    [0x3174] = "pieupsioskiyeokkorean", -    [0x3175] = "pieupsiostikeutkorean", -    [0x3176] = "pieupcieuckorean", -    [0x3177] = "pieupthieuthkorean", -    [0x3178] = "kapyeounpieupkorean", -    [0x3179] = "kapyeounssangpieupkorean", -    [0x317A] = "sioskiyeokkorean", -    [0x317B] = "siosnieunkorean", -    [0x317C] = "siostikeutkorean", -    [0x317D] = "siospieupkorean", -    [0x317E] = "sioscieuckorean", -    [0x317F] = "pansioskorean", -    [0x3180] = "ssangieungkorean", -    [0x3181] = "yesieungkorean", -    [0x3182] = "yesieungsioskorean", -    [0x3183] = "yesieungpansioskorean", -    [0x3184] = "kapyeounphieuphkorean", -    [0x3185] = "ssanghieuhkorean", -    [0x3186] = "yeorinhieuhkorean", -    [0x3187] = "yoyakorean", -    [0x3188] = "yoyaekorean", -    [0x3189] = "yoikorean", -    [0x318A] = "yuyeokorean", -    [0x318B] = "yuyekorean", -    [0x318C] = "yuikorean", -    [0x318D] = "araeakorean", -    [0x318E] = "araeaekorean", -    [0x3200] = "kiyeokparenkorean", -    [0x3201] = "nieunparenkorean", -    [0x3202] = "tikeutparenkorean", -    [0x3203] = "rieulparenkorean", -    [0x3204] = "mieumparenkorean", -    [0x3205] = "pieupparenkorean", -    [0x3206] = "siosparenkorean", -    [0x3207] = "ieungparenkorean", -    [0x3208] = "cieucparenkorean", -    [0x3209] = "chieuchparenkorean", -    [0x320A] = "khieukhparenkorean", -    [0x320B] = "thieuthparenkorean", -    [0x320C] = "phieuphparenkorean", -    [0x320D] = "hieuhparenkorean", -    [0x320E] = "kiyeokaparenkorean", -    [0x320F] = "nieunaparenkorean", -    [0x3210] = "tikeutaparenkorean", -    [0x3211] = "rieulaparenkorean", -    [0x3212] = "mieumaparenkorean", -    [0x3213] = "pieupaparenkorean", -    [0x3214] = "siosaparenkorean", -    [0x3215] = "ieungaparenkorean", -    [0x3216] = "cieucaparenkorean", -    [0x3217] = "chieuchaparenkorean", -    [0x3218] = "khieukhaparenkorean", -    [0x3219] = "thieuthaparenkorean", -    [0x321A] = "phieuphaparenkorean", -    [0x321B] = "hieuhaparenkorean", -    [0x321C] = "cieucuparenkorean", -    [0x3220] = "oneideographicparen", -    [0x3221] = "twoideographicparen", -    [0x3222] = "threeideographicparen", -    [0x3223] = "fourideographicparen", -    [0x3224] = "fiveideographicparen", -    [0x3225] = "sixideographicparen", -    [0x3226] = "sevenideographicparen", -    [0x3227] = "eightideographicparen", -    [0x3228] = "nineideographicparen", -    [0x3229] = "tenideographicparen", -    [0x322A] = "ideographicmoonparen", -    [0x322B] = "ideographicfireparen", -    [0x322C] = "ideographicwaterparen", -    [0x322D] = "ideographicwoodparen", -    [0x322E] = "ideographicmetalparen", -    [0x322F] = "ideographicearthparen", -    [0x3230] = "ideographicsunparen", -    [0x3231] = "ideographicstockparen", -    [0x3232] = "ideographichaveparen", -    [0x3233] = "ideographicsocietyparen", -    [0x3234] = "ideographicnameparen", -    [0x3235] = "ideographicspecialparen", -    [0x3236] = "ideographicfinancialparen", -    [0x3237] = "ideographiccongratulationparen", -    [0x3238] = "ideographiclaborparen", -    [0x3239] = "ideographicrepresentparen", -    [0x323A] = "ideographiccallparen", -    [0x323B] = "ideographicstudyparen", -    [0x323C] = "ideographicsuperviseparen", -    [0x323D] = "ideographicenterpriseparen", -    [0x323E] = "ideographicresourceparen", -    [0x323F] = "ideographicallianceparen", -    [0x3240] = "ideographicfestivalparen", -    [0x3242] = "ideographicselfparen", -    [0x3243] = "ideographicreachparen", -    [0x3260] = "kiyeokcirclekorean", -    [0x3261] = "nieuncirclekorean", -    [0x3262] = "tikeutcirclekorean", -    [0x3263] = "rieulcirclekorean", -    [0x3264] = "mieumcirclekorean", -    [0x3265] = "pieupcirclekorean", -    [0x3266] = "sioscirclekorean", -    [0x3267] = "ieungcirclekorean", -    [0x3268] = "cieuccirclekorean", -    [0x3269] = "chieuchcirclekorean", -    [0x326A] = "khieukhcirclekorean", -    [0x326B] = "thieuthcirclekorean", -    [0x326C] = "phieuphcirclekorean", -    [0x326D] = "hieuhcirclekorean", -    [0x326E] = "kiyeokacirclekorean", -    [0x326F] = "nieunacirclekorean", -    [0x3270] = "tikeutacirclekorean", -    [0x3271] = "rieulacirclekorean", -    [0x3272] = "mieumacirclekorean", -    [0x3273] = "pieupacirclekorean", -    [0x3274] = "siosacirclekorean", -    [0x3275] = "ieungacirclekorean", -    [0x3276] = "cieucacirclekorean", -    [0x3277] = "chieuchacirclekorean", -    [0x3278] = "khieukhacirclekorean", -    [0x3279] = "thieuthacirclekorean", -    [0x327A] = "phieuphacirclekorean", -    [0x327B] = "hieuhacirclekorean", -    [0x327F] = "koreanstandardsymbol", -    [0x328A] = "ideographmooncircle", -    [0x328B] = "ideographfirecircle", -    [0x328C] = "ideographwatercircle", -    [0x328D] = "ideographwoodcircle", -    [0x328E] = "ideographmetalcircle", -    [0x328F] = "ideographearthcircle", -    [0x3290] = "ideographsuncircle", -    [0x3294] = "ideographnamecircle", -    [0x3296] = "ideographicfinancialcircle", -    [0x3298] = "ideographiclaborcircle", -    [0x3299] = "ideographicsecretcircle", -    [0x329D] = "ideographicexcellentcircle", -    [0x329E] = "ideographicprintcircle", -    [0x32A3] = "ideographiccorrectcircle", -    [0x32A4] = "ideographichighcircle", -    [0x32A5] = "ideographiccentrecircle", -    [0x32A6] = "ideographiclowcircle", -    [0x32A7] = "ideographicleftcircle", -    [0x32A8] = "ideographicrightcircle", -    [0x32A9] = "ideographicmedicinecircle", -    [0x3300] = "apaatosquare", -    [0x3303] = "aarusquare", -    [0x3305] = "intisquare", -    [0x330D] = "karoriisquare", -    [0x3314] = "kirosquare", -    [0x3315] = "kiroguramusquare", -    [0x3316] = "kiromeetorusquare", -    [0x3318] = "guramusquare", -    [0x331E] = "kooposquare", -    [0x3322] = "sentisquare", -    [0x3323] = "sentosquare", -    [0x3326] = "dorusquare", -    [0x3327] = "tonsquare", -    [0x332A] = "haitusquare", -    [0x332B] = "paasentosquare", -    [0x3331] = "birusquare", -    [0x3333] = "huiitosquare", -    [0x3336] = "hekutaarusquare", -    [0x3339] = "herutusquare", -    [0x333B] = "peezisquare", -    [0x3342] = "hoonsquare", -    [0x3347] = "mansyonsquare", -    [0x3349] = "mirisquare", -    [0x334A] = "miribaarusquare", -    [0x334D] = "meetorusquare", -    [0x334E] = "yaadosquare", -    [0x3351] = "rittorusquare", -    [0x3357] = "wattosquare", -    [0x337B] = "heiseierasquare", -    [0x337C] = "syouwaerasquare", -    [0x337D] = "taisyouerasquare", -    [0x337E] = "meizierasquare", -    [0x337F] = "corporationsquare", -    [0x3380] = "paampssquare", -    [0x3381] = "nasquare", -    [0x3382] = "muasquare", -    [0x3383] = "masquare", -    [0x3384] = "kasquare", -    [0x3385] = "KBsquare", -    [0x3386] = "MBsquare", -    [0x3387] = "GBsquare", -    [0x3388] = "calsquare", -    [0x3389] = "kcalsquare", -    [0x338A] = "pfsquare", -    [0x338B] = "nfsquare", -    [0x338C] = "mufsquare", -    [0x338D] = "mugsquare", -    [0x338E] = "squaremg", -    [0x338F] = "squarekg", -    [0x3390] = "Hzsquare", -    [0x3391] = "khzsquare", -    [0x3392] = "mhzsquare", -    [0x3393] = "ghzsquare", -    [0x3394] = "thzsquare", -    [0x3395] = "mulsquare", -    [0x3396] = "mlsquare", -    [0x3397] = "dlsquare", -    [0x3398] = "klsquare", -    [0x3399] = "fmsquare", -    [0x339A] = "nmsquare", -    [0x339B] = "mumsquare", -    [0x339C] = "squaremm", -    [0x339D] = "squarecm", -    [0x339E] = "squarekm", -    [0x339F] = "mmsquaredsquare", -    [0x33A0] = "cmsquaredsquare", -    [0x33A1] = "squaremsquared", -    [0x33A2] = "kmsquaredsquare", -    [0x33A3] = "mmcubedsquare", -    [0x33A4] = "cmcubedsquare", -    [0x33A5] = "mcubedsquare", -    [0x33A6] = "kmcubedsquare", -    [0x33A7] = "moverssquare", -    [0x33A8] = "moverssquaredsquare", -    [0x33A9] = "pasquare", -    [0x33AA] = "kpasquare", -    [0x33AB] = "mpasquare", -    [0x33AC] = "gpasquare", -    [0x33AD] = "radsquare", -    [0x33AE] = "radoverssquare", -    [0x33AF] = "radoverssquaredsquare", -    [0x33B0] = "pssquare", -    [0x33B1] = "nssquare", -    [0x33B2] = "mussquare", -    [0x33B3] = "mssquare", -    [0x33B4] = "pvsquare", -    [0x33B5] = "nvsquare", -    [0x33B6] = "muvsquare", -    [0x33B7] = "mvsquare", -    [0x33B8] = "kvsquare", -    [0x33B9] = "mvmegasquare", -    [0x33BA] = "pwsquare", -    [0x33BB] = "nwsquare", -    [0x33BC] = "muwsquare", -    [0x33BD] = "mwsquare", -    [0x33BE] = "kwsquare", -    [0x33BF] = "mwmegasquare", -    [0x33C0] = "kohmsquare", -    [0x33C1] = "mohmsquare", -    [0x33C2] = "amsquare", -    [0x33C3] = "bqsquare", -    [0x33C4] = "squarecc", -    [0x33C5] = "cdsquare", -    [0x33C6] = "coverkgsquare", -    [0x33C7] = "cosquare", -    [0x33C8] = "dbsquare", -    [0x33C9] = "gysquare", -    [0x33CA] = "hasquare", -    [0x33CB] = "HPsquare", -    [0x33CD] = "KKsquare", -    [0x33CE] = "squarekmcapital", -    [0x33CF] = "ktsquare", -    [0x33D0] = "lmsquare", -    [0x33D1] = "squareln", -    [0x33D2] = "squarelog", -    [0x33D3] = "lxsquare", -    [0x33D4] = "mbsquare", -    [0x33D5] = "squaremil", -    [0x33D6] = "molsquare", -    [0x33D8] = "pmsquare", -    [0x33DB] = "srsquare", -    [0x33DC] = "svsquare", -    [0x33DD] = "wbsquare", -    [0x5344] = "twentyhangzhou", -    [0xF6BE] = "dotlessj", -    [0xF6BF] = "LL", -    [0xF6C0] = "ll", -    [0xF6C3] = "commaaccent", -    [0xF6C4] = "afii10063", -    [0xF6C5] = "afii10064", -    [0xF6C6] = "afii10192", -    [0xF6C7] = "afii10831", -    [0xF6C8] = "afii10832", -    [0xF6C9] = "Acute", -    [0xF6CA] = "Caron", -    [0xF6CB] = "Dieresis", -    [0xF6CC] = "DieresisAcute", -    [0xF6CD] = "DieresisGrave", -    [0xF6CE] = "Grave", -    [0xF6CF] = "Hungarumlaut", -    [0xF6D0] = "Macron", -    [0xF6D1] = "cyrBreve", -    [0xF6D2] = "cyrFlex", -    [0xF6D3] = "dblGrave", -    [0xF6D4] = "cyrbreve", -    [0xF6D5] = "cyrflex", -    [0xF6D6] = "dblgrave", -    [0xF6D7] = "dieresisacute", -    [0xF6D8] = "dieresisgrave", -    [0xF6D9] = "copyrightserif", -    [0xF6DA] = "registerserif", -    [0xF6DB] = "trademarkserif", -    [0xF6DC] = "onefitted", -    [0xF6DD] = "rupiah", -    [0xF6DE] = "threequartersemdash", -    [0xF6DF] = "centinferior", -    [0xF6E0] = "centsuperior", -    [0xF6E1] = "commainferior", -    [0xF6E2] = "commasuperior", -    [0xF6E3] = "dollarinferior", -    [0xF6E4] = "dollarsuperior", -    [0xF6E5] = "hypheninferior", -    [0xF6E6] = "hyphensuperior", -    [0xF6E7] = "periodinferior", -    [0xF6E8] = "periodsuperior", -    [0xF6E9] = "asuperior", -    [0xF6EA] = "bsuperior", -    [0xF6EB] = "dsuperior", -    [0xF6EC] = "esuperior", -    [0xF6ED] = "isuperior", -    [0xF6EE] = "lsuperior", -    [0xF6EF] = "msuperior", -    [0xF6F0] = "osuperior", -    [0xF6F1] = "rsuperior", -    [0xF6F2] = "ssuperior", -    [0xF6F3] = "tsuperior", -    [0xF6F4] = "Brevesmall", -    [0xF6F5] = "Caronsmall", -    [0xF6F6] = "Circumflexsmall", -    [0xF6F7] = "Dotaccentsmall", -    [0xF6F8] = "Hungarumlautsmall", -    [0xF6F9] = "Lslashsmall", -    [0xF6FA] = "OEsmall", -    [0xF6FB] = "Ogoneksmall", -    [0xF6FC] = "Ringsmall", -    [0xF6FD] = "Scaronsmall", -    [0xF6FE] = "Tildesmall", -    [0xF6FF] = "Zcaronsmall", -    [0xF721] = "exclamsmall", -    [0xF724] = "dollaroldstyle", -    [0xF726] = "ampersandsmall", -    [0xF730] = "zerooldstyle", -    [0xF731] = "oneoldstyle", -    [0xF732] = "twooldstyle", -    [0xF733] = "threeoldstyle", -    [0xF734] = "fouroldstyle", -    [0xF735] = "fiveoldstyle", -    [0xF736] = "sixoldstyle", -    [0xF737] = "sevenoldstyle", -    [0xF738] = "eightoldstyle", -    [0xF739] = "nineoldstyle", -    [0xF73F] = "questionsmall", -    [0xF760] = "Gravesmall", -    [0xF761] = "Asmall", -    [0xF762] = "Bsmall", -    [0xF763] = "Csmall", -    [0xF764] = "Dsmall", -    [0xF765] = "Esmall", -    [0xF766] = "Fsmall", -    [0xF767] = "Gsmall", -    [0xF768] = "Hsmall", -    [0xF769] = "Ismall", -    [0xF76A] = "Jsmall", -    [0xF76B] = "Ksmall", -    [0xF76C] = "Lsmall", -    [0xF76D] = "Msmall", -    [0xF76E] = "Nsmall", -    [0xF76F] = "Osmall", -    [0xF770] = "Psmall", -    [0xF771] = "Qsmall", -    [0xF772] = "Rsmall", -    [0xF773] = "Ssmall", -    [0xF774] = "Tsmall", -    [0xF775] = "Usmall", -    [0xF776] = "Vsmall", -    [0xF777] = "Wsmall", -    [0xF778] = "Xsmall", -    [0xF779] = "Ysmall", -    [0xF77A] = "Zsmall", -    [0xF7A1] = "exclamdownsmall", -    [0xF7A2] = "centoldstyle", -    [0xF7A8] = "Dieresissmall", -    [0xF7AF] = "Macronsmall", -    [0xF7B4] = "Acutesmall", -    [0xF7B8] = "Cedillasmall", -    [0xF7BF] = "questiondownsmall", -    [0xF7E0] = "Agravesmall", -    [0xF7E1] = "Aacutesmall", -    [0xF7E2] = "Acircumflexsmall", -    [0xF7E3] = "Atildesmall", -    [0xF7E4] = "Adieresissmall", -    [0xF7E5] = "Aringsmall", -    [0xF7E6] = "AEsmall", -    [0xF7E7] = "Ccedillasmall", -    [0xF7E8] = "Egravesmall", -    [0xF7E9] = "Eacutesmall", -    [0xF7EA] = "Ecircumflexsmall", -    [0xF7EB] = "Edieresissmall", -    [0xF7EC] = "Igravesmall", -    [0xF7ED] = "Iacutesmall", -    [0xF7EE] = "Icircumflexsmall", -    [0xF7EF] = "Idieresissmall", -    [0xF7F0] = "Ethsmall", -    [0xF7F1] = "Ntildesmall", -    [0xF7F2] = "Ogravesmall", -    [0xF7F3] = "Oacutesmall", -    [0xF7F4] = "Ocircumflexsmall", -    [0xF7F5] = "Otildesmall", -    [0xF7F6] = "Odieresissmall", -    [0xF7F8] = "Oslashsmall", -    [0xF7F9] = "Ugravesmall", -    [0xF7FA] = "Uacutesmall", -    [0xF7FB] = "Ucircumflexsmall", -    [0xF7FC] = "Udieresissmall", -    [0xF7FD] = "Yacutesmall", -    [0xF7FE] = "Thornsmall", -    [0xF7FF] = "Ydieresissmall", -    [0xF884] = "maihanakatleftthai", -    [0xF885] = "saraileftthai", -    [0xF886] = "saraiileftthai", -    [0xF887] = "saraueleftthai", -    [0xF888] = "saraueeleftthai", -    [0xF889] = "maitaikhuleftthai", -    [0xF88A] = "maiekupperleftthai", -    [0xF88B] = "maieklowrightthai", -    [0xF88C] = "maieklowleftthai", -    [0xF88D] = "maithoupperleftthai", -    [0xF88E] = "maitholowrightthai", -    [0xF88F] = "maitholowleftthai", -    [0xF890] = "maitriupperleftthai", -    [0xF891] = "maitrilowrightthai", -    [0xF892] = "maitrilowleftthai", -    [0xF893] = "maichattawaupperleftthai", -    [0xF894] = "maichattawalowrightthai", -    [0xF895] = "maichattawalowleftthai", -    [0xF896] = "thanthakhatupperleftthai", -    [0xF897] = "thanthakhatlowrightthai", -    [0xF898] = "thanthakhatlowleftthai", -    [0xF899] = "nikhahitleftthai", -    [0xF8E5] = "radicalex", -    [0xF8E6] = "arrowvertex", -    [0xF8E7] = "arrowhorizex", -    [0xF8E8] = "registersans", -    [0xF8E9] = "copyrightsans", -    [0xF8EA] = "trademarksans", -    [0xF8EB] = "parenlefttp", -    [0xF8EC] = "parenleftex", -    [0xF8ED] = "parenleftbt", -    [0xF8EE] = "bracketlefttp", -    [0xF8EF] = "bracketleftex", -    [0xF8F0] = "bracketleftbt", -    [0xF8F1] = "bracelefttp", -    [0xF8F2] = "braceleftmid", -    [0xF8F3] = "braceleftbt", -    [0xF8F4] = "braceex", -    [0xF8F5] = "integralex", -    [0xF8F6] = "parenrighttp", -    [0xF8F7] = "parenrightex", -    [0xF8F8] = "parenrightbt", -    [0xF8F9] = "bracketrighttp", -    [0xF8FA] = "bracketrightex", -    [0xF8FB] = "bracketrightbt", -    [0xF8FC] = "bracerighttp", -    [0xF8FD] = "bracerightmid", -    [0xF8FE] = "bracerightbt", -    [0xF8FF] = "apple", -    [0xFB00] = "ff", -    [0xFB01] = "fi", -    [0xFB02] = "fl", -    [0xFB03] = "ffi", -    [0xFB04] = "ffl", -    [0xFB1F] = "yodyodpatahhebrew", -    [0xFB20] = "ayinaltonehebrew", -    [0xFB2A] = "shinshindothebrew", -    [0xFB2B] = "shinsindothebrew", -    [0xFB2C] = "shindageshshindothebrew", -    [0xFB2D] = "shindageshsindothebrew", -    [0xFB2E] = "alefpatahhebrew", -    [0xFB2F] = "alefqamatshebrew", -    [0xFB30] = "alefdageshhebrew", -    [0xFB31] = "betdageshhebrew", -    [0xFB32] = "gimeldageshhebrew", -    [0xFB33] = "daletdageshhebrew", -    [0xFB34] = "hedageshhebrew", -    [0xFB35] = "vavdageshhebrew", -    [0xFB36] = "zayindageshhebrew", -    [0xFB38] = "tetdageshhebrew", -    [0xFB39] = "yoddageshhebrew", -    [0xFB3A] = "finalkafdageshhebrew", -    [0xFB3B] = "kafdageshhebrew", -    [0xFB3C] = "lameddageshhebrew", -    [0xFB3E] = "memdageshhebrew", -    [0xFB40] = "nundageshhebrew", -    [0xFB41] = "samekhdageshhebrew", -    [0xFB43] = "pefinaldageshhebrew", -    [0xFB44] = "pedageshhebrew", -    [0xFB46] = "tsadidageshhebrew", -    [0xFB47] = "qofdageshhebrew", -    [0xFB48] = "reshdageshhebrew", -    [0xFB49] = "shindageshhebrew", -    [0xFB4A] = "tavdageshhebrew", -    [0xFB4B] = "vavholamhebrew", -    [0xFB4C] = "betrafehebrew", -    [0xFB4D] = "kafrafehebrew", -    [0xFB4E] = "perafehebrew", -    [0xFB4F] = "aleflamedhebrew", -    [0xFB57] = "pehfinalarabic", -    [0xFB58] = "pehinitialarabic", -    [0xFB59] = "pehmedialarabic", -    [0xFB67] = "ttehfinalarabic", -    [0xFB68] = "ttehinitialarabic", -    [0xFB69] = "ttehmedialarabic", -    [0xFB6B] = "vehfinalarabic", -    [0xFB6C] = "vehinitialarabic", -    [0xFB6D] = "vehmedialarabic", -    [0xFB7B] = "tchehfinalarabic", -    [0xFB7C] = "tchehmeeminitialarabic", -    [0xFB7D] = "tchehmedialarabic", -    [0xFB89] = "ddalfinalarabic", -    [0xFB8B] = "jehfinalarabic", -    [0xFB8D] = "rrehfinalarabic", -    [0xFB93] = "gaffinalarabic", -    [0xFB94] = "gafinitialarabic", -    [0xFB95] = "gafmedialarabic", -    [0xFB9F] = "noonghunnafinalarabic", -    [0xFBA4] = "hehhamzaaboveisolatedarabic", -    [0xFBA5] = "hehhamzaabovefinalarabic", -    [0xFBA7] = "hehfinalaltonearabic", -    [0xFBA8] = "hehinitialaltonearabic", -    [0xFBA9] = "hehmedialaltonearabic", -    [0xFBAF] = "yehbarreefinalarabic", -    [0xFC08] = "behmeemisolatedarabic", -    [0xFC0B] = "tehjeemisolatedarabic", -    [0xFC0C] = "tehhahisolatedarabic", -    [0xFC0E] = "tehmeemisolatedarabic", -    [0xFC48] = "meemmeemisolatedarabic", -    [0xFC4B] = "noonjeemisolatedarabic", -    [0xFC4E] = "noonmeemisolatedarabic", -    [0xFC58] = "yehmeemisolatedarabic", -    [0xFC5E] = "shaddadammatanarabic", -    [0xFC5F] = "shaddakasratanarabic", -    [0xFC60] = "shaddafathaarabic", -    [0xFC61] = "shaddadammaarabic", -    [0xFC62] = "shaddakasraarabic", -    [0xFC6D] = "behnoonfinalarabic", -    [0xFC73] = "tehnoonfinalarabic", -    [0xFC8D] = "noonnoonfinalarabic", -    [0xFC94] = "yehnoonfinalarabic", -    [0xFC9F] = "behmeeminitialarabic", -    [0xFCA1] = "tehjeeminitialarabic", -    [0xFCA2] = "tehhahinitialarabic", -    [0xFCA4] = "tehmeeminitialarabic", -    [0xFCC9] = "lamjeeminitialarabic", -    [0xFCCA] = "lamhahinitialarabic", -    [0xFCCB] = "lamkhahinitialarabic", -    [0xFCCC] = "lammeeminitialarabic", -    [0xFCD1] = "meemmeeminitialarabic", -    [0xFCD2] = "noonjeeminitialarabic", -    [0xFCD5] = "noonmeeminitialarabic", -    [0xFCDD] = "yehmeeminitialarabic", -    [0xFD3E] = "parenleftaltonearabic", -    [0xFD3F] = "parenrightaltonearabic", -    [0xFD88] = "lammeemhahinitialarabic", -    [0xFDF2] = "lamlamhehisolatedarabic", -    [0xFDFA] = "sallallahoualayhewasallamarabic", -    [0xFE30] = "twodotleadervertical", -    [0xFE31] = "emdashvertical", -    [0xFE32] = "endashvertical", -    [0xFE33] = "underscorevertical", -    [0xFE34] = "wavyunderscorevertical", -    [0xFE35] = "parenleftvertical", -    [0xFE36] = "parenrightvertical", -    [0xFE37] = "braceleftvertical", -    [0xFE38] = "bracerightvertical", -    [0xFE39] = "tortoiseshellbracketleftvertical", -    [0xFE3A] = "tortoiseshellbracketrightvertical", -    [0xFE3B] = "blacklenticularbracketleftvertical", -    [0xFE3C] = "blacklenticularbracketrightvertical", -    [0xFE3D] = "dblanglebracketleftvertical", -    [0xFE3E] = "dblanglebracketrightvertical", -    [0xFE3F] = "anglebracketleftvertical", -    [0xFE40] = "anglebracketrightvertical", -    [0xFE41] = "cornerbracketleftvertical", -    [0xFE42] = "cornerbracketrightvertical", -    [0xFE43] = "whitecornerbracketleftvertical", -    [0xFE44] = "whitecornerbracketrightvertical", -    [0xFE49] = "overlinedashed", -    [0xFE4A] = "overlinecenterline", -    [0xFE4B] = "overlinewavy", -    [0xFE4C] = "overlinedblwavy", -    [0xFE4D] = "lowlinedashed", -    [0xFE4E] = "lowlinecenterline", -    [0xFE4F] = "underscorewavy", -    [0xFE50] = "commasmall", -    [0xFE52] = "periodsmall", -    [0xFE54] = "semicolonsmall", -    [0xFE55] = "colonsmall", -    [0xFE59] = "parenleftsmall", -    [0xFE5A] = "parenrightsmall", -    [0xFE5B] = "braceleftsmall", -    [0xFE5C] = "bracerightsmall", -    [0xFE5D] = "tortoiseshellbracketleftsmall", -    [0xFE5E] = "tortoiseshellbracketrightsmall", -    [0xFE5F] = "numbersignsmall", -    [0xFE61] = "asterisksmall", -    [0xFE62] = "plussmall", -    [0xFE63] = "hyphensmall", -    [0xFE64] = "lesssmall", -    [0xFE65] = "greatersmall", -    [0xFE66] = "equalsmall", -    [0xFE69] = "dollarsmall", -    [0xFE6A] = "percentsmall", -    [0xFE6B] = "atsmall", -    [0xFE82] = "alefmaddaabovefinalarabic", -    [0xFE84] = "alefhamzaabovefinalarabic", -    [0xFE86] = "wawhamzaabovefinalarabic", -    [0xFE88] = "alefhamzabelowfinalarabic", -    [0xFE8A] = "yehhamzaabovefinalarabic", -    [0xFE8B] = "yehhamzaaboveinitialarabic", -    [0xFE8C] = "yehhamzaabovemedialarabic", -    [0xFE8E] = "aleffinalarabic", -    [0xFE90] = "behfinalarabic", -    [0xFE91] = "behinitialarabic", -    [0xFE92] = "behmedialarabic", -    [0xFE94] = "tehmarbutafinalarabic", -    [0xFE96] = "tehfinalarabic", -    [0xFE97] = "tehinitialarabic", -    [0xFE98] = "tehmedialarabic", -    [0xFE9A] = "thehfinalarabic", -    [0xFE9B] = "thehinitialarabic", -    [0xFE9C] = "thehmedialarabic", -    [0xFE9E] = "jeemfinalarabic", -    [0xFE9F] = "jeeminitialarabic", -    [0xFEA0] = "jeemmedialarabic", -    [0xFEA2] = "hahfinalarabic", -    [0xFEA3] = "hahinitialarabic", -    [0xFEA4] = "hahmedialarabic", -    [0xFEA6] = "khahfinalarabic", -    [0xFEA7] = "khahinitialarabic", -    [0xFEA8] = "khahmedialarabic", -    [0xFEAA] = "dalfinalarabic", -    [0xFEAC] = "thalfinalarabic", -    [0xFEAE] = "rehfinalarabic", -    [0xFEB0] = "zainfinalarabic", -    [0xFEB2] = "seenfinalarabic", -    [0xFEB3] = "seeninitialarabic", -    [0xFEB4] = "seenmedialarabic", -    [0xFEB6] = "sheenfinalarabic", -    [0xFEB7] = "sheeninitialarabic", -    [0xFEB8] = "sheenmedialarabic", -    [0xFEBA] = "sadfinalarabic", -    [0xFEBB] = "sadinitialarabic", -    [0xFEBC] = "sadmedialarabic", -    [0xFEBE] = "dadfinalarabic", -    [0xFEBF] = "dadinitialarabic", -    [0xFEC0] = "dadmedialarabic", -    [0xFEC2] = "tahfinalarabic", -    [0xFEC3] = "tahinitialarabic", -    [0xFEC4] = "tahmedialarabic", -    [0xFEC6] = "zahfinalarabic", -    [0xFEC7] = "zahinitialarabic", -    [0xFEC8] = "zahmedialarabic", -    [0xFECA] = "ainfinalarabic", -    [0xFECB] = "aininitialarabic", -    [0xFECC] = "ainmedialarabic", -    [0xFECE] = "ghainfinalarabic", -    [0xFECF] = "ghaininitialarabic", -    [0xFED0] = "ghainmedialarabic", -    [0xFED2] = "fehfinalarabic", -    [0xFED3] = "fehinitialarabic", -    [0xFED4] = "fehmedialarabic", -    [0xFED6] = "qaffinalarabic", -    [0xFED7] = "qafinitialarabic", -    [0xFED8] = "qafmedialarabic", -    [0xFEDA] = "kaffinalarabic", -    [0xFEDB] = "kafinitialarabic", -    [0xFEDC] = "kafmedialarabic", -    [0xFEDE] = "lamfinalarabic", -    [0xFEDF] = "lammeemkhahinitialarabic", -    [0xFEE0] = "lammedialarabic", -    [0xFEE2] = "meemfinalarabic", -    [0xFEE3] = "meeminitialarabic", -    [0xFEE4] = "meemmedialarabic", -    [0xFEE6] = "noonfinalarabic", -    [0xFEE7] = "nooninitialarabic", -    [0xFEE8] = "noonmedialarabic", -    [0xFEEA] = "hehfinalarabic", -    [0xFEEB] = "hehinitialarabic", -    [0xFEEC] = "hehmedialarabic", -    [0xFEEE] = "wawfinalarabic", -    [0xFEF0] = "alefmaksurafinalarabic", -    [0xFEF2] = "yehfinalarabic", -    [0xFEF3] = "yehinitialarabic", -    [0xFEF4] = "yehmedialarabic", -    [0xFEF5] = "lamalefmaddaaboveisolatedarabic", -    [0xFEF6] = "lamalefmaddaabovefinalarabic", -    [0xFEF7] = "lamalefhamzaaboveisolatedarabic", -    [0xFEF8] = "lamalefhamzaabovefinalarabic", -    [0xFEF9] = "lamalefhamzabelowisolatedarabic", -    [0xFEFA] = "lamalefhamzabelowfinalarabic", -    [0xFEFB] = "lamalefisolatedarabic", -    [0xFEFC] = "lamaleffinalarabic", -    [0xFEFF] = "zerowidthjoiner", -    [0xFF01] = "exclammonospace", -    [0xFF02] = "quotedblmonospace", -    [0xFF03] = "numbersignmonospace", -    [0xFF04] = "dollarmonospace", -    [0xFF05] = "percentmonospace", -    [0xFF06] = "ampersandmonospace", -    [0xFF07] = "quotesinglemonospace", -    [0xFF08] = "parenleftmonospace", -    [0xFF09] = "parenrightmonospace", -    [0xFF0A] = "asteriskmonospace", -    [0xFF0B] = "plusmonospace", -    [0xFF0C] = "commamonospace", -    [0xFF0D] = "hyphenmonospace", -    [0xFF0E] = "periodmonospace", -    [0xFF0F] = "slashmonospace", -    [0xFF10] = "zeromonospace", -    [0xFF11] = "onemonospace", -    [0xFF12] = "twomonospace", -    [0xFF13] = "threemonospace", -    [0xFF14] = "fourmonospace", -    [0xFF15] = "fivemonospace", -    [0xFF16] = "sixmonospace", -    [0xFF17] = "sevenmonospace", -    [0xFF18] = "eightmonospace", -    [0xFF19] = "ninemonospace", -    [0xFF1A] = "colonmonospace", -    [0xFF1B] = "semicolonmonospace", -    [0xFF1C] = "lessmonospace", -    [0xFF1D] = "equalmonospace", -    [0xFF1E] = "greatermonospace", -    [0xFF1F] = "questionmonospace", -    [0xFF20] = "atmonospace", -    [0xFF21] = "Amonospace", -    [0xFF22] = "Bmonospace", -    [0xFF23] = "Cmonospace", -    [0xFF24] = "Dmonospace", -    [0xFF25] = "Emonospace", -    [0xFF26] = "Fmonospace", -    [0xFF27] = "Gmonospace", -    [0xFF28] = "Hmonospace", -    [0xFF29] = "Imonospace", -    [0xFF2A] = "Jmonospace", -    [0xFF2B] = "Kmonospace", -    [0xFF2C] = "Lmonospace", -    [0xFF2D] = "Mmonospace", -    [0xFF2E] = "Nmonospace", -    [0xFF2F] = "Omonospace", -    [0xFF30] = "Pmonospace", -    [0xFF31] = "Qmonospace", -    [0xFF32] = "Rmonospace", -    [0xFF33] = "Smonospace", -    [0xFF34] = "Tmonospace", -    [0xFF35] = "Umonospace", -    [0xFF36] = "Vmonospace", -    [0xFF37] = "Wmonospace", -    [0xFF38] = "Xmonospace", -    [0xFF39] = "Ymonospace", -    [0xFF3A] = "Zmonospace", -    [0xFF3B] = "bracketleftmonospace", -    [0xFF3C] = "backslashmonospace", -    [0xFF3D] = "bracketrightmonospace", -    [0xFF3E] = "asciicircummonospace", -    [0xFF3F] = "underscoremonospace", -    [0xFF40] = "gravemonospace", -    [0xFF41] = "amonospace", -    [0xFF42] = "bmonospace", -    [0xFF43] = "cmonospace", -    [0xFF44] = "dmonospace", -    [0xFF45] = "emonospace", -    [0xFF46] = "fmonospace", -    [0xFF47] = "gmonospace", -    [0xFF48] = "hmonospace", -    [0xFF49] = "imonospace", -    [0xFF4A] = "jmonospace", -    [0xFF4B] = "kmonospace", -    [0xFF4C] = "lmonospace", -    [0xFF4D] = "mmonospace", -    [0xFF4E] = "nmonospace", -    [0xFF4F] = "omonospace", -    [0xFF50] = "pmonospace", -    [0xFF51] = "qmonospace", -    [0xFF52] = "rmonospace", -    [0xFF53] = "smonospace", -    [0xFF54] = "tmonospace", -    [0xFF55] = "umonospace", -    [0xFF56] = "vmonospace", -    [0xFF57] = "wmonospace", -    [0xFF58] = "xmonospace", -    [0xFF59] = "ymonospace", -    [0xFF5A] = "zmonospace", -    [0xFF5B] = "braceleftmonospace", -    [0xFF5C] = "barmonospace", -    [0xFF5D] = "bracerightmonospace", -    [0xFF5E] = "asciitildemonospace", -    [0xFF61] = "periodhalfwidth", -    [0xFF62] = "cornerbracketlefthalfwidth", -    [0xFF63] = "cornerbracketrighthalfwidth", -    [0xFF64] = "ideographiccommaleft", -    [0xFF65] = "middledotkatakanahalfwidth", -    [0xFF66] = "wokatakanahalfwidth", -    [0xFF67] = "asmallkatakanahalfwidth", -    [0xFF68] = "ismallkatakanahalfwidth", -    [0xFF69] = "usmallkatakanahalfwidth", -    [0xFF6A] = "esmallkatakanahalfwidth", -    [0xFF6B] = "osmallkatakanahalfwidth", -    [0xFF6C] = "yasmallkatakanahalfwidth", -    [0xFF6D] = "yusmallkatakanahalfwidth", -    [0xFF6E] = "yosmallkatakanahalfwidth", -    [0xFF6F] = "tusmallkatakanahalfwidth", -    [0xFF70] = "katahiraprolongmarkhalfwidth", -    [0xFF71] = "akatakanahalfwidth", -    [0xFF72] = "ikatakanahalfwidth", -    [0xFF73] = "ukatakanahalfwidth", -    [0xFF74] = "ekatakanahalfwidth", -    [0xFF75] = "okatakanahalfwidth", -    [0xFF76] = "kakatakanahalfwidth", -    [0xFF77] = "kikatakanahalfwidth", -    [0xFF78] = "kukatakanahalfwidth", -    [0xFF79] = "kekatakanahalfwidth", -    [0xFF7A] = "kokatakanahalfwidth", -    [0xFF7B] = "sakatakanahalfwidth", -    [0xFF7C] = "sikatakanahalfwidth", -    [0xFF7D] = "sukatakanahalfwidth", -    [0xFF7E] = "sekatakanahalfwidth", -    [0xFF7F] = "sokatakanahalfwidth", -    [0xFF80] = "takatakanahalfwidth", -    [0xFF81] = "tikatakanahalfwidth", -    [0xFF82] = "tukatakanahalfwidth", -    [0xFF83] = "tekatakanahalfwidth", -    [0xFF84] = "tokatakanahalfwidth", -    [0xFF85] = "nakatakanahalfwidth", -    [0xFF86] = "nikatakanahalfwidth", -    [0xFF87] = "nukatakanahalfwidth", -    [0xFF88] = "nekatakanahalfwidth", -    [0xFF89] = "nokatakanahalfwidth", -    [0xFF8A] = "hakatakanahalfwidth", -    [0xFF8B] = "hikatakanahalfwidth", -    [0xFF8C] = "hukatakanahalfwidth", -    [0xFF8D] = "hekatakanahalfwidth", -    [0xFF8E] = "hokatakanahalfwidth", -    [0xFF8F] = "makatakanahalfwidth", -    [0xFF90] = "mikatakanahalfwidth", -    [0xFF91] = "mukatakanahalfwidth", -    [0xFF92] = "mekatakanahalfwidth", -    [0xFF93] = "mokatakanahalfwidth", -    [0xFF94] = "yakatakanahalfwidth", -    [0xFF95] = "yukatakanahalfwidth", -    [0xFF96] = "yokatakanahalfwidth", -    [0xFF97] = "rakatakanahalfwidth", -    [0xFF98] = "rikatakanahalfwidth", -    [0xFF99] = "rukatakanahalfwidth", -    [0xFF9A] = "rekatakanahalfwidth", -    [0xFF9B] = "rokatakanahalfwidth", -    [0xFF9C] = "wakatakanahalfwidth", -    [0xFF9D] = "nkatakanahalfwidth", -    [0xFF9E] = "voicedmarkkanahalfwidth", -    [0xFF9F] = "semivoicedmarkkanahalfwidth", -    [0xFFE0] = "centmonospace", -    [0xFFE1] = "sterlingmonospace", -    [0xFFE3] = "macronmonospace", -    [0xFFE5] = "yenmonospace", -    [0xFFE6] = "wonmonospace", -} - -agl.unicodes = allocate(table.swapped(agl.names)) -- to unicode diff --git a/otfl-font-cid.lua b/otfl-font-cid.lua index 1d03bca..a9bd3c5 100644 --- a/otfl-font-cid.lua +++ b/otfl-font-cid.lua @@ -12,7 +12,7 @@ local lpegmatch = lpeg.match  local trace_loading = false  trackers.register("otf.loading",      function(v) trace_loading      = v end) -local report_otf = logs.new("load otf") +local report_otf = logs.reporter("fonts","otf loading")  local fonts   = fonts diff --git a/otfl-font-def.lua b/otfl-font-def.lua index e87fee4..3a09b66 100644 --- a/otfl-font-def.lua +++ b/otfl-font-def.lua @@ -6,7 +6,8 @@ if not modules then modules = { } end modules ['font-def'] = {      license   = "see context related readme files"  } -local format, concat, gmatch, match, find, lower = string.format, table.concat, string.gmatch, string.match, string.find, string.lower +local concat = table.concat +local format, gmatch, match, find, lower, gsub = string.format, string.gmatch, string.match, string.find, string.lower, string.gsub  local tostring, next = tostring, next  local lpegmatch = lpeg.match @@ -18,8 +19,7 @@ local directive_embedall = false  directives.register("fonts.embedall", function  trackers.register("fonts.loading", "fonts.defining", "otf.loading", "afm.loading", "tfm.loading")  trackers.register("fonts.all", "fonts.*", "otf.*", "afm.*", "tfm.*") -local report_define = logs.new("define fonts") -local report_afm    = logs.new("load afm") +local report_defining = logs.reporter("fonts","defining")  --[[ldx--  <p>Here we deal with defining fonts. We do so by intercepting the @@ -29,16 +29,14 @@ default loader that only handles <l n='tfm'/>.</p>  local fonts         = fonts  local tfm           = fonts.tfm  local vf            = fonts.vf -local fontcsnames   = fonts.csnames  fonts.used          = allocate()  tfm.readers         = tfm.readers or { }  tfm.fonts           = allocate() -tfm.internalized    = allocate() -- internal tex numbers  local readers       = tfm.readers -local sequence      = allocate { 'otf', 'ttf', 'afm', 'tfm' } +local sequence      = allocate { 'otf', 'ttf', 'afm', 'tfm', 'lua' }  readers.sequence    = sequence  tfm.version         = 1.01 @@ -125,15 +123,18 @@ end  definers.getspecification = getspecification -function definers.registersplit(symbol,action) +function definers.registersplit(symbol,action,verbosename)      addspecifier(symbol)      variants[symbol] = action +    if verbosename then +        variants[verbosename] = action +    end  end  function definers.makespecification(specification, lookup, name, sub, method, detail, size)      size = size or 655360      if trace_defining then -        report_define("%s -> lookup: %s, name: %s, sub: %s, method: %s, detail: %s", +        report_defining("%s -> lookup: %s, name: %s, sub: %s, method: %s, detail: %s",              specification, (lookup ~= "" and lookup) or "[file]", (name ~= "" and name) or "-",              (sub ~= "" and sub) or "-", (method ~= "" and method) or "-", (detail ~= "" and detail) or "-")      end @@ -191,10 +192,10 @@ function tfm.hashfeatures(specification)                  t[tn] = v .. '=' .. tostring(vtf[v])              end          end -    --~ if specification.mathsize then -    --~     tn = tn + 1 -    --~     t[tn] = "mathsize=" .. specification.mathsize -    --~ end +     -- if specification.mathsize then +     --     tn = tn + 1 +     --     t[tn] = "mathsize=" .. specification.mathsize +     -- end          if tn > 0 then              return concat(t,"+")          end @@ -222,21 +223,21 @@ function tfm.hashinstance(specification,force)          size = math.round(tfm.scaled(size,fonts.designsizes[hash]))          specification.size = size      end ---~     local mathsize = specification.mathsize or 0 ---~     if mathsize > 0 then ---~         local textsize = specification.textsize ---~         if fallbacks then ---~             return hash .. ' @ ' .. tostring(size) .. ' [ ' .. tostring(mathsize) .. ' : ' .. tostring(textsize) .. ' ] @ ' .. fallbacks ---~         else ---~             return hash .. ' @ ' .. tostring(size) .. ' [ ' .. tostring(mathsize) .. ' : ' .. tostring(textsize) .. ' ]' ---~         end ---~     else + -- local mathsize = specification.mathsize or 0 + -- if mathsize > 0 then + --     local textsize = specification.textsize + --     if fallbacks then + --         return hash .. ' @ ' .. tostring(size) .. ' [ ' .. tostring(mathsize) .. ' : ' .. tostring(textsize) .. ' ] @ ' .. fallbacks + --     else + --         return hash .. ' @ ' .. tostring(size) .. ' [ ' .. tostring(mathsize) .. ' : ' .. tostring(textsize) .. ' ]' + --     end + -- else          if fallbacks then              return hash .. ' @ ' .. tostring(size) .. ' @ ' .. fallbacks          else              return hash .. ' @ ' .. tostring(size)          end ---~     end + -- end  end  --[[ldx-- @@ -259,7 +260,7 @@ end  function resolvers.name(specification)      local resolve = fonts.names.resolve      if resolve then -        local resolved, sub = fonts.names.resolve(specification) +        local resolved, sub = fonts.names.resolve(specification.name,specification.sub)          specification.resolved, specification.sub = resolved, sub          if resolved then              local suffix = file.suffix(resolved) @@ -278,7 +279,7 @@ end  function resolvers.spec(specification)      local resolvespec = fonts.names.resolvespec      if resolvespec then -        specification.resolved, specification.sub = fonts.names.resolvespec(specification) +        specification.resolved, specification.sub = fonts.names.resolvespec(specification.name,specification.sub)          if specification.resolved then              specification.forced = file.extname(specification.resolved)              specification.name = file.removesuffix(specification.resolved) @@ -338,16 +339,17 @@ function tfm.read(specification)      if not tfmtable then          local forced = specification.forced or ""          if forced ~= "" then -            tfmtable = readers[lower(forced)](specification) +            local reader = readers[lower(forced)] +            tfmtable = reader and reader(specification)              if not tfmtable then -                report_define("forced type %s of %s not found",forced,specification.name) +                report_defining("forced type %s of %s not found",forced,specification.name)              end          else              for s=1,#sequence do -- reader sequence                  local reader = sequence[s]                  if readers[reader] then -- not really needed                      if trace_defining then -                        report_define("trying (reader sequence driven) type %s for %s with file %s",reader,specification.name,specification.filename or "unknown") +                        report_defining("trying (reader sequence driven) type %s for %s with file %s",reader,specification.name,specification.filename or "unknown")                      end                      tfmtable = readers[reader](specification)                      if tfmtable then @@ -366,13 +368,26 @@ function tfm.read(specification)              else                  tfmtable.embedding = "subset"              end +            -- fonts.goodies.postprocessors.apply(tfmdata) -- only here +            local postprocessors = tfmtable.postprocessors +            if postprocessors then +                for i=1,#postprocessors do +                    local extrahash = postprocessors[i](tfmtable) -- after scaling etc +                    if type(extrahash) == "string" and extrahash ~= "" then +                        -- e.g. a reencoding needs this +                        extrahash = gsub(lower(extrahash),"[^a-z]","-") +                        tfmtable.fullname = format("%s-%s",tfmtable.fullname,extrahash) +                    end +                end +            end +            --              tfm.fonts[hash] = tfmtable              fonts.designsizes[specification.hash] = tfmtable.designsize -- we only know this for sure after loading once          --~ tfmtable.mode = specification.features.normal.mode or "base"          end      end      if not tfmtable then -        report_define("font with name %s is not found",specification.name) +        report_defining("font with asked name '%s' is not found using lookup '%s'",specification.name,specification.lookup)      end      return tfmtable  end @@ -391,153 +406,20 @@ function tfm.readanddefine(name,size) -- no id      local hash = tfm.hashinstance(specification)      local id = definers.registered(hash)      if not id then -        local fontdata = tfm.read(specification) -        if fontdata then -            fontdata.hash = hash -            id = font.define(fontdata) -            definers.register(fontdata,id) -            tfm.cleanuptable(fontdata) +        local tfmdata = tfm.read(specification) +        if tfmdata then +            tfmdata.hash = hash +            id = font.define(tfmdata) +            definers.register(tfmdata,id) +            tfm.cleanuptable(tfmdata)          else              id = 0  -- signal          end      end -    return fonts.ids[id], id +    return fonts.identifiers[id], id  end  --[[ldx-- -<p>Next follow the readers. This code was written while <l n='luatex'/> -evolved. Each one has its own way of dealing with its format.</p> ---ldx]]-- - -local function check_tfm(specification,fullname) -    -- ofm directive blocks local path search unless set; btw, in context we -    -- don't support ofm files anyway as this format is obsolete -    local foundname = findbinfile(fullname, 'tfm') or "" -- just to be sure -    if foundname == "" then -        foundname = findbinfile(fullname, 'ofm') or "" -- bonus for usage outside context -    end -    if foundname == "" then -        foundname = fonts.names.getfilename(fullname,"tfm") -    end -    if foundname ~= "" then -        specification.filename, specification.format = foundname, "ofm" -        return tfm.read_from_tfm(specification) -    end -end - -local function check_afm(specification,fullname) -    local foundname = findbinfile(fullname, 'afm') or "" -- just to be sure -    if foundname == "" then -        foundname = fonts.names.getfilename(fullname,"afm") -    end -    if foundname == "" and tfm.autoprefixedafm then -        local encoding, shortname = match(fullname,"^(.-)%-(.*)$") -- context: encoding-name.* -        if encoding and shortname and fonts.enc.known[encoding] then -            shortname = findbinfile(shortname,'afm') or "" -- just to be sure -            if shortname ~= "" then -                foundname = shortname -                if trace_loading then -                    report_afm("stripping encoding prefix from filename %s",afmname) -                end -            end -        end -    end -    if foundname ~= "" then -        specification.filename, specification.format = foundname, "afm" -        return tfm.read_from_afm(specification) -    end -end - -function readers.tfm(specification) -    local fullname, tfmtable = specification.filename or "", nil -    if fullname == "" then -        local forced = specification.forced or "" -        if forced ~= "" then -            tfmtable = check_tfm(specification,specification.name .. "." .. forced) -        end -        if not tfmtable then -            tfmtable = check_tfm(specification,specification.name) -        end -    else -        tfmtable = check_tfm(specification,fullname) -    end -    return tfmtable -end - -function readers.afm(specification,method) -    local fullname, tfmtable = specification.filename or "", nil -    if fullname == "" then -        local forced = specification.forced or "" -        if forced ~= "" then -            tfmtable = check_afm(specification,specification.name .. "." .. forced) -        end -        if not tfmtable then -            method = method or definers.method or "afm or tfm" -            if method == "tfm" then -                tfmtable = check_tfm(specification,specification.name) -            elseif method == "afm" then -                tfmtable = check_afm(specification,specification.name) -            elseif method == "tfm or afm" then -                tfmtable = check_tfm(specification,specification.name) or check_afm(specification,specification.name) -            else -- method == "afm or tfm" or method == "" then -                tfmtable = check_afm(specification,specification.name) or check_tfm(specification,specification.name) -            end -        end -    else -        tfmtable = check_afm(specification,fullname) -    end -    return tfmtable -end - --- maybe some day a set of names - -local function check_otf(forced,specification,suffix,what) -    local name = specification.name -    if forced then -        name = file.addsuffix(name,suffix,true) -    end -    local fullname, tfmtable = findbinfile(name,suffix) or "", nil -- one shot - -- if false then  -- can be enabled again when needed -     -- if fullname == "" then -     --     local fb = fonts.names.old_to_new[name] -     --     if fb then -     --         fullname = findbinfile(fb,suffix) or "" -     --     end -     -- end -     -- if fullname == "" then -     --     local fb = fonts.names.new_to_old[name] -     --     if fb then -     --         fullname = findbinfile(fb,suffix) or "" -     --     end -     -- end - -- end -    if fullname == "" then -        fullname = fonts.names.getfilename(name,suffix) -    end -    if fullname ~= "" then -        specification.filename, specification.format = fullname, what -- hm, so we do set the filename, then -        tfmtable = tfm.read_from_otf(specification)             -- we need to do it for all matches / todo -    end -    return tfmtable -end - -function readers.opentype(specification,suffix,what) -    local forced = specification.forced or "" -    if forced == "otf" then -        return check_otf(true,specification,forced,"opentype") -    elseif forced == "ttf" or forced == "ttc" or forced == "dfont" then -        return check_otf(true,specification,forced,"truetype") -    else -        return check_otf(false,specification,suffix,what) -    end -end - -function readers.otf  (specification) return readers.opentype(specification,"otf","opentype") end -function readers.ttf  (specification) return readers.opentype(specification,"ttf","truetype") end -function readers.ttc  (specification) return readers.opentype(specification,"ttf","truetype") end -- !! -function readers.dfont(specification) return readers.opentype(specification,"ttf","truetype") end -- !! - ---[[ldx--  <p>We need to check for default features. For this we provide  a helper function.</p>  --ldx]]-- @@ -568,31 +450,29 @@ not gain much. By the way, passing id's back to in the callback was  introduced later in the development.</p>  --ldx]]-- -local lastdefined = nil -- we don't want this one to end up in s-tra-02 +local lastdefined  = nil -- we don't want this one to end up in s-tra-02 +local internalized = { }  function definers.current() -- or maybe current      return lastdefined  end -function definers.register(fontdata,id) -    if fontdata and id then -        local hash = fontdata.hash -        if not tfm.internalized[hash] then +function definers.register(tfmdata,id) -- will be overloaded +    if tfmdata and id then +        local hash = tfmdata.hash +        if not internalized[hash] then              if trace_defining then -                report_define("loading at 2 id %s, hash: %s",id or "?",hash or "?") +                report_defining("registering font, id: %s, hash: %s",id or "?",hash or "?")              end -            fonts.identifiers[id] = fontdata -            fonts.characters [id] = fontdata.characters -            fonts.quads      [id] = fontdata.parameters and fontdata.parameters.quad -            -- todo: extra functions, e.g. setdigitwidth etc in list -            tfm.internalized[hash] = id +            fonts.identifiers[id] = tfmdata +            internalized[hash] = id          end      end  end -function definers.registered(hash) -    local id = tfm.internalized[hash] -    return id, id and fonts.ids[id] +function definers.registered(hash) -- will be overloaded +    local id = internalized[hash] +    return id, id and fonts.identifiers[id]  end  local cache_them = false @@ -625,49 +505,45 @@ function definers.read(specification,size,id) -- id can be optional, name can al      specification = definers.resolve(specification)      local hash = tfm.hashinstance(specification)      if cache_them then -        local fontdata = containers.read(fonts.cache,hash) -- for tracing purposes +        local tfmdata = containers.read(fonts.cache,hash) -- for tracing purposes      end -    local fontdata = definers.registered(hash) -- id -    if not fontdata then +    local tfmdata = definers.registered(hash) -- id +    if not tfmdata then          if specification.features.vtf and specification.features.vtf.preset then -            fontdata = tfm.make(specification) +            tfmdata = tfm.make(specification)          else -            fontdata = tfm.read(specification) -            if fontdata then -                tfm.checkvirtualid(fontdata) +            tfmdata = tfm.read(specification) +            if tfmdata then +                tfm.checkvirtualid(tfmdata)              end          end          if cache_them then -            fontdata = containers.write(fonts.cache,hash,fontdata) -- for tracing purposes +            tfmdata = containers.write(fonts.cache,hash,tfmdata) -- for tracing purposes          end -        if fontdata then -            fontdata.hash = hash -            fontdata.cache = "no" +        if tfmdata then +            tfmdata.hash = hash +            tfmdata.cache = "no"              if id then -                definers.register(fontdata,id) +                definers.register(tfmdata,id)              end          end      end -    lastdefined = fontdata or id -- todo ! ! ! ! ! -    if not fontdata then -- or id? -        report_define( "unknown font %s, loading aborted",specification.name) -    elseif trace_defining and type(fontdata) == "table" then -        report_define("using %s font with id %s, name:%s size:%s bytes:%s encoding:%s fullname:%s filename:%s", -            fontdata.type          or "unknown", -            id                     or "?", -            fontdata.name          or "?", -            fontdata.size          or "default", -            fontdata.encodingbytes or "?", -            fontdata.encodingname  or "unicode", -            fontdata.fullname      or "?", -            file.basename(fontdata.filename or "?")) -    end -    local cs = specification.cs -    if cs then -        fontcsnames[cs] = fontdata -- new (beware: locals can be forgotten) +    lastdefined = tfmdata or id -- todo ! ! ! ! ! +    if not tfmdata then -- or id? +        report_defining( "unknown font %s, loading aborted",specification.name) +    elseif trace_defining and type(tfmdata) == "table" then +        report_defining("using %s font with id %s, name:%s size:%s bytes:%s encoding:%s fullname:%s filename:%s", +            tfmdata.type          or "unknown", +            id                    or "?", +            tfmdata.name          or "?", +            tfmdata.size          or "default", +            tfmdata.encodingbytes or "?", +            tfmdata.encodingname  or "unicode", +            tfmdata.fullname      or "?", +            file.basename(tfmdata.filename or "?"))      end      statistics.stoptiming(fonts) -    return fontdata +    return tfmdata  end  function vf.find(name) @@ -676,18 +552,18 @@ function vf.find(name)          local format = fonts.logger.format(name)          if format == 'tfm' or format == 'ofm' then              if trace_defining then -                report_define("locating vf for %s",name) +                report_defining("locating vf for %s",name)              end              return findbinfile(name,"ovf")          else              if trace_defining then -                report_define("vf for %s is already taken care of",name) +                report_defining("vf for %s is already taken care of",name)              end              return nil -- ""          end      else          if trace_defining then -            report_define("locating vf for %s",name) +            report_defining("locating vf for %s",name)          end          return findbinfile(name,"ovf")      end @@ -698,4 +574,4 @@ end  --ldx]]--  callbacks.register('define_font' , definers.read, "definition of fonts (tfmtable preparation)") -callbacks.register('find_vf_file', vf.find    , "locating virtual fonts, insofar needed") -- not that relevant any more +callbacks.register('find_vf_file', vf.find,       "locating virtual fonts, insofar needed") -- not that relevant any more diff --git a/otfl-font-dum.lua b/otfl-font-dum.lua index 14d155a..54b631d 100644 --- a/otfl-font-dum.lua +++ b/otfl-font-dum.lua @@ -11,13 +11,13 @@ fonts = fonts or { }  -- general  fonts.otf.pack              = false -- only makes sense in context -fonts.tfm.resolvevirtualtoo = false -- context specific (du eto resolver) +fonts.tfm.resolvevirtualtoo = false -- context specific (due to resolver)  fonts.tfm.fontnamemode      = "specification" -- somehow latex needs this (changed name!)  -- readers  fonts.tfm.readers          = fonts.tfm.readers or { } -fonts.tfm.readers.sequence = { 'otf', 'ttf', 'tfm' } +fonts.tfm.readers.sequence = { 'otf', 'ttf', 'tfm', 'lua' }  fonts.tfm.readers.afm      = nil  -- define @@ -275,7 +275,7 @@ end  -- bonus  function fonts.otf.nametoslot(name) -    local tfmdata = fonts.ids[font.current()] +    local tfmdata = fonts.identifiers[font.current()]      if tfmdata and tfmdata.shared then          local otfdata = tfmdata.shared.otfdata          local unicode = otfdata.luatex.unicodes[name] @@ -310,3 +310,45 @@ fonts.strippables = table.tohash {      0xE0077, 0xE0078, 0xE0079, 0xE007A, 0xE007B, 0xE007C, 0xE007D, 0xE007E, 0xE007F,  } +-- \font\test=file:somefont:reencode=mymessup +-- +--  fonts.enc.reencodings.mymessup = { +--      [109] = 110, -- m +--      [110] = 109, -- n +--  } + +fonts.enc             = fonts.enc or {} +local reencodings     = { } +fonts.enc.reencodings = reencodings + +local function specialreencode(tfmdata,value) +    -- we forget about kerns as we assume symbols and we +    -- could issue a message if ther are kerns but it's +    -- a hack anyway so we odn't care too much here +    local encoding = value and reencodings[value] +    if encoding then +        local temp = { } +        local char = tfmdata.characters +        for k, v in next, encoding do +            temp[k] = char[v] +        end +        for k, v in next, temp do +            char[k] = temp[k] +        end +        -- if we use the font otherwise luatex gets confused so +        -- we return an additional hash component for fullname +        return string.format("reencoded:%s",value) +    end +end + +local function reencode(tfmdata,value) +    tfmdata.postprocessors = tfmdata.postprocessors or { } +    table.insert(tfmdata.postprocessors, +        function(tfmdata) +            return specialreencode(tfmdata,value) +        end +    ) +end + +table.insert(fonts.manipulators,"reencode") +fonts.initializers.base.otf.reencode = reencode diff --git a/otfl-font-ini.lua b/otfl-font-ini.lua index 6082c1d..df534c6 100644 --- a/otfl-font-ini.lua +++ b/otfl-font-ini.lua @@ -6,6 +6,9 @@ if not modules then modules = { } end modules ['font-ini'] = {      license   = "see context related readme files"  } +-- The font code will be upgraded and reorganized so that we have a +-- leaner generic code base and can do more tuning for context. +  --[[ldx--  <p>Not much is happening here.</p>  --ldx]]-- @@ -16,7 +19,7 @@ local write_nl = texio.write_nl  local lower = string.lower  local allocate, mark = utilities.storage.allocate, utilities.storage.mark -local report_define = logs.new("define fonts") +local report_defining = logs.reporter("fonts","defining")  fontloader.totable = fontloader.to_table @@ -25,14 +28,18 @@ fontloader.totable = fontloader.to_table  fonts = fonts or { } --- we will also have des and fam hashes +-- beware, some already defined --- beware, soem alreadyu defined +fonts.identifiers = mark(fonts.identifiers or { }) -- fontdata +-----.characters  = mark(fonts.characters  or { }) -- chardata +-----.csnames     = mark(fonts.csnames     or { }) -- namedata +-----.quads       = mark(fonts.quads       or { }) -- quaddata -fonts.ids = mark(fonts.ids or { })  fonts.identifiers = fonts.ids -- aka fontdata -fonts.chr = mark(fonts.chr or { })  fonts.characters  = fonts.chr -- aka chardata -fonts.qua = mark(fonts.qua or { })  fonts.quads       = fonts.qua -- aka quaddata -fonts.css = mark(fonts.css or { })  fonts.csnames     = fonts.css -- aka namedata +--~ fonts.identifiers[0] = { -- nullfont +--~     characters   = { }, +--~     descriptions = { }, +--~     name         = "nullfont", +--~ }  fonts.tfm = fonts.tfm or { }  fonts.vf  = fonts.vf  or { } @@ -41,15 +48,7 @@ fonts.pfb = fonts.pfb or { }  fonts.otf = fonts.otf or { }  fonts.privateoffset = 0xF0000 -- 0x10FFFF -fonts.verbose = false -- more verbose cache tables - -fonts.ids[0] = { -- nullfont -    characters   = { }, -    descriptions = { }, -    name         = "nullfont", -} - -fonts.chr[0] = { } +fonts.verbose       = false   -- more verbose cache tables (will move to context namespace)  fonts.methods = fonts.methods or {      base = { tfm = { }, afm = { }, otf = { }, vtf = { }, fix = { } }, @@ -109,7 +108,11 @@ function fonts.fontformat(filename,default)      if format then          return format      else -        report_define("unable to determine font format for '%s'",filename) +        report_defining("unable to determine font format for '%s'",filename)          return default      end  end + +-- readers + +fonts.tfm.readers = fonts.tfm.readers or { } diff --git a/otfl-font-lua.lua b/otfl-font-lua.lua new file mode 100644 index 0000000..a6fcc16 --- /dev/null +++ b/otfl-font-lua.lua @@ -0,0 +1,45 @@ +if not modules then modules = { } end modules ['font-lua'] = { +    version   = 1.001, +    comment   = "companion to font-ini.mkiv", +    author    = "Hans Hagen, PRAGMA-ADE, Hasselt NL", +    copyright = "PRAGMA ADE / ConTeXt Development Team", +    license   = "see context related readme files" +} + +local trace_defining = false  trackers.register("fonts.defining", function(v) trace_defining = v end) + +local report_lua = logs.reporter("fonts","lua loading") + +fonts.formats.lua = "lua" + +local readers = fonts.tfm.readers + +local function check_lua(specification,fullname) +    -- standard tex file lookup +    local fullname = resolvers.findfile(fullname) or "" +    if fullname ~= "" then +        local loader = loadfile(fullname) +        loader = loader and loader() +        return loader and loader(specification) +    end +end + +function readers.lua(specification) +    local original = specification.specification +    if trace_defining then +        report_lua("using lua reader for '%s'",original) +    end +    local fullname, tfmtable = specification.filename or "", nil +    if fullname == "" then +        local forced = specification.forced or "" +        if forced ~= "" then +            tfmtable = check_lua(specification,specification.name .. "." .. forced) +        end +        if not tfmtable then +            tfmtable = check_lua(specification,specification.name) +        end +    else +        tfmtable = check_lua(specification,fullname) +    end +    return tfmtable +end diff --git a/otfl-font-map.lua b/otfl-font-map.lua index b206632..26b22b6 100644 --- a/otfl-font-map.lua +++ b/otfl-font-map.lua @@ -14,7 +14,7 @@ local utfbyte = utf.byte  local trace_loading    = false  trackers.register("otf.loading",    function(v) trace_loading    = v end)  local trace_unimapping = false  trackers.register("otf.unimapping", function(v) trace_unimapping = v end) -local report_otf = logs.new("load otf") +local report_otf = logs.reporter("fonts","otf loading")  --[[ldx--  <p>Eventually this code will disappear because map files are kind @@ -163,11 +163,11 @@ fonts.map.addtounicode = function(data,filename)          cidcodes = usedmap.unicodes      end      uparser = makenameparser() -    local aglmap = fonts.enc and fonts.enc.agl -- to name +    local unicodevector = fonts.enc.agl.unicodes -- loaded runtime in context      for index, glyph in next, data.glyphs do          local name, unic = glyph.name, glyph.unicode or -1 -- play safe          if unic == -1 or unic >= private or (unic >= 0xE000 and unic <= 0xF8FF) or unic == 0xFFFE or unic == 0xFFFF then -            local unicode = (lumunic and lumunic[name]) or (aglmap and aglmap[name]) +            local unicode = (lumunic and lumunic[name]) or unicodevector[name]              if unicode then                  originals[index], tounicode[index], ns = unicode, tounicode16(unicode), ns + 1              end @@ -211,7 +211,7 @@ fonts.map.addtounicode = function(data,filename)                      -- skip                  elseif nplit == 1 then                      local base = split[1] -                    unicode = unicodes[base] or (aglmap and aglmap[base]) +                    unicode = unicodes[base] or unicodevector[base]                      if unicode then                          if type(unicode) == "table" then                              unicode = unicode[1] @@ -222,7 +222,7 @@ fonts.map.addtounicode = function(data,filename)                      local t, n = { }, 0                      for l=1,nplit do                          local base = split[l] -                        local u = unicodes[base] or (aglmap and aglmap[base]) +                        local u = unicodes[base] or unicodevector[base]                          if not u then                              break                          elseif type(u) == "table" then diff --git a/otfl-font-ota.lua b/otfl-font-ota.lua index 18b0bf2..f972d28 100644 --- a/otfl-font-ota.lua +++ b/otfl-font-ota.lua @@ -40,7 +40,7 @@ local has_attribute      = node.has_attribute  local traverse_id        = node.traverse_id  local traverse_node_list = node.traverse -local fontdata           = fonts.ids +local fontdata           = fonts.identifiers  local state              = attributes.private('state')  local categories         = characters and characters.categories or { } -- sorry, only in context diff --git a/otfl-font-otb.lua b/otfl-font-otb.lua index 241845f..8ee39b8 100644 --- a/otfl-font-otb.lua +++ b/otfl-font-otb.lua @@ -23,7 +23,7 @@ local trace_ligatures    = false  trackers.register("otf.ligatures",    function  local trace_kerns        = false  trackers.register("otf.kerns",        function(v) trace_kerns        = v end)  local trace_preparing    = false  trackers.register("otf.preparing",    function(v) trace_preparing    = v end) -local report_prepare = logs.new("otf prepare") +local report_prepare = logs.reporter("fonts","otf prepare")  local wildcard = "*"  local default  = "dflt" diff --git a/otfl-font-otc.lua b/otfl-font-otc.lua index cc7f0ab..93b942f 100644 --- a/otfl-font-otc.lua +++ b/otfl-font-otc.lua @@ -16,7 +16,7 @@ local trace_loading = false  trackers.register("otf.loading", function(v) trace_  local fonts = fonts  local otf   = fonts.otf -local report_otf = logs.new("load otf") +local report_otf = logs.reporter("fonts","otf loading")  -- instead of "script = "DFLT", langs = { 'dflt' }" we now use wildcards (we used to  -- have always); some day we can write a "force always when true" trick for other @@ -35,22 +35,18 @@ local extra_lists = {          {              endash        = "hyphen hyphen",              emdash        = "hyphen hyphen hyphen", -            quotedblleft  = "quoteleft quoteleft", -            quotedblright = "quoteright quoteright", -            quotedblleft  = "grave grave", -            quotedblright = "quotesingle quotesingle", -            quotedblbase  = "comma comma", -            exclamdown    = "exclam grave", -            questiondown  = "question grave", -            guillemotleft = "less less", -            guillemotright= "greater greater", +         -- quotedblleft  = "quoteleft quoteleft", +         -- quotedblright = "quoteright quoteright", +         -- quotedblleft  = "grave grave", +         -- quotedblright = "quotesingle quotesingle", +         -- quotedblbase  = "comma comma",          },      },      trep = {          { -            [0x0022] = 0x201D, +         -- [0x0022] = 0x201D,              [0x0027] = 0x2019, -            [0x0060] = 0x2018, +         -- [0x0060] = 0x2018,          },      },      anum = { @@ -102,14 +98,14 @@ local extra_features = { -- maybe just 1..n so that we prescribe order      },      anum = {          { -            features  = { arab = { FAR = true, dflt = true } }, +            features  = { arab = { URD = true, dflt = true } },              name      = "ctx_anum_1",              subtables = { "ctx_anum_1_s" },              type      = "gsub_single",              flags     = { },          },          { -            features  = { arab = { FAR = true } }, +            features  = { arab = { URD = true } },              name      = "ctx_anum_2",              subtables = { "ctx_anum_2_s" },              type      = "gsub_single", diff --git a/otfl-font-otd.lua b/otfl-font-otd.lua index 910725a..4754816 100644 --- a/otfl-font-otd.lua +++ b/otfl-font-otd.lua @@ -8,11 +8,11 @@ if not modules then modules = { } end modules ['font-otd'] = {  local trace_dynamics = false  trackers.register("otf.dynamics", function(v) trace_dynamics = v end) -local report_otf = logs.new("load otf") +local report_otf = logs.reporter("fonts","otf loading")  local fonts          = fonts  local otf            = fonts.otf -local fontdata       = fonts.ids +local fontdata       = fonts.identifiers  otf.features         = otf.features         or { }  otf.features.default = otf.features.default or { } diff --git a/otfl-font-otf.lua b/otfl-font-otf.lua index 7656f13..c974d89 100644 --- a/otfl-font-otf.lua +++ b/otfl-font-otf.lua @@ -32,44 +32,53 @@ local trace_sequences  = false  trackers.register("otf.sequences",  function(v)  local trace_math       = false  trackers.register("otf.math",       function(v) trace_math         = v end)  local trace_defining   = false  trackers.register("fonts.defining", function(v) trace_defining     = v end) -local report_otf = logs.new("load otf") +local report_otf = logs.reporter("fonts","otf loading")  local starttiming, stoptiming, elapsedtime = statistics.starttiming, statistics.stoptiming, statistics.elapsedtime -local fonts          = fonts +local findbinfile = resolvers.findbinfile -fonts.otf            = fonts.otf or { } -local otf            = fonts.otf -local tfm            = fonts.tfm +local fonts            = fonts -local fontdata       = fonts.ids -local chardata       = characters and characters.data -- not used +fonts.otf              = fonts.otf or { } +local otf              = fonts.otf +local tfm              = fonts.tfm -otf.features         = otf.features         or { } -otf.features.list    = otf.features.list    or { } -otf.features.default = otf.features.default or { } +local fontdata         = fonts.identifiers +local chardata         = characters and characters.data -- not used -otf.enhancers        = allocate() -local enhancers      = otf.enhancers -enhancers.patches    = { } +-- todo: probably first time so local first -local definers       = fonts.definers +otf.features           = otf.features     or { } +local features         = otf.features +features.list          = features.list    or { } +local featurelist      = features.list +features.default       = features.default or { } +local defaultfeatures  = features.default -otf.glists           = { "gsub", "gpos" } +otf.enhancers          = allocate() +local enhancers        = otf.enhancers +enhancers.patches      = { } +local patches          = enhancers.patches -otf.version          = 2.706 -- beware: also sync font-mis.lua -otf.cache            = containers.define("fonts", "otf", otf.version, true) +local definers         = fonts.definers +local readers          = fonts.tfm.readers -local loadmethod     = "table" -- table, mixed, sparse -local forceload      = false -local cleanup        = 0 -local usemetatables  = false -- .4 slower on mk but 30 M less mem so we might change the default -- will be directive -local packdata       = true -local syncspace      = true -local forcenotdef    = false +otf.glists             = { "gsub", "gpos" } -local wildcard       = "*" -local default        = "dflt" +otf.version            = 2.710 -- beware: also sync font-mis.lua +otf.cache              = containers.define("fonts", "otf", otf.version, true) + +local loadmethod       = "table" -- table, mixed, sparse +local forceload        = false +local cleanup          = 0 +local usemetatables    = false -- .4 slower on mk but 30 M less mem so we might change the default -- will be directive +local packdata         = true +local syncspace        = true +local forcenotdef      = false + +local wildcard         = "*" +local default          = "dflt"  local fontloaderfields = fontloader.fields  local mainfields       = nil @@ -264,11 +273,11 @@ local ordered_enhancers = {  local actions = { } -enhancers.patches.before = allocate() -enhancers.patches.after  = allocate() +patches.before = allocate() +patches.after  = allocate() -local before = enhancers.patches.before -local after  = enhancers.patches.after +local before = patches.before +local after  = patches.after  local function enhance(name,data,filename,raw,verbose)      local enhancer = actions[name] @@ -312,9 +321,9 @@ function enhancers.apply(data,filename,raw,verbose)      ioflush() -- we want instant messages  end --- enhancers.patches.register("before","migrate metadata","cambria",function() end) +-- patches.register("before","migrate metadata","cambria",function() end) -function enhancers.patches.register(what,where,pattern,action) +function patches.register(what,where,pattern,action)      local ww = what[where]      if ww then          ww[pattern] = action @@ -323,6 +332,12 @@ function enhancers.patches.register(what,where,pattern,action)      end  end +function patches.report(fmt,...) +    if trace_loading then +        report_otf("patching: " ..fmt,...) +    end +end +  function enhancers.register(what,action) -- only already registered can be overloaded      actions[what] = action  end @@ -332,9 +347,7 @@ function otf.load(filename,format,sub,featurefile)      local attr = lfs.attributes(filename)      local size, time = attr and attr.size or 0, attr and attr.modification or 0      if featurefile then -        local fattr = lfs.attributes(featurefile) -        local fsize, ftime = fattr and fattr.size or 0, fattr and fattr.modification or 0 -        name = name .. "@" .. file.removesuffix(file.basename(featurefile)) .. ftime .. fsize +        name = name .. "@" .. file.removesuffix(file.basename(featurefile))      end      if sub == "" then sub = false end      local hash = name @@ -435,6 +448,7 @@ function otf.load(filename,format,sub,featurefile)                  end                  data.size = size                  data.time = time +                data.format = format                  if featurefiles then                      data.featuredata = featurefiles                  end @@ -545,7 +559,7 @@ end  actions["prepare tables"] = function(data,filename,raw)      local luatex = { -        filename = filename, +        filename = resolvers.unresolve(filename), -- no shortcut          version  = otf.version,          creator  = "context mkiv",      } @@ -966,23 +980,27 @@ actions["reorganize subtables"] = function(data,filename,raw)      end  end +-- the next one is still messy but will get better when we have +-- flattened map/enc tables in the font loader +  actions["prepare unicodes"] = function(data,filename,raw)      local luatex = data.luatex -    local indices, unicodes, multiples, internals = { }, { }, { }, { } -    local mapmap = data.map or raw.map -    local mapenc = nil -- will go away -    if not mapmap then -        report_otf("no map in %s",filename) +    local indices, unicodes, multiples, internals= { }, { }, { }, { } +    local mapdata = data.map or raw.map -- map already moved +    local mapmap +    if not mapdata then +        report_otf("no mapdata in '%s'",filename)          mapmap = { } -        data.map = { map = mapmap } -    elseif not mapmap.map then -        report_otf("no unicode map in %s",filename) +        mapdata = { map = mapmap } +        data.map = mapdata +    elseif not mapdata.map then +        report_otf("no map in mapdata of '%s'",filename)          mapmap = { } -        data.map.map = mapmap +        mapdata.map = mapmap      else -        mapenc = mapmap.enc -- will go away -        mapmap = mapmap.map +        mapmap = mapdata.map      end +    local encname = lower(data.enc_name or raw.enc_name or mapdata.enc_name or "")      local criterium = fonts.privateoffset      local private = criterium      local glyphs = data.glyphs @@ -1028,11 +1046,9 @@ actions["prepare unicodes"] = function(data,filename,raw)          end      end      -- beware: the indices table is used to initialize the tfm table -    local encname = lower(data.enc_name or (mapenc and mapenc[1] and mapenc[1].enc_name) or "") -- mapenc will go away - -- will become: local encname = lower(data.enc_name or "") -    if encname == "" or encname == "unicodebmp" or encname == "unicodefull" then -- maybe find(encname,"unicode") +    if find(encname,"unicode") then -- unicodebmp, unicodefull, ...          if trace_loading then -            report_otf("using extra unicode map") +            report_otf("using embedded unicode map '%s'",encname)          end          -- ok -- we can also consider using the altuni          for unicode, index in next, mapmap do @@ -1394,7 +1410,7 @@ actions["check metadata"] = function(data,filename,raw)      data.map = nil  end -local private_math_parameters = { +local private_mathparameters = {      "FractionDelimiterSize",      "FractionDelimiterDisplayStyleSize",  } @@ -1402,8 +1418,8 @@ local private_math_parameters = {  actions["check math parameters"] = function(data,filename,raw)      local mathdata = data.metadata.math      if mathdata then -        for m=1,#private_math_parameters do -            local pmp = private_math_parameters[m] +        for m=1,#private_mathparameters do +            local pmp = private_mathparameters[m]              if not mathdata[pmp] then                  if trace_loading then                      report_otf("setting math parameter '%s' to 0", pmp) @@ -1523,9 +1539,12 @@ end  -- -- -- -- -- --  -- -- -- -- -- -- -function otf.features.register(name,default) -    otf.features.list[#otf.features.list+1] = name -    otf.features.default[name] = default +function features.register(name,default,description) +    featurelist[#featurelist+1] = name +    defaultfeatures[name] = default +    if description and description ~= "" then +        fonts.otf.tables.features[name] = description +    end  end  -- for context this will become a task handler @@ -1604,11 +1623,6 @@ end  -- we cannot share descriptions as virtual fonts might extend them (ok, we could  -- use a cache with a hash -fonts.formats.dfont = "truetype" -fonts.formats.ttc   = "truetype" -fonts.formats.ttf   = "truetype" -fonts.formats.otf   = "opentype" -  local function copytotfm(data,cache_id) -- we can save a copy when we reorder the tma to unicode (nasty due to one->many)      if data then          local glyphs, pfminfo, metadata = data.glyphs or { }, data.pfminfo or { }, data.metadata or { } @@ -1616,13 +1630,15 @@ local function copytotfm(data,cache_id) -- we can save a copy when we reorder th          local unicodes = luatex.unicodes -- names to unicodes          local indices = luatex.indices          local mode = data.mode or "base" -        local characters, parameters, math_parameters, descriptions = { }, { }, { }, { } +        local characters, parameters, mathparameters, descriptions = { }, { }, { }, { }          local designsize = metadata.designsize or metadata.design_size or 100          if designsize == 0 then              designsize = 100          end          local spaceunits, spacer = 500, "space"          -- indices maps from unicodes to indices +        -- this wil stay as we can manipulate indices +        -- beforehand          for u, i in next, indices do              characters[u] = { } -- we need this because for instance we add protruding info and loop over characters              descriptions[u] = glyphs[i] @@ -1631,7 +1647,7 @@ local function copytotfm(data,cache_id) -- we can save a copy when we reorder th          if metadata.math then              -- parameters              for name, value in next, metadata.math do -                math_parameters[name] = value +                mathparameters[name] = value              end              -- we could use a subset              for u, char in next, characters do @@ -1678,10 +1694,10 @@ local function copytotfm(data,cache_id) -- we can save a copy when we reorder th              end          end          -- end math -        local endash, emdash, space = 0x20, 0x2014, "space" -- unicodes['space'], unicodes['emdash'] +        local space, emdash = 0x20, 0x2014 -- unicodes['space'], unicodes['emdash']          if metadata.isfixedpitch then -            if descriptions[endash] then -                spaceunits, spacer = descriptions[endash].width, "space" +            if descriptions[space] then +                spaceunits, spacer = descriptions[space].width, "space"              end              if not spaceunits and descriptions[emdash] then                  spaceunits, spacer = descriptions[emdash].width, "emdash" @@ -1690,8 +1706,8 @@ local function copytotfm(data,cache_id) -- we can save a copy when we reorder th                  spaceunits, spacer = metadata.charwidth, "charwidth"              end          else -            if descriptions[endash] then -                spaceunits, spacer = descriptions[endash].width, "space" +            if descriptions[space] then +                spaceunits, spacer = descriptions[space].width, "space"              end              if not spaceunits and descriptions[emdash] then                  spaceunits, spacer = descriptions[emdash].width/2, "emdash/2" @@ -1700,7 +1716,7 @@ local function copytotfm(data,cache_id) -- we can save a copy when we reorder th                  spaceunits, spacer = metadata.charwidth, "charwidth"              end          end -        spaceunits = tonumber(spaceunits) or tfm.units/2 -- 500 -- brrr +        spaceunits = tonumber(spaceunits) or 500 -- brrr          -- we need a runtime lookup because of running from cdrom or zip, brrr (shouldn't we use the basename then?)          local filename = fonts.tfm.checkedfilename(luatex)          local fontname = metadata.fontname @@ -1743,10 +1759,14 @@ local function copytotfm(data,cache_id) -- we can save a copy when we reorder th              end          end          -- +        local fileformat = data.format or fonts.fontformat(filename,"opentype") +        if units > 1000  then +            fileformat = "truetype" +        end          return {              characters         = characters,              parameters         = parameters, -            math_parameters    = math_parameters, +            mathparameters     = mathparameters,              descriptions       = descriptions,              indices            = indices,              unicodes           = unicodes, @@ -1755,7 +1775,6 @@ local function copytotfm(data,cache_id) -- we can save a copy when we reorder th              boundarychar_label = 0,              boundarychar       = 65536,              designsize         = (designsize/10)*65536, -            spacer             = "500 units",              encodingbytes      = 2,              mode               = mode,              filename           = filename, @@ -1764,7 +1783,7 @@ local function copytotfm(data,cache_id) -- we can save a copy when we reorder th              psname             = fontname or fullname,              name               = filename or fullname,              units              = units, -            format             = fonts.fontformat(filename,"opentype"), +            format             = fileformat,              cidinfo            = cidinfo,              ascender           = abs(metadata.ascent  or 0),              descender          = abs(metadata.descent or 0), @@ -1814,7 +1833,8 @@ local function otftotfm(specification)                  tfmdata.has_italic = otfdata.metadata.has_italic                  if not tfmdata.language then tfmdata.language = 'dflt' end                  if not tfmdata.script   then tfmdata.script   = 'dflt' end -                shared.processes, shared.features = otf.setfeatures(tfmdata,definers.check(features,otf.features.default)) +                -- at this moment no characters are assinged yet, only empty slots +                shared.processes, shared.features = otf.setfeatures(tfmdata,definers.check(features,defaultfeatures))              end          end          containers.write(tfm.cache,cache_id,tfmdata) @@ -1822,9 +1842,9 @@ local function otftotfm(specification)      return tfmdata  end -otf.features.register('mathsize') +features.register('mathsize') -function tfm.read_from_otf(specification) -- wrong namespace +local function read_from_otf(specification) -- wrong namespace      local tfmtable = otftotfm(specification)      if tfmtable then          local otfdata = tfmtable.shared.otfdata @@ -1910,3 +1930,56 @@ function otf.collectlookups(otfdata,kind,script,language)      end      return nil, nil  end + +-- readers + +fonts.formats.dfont = "truetype" +fonts.formats.ttc   = "truetype" +fonts.formats.ttf   = "truetype" +fonts.formats.otf   = "opentype" + +local function check_otf(forced,specification,suffix,what) +    local name = specification.name +    if forced then +        name = file.addsuffix(name,suffix,true) +    end +    local fullname, tfmtable = findbinfile(name,suffix) or "", nil -- one shot + -- if false then  -- can be enabled again when needed +     -- if fullname == "" then +     --     local fb = fonts.names.old_to_new[name] +     --     if fb then +     --         fullname = findbinfile(fb,suffix) or "" +     --     end +     -- end +     -- if fullname == "" then +     --     local fb = fonts.names.new_to_old[name] +     --     if fb then +     --         fullname = findbinfile(fb,suffix) or "" +     --     end +     -- end + -- end +    if fullname == "" then +        fullname = fonts.names.getfilename(name,suffix) +    end +    if fullname ~= "" then +        specification.filename, specification.format = fullname, what -- hm, so we do set the filename, then +        tfmtable = read_from_otf(specification)                       -- we need to do it for all matches / todo +    end +    return tfmtable +end + +function readers.opentype(specification,suffix,what) +    local forced = specification.forced or "" +    if forced == "otf" then +        return check_otf(true,specification,forced,"opentype") +    elseif forced == "ttf" or forced == "ttc" or forced == "dfont" then +        return check_otf(true,specification,forced,"truetype") +    else +        return check_otf(false,specification,suffix,what) +    end +end + +function readers.otf  (specification) return readers.opentype(specification,"otf","opentype") end +function readers.ttf  (specification) return readers.opentype(specification,"ttf","truetype") end +function readers.ttc  (specification) return readers.opentype(specification,"ttf","truetype") end -- !! +function readers.dfont(specification) return readers.opentype(specification,"ttf","truetype") end -- !! diff --git a/otfl-font-otn.lua b/otfl-font-otn.lua index ec246d2..6c5ba12 100644 --- a/otfl-font-otn.lua +++ b/otfl-font-otn.lua @@ -148,11 +148,11 @@ local trace_steps        = false  trackers.register("otf.steps",        function  local trace_skips        = false  trackers.register("otf.skips",        function(v) trace_skips        = v end)  local trace_directions   = false  trackers.register("otf.directions",   function(v) trace_directions   = v end) -local report_direct   = logs.new("otf direct") -local report_subchain = logs.new("otf subchain") -local report_chain    = logs.new("otf chain") -local report_process  = logs.new("otf process") -local report_prepare  = logs.new("otf prepare") +local report_direct   = logs.reporter("fonts","otf direct") +local report_subchain = logs.reporter("fonts","otf subchain") +local report_chain    = logs.reporter("fonts","otf chain") +local report_process  = logs.reporter("fonts","otf process") +local report_prepare  = logs.reporter("fonts","otf prepare")  trackers.register("otf.verbose_chain", function(v) otf.setcontextchain(v and "verbose") end)  trackers.register("otf.normal_chain",  function(v) otf.setcontextchain(v and "normal")  end) @@ -211,7 +211,7 @@ local markonce = true  local cursonce = true  local kernonce = true -local fontdata = fonts.ids +local fontdata = fonts.identifiers  otf.features.process = { } @@ -239,7 +239,7 @@ local contextsetups  = specifiers.contextsetups  local contextnumbers = specifiers.contextnumbers  local contextmerged  = specifiers.contextmerged --- we cannot optimize with "start = first_character(head)" because then we don't +-- we cannot optimize with "start = first_glyph(head)" because then we don't  -- know which rlmode we're in which messes up cursive handling later on  --  -- head is always a whatsit so we can safely assume that head is not changed diff --git a/otfl-font-tfm.lua b/otfl-font-tfm.lua index e8b2427..5e841b2 100644 --- a/otfl-font-tfm.lua +++ b/otfl-font-tfm.lua @@ -16,7 +16,7 @@ local allocate = utilities.storage.allocate  local trace_defining = false  trackers.register("fonts.defining", function(v) trace_defining = v end)  local trace_scaling  = false  trackers.register("fonts.scaling" , function(v) trace_scaling  = v end) -local report_define = logs.new("define fonts") +local report_defining = logs.reporter("fonts","defining")  -- tfmdata has also fast access to indices and unicodes  -- to be checked: otf -> tfm -> tfmscaled @@ -37,8 +37,10 @@ fonts.initializers        = fonts.initializers or { }  fonts.initializers.common = fonts.initializers.common or { }  local set_attribute = node.set_attribute +local findbinfile   = resolvers.findbinfile -local fontdata   = fonts.ids +local readers    = fonts.tfm.readers +local fontdata   = fonts.identifiers  local nodecodes  = nodes.nodecodes  local disc_code  = nodecodes.disc @@ -56,20 +58,18 @@ tfm.fontnamemode      = "fullpath"  tfm.enhance = tfm.enhance or function() end -fonts.formats.tfm = "type1" -- we need to have at least a value here - -function tfm.read_from_tfm(specification) +local function read_from_tfm(specification)      local fname, tfmdata = specification.filename or "", nil      if fname ~= "" then          if trace_defining then -            report_define("loading tfm file %s at size %s",fname,specification.size) +            report_defining("loading tfm file %s at size %s",fname,specification.size)          end          tfmdata = font.read_tfm(fname,specification.size) -- not cached, fast enough          if tfmdata then              tfmdata.descriptions = tfmdata.descriptions or { }              if tfm.resolvevirtualtoo then                  fonts.logger.save(tfmdata,file.extname(fname),specification) -- strange, why here -                fname = resolvers.findbinfile(specification.name, 'ovf') +                fname = findbinfile(specification.name, 'ovf')                  if fname and fname ~= "" then                      local vfdata = font.read_vf(fname,specification.size) -- not cached, fast enough                      if vfdata then @@ -85,7 +85,7 @@ function tfm.read_from_tfm(specification)              tfm.enhance(tfmdata,specification)          end      elseif trace_defining then -        report_define("loading tfm with name %s fails",specification.name) +        report_defining("loading tfm with name %s fails",specification.name)      end      return tfmdata  end @@ -279,7 +279,9 @@ function tfm.scale(tfmtable, scaledpoints, relativeid)   -- tfm.prepare_base_kerns(tfmtable) -- optimalization      local t = { } -- the new table      local scaledpoints, delta, units = tfm.calculatescale(tfmtable, scaledpoints, relativeid) +    -- is just a trigger for the backend      t.units_per_em = units or 1000 +    --      local hdelta, vdelta = delta, delta      -- unicoded unique descriptions shared cidinfo characters changed parameters indices      for k,v in next, tfmtable do @@ -304,7 +306,7 @@ function tfm.scale(tfmtable, scaledpoints, relativeid)      end      -- status      local isvirtual = tfmtable.type == "virtual" or tfmtable.virtualized -    local hasmath = (tfmtable.math_parameters ~= nil and next(tfmtable.math_parameters) ~= nil) or (tfmtable.MathConstants ~= nil and next(tfmtable.MathConstants) ~= nil) +    local hasmath = (tfmtable.mathparameters ~= nil and next(tfmtable.mathparameters) ~= nil) or (tfmtable.MathConstants ~= nil and next(tfmtable.MathConstants) ~= nil)      local nodemode = tfmtable.mode == "node"      local hasquality = tfmtable.auto_expand or tfmtable.auto_protrude      local hasitalic = tfmtable.has_italic @@ -322,15 +324,18 @@ function tfm.scale(tfmtable, scaledpoints, relativeid)      t.unicodes = tfmtable.unicodes      t.indices = tfmtable.indices      t.marks = tfmtable.marks +    -- this will move to some subtable so that it is copied at once      t.goodies = tfmtable.goodies      t.colorscheme = tfmtable.colorscheme +    t.postprocessors = tfmtable.postprocessors +    --   -- t.embedding = tfmtable.embedding      t.descriptions = descriptions      if tfmtable.fonts then          t.fonts = table.fastcopy(tfmtable.fonts) -- hm  also at the end      end      local tp = t.parameters -    local mp = t.math_parameters +    local mp = t.mathparameters      local tfmp = tfmtable.parameters -- let's check for indexes      --      tp.slant         = (tfmp.slant         or tfmp[1] or 0) @@ -421,7 +426,7 @@ function tfm.scale(tfmtable, scaledpoints, relativeid)              end          end      --  if trace_scaling then -    --      report_define("t=%s, u=%s, i=%s, n=%s c=%s",k,chr.tounicode or k,description.index,description.name or '-',description.class or '-') +    --    report_defining("t=%s, u=%s, i=%s, n=%s c=%s",k,chr.tounicode or "",index or 0,description.name or '-',description.class or '-')      --  end          if tounicode then              local tu = tounicode[index] -- nb: index! @@ -458,7 +463,7 @@ function tfm.scale(tfmtable, scaledpoints, relativeid)              if vn then                  chr.next = vn              --~ if v.vert_variants or v.horiz_variants then -            --~     report_define("glyph 0x%05X has combination of next, vert_variants and horiz_variants",index) +            --~     report_defining("glyph 0x%05X has combination of next, vert_variants and horiz_variants",index)              --~ end              else                  local vv = v.vert_variants @@ -592,6 +597,7 @@ function tfm.scale(tfmtable, scaledpoints, relativeid)                  else                      chr.commands = vc                  end +                chr.index = nil              end          end          tc[k] = chr @@ -629,11 +635,11 @@ function tfm.scale(tfmtable, scaledpoints, relativeid)      -- can have multiple subfonts      if hasmath then          if trace_defining then -            report_define("math enabled for: name '%s', fullname: '%s', filename: '%s'",t.name or "noname",t.fullname or "nofullname",t.filename or "nofilename") +            report_defining("math enabled for: name '%s', fullname: '%s', filename: '%s'",t.name or "noname",t.fullname or "nofullname",t.filename or "nofilename")          end      else          if trace_defining then -            report_define("math disabled for: name '%s', fullname: '%s', filename: '%s'",t.name or "noname",t.fullname or "nofullname",t.filename or "nofilename") +            report_defining("math disabled for: name '%s', fullname: '%s', filename: '%s'",t.name or "noname",t.fullname or "nofullname",t.filename or "nofilename")          end          t.nomath, t.MathConstants = true, nil      end @@ -642,8 +648,8 @@ function tfm.scale(tfmtable, scaledpoints, relativeid)          t.psname = t.fontname or (t.fullname and fonts.names.cleanname(t.fullname))      end      if trace_defining then -        report_define("used for accessing (sub)font: '%s'",t.psname or "nopsname") -        report_define("used for subsetting: '%s'",t.fontname or "nofontname") +        report_defining("used for accessing (sub)font: '%s'",t.psname or "nopsname") +        report_defining("used for subsetting: '%s'",t.fontname or "nofontname")      end      -- this will move up (side effect of merging split call)      t.factor    = delta @@ -743,20 +749,21 @@ function tfm.checkedfilename(metadata,whatever)      if not foundfilename then          local askedfilename = metadata.filename or ""          if askedfilename ~= "" then -            foundfilename = resolvers.findbinfile(askedfilename,"") or "" +            askedfilename = resolvers.resolve(askedfilename) -- no shortcut +            foundfilename = findbinfile(askedfilename,"") or ""              if foundfilename == "" then -                report_define("source file '%s' is not found",askedfilename) -                foundfilename = resolvers.findbinfile(file.basename(askedfilename),"") or "" +                report_defining("source file '%s' is not found",askedfilename) +                foundfilename = findbinfile(file.basename(askedfilename),"") or ""                  if foundfilename ~= "" then -                    report_define("using source file '%s' (cache mismatch)",foundfilename) +                    report_defining("using source file '%s' (cache mismatch)",foundfilename)                  end              end          elseif whatever then -            report_define("no source file for '%s'",whatever) +            report_defining("no source file for '%s'",whatever)              foundfilename = ""          end          metadata.foundfilename = foundfilename -    --  report_define("using source file '%s'",foundfilename) +    --  report_defining("using source file '%s'",foundfilename)      end      return foundfilename  end @@ -766,3 +773,41 @@ end  statistics.register("fonts load time", function()      return statistics.elapsedseconds(fonts)  end) + +-- readers + +fonts.formats.tfm = "type1" -- we need to have at least a value here + +local function check_tfm(specification,fullname) +    -- ofm directive blocks local path search unless set; btw, in context we +    -- don't support ofm files anyway as this format is obsolete +    local foundname = findbinfile(fullname, 'tfm') or "" -- just to be sure +    if foundname == "" then +        foundname = findbinfile(fullname, 'ofm') or "" -- bonus for usage outside context +    end +    if foundname == "" then +        foundname = fonts.names.getfilename(fullname,"tfm") +    end +    if foundname ~= "" then +        specification.filename, specification.format = foundname, "ofm" +        return read_from_tfm(specification) +    end +end + +readers.check_tfm = check_tfm + +function readers.tfm(specification) +    local fullname, tfmtable = specification.filename or "", nil +    if fullname == "" then +        local forced = specification.forced or "" +        if forced ~= "" then +            tfmtable = check_tfm(specification,specification.name .. "." .. forced) +        end +        if not tfmtable then +            tfmtable = check_tfm(specification,specification.name) +        end +    else +        tfmtable = check_tfm(specification,fullname) +    end +    return tfmtable +end diff --git a/otfl-font-xtx.lua b/otfl-font-xtx.lua index 574e161..505e085 100644 --- a/otfl-font-xtx.lua +++ b/otfl-font-xtx.lua @@ -40,155 +40,47 @@ local list = { }  specifiers.colonizedpreference = "file" -local function isstyle(s) -    local style  = string.lower(s):split("/") -    for _,v in ipairs(style) do -        if v == "b" then -            list.style = "bold" -        elseif v == "i" then -            list.style = "italic" -        elseif v == "bi" or v == "ib" then -            list.style = "bolditalic" -        elseif v:find("^s=") then -            list.optsize = v:split("=")[2] -        elseif v == "aat" or v == "icu" or v == "gr" then -            logs.report("load font", "unsupported font option: %s", v) -        elseif not v:is_empty() then -            list.style = v:gsub("[^%a%d]", "") -        end -    end -end - -fonts      = fonts      or { } -fonts.otf  = fonts.otf  or { } - -local otf  = fonts.otf - -otf.tables = otf.tables or { } - -otf.tables.defaults = { -    dflt = { -        "ccmp", "locl", "rlig", "liga", "clig", -        "kern", "mark", "mkmk", -    }, -    arab = { -        "ccmp", "locl", "isol", "fina", "fin2", -        "fin3", "medi", "med2", "init", "rlig", -        "calt", "liga", "cswh", "mset", "curs", -        "kern", "mark", "mkmk", -    }, -    deva = { -        "ccmp", "locl", "init", "nukt", "akhn", -        "rphf", "blwf", "half", "pstf", "vatu", -        "pres", "blws", "abvs", "psts", "haln", -        "calt", "blwm", "abvm", "dist", "kern", -        "mark", "mkmk", -    }, -    khmr = { -        "ccmp", "locl", "pref", "blwf", "abvf", -        "pstf", "pres", "blws", "abvs", "psts", -        "clig", "calt", "blwm", "abvm", "dist", -        "kern", "mark", "mkmk", -    }, -    thai = { -        "ccmp", "locl", "liga", "kern", "mark", -        "mkmk", -    }, -    hang = { -        "ccmp", "ljmo", "vjmo", "tjmo", -    }, -} - -otf.tables.defaults.beng = otf.tables.defaults.deva -otf.tables.defaults.guru = otf.tables.defaults.deva -otf.tables.defaults.gujr = otf.tables.defaults.deva -otf.tables.defaults.orya = otf.tables.defaults.deva -otf.tables.defaults.taml = otf.tables.defaults.deva -otf.tables.defaults.telu = otf.tables.defaults.deva -otf.tables.defaults.knda = otf.tables.defaults.deva -otf.tables.defaults.mlym = otf.tables.defaults.deva -otf.tables.defaults.sinh = otf.tables.defaults.deva - -otf.tables.defaults.syrc = otf.tables.defaults.arab -otf.tables.defaults.mong = otf.tables.defaults.arab -otf.tables.defaults.nko  = otf.tables.defaults.arab - -otf.tables.defaults.tibt = otf.tables.defaults.khmr - -otf.tables.defaults.lao  = otf.tables.defaults.thai - -local function parse_script(script) -    if otf.tables.scripts[script] then -        local dflt -        if otf.tables.defaults[script] then -            logs.report("load font", "auto-selecting default features for script: %s", script) -            dflt = otf.tables.defaults[script] -        else -            logs.report("load font", "auto-selecting default features for script: dflt (was %s)", script) -            dflt = otf.tables.defaults["dflt"] -        end -        for _,v in next, dflt do -            list[v] = "yes" -        end -    else -        logs.report("load font", "unknown script: %s", script) -    end -end - -specifiers.colonizedpreference = "file" -  local function issome ()    list.lookup = specifiers.colonizedpreference end  local function isfile ()    list.lookup = 'file' end  local function isname ()    list.lookup = 'name' end  local function thename(s)   list.name   = s end  local function issub  (v)   list.sub    = v end +local function iscrap (s)   list.crap   = string.lower(s) end +local function istrue (s)   list[s]     = 'yes' end +local function isfalse(s)   list[s]     = 'no' end +local function iskey  (k,v) list[k]     = v end +  local function istrue (s)   list[s]     = true end  local function isfalse(s)   list[s]     = false end -local function iskey  (k,v) -    if k == "script" then -        parse_script(v) -    end -    list[k] = v -end  local P, S, R, C = lpeg.P, lpeg.S, lpeg.R, lpeg.C  local spaces     = P(" ")^0  local namespec   = (1-S("/:("))^0 -- was: (1-S("/: ("))^0 -local filespec   = (R("az", "AZ") * P(":"))^-1 * (1-S(":("))^1 -local stylespec  = spaces * P("/") * (((1-P(":"))^0)/isstyle) * spaces -local filename   = (P("file:")/isfile * (filespec/thename)) + (P("[") * P(true)/isname * (((1-P("]"))^0)/thename) * P("]")) +local crapspec   = spaces * P("/") * (((1-P(":"))^0)/iscrap) * spaces +local filename   = (P("file:")/isfile * (namespec/thename)) + (P("[") * P(true)/isname * (((1-P("]"))^0)/thename) * P("]"))  local fontname   = (P("name:")/isname * (namespec/thename)) + P(true)/issome * (namespec/thename)  local sometext   = (R("az","AZ","09") + S("+-."))^1  local truevalue  = P("+") * spaces * (sometext/istrue)  local falsevalue = P("-") * spaces * (sometext/isfalse) -local keyvalue   = P("+") + (C(sometext) * spaces * P("=") * spaces * C(sometext))/iskey +local keyvalue   = (C(sometext) * spaces * P("=") * spaces * C(sometext))/iskey  local somevalue  = sometext/istrue  local subvalue   = P("(") * (C(P(1-S("()"))^1)/issub) * P(")") -- for Kim  local option     = spaces * (keyvalue + falsevalue + truevalue + somevalue) * spaces  local options    = P(":") * spaces * (P(";")^0  * option)^0 -local pattern    = (filename + fontname) * subvalue^0 * stylespec^0 * options^0 +local pattern    = (filename + fontname) * subvalue^0 * crapspec^0 * options^0  local function colonized(specification) -- xetex mode      list = { }      lpegmatch(pattern,specification.specification) -    if list.style then -        specification.style = list.style -        list.style = nil -    end -    if list.optsize then -        specification.optsize = list.optsize -        list.optsize = nil -    end + -- for k, v in next, list do + --     list[k] = is_boolean(v) + --     if type(list[a]) == "nil" then + --         list[k] = v + --     end + -- end +    list.crap = nil -- style not supported, maybe some day      if list.name then -        if resolvers.findfile(list.name, "tfm") then -            list.lookup = "file" -            list.name   = file.addsuffix(list.name, "tfm") -        elseif resolvers.findfile(list.name, "ofm") then -            list.lookup = "file" -            list.name   = file.addsuffix(list.name, "ofm") -        end -          specification.name = list.name          list.name = nil      end @@ -205,4 +97,4 @@ local function colonized(specification) -- xetex mode      return specification  end -definers.registersplit(":",colonized) +definers.registersplit(":",colonized,"cryptic") diff --git a/otfl-luat-dum.lua b/otfl-luat-dum.lua index bd10e89..e0b6292 100644 --- a/otfl-luat-dum.lua +++ b/otfl-luat-dum.lua @@ -7,6 +7,7 @@ if not modules then modules = { } end modules ['luat-dum'] = {  }  local dummyfunction = function() end +local dummyreporter = function(c) return function(...) texio.write(c .. " : " .. string.format(...)) end end  statistics = {      register      = dummyfunction, @@ -34,9 +35,10 @@ storage = { -- probably no longer needed      shared        = { },  }  logs = { -    new           = function() return dummyfunction end, +    new           = dummyreporter, +    reporter      = dummyreporter, +    messenger     = dummyreporter,      report        = dummyfunction, -    simple        = dummyfunction,  }  callbacks = {      register = function(n,f) return callback.register(n,f) end, @@ -62,15 +64,19 @@ local remapper = {      otf   = "opentype fonts",      ttf   = "truetype fonts",      ttc   = "truetype fonts", -    dfont = "truetype fonts", +    dfont = "truetype fonts", -- "truetype dictionary",      cid   = "cid maps",      fea   = "font feature files",  }  function resolvers.findfile(name,kind)      name = string.gsub(name,"\\","\/") -    kind = string.lower(kind) -    return kpse.find_file(name,(kind and kind ~= "" and (remapper[kind] or kind)) or file.extname(name,"tex")) +    kind = kind and string.lower(kind) +    local found = kpse.find_file(name,(kind and kind ~= "" and (remapper[kind] or kind)) or file.extname(name,"tex")) +    if not found or found == "" then +        found = kpse.find_file(name,"other text file") +    end +    return found  end  function resolvers.findbinfile(name,kind) @@ -80,6 +86,14 @@ function resolvers.findbinfile(name,kind)      return resolvers.findfile(name,(kind and remapper[kind]) or kind)  end +function resolvers.resolve(s) +    return s +end + +function resolvers.unresolve(s) +    return s +end +  -- Caches ... I will make a real stupid version some day when I'm in the  -- mood. After all, the generic code does not need the more advanced  -- ConTeXt features. Cached data is not shared between ConTeXt and other @@ -98,41 +112,43 @@ end  do -    local cachepaths +    local cachepaths = kpse.expand_path('$TEXMFCACHE') or "" + +    if cachepaths == "" then +        cachepaths = kpse.expand_path('$TEXMFVAR') +    end -    if kpse.expand_var('$TEXMFCACHE') ~= '$TEXMFCACHE' then -        cachepaths = kpse.expand_var('$TEXMFCACHE') -    elseif kpse.expand_var('$TEXMFVAR') ~= '$TEXMFVAR' then -        cachepaths = kpse.expand_var('$TEXMFVAR') +    if cachepaths == "" then +        cachepaths = kpse.expand_path('$VARTEXMF')      end -    if not cachepaths then +    if cachepaths == "" then          cachepaths = "."      end      cachepaths = string.split(cachepaths,os.type == "windows" and ";" or ":")      for i=1,#cachepaths do -        local done -        writable = file.join(cachepaths[i], "luatex-cache") -        writable = file.join(writable,caches.namespace) -        writable, done = dir.mkdirs(writable) -        if done then +        if file.is_writable(cachepaths[i]) then +            writable = file.join(cachepaths[i],"luatex-cache") +            lfs.mkdir(writable) +            writable = file.join(writable,caches.namespace) +            lfs.mkdir(writable)              break          end      end      for i=1,#cachepaths do -        if file.isreadable(cachepaths[i]) then +        if file.is_readable(cachepaths[i]) then              readables[#readables+1] = file.join(cachepaths[i],"luatex-cache",caches.namespace)          end      end      if not writable then -        texio.write_nl("quiting: fix your writable cache path\n") +        texio.write_nl("quiting: fix your writable cache path")          os.exit()      elseif #readables == 0 then -        texio.write_nl("quiting: fix your readable cache path\n") +        texio.write_nl("quiting: fix your readable cache path")          os.exit()      elseif #readables == 1 and readables[1] == writable then          texio.write(string.format("(using cache: %s)",writable)) diff --git a/otfl-node-inj.lua b/otfl-node-inj.lua index e4380a4..bf6a609 100644 --- a/otfl-node-inj.lua +++ b/otfl-node-inj.lua @@ -6,7 +6,7 @@ if not modules then modules = { } end modules ['node-inj'] = {      license   = "see context related readme files"  } --- tricky ... fonts.ids is not yet defined .. to be solved (maybe general tex ini) +-- tricky ... fonts.identifiers is not yet defined .. to be solved (maybe general tex ini)  -- This is very experimental (this will change when we have luatex > .50 and  -- a few pending thingies are available. Also, Idris needs to make a few more @@ -17,22 +17,22 @@ local next = next  local trace_injections = false  trackers.register("nodes.injections", function(v) trace_injections = v end) -local report_injections = logs.new("injections") +local report_injections = logs.reporter("nodes","injections")  local attributes, nodes, node = attributes, nodes, node -fonts     = fonts      or { } -fonts.tfm = fonts.tfm  or { } -fonts.ids = fonts.ids  or { } +fonts                    = fonts or { } +fonts.tfm                = fonts.tfm or { } +fonts.identifiers        = fonts.identifiers or { } -nodes.injections = nodes.injections or { } -local injections = nodes.injections +nodes.injections         = nodes.injections or { } +local injections         = nodes.injections -local fontdata   = fonts.ids -local nodecodes  = nodes.nodecodes -local glyph_code = nodecodes.glyph -local nodepool   = nodes.pool -local newkern    = nodepool.kern +local fontdata           = fonts.identifiers +local nodecodes          = nodes.nodecodes +local glyph_code         = nodecodes.glyph +local nodepool           = nodes.pool +local newkern            = nodepool.kern  local traverse_id        = node.traverse_id  local unset_attribute    = node.unset_attribute  | 
