aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/dict
diff options
context:
space:
mode:
authorrsc <devnull@localhost>2003-11-25 03:37:45 +0000
committerrsc <devnull@localhost>2003-11-25 03:37:45 +0000
commit08708877939323c1e1cb87210193ec25fc472ff7 (patch)
treebd34e2144a3e9532ab228619d7ae8d4a0078aeeb /src/cmd/dict
parent091f74d0a0db5ba1e098a518922525cb032a97b4 (diff)
downloadplan9port-08708877939323c1e1cb87210193ec25fc472ff7.tar.gz
plan9port-08708877939323c1e1cb87210193ec25fc472ff7.tar.bz2
plan9port-08708877939323c1e1cb87210193ec25fc472ff7.zip
add dict
Diffstat (limited to 'src/cmd/dict')
-rw-r--r--src/cmd/dict/ahd.c139
-rw-r--r--src/cmd/dict/canonind.awk29
-rw-r--r--src/cmd/dict/comfix.awk56
-rw-r--r--src/cmd/dict/dict.c681
-rw-r--r--src/cmd/dict/dict.h160
-rwxr-xr-xsrc/cmd/dict/egfix15
-rwxr-xr-xsrc/cmd/dict/egfix28
-rw-r--r--src/cmd/dict/gb2312.c1108
-rwxr-xr-xsrc/cmd/dict/gefix23
-rwxr-xr-xsrc/cmd/dict/getneeds8
-rw-r--r--src/cmd/dict/jis208.c1059
-rw-r--r--src/cmd/dict/kuten.h114
-rw-r--r--src/cmd/dict/mkfile18
-rw-r--r--src/cmd/dict/mkindex.c106
-rw-r--r--src/cmd/dict/movie.c328
-rw-r--r--src/cmd/dict/oed.c1425
-rw-r--r--src/cmd/dict/pcollins.c226
-rw-r--r--src/cmd/dict/pcollinsg.c248
-rw-r--r--src/cmd/dict/pgw.c1165
-rw-r--r--src/cmd/dict/rev.awk6
-rw-r--r--src/cmd/dict/robert.c312
-rw-r--r--src/cmd/dict/simple.c46
-rw-r--r--src/cmd/dict/slang.c203
-rw-r--r--src/cmd/dict/t.awk13
-rw-r--r--src/cmd/dict/thesaurus.c86
-rw-r--r--src/cmd/dict/utils.c577
-rw-r--r--src/cmd/dict/world.c184
27 files changed, 8343 insertions, 0 deletions
diff --git a/src/cmd/dict/ahd.c b/src/cmd/dict/ahd.c
new file mode 100644
index 00000000..18a56d00
--- /dev/null
+++ b/src/cmd/dict/ahd.c
@@ -0,0 +1,139 @@
+#include <u.h>
+#include <libc.h>
+#include <bio.h>
+#include "dict.h"
+
+/*
+ * American Heritage Dictionary (encrypted)
+ */
+
+static Rune intab[256] = {
+ [0x82] 0xe9,
+ [0x85] 0xe0,
+ [0x89] 0xeb,
+ [0x8a] 0xe8,
+ [0xa4] 0xf1,
+ [0xf8] 0xb0,
+ [0xf9] 0xb7,
+};
+
+static char tag[64];
+
+enum{
+ Run, Openper, Openat, Closeat
+};
+
+void
+ahdprintentry(Entry e, int cmd)
+{
+ static int inited;
+ long addr;
+ char *p, *t = tag;
+ int obreaklen;
+ int c, state = Run;
+
+ if(!inited){
+ for(c=0; c<256; c++)
+ if(intab[c] == 0)
+ intab[c] = c;
+ inited = 1;
+ }
+ obreaklen = breaklen;
+ breaklen = 80;
+ addr = e.doff;
+ for(p=e.start; p<e.end; p++){
+ c = intab[(*p ^ (addr++>>1))&0xff];
+ switch(state){
+ case Run:
+ if(c == '%'){
+ t = tag;
+ state = Openper;
+ break;
+ }
+ Putchar:
+ if(c == '\n')
+ outnl(0);
+ else if(c < Runeself)
+ outchar(c);
+ else
+ outrune(c);
+ break;
+
+ case Openper:
+ if(c == '@')
+ state = Openat;
+ else{
+ outchar('%');
+ state = Run;
+ goto Putchar;
+ }
+ break;
+
+ case Openat:
+ if(c == '@')
+ state = Closeat;
+ else if(t < &tag[sizeof tag-1])
+ *t++ = c;
+ break;
+
+ case Closeat:
+ if(c == '%'){
+ *t = 0;
+ switch(cmd){
+ case 'h':
+ if(strcmp("EH", tag) == 0)
+ goto out;
+ break;
+ case 'r':
+ outprint("%%@%s@%%", tag);
+ break;
+ }
+ state = Run;
+ }else{
+ if(t < &tag[sizeof tag-1])
+ *t++ = '@';
+ if(t < &tag[sizeof tag-1])
+ *t++ = c;
+ state = Openat;
+ }
+ break;
+ }
+ }
+out:
+ outnl(0);
+ breaklen = obreaklen;
+}
+
+long
+ahdnextoff(long fromoff)
+{
+ static char *patterns[] = { "%@NL@%", "%@2@%", 0 };
+ int c, k = 0, state = 0;
+ char *pat = patterns[0];
+ long defoff = -1;
+
+ if(Bseek(bdict, fromoff, 0) < 0)
+ return -1;
+ while((c = Bgetc(bdict)) >= 0){
+ c ^= (fromoff++>>1)&0xff;
+ if(c != pat[state]){
+ state = 0;
+ continue;
+ }
+ if(pat[++state])
+ continue;
+ if(pat = patterns[++k]){ /* assign = */
+ state = 0;
+ defoff = fromoff-6;
+ continue;
+ }
+ return fromoff-5;
+ }
+ return defoff;
+}
+
+void
+ahdprintkey(void)
+{
+ Bprint(bout, "No pronunciations.\n");
+}
diff --git a/src/cmd/dict/canonind.awk b/src/cmd/dict/canonind.awk
new file mode 100644
index 00000000..41c6ee75
--- /dev/null
+++ b/src/cmd/dict/canonind.awk
@@ -0,0 +1,29 @@
+# turn output of mkindex into form needed by dict
+BEGIN {
+ if(ARGC != 2) {
+ print "Usage: awk -F' ' -f canonind.awk rawindex > index"
+ exit 1
+ }
+ file = ARGV[1]
+ ARGV[1] = ""
+ while ((getline < file) > 0) {
+ for(i = 2; i <= NF; i++) {
+ w = $i
+ if(length(w) == 0)
+ continue
+ b = index(w, "(")
+ e = index(w, ")")
+ if(b && e && b < e) {
+ w1 = substr(w, 1, b-1)
+ w2 = substr(w, b+1, e-b-1)
+ w3 = substr(w, e+1)
+ printf "%s%s\t%d\n", w1, w3, $1 > "junk"
+ printf "%s%s%s\t%d\n", w1, w2, w3, $1 > "junk"
+ } else
+ printf "%s\t%d\n", w, $1 > "junk"
+ }
+ }
+ system("sort -u -t' ' +0f -1 +0 -1 +1n -2 < junk")
+ system("rm junk")
+ exit 0
+}
diff --git a/src/cmd/dict/comfix.awk b/src/cmd/dict/comfix.awk
new file mode 100644
index 00000000..9a51b98e
--- /dev/null
+++ b/src/cmd/dict/comfix.awk
@@ -0,0 +1,56 @@
+# when raw index has a lot of entries like
+# 1578324 problematico, a, ci, che
+# apply this algorithm:
+# treat things after comma as suffixes
+# for each suffix:
+# if single letter, replace last letter
+# else search backwards for beginning of suffix
+# and if it leads to an old suffix of approximately
+# the same length, put replace that suffix
+# This will still leave some commas to fix by hand
+# Usage: awk -F' ' -f comfix.awk rawindex > newrawindex
+
+NF == 2 {
+ i = index($2, ",")
+ if(i == 0 || length($2) == 0)
+ print $0
+ else {
+ n = split($2, a, /,[ ]*/)
+ w = a[1]
+ printf "%s\t%s\n", $1, w
+ for(i = 2; i <= n; i++) {
+ suf = a[i]
+ m = matchsuflen(w, suf)
+ if(m) {
+ nw = substr(w, 1, length(w)-m) suf
+ printf "%s\t%s\n", $1, nw
+ } else
+ printf "%s\t%s\n", $1, w ", " suf
+ }
+ }
+ }
+NF != 2 {
+ print $0
+ }
+
+function matchsuflen(w, suf, wlen,suflen,c,pat,k,d)
+{
+ wlen = length(w)
+ suflen = length(suf)
+ if(suflen == 1)
+ return 1
+ else {
+ c = substr(suf, 1, 1)
+ for (k = 1; k <= wlen ; k++)
+ if(substr(w, wlen-k+1, 1) == c)
+ break
+ if(k > wlen)
+ return 0
+ d = k-suflen
+ if(d < 0)
+ d = -d
+ if(d > 3)
+ return 0
+ return k
+ }
+}
diff --git a/src/cmd/dict/dict.c b/src/cmd/dict/dict.c
new file mode 100644
index 00000000..bafe90d5
--- /dev/null
+++ b/src/cmd/dict/dict.c
@@ -0,0 +1,681 @@
+#include <u.h>
+#include <libc.h>
+#include <bio.h>
+#include <regexp.h>
+#include <ctype.h>
+#include "dict.h"
+
+/*
+ * Assumed index file structure: lines of form
+ * [^\t]+\t[0-9]+
+ * First field is key, second is byte offset into dictionary.
+ * Should be sorted with args -u -t' ' +0f -1 +0 -1 +1n -2
+ */
+typedef struct Addr Addr;
+
+struct Addr {
+ int n; /* number of offsets */
+ int cur; /* current position within doff array */
+ int maxn; /* actual current size of doff array */
+ ulong doff[1]; /* doff[maxn], with 0..n-1 significant */
+};
+
+Biobuf binbuf;
+Biobuf boutbuf;
+Biobuf *bin = &binbuf; /* user cmd input */
+Biobuf *bout = &boutbuf; /* output */
+Biobuf *bdict; /* dictionary */
+Biobuf *bindex; /* index file */
+long indextop; /* index offset at end of file */
+int lastcmd; /* last executed command */
+Addr *dot; /* "current" address */
+Dict *dict; /* current dictionary */
+int linelen;
+int breaklen = 60;
+int outinhibit;
+int debug;
+
+void execcmd(int);
+int getpref(char*, Rune*);
+Entry getentry(int);
+int getfield(Rune*);
+long locate(Rune*);
+int parseaddr(char*, char**);
+int parsecmd(char*);
+int search(char*, int);
+long seeknextline(Biobuf*, long);
+void setdotnext(void);
+void setdotprev(void);
+void sortaddr(Addr*);
+void usage(void);
+
+enum {
+ Plen=300, /* max length of a search pattern */
+ Fieldlen=200, /* max length of an index field */
+ Aslots=10, /* initial number of slots in an address */
+};
+
+void
+main(int argc, char **argv)
+{
+ int i, cmd, kflag;
+ char *line, *p;
+
+ Binit(&binbuf, 0, OREAD);
+ Binit(&boutbuf, 1, OWRITE);
+ kflag = 0;
+ line = 0;
+ dict = 0;
+ p = getenv("PLAN9");
+ if(p == nil)
+ p = "/usr/local/plan9";
+ if(chdir(p) < 0)
+ sysfatal("chdir %s: %r", p);
+
+ for(i=0; dicts[i].name; i++){
+ if(access(dicts[i].path, 0)>=0 && access(dicts[i].indexpath, 0)>=0){
+ dict = &dicts[i];
+ break;
+ }
+ }
+ ARGBEGIN {
+ case 'd':
+ p = ARGF();
+ dict = 0;
+ if(p) {
+ for(i=0; dicts[i].name; i++)
+ if(strcmp(p, dicts[i].name)==0) {
+ dict = &dicts[i];
+ break;
+ }
+ }
+ if(!dict)
+ usage();
+ break;
+ case 'c':
+ line = ARGF();
+ if(!line)
+ usage();
+ break;
+ case 'k':
+ kflag++;
+ break;
+ case 'D':
+ debug++;
+ break;
+ default:
+ usage();
+ ARGEND }
+ if(dict == 0){
+ err("no dictionaries present on this system");
+ exits("nodict");
+ }
+
+ if(kflag) {
+ (*dict->printkey)();
+ exits(0);
+ }
+ if(argc > 1)
+ usage();
+ else if(argc == 1) {
+ if(line)
+ usage();
+ p = argv[0];
+ line = malloc(strlen(p)+5);
+ sprint(line, "/%s/P\n", p);
+ }
+ bdict = Bopen(dict->path, OREAD);
+ if(!bdict) {
+ err("can't open dictionary %s/%s", p, dict->path);
+ exits("nodict");
+ }
+ bindex = Bopen(dict->indexpath, OREAD);
+ if(!bindex) {
+ err("can't open index %s/%s", p, dict->indexpath);
+ exits("noindex");
+ }
+ indextop = Bseek(bindex, 0L, 2);
+
+ dot = malloc(sizeof(Addr)+(Aslots-1)*sizeof(ulong));
+ dot->n = 0;
+ dot->cur = 0;
+ dot->maxn = Aslots;
+ lastcmd = 0;
+
+ if(line) {
+ cmd = parsecmd(line);
+ if(cmd)
+ execcmd(cmd);
+ } else {
+ for(;;) {
+ Bprint(bout, "*");
+ Bflush(bout);
+ line = Brdline(bin, '\n');
+ linelen = 0;
+ if(!line)
+ break;
+ cmd = parsecmd(line);
+ if(cmd) {
+ execcmd(cmd);
+ lastcmd = cmd;
+ }
+ }
+ }
+ exits(0);
+}
+
+void
+usage(void)
+{
+ int i;
+ char *a, *b;
+
+ Bprint(bout, "Usage: %s [-d dict] [-k] [-c cmd] [word]\n", argv0);
+ Bprint(bout, "dictionaries (brackets mark dictionaries not present on this system):\n");
+ for(i = 0; dicts[i].name; i++){
+ a = b = "";
+ if(access(dicts[i].path, 0)<0 || access(dicts[i].indexpath, 0)<0){
+ a = "[";
+ b = "]";
+ }
+ Bprint(bout, " %s%s\t%s%s\n", a, dicts[i].name, dicts[i].desc, b);
+ }
+ exits("usage");
+}
+
+int
+parsecmd(char *line)
+{
+ char *e;
+ int cmd, ans;
+
+ if(parseaddr(line, &e) >= 0)
+ line = e;
+ else
+ return 0;
+ cmd = *line;
+ ans = cmd;
+ if(isupper(cmd))
+ cmd = tolower(cmd);
+ if(!(cmd == 'a' || cmd == 'h' || cmd == 'p' || cmd == 'r' ||
+ cmd == '\n')) {
+ err("unknown command %c", cmd);
+ return 0;
+ }
+ if(cmd == '\n')
+ switch(lastcmd) {
+ case 0: ans = 'H'; break;
+ case 'H': ans = 'p'; break;
+ default : ans = lastcmd; break;
+ }
+ else if(line[1] != '\n' && line[1] != 0)
+ err("extra stuff after command %c ignored", cmd);
+ return ans;
+}
+
+void
+execcmd(int cmd)
+{
+ Entry e;
+ int cur, doall;
+
+ if(isupper(cmd)) {
+ doall = 1;
+ cmd = tolower(cmd);
+ cur = 0;
+ } else {
+ doall = 0;
+ cur = dot->cur;
+ }
+
+ if(debug && doall && cmd == 'a')
+ Bprint(bout, "%d entries, cur=%d\n", dot->n, cur+1);
+ for(;;){
+ if(cur >= dot->n)
+ break;
+ if(doall) {
+ Bprint(bout, "%d\t", cur+1);
+ linelen += 4 + (cur >= 10);
+ }
+ switch(cmd) {
+ case 'a':
+ Bprint(bout, "#%lud\n", dot->doff[cur]);
+ break;
+ case 'h':
+ case 'p':
+ case 'r':
+ e = getentry(cur);
+ (*dict->printentry)(e, cmd);
+ break;
+ }
+ cur++;
+ if(doall) {
+ if(cmd == 'p' || cmd == 'r') {
+ Bputc(bout, '\n');
+ linelen = 0;
+ }
+ } else
+ break;
+ }
+ if(cur >= dot->n)
+ cur = 0;
+ dot->cur = cur;
+}
+
+/*
+ * Address syntax: ('.' | '/' re '/' | '!' re '!' | number | '#' number) ('+' | '-')*
+ * Answer goes in dot.
+ * Return -1 if address starts, but get error.
+ * Return 0 if no address.
+ */
+int
+parseaddr(char *line, char **eptr)
+{
+ int delim, plen;
+ ulong v;
+ char *e;
+ char pat[Plen];
+
+ if(*line == '/' || *line == '!') {
+ /* anchored regular expression match; '!' means no folding */
+ if(*line == '/') {
+ delim = '/';
+ e = strpbrk(line+1, "/\n");
+ } else {
+ delim = '!';
+ e = strpbrk(line+1, "!\n");
+ }
+ plen = e-line-1;
+ if(plen >= Plen-3) {
+ err("pattern too big");
+ return -1;
+ }
+ pat[0] = '^';
+ memcpy(pat+1, line+1, plen);
+ pat[plen+1] = '$';
+ pat[plen+2] = 0;
+ if(*e == '\n')
+ line = e;
+ else
+ line = e+1;
+ if(!search(pat, delim == '/')) {
+ err("pattern not found");
+ return -1;
+ }
+ } else if(*line == '#') {
+ /* absolute byte offset into dictionary */
+ line++;
+ if(!isdigit(*line))
+ return -1;
+ v = strtoul(line, &e, 10);
+ line = e;
+ dot->doff[0] = v;
+ dot->n = 1;
+ dot->cur = 0;
+ } else if(isdigit(*line)) {
+ v = strtoul(line, &e, 10);
+ line = e;
+ if(v < 1 || v > dot->n)
+ err(".%d not in range [1,%d], ignored",
+ v, dot->n);
+ else
+ dot->cur = v-1;
+ } else if(*line == '.') {
+ line++;
+ } else {
+ *eptr = line;
+ return 0;
+ }
+ while(*line == '+' || *line == '-') {
+ if(*line == '+')
+ setdotnext();
+ else
+ setdotprev();
+ line++;
+ }
+ *eptr = line;
+ return 1;
+}
+
+/*
+ * Index file is sorted by folded field1.
+ * Method: find pre, a folded prefix of r.e. pat,
+ * and then low = offset to beginning of
+ * line in index file where first match of prefix occurs.
+ * Then go through index until prefix no longer matches,
+ * adding each line that matches real pattern to dot.
+ * Finally, sort dot offsets (uniquing).
+ * We know pat len < Plen, and that it is surrounded by ^..$
+ */
+int
+search(char *pat, int dofold)
+{
+ int needre, prelen, match, n;
+ Reprog *re;
+ long ioff, v;
+ Rune pre[Plen];
+ Rune lit[Plen];
+ Rune entry[Fieldlen];
+ char fpat[Plen];
+
+ prelen = getpref(pat+1, pre);
+ if(pat[prelen+1] == 0 || pat[prelen+1] == '$') {
+ runescpy(lit, pre);
+ if(dofold)
+ fold(lit);
+ needre = 0;
+ SET(re);
+ } else {
+ needre = 1;
+ if(dofold) {
+ foldre(fpat, pat);
+ re = regcomp(fpat);
+ } else
+ re = regcomp(pat);
+ }
+ fold(pre);
+ ioff = locate(pre);
+ if(ioff < 0)
+ return 0;
+ dot->n = 0;
+ Bseek(bindex, ioff, 0);
+ for(;;) {
+ if(!getfield(entry))
+ break;
+ if(dofold)
+ fold(entry);
+ if(needre)
+ match = rregexec(re, entry, 0, 0);
+ else
+ match = (acomp(lit, entry) == 0);
+ if(match) {
+ if(!getfield(entry))
+ break;
+ v = runetol(entry);
+ if(dot->n >= dot->maxn) {
+ n = 2*dot->maxn;
+ dot = realloc(dot,
+ sizeof(Addr)+(n-1)*sizeof(long));
+ if(!dot) {
+ err("out of memory");
+ exits("nomem");
+ }
+ dot->maxn = n;
+ }
+ dot->doff[dot->n++] = v;
+ } else {
+ if(!dofold)
+ fold(entry);
+ if(*pre) {
+ n = acomp(pre, entry);
+ if(n < -1 || (!needre && n < 0))
+ break;
+ }
+ /* get to next index entry */
+ if(!getfield(entry))
+ break;
+ }
+ }
+ sortaddr(dot);
+ dot->cur = 0;
+ return dot->n;
+}
+
+/*
+ * Return offset in index file of first line whose folded
+ * first field has pre as a prefix. -1 if none found.
+ */
+long
+locate(Rune *pre)
+{
+ long top, bot, mid;
+ Rune entry[Fieldlen];
+
+ if(*pre == 0)
+ return 0;
+ bot = 0;
+ top = indextop;
+ if(debug>1)
+ fprint(2, "locate looking for prefix %S\n", pre);
+ for(;;) {
+ /*
+ * Loop invariant: foldkey(bot) < pre <= foldkey(top)
+ * and bot < top, and bot,top point at beginning of lines
+ */
+ mid = (top+bot) / 2;
+ mid = seeknextline(bindex, mid);
+ if(debug > 1)
+ fprint(2, "bot=%ld, mid=%ld->%ld, top=%ld\n",
+ bot, (top+bot) / 2, mid, top);
+ if(mid == top || !getfield(entry))
+ break;
+ if(debug > 1)
+ fprint(2, "key=%S\n", entry);
+ /*
+ * here mid is strictly between bot and top
+ */
+ fold(entry);
+ if(acomp(pre, entry) <= 0)
+ top = mid;
+ else
+ bot = mid;
+ }
+ /*
+ * bot < top, but they don't necessarily point at successive lines
+ * Use linear search from bot to find first line that pre is a
+ * prefix of
+ */
+ while((bot = seeknextline(bindex, bot)) <= top) {
+ if(!getfield(entry))
+ return -1;
+ if(debug > 1)
+ fprint(2, "key=%S\n", entry);
+ fold(entry);
+ switch(acomp(pre, entry)) {
+ case -2:
+ return -1;
+ case -1:
+ case 0:
+ return bot;
+ case 1:
+ case 2:
+ continue;
+ }
+ }
+ return -1;
+
+}
+
+/*
+ * Get prefix of non re-metacharacters, runified, into pre,
+ * and return length
+ */
+int
+getpref(char *pat, Rune *pre)
+{
+ int n, r;
+ char *p;
+
+ p = pat;
+ while(*p) {
+ n = chartorune(pre, p);
+ r = *pre;
+ switch(r) {
+ case 0x2e: case 0x2a: case 0x2b: case 0x3f:
+ case 0x5b: case 0x5d: case 0x28: case ')':
+ case 0x7c: case 0x5e: case 0x24:
+ *pre = 0;
+ return p-pat;
+ case L'\\':
+ p += n;
+ p += chartorune(++pre, p);
+ pre++;
+ break;
+ default:
+ p += n;
+ pre++;
+ }
+ }
+ return p-pat;
+}
+
+long
+seeknextline(Biobuf *b, long off)
+{
+ long c;
+
+ Bseek(b, off, 0);
+ do {
+ c = Bgetrune(b);
+ } while(c>=0 && c!='\n');
+ return Boffset(b);
+}
+
+/*
+ * Get next field out of index file (either tab- or nl- terminated)
+ * Answer in *rp, assumed to be Fieldlen long.
+ * Return 0 if read error first.
+ */
+int
+getfield(Rune *rp)
+{
+ long c;
+ int n;
+
+ for(n=Fieldlen; n-- > 0; ) {
+ if ((c = Bgetrune(bindex)) < 0)
+ return 0;
+ if(c == '\t' || c == '\n') {
+ *rp = L'\0';
+ return 1;
+ }
+ *rp++ = c;
+ }
+ err("word too long");
+ return 0;
+}
+
+/*
+ * A compare longs function suitable for qsort
+ */
+static int
+longcmp(const void *av, const void *bv)
+{
+ long v;
+ long *a, *b;
+
+ a = (long*)av;
+ b = (long*)bv;
+
+ v = *a - *b;
+ if(v < 0)
+ return -1;
+ else if(v == 0)
+ return 0;
+ else
+ return 1;
+}
+
+void
+sortaddr(Addr *a)
+{
+ int i, j;
+ long v;
+
+ if(a->n <= 1)
+ return;
+
+ qsort(a->doff, a->n, sizeof(long), longcmp);
+
+ /* remove duplicates */
+ for(i=0, j=0; j < a->n; j++) {
+ v = a->doff[j];
+ if(i > 0 && v == a->doff[i-1])
+ continue;
+ a->doff[i++] = v;
+ }
+ a->n = i;
+}
+
+Entry
+getentry(int i)
+{
+ long b, e, n;
+ static Entry ans;
+ static int anslen = 0;
+
+ b = dot->doff[i];
+ e = (*dict->nextoff)(b+1);
+ ans.doff = b;
+ if(e < 0) {
+ err("couldn't seek to entry");
+ ans.start = 0;
+ ans.end = 0;
+ } else {
+ n = e-b;
+ if(n+1 > anslen) {
+ ans.start = realloc(ans.start, n+1);
+ if(!ans.start) {
+ err("out of memory");
+ exits("nomem");
+ }
+ anslen = n+1;
+ }
+ Bseek(bdict, b, 0);
+ n = Bread(bdict, ans.start, n);
+ ans.end = ans.start + n;
+ *ans.end = 0;
+ }
+ return ans;
+}
+
+void
+setdotnext(void)
+{
+ long b;
+
+ b = (*dict->nextoff)(dot->doff[dot->cur]+1);
+ if(b < 0) {
+ err("couldn't find a next entry");
+ return;
+ }
+ dot->doff[0] = b;
+ dot->n = 1;
+ dot->cur = 0;
+}
+
+void
+setdotprev(void)
+{
+ int tryback;
+ long here, last, p;
+
+ if(dot->cur < 0 || dot->cur >= dot->n)
+ return;
+ tryback = 2000;
+ here = dot->doff[dot->cur];
+ last = 0;
+ while(last == 0) {
+ p = here - tryback;
+ if(p < 0)
+ p = 0;
+ for(;;) {
+ p = (*dict->nextoff)(p+1);
+ if(p < 0)
+ return; /* shouldn't happen */
+ if(p >= here)
+ break;
+ last = p;
+ }
+ if(!last) {
+ if(here - tryback < 0) {
+ err("can't find a previous entry");
+ return;
+ }
+ tryback = 2*tryback;
+ }
+ }
+ dot->doff[0] = last;
+ dot->n = 1;
+ dot->cur = 0;
+}
diff --git a/src/cmd/dict/dict.h b/src/cmd/dict/dict.h
new file mode 100644
index 00000000..8b558ac5
--- /dev/null
+++ b/src/cmd/dict/dict.h
@@ -0,0 +1,160 @@
+/* Runes for special purposes (0xe800-0xfdff is Private Use Area) */
+enum { NONE=0xe800, /* Emit nothing */
+ TAGS, /* Start of tag */
+ TAGE, /* End of tag */
+ SPCS, /* Start of special character name */
+ PAR, /* Newline, indent */
+ LIGS, /* Start of ligature codes */
+ LACU=LIGS, /* Acute (´) ligatures */
+ LGRV, /* Grave (ˋ) ligatures */
+ LUML, /* Umlaut (¨) ligatures */
+ LCED, /* Cedilla (¸) ligatures */
+ LTIL, /* Tilde (˜) ligatures */
+ LBRV, /* Breve (˘) ligatures */
+ LRNG, /* Ring (˚) ligatures */
+ LDOT, /* Dot (˙) ligatures */
+ LDTB, /* Dot below (.) ligatures */
+ LFRN, /* Frown (⌢) ligatures */
+ LFRB, /* Frown below (̯) ligatures */
+ LOGO, /* Ogonek (˛) ligatures */
+ LMAC, /* Macron (¯) ligatures */
+ LHCK, /* Hacek (ˇ) ligatures */
+ LASP, /* Asper (ʽ) ligatures */
+ LLEN, /* Lenis (ʼ) ligatures */
+ LBRB, /* Breve below (̮) ligatures */
+ LIGE, /* End of ligature codes */
+ MULTI, /* Start of multi-rune codes */
+ MAAS=MULTI, /* ʽα */
+ MALN, /* ʼα */
+ MAND, /* and */
+ MAOQ, /* a/q */
+ MBRA, /* <| */
+ MDD, /* .. */
+ MDDD, /* ... */
+ MEAS, /* ʽε */
+ MELN, /* ʼε */
+ MEMM, /* —— */
+ MHAS, /* ʽη */
+ MHLN, /* ʼη */
+ MIAS, /* ʽι */
+ MILN, /* ʼι */
+ MLCT, /* ct */
+ MLFF, /* ff */
+ MLFFI, /* ffi */
+ MLFFL, /* ffl */
+ MLFL, /* fl */
+ MLFI, /* fi */
+ MLLS, /* ll with swing */
+ MLST, /* st */
+ MOAS, /* ʽο */
+ MOLN, /* ʼο */
+ MOR, /* or */
+ MRAS, /* ʽρ */
+ MRLN, /* ʼρ */
+ MTT, /* ~~ */
+ MUAS, /* ʽυ */
+ MULN, /* ʼυ */
+ MWAS, /* ʽω */
+ MWLN, /* ʼω */
+ MOE, /* oe */
+ MES, /* em space */
+ MULTIE, /* End of multi-rune codes */
+};
+#define Nligs (LIGE-LIGS)
+#define Nmulti (MULTIE-MULTI)
+
+typedef struct Entry Entry;
+typedef struct Assoc Assoc;
+typedef struct Nassoc Nassoc;
+typedef struct Dict Dict;
+
+struct Entry {
+ char *start; /* entry starts at start */
+ char *end; /* and finishes just before end */
+ long doff; /* dictionary offset (for debugging) */
+};
+
+struct Assoc {
+ char *key;
+ long val;
+};
+
+struct Nassoc {
+ long key;
+ long val;
+};
+
+struct Dict {
+ char *name; /* dictionary name */
+ char *desc; /* description */
+ char *path; /* path to dictionary data */
+ char *indexpath; /* path to index data */
+ long (*nextoff)(long); /* function to find next entry offset from arg */
+ void (*printentry)(Entry, int); /* function to print entry */
+ void (*printkey)(void); /* function to print pronunciation key */
+};
+
+int acomp(Rune*, Rune*);
+Rune *changett(Rune *, Rune *, int);
+void err(char*, ...);
+void fold(Rune *);
+void foldre(char*, char*);
+Rune liglookup(Rune, Rune);
+long lookassoc(Assoc*, int, char*);
+long looknassoc(Nassoc*, int, long);
+void outprint(char*, ...);
+void outrune(long);
+void outrunes(Rune *);
+void outchar(int);
+void outchars(char *);
+void outnl(int);
+void outpiece(char *, char *);
+void runescpy(Rune*, Rune*);
+long runetol(Rune*);
+
+long oednextoff(long);
+void oedprintentry(Entry, int);
+void oedprintkey(void);
+long ahdnextoff(long);
+void ahdprintentry(Entry, int);
+void ahdprintkey(void);
+long pcollnextoff(long);
+void pcollprintentry(Entry, int);
+void pcollprintkey(void);
+long pcollgnextoff(long);
+void pcollgprintentry(Entry, int);
+void pcollgprintkey(void);
+long movienextoff(long);
+void movieprintentry(Entry, int);
+void movieprintkey(void);
+long pgwnextoff(long);
+void pgwprintentry(Entry,int);
+void pgwprintkey(void);
+long slangnextoff(long);
+void slangprintentry(Entry, int);
+void slangprintkey(void);
+long robertnextoff(long);
+void robertindexentry(Entry, int);
+void robertprintkey(void);
+long robertnextflex(long);
+void robertflexentry(Entry, int);
+long simplenextoff(long);
+void simpleprintentry(Entry, int);
+void simpleprintkey(void);
+long thesnextoff(long);
+void thesprintentry(Entry, int);
+void thesprintkey(void);
+long worldnextoff(long);
+void worldprintentry(Entry, int);
+void worldprintkey(void);
+
+extern Biobuf *bdict;
+extern Biobuf *bout;
+extern int linelen;
+extern int breaklen;
+extern int outinhibit;
+extern int debug;
+extern Rune multitab[][5];
+extern Dict dicts[];
+
+#define asize(a) (sizeof (a)/sizeof(a[0]))
diff --git a/src/cmd/dict/egfix b/src/cmd/dict/egfix
new file mode 100755
index 00000000..192320c2
--- /dev/null
+++ b/src/cmd/dict/egfix
@@ -0,0 +1,15 @@
+#!/bin/rc
+
+sed '
+ s/[ ]+$//
+ / /!d
+ /, /{; h; s/,.*//; p; g; s/ .*, / /; }
+' $1 |
+sed '
+ /\(/{; h; s/\([^)]+\)//; p; g; s/[()]//g; }
+' |
+sed '
+ s/ +/ /
+ s/[ ]+$//
+ s/ +/ /g
+'
diff --git a/src/cmd/dict/egfix2 b/src/cmd/dict/egfix2
new file mode 100755
index 00000000..d5af3bfe
--- /dev/null
+++ b/src/cmd/dict/egfix2
@@ -0,0 +1,8 @@
+#!/bin/rc
+
+awk '
+BEGIN { FS = " |, " }
+ { for(i=2; i<=NF; i++)print $i " " $1 }
+' $1 |
+tr A-Z a-z |
+sort -u -t' ' +0f -1 +0 -1 +1n -2
diff --git a/src/cmd/dict/gb2312.c b/src/cmd/dict/gb2312.c
new file mode 100644
index 00000000..d667aafd
--- /dev/null
+++ b/src/cmd/dict/gb2312.c
@@ -0,0 +1,1108 @@
+#include <u.h>
+#include <libc.h>
+#include "kuten.h"
+
+#define NONE 0xffff
+
+Rune tabgb2312[GB2312MAX] = {
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE,0x3000,0x3001,0x3002,
+0x2024,0x02c9,0x02c7,0x00a8,0x3003,0x3005,0x2015,0x223c,
+0x2225,0x2026,0x2018,0x2019,0x201c,0x201d,0x3014,0x3015,
+0x3008,0x3009,0x300a,0x300b,0x300c,0x300d,0x300e,0x300f,
+0x301a,0x301b,0x3010,0x3011,0x00b1,0x00d7,0x00f7,0x2236,
+0x2227,0x2228,0x2211,0x220f,0x222a,0x2229,0x2208,0x2237,
+0x221a,0x22a5,0x01c1,0x2220,0x2322,0x2299,0x222b,0x222e,
+0x2261,0x224c,0x2248,0x223d,0x221d,0x2260,0x226e,0x226f,
+0x2264,0x2265,0x221e,0x2235,0x2234,0x2642,0x2640,0x00b0,
+0x2032,0x2033,0x2103,0x0024,0x00a4,0x00a2,0x00a3,0x2030,
+0x00a7,0x2116,0x2606,0x2605,0x25cb,0x25cf,0x25ce,0x25c7,
+0x25c6,0x25a1,0x25a0,0x25b3,0x25b2,0x203b,0x2192,0x2190,
+0x2191,0x2193,0x3013, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE,0x2488,0x2489,0x248a,0x248b,0x248c,0x248d,0x248e,
+0x248f,0x2490,0x2491,0x2492,0x2493,0x2494,0x2495,0x2496,
+0x2497,0x2498,0x2499,0x249a,0x249b,0x2474,0x2475,0x2476,
+0x2477,0x2478,0x2479,0x247a,0x247b,0x247c,0x247d,0x247e,
+0x247f,0x2480,0x2481,0x2482,0x2483,0x2484,0x2485,0x2486,
+0x2487,0x2460,0x2461,0x2462,0x2463,0x2464,0x2465,0x2466,
+0x2467,0x2468,0x2469, NONE, NONE,0x3220,0x3221,0x3222,
+0x3223,0x3224,0x3225,0x3226,0x3227,0x3228,0x3229, NONE,
+ NONE,0x2160,0x2161,0x2162,0x2163,0x2164,0x2165,0x2166,
+0x2167,0x2168,0x2169,0x216a,0x216b, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE,0x0021,0x0022,0x0023,
+0x00a5,0x0025,0x0026,0x0027,0x0028,0x0029,0x002a,0x002b,
+0x002c,0x002d,0x002e,0x002f,0x0030,0x0031,0x0032,0x0033,
+0x0034,0x0035,0x0036,0x0037,0x0038,0x0039,0x003a,0x003b,
+0x003c,0x003d,0x003e,0x003f,0x0040,0x0041,0x0042,0x0043,
+0x0044,0x0045,0x0046,0x0047,0x0048,0x0049,0x004a,0x004b,
+0x004c,0x004d,0x004e,0x004f,0x0050,0x0051,0x0052,0x0053,
+0x0054,0x0055,0x0056,0x0057,0x0058,0x0059,0x005a,0x005b,
+0x005c,0x005d,0x005e,0x005f,0x0060,0x0061,0x0062,0x0063,
+0x0064,0x0065,0x0066,0x0067,0x0068,0x0069,0x006a,0x006b,
+0x006c,0x006d,0x006e,0x006f,0x0070,0x0071,0x0072,0x0073,
+0x0074,0x0075,0x0076,0x0077,0x0078,0x0079,0x007a,0x007b,
+0x007c,0x007d,0x00af, NONE, NONE, NONE, NONE, NONE,
+ NONE,0x3041,0x3042,0x3043,0x3044,0x3045,0x3046,0x3047,
+0x3048,0x3049,0x304a,0x304b,0x304c,0x304d,0x304e,0x304f,
+0x3050,0x3051,0x3052,0x3053,0x3054,0x3055,0x3056,0x3057,
+0x3058,0x3059,0x305a,0x305b,0x305c,0x305d,0x305e,0x305f,
+0x3060,0x3061,0x3062,0x3063,0x3064,0x3065,0x3066,0x3067,
+0x3068,0x3069,0x306a,0x306b,0x306c,0x306d,0x306e,0x306f,
+0x3070,0x3071,0x3072,0x3073,0x3074,0x3075,0x3076,0x3077,
+0x3078,0x3079,0x307a,0x307b,0x307c,0x307d,0x307e,0x307f,
+0x3080,0x3081,0x3082,0x3083,0x3084,0x3085,0x3086,0x3087,
+0x3088,0x3089,0x308a,0x308b,0x308c,0x308d,0x308e,0x308f,
+0x3090,0x3091,0x3092,0x3093, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE,0x30a1,0x30a2,0x30a3,
+0x30a4,0x30a5,0x30a6,0x30a7,0x30a8,0x30a9,0x30aa,0x30ab,
+0x30ac,0x30ad,0x30ae,0x30af,0x30b0,0x30b1,0x30b2,0x30b3,
+0x30b4,0x30b5,0x30b6,0x30b7,0x30b8,0x30b9,0x30ba,0x30bb,
+0x30bc,0x30bd,0x30be,0x30bf,0x30c0,0x30c1,0x30c2,0x30c3,
+0x30c4,0x30c5,0x30c6,0x30c7,0x30c8,0x30c9,0x30ca,0x30cb,
+0x30cc,0x30cd,0x30ce,0x30cf,0x30d0,0x30d1,0x30d2,0x30d3,
+0x30d4,0x30d5,0x30d6,0x30d7,0x30d8,0x30d9,0x30da,0x30db,
+0x30dc,0x30dd,0x30de,0x30df,0x30e0,0x30e1,0x30e2,0x30e3,
+0x30e4,0x30e5,0x30e6,0x30e7,0x30e8,0x30e9,0x30ea,0x30eb,
+0x30ec,0x30ed,0x30ee,0x30ef,0x30f0,0x30f1,0x30f2,0x30f3,
+0x30f4,0x30f5,0x30f6, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE,0x0391,0x0392,0x0393,0x0394,0x0395,0x0396,0x0397,
+0x0398,0x0399,0x039a,0x039b,0x039c,0x039d,0x039e,0x039f,
+0x03a0,0x03a1,0x03a3,0x03a4,0x03a5,0x03a6,0x03a7,0x03a8,
+0x03a9, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE,0x03b1,0x03b2,0x03b3,0x03b4,0x03b5,0x03b6,0x03b7,
+0x03b8,0x03b9,0x03ba,0x03bb,0x03bc,0x03bd,0x03be,0x03bf,
+0x03c0,0x03c1,0x03c3,0x03c4,0x03c5,0x03c6,0x03c7,0x03c8,
+0x03c9, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE,0x0410,0x0411,0x0412,
+0x0413,0x0414,0x0415,0x0401,0x0416,0x0417,0x0418,0x0419,
+0x041a,0x041b,0x041c,0x041d,0x041e,0x041f,0x0420,0x0421,
+0x0422,0x0423,0x0424,0x0425,0x0426,0x0427,0x0428,0x0429,
+0x042a,0x042b,0x042c,0x042d,0x042e,0x042f, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE,0x0430,0x0431,0x0432,
+0x0433,0x0434,0x0435,0x0451,0x0436,0x0437,0x0438,0x0439,
+0x043a,0x043b,0x043c,0x043d,0x043e,0x043f,0x0440,0x0441,
+0x0442,0x0443,0x0444,0x0445,0x0446,0x0447,0x0448,0x0449,
+0x044a,0x044b,0x044c,0x044d,0x044e,0x044f, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE,0x0101,0x00e1,0x0103,0x00e0,0x0113,0x00e9,0x0115,
+0x00e8,0x012b,0x00ed,0x012d,0x00ec,0x014d,0x00f3,0x014f,
+0x00f2,0x016b,0x00fa,0x016d,0x00f9,0x01d6,0x01d8,0x01da,
+0x01dc,0x00fc,0x00ea, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE,0x3105,0x3106,0x3107,
+0x3108,0x3109,0x310a,0x310b,0x310c,0x310d,0x310e,0x310f,
+0x3110,0x3111,0x3112,0x3113,0x3114,0x3115,0x3116,0x3117,
+0x3118,0x3119,0x311a,0x311b,0x311c,0x311d,0x311e,0x311f,
+0x3120,0x3121,0x3122,0x3123,0x3124,0x3125,0x3126,0x3127,
+0x3128,0x3129, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+0x2500,0x2501,0x2502,0x2503,0x2504,0x2505,0x2506,0x2507,
+0x2508,0x2509,0x250a,0x250b,0x250c,0x250d,0x250e,0x250f,
+0x2510,0x2511,0x2512,0x2513,0x2514,0x2515,0x2516,0x2517,
+0x2518,0x2519,0x251a,0x251b,0x251c,0x251d,0x251e,0x251f,
+0x2520,0x2521,0x2522,0x2523,0x2524,0x2525,0x2526,0x2527,
+0x2528,0x2529,0x252a,0x252b,0x252c,0x252d,0x252e,0x252f,
+0x2530,0x2531,0x2532,0x2533,0x2534,0x2535,0x2536,0x2537,
+0x2538,0x2539,0x253a,0x253b,0x253c,0x253d,0x253e,0x253f,
+0x2540,0x2541,0x2542,0x2543,0x2544,0x2545,0x2546,0x2547,
+0x2548,0x2549,0x254a,0x254b, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE,0x554a,0x963f,0x57c3,0x6328,0x54ce,0x5509,0x54c0,
+0x7691,0x764c,0x853c,0x77ee,0x827e,0x788d,0x7231,0x9698,
+0x978d,0x6c28,0x5b89,0x4ffa,0x6309,0x6697,0x5cb8,0x80fa,
+0x6848,0x80ae,0x6602,0x76ce,0x51f9,0x6556,0x71ac,0x7ff1,
+0x8884,0x50b2,0x5965,0x61ca,0x6fb3,0x82ad,0x634c,0x6252,
+0x53ed,0x5427,0x7b06,0x516b,0x75a4,0x5df4,0x62d4,0x8dcb,
+0x9776,0x628a,0x8019,0x575d,0x9738,0x7f62,0x7238,0x767d,
+0x67cf,0x767e,0x6446,0x4f70,0x8d25,0x62dc,0x7a17,0x6591,
+0x73ed,0x642c,0x6273,0x822c,0x9881,0x677f,0x7248,0x626e,
+0x62cc,0x4f34,0x74e3,0x534a,0x529e,0x7eca,0x90a6,0x5e2e,
+0x6886,0x699c,0x8180,0x7ed1,0x68d2,0x78c5,0x868c,0x9551,
+0x508d,0x8c24,0x82de,0x80de,0x5305,0x8912,0x5265, NONE,
+ NONE, NONE, NONE, NONE, NONE,0x8584,0x96f9,0x4fdd,
+0x5821,0x9971,0x5b9d,0x62b1,0x62a5,0x66b4,0x8c79,0x9c8d,
+0x7206,0x676f,0x7891,0x60b2,0x5351,0x5317,0x8f88,0x80cc,
+0x8d1d,0x94a1,0x500d,0x72c8,0x5907,0x60eb,0x7119,0x88ab,
+0x5954,0x82ef,0x672c,0x7b28,0x5d29,0x7ef7,0x752d,0x6cf5,
+0x8e66,0x8ff8,0x903c,0x9f3b,0x6bd4,0x9119,0x7b14,0x5f7c,
+0x78a7,0x84d6,0x853d,0x6bd5,0x6bd9,0x6bd6,0x5e01,0x5e87,
+0x75f9,0x95ed,0x655d,0x5f0a,0x5fc5,0x8f9f,0x58c1,0x81c2,
+0x907f,0x965b,0x97ad,0x8fb9,0x7f16,0x8d2c,0x6241,0x4fbf,
+0x53d8,0x535e,0x8fa8,0x8fa9,0x8fab,0x904d,0x6807,0x5f6a,
+0x8198,0x8868,0x9cd6,0x618b,0x522b,0x762a,0x5f6c,0x658c,
+0x6fd2,0x6ee8,0x5bbe,0x6448,0x5175,0x51b0,0x67c4,0x4e19,
+0x79c9,0x997c,0x70b3, NONE, NONE, NONE, NONE, NONE,
+ NONE,0x75c5,0x5e76,0x73bb,0x83e0,0x64ad,0x62e8,0x94b5,
+0x6ce2,0x535a,0x52c3,0x640f,0x94c2,0x7b94,0x4f2f,0x5e1b,
+0x8236,0x8116,0x818a,0x6e24,0x6cca,0x9a73,0x6355,0x535c,
+0x54fa,0x8865,0x57e0,0x4e0d,0x5e03,0x6b65,0x7c3f,0x90e8,
+0x6016,0x64e6,0x731c,0x88c1,0x6750,0x624d,0x8d22,0x776c,
+0x8e29,0x91c7,0x5f69,0x83dc,0x8521,0x9910,0x53c2,0x8695,
+0x6b8b,0x60ed,0x60e8,0x707f,0x82cd,0x8231,0x4ed3,0x6ca7,
+0x85cf,0x64cd,0x7cd9,0x69fd,0x66f9,0x8349,0x5395,0x7b56,
+0x4fa7,0x518c,0x6d4b,0x5c42,0x8e6d,0x63d2,0x53c9,0x832c,
+0x8336,0x67e5,0x78b4,0x643d,0x5bdf,0x5c94,0x5dee,0x8be7,
+0x62c6,0x67f4,0x8c7a,0x6400,0x63ba,0x8749,0x998b,0x8c17,
+0x7f20,0x94f2,0x4ea7,0x9610,0x98a4,0x660c,0x7316, NONE,
+ NONE, NONE, NONE, NONE, NONE,0x573a,0x5c1d,0x5e38,
+0x957f,0x507f,0x80a0,0x5382,0x655e,0x7545,0x5531,0x5021,
+0x8d85,0x6284,0x949e,0x671d,0x5632,0x6f6e,0x5de2,0x5435,
+0x7092,0x8f66,0x626f,0x64a4,0x63a3,0x5f7b,0x6f88,0x90f4,
+0x81e3,0x8fb0,0x5c18,0x6668,0x5ff1,0x6c89,0x9648,0x8d81,
+0x886c,0x6491,0x79f0,0x57ce,0x6a59,0x6210,0x5448,0x4e58,
+0x7a0b,0x60e9,0x6f84,0x8bda,0x627f,0x901e,0x9a8b,0x79e4,
+0x5403,0x75f4,0x6301,0x5319,0x6c60,0x8fdf,0x5f1b,0x9a70,
+0x803b,0x9f7f,0x4f88,0x5c3a,0x8d64,0x7fc5,0x65a5,0x70bd,
+0x5145,0x51b2,0x866b,0x5d07,0x5ba0,0x62bd,0x916c,0x7574,
+0x8e0c,0x7a20,0x6101,0x7b79,0x4ec7,0x7ef8,0x7785,0x4e11,
+0x81ed,0x521d,0x51fa,0x6a71,0x53a8,0x8e87,0x9504,0x96cf,
+0x6ec1,0x9664,0x695a, NONE, NONE, NONE, NONE, NONE,
+ NONE,0x7840,0x50a8,0x77d7,0x6410,0x89e6,0x5904,0x63e3,
+0x5ddd,0x7a7f,0x693d,0x4f20,0x8239,0x5598,0x4e32,0x75ae,
+0x7a97,0x5e62,0x5e8a,0x95ef,0x521b,0x5439,0x708a,0x6376,
+0x9524,0x5782,0x6625,0x693f,0x9187,0x5507,0x6df3,0x7eaf,
+0x8822,0x6233,0x7ef0,0x75b5,0x8328,0x78c1,0x96cc,0x8f9e,
+0x6148,0x74f7,0x8bcd,0x6b64,0x523a,0x8d50,0x6b21,0x806a,
+0x8471,0x56f1,0x5306,0x4ece,0x4e1b,0x51d1,0x7c97,0x918b,
+0x7c07,0x4fc3,0x8e7f,0x7be1,0x7a9c,0x6467,0x5d14,0x50ac,
+0x8106,0x7601,0x7cb9,0x6dec,0x7fe0,0x6751,0x5b58,0x5bf8,
+0x78cb,0x64ae,0x6413,0x63aa,0x632b,0x9519,0x642d,0x8fbe,
+0x7b54,0x7629,0x6253,0x5927,0x5446,0x6b79,0x50a3,0x6234,
+0x5e26,0x6b86,0x4ee3,0x8d37,0x888b,0x5f85,0x902e, NONE,
+ NONE, NONE, NONE, NONE, NONE,0x6020,0x803d,0x62c5,
+0x4e39,0x5355,0x90f8,0x63b8,0x80c6,0x65e6,0x6c2e,0x4f46,
+0x60ee,0x6de1,0x8bde,0x5f39,0x86cb,0x5f53,0x6321,0x515a,
+0x8361,0x6863,0x5200,0x6363,0x8e48,0x5012,0x5c9b,0x7977,
+0x5bfc,0x5230,0x7a3b,0x60bc,0x9053,0x76d7,0x5fb7,0x5f97,
+0x7684,0x8e6c,0x706f,0x767b,0x7b49,0x77aa,0x51f3,0x9093,
+0x5824,0x4f4e,0x6ef4,0x8fea,0x654c,0x7b1b,0x72c4,0x6da4,
+0x7fdf,0x5ae1,0x62b5,0x5e95,0x5730,0x8482,0x7b2c,0x5e1d,
+0x5f1f,0x9012,0x7f14,0x98a0,0x6382,0x6ec7,0x7898,0x70b9,
+0x5178,0x975b,0x57ab,0x7535,0x4f43,0x7538,0x5e97,0x60e6,
+0x5960,0x6dc0,0x6bbf,0x7889,0x53fc,0x96d5,0x51cb,0x5201,
+0x6389,0x540a,0x9493,0x8c03,0x8dcc,0x7239,0x789f,0x8776,
+0x8fed,0x8c0d,0x53e0, NONE, NONE, NONE, NONE, NONE,
+ NONE,0x4e01,0x76ef,0x53ee,0x9489,0x9876,0x9f0e,0x952d,
+0x5b9a,0x8ba2,0x4e22,0x4e1c,0x51ac,0x8463,0x61c2,0x52a8,
+0x680b,0x4f97,0x606b,0x51bb,0x6d1e,0x515c,0x6296,0x6597,
+0x9661,0x8c46,0x9017,0x75d8,0x90fd,0x7763,0x6bd2,0x728a,
+0x72ec,0x8bfb,0x5835,0x7779,0x8d4c,0x675c,0x9540,0x809a,
+0x5ea6,0x6e21,0x5992,0x7aef,0x77ed,0x953b,0x6bb5,0x65ad,
+0x7f0e,0x5806,0x5151,0x961f,0x5bf9,0x58a9,0x5428,0x8e72,
+0x6566,0x987f,0x56e4,0x949d,0x76fe,0x9041,0x6387,0x54c6,
+0x591a,0x593a,0x579b,0x8eb2,0x6735,0x8dfa,0x8235,0x5241,
+0x60f0,0x5815,0x86fe,0x5ce8,0x9e45,0x4fc4,0x989d,0x8bb9,
+0x5a25,0x6076,0x5384,0x627c,0x904f,0x9102,0x997f,0x6069,
+0x800c,0x513f,0x8033,0x5c14,0x9975,0x6d31,0x4e8c, NONE,
+ NONE, NONE, NONE, NONE, NONE,0x8d30,0x53d1,0x7f5a,
+0x7b4f,0x4f10,0x4e4f,0x9600,0x6cd5,0x73d0,0x85e9,0x5e06,
+0x756a,0x7ffb,0x6a0a,0x77fe,0x9492,0x7e41,0x51e1,0x70e6,
+0x53cd,0x8fd4,0x8303,0x8d29,0x72af,0x996d,0x6cdb,0x574a,
+0x82b3,0x65b9,0x80aa,0x623f,0x9632,0x59a8,0x4eff,0x8bbf,
+0x7eba,0x653e,0x83f2,0x975e,0x5561,0x98de,0x80a5,0x532a,
+0x8bfd,0x5420,0x80ba,0x5e9f,0x6cb8,0x8d39,0x82ac,0x915a,
+0x5429,0x6c1b,0x5206,0x7eb7,0x575f,0x711a,0x6c7e,0x7c89,
+0x594b,0x4efd,0x5fff,0x6124,0x7caa,0x4e30,0x5c01,0x67ab,
+0x8702,0x5cf0,0x950b,0x98ce,0x75af,0x70fd,0x9022,0x51af,
+0x7f1d,0x8bbd,0x5949,0x51e4,0x4f5b,0x5426,0x592b,0x6577,
+0x80a4,0x5b75,0x6276,0x62c2,0x8f90,0x5e45,0x6c1f,0x7b26,
+0x4f0f,0x4fd8,0x670d, NONE, NONE, NONE, NONE, NONE,
+ NONE,0x6d6e,0x6daa,0x798f,0x88b1,0x5f17,0x752b,0x629a,
+0x8f85,0x4fef,0x91dc,0x65a7,0x812f,0x8151,0x5e9c,0x8150,
+0x8d74,0x526f,0x8986,0x8d4b,0x590d,0x5085,0x4ed8,0x961c,
+0x7236,0x8179,0x8d1f,0x5bcc,0x8ba3,0x9644,0x5987,0x7f1a,
+0x5490,0x5676,0x560e,0x8be5,0x6539,0x6982,0x9499,0x76d6,
+0x6e89,0x5e72,0x7518,0x6746,0x67d1,0x7aff,0x809d,0x8d76,
+0x611f,0x79c6,0x6562,0x8d63,0x5188,0x521a,0x94a2,0x7f38,
+0x809b,0x7eb2,0x5c97,0x6e2f,0x6760,0x7bd9,0x768b,0x9ad8,
+0x818f,0x7f94,0x7cd5,0x641e,0x9550,0x7a3f,0x544a,0x54e5,
+0x6b4c,0x6401,0x6208,0x9e3d,0x80f3,0x7599,0x5272,0x9769,
+0x845b,0x683c,0x86e4,0x9601,0x9694,0x94ec,0x4e2a,0x5404,
+0x7ed9,0x6839,0x8ddf,0x8015,0x66f4,0x5e9a,0x7fb9, NONE,
+ NONE, NONE, NONE, NONE, NONE,0x57c2,0x803f,0x6897,
+0x5de5,0x653b,0x529f,0x606d,0x9f9a,0x4f9b,0x8eac,0x516c,
+0x5bab,0x5f13,0x5de9,0x6c5e,0x62f1,0x8d21,0x5171,0x94a9,
+0x52fe,0x6c9f,0x82df,0x72d7,0x57a2,0x6784,0x8d2d,0x591f,
+0x8f9c,0x83c7,0x5495,0x7b8d,0x4f30,0x6cbd,0x5b64,0x59d1,
+0x9f13,0x53e4,0x86ca,0x9aa8,0x8c37,0x80a1,0x6545,0x987e,
+0x56fa,0x96c7,0x522e,0x74dc,0x5250,0x5be1,0x6302,0x8902,
+0x4e56,0x62d0,0x602a,0x68fa,0x5173,0x5b98,0x51a0,0x89c2,
+0x7ba1,0x9986,0x7f50,0x60ef,0x704c,0x8d2f,0x5149,0x5e7f,
+0x901b,0x7470,0x89c4,0x572d,0x7845,0x5f52,0x9f9f,0x95fa,
+0x8f68,0x9b3c,0x8be1,0x7678,0x6842,0x67dc,0x8dea,0x8d35,
+0x523d,0x8f8a,0x6eda,0x68cd,0x9505,0x90ed,0x56fd,0x679c,
+0x88f9,0x8fc7,0x54c8, NONE, NONE, NONE, NONE, NONE,
+ NONE,0x9ab8,0x5b69,0x6d77,0x6c26,0x4ea5,0x5bb3,0x9a87,
+0x9163,0x61a8,0x90af,0x97e9,0x542b,0x6db5,0x5bd2,0x51fd,
+0x558a,0x7f55,0x7ff0,0x64bc,0x634d,0x65f1,0x61be,0x608d,
+0x710a,0x6c57,0x6c49,0x592f,0x676d,0x822a,0x58d5,0x568e,
+0x8c6a,0x6beb,0x90dd,0x597d,0x8017,0x53f7,0x6d69,0x5475,
+0x559d,0x8377,0x83cf,0x6838,0x79be,0x548c,0x4f55,0x5408,
+0x76d2,0x8c89,0x9602,0x6cb3,0x6db8,0x8d6b,0x8910,0x9e64,
+0x8d3a,0x563f,0x9ed1,0x75d5,0x5f88,0x72e0,0x6068,0x54fc,
+0x4ea8,0x6a2a,0x8861,0x6052,0x8f70,0x54c4,0x70d8,0x8679,
+0x9e3f,0x6d2a,0x5b8f,0x5f18,0x7ea2,0x5589,0x4faf,0x7334,
+0x543c,0x539a,0x5019,0x540e,0x547c,0x4e4e,0x5ffd,0x745a,
+0x58f6,0x846b,0x80e1,0x8774,0x72d0,0x7cca,0x6e56, NONE,
+ NONE, NONE, NONE, NONE, NONE,0x5f27,0x864e,0x552c,
+0x62a4,0x4e92,0x6caa,0x6237,0x82b1,0x54d7,0x534e,0x733e,
+0x6ed1,0x753b,0x5212,0x5316,0x8bdd,0x69d0,0x5f8a,0x6000,
+0x6dee,0x574f,0x6b22,0x73af,0x6853,0x8fd8,0x7f13,0x6362,
+0x60a3,0x5524,0x75ea,0x8c62,0x7115,0x6da3,0x5ba6,0x5e7b,
+0x8352,0x614c,0x9ec4,0x78fa,0x8757,0x7c27,0x7687,0x51f0,
+0x60f6,0x714c,0x6643,0x5e4c,0x604d,0x8c0e,0x7070,0x6325,
+0x8f89,0x5fbd,0x6062,0x86d4,0x56de,0x6bc1,0x6094,0x6167,
+0x5349,0x60e0,0x6666,0x8d3f,0x79fd,0x4f1a,0x70e9,0x6c47,
+0x8bb3,0x8bf2,0x7ed8,0x8364,0x660f,0x5a5a,0x9b42,0x6d51,
+0x6df7,0x8c41,0x6d3b,0x4f19,0x706b,0x83b7,0x6216,0x60d1,
+0x970d,0x8d27,0x7978,0x51fb,0x573e,0x57fa,0x673a,0x7578,
+0x7a3d,0x79ef,0x7b95, NONE, NONE, NONE, NONE, NONE,
+ NONE,0x808c,0x9965,0x8ff9,0x6fc0,0x8ba5,0x9e21,0x59ec,
+0x7ee9,0x7f09,0x5409,0x6781,0x68d8,0x8f91,0x7c4d,0x96c6,
+0x53ca,0x6025,0x75be,0x6c72,0x5373,0x5ac9,0x7ea7,0x6324,
+0x51e0,0x810a,0x5df1,0x84df,0x6280,0x5180,0x5b63,0x4f0e,
+0x796d,0x5242,0x60b8,0x6d4e,0x5bc4,0x5bc2,0x8ba1,0x8bb0,
+0x65e2,0x5fcc,0x9645,0x5993,0x7ee7,0x7eaa,0x5609,0x67b7,
+0x5939,0x4f73,0x5bb6,0x52a0,0x835a,0x988a,0x8d3e,0x7532,
+0x94be,0x5047,0x7a3c,0x4ef7,0x67b6,0x9a7e,0x5ac1,0x6b7c,
+0x76d1,0x575a,0x5c16,0x7b3a,0x95f4,0x714e,0x517c,0x80a9,
+0x8270,0x5978,0x7f04,0x8327,0x68c0,0x67ec,0x78b1,0x7877,
+0x62e3,0x6361,0x7b80,0x4fed,0x526a,0x51cf,0x8350,0x69db,
+0x9274,0x8df5,0x8d31,0x89c1,0x952e,0x7bad,0x4ef6, NONE,
+ NONE, NONE, NONE, NONE, NONE,0x5065,0x8230,0x5251,
+0x996f,0x6e10,0x6e85,0x6da7,0x5efa,0x50f5,0x59dc,0x5c06,
+0x6d46,0x6c5f,0x7586,0x848b,0x6868,0x5956,0x8bb2,0x5320,
+0x9171,0x964d,0x8549,0x6912,0x7901,0x7126,0x80f6,0x4ea4,
+0x90ca,0x6d47,0x9a84,0x5a07,0x56bc,0x6405,0x94f0,0x77eb,
+0x4fa5,0x811a,0x72e1,0x89d2,0x997a,0x7f34,0x7ede,0x527f,
+0x6559,0x9175,0x8f7f,0x8f83,0x53eb,0x7a96,0x63ed,0x63a5,
+0x7686,0x79f8,0x8857,0x9636,0x622a,0x52ab,0x8282,0x6854,
+0x6770,0x6377,0x776b,0x7aed,0x6d01,0x7ed3,0x89e3,0x59d0,
+0x6212,0x85c9,0x82a5,0x754c,0x501f,0x4ecb,0x75a5,0x8beb,
+0x5c4a,0x5dfe,0x7b4b,0x65a4,0x91d1,0x4eca,0x6d25,0x895f,
+0x7d27,0x9526,0x4ec5,0x8c28,0x8fdb,0x9773,0x664b,0x7981,
+0x8fd1,0x70ec,0x6d78, NONE, NONE, NONE, NONE, NONE,
+ NONE,0x5c3d,0x52b2,0x8346,0x5162,0x830e,0x775b,0x6676,
+0x9cb8,0x4eac,0x60ca,0x7cbe,0x7cb3,0x7ecf,0x4e95,0x8b66,
+0x666f,0x9888,0x9759,0x5883,0x656c,0x955c,0x5f84,0x75c9,
+0x9756,0x7adf,0x7ade,0x51c0,0x70af,0x7a98,0x63ea,0x7a76,
+0x7ea0,0x7396,0x97ed,0x4e45,0x7078,0x4e5d,0x9152,0x53a9,
+0x6551,0x65e7,0x81fc,0x8205,0x548e,0x5c31,0x759a,0x97a0,
+0x62d8,0x72d9,0x75bd,0x5c45,0x9a79,0x83ca,0x5c40,0x5480,
+0x77e9,0x4e3e,0x6cae,0x805a,0x62d2,0x636e,0x5de8,0x5177,
+0x8ddd,0x8e1e,0x952f,0x4ff1,0x53e5,0x60e7,0x70ac,0x5267,
+0x6350,0x9e43,0x5a1f,0x5026,0x7737,0x5377,0x7ee2,0x6485,
+0x652b,0x6289,0x6398,0x5014,0x7235,0x89c9,0x51b3,0x8bc0,
+0x7edd,0x5747,0x83cc,0x94a7,0x519b,0x541b,0x5cfb, NONE,
+ NONE, NONE, NONE, NONE, NONE,0x4fca,0x7ae3,0x6d5a,
+0x90e1,0x9a8f,0x5580,0x5496,0x5361,0x54af,0x5f00,0x63e9,
+0x6977,0x51ef,0x6168,0x520a,0x582a,0x52d8,0x574e,0x780d,
+0x770b,0x5eb7,0x6177,0x7ce0,0x625b,0x6297,0x4ea2,0x7095,
+0x8003,0x62f7,0x70e4,0x9760,0x5777,0x82db,0x67ef,0x68f5,
+0x78d5,0x9897,0x79d1,0x58f3,0x54b3,0x53ef,0x6e34,0x514b,
+0x523b,0x5ba2,0x8bfe,0x80af,0x5543,0x57a6,0x6073,0x5751,
+0x542d,0x7a7a,0x6050,0x5b54,0x63a7,0x62a0,0x53e3,0x6263,
+0x5bc7,0x67af,0x54ed,0x7a9f,0x82e6,0x9177,0x5e93,0x88e4,
+0x5938,0x57ae,0x630e,0x8de8,0x80ef,0x5757,0x7b77,0x4fa9,
+0x5feb,0x5bbd,0x6b3e,0x5321,0x7b50,0x72c2,0x6846,0x77ff,
+0x7736,0x65f7,0x51b5,0x4e8f,0x76d4,0x5cbf,0x7aa5,0x8475,
+0x594e,0x9b41,0x5080, NONE, NONE, NONE, NONE, NONE,
+ NONE,0x9988,0x6127,0x6e83,0x5764,0x6606,0x6346,0x56f0,
+0x62ec,0x6269,0x5ed3,0x9614,0x5783,0x62c9,0x5587,0x8721,
+0x814a,0x8fa3,0x5566,0x83b1,0x6765,0x8d56,0x84dd,0x5a6a,
+0x680f,0x62e6,0x7bee,0x9611,0x5170,0x6f9c,0x8c30,0x63fd,
+0x89c8,0x61d2,0x7f06,0x70c2,0x6ee5,0x7405,0x6994,0x72fc,
+0x5eca,0x90ce,0x6717,0x6d6a,0x635e,0x52b3,0x7262,0x8001,
+0x4f6c,0x59e5,0x916a,0x70d9,0x6d9d,0x52d2,0x4e50,0x96f7,
+0x956d,0x857e,0x78ca,0x7d2f,0x5121,0x5792,0x64c2,0x808b,
+0x7c7b,0x6cea,0x68f1,0x695e,0x51b7,0x5398,0x68a8,0x7281,
+0x9ece,0x7bf1,0x72f8,0x79bb,0x6f13,0x7406,0x674e,0x91cc,
+0x9ca4,0x793c,0x8389,0x8354,0x540f,0x6817,0x4e3d,0x5389,
+0x52b1,0x783e,0x5386,0x5229,0x5088,0x4f8b,0x4fd0, NONE,
+ NONE, NONE, NONE, NONE, NONE,0x75e2,0x7acb,0x7c92,
+0x6ca5,0x96b6,0x529b,0x7483,0x54e9,0x4fe9,0x8054,0x83b2,
+0x8fde,0x9570,0x5ec9,0x601c,0x6d9f,0x5e18,0x655b,0x8138,
+0x94fe,0x604b,0x70bc,0x7ec3,0x7cae,0x51c9,0x6881,0x7cb1,
+0x826f,0x4e24,0x8f86,0x91cf,0x667e,0x4eae,0x8c05,0x64a9,
+0x804a,0x50da,0x7597,0x71ce,0x5be5,0x8fbd,0x6f66,0x4e86,
+0x6482,0x9563,0x5ed6,0x6599,0x5217,0x88c2,0x70c8,0x52a3,
+0x730e,0x7433,0x6797,0x78f7,0x9716,0x4e34,0x90bb,0x9cde,
+0x6dcb,0x51db,0x8d41,0x541d,0x62ce,0x73b2,0x83f1,0x96f6,
+0x9f84,0x94c3,0x4f36,0x7f9a,0x51cc,0x7075,0x9675,0x5cad,
+0x9886,0x53e6,0x4ee4,0x6e9c,0x7409,0x69b4,0x786b,0x998f,
+0x7559,0x5218,0x7624,0x6d41,0x67f3,0x516d,0x9f99,0x804b,
+0x5499,0x7b3c,0x7abf, NONE, NONE, NONE, NONE, NONE,
+ NONE,0x9686,0x5784,0x62e2,0x9647,0x697c,0x5a04,0x6402,
+0x7bd3,0x6f0f,0x964b,0x82a6,0x5362,0x9885,0x5e90,0x7089,
+0x63b3,0x5364,0x864f,0x9c81,0x9e93,0x788c,0x9732,0x8def,
+0x8d42,0x9e7f,0x6f5e,0x7984,0x5f55,0x9646,0x622e,0x9a74,
+0x5415,0x94dd,0x4fa3,0x65c5,0x5c65,0x5c61,0x7f15,0x8651,
+0x6c2f,0x5f8b,0x7387,0x6ee4,0x7eff,0x5ce6,0x631b,0x5b6a,
+0x6ee6,0x5375,0x4e71,0x63a0,0x7565,0x62a1,0x8f6e,0x4f26,
+0x4ed1,0x6ca6,0x7eb6,0x8bba,0x841d,0x87ba,0x7f57,0x903b,
+0x9523,0x7ba9,0x9aa1,0x88f8,0x843d,0x6d1b,0x9a86,0x7edc,
+0x5988,0x9ebb,0x739b,0x7801,0x8682,0x9a6c,0x9a82,0x561b,
+0x5417,0x57cb,0x4e70,0x9ea6,0x5356,0x8fc8,0x8109,0x7792,
+0x9992,0x86ee,0x6ee1,0x8513,0x66fc,0x6162,0x6f2b, NONE,
+ NONE, NONE, NONE, NONE, NONE,0x8c29,0x8292,0x832b,
+0x76f2,0x6c13,0x5fd9,0x83bd,0x732b,0x8305,0x951a,0x6bdb,
+0x77db,0x94c6,0x536f,0x8302,0x5192,0x5e3d,0x8c8c,0x8d38,
+0x4e48,0x73ab,0x679a,0x6885,0x9176,0x9709,0x7164,0x6ca1,
+0x7709,0x5a92,0x9541,0x6bcf,0x7f8e,0x6627,0x5bd0,0x59b9,
+0x5a9a,0x95e8,0x95f7,0x4eec,0x840c,0x8499,0x6aac,0x76df,
+0x9530,0x731b,0x68a6,0x5b5f,0x772f,0x919a,0x9761,0x7cdc,
+0x8ff7,0x8c1c,0x5f25,0x7c73,0x79d8,0x89c5,0x6ccc,0x871c,
+0x5bc6,0x5e42,0x68c9,0x7720,0x7ef5,0x5195,0x514d,0x52c9,
+0x5a29,0x7f05,0x9762,0x82d7,0x63cf,0x7784,0x85d0,0x79d2,
+0x6e3a,0x5e99,0x5999,0x8511,0x706d,0x6c11,0x62bf,0x76bf,
+0x654f,0x60af,0x95fd,0x660e,0x879f,0x9e23,0x94ed,0x540d,
+0x547d,0x8c2c,0x6478, NONE, NONE, NONE, NONE, NONE,
+ NONE,0x6479,0x8611,0x6a21,0x819c,0x78e8,0x6469,0x9b54,
+0x62b9,0x672b,0x83ab,0x58a8,0x9ed8,0x6cab,0x6f20,0x5bde,
+0x964c,0x8c0b,0x725f,0x67d0,0x62c7,0x7261,0x4ea9,0x59c6,
+0x6bcd,0x5893,0x66ae,0x5e55,0x52df,0x6155,0x6728,0x76ee,
+0x7766,0x7267,0x7a46,0x62ff,0x54ea,0x5450,0x94a0,0x90a3,
+0x5a1c,0x7eb3,0x6c16,0x4e43,0x5976,0x8010,0x5948,0x5357,
+0x7537,0x96be,0x56ca,0x6320,0x8111,0x607c,0x95f9,0x6dd6,
+0x5462,0x9981,0x5185,0x5ae9,0x80fd,0x59ae,0x9713,0x502a,
+0x6ce5,0x5c3c,0x62df,0x4f60,0x533f,0x817b,0x9006,0x6eba,
+0x852b,0x62c8,0x5e74,0x78be,0x64b5,0x637b,0x5ff5,0x5a18,
+0x917f,0x9e1f,0x5c3f,0x634f,0x8042,0x5b7d,0x556e,0x954a,
+0x954d,0x6d85,0x60a8,0x67e0,0x72de,0x51dd,0x5b81, NONE,
+ NONE, NONE, NONE, NONE, NONE,0x62e7,0x6cde,0x725b,
+0x626d,0x94ae,0x7ebd,0x8113,0x6d53,0x519c,0x5f04,0x5974,
+0x52aa,0x6012,0x5973,0x6696,0x8650,0x759f,0x632a,0x61e6,
+0x7cef,0x8bfa,0x54e6,0x6b27,0x9e25,0x6bb4,0x85d5,0x5455,
+0x5076,0x6ca4,0x556a,0x8db4,0x722c,0x5e15,0x6015,0x7436,
+0x62cd,0x6392,0x724c,0x5f98,0x6e43,0x6d3e,0x6500,0x6f58,
+0x76d8,0x78d0,0x76fc,0x7554,0x5224,0x53db,0x4e53,0x5e9e,
+0x65c1,0x802a,0x80d6,0x629b,0x5486,0x5228,0x70ae,0x888d,
+0x8dd1,0x6ce1,0x5478,0x80da,0x57f9,0x88f4,0x8d54,0x966a,
+0x914d,0x4f69,0x6c9b,0x55b7,0x76c6,0x7830,0x62a8,0x70f9,
+0x6f8e,0x5f6d,0x84ec,0x68da,0x787c,0x7bf7,0x81a8,0x670b,
+0x9e4f,0x6367,0x78b0,0x576f,0x7812,0x9739,0x6279,0x62ab,
+0x5288,0x7435,0x6bd7, NONE, NONE, NONE, NONE, NONE,
+ NONE,0x5564,0x813e,0x75b2,0x76ae,0x5339,0x75de,0x50fb,
+0x5c41,0x8b6c,0x7bc7,0x504f,0x7247,0x9a97,0x98d8,0x6f02,
+0x74e2,0x7968,0x6487,0x77a5,0x62fc,0x9891,0x8d2b,0x54c1,
+0x8058,0x4e52,0x576a,0x82f9,0x840d,0x5e73,0x51ed,0x74f6,
+0x8bc4,0x5c4f,0x5761,0x6cfc,0x9887,0x5a46,0x7834,0x9b44,
+0x8feb,0x7c95,0x5256,0x6251,0x94fa,0x4ec6,0x8386,0x8461,
+0x83e9,0x84b2,0x57d4,0x6734,0x5703,0x666e,0x6d66,0x8c31,
+0x66dd,0x7011,0x671f,0x6b3a,0x6816,0x621a,0x59bb,0x4e03,
+0x51c4,0x6f06,0x67d2,0x6c8f,0x5176,0x68cb,0x5947,0x6b67,
+0x7566,0x5d0e,0x8110,0x9f50,0x65d7,0x7948,0x7941,0x9a91,
+0x8d77,0x5c82,0x4e5e,0x4f01,0x542f,0x5951,0x780c,0x5668,
+0x6c14,0x8fc4,0x5f03,0x6c7d,0x6ce3,0x8bab,0x6390, NONE,
+ NONE, NONE, NONE, NONE, NONE,0x6070,0x6d3d,0x7275,
+0x6266,0x948e,0x94c5,0x5343,0x8fc1,0x7b7e,0x4edf,0x8c26,
+0x4e7e,0x9ed4,0x94b1,0x94b3,0x524d,0x6f5c,0x9063,0x6d45,
+0x8c34,0x5811,0x5d4c,0x6b20,0x6b49,0x67aa,0x545b,0x8154,
+0x7f8c,0x5899,0x8537,0x5f3a,0x62a2,0x6a47,0x9539,0x6572,
+0x6084,0x6865,0x77a7,0x4e54,0x4fa8,0x5de7,0x9798,0x64ac,
+0x7fd8,0x5ced,0x4fcf,0x7a8d,0x5207,0x8304,0x4e14,0x602f,
+0x7a83,0x94a6,0x4fb5,0x4eb2,0x79e6,0x7434,0x52e4,0x82b9,
+0x64d2,0x79bd,0x5bdd,0x6c81,0x9752,0x8f7b,0x6c22,0x503e,
+0x537f,0x6e05,0x64ce,0x6674,0x6c30,0x60c5,0x9877,0x8bf7,
+0x5e86,0x743c,0x7a77,0x79cb,0x4e18,0x90b1,0x7403,0x6c42,
+0x56da,0x914b,0x6cc5,0x8d8b,0x533a,0x86c6,0x66f2,0x8eaf,
+0x5c48,0x9a71,0x6e20, NONE, NONE, NONE, NONE, NONE,
+ NONE,0x53d6,0x5a36,0x9f8b,0x8da3,0x53bb,0x5708,0x98a7,
+0x6743,0x919b,0x6cc9,0x5168,0x75ca,0x62f3,0x72ac,0x5238,
+0x529d,0x7f3a,0x7094,0x7638,0x5374,0x9e4a,0x69b7,0x786e,
+0x96c0,0x88d9,0x7fa4,0x7136,0x71c3,0x5189,0x67d3,0x74e4,
+0x58e4,0x6518,0x56b7,0x8ba9,0x9976,0x6270,0x7ed5,0x60f9,
+0x70ed,0x58ec,0x4ec1,0x4eba,0x5fcd,0x97e7,0x4efb,0x8ba4,
+0x5203,0x598a,0x7eab,0x6254,0x4ecd,0x65e5,0x620e,0x8338,
+0x84c9,0x8363,0x878d,0x7194,0x6eb6,0x5bb9,0x7ed2,0x5197,
+0x63c9,0x67d4,0x8089,0x8339,0x8815,0x5112,0x5b7a,0x5982,
+0x8fb1,0x4e73,0x6c5d,0x5165,0x8925,0x8f6f,0x962e,0x854a,
+0x745e,0x9510,0x95f0,0x6da6,0x82e5,0x5f31,0x6492,0x6d12,
+0x8428,0x816e,0x9cc3,0x585e,0x8d5b,0x4e09,0x53c1, NONE,
+ NONE, NONE, NONE, NONE, NONE,0x4f1e,0x6563,0x6851,
+0x55d3,0x4e27,0x6414,0x9a9a,0x626b,0x5ac2,0x745f,0x8272,
+0x6da9,0x68ee,0x50e7,0x838e,0x7802,0x6740,0x5239,0x6c99,
+0x7eb1,0x50bb,0x5565,0x715e,0x7b5b,0x6652,0x73ca,0x82eb,
+0x6749,0x5c71,0x5220,0x717d,0x886b,0x95ea,0x9655,0x64c5,
+0x8d61,0x81b3,0x5584,0x6c55,0x6247,0x7f2e,0x5892,0x4f24,
+0x5546,0x8d4f,0x664c,0x4e0a,0x5c1a,0x88f3,0x68a2,0x634e,
+0x7a0d,0x70e7,0x828d,0x52fa,0x97f6,0x5c11,0x54e8,0x90b5,
+0x7ecd,0x5962,0x8d4a,0x86c7,0x820c,0x820d,0x8d66,0x6444,
+0x5c04,0x6151,0x6d89,0x793e,0x8bbe,0x7837,0x7533,0x547b,
+0x4f38,0x8eab,0x6df1,0x5a20,0x7ec5,0x795e,0x6c88,0x5ba1,
+0x5a76,0x751a,0x80be,0x614e,0x6e17,0x58f0,0x751f,0x7525,
+0x7272,0x5347,0x7ef3, NONE, NONE, NONE, NONE, NONE,
+ NONE,0x7701,0x76db,0x5269,0x80dc,0x5723,0x5e08,0x5931,
+0x72ee,0x65bd,0x6e7f,0x8bd7,0x5c38,0x8671,0x5341,0x77f3,
+0x62fe,0x65f6,0x4ec0,0x98df,0x8680,0x5b9e,0x8bc6,0x53f2,
+0x77e2,0x4f7f,0x5c4e,0x9a76,0x59cb,0x5f0f,0x793a,0x58eb,
+0x4e16,0x67ff,0x4e8b,0x62ed,0x8a93,0x901d,0x52bf,0x662f,
+0x55dc,0x566c,0x9002,0x4ed5,0x4f8d,0x91ca,0x9970,0x6c0f,
+0x5e02,0x6043,0x5ba4,0x89c6,0x8bd5,0x6536,0x624b,0x9996,
+0x5b88,0x5bff,0x6388,0x552e,0x53d7,0x7626,0x517d,0x852c,
+0x67a2,0x68b3,0x6b8a,0x6292,0x8f93,0x53d4,0x8212,0x6dd1,
+0x758f,0x4e66,0x8d4e,0x5b70,0x719f,0x85af,0x6691,0x66d9,
+0x7f72,0x8700,0x9ecd,0x9f20,0x5c5e,0x672f,0x8ff0,0x6811,
+0x675f,0x620d,0x7ad6,0x5885,0x5eb6,0x6570,0x6f31, NONE,
+ NONE, NONE, NONE, NONE, NONE,0x6055,0x5237,0x800d,
+0x6454,0x8870,0x7529,0x5e05,0x6813,0x62f4,0x971c,0x53cc,
+0x723d,0x8c01,0x6c34,0x7761,0x7a0e,0x542e,0x77ac,0x987a,
+0x821c,0x8bf4,0x7855,0x6714,0x70c1,0x65af,0x6495,0x5636,
+0x601d,0x79c1,0x53f8,0x4e1d,0x6b7b,0x8086,0x5bfa,0x55e3,
+0x56db,0x4f3a,0x4f3c,0x9972,0x5df3,0x677e,0x8038,0x6002,
+0x9882,0x9001,0x5b8b,0x8bbc,0x8bf5,0x641c,0x8258,0x64de,
+0x55fd,0x82cf,0x9165,0x4fd7,0x7d20,0x901f,0x7c9f,0x50f3,
+0x5851,0x6eaf,0x5bbf,0x8bc9,0x8083,0x9178,0x849c,0x7b97,
+0x867d,0x968b,0x968f,0x7ee5,0x9ad3,0x788e,0x5c81,0x7a57,
+0x9042,0x96a7,0x795f,0x5b59,0x635f,0x7b0b,0x84d1,0x68ad,
+0x5506,0x7f29,0x7410,0x7d22,0x9501,0x6240,0x584c,0x4ed6,
+0x5b83,0x5979,0x5854, NONE, NONE, NONE, NONE, NONE,
+ NONE,0x736d,0x631e,0x8e4b,0x8e0f,0x80ce,0x82d4,0x62ac,
+0x53f0,0x6cf0,0x915e,0x592a,0x6001,0x6c70,0x574d,0x644a,
+0x8d2a,0x762b,0x6ee9,0x575b,0x6a80,0x75f0,0x6f6d,0x8c2d,
+0x8c08,0x5766,0x6bef,0x8892,0x78b3,0x63a2,0x53f9,0x70ad,
+0x6c64,0x5858,0x642a,0x5802,0x68e0,0x819b,0x5510,0x7cd6,
+0x5018,0x8eba,0x6dcc,0x8d9f,0x70eb,0x638f,0x6d9b,0x6ed4,
+0x7ee6,0x8404,0x6843,0x9003,0x6dd8,0x9676,0x8ba8,0x5957,
+0x7279,0x85e4,0x817e,0x75bc,0x8a8a,0x68af,0x5254,0x8e22,
+0x9511,0x63d0,0x9898,0x8e44,0x557c,0x4f53,0x66ff,0x568f,
+0x60d5,0x6d95,0x5243,0x5c49,0x5929,0x6dfb,0x586b,0x7530,
+0x751c,0x606c,0x8214,0x8146,0x6311,0x6761,0x8fe2,0x773a,
+0x8df3,0x8d34,0x94c1,0x5e16,0x5385,0x542c,0x70c3, NONE,
+ NONE, NONE, NONE, NONE, NONE,0x6c40,0x5ef7,0x505c,
+0x4ead,0x5ead,0x633a,0x8247,0x901a,0x6850,0x916e,0x77b3,
+0x540c,0x94dc,0x5f64,0x7ae5,0x6876,0x6345,0x7b52,0x7edf,
+0x75db,0x5077,0x6295,0x5934,0x900f,0x51f8,0x79c3,0x7a81,
+0x56fe,0x5f92,0x9014,0x6d82,0x5c60,0x571f,0x5410,0x5154,
+0x6e4d,0x56e2,0x63a8,0x9893,0x817f,0x8715,0x892a,0x9000,
+0x541e,0x5c6f,0x81c0,0x62d6,0x6258,0x8131,0x9e35,0x9640,
+0x9a6e,0x9a7c,0x692d,0x59a5,0x62d3,0x553e,0x6316,0x54c7,
+0x86d9,0x6d3c,0x5a03,0x74e6,0x889c,0x6b6a,0x5916,0x8c4c,
+0x5f2f,0x6e7e,0x73a9,0x987d,0x4e38,0x70f7,0x5b8c,0x7897,
+0x633d,0x665a,0x7696,0x60cb,0x5b9b,0x5a49,0x4e07,0x8155,
+0x6c6a,0x738b,0x4ea1,0x6789,0x7f51,0x5f80,0x65fa,0x671b,
+0x5fd8,0x5984,0x5a01, NONE, NONE, NONE, NONE, NONE,
+ NONE,0x5dcd,0x5fae,0x5371,0x97e6,0x8fdd,0x6845,0x56f4,
+0x552f,0x60df,0x4e3a,0x6f4d,0x7ef4,0x82c7,0x840e,0x59d4,
+0x4f1f,0x4f2a,0x5c3e,0x7eac,0x672a,0x851a,0x5473,0x754f,
+0x80c3,0x5582,0x9b4f,0x4f4d,0x6e2d,0x8c13,0x5c09,0x6170,
+0x536b,0x761f,0x6e29,0x868a,0x6587,0x95fb,0x7eb9,0x543b,
+0x7a33,0x7d0a,0x95ee,0x55e1,0x7fc1,0x74ee,0x631d,0x8717,
+0x6da1,0x7a9d,0x6211,0x65a1,0x5367,0x63e1,0x6c83,0x5deb,
+0x545c,0x94a8,0x4e4c,0x6c61,0x8bec,0x5c4b,0x65e0,0x829c,
+0x68a7,0x543e,0x5434,0x6bcb,0x6b66,0x4e94,0x6342,0x5348,
+0x821e,0x4f0d,0x4fae,0x575e,0x620a,0x96fe,0x6664,0x7269,
+0x52ff,0x52a1,0x609f,0x8bef,0x6614,0x7199,0x6790,0x897f,
+0x7852,0x77fd,0x6670,0x563b,0x5438,0x9521,0x727a, NONE,
+ NONE, NONE, NONE, NONE, NONE,0x7a00,0x606f,0x5e0c,
+0x6089,0x819d,0x5915,0x60dc,0x7184,0x70ef,0x6eaa,0x6c50,
+0x7280,0x6a84,0x88ad,0x5e2d,0x4e60,0x5ab3,0x559c,0x94e3,
+0x6d17,0x7cfb,0x9699,0x620f,0x7ec6,0x778e,0x867e,0x5323,
+0x971e,0x8f96,0x6687,0x5ce1,0x4fa0,0x72ed,0x4e0b,0x53a6,
+0x590f,0x5413,0x6380,0x9528,0x5148,0x4ed9,0x9c9c,0x7ea4,
+0x54b8,0x8d24,0x8854,0x8237,0x95f2,0x6d8e,0x5f26,0x5acc,
+0x663e,0x9669,0x73b0,0x732e,0x53bf,0x817a,0x9985,0x7fa1,
+0x5baa,0x9677,0x9650,0x7ebf,0x76f8,0x53a2,0x9576,0x9999,
+0x7bb1,0x8944,0x6e58,0x4e61,0x7fd4,0x7965,0x8be6,0x60f3,
+0x54cd,0x4eab,0x9879,0x5df7,0x6a61,0x50cf,0x5411,0x8c61,
+0x8427,0x785d,0x9704,0x524a,0x54ee,0x56a3,0x9500,0x6d88,
+0x5bb5,0x6dc6,0x6653, NONE, NONE, NONE, NONE, NONE,
+ NONE,0x5c0f,0x5b5d,0x6821,0x8096,0x5578,0x7b11,0x6548,
+0x6954,0x4e9b,0x6b47,0x874e,0x978b,0x534f,0x631f,0x643a,
+0x90aa,0x659c,0x80c1,0x8c10,0x5199,0x68b0,0x5378,0x87f9,
+0x61c8,0x6cc4,0x6cfb,0x8c22,0x5c51,0x85aa,0x82af,0x950c,
+0x6b23,0x8f9b,0x65b0,0x5ffb,0x5fc3,0x4fe1,0x8845,0x661f,
+0x8165,0x7329,0x60fa,0x5174,0x5211,0x578b,0x5f62,0x90a2,
+0x884c,0x9192,0x5e78,0x674f,0x6027,0x59d3,0x5144,0x51f6,
+0x80f8,0x5308,0x6c79,0x96c4,0x718a,0x4f11,0x4fee,0x7f9e,
+0x673d,0x55c5,0x9508,0x79c0,0x8896,0x7ee3,0x589f,0x620c,
+0x9700,0x865a,0x5618,0x987b,0x5f90,0x8bb8,0x84c4,0x9157,
+0x53d9,0x65ed,0x5e8f,0x755c,0x6064,0x7d6e,0x5a7f,0x7eea,
+0x7eed,0x8f69,0x55a7,0x5ba3,0x60ac,0x65cb,0x7384, NONE,
+ NONE, NONE, NONE, NONE, NONE,0x9009,0x7663,0x7729,
+0x7eda,0x9774,0x859b,0x5b66,0x7a74,0x96ea,0x8840,0x52cb,
+0x718f,0x5faa,0x65ec,0x8be2,0x5bfb,0x9a6f,0x5de1,0x6b89,
+0x6c5b,0x8bad,0x8baf,0x900a,0x8fc5,0x538b,0x62bc,0x9e26,
+0x9e2d,0x5440,0x4e2b,0x82bd,0x7259,0x869c,0x5d16,0x8859,
+0x6daf,0x96c5,0x54d1,0x4e9a,0x8bb6,0x7109,0x54bd,0x9609,
+0x70df,0x6df9,0x76d0,0x4e25,0x7814,0x8712,0x5ca9,0x5ef6,
+0x8a00,0x989c,0x960e,0x708e,0x6cbf,0x5944,0x63a9,0x773c,
+0x884d,0x6f14,0x8273,0x5830,0x71d5,0x538c,0x781a,0x96c1,
+0x5501,0x5f66,0x7130,0x5bb4,0x8c1a,0x9a8c,0x6b83,0x592e,
+0x9e2f,0x79e7,0x6768,0x626c,0x4f6f,0x75a1,0x7f8a,0x6d0b,
+0x9633,0x6c27,0x4ef0,0x75d2,0x517b,0x6837,0x6f3e,0x9080,
+0x8170,0x5996,0x7476, NONE, NONE, NONE, NONE, NONE,
+ NONE,0x6447,0x5c27,0x9065,0x7a91,0x8c23,0x59da,0x54ac,
+0x8200,0x836f,0x8981,0x8000,0x6930,0x564e,0x8036,0x7237,
+0x91ce,0x51b6,0x4e5f,0x9875,0x6396,0x4e1a,0x53f6,0x66f3,
+0x814b,0x591c,0x6db2,0x4e00,0x58f9,0x533b,0x63d6,0x94f1,
+0x4f9d,0x4f0a,0x8863,0x9890,0x5937,0x9057,0x79fb,0x4eea,
+0x80f0,0x7591,0x6c82,0x5b9c,0x59e8,0x5f5d,0x6905,0x8681,
+0x501a,0x5df2,0x4e59,0x77e3,0x4ee5,0x827a,0x6291,0x6613,
+0x9091,0x5c79,0x4ebf,0x5f79,0x81c6,0x9038,0x8084,0x75ab,
+0x4ea6,0x88d4,0x610f,0x6bc5,0x5fc6,0x4e49,0x76ca,0x6ea2,
+0x8be3,0x8bae,0x8c0a,0x8bd1,0x5f02,0x7ffc,0x7fcc,0x7ece,
+0x8335,0x836b,0x56e0,0x6bb7,0x97f3,0x9634,0x59fb,0x541f,
+0x94f6,0x6deb,0x5bc5,0x996e,0x5c39,0x5f15,0x9690, NONE,
+ NONE, NONE, NONE, NONE, NONE,0x5370,0x82f1,0x6a31,
+0x5a74,0x9e70,0x5e94,0x7f28,0x83b9,0x8424,0x8425,0x8367,
+0x8747,0x8fce,0x8d62,0x76c8,0x5f71,0x9896,0x786c,0x6620,
+0x54df,0x62e5,0x4f63,0x81c3,0x75c8,0x5eb8,0x96cd,0x8e0a,
+0x86f9,0x548f,0x6cf3,0x6d8c,0x6c38,0x607f,0x52c7,0x7528,
+0x5e7d,0x4f18,0x60a0,0x5fe7,0x5c24,0x7531,0x90ae,0x94c0,
+0x72b9,0x6cb9,0x6e38,0x9149,0x6709,0x53cb,0x53f3,0x4f51,
+0x91c9,0x8bf1,0x53c8,0x5e7c,0x8fc2,0x6de4,0x4e8e,0x76c2,
+0x6986,0x865e,0x611a,0x8206,0x4f59,0x4fde,0x903e,0x9c7c,
+0x6109,0x6e1d,0x6e14,0x9685,0x4e88,0x5a31,0x96e8,0x4e0e,
+0x5c7f,0x79b9,0x5b87,0x8bed,0x7fbd,0x7389,0x57df,0x828b,
+0x90c1,0x5401,0x9047,0x55bb,0x5cea,0x5fa1,0x6108,0x6b32,
+0x72f1,0x80b2,0x8a89, NONE, NONE, NONE, NONE, NONE,
+ NONE,0x6d74,0x5bd3,0x88d5,0x9884,0x8c6b,0x9a6d,0x9e33,
+0x6e0a,0x51a4,0x5143,0x57a3,0x8881,0x539f,0x63f4,0x8f95,
+0x56ed,0x5458,0x5706,0x733f,0x6e90,0x7f18,0x8fdc,0x82d1,
+0x613f,0x6028,0x9662,0x66f0,0x7ea6,0x8d8a,0x8dc3,0x94a5,
+0x5cb3,0x7ca4,0x6708,0x60a6,0x9605,0x8018,0x4e91,0x90e7,
+0x5300,0x9668,0x5141,0x8fd0,0x8574,0x915d,0x6655,0x97f5,
+0x5b55,0x531d,0x7838,0x6742,0x683d,0x54c9,0x707e,0x5bb0,
+0x8f7d,0x518d,0x5728,0x54b1,0x6512,0x6682,0x8d5e,0x8d43,
+0x810f,0x846c,0x906d,0x7cdf,0x51ff,0x85fb,0x67a3,0x65e9,
+0x6fa1,0x86a4,0x8e81,0x566a,0x9020,0x7682,0x7076,0x71e5,
+0x8d23,0x62e9,0x5219,0x6cfd,0x8d3c,0x600e,0x589e,0x618e,
+0x66fe,0x8d60,0x624e,0x55b3,0x6e23,0x672d,0x8f67, NONE,
+ NONE, NONE, NONE, NONE, NONE,0x94e1,0x95f8,0x7728,
+0x6805,0x69a8,0x548b,0x4e4d,0x70b8,0x8bc8,0x6458,0x658b,
+0x5b85,0x7a84,0x503a,0x5be8,0x77bb,0x6be1,0x8a79,0x7c98,
+0x6cbe,0x76cf,0x65a9,0x8f97,0x5d2d,0x5c55,0x8638,0x6808,
+0x5360,0x6218,0x7ad9,0x6e5b,0x7efd,0x6a1f,0x7ae0,0x5f70,
+0x6f33,0x5f20,0x638c,0x6da8,0x6756,0x4e08,0x5e10,0x8d26,
+0x4ed7,0x80c0,0x7634,0x969c,0x62db,0x662d,0x627e,0x6cbc,
+0x8d75,0x7167,0x7f69,0x5146,0x8087,0x53ec,0x906e,0x6298,
+0x54f2,0x86f0,0x8f99,0x8005,0x9517,0x8517,0x8fd9,0x6d59,
+0x73cd,0x659f,0x771f,0x7504,0x7827,0x81fb,0x8d1e,0x9488,
+0x4fa6,0x6795,0x75b9,0x8bca,0x9707,0x632f,0x9547,0x9635,
+0x84b8,0x6323,0x7741,0x5f81,0x72f0,0x4e89,0x6014,0x6574,
+0x62ef,0x6b63,0x653f, NONE, NONE, NONE, NONE, NONE,
+ NONE,0x5e27,0x75c7,0x90d1,0x8bc1,0x829d,0x679d,0x652f,
+0x5431,0x8718,0x77e5,0x80a2,0x8102,0x6c41,0x4e4b,0x7ec7,
+0x804c,0x76f4,0x690d,0x6b96,0x6267,0x503c,0x4f84,0x5740,
+0x6307,0x6b62,0x8dbe,0x53ea,0x65e8,0x7eb8,0x5fd7,0x631a,
+0x63b7,0x81f3,0x81f4,0x7f6e,0x5e1c,0x5cd9,0x5236,0x667a,
+0x79e9,0x7a1a,0x8d28,0x7099,0x75d4,0x6ede,0x6cbb,0x7a92,
+0x4e2d,0x76c5,0x5fe0,0x949f,0x8877,0x7ec8,0x79cd,0x80bf,
+0x91cd,0x4ef2,0x4f17,0x821f,0x5468,0x5dde,0x6d32,0x8bcc,
+0x7ca5,0x8f74,0x8098,0x5e1a,0x5492,0x76b1,0x5b99,0x663c,
+0x9aa4,0x73e0,0x682a,0x86db,0x6731,0x732a,0x8bf8,0x8bdb,
+0x9010,0x7af9,0x70db,0x716e,0x62c4,0x77a9,0x5631,0x4e3b,
+0x8457,0x67f1,0x52a9,0x86c0,0x8d2e,0x94f8,0x7b51, NONE,
+ NONE, NONE, NONE, NONE, NONE,0x4f4f,0x6ce8,0x795d,
+0x9a7b,0x6293,0x722a,0x62fd,0x4e13,0x7816,0x8f6c,0x64b0,
+0x8d5a,0x7bc6,0x6869,0x5e84,0x88c5,0x5986,0x649e,0x58ee,
+0x72b6,0x690e,0x9525,0x8ffd,0x8d58,0x5760,0x7f00,0x8c06,
+0x51c6,0x6349,0x62d9,0x5353,0x684c,0x7422,0x8301,0x914c,
+0x5544,0x7740,0x707c,0x6d4a,0x5179,0x54a8,0x8d44,0x59ff,
+0x6ecb,0x6dc4,0x5b5c,0x7d2b,0x4ed4,0x7c7d,0x6ed3,0x5b50,
+0x81ea,0x6e0d,0x5b57,0x9b03,0x68d5,0x8e2a,0x5b97,0x7efc,
+0x603b,0x7eb5,0x90b9,0x8d70,0x594f,0x63cd,0x79df,0x8db3,
+0x5352,0x65cf,0x7956,0x8bc5,0x963b,0x7ec4,0x94bb,0x7e82,
+0x5634,0x9189,0x6700,0x7f6a,0x5c0a,0x9075,0x6628,0x5de6,
+0x4f50,0x67de,0x505a,0x4f5c,0x5750,0x5ea7, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE,0x4e8d,0x4e0c,0x5140,0x4e10,0x5eff,0x5345,0x4e15,
+0x4e98,0x4e1e,0x9b32,0x5b6c,0x5669,0x4e28,0x79ba,0x4e3f,
+0x5315,0x4e47,0x592d,0x723b,0x536e,0x6c10,0x56df,0x80e4,
+0x9997,0x6bd3,0x777e,0x9f17,0x4e36,0x4e9f,0x9f10,0x4e5c,
+0x4e69,0x4e93,0x8288,0x5b5b,0x556c,0x560f,0x4ec4,0x538d,
+0x539d,0x53a3,0x53a5,0x53ae,0x9765,0x8d5d,0x531a,0x53f5,
+0x5326,0x532e,0x533e,0x8d5c,0x5366,0x5363,0x5202,0x5208,
+0x520e,0x522d,0x5233,0x523f,0x5240,0x524c,0x525e,0x5261,
+0x525c,0x84af,0x527d,0x5282,0x5281,0x5290,0x5293,0x5182,
+0x7f54,0x4ebb,0x4ec3,0x4ec9,0x4ec2,0x4ee8,0x4ee1,0x4eeb,
+0x4ede,0x4f1b,0x4ef3,0x4f22,0x4f64,0x4ef5,0x4f25,0x4f27,
+0x4f09,0x4f2b,0x4f5e,0x4f67,0x6538,0x4f5a,0x4f5d, NONE,
+ NONE, NONE, NONE, NONE, NONE,0x4f5f,0x4f57,0x4f32,
+0x4f3d,0x4f76,0x4f74,0x4f91,0x4f89,0x4f83,0x4f8f,0x4f7e,
+0x4f7b,0x4faa,0x4f7c,0x4fac,0x4f94,0x4fe6,0x4fe8,0x4fea,
+0x4fc5,0x4fda,0x4fe3,0x4fdc,0x4fd1,0x4fdf,0x4ff8,0x5029,
+0x504c,0x4ff3,0x502c,0x500f,0x502e,0x502d,0x4ffe,0x501c,
+0x500c,0x5025,0x5028,0x507e,0x5043,0x5055,0x5048,0x504e,
+0x506c,0x507b,0x50a5,0x50a7,0x50a9,0x50ba,0x50d6,0x5106,
+0x50ed,0x50ec,0x50e6,0x50ee,0x5107,0x510b,0x4edd,0x6c3d,
+0x4f58,0x4f65,0x4fce,0x9fa0,0x6c46,0x7c74,0x516e,0x5dfd,
+0x9ec9,0x9998,0x5181,0x5914,0x52f9,0x530d,0x8a07,0x5310,
+0x51eb,0x5919,0x5155,0x4ea0,0x5156,0x4eb3,0x886e,0x88a4,
+0x4eb5,0x8114,0x88d2,0x7980,0x5b34,0x8803,0x7fb8,0x51ab,
+0x51b1,0x51bd,0x51bc, NONE, NONE, NONE, NONE, NONE,
+ NONE,0x51c7,0x5196,0x51a2,0x51a5,0x8ba0,0x8ba6,0x8ba7,
+0x8baa,0x8bb4,0x8bb5,0x8bb7,0x8bc2,0x8bc3,0x8bcb,0x8bcf,
+0x8bce,0x8bd2,0x8bd3,0x8bd4,0x8bd6,0x8bd8,0x8bd9,0x8bdc,
+0x8bdf,0x8be0,0x8be4,0x8be8,0x8be9,0x8bee,0x8bf0,0x8bf3,
+0x8bf6,0x8bf9,0x8bfc,0x8bff,0x8c00,0x8c02,0x8c04,0x8c07,
+0x8c0c,0x8c0f,0x8c11,0x8c12,0x8c14,0x8c15,0x8c16,0x8c19,
+0x8c1b,0x8c18,0x8c1d,0x8c1f,0x8c20,0x8c21,0x8c25,0x8c27,
+0x8c2a,0x8c2b,0x8c2e,0x8c2f,0x8c32,0x8c33,0x8c35,0x8c36,
+0x5369,0x537a,0x961d,0x9622,0x9621,0x9631,0x962a,0x963d,
+0x963c,0x9642,0x9649,0x9654,0x965f,0x9667,0x966c,0x9672,
+0x9674,0x9688,0x968d,0x9697,0x96b0,0x9097,0x909b,0x909d,
+0x9099,0x90ac,0x90a1,0x90b4,0x90b3,0x90b6,0x90ba, NONE,
+ NONE, NONE, NONE, NONE, NONE,0x90b8,0x90b0,0x90cf,
+0x90c5,0x90be,0x90d0,0x90c4,0x90c7,0x90d3,0x90e6,0x90e2,
+0x90dc,0x90d7,0x90db,0x90eb,0x90ef,0x90fe,0x9104,0x9122,
+0x911e,0x9123,0x9131,0x912f,0x9139,0x9143,0x9146,0x520d,
+0x5942,0x52a2,0x52ac,0x52ad,0x52be,0x54ff,0x52d0,0x52d6,
+0x52f0,0x53df,0x71ee,0x77cd,0x5ef4,0x51f5,0x51fc,0x9b2f,
+0x53b6,0x5f01,0x755a,0x5def,0x574c,0x57a9,0x57a1,0x587e,
+0x58bc,0x58c5,0x58d1,0x5729,0x572c,0x572a,0x5733,0x5739,
+0x572e,0x572f,0x575c,0x573b,0x5742,0x5769,0x5785,0x576b,
+0x5786,0x577c,0x577b,0x5768,0x576d,0x5776,0x5773,0x57ad,
+0x57a4,0x578c,0x57b2,0x57cf,0x57a7,0x57b4,0x5793,0x57a0,
+0x57d5,0x57d8,0x57da,0x57d9,0x57d2,0x57b8,0x57f4,0x57ef,
+0x57f8,0x57e4,0x57dd, NONE, NONE, NONE, NONE, NONE,
+ NONE,0x580b,0x580d,0x57fd,0x57ed,0x5800,0x581e,0x5819,
+0x5844,0x5820,0x5865,0x586c,0x5881,0x5889,0x589a,0x5880,
+0x99a8,0x9f19,0x61ff,0x8279,0x827d,0x827f,0x828f,0x828a,
+0x82a8,0x8284,0x828e,0x8291,0x8297,0x8299,0x82ab,0x82b8,
+0x82be,0x82b0,0x82c8,0x82ca,0x82e3,0x8298,0x82b7,0x82ae,
+0x82cb,0x82cc,0x82c1,0x82a9,0x82b4,0x82a1,0x82aa,0x829f,
+0x82c4,0x82ce,0x82a4,0x82e1,0x8309,0x82f7,0x82e4,0x830f,
+0x8307,0x82dc,0x82f4,0x82d2,0x82d8,0x830c,0x82fb,0x82d3,
+0x8311,0x831a,0x8306,0x8314,0x8315,0x82e0,0x82d5,0x831c,
+0x8351,0x835b,0x835c,0x8308,0x8392,0x833c,0x8334,0x8331,
+0x839b,0x835e,0x832f,0x834f,0x8347,0x8343,0x835f,0x8340,
+0x8317,0x8360,0x832d,0x833a,0x8333,0x8366,0x8365, NONE,
+ NONE, NONE, NONE, NONE, NONE,0x8368,0x831b,0x8369,
+0x836c,0x836a,0x836d,0x836e,0x83b0,0x8378,0x83b3,0x83b4,
+0x83a0,0x83aa,0x8393,0x839c,0x8385,0x837c,0x83b6,0x83a9,
+0x837d,0x83b8,0x837b,0x8398,0x839e,0x83a8,0x83ba,0x83bc,
+0x83c1,0x8401,0x83e5,0x83d8,0x5807,0x8418,0x840b,0x83dd,
+0x83fd,0x83d6,0x841c,0x8438,0x8411,0x8406,0x83d4,0x83df,
+0x840f,0x8403,0x83f8,0x83f9,0x83ea,0x83c5,0x83c0,0x8426,
+0x83f0,0x83e1,0x845c,0x8451,0x845a,0x8459,0x8473,0x8487,
+0x8488,0x847a,0x8489,0x8478,0x843c,0x8446,0x8469,0x8476,
+0x848c,0x848e,0x8431,0x846d,0x84c1,0x84cd,0x84d0,0x84e6,
+0x84bd,0x84d3,0x84ca,0x84bf,0x84ba,0x84e0,0x84a1,0x84b9,
+0x84b4,0x8497,0x84e5,0x84e3,0x850c,0x750d,0x8538,0x84f0,
+0x8539,0x851f,0x853a, NONE, NONE, NONE, NONE, NONE,
+ NONE,0x8556,0x853b,0x84ff,0x84fc,0x8559,0x8548,0x8568,
+0x8564,0x855e,0x857a,0x77a2,0x8543,0x8572,0x857b,0x85a4,
+0x85a8,0x8587,0x858f,0x8579,0x85ae,0x859c,0x8585,0x85b9,
+0x85b7,0x85b0,0x85d3,0x85c1,0x85dc,0x85ff,0x8627,0x8605,
+0x8629,0x8616,0x863c,0x5efe,0x5f08,0x593c,0x5941,0x8037,
+0x5955,0x595a,0x5958,0x530f,0x5c22,0x5c25,0x5c2c,0x5c34,
+0x624c,0x626a,0x629f,0x62bb,0x62ca,0x62da,0x62d7,0x62ee,
+0x6322,0x62f6,0x6339,0x634b,0x6343,0x63ad,0x63f6,0x6371,
+0x637a,0x638e,0x63b4,0x636d,0x63ac,0x638a,0x6369,0x63ae,
+0x63bc,0x63f2,0x63f8,0x63e0,0x63ff,0x63c4,0x63de,0x63ce,
+0x6452,0x63c6,0x63be,0x6445,0x6441,0x640b,0x641b,0x6420,
+0x640c,0x6426,0x6421,0x645e,0x6484,0x646d,0x6496, NONE,
+ NONE, NONE, NONE, NONE, NONE,0x647a,0x64b7,0x64b8,
+0x6499,0x64ba,0x64c0,0x64d0,0x64d7,0x64e4,0x64e2,0x6509,
+0x6525,0x652e,0x5f0b,0x5fd2,0x7519,0x5f11,0x535f,0x53f1,
+0x53fd,0x53e9,0x53e8,0x53fb,0x5412,0x5416,0x5406,0x544b,
+0x5452,0x5453,0x5454,0x5456,0x5443,0x5421,0x5457,0x5459,
+0x5423,0x5432,0x5482,0x5494,0x5477,0x5471,0x5464,0x549a,
+0x549b,0x5484,0x5476,0x5466,0x549d,0x54d0,0x54ad,0x54c2,
+0x54b4,0x54d2,0x54a7,0x54a6,0x54d3,0x54d4,0x5472,0x54a3,
+0x54d5,0x54bb,0x54bf,0x54cc,0x54d9,0x54da,0x54dc,0x54a9,
+0x54aa,0x54a4,0x54dd,0x54cf,0x54de,0x551b,0x54e7,0x5520,
+0x54fd,0x5514,0x54f3,0x5522,0x5523,0x550f,0x5511,0x5527,
+0x552a,0x5567,0x558f,0x55b5,0x5549,0x556d,0x5541,0x5555,
+0x553f,0x5550,0x553c, NONE, NONE, NONE, NONE, NONE,
+ NONE,0x5537,0x5556,0x5575,0x5576,0x5577,0x5533,0x5530,
+0x555c,0x558b,0x55d2,0x5583,0x55b1,0x55b9,0x5588,0x5581,
+0x559f,0x557e,0x55d6,0x5591,0x557b,0x55df,0x55bd,0x55be,
+0x5594,0x5599,0x55ea,0x55f7,0x55c9,0x561f,0x55d1,0x55eb,
+0x55ec,0x55d4,0x55e6,0x55dd,0x55c4,0x55ef,0x55e5,0x55f2,
+0x55f3,0x55cc,0x55cd,0x55e8,0x55f5,0x55e4,0x8f94,0x561e,
+0x5608,0x560c,0x5601,0x5624,0x5623,0x55fe,0x5600,0x5627,
+0x562d,0x5658,0x5639,0x5657,0x562c,0x564d,0x5662,0x5659,
+0x565c,0x564c,0x5654,0x5686,0x5664,0x5671,0x566b,0x567b,
+0x567c,0x5685,0x5693,0x56af,0x56d4,0x56d7,0x56dd,0x56e1,
+0x56f5,0x56eb,0x56f9,0x56ff,0x5704,0x570a,0x5709,0x571c,
+0x5e0f,0x5e19,0x5e14,0x5e11,0x5e31,0x5e3b,0x5e3c, NONE,
+ NONE, NONE, NONE, NONE, NONE,0x5e37,0x5e44,0x5e54,
+0x5e5b,0x5e5e,0x5e61,0x5c8c,0x5c7a,0x5c8d,0x5c90,0x5c96,
+0x5c88,0x5c98,0x5c99,0x5c91,0x5c9a,0x5c9c,0x5cb5,0x5ca2,
+0x5cbd,0x5cac,0x5cab,0x5cb1,0x5ca3,0x5cc1,0x5cb7,0x5cc4,
+0x5cd2,0x5ce4,0x5ccb,0x5ce5,0x5d02,0x5d03,0x5d27,0x5d26,
+0x5d2e,0x5d24,0x5d1e,0x5d06,0x5d1b,0x5d58,0x5d3e,0x5d34,
+0x5d3d,0x5d6c,0x5d5b,0x5d6f,0x5d5d,0x5d6b,0x5d4b,0x5d4a,
+0x5d69,0x5d74,0x5d82,0x5d99,0x5d9d,0x8c73,0x5db7,0x5dc5,
+0x5f73,0x5f77,0x5f82,0x5f87,0x5f89,0x5f8c,0x5f95,0x5f99,
+0x5f9c,0x5fa8,0x5fad,0x5fb5,0x5fbc,0x8862,0x5f61,0x72ad,
+0x72b0,0x72b4,0x72b7,0x72b8,0x72c3,0x72c1,0x72ce,0x72cd,
+0x72d2,0x72e8,0x72ef,0x72e9,0x72f2,0x72f4,0x72f7,0x7301,
+0x72f3,0x7303,0x72fa, NONE, NONE, NONE, NONE, NONE,
+ NONE,0x72fb,0x7317,0x7313,0x7321,0x730a,0x731e,0x731d,
+0x7315,0x7322,0x7339,0x7325,0x732c,0x7338,0x7331,0x7350,
+0x734d,0x7357,0x7360,0x736c,0x736f,0x737e,0x821b,0x5925,
+0x98e7,0x5924,0x5902,0x9963,0x9967,0x9968,0x9969,0x996a,
+0x996b,0x996c,0x9974,0x9977,0x997d,0x9980,0x9984,0x9987,
+0x998a,0x998d,0x9990,0x9991,0x9993,0x9994,0x9995,0x5e80,
+0x5e91,0x5e8b,0x5e96,0x5ea5,0x5ea0,0x5eb9,0x5eb5,0x5ebe,
+0x5eb3,0x8d53,0x5ed2,0x5ed1,0x5edb,0x5ee8,0x5eea,0x81ba,
+0x5fc4,0x5fc9,0x5fd6,0x5fcf,0x6003,0x5fee,0x6004,0x5fe1,
+0x5fe4,0x5ffe,0x6005,0x6006,0x5fea,0x5fed,0x5ff8,0x6019,
+0x6035,0x6026,0x601b,0x600f,0x600d,0x6029,0x602b,0x600a,
+0x603f,0x6021,0x6078,0x6079,0x607b,0x607a,0x6042, NONE,
+ NONE, NONE, NONE, NONE, NONE,0x606a,0x607d,0x6096,
+0x609a,0x60ad,0x609d,0x6083,0x6092,0x608c,0x609b,0x60ec,
+0x60bb,0x60b1,0x60dd,0x60d8,0x60c6,0x60da,0x60b4,0x6120,
+0x6126,0x6115,0x6123,0x60f4,0x6100,0x610e,0x612b,0x614a,
+0x6175,0x61ac,0x6194,0x61a7,0x61b7,0x61d4,0x61f5,0x5fdd,
+0x96b3,0x95e9,0x95eb,0x95f1,0x95f3,0x95f5,0x95f6,0x95fc,
+0x95fe,0x9603,0x9604,0x9606,0x9608,0x960a,0x960b,0x960c,
+0x960d,0x960f,0x9612,0x9615,0x9616,0x9617,0x9619,0x961a,
+0x4e2c,0x723f,0x6215,0x6c35,0x6c54,0x6c5c,0x6c4a,0x6ca3,
+0x6c85,0x6c90,0x6c94,0x6c8c,0x6c68,0x6c69,0x6c74,0x6c76,
+0x6c86,0x6ca9,0x6cd0,0x6cd4,0x6cad,0x6cf7,0x6cf8,0x6cf1,
+0x6cd7,0x6cb2,0x6ce0,0x6cd6,0x6cfa,0x6ceb,0x6cee,0x6cb1,
+0x6cd3,0x6cef,0x6cfe, NONE, NONE, NONE, NONE, NONE,
+ NONE,0x6d39,0x6d27,0x6d0c,0x6d43,0x6d48,0x6d07,0x6d04,
+0x6d19,0x6d0e,0x6d2b,0x6d4d,0x6d2e,0x6d35,0x6d1a,0x6d4f,
+0x6d52,0x6d54,0x6d33,0x6d91,0x6d6f,0x6d9e,0x6da0,0x6d5e,
+0x6d93,0x6d94,0x6d5c,0x6d60,0x6d7c,0x6d63,0x6e1a,0x6dc7,
+0x6dc5,0x6dde,0x6e0e,0x6dbf,0x6de0,0x6e11,0x6de6,0x6ddd,
+0x6dd9,0x6e16,0x6dab,0x6e0c,0x6dae,0x6e2b,0x6e6e,0x6e4e,
+0x6e6b,0x6eb2,0x6e5f,0x6e86,0x6e53,0x6e54,0x6e32,0x6e25,
+0x6e44,0x6edf,0x6eb1,0x6e98,0x6ee0,0x6f2d,0x6ee2,0x6ea5,
+0x6ea7,0x6ebd,0x6ebb,0x6eb7,0x6ed7,0x6eb4,0x6ecf,0x6e8f,
+0x6ec2,0x6e9f,0x6f62,0x6f46,0x6f47,0x6f24,0x6f15,0x6ef9,
+0x6f2f,0x6f36,0x6f4b,0x6f74,0x6f2a,0x6f09,0x6f29,0x6f89,
+0x6f8d,0x6f8c,0x6f78,0x6f72,0x6f7c,0x6f7a,0x6fd1, NONE,
+ NONE, NONE, NONE, NONE, NONE,0x6fc9,0x6fa7,0x6fb9,
+0x6fb6,0x6fc2,0x6fe1,0x6fee,0x6fde,0x6fe0,0x6fef,0x701a,
+0x7023,0x701b,0x7039,0x7035,0x704f,0x705e,0x5b80,0x5b84,
+0x5b95,0x5b93,0x5ba5,0x5bb8,0x752f,0x9a9e,0x6434,0x5be4,
+0x5bee,0x8930,0x5bf0,0x8e47,0x8b07,0x8fb6,0x8fd3,0x8fd5,
+0x8fe5,0x8fee,0x8fe4,0x8fe9,0x8fe6,0x8ff3,0x8fe8,0x9005,
+0x9004,0x900b,0x9026,0x9011,0x900d,0x9016,0x9021,0x9035,
+0x9036,0x902d,0x902f,0x9044,0x9051,0x9052,0x9050,0x9068,
+0x9058,0x9062,0x905b,0x66b9,0x9074,0x907d,0x9082,0x9088,
+0x9083,0x908b,0x5f50,0x5f57,0x5f56,0x5f58,0x5c3b,0x54ab,
+0x5c50,0x5c59,0x5b71,0x5c63,0x5c66,0x7fbc,0x5f2a,0x5f29,
+0x5f2d,0x8274,0x5f3c,0x9b3b,0x5c6e,0x5981,0x5983,0x598d,
+0x59a9,0x59aa,0x59a3, NONE, NONE, NONE, NONE, NONE,
+ NONE,0x5997,0x59ca,0x59ab,0x599e,0x59a4,0x59d2,0x59b2,
+0x59af,0x59d7,0x59be,0x5a05,0x5a06,0x59dd,0x5a08,0x59e3,
+0x59d8,0x59f9,0x5a0c,0x5a09,0x5a32,0x5a34,0x5a11,0x5a23,
+0x5a13,0x5a40,0x5a67,0x5a4a,0x5a55,0x5a3c,0x5a62,0x5a75,
+0x80ec,0x5aaa,0x5a9b,0x5a77,0x5a7a,0x5abe,0x5aeb,0x5ab2,
+0x5ad2,0x5ad4,0x5ab8,0x5ae0,0x5ae3,0x5af1,0x5ad6,0x5ae6,
+0x5ad8,0x5adc,0x5b09,0x5b17,0x5b16,0x5b32,0x5b37,0x5b40,
+0x5c15,0x5c1c,0x5b5a,0x5b65,0x5b73,0x5b51,0x5b53,0x5b62,
+0x9a75,0x9a77,0x9a78,0x9a7a,0x9a7f,0x9a7d,0x9a80,0x9a81,
+0x9a85,0x9a88,0x9a8a,0x9a90,0x9a92,0x9a93,0x9a96,0x9a98,
+0x9a9b,0x9a9c,0x9a9d,0x9a9f,0x9aa0,0x9aa2,0x9aa3,0x9aa5,
+0x9aa7,0x7e9f,0x7ea1,0x7ea3,0x7ea5,0x7ea8,0x7ea9, NONE,
+ NONE, NONE, NONE, NONE, NONE,0x7ead,0x7eb0,0x7ebe,
+0x7ec0,0x7ec1,0x7ec2,0x7ec9,0x7ecb,0x7ecc,0x7ed0,0x7ed4,
+0x7ed7,0x7edb,0x7ee0,0x7ee1,0x7ee8,0x7eeb,0x7eee,0x7eef,
+0x7ef1,0x7ef2,0x7f0d,0x7ef6,0x7efa,0x7efb,0x7efe,0x7f01,
+0x7f02,0x7f03,0x7f07,0x7f08,0x7f0b,0x7f0c,0x7f0f,0x7f11,
+0x7f12,0x7f17,0x7f19,0x7f1c,0x7f1b,0x7f1f,0x7f21,0x7f22,
+0x7f23,0x7f24,0x7f25,0x7f26,0x7f27,0x7f2a,0x7f2b,0x7f2c,
+0x7f2d,0x7f2f,0x7f30,0x7f31,0x7f32,0x7f33,0x7f35,0x5e7a,
+0x757f,0x5ddb,0x753e,0x9095,0x738e,0x7391,0x73ae,0x73a2,
+0x739f,0x73cf,0x73c2,0x73d1,0x73b7,0x73b3,0x73c0,0x73c9,
+0x73c8,0x73e5,0x73d9,0x987c,0x740a,0x73e9,0x73e7,0x73de,
+0x73ba,0x73f2,0x740f,0x742a,0x745b,0x7426,0x7425,0x7428,
+0x7430,0x742e,0x742c, NONE, NONE, NONE, NONE, NONE,
+ NONE,0x741b,0x741a,0x7441,0x745c,0x7457,0x7455,0x7459,
+0x7477,0x746d,0x747e,0x749c,0x748e,0x7480,0x7481,0x7487,
+0x748b,0x749e,0x74a8,0x74a9,0x7490,0x74a7,0x74d2,0x74ba,
+0x97ea,0x97eb,0x97ec,0x674c,0x6753,0x675e,0x6748,0x6769,
+0x67a5,0x6787,0x676a,0x6773,0x6798,0x67a7,0x6775,0x67a8,
+0x679e,0x67ad,0x678b,0x6777,0x677c,0x67f0,0x6809,0x67d8,
+0x680a,0x67e9,0x67b0,0x680c,0x67d9,0x67b5,0x67da,0x67b3,
+0x67dd,0x6800,0x67c3,0x67b8,0x67e2,0x680e,0x67c1,0x67fd,
+0x6832,0x6833,0x6860,0x6861,0x684e,0x6862,0x6844,0x6864,
+0x6883,0x681d,0x6855,0x6866,0x6841,0x6867,0x6840,0x683e,
+0x684a,0x6849,0x6829,0x68b5,0x688f,0x6874,0x6877,0x6893,
+0x686b,0x68c2,0x696e,0x68fc,0x691f,0x6920,0x68f9, NONE,
+ NONE, NONE, NONE, NONE, NONE,0x6924,0x68f0,0x690b,
+0x6901,0x6957,0x68e3,0x6910,0x6971,0x6939,0x6960,0x6942,
+0x695d,0x6984,0x696b,0x6980,0x6998,0x6978,0x6934,0x69cc,
+0x6987,0x6988,0x69ce,0x6989,0x6966,0x6963,0x6979,0x699b,
+0x69a7,0x69bb,0x69ab,0x69ad,0x69d4,0x69b1,0x69c1,0x69ca,
+0x69df,0x6995,0x69e0,0x698d,0x69ff,0x6a2f,0x69ed,0x6a17,
+0x6a18,0x6a65,0x69f2,0x6a44,0x6a3e,0x6aa0,0x6a50,0x6a5b,
+0x6a35,0x6a8e,0x6a79,0x6a3d,0x6a28,0x6a58,0x6a7c,0x6a91,
+0x6a90,0x6aa9,0x6a97,0x6aab,0x7337,0x7352,0x6b81,0x6b82,
+0x6b87,0x6b84,0x6b92,0x6b93,0x6b8d,0x6b9a,0x6b9b,0x6ba1,
+0x6baa,0x8f6b,0x8f6d,0x8f71,0x8f72,0x8f73,0x8f75,0x8f76,
+0x8f78,0x8f77,0x8f79,0x8f7a,0x8f7c,0x8f7e,0x8f81,0x8f82,
+0x8f84,0x8f87,0x8f8b, NONE, NONE, NONE, NONE, NONE,
+ NONE,0x8f8d,0x8f8e,0x8f8f,0x8f98,0x8f9a,0x8ece,0x620b,
+0x6217,0x621b,0x621f,0x6222,0x6221,0x6225,0x6224,0x622c,
+0x81e7,0x74ef,0x74f4,0x74ff,0x750f,0x7511,0x7513,0x6534,
+0x65ee,0x65ef,0x65f0,0x660a,0x6619,0x6772,0x6603,0x6615,
+0x6600,0x7085,0x66f7,0x661d,0x6634,0x6631,0x6636,0x6635,
+0x8006,0x665f,0x6654,0x6641,0x664f,0x6656,0x6661,0x6657,
+0x6677,0x6684,0x668c,0x66a7,0x669d,0x66be,0x66db,0x66dc,
+0x66e6,0x66e9,0x8d32,0x8d33,0x8d36,0x8d3b,0x8d3d,0x8d40,
+0x8d45,0x8d46,0x8d48,0x8d49,0x8d47,0x8d4d,0x8d55,0x8d59,
+0x89c7,0x89ca,0x89cb,0x89cc,0x89ce,0x89cf,0x89d0,0x89d1,
+0x726e,0x729f,0x725d,0x7266,0x726f,0x727e,0x727f,0x7284,
+0x728b,0x728d,0x728f,0x7292,0x6308,0x6332,0x63b0, NONE,
+ NONE, NONE, NONE, NONE, NONE,0x643f,0x64d8,0x8004,
+0x6bea,0x6bf3,0x6bfd,0x6bf5,0x6bf9,0x6c05,0x6c07,0x6c06,
+0x6c0d,0x6c15,0x6c18,0x6c19,0x6c1a,0x6c21,0x6c29,0x6c24,
+0x6c2a,0x6c32,0x6535,0x6555,0x656b,0x724d,0x7252,0x7256,
+0x7230,0x8662,0x5216,0x809f,0x809c,0x8093,0x80bc,0x670a,
+0x80bd,0x80b1,0x80ab,0x80ad,0x80b4,0x80b7,0x80e7,0x80e8,
+0x80e9,0x80ea,0x80db,0x80c2,0x80c4,0x80d9,0x80cd,0x80d7,
+0x6710,0x80dd,0x80eb,0x80f1,0x80f4,0x80ed,0x810d,0x810e,
+0x80f2,0x80fc,0x6715,0x8112,0x8c5a,0x8136,0x811e,0x812c,
+0x8118,0x8132,0x8148,0x814c,0x8153,0x8174,0x8159,0x815a,
+0x8171,0x8160,0x8169,0x817c,0x817d,0x816d,0x8167,0x584d,
+0x5ab5,0x8188,0x8182,0x8191,0x6ed5,0x81a3,0x81aa,0x81cc,
+0x6726,0x81ca,0x81bb, NONE, NONE, NONE, NONE, NONE,
+ NONE,0x81c1,0x81a6,0x6b24,0x6b37,0x6b39,0x6b43,0x6b46,
+0x6b59,0x98d1,0x98d2,0x98d3,0x98d5,0x98d9,0x98da,0x6bb3,
+0x5f40,0x6bc2,0x89f3,0x6590,0x9f51,0x6593,0x65bc,0x65c6,
+0x65c4,0x65c3,0x65cc,0x65ce,0x65d2,0x65d6,0x7080,0x709c,
+0x7096,0x709d,0x70bb,0x70c0,0x70b7,0x70ab,0x70b1,0x70e8,
+0x70ca,0x7110,0x7113,0x7116,0x712f,0x7131,0x7173,0x715c,
+0x7168,0x7145,0x7172,0x714a,0x7178,0x717a,0x7198,0x71b3,
+0x71b5,0x71a8,0x71a0,0x71e0,0x71d4,0x71e7,0x71f9,0x721d,
+0x7228,0x706c,0x7118,0x7166,0x71b9,0x623e,0x623d,0x6243,
+0x6248,0x6249,0x793b,0x7940,0x7946,0x7949,0x795b,0x795c,
+0x7953,0x795a,0x7962,0x7957,0x7960,0x796f,0x7967,0x797a,
+0x7985,0x798a,0x799a,0x79a7,0x79b3,0x5fd1,0x5fd0, NONE,
+ NONE, NONE, NONE, NONE, NONE,0x603c,0x605d,0x605a,
+0x6067,0x6041,0x6059,0x6063,0x60ab,0x6106,0x610d,0x615d,
+0x61a9,0x619d,0x61cb,0x61d1,0x6206,0x8080,0x807f,0x6c93,
+0x6cf6,0x6dfc,0x77f6,0x77f8,0x7800,0x7809,0x7817,0x7818,
+0x7811,0x65ab,0x782d,0x781c,0x781d,0x7839,0x783a,0x783b,
+0x781f,0x783c,0x7825,0x782c,0x7823,0x7829,0x784e,0x786d,
+0x7856,0x7857,0x7826,0x7850,0x7847,0x784c,0x786a,0x789b,
+0x7893,0x789a,0x7887,0x789c,0x78a1,0x78a3,0x78b2,0x78b9,
+0x78a5,0x78d4,0x78d9,0x78c9,0x78ec,0x78f2,0x7905,0x78f4,
+0x7913,0x7924,0x791e,0x7934,0x9f9b,0x9ef9,0x9efb,0x9efc,
+0x76f1,0x7704,0x770d,0x76f9,0x7707,0x7708,0x771a,0x7722,
+0x7719,0x772d,0x7726,0x7735,0x7738,0x7750,0x7751,0x7747,
+0x7743,0x775a,0x7768, NONE, NONE, NONE, NONE, NONE,
+ NONE,0x7762,0x7765,0x777f,0x778d,0x777d,0x7780,0x778c,
+0x7791,0x779f,0x77a0,0x77b0,0x77b5,0x77bd,0x753a,0x7540,
+0x754e,0x754b,0x7548,0x755b,0x7572,0x7579,0x7583,0x7f58,
+0x7f61,0x7f5f,0x8a48,0x7f68,0x7f74,0x7f71,0x7f79,0x7f81,
+0x7f7e,0x76cd,0x76e5,0x8832,0x9485,0x9486,0x9487,0x948b,
+0x948a,0x948c,0x948d,0x948f,0x9490,0x9494,0x9497,0x9495,
+0x949a,0x949b,0x949c,0x94a3,0x94a4,0x94ab,0x94aa,0x94ad,
+0x94ac,0x94af,0x94b0,0x94b2,0x94b4,0x94b6,0x94b7,0x94b8,
+0x94b9,0x94ba,0x94bc,0x94bd,0x94bf,0x94c4,0x94c8,0x94c9,
+0x94ca,0x94cb,0x94cc,0x94cd,0x94ce,0x94d0,0x94d1,0x94d2,
+0x94d5,0x94d6,0x94d7,0x94d9,0x94d8,0x94db,0x94de,0x94df,
+0x94e0,0x94e2,0x94e4,0x94e5,0x94e7,0x94e8,0x94ea, NONE,
+ NONE, NONE, NONE, NONE, NONE,0x94e9,0x94eb,0x94ee,
+0x94ef,0x94f3,0x94f4,0x94f5,0x94f7,0x94f9,0x94fc,0x94fd,
+0x94ff,0x9503,0x9502,0x9506,0x9507,0x9509,0x950a,0x950d,
+0x950e,0x950f,0x9512,0x9513,0x9514,0x9515,0x9516,0x9518,
+0x951b,0x951d,0x951e,0x951f,0x9522,0x952a,0x952b,0x9529,
+0x952c,0x9531,0x9532,0x9534,0x9536,0x9537,0x9538,0x953c,
+0x953e,0x953f,0x9542,0x9535,0x9544,0x9545,0x9546,0x9549,
+0x954c,0x954e,0x954f,0x9552,0x9553,0x9554,0x9556,0x9557,
+0x9558,0x9559,0x955b,0x955e,0x955f,0x955d,0x9561,0x9562,
+0x9564,0x9565,0x9566,0x9567,0x9568,0x9569,0x956a,0x956b,
+0x956c,0x956f,0x9571,0x9572,0x9573,0x953a,0x77e7,0x77ec,
+0x96c9,0x79d5,0x79ed,0x79e3,0x79eb,0x7a06,0x5d47,0x7a03,
+0x7a02,0x7a1e,0x7a14, NONE, NONE, NONE, NONE, NONE,
+ NONE,0x7a39,0x7a37,0x7a51,0x9ecf,0x99a5,0x7a70,0x7688,
+0x768e,0x7693,0x7699,0x76a4,0x74de,0x74e0,0x752c,0x9e20,
+0x9e22,0x9e28,0x9e29,0x9e2a,0x9e2b,0x9e2c,0x9e32,0x9e31,
+0x9e36,0x9e38,0x9e37,0x9e39,0x9e3a,0x9e3e,0x9e41,0x9e42,
+0x9e44,0x9e46,0x9e47,0x9e48,0x9e49,0x9e4b,0x9e4c,0x9e4e,
+0x9e51,0x9e55,0x9e57,0x9e5a,0x9e5b,0x9e5c,0x9e5e,0x9e63,
+0x9e66,0x9e67,0x9e68,0x9e69,0x9e6a,0x9e6b,0x9e6c,0x9e71,
+0x9e6d,0x9e73,0x7592,0x7594,0x7596,0x75a0,0x759d,0x75ac,
+0x75a3,0x75b3,0x75b4,0x75b8,0x75c4,0x75b1,0x75b0,0x75c3,
+0x75c2,0x75d6,0x75cd,0x75e3,0x75e8,0x75e6,0x75e4,0x75eb,
+0x75e7,0x7603,0x75f1,0x75fc,0x75ff,0x7610,0x7600,0x7605,
+0x760c,0x7617,0x760a,0x7625,0x7618,0x7615,0x7619, NONE,
+ NONE, NONE, NONE, NONE, NONE,0x761b,0x763c,0x7622,
+0x7620,0x7640,0x762d,0x7630,0x763f,0x7635,0x7643,0x763e,
+0x7633,0x764d,0x765e,0x7654,0x765c,0x7656,0x766b,0x766f,
+0x7fca,0x7ae6,0x7a78,0x7a79,0x7a80,0x7a86,0x7a88,0x7a95,
+0x7aa6,0x7aa0,0x7aac,0x7aa8,0x7aad,0x7ab3,0x8864,0x8869,
+0x8872,0x887d,0x887f,0x8882,0x88a2,0x88c6,0x88b7,0x88bc,
+0x88c9,0x88e2,0x88ce,0x88e3,0x88e5,0x88f1,0x891a,0x88fc,
+0x88e8,0x88fe,0x88f0,0x8921,0x8919,0x8913,0x891b,0x890a,
+0x8934,0x892b,0x8936,0x8941,0x8966,0x897b,0x758b,0x80e5,
+0x76b2,0x76b4,0x77dc,0x8012,0x8014,0x8016,0x801c,0x8020,
+0x8022,0x8025,0x8026,0x8027,0x8029,0x8028,0x8031,0x800b,
+0x8035,0x8043,0x8046,0x804d,0x8052,0x8069,0x8071,0x8983,
+0x9878,0x9880,0x9883, NONE, NONE, NONE, NONE, NONE,
+ NONE,0x9889,0x988c,0x988d,0x988f,0x9894,0x989a,0x989b,
+0x989e,0x989f,0x98a1,0x98a2,0x98a5,0x98a6,0x864d,0x8654,
+0x866c,0x866e,0x867f,0x867a,0x867c,0x867b,0x86a8,0x868d,
+0x868b,0x86ac,0x869d,0x86a7,0x86a3,0x86aa,0x8693,0x86a9,
+0x86b6,0x86c4,0x86b5,0x86ce,0x86b0,0x86ba,0x86b1,0x86af,
+0x86c9,0x86cf,0x86b4,0x86e9,0x86f1,0x86f2,0x86ed,0x86f3,
+0x86d0,0x8713,0x86de,0x86f4,0x86df,0x86d8,0x86d1,0x8703,
+0x8707,0x86f8,0x8708,0x870a,0x870d,0x8709,0x8723,0x873b,
+0x871e,0x8725,0x872e,0x871a,0x873e,0x8748,0x8734,0x8731,
+0x8729,0x8737,0x873f,0x8782,0x8722,0x877d,0x877e,0x877b,
+0x8760,0x8770,0x874c,0x876e,0x878b,0x8753,0x8763,0x877c,
+0x8764,0x8759,0x8765,0x8793,0x87af,0x87a8,0x87d2, NONE,
+ NONE, NONE, NONE, NONE, NONE,0x87c6,0x8788,0x8785,
+0x87ad,0x8797,0x8783,0x87ab,0x87e5,0x87ac,0x87b5,0x87b3,
+0x87cb,0x87d3,0x87bd,0x87d1,0x87c0,0x87ca,0x87db,0x87ea,
+0x87e0,0x87ee,0x8816,0x8813,0x87fe,0x880a,0x881b,0x8821,
+0x8839,0x883c,0x7f36,0x7f42,0x7f44,0x7f45,0x8210,0x7afa,
+0x7afd,0x7b08,0x7b03,0x7b04,0x7b15,0x7b0a,0x7b2b,0x7b0f,
+0x7b47,0x7b38,0x7b2a,0x7b19,0x7b2e,0x7b31,0x7b20,0x7b25,
+0x7b24,0x7b33,0x7b3e,0x7b1e,0x7b58,0x7b5a,0x7b45,0x7b75,
+0x7b4c,0x7b5d,0x7b60,0x7b6e,0x7b7b,0x7b62,0x7b72,0x7b71,
+0x7b90,0x7ba6,0x7ba7,0x7bb8,0x7bac,0x7b9d,0x7ba8,0x7b85,
+0x7baa,0x7b9c,0x7ba2,0x7bab,0x7bb4,0x7bd1,0x7bc1,0x7bcc,
+0x7bdd,0x7bda,0x7be5,0x7be6,0x7bea,0x7c0c,0x7bfe,0x7bfc,
+0x7c0f,0x7c16,0x7c0b, NONE, NONE, NONE, NONE, NONE,
+ NONE,0x7c1f,0x7c2a,0x7c26,0x7c38,0x7c41,0x7c40,0x81fe,
+0x8201,0x8202,0x8204,0x81ec,0x8844,0x8221,0x8222,0x8223,
+0x822d,0x822f,0x8228,0x822b,0x8238,0x823b,0x8233,0x8234,
+0x823e,0x8244,0x8249,0x824b,0x824f,0x825a,0x825f,0x8268,
+0x887e,0x8885,0x8888,0x88d8,0x88df,0x895e,0x7f9d,0x7f9f,
+0x7fa7,0x7faf,0x7fb0,0x7fb2,0x7c7c,0x6549,0x7c91,0x7c9d,
+0x7c9c,0x7c9e,0x7ca2,0x7cb2,0x7cbc,0x7cbd,0x7cc1,0x7cc7,
+0x7ccc,0x7ccd,0x7cc8,0x7cc5,0x7cd7,0x7ce8,0x826e,0x66a8,
+0x7fbf,0x7fce,0x7fd5,0x7fe5,0x7fe1,0x7fe6,0x7fe9,0x7fee,
+0x7ff3,0x7cf8,0x7d77,0x7da6,0x7dae,0x7e47,0x7e9b,0x9eb8,
+0x9eb4,0x8d73,0x8d84,0x8d94,0x8d91,0x8db1,0x8d67,0x8d6d,
+0x8c47,0x8c49,0x914a,0x9150,0x914e,0x914f,0x9164, NONE,
+ NONE, NONE, NONE, NONE, NONE,0x9162,0x9161,0x9170,
+0x9169,0x916f,0x917d,0x917e,0x9172,0x9174,0x9179,0x918c,
+0x9185,0x9190,0x918d,0x9191,0x91a2,0x91a3,0x91aa,0x91ad,
+0x91ae,0x91af,0x91b5,0x91b4,0x91ba,0x8c55,0x9e7e,0x8db8,
+0x8deb,0x8e05,0x8e59,0x8e69,0x8db5,0x8dbf,0x8dbc,0x8dba,
+0x8dc4,0x8dd6,0x8dd7,0x8dda,0x8dde,0x8dce,0x8dcf,0x8ddb,
+0x8dc6,0x8dec,0x8df7,0x8df8,0x8de3,0x8df9,0x8dfb,0x8de4,
+0x8e09,0x8dfd,0x8e14,0x8e1d,0x8e1f,0x8e2c,0x8e2e,0x8e23,
+0x8e2f,0x8e3a,0x8e40,0x8e39,0x8e35,0x8e3d,0x8e31,0x8e49,
+0x8e41,0x8e42,0x8e51,0x8e52,0x8e4a,0x8e70,0x8e76,0x8e7c,
+0x8e6f,0x8e74,0x8e85,0x8e8f,0x8e94,0x8e90,0x8e9c,0x8e9e,
+0x8c78,0x8c82,0x8c8a,0x8c85,0x8c98,0x8c94,0x659b,0x89d6,
+0x89de,0x89da,0x89dc, NONE, NONE, NONE, NONE, NONE,
+ NONE,0x89e5,0x89eb,0x89ef,0x8a3e,0x8b26,0x9753,0x96e9,
+0x96f3,0x96ef,0x9706,0x9701,0x9708,0x970f,0x970e,0x972a,
+0x972d,0x9730,0x973e,0x9f80,0x9f83,0x9f85,0x9f86,0x9f87,
+0x9f88,0x9f89,0x9f8a,0x9f8c,0x9efe,0x9f0b,0x9f0d,0x96b9,
+0x96bc,0x96bd,0x96ce,0x96d2,0x77bf,0x96e0,0x928e,0x92ae,
+0x92c8,0x933e,0x936a,0x93ca,0x938f,0x943e,0x946b,0x9c7f,
+0x9c82,0x9c85,0x9c86,0x9c87,0x9c88,0x7a23,0x9c8b,0x9c8e,
+0x9c90,0x9c91,0x9c92,0x9c94,0x9c95,0x9c9a,0x9c9b,0x9c9e,
+0x9c9f,0x9ca0,0x9ca1,0x9ca2,0x9ca3,0x9ca5,0x9ca6,0x9ca7,
+0x9ca8,0x9ca9,0x9cab,0x9cad,0x9cae,0x9cb0,0x9cb1,0x9cb2,
+0x9cb3,0x9cb4,0x9cb5,0x9cb6,0x9cb7,0x9cba,0x9cbb,0x9cbc,
+0x9cbd,0x9cc4,0x9cc5,0x9cc6,0x9cc7,0x9cca,0x9ccb, NONE,
+ NONE, NONE, NONE, NONE, NONE,0x9ccc,0x9ccd,0x9cce,
+0x9ccf,0x9cd0,0x9cd3,0x9cd4,0x9cd5,0x9cd7,0x9cd8,0x9cd9,
+0x9cdc,0x9cdd,0x9cdf,0x9ce2,0x977c,0x9785,0x9791,0x9792,
+0x9794,0x97af,0x97ab,0x97a3,0x97b2,0x97b4,0x9ab1,0x9ab0,
+0x9ab7,0x9e58,0x9ab6,0x9aba,0x9abc,0x9ac1,0x9ac0,0x9ac5,
+0x9ac2,0x9acb,0x9acc,0x9ad1,0x9b45,0x9b43,0x9b47,0x9b49,
+0x9b48,0x9b4d,0x9b51,0x98e8,0x990d,0x992e,0x9955,0x9954,
+0x9adf,0x9ae1,0x9ae6,0x9aef,0x9aeb,0x9afb,0x9aed,0x9af9,
+0x9b08,0x9b0f,0x9b13,0x9b1f,0x9b23,0x9ebd,0x9ebe,0x7e3b,
+0x9e82,0x9e87,0x9e88,0x9e8b,0x9e92,0x93d6,0x9e9d,0x9e9f,
+0x9edb,0x9edc,0x9edd,0x9ee0,0x9edf,0x9ee2,0x9ee9,0x9ee7,
+0x9ee5,0x9eea,0x9eef,0x9f22,0x9f2c,0x9f2f,0x9f39,0x9f37,
+0x9f3d,0x9f3e,0x9f44,
+};
diff --git a/src/cmd/dict/gefix b/src/cmd/dict/gefix
new file mode 100755
index 00000000..74df8de0
--- /dev/null
+++ b/src/cmd/dict/gefix
@@ -0,0 +1,23 @@
+#!/bin/rc
+
+sed '
+ s/[ ]+$//
+ / /!d
+ s/\\N''349''//g
+ s/''//g
+ s/ -/ /
+ s/-$//
+ /\([^,) ]+(\)|$)/{; h; s///; p; g; s/\(//; s/\)//; }
+ /\(r, s\)$/{; s///; p; s/$/r/; p; s/r$/s/; }
+' $1 |
+sed '
+ /\([^,) ]+(\)|$)/{; h; s///; p; g; s/\(//; s/\)//; }
+ /\(r, s\)$/{; s///; p; s/$/r/; p; s/r$/s/; }
+' |
+sed '/ß/{; p; s/ß/ss/g; }' |
+awk '
+BEGIN { FS = " |, " }
+ { for(i=2; i<=NF; i++)print $i " " $1 }
+' |
+tr A-Z a-z |
+sort -u -t' ' +0f -1 +0 -1 +1n -2
diff --git a/src/cmd/dict/getneeds b/src/cmd/dict/getneeds
new file mode 100755
index 00000000..7f50edff
--- /dev/null
+++ b/src/cmd/dict/getneeds
@@ -0,0 +1,8 @@
+#!/bin/rc
+for (x in spec tag aux status) {
+ grep ' '^$x^' ' $1 > junk1
+ sort +4 -5 +3n -4 junk1 > junk2
+ awk '{if ($5 != prev) print $0; prev = $5}' junk2 > junk3
+ sort -n +2 -3 junk3 > need$x
+ rm junk*
+}
diff --git a/src/cmd/dict/jis208.c b/src/cmd/dict/jis208.c
new file mode 100644
index 00000000..d2086e6a
--- /dev/null
+++ b/src/cmd/dict/jis208.c
@@ -0,0 +1,1059 @@
+#include <u.h>
+#include <libc.h>
+#include "kuten.h"
+
+#define NONE 0xffff
+
+Rune tabjis208[JIS208MAX] = {
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE,0x3000,0x3001,0x3002,
+0xff0c,0xff0e,0x30fb,0xff1a,0xff1b,0xff1f,0xff01,0x309b,
+0x309c,0x00b4,0xff40,0x00a8,0xff3e,0x203e,0xff3f,0x30fd,
+0x30fe,0x309d,0x309e,0x3003,0x4edd,0x3005,0x3006,0x3007,
+0x30fc,0x2015,0x00ad,0xff0f,0xff3c,0xff5e,0x2225,0xff5c,
+0x2026,0x2025,0x2018,0x2019,0x201c,0x201d,0xff08,0xff09,
+0x3014,0x3015,0xff3b,0xff3d,0xff5b,0xff5d,0x3008,0x3009,
+0x300a,0x300b,0x300c,0x300d,0x300e,0x300f,0x3010,0x3011,
+0xff0b,0xff0d,0x00b1,0x00d7,0x00f7,0xff1d,0x2260,0xff1c,
+0xff1e,0x2264,0x2265,0x221e,0x2234,0x2642,0x2640,0x00b0,
+0x2032,0x2033,0x2103,0x00a5,0xff04,0x00a2,0x00a3,0xff05,
+0xff03,0xff06,0xff0a,0xff20,0x00a7,0x2606,0x2605,0x25cb,
+0x25cf,0x25ce,0x25c7, NONE, NONE, NONE, NONE, NONE,
+ NONE,0x25c6,0x25a1,0x25a0,0x25b3,0x25b2,0x25bd,0x25bc,
+0x203b,0x3012,0x2192,0x2190,0x2191,0x2193,0x3013, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE,0x2208,0x220b,0x2286,0x2287,0x2282,0x2283,
+0x222a,0x2229, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE,0x2227,0x2228,0x00ac,0x21d2,0x21d4,0x2200,
+0x2203, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE,0x2220,0x22a5,0x2040,0x2202,
+0x2207,0x2261,0x2252,0x226a,0x226b,0x221a,0x224c,0x221d,
+0x2235,0x222b,0x222c, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE,0x212b,0x2030,0x266f,0x266d,0x266a,0x2020,
+0x2021,0x00b6, NONE, NONE, NONE, NONE,0x20dd, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE,0xff10,0xff11,0xff12,0xff13,
+0xff14,0xff15,0xff16,0xff17,0xff18,0xff19, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE,0xff21,0xff22,0xff23,
+0xff24,0xff25,0xff26,0xff27,0xff28,0xff29,0xff2a,0xff2b,
+0xff2c,0xff2d,0xff2e,0xff2f,0xff30,0xff31,0xff32,0xff33,
+0xff34,0xff35,0xff36,0xff37,0xff38,0xff39,0xff3a, NONE,
+ NONE, NONE, NONE, NONE, NONE,0xff41,0xff42,0xff43,
+0xff44,0xff45,0xff46,0xff47,0xff48,0xff49,0xff4a,0xff4b,
+0xff4c,0xff4d,0xff4e,0xff4f,0xff50,0xff51,0xff52,0xff53,
+0xff54,0xff55,0xff56,0xff57,0xff58,0xff59,0xff5a, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE,0x3041,0x3042,0x3043,0x3044,0x3045,0x3046,0x3047,
+0x3048,0x3049,0x304a,0x304b,0x304c,0x304d,0x304e,0x304f,
+0x3050,0x3051,0x3052,0x3053,0x3054,0x3055,0x3056,0x3057,
+0x3058,0x3059,0x305a,0x305b,0x305c,0x305d,0x305e,0x305f,
+0x3060,0x3061,0x3062,0x3063,0x3064,0x3065,0x3066,0x3067,
+0x3068,0x3069,0x306a,0x306b,0x306c,0x306d,0x306e,0x306f,
+0x3070,0x3071,0x3072,0x3073,0x3074,0x3075,0x3076,0x3077,
+0x3078,0x3079,0x307a,0x307b,0x307c,0x307d,0x307e,0x307f,
+0x3080,0x3081,0x3082,0x3083,0x3084,0x3085,0x3086,0x3087,
+0x3088,0x3089,0x308a,0x308b,0x308c,0x308d,0x308e,0x308f,
+0x3090,0x3091,0x3092,0x3093, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE,0x30a1,0x30a2,0x30a3,
+0x30a4,0x30a5,0x30a6,0x30a7,0x30a8,0x30a9,0x30aa,0x30ab,
+0x30ac,0x30ad,0x30ae,0x30af,0x30b0,0x30b1,0x30b2,0x30b3,
+0x30b4,0x30b5,0x30b6,0x30b7,0x30b8,0x30b9,0x30ba,0x30bb,
+0x30bc,0x30bd,0x30be,0x30bf,0x30c0,0x30c1,0x30c2,0x30c3,
+0x30c4,0x30c5,0x30c6,0x30c7,0x30c8,0x30c9,0x30ca,0x30cb,
+0x30cc,0x30cd,0x30ce,0x30cf,0x30d0,0x30d1,0x30d2,0x30d3,
+0x30d4,0x30d5,0x30d6,0x30d7,0x30d8,0x30d9,0x30da,0x30db,
+0x30dc,0x30dd,0x30de,0x30df,0x30e0,0x30e1,0x30e2,0x30e3,
+0x30e4,0x30e5,0x30e6,0x30e7,0x30e8,0x30e9,0x30ea,0x30eb,
+0x30ec,0x30ed,0x30ee,0x30ef,0x30f0,0x30f1,0x30f2,0x30f3,
+0x30f4,0x30f5,0x30f6, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE,0x0391,0x0392,0x0393,0x0394,0x0395,0x0396,0x0397,
+0x0398,0x0399,0x039a,0x039b,0x039c,0x039d,0x039e,0x039f,
+0x03a0,0x03a1,0x03a3,0x03a4,0x03a5,0x03a6,0x03a7,0x03a8,
+0x03a9, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE,0x03b1,0x03b2,0x03b3,0x03b4,0x03b5,0x03b6,0x03b7,
+0x03b8,0x03b9,0x03ba,0x03bb,0x03bc,0x03bd,0x03be,0x03bf,
+0x03c0,0x03c1,0x03c3,0x03c4,0x03c5,0x03c6,0x03c7,0x03c8,
+0x03c9, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE,0x0410,0x0411,0x0412,
+0x0413,0x0414,0x0415,0x0401,0x0416,0x0417,0x0418,0x0419,
+0x041a,0x041b,0x041c,0x041d,0x041e,0x041f,0x0420,0x0421,
+0x0422,0x0423,0x0424,0x0425,0x0426,0x0427,0x0428,0x0429,
+0x042a,0x042b,0x042c,0x042d,0x042e,0x042f, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE,0x0430,0x0431,0x0432,
+0x0433,0x0434,0x0435,0x0451,0x0436,0x0437,0x0438,0x0439,
+0x043a,0x043b,0x043c,0x043d,0x043e,0x043f,0x0440,0x0441,
+0x0442,0x0443,0x0444,0x0445,0x0446,0x0447,0x0448,0x0449,
+0x044a,0x044b,0x044c,0x044d,0x044e,0x044f, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE,0x2500,0x2502,0x250c,0x2510,0x2518,0x2514,0x251c,
+0x252c,0x2524,0x2534,0x253c,0x2501,0x2503,0x250f,0x2513,
+0x251b,0x2517,0x2523,0x2533,0x252b,0x253b,0x254b,0x2520,
+0x252f,0x2528,0x2537,0x253f,0x251d,0x2530,0x2525,0x2538,
+0x2542, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE,0x4e9c,0x5516,0x5a03,0x963f,0x54c0,0x611b,0x6328,
+0x59f6,0x9022,0x8475,0x831c,0x7a50,0x60aa,0x63e1,0x6e25,
+0x65ed,0x8466,0x82a6,0x9bf5,0x6893,0x5727,0x65a1,0x6271,
+0x5b9b,0x59d0,0x867b,0x98f4,0x7d62,0x7dbe,0x9b8e,0x6216,
+0x7c9f,0x88b7,0x5b89,0x5eb5,0x6309,0x6697,0x6848,0x95c7,
+0x978d,0x674f,0x4ee5,0x4f0a,0x4f4d,0x4f9d,0x5049,0x56f2,
+0x5937,0x59d4,0x5a01,0x5c09,0x60df,0x610f,0x6170,0x6613,
+0x6905,0x70ba,0x754f,0x7570,0x79fb,0x7dad,0x7def,0x80c3,
+0x840e,0x8863,0x8b02,0x9055,0x907a,0x533b,0x4e95,0x4ea5,
+0x57df,0x80b2,0x90c1,0x78ef,0x4e00,0x58f1,0x6ea2,0x9038,
+0x7a32,0x8328,0x828b,0x9c2f,0x5141,0x5370,0x54bd,0x54e1,
+0x56e0,0x59fb,0x5f15,0x98f2,0x6deb,0x80e4,0x852d, NONE,
+ NONE, NONE, NONE, NONE, NONE,0x9662,0x9670,0x96a0,
+0x97fb,0x540b,0x53f3,0x5b87,0x70cf,0x7fbd,0x8fc2,0x96e8,
+0x536f,0x9d5c,0x7aba,0x4e11,0x7893,0x81fc,0x6e26,0x5618,
+0x5504,0x6b1d,0x851a,0x9c3b,0x59e5,0x53a9,0x6d66,0x74dc,
+0x958f,0x5642,0x4e91,0x904b,0x96f2,0x834f,0x990c,0x53e1,
+0x55b6,0x5b30,0x5f71,0x6620,0x66f3,0x6804,0x6c38,0x6cf3,
+0x6d29,0x745b,0x76c8,0x7a4e,0x9834,0x82f1,0x885b,0x8a60,
+0x92ed,0x6db2,0x75ab,0x76ca,0x99c5,0x60a6,0x8b01,0x8d8a,
+0x95b2,0x698e,0x53ad,0x5186,0x5712,0x5830,0x5944,0x5bb4,
+0x5ef6,0x6028,0x63a9,0x63f4,0x6cbf,0x6f14,0x708e,0x7114,
+0x7159,0x71d5,0x733f,0x7e01,0x8276,0x82d1,0x8597,0x9060,
+0x925b,0x9d1b,0x5869,0x65bc,0x6c5a,0x7525,0x51f9,0x592e,
+0x5965,0x5f80,0x5fdc, NONE, NONE, NONE, NONE, NONE,
+ NONE,0x62bc,0x65fa,0x6a2a,0x6b27,0x6bb4,0x738b,0x7fc1,
+0x8956,0x9d2c,0x9d0e,0x9ec4,0x5ca1,0x6c96,0x837b,0x5104,
+0x5c4b,0x61b6,0x81c6,0x6876,0x7261,0x4e59,0x4ffa,0x5378,
+0x6069,0x6e29,0x7a4f,0x97f3,0x4e0b,0x5316,0x4eee,0x4f55,
+0x4f3d,0x4fa1,0x4f73,0x52a0,0x53ef,0x5609,0x590f,0x5ac1,
+0x5bb6,0x5be1,0x79d1,0x6687,0x679c,0x67b6,0x6b4c,0x6cb3,
+0x706b,0x73c2,0x798d,0x79be,0x7a3c,0x7b87,0x82b1,0x82db,
+0x8304,0x8377,0x83ef,0x83d3,0x8766,0x8ab2,0x5629,0x8ca8,
+0x8fe6,0x904e,0x971e,0x868a,0x4fc4,0x5ce8,0x6211,0x7259,
+0x753b,0x81e5,0x82bd,0x86fe,0x8cc0,0x96c5,0x9913,0x99d5,
+0x4ecb,0x4f1a,0x89e3,0x56de,0x584a,0x58ca,0x5efb,0x5feb,
+0x602a,0x6094,0x6062,0x61d0,0x6212,0x62d0,0x6539, NONE,
+ NONE, NONE, NONE, NONE, NONE,0x9b41,0x6666,0x68b0,
+0x6d77,0x7070,0x754c,0x7686,0x7d75,0x82a5,0x87f9,0x958b,
+0x968e,0x8c9d,0x51f1,0x52be,0x5916,0x54b3,0x5bb3,0x5d16,
+0x6168,0x6982,0x6daf,0x788d,0x84cb,0x8857,0x8a72,0x93a7,
+0x9ab8,0x6d6c,0x99a8,0x86d9,0x57a3,0x67ff,0x86ce,0x920e,
+0x5283,0x5687,0x5404,0x5ed3,0x62e1,0x64b9,0x683c,0x6838,
+0x6bbb,0x7372,0x78ba,0x7a6b,0x899a,0x89d2,0x8d6b,0x8f03,
+0x90ed,0x95a3,0x9694,0x9769,0x5b66,0x5cb3,0x697d,0x984d,
+0x984e,0x639b,0x7b20,0x6a2b,0x6a7f,0x68b6,0x9c0d,0x6f5f,
+0x5272,0x559d,0x6070,0x62ec,0x6d3b,0x6e07,0x6ed1,0x845b,
+0x8910,0x8f44,0x4e14,0x9c39,0x53f6,0x691b,0x6a3a,0x9784,
+0x682a,0x515c,0x7ac3,0x84b2,0x91dc,0x938c,0x565b,0x9d28,
+0x6822,0x8305,0x8431, NONE, NONE, NONE, NONE, NONE,
+ NONE,0x7ca5,0x5208,0x82c5,0x74e6,0x4e7e,0x4f83,0x51a0,
+0x5bd2,0x520a,0x52d8,0x52e7,0x5dfb,0x559a,0x582a,0x59e6,
+0x5b8c,0x5b98,0x5bdb,0x5e72,0x5e79,0x60a3,0x611f,0x6163,
+0x61be,0x63db,0x6562,0x67d1,0x6853,0x68fa,0x6b3e,0x6b53,
+0x6c57,0x6f22,0x6f97,0x6f45,0x74b0,0x7518,0x76e3,0x770b,
+0x7aff,0x7ba1,0x7c21,0x7de9,0x7f36,0x7ff0,0x809d,0x8266,
+0x839e,0x89b3,0x8acc,0x8cab,0x9084,0x9451,0x9593,0x9591,
+0x95a2,0x9665,0x97d3,0x9928,0x8218,0x4e38,0x542b,0x5cb8,
+0x5dcc,0x73a9,0x764c,0x773c,0x5ca9,0x7feb,0x8d0b,0x96c1,
+0x9811,0x9854,0x9858,0x4f01,0x4f0e,0x5371,0x559c,0x5668,
+0x57fa,0x5947,0x5b09,0x5bc4,0x5c90,0x5e0c,0x5e7e,0x5fcc,
+0x63ee,0x673a,0x65d7,0x65e2,0x671f,0x68cb,0x68c4, NONE,
+ NONE, NONE, NONE, NONE, NONE,0x6a5f,0x5e30,0x6bc5,
+0x6c17,0x6c7d,0x757f,0x7948,0x5b63,0x7a00,0x7d00,0x5fbd,
+0x898f,0x8a18,0x8cb4,0x8d77,0x8ecc,0x8f1d,0x98e2,0x9a0e,
+0x9b3c,0x4e80,0x507d,0x5100,0x5993,0x5b9c,0x622f,0x6280,
+0x64ec,0x6b3a,0x72a0,0x7591,0x7947,0x7fa9,0x87fb,0x8abc,
+0x8b70,0x63ac,0x83ca,0x97a0,0x5409,0x5403,0x55ab,0x6854,
+0x6a58,0x8a70,0x7827,0x6775,0x9ecd,0x5374,0x5ba2,0x811a,
+0x8650,0x9006,0x4e18,0x4e45,0x4ec7,0x4f11,0x53ca,0x5438,
+0x5bae,0x5f13,0x6025,0x6551,0x673d,0x6c42,0x6c72,0x6ce3,
+0x7078,0x7403,0x7a76,0x7aae,0x7b08,0x7d1a,0x7cfe,0x7d66,
+0x65e7,0x725b,0x53bb,0x5c45,0x5de8,0x62d2,0x62e0,0x6319,
+0x6e20,0x865a,0x8a31,0x8ddd,0x92f8,0x6f01,0x79a6,0x9b5a,
+0x4ea8,0x4eab,0x4eac, NONE, NONE, NONE, NONE, NONE,
+ NONE,0x4f9b,0x4fa0,0x50d1,0x5147,0x7af6,0x5171,0x51f6,
+0x5354,0x5321,0x537f,0x53eb,0x55ac,0x5883,0x5ce1,0x5f37,
+0x5f4a,0x602f,0x6050,0x606d,0x631f,0x6559,0x6a4b,0x6cc1,
+0x72c2,0x72ed,0x77ef,0x80f8,0x8105,0x8208,0x854e,0x90f7,
+0x93e1,0x97ff,0x9957,0x9a5a,0x4ef0,0x51dd,0x5c2d,0x6681,
+0x696d,0x5c40,0x66f2,0x6975,0x7389,0x6850,0x7c81,0x50c5,
+0x52e4,0x5747,0x5dfe,0x9326,0x65a4,0x6b23,0x6b3d,0x7434,
+0x7981,0x79bd,0x7b4b,0x7dca,0x82b9,0x83cc,0x887f,0x895f,
+0x8b39,0x8fd1,0x91d1,0x541f,0x9280,0x4e5d,0x5036,0x53e5,
+0x533a,0x72d7,0x7396,0x77e9,0x82e6,0x8eaf,0x99c6,0x99c8,
+0x99d2,0x5177,0x611a,0x865e,0x55b0,0x7a7a,0x5076,0x5bd3,
+0x9047,0x9685,0x4e32,0x6adb,0x91e7,0x5c51,0x5c48, NONE,
+ NONE, NONE, NONE, NONE, NONE,0x6398,0x7a9f,0x6c93,
+0x9774,0x8f61,0x7aaa,0x718a,0x9688,0x7c82,0x6817,0x7e70,
+0x6851,0x936c,0x52f2,0x541b,0x85ab,0x8a13,0x7fa4,0x8ecd,
+0x90e1,0x5366,0x8888,0x7941,0x4fc2,0x50be,0x5211,0x5144,
+0x5553,0x572d,0x73ea,0x578b,0x5951,0x5f62,0x5f84,0x6075,
+0x6176,0x6167,0x61a9,0x63b2,0x643a,0x656c,0x666f,0x6842,
+0x6e13,0x7566,0x7a3d,0x7cfb,0x7d4c,0x7d99,0x7e4b,0x7f6b,
+0x830e,0x834a,0x86cd,0x8a08,0x8a63,0x8b66,0x8efd,0x981a,
+0x9d8f,0x82b8,0x8fce,0x9be8,0x5287,0x621f,0x6483,0x6fc0,
+0x9699,0x6841,0x5091,0x6b20,0x6c7a,0x6f54,0x7a74,0x7d50,
+0x8840,0x8a23,0x6708,0x4ef6,0x5039,0x5026,0x5065,0x517c,
+0x5238,0x5263,0x55a7,0x570f,0x5805,0x5acc,0x5efa,0x61b2,
+0x61f8,0x62f3,0x6372, NONE, NONE, NONE, NONE, NONE,
+ NONE,0x691c,0x6a29,0x727d,0x72ac,0x732e,0x7814,0x786f,
+0x7d79,0x770c,0x80a9,0x898b,0x8b19,0x8ce2,0x8ed2,0x9063,
+0x9375,0x967a,0x9855,0x9a13,0x9e78,0x5143,0x539f,0x53b3,
+0x5e7b,0x5f26,0x6e1b,0x6e90,0x7384,0x73fe,0x7d43,0x8237,
+0x8a00,0x8afa,0x9650,0x4e4e,0x500b,0x53e4,0x547c,0x56fa,
+0x59d1,0x5b64,0x5df1,0x5eab,0x5f27,0x6238,0x6545,0x67af,
+0x6e56,0x72d0,0x7cca,0x88b4,0x80a1,0x80e1,0x83f0,0x864e,
+0x8a87,0x8de8,0x9237,0x96c7,0x9867,0x9f13,0x4e94,0x4e92,
+0x4f0d,0x5348,0x5449,0x543e,0x5a2f,0x5f8c,0x5fa1,0x609f,
+0x68a7,0x6a8e,0x745a,0x7881,0x8a9e,0x8aa4,0x8b77,0x9190,
+0x4e5e,0x9bc9,0x4ea4,0x4f7c,0x4faf,0x5019,0x5016,0x5149,
+0x516c,0x529f,0x52b9,0x52fe,0x539a,0x53e3,0x5411, NONE,
+ NONE, NONE, NONE, NONE, NONE,0x540e,0x5589,0x5751,
+0x57a2,0x597d,0x5b54,0x5b5d,0x5b8f,0x5de5,0x5de7,0x5df7,
+0x5e78,0x5e83,0x5e9a,0x5eb7,0x5f18,0x6052,0x614c,0x6297,
+0x62d8,0x63a7,0x653b,0x6602,0x6643,0x66f4,0x676d,0x6821,
+0x6897,0x69cb,0x6c5f,0x6d2a,0x6d69,0x6e2f,0x6e9d,0x7532,
+0x7687,0x786c,0x7a3f,0x7ce0,0x7d05,0x7d18,0x7d5e,0x7db1,
+0x8015,0x8003,0x80af,0x80b1,0x8154,0x818f,0x822a,0x8352,
+0x884c,0x8861,0x8b1b,0x8ca2,0x8cfc,0x90ca,0x9175,0x9271,
+0x783f,0x92fc,0x95a4,0x964d,0x9805,0x9999,0x9ad8,0x9d3b,
+0x525b,0x52ab,0x53f7,0x5408,0x58d5,0x62f7,0x6fe0,0x8c6a,
+0x8f5f,0x9eb9,0x514b,0x523b,0x544a,0x56fd,0x7a40,0x9177,
+0x9d60,0x9ed2,0x7344,0x6f09,0x8170,0x7511,0x5ffd,0x60da,
+0x9aa8,0x72db,0x8fbc, NONE, NONE, NONE, NONE, NONE,
+ NONE,0x6b64,0x9803,0x4eca,0x56f0,0x5764,0x58be,0x5a5a,
+0x6068,0x61c7,0x660f,0x6606,0x6839,0x68b1,0x6df7,0x75d5,
+0x7d3a,0x826e,0x9b42,0x4e9b,0x4f50,0x53c9,0x5506,0x5d6f,
+0x5de6,0x5dee,0x67fb,0x6c99,0x7473,0x7802,0x8a50,0x9396,
+0x88df,0x5750,0x5ea7,0x632b,0x50b5,0x50ac,0x518d,0x6700,
+0x54c9,0x585e,0x59bb,0x5bb0,0x5f69,0x624d,0x63a1,0x683d,
+0x6b73,0x6e08,0x707d,0x91c7,0x7280,0x7815,0x7826,0x796d,
+0x658e,0x7d30,0x83dc,0x88c1,0x8f09,0x969b,0x5264,0x5728,
+0x6750,0x7f6a,0x8ca1,0x51b4,0x5742,0x962a,0x583a,0x698a,
+0x80b4,0x54b2,0x5d0e,0x57fc,0x7895,0x9dfa,0x4f5c,0x524a,
+0x548b,0x643e,0x6628,0x6714,0x67f5,0x7a84,0x7b56,0x7d22,
+0x932f,0x685c,0x9bad,0x7b39,0x5319,0x518a,0x5237, NONE,
+ NONE, NONE, NONE, NONE, NONE,0x5bdf,0x62f6,0x64ae,
+0x64e6,0x672d,0x6bba,0x85a9,0x96d1,0x7690,0x9bd6,0x634c,
+0x9306,0x9bab,0x76bf,0x6652,0x4e09,0x5098,0x53c2,0x5c71,
+0x60e8,0x6492,0x6563,0x685f,0x71e6,0x73ca,0x7523,0x7b97,
+0x7e82,0x8695,0x8b83,0x8cdb,0x9178,0x9910,0x65ac,0x66ab,
+0x6b8b,0x4ed5,0x4ed4,0x4f3a,0x4f7f,0x523a,0x53f8,0x53f2,
+0x55e3,0x56db,0x58eb,0x59cb,0x59c9,0x59ff,0x5b50,0x5c4d,
+0x5e02,0x5e2b,0x5fd7,0x601d,0x6307,0x652f,0x5b5c,0x65af,
+0x65bd,0x65e8,0x679d,0x6b62,0x6b7b,0x6c0f,0x7345,0x7949,
+0x79c1,0x7cf8,0x7d19,0x7d2b,0x80a2,0x8102,0x81f3,0x8996,
+0x8a5e,0x8a69,0x8a66,0x8a8c,0x8aee,0x8cc7,0x8cdc,0x96cc,
+0x98fc,0x6b6f,0x4e8b,0x4f3c,0x4f8d,0x5150,0x5b57,0x5bfa,
+0x6148,0x6301,0x6642, NONE, NONE, NONE, NONE, NONE,
+ NONE,0x6b21,0x6ecb,0x6cbb,0x723e,0x74bd,0x75d4,0x78c1,
+0x793a,0x800c,0x8033,0x81ea,0x8494,0x8f9e,0x6c50,0x9e7f,
+0x5f0f,0x8b58,0x9d2b,0x7afa,0x8ef8,0x5b8d,0x96eb,0x4e03,
+0x53f1,0x57f7,0x5931,0x5ac9,0x5ba4,0x6089,0x6e7f,0x6f06,
+0x75be,0x8cea,0x5b9f,0x8500,0x7be0,0x5072,0x67f4,0x829d,
+0x5c61,0x854a,0x7e1e,0x820e,0x5199,0x5c04,0x6368,0x8d66,
+0x659c,0x716e,0x793e,0x7d17,0x8005,0x8b1d,0x8eca,0x906e,
+0x86c7,0x90aa,0x501f,0x52fa,0x5c3a,0x6753,0x707c,0x7235,
+0x914c,0x91c8,0x932b,0x82e5,0x5bc2,0x5f31,0x60f9,0x4e3b,
+0x53d6,0x5b88,0x624b,0x6731,0x6b8a,0x72e9,0x73e0,0x7a2e,
+0x816b,0x8da3,0x9152,0x9996,0x5112,0x53d7,0x546a,0x5bff,
+0x6388,0x6a39,0x7dac,0x9700,0x56da,0x53ce,0x5468, NONE,
+ NONE, NONE, NONE, NONE, NONE,0x5b97,0x5c31,0x5dde,
+0x4fee,0x6101,0x62fe,0x6d32,0x79c0,0x79cb,0x7d42,0x7e4d,
+0x7fd2,0x81ed,0x821f,0x8490,0x8846,0x8972,0x8b90,0x8e74,
+0x8f2f,0x9031,0x914b,0x916c,0x96c6,0x919c,0x4ec0,0x4f4f,
+0x5145,0x5341,0x5f93,0x620e,0x67d4,0x6c41,0x6e0b,0x7363,
+0x7e26,0x91cd,0x9283,0x53d4,0x5919,0x5bbf,0x6dd1,0x795d,
+0x7e2e,0x7c9b,0x587e,0x719f,0x51fa,0x8853,0x8ff0,0x4fca,
+0x5cfb,0x6625,0x77ac,0x7ae3,0x821c,0x99ff,0x51c6,0x5faa,
+0x65ec,0x696f,0x6b89,0x6df3,0x6e96,0x6f64,0x76fe,0x7d14,
+0x5de1,0x9075,0x9187,0x9806,0x51e6,0x521d,0x6240,0x6691,
+0x66d9,0x6e1a,0x5eb6,0x7dd2,0x7f72,0x66f8,0x85af,0x85f7,
+0x8af8,0x52a9,0x53d9,0x5973,0x5e8f,0x5f90,0x6055,0x92e4,
+0x9664,0x50b7,0x511f, NONE, NONE, NONE, NONE, NONE,
+ NONE,0x52dd,0x5320,0x5347,0x53ec,0x54e8,0x5546,0x5531,
+0x5617,0x5968,0x59be,0x5a3c,0x5bb5,0x5c06,0x5c0f,0x5c11,
+0x5c1a,0x5e84,0x5e8a,0x5ee0,0x5f70,0x627f,0x6284,0x62db,
+0x638c,0x6377,0x6607,0x660c,0x662d,0x6676,0x677e,0x68a2,
+0x6a1f,0x6a35,0x6cbc,0x6d88,0x6e09,0x6e58,0x713c,0x7126,
+0x7167,0x75c7,0x7701,0x785d,0x7901,0x7965,0x79f0,0x7ae0,
+0x7b11,0x7ca7,0x7d39,0x8096,0x83d6,0x848b,0x8549,0x885d,
+0x88f3,0x8a1f,0x8a3c,0x8a54,0x8a73,0x8c61,0x8cde,0x91a4,
+0x9266,0x937e,0x9418,0x969c,0x9798,0x4e0a,0x4e08,0x4e1e,
+0x4e57,0x5197,0x5270,0x57ce,0x5834,0x58cc,0x5b22,0x5e38,
+0x60c5,0x64fe,0x6761,0x6756,0x6d44,0x72b6,0x7573,0x7a63,
+0x84b8,0x8b72,0x91b8,0x9320,0x5631,0x57f4,0x98fe, NONE,
+ NONE, NONE, NONE, NONE, NONE,0x62ed,0x690d,0x6b96,
+0x71ed,0x7e54,0x8077,0x8272,0x89e6,0x98df,0x8755,0x8fb1,
+0x5c3b,0x4f38,0x4fe1,0x4fb5,0x5507,0x5a20,0x5bdd,0x5be9,
+0x5fc3,0x614e,0x632f,0x65b0,0x664b,0x68ee,0x699b,0x6d78,
+0x6df1,0x7533,0x75b9,0x771f,0x795e,0x79e6,0x7d33,0x81e3,
+0x82af,0x85aa,0x89aa,0x8a3a,0x8eab,0x8f9b,0x9032,0x91dd,
+0x9707,0x4eba,0x4ec1,0x5203,0x5875,0x58ec,0x5c0b,0x751a,
+0x5c3d,0x814e,0x8a0a,0x8fc5,0x9663,0x976d,0x7b25,0x8acf,
+0x9808,0x9162,0x56f3,0x53a8,0x9017,0x5439,0x5782,0x5e25,
+0x63a8,0x6c34,0x708a,0x7761,0x7c8b,0x7fe0,0x8870,0x9042,
+0x9154,0x9310,0x9318,0x968f,0x745e,0x9ac4,0x5d07,0x5d69,
+0x6570,0x67a2,0x8da8,0x96db,0x636e,0x6749,0x6919,0x83c5,
+0x9817,0x96c0,0x88fe, NONE, NONE, NONE, NONE, NONE,
+ NONE,0x6f84,0x647a,0x5bf8,0x4e16,0x702c,0x755d,0x662f,
+0x51c4,0x5236,0x52e2,0x59d3,0x5f81,0x6027,0x6210,0x653f,
+0x6574,0x661f,0x6674,0x68f2,0x6816,0x6b63,0x6e05,0x7272,
+0x751f,0x76db,0x7cbe,0x8056,0x58f0,0x88fd,0x897f,0x8aa0,
+0x8a93,0x8acb,0x901d,0x9192,0x9752,0x9759,0x6589,0x7a0e,
+0x8106,0x96bb,0x5e2d,0x60dc,0x621a,0x65a5,0x6614,0x6790,
+0x77f3,0x7a4d,0x7c4d,0x7e3e,0x810a,0x8cac,0x8d64,0x8de1,
+0x8e5f,0x78a9,0x5207,0x62d9,0x63a5,0x6442,0x6298,0x8a2d,
+0x7a83,0x7bc0,0x8aac,0x96ea,0x7d76,0x820c,0x8749,0x4ed9,
+0x5148,0x5343,0x5360,0x5ba3,0x5c02,0x5c16,0x5ddd,0x6226,
+0x6247,0x64b0,0x6813,0x6834,0x6cc9,0x6d45,0x6d17,0x67d3,
+0x6f5c,0x714e,0x717d,0x65cb,0x7a7f,0x7bad,0x7dda, NONE,
+ NONE, NONE, NONE, NONE, NONE,0x7e4a,0x7fa8,0x817a,
+0x821b,0x8239,0x85a6,0x8a6e,0x8cce,0x8df5,0x9078,0x9077,
+0x92ad,0x9291,0x9583,0x9bae,0x524d,0x5584,0x6f38,0x7136,
+0x5168,0x7985,0x7e55,0x81b3,0x7cce,0x564c,0x5851,0x5ca8,
+0x63aa,0x66fe,0x66fd,0x695a,0x72d9,0x758f,0x758e,0x790e,
+0x7956,0x79df,0x7c97,0x7d20,0x7d44,0x8607,0x8a34,0x963b,
+0x9061,0x9f20,0x50e7,0x5275,0x53cc,0x53e2,0x5009,0x55aa,
+0x58ee,0x594f,0x723d,0x5b8b,0x5c64,0x531d,0x60e3,0x60f3,
+0x635c,0x6383,0x633f,0x63bb,0x64cd,0x65e9,0x66f9,0x5de3,
+0x69cd,0x69fd,0x6f15,0x71e5,0x4e89,0x75e9,0x76f8,0x7a93,
+0x7cdf,0x7dcf,0x7d9c,0x8061,0x8349,0x8358,0x846c,0x84bc,
+0x85fb,0x88c5,0x8d70,0x9001,0x906d,0x9397,0x971c,0x9a12,
+0x50cf,0x5897,0x618e, NONE, NONE, NONE, NONE, NONE,
+ NONE,0x81d3,0x8535,0x8d08,0x9020,0x4fc3,0x5074,0x5247,
+0x5373,0x606f,0x6349,0x675f,0x6e2c,0x8db3,0x901f,0x4fd7,
+0x5c5e,0x8cca,0x65cf,0x7d9a,0x5352,0x8896,0x5176,0x63c3,
+0x5b58,0x5b6b,0x5c0a,0x640d,0x6751,0x905c,0x4ed6,0x591a,
+0x592a,0x6c70,0x8a51,0x553e,0x5815,0x59a5,0x60f0,0x6253,
+0x67c1,0x8235,0x6955,0x9640,0x99c4,0x9a28,0x4f53,0x5806,
+0x5bfe,0x8010,0x5cb1,0x5e2f,0x5f85,0x6020,0x614b,0x6234,
+0x66ff,0x6cf0,0x6ede,0x80ce,0x817f,0x82d4,0x888b,0x8cb8,
+0x9000,0x902e,0x968a,0x9edb,0x9bdb,0x4ee3,0x53f0,0x5927,
+0x7b2c,0x918d,0x984c,0x9df9,0x6edd,0x7027,0x5353,0x5544,
+0x5b85,0x6258,0x629e,0x62d3,0x6ca2,0x6fef,0x7422,0x8a17,
+0x9438,0x6fc1,0x8afe,0x8338,0x51e7,0x86f8,0x53ea, NONE,
+ NONE, NONE, NONE, NONE, NONE,0x53e9,0x4f46,0x9054,
+0x8fb0,0x596a,0x8131,0x5dfd,0x7aea,0x8fbf,0x68da,0x8c37,
+0x72f8,0x9c48,0x6a3d,0x8ab0,0x4e39,0x5358,0x5606,0x5766,
+0x62c5,0x63a2,0x65e6,0x6b4e,0x6de1,0x6e5b,0x70ad,0x77ed,
+0x7aef,0x7baa,0x7dbb,0x803d,0x80c6,0x86cb,0x8a95,0x935b,
+0x56e3,0x58c7,0x5f3e,0x65ad,0x6696,0x6a80,0x6bb5,0x7537,
+0x8ac7,0x5024,0x77e5,0x5730,0x5f1b,0x6065,0x667a,0x6c60,
+0x75f4,0x7a1a,0x7f6e,0x81f4,0x8718,0x9045,0x99b3,0x7bc9,
+0x755c,0x7af9,0x7b51,0x84c4,0x9010,0x79e9,0x7a92,0x8336,
+0x5ae1,0x7740,0x4e2d,0x4ef2,0x5b99,0x5fe0,0x62bd,0x663c,
+0x67f1,0x6ce8,0x866b,0x8877,0x8a3b,0x914e,0x92f3,0x99d0,
+0x6a17,0x7026,0x732a,0x82e7,0x8457,0x8caf,0x4e01,0x5146,
+0x51cb,0x558b,0x5bf5, NONE, NONE, NONE, NONE, NONE,
+ NONE,0x5e16,0x5e33,0x5e81,0x5f14,0x5f35,0x5f6b,0x5fb4,
+0x61f2,0x6311,0x66a2,0x671d,0x6f6e,0x7252,0x753a,0x773a,
+0x8074,0x8139,0x8178,0x8776,0x8abf,0x8adc,0x8d85,0x8df3,
+0x929a,0x9577,0x9802,0x9ce5,0x52c5,0x6357,0x76f4,0x6715,
+0x6c88,0x73cd,0x8cc3,0x93ae,0x9673,0x6d25,0x589c,0x690e,
+0x69cc,0x8ffd,0x939a,0x75db,0x901a,0x585a,0x6802,0x63b4,
+0x69fb,0x4f43,0x6f2c,0x67d8,0x8fbb,0x8526,0x7db4,0x9354,
+0x693f,0x6f70,0x576a,0x58f7,0x5b2c,0x7d2c,0x722a,0x540a,
+0x91e3,0x9db4,0x4ead,0x4f4e,0x505c,0x5075,0x5243,0x8c9e,
+0x5448,0x5824,0x5b9a,0x5e1d,0x5e95,0x5ead,0x5ef7,0x5f1f,
+0x608c,0x62b5,0x633a,0x63d0,0x68af,0x6c40,0x7887,0x798e,
+0x7a0b,0x7de0,0x8247,0x8a02,0x8ae6,0x8e44,0x9013, NONE,
+ NONE, NONE, NONE, NONE, NONE,0x90b8,0x912d,0x91d8,
+0x9f0e,0x6ce5,0x6458,0x64e2,0x6575,0x6ef4,0x7684,0x7b1b,
+0x9069,0x93d1,0x6eba,0x54f2,0x5fb9,0x64a4,0x8f4d,0x8fed,
+0x9244,0x5178,0x586b,0x5929,0x5c55,0x5e97,0x6dfb,0x7e8f,
+0x751c,0x8cbc,0x8ee2,0x985b,0x70b9,0x4f1d,0x6bbf,0x6fb1,
+0x7530,0x96fb,0x514e,0x5410,0x5835,0x5857,0x59ac,0x5c60,
+0x5f92,0x6597,0x675c,0x6e21,0x767b,0x83df,0x8ced,0x9014,
+0x90fd,0x934d,0x7825,0x783a,0x52aa,0x5ea6,0x571f,0x5974,
+0x6012,0x5012,0x515a,0x51ac,0x51cd,0x5200,0x5510,0x5854,
+0x5858,0x5957,0x5b95,0x5cf6,0x5d8b,0x60bc,0x6295,0x642d,
+0x6771,0x6843,0x68bc,0x68df,0x76d7,0x6dd8,0x6e6f,0x6d9b,
+0x706f,0x71c8,0x5f53,0x75d8,0x7977,0x7b49,0x7b54,0x7b52,
+0x7cd6,0x7d71,0x5230, NONE, NONE, NONE, NONE, NONE,
+ NONE,0x8463,0x8569,0x85e4,0x8a0e,0x8b04,0x8c46,0x8e0f,
+0x9003,0x900f,0x9419,0x9676,0x982d,0x9a30,0x95d8,0x50cd,
+0x52d5,0x540c,0x5802,0x5c0e,0x61a7,0x649e,0x6d1e,0x77b3,
+0x7ae5,0x80f4,0x8404,0x9053,0x9285,0x5ce0,0x9d07,0x533f,
+0x5f97,0x5fb3,0x6d9c,0x7279,0x7763,0x79bf,0x7be4,0x6bd2,
+0x72ec,0x8aad,0x6803,0x6a61,0x51f8,0x7a81,0x6934,0x5c4a,
+0x9cf6,0x82eb,0x5bc5,0x9149,0x701e,0x5678,0x5c6f,0x60c7,
+0x6566,0x6c8c,0x8c5a,0x9041,0x9813,0x5451,0x66c7,0x920d,
+0x5948,0x90a3,0x5185,0x4e4d,0x51ea,0x8599,0x8b0e,0x7058,
+0x637a,0x934b,0x6962,0x99b4,0x7e04,0x7577,0x5357,0x6960,
+0x8edf,0x96e3,0x6c5d,0x4e8c,0x5c3c,0x5f10,0x8fe9,0x5302,
+0x8cd1,0x8089,0x8679,0x5eff,0x65e5,0x4e73,0x5165, NONE,
+ NONE, NONE, NONE, NONE, NONE,0x5982,0x5c3f,0x97ee,
+0x4efb,0x598a,0x5fcd,0x8a8d,0x6fe1,0x79b0,0x7962,0x5be7,
+0x8471,0x732b,0x71b1,0x5e74,0x5ff5,0x637b,0x649a,0x71c3,
+0x7c98,0x4e43,0x5efc,0x4e4b,0x57dc,0x56a2,0x60a9,0x6fc3,
+0x7d0d,0x80fd,0x8133,0x81bf,0x8fb2,0x8997,0x86a4,0x5df4,
+0x628a,0x64ad,0x8987,0x6777,0x6ce2,0x6d3e,0x7436,0x7834,
+0x5a46,0x7f75,0x82ad,0x99ac,0x4ff3,0x5ec3,0x62dd,0x6392,
+0x6557,0x676f,0x76c3,0x724c,0x80cc,0x80ba,0x8f29,0x914d,
+0x500d,0x57f9,0x5a92,0x6885,0x6973,0x7164,0x72fd,0x8cb7,
+0x58f2,0x8ce0,0x966a,0x9019,0x877f,0x79e4,0x77e7,0x8429,
+0x4f2f,0x5265,0x535a,0x62cd,0x67cf,0x6cca,0x767d,0x7b94,
+0x7c95,0x8236,0x8584,0x8feb,0x66dd,0x6f20,0x7206,0x7e1b,
+0x83ab,0x99c1,0x9ea6, NONE, NONE, NONE, NONE, NONE,
+ NONE,0x51fd,0x7bb1,0x7872,0x7bb8,0x8087,0x7b48,0x6ae8,
+0x5e61,0x808c,0x7551,0x7560,0x516b,0x9262,0x6e8c,0x767a,
+0x9197,0x9aea,0x4f10,0x7f70,0x629c,0x7b4f,0x95a5,0x9ce9,
+0x567a,0x5859,0x86e4,0x96bc,0x4f34,0x5224,0x534a,0x53cd,
+0x53db,0x5e06,0x642c,0x6591,0x677f,0x6c3e,0x6c4e,0x7248,
+0x72af,0x73ed,0x7554,0x7e41,0x822c,0x85e9,0x8ca9,0x7bc4,
+0x91c6,0x7169,0x9812,0x98ef,0x633d,0x6669,0x756a,0x76e4,
+0x78d0,0x8543,0x86ee,0x532a,0x5351,0x5426,0x5983,0x5e87,
+0x5f7c,0x60b2,0x6249,0x6279,0x62ab,0x6590,0x6bd4,0x6ccc,
+0x75b2,0x76ae,0x7891,0x79d8,0x7dcb,0x7f77,0x80a5,0x88ab,
+0x8ab9,0x8cbb,0x907f,0x975e,0x98db,0x6a0b,0x7c38,0x5099,
+0x5c3e,0x5fae,0x6787,0x6bd8,0x7435,0x7709,0x7f8e, NONE,
+ NONE, NONE, NONE, NONE, NONE,0x9f3b,0x67ca,0x7a17,
+0x5339,0x758b,0x9aed,0x5f66,0x819d,0x83f1,0x8098,0x5f3c,
+0x5fc5,0x7562,0x7b46,0x903c,0x6867,0x59eb,0x5a9b,0x7d10,
+0x767e,0x8b2c,0x4ff5,0x5f6a,0x6a19,0x6c37,0x6f02,0x74e2,
+0x7968,0x8868,0x8a55,0x8c79,0x5edf,0x63cf,0x75c5,0x79d2,
+0x82d7,0x9328,0x92f2,0x849c,0x86ed,0x9c2d,0x54c1,0x5f6c,
+0x658c,0x6d5c,0x7015,0x8ca7,0x8cd3,0x983b,0x654f,0x74f6,
+0x4e0d,0x4ed8,0x57e0,0x592b,0x5a66,0x5bcc,0x51a8,0x5e03,
+0x5e9c,0x6016,0x6276,0x6577,0x65a7,0x666e,0x6d6e,0x7236,
+0x7b26,0x8150,0x819a,0x8299,0x8b5c,0x8ca0,0x8ce6,0x8d74,
+0x961c,0x9644,0x4fae,0x64ab,0x6b66,0x821e,0x8461,0x856a,
+0x90e8,0x5c01,0x6953,0x98a8,0x847a,0x8557,0x4f0f,0x526f,
+0x5fa9,0x5e45,0x670d, NONE, NONE, NONE, NONE, NONE,
+ NONE,0x798f,0x8179,0x8907,0x8986,0x6df5,0x5f17,0x6255,
+0x6cb8,0x4ecf,0x7269,0x9b92,0x5206,0x543b,0x5674,0x58b3,
+0x61a4,0x626e,0x711a,0x596e,0x7c89,0x7cde,0x7d1b,0x96f0,
+0x6587,0x805e,0x4e19,0x4f75,0x5175,0x5840,0x5e63,0x5e73,
+0x5f0a,0x67c4,0x4e26,0x853d,0x9589,0x965b,0x7c73,0x9801,
+0x50fb,0x58c1,0x7656,0x78a7,0x5225,0x77a5,0x8511,0x7b86,
+0x504f,0x5909,0x7247,0x7bc7,0x7de8,0x8fba,0x8fd4,0x904d,
+0x4fbf,0x52c9,0x5a29,0x5f01,0x97ad,0x4fdd,0x8217,0x92ea,
+0x5703,0x6355,0x6b69,0x752b,0x88dc,0x8f14,0x7a42,0x52df,
+0x5893,0x6155,0x620a,0x66ae,0x6bcd,0x7c3f,0x83e9,0x5023,
+0x4ff8,0x5305,0x5446,0x5831,0x5949,0x5b9d,0x5cf0,0x5cef,
+0x5d29,0x5e96,0x62b1,0x6367,0x653e,0x65b9,0x670b, NONE,
+ NONE, NONE, NONE, NONE, NONE,0x6cd5,0x6ce1,0x70f9,
+0x7832,0x7e2b,0x80de,0x82b3,0x840c,0x84ec,0x8702,0x8912,
+0x8a2a,0x8c4a,0x90a6,0x92d2,0x98fd,0x9cf3,0x9d6c,0x4e4f,
+0x4ea1,0x508d,0x5256,0x574a,0x59a8,0x5e3d,0x5fd8,0x5fd9,
+0x623f,0x66b4,0x671b,0x67d0,0x68d2,0x5192,0x7d21,0x80aa,
+0x81a8,0x8b00,0x8c8c,0x8cbf,0x927e,0x9632,0x5420,0x982c,
+0x5317,0x50d5,0x535c,0x58a8,0x64b2,0x6734,0x7267,0x7766,
+0x7a46,0x91e6,0x52c3,0x6ca1,0x6b86,0x5800,0x5e4c,0x5954,
+0x672c,0x7ffb,0x51e1,0x76c6,0x6469,0x78e8,0x9b54,0x9ebb,
+0x57cb,0x59b9,0x6627,0x679a,0x6bce,0x54e9,0x69d9,0x5e55,
+0x819c,0x6795,0x9baa,0x67fe,0x9c52,0x685d,0x4ea6,0x4fe3,
+0x53c8,0x62b9,0x672b,0x6cab,0x8fc4,0x4fad,0x7e6d,0x9ebf,
+0x4e07,0x6162,0x6e80, NONE, NONE, NONE, NONE, NONE,
+ NONE,0x6f2b,0x8513,0x5473,0x672a,0x9b45,0x5df3,0x7b95,
+0x5cac,0x5bc6,0x871c,0x6e4a,0x84d1,0x7a14,0x8108,0x5999,
+0x7c8d,0x6c11,0x7720,0x52d9,0x5922,0x7121,0x725f,0x77db,
+0x9727,0x9d61,0x690b,0x5a7f,0x5a18,0x51a5,0x540d,0x547d,
+0x660e,0x76df,0x8ff7,0x9298,0x9cf4,0x59ea,0x725d,0x6ec5,
+0x514d,0x68c9,0x7dbf,0x7dec,0x9762,0x9eba,0x6478,0x6a21,
+0x8302,0x5984,0x5b5f,0x6bdb,0x731b,0x76f2,0x7db2,0x8017,
+0x8499,0x5132,0x6728,0x9ed9,0x76ee,0x6762,0x52ff,0x9905,
+0x5c24,0x623b,0x7c7e,0x8cb0,0x554f,0x60b6,0x7d0b,0x9580,
+0x5301,0x4e5f,0x51b6,0x591c,0x723a,0x8036,0x91ce,0x5f25,
+0x77e2,0x5384,0x5f79,0x7d04,0x85ac,0x8a33,0x8e8d,0x9756,
+0x67f3,0x85ae,0x9453,0x6109,0x6108,0x6cb9,0x7652, NONE,
+ NONE, NONE, NONE, NONE, NONE,0x8aed,0x8f38,0x552f,
+0x4f51,0x512a,0x52c7,0x53cb,0x5ba5,0x5e7d,0x60a0,0x6182,
+0x63d6,0x6709,0x67da,0x6e67,0x6d8c,0x7336,0x7337,0x7531,
+0x7950,0x88d5,0x8a98,0x904a,0x9091,0x90f5,0x96c4,0x878d,
+0x5915,0x4e88,0x4f59,0x4e0e,0x8a89,0x8f3f,0x9810,0x50ad,
+0x5e7c,0x5996,0x5bb9,0x5eb8,0x63da,0x63fa,0x64c1,0x66dc,
+0x694a,0x69d8,0x6d0b,0x6eb6,0x7194,0x7528,0x7aaf,0x7f8a,
+0x8000,0x8449,0x84c9,0x8981,0x8b21,0x8e0a,0x9065,0x967d,
+0x990a,0x617e,0x6291,0x6b32,0x6c83,0x6d74,0x7fcc,0x7ffc,
+0x6dc0,0x7f85,0x87ba,0x88f8,0x6765,0x83b1,0x983c,0x96f7,
+0x6d1b,0x7d61,0x843d,0x916a,0x4e71,0x5375,0x5d50,0x6b04,
+0x6feb,0x85cd,0x862d,0x89a7,0x5229,0x540f,0x5c65,0x674e,
+0x68a8,0x7406,0x7483, NONE, NONE, NONE, NONE, NONE,
+ NONE,0x75e2,0x88cf,0x88e1,0x91cc,0x96e2,0x9678,0x5f8b,
+0x7387,0x7acb,0x844e,0x63a0,0x7565,0x5289,0x6d41,0x6e9c,
+0x7409,0x7559,0x786b,0x7c92,0x9686,0x7adc,0x9f8d,0x4fb6,
+0x616e,0x65c5,0x865c,0x4e86,0x4eae,0x50da,0x4e21,0x51cc,
+0x5bee,0x6599,0x6881,0x6dbc,0x731f,0x7642,0x77ad,0x7a1c,
+0x7ce7,0x826f,0x8ad2,0x907c,0x91cf,0x9675,0x9818,0x529b,
+0x7dd1,0x502b,0x5398,0x6797,0x6dcb,0x71d0,0x7433,0x81e8,
+0x8f2a,0x96a3,0x9c57,0x9e9f,0x7460,0x5841,0x6d99,0x7d2f,
+0x985e,0x4ee4,0x4f36,0x4f8b,0x51b7,0x52b1,0x5dba,0x601c,
+0x73b2,0x793c,0x82d3,0x9234,0x96b7,0x96f6,0x970a,0x9e97,
+0x9f62,0x66a6,0x6b74,0x5217,0x52a3,0x70c8,0x88c2,0x5ec9,
+0x604b,0x6190,0x6f23,0x7149,0x7c3e,0x7df4,0x806f, NONE,
+ NONE, NONE, NONE, NONE, NONE,0x84ee,0x9023,0x932c,
+0x5442,0x9b6f,0x6ad3,0x7089,0x8cc2,0x8def,0x9732,0x52b4,
+0x5a41,0x5eca,0x5f04,0x6717,0x697c,0x6994,0x6d6a,0x6f0f,
+0x7262,0x72fc,0x7bed,0x8001,0x807e,0x874b,0x90ce,0x516d,
+0x9e93,0x7984,0x808b,0x9332,0x8ad6,0x502d,0x548c,0x8a71,
+0x6b6a,0x8cc4,0x8107,0x60d1,0x67a0,0x9df2,0x4e99,0x4e98,
+0x9c10,0x8a6b,0x85c1,0x8568,0x6900,0x6e7e,0x7897,0x8155,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE,0x5f0c,0x4e10,0x4e15,0x4e2a,0x4e31,0x4e36,0x4e3c,
+0x4e3f,0x4e42,0x4e56,0x4e58,0x4e82,0x4e85,0x8c6b,0x4e8a,
+0x8212,0x5f0d,0x4e8e,0x4e9e,0x4e9f,0x4ea0,0x4ea2,0x4eb0,
+0x4eb3,0x4eb6,0x4ece,0x4ecd,0x4ec4,0x4ec6,0x4ec2,0x4ed7,
+0x4ede,0x4eed,0x4edf,0x4ef7,0x4f09,0x4f5a,0x4f30,0x4f5b,
+0x4f5d,0x4f57,0x4f47,0x4f76,0x4f88,0x4f8f,0x4f98,0x4f7b,
+0x4f69,0x4f70,0x4f91,0x4f6f,0x4f86,0x4f96,0x5118,0x4fd4,
+0x4fdf,0x4fce,0x4fd8,0x4fdb,0x4fd1,0x4fda,0x4fd0,0x4fe4,
+0x4fe5,0x501a,0x5028,0x5014,0x502a,0x5025,0x5005,0x4f1c,
+0x4ff6,0x5021,0x5029,0x502c,0x4ffe,0x4fef,0x5011,0x5006,
+0x5043,0x5047,0x6703,0x5055,0x5050,0x5048,0x505a,0x5056,
+0x506c,0x5078,0x5080,0x509a,0x5085,0x50b4,0x50b2, NONE,
+ NONE, NONE, NONE, NONE, NONE,0x50c9,0x50ca,0x50b3,
+0x50c2,0x50d6,0x50de,0x50e5,0x50ed,0x50e3,0x50ee,0x50f9,
+0x50f5,0x5109,0x5101,0x5102,0x5116,0x5115,0x5114,0x511a,
+0x5121,0x513a,0x5137,0x513c,0x513b,0x513f,0x5140,0x5152,
+0x514c,0x5154,0x5162,0x7af8,0x5169,0x516a,0x516e,0x5180,
+0x5182,0x56d8,0x518c,0x5189,0x518f,0x5191,0x5193,0x5195,
+0x5196,0x51a4,0x51a6,0x51a2,0x51a9,0x51aa,0x51ab,0x51b3,
+0x51b1,0x51b2,0x51b0,0x51b5,0x51bd,0x51c5,0x51c9,0x51db,
+0x51e0,0x8655,0x51e9,0x51ed,0x51f0,0x51f5,0x51fe,0x5204,
+0x520b,0x5214,0x520e,0x5227,0x522a,0x522e,0x5233,0x5239,
+0x524f,0x5244,0x524b,0x524c,0x525e,0x5254,0x526a,0x5274,
+0x5269,0x5273,0x527f,0x527d,0x528d,0x5294,0x5292,0x5271,
+0x5288,0x5291,0x8fa8, NONE, NONE, NONE, NONE, NONE,
+ NONE,0x8fa7,0x52ac,0x52ad,0x52bc,0x52b5,0x52c1,0x52cd,
+0x52d7,0x52de,0x52e3,0x52e6,0x98ed,0x52e0,0x52f3,0x52f5,
+0x52f8,0x52f9,0x5306,0x5308,0x7538,0x530d,0x5310,0x530f,
+0x5315,0x531a,0x5323,0x532f,0x5331,0x5333,0x5338,0x5340,
+0x5346,0x5345,0x4e17,0x5349,0x534d,0x51d6,0x535e,0x5369,
+0x536e,0x5918,0x537b,0x5377,0x5382,0x5396,0x53a0,0x53a6,
+0x53a5,0x53ae,0x53b0,0x53b6,0x53c3,0x7c12,0x96d9,0x53df,
+0x66fc,0x71ee,0x53ee,0x53e8,0x53ed,0x53fa,0x5401,0x543d,
+0x5440,0x542c,0x542d,0x543c,0x542e,0x5436,0x5429,0x541d,
+0x544e,0x548f,0x5475,0x548e,0x545f,0x5471,0x5477,0x5470,
+0x5492,0x547b,0x5480,0x5476,0x5484,0x5490,0x5486,0x54c7,
+0x54a2,0x54b8,0x54a5,0x54ac,0x54c4,0x54c8,0x54a8, NONE,
+ NONE, NONE, NONE, NONE, NONE,0x54ab,0x54c2,0x54a4,
+0x54be,0x54bc,0x54d8,0x54e5,0x54e6,0x550f,0x5514,0x54fd,
+0x54ee,0x54ed,0x54fa,0x54e2,0x5539,0x5540,0x5563,0x554c,
+0x552e,0x555c,0x5545,0x5556,0x5557,0x5538,0x5533,0x555d,
+0x5599,0x5580,0x54af,0x558a,0x559f,0x557b,0x557e,0x5598,
+0x559e,0x55ae,0x557c,0x5583,0x55a9,0x5587,0x55a8,0x55da,
+0x55c5,0x55df,0x55c4,0x55dc,0x55e4,0x55d4,0x5614,0x55f7,
+0x5616,0x55fe,0x55fd,0x561b,0x55f9,0x564e,0x5650,0x71df,
+0x5634,0x5636,0x5632,0x5638,0x566b,0x5664,0x562f,0x566c,
+0x566a,0x5686,0x5680,0x568a,0x56a0,0x5694,0x568f,0x56a5,
+0x56ae,0x56b6,0x56b4,0x56c2,0x56bc,0x56c1,0x56c3,0x56c0,
+0x56c8,0x56ce,0x56d1,0x56d3,0x56d7,0x56ee,0x56f9,0x5700,
+0x56ff,0x5704,0x5709, NONE, NONE, NONE, NONE, NONE,
+ NONE,0x5708,0x570b,0x570d,0x5713,0x5718,0x5716,0x55c7,
+0x571c,0x5726,0x5737,0x5738,0x574e,0x573b,0x5740,0x574f,
+0x5769,0x57c0,0x5788,0x5761,0x577f,0x5789,0x5793,0x57a0,
+0x57b3,0x57a4,0x57aa,0x57b0,0x57c3,0x57c6,0x57d4,0x57d2,
+0x57d3,0x580a,0x57d6,0x57e3,0x580b,0x5819,0x581d,0x5872,
+0x5821,0x5862,0x584b,0x5870,0x6bc0,0x5852,0x583d,0x5879,
+0x5885,0x58b9,0x589f,0x58ab,0x58ba,0x58de,0x58bb,0x58b8,
+0x58ae,0x58c5,0x58d3,0x58d1,0x58d7,0x58d9,0x58d8,0x58e5,
+0x58dc,0x58e4,0x58df,0x58ef,0x58fa,0x58f9,0x58fb,0x58fc,
+0x58fd,0x5902,0x590a,0x5910,0x591b,0x68a6,0x5925,0x592c,
+0x592d,0x5932,0x5938,0x593e,0x7ad2,0x5955,0x5950,0x594e,
+0x595a,0x5958,0x5962,0x5960,0x5967,0x596c,0x5969, NONE,
+ NONE, NONE, NONE, NONE, NONE,0x5978,0x5981,0x599d,
+0x4f5e,0x4fab,0x59a3,0x59b2,0x59c6,0x59e8,0x59dc,0x598d,
+0x59d9,0x59da,0x5a25,0x5a1f,0x5a11,0x5a1c,0x5a09,0x5a1a,
+0x5a40,0x5a6c,0x5a49,0x5a35,0x5a36,0x5a62,0x5a6a,0x5a9a,
+0x5abc,0x5abe,0x5acb,0x5ac2,0x5abd,0x5ae3,0x5ad7,0x5ae6,
+0x5ae9,0x5ad6,0x5afa,0x5afb,0x5b0c,0x5b0b,0x5b16,0x5b32,
+0x5ad0,0x5b2a,0x5b36,0x5b3e,0x5b43,0x5b45,0x5b40,0x5b51,
+0x5b55,0x5b5a,0x5b5b,0x5b65,0x5b69,0x5b70,0x5b73,0x5b75,
+0x5b78,0x6588,0x5b7a,0x5b80,0x5b83,0x5ba6,0x5bb8,0x5bc3,
+0x5bc7,0x5bc9,0x5bd4,0x5bd0,0x5be4,0x5be6,0x5be2,0x5bde,
+0x5be5,0x5beb,0x5bf0,0x5bf6,0x5bf3,0x5c05,0x5c07,0x5c08,
+0x5c0d,0x5c13,0x5c20,0x5c22,0x5c28,0x5c38,0x5c39,0x5c41,
+0x5c46,0x5c4e,0x5c53, NONE, NONE, NONE, NONE, NONE,
+ NONE,0x5c50,0x5c4f,0x5b71,0x5c6c,0x5c6e,0x4e62,0x5c76,
+0x5c79,0x5c8c,0x5c91,0x5c94,0x599b,0x5cab,0x5cbb,0x5cb6,
+0x5cbc,0x5cb7,0x5cc5,0x5cbe,0x5cc7,0x5cd9,0x5ce9,0x5cfd,
+0x5cfa,0x5ced,0x5d8c,0x5cea,0x5d0b,0x5d15,0x5d17,0x5d5c,
+0x5d1f,0x5d1b,0x5d11,0x5d14,0x5d22,0x5d1a,0x5d19,0x5d18,
+0x5d4c,0x5d52,0x5d4e,0x5d4b,0x5d6c,0x5d73,0x5d76,0x5d87,
+0x5d84,0x5d82,0x5da2,0x5d9d,0x5dac,0x5dae,0x5dbd,0x5d90,
+0x5db7,0x5dbc,0x5dc9,0x5dcd,0x5dd3,0x5dd2,0x5dd6,0x5ddb,
+0x5deb,0x5df2,0x5df5,0x5e0b,0x5e1a,0x5e19,0x5e11,0x5e1b,
+0x5e36,0x5e37,0x5e44,0x5e43,0x5e40,0x5e4e,0x5e57,0x5e54,
+0x5e5f,0x5e62,0x5e64,0x5e47,0x5e75,0x5e76,0x5e7a,0x9ebc,
+0x5e7f,0x5ea0,0x5ec1,0x5ec2,0x5ec8,0x5ed0,0x5ecf, NONE,
+ NONE, NONE, NONE, NONE, NONE,0x5ed6,0x5ee3,0x5edd,
+0x5eda,0x5edb,0x5ee2,0x5ee1,0x5ee8,0x5ee9,0x5eec,0x5ef1,
+0x5ef3,0x5ef0,0x5ef4,0x5ef8,0x5efe,0x5f03,0x5f09,0x5f5d,
+0x5f5c,0x5f0b,0x5f11,0x5f16,0x5f29,0x5f2d,0x5f38,0x5f41,
+0x5f48,0x5f4c,0x5f4e,0x5f2f,0x5f51,0x5f56,0x5f57,0x5f59,
+0x5f61,0x5f6d,0x5f73,0x5f77,0x5f83,0x5f82,0x5f7f,0x5f8a,
+0x5f88,0x5f91,0x5f87,0x5f9e,0x5f99,0x5f98,0x5fa0,0x5fa8,
+0x5fad,0x5fbc,0x5fd6,0x5ffb,0x5fe4,0x5ff8,0x5ff1,0x5fdd,
+0x60b3,0x5fff,0x6021,0x6060,0x6019,0x6010,0x6029,0x600e,
+0x6031,0x601b,0x6015,0x602b,0x6026,0x600f,0x603a,0x605a,
+0x6041,0x606a,0x6077,0x605f,0x604a,0x6046,0x604d,0x6063,
+0x6043,0x6064,0x6042,0x606c,0x606b,0x6059,0x6081,0x608d,
+0x60e7,0x6083,0x609a, NONE, NONE, NONE, NONE, NONE,
+ NONE,0x6084,0x609b,0x6096,0x6097,0x6092,0x60a7,0x608b,
+0x60e1,0x60b8,0x60e0,0x60d3,0x60b4,0x5ff0,0x60bd,0x60c6,
+0x60b5,0x60d8,0x614d,0x6115,0x6106,0x60f6,0x60f7,0x6100,
+0x60f4,0x60fa,0x6103,0x6121,0x60fb,0x60f1,0x610d,0x610e,
+0x6147,0x613e,0x6128,0x6127,0x614a,0x613f,0x613c,0x612c,
+0x6134,0x613d,0x6142,0x6144,0x6173,0x6177,0x6158,0x6159,
+0x615a,0x616b,0x6174,0x616f,0x6165,0x6171,0x615f,0x615d,
+0x6153,0x6175,0x6199,0x6196,0x6187,0x61ac,0x6194,0x619a,
+0x618a,0x6191,0x61ab,0x61ae,0x61cc,0x61ca,0x61c9,0x61f7,
+0x61c8,0x61c3,0x61c6,0x61ba,0x61cb,0x7f79,0x61cd,0x61e6,
+0x61e3,0x61f6,0x61fa,0x61f4,0x61ff,0x61fd,0x61fc,0x61fe,
+0x6200,0x6208,0x6209,0x620d,0x620c,0x6214,0x621b, NONE,
+ NONE, NONE, NONE, NONE, NONE,0x621e,0x6221,0x622a,
+0x622e,0x6230,0x6232,0x6233,0x6241,0x624e,0x625e,0x6263,
+0x625b,0x6260,0x6268,0x627c,0x6282,0x6289,0x627e,0x6292,
+0x6293,0x6296,0x62d4,0x6283,0x6294,0x62d7,0x62d1,0x62bb,
+0x62cf,0x62ff,0x62c6,0x64d4,0x62c8,0x62dc,0x62cc,0x62ca,
+0x62c2,0x62c7,0x629b,0x62c9,0x630c,0x62ee,0x62f1,0x6327,
+0x6302,0x6308,0x62ef,0x62f5,0x6350,0x633e,0x634d,0x641c,
+0x634f,0x6396,0x638e,0x6380,0x63ab,0x6376,0x63a3,0x638f,
+0x6389,0x639f,0x63b5,0x636b,0x6369,0x63be,0x63e9,0x63c0,
+0x63c6,0x63e3,0x63c9,0x63d2,0x63f6,0x63c4,0x6416,0x6434,
+0x6406,0x6413,0x6426,0x6436,0x651d,0x6417,0x6428,0x640f,
+0x6467,0x646f,0x6476,0x644e,0x652a,0x6495,0x6493,0x64a5,
+0x64a9,0x6488,0x64bc, NONE, NONE, NONE, NONE, NONE,
+ NONE,0x64da,0x64d2,0x64c5,0x64c7,0x64bb,0x64d8,0x64c2,
+0x64f1,0x64e7,0x8209,0x64e0,0x64e1,0x62ac,0x64e3,0x64ef,
+0x652c,0x64f6,0x64f4,0x64f2,0x64fa,0x6500,0x64fd,0x6518,
+0x651c,0x6505,0x6524,0x6523,0x652b,0x6534,0x6535,0x6537,
+0x6536,0x6538,0x754b,0x6548,0x6556,0x6555,0x654d,0x6558,
+0x655e,0x655d,0x6572,0x6578,0x6582,0x6583,0x8b8a,0x659b,
+0x659f,0x65ab,0x65b7,0x65c3,0x65c6,0x65c1,0x65c4,0x65cc,
+0x65d2,0x65db,0x65d9,0x65e0,0x65e1,0x65f1,0x6772,0x660a,
+0x6603,0x65fb,0x6773,0x6635,0x6636,0x6634,0x661c,0x664f,
+0x6644,0x6649,0x6641,0x665e,0x665d,0x6664,0x6667,0x6668,
+0x665f,0x6662,0x6670,0x6683,0x6688,0x668e,0x6689,0x6684,
+0x6698,0x669d,0x66c1,0x66b9,0x66c9,0x66be,0x66bc, NONE,
+ NONE, NONE, NONE, NONE, NONE,0x66c4,0x66b8,0x66d6,
+0x66da,0x66e0,0x663f,0x66e6,0x66e9,0x66f0,0x66f5,0x66f7,
+0x670f,0x6716,0x671e,0x6726,0x6727,0x9738,0x672e,0x673f,
+0x6736,0x6741,0x6738,0x6737,0x6746,0x675e,0x6760,0x6759,
+0x6763,0x6764,0x6789,0x6770,0x67a9,0x677c,0x676a,0x678c,
+0x678b,0x67a6,0x67a1,0x6785,0x67b7,0x67ef,0x67b4,0x67ec,
+0x67b3,0x67e9,0x67b8,0x67e4,0x67de,0x67dd,0x67e2,0x67ee,
+0x67b9,0x67ce,0x67c6,0x67e7,0x6a9c,0x681e,0x6846,0x6829,
+0x6840,0x684d,0x6832,0x684e,0x68b3,0x682b,0x6859,0x6863,
+0x6877,0x687f,0x689f,0x688f,0x68ad,0x6894,0x689d,0x689b,
+0x6883,0x6aae,0x68b9,0x6874,0x68b5,0x68a0,0x68ba,0x690f,
+0x688d,0x687e,0x6901,0x68ca,0x6908,0x68d8,0x6922,0x6926,
+0x68e1,0x690c,0x68cd, NONE, NONE, NONE, NONE, NONE,
+ NONE,0x68d4,0x68e7,0x68d5,0x6936,0x6912,0x6904,0x68d7,
+0x68e3,0x6925,0x68f9,0x68e0,0x68ef,0x6928,0x692a,0x691a,
+0x6923,0x6921,0x68c6,0x6979,0x6977,0x695c,0x6978,0x696b,
+0x6954,0x697e,0x696e,0x6939,0x6974,0x693d,0x6959,0x6930,
+0x6961,0x695e,0x695d,0x6981,0x696a,0x69b2,0x69ae,0x69d0,
+0x69bf,0x69c1,0x69d3,0x69be,0x69ce,0x5be8,0x69ca,0x69dd,
+0x69bb,0x69c3,0x69a7,0x6a2e,0x6991,0x69a0,0x699c,0x6995,
+0x69b4,0x69de,0x69e8,0x6a02,0x6a1b,0x69ff,0x6b0a,0x69f9,
+0x69f2,0x69e7,0x6a05,0x69b1,0x6a1e,0x69ed,0x6a14,0x69eb,
+0x6a0a,0x6a12,0x6ac1,0x6a23,0x6a13,0x6a44,0x6a0c,0x6a72,
+0x6a36,0x6a78,0x6a47,0x6a62,0x6a59,0x6a66,0x6a48,0x6a38,
+0x6a22,0x6a90,0x6a8d,0x6aa0,0x6a84,0x6aa2,0x6aa3, NONE,
+ NONE, NONE, NONE, NONE, NONE,0x6a97,0x8617,0x6abb,
+0x6ac3,0x6ac2,0x6ab8,0x6ab3,0x6aac,0x6ade,0x6ad1,0x6adf,
+0x6aaa,0x6ada,0x6aea,0x6afb,0x6b05,0x8616,0x6afa,0x6b12,
+0x6b16,0x9b31,0x6b1f,0x6b38,0x6b37,0x76dc,0x6b39,0x98ee,
+0x6b47,0x6b43,0x6b49,0x6b50,0x6b59,0x6b54,0x6b5b,0x6b5f,
+0x6b61,0x6b78,0x6b79,0x6b7f,0x6b80,0x6b84,0x6b83,0x6b8d,
+0x6b98,0x6b95,0x6b9e,0x6ba4,0x6baa,0x6bab,0x6baf,0x6bb2,
+0x6bb1,0x6bb3,0x6bb7,0x6bbc,0x6bc6,0x6bcb,0x6bd3,0x6bdf,
+0x6bec,0x6beb,0x6bf3,0x6bef,0x9ebe,0x6c08,0x6c13,0x6c14,
+0x6c1b,0x6c24,0x6c23,0x6c5e,0x6c55,0x6c62,0x6c6a,0x6c82,
+0x6c8d,0x6c9a,0x6c81,0x6c9b,0x6c7e,0x6c68,0x6c73,0x6c92,
+0x6c90,0x6cc4,0x6cf1,0x6cd3,0x6cbd,0x6cd7,0x6cc5,0x6cdd,
+0x6cae,0x6cb1,0x6cbe, NONE, NONE, NONE, NONE, NONE,
+ NONE,0x6cba,0x6cdb,0x6cef,0x6cd9,0x6cea,0x6d1f,0x884d,
+0x6d36,0x6d2b,0x6d3d,0x6d38,0x6d19,0x6d35,0x6d33,0x6d12,
+0x6d0c,0x6d63,0x6d93,0x6d64,0x6d5a,0x6d79,0x6d59,0x6d8e,
+0x6d95,0x6fe4,0x6d85,0x6df9,0x6e15,0x6e0a,0x6db5,0x6dc7,
+0x6de6,0x6db8,0x6dc6,0x6dec,0x6dde,0x6dcc,0x6de8,0x6dd2,
+0x6dc5,0x6dfa,0x6dd9,0x6de4,0x6dd5,0x6dea,0x6dee,0x6e2d,
+0x6e6e,0x6e2e,0x6e19,0x6e72,0x6e5f,0x6e3e,0x6e23,0x6e6b,
+0x6e2b,0x6e76,0x6e4d,0x6e1f,0x6e43,0x6e3a,0x6e4e,0x6e24,
+0x6eff,0x6e1d,0x6e38,0x6e82,0x6eaa,0x6e98,0x6ec9,0x6eb7,
+0x6ed3,0x6ebd,0x6eaf,0x6ec4,0x6eb2,0x6ed4,0x6ed5,0x6e8f,
+0x6ea5,0x6ec2,0x6e9f,0x6f41,0x6f11,0x704c,0x6eec,0x6ef8,
+0x6efe,0x6f3f,0x6ef2,0x6f31,0x6eef,0x6f32,0x6ecc, NONE,
+ NONE, NONE, NONE, NONE, NONE,0x6f3e,0x6f13,0x6ef7,
+0x6f86,0x6f7a,0x6f78,0x6f81,0x6f80,0x6f6f,0x6f5b,0x6ff3,
+0x6f6d,0x6f82,0x6f7c,0x6f58,0x6f8e,0x6f91,0x6fc2,0x6f66,
+0x6fb3,0x6fa3,0x6fa1,0x6fa4,0x6fb9,0x6fc6,0x6faa,0x6fdf,
+0x6fd5,0x6fec,0x6fd4,0x6fd8,0x6ff1,0x6fee,0x6fdb,0x7009,
+0x700b,0x6ffa,0x7011,0x7001,0x700f,0x6ffe,0x701b,0x701a,
+0x6f74,0x701d,0x7018,0x701f,0x7030,0x703e,0x7032,0x7051,
+0x7063,0x7099,0x7092,0x70af,0x70f1,0x70ac,0x70b8,0x70b3,
+0x70ae,0x70df,0x70cb,0x70dd,0x70d9,0x7109,0x70fd,0x711c,
+0x7119,0x7165,0x7155,0x7188,0x7166,0x7162,0x714c,0x7156,
+0x716c,0x718f,0x71fb,0x7184,0x7195,0x71a8,0x71ac,0x71d7,
+0x71b9,0x71be,0x71d2,0x71c9,0x71d4,0x71ce,0x71e0,0x71ec,
+0x71e7,0x71f5,0x71fc, NONE, NONE, NONE, NONE, NONE,
+ NONE,0x71f9,0x71ff,0x720d,0x7210,0x721b,0x7228,0x722d,
+0x722c,0x7230,0x7232,0x723b,0x723c,0x723f,0x7240,0x7246,
+0x724b,0x7258,0x7274,0x727e,0x7282,0x7281,0x7287,0x7292,
+0x7296,0x72a2,0x72a7,0x72b9,0x72b2,0x72c3,0x72c6,0x72c4,
+0x72ce,0x72d2,0x72e2,0x72e0,0x72e1,0x72f9,0x72f7,0x500f,
+0x7317,0x730a,0x731c,0x7316,0x731d,0x7334,0x732f,0x7329,
+0x7325,0x733e,0x734e,0x734f,0x9ed8,0x7357,0x736a,0x7368,
+0x7370,0x7378,0x7375,0x737b,0x737a,0x73c8,0x73b3,0x73ce,
+0x73bb,0x73c0,0x73e5,0x73ee,0x73de,0x74a2,0x7405,0x746f,
+0x7425,0x73f8,0x7432,0x743a,0x7455,0x743f,0x745f,0x7459,
+0x7441,0x745c,0x7469,0x7470,0x7463,0x746a,0x7476,0x747e,
+0x748b,0x749e,0x74a7,0x74ca,0x74cf,0x74d4,0x73f1, NONE,
+ NONE, NONE, NONE, NONE, NONE,0x74e0,0x74e3,0x74e7,
+0x74e9,0x74ee,0x74f2,0x74f0,0x74f1,0x74f8,0x74f7,0x7504,
+0x7503,0x7505,0x750c,0x750e,0x750d,0x7515,0x7513,0x751e,
+0x7526,0x752c,0x753c,0x7544,0x754d,0x754a,0x7549,0x755b,
+0x7546,0x755a,0x7569,0x7564,0x7567,0x756b,0x756d,0x7578,
+0x7576,0x7586,0x7587,0x7574,0x758a,0x7589,0x7582,0x7594,
+0x759a,0x759d,0x75a5,0x75a3,0x75c2,0x75b3,0x75c3,0x75b5,
+0x75bd,0x75b8,0x75bc,0x75b1,0x75cd,0x75ca,0x75d2,0x75d9,
+0x75e3,0x75de,0x75fe,0x75ff,0x75fc,0x7601,0x75f0,0x75fa,
+0x75f2,0x75f3,0x760b,0x760d,0x7609,0x761f,0x7627,0x7620,
+0x7621,0x7622,0x7624,0x7634,0x7630,0x763b,0x7647,0x7648,
+0x7646,0x765c,0x7658,0x7661,0x7662,0x7668,0x7669,0x766a,
+0x7667,0x766c,0x7670, NONE, NONE, NONE, NONE, NONE,
+ NONE,0x7672,0x7676,0x7678,0x767c,0x7680,0x7683,0x7688,
+0x768b,0x768e,0x7696,0x7693,0x7699,0x769a,0x76b0,0x76b4,
+0x76b8,0x76b9,0x76ba,0x76c2,0x76cd,0x76d6,0x76d2,0x76de,
+0x76e1,0x76e5,0x76e7,0x76ea,0x862f,0x76fb,0x7708,0x7707,
+0x7704,0x7729,0x7724,0x771e,0x7725,0x7726,0x771b,0x7737,
+0x7738,0x7747,0x775a,0x7768,0x776b,0x775b,0x7765,0x777f,
+0x777e,0x7779,0x778e,0x778b,0x7791,0x77a0,0x779e,0x77b0,
+0x77b6,0x77b9,0x77bf,0x77bc,0x77bd,0x77bb,0x77c7,0x77cd,
+0x77d7,0x77da,0x77dc,0x77e3,0x77ee,0x77fc,0x780c,0x7812,
+0x7926,0x7820,0x792a,0x7845,0x788e,0x7874,0x7886,0x787c,
+0x789a,0x788c,0x78a3,0x78b5,0x78aa,0x78af,0x78d1,0x78c6,
+0x78cb,0x78d4,0x78be,0x78bc,0x78c5,0x78ca,0x78ec, NONE,
+ NONE, NONE, NONE, NONE, NONE,0x78e7,0x78da,0x78fd,
+0x78f4,0x7907,0x7912,0x7911,0x7919,0x792c,0x792b,0x7940,
+0x7960,0x7957,0x795f,0x795a,0x7955,0x7953,0x797a,0x797f,
+0x798a,0x799d,0x79a7,0x9f4b,0x79aa,0x79ae,0x79b3,0x79b9,
+0x79ba,0x79c9,0x79d5,0x79e7,0x79ec,0x79e1,0x79e3,0x7a08,
+0x7a0d,0x7a18,0x7a19,0x7a20,0x7a1f,0x7980,0x7a31,0x7a3b,
+0x7a3e,0x7a37,0x7a43,0x7a57,0x7a49,0x7a61,0x7a62,0x7a69,
+0x9f9d,0x7a70,0x7a79,0x7a7d,0x7a88,0x7a97,0x7a95,0x7a98,
+0x7a96,0x7aa9,0x7ac8,0x7ab0,0x7ab6,0x7ac5,0x7ac4,0x7abf,
+0x9083,0x7ac7,0x7aca,0x7acd,0x7acf,0x7ad5,0x7ad3,0x7ad9,
+0x7ada,0x7add,0x7ae1,0x7ae2,0x7ae6,0x7aed,0x7af0,0x7b02,
+0x7b0f,0x7b0a,0x7b06,0x7b33,0x7b18,0x7b19,0x7b1e,0x7b35,
+0x7b28,0x7b36,0x7b50, NONE, NONE, NONE, NONE, NONE,
+ NONE,0x7b7a,0x7b04,0x7b4d,0x7b0b,0x7b4c,0x7b45,0x7b75,
+0x7b65,0x7b74,0x7b67,0x7b70,0x7b71,0x7b6c,0x7b6e,0x7b9d,
+0x7b98,0x7b9f,0x7b8d,0x7b9c,0x7b9a,0x7b8b,0x7b92,0x7b8f,
+0x7b5d,0x7b99,0x7bcb,0x7bc1,0x7bcc,0x7bcf,0x7bb4,0x7bc6,
+0x7bdd,0x7be9,0x7c11,0x7c14,0x7be6,0x7be5,0x7c60,0x7c00,
+0x7c07,0x7c13,0x7bf3,0x7bf7,0x7c17,0x7c0d,0x7bf6,0x7c23,
+0x7c27,0x7c2a,0x7c1f,0x7c37,0x7c2b,0x7c3d,0x7c4c,0x7c43,
+0x7c54,0x7c4f,0x7c40,0x7c50,0x7c58,0x7c5f,0x7c64,0x7c56,
+0x7c65,0x7c6c,0x7c75,0x7c83,0x7c90,0x7ca4,0x7cad,0x7ca2,
+0x7cab,0x7ca1,0x7ca8,0x7cb3,0x7cb2,0x7cb1,0x7cae,0x7cb9,
+0x7cbd,0x7cc0,0x7cc5,0x7cc2,0x7cd8,0x7cd2,0x7cdc,0x7ce2,
+0x9b3b,0x7cef,0x7cf2,0x7cf4,0x7cf6,0x7cfa,0x7d06, NONE,
+ NONE, NONE, NONE, NONE, NONE,0x7d02,0x7d1c,0x7d15,
+0x7d0a,0x7d45,0x7d4b,0x7d2e,0x7d32,0x7d3f,0x7d35,0x7d46,
+0x7d73,0x7d56,0x7d4e,0x7d72,0x7d68,0x7d6e,0x7d4f,0x7d63,
+0x7d93,0x7d89,0x7d5b,0x7d8f,0x7d7d,0x7d9b,0x7dba,0x7dae,
+0x7da3,0x7db5,0x7dc7,0x7dbd,0x7dab,0x7e3d,0x7da2,0x7daf,
+0x7ddc,0x7db8,0x7d9f,0x7db0,0x7dd8,0x7ddd,0x7de4,0x7dde,
+0x7dfb,0x7df2,0x7de1,0x7e05,0x7e0a,0x7e23,0x7e21,0x7e12,
+0x7e31,0x7e1f,0x7e09,0x7e0b,0x7e22,0x7e46,0x7e66,0x7e3b,
+0x7e35,0x7e39,0x7e43,0x7e37,0x7e32,0x7e3a,0x7e67,0x7e5d,
+0x7e56,0x7e5e,0x7e59,0x7e5a,0x7e79,0x7e6a,0x7e69,0x7e7c,
+0x7e7b,0x7e83,0x7dd5,0x7e7d,0x8fae,0x7e7f,0x7e88,0x7e89,
+0x7e8c,0x7e92,0x7e90,0x7e93,0x7e94,0x7e96,0x7e8e,0x7e9b,
+0x7e9c,0x7f38,0x7f3a, NONE, NONE, NONE, NONE, NONE,
+ NONE,0x7f45,0x7f4c,0x7f4d,0x7f4e,0x7f50,0x7f51,0x7f55,
+0x7f54,0x7f58,0x7f5f,0x7f60,0x7f68,0x7f69,0x7f67,0x7f78,
+0x7f82,0x7f86,0x7f83,0x7f88,0x7f87,0x7f8c,0x7f94,0x7f9e,
+0x7f9d,0x7f9a,0x7fa3,0x7faf,0x7fb2,0x7fb9,0x7fae,0x7fb6,
+0x7fb8,0x8b71,0x7fc5,0x7fc6,0x7fca,0x7fd5,0x7fd4,0x7fe1,
+0x7fe6,0x7fe9,0x7ff3,0x7ff9,0x98dc,0x8006,0x8004,0x800b,
+0x8012,0x8018,0x8019,0x801c,0x8021,0x8028,0x803f,0x803b,
+0x804a,0x8046,0x8052,0x8058,0x805a,0x805f,0x8062,0x8068,
+0x8073,0x8072,0x8070,0x8076,0x8079,0x807d,0x807f,0x8084,
+0x8086,0x8085,0x809b,0x8093,0x809a,0x80ad,0x5190,0x80ac,
+0x80db,0x80e5,0x80d9,0x80dd,0x80c4,0x80da,0x80d6,0x8109,
+0x80ef,0x80f1,0x811b,0x8129,0x8123,0x812f,0x814b, NONE,
+ NONE, NONE, NONE, NONE, NONE,0x968b,0x8146,0x813e,
+0x8153,0x8151,0x80fc,0x8171,0x816e,0x8165,0x8166,0x8174,
+0x8183,0x8188,0x818a,0x8180,0x8182,0x81a0,0x8195,0x81a4,
+0x81a3,0x815f,0x8193,0x81a9,0x81b0,0x81b5,0x81be,0x81b8,
+0x81bd,0x81c0,0x81c2,0x81ba,0x81c9,0x81cd,0x81d1,0x81d9,
+0x81d8,0x81c8,0x81da,0x81df,0x81e0,0x81e7,0x81fa,0x81fb,
+0x81fe,0x8201,0x8202,0x8205,0x8207,0x820a,0x820d,0x8210,
+0x8216,0x8229,0x822b,0x8238,0x8233,0x8240,0x8259,0x8258,
+0x825d,0x825a,0x825f,0x8264,0x8262,0x8268,0x826a,0x826b,
+0x822e,0x8271,0x8277,0x8278,0x827e,0x828d,0x8292,0x82ab,
+0x829f,0x82bb,0x82ac,0x82e1,0x82e3,0x82df,0x82d2,0x82f4,
+0x82f3,0x82fa,0x8393,0x8303,0x82fb,0x82f9,0x82de,0x8306,
+0x82dc,0x8309,0x82d9, NONE, NONE, NONE, NONE, NONE,
+ NONE,0x8335,0x8334,0x8316,0x8332,0x8331,0x8340,0x8339,
+0x8350,0x8345,0x832f,0x832b,0x8317,0x8318,0x8385,0x839a,
+0x83aa,0x839f,0x83a2,0x8396,0x8323,0x838e,0x8387,0x838a,
+0x837c,0x83b5,0x8373,0x8375,0x83a0,0x8389,0x83a8,0x83f4,
+0x8413,0x83eb,0x83ce,0x83fd,0x8403,0x83d8,0x840b,0x83c1,
+0x83f7,0x8407,0x83e0,0x83f2,0x840d,0x8422,0x8420,0x83bd,
+0x8438,0x8506,0x83fb,0x846d,0x842a,0x843c,0x855a,0x8484,
+0x8477,0x846b,0x84ad,0x846e,0x8482,0x8469,0x8446,0x842c,
+0x846f,0x8479,0x8435,0x84ca,0x8462,0x84b9,0x84bf,0x849f,
+0x84d9,0x84cd,0x84bb,0x84da,0x84d0,0x84c1,0x84c6,0x84d6,
+0x84a1,0x8521,0x84ff,0x84f4,0x8517,0x8518,0x852c,0x851f,
+0x8515,0x8514,0x84fc,0x8540,0x8563,0x8558,0x8548, NONE,
+ NONE, NONE, NONE, NONE, NONE,0x8541,0x8602,0x854b,
+0x8555,0x8580,0x85a4,0x8588,0x8591,0x858a,0x85a8,0x856d,
+0x8594,0x859b,0x85ea,0x8587,0x859c,0x8577,0x857e,0x8590,
+0x85c9,0x85ba,0x85cf,0x85b9,0x85d0,0x85d5,0x85dd,0x85e5,
+0x85dc,0x85f9,0x860a,0x8613,0x860b,0x85fe,0x85fa,0x8606,
+0x8622,0x861a,0x8630,0x863f,0x864d,0x4e55,0x8654,0x865f,
+0x8667,0x8671,0x8693,0x86a3,0x86a9,0x86aa,0x868b,0x868c,
+0x86b6,0x86af,0x86c4,0x86c6,0x86b0,0x86c9,0x8823,0x86ab,
+0x86d4,0x86de,0x86e9,0x86ec,0x86df,0x86db,0x86ef,0x8712,
+0x8706,0x8708,0x8700,0x8703,0x86fb,0x8711,0x8709,0x870d,
+0x86f9,0x870a,0x8734,0x873f,0x8737,0x873b,0x8725,0x8729,
+0x871a,0x8760,0x875f,0x8778,0x874c,0x874e,0x8774,0x8757,
+0x8768,0x876e,0x8759, NONE, NONE, NONE, NONE, NONE,
+ NONE,0x8753,0x8763,0x876a,0x8805,0x87a2,0x879f,0x8782,
+0x87af,0x87cb,0x87bd,0x87c0,0x87d0,0x96d6,0x87ab,0x87c4,
+0x87b3,0x87c7,0x87c6,0x87bb,0x87ef,0x87f2,0x87e0,0x880f,
+0x880d,0x87fe,0x87f6,0x87f7,0x880e,0x87d2,0x8811,0x8816,
+0x8815,0x8822,0x8821,0x8831,0x8836,0x8839,0x8827,0x883b,
+0x8844,0x8842,0x8852,0x8859,0x885e,0x8862,0x886b,0x8881,
+0x887e,0x889e,0x8875,0x887d,0x88b5,0x8872,0x8882,0x8897,
+0x8892,0x88ae,0x8899,0x88a2,0x888d,0x88a4,0x88b0,0x88bf,
+0x88b1,0x88c3,0x88c4,0x88d4,0x88d8,0x88d9,0x88dd,0x88f9,
+0x8902,0x88fc,0x88f4,0x88e8,0x88f2,0x8904,0x890c,0x890a,
+0x8913,0x8943,0x891e,0x8925,0x892a,0x892b,0x8941,0x8944,
+0x893b,0x8936,0x8938,0x894c,0x891d,0x8960,0x895e, NONE,
+ NONE, NONE, NONE, NONE, NONE,0x8966,0x8964,0x896d,
+0x896a,0x896f,0x8974,0x8977,0x897e,0x8983,0x8988,0x898a,
+0x8993,0x8998,0x89a1,0x89a9,0x89a6,0x89ac,0x89af,0x89b2,
+0x89ba,0x89bd,0x89bf,0x89c0,0x89da,0x89dc,0x89dd,0x89e7,
+0x89f4,0x89f8,0x8a03,0x8a16,0x8a10,0x8a0c,0x8a1b,0x8a1d,
+0x8a25,0x8a36,0x8a41,0x8a5b,0x8a52,0x8a46,0x8a48,0x8a7c,
+0x8a6d,0x8a6c,0x8a62,0x8a85,0x8a82,0x8a84,0x8aa8,0x8aa1,
+0x8a91,0x8aa5,0x8aa6,0x8a9a,0x8aa3,0x8ac4,0x8acd,0x8ac2,
+0x8ada,0x8aeb,0x8af3,0x8ae7,0x8ae4,0x8af1,0x8b14,0x8ae0,
+0x8ae2,0x8af7,0x8ade,0x8adb,0x8b0c,0x8b07,0x8b1a,0x8ae1,
+0x8b16,0x8b10,0x8b17,0x8b20,0x8b33,0x97ab,0x8b26,0x8b2b,
+0x8b3e,0x8b28,0x8b41,0x8b4c,0x8b4f,0x8b4e,0x8b49,0x8b56,
+0x8b5b,0x8b5a,0x8b6b, NONE, NONE, NONE, NONE, NONE,
+ NONE,0x8b5f,0x8b6c,0x8b6f,0x8b74,0x8b7d,0x8b80,0x8b8c,
+0x8b8e,0x8b92,0x8b93,0x8b96,0x8b99,0x8b9a,0x8c3a,0x8c41,
+0x8c3f,0x8c48,0x8c4c,0x8c4e,0x8c50,0x8c55,0x8c62,0x8c6c,
+0x8c78,0x8c7a,0x8c82,0x8c89,0x8c85,0x8c8a,0x8c8d,0x8c8e,
+0x8c94,0x8c7c,0x8c98,0x621d,0x8cad,0x8caa,0x8cbd,0x8cb2,
+0x8cb3,0x8cae,0x8cb6,0x8cc8,0x8cc1,0x8ce4,0x8ce3,0x8cda,
+0x8cfd,0x8cfa,0x8cfb,0x8d04,0x8d05,0x8d0a,0x8d07,0x8d0f,
+0x8d0d,0x8d10,0x9f4e,0x8d13,0x8ccd,0x8d14,0x8d16,0x8d67,
+0x8d6d,0x8d71,0x8d73,0x8d81,0x8d99,0x8dc2,0x8dbe,0x8dba,
+0x8dcf,0x8dda,0x8dd6,0x8dcc,0x8ddb,0x8dcb,0x8dea,0x8deb,
+0x8ddf,0x8de3,0x8dfc,0x8e08,0x8e09,0x8dff,0x8e1d,0x8e1e,
+0x8e10,0x8e1f,0x8e42,0x8e35,0x8e30,0x8e34,0x8e4a, NONE,
+ NONE, NONE, NONE, NONE, NONE,0x8e47,0x8e49,0x8e4c,
+0x8e50,0x8e48,0x8e59,0x8e64,0x8e60,0x8e2a,0x8e63,0x8e55,
+0x8e76,0x8e72,0x8e7c,0x8e81,0x8e87,0x8e85,0x8e84,0x8e8b,
+0x8e8a,0x8e93,0x8e91,0x8e94,0x8e99,0x8eaa,0x8ea1,0x8eac,
+0x8eb0,0x8ec6,0x8eb1,0x8ebe,0x8ec5,0x8ec8,0x8ecb,0x8edb,
+0x8ee3,0x8efc,0x8efb,0x8eeb,0x8efe,0x8f0a,0x8f05,0x8f15,
+0x8f12,0x8f19,0x8f13,0x8f1c,0x8f1f,0x8f1b,0x8f0c,0x8f26,
+0x8f33,0x8f3b,0x8f39,0x8f45,0x8f42,0x8f3e,0x8f4c,0x8f49,
+0x8f46,0x8f4e,0x8f57,0x8f5c,0x8f62,0x8f63,0x8f64,0x8f9c,
+0x8f9f,0x8fa3,0x8fad,0x8faf,0x8fb7,0x8fda,0x8fe5,0x8fe2,
+0x8fea,0x8fef,0x9087,0x8ff4,0x9005,0x8ff9,0x8ffa,0x9011,
+0x9015,0x9021,0x900d,0x901e,0x9016,0x900b,0x9027,0x9036,
+0x9035,0x9039,0x8ff8, NONE, NONE, NONE, NONE, NONE,
+ NONE,0x904f,0x9050,0x9051,0x9052,0x900e,0x9049,0x903e,
+0x9056,0x9058,0x905e,0x9068,0x906f,0x9076,0x96a8,0x9072,
+0x9082,0x907d,0x9081,0x9080,0x908a,0x9089,0x908f,0x90a8,
+0x90af,0x90b1,0x90b5,0x90e2,0x90e4,0x6248,0x90db,0x9102,
+0x9112,0x9119,0x9132,0x9130,0x914a,0x9156,0x9158,0x9163,
+0x9165,0x9169,0x9173,0x9172,0x918b,0x9189,0x9182,0x91a2,
+0x91ab,0x91af,0x91aa,0x91b5,0x91b4,0x91ba,0x91c0,0x91c1,
+0x91c9,0x91cb,0x91d0,0x91d6,0x91df,0x91e1,0x91db,0x91fc,
+0x91f5,0x91f6,0x921e,0x91ff,0x9214,0x922c,0x9215,0x9211,
+0x925e,0x9257,0x9245,0x9249,0x9264,0x9248,0x9295,0x923f,
+0x924b,0x9250,0x929c,0x9296,0x9293,0x929b,0x925a,0x92cf,
+0x92b9,0x92b7,0x92e9,0x930f,0x92fa,0x9344,0x932e, NONE,
+ NONE, NONE, NONE, NONE, NONE,0x9319,0x9322,0x931a,
+0x9323,0x933a,0x9335,0x933b,0x935c,0x9360,0x937c,0x936e,
+0x9356,0x93b0,0x93ac,0x93ad,0x9394,0x93b9,0x93d6,0x93d7,
+0x93e8,0x93e5,0x93d8,0x93c3,0x93dd,0x93d0,0x93c8,0x93e4,
+0x941a,0x9414,0x9413,0x9403,0x9407,0x9410,0x9436,0x942b,
+0x9435,0x9421,0x943a,0x9441,0x9452,0x9444,0x945b,0x9460,
+0x9462,0x945e,0x946a,0x9229,0x9470,0x9475,0x9477,0x947d,
+0x945a,0x947c,0x947e,0x9481,0x947f,0x9582,0x9587,0x958a,
+0x9594,0x9596,0x9598,0x9599,0x95a0,0x95a8,0x95a7,0x95ad,
+0x95bc,0x95bb,0x95b9,0x95be,0x95ca,0x6ff6,0x95c3,0x95cd,
+0x95cc,0x95d5,0x95d4,0x95d6,0x95dc,0x95e1,0x95e5,0x95e2,
+0x9621,0x9628,0x962e,0x962f,0x9642,0x964c,0x964f,0x964b,
+0x9677,0x965c,0x965e, NONE, NONE, NONE, NONE, NONE,
+ NONE,0x965d,0x965f,0x9666,0x9672,0x966c,0x968d,0x9698,
+0x9695,0x9697,0x96aa,0x96a7,0x96b1,0x96b2,0x96b0,0x96b4,
+0x96b6,0x96b8,0x96b9,0x96ce,0x96cb,0x96c9,0x96cd,0x894d,
+0x96dc,0x970d,0x96d5,0x96f9,0x9704,0x9706,0x9708,0x9713,
+0x970e,0x9711,0x970f,0x9716,0x9719,0x9724,0x972a,0x9730,
+0x9739,0x973d,0x973e,0x9744,0x9746,0x9748,0x9742,0x9749,
+0x975c,0x9760,0x9764,0x9766,0x9768,0x52d2,0x976b,0x9771,
+0x9779,0x9785,0x977c,0x9781,0x977a,0x9786,0x978b,0x978f,
+0x9790,0x979c,0x97a8,0x97a6,0x97a3,0x97b3,0x97b4,0x97c3,
+0x97c6,0x97c8,0x97cb,0x97dc,0x97ed,0x9f4f,0x97f2,0x7adf,
+0x97f6,0x97f5,0x980f,0x980c,0x9838,0x9824,0x9821,0x9837,
+0x983d,0x9846,0x984f,0x984b,0x986b,0x986f,0x9870, NONE,
+ NONE, NONE, NONE, NONE, NONE,0x9871,0x9874,0x9873,
+0x98aa,0x98af,0x98b1,0x98b6,0x98c4,0x98c3,0x98c6,0x98e9,
+0x98eb,0x9903,0x9909,0x9912,0x9914,0x9918,0x9921,0x991d,
+0x991e,0x9924,0x9920,0x992c,0x992e,0x993d,0x993e,0x9942,
+0x9949,0x9945,0x9950,0x994b,0x9951,0x9952,0x994c,0x9955,
+0x9997,0x9998,0x99a5,0x99ad,0x99ae,0x99bc,0x99df,0x99db,
+0x99dd,0x99d8,0x99d1,0x99ed,0x99ee,0x99f1,0x99f2,0x99fb,
+0x99f8,0x9a01,0x9a0f,0x9a05,0x99e2,0x9a19,0x9a2b,0x9a37,
+0x9a45,0x9a42,0x9a40,0x9a43,0x9a3e,0x9a55,0x9a4d,0x9a5b,
+0x9a57,0x9a5f,0x9a62,0x9a65,0x9a64,0x9a69,0x9a6b,0x9a6a,
+0x9aad,0x9ab0,0x9abc,0x9ac0,0x9acf,0x9ad1,0x9ad3,0x9ad4,
+0x9ade,0x9adf,0x9ae2,0x9ae3,0x9ae6,0x9aef,0x9aeb,0x9aee,
+0x9af4,0x9af1,0x9af7, NONE, NONE, NONE, NONE, NONE,
+ NONE,0x9afb,0x9b06,0x9b18,0x9b1a,0x9b1f,0x9b22,0x9b23,
+0x9b25,0x9b27,0x9b28,0x9b29,0x9b2a,0x9b2e,0x9b2f,0x9b32,
+0x9b44,0x9b43,0x9b4f,0x9b4d,0x9b4e,0x9b51,0x9b58,0x9b74,
+0x9b93,0x9b83,0x9b91,0x9b96,0x9b97,0x9b9f,0x9ba0,0x9ba8,
+0x9bb4,0x9bc0,0x9bca,0x9bb9,0x9bc6,0x9bcf,0x9bd1,0x9bd2,
+0x9be3,0x9be2,0x9be4,0x9bd4,0x9be1,0x9c3a,0x9bf2,0x9bf1,
+0x9bf0,0x9c15,0x9c14,0x9c09,0x9c13,0x9c0c,0x9c06,0x9c08,
+0x9c12,0x9c0a,0x9c04,0x9c2e,0x9c1b,0x9c25,0x9c24,0x9c21,
+0x9c30,0x9c47,0x9c32,0x9c46,0x9c3e,0x9c5a,0x9c60,0x9c67,
+0x9c76,0x9c78,0x9ce7,0x9cec,0x9cf0,0x9d09,0x9d08,0x9ceb,
+0x9d03,0x9d06,0x9d2a,0x9d26,0x9daf,0x9d23,0x9d1f,0x9d44,
+0x9d15,0x9d12,0x9d41,0x9d3f,0x9d3e,0x9d46,0x9d48, NONE,
+ NONE, NONE, NONE, NONE, NONE,0x9d5d,0x9d5e,0x9d64,
+0x9d51,0x9d50,0x9d59,0x9d72,0x9d89,0x9d87,0x9dab,0x9d6f,
+0x9d7a,0x9d9a,0x9da4,0x9da9,0x9db2,0x9dc4,0x9dc1,0x9dbb,
+0x9db8,0x9dba,0x9dc6,0x9dcf,0x9dc2,0x9dd9,0x9dd3,0x9df8,
+0x9de6,0x9ded,0x9def,0x9dfd,0x9e1a,0x9e1b,0x9e1e,0x9e75,
+0x9e79,0x9e7d,0x9e81,0x9e88,0x9e8b,0x9e8c,0x9e92,0x9e95,
+0x9e91,0x9e9d,0x9ea5,0x9ea9,0x9eb8,0x9eaa,0x9ead,0x9761,
+0x9ecc,0x9ece,0x9ecf,0x9ed0,0x9ed4,0x9edc,0x9ede,0x9edd,
+0x9ee0,0x9ee5,0x9ee8,0x9eef,0x9ef4,0x9ef6,0x9ef7,0x9ef9,
+0x9efb,0x9efc,0x9efd,0x9f07,0x9f08,0x76b7,0x9f15,0x9f21,
+0x9f2c,0x9f3e,0x9f4a,0x9f52,0x9f54,0x9f63,0x9f5f,0x9f60,
+0x9f61,0x9f66,0x9f67,0x9f6c,0x9f6a,0x9f77,0x9f72,0x9f76,
+0x9f95,0x9f9c,0x9fa0, NONE, NONE, NONE, NONE, NONE,
+ NONE,0x582f,0x69c7,0x9059,0x7464,0x51dc,0x7199,
+};
diff --git a/src/cmd/dict/kuten.h b/src/cmd/dict/kuten.h
new file mode 100644
index 00000000..af59d833
--- /dev/null
+++ b/src/cmd/dict/kuten.h
@@ -0,0 +1,114 @@
+/*
+ following astonishing goo courtesy of kogure.
+*/
+/*
+ * MicroSoft Kanji Encoding (SJIS) Transformation
+ */
+
+/*
+ * void
+ * J2S(unsigned char *_h, unsigned char *_l)
+ * JIS X 208 to MS kanji transformation.
+ *
+ * Calling/Exit State:
+ * _h and _l should be in their valid range.
+ * No return value.
+ */
+#define J2S(_h, _l) { \
+ /* lower: 21-7e >> 40-9d,9e-fb >> 40-7e,(skip 7f),80-fc */ \
+ if (((_l) += (((_h)-- % 2) ? 0x1f : 0x7d)) > 0x7e) (_l)++; \
+ /* upper: 21-7e >> 81-af >> 81-9f,(skip a0-df),e0-ef */ \
+ if (((_h) = ((_h) / 2 + 0x71)) > 0x9f) (_h) += 0x40; \
+}
+
+/*
+ * void
+ * S2J(unsigned char *_h, unsigned char *_l)
+ * MS kanji to JIS X 208 transformation.
+ *
+ * Calling/Exit State:
+ * _h and _l should be in valid range.
+ * No return value.
+ */
+#define S2J(_h, _l) { \
+ /* lower: 40-7e,80-fc >> 21-5f,61-dd >> 21-7e,7f-dc */ \
+ if (((_l) -= 0x1f) > 0x60) (_l)--; \
+ /* upper: 81-9f,e0-ef >> 00-1e,5f-6e >> 00-2e >> 21-7d */ \
+ if (((_h) -= 0x81) > 0x5e) (_h) -= 0x40; (_h) *= 2, (_h) += 0x21; \
+ /* upper: ,21-7d >> ,22-7e ; lower: ,7f-dc >> ,21-7e */ \
+ if ((_l) > 0x7e) (_h)++, (_l) -= 0x5e; \
+}
+
+/*
+ * int
+ * ISJKANA(const unsigned char *_b)
+ * Tests given byte is in the range of JIS X 0201 katakana.
+ *
+ * Calling/Exit State:
+ * Returns 1 if it is, or 0 otherwise.
+ */
+#define ISJKANA(_b) (0xa0 <= (_b) && (_b) < 0xe0)
+
+/*
+ * int
+ * CANS2JH(const unsigned char *_h)
+ * Tests given byte is in the range of valid first byte of MS
+ * kanji code; either acts as a subroutine of CANS2J() macro
+ * or can be used to parse MS kanji encoded strings.
+ *
+ * Calling/Exit State:
+ * Returns 1 if it is, or 0 otherwise.
+ */
+#define CANS2JH(_h) ((0x81 <= (_h) && (_h) < 0xf0) && !ISJKANA(_h))
+
+/*
+ * int
+ * CANS2JL(const unsigned char *_l)
+ * Tests given byte is in the range of valid second byte of MS
+ * kanji code; acts as a subroutine of CANS2J() macro.
+ *
+ * Calling/Exit State:
+ * Returns 1 if it is, or 0 otherwise.
+ */
+#define CANS2JL(_l) (0x40 <= (_l) && (_l) < 0xfd && (_l) != 0x7f)
+
+/*
+ * int
+ * CANS2J(const unsigned char *_h, const unsinged char *_l)
+ * Tests given bytes form a MS kanji code point which can be
+ * transformed to a valid JIS X 208 code point.
+ *
+ * Calling/Exit State:
+ * Returns 1 if they are, or 0 otherwise.
+ */
+#define CANS2J(_h, _l) (CANS2JH(_h) && CANS2JL(_l))
+
+/*
+ * int
+ * CANJ2SB(const unsigned char *_b)
+ * Tests given bytes is in the range of valid 94 graphic
+ * character set; acts as a subroutine of CANJ2S() macro.
+ *
+ * Calling/Exit State:
+ * Returns 1 if it is, or 0 otherwise.
+ */
+#define CANJ2SB(_b) (0x21 <= (_b) && (_b) < 0x7f)
+
+/*
+ * int
+ * CANJ2S(const unsigned char *_h, const unsigned char *_l)
+ * Tests given bytes form valid JIS X 208 code points
+ * (which can be transformed to MS kanji).
+ *
+ * Calling/Exit State:
+ * Returns 1 if they are, or 0 otherwise.
+ */
+#define CANJ2S(_h, _l) (CANJ2SB(_h) && CANJ2SB(_l))
+
+#define JIS208MAX 8407
+#define GB2312MAX 8795
+#define BIG5MAX 13973
+
+extern Rune tabjis208[JIS208MAX]; /* runes indexed by kuten */
+extern Rune tabgb2312[GB2312MAX];
+extern Rune tabbig5[BIG5MAX];
diff --git a/src/cmd/dict/mkfile b/src/cmd/dict/mkfile
new file mode 100644
index 00000000..62b28be2
--- /dev/null
+++ b/src/cmd/dict/mkfile
@@ -0,0 +1,18 @@
+PLAN9=../../..
+<$PLAN9/src/mkhdr
+
+TARG=dict
+LFILES=oed.$O ahd.$O pcollins.$O pcollinsg.$O movie.$O slang.$O robert.$O\
+ world.$O jis208.$O gb2312.$O thesaurus.$O simple.$O pgw.$O
+
+OFILES=dict.$O\
+ $LFILES\
+ utils.$O
+
+HFILES=dict.h kuten.h
+
+LDFLAGS=$LDFLAGS -lbio -l9 -lregexp9 -lfmt -lutf
+<$PLAN9/src/mkone
+
+mkindex: mkindex.$O $LFILES utils.$O
+ $LD $LDFLAGS -o $target $prereq
diff --git a/src/cmd/dict/mkindex.c b/src/cmd/dict/mkindex.c
new file mode 100644
index 00000000..23024792
--- /dev/null
+++ b/src/cmd/dict/mkindex.c
@@ -0,0 +1,106 @@
+#include <u.h>
+#include <libc.h>
+#include <bio.h>
+#include "dict.h"
+
+/*
+ * Use this to start making an index for a new dictionary.
+ * Get the dictionary-specific nextoff and printentry(_,'h')
+ * commands working, add a record to the dicts[] array below,
+ * and run this program to get a list of offset,headword
+ * pairs
+ */
+Biobuf boutbuf;
+Biobuf *bdict;
+Biobuf *bout = &boutbuf;
+int linelen;
+int breaklen = 2000;
+int outinhibit;
+int debug;
+
+Dict *dict; /* current dictionary */
+
+Entry getentry(long);
+
+void
+main(int argc, char **argv)
+{
+ int i;
+ long a, ae;
+ char *p;
+ Entry e;
+
+ Binit(&boutbuf, 1, OWRITE);
+ dict = &dicts[0];
+ ARGBEGIN {
+ case 'd':
+ p = ARGF();
+ dict = 0;
+ if(p) {
+ for(i=0; dicts[i].name; i++)
+ if(strcmp(p, dicts[i].name)==0) {
+ dict = &dicts[i];
+ break;
+ }
+ }
+ if(!dict) {
+ err("unknown dictionary: %s", p);
+ exits("nodict");
+ }
+ break;
+ case 'D':
+ debug++;
+ break;
+ ARGEND }
+ USED(argc,argv);
+ bdict = Bopen(dict->path, OREAD);
+ ae = Bseek(bdict, 0, 2);
+ if(!bdict) {
+ err("can't open dictionary %s", dict->path);
+ exits("nodict");
+ }
+ for(a = 0; a < ae; a = (*dict->nextoff)(a+1)) {
+ linelen = 0;
+ e = getentry(a);
+ Bprint(bout, "%ld\t", a);
+ linelen = 4; /* only has to be approx right */
+ (*dict->printentry)(e, 'h');
+ }
+ exits(0);
+}
+
+Entry
+getentry(long b)
+{
+ long e, n, dtop;
+ static Entry ans;
+ static int anslen = 0;
+
+ e = (*dict->nextoff)(b+1);
+ ans.doff = b;
+ if(e < 0) {
+ dtop = Bseek(bdict, 0L, 2);
+ if(b < dtop) {
+ e = dtop;
+ } else {
+ err("couldn't seek to entry");
+ ans.start = 0;
+ ans.end = 0;
+ }
+ }
+ n = e-b;
+ if(n) {
+ if(n > anslen) {
+ ans.start = realloc(ans.start, n);
+ if(!ans.start) {
+ err("out of memory");
+ exits("nomem");
+ }
+ anslen = n;
+ }
+ Bseek(bdict, b, 0);
+ n = Bread(bdict, ans.start, n);
+ ans.end = ans.start + n;
+ }
+ return ans;
+}
diff --git a/src/cmd/dict/movie.c b/src/cmd/dict/movie.c
new file mode 100644
index 00000000..f1042fd6
--- /dev/null
+++ b/src/cmd/dict/movie.c
@@ -0,0 +1,328 @@
+#include <u.h>
+#include <libc.h>
+#include <bio.h>
+#include "dict.h"
+
+/* Possible tags */
+enum {
+ BEG, /* beginning of entry */
+ AB, /* abstract */
+ AN, /* database serial number */
+ AS, /* author (one at a time) */
+ AU, /* all authors */
+ AW, /* award_awardee */
+ BW, /* bw or c */
+ CA, /* cast: character_actor */
+ CN, /* cinematography */
+ CO, /* country */
+ CR, /* miscellaneous job_name */
+ DE, /* topic keyword */
+ DR, /* director */
+ ED, /* editor */
+ MP, /* MPAA rating (R, PG, etc.) */
+ NT, /* note */
+ PR, /* producer and for ...*/
+ PS, /* producer (repeats info in PR) */
+ RA, /* rating (letter) */
+ RD, /* release date */
+ RT, /* running time */
+ RV, /* review citation */
+ ST, /* production or release company (repeats info in PR) */
+ TI, /* title[; original foreign title] */
+ TX, /* paragraph of descriptive text */
+ VD, /* video information (format_time_company; or "Not Avail.") */
+ NTAG /* number of tags */
+};
+
+/* Assoc tables must be sorted on first field */
+
+static char *tagtab[] = {
+[BEG] "$$",
+[AB] "AB",
+[AN] "AN",
+[AS] "AS",
+[AU] "AU",
+[AW] "AW",
+[BW] "BW",
+[CA] "CA",
+[CN] "CN",
+[CO] "CO",
+[CR] "CR",
+[DE] "DE",
+[DR] "DR",
+[ED] "ED",
+[MP] "MP",
+[NT] "NT",
+[PR] "PR",
+[PS] "PS",
+[RA] "RA",
+[RD] "RD",
+[RT] "RT",
+[RV] "RV",
+[ST] "ST",
+[TI] "TI",
+[TX] "TX",
+[VD] "VD",
+};
+
+static char *mget(int, char *, char *, char **);
+#if 0
+static void moutall(int, char *, char *);
+#endif
+static void moutall2(int, char *, char *);
+
+void
+movieprintentry(Entry ent, int cmd)
+{
+ char *p, *e, *ps, *pe, *pn;
+ int n;
+
+ ps = ent.start;
+ pe = ent.end;
+ if(cmd == 'r') {
+ Bwrite(bout, ps, pe-ps);
+ return;
+ }
+ p = mget(TI, ps, pe, &e);
+ if(p) {
+ outpiece(p, e);
+ outnl(0);
+ }
+ if(cmd == 'h')
+ return;
+ outnl(2);
+ n = 0;
+ p = mget(RD, ps, pe, &e);
+ if(p) {
+ outchars("Released: ");
+ outpiece(p, e);
+ n++;
+ }
+ p = mget(CO, ps, pe, &e);
+ if(p) {
+ if(n)
+ outchars(", ");
+ outpiece(p, e);
+ n++;
+ }
+ p = mget(RT, ps, pe, &e);
+ if(p) {
+ if(n)
+ outchars(", ");
+ outchars("Running time: ");
+ outpiece(p, e);
+ n++;
+ }
+ p = mget(MP, ps, pe, &e);
+ if(p) {
+ if(n)
+ outchars(", ");
+ outpiece(p, e);
+ n++;
+ }
+ p = mget(BW, ps, pe, &e);
+ if(p) {
+ if(n)
+ outchars(", ");
+ if(*p == 'c' || *p == 'C')
+ outchars("Color");
+ else
+ outchars("B&W");
+ n++;
+ }
+ if(n) {
+ outchar('.');
+ outnl(1);
+ }
+ p = mget(VD, ps, pe, &e);
+ if(p) {
+ outchars("Video: ");
+ outpiece(p, e);
+ outnl(1);
+ }
+ p = mget(AU, ps, pe, &e);
+ if(p) {
+ outchars("By: ");
+ moutall2(AU, ps, pe);
+ outnl(1);
+ }
+ p = mget(DR, ps, pe, &e);
+ if(p) {
+ outchars("Director: ");
+ outpiece(p, e);
+ outnl(1);
+ }
+ p = mget(PR, ps, pe, &e);
+ if(p) {
+ outchars("Producer: ");
+ outpiece(p, e);
+ outnl(1);
+ }
+ p = mget(CN, ps, pe, &e);
+ if(p) {
+ outchars("Cinematograpy: ");
+ outpiece(p, e);
+ outnl(1);
+ }
+ p = mget(CR, ps, pe, &e);
+ if(p) {
+ outchars("Other Credits: ");
+ moutall2(CR, ps, pe);
+ }
+ outnl(2);
+ p = mget(CA, ps, pe, &e);
+ if(p) {
+ outchars("Cast: ");
+ moutall2(CA, ps, pe);
+ }
+ outnl(2);
+ p = mget(AW, ps, pe, &e);
+ if(p) {
+ outchars("Awards: ");
+ moutall2(AW, ps, pe);
+ outnl(2);
+ }
+ p = mget(NT, ps, pe, &e);
+ if(p) {
+ outpiece(p, e);
+ outnl(2);
+ }
+ p = mget(AB, ps, pe, &e);
+ if(p) {
+ outpiece(p, e);
+ outnl(2);
+ }
+ pn = ps;
+ n = 0;
+ while((p = mget(TX, pn, pe, &pn)) != 0) {
+ if(n++)
+ outnl(1);
+ outpiece(p, pn);
+ }
+ outnl(0);
+}
+
+long
+movienextoff(long fromoff)
+{
+ long a;
+ char *p;
+
+ a = Bseek(bdict, fromoff, 0);
+ if(a < 0)
+ return -1;
+ for(;;) {
+ p = Brdline(bdict, '\n');
+ if(!p)
+ break;
+ if(p[0] == '$' && p[1] == '$')
+ return (Boffset(bdict)-Blinelen(bdict));
+ }
+ return -1;
+}
+
+void
+movieprintkey(void)
+{
+ Bprint(bout, "No key\n");
+}
+
+/*
+ * write a comma-separated list of all tag values between b and e
+ */
+#if 0
+static void
+moutall(int tag, char *b, char *e)
+{
+ char *p, *pn;
+ int n;
+
+ n = 0;
+ pn = b;
+ while((p = mget(tag, pn, e, &pn)) != 0) {
+ if(n++)
+ outchars(", ");
+ outpiece(p, pn);
+ }
+}
+#endif
+
+/*
+ * like moutall, but values are expected to have form:
+ * field1_field2
+ * and we are to output 'field2 (field1)' for each
+ * (sometimes field1 has underscores, so search from end)
+ */
+static void
+moutall2(int tag, char *b, char *e)
+{
+ char *p, *pn, *us, *q;
+ int n;
+
+ n = 0;
+ pn = b;
+ while((p = mget(tag, pn, e, &pn)) != 0) {
+ if(n++)
+ outchars(", ");
+ us = 0;
+ for(q = pn-1; q >= p; q--)
+ if(*q == '_') {
+ us = q;
+ break;
+ }
+ if(us) {
+ /*
+ * Hack to fix cast list Himself/Herself
+ */
+ if(strncmp(us+1, "Himself", 7) == 0 ||
+ strncmp(us+1, "Herself", 7) == 0) {
+ outpiece(p, us);
+ outchars(" (");
+ outpiece(us+1, pn);
+ outchar(')');
+ } else {
+ outpiece(us+1, pn);
+ outchars(" (");
+ outpiece(p, us);
+ outchar(')');
+ }
+ } else {
+ outpiece(p, pn);
+ }
+ }
+}
+
+/*
+ * Starting from b, find next line beginning with tagtab[tag].
+ * Don't go past e, but assume *e==0.
+ * Return pointer to beginning of value (after tag), and set
+ * eptr to point at newline that ends the value
+ */
+static char *
+mget(int tag, char *b, char *e, char **eptr)
+{
+ char *p, *t, *ans;
+
+ if(tag < 0 || tag >= NTAG)
+ return 0;
+ t = tagtab[tag];
+ ans = 0;
+ for(p = b;;) {
+ p = strchr(p, '\n');
+ if(!p || ++p >= e) {
+ if(ans)
+ *eptr = e-1;
+ break;
+ }
+ if(!ans) {
+ if(p[0] == t[0] && p[1] == t[1])
+ ans = p+3;
+ } else {
+ if(p[0] != ' ') {
+ *eptr = p-1;
+ break;
+ }
+ }
+ }
+ return ans;
+}
diff --git a/src/cmd/dict/oed.c b/src/cmd/dict/oed.c
new file mode 100644
index 00000000..868eb486
--- /dev/null
+++ b/src/cmd/dict/oed.c
@@ -0,0 +1,1425 @@
+#include <u.h>
+#include <libc.h>
+#include <bio.h>
+#include "dict.h"
+
+enum {
+ Buflen=1000,
+ Maxaux=5,
+};
+
+/* Possible tags */
+enum {
+ A, /* author in quote (small caps) */
+ B, /* bold */
+ Ba, /* author inside bib */
+ Bch, /* builtup chem component */
+ Bib, /* surrounds word 'in' for bibliographic ref */
+ Bl, /* bold */
+ Bo, /* bond over */
+ Bu, /* bond under */
+ Cb, /* ? block of stuff (indent) */
+ Cf, /* cross ref to another entry (italics) */
+ Chem, /* chemistry formula */
+ Co, /* over (preceding sum, integral, etc.) */
+ Col, /* column of table (aux just may be r) */
+ Cu, /* under (preceding sum, integral, etc.) */
+ Dat, /* date */
+ Db, /* def block? indent */
+ Dn, /* denominator of fraction */
+ E, /* main entry */
+ Ed, /* editor's comments (in [...]) */
+ Etym, /* etymology (in [...]) */
+ Fq, /* frequency count (superscript) */
+ Form, /* formula */
+ Fr, /* fraction (contains <nu>, then <dn>) */
+ Gk, /* greek (transliteration) */
+ Gr, /* grammar? (e.g., around 'pa.' in 'pa. pple.') */
+ Hg, /* headword group */
+ Hm, /* homonym (superscript) */
+ Hw, /* headword (bold) */
+ I, /* italics */
+ Il, /* italic list? */
+ In, /* inferior (subscript) */
+ L, /* row of col of table */
+ La, /* status or usage label (italic) */
+ Lc, /* chapter/verse sort of thing for works */
+ N, /* note (smaller type) */
+ Nu, /* numerator of fraction */
+ Ov, /* needs overline */
+ P, /* paragraph (indent) */
+ Ph, /* pronunciation (transliteration) */
+ Pi, /* pile (frac without line) */
+ Pqp, /* subblock of quote */
+ Pr, /* pronunciation (in (...)) */
+ Ps, /* position (e.g., adv.) (italic) */
+ Pt, /* part (in lc) */
+ Q, /* quote in quote block */
+ Qd, /* quote date (bold) */
+ Qig, /* quote number (greek) */
+ Qla, /* status or usage label in quote (italic) */
+ Qp, /* quote block (small type, indent) */
+ Qsn, /* quote number */
+ Qt, /* quote words */
+ R, /* roman type style */
+ Rx, /* relative cross reference (e.g., next) */
+ S, /* another form? (italic) */
+ S0, /* sense (sometimes surrounds several sx's) */
+ S1, /* sense (aux num: indented bold letter) */
+ S2, /* sense (aux num: indented bold capital rom num) */
+ S3, /* sense (aux num: indented number of asterisks) */
+ S4, /* sense (aux num: indented bold number) */
+ S5, /* sense (aux num: indented number of asterisks) */
+ S6, /* subsense (aux num: bold letter) */
+ S7a, /* subsense (aux num: letter) */
+ S7n, /* subsense (aux num: roman numeral) */
+ Sc, /* small caps */
+ Sgk, /* subsense (aux num: transliterated greek) */
+ Sn, /* sense of subdefinition (aux num: roman letter) */
+ Ss, /* sans serif */
+ Ssb, /* sans serif bold */
+ Ssi, /* sans serif italic */
+ Su, /* superior (superscript) */
+ Sub, /* subdefinition */
+ Table, /* table (aux cols=number of columns) */
+ Tt, /* title? (italics) */
+ Vd, /* numeric label for variant form */
+ Ve, /* variant entry */
+ Vf, /* variant form (light bold) */
+ Vfl, /* list of vf's (starts with Also or Forms) */
+ W, /* work (e.g., Beowulf) (italics) */
+ X, /* cross reference to main word (small caps) */
+ Xd, /* cross reference to quotation by date */
+ Xi, /* internal cross reference ? (italic) */
+ Xid, /* cross reference identifer, in quote ? */
+ Xs, /* cross reference sense (lower number) */
+ Xr, /* list of x's */
+ Ntag /* end of tags */
+};
+
+/* Assoc tables must be sorted on first field */
+
+static Assoc tagtab[] = {
+ {"a", A},
+ {"b", B},
+ {"ba", Ba},
+ {"bch", Bch},
+ {"bib", Bib},
+ {"bl", Bl},
+ {"bo", Bo},
+ {"bu", Bu},
+ {"cb", Cb},
+ {"cf", Cf},
+ {"chem", Chem},
+ {"co", Co},
+ {"col", Col},
+ {"cu", Cu},
+ {"dat", Dat},
+ {"db", Db},
+ {"dn", Dn},
+ {"e", E},
+ {"ed", Ed},
+ {"et", Etym},
+ {"etym", Etym},
+ {"form", Form},
+ {"fq", Fq},
+ {"fr", Fr},
+ {"frac", Fr},
+ {"gk", Gk},
+ {"gr", Gr},
+ {"hg", Hg},
+ {"hm", Hm},
+ {"hw", Hw},
+ {"i", I},
+ {"il", Il},
+ {"in", In},
+ {"l", L},
+ {"la", La},
+ {"lc", Lc},
+ {"n", N},
+ {"nu", Nu},
+ {"ov", Ov},
+ {"p", P},
+ {"ph", Ph},
+ {"pi", Pi},
+ {"pqp", Pqp},
+ {"pr", Pr},
+ {"ps", Ps},
+ {"pt", Pt},
+ {"q", Q},
+ {"qd", Qd},
+ {"qig", Qig},
+ {"qla", Qla},
+ {"qp", Qp},
+ {"qsn", Qsn},
+ {"qt", Qt},
+ {"r", R},
+ {"rx", Rx},
+ {"s", S},
+ {"s0", S0},
+ {"s1", S1},
+ {"s2", S2},
+ {"s3", S3},
+ {"s4", S4},
+ {"s5", S5},
+ {"s6", S6},
+ {"s7a", S7a},
+ {"s7n", S7n},
+ {"sc", Sc},
+ {"sgk", Sgk},
+ {"sn", Sn},
+ {"ss", Ss,},
+ {"ssb", Ssb},
+ {"ssi", Ssi},
+ {"su", Su},
+ {"sub", Sub},
+ {"table", Table},
+ {"tt", Tt},
+ {"vd", Vd},
+ {"ve", Ve},
+ {"vf", Vf},
+ {"vfl", Vfl},
+ {"w", W},
+ {"x", X},
+ {"xd", Xd},
+ {"xi", Xi},
+ {"xid", Xid},
+ {"xr", Xr},
+ {"xs", Xs},
+};
+
+/* Possible tag auxilliary info */
+enum {
+ Cols, /* number of columns in a table */
+ Num, /* letter or number, for a sense */
+ St, /* status (e.g., obs) */
+ Naux
+};
+
+static Assoc auxtab[] = {
+ {"cols", Cols},
+ {"num", Num},
+ {"st", St}
+};
+
+static Assoc spectab[] = {
+ {"3on4", 0xbe},
+ {"Aacu", 0xc1},
+ {"Aang", 0xc5},
+ {"Abarab", 0x100},
+ {"Acirc", 0xc2},
+ {"Ae", 0xc6},
+ {"Agrave", 0xc0},
+ {"Alpha", 0x391},
+ {"Amac", 0x100},
+ {"Asg", 0x1b7}, /* Unicyle. Cf "Sake" */
+ {"Auml", 0xc4},
+ {"Beta", 0x392},
+ {"Cced", 0xc7},
+ {"Chacek", 0x10c},
+ {"Chi", 0x3a7},
+ {"Chirho", 0x2627}, /* Chi Rho U+2627 */
+ {"Csigma", 0x3da},
+ {"Delta", 0x394},
+ {"Eacu", 0xc9},
+ {"Ecirc", 0xca},
+ {"Edh", 0xd0},
+ {"Epsilon", 0x395},
+ {"Eta", 0x397},
+ {"Gamma", 0x393},
+ {"Iacu", 0xcd},
+ {"Icirc", 0xce},
+ {"Imac", 0x12a},
+ {"Integ", 0x222b},
+ {"Iota", 0x399},
+ {"Kappa", 0x39a},
+ {"Koppa", 0x3de},
+ {"Lambda", 0x39b},
+ {"Lbar", 0x141},
+ {"Mu", 0x39c},
+ {"Naira", 0x4e}, /* should have bar through */
+ {"Nplus", 0x4e}, /* should have plus above */
+ {"Ntilde", 0xd1},
+ {"Nu", 0x39d},
+ {"Oacu", 0xd3},
+ {"Obar", 0xd8},
+ {"Ocirc", 0xd4},
+ {"Oe", 0x152},
+ {"Omega", 0x3a9},
+ {"Omicron", 0x39f},
+ {"Ouml", 0xd6},
+ {"Phi", 0x3a6},
+ {"Pi", 0x3a0},
+ {"Psi", 0x3a8},
+ {"Rho", 0x3a1},
+ {"Sacu", 0x15a},
+ {"Sigma", 0x3a3},
+ {"Summ", 0x2211},
+ {"Tau", 0x3a4},
+ {"Th", 0xde},
+ {"Theta", 0x398},
+ {"Tse", 0x426},
+ {"Uacu", 0xda},
+ {"Ucirc", 0xdb},
+ {"Upsilon", 0x3a5},
+ {"Uuml", 0xdc},
+ {"Wyn", 0x1bf}, /* wynn U+01BF */
+ {"Xi", 0x39e},
+ {"Ygh", 0x1b7}, /* Yogh U+01B7 */
+ {"Zeta", 0x396},
+ {"Zh", 0x1b7}, /* looks like Yogh. Cf "Sake" */
+ {"a", 0x61}, /* ante */
+ {"aacu", 0xe1},
+ {"aang", 0xe5},
+ {"aasper", MAAS},
+ {"abreve", 0x103},
+ {"acirc", 0xe2},
+ {"acu", LACU},
+ {"ae", 0xe6},
+ {"agrave", 0xe0},
+ {"ahook", 0x105},
+ {"alenis", MALN},
+ {"alpha", 0x3b1},
+ {"amac", 0x101},
+ {"amp", 0x26},
+ {"and", MAND},
+ {"ang", LRNG},
+ {"angle", 0x2220},
+ {"ankh", 0x2625}, /* ankh U+2625 */
+ {"ante", 0x61}, /* before (year) */
+ {"aonq", MAOQ},
+ {"appreq", 0x2243},
+ {"aquar", 0x2652},
+ {"arDadfull", 0x636}, /* Dad U+0636 */
+ {"arHa", 0x62d}, /* haa U+062D */
+ {"arTa", 0x62a}, /* taa U+062A */
+ {"arain", 0x639}, /* ain U+0639 */
+ {"arainfull", 0x639}, /* ain U+0639 */
+ {"aralif", 0x627}, /* alef U+0627 */
+ {"arba", 0x628}, /* baa U+0628 */
+ {"arha", 0x647}, /* ha U+0647 */
+ {"aries", 0x2648},
+ {"arnun", 0x646}, /* noon U+0646 */
+ {"arnunfull", 0x646}, /* noon U+0646 */
+ {"arpa", 0x647}, /* ha U+0647 */
+ {"arqoph", 0x642}, /* qaf U+0642 */
+ {"arshinfull", 0x634}, /* sheen U+0634 */
+ {"arta", 0x62a}, /* taa U+062A */
+ {"artafull", 0x62a}, /* taa U+062A */
+ {"artha", 0x62b}, /* thaa U+062B */
+ {"arwaw", 0x648}, /* waw U+0648 */
+ {"arya", 0x64a}, /* ya U+064A */
+ {"aryafull", 0x64a}, /* ya U+064A */
+ {"arzero", 0x660}, /* indic zero U+0660 */
+ {"asg", 0x292}, /* unicycle character. Cf "hallow" */
+ {"asper", LASP},
+ {"assert", 0x22a2},
+ {"astm", 0x2042}, /* asterism: should be upside down */
+ {"at", 0x40},
+ {"atilde", 0xe3},
+ {"auml", 0xe4},
+ {"ayin", 0x639}, /* arabic ain U+0639 */
+ {"b1", 0x2d}, /* single bond */
+ {"b2", 0x3d}, /* double bond */
+ {"b3", 0x2261}, /* triple bond */
+ {"bbar", 0x180}, /* b with bar U+0180 */
+ {"beta", 0x3b2},
+ {"bigobl", 0x2f},
+ {"blC", 0x43}, /* should be black letter */
+ {"blJ", 0x4a}, /* should be black letter */
+ {"blU", 0x55}, /* should be black letter */
+ {"blb", 0x62}, /* should be black letter */
+ {"blozenge", 0x25ca}, /* U+25CA; should be black */
+ {"bly", 0x79}, /* should be black letter */
+ {"bra", MBRA},
+ {"brbl", LBRB},
+ {"breve", LBRV},
+ {"bslash", L'\\'},
+ {"bsquare", 0x25a0}, /* black square U+25A0 */
+ {"btril", 0x25c0}, /* U+25C0 */
+ {"btrir", 0x25b6}, /* U+25B6 */
+ {"c", 0x63}, /* circa */
+ {"cab", 0x232a},
+ {"cacu", 0x107},
+ {"canc", 0x264b},
+ {"capr", 0x2651},
+ {"caret", 0x5e},
+ {"cb", 0x7d},
+ {"cbigb", 0x7d},
+ {"cbigpren", 0x29},
+ {"cbigsb", 0x5d},
+ {"cced", 0xe7},
+ {"cdil", LCED},
+ {"cdsb", 0x301b}, /* ]] U+301b */
+ {"cent", 0xa2},
+ {"chacek", 0x10d},
+ {"chi", 0x3c7},
+ {"circ", LRNG},
+ {"circa", 0x63}, /* about (year) */
+ {"circbl", 0x325}, /* ring below accent U+0325 */
+ {"circle", 0x25cb}, /* U+25CB */
+ {"circledot", 0x2299},
+ {"click", 0x296},
+ {"club", 0x2663},
+ {"comtime", 0x43},
+ {"conj", 0x260c},
+ {"cprt", 0xa9},
+ {"cq", '\''},
+ {"cqq", 0x201d},
+ {"cross", 0x2720}, /* maltese cross U+2720 */
+ {"crotchet", 0x2669},
+ {"csb", 0x5d},
+ {"ctilde", 0x63}, /* +tilde */
+ {"ctlig", MLCT},
+ {"cyra", 0x430},
+ {"cyre", 0x435},
+ {"cyrhard", 0x44a},
+ {"cyrjat", 0x463},
+ {"cyrm", 0x43c},
+ {"cyrn", 0x43d},
+ {"cyrr", 0x440},
+ {"cyrsoft", 0x44c},
+ {"cyrt", 0x442},
+ {"cyry", 0x44b},
+ {"dag", 0x2020},
+ {"dbar", 0x111},
+ {"dblar", 0x21cb},
+ {"dblgt", 0x226b},
+ {"dbllt", 0x226a},
+ {"dced", 0x64}, /* +cedilla */
+ {"dd", MDD},
+ {"ddag", 0x2021},
+ {"ddd", MDDD},
+ {"decr", 0x2193},
+ {"deg", 0xb0},
+ {"dele", 0x64}, /* should be dele */
+ {"delta", 0x3b4},
+ {"descnode", 0x260b}, /* descending node U+260B */
+ {"diamond", 0x2662},
+ {"digamma", 0x3dd},
+ {"div", 0xf7},
+ {"dlessi", 0x131},
+ {"dlessj1", 0x6a}, /* should be dotless */
+ {"dlessj2", 0x6a}, /* should be dotless */
+ {"dlessj3", 0x6a}, /* should be dotless */
+ {"dollar", 0x24},
+ {"dotab", LDOT},
+ {"dotbl", LDTB},
+ {"drachm", 0x292},
+ {"dubh", 0x2d},
+ {"eacu", 0xe9},
+ {"earth", 0x2641},
+ {"easper", MEAS},
+ {"ebreve", 0x115},
+ {"ecirc", 0xea},
+ {"edh", 0xf0},
+ {"egrave", 0xe8},
+ {"ehacek", 0x11b},
+ {"ehook", 0x119},
+ {"elem", 0x220a},
+ {"elenis", MELN},
+ {"em", 0x2014},
+ {"emac", 0x113},
+ {"emem", MEMM},
+ {"en", 0x2013},
+ {"epsilon", 0x3b5},
+ {"equil", 0x21cb},
+ {"ergo", 0x2234},
+ {"es", MES},
+ {"eszett", 0xdf},
+ {"eta", 0x3b7},
+ {"eth", 0xf0},
+ {"euml", 0xeb},
+ {"expon", 0x2191},
+ {"fact", 0x21},
+ {"fata", 0x251},
+ {"fatpara", 0xb6}, /* should have fatter, filled in bowl */
+ {"female", 0x2640},
+ {"ffilig", MLFFI},
+ {"fflig", MLFF},
+ {"ffllig", MLFFL},
+ {"filig", MLFI},
+ {"flat", 0x266d},
+ {"fllig", MLFL},
+ {"frE", 0x45}, /* should be curly */
+ {"frL", L'L'}, /* should be curly */
+ {"frR", 0x52}, /* should be curly */
+ {"frakB", 0x42}, /* should have fraktur style */
+ {"frakG", 0x47},
+ {"frakH", 0x48},
+ {"frakI", 0x49},
+ {"frakM", 0x4d},
+ {"frakU", 0x55},
+ {"frakX", 0x58},
+ {"frakY", 0x59},
+ {"frakh", 0x68},
+ {"frbl", LFRB},
+ {"frown", LFRN},
+ {"fs", 0x20},
+ {"fsigma", 0x3c2},
+ {"gAacu", 0xc1}, /* should be Α+acute */
+ {"gaacu", 0x3b1}, /* +acute */
+ {"gabreve", 0x3b1}, /* +breve */
+ {"gafrown", 0x3b1}, /* +frown */
+ {"gagrave", 0x3b1}, /* +grave */
+ {"gamac", 0x3b1}, /* +macron */
+ {"gamma", 0x3b3},
+ {"gauml", 0x3b1}, /* +umlaut */
+ {"ge", 0x2267},
+ {"geacu", 0x3b5}, /* +acute */
+ {"gegrave", 0x3b5}, /* +grave */
+ {"ghacu", 0x3b7}, /* +acute */
+ {"ghfrown", 0x3b7}, /* +frown */
+ {"ghgrave", 0x3b7}, /* +grave */
+ {"ghmac", 0x3b7}, /* +macron */
+ {"giacu", 0x3b9}, /* +acute */
+ {"gibreve", 0x3b9}, /* +breve */
+ {"gifrown", 0x3b9}, /* +frown */
+ {"gigrave", 0x3b9}, /* +grave */
+ {"gimac", 0x3b9}, /* +macron */
+ {"giuml", 0x3b9}, /* +umlaut */
+ {"glagjat", 0x467},
+ {"glots", 0x2c0},
+ {"goacu", 0x3bf}, /* +acute */
+ {"gobreve", 0x3bf}, /* +breve */
+ {"grave", LGRV},
+ {"gt", 0x3e},
+ {"guacu", 0x3c5}, /* +acute */
+ {"gufrown", 0x3c5}, /* +frown */
+ {"gugrave", 0x3c5}, /* +grave */
+ {"gumac", 0x3c5}, /* +macron */
+ {"guuml", 0x3c5}, /* +umlaut */
+ {"gwacu", 0x3c9}, /* +acute */
+ {"gwfrown", 0x3c9}, /* +frown */
+ {"gwgrave", 0x3c9}, /* +grave */
+ {"hacek", LHCK},
+ {"halft", 0x2308},
+ {"hash", 0x23},
+ {"hasper", MHAS},
+ {"hatpath", 0x5b2}, /* hataf patah U+05B2 */
+ {"hatqam", 0x5b3}, /* hataf qamats U+05B3 */
+ {"hatseg", 0x5b1}, /* hataf segol U+05B1 */
+ {"hbar", 0x127},
+ {"heart", 0x2661},
+ {"hebaleph", 0x5d0}, /* aleph U+05D0 */
+ {"hebayin", 0x5e2}, /* ayin U+05E2 */
+ {"hebbet", 0x5d1}, /* bet U+05D1 */
+ {"hebbeth", 0x5d1}, /* bet U+05D1 */
+ {"hebcheth", 0x5d7}, /* bet U+05D7 */
+ {"hebdaleth", 0x5d3}, /* dalet U+05D3 */
+ {"hebgimel", 0x5d2}, /* gimel U+05D2 */
+ {"hebhe", 0x5d4}, /* he U+05D4 */
+ {"hebkaph", 0x5db}, /* kaf U+05DB */
+ {"heblamed", 0x5dc}, /* lamed U+05DC */
+ {"hebmem", 0x5de}, /* mem U+05DE */
+ {"hebnun", 0x5e0}, /* nun U+05E0 */
+ {"hebnunfin", 0x5df}, /* final nun U+05DF */
+ {"hebpe", 0x5e4}, /* pe U+05E4 */
+ {"hebpedag", 0x5e3}, /* final pe? U+05E3 */
+ {"hebqoph", 0x5e7}, /* qof U+05E7 */
+ {"hebresh", 0x5e8}, /* resh U+05E8 */
+ {"hebshin", 0x5e9}, /* shin U+05E9 */
+ {"hebtav", 0x5ea}, /* tav U+05EA */
+ {"hebtsade", 0x5e6}, /* tsadi U+05E6 */
+ {"hebwaw", 0x5d5}, /* vav? U+05D5 */
+ {"hebyod", 0x5d9}, /* yod U+05D9 */
+ {"hebzayin", 0x5d6}, /* zayin U+05D6 */
+ {"hgz", 0x292}, /* ??? Cf "alet" */
+ {"hireq", 0x5b4}, /* U+05B4 */
+ {"hlenis", MHLN},
+ {"hook", LOGO},
+ {"horizE", 0x45}, /* should be on side */
+ {"horizP", 0x50}, /* should be on side */
+ {"horizS", 0x223d},
+ {"horizT", 0x22a3},
+ {"horizb", 0x7b}, /* should be underbrace */
+ {"ia", 0x3b1},
+ {"iacu", 0xed},
+ {"iasper", MIAS},
+ {"ib", 0x3b2},
+ {"ibar", 0x268},
+ {"ibreve", 0x12d},
+ {"icirc", 0xee},
+ {"id", 0x3b4},
+ {"ident", 0x2261},
+ {"ie", 0x3b5},
+ {"ifilig", MLFI},
+ {"ifflig", MLFF},
+ {"ig", 0x3b3},
+ {"igrave", 0xec},
+ {"ih", 0x3b7},
+ {"ii", 0x3b9},
+ {"ik", 0x3ba},
+ {"ilenis", MILN},
+ {"imac", 0x12b},
+ {"implies", 0x21d2},
+ {"index", 0x261e},
+ {"infin", 0x221e},
+ {"integ", 0x222b},
+ {"intsec", 0x2229},
+ {"invpri", 0x2cf},
+ {"iota", 0x3b9},
+ {"iq", 0x3c8},
+ {"istlig", MLST},
+ {"isub", 0x3f5}, /* iota below accent */
+ {"iuml", 0xef},
+ {"iz", 0x3b6},
+ {"jup", 0x2643},
+ {"kappa", 0x3ba},
+ {"koppa", 0x3df},
+ {"lambda", 0x3bb},
+ {"lar", 0x2190},
+ {"lbar", 0x142},
+ {"le", 0x2266},
+ {"lenis", LLEN},
+ {"leo", 0x264c},
+ {"lhalfbr", 0x2308},
+ {"lhshoe", 0x2283},
+ {"libra", 0x264e},
+ {"llswing", MLLS},
+ {"lm", 0x2d0},
+ {"logicand", 0x2227},
+ {"logicor", 0x2228},
+ {"longs", 0x283},
+ {"lrar", 0x2194},
+ {"lt", 0x3c},
+ {"ltappr", 0x227e},
+ {"ltflat", 0x2220},
+ {"lumlbl", 0x6c}, /* +umlaut below */
+ {"mac", LMAC},
+ {"male", 0x2642},
+ {"mc", 0x63}, /* should be raised */
+ {"merc", 0x263f}, /* mercury U+263F */
+ {"min", 0x2212},
+ {"moonfq", 0x263d}, /* first quarter moon U+263D */
+ {"moonlq", 0x263e}, /* last quarter moon U+263E */
+ {"msylab", 0x6d}, /* +sylab (ˌ) */
+ {"mu", 0x3bc},
+ {"nacu", 0x144},
+ {"natural", 0x266e},
+ {"neq", 0x2260},
+ {"nfacu", 0x2032},
+ {"nfasper", 0x2bd},
+ {"nfbreve", 0x2d8},
+ {"nfced", 0xb8},
+ {"nfcirc", 0x2c6},
+ {"nffrown", 0x2322},
+ {"nfgra", 0x2cb},
+ {"nfhacek", 0x2c7},
+ {"nfmac", 0xaf},
+ {"nftilde", 0x2dc},
+ {"nfuml", 0xa8},
+ {"ng", 0x14b},
+ {"not", 0xac},
+ {"notelem", 0x2209},
+ {"ntilde", 0xf1},
+ {"nu", 0x3bd},
+ {"oab", 0x2329},
+ {"oacu", 0xf3},
+ {"oasper", MOAS},
+ {"ob", 0x7b},
+ {"obar", 0xf8},
+ {"obigb", 0x7b}, /* should be big */
+ {"obigpren", 0x28},
+ {"obigsb", 0x5b}, /* should be big */
+ {"obreve", 0x14f},
+ {"ocirc", 0xf4},
+ {"odsb", 0x301a}, /* [[ U+301A */
+ {"oe", 0x153},
+ {"oeamp", 0x26},
+ {"ograve", 0xf2},
+ {"ohook", 0x6f}, /* +hook */
+ {"olenis", MOLN},
+ {"omac", 0x14d},
+ {"omega", 0x3c9},
+ {"omicron", 0x3bf},
+ {"ope", 0x25b},
+ {"opp", 0x260d},
+ {"oq", 0x60},
+ {"oqq", 0x201c},
+ {"or", MOR},
+ {"osb", 0x5b},
+ {"otilde", 0xf5},
+ {"ouml", 0xf6},
+ {"ounce", 0x2125}, /* ounce U+2125 */
+ {"ovparen", 0x2322}, /* should be sideways ( */
+ {"p", 0x2032},
+ {"pa", 0x2202},
+ {"page", 0x50},
+ {"pall", 0x28e},
+ {"paln", 0x272},
+ {"par", PAR},
+ {"para", 0xb6},
+ {"pbar", 0x70}, /* +bar */
+ {"per", 0x2118}, /* per U+2118 */
+ {"phi", 0x3c6},
+ {"phi2", 0x3d5},
+ {"pi", 0x3c0},
+ {"pisces", 0x2653},
+ {"planck", 0x127},
+ {"plantinJ", 0x4a}, /* should be script */
+ {"pm", 0xb1},
+ {"pmil", 0x2030},
+ {"pp", 0x2033},
+ {"ppp", 0x2034},
+ {"prop", 0x221d},
+ {"psi", 0x3c8},
+ {"pstlg", 0xa3},
+ {"q", 0x3f}, /* should be raised */
+ {"qamets", 0x5b3}, /* U+05B3 */
+ {"quaver", 0x266a},
+ {"rar", 0x2192},
+ {"rasper", MRAS},
+ {"rdot", 0xb7},
+ {"recipe", 0x211e}, /* U+211E */
+ {"reg", 0xae},
+ {"revC", 0x186}, /* open O U+0186 */
+ {"reva", 0x252},
+ {"revc", 0x254},
+ {"revope", 0x25c},
+ {"revr", 0x279},
+ {"revsc", 0x2d2}, /* upside-down semicolon */
+ {"revv", 0x28c},
+ {"rfa", 0x6f}, /* +hook (Cf "goal") */
+ {"rhacek", 0x159},
+ {"rhalfbr", 0x2309},
+ {"rho", 0x3c1},
+ {"rhshoe", 0x2282},
+ {"rlenis", MRLN},
+ {"rsylab", 0x72}, /* +sylab */
+ {"runash", 0x46}, /* should be runic 'ash' */
+ {"rvow", 0x2d4},
+ {"sacu", 0x15b},
+ {"sagit", 0x2650},
+ {"sampi", 0x3e1},
+ {"saturn", 0x2644},
+ {"sced", 0x15f},
+ {"schwa", 0x259},
+ {"scorpio", 0x264f},
+ {"scrA", 0x41}, /* should be script */
+ {"scrC", 0x43},
+ {"scrE", 0x45},
+ {"scrF", 0x46},
+ {"scrI", 0x49},
+ {"scrJ", 0x4a},
+ {"scrL", L'L'},
+ {"scrO", 0x4f},
+ {"scrP", 0x50},
+ {"scrQ", 0x51},
+ {"scrS", 0x53},
+ {"scrT", 0x54},
+ {"scrb", 0x62},
+ {"scrd", 0x64},
+ {"scrh", 0x68},
+ {"scrl", 0x6c},
+ {"scruple", 0x2108}, /* U+2108 */
+ {"sdd", 0x2d0},
+ {"sect", 0xa7},
+ {"semE", 0x2203},
+ {"sh", 0x283},
+ {"shacek", 0x161},
+ {"sharp", 0x266f},
+ {"sheva", 0x5b0}, /* U+05B0 */
+ {"shti", 0x26a},
+ {"shtsyll", 0x222a},
+ {"shtu", 0x28a},
+ {"sidetri", 0x22b2},
+ {"sigma", 0x3c3},
+ {"since", 0x2235},
+ {"slge", 0x2265}, /* should have slanted line under */
+ {"slle", 0x2264}, /* should have slanted line under */
+ {"sm", 0x2c8},
+ {"smm", 0x2cc},
+ {"spade", 0x2660},
+ {"sqrt", 0x221a},
+ {"square", 0x25a1}, /* U+25A1 */
+ {"ssChi", 0x3a7}, /* should be sans serif */
+ {"ssIota", 0x399},
+ {"ssOmicron", 0x39f},
+ {"ssPi", 0x3a0},
+ {"ssRho", 0x3a1},
+ {"ssSigma", 0x3a3},
+ {"ssTau", 0x3a4},
+ {"star", 0x2a},
+ {"stlig", MLST},
+ {"sup2", 0x2072},
+ {"supgt", 0x2c3},
+ {"suplt", 0x2c2},
+ {"sur", 0x2b3},
+ {"swing", 0x223c},
+ {"tau", 0x3c4},
+ {"taur", 0x2649},
+ {"th", 0xfe},
+ {"thbar", 0xfe}, /* +bar */
+ {"theta", 0x3b8},
+ {"thinqm", 0x3f}, /* should be thinner */
+ {"tilde", LTIL},
+ {"times", 0xd7},
+ {"tri", 0x2206},
+ {"trli", 0x2016},
+ {"ts", 0x2009},
+ {"uacu", 0xfa},
+ {"uasper", MUAS},
+ {"ubar", 0x75}, /* +bar */
+ {"ubreve", 0x16d},
+ {"ucirc", 0xfb},
+ {"udA", 0x2200},
+ {"udT", 0x22a5},
+ {"uda", 0x250},
+ {"udh", 0x265},
+ {"udqm", 0xbf},
+ {"udpsi", 0x22d4},
+ {"udtr", 0x2207},
+ {"ugrave", 0xf9},
+ {"ulenis", MULN},
+ {"umac", 0x16b},
+ {"uml", LUML},
+ {"undl", 0x2cd}, /* underline accent */
+ {"union", 0x222a},
+ {"upsilon", 0x3c5},
+ {"uuml", 0xfc},
+ {"vavpath", 0x5d5}, /* vav U+05D5 (+patah) */
+ {"vavsheva", 0x5d5}, /* vav U+05D5 (+sheva) */
+ {"vb", 0x7c},
+ {"vddd", 0x22ee},
+ {"versicle2", 0x2123}, /* U+2123 */
+ {"vinc", 0xaf},
+ {"virgo", 0x264d},
+ {"vpal", 0x25f},
+ {"vvf", 0x263},
+ {"wasper", MWAS},
+ {"wavyeq", 0x2248},
+ {"wlenis", MWLN},
+ {"wyn", 0x1bf}, /* wynn U+01BF */
+ {"xi", 0x3be},
+ {"yacu", 0xfd},
+ {"ycirc", 0x177},
+ {"ygh", 0x292},
+ {"ymac", 0x79}, /* +macron */
+ {"yuml", 0xff},
+ {"zced", 0x7a}, /* +cedilla */
+ {"zeta", 0x3b6},
+ {"zh", 0x292},
+ {"zhacek", 0x17e},
+};
+/*
+ The following special characters don't have close enough
+ equivalents in Unicode, so aren't in the above table.
+ 22n 2^(2^n) Cf Fermat
+ 2on4 2/4
+ 3on8 3/8
+ Bantuo Bantu O. Cf Otshi-herero
+ Car C with circular arrow on top
+ albrtime cut-time: C with vertical line
+ ardal Cf dental
+ bantuo Bantu o. Cf Otshi-herero
+ bbc1 single chem bond below
+ bbc2 double chem bond below
+ bbl1 chem bond like /
+ bbl2 chem bond like //
+ bbr1 chem bond like \
+ bbr2 chem bond \\
+ bcop1 copper symbol. Cf copper
+ bcop2 copper symbol. Cf copper
+ benchm Cf benchmark
+ btc1 single chem bond above
+ btc2 double chem bond above
+ btl1 chem bond like \
+ btl2 chem bond like \\
+ btr1 chem bond like /
+ btr2 chem bond line //
+ burman Cf Burman
+ devph sanskrit letter. Cf ph
+ devrfls sanskrit letter. Cf cerebral
+ duplong[12] musical note
+ egchi early form of chi
+ eggamma[12] early form of gamma
+ egiota early form of iota
+ egkappa early form of kappa
+ eglambda early form of lambda
+ egmu[12] early form of mu
+ egnu[12] early form of nu
+ egpi[123] early form of pi
+ egrho[12] early form of rho
+ egsampi early form of sampi
+ egsan early form of san
+ egsigma[12] early form of sigma
+ egxi[123] early form of xi
+ elatS early form of S
+ elatc[12] early form of C
+ elatg[12] early form of G
+ glagjeri Slavonic Glagolitic jeri
+ glagjeru Slavonic Glagolitic jeru
+ hypolem hypolemisk (line with underdot)
+ lhrbr lower half }
+ longmord long mordent
+ mbwvow backwards scretched C. Cf retract.
+ mord music symbol. Cf mordent
+ mostra Cf direct
+ ohgcirc old form of circumflex
+ oldbeta old form of β. Cf perturbate
+ oldsemibr[12] old forms of semibreve. Cf prolation
+ ormg old form of g. Cf G
+ para[12345] form of ¶
+ pauseo musical pause sign
+ pauseu musical pause sign
+ pharyng Cf pharyngal
+ ragr Black letter ragged r
+ repetn musical repeat. Cf retort
+ segno musical segno sign
+ semain[12] semitic ain
+ semhe semitic he
+ semheth semitic heth
+ semkaph semitic kaph
+ semlamed[12] semitic lamed
+ semmem semitic mem
+ semnum semitic nun
+ sempe semitic pe
+ semqoph[123] semitic qoph
+ semresh semitic resh
+ semtav[1234] semitic tav
+ semyod semitic yod
+ semzayin[123] semitic zayin
+ shtlong[12] U with underbar. Cf glyconic
+ sigmatau σ,τ combination
+ squaver sixteenth note
+ sqbreve square musical breve note
+ swast swastika
+ uhrbr upper half of big }
+ versicle1 Cf versicle
+ */
+
+
+static Rune normtab[128] = {
+ /*0*/ /*1*/ /*2*/ /*3*/ /*4*/ /*5*/ /*6*/ /*7*/
+/*00*/ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+/*10*/ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+/*20*/ 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, SPCS, '\'',
+ 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
+/*30*/ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
+ 0x38, 0x39, 0x3a, 0x3b, TAGS, 0x3d, TAGE, 0x3f,
+/*40*/ 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
+ 0x48, 0x49, 0x4a, 0x4b, L'L', 0x4d, 0x4e, 0x4f,
+/*50*/ 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
+ 0x58, 0x59, 0x5a, 0x5b, L'\\', 0x5d, 0x5e, 0x5f,
+/*60*/ 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
+ 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
+/*70*/ 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
+ 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, NONE,
+};
+static Rune phtab[128] = {
+ /*0*/ /*1*/ /*2*/ /*3*/ /*4*/ /*5*/ /*6*/ /*7*/
+/*00*/ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+/*10*/ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+/*20*/ 0x20, 0x21, 0x2c8, 0x23, 0x24, 0x2cc, 0xe6, '\'',
+ 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
+/*30*/ 0x30, 0x31, 0x32, 0x25c, 0x34, 0x35, 0x36, 0x37,
+ 0x38, 0xf8, 0x2d0, 0x3b, TAGS, 0x3d, TAGE, 0x3f,
+/*40*/ 0x259, 0x251, 0x42, 0x43, 0xf0, 0x25b, 0x46, 0x47,
+ 0x48, 0x26a, 0x4a, 0x4b, L'L', 0x4d, 0x14b, 0x254,
+/*50*/ 0x50, 0x252, 0x52, 0x283, 0x3b8, 0x28a, 0x28c, 0x57,
+ 0x58, 0x59, 0x292, 0x5b, L'\\', 0x5d, 0x5e, 0x5f,
+/*60*/ 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
+ 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
+/*70*/ 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
+ 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, NONE,
+};
+static Rune grtab[128] = {
+ /*0*/ /*1*/ /*2*/ /*3*/ /*4*/ /*5*/ /*6*/ /*7*/
+/*00*/ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+/*10*/ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+/*20*/ 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, SPCS, '\'',
+ 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
+/*30*/ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
+ 0x38, 0x39, 0x3a, 0x3b, TAGS, 0x3d, TAGE, 0x3f,
+/*40*/ 0x40, 0x391, 0x392, 0x39e, 0x394, 0x395, 0x3a6, 0x393,
+ 0x397, 0x399, 0x3da, 0x39a, 0x39b, 0x39c, 0x39d, 0x39f,
+/*50*/ 0x3a0, 0x398, 0x3a1, 0x3a3, 0x3a4, 0x3a5, 0x56, 0x3a9,
+ 0x3a7, 0x3a8, 0x396, 0x5b, L'\\', 0x5d, 0x5e, 0x5f,
+/*60*/ 0x60, 0x3b1, 0x3b2, 0x3be, 0x3b4, 0x3b5, 0x3c6, 0x3b3,
+ 0x3b7, 0x3b9, 0x3c2, 0x3ba, 0x3bb, 0x3bc, 0x3bd, 0x3bf,
+/*70*/ 0x3c0, 0x3b8, 0x3c1, 0x3c3, 0x3c4, 0x3c5, 0x76, 0x3c9,
+ 0x3c7, 0x3c8, 0x3b6, 0x7b, 0x7c, 0x7d, 0x7e, NONE,
+};
+static Rune subtab[128] = {
+ /*0*/ /*1*/ /*2*/ /*3*/ /*4*/ /*5*/ /*6*/ /*7*/
+/*00*/ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+/*10*/ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+/*20*/ 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, SPCS, '\'',
+ 0x208d, 0x208e, 0x2a, 0x208a, 0x2c, 0x208b, 0x2e, 0x2f,
+/*30*/ 0x2080, 0x2081, 0x2082, 0x2083, 0x2084, 0x2085, 0x2086, 0x2087,
+ 0x2088, 0x2089, 0x3a, 0x3b, TAGS, 0x208c, TAGE, 0x3f,
+/*40*/ 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
+ 0x48, 0x49, 0x4a, 0x4b, L'L', 0x4d, 0x4e, 0x4f,
+/*50*/ 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
+ 0x58, 0x59, 0x5a, 0x5b, L'\\', 0x5d, 0x5e, 0x5f,
+/*60*/ 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
+ 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
+/*70*/ 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
+ 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, NONE,
+};
+static Rune suptab[128] = {
+ /*0*/ /*1*/ /*2*/ /*3*/ /*4*/ /*5*/ /*6*/ /*7*/
+/*00*/ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+/*10*/ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+/*20*/ 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, SPCS, '\'',
+ 0x207d, 0x207e, 0x2a, 0x207a, 0x2c, 0x207b, 0x2e, 0x2f,
+/*30*/ 0x2070, 0x2071, 0x2072, 0x2073, 0x2074, 0x2075, 0x2076, 0x2077,
+ 0x2078, 0x2079, 0x3a, 0x3b, TAGS, 0x207c, TAGE, 0x3f,
+/*40*/ 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
+ 0x48, 0x49, 0x4a, 0x4b, L'L', 0x4d, 0x4e, 0x4f,
+/*50*/ 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
+ 0x58, 0x59, 0x5a, 0x5b, L'\\', 0x5d, 0x5e, 0x5f,
+/*60*/ 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
+ 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
+/*70*/ 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
+ 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, NONE,
+};
+
+static int tagstarts;
+static char tag[Buflen];
+static int naux;
+static char auxname[Maxaux][Buflen];
+static char auxval[Maxaux][Buflen];
+static char spec[Buflen];
+static uchar *auxstate[Naux]; /* vals for most recent tag */
+static Entry curentry;
+#define cursize (curentry.end-curentry.start)
+
+static char *getspec(char *, char *);
+static char *gettag(char *, char *);
+static void dostatus(void);
+
+/*
+ * cmd is one of:
+ * 'p': normal print
+ * 'h': just print headwords
+ * 'P': print raw
+ */
+void
+oedprintentry(Entry e, int cmd)
+{
+ char *p, *pe;
+ int t, a, i;
+ long r, rprev, rlig;
+ Rune *transtab;
+
+ p = e.start;
+ pe = e.end;
+ transtab = normtab;
+ rprev = NONE;
+ changett(0, 0, 0);
+ curentry = e;
+ if(cmd == 'h')
+ outinhibit = 1;
+ while(p < pe) {
+ if(cmd == 'r') {
+ outchar(*p++);
+ continue;
+ }
+ r = transtab[(*p++)&0x7F];
+ if(r < NONE) {
+ /* Emit the rune, but buffer in case of ligature */
+ if(rprev != NONE)
+ outrune(rprev);
+ rprev = r;
+ } else if(r == SPCS) {
+ /* Start of special character name */
+ p = getspec(p, pe);
+ r = lookassoc(spectab, asize(spectab), spec);
+ if(r == -1) {
+ if(debug)
+ err("spec %ld %d %s",
+ e.doff, cursize, spec);
+ r = 0xfffd;
+ }
+ if(r >= LIGS && r < LIGE) {
+ /* handle possible ligature */
+ rlig = liglookup(r, rprev);
+ if(rlig != NONE)
+ rprev = rlig; /* overwrite rprev */
+ else {
+ /* could print accent, but let's not */
+ if(rprev != NONE) outrune(rprev);
+ rprev = NONE;
+ }
+ } else if(r >= MULTI && r < MULTIE) {
+ if(rprev != NONE) {
+ outrune(rprev);
+ rprev = NONE;
+ }
+ outrunes(multitab[r-MULTI]);
+ } else if(r == PAR) {
+ if(rprev != NONE) {
+ outrune(rprev);
+ rprev = NONE;
+ }
+ outnl(1);
+ } else {
+ if(rprev != NONE) outrune(rprev);
+ rprev = r;
+ }
+ } else if(r == TAGS) {
+ /* Start of tag name */
+ if(rprev != NONE) {
+ outrune(rprev);
+ rprev = NONE;
+ }
+ p = gettag(p, pe);
+ t = lookassoc(tagtab, asize(tagtab), tag);
+ if(t == -1) {
+ if(debug)
+ err("tag %ld %d %s",
+ e.doff, cursize, tag);
+ continue;
+ }
+ for(i = 0; i < Naux; i++)
+ auxstate[i] = 0;
+ for(i = 0; i < naux; i++) {
+ a = lookassoc(auxtab, asize(auxtab), auxname[i]);
+ if(a == -1) {
+ if(debug)
+ err("aux %ld %d %s",
+ e.doff, cursize, auxname[i]);
+ } else
+ auxstate[a] = auxval[i];
+ }
+ switch(t){
+ case E:
+ case Ve:
+ outnl(0);
+ if(tagstarts)
+ dostatus();
+ break;
+ case Ed:
+ case Etym:
+ outchar(tagstarts? '[' : ']');
+ break;
+ case Pr:
+ outchar(tagstarts? '(' : ')');
+ break;
+ case In:
+ transtab = changett(transtab, subtab, tagstarts);
+ break;
+ case Hm:
+ case Su:
+ case Fq:
+ transtab = changett(transtab, suptab, tagstarts);
+ break;
+ case Gk:
+ transtab = changett(transtab, grtab, tagstarts);
+ break;
+ case Ph:
+ transtab = changett(transtab, phtab, tagstarts);
+ break;
+ case Hw:
+ if(cmd == 'h') {
+ if(!tagstarts)
+ outchar(' ');
+ outinhibit = !tagstarts;
+ }
+ break;
+ case S0:
+ case S1:
+ case S2:
+ case S3:
+ case S4:
+ case S5:
+ case S6:
+ case S7a:
+ case S7n:
+ case Sn:
+ case Sgk:
+ if(tagstarts) {
+ outnl(2);
+ dostatus();
+ if(auxstate[Num]) {
+ if(t == S3 || t == S5) {
+ i = atoi(auxstate[Num]);
+ while(i--)
+ outchar('*');
+ outchars(" ");
+ } else if(t == S7a || t == S7n || t == Sn) {
+ outchar('(');
+ outchars(auxstate[Num]);
+ outchars(") ");
+ } else if(t == Sgk) {
+ i = grtab[auxstate[Num][0]];
+ if(i != NONE)
+ outrune(i);
+ outchars(". ");
+ } else {
+ outchars(auxstate[Num]);
+ outchars(". ");
+ }
+ }
+ }
+ break;
+ case Cb:
+ case Db:
+ case Qp:
+ case P:
+ if(tagstarts)
+ outnl(1);
+ break;
+ case Table:
+ /*
+ * Todo: gather columns, justify them, etc.
+ * For now, just let colums come out as rows
+ */
+ if(!tagstarts)
+ outnl(0);
+ break;
+ case Col:
+ if(tagstarts)
+ outnl(0);
+ break;
+ case Dn:
+ if(tagstarts)
+ outchar('/');
+ break;
+ }
+ }
+ }
+ if(cmd == 'h') {
+ outinhibit = 0;
+ outnl(0);
+ }
+}
+
+/*
+ * Return offset into bdict where next oed entry after fromoff starts.
+ * Oed entries start with <e>, <ve>, <e st=...>, or <ve st=...>
+ */
+long
+oednextoff(long fromoff)
+{
+ long a, n;
+ int c;
+
+ a = Bseek(bdict, fromoff, 0);
+ if(a < 0)
+ return -1;
+ n = 0;
+ for(;;) {
+ c = Bgetc(bdict);
+ if(c < 0)
+ break;
+ if(c == '<') {
+ c = Bgetc(bdict);
+ if(c == 'e') {
+ c = Bgetc(bdict);
+ if(c == '>' || c == ' ')
+ n = 3;
+ } else if(c == 'v' && Bgetc(bdict) == 'e') {
+ c = Bgetc(bdict);
+ if(c == '>' || c == ' ')
+ n = 4;
+ }
+ if(n)
+ break;
+ }
+ }
+ return (Boffset(bdict)-n);
+}
+
+static char *prkey =
+"KEY TO THE PRONUNCIATION\n"
+"\n"
+"I. CONSONANTS\n"
+"b, d, f, k, l, m, n, p, t, v, z: usual English values\n"
+"\n"
+"g as in go (gəʊ)\n"
+"h ... ho! (həʊ)\n"
+"r ... run (rʌn), terrier (ˈtɛriə(r))\n"
+"(r)... her (hɜː(r))\n"
+"s ... see (siː), success (səkˈsɜs)\n"
+"w ... wear (wɛə(r))\n"
+"hw ... when (hwɛn)\n"
+"j ... yes (jɛs)\n"
+"θ ... thin (θin), bath (bɑːθ)\n"
+"ð ... then (ðɛn), bathe (beɪð)\n"
+"ʃ ... shop (ʃɒp), dish (dɪʃ)\n"
+"tʃ ... chop (tʃɒp), ditch (dɪtʃ)\n"
+"ʒ ... vision (ˈvɪʒən), déjeuner (deʒøne)\n"
+"dʒ ... judge (dʒʌdʒ)\n"
+"ŋ ... singing (ˈsɪŋɪŋ), think (θiŋk)\n"
+"ŋg ... finger (ˈfiŋgə(r))\n"
+"\n"
+"Foreign\n"
+"ʎ as in It. seraglio (serˈraʎo)\n"
+"ɲ ... Fr. cognac (kɔɲak)\n"
+"x ... Ger. ach (ax), Sc. loch (lɒx)\n"
+"ç ... Ger. ich (ɪç), Sc. nicht (nɪçt)\n"
+"ɣ ... North Ger. sagen (ˈzaːɣən)\n"
+"c ... Afrikaans baardmannetjie (ˈbaːrtmanəci)\n"
+"ɥ ... Fr. cuisine (kɥizin)\n"
+"\n"
+"II. VOWELS AND DIPTHONGS\n"
+"\n"
+"Short\n"
+"ɪ as in pit (pɪt), -ness (-nɪs)\n"
+"ɛ ... pet (pɛt), Fr. sept (sɛt)\n"
+"æ ... pat (pæt)\n"
+"ʌ ... putt (pʌt)\n"
+"ɒ ... pot (pɒt)\n"
+"ʊ ... put (pʊt)\n"
+"ə ... another (əˈnʌðə(r))\n"
+"(ə)... beaten (ˈbiːt(ə)n)\n"
+"i ... Fr. si (si)\n"
+"e ... Fr. bébé (bebe)\n"
+"a ... Fr. mari (mari)\n"
+"ɑ ... Fr. bâtiment (bɑtimã)\n"
+"ɔ ... Fr. homme (ɔm)\n"
+"o ... Fr. eau (o)\n"
+"ø ... Fr. peu (pø)\n"
+"œ ... Fr. boeuf (bœf), coeur (kœr)\n"
+"u ... Fr. douce (dus)\n"
+"ʏ ... Ger. Müller (ˈmʏlər)\n"
+"y ... Fr. du (dy)\n"
+"\n"
+"Long\n"
+"iː as in bean (biːn)\n"
+"ɑː ... barn (bɑːn)\n"
+"ɔː ... born (bɔːn)\n"
+"uː ... boon (buːn)\n"
+"ɜː ... burn (bɜːn)\n"
+"eː ... Ger. Schnee (ʃneː)\n"
+"ɛː ... Ger. Fähre (ˈfɛːrə)\n"
+"aː ... Ger. Tag (taːk)\n"
+"oː ... Ger. Sohn (zoːn)\n"
+"øː ... Ger. Goethe (gøːtə)\n"
+"yː ... Ger. grün (gryːn)\n"
+"\n"
+"Nasal\n"
+"ɛ˜, æ˜ as in Fr. fin (fɛ˜, fæ˜)\n"
+"ã ... Fr. franc (frã)\n"
+"ɔ˜ ... Fr. bon (bɔ˜n)\n"
+"œ˜ ... Fr. un (œ˜)\n"
+"\n"
+"Dipthongs, etc.\n"
+"eɪ as in bay (beɪ)\n"
+"aɪ ... buy (baɪ)\n"
+"ɔɪ ... boy (bɔɪ)\n"
+"əʊ ... no (nəʊ)\n"
+"aʊ ... now (naʊ)\n"
+"ɪə ... peer (pɪə(r))\n"
+"ɛə ... pair (pɛə(r))\n"
+"ʊə ... tour (tʊə(r))\n"
+"ɔə ... boar (bɔə(r))\n"
+"\n"
+"III. STRESS\n"
+"\n"
+"Main stress: ˈ preceding stressed syllable\n"
+"Secondary stress: ˌ preceding stressed syllable\n"
+"\n"
+"E.g.: pronunciation (prəˌnʌnsɪˈeɪʃ(ə)n)\n";
+/* TODO: find transcriptions of foreign consonents, œ, ʏ, nasals */
+
+void
+oedprintkey(void)
+{
+ Bprint(bout, "%s", prkey);
+}
+
+/*
+ * f points just after a '&', fe points at end of entry.
+ * Accumulate the special name, starting after the &
+ * and continuing until the next '.', in spec[].
+ * Return pointer to char after '.'.
+ */
+static char *
+getspec(char *f, char *fe)
+{
+ char *t;
+ int c, i;
+
+ t = spec;
+ i = sizeof spec;
+ while(--i > 0) {
+ c = *f++;
+ if(c == '.' || f == fe)
+ break;
+ *t++ = c;
+ }
+ *t = 0;
+ return f;
+}
+
+/*
+ * f points just after '<'; fe points at end of entry.
+ * Expect next characters from bin to match:
+ * [/][^ >]+( [^>=]+=[^ >]+)*>
+ * tag auxname auxval
+ * Accumulate the tag and its auxilliary information in
+ * tag[], auxname[][] and auxval[][].
+ * Set tagstarts=1 if the tag is 'starting' (has no '/'), else 0.
+ * Set naux to the number of aux pairs found.
+ * Return pointer to after final '>'.
+ */
+static char *
+gettag(char *f, char *fe)
+{
+ char *t;
+ int c, i;
+
+ t = tag;
+ c = *f++;
+ if(c == '/')
+ tagstarts = 0;
+ else {
+ tagstarts = 1;
+ *t++ = c;
+ }
+ i = Buflen;
+ naux = 0;
+ while(--i > 0) {
+ c = *f++;
+ if(c == '>' || f == fe)
+ break;
+ if(c == ' ') {
+ *t = 0;
+ t = auxname[naux];
+ i = Buflen;
+ if(naux < Maxaux-1)
+ naux++;
+ } else if(naux && c == '=') {
+ *t = 0;
+ t = auxval[naux-1];
+ i = Buflen;
+ } else
+ *t++ = c;
+ }
+ *t = 0;
+ return f;
+}
+
+static void
+dostatus(void)
+{
+ char *s;
+
+ s = auxstate[St];
+ if(s) {
+ if(strcmp(s, "obs") == 0)
+ outrune(0x2020);
+ else if(strcmp(s, "ali") == 0)
+ outrune(0x2016);
+ else if(strcmp(s, "err") == 0 || strcmp(s, "spu") == 0)
+ outrune(0xb6);
+ else if(strcmp(s, "xref") == 0)
+ {/* nothing */}
+ else if(debug)
+ err("status %ld %d %s", curentry.doff, cursize, s);
+ }
+}
diff --git a/src/cmd/dict/pcollins.c b/src/cmd/dict/pcollins.c
new file mode 100644
index 00000000..83ee3abc
--- /dev/null
+++ b/src/cmd/dict/pcollins.c
@@ -0,0 +1,226 @@
+#include <u.h>
+#include <libc.h>
+#include <bio.h>
+#include "dict.h"
+
+/*
+ * Routines for handling dictionaries in the "Paperback Collins"
+ * format (with tags surrounded by >....<)
+ */
+enum {
+ Buflen=1000,
+};
+
+/* More special runes */
+enum {
+ B = MULTIE+1, /* bold */
+ H, /* headword start */
+ I, /* italics */
+ Ps, /* pronunciation start */
+ Pe, /* pronunciation end */
+ R, /* roman */
+ X, /* headword end */
+};
+
+/* Assoc tables must be sorted on first field */
+
+static Assoc tagtab[] = {
+ {"AA", 0xc5},
+ {"AC", LACU},
+ {"B", B},
+ {"CE", LCED},
+ {"CI", LFRN},
+ {"Di", 0x131},
+ {"EL", 0x2d},
+ {"GR", LGRV},
+ {"H", H},
+ {"I", I},
+ {"OE", 0x152},
+ {"R", R},
+ {"TI", LTIL},
+ {"UM", LUML},
+ {"X", X},
+ {"[", Ps},
+ {"]", Pe},
+ {"ac", LACU},
+ {"ce", LCED},
+ {"ci", LFRN},
+ {"gr", LGRV},
+ {"oe", 0x153},
+ {"supe", 0x65}, /* should be raised */
+ {"supo", 0x6f}, /* should be raised */
+ {"ti", LTIL},
+ {"um", LUML},
+ {"{", Ps},
+ {"~", 0x7e},
+ {"~~", MTT},
+};
+
+static Rune normtab[128] = {
+ /*0*/ /*1*/ /*2*/ /*3*/ /*4*/ /*5*/ /*6*/ /*7*/
+/*00*/ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, 0x20, NONE, NONE, NONE, NONE, NONE,
+/*10*/ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+/*20*/ 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, '\'',
+ 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
+/*30*/ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
+ 0x38, 0x39, 0x3a, 0x3b, TAGE, 0x3d, TAGS, 0x3f,
+/*40*/ 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
+ 0x48, 0x49, 0x4a, 0x4b, L'L', 0x4d, 0x4e, 0x4f,
+/*50*/ 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
+ 0x58, 0x59, 0x5a, 0x5b, L'\\', 0x5d, 0x5e, 0x5f,
+/*60*/ 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
+ 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
+/*70*/ 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
+ 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, NONE,
+};
+
+static char *gettag(char *, char *);
+
+static Entry curentry;
+static char tag[Buflen];
+#define cursize (curentry.end-curentry.start)
+
+void
+pcollprintentry(Entry e, int cmd)
+{
+ char *p, *pe;
+ long r, rprev, t, rlig;
+ int saveoi;
+ Rune *transtab;
+
+ p = e.start;
+ pe = e.end;
+ transtab = normtab;
+ rprev = NONE;
+ changett(0, 0, 0);
+ curentry = e;
+ saveoi = 0;
+ if(cmd == 'h')
+ outinhibit = 1;
+ while(p < pe) {
+ if(cmd == 'r') {
+ outchar(*p++);
+ continue;
+ }
+ r = transtab[(*p++)&0x7F];
+ if(r < NONE) {
+ /* Emit the rune, but buffer in case of ligature */
+ if(rprev != NONE)
+ outrune(rprev);
+ rprev = r;
+ } else if(r == TAGS) {
+ p = gettag(p, pe);
+ t = lookassoc(tagtab, asize(tagtab), tag);
+ if(t == -1) {
+ if(debug && !outinhibit)
+ err("tag %ld %d %s",
+ e.doff, cursize, tag);
+ continue;
+ }
+ if(t < NONE) {
+ if(rprev != NONE)
+ outrune(rprev);
+ rprev = t;
+ } else if(t >= LIGS && t < LIGE) {
+ /* handle possible ligature */
+ rlig = liglookup(t, rprev);
+ if(rlig != NONE)
+ rprev = rlig; /* overwrite rprev */
+ else {
+ /* could print accent, but let's not */
+ if(rprev != NONE) outrune(rprev);
+ rprev = NONE;
+ }
+ } else if(t >= MULTI && t < MULTIE) {
+ if(rprev != NONE) {
+ outrune(rprev);
+ rprev = NONE;
+ }
+ outrunes(multitab[t-MULTI]);
+ } else {
+ if(rprev != NONE) {
+ outrune(rprev);
+ rprev = NONE;
+ }
+ switch(t){
+ case H:
+ if(cmd == 'h')
+ outinhibit = 0;
+ else
+ outnl(0);
+ break;
+ case X:
+ if(cmd == 'h')
+ outinhibit = 1;
+ else
+ outchars(". ");
+ break;
+ case Ps:
+ /* don't know enough of pron. key yet */
+ saveoi = outinhibit;
+ outinhibit = 1;
+ break;
+ case Pe:
+ outinhibit = saveoi;
+ break;
+ }
+ }
+ }
+ }
+ if(cmd == 'h')
+ outinhibit = 0;
+ outnl(0);
+}
+
+long
+pcollnextoff(long fromoff)
+{
+ long a;
+ char *p;
+
+ a = Bseek(bdict, fromoff, 0);
+ if(a < 0)
+ return -1;
+ for(;;) {
+ p = Brdline(bdict, '\n');
+ if(!p)
+ break;
+ if(p[0] == '>' && p[1] == 'H' && p[2] == '<')
+ return (Boffset(bdict)-Blinelen(bdict));
+ }
+ return -1;
+}
+
+void
+pcollprintkey(void)
+{
+ Bprint(bout, "No pronunciation key yet\n");
+}
+
+/*
+ * f points just after '>'; fe points at end of entry.
+ * Expect next characters from bin to match:
+ * [^ <]+<
+ * tag
+ * Accumulate the tag in tag[].
+ * Return pointer to after final '<'.
+ */
+static char *
+gettag(char *f, char *fe)
+{
+ char *t;
+ int c, i;
+
+ t = tag;
+ i = Buflen;
+ while(--i > 0) {
+ c = *f++;
+ if(c == '<' || f == fe)
+ break;
+ *t++ = c;
+ }
+ *t = 0;
+ return f;
+}
diff --git a/src/cmd/dict/pcollinsg.c b/src/cmd/dict/pcollinsg.c
new file mode 100644
index 00000000..bbd31c09
--- /dev/null
+++ b/src/cmd/dict/pcollinsg.c
@@ -0,0 +1,248 @@
+#include <u.h>
+#include <libc.h>
+#include <bio.h>
+#include "dict.h"
+
+/*
+ * Routines for handling dictionaries in the "Paperback Collins"
+ * `German' format (with tags surrounded by \5⋯\6 and \xba⋯\xba)
+ */
+
+/*
+ * \5...\6 escapes (fonts, mostly)
+ *
+ * h headword (helvetica 7 pt)
+ * c clause (helvetica 7 pt)
+ * 3 helvetica 7 pt
+ * 4 helvetica 6.5 pt
+ * s helvetica 8 pt
+ * x helvetica 8 pt
+ * y helvetica 5 pt
+ * m helvetica 30 pt
+ * 1 roman 6 pt
+ * 9 roman 4.5 pt
+ * p roman 7 pt
+ * q roman 4.5 pt
+ * 2 italic 6 pt
+ * 7 italic 4.5 pt
+ * b bold 6 pt
+ * a `indent 0:4 left'
+ * k `keep 9'
+ * l `size 12'
+ */
+
+enum {
+ IBASE=0x69, /* dotless i */
+ Taglen=32,
+};
+
+static Rune intab[256] = {
+ /*0*/ /*1*/ /*2*/ /*3*/ /*4*/ /*5*/ /*6*/ /*7*/
+/*00*/ NONE, NONE, NONE, NONE, NONE, TAGS, TAGE, NONE,
+ NONE, NONE, NONE, NONE, NONE, 0x20, NONE, NONE,
+/*10*/ NONE, 0x2d, 0x20, 0x20, NONE, NONE, NONE, NONE,
+ 0x20, NONE, NONE, NONE, 0x20, NONE, NONE, 0x2d,
+/*20*/ 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, '\'',
+ 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
+/*30*/ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
+ 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
+/*40*/ 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
+ 0x48, 0x49, 0x4a, 0x4b, L'L', 0x4d, 0x4e, 0x4f,
+/*50*/ 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
+ 0x58, 0x59, 0x5a, 0x5b, L'\\', 0x5d, 0x5e, 0x5f,
+/*60*/ 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
+ 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
+/*70*/ 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
+ 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, NONE,
+/*80*/ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, 0x20, NONE, NONE, NONE, NONE, NONE,
+/*90*/ 0xdf, 0xe6, NONE, MOE, NONE, NONE, NONE, 0xf8,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+/*A0*/ NONE, NONE, 0x22, 0xa3, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+/*B0*/ NONE, NONE, NONE, NONE, NONE, NONE, NONE, 0x7e,
+ NONE, IBASE, SPCS, NONE, NONE, NONE, NONE, NONE,
+/*C0*/ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+/*D0*/ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+/*E0*/ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+/*F0*/ 0x20, 0x20, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+};
+
+static Nassoc numtab[] = {
+ {1, 0x2b},
+ {4, 0x3d},
+ {7, 0xb0},
+ {11, 0x2248},
+ {69, 0x2666},
+ {114, 0xae},
+ {340, 0x25b},
+ {341, 0x254},
+ {342, 0x28c},
+ {343, 0x259},
+ {345, 0x292},
+ {346, 0x283},
+ {347, 0x275},
+ {348, 0x28a},
+ {349, 0x2c8},
+ {351, 0x26a},
+ {352, 0x25c},
+ {354, 0x251},
+ {355, 0x7e},
+ {356, 0x252},
+ {384, 0x273},
+ {445, 0xf0}, /* BUG -- should be script eth */
+};
+
+static Nassoc overtab[] = {
+ {0x2c, LCED},
+ {0x2f, LACU},
+ {0x3a, LUML},
+ {L'\\', LGRV},
+ {0x5e, LFRN},
+ {0x7e, LTIL},
+};
+
+static uchar *reach(uchar*, int);
+
+static Entry curentry;
+static char tag[Taglen];
+
+void
+pcollgprintentry(Entry e, int cmd)
+{
+ uchar *p, *pe;
+ int r, rprev = NONE, rx, over = 0, font;
+ char buf[16];
+
+ p = (uchar *)e.start;
+ pe = (uchar *)e.end;
+ curentry = e;
+ if(cmd == 'h')
+ outinhibit = 1;
+ while(p < pe){
+ if(cmd == 'r'){
+ outchar(*p++);
+ continue;
+ }
+ switch(r = intab[*p++]){ /* assign = */
+ case TAGS:
+ if(rprev != NONE){
+ outrune(rprev);
+ rprev = NONE;
+ }
+ p = reach(p, 0x06);
+ font = tag[0];
+ if(cmd == 'h')
+ outinhibit = (font != 'h');
+ break;
+
+ case TAGE: /* an extra one */
+ break;
+
+ case SPCS:
+ p = reach(p, 0xba);
+ r = looknassoc(numtab, asize(numtab), strtol(tag,0,0));
+ if(r < 0){
+ if(rprev != NONE){
+ outrune(rprev);
+ rprev = NONE;
+ }
+ sprint(buf, "\\N'%s'", tag);
+ outchars(buf);
+ break;
+ }
+ /* else fall through */
+
+ default:
+ if(over){
+ rx = looknassoc(overtab, asize(overtab), r);
+ if(rx > 0)
+ rx = liglookup(rx, rprev);
+ if(rx > 0 && rx != NONE)
+ outrune(rx);
+ else{
+ outrune(rprev);
+ if(r == ':')
+ outrune(0xa8);
+ else{
+ outrune(0x5e);
+ outrune(r);
+ }
+ }
+ over = 0;
+ rprev = NONE;
+ }else if(r == '^'){
+ over = 1;
+ }else{
+ if(rprev != NONE)
+ outrune(rprev);
+ rprev = r;
+ }
+ }
+
+ }
+ if(rprev != NONE)
+ outrune(rprev);
+ if(cmd == 'h')
+ outinhibit = 0;
+ outnl(0);
+}
+
+long
+pcollgnextoff(long fromoff)
+{
+ int c, state = 0, defoff = -1;
+
+ if(Bseek(bdict, fromoff, 0) < 0)
+ return -1;
+ while((c = Bgetc(bdict)) >= 0){
+ if(c == '\r')
+ defoff = Boffset(bdict);
+ switch(state){
+ case 0:
+ if(c == 0x05)
+ state = 1;
+ break;
+ case 1:
+ if(c == 'h')
+ state = 2;
+ else
+ state = 0;
+ break;
+ case 2:
+ if(c == 0x06)
+ return (Boffset(bdict)-3);
+ else
+ state = 0;
+ break;
+ }
+ }
+ return defoff;
+}
+
+void
+pcollgprintkey(void)
+{
+ Bprint(bout, "No pronunciation key yet\n");
+}
+
+static uchar *
+reach(uchar *p, int tagchar)
+{
+ int c; char *q=tag;
+
+ while(p < (uchar *)curentry.end){
+ c = *p++;
+ if(c == tagchar)
+ break;
+ *q++ = c;
+ if(q >= &tag[sizeof tag-1])
+ break;
+ }
+ *q = 0;
+ return p;
+}
diff --git a/src/cmd/dict/pgw.c b/src/cmd/dict/pgw.c
new file mode 100644
index 00000000..88a490c8
--- /dev/null
+++ b/src/cmd/dict/pgw.c
@@ -0,0 +1,1165 @@
+/* thanks to Caerwyn Jones <caerwyn@comcast.net> for this module */
+#include <u.h>
+#include <libc.h>
+#include <bio.h>
+#include "dict.h"
+
+enum {
+ Buflen=1000,
+ Maxaux=5,
+};
+
+/* Possible tags */
+enum {
+ B, /* Bold */
+ Blockquote, /* Block quote */
+ Br, /* Break line */
+ Cd, /* ? coloquial data */
+ Col, /* ? Coloquial */
+ Def, /* Definition */
+ Hw, /* Head Word */
+ I, /* Italics */
+ P, /* Paragraph */
+ Pos, /* Part of Speach */
+ Sn, /* Sense */
+ U, /* ? cross reference*/
+ Wf, /* ? word form */
+ Ntag /* end of tags */
+};
+
+/* Assoc tables must be sorted on first field */
+
+static Assoc tagtab[] = {
+ {"b", B},
+ {"blockquote", Blockquote},
+ {"BR", Br},
+ {"cd", Cd},
+ {"col", Col},
+ {"def", Def},
+ {"hw", Hw},
+ {"i", I},
+ {"p", P},
+ {"pos", Pos},
+ {"sn", Sn},
+ {"u", U},
+ {"wf", Wf},
+};
+
+/* Possible tag auxilliary info */
+enum {
+ Cols, /* number of columns in a table */
+ Num, /* letter or number, for a sense */
+ St, /* status (e.g., obs) */
+ Naux
+};
+
+#if 0
+static Assoc auxtab[] = {
+ {"cols", Cols},
+ {"num", Num},
+ {"st", St}
+};
+#endif
+
+static Assoc spectab[] = {
+ {"3on4", 0xbe},
+ {"AElig", 0xc6},
+ {"Aacute", 0xc1},
+ {"Aang", 0xc5},
+ {"Abarab", 0x100},
+ {"Acirc", 0xc2},
+ {"Agrave", 0xc0},
+ {"Alpha", 0x391},
+ {"Amacr", 0x100},
+ {"Asg", 0x1b7}, /* Unicyle. Cf "Sake" */
+ {"Auml", 0xc4},
+ {"Beta", 0x392},
+ {"Cced", 0xc7},
+ {"Chacek", 0x10c},
+ {"Chi", 0x3a7},
+ {"Chirho", 0x2627}, /* Chi Rho U+2627 */
+ {"Csigma", 0x3da},
+ {"Delta", 0x394},
+ {"Eacute", 0xc9},
+ {"Ecirc", 0xca},
+ {"Edh", 0xd0},
+ {"Epsilon", 0x395},
+ {"Eta", 0x397},
+ {"Gamma", 0x393},
+ {"Iacute", 0xcd},
+ {"Icirc", 0xce},
+ {"Imacr", 0x12a},
+ {"Integ", 0x222b},
+ {"Iota", 0x399},
+ {"Kappa", 0x39a},
+ {"Koppa", 0x3de},
+ {"Lambda", 0x39b},
+ {"Lbar", 0x141},
+ {"Mu", 0x39c},
+ {"Naira", 0x4e}, /* should have bar through */
+ {"Nplus", 0x4e}, /* should have plus above */
+ {"Ntilde", 0xd1},
+ {"Nu", 0x39d},
+ {"Oacute", 0xd3},
+ {"Obar", 0xd8},
+ {"Ocirc", 0xd4},
+ {"Oe", 0x152},
+ {"Omega", 0x3a9},
+ {"Omicron", 0x39f},
+ {"Ouml", 0xd6},
+ {"Phi", 0x3a6},
+ {"Pi", 0x3a0},
+ {"Psi", 0x3a8},
+ {"Rho", 0x3a1},
+ {"Sacute", 0x15a},
+ {"Sigma", 0x3a3},
+ {"Summ", 0x2211},
+ {"Tau", 0x3a4},
+ {"Th", 0xde},
+ {"Theta", 0x398},
+ {"Tse", 0x426},
+ {"Uacute", 0xda},
+ {"Ucirc", 0xdb},
+ {"Upsilon", 0x3a5},
+ {"Uuml", 0xdc},
+ {"Wyn", 0x1bf}, /* wynn U+01BF */
+ {"Xi", 0x39e},
+ {"Ygh", 0x1b7}, /* Yogh U+01B7 */
+ {"Zeta", 0x396},
+ {"Zh", 0x1b7}, /* looks like Yogh. Cf "Sake" */
+ {"a", 0x61}, /* ante */
+ {"aacute", 0xe1},
+ {"aang", 0xe5},
+ {"aasper", MAAS},
+ {"abreve", 0x103},
+ {"acirc", 0xe2},
+ {"acute", LACU},
+ {"aelig", 0xe6},
+ {"agrave", 0xe0},
+ {"ahook", 0x105},
+ {"alenis", MALN},
+ {"alpha", 0x3b1},
+ {"amacr", 0x101},
+ {"amp", 0x26},
+ {"and", MAND},
+ {"ang", LRNG},
+ {"angle", 0x2220},
+ {"ankh", 0x2625}, /* ankh U+2625 */
+ {"ante", 0x61}, /* before (year) */
+ {"aonq", MAOQ},
+ {"appreq", 0x2243},
+ {"aquar", 0x2652},
+ {"arDadfull", 0x636}, /* Dad U+0636 */
+ {"arHa", 0x62d}, /* haa U+062D */
+ {"arTa", 0x62a}, /* taa U+062A */
+ {"arain", 0x639}, /* ain U+0639 */
+ {"arainfull", 0x639}, /* ain U+0639 */
+ {"aralif", 0x627}, /* alef U+0627 */
+ {"arba", 0x628}, /* baa U+0628 */
+ {"arha", 0x647}, /* ha U+0647 */
+ {"aries", 0x2648},
+ {"arnun", 0x646}, /* noon U+0646 */
+ {"arnunfull", 0x646}, /* noon U+0646 */
+ {"arpa", 0x647}, /* ha U+0647 */
+ {"arqoph", 0x642}, /* qaf U+0642 */
+ {"arshinfull", 0x634}, /* sheen U+0634 */
+ {"arta", 0x62a}, /* taa U+062A */
+ {"artafull", 0x62a}, /* taa U+062A */
+ {"artha", 0x62b}, /* thaa U+062B */
+ {"arwaw", 0x648}, /* waw U+0648 */
+ {"arya", 0x64a}, /* ya U+064A */
+ {"aryafull", 0x64a}, /* ya U+064A */
+ {"arzero", 0x660}, /* indic zero U+0660 */
+ {"asg", 0x292}, /* unicycle character. Cf "hallow" */
+ {"asper", LASP},
+ {"assert", 0x22a2},
+ {"astm", 0x2042}, /* asterism: should be upside down */
+ {"at", 0x40},
+ {"atilde", 0xe3},
+ {"auml", 0xe4},
+ {"ayin", 0x639}, /* arabic ain U+0639 */
+ {"b1", 0x2d}, /* single bond */
+ {"b2", 0x3d}, /* double bond */
+ {"b3", 0x2261}, /* triple bond */
+ {"bbar", 0x180}, /* b with bar U+0180 */
+ {"beta", 0x3b2},
+ {"bigobl", 0x2f},
+ {"blC", 0x43}, /* should be black letter */
+ {"blJ", 0x4a}, /* should be black letter */
+ {"blU", 0x55}, /* should be black letter */
+ {"blb", 0x62}, /* should be black letter */
+ {"blozenge", 0x25ca}, /* U+25CA; should be black */
+ {"bly", 0x79}, /* should be black letter */
+ {"bra", MBRA},
+ {"brbl", LBRB},
+ {"breve", LBRV},
+ {"bslash", L'\\'},
+ {"bsquare", 0x25a0}, /* black square U+25A0 */
+ {"btril", 0x25c0}, /* U+25C0 */
+ {"btrir", 0x25b6}, /* U+25B6 */
+ {"c", 0x63}, /* circa */
+ {"cab", 0x232a},
+ {"cacute", 0x107},
+ {"canc", 0x264b},
+ {"capr", 0x2651},
+ {"caret", 0x5e},
+ {"cb", 0x7d},
+ {"cbigb", 0x7d},
+ {"cbigpren", 0x29},
+ {"cbigsb", 0x5d},
+ {"cced", 0xe7},
+ {"cdil", LCED},
+ {"cdsb", 0x301b}, /* ]] U+301b */
+ {"cent", 0xa2},
+ {"chacek", 0x10d},
+ {"chi", 0x3c7},
+ {"circ", LRNG},
+ {"circa", 0x63}, /* about (year) */
+ {"circbl", 0x325}, /* ring below accent U+0325 */
+ {"circle", 0x25cb}, /* U+25CB */
+ {"circledot", 0x2299},
+ {"click", 0x296},
+ {"club", 0x2663},
+ {"comtime", 0x43},
+ {"conj", 0x260c},
+ {"cprt", 0xa9},
+ {"cq", '\''},
+ {"cqq", 0x201d},
+ {"cross", 0x2720}, /* maltese cross U+2720 */
+ {"crotchet", 0x2669},
+ {"csb", 0x5d},
+ {"ctilde", 0x63}, /* +tilde */
+ {"ctlig", MLCT},
+ {"cyra", 0x430},
+ {"cyre", 0x435},
+ {"cyrhard", 0x44a},
+ {"cyrjat", 0x463},
+ {"cyrm", 0x43c},
+ {"cyrn", 0x43d},
+ {"cyrr", 0x440},
+ {"cyrsoft", 0x44c},
+ {"cyrt", 0x442},
+ {"cyry", 0x44b},
+ {"dag", 0x2020},
+ {"dbar", 0x111},
+ {"dblar", 0x21cb},
+ {"dblgt", 0x226b},
+ {"dbllt", 0x226a},
+ {"dced", 0x64}, /* +cedilla */
+ {"dd", MDD},
+ {"ddag", 0x2021},
+ {"ddd", MDDD},
+ {"decr", 0x2193},
+ {"deg", 0xb0},
+ {"dele", 0x64}, /* should be dele */
+ {"delta", 0x3b4},
+ {"descnode", 0x260b}, /* descending node U+260B */
+ {"diamond", 0x2662},
+ {"digamma", 0x3dd},
+ {"div", 0xf7},
+ {"dlessi", 0x131},
+ {"dlessj1", 0x6a}, /* should be dotless */
+ {"dlessj2", 0x6a}, /* should be dotless */
+ {"dlessj3", 0x6a}, /* should be dotless */
+ {"dollar", 0x24},
+ {"dotab", LDOT},
+ {"dotbl", LDTB},
+ {"drachm", 0x292},
+ {"dubh", 0x2d},
+ {"eacute", 0xe9},
+ {"earth", 0x2641},
+ {"easper", MEAS},
+ {"ebreve", 0x115},
+ {"ecirc", 0xea},
+ {"edh", 0xf0},
+ {"egrave", 0xe8},
+ {"ehacek", 0x11b},
+ {"ehook", 0x119},
+ {"elem", 0x220a},
+ {"elenis", MELN},
+ {"em", 0x2014},
+ {"emacr", 0x113},
+ {"emem", MEMM},
+ {"en", 0x2013},
+ {"epsilon", 0x3b5},
+ {"equil", 0x21cb},
+ {"ergo", 0x2234},
+ {"es", MES},
+ {"eszett", 0xdf},
+ {"eta", 0x3b7},
+ {"eth", 0xf0},
+ {"euml", 0xeb},
+ {"expon", 0x2191},
+ {"fact", 0x21},
+ {"fata", 0x251},
+ {"fatpara", 0xb6}, /* should have fatter, filled in bowl */
+ {"female", 0x2640},
+ {"ffilig", MLFFI},
+ {"fflig", MLFF},
+ {"ffllig", MLFFL},
+ {"filig", MLFI},
+ {"flat", 0x266d},
+ {"fllig", MLFL},
+ {"frE", 0x45}, /* should be curly */
+ {"frL", L'L'}, /* should be curly */
+ {"frR", 0x52}, /* should be curly */
+ {"frakB", 0x42}, /* should have fraktur style */
+ {"frakG", 0x47},
+ {"frakH", 0x48},
+ {"frakI", 0x49},
+ {"frakM", 0x4d},
+ {"frakU", 0x55},
+ {"frakX", 0x58},
+ {"frakY", 0x59},
+ {"frakh", 0x68},
+ {"frbl", LFRB},
+ {"frown", LFRN},
+ {"fs", 0x20},
+ {"fsigma", 0x3c2},
+ {"gAacute", 0xc1}, /* should be Α+acute */
+ {"gaacute", 0x3b1}, /* +acute */
+ {"gabreve", 0x3b1}, /* +breve */
+ {"gafrown", 0x3b1}, /* +frown */
+ {"gagrave", 0x3b1}, /* +grave */
+ {"gamacr", 0x3b1}, /* +macron */
+ {"gamma", 0x3b3},
+ {"gauml", 0x3b1}, /* +umlaut */
+ {"ge", 0x2267},
+ {"geacute", 0x3b5}, /* +acute */
+ {"gegrave", 0x3b5}, /* +grave */
+ {"ghacute", 0x3b7}, /* +acute */
+ {"ghfrown", 0x3b7}, /* +frown */
+ {"ghgrave", 0x3b7}, /* +grave */
+ {"ghmacr", 0x3b7}, /* +macron */
+ {"giacute", 0x3b9}, /* +acute */
+ {"gibreve", 0x3b9}, /* +breve */
+ {"gifrown", 0x3b9}, /* +frown */
+ {"gigrave", 0x3b9}, /* +grave */
+ {"gimacr", 0x3b9}, /* +macron */
+ {"giuml", 0x3b9}, /* +umlaut */
+ {"glagjat", 0x467},
+ {"glots", 0x2c0},
+ {"goacute", 0x3bf}, /* +acute */
+ {"gobreve", 0x3bf}, /* +breve */
+ {"grave", LGRV},
+ {"gt", 0x3e},
+ {"guacute", 0x3c5}, /* +acute */
+ {"gufrown", 0x3c5}, /* +frown */
+ {"gugrave", 0x3c5}, /* +grave */
+ {"gumacr", 0x3c5}, /* +macron */
+ {"guuml", 0x3c5}, /* +umlaut */
+ {"gwacute", 0x3c9}, /* +acute */
+ {"gwfrown", 0x3c9}, /* +frown */
+ {"gwgrave", 0x3c9}, /* +grave */
+ {"hacek", LHCK},
+ {"halft", 0x2308},
+ {"hash", 0x23},
+ {"hasper", MHAS},
+ {"hatpath", 0x5b2}, /* hataf patah U+05B2 */
+ {"hatqam", 0x5b3}, /* hataf qamats U+05B3 */
+ {"hatseg", 0x5b1}, /* hataf segol U+05B1 */
+ {"hbar", 0x127},
+ {"heart", 0x2661},
+ {"hebaleph", 0x5d0}, /* aleph U+05D0 */
+ {"hebayin", 0x5e2}, /* ayin U+05E2 */
+ {"hebbet", 0x5d1}, /* bet U+05D1 */
+ {"hebbeth", 0x5d1}, /* bet U+05D1 */
+ {"hebcheth", 0x5d7}, /* bet U+05D7 */
+ {"hebdaleth", 0x5d3}, /* dalet U+05D3 */
+ {"hebgimel", 0x5d2}, /* gimel U+05D2 */
+ {"hebhe", 0x5d4}, /* he U+05D4 */
+ {"hebkaph", 0x5db}, /* kaf U+05DB */
+ {"heblamed", 0x5dc}, /* lamed U+05DC */
+ {"hebmem", 0x5de}, /* mem U+05DE */
+ {"hebnun", 0x5e0}, /* nun U+05E0 */
+ {"hebnunfin", 0x5df}, /* final nun U+05DF */
+ {"hebpe", 0x5e4}, /* pe U+05E4 */
+ {"hebpedag", 0x5e3}, /* final pe? U+05E3 */
+ {"hebqoph", 0x5e7}, /* qof U+05E7 */
+ {"hebresh", 0x5e8}, /* resh U+05E8 */
+ {"hebshin", 0x5e9}, /* shin U+05E9 */
+ {"hebtav", 0x5ea}, /* tav U+05EA */
+ {"hebtsade", 0x5e6}, /* tsadi U+05E6 */
+ {"hebwaw", 0x5d5}, /* vav? U+05D5 */
+ {"hebyod", 0x5d9}, /* yod U+05D9 */
+ {"hebzayin", 0x5d6}, /* zayin U+05D6 */
+ {"hgz", 0x292}, /* ??? Cf "alet" */
+ {"hireq", 0x5b4}, /* U+05B4 */
+ {"hlenis", MHLN},
+ {"hook", LOGO},
+ {"horizE", 0x45}, /* should be on side */
+ {"horizP", 0x50}, /* should be on side */
+ {"horizS", 0x223d},
+ {"horizT", 0x22a3},
+ {"horizb", 0x7b}, /* should be underbrace */
+ {"ia", 0x3b1},
+ {"iacute", 0xed},
+ {"iasper", MIAS},
+ {"ib", 0x3b2},
+ {"ibar", 0x268},
+ {"ibreve", 0x12d},
+ {"icirc", 0xee},
+ {"id", 0x3b4},
+ {"ident", 0x2261},
+ {"ie", 0x3b5},
+ {"ifilig", MLFI},
+ {"ifflig", MLFF},
+ {"ig", 0x3b3},
+ {"igrave", 0xec},
+ {"ih", 0x3b7},
+ {"ii", 0x3b9},
+ {"ik", 0x3ba},
+ {"ilenis", MILN},
+ {"imacr", 0x12b},
+ {"implies", 0x21d2},
+ {"index", 0x261e},
+ {"infin", 0x221e},
+ {"integ", 0x222b},
+ {"intsec", 0x2229},
+ {"invpri", 0x2cf},
+ {"iota", 0x3b9},
+ {"iq", 0x3c8},
+ {"istlig", MLST},
+ {"isub", 0x3f5}, /* iota below accent */
+ {"iuml", 0xef},
+ {"iz", 0x3b6},
+ {"jup", 0x2643},
+ {"kappa", 0x3ba},
+ {"koppa", 0x3df},
+ {"lambda", 0x3bb},
+ {"lar", 0x2190},
+ {"lbar", 0x142},
+ {"le", 0x2266},
+ {"lenis", LLEN},
+ {"leo", 0x264c},
+ {"lhalfbr", 0x2308},
+ {"lhshoe", 0x2283},
+ {"libra", 0x264e},
+ {"llswing", MLLS},
+ {"lm", 0x2d0},
+ {"logicand", 0x2227},
+ {"logicor", 0x2228},
+ {"longs", 0x283},
+ {"lrar", 0x2194},
+ {"lt", 0x3c},
+ {"ltappr", 0x227e},
+ {"ltflat", 0x2220},
+ {"lumlbl", 0x6c}, /* +umlaut below */
+ {"mac", LMAC},
+ {"male", 0x2642},
+ {"mc", 0x63}, /* should be raised */
+ {"merc", 0x263f}, /* mercury U+263F */
+ {"min", 0x2212},
+ {"moonfq", 0x263d}, /* first quarter moon U+263D */
+ {"moonlq", 0x263e}, /* last quarter moon U+263E */
+ {"msylab", 0x6d}, /* +sylab (ˌ) */
+ {"mu", 0x3bc},
+ {"nacute", 0x144},
+ {"natural", 0x266e},
+ {"neq", 0x2260},
+ {"nfacute", 0x2032},
+ {"nfasper", 0x2bd},
+ {"nfbreve", 0x2d8},
+ {"nfced", 0xb8},
+ {"nfcirc", 0x2c6},
+ {"nffrown", 0x2322},
+ {"nfgra", 0x2cb},
+ {"nfhacek", 0x2c7},
+ {"nfmac", 0xaf},
+ {"nftilde", 0x2dc},
+ {"nfuml", 0xa8},
+ {"ng", 0x14b},
+ {"not", 0xac},
+ {"notelem", 0x2209},
+ {"ntilde", 0xf1},
+ {"nu", 0x3bd},
+ {"oab", 0x2329},
+ {"oacute", 0xf3},
+ {"oasper", MOAS},
+ {"ob", 0x7b},
+ {"obar", 0xf8},
+ {"obigb", 0x7b}, /* should be big */
+ {"obigpren", 0x28},
+ {"obigsb", 0x5b}, /* should be big */
+ {"obreve", 0x14f},
+ {"ocirc", 0xf4},
+ {"odsb", 0x301a}, /* [[ U+301A */
+ {"oelig", 0x153},
+ {"oeamp", 0x26},
+ {"ograve", 0xf2},
+ {"ohook", 0x6f}, /* +hook */
+ {"olenis", MOLN},
+ {"omacr", 0x14d},
+ {"omega", 0x3c9},
+ {"omicron", 0x3bf},
+ {"ope", 0x25b},
+ {"opp", 0x260d},
+ {"oq", 0x60},
+ {"oqq", 0x201c},
+ {"or", MOR},
+ {"osb", 0x5b},
+ {"otilde", 0xf5},
+ {"ouml", 0xf6},
+ {"ounce", 0x2125}, /* ounce U+2125 */
+ {"ovparen", 0x2322}, /* should be sideways ( */
+ {"p", 0x2032},
+ {"pa", 0x2202},
+ {"page", 0x50},
+ {"pall", 0x28e},
+ {"paln", 0x272},
+ {"par", PAR},
+ {"para", 0xb6},
+ {"pbar", 0x70}, /* +bar */
+ {"per", 0x2118}, /* per U+2118 */
+ {"phi", 0x3c6},
+ {"phi2", 0x3d5},
+ {"pi", 0x3c0},
+ {"pisces", 0x2653},
+ {"planck", 0x127},
+ {"plantinJ", 0x4a}, /* should be script */
+ {"pm", 0xb1},
+ {"pmil", 0x2030},
+ {"pp", 0x2033},
+ {"ppp", 0x2034},
+ {"prop", 0x221d},
+ {"psi", 0x3c8},
+ {"pstlg", 0xa3},
+ {"q", 0x3f}, /* should be raised */
+ {"qamets", 0x5b3}, /* U+05B3 */
+ {"quaver", 0x266a},
+ {"rar", 0x2192},
+ {"rasper", MRAS},
+ {"rdot", 0xb7},
+ {"recipe", 0x211e}, /* U+211E */
+ {"reg", 0xae},
+ {"revC", 0x186}, /* open O U+0186 */
+ {"reva", 0x252},
+ {"revc", 0x254},
+ {"revope", 0x25c},
+ {"revr", 0x279},
+ {"revsc", 0x2d2}, /* upside-down semicolon */
+ {"revv", 0x28c},
+ {"rfa", 0x6f}, /* +hook (Cf "goal") */
+ {"rhacek", 0x159},
+ {"rhalfbr", 0x2309},
+ {"rho", 0x3c1},
+ {"rhshoe", 0x2282},
+ {"rlenis", MRLN},
+ {"rsylab", 0x72}, /* +sylab */
+ {"runash", 0x46}, /* should be runic 'ash' */
+ {"rvow", 0x2d4},
+ {"sacute", 0x15b},
+ {"sagit", 0x2650},
+ {"sampi", 0x3e1},
+ {"saturn", 0x2644},
+ {"sced", 0x15f},
+ {"schwa", 0x259},
+ {"scorpio", 0x264f},
+ {"scrA", 0x41}, /* should be script */
+ {"scrC", 0x43},
+ {"scrE", 0x45},
+ {"scrF", 0x46},
+ {"scrI", 0x49},
+ {"scrJ", 0x4a},
+ {"scrL", L'L'},
+ {"scrO", 0x4f},
+ {"scrP", 0x50},
+ {"scrQ", 0x51},
+ {"scrS", 0x53},
+ {"scrT", 0x54},
+ {"scrb", 0x62},
+ {"scrd", 0x64},
+ {"scrh", 0x68},
+ {"scrl", 0x6c},
+ {"scruple", 0x2108}, /* U+2108 */
+ {"sdd", 0x2d0},
+ {"sect", 0xa7},
+ {"semE", 0x2203},
+ {"sh", 0x283},
+ {"shacek", 0x161},
+ {"sharp", 0x266f},
+ {"sheva", 0x5b0}, /* U+05B0 */
+ {"shti", 0x26a},
+ {"shtsyll", 0x222a},
+ {"shtu", 0x28a},
+ {"sidetri", 0x22b2},
+ {"sigma", 0x3c3},
+ {"since", 0x2235},
+ {"slge", 0x2265}, /* should have slanted line under */
+ {"slle", 0x2264}, /* should have slanted line under */
+ {"sm", 0x2c8},
+ {"smm", 0x2cc},
+ {"spade", 0x2660},
+ {"sqrt", 0x221a},
+ {"square", 0x25a1}, /* U+25A1 */
+ {"ssChi", 0x3a7}, /* should be sans serif */
+ {"ssIota", 0x399},
+ {"ssOmicron", 0x39f},
+ {"ssPi", 0x3a0},
+ {"ssRho", 0x3a1},
+ {"ssSigma", 0x3a3},
+ {"ssTau", 0x3a4},
+ {"star", 0x2a},
+ {"stlig", MLST},
+ {"sup2", 0x2072},
+ {"supgt", 0x2c3},
+ {"suplt", 0x2c2},
+ {"sur", 0x2b3},
+ {"swing", 0x223c},
+ {"tau", 0x3c4},
+ {"taur", 0x2649},
+ {"th", 0xfe},
+ {"thbar", 0xfe}, /* +bar */
+ {"theta", 0x3b8},
+ {"thinqm", 0x3f}, /* should be thinner */
+ {"tilde", LTIL},
+ {"times", 0xd7},
+ {"tri", 0x2206},
+ {"trli", 0x2016},
+ {"ts", 0x2009},
+ {"uacute", 0xfa},
+ {"uasper", MUAS},
+ {"ubar", 0x75}, /* +bar */
+ {"ubreve", 0x16d},
+ {"ucirc", 0xfb},
+ {"udA", 0x2200},
+ {"udT", 0x22a5},
+ {"uda", 0x250},
+ {"udh", 0x265},
+ {"udqm", 0xbf},
+ {"udpsi", 0x22d4},
+ {"udtr", 0x2207},
+ {"ugrave", 0xf9},
+ {"ulenis", MULN},
+ {"umacr", 0x16b},
+ {"uml", LUML},
+ {"undl", 0x2cd}, /* underline accent */
+ {"union", 0x222a},
+ {"upsilon", 0x3c5},
+ {"uuml", 0xfc},
+ {"vavpath", 0x5d5}, /* vav U+05D5 (+patah) */
+ {"vavsheva", 0x5d5}, /* vav U+05D5 (+sheva) */
+ {"vb", 0x7c},
+ {"vddd", 0x22ee},
+ {"versicle2", 0x2123}, /* U+2123 */
+ {"vinc", 0xaf},
+ {"virgo", 0x264d},
+ {"vpal", 0x25f},
+ {"vvf", 0x263},
+ {"wasper", MWAS},
+ {"wavyeq", 0x2248},
+ {"wlenis", MWLN},
+ {"wyn", 0x1bf}, /* wynn U+01BF */
+ {"xi", 0x3be},
+ {"yacute", 0xfd},
+ {"ycirc", 0x177},
+ {"ygh", 0x292},
+ {"ymacr", 0x79}, /* +macron */
+ {"yuml", 0xff},
+ {"zced", 0x7a}, /* +cedilla */
+ {"zeta", 0x3b6},
+ {"zh", 0x292},
+ {"zhacek", 0x17e},
+};
+/*
+ The following special characters don't have close enough
+ equivalents in Unicode, so aren't in the above table.
+ 22n 2^(2^n) Cf Fermat
+ 2on4 2/4
+ 3on8 3/8
+ Bantuo Bantu O. Cf Otshi-herero
+ Car C with circular arrow on top
+ albrtime cut-time: C with vertical line
+ ardal Cf dental
+ bantuo Bantu o. Cf Otshi-herero
+ bbc1 single chem bond below
+ bbc2 double chem bond below
+ bbl1 chem bond like /
+ bbl2 chem bond like //
+ bbr1 chem bond like \
+ bbr2 chem bond \\
+ bcop1 copper symbol. Cf copper
+ bcop2 copper symbol. Cf copper
+ benchm Cf benchmark
+ btc1 single chem bond above
+ btc2 double chem bond above
+ btl1 chem bond like \
+ btl2 chem bond like \\
+ btr1 chem bond like /
+ btr2 chem bond line //
+ burman Cf Burman
+ devph sanskrit letter. Cf ph
+ devrfls sanskrit letter. Cf cerebral
+ duplong[12] musical note
+ egchi early form of chi
+ eggamma[12] early form of gamma
+ egiota early form of iota
+ egkappa early form of kappa
+ eglambda early form of lambda
+ egmu[12] early form of mu
+ egnu[12] early form of nu
+ egpi[123] early form of pi
+ egrho[12] early form of rho
+ egsampi early form of sampi
+ egsan early form of san
+ egsigma[12] early form of sigma
+ egxi[123] early form of xi
+ elatS early form of S
+ elatc[12] early form of C
+ elatg[12] early form of G
+ glagjeri Slavonic Glagolitic jeri
+ glagjeru Slavonic Glagolitic jeru
+ hypolem hypolemisk (line with underdot)
+ lhrbr lower half }
+ longmord long mordent
+ mbwvow backwards scretched C. Cf retract.
+ mord music symbol. Cf mordent
+ mostra Cf direct
+ ohgcirc old form of circumflex
+ oldbeta old form of β. Cf perturbate
+ oldsemibr[12] old forms of semibreve. Cf prolation
+ ormg old form of g. Cf G
+ para[12345] form of ¶
+ pauseo musical pause sign
+ pauseu musical pause sign
+ pharyng Cf pharyngal
+ ragr Black letter ragged r
+ repetn musical repeat. Cf retort
+ segno musical segno sign
+ semain[12] semitic ain
+ semhe semitic he
+ semheth semitic heth
+ semkaph semitic kaph
+ semlamed[12] semitic lamed
+ semmem semitic mem
+ semnum semitic nun
+ sempe semitic pe
+ semqoph[123] semitic qoph
+ semresh semitic resh
+ semtav[1234] semitic tav
+ semyod semitic yod
+ semzayin[123] semitic zayin
+ shtlong[12] U with underbar. Cf glyconic
+ sigmatau σ,τ combination
+ squaver sixteenth note
+ sqbreve square musical breve note
+ swast swastika
+ uhrbr upper half of big }
+ versicle1 Cf versicle
+ */
+
+
+static Rune normtab[128] = {
+ /*0*/ /*1*/ /*2*/ /*3*/ /*4*/ /*5*/ /*6*/ /*7*/
+/*00*/ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, ' ', NONE, NONE, NONE, NONE, NONE,
+/*10*/ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+/*20*/ 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, SPCS, '\'',
+ 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
+/*30*/ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
+ 0x38, 0x39, 0x3a, 0x3b, TAGS, 0x3d, TAGE, 0x3f,
+/*40*/ 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
+ 0x48, 0x49, 0x4a, 0x4b, L'L', 0x4d, 0x4e, 0x4f,
+/*50*/ 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
+ 0x58, 0x59, 0x5a, 0x5b, L'\\', 0x5d, 0x5e, 0x5f,
+/*60*/ 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
+ 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
+/*70*/ 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
+ 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, NONE,
+};
+#if 0
+static Rune phtab[128] = {
+ /*0*/ /*1*/ /*2*/ /*3*/ /*4*/ /*5*/ /*6*/ /*7*/
+/*00*/ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+/*10*/ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+/*20*/ 0x20, 0x21, 0x2c8, 0x23, 0x24, 0x2cc, 0xe6, '\'',
+ 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
+/*30*/ 0x30, 0x31, 0x32, 0x25c, 0x34, 0x35, 0x36, 0x37,
+ 0x38, 0xf8, 0x2d0, 0x3b, TAGS, 0x3d, TAGE, 0x3f,
+/*40*/ 0x259, 0x251, 0x42, 0x43, 0xf0, 0x25b, 0x46, 0x47,
+ 0x48, 0x26a, 0x4a, 0x4b, L'L', 0x4d, 0x14b, 0x254,
+/*50*/ 0x50, 0x252, 0x52, 0x283, 0x3b8, 0x28a, 0x28c, 0x57,
+ 0x58, 0x59, 0x292, 0x5b, L'\\', 0x5d, 0x5e, 0x5f,
+/*60*/ 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
+ 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
+/*70*/ 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
+ 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, NONE,
+};
+static Rune grtab[128] = {
+ /*0*/ /*1*/ /*2*/ /*3*/ /*4*/ /*5*/ /*6*/ /*7*/
+/*00*/ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+/*10*/ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+/*20*/ 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, SPCS, '\'',
+ 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
+/*30*/ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
+ 0x38, 0x39, 0x3a, 0x3b, TAGS, 0x3d, TAGE, 0x3f,
+/*40*/ 0x40, 0x391, 0x392, 0x39e, 0x394, 0x395, 0x3a6, 0x393,
+ 0x397, 0x399, 0x3da, 0x39a, 0x39b, 0x39c, 0x39d, 0x39f,
+/*50*/ 0x3a0, 0x398, 0x3a1, 0x3a3, 0x3a4, 0x3a5, 0x56, 0x3a9,
+ 0x3a7, 0x3a8, 0x396, 0x5b, L'\\', 0x5d, 0x5e, 0x5f,
+/*60*/ 0x60, 0x3b1, 0x3b2, 0x3be, 0x3b4, 0x3b5, 0x3c6, 0x3b3,
+ 0x3b7, 0x3b9, 0x3c2, 0x3ba, 0x3bb, 0x3bc, 0x3bd, 0x3bf,
+/*70*/ 0x3c0, 0x3b8, 0x3c1, 0x3c3, 0x3c4, 0x3c5, 0x76, 0x3c9,
+ 0x3c7, 0x3c8, 0x3b6, 0x7b, 0x7c, 0x7d, 0x7e, NONE,
+};
+static Rune subtab[128] = {
+ /*0*/ /*1*/ /*2*/ /*3*/ /*4*/ /*5*/ /*6*/ /*7*/
+/*00*/ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+/*10*/ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+/*20*/ 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, SPCS, '\'',
+ 0x208d, 0x208e, 0x2a, 0x208a, 0x2c, 0x208b, 0x2e, 0x2f,
+/*30*/ 0x2080, 0x2081, 0x2082, 0x2083, 0x2084, 0x2085, 0x2086, 0x2087,
+ 0x2088, 0x2089, 0x3a, 0x3b, TAGS, 0x208c, TAGE, 0x3f,
+/*40*/ 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
+ 0x48, 0x49, 0x4a, 0x4b, L'L', 0x4d, 0x4e, 0x4f,
+/*50*/ 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
+ 0x58, 0x59, 0x5a, 0x5b, L'\\', 0x5d, 0x5e, 0x5f,
+/*60*/ 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
+ 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
+/*70*/ 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
+ 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, NONE,
+};
+static Rune suptab[128] = {
+ /*0*/ /*1*/ /*2*/ /*3*/ /*4*/ /*5*/ /*6*/ /*7*/
+/*00*/ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+/*10*/ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+/*20*/ 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, SPCS, '\'',
+ 0x207d, 0x207e, 0x2a, 0x207a, 0x2c, 0x207b, 0x2e, 0x2f,
+/*30*/ 0x2070, 0x2071, 0x2072, 0x2073, 0x2074, 0x2075, 0x2076, 0x2077,
+ 0x2078, 0x2079, 0x3a, 0x3b, TAGS, 0x207c, TAGE, 0x3f,
+/*40*/ 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
+ 0x48, 0x49, 0x4a, 0x4b, L'L', 0x4d, 0x4e, 0x4f,
+/*50*/ 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
+ 0x58, 0x59, 0x5a, 0x5b, L'\\', 0x5d, 0x5e, 0x5f,
+/*60*/ 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
+ 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
+/*70*/ 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
+ 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, NONE,
+};
+#endif
+
+static int tagstarts;
+static char tag[Buflen];
+static char spec[Buflen];
+static Entry curentry;
+#define cursize (curentry.end-curentry.start)
+
+static char *getspec(char *, char *);
+static char *gettag(char *, char *);
+
+/*
+ * cmd is one of:
+ * 'p': normal print
+ * 'h': just print headwords
+ * 'P': print raw
+ */
+void
+pgwprintentry(Entry e, int cmd)
+{
+ char *p, *pe;
+ int t;
+ long r, rprev, rlig;
+ Rune *transtab;
+
+ p = e.start;
+ pe = e.end;
+ transtab = normtab;
+ rprev = NONE;
+ changett(0, 0, 0);
+ curentry = e;
+ if(cmd == 'h')
+ outinhibit = 1;
+ while(p < pe) {
+ if(cmd == 'r') {
+ outchar(*p++);
+ continue;
+ }
+ r = transtab[(*p++)&0x7F];
+ if(r < NONE) {
+ /* Emit the rune, but buffer in case of ligature */
+ if(rprev != NONE)
+ outrune(rprev);
+ rprev = r;
+ } else if(r == SPCS) {
+ /* Start of special character name */
+ p = getspec(p, pe);
+ r = lookassoc(spectab, asize(spectab), spec);
+ if(r == -1) {
+ if(debug)
+ err("spec %ld %d %s",
+ e.doff, cursize, spec);
+ r = 0xfffd;
+ }
+ if(r >= LIGS && r < LIGE) {
+ /* handle possible ligature */
+ rlig = liglookup(r, rprev);
+ if(rlig != NONE)
+ rprev = rlig; /* overwrite rprev */
+ else {
+ /* could print accent, but let's not */
+ if(rprev != NONE) outrune(rprev);
+ rprev = NONE;
+ }
+ } else if(r >= MULTI && r < MULTIE) {
+ if(rprev != NONE) {
+ outrune(rprev);
+ rprev = NONE;
+ }
+ outrunes(multitab[r-MULTI]);
+ } else if(r == PAR) {
+ if(rprev != NONE) {
+ outrune(rprev);
+ rprev = NONE;
+ }
+ outnl(1);
+ } else {
+ if(rprev != NONE) outrune(rprev);
+ rprev = r;
+ }
+ } else if(r == TAGS) {
+ /* Start of tag name */
+ if(rprev != NONE) {
+ outrune(rprev);
+ rprev = NONE;
+ }
+ p = gettag(p, pe);
+ t = lookassoc(tagtab, asize(tagtab), tag);
+ if(t == -1) {
+ if(debug)
+ err("tag %ld %d %s",
+ e.doff, cursize, tag);
+ continue;
+ }
+ switch(t){
+ case Hw:
+ if(cmd == 'h') {
+ if(!tagstarts)
+ outchar(' ');
+ outinhibit = !tagstarts;
+ }
+ break;
+ case Sn:
+ if(tagstarts) {
+ outnl(2);
+ }
+ break;
+ case P:
+ outnl(tagstarts);
+ break;
+ case Col:
+ case Br:
+ case Blockquote:
+ if(tagstarts)
+ outnl(1);
+ break;
+ case U:
+ outchar('/');
+ }
+ }
+ }
+ if(cmd == 'h') {
+ outinhibit = 0;
+ outnl(0);
+ }
+}
+
+/*
+ * Return offset into bdict where next webster entry after fromoff starts.
+ * Webster entries start with <p><hw>
+ */
+long
+pgwnextoff(long fromoff)
+{
+ long a, n;
+ int c;
+
+ a = Bseek(bdict, fromoff, 0);
+ if(a != fromoff)
+ return -1;
+ n = 0;
+ for(;;) {
+ c = Bgetc(bdict);
+ if(c < 0)
+ break;
+ if(c == '<' && Bgetc(bdict) == 'p' && Bgetc(bdict) == '>') {
+ c = Bgetc(bdict);
+ if(c == '<') {
+ if (Bgetc(bdict) == 'h' && Bgetc(bdict) == 'w'
+ && Bgetc(bdict) == '>')
+ n = 7;
+ }else if (c == '{')
+ n = 4;
+ if(n)
+ break;
+ }
+ }
+ return (Boffset(bdict)-n);
+}
+
+static char *prkey =
+"KEY TO THE PRONUNCIATION\n"
+"\n"
+"I. CONSONANTS\n"
+"b, d, f, k, l, m, n, p, t, v, z: usual English values\n"
+"\n"
+"g as in go (gəʊ)\n"
+"h ... ho! (həʊ)\n"
+"r ... run (rʌn), terrier (ˈtɛriə(r))\n"
+"(r)... her (hɜː(r))\n"
+"s ... see (siː), success (səkˈsɜs)\n"
+"w ... wear (wɛə(r))\n"
+"hw ... when (hwɛn)\n"
+"j ... yes (jɛs)\n"
+"θ ... thin (θin), bath (bɑːθ)\n"
+"ð ... then (ðɛn), bathe (beɪð)\n"
+"ʃ ... shop (ʃɒp), dish (dɪʃ)\n"
+"tʃ ... chop (tʃɒp), ditch (dɪtʃ)\n"
+"ʒ ... vision (ˈvɪʒən), déjeuner (deʒøne)\n"
+"dʒ ... judge (dʒʌdʒ)\n"
+"ŋ ... singing (ˈsɪŋɪŋ), think (θiŋk)\n"
+"ŋg ... finger (ˈfiŋgə(r))\n"
+"\n"
+"Foreign\n"
+"ʎ as in It. seraglio (serˈraʎo)\n"
+"ɲ ... Fr. cognac (kɔɲak)\n"
+"x ... Ger. ach (ax), Sc. loch (lɒx)\n"
+"ç ... Ger. ich (ɪç), Sc. nicht (nɪçt)\n"
+"ɣ ... North Ger. sagen (ˈzaːɣən)\n"
+"c ... Afrikaans baardmannetjie (ˈbaːrtmanəci)\n"
+"ɥ ... Fr. cuisine (kɥizin)\n"
+"\n"
+"II. VOWELS AND DIPTHONGS\n"
+"\n"
+"Short\n"
+"ɪ as in pit (pɪt), -ness (-nɪs)\n"
+"ɛ ... pet (pɛt), Fr. sept (sɛt)\n"
+"æ ... pat (pæt)\n"
+"ʌ ... putt (pʌt)\n"
+"ɒ ... pot (pɒt)\n"
+"ʊ ... put (pʊt)\n"
+"ə ... another (əˈnʌðə(r))\n"
+"(ə)... beaten (ˈbiːt(ə)n)\n"
+"i ... Fr. si (si)\n"
+"e ... Fr. bébé (bebe)\n"
+"a ... Fr. mari (mari)\n"
+"ɑ ... Fr. bâtiment (bɑtimã)\n"
+"ɔ ... Fr. homme (ɔm)\n"
+"o ... Fr. eau (o)\n"
+"ø ... Fr. peu (pø)\n"
+"œ ... Fr. boeuf (bœf), coeur (kœr)\n"
+"u ... Fr. douce (dus)\n"
+"ʏ ... Ger. Müller (ˈmʏlər)\n"
+"y ... Fr. du (dy)\n"
+"\n"
+"Long\n"
+"iː as in bean (biːn)\n"
+"ɑː ... barn (bɑːn)\n"
+"ɔː ... born (bɔːn)\n"
+"uː ... boon (buːn)\n"
+"ɜː ... burn (bɜːn)\n"
+"eː ... Ger. Schnee (ʃneː)\n"
+"ɛː ... Ger. Fähre (ˈfɛːrə)\n"
+"aː ... Ger. Tag (taːk)\n"
+"oː ... Ger. Sohn (zoːn)\n"
+"øː ... Ger. Goethe (gøːtə)\n"
+"yː ... Ger. grün (gryːn)\n"
+"\n"
+"Nasal\n"
+"ɛ˜, æ˜ as in Fr. fin (fɛ˜, fæ˜)\n"
+"ã ... Fr. franc (frã)\n"
+"ɔ˜ ... Fr. bon (bɔ˜n)\n"
+"œ˜ ... Fr. un (œ˜)\n"
+"\n"
+"Dipthongs, etc.\n"
+"eɪ as in bay (beɪ)\n"
+"aɪ ... buy (baɪ)\n"
+"ɔɪ ... boy (bɔɪ)\n"
+"əʊ ... no (nəʊ)\n"
+"aʊ ... now (naʊ)\n"
+"ɪə ... peer (pɪə(r))\n"
+"ɛə ... pair (pɛə(r))\n"
+"ʊə ... tour (tʊə(r))\n"
+"ɔə ... boar (bɔə(r))\n"
+"\n"
+"III. STRESS\n"
+"\n"
+"Main stress: ˈ preceding stressed syllable\n"
+"Secondary stress: ˌ preceding stressed syllable\n"
+"\n"
+"E.g.: pronunciation (prəˌnʌnsɪˈeɪʃ(ə)n)\n";
+/* TODO: find transcriptions of foreign consonents, œ, ʏ, nasals */
+
+void
+pgwprintkey(void)
+{
+ Bprint(bout, "%s", prkey);
+}
+
+/*
+ * f points just after a '&', fe points at end of entry.
+ * Accumulate the special name, starting after the &
+ * and continuing until the next ';', in spec[].
+ * Return pointer to char after ';'.
+ */
+static char *
+getspec(char *f, char *fe)
+{
+ char *t;
+ int c, i;
+
+ t = spec;
+ i = sizeof spec;
+ while(--i > 0) {
+ c = *f++;
+ if(c == ';' || f == fe)
+ break;
+ *t++ = c;
+ }
+ *t = 0;
+ return f;
+}
+
+/*
+ * f points just after '<'; fe points at end of entry.
+ * Expect next characters from bin to match:
+ * [/][^ >]+( [^>=]+=[^ >]+)*>
+ * tag auxname auxval
+ * Accumulate the tag and its auxilliary information in
+ * tag[], auxname[][] and auxval[][].
+ * Set tagstarts=1 if the tag is 'starting' (has no '/'), else 0.
+ * Set naux to the number of aux pairs found.
+ * Return pointer to after final '>'.
+ */
+static char *
+gettag(char *f, char *fe)
+{
+ char *t;
+ int c, i;
+
+ t = tag;
+ c = *f++;
+ if(c == '/')
+ tagstarts = 0;
+ else {
+ tagstarts = 1;
+ *t++ = c;
+ }
+ i = Buflen;
+ while(--i > 0) {
+ c = *f++;
+ if(c == '>' || f == fe)
+ break;
+ *t++ = c;
+ }
+ *t = 0;
+ return f;
+}
diff --git a/src/cmd/dict/rev.awk b/src/cmd/dict/rev.awk
new file mode 100644
index 00000000..3c77d684
--- /dev/null
+++ b/src/cmd/dict/rev.awk
@@ -0,0 +1,6 @@
+NF == 2 {
+ printf "%s\t%s\n", $2, $1
+ }
+NF != 2 {
+ print "ERROR " $0
+ }
diff --git a/src/cmd/dict/robert.c b/src/cmd/dict/robert.c
new file mode 100644
index 00000000..53b72dfb
--- /dev/null
+++ b/src/cmd/dict/robert.c
@@ -0,0 +1,312 @@
+#include <u.h>
+#include <libc.h>
+#include <bio.h>
+#include "dict.h"
+
+/*
+ * Robert Électronique.
+ */
+
+enum
+{
+ CIT = MULTIE+1, /* citation ptr followed by long int and ascii label */
+ BROM, /* bold roman */
+ ITON, /* start italic */
+ ROM, /* roman */
+ SYM, /* symbol font? */
+ HEL, /* helvetica */
+ BHEL, /* helvetica bold */
+ SMALL, /* smaller? */
+ ITOFF, /* end italic */
+ SUP, /* following character is superscript */
+ SUB /* following character is subscript */
+};
+
+static Rune intab[256] = {
+ /*0*/ /*1*/ /*2*/ /*3*/ /*4*/ /*5*/ /*6*/ /*7*/
+/*00*/ NONE, 0x263a, 0x263b, 0x2665, 0x2666, 0x2663, 0x2660, 0x2022,
+ 0x25d8, 0x298, L'\n', 0x2642, 0x2640, 0x266a, 0x266b, 0x203b,
+/*10*/ 0x21e8, 0x21e6, 0x2195, 0x203c, 0xb6, 0xa7, 0x2043, 0x21a8,
+ 0x2191, 0x2193, 0x2192, 0x2190, 0x2319, 0x2194, 0x25b4, 0x25be,
+/*20*/ 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, L'\'',
+ 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
+/*30*/ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
+ 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
+/*40*/ 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
+ 0x48, 0x49, 0x4a, 0x4b, L'L', 0x4d, 0x4e, 0x4f,
+/*50*/ 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
+ 0x58, 0x59, 0x5a, 0x5b, L'\\', 0x5d, 0x5e, 0x5f,
+/*60*/ 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
+ 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
+/*70*/ 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
+ 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f,
+/*80*/ 0xc7, 0xfc, 0xe9, 0xe2, 0xe4, 0xe0, 0xe5, 0xe7,
+ 0xea, 0xeb, 0xe8, 0xef, 0xee, 0xec, 0xc4, 0xc5,
+/*90*/ 0xc9, 0xe6, 0xc6, 0xf4, 0xf6, 0xf2, 0xfb, 0xf9,
+ 0xff, 0xd6, 0xdc, 0xa2, 0xa3, 0xa5, 0x20a7, 0x283,
+/*a0*/ 0xe1, 0xed, 0xf3, 0xfa, 0xf1, 0xd1, 0xaa, 0xba,
+ 0xbf, 0x2310, 0xac, 0xbd, 0xbc, 0xa1, 0xab, 0xbb,
+/*b0*/ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+/*c0*/ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ CIT, BROM, NONE, ITON, ROM, SYM, HEL, BHEL,
+/*d0*/ NONE, SMALL, ITOFF, SUP, SUB, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+/*e0*/ 0x3b1, 0xdf, 0x3b3, 0x3c0, 0x3a3, 0x3c3, 0xb5, 0x3c4,
+ 0x3a6, 0x398, 0x3a9, 0x3b4, 0x221e, 0xd8, 0x3b5, 0x2229,
+/*f0*/ 0x2261, 0xb1, 0x2265, 0x2264, 0x2320, 0x2321, 0xf7, 0x2248,
+ 0xb0, 0x2219, 0xb7, 0x221a, 0x207f, 0xb2, 0x220e, 0xa0,
+};
+
+static Rune suptab[] = {
+ ['0'] 0x2070, ['1'] 0x2071, ['2'] 0x2072, ['3'] 0x2073,
+ ['4'] 0x2074, ['5'] 0x2075, ['6'] 0x2076, ['7'] 0x2077,
+ ['8'] 0x2078, ['9'] 0x2079, ['+'] 0x207a, ['-'] 0x207b,
+ ['='] 0x207c, ['('] 0x207d, [')'] 0x207e, ['a'] 0xaa,
+ ['n'] 0x207f, ['o'] 0xba
+};
+
+static Rune subtab[] = {
+ ['0'] 0x2080, ['1'] 0x2081, ['2'] 0x2082, ['3'] 0x2083,
+ ['4'] 0x2084, ['5'] 0x2085, ['6'] 0x2086, ['7'] 0x2087,
+ ['8'] 0x2088, ['9'] 0x2089, ['+'] 0x208a, ['-'] 0x208b,
+ ['='] 0x208c, ['('] 0x208d, [')'] 0x208e
+};
+
+#define GSHORT(p) (((p)[0]<<8) | (p)[1])
+#define GLONG(p) (((p)[0]<<24) | ((p)[1]<<16) | ((p)[2]<<8) | (p)[3])
+
+static char cfile[] = "/lib/dict/robert/cits.rob";
+static char dfile[] = "/lib/dict/robert/defs.rob";
+static char efile[] = "/lib/dict/robert/etym.rob";
+static char kfile[] = "/lib/dict/robert/_phon";
+
+static Biobuf * cb;
+static Biobuf * db;
+static Biobuf * eb;
+
+static Biobuf * Bouvrir(char*);
+static void citation(int, int);
+static void robertprintentry(Entry*, Entry*, int);
+
+void
+robertindexentry(Entry e, int cmd)
+{
+ uchar *p = (uchar *)e.start;
+ long ea, el, da, dl, fa;
+ Entry def, etym;
+
+ ea = GLONG(&p[0]);
+ el = GSHORT(&p[4]);
+ da = GLONG(&p[6]);
+ dl = GSHORT(&p[10]);
+ fa = GLONG(&p[12]);
+ USED(fa);
+
+ if(db == 0)
+ db = Bouvrir(dfile);
+ def.start = malloc(dl+1);
+ def.end = def.start + dl;
+ def.doff = da;
+ Bseek(db, da, 0);
+ Bread(db, def.start, dl);
+ *def.end = 0;
+ if(cmd == 'h'){
+ robertprintentry(&def, 0, cmd);
+ }else{
+ if(eb == 0)
+ eb = Bouvrir(efile);
+ etym.start = malloc(el+1);
+ etym.end = etym.start + el;
+ etym.doff = ea;
+ Bseek(eb, ea, 0);
+ Bread(eb, etym.start, el);
+ *etym.end = 0;
+ robertprintentry(&def, &etym, cmd);
+ free(etym.start);
+ }
+ free(def.start);
+}
+
+static void
+robertprintentry(Entry *def, Entry *etym, int cmd)
+{
+ uchar *p, *pe;
+ Rune r; int c, n;
+ int baseline = 0;
+ int lineno = 0;
+ int cit = 0;
+
+ p = (uchar *)def->start;
+ pe = (uchar *)def->end;
+ while(p < pe){
+ if(cmd == 'r'){
+ outchar(*p++);
+ continue;
+ }
+ c = *p++;
+ switch(r = intab[c]){ /* assign = */
+ case BROM:
+ case ITON:
+ case ROM:
+ case SYM:
+ case HEL:
+ case BHEL:
+ case SMALL:
+ case ITOFF:
+ case NONE:
+ if(debug)
+ outprint("\\%.2ux", c);
+ baseline = 0;
+ break;
+
+ case SUP:
+ baseline = 1;
+ break;
+
+ case SUB:
+ baseline = -1;
+ break;
+
+ case CIT:
+ n = p[0] | (p[1]<<8) | (p[2]<<16) | (p[3]<<24);
+ p += 4;
+ if(debug)
+ outprint("[%d]", n);
+ while(*p == ' ' || ('0'<=*p && *p<='9') || *p == '.'){
+ if(debug)
+ outchar(*p);
+ ++p;
+ }
+ ++cit;
+ outnl(2);
+ citation(n, cmd);
+ baseline = 0;
+ break;
+
+ case '\n':
+ outnl(0);
+ baseline = 0;
+ ++lineno;
+ break;
+
+ default:
+ if(baseline > 0 && r < nelem(suptab))
+ r = suptab[r];
+ else if(baseline < 0 && r < nelem(subtab))
+ r = subtab[r];
+ if(cit){
+ outchar('\n');
+ cit = 0;
+ }
+ outrune(r);
+ baseline = 0;
+ break;
+ }
+ if(r == '\n'){
+ if(cmd == 'h')
+ break;
+ if(lineno == 1 && etym)
+ robertprintentry(etym, 0, cmd);
+ }
+ }
+ outnl(0);
+}
+
+static void
+citation(int addr, int cmd)
+{
+ Entry cit;
+
+ if(cb == 0)
+ cb = Bouvrir(cfile);
+ Bseek(cb, addr, 0);
+ cit.start = Brdline(cb, 0xc8);
+ cit.end = cit.start + Blinelen(cb) - 1;
+ cit.doff = addr;
+ *cit.end = 0;
+ robertprintentry(&cit, 0, cmd);
+}
+
+long
+robertnextoff(long fromoff)
+{
+ return (fromoff & ~15) + 16;
+}
+
+void
+robertprintkey(void)
+{
+ Biobuf *db;
+ char *l;
+
+ db = Bouvrir(kfile);
+ while(l = Brdline(db, '\n')) /* assign = */
+ Bwrite(bout, l, Blinelen(db));
+ Bterm(db);
+}
+
+void
+robertflexentry(Entry e, int cmd)
+{
+ uchar *p, *pe;
+ Rune r; int c;
+ int lineno = 1;
+
+ p = (uchar *)e.start;
+ pe = (uchar *)e.end;
+ while(p < pe){
+ if(cmd == 'r'){
+ Bputc(bout, *p++);
+ continue;
+ }
+ c = *p++;
+ r = intab[c];
+ if(r == '$')
+ r = '\n';
+ if(r == '\n'){
+ ++lineno;
+ if(cmd == 'h' && lineno > 2)
+ break;
+ }
+ if(cmd == 'h' && lineno < 2)
+ continue;
+ if(r > MULTIE){
+ if(debug)
+ Bprint(bout, "\\%.2ux", c);
+ continue;
+ }
+ if(r < Runeself)
+ Bputc(bout, r);
+ else
+ Bputrune(bout, r);
+ }
+ outnl(0);
+}
+
+long
+robertnextflex(long fromoff)
+{
+ int c;
+
+ if(Bseek(bdict, fromoff, 0) < 0)
+ return -1;
+ while((c = Bgetc(bdict)) >= 0){
+ if(c == '$')
+ return Boffset(bdict);
+ }
+ return -1;
+}
+
+static Biobuf *
+Bouvrir(char *fichier)
+{
+ Biobuf *db;
+
+ db = Bopen(fichier, OREAD);
+ if(db == 0){
+ fprint(2, "%s: impossible d'ouvrir %s: %r\n", argv0, fichier);
+ exits("ouvrir");
+ }
+ return db;
+}
diff --git a/src/cmd/dict/simple.c b/src/cmd/dict/simple.c
new file mode 100644
index 00000000..ea0443ba
--- /dev/null
+++ b/src/cmd/dict/simple.c
@@ -0,0 +1,46 @@
+#include <u.h>
+#include <libc.h>
+#include <bio.h>
+#include "dict.h"
+
+/*
+ * Routines for handling dictionaries in UTF, headword
+ * separated from entry by tab, entries separated by newline.
+ */
+
+void
+simpleprintentry(Entry e, int cmd)
+{
+ uchar *p, *pe;
+
+ p = (uchar *)e.start;
+ pe = (uchar *)e.end;
+ while(p < pe){
+ if(*p == '\t'){
+ if(cmd == 'h')
+ break;
+ else
+ outchar(' '), ++p;
+ }else if(*p == '\n')
+ break;
+ else
+ outchar(*p++);
+ }
+ outnl(0);
+}
+
+long
+simplenextoff(long fromoff)
+{
+ if(Bseek(bdict, fromoff, 0) < 0)
+ return -1;
+ if(Brdline(bdict, '\n') == 0)
+ return -1;
+ return Boffset(bdict);
+}
+
+void
+simpleprintkey(void)
+{
+ Bprint(bout, "No pronunciation key.\n");
+}
diff --git a/src/cmd/dict/slang.c b/src/cmd/dict/slang.c
new file mode 100644
index 00000000..bd32b976
--- /dev/null
+++ b/src/cmd/dict/slang.c
@@ -0,0 +1,203 @@
+#include <u.h>
+#include <libc.h>
+#include <bio.h>
+#include "dict.h"
+
+/* Possible tags */
+enum {
+ DF, /* definition */
+ DX, /* definition/example */
+ ET, /* etymology */
+ EX, /* example */
+ LA, /* label */
+ ME, /* main entry */
+ NU, /* sense number */
+ PR, /* pronunciation */
+ PS, /* grammar part */
+ XR, /* cross reference */
+ XX, /* cross reference (whole entry) */
+};
+
+/* Assoc tables must be sorted on first field */
+
+static Assoc tagtab[] = {
+ {"df", DF},
+ {"dx", DX},
+ {"et", ET},
+ {"ex", EX},
+ {"la", LA},
+ {"me", ME},
+ {"nu", NU},
+ {"pr", PR},
+ {"ps", PS},
+ {"xr", XR},
+ {"xx", XX},
+};
+static long sget(char *, char *, char **, char **);
+static void soutpiece(char *, char *);
+
+void
+slangprintentry(Entry e, int cmd)
+{
+ char *p, *pe, *vs, *ve;
+ long t;
+
+ p = e.start;
+ pe = e.end;
+ if(cmd == 'h') {
+ t = sget(p, pe, &vs, &ve);
+ if(t == ME)
+ soutpiece(vs, ve);
+ outnl(0);
+ return;
+ }
+ while(p < pe) {
+ switch(sget(p, pe, &vs, &ve)) {
+ case DF:
+ soutpiece(vs, ve);
+ outchars(". ");
+ break;
+ case DX:
+ soutpiece(vs, ve);
+ outchars(". ");
+ break;
+ case ET:
+ outchars("[");
+ soutpiece(vs, ve);
+ outchars("] ");
+ break;
+ case EX:
+ outchars("E.g., ");
+ soutpiece(vs, ve);
+ outchars(". ");
+ break;
+ case LA:
+ outchars("(");
+ soutpiece(vs, ve);
+ outchars(") ");
+ break;
+ case ME:
+ outnl(0);
+ soutpiece(vs, ve);
+ outnl(0);
+ break;
+ case NU:
+ outnl(2);
+ soutpiece(vs, ve);
+ outchars(". ");
+ break;
+ case PR:
+ outchars("[");
+ soutpiece(vs, ve);
+ outchars("] ");
+ break;
+ case PS:
+ outnl(1);
+ soutpiece(vs, ve);
+ outchars(". ");
+ break;
+ case XR:
+ outchars("See ");
+ soutpiece(vs, ve);
+ outchars(". ");
+ break;
+ case XX:
+ outchars("See ");
+ soutpiece(vs, ve);
+ outchars(". ");
+ break;
+ default:
+ ve = pe; /* will end loop */
+ break;
+ }
+ p = ve;
+ }
+ outnl(0);
+}
+
+long
+slangnextoff(long fromoff)
+{
+ long a;
+ char *p;
+
+ a = Bseek(bdict, fromoff, 0);
+ if(a < 0)
+ return -1;
+ for(;;) {
+ p = Brdline(bdict, '\n');
+ if(!p)
+ break;
+ if(p[0] == 'm' && p[1] == 'e' && p[2] == ' ')
+ return (Boffset(bdict)-Blinelen(bdict));
+ }
+ return -1;
+}
+
+void
+slangprintkey(void)
+{
+ Bprint(bout, "No key\n");
+}
+
+/*
+ * Starting from b, find next line beginning with a tag.
+ * Don't go past e, but assume *e==0.
+ * Return tag value, or -1 if no more tags before e.
+ * Set pvb to beginning of value (after tag).
+ * Set pve to point at newline that ends the value.
+ */
+static long
+sget(char *b, char *e, char **pvb, char **pve)
+{
+ char *p;
+ char buf[3];
+ long t, tans;
+
+ buf[2] = 0;
+ tans = -1;
+ for(p = b;;) {
+ if(p[2] == ' ') {
+ buf[0] = p[0];
+ buf[1] = p[1];
+ t = lookassoc(tagtab, asize(tagtab), buf);
+ if(t < 0) {
+ if(debug)
+ err("tag %s\n", buf);
+ p += 3;
+ } else {
+ if(tans < 0) {
+ p += 3;
+ tans = t;
+ *pvb = p;
+ } else {
+ *pve = p;
+ break;
+ }
+ }
+ }
+ p = strchr(p, '\n');
+ if(!p || ++p >= e) {
+ if(tans >= 0)
+ *pve = e-1;
+ break;
+ }
+ }
+ return tans;
+}
+
+static void
+soutpiece(char *b, char *e)
+{
+ int c, lastc;
+
+ lastc = 0;
+ while(b < e) {
+ c = *b++;
+ if(c == '\n')
+ c = ' ';
+ if(!(c == ' ' && lastc == ' ') && c != '@')
+ outchar(c);
+ lastc = c;
+ }
+}
diff --git a/src/cmd/dict/t.awk b/src/cmd/dict/t.awk
new file mode 100644
index 00000000..e722a3cc
--- /dev/null
+++ b/src/cmd/dict/t.awk
@@ -0,0 +1,13 @@
+NF == 2 {
+ if($2 !~ / or / || $2 ~ /\(or/)
+ print $0
+ else {
+ n = split($2, a, / or /)
+ for(i = 1; i <= n; i++) {
+ printf "%s\t%s\n", $1, a[i]
+ }
+ }
+ }
+NF != 2 {
+ print $0
+ }
diff --git a/src/cmd/dict/thesaurus.c b/src/cmd/dict/thesaurus.c
new file mode 100644
index 00000000..8ad3006b
--- /dev/null
+++ b/src/cmd/dict/thesaurus.c
@@ -0,0 +1,86 @@
+#include <u.h>
+#include <libc.h>
+#include <bio.h>
+#include "dict.h"
+
+void
+thesprintentry(Entry e, int cmd)
+{
+ char *p, *pe;
+ int c, i;
+
+ p = e.start;
+ pe = e.end;
+ while(p < pe) {
+ c = *p++;
+ if(cmd == 'r') {
+ outchar(c);
+ continue;
+ }
+ switch(c) {
+ case '*':
+ c = *p++;
+ if(cmd == 'h' && c != 'L') {
+ outnl(0);
+ return;
+ }
+ if(c == 'L' && cmd != 'h')
+ outnl(0);
+ if(c == 'S') {
+ outchar('(');
+ outchar(*p++);
+ outchar(')');
+ }
+ break;
+ case '#':
+ c = *p++;
+ i = *p++ - '0' - 1;
+ if(i < 0 || i > 4)
+ break;
+ switch(c) {
+ case 'a': outrune(L"áàâäa"[i]); break;
+ case 'e': outrune(L"éèêëe"[i]); break;
+ case 'o': outrune(L"óòôöo"[i]); break;
+ case 'c': outrune(L"ccccç"[i]); break;
+ default: outchar(c); break;
+ }
+ break;
+ case '+':
+ case '<':
+ break;
+ case ' ':
+ if(cmd == 'h' && *p == '*') {
+ outnl(0);
+ return;
+ }
+ default:
+ outchar(c);
+ }
+ }
+ outnl(0);
+}
+
+long
+thesnextoff(long fromoff)
+{
+ long a;
+ char *p;
+
+ a = Bseek(bdict, fromoff, 0);
+ if(a < 0)
+ return -1;
+ for(;;) {
+ p = Brdline(bdict, '\n');
+ if(!p)
+ break;
+ if(p[0] == '*' && p[1] == 'L')
+ return (Boffset(bdict)-Blinelen(bdict));
+ }
+ return -1;
+}
+
+void
+thesprintkey(void)
+{
+ Bprint(bout, "No key\n");
+}
diff --git a/src/cmd/dict/utils.c b/src/cmd/dict/utils.c
new file mode 100644
index 00000000..8e4db9e9
--- /dev/null
+++ b/src/cmd/dict/utils.c
@@ -0,0 +1,577 @@
+#include <u.h>
+#include <libc.h>
+#include <bio.h>
+#include "dict.h"
+
+Dict dicts[] = {
+ {"oed", "Oxford English Dictionary, 2nd Ed.",
+ "dict/oed2", "dict/oed2index",
+ oednextoff, oedprintentry, oedprintkey},
+ {"ahd", "American Heritage Dictionary, 2nd College Ed.",
+ "ahd/DICT.DB", "ahd/index",
+ ahdnextoff, ahdprintentry, ahdprintkey},
+ {"pgw", "Project Gutenberg Webster Dictionary",
+ "dict/pgw", "dict/pgwindex",
+ pgwnextoff, pgwprintentry, pgwprintkey},
+ {"thesaurus", "Collins Thesaurus",
+ "dict/thesaurus", "dict/thesindex",
+ thesnextoff, thesprintentry, thesprintkey},
+
+ {"ce", "Gendai Chinese->English",
+ "dict/world/sansdata/sandic24.dat",
+ "dict/world/sansdata/ceindex",
+ worldnextoff, worldprintentry, worldprintkey},
+ {"ceh", "Gendai Chinese->English (Hanzi index)",
+ "dict/world/sansdata/sandic24.dat",
+ "dict/world/sansdata/cehindex",
+ worldnextoff, worldprintentry, worldprintkey},
+ {"ec", "Gendai English->Chinese",
+ "dict/world/sansdata/sandic24.dat",
+ "dict/world/sansdata/ecindex",
+ worldnextoff, worldprintentry, worldprintkey},
+
+ {"dae", "Gyldendal Danish->English",
+ "dict/world/gylddata/sandic30.dat",
+ "dict/world/gylddata/daeindex",
+ worldnextoff, worldprintentry, worldprintkey},
+ {"eda", "Gyldendal English->Danish",
+ "dict/world/gylddata/sandic29.dat",
+ "dict/world/gylddata/edaindex",
+ worldnextoff, worldprintentry, worldprintkey},
+
+ {"due", "Wolters-Noordhoff Dutch->English",
+ "dict/world/woltdata/sandic07.dat",
+ "dict/world/woltdata/deindex",
+ worldnextoff, worldprintentry, worldprintkey},
+ {"edu", "Wolters-Noordhoff English->Dutch",
+ "dict/world/woltdata/sandic06.dat",
+ "dict/world/woltdata/edindex",
+ worldnextoff, worldprintentry, worldprintkey},
+
+ {"fie", "WSOY Finnish->English",
+ "dict/world/werndata/sandic32.dat",
+ "dict/world/werndata/fieindex",
+ worldnextoff, worldprintentry, worldprintkey},
+ {"efi", "WSOY English->Finnish",
+ "dict/world/werndata/sandic31.dat",
+ "dict/world/werndata/efiindex",
+ worldnextoff, worldprintentry, worldprintkey},
+
+ {"fe", "Collins French->English",
+ "dict/fe", "dict/feindex",
+ pcollnextoff, pcollprintentry, pcollprintkey},
+ {"ef", "Collins English->French",
+ "dict/ef", "dict/efindex",
+ pcollnextoff, pcollprintentry, pcollprintkey},
+
+ {"ge", "Collins German->English",
+ "dict/ge", "dict/geindex",
+ pcollgnextoff, pcollgprintentry, pcollgprintkey},
+ {"eg", "Collins English->German",
+ "dict/eg", "dict/egindex",
+ pcollgnextoff, pcollgprintentry, pcollgprintkey},
+
+ {"ie", "Collins Italian->English",
+ "dict/ie", "dict/ieindex",
+ pcollnextoff, pcollprintentry, pcollprintkey},
+ {"ei", "Collins English->Italian",
+ "dict/ei", "dict/eiindex",
+ pcollnextoff, pcollprintentry, pcollprintkey},
+
+ {"je", "Sanshusha Japanese->English",
+ "dict/world/sansdata/sandic18.dat",
+ "dict/world/sansdata/jeindex",
+ worldnextoff, worldprintentry, worldprintkey},
+ {"jek", "Sanshusha Japanese->English (Kanji index)",
+ "dict/world/sansdata/sandic18.dat",
+ "dict/world/sansdata/jekindex",
+ worldnextoff, worldprintentry, worldprintkey},
+ {"ej", "Sanshusha English->Japanese",
+ "dict/world/sansdata/sandic18.dat",
+ "dict/world/sansdata/ejindex",
+ worldnextoff, worldprintentry, worldprintkey},
+
+ {"tjeg", "Sanshusha technical Japanese->English,German",
+ "dict/world/sansdata/sandic16.dat",
+ "dict/world/sansdata/tjegindex",
+ worldnextoff, worldprintentry, worldprintkey},
+ {"tjegk", "Sanshusha technical Japanese->English,German (Kanji index)",
+ "dict/world/sansdata/sandic16.dat",
+ "dict/world/sansdata/tjegkindex",
+ worldnextoff, worldprintentry, worldprintkey},
+ {"tegj", "Sanshusha technical English->German,Japanese",
+ "dict/world/sansdata/sandic16.dat",
+ "dict/world/sansdata/tegjindex",
+ worldnextoff, worldprintentry, worldprintkey},
+ {"tgje", "Sanshusha technical German->Japanese,English",
+ "dict/world/sansdata/sandic16.dat",
+ "dict/world/sansdata/tgjeindex",
+ worldnextoff, worldprintentry, worldprintkey},
+
+ {"ne", "Kunnskapforlaget Norwegian->English",
+ "dict/world/kunndata/sandic28.dat",
+ "dict/world/kunndata/neindex",
+ worldnextoff, worldprintentry, worldprintkey},
+ {"en", "Kunnskapforlaget English->Norwegian",
+ "dict/world/kunndata/sandic27.dat",
+ "dict/world/kunndata/enindex",
+ worldnextoff, worldprintentry, worldprintkey},
+
+ {"re", "Leon Ungier Russian->English",
+ "dict/re", "dict/reindex",
+ simplenextoff, simpleprintentry, simpleprintkey},
+ {"er", "Leon Ungier English->Russian",
+ "dict/re", "dict/erindex",
+ simplenextoff, simpleprintentry, simpleprintkey},
+
+ {"se", "Collins Spanish->English",
+ "dict/se", "dict/seindex",
+ pcollnextoff, pcollprintentry, pcollprintkey},
+ {"es", "Collins English->Spanish",
+ "dict/es", "dict/esindex",
+ pcollnextoff, pcollprintentry, pcollprintkey},
+
+ {"swe", "Esselte Studium Swedish->English",
+ "dict/world/essedata/sandic34.dat",
+ "dict/world/essedata/sweindex",
+ worldnextoff, worldprintentry, worldprintkey},
+ {"esw", "Esselte Studium English->Swedish",
+ "dict/world/essedata/sandic33.dat",
+ "dict/world/essedata/eswindex",
+ worldnextoff, worldprintentry, worldprintkey},
+
+ {"movie", "Movies -- by title",
+ "movie/data", "dict/movtindex",
+ movienextoff, movieprintentry, movieprintkey},
+ {"moviea", "Movies -- by actor",
+ "movie/data", "dict/movaindex",
+ movienextoff, movieprintentry, movieprintkey},
+ {"movied", "Movies -- by director",
+ "movie/data", "dict/movdindex",
+ movienextoff, movieprintentry, movieprintkey},
+
+ {"slang", "English Slang",
+ "dict/slang", "dict/slangindex",
+ slangnextoff, slangprintentry, slangprintkey},
+
+ {"robert", "Robert Électronique",
+ "dict/robert/_pointers", "dict/robert/_index",
+ robertnextoff, robertindexentry, robertprintkey},
+ {"robertv", "Robert Électronique - formes des verbes",
+ "dict/robert/flex.rob", "dict/robert/_flexindex",
+ robertnextflex, robertflexentry, robertprintkey},
+
+ {0, 0, 0, 0, 0}
+};
+
+typedef struct Lig Lig;
+struct Lig {
+ Rune start; /* accent rune */
+ Rune pairs[100]; /* <char,accented version> pairs */
+};
+
+static Lig ligtab[Nligs] = {
+[LACU-LIGS] {0xb4, {0x41, 0xc1, 0x61, 0xe1, 0x43, 0x106, 0x63, 0x107, 0x45, 0xc9, 0x65, 0xe9, 0x67, 0x123, 0x49, 0xcd, 0x69, 0xed, 0x131, 0xed, 0x4c, 0x139, 0x6c, 0x13a, 0x4e, 0x143, 0x6e, 0x144, 0x4f, 0xd3, 0x6f, 0xf3, 0x52, 0x154, 0x72, 0x155, 0x53, 0x15a, 0x73, 0x15b, 0x55, 0xda, 0x75, 0xfa, 0x59, 0xdd, 0x79, 0xfd, 0x5a, 0x179, 0x7a, 0x17a, 0}},
+[LGRV-LIGS] {0x2cb, {0x41, 0xc0, 0x61, 0xe0, 0x45, 0xc8, 0x65, 0xe8, 0x49, 0xcc, 0x69, 0xec, 0x131, 0xec, 0x4f, 0xd2, 0x6f, 0xf2, 0x55, 0xd9, 0x75, 0xf9, 0}},
+[LUML-LIGS] {0xa8, {0x41, 0xc4, 0x61, 0xe4, 0x45, 0xcb, 0x65, 0xeb, 0x49, 0xcf, 0x69, 0xef, 0x4f, 0xd6, 0x6f, 0xf6, 0x55, 0xdc, 0x75, 0xfc, 0x59, 0x178, 0x79, 0xff, 0}},
+[LCED-LIGS] {0xb8, {0x43, 0xc7, 0x63, 0xe7, 0x47, 0x122, 0x4b, 0x136, 0x6b, 0x137, 0x4c, 0x13b, 0x6c, 0x13c, 0x4e, 0x145, 0x6e, 0x146, 0x52, 0x156, 0x72, 0x157, 0x53, 0x15e, 0x73, 0x15f, 0x54, 0x162, 0x74, 0x163, 0}},
+[LTIL-LIGS] {0x2dc, {0x41, 0xc3, 0x61, 0xe3, 0x49, 0x128, 0x69, 0x129, 0x131, 0x129, 0x4e, 0xd1, 0x6e, 0xf1, 0x4f, 0xd5, 0x6f, 0xf5, 0x55, 0x168, 0x75, 0x169, 0}},
+[LBRV-LIGS] {0x2d8, {0x41, 0x102, 0x61, 0x103, 0x45, 0x114, 0x65, 0x115, 0x47, 0x11e, 0x67, 0x11f, 0x49, 0x12c, 0x69, 0x12d, 0x131, 0x12d, 0x4f, 0x14e, 0x6f, 0x14f, 0x55, 0x16c, 0x75, 0x16d, 0}},
+[LRNG-LIGS] {0x2da, {0x41, 0xc5, 0x61, 0xe5, 0x55, 0x16e, 0x75, 0x16f, 0}},
+[LDOT-LIGS] {0x2d9, {0x43, 0x10a, 0x63, 0x10b, 0x45, 0x116, 0x65, 0x117, 0x47, 0x120, 0x67, 0x121, 0x49, 0x130, 0x4c, 0x13f, 0x6c, 0x140, 0x5a, 0x17b, 0x7a, 0x17c, 0}},
+[LDTB-LIGS] {0x2e, {0}},
+[LFRN-LIGS] {0x2322, {0x41, 0xc2, 0x61, 0xe2, 0x43, 0x108, 0x63, 0x109, 0x45, 0xca, 0x65, 0xea, 0x47, 0x11c, 0x67, 0x11d, 0x48, 0x124, 0x68, 0x125, 0x49, 0xce, 0x69, 0xee, 0x131, 0xee, 0x4a, 0x134, 0x6a, 0x135, 0x4f, 0xd4, 0x6f, 0xf4, 0x53, 0x15c, 0x73, 0x15d, 0x55, 0xdb, 0x75, 0xfb, 0x57, 0x174, 0x77, 0x175, 0x59, 0x176, 0x79, 0x177, 0}},
+[LFRB-LIGS] {0x32f, {0}},
+[LOGO-LIGS] {0x2db, {0x41, 0x104, 0x61, 0x105, 0x45, 0x118, 0x65, 0x119, 0x49, 0x12e, 0x69, 0x12f, 0x131, 0x12f, 0x55, 0x172, 0x75, 0x173, 0}},
+[LMAC-LIGS] {0xaf, {0x41, 0x100, 0x61, 0x101, 0x45, 0x112, 0x65, 0x113, 0x49, 0x12a, 0x69, 0x12b, 0x131, 0x12b, 0x4f, 0x14c, 0x6f, 0x14d, 0x55, 0x16a, 0x75, 0x16b, 0}},
+[LHCK-LIGS] {0x2c7, {0x43, 0x10c, 0x63, 0x10d, 0x44, 0x10e, 0x64, 0x10f, 0x45, 0x11a, 0x65, 0x11b, 0x4c, 0x13d, 0x6c, 0x13e, 0x4e, 0x147, 0x6e, 0x148, 0x52, 0x158, 0x72, 0x159, 0x53, 0x160, 0x73, 0x161, 0x54, 0x164, 0x74, 0x165, 0x5a, 0x17d, 0x7a, 0x17e, 0}},
+[LASP-LIGS] {0x2bd, {0}},
+[LLEN-LIGS] {0x2bc, {0}},
+[LBRB-LIGS] {0x32e, {0}}
+};
+
+Rune multitab[Nmulti][5] = {
+[MAAS-MULTI] {0x2bd, 0x3b1, 0},
+[MALN-MULTI] {0x2bc, 0x3b1, 0},
+[MAND-MULTI] {0x61, 0x6e, 0x64, 0},
+[MAOQ-MULTI] {0x61, 0x2f, 0x71, 0},
+[MBRA-MULTI] {0x3c, 0x7c, 0},
+[MDD-MULTI] {0x2e, 0x2e, 0},
+[MDDD-MULTI] {0x2e, 0x2e, 0x2e, 0},
+[MEAS-MULTI] {0x2bd, 0x3b5, 0},
+[MELN-MULTI] {0x2bc, 0x3b5, 0},
+[MEMM-MULTI] {0x2014, 0x2014, 0},
+[MHAS-MULTI] {0x2bd, 0x3b7, 0},
+[MHLN-MULTI] {0x2bc, 0x3b7, 0},
+[MIAS-MULTI] {0x2bd, 0x3b9, 0},
+[MILN-MULTI] {0x2bc, 0x3b9, 0},
+[MLCT-MULTI] {0x63, 0x74, 0},
+[MLFF-MULTI] {0x66, 0x66, 0},
+[MLFFI-MULTI] {0x66, 0x66, 0x69, 0},
+[MLFFL-MULTI] {0x66, 0x66, 0x6c, 0},
+[MLFL-MULTI] {0x66, 0x6c, 0},
+[MLFI-MULTI] {0x66, 0x69, 0},
+[MLLS-MULTI] {0x26b, 0x26b, 0},
+[MLST-MULTI] {0x73, 0x74, 0},
+[MOAS-MULTI] {0x2bd, 0x3bf, 0},
+[MOLN-MULTI] {0x2bc, 0x3bf, 0},
+[MOR-MULTI] {0x6f, 0x72, 0},
+[MRAS-MULTI] {0x2bd, 0x3c1, 0},
+[MRLN-MULTI] {0x2bc, 0x3c1, 0},
+[MTT-MULTI] {0x7e, 0x7e, 0},
+[MUAS-MULTI] {0x2bd, 0x3c5, 0},
+[MULN-MULTI] {0x2bc, 0x3c5, 0},
+[MWAS-MULTI] {0x2bd, 0x3c9, 0},
+[MWLN-MULTI] {0x2bc, 0x3c9, 0},
+[MOE-MULTI] {0x6f, 0x65, 0},
+[MES-MULTI] {0x20, 0x20, 0},
+};
+
+#define risupper(r) (0x41 <= (r) && (r) <= 0x5a)
+#define rislatin1(r) (0xC0 <= (r) && (r) <= 0xFF)
+#define rtolower(r) ((r)-'A'+'a')
+
+static Rune latin_fold_tab[] =
+{
+/* Table to fold latin 1 characters to ASCII equivalents
+ based at Rune value 0xc0
+
+ À Á Â Ã Ä Å Æ Ç
+ È É Ê Ë Ì Í Î Ï
+ Ð Ñ Ò Ó Ô Õ Ö ×
+ Ø Ù Ú Û Ü Ý Þ ß
+ à á â ã ä å æ ç
+ è é ê ë ì í î ï
+ ð ñ ò ó ô õ ö ÷
+ ø ù ú û ü ý þ ÿ
+*/
+ 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'c',
+ 'e', 'e', 'e', 'e', 'i', 'i', 'i', 'i',
+ 'd', 'n', 'o', 'o', 'o', 'o', 'o', 0 ,
+ 'o', 'u', 'u', 'u', 'u', 'y', 0 , 0 ,
+ 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'c',
+ 'e', 'e', 'e', 'e', 'i', 'i', 'i', 'i',
+ 'd', 'n', 'o', 'o', 'o', 'o', 'o', 0 ,
+ 'o', 'u', 'u', 'u', 'u', 'y', 0 , 'y',
+};
+
+static Rune *ttabstack[20];
+static int ntt;
+
+/*
+ * tab is an array of n Assoc's, sorted by key.
+ * Look for key in tab, and return corresponding val
+ * or -1 if not there
+ */
+long
+lookassoc(Assoc *tab, int n, char *key)
+{
+ Assoc *q;
+ long i, low, high;
+ int r;
+
+ for(low = -1, high = n; high > low+1; ){
+ i = (high+low)/2;
+ q = &tab[i];
+ if((r=strcmp(key, q->key))<0)
+ high = i;
+ else if(r == 0)
+ return q->val;
+ else
+ low=i;
+ }
+ return -1;
+}
+
+long
+looknassoc(Nassoc *tab, int n, long key)
+{
+ Nassoc *q;
+ long i, low, high;
+
+ for(low = -1, high = n; high > low+1; ){
+ i = (high+low)/2;
+ q = &tab[i];
+ if(key < q->key)
+ high = i;
+ else if(key == q->key)
+ return q->val;
+ else
+ low=i;
+ }
+ return -1;
+}
+
+void
+err(char *fmt, ...)
+{
+ char buf[1000];
+ va_list v;
+
+ va_start(v, fmt);
+ vsnprint(buf, sizeof(buf), fmt, v);
+ va_end(v);
+ fprint(2, "%s: %s\n", argv0, buf);
+}
+
+/*
+ * Write the rune r to bout, keeping track of line length
+ * and breaking the lines (at blanks) when they get too long
+ */
+void
+outrune(long r)
+{
+ if(outinhibit)
+ return;
+ if(++linelen > breaklen && r == 0x20) {
+ Bputc(bout, '\n');
+ linelen = 0;
+ } else
+ Bputrune(bout, r);
+}
+
+void
+outrunes(Rune *rp)
+{
+ Rune r;
+
+ while((r = *rp++) != 0)
+ outrune(r);
+}
+
+/* like outrune, but when arg is know to be a char */
+void
+outchar(int c)
+{
+ if(outinhibit)
+ return;
+ if(++linelen > breaklen && c == ' ') {
+ c ='\n';
+ linelen = 0;
+ }
+ Bputc(bout, c);
+}
+
+void
+outchars(char *s)
+{
+ char c;
+
+ while((c = *s++) != 0)
+ outchar(c);
+}
+
+void
+outprint(char *fmt, ...)
+{
+ char buf[1000];
+ va_list v;
+
+ va_start(v, fmt);
+ vsnprint(buf, sizeof(buf), fmt, v);
+ va_end(v);
+ outchars(buf);
+}
+
+void
+outpiece(char *b, char *e)
+{
+ int c, lastc;
+
+ lastc = 0;
+ while(b < e) {
+ c = *b++;
+ if(c == '\n')
+ c = ' ';
+ if(!(c == ' ' && lastc == ' '))
+ outchar(c);
+ lastc = c;
+ }
+}
+
+/*
+ * Go to new line if not already there; indent if ind != 0.
+ * If ind > 1, leave a blank line too.
+ * Slight hack: assume if current line is only one or two
+ * characters long, then they were spaces.
+ */
+void
+outnl(int ind)
+{
+ if(outinhibit)
+ return;
+ if(ind) {
+ if(ind > 1) {
+ if(linelen > 2)
+ Bputc(bout, '\n');
+ Bprint(bout, "\n ");
+ } else if(linelen == 0)
+ Bprint(bout, " ");
+ else if(linelen == 1)
+ Bputc(bout, ' ');
+ else if(linelen != 2)
+ Bprint(bout, "\n ");
+ linelen = 2;
+ } else {
+ if(linelen) {
+ Bputc(bout, '\n');
+ linelen = 0;
+ }
+ }
+}
+
+/*
+ * Fold the runes in null-terminated rp.
+ * Use the sort(1) definition of folding (uppercase to lowercase,
+ * latin1-accented characters to corresponding unaccented chars)
+ */
+void
+fold(Rune *rp)
+{
+ Rune r;
+
+ while((r = *rp) != 0) {
+ if (rislatin1(r) && latin_fold_tab[r-0xc0])
+ r = latin_fold_tab[r-0xc0];
+ if(risupper(r))
+ r = rtolower(r);
+ *rp++ = r;
+ }
+}
+
+/*
+ * Like fold, but put folded result into new
+ * (assumed to have enough space).
+ * old is a regular expression, but we know that
+ * metacharacters aren't affected
+ */
+void
+foldre(char *new, char *old)
+{
+ Rune r;
+
+ while(*old) {
+ old += chartorune(&r, old);
+ if (rislatin1(r) && latin_fold_tab[r-0xc0])
+ r = latin_fold_tab[r-0xc0];
+ if(risupper(r))
+ r = rtolower(r);
+ new += runetochar(new, &r);
+ }
+ *new = 0;
+}
+
+/*
+ * acomp(s, t) returns:
+ * -2 if s strictly precedes t
+ * -1 if s is a prefix of t
+ * 0 if s is the same as t
+ * 1 if t is a prefix of s
+ * 2 if t strictly precedes s
+ */
+
+int
+acomp(Rune *s, Rune *t)
+{
+ int cs, ct;
+
+ for(;;) {
+ cs = *s;
+ ct = *t;
+ if(cs != ct)
+ break;
+ if(cs == 0)
+ return 0;
+ s++;
+ t++;
+ }
+ if(cs == 0)
+ return -1;
+ if(ct == 0)
+ return 1;
+ if(cs < ct)
+ return -2;
+ return 2;
+}
+
+/*
+ * Copy null terminated Runes from 'from' to 'to'.
+ */
+void
+runescpy(Rune *to, Rune *from)
+{
+ while((*to++ = *from++) != 0)
+ continue;
+}
+
+/*
+ * Conversion of unsigned number to long, no overflow detection
+ */
+long
+runetol(Rune *r)
+{
+ int c;
+ long n;
+
+ n = 0;
+ for(;; r++){
+ c = *r;
+ if(0x30<=c && c<=0x39)
+ c -= '0';
+ else
+ break;
+ n = n*10 + c;
+ }
+ return n;
+}
+
+/*
+ * See if there is a rune corresponding to the accented
+ * version of r with accent acc (acc in [LIGS..LIGE-1]),
+ * and return it if so, else return NONE.
+ */
+Rune
+liglookup(Rune acc, Rune r)
+{
+ Rune *p;
+
+ if(acc < LIGS || acc >= LIGE)
+ return NONE;
+ for(p = ligtab[acc-LIGS].pairs; *p; p += 2)
+ if(*p == r)
+ return *(p+1);
+ return NONE;
+}
+
+/*
+ * Maintain a translation table stack (a translation table
+ * is an array of Runes indexed by bytes or 7-bit bytes).
+ * If starting is true, push the curtab onto the stack
+ * and return newtab; else pop the top of the stack and
+ * return it.
+ * If curtab is 0, initialize the stack and return.
+ */
+Rune *
+changett(Rune *curtab, Rune *newtab, int starting)
+{
+ if(curtab == 0) {
+ ntt = 0;
+ return 0;
+ }
+ if(starting) {
+ if(ntt >= asize(ttabstack)) {
+ if(debug)
+ err("translation stack overflow");
+ return curtab;
+ }
+ ttabstack[ntt++] = curtab;
+ return newtab;
+ } else {
+ if(ntt == 0) {
+ if(debug)
+ err("translation stack underflow");
+ return curtab;
+ }
+ return ttabstack[--ntt];
+ }
+}
diff --git a/src/cmd/dict/world.c b/src/cmd/dict/world.c
new file mode 100644
index 00000000..19f3fb10
--- /dev/null
+++ b/src/cmd/dict/world.c
@@ -0,0 +1,184 @@
+#include <u.h>
+#include <libc.h>
+#include <bio.h>
+#include "dict.h"
+#include "kuten.h"
+
+/*
+ * Routines for handling dictionaries in the "Languages of the World"
+ * format. worldnextoff *must* be called with <address of valid entry>+1.
+ */
+
+#define GSHORT(p) (((p)[0]<<8)|(p)[1])
+
+static void putchar(int, int*);
+
+#define NONE 0xffff
+
+/* adapted from jhelling@cs.ruu.nl (Jeroen Hellingman) */
+
+static Rune chartab[] = {
+
+/*00*/ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, L'\n', 0xe6, 0xf8, 0xe5, 0xe4, 0xf6,
+/*10*/ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, 0xc6, 0xd8, 0xc5, 0xc4, 0xd6,
+
+/*20*/ 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, '\'',
+ 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
+/*30*/ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
+ 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
+/*40*/ 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
+ 0x48, 0x49, 0x4a, 0x4b, L'L', 0x4d, 0x4e, 0x4f,
+/*50*/ 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
+ 0x58, 0x59, 0x5a, 0x5b, L'\\', 0x5d, 0x5e, 0x5f,
+/*60*/ 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
+ 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
+/*70*/ 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
+ 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, NONE,
+
+/*80*/ 0xc7, 0xfc, 0xe9, 0xe2, 0xe4, 0xe0, 0xe5, 0xe7,
+ 0xea, 0xeb, 0xe8, 0xef, 0xee, 0xec, 0xc4, 0xc5,
+/*90*/ 0xc9, 0xe6, 0xc6, 0xf4, 0xf6, 0xf2, 0xfb, 0xf9,
+ 0xff, 0xd6, 0xdc, 0xa2, 0xa3, 0xa5, 0x20a7, 0x283,
+/*a0*/ 0xe1, 0xed, 0xf3, 0xfa, 0xf1, 0xd1, 0xaa, 0xba,
+ 0xbf, 0x2310, 0xac, 0xbd, 0xbc, 0xa1, 0xab, 0xbb,
+
+/*b0*/ 0x254, 0x259, 0xf0, 0x283, 0x292, 0x14b, 0x251, 0x7a,
+ 0x26a, 0xf0, 0x292, 0xe3, 0x153, 0x169, 0x28c, 0x265,
+/*c0*/ 0x280, 0xeb, 0x6c, 0x28c, 0xf5, 0xf1, 0x152, NONE,
+ NONE, 0x53, 0x73, 0x5a, 0x7a, NONE, NONE, NONE,
+/*d0*/ 0xdf, NONE, NONE, 0x101, 0x12b, 0x16b, 0x113, 0x14d,
+ NONE, NONE, NONE, 0x20, NONE, NONE, NONE, NONE,
+
+/*e0*/ 0x3b1, 0x3b2, 0x3b3, 0x3c0, 0x3a3, 0x3c3, 0xb5, 0x3c4,
+ 0x3a6, 0x398, 0x3a9, 0x3b4, 0x221e, 0xd8, 0x3b5, 0x2229,
+/*f0*/ 0x2261, 0xb1, 0x2265, 0x2264, 0x2320, 0x2321, 0xf7, 0x2248,
+ 0xb0, 0x2219, 0xb7, NONE, NONE, NONE, NONE, NONE,
+};
+
+enum{ Utf, Kanahi, Kanalo=Kanahi+1, GBhi, GBlo=GBhi+1, };
+
+void
+worldprintentry(Entry e, int cmd)
+{
+ int nh, state[3];
+ uchar *p, *pe;
+
+ p = (uchar *)e.start;
+ pe = (uchar *)e.end;
+ nh = GSHORT(p);
+ p += 6;
+ if(cmd == 'h')
+ pe = p+nh;
+ state[0] = Utf;
+ state[1] = 0;
+ state[2] = 0;
+ while(p < pe){
+ if(cmd == 'r')
+ outchar(*p++);
+ else
+ putchar(*p++, state);
+ }
+ outnl(0);
+}
+
+long
+worldnextoff(long fromoff)
+{
+ int nh, np, nd;
+ uchar buf[6];
+
+ if(Bseek(bdict, fromoff-1, 0) < 0)
+ return -1;
+ if(Bread(bdict, buf, 6) != 6)
+ return -1;
+ nh = GSHORT(buf);
+ np = GSHORT(buf+2);
+ nd = GSHORT(buf+4);
+ return fromoff-1 + 6 + nh + np + nd;
+}
+
+static void
+putchar(int c, int *state)
+{
+ int xflag = 0;
+ Rune r;
+ int hi, lo;
+
+ switch(state[0]){
+ case Kanahi:
+ case GBhi:
+ if(CANS2JH(c) || c == 0xff){
+ state[0]++;
+ state[1] = c;
+ break;
+ }
+ /* fall through */
+ case Utf:
+ if(c == 0xfe){
+ state[0] = Kanahi;
+ break;
+ }else if(c == 0xff){
+ state[0] = GBhi;
+ break;
+ }
+ r = chartab[c];
+ if(r < 0x80 && state[2] == 0)
+ outchar(r);
+ else if(r == NONE){
+ switch(c){
+ case 0xfb:
+ if(!xflag){
+ state[2] = 1;
+ break;
+ }
+ case 0xfc:
+ if(!xflag){
+ state[2] = 0;
+ break;
+ }
+ case 0x10:
+ case 0xc7: case 0xc8:
+ case 0xd8: case 0xd9: case 0xda:
+ case 0xdc: case 0xdd: case 0xde: case 0xdf:
+ case 0xfd:
+ if(!xflag)
+ break;
+ /* fall through */
+ default:
+ outprint("\\%.2ux", c);
+ }
+ }else if(state[2] == 0)
+ outrune(r);
+ break;
+ case Kanalo:
+ case GBlo:
+ if(state[1] == 0xff && c == 0xff){
+ state[0] = Utf;
+ break;
+ }
+ state[0]--;
+ hi = state[1];
+ lo = c;
+ S2J(hi, lo); /* convert to JIS */
+ r = hi*100 + lo - 3232; /* convert to jis208 */
+ if(state[0] == Kanahi && r < JIS208MAX)
+ r = tabjis208[r];
+ else if(state[0] == GBhi && r < GB2312MAX)
+ r = tabgb2312[r];
+ else
+ r = NONE;
+ if(r == NONE)
+ outprint("\\%.2ux\\%.2ux", state[1], c);
+ else
+ outrune(r);
+ break;
+ }
+}
+
+void
+worldprintkey(void)
+{
+ Bprint(bout, "No pronunciation key.\n");
+}