summaryrefslogtreecommitdiff
path: root/sys/src/cmd/dict
diff options
context:
space:
mode:
authorTaru Karttunen <taruti@taruti.net>2011-03-30 15:46:40 +0300
committerTaru Karttunen <taruti@taruti.net>2011-03-30 15:46:40 +0300
commite5888a1ffdae813d7575f5fb02275c6bb07e5199 (patch)
treed8d51eac403f07814b9e936eed0c9a79195e2450 /sys/src/cmd/dict
Import sources from 2011-03-30 iso image
Diffstat (limited to 'sys/src/cmd/dict')
-rwxr-xr-xsys/src/cmd/dict/ahd.c139
-rwxr-xr-xsys/src/cmd/dict/canonind.awk29
-rwxr-xr-xsys/src/cmd/dict/comfix.awk56
-rwxr-xr-xsys/src/cmd/dict/dict.c675
-rwxr-xr-xsys/src/cmd/dict/dict.h163
-rwxr-xr-xsys/src/cmd/dict/egfix15
-rwxr-xr-xsys/src/cmd/dict/egfix28
-rwxr-xr-xsys/src/cmd/dict/fromemf123
-rwxr-xr-xsys/src/cmd/dict/gb2312.c1108
-rwxr-xr-xsys/src/cmd/dict/gefix23
-rwxr-xr-xsys/src/cmd/dict/getneeds8
-rwxr-xr-xsys/src/cmd/dict/jis208.c1059
-rwxr-xr-xsys/src/cmd/dict/kuten.h114
-rwxr-xr-xsys/src/cmd/dict/mkfile23
-rwxr-xr-xsys/src/cmd/dict/mkindex.c106
-rwxr-xr-xsys/src/cmd/dict/movie.c324
-rwxr-xr-xsys/src/cmd/dict/oed.c1425
-rwxr-xr-xsys/src/cmd/dict/pcollins.c226
-rwxr-xr-xsys/src/cmd/dict/pcollinsg.c248
-rwxr-xr-xsys/src/cmd/dict/pgw.c1161
-rwxr-xr-xsys/src/cmd/dict/rev.awk6
-rwxr-xr-xsys/src/cmd/dict/robert.c312
-rwxr-xr-xsys/src/cmd/dict/roget.c147
-rwxr-xr-xsys/src/cmd/dict/simple.c46
-rwxr-xr-xsys/src/cmd/dict/slang.c203
-rwxr-xr-xsys/src/cmd/dict/t.awk13
-rwxr-xr-xsys/src/cmd/dict/thesaurus.c86
-rwxr-xr-xsys/src/cmd/dict/utils.c580
-rwxr-xr-xsys/src/cmd/dict/world.c184
29 files changed, 8610 insertions, 0 deletions
diff --git a/sys/src/cmd/dict/ahd.c b/sys/src/cmd/dict/ahd.c
new file mode 100755
index 000000000..05fccf6c1
--- /dev/null
+++ b/sys/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] L'é',
+ [0x85] L'à',
+ [0x89] L'ë',
+ [0x8a] L'è',
+ [0xa4] L'ñ',
+ [0xf8] L'°',
+ [0xf9] L'·',
+};
+
+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/sys/src/cmd/dict/canonind.awk b/sys/src/cmd/dict/canonind.awk
new file mode 100755
index 000000000..41c6ee75f
--- /dev/null
+++ b/sys/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/sys/src/cmd/dict/comfix.awk b/sys/src/cmd/dict/comfix.awk
new file mode 100755
index 000000000..9a51b98e9
--- /dev/null
+++ b/sys/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/sys/src/cmd/dict/dict.c b/sys/src/cmd/dict/dict.c
new file mode 100755
index 000000000..58ef054d7
--- /dev/null
+++ b/sys/src/cmd/dict/dict.c
@@ -0,0 +1,675 @@
+#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;
+ 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", dict->path);
+ exits("nodict");
+ }
+ bindex = Bopen(dict->indexpath, OREAD);
+ if(!bindex) {
+ err("can't open index %s", 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 L'.': case L'*': case L'+': case L'?':
+ case L'[': case L']': case L'(': case ')':
+ case L'|': case L'^': case L'$':
+ *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(void *av, void *bv)
+{
+ long v;
+ long *a, *b;
+
+ a = av;
+ b = 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/sys/src/cmd/dict/dict.h b/sys/src/cmd/dict/dict.h
new file mode 100755
index 000000000..9c24d765c
--- /dev/null
+++ b/sys/src/cmd/dict/dict.h
@@ -0,0 +1,163 @@
+/* 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);
+void rogetprintentry(Entry, int);
+long rogetnextoff(long);
+void rogetprintkey(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[];
+extern Dict dicts[];
+
+#define asize(a) (sizeof (a)/sizeof(a[0]))
diff --git a/sys/src/cmd/dict/egfix b/sys/src/cmd/dict/egfix
new file mode 100755
index 000000000..192320c2a
--- /dev/null
+++ b/sys/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/sys/src/cmd/dict/egfix2 b/sys/src/cmd/dict/egfix2
new file mode 100755
index 000000000..d5af3bfee
--- /dev/null
+++ b/sys/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/sys/src/cmd/dict/fromemf b/sys/src/cmd/dict/fromemf
new file mode 100755
index 000000000..a0232bdcd
--- /dev/null
+++ b/sys/src/cmd/dict/fromemf
@@ -0,0 +1,123 @@
+From emf Tue Sep 19 10:41:30 EDT 1989
+Here are the IPA equivalents of the Collins code for German-English.
+RE: Avant-garde, it is listed as exemplifying a nasal vowel in the
+Collins pronunciation key, and occurs in the English-German dictionary,
+where it is translated into German as Avantgarde. However, it does
+not appear in the German-English dictionary.
+
+I'll drop by with your hardcopy dictionary today or tomorrow.
+Thanks.
+
+IPA COLLINS EXAMPLE
+
+['] 349 H Salon
+ P za\N'349'lo^~:
+
+[a] a H ab
+ P ap
+
+upsilon 348 H Abbau
+ P \N'349'apba\fp\N'348'\f1
+
+schwa 343 H aalen
+ P \N'349'a:l\fp\N'343'\f1n
+
+[i:] i: H abbiegen
+ P \N'349'apbi:g\fp\N'343'\f1n
+
+[I] 351 H Abbild
+ P \N'349'apb\fp\N'351'\f1lt
+
+turned script a 356 H abdominal
+ P \x91b\N'349'd\fp\N'356'\f1m\fp\N'351'\f1nl
+
+open o 341 H abdrosseln
+ P \N'349'apdr\fp\N'341'\f1s\fp\N'343'\f1ln
+
+upsilon 348 H Abbau
+ P \N'349'apba\fp\N'348'\f1
+
+[b] b
+[d] d
+[f] f
+[g] g
+[h] h
+[j] j
+[k] k
+[l] l
+[m] m
+[n] n
+
+eng 384 H Abgang
+ P \N'349'apga\fp\N'384'\f1
+
+[p] p
+[s] s
+
+esh 346 H abgespannt
+ P \N'349'apg\fp\N'343'\N'346'\f1pant
+
+[t] t
+[v] v
+[x] x
+[z] z
+
+yogh 345 H azure
+ \N'349'e\fp\N'351'\f1\fp\N'345'\f1\fp\N'343'\f1*
+
+ash x91 H acrobat
+ P \N'349'\x91kr\fp\N'343'\f1b\x91t
+
+script a: 354 H almond
+ P \N'349'\fp\N'354'\f1:m\fp\N'343'\f1nd
+
+[e] e
+
+rvrsd epsilon: 352 H absurd
+ P \fp\N'343'\f1b\N'349's\fp\N'352'\f1:d
+
+[u:] u:
+
+inverted v 342 H above
+ P \fp\N'343'\f1\fp\N'349'\f1b\fp\N'342'\f1v
+
+superscript tilde
+over
+ open o o^~ H Salon
+ P za\N'349'lo^~:
+
+script a
+lower case a
+epsilon
+o
+
+[w] w
+
+theta 347 H apathy
+ P \N'349'\x91p\fp\N'343'\f1\fp\N'347'
+ \f1\fp\N'351'\f1
+
+
+eth 445 H another
+ P \fp\N'343'\f1\N'349'n\fp\N'342'\f1\N'445'
+ \fp\N'343'\f1*
+
+epsilon 340 H aba^:ndern
+ P \N'349'ap'\fp\N'340'\f1nd\fp\N'343'\f1rn
+
+slashed o x97 H abgewo^:hnen
+ P \N'349'apg\fp\N'343'\f1v\x97:n\fp\N'343'\f1n
+
+o-e ligature (oe H abbro^:ckeln
+ P \N'349'apbr\(oek\fp\N'343'\f1ln
+
+small capital y y H abbru^:hen
+ P \N'349'apbry:\fp\N'343'\f1n
+
+c cedilla c^ H abbrechen
+ P \N'349'apbr\fp\N'340'\f1c^,\fp\N'343'\f1n
+
+
+
+
+
diff --git a/sys/src/cmd/dict/gb2312.c b/sys/src/cmd/dict/gb2312.c
new file mode 100755
index 000000000..d667aafde
--- /dev/null
+++ b/sys/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/sys/src/cmd/dict/gefix b/sys/src/cmd/dict/gefix
new file mode 100755
index 000000000..74df8de0d
--- /dev/null
+++ b/sys/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/sys/src/cmd/dict/getneeds b/sys/src/cmd/dict/getneeds
new file mode 100755
index 000000000..7f50edff4
--- /dev/null
+++ b/sys/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/sys/src/cmd/dict/jis208.c b/sys/src/cmd/dict/jis208.c
new file mode 100755
index 000000000..d2086e6a0
--- /dev/null
+++ b/sys/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/sys/src/cmd/dict/kuten.h b/sys/src/cmd/dict/kuten.h
new file mode 100755
index 000000000..af59d833e
--- /dev/null
+++ b/sys/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/sys/src/cmd/dict/mkfile b/sys/src/cmd/dict/mkfile
new file mode 100755
index 000000000..6e46ac4d5
--- /dev/null
+++ b/sys/src/cmd/dict/mkfile
@@ -0,0 +1,23 @@
+</$objtype/mkfile
+
+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 roget.$O
+
+OFILES=dict.$O\
+ $LFILES\
+ utils.$O
+
+HFILES=dict.h kuten.h
+
+BIN=/$objtype/bin
+
+UPDATE=\
+ mkfile\
+ $HFILES\
+ ${OFILES:%.$O=%.c}\
+
+</sys/src/cmd/mkone
+
+mkindex: mkindex.$O $LFILES utils.$O
+ $LD $LDFLAGS -o $target $prereq
diff --git a/sys/src/cmd/dict/mkindex.c b/sys/src/cmd/dict/mkindex.c
new file mode 100755
index 000000000..230247927
--- /dev/null
+++ b/sys/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/sys/src/cmd/dict/movie.c b/sys/src/cmd/dict/movie.c
new file mode 100755
index 000000000..7a33bea5b
--- /dev/null
+++ b/sys/src/cmd/dict/movie.c
@@ -0,0 +1,324 @@
+#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 **);
+static void moutall(int, char *, char *);
+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
+ */
+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);
+ }
+}
+
+/*
+ * 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/sys/src/cmd/dict/oed.c b/sys/src/cmd/dict/oed.c
new file mode 100755
index 000000000..d6ec0f021
--- /dev/null
+++ b/sys/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", L'¾'},
+ {"Aacu", L'Á'},
+ {"Aang", L'Å'},
+ {"Abarab", L'Ā'},
+ {"Acirc", L'Â'},
+ {"Ae", L'Æ'},
+ {"Agrave", L'À'},
+ {"Alpha", L'Α'},
+ {"Amac", L'Ā'},
+ {"Asg", L'Ʒ'}, /* Unicyle. Cf "Sake" */
+ {"Auml", L'Ä'},
+ {"Beta", L'Β'},
+ {"Cced", L'Ç'},
+ {"Chacek", L'Č'},
+ {"Chi", L'Χ'},
+ {"Chirho", L'☧'}, /* Chi Rho U+2627 */
+ {"Csigma", L'Ϛ'},
+ {"Delta", L'Δ'},
+ {"Eacu", L'É'},
+ {"Ecirc", L'Ê'},
+ {"Edh", L'Ð'},
+ {"Epsilon", L'Ε'},
+ {"Eta", L'Η'},
+ {"Gamma", L'Γ'},
+ {"Iacu", L'Í'},
+ {"Icirc", L'Î'},
+ {"Imac", L'Ī'},
+ {"Integ", L'∫'},
+ {"Iota", L'Ι'},
+ {"Kappa", L'Κ'},
+ {"Koppa", L'Ϟ'},
+ {"Lambda", L'Λ'},
+ {"Lbar", L'Ł'},
+ {"Mu", L'Μ'},
+ {"Naira", L'N'}, /* should have bar through */
+ {"Nplus", L'N'}, /* should have plus above */
+ {"Ntilde", L'Ñ'},
+ {"Nu", L'Ν'},
+ {"Oacu", L'Ó'},
+ {"Obar", L'Ø'},
+ {"Ocirc", L'Ô'},
+ {"Oe", L'Œ'},
+ {"Omega", L'Ω'},
+ {"Omicron", L'Ο'},
+ {"Ouml", L'Ö'},
+ {"Phi", L'Φ'},
+ {"Pi", L'Π'},
+ {"Psi", L'Ψ'},
+ {"Rho", L'Ρ'},
+ {"Sacu", L'Ś'},
+ {"Sigma", L'Σ'},
+ {"Summ", L'∑'},
+ {"Tau", L'Τ'},
+ {"Th", L'Þ'},
+ {"Theta", L'Θ'},
+ {"Tse", L'Ц'},
+ {"Uacu", L'Ú'},
+ {"Ucirc", L'Û'},
+ {"Upsilon", L'Υ'},
+ {"Uuml", L'Ü'},
+ {"Wyn", L'ƿ'}, /* wynn U+01BF */
+ {"Xi", L'Ξ'},
+ {"Ygh", L'Ʒ'}, /* Yogh U+01B7 */
+ {"Zeta", L'Ζ'},
+ {"Zh", L'Ʒ'}, /* looks like Yogh. Cf "Sake" */
+ {"a", L'a'}, /* ante */
+ {"aacu", L'á'},
+ {"aang", L'å'},
+ {"aasper", MAAS},
+ {"abreve", L'ă'},
+ {"acirc", L'â'},
+ {"acu", LACU},
+ {"ae", L'æ'},
+ {"agrave", L'à'},
+ {"ahook", L'ą'},
+ {"alenis", MALN},
+ {"alpha", L'α'},
+ {"amac", L'ā'},
+ {"amp", L'&'},
+ {"and", MAND},
+ {"ang", LRNG},
+ {"angle", L'∠'},
+ {"ankh", L'☥'}, /* ankh U+2625 */
+ {"ante", L'a'}, /* before (year) */
+ {"aonq", MAOQ},
+ {"appreq", L'≃'},
+ {"aquar", L'♒'},
+ {"arDadfull", L'ض'}, /* Dad U+0636 */
+ {"arHa", L'ح'}, /* haa U+062D */
+ {"arTa", L'ت'}, /* taa U+062A */
+ {"arain", L'ع'}, /* ain U+0639 */
+ {"arainfull", L'ع'}, /* ain U+0639 */
+ {"aralif", L'ا'}, /* alef U+0627 */
+ {"arba", L'ب'}, /* baa U+0628 */
+ {"arha", L'ه'}, /* ha U+0647 */
+ {"aries", L'♈'},
+ {"arnun", L'ن'}, /* noon U+0646 */
+ {"arnunfull", L'ن'}, /* noon U+0646 */
+ {"arpa", L'ه'}, /* ha U+0647 */
+ {"arqoph", L'ق'}, /* qaf U+0642 */
+ {"arshinfull", L'ش'}, /* sheen U+0634 */
+ {"arta", L'ت'}, /* taa U+062A */
+ {"artafull", L'ت'}, /* taa U+062A */
+ {"artha", L'ث'}, /* thaa U+062B */
+ {"arwaw", L'و'}, /* waw U+0648 */
+ {"arya", L'ي'}, /* ya U+064A */
+ {"aryafull", L'ي'}, /* ya U+064A */
+ {"arzero", L'٠'}, /* indic zero U+0660 */
+ {"asg", L'ʒ'}, /* unicycle character. Cf "hallow" */
+ {"asper", LASP},
+ {"assert", L'⊢'},
+ {"astm", L'⁂'}, /* asterism: should be upside down */
+ {"at", L'@'},
+ {"atilde", L'ã'},
+ {"auml", L'ä'},
+ {"ayin", L'ع'}, /* arabic ain U+0639 */
+ {"b1", L'-'}, /* single bond */
+ {"b2", L'='}, /* double bond */
+ {"b3", L'≡'}, /* triple bond */
+ {"bbar", L'ƀ'}, /* b with bar U+0180 */
+ {"beta", L'β'},
+ {"bigobl", L'/'},
+ {"blC", L'C'}, /* should be black letter */
+ {"blJ", L'J'}, /* should be black letter */
+ {"blU", L'U'}, /* should be black letter */
+ {"blb", L'b'}, /* should be black letter */
+ {"blozenge", L'◊'}, /* U+25CA; should be black */
+ {"bly", L'y'}, /* should be black letter */
+ {"bra", MBRA},
+ {"brbl", LBRB},
+ {"breve", LBRV},
+ {"bslash", L'\\'},
+ {"bsquare", L'■'}, /* black square U+25A0 */
+ {"btril", L'◀'}, /* U+25C0 */
+ {"btrir", L'▶'}, /* U+25B6 */
+ {"c", L'c'}, /* circa */
+ {"cab", L'〉'},
+ {"cacu", L'ć'},
+ {"canc", L'♋'},
+ {"capr", L'♑'},
+ {"caret", L'^'},
+ {"cb", L'}'},
+ {"cbigb", L'}'},
+ {"cbigpren", L')'},
+ {"cbigsb", L']'},
+ {"cced", L'ç'},
+ {"cdil", LCED},
+ {"cdsb", L'〛'}, /* ]] U+301b */
+ {"cent", L'¢'},
+ {"chacek", L'č'},
+ {"chi", L'χ'},
+ {"circ", LRNG},
+ {"circa", L'c'}, /* about (year) */
+ {"circbl", L'̥'}, /* ring below accent U+0325 */
+ {"circle", L'○'}, /* U+25CB */
+ {"circledot", L'⊙'},
+ {"click", L'ʖ'},
+ {"club", L'♣'},
+ {"comtime", L'C'},
+ {"conj", L'☌'},
+ {"cprt", L'©'},
+ {"cq", L'\''},
+ {"cqq", L'”'},
+ {"cross", L'✠'}, /* maltese cross U+2720 */
+ {"crotchet", L'♩'},
+ {"csb", L']'},
+ {"ctilde", L'c'}, /* +tilde */
+ {"ctlig", MLCT},
+ {"cyra", L'а'},
+ {"cyre", L'е'},
+ {"cyrhard", L'ъ'},
+ {"cyrjat", L'ѣ'},
+ {"cyrm", L'м'},
+ {"cyrn", L'н'},
+ {"cyrr", L'р'},
+ {"cyrsoft", L'ь'},
+ {"cyrt", L'т'},
+ {"cyry", L'ы'},
+ {"dag", L'†'},
+ {"dbar", L'đ'},
+ {"dblar", L'⇋'},
+ {"dblgt", L'≫'},
+ {"dbllt", L'≪'},
+ {"dced", L'd'}, /* +cedilla */
+ {"dd", MDD},
+ {"ddag", L'‡'},
+ {"ddd", MDDD},
+ {"decr", L'↓'},
+ {"deg", L'°'},
+ {"dele", L'd'}, /* should be dele */
+ {"delta", L'δ'},
+ {"descnode", L'☋'}, /* descending node U+260B */
+ {"diamond", L'♢'},
+ {"digamma", L'ϝ'},
+ {"div", L'÷'},
+ {"dlessi", L'ı'},
+ {"dlessj1", L'j'}, /* should be dotless */
+ {"dlessj2", L'j'}, /* should be dotless */
+ {"dlessj3", L'j'}, /* should be dotless */
+ {"dollar", L'$'},
+ {"dotab", LDOT},
+ {"dotbl", LDTB},
+ {"drachm", L'ʒ'},
+ {"dubh", L'-'},
+ {"eacu", L'é'},
+ {"earth", L'♁'},
+ {"easper", MEAS},
+ {"ebreve", L'ĕ'},
+ {"ecirc", L'ê'},
+ {"edh", L'ð'},
+ {"egrave", L'è'},
+ {"ehacek", L'ě'},
+ {"ehook", L'ę'},
+ {"elem", L'∊'},
+ {"elenis", MELN},
+ {"em", L'—'},
+ {"emac", L'ē'},
+ {"emem", MEMM},
+ {"en", L'–'},
+ {"epsilon", L'ε'},
+ {"equil", L'⇋'},
+ {"ergo", L'∴'},
+ {"es", MES},
+ {"eszett", L'ß'},
+ {"eta", L'η'},
+ {"eth", L'ð'},
+ {"euml", L'ë'},
+ {"expon", L'↑'},
+ {"fact", L'!'},
+ {"fata", L'ɑ'},
+ {"fatpara", L'¶'}, /* should have fatter, filled in bowl */
+ {"female", L'♀'},
+ {"ffilig", MLFFI},
+ {"fflig", MLFF},
+ {"ffllig", MLFFL},
+ {"filig", MLFI},
+ {"flat", L'♭'},
+ {"fllig", MLFL},
+ {"frE", L'E'}, /* should be curly */
+ {"frL", L'L'}, /* should be curly */
+ {"frR", L'R'}, /* should be curly */
+ {"frakB", L'B'}, /* should have fraktur style */
+ {"frakG", L'G'},
+ {"frakH", L'H'},
+ {"frakI", L'I'},
+ {"frakM", L'M'},
+ {"frakU", L'U'},
+ {"frakX", L'X'},
+ {"frakY", L'Y'},
+ {"frakh", L'h'},
+ {"frbl", LFRB},
+ {"frown", LFRN},
+ {"fs", L' '},
+ {"fsigma", L'ς'},
+ {"gAacu", L'Á'}, /* should be Α+acute */
+ {"gaacu", L'α'}, /* +acute */
+ {"gabreve", L'α'}, /* +breve */
+ {"gafrown", L'α'}, /* +frown */
+ {"gagrave", L'α'}, /* +grave */
+ {"gamac", L'α'}, /* +macron */
+ {"gamma", L'γ'},
+ {"gauml", L'α'}, /* +umlaut */
+ {"ge", L'≧'},
+ {"geacu", L'ε'}, /* +acute */
+ {"gegrave", L'ε'}, /* +grave */
+ {"ghacu", L'η'}, /* +acute */
+ {"ghfrown", L'η'}, /* +frown */
+ {"ghgrave", L'η'}, /* +grave */
+ {"ghmac", L'η'}, /* +macron */
+ {"giacu", L'ι'}, /* +acute */
+ {"gibreve", L'ι'}, /* +breve */
+ {"gifrown", L'ι'}, /* +frown */
+ {"gigrave", L'ι'}, /* +grave */
+ {"gimac", L'ι'}, /* +macron */
+ {"giuml", L'ι'}, /* +umlaut */
+ {"glagjat", L'ѧ'},
+ {"glots", L'ˀ'},
+ {"goacu", L'ο'}, /* +acute */
+ {"gobreve", L'ο'}, /* +breve */
+ {"grave", LGRV},
+ {"gt", L'>'},
+ {"guacu", L'υ'}, /* +acute */
+ {"gufrown", L'υ'}, /* +frown */
+ {"gugrave", L'υ'}, /* +grave */
+ {"gumac", L'υ'}, /* +macron */
+ {"guuml", L'υ'}, /* +umlaut */
+ {"gwacu", L'ω'}, /* +acute */
+ {"gwfrown", L'ω'}, /* +frown */
+ {"gwgrave", L'ω'}, /* +grave */
+ {"hacek", LHCK},
+ {"halft", L'⌈'},
+ {"hash", L'#'},
+ {"hasper", MHAS},
+ {"hatpath", L'ֲ'}, /* hataf patah U+05B2 */
+ {"hatqam", L'ֳ'}, /* hataf qamats U+05B3 */
+ {"hatseg", L'ֱ'}, /* hataf segol U+05B1 */
+ {"hbar", L'ħ'},
+ {"heart", L'♡'},
+ {"hebaleph", L'א'}, /* aleph U+05D0 */
+ {"hebayin", L'ע'}, /* ayin U+05E2 */
+ {"hebbet", L'ב'}, /* bet U+05D1 */
+ {"hebbeth", L'ב'}, /* bet U+05D1 */
+ {"hebcheth", L'ח'}, /* bet U+05D7 */
+ {"hebdaleth", L'ד'}, /* dalet U+05D3 */
+ {"hebgimel", L'ג'}, /* gimel U+05D2 */
+ {"hebhe", L'ה'}, /* he U+05D4 */
+ {"hebkaph", L'כ'}, /* kaf U+05DB */
+ {"heblamed", L'ל'}, /* lamed U+05DC */
+ {"hebmem", L'מ'}, /* mem U+05DE */
+ {"hebnun", L'נ'}, /* nun U+05E0 */
+ {"hebnunfin", L'ן'}, /* final nun U+05DF */
+ {"hebpe", L'פ'}, /* pe U+05E4 */
+ {"hebpedag", L'ף'}, /* final pe? U+05E3 */
+ {"hebqoph", L'ק'}, /* qof U+05E7 */
+ {"hebresh", L'ר'}, /* resh U+05E8 */
+ {"hebshin", L'ש'}, /* shin U+05E9 */
+ {"hebtav", L'ת'}, /* tav U+05EA */
+ {"hebtsade", L'צ'}, /* tsadi U+05E6 */
+ {"hebwaw", L'ו'}, /* vav? U+05D5 */
+ {"hebyod", L'י'}, /* yod U+05D9 */
+ {"hebzayin", L'ז'}, /* zayin U+05D6 */
+ {"hgz", L'ʒ'}, /* ??? Cf "alet" */
+ {"hireq", L'ִ'}, /* U+05B4 */
+ {"hlenis", MHLN},
+ {"hook", LOGO},
+ {"horizE", L'E'}, /* should be on side */
+ {"horizP", L'P'}, /* should be on side */
+ {"horizS", L'∽'},
+ {"horizT", L'⊣'},
+ {"horizb", L'{'}, /* should be underbrace */
+ {"ia", L'α'},
+ {"iacu", L'í'},
+ {"iasper", MIAS},
+ {"ib", L'β'},
+ {"ibar", L'ɨ'},
+ {"ibreve", L'ĭ'},
+ {"icirc", L'î'},
+ {"id", L'δ'},
+ {"ident", L'≡'},
+ {"ie", L'ε'},
+ {"ifilig", MLFI},
+ {"ifflig", MLFF},
+ {"ig", L'γ'},
+ {"igrave", L'ì'},
+ {"ih", L'η'},
+ {"ii", L'ι'},
+ {"ik", L'κ'},
+ {"ilenis", MILN},
+ {"imac", L'ī'},
+ {"implies", L'⇒'},
+ {"index", L'☞'},
+ {"infin", L'∞'},
+ {"integ", L'∫'},
+ {"intsec", L'∩'},
+ {"invpri", L'ˏ'},
+ {"iota", L'ι'},
+ {"iq", L'ψ'},
+ {"istlig", MLST},
+ {"isub", L'ϵ'}, /* iota below accent */
+ {"iuml", L'ï'},
+ {"iz", L'ζ'},
+ {"jup", L'♃'},
+ {"kappa", L'κ'},
+ {"koppa", L'ϟ'},
+ {"lambda", L'λ'},
+ {"lar", L'←'},
+ {"lbar", L'ł'},
+ {"le", L'≦'},
+ {"lenis", LLEN},
+ {"leo", L'♌'},
+ {"lhalfbr", L'⌈'},
+ {"lhshoe", L'⊃'},
+ {"libra", L'♎'},
+ {"llswing", MLLS},
+ {"lm", L'ː'},
+ {"logicand", L'∧'},
+ {"logicor", L'∨'},
+ {"longs", L'ʃ'},
+ {"lrar", L'↔'},
+ {"lt", L'<'},
+ {"ltappr", L'≾'},
+ {"ltflat", L'∠'},
+ {"lumlbl", L'l'}, /* +umlaut below */
+ {"mac", LMAC},
+ {"male", L'♂'},
+ {"mc", L'c'}, /* should be raised */
+ {"merc", L'☿'}, /* mercury U+263F */
+ {"min", L'−'},
+ {"moonfq", L'☽'}, /* first quarter moon U+263D */
+ {"moonlq", L'☾'}, /* last quarter moon U+263E */
+ {"msylab", L'm'}, /* +sylab (ˌ) */
+ {"mu", L'μ'},
+ {"nacu", L'ń'},
+ {"natural", L'♮'},
+ {"neq", L'≠'},
+ {"nfacu", L'′'},
+ {"nfasper", L'ʽ'},
+ {"nfbreve", L'˘'},
+ {"nfced", L'¸'},
+ {"nfcirc", L'ˆ'},
+ {"nffrown", L'⌢'},
+ {"nfgra", L'ˋ'},
+ {"nfhacek", L'ˇ'},
+ {"nfmac", L'¯'},
+ {"nftilde", L'˜'},
+ {"nfuml", L'¨'},
+ {"ng", L'ŋ'},
+ {"not", L'¬'},
+ {"notelem", L'∉'},
+ {"ntilde", L'ñ'},
+ {"nu", L'ν'},
+ {"oab", L'〈'},
+ {"oacu", L'ó'},
+ {"oasper", MOAS},
+ {"ob", L'{'},
+ {"obar", L'ø'},
+ {"obigb", L'{'}, /* should be big */
+ {"obigpren", L'('},
+ {"obigsb", L'['}, /* should be big */
+ {"obreve", L'ŏ'},
+ {"ocirc", L'ô'},
+ {"odsb", L'〚'}, /* [[ U+301A */
+ {"oe", L'œ'},
+ {"oeamp", L'&'},
+ {"ograve", L'ò'},
+ {"ohook", L'o'}, /* +hook */
+ {"olenis", MOLN},
+ {"omac", L'ō'},
+ {"omega", L'ω'},
+ {"omicron", L'ο'},
+ {"ope", L'ɛ'},
+ {"opp", L'☍'},
+ {"oq", L'`'},
+ {"oqq", L'“'},
+ {"or", MOR},
+ {"osb", L'['},
+ {"otilde", L'õ'},
+ {"ouml", L'ö'},
+ {"ounce", L'℥'}, /* ounce U+2125 */
+ {"ovparen", L'⌢'}, /* should be sideways ( */
+ {"p", L'′'},
+ {"pa", L'∂'},
+ {"page", L'P'},
+ {"pall", L'ʎ'},
+ {"paln", L'ɲ'},
+ {"par", PAR},
+ {"para", L'¶'},
+ {"pbar", L'p'}, /* +bar */
+ {"per", L'℘'}, /* per U+2118 */
+ {"phi", L'φ'},
+ {"phi2", L'ϕ'},
+ {"pi", L'π'},
+ {"pisces", L'♓'},
+ {"planck", L'ħ'},
+ {"plantinJ", L'J'}, /* should be script */
+ {"pm", L'±'},
+ {"pmil", L'‰'},
+ {"pp", L'″'},
+ {"ppp", L'‴'},
+ {"prop", L'∝'},
+ {"psi", L'ψ'},
+ {"pstlg", L'£'},
+ {"q", L'?'}, /* should be raised */
+ {"qamets", L'ֳ'}, /* U+05B3 */
+ {"quaver", L'♪'},
+ {"rar", L'→'},
+ {"rasper", MRAS},
+ {"rdot", L'·'},
+ {"recipe", L'℞'}, /* U+211E */
+ {"reg", L'®'},
+ {"revC", L'Ɔ'}, /* open O U+0186 */
+ {"reva", L'ɒ'},
+ {"revc", L'ɔ'},
+ {"revope", L'ɜ'},
+ {"revr", L'ɹ'},
+ {"revsc", L'˒'}, /* upside-down semicolon */
+ {"revv", L'ʌ'},
+ {"rfa", L'o'}, /* +hook (Cf "goal") */
+ {"rhacek", L'ř'},
+ {"rhalfbr", L'⌉'},
+ {"rho", L'ρ'},
+ {"rhshoe", L'⊂'},
+ {"rlenis", MRLN},
+ {"rsylab", L'r'}, /* +sylab */
+ {"runash", L'F'}, /* should be runic 'ash' */
+ {"rvow", L'˔'},
+ {"sacu", L'ś'},
+ {"sagit", L'♐'},
+ {"sampi", L'ϡ'},
+ {"saturn", L'♄'},
+ {"sced", L'ş'},
+ {"schwa", L'ə'},
+ {"scorpio", L'♏'},
+ {"scrA", L'A'}, /* should be script */
+ {"scrC", L'C'},
+ {"scrE", L'E'},
+ {"scrF", L'F'},
+ {"scrI", L'I'},
+ {"scrJ", L'J'},
+ {"scrL", L'L'},
+ {"scrO", L'O'},
+ {"scrP", L'P'},
+ {"scrQ", L'Q'},
+ {"scrS", L'S'},
+ {"scrT", L'T'},
+ {"scrb", L'b'},
+ {"scrd", L'd'},
+ {"scrh", L'h'},
+ {"scrl", L'l'},
+ {"scruple", L'℈'}, /* U+2108 */
+ {"sdd", L'ː'},
+ {"sect", L'§'},
+ {"semE", L'∃'},
+ {"sh", L'ʃ'},
+ {"shacek", L'š'},
+ {"sharp", L'♯'},
+ {"sheva", L'ְ'}, /* U+05B0 */
+ {"shti", L'ɪ'},
+ {"shtsyll", L'∪'},
+ {"shtu", L'ʊ'},
+ {"sidetri", L'⊲'},
+ {"sigma", L'σ'},
+ {"since", L'∵'},
+ {"slge", L'≥'}, /* should have slanted line under */
+ {"slle", L'≤'}, /* should have slanted line under */
+ {"sm", L'ˈ'},
+ {"smm", L'ˌ'},
+ {"spade", L'♠'},
+ {"sqrt", L'√'},
+ {"square", L'□'}, /* U+25A1 */
+ {"ssChi", L'Χ'}, /* should be sans serif */
+ {"ssIota", L'Ι'},
+ {"ssOmicron", L'Ο'},
+ {"ssPi", L'Π'},
+ {"ssRho", L'Ρ'},
+ {"ssSigma", L'Σ'},
+ {"ssTau", L'Τ'},
+ {"star", L'*'},
+ {"stlig", MLST},
+ {"sup2", L'⁲'},
+ {"supgt", L'˃'},
+ {"suplt", L'˂'},
+ {"sur", L'ʳ'},
+ {"swing", L'∼'},
+ {"tau", L'τ'},
+ {"taur", L'♉'},
+ {"th", L'þ'},
+ {"thbar", L'þ'}, /* +bar */
+ {"theta", L'θ'},
+ {"thinqm", L'?'}, /* should be thinner */
+ {"tilde", LTIL},
+ {"times", L'×'},
+ {"tri", L'∆'},
+ {"trli", L'‖'},
+ {"ts", L' '},
+ {"uacu", L'ú'},
+ {"uasper", MUAS},
+ {"ubar", L'u'}, /* +bar */
+ {"ubreve", L'ŭ'},
+ {"ucirc", L'û'},
+ {"udA", L'∀'},
+ {"udT", L'⊥'},
+ {"uda", L'ɐ'},
+ {"udh", L'ɥ'},
+ {"udqm", L'¿'},
+ {"udpsi", L'⋔'},
+ {"udtr", L'∇'},
+ {"ugrave", L'ù'},
+ {"ulenis", MULN},
+ {"umac", L'ū'},
+ {"uml", LUML},
+ {"undl", L'ˍ'}, /* underline accent */
+ {"union", L'∪'},
+ {"upsilon", L'υ'},
+ {"uuml", L'ü'},
+ {"vavpath", L'ו'}, /* vav U+05D5 (+patah) */
+ {"vavsheva", L'ו'}, /* vav U+05D5 (+sheva) */
+ {"vb", L'|'},
+ {"vddd", L'⋮'},
+ {"versicle2", L'℣'}, /* U+2123 */
+ {"vinc", L'¯'},
+ {"virgo", L'♍'},
+ {"vpal", L'ɟ'},
+ {"vvf", L'ɣ'},
+ {"wasper", MWAS},
+ {"wavyeq", L'≈'},
+ {"wlenis", MWLN},
+ {"wyn", L'ƿ'}, /* wynn U+01BF */
+ {"xi", L'ξ'},
+ {"yacu", L'ý'},
+ {"ycirc", L'ŷ'},
+ {"ygh", L'ʒ'},
+ {"ymac", L'y'}, /* +macron */
+ {"yuml", L'ÿ'},
+ {"zced", L'z'}, /* +cedilla */
+ {"zeta", L'ζ'},
+ {"zh", L'ʒ'},
+ {"zhacek", L'ž'},
+};
+/*
+ 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*/ L' ', L'!', L'"', L'#', L'$', L'%', SPCS, L'\'',
+ L'(', L')', L'*', L'+', L',', L'-', L'.', L'/',
+/*30*/ L'0', L'1', L'2', L'3', L'4', L'5', L'6', L'7',
+ L'8', L'9', L':', L';', TAGS, L'=', TAGE, L'?',
+/*40*/ L'@', L'A', L'B', L'C', L'D', L'E', L'F', L'G',
+ L'H', L'I', L'J', L'K', L'L', L'M', L'N', L'O',
+/*50*/ L'P', L'Q', L'R', L'S', L'T', L'U', L'V', L'W',
+ L'X', L'Y', L'Z', L'[', L'\\', L']', L'^', L'_',
+/*60*/ L'`', L'a', L'b', L'c', L'd', L'e', L'f', L'g',
+ L'h', L'i', L'j', L'k', L'l', L'm', L'n', L'o',
+/*70*/ L'p', L'q', L'r', L's', L't', L'u', L'v', L'w',
+ L'x', L'y', L'z', L'{', L'|', L'}', L'~', 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*/ L' ', L'!', L'ˈ', L'#', L'$', L'ˌ', L'æ', L'\'',
+ L'(', L')', L'*', L'+', L',', L'-', L'.', L'/',
+/*30*/ L'0', L'1', L'2', L'ɜ', L'4', L'5', L'6', L'7',
+ L'8', L'ø', L'ː', L';', TAGS, L'=', TAGE, L'?',
+/*40*/ L'ə', L'ɑ', L'B', L'C', L'ð', L'ɛ', L'F', L'G',
+ L'H', L'ɪ', L'J', L'K', L'L', L'M', L'ŋ', L'ɔ',
+/*50*/ L'P', L'ɒ', L'R', L'ʃ', L'θ', L'ʊ', L'ʌ', L'W',
+ L'X', L'Y', L'ʒ', L'[', L'\\', L']', L'^', L'_',
+/*60*/ L'`', L'a', L'b', L'c', L'd', L'e', L'f', L'g',
+ L'h', L'i', L'j', L'k', L'l', L'm', L'n', L'o',
+/*70*/ L'p', L'q', L'r', L's', L't', L'u', L'v', L'w',
+ L'x', L'y', L'z', L'{', L'|', L'}', L'~', 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*/ L' ', L'!', L'"', L'#', L'$', L'%', SPCS, L'\'',
+ L'(', L')', L'*', L'+', L',', L'-', L'.', L'/',
+/*30*/ L'0', L'1', L'2', L'3', L'4', L'5', L'6', L'7',
+ L'8', L'9', L':', L';', TAGS, L'=', TAGE, L'?',
+/*40*/ L'@', L'Α', L'Β', L'Ξ', L'Δ', L'Ε', L'Φ', L'Γ',
+ L'Η', L'Ι', L'Ϛ', L'Κ', L'Λ', L'Μ', L'Ν', L'Ο',
+/*50*/ L'Π', L'Θ', L'Ρ', L'Σ', L'Τ', L'Υ', L'V', L'Ω',
+ L'Χ', L'Ψ', L'Ζ', L'[', L'\\', L']', L'^', L'_',
+/*60*/ L'`', L'α', L'β', L'ξ', L'δ', L'ε', L'φ', L'γ',
+ L'η', L'ι', L'ς', L'κ', L'λ', L'μ', L'ν', L'ο',
+/*70*/ L'π', L'θ', L'ρ', L'σ', L'τ', L'υ', L'v', L'ω',
+ L'χ', L'ψ', L'ζ', L'{', L'|', L'}', L'~', 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*/ L' ', L'!', L'"', L'#', L'$', L'%', SPCS, L'\'',
+ L'₍', L'₎', L'*', L'₊', L',', L'₋', L'.', L'/',
+/*30*/ L'₀', L'₁', L'₂', L'₃', L'₄', L'₅', L'₆', L'₇',
+ L'₈', L'₉', L':', L';', TAGS, L'₌', TAGE, L'?',
+/*40*/ L'@', L'A', L'B', L'C', L'D', L'E', L'F', L'G',
+ L'H', L'I', L'J', L'K', L'L', L'M', L'N', L'O',
+/*50*/ L'P', L'Q', L'R', L'S', L'T', L'U', L'V', L'W',
+ L'X', L'Y', L'Z', L'[', L'\\', L']', L'^', L'_',
+/*60*/ L'`', L'a', L'b', L'c', L'd', L'e', L'f', L'g',
+ L'h', L'i', L'j', L'k', L'l', L'm', L'n', L'o',
+/*70*/ L'p', L'q', L'r', L's', L't', L'u', L'v', L'w',
+ L'x', L'y', L'z', L'{', L'|', L'}', L'~', 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*/ L' ', L'!', L'"', L'#', L'$', L'%', SPCS, L'\'',
+ L'⁽', L'⁾', L'*', L'⁺', L',', L'⁻', L'.', L'/',
+/*30*/ L'⁰', L'ⁱ', L'⁲', L'⁳', L'⁴', L'⁵', L'⁶', L'⁷',
+ L'⁸', L'⁹', L':', L';', TAGS, L'⁼', TAGE, L'?',
+/*40*/ L'@', L'A', L'B', L'C', L'D', L'E', L'F', L'G',
+ L'H', L'I', L'J', L'K', L'L', L'M', L'N', L'O',
+/*50*/ L'P', L'Q', L'R', L'S', L'T', L'U', L'V', L'W',
+ L'X', L'Y', L'Z', L'[', L'\\', L']', L'^', L'_',
+/*60*/ L'`', L'a', L'b', L'c', L'd', L'e', L'f', L'g',
+ L'h', L'i', L'j', L'k', L'l', L'm', L'n', L'o',
+/*70*/ L'p', L'q', L'r', L's', L't', L'u', L'v', L'w',
+ L'x', L'y', L'z', L'{', L'|', L'}', L'~', 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 char *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 = L'�';
+ }
+ 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(L'†');
+ else if(strcmp(s, "ali") == 0)
+ outrune(L'‖');
+ else if(strcmp(s, "err") == 0 || strcmp(s, "spu") == 0)
+ outrune(L'¶');
+ else if(strcmp(s, "xref") == 0)
+ {/* nothing */}
+ else if(debug)
+ err("status %ld %d %s", curentry.doff, cursize, s);
+ }
+}
diff --git a/sys/src/cmd/dict/pcollins.c b/sys/src/cmd/dict/pcollins.c
new file mode 100755
index 000000000..61e1040e7
--- /dev/null
+++ b/sys/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", L'Å'},
+ {"AC", LACU},
+ {"B", B},
+ {"CE", LCED},
+ {"CI", LFRN},
+ {"Di", L'ı'},
+ {"EL", L'-'},
+ {"GR", LGRV},
+ {"H", H},
+ {"I", I},
+ {"OE", L'Œ'},
+ {"R", R},
+ {"TI", LTIL},
+ {"UM", LUML},
+ {"X", X},
+ {"[", Ps},
+ {"]", Pe},
+ {"ac", LACU},
+ {"ce", LCED},
+ {"ci", LFRN},
+ {"gr", LGRV},
+ {"oe", L'œ'},
+ {"supe", L'e'}, /* should be raised */
+ {"supo", L'o'}, /* should be raised */
+ {"ti", LTIL},
+ {"um", LUML},
+ {"{", Ps},
+ {"~", L'~'},
+ {"~~", MTT},
+};
+
+static Rune normtab[128] = {
+ /*0*/ /*1*/ /*2*/ /*3*/ /*4*/ /*5*/ /*6*/ /*7*/
+/*00*/ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, L' ', NONE, NONE, NONE, NONE, NONE,
+/*10*/ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+/*20*/ L' ', L'!', L'"', L'#', L'$', L'%', L'&', L'\'',
+ L'(', L')', L'*', L'+', L',', L'-', L'.', L'/',
+/*30*/ L'0', L'1', L'2', L'3', L'4', L'5', L'6', L'7',
+ L'8', L'9', L':', L';', TAGE, L'=', TAGS, L'?',
+/*40*/ L'@', L'A', L'B', L'C', L'D', L'E', L'F', L'G',
+ L'H', L'I', L'J', L'K', L'L', L'M', L'N', L'O',
+/*50*/ L'P', L'Q', L'R', L'S', L'T', L'U', L'V', L'W',
+ L'X', L'Y', L'Z', L'[', L'\\', L']', L'^', L'_',
+/*60*/ L'`', L'a', L'b', L'c', L'd', L'e', L'f', L'g',
+ L'h', L'i', L'j', L'k', L'l', L'm', L'n', L'o',
+/*70*/ L'p', L'q', L'r', L's', L't', L'u', L'v', L'w',
+ L'x', L'y', L'z', L'{', L'|', L'}', L'~', 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/sys/src/cmd/dict/pcollinsg.c b/sys/src/cmd/dict/pcollinsg.c
new file mode 100755
index 000000000..266aecec9
--- /dev/null
+++ b/sys/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=L'i', /* 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, L' ', NONE, NONE,
+/*10*/ NONE, L'-', L' ', L' ', NONE, NONE, NONE, NONE,
+ L' ', NONE, NONE, NONE, L' ', NONE, NONE, L'-',
+/*20*/ L' ', L'!', L'"', L'#', L'$', L'%', L'&', L'\'',
+ L'(', L')', L'*', L'+', L',', L'-', L'.', L'/',
+/*30*/ L'0', L'1', L'2', L'3', L'4', L'5', L'6', L'7',
+ L'8', L'9', L':', L';', L'<', L'=', L'>', L'?',
+/*40*/ L'@', L'A', L'B', L'C', L'D', L'E', L'F', L'G',
+ L'H', L'I', L'J', L'K', L'L', L'M', L'N', L'O',
+/*50*/ L'P', L'Q', L'R', L'S', L'T', L'U', L'V', L'W',
+ L'X', L'Y', L'Z', L'[', L'\\', L']', L'^', L'_',
+/*60*/ L'`', L'a', L'b', L'c', L'd', L'e', L'f', L'g',
+ L'h', L'i', L'j', L'k', L'l', L'm', L'n', L'o',
+/*70*/ L'p', L'q', L'r', L's', L't', L'u', L'v', L'w',
+ L'x', L'y', L'z', L'{', L'|', L'}', L'~', NONE,
+/*80*/ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, L' ', NONE, NONE, NONE, NONE, NONE,
+/*90*/ L'ß', L'æ', NONE, MOE, NONE, NONE, NONE, L'ø',
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+/*A0*/ NONE, NONE, L'"', L'£', NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+/*B0*/ NONE, NONE, NONE, NONE, NONE, NONE, NONE, L'~',
+ 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*/ L' ', L' ', NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+};
+
+static Nassoc numtab[] = {
+ {1, L'+'},
+ {4, L'='},
+ {7, L'°'},
+ {11, L'≈'},
+ {69, L'♦'},
+ {114, L'®'},
+ {340, L'ɛ'},
+ {341, L'ɔ'},
+ {342, L'ʌ'},
+ {343, L'ə'},
+ {345, L'ʒ'},
+ {346, L'ʃ'},
+ {347, L'ɵ'},
+ {348, L'ʊ'},
+ {349, L'ˈ'},
+ {351, L'ɪ'},
+ {352, L'ɜ'},
+ {354, L'ɑ'},
+ {355, L'~'},
+ {356, L'ɒ'},
+ {384, L'ɳ'},
+ {445, L'ð'}, /* BUG -- should be script eth */
+};
+
+static Nassoc overtab[] = {
+ {L',', LCED},
+ {L'/', LACU},
+ {L':', LUML},
+ {L'\\', LGRV},
+ {L'^', LFRN},
+ {L'~', 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(L'¨');
+ else{
+ outrune(L'^');
+ 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/sys/src/cmd/dict/pgw.c b/sys/src/cmd/dict/pgw.c
new file mode 100755
index 000000000..c9d442e89
--- /dev/null
+++ b/sys/src/cmd/dict/pgw.c
@@ -0,0 +1,1161 @@
+/* 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
+};
+
+static Assoc auxtab[] = {
+ {"cols", Cols},
+ {"num", Num},
+ {"st", St}
+};
+
+static Assoc spectab[] = {
+ {"3on4", L'¾'},
+ {"AElig", L'Æ'},
+ {"Aacute", L'Á'},
+ {"Aang", L'Å'},
+ {"Abarab", L'Ā'},
+ {"Acirc", L'Â'},
+ {"Agrave", L'À'},
+ {"Alpha", L'Α'},
+ {"Amacr", L'Ā'},
+ {"Asg", L'Ʒ'}, /* Unicyle. Cf "Sake" */
+ {"Auml", L'Ä'},
+ {"Beta", L'Β'},
+ {"Cced", L'Ç'},
+ {"Chacek", L'Č'},
+ {"Chi", L'Χ'},
+ {"Chirho", L'☧'}, /* Chi Rho U+2627 */
+ {"Csigma", L'Ϛ'},
+ {"Delta", L'Δ'},
+ {"Eacute", L'É'},
+ {"Ecirc", L'Ê'},
+ {"Edh", L'Ð'},
+ {"Epsilon", L'Ε'},
+ {"Eta", L'Η'},
+ {"Gamma", L'Γ'},
+ {"Iacute", L'Í'},
+ {"Icirc", L'Î'},
+ {"Imacr", L'Ī'},
+ {"Integ", L'∫'},
+ {"Iota", L'Ι'},
+ {"Kappa", L'Κ'},
+ {"Koppa", L'Ϟ'},
+ {"Lambda", L'Λ'},
+ {"Lbar", L'Ł'},
+ {"Mu", L'Μ'},
+ {"Naira", L'N'}, /* should have bar through */
+ {"Nplus", L'N'}, /* should have plus above */
+ {"Ntilde", L'Ñ'},
+ {"Nu", L'Ν'},
+ {"Oacute", L'Ó'},
+ {"Obar", L'Ø'},
+ {"Ocirc", L'Ô'},
+ {"Oe", L'Œ'},
+ {"Omega", L'Ω'},
+ {"Omicron", L'Ο'},
+ {"Ouml", L'Ö'},
+ {"Phi", L'Φ'},
+ {"Pi", L'Π'},
+ {"Psi", L'Ψ'},
+ {"Rho", L'Ρ'},
+ {"Sacute", L'Ś'},
+ {"Sigma", L'Σ'},
+ {"Summ", L'∑'},
+ {"Tau", L'Τ'},
+ {"Th", L'Þ'},
+ {"Theta", L'Θ'},
+ {"Tse", L'Ц'},
+ {"Uacute", L'Ú'},
+ {"Ucirc", L'Û'},
+ {"Upsilon", L'Υ'},
+ {"Uuml", L'Ü'},
+ {"Wyn", L'ƿ'}, /* wynn U+01BF */
+ {"Xi", L'Ξ'},
+ {"Ygh", L'Ʒ'}, /* Yogh U+01B7 */
+ {"Zeta", L'Ζ'},
+ {"Zh", L'Ʒ'}, /* looks like Yogh. Cf "Sake" */
+ {"a", L'a'}, /* ante */
+ {"aacute", L'á'},
+ {"aang", L'å'},
+ {"aasper", MAAS},
+ {"abreve", L'ă'},
+ {"acirc", L'â'},
+ {"acute", LACU},
+ {"aelig", L'æ'},
+ {"agrave", L'à'},
+ {"ahook", L'ą'},
+ {"alenis", MALN},
+ {"alpha", L'α'},
+ {"amacr", L'ā'},
+ {"amp", L'&'},
+ {"and", MAND},
+ {"ang", LRNG},
+ {"angle", L'∠'},
+ {"ankh", L'☥'}, /* ankh U+2625 */
+ {"ante", L'a'}, /* before (year) */
+ {"aonq", MAOQ},
+ {"appreq", L'≃'},
+ {"aquar", L'♒'},
+ {"arDadfull", L'ض'}, /* Dad U+0636 */
+ {"arHa", L'ح'}, /* haa U+062D */
+ {"arTa", L'ت'}, /* taa U+062A */
+ {"arain", L'ع'}, /* ain U+0639 */
+ {"arainfull", L'ع'}, /* ain U+0639 */
+ {"aralif", L'ا'}, /* alef U+0627 */
+ {"arba", L'ب'}, /* baa U+0628 */
+ {"arha", L'ه'}, /* ha U+0647 */
+ {"aries", L'♈'},
+ {"arnun", L'ن'}, /* noon U+0646 */
+ {"arnunfull", L'ن'}, /* noon U+0646 */
+ {"arpa", L'ه'}, /* ha U+0647 */
+ {"arqoph", L'ق'}, /* qaf U+0642 */
+ {"arshinfull", L'ش'}, /* sheen U+0634 */
+ {"arta", L'ت'}, /* taa U+062A */
+ {"artafull", L'ت'}, /* taa U+062A */
+ {"artha", L'ث'}, /* thaa U+062B */
+ {"arwaw", L'و'}, /* waw U+0648 */
+ {"arya", L'ي'}, /* ya U+064A */
+ {"aryafull", L'ي'}, /* ya U+064A */
+ {"arzero", L'٠'}, /* indic zero U+0660 */
+ {"asg", L'ʒ'}, /* unicycle character. Cf "hallow" */
+ {"asper", LASP},
+ {"assert", L'⊢'},
+ {"astm", L'⁂'}, /* asterism: should be upside down */
+ {"at", L'@'},
+ {"atilde", L'ã'},
+ {"auml", L'ä'},
+ {"ayin", L'ع'}, /* arabic ain U+0639 */
+ {"b1", L'-'}, /* single bond */
+ {"b2", L'='}, /* double bond */
+ {"b3", L'≡'}, /* triple bond */
+ {"bbar", L'ƀ'}, /* b with bar U+0180 */
+ {"beta", L'β'},
+ {"bigobl", L'/'},
+ {"blC", L'C'}, /* should be black letter */
+ {"blJ", L'J'}, /* should be black letter */
+ {"blU", L'U'}, /* should be black letter */
+ {"blb", L'b'}, /* should be black letter */
+ {"blozenge", L'◊'}, /* U+25CA; should be black */
+ {"bly", L'y'}, /* should be black letter */
+ {"bra", MBRA},
+ {"brbl", LBRB},
+ {"breve", LBRV},
+ {"bslash", L'\\'},
+ {"bsquare", L'■'}, /* black square U+25A0 */
+ {"btril", L'◀'}, /* U+25C0 */
+ {"btrir", L'▶'}, /* U+25B6 */
+ {"c", L'c'}, /* circa */
+ {"cab", L'〉'},
+ {"cacute", L'ć'},
+ {"canc", L'♋'},
+ {"capr", L'♑'},
+ {"caret", L'^'},
+ {"cb", L'}'},
+ {"cbigb", L'}'},
+ {"cbigpren", L')'},
+ {"cbigsb", L']'},
+ {"cced", L'ç'},
+ {"cdil", LCED},
+ {"cdsb", L'〛'}, /* ]] U+301b */
+ {"cent", L'¢'},
+ {"chacek", L'č'},
+ {"chi", L'χ'},
+ {"circ", LRNG},
+ {"circa", L'c'}, /* about (year) */
+ {"circbl", L'̥'}, /* ring below accent U+0325 */
+ {"circle", L'○'}, /* U+25CB */
+ {"circledot", L'⊙'},
+ {"click", L'ʖ'},
+ {"club", L'♣'},
+ {"comtime", L'C'},
+ {"conj", L'☌'},
+ {"cprt", L'©'},
+ {"cq", L'\''},
+ {"cqq", L'”'},
+ {"cross", L'✠'}, /* maltese cross U+2720 */
+ {"crotchet", L'♩'},
+ {"csb", L']'},
+ {"ctilde", L'c'}, /* +tilde */
+ {"ctlig", MLCT},
+ {"cyra", L'а'},
+ {"cyre", L'е'},
+ {"cyrhard", L'ъ'},
+ {"cyrjat", L'ѣ'},
+ {"cyrm", L'м'},
+ {"cyrn", L'н'},
+ {"cyrr", L'р'},
+ {"cyrsoft", L'ь'},
+ {"cyrt", L'т'},
+ {"cyry", L'ы'},
+ {"dag", L'†'},
+ {"dbar", L'đ'},
+ {"dblar", L'⇋'},
+ {"dblgt", L'≫'},
+ {"dbllt", L'≪'},
+ {"dced", L'd'}, /* +cedilla */
+ {"dd", MDD},
+ {"ddag", L'‡'},
+ {"ddd", MDDD},
+ {"decr", L'↓'},
+ {"deg", L'°'},
+ {"dele", L'd'}, /* should be dele */
+ {"delta", L'δ'},
+ {"descnode", L'☋'}, /* descending node U+260B */
+ {"diamond", L'♢'},
+ {"digamma", L'ϝ'},
+ {"div", L'÷'},
+ {"dlessi", L'ı'},
+ {"dlessj1", L'j'}, /* should be dotless */
+ {"dlessj2", L'j'}, /* should be dotless */
+ {"dlessj3", L'j'}, /* should be dotless */
+ {"dollar", L'$'},
+ {"dotab", LDOT},
+ {"dotbl", LDTB},
+ {"drachm", L'ʒ'},
+ {"dubh", L'-'},
+ {"eacute", L'é'},
+ {"earth", L'♁'},
+ {"easper", MEAS},
+ {"ebreve", L'ĕ'},
+ {"ecirc", L'ê'},
+ {"edh", L'ð'},
+ {"egrave", L'è'},
+ {"ehacek", L'ě'},
+ {"ehook", L'ę'},
+ {"elem", L'∊'},
+ {"elenis", MELN},
+ {"em", L'—'},
+ {"emacr", L'ē'},
+ {"emem", MEMM},
+ {"en", L'–'},
+ {"epsilon", L'ε'},
+ {"equil", L'⇋'},
+ {"ergo", L'∴'},
+ {"es", MES},
+ {"eszett", L'ß'},
+ {"eta", L'η'},
+ {"eth", L'ð'},
+ {"euml", L'ë'},
+ {"expon", L'↑'},
+ {"fact", L'!'},
+ {"fata", L'ɑ'},
+ {"fatpara", L'¶'}, /* should have fatter, filled in bowl */
+ {"female", L'♀'},
+ {"ffilig", MLFFI},
+ {"fflig", MLFF},
+ {"ffllig", MLFFL},
+ {"filig", MLFI},
+ {"flat", L'♭'},
+ {"fllig", MLFL},
+ {"frE", L'E'}, /* should be curly */
+ {"frL", L'L'}, /* should be curly */
+ {"frR", L'R'}, /* should be curly */
+ {"frakB", L'B'}, /* should have fraktur style */
+ {"frakG", L'G'},
+ {"frakH", L'H'},
+ {"frakI", L'I'},
+ {"frakM", L'M'},
+ {"frakU", L'U'},
+ {"frakX", L'X'},
+ {"frakY", L'Y'},
+ {"frakh", L'h'},
+ {"frbl", LFRB},
+ {"frown", LFRN},
+ {"fs", L' '},
+ {"fsigma", L'ς'},
+ {"gAacute", L'Á'}, /* should be Α+acute */
+ {"gaacute", L'α'}, /* +acute */
+ {"gabreve", L'α'}, /* +breve */
+ {"gafrown", L'α'}, /* +frown */
+ {"gagrave", L'α'}, /* +grave */
+ {"gamacr", L'α'}, /* +macron */
+ {"gamma", L'γ'},
+ {"gauml", L'α'}, /* +umlaut */
+ {"ge", L'≧'},
+ {"geacute", L'ε'}, /* +acute */
+ {"gegrave", L'ε'}, /* +grave */
+ {"ghacute", L'η'}, /* +acute */
+ {"ghfrown", L'η'}, /* +frown */
+ {"ghgrave", L'η'}, /* +grave */
+ {"ghmacr", L'η'}, /* +macron */
+ {"giacute", L'ι'}, /* +acute */
+ {"gibreve", L'ι'}, /* +breve */
+ {"gifrown", L'ι'}, /* +frown */
+ {"gigrave", L'ι'}, /* +grave */
+ {"gimacr", L'ι'}, /* +macron */
+ {"giuml", L'ι'}, /* +umlaut */
+ {"glagjat", L'ѧ'},
+ {"glots", L'ˀ'},
+ {"goacute", L'ο'}, /* +acute */
+ {"gobreve", L'ο'}, /* +breve */
+ {"grave", LGRV},
+ {"gt", L'>'},
+ {"guacute", L'υ'}, /* +acute */
+ {"gufrown", L'υ'}, /* +frown */
+ {"gugrave", L'υ'}, /* +grave */
+ {"gumacr", L'υ'}, /* +macron */
+ {"guuml", L'υ'}, /* +umlaut */
+ {"gwacute", L'ω'}, /* +acute */
+ {"gwfrown", L'ω'}, /* +frown */
+ {"gwgrave", L'ω'}, /* +grave */
+ {"hacek", LHCK},
+ {"halft", L'⌈'},
+ {"hash", L'#'},
+ {"hasper", MHAS},
+ {"hatpath", L'ֲ'}, /* hataf patah U+05B2 */
+ {"hatqam", L'ֳ'}, /* hataf qamats U+05B3 */
+ {"hatseg", L'ֱ'}, /* hataf segol U+05B1 */
+ {"hbar", L'ħ'},
+ {"heart", L'♡'},
+ {"hebaleph", L'א'}, /* aleph U+05D0 */
+ {"hebayin", L'ע'}, /* ayin U+05E2 */
+ {"hebbet", L'ב'}, /* bet U+05D1 */
+ {"hebbeth", L'ב'}, /* bet U+05D1 */
+ {"hebcheth", L'ח'}, /* bet U+05D7 */
+ {"hebdaleth", L'ד'}, /* dalet U+05D3 */
+ {"hebgimel", L'ג'}, /* gimel U+05D2 */
+ {"hebhe", L'ה'}, /* he U+05D4 */
+ {"hebkaph", L'כ'}, /* kaf U+05DB */
+ {"heblamed", L'ל'}, /* lamed U+05DC */
+ {"hebmem", L'מ'}, /* mem U+05DE */
+ {"hebnun", L'נ'}, /* nun U+05E0 */
+ {"hebnunfin", L'ן'}, /* final nun U+05DF */
+ {"hebpe", L'פ'}, /* pe U+05E4 */
+ {"hebpedag", L'ף'}, /* final pe? U+05E3 */
+ {"hebqoph", L'ק'}, /* qof U+05E7 */
+ {"hebresh", L'ר'}, /* resh U+05E8 */
+ {"hebshin", L'ש'}, /* shin U+05E9 */
+ {"hebtav", L'ת'}, /* tav U+05EA */
+ {"hebtsade", L'צ'}, /* tsadi U+05E6 */
+ {"hebwaw", L'ו'}, /* vav? U+05D5 */
+ {"hebyod", L'י'}, /* yod U+05D9 */
+ {"hebzayin", L'ז'}, /* zayin U+05D6 */
+ {"hgz", L'ʒ'}, /* ??? Cf "alet" */
+ {"hireq", L'ִ'}, /* U+05B4 */
+ {"hlenis", MHLN},
+ {"hook", LOGO},
+ {"horizE", L'E'}, /* should be on side */
+ {"horizP", L'P'}, /* should be on side */
+ {"horizS", L'∽'},
+ {"horizT", L'⊣'},
+ {"horizb", L'{'}, /* should be underbrace */
+ {"ia", L'α'},
+ {"iacute", L'í'},
+ {"iasper", MIAS},
+ {"ib", L'β'},
+ {"ibar", L'ɨ'},
+ {"ibreve", L'ĭ'},
+ {"icirc", L'î'},
+ {"id", L'δ'},
+ {"ident", L'≡'},
+ {"ie", L'ε'},
+ {"ifilig", MLFI},
+ {"ifflig", MLFF},
+ {"ig", L'γ'},
+ {"igrave", L'ì'},
+ {"ih", L'η'},
+ {"ii", L'ι'},
+ {"ik", L'κ'},
+ {"ilenis", MILN},
+ {"imacr", L'ī'},
+ {"implies", L'⇒'},
+ {"index", L'☞'},
+ {"infin", L'∞'},
+ {"integ", L'∫'},
+ {"intsec", L'∩'},
+ {"invpri", L'ˏ'},
+ {"iota", L'ι'},
+ {"iq", L'ψ'},
+ {"istlig", MLST},
+ {"isub", L'ϵ'}, /* iota below accent */
+ {"iuml", L'ï'},
+ {"iz", L'ζ'},
+ {"jup", L'♃'},
+ {"kappa", L'κ'},
+ {"koppa", L'ϟ'},
+ {"lambda", L'λ'},
+ {"lar", L'←'},
+ {"lbar", L'ł'},
+ {"le", L'≦'},
+ {"lenis", LLEN},
+ {"leo", L'♌'},
+ {"lhalfbr", L'⌈'},
+ {"lhshoe", L'⊃'},
+ {"libra", L'♎'},
+ {"llswing", MLLS},
+ {"lm", L'ː'},
+ {"logicand", L'∧'},
+ {"logicor", L'∨'},
+ {"longs", L'ʃ'},
+ {"lrar", L'↔'},
+ {"lt", L'<'},
+ {"ltappr", L'≾'},
+ {"ltflat", L'∠'},
+ {"lumlbl", L'l'}, /* +umlaut below */
+ {"mac", LMAC},
+ {"male", L'♂'},
+ {"mc", L'c'}, /* should be raised */
+ {"merc", L'☿'}, /* mercury U+263F */
+ {"min", L'−'},
+ {"moonfq", L'☽'}, /* first quarter moon U+263D */
+ {"moonlq", L'☾'}, /* last quarter moon U+263E */
+ {"msylab", L'm'}, /* +sylab (ˌ) */
+ {"mu", L'μ'},
+ {"nacute", L'ń'},
+ {"natural", L'♮'},
+ {"neq", L'≠'},
+ {"nfacute", L'′'},
+ {"nfasper", L'ʽ'},
+ {"nfbreve", L'˘'},
+ {"nfced", L'¸'},
+ {"nfcirc", L'ˆ'},
+ {"nffrown", L'⌢'},
+ {"nfgra", L'ˋ'},
+ {"nfhacek", L'ˇ'},
+ {"nfmac", L'¯'},
+ {"nftilde", L'˜'},
+ {"nfuml", L'¨'},
+ {"ng", L'ŋ'},
+ {"not", L'¬'},
+ {"notelem", L'∉'},
+ {"ntilde", L'ñ'},
+ {"nu", L'ν'},
+ {"oab", L'〈'},
+ {"oacute", L'ó'},
+ {"oasper", MOAS},
+ {"ob", L'{'},
+ {"obar", L'ø'},
+ {"obigb", L'{'}, /* should be big */
+ {"obigpren", L'('},
+ {"obigsb", L'['}, /* should be big */
+ {"obreve", L'ŏ'},
+ {"ocirc", L'ô'},
+ {"odsb", L'〚'}, /* [[ U+301A */
+ {"oelig", L'œ'},
+ {"oeamp", L'&'},
+ {"ograve", L'ò'},
+ {"ohook", L'o'}, /* +hook */
+ {"olenis", MOLN},
+ {"omacr", L'ō'},
+ {"omega", L'ω'},
+ {"omicron", L'ο'},
+ {"ope", L'ɛ'},
+ {"opp", L'☍'},
+ {"oq", L'`'},
+ {"oqq", L'“'},
+ {"or", MOR},
+ {"osb", L'['},
+ {"otilde", L'õ'},
+ {"ouml", L'ö'},
+ {"ounce", L'℥'}, /* ounce U+2125 */
+ {"ovparen", L'⌢'}, /* should be sideways ( */
+ {"p", L'′'},
+ {"pa", L'∂'},
+ {"page", L'P'},
+ {"pall", L'ʎ'},
+ {"paln", L'ɲ'},
+ {"par", PAR},
+ {"para", L'¶'},
+ {"pbar", L'p'}, /* +bar */
+ {"per", L'℘'}, /* per U+2118 */
+ {"phi", L'φ'},
+ {"phi2", L'ϕ'},
+ {"pi", L'π'},
+ {"pisces", L'♓'},
+ {"planck", L'ħ'},
+ {"plantinJ", L'J'}, /* should be script */
+ {"pm", L'±'},
+ {"pmil", L'‰'},
+ {"pp", L'″'},
+ {"ppp", L'‴'},
+ {"prop", L'∝'},
+ {"psi", L'ψ'},
+ {"pstlg", L'£'},
+ {"q", L'?'}, /* should be raised */
+ {"qamets", L'ֳ'}, /* U+05B3 */
+ {"quaver", L'♪'},
+ {"rar", L'→'},
+ {"rasper", MRAS},
+ {"rdot", L'·'},
+ {"recipe", L'℞'}, /* U+211E */
+ {"reg", L'®'},
+ {"revC", L'Ɔ'}, /* open O U+0186 */
+ {"reva", L'ɒ'},
+ {"revc", L'ɔ'},
+ {"revope", L'ɜ'},
+ {"revr", L'ɹ'},
+ {"revsc", L'˒'}, /* upside-down semicolon */
+ {"revv", L'ʌ'},
+ {"rfa", L'o'}, /* +hook (Cf "goal") */
+ {"rhacek", L'ř'},
+ {"rhalfbr", L'⌉'},
+ {"rho", L'ρ'},
+ {"rhshoe", L'⊂'},
+ {"rlenis", MRLN},
+ {"rsylab", L'r'}, /* +sylab */
+ {"runash", L'F'}, /* should be runic 'ash' */
+ {"rvow", L'˔'},
+ {"sacute", L'ś'},
+ {"sagit", L'♐'},
+ {"sampi", L'ϡ'},
+ {"saturn", L'♄'},
+ {"sced", L'ş'},
+ {"schwa", L'ə'},
+ {"scorpio", L'♏'},
+ {"scrA", L'A'}, /* should be script */
+ {"scrC", L'C'},
+ {"scrE", L'E'},
+ {"scrF", L'F'},
+ {"scrI", L'I'},
+ {"scrJ", L'J'},
+ {"scrL", L'L'},
+ {"scrO", L'O'},
+ {"scrP", L'P'},
+ {"scrQ", L'Q'},
+ {"scrS", L'S'},
+ {"scrT", L'T'},
+ {"scrb", L'b'},
+ {"scrd", L'd'},
+ {"scrh", L'h'},
+ {"scrl", L'l'},
+ {"scruple", L'℈'}, /* U+2108 */
+ {"sdd", L'ː'},
+ {"sect", L'§'},
+ {"semE", L'∃'},
+ {"sh", L'ʃ'},
+ {"shacek", L'š'},
+ {"sharp", L'♯'},
+ {"sheva", L'ְ'}, /* U+05B0 */
+ {"shti", L'ɪ'},
+ {"shtsyll", L'∪'},
+ {"shtu", L'ʊ'},
+ {"sidetri", L'⊲'},
+ {"sigma", L'σ'},
+ {"since", L'∵'},
+ {"slge", L'≥'}, /* should have slanted line under */
+ {"slle", L'≤'}, /* should have slanted line under */
+ {"sm", L'ˈ'},
+ {"smm", L'ˌ'},
+ {"spade", L'♠'},
+ {"sqrt", L'√'},
+ {"square", L'□'}, /* U+25A1 */
+ {"ssChi", L'Χ'}, /* should be sans serif */
+ {"ssIota", L'Ι'},
+ {"ssOmicron", L'Ο'},
+ {"ssPi", L'Π'},
+ {"ssRho", L'Ρ'},
+ {"ssSigma", L'Σ'},
+ {"ssTau", L'Τ'},
+ {"star", L'*'},
+ {"stlig", MLST},
+ {"sup2", L'⁲'},
+ {"supgt", L'˃'},
+ {"suplt", L'˂'},
+ {"sur", L'ʳ'},
+ {"swing", L'∼'},
+ {"tau", L'τ'},
+ {"taur", L'♉'},
+ {"th", L'þ'},
+ {"thbar", L'þ'}, /* +bar */
+ {"theta", L'θ'},
+ {"thinqm", L'?'}, /* should be thinner */
+ {"tilde", LTIL},
+ {"times", L'×'},
+ {"tri", L'∆'},
+ {"trli", L'‖'},
+ {"ts", L' '},
+ {"uacute", L'ú'},
+ {"uasper", MUAS},
+ {"ubar", L'u'}, /* +bar */
+ {"ubreve", L'ŭ'},
+ {"ucirc", L'û'},
+ {"udA", L'∀'},
+ {"udT", L'⊥'},
+ {"uda", L'ɐ'},
+ {"udh", L'ɥ'},
+ {"udqm", L'¿'},
+ {"udpsi", L'⋔'},
+ {"udtr", L'∇'},
+ {"ugrave", L'ù'},
+ {"ulenis", MULN},
+ {"umacr", L'ū'},
+ {"uml", LUML},
+ {"undl", L'ˍ'}, /* underline accent */
+ {"union", L'∪'},
+ {"upsilon", L'υ'},
+ {"uuml", L'ü'},
+ {"vavpath", L'ו'}, /* vav U+05D5 (+patah) */
+ {"vavsheva", L'ו'}, /* vav U+05D5 (+sheva) */
+ {"vb", L'|'},
+ {"vddd", L'⋮'},
+ {"versicle2", L'℣'}, /* U+2123 */
+ {"vinc", L'¯'},
+ {"virgo", L'♍'},
+ {"vpal", L'ɟ'},
+ {"vvf", L'ɣ'},
+ {"wasper", MWAS},
+ {"wavyeq", L'≈'},
+ {"wlenis", MWLN},
+ {"wyn", L'ƿ'}, /* wynn U+01BF */
+ {"xi", L'ξ'},
+ {"yacute", L'ý'},
+ {"ycirc", L'ŷ'},
+ {"ygh", L'ʒ'},
+ {"ymacr", L'y'}, /* +macron */
+ {"yuml", L'ÿ'},
+ {"zced", L'z'}, /* +cedilla */
+ {"zeta", L'ζ'},
+ {"zh", L'ʒ'},
+ {"zhacek", L'ž'},
+};
+/*
+ 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*/ L' ', L'!', L'"', L'#', L'$', L'%', SPCS, L'\'',
+ L'(', L')', L'*', L'+', L',', L'-', L'.', L'/',
+/*30*/ L'0', L'1', L'2', L'3', L'4', L'5', L'6', L'7',
+ L'8', L'9', L':', L';', TAGS, L'=', TAGE, L'?',
+/*40*/ L'@', L'A', L'B', L'C', L'D', L'E', L'F', L'G',
+ L'H', L'I', L'J', L'K', L'L', L'M', L'N', L'O',
+/*50*/ L'P', L'Q', L'R', L'S', L'T', L'U', L'V', L'W',
+ L'X', L'Y', L'Z', L'[', L'\\', L']', L'^', L'_',
+/*60*/ L'`', L'a', L'b', L'c', L'd', L'e', L'f', L'g',
+ L'h', L'i', L'j', L'k', L'l', L'm', L'n', L'o',
+/*70*/ L'p', L'q', L'r', L's', L't', L'u', L'v', L'w',
+ L'x', L'y', L'z', L'{', L'|', L'}', L'~', 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*/ L' ', L'!', L'ˈ', L'#', L'$', L'ˌ', L'æ', L'\'',
+ L'(', L')', L'*', L'+', L',', L'-', L'.', L'/',
+/*30*/ L'0', L'1', L'2', L'ɜ', L'4', L'5', L'6', L'7',
+ L'8', L'ø', L'ː', L';', TAGS, L'=', TAGE, L'?',
+/*40*/ L'ə', L'ɑ', L'B', L'C', L'ð', L'ɛ', L'F', L'G',
+ L'H', L'ɪ', L'J', L'K', L'L', L'M', L'ŋ', L'ɔ',
+/*50*/ L'P', L'ɒ', L'R', L'ʃ', L'θ', L'ʊ', L'ʌ', L'W',
+ L'X', L'Y', L'ʒ', L'[', L'\\', L']', L'^', L'_',
+/*60*/ L'`', L'a', L'b', L'c', L'd', L'e', L'f', L'g',
+ L'h', L'i', L'j', L'k', L'l', L'm', L'n', L'o',
+/*70*/ L'p', L'q', L'r', L's', L't', L'u', L'v', L'w',
+ L'x', L'y', L'z', L'{', L'|', L'}', L'~', 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*/ L' ', L'!', L'"', L'#', L'$', L'%', SPCS, L'\'',
+ L'(', L')', L'*', L'+', L',', L'-', L'.', L'/',
+/*30*/ L'0', L'1', L'2', L'3', L'4', L'5', L'6', L'7',
+ L'8', L'9', L':', L';', TAGS, L'=', TAGE, L'?',
+/*40*/ L'@', L'Α', L'Β', L'Ξ', L'Δ', L'Ε', L'Φ', L'Γ',
+ L'Η', L'Ι', L'Ϛ', L'Κ', L'Λ', L'Μ', L'Ν', L'Ο',
+/*50*/ L'Π', L'Θ', L'Ρ', L'Σ', L'Τ', L'Υ', L'V', L'Ω',
+ L'Χ', L'Ψ', L'Ζ', L'[', L'\\', L']', L'^', L'_',
+/*60*/ L'`', L'α', L'β', L'ξ', L'δ', L'ε', L'φ', L'γ',
+ L'η', L'ι', L'ς', L'κ', L'λ', L'μ', L'ν', L'ο',
+/*70*/ L'π', L'θ', L'ρ', L'σ', L'τ', L'υ', L'v', L'ω',
+ L'χ', L'ψ', L'ζ', L'{', L'|', L'}', L'~', 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*/ L' ', L'!', L'"', L'#', L'$', L'%', SPCS, L'\'',
+ L'₍', L'₎', L'*', L'₊', L',', L'₋', L'.', L'/',
+/*30*/ L'₀', L'₁', L'₂', L'₃', L'₄', L'₅', L'₆', L'₇',
+ L'₈', L'₉', L':', L';', TAGS, L'₌', TAGE, L'?',
+/*40*/ L'@', L'A', L'B', L'C', L'D', L'E', L'F', L'G',
+ L'H', L'I', L'J', L'K', L'L', L'M', L'N', L'O',
+/*50*/ L'P', L'Q', L'R', L'S', L'T', L'U', L'V', L'W',
+ L'X', L'Y', L'Z', L'[', L'\\', L']', L'^', L'_',
+/*60*/ L'`', L'a', L'b', L'c', L'd', L'e', L'f', L'g',
+ L'h', L'i', L'j', L'k', L'l', L'm', L'n', L'o',
+/*70*/ L'p', L'q', L'r', L's', L't', L'u', L'v', L'w',
+ L'x', L'y', L'z', L'{', L'|', L'}', L'~', 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*/ L' ', L'!', L'"', L'#', L'$', L'%', SPCS, L'\'',
+ L'⁽', L'⁾', L'*', L'⁺', L',', L'⁻', L'.', L'/',
+/*30*/ L'⁰', L'ⁱ', L'⁲', L'⁳', L'⁴', L'⁵', L'⁶', L'⁷',
+ L'⁸', L'⁹', L':', L';', TAGS, L'⁼', TAGE, L'?',
+/*40*/ L'@', L'A', L'B', L'C', L'D', L'E', L'F', L'G',
+ L'H', L'I', L'J', L'K', L'L', L'M', L'N', L'O',
+/*50*/ L'P', L'Q', L'R', L'S', L'T', L'U', L'V', L'W',
+ L'X', L'Y', L'Z', L'[', L'\\', L']', L'^', L'_',
+/*60*/ L'`', L'a', L'b', L'c', L'd', L'e', L'f', L'g',
+ L'h', L'i', L'j', L'k', L'l', L'm', L'n', L'o',
+/*70*/ L'p', L'q', L'r', L's', L't', L'u', L'v', L'w',
+ L'x', L'y', L'z', L'{', L'|', L'}', L'~', NONE,
+};
+
+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 = L'�';
+ }
+ 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/sys/src/cmd/dict/rev.awk b/sys/src/cmd/dict/rev.awk
new file mode 100755
index 000000000..3c77d6845
--- /dev/null
+++ b/sys/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/sys/src/cmd/dict/robert.c b/sys/src/cmd/dict/robert.c
new file mode 100755
index 000000000..56dbd5ec5
--- /dev/null
+++ b/sys/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, L'☺', L'☻', L'♥', L'♦', L'♣', L'♠', L'•',
+ 0x25d8, L'ʘ', L'\n', L'♂', L'♀', L'♪', 0x266b, L'※',
+/*10*/ L'⇨', L'⇦', L'↕', L'‼', L'¶', L'§', L'⁃', L'↨',
+ L'↑', L'↓', L'→', L'←', L'⌙', L'↔', 0x25b4, 0x25be,
+/*20*/ L' ', L'!', L'"', L'#', L'$', L'%', L'&', L''',
+ L'(', L')', L'*', L'+', L',', L'-', L'.', L'/',
+/*30*/ L'0', L'1', L'2', L'3', L'4', L'5', L'6', L'7',
+ L'8', L'9', L':', L';', L'<', L'=', L'>', L'?',
+/*40*/ L'@', L'A', L'B', L'C', L'D', L'E', L'F', L'G',
+ L'H', L'I', L'J', L'K', L'L', L'M', L'N', L'O',
+/*50*/ L'P', L'Q', L'R', L'S', L'T', L'U', L'V', L'W',
+ L'X', L'Y', L'Z', L'[', L'\\', L']', L'^', L'_',
+/*60*/ L'`', L'a', L'b', L'c', L'd', L'e', L'f', L'g',
+ L'h', L'i', L'j', L'k', L'l', L'm', L'n', L'o',
+/*70*/ L'p', L'q', L'r', L's', L't', L'u', L'v', L'w',
+ L'x', L'y', L'z', L'{', L'|', L'}', L'~', L'',
+/*80*/ L'Ç', L'ü', L'é', L'â', L'ä', L'à', L'å', L'ç',
+ L'ê', L'ë', L'è', L'ï', L'î', L'ì', L'Ä', L'Å',
+/*90*/ L'É', L'æ', L'Æ', L'ô', L'ö', L'ò', L'û', L'ù',
+ L'ÿ', L'Ö', L'Ü', L'¢', L'£', L'¥', L'₧', L'ʃ',
+/*a0*/ L'á', L'í', L'ó', L'ú', L'ñ', L'Ñ', L'ª', L'º',
+ L'¿', L'⌐', L'¬', L'½', L'¼', L'¡', L'«', L'»',
+/*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*/ L'α', L'ß', L'γ', L'π', L'Σ', L'σ', L'µ', L'τ',
+ L'Φ', L'Θ', L'Ω', L'δ', L'∞', L'Ø', L'ε', L'∩',
+/*f0*/ L'≡', L'±', L'≥', L'≤', L'⌠', L'⌡', L'÷', L'≈',
+ L'°', L'∙', L'·', L'√', L'ⁿ', L'²', L'∎', L' ',
+};
+
+static Rune suptab[] = {
+ ['0'] L'⁰', ['1'] L'ⁱ', ['2'] L'⁲', ['3'] L'⁳',
+ ['4'] L'⁴', ['5'] L'⁵', ['6'] L'⁶', ['7'] L'⁷',
+ ['8'] L'⁸', ['9'] L'⁹', ['+'] L'⁺', ['-'] L'⁻',
+ ['='] L'⁼', ['('] L'⁽', [')'] L'⁾', ['a'] L'ª',
+ ['n'] L'ⁿ', ['o'] L'º'
+};
+
+static Rune subtab[] = {
+ ['0'] L'₀', ['1'] L'₁', ['2'] L'₂', ['3'] L'₃',
+ ['4'] L'₄', ['5'] L'₅', ['6'] L'₆', ['7'] L'₇',
+ ['8'] L'₈', ['9'] L'₉', ['+'] L'₊', ['-'] L'₋',
+ ['='] L'₌', ['('] L'₍', [')'] L'₎'
+};
+
+#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/sys/src/cmd/dict/roget.c b/sys/src/cmd/dict/roget.c
new file mode 100755
index 000000000..46d64b8c5
--- /dev/null
+++ b/sys/src/cmd/dict/roget.c
@@ -0,0 +1,147 @@
+#include <u.h>
+#include <libc.h>
+#include <bio.h>
+#include <ctype.h>
+#include "dict.h"
+
+/* Roget's Thesaurus from project Gutenberg */
+
+static long Last = 0;
+
+void
+rogetprintentry(Entry e, int cmd)
+{
+ int spc;
+ char c, *p;
+
+ spc = 0;
+ p = e.start;
+
+ if(cmd == 'h'){
+ while(!isspace(*p) && p < e.end)
+ p++;
+ while(strncmp(p, " -- ", 4) != 0 && p < e.end){
+ while(isspace(*p) && p < e.end)
+ p++;
+ if (*p == '[' || *p == '{'){
+ c = (*p == '[')? ']': '}';
+ while(*p != c && p < e.end)
+ p++;
+ p++;
+ continue;
+ }
+ if (isdigit(*p) || ispunct(*p)){
+ while(!isspace(*p) && p < e.end)
+ p++;
+ continue;
+ }
+
+
+ if (isspace(*p))
+ spc = 1;
+ else
+ if (spc){
+ outchar(' ');
+ spc = 0;
+ }
+
+ while(!isspace(*p) && p < e.end)
+ outchar(*p++);
+ }
+ return;
+ }
+
+ while(p < e.end && !isspace(*p))
+ p++;
+ while(p < e.end && isspace(*p))
+ p++;
+
+ while (p < e.end){
+ if (p < e.end -4 && strncmp(p, " -- ", 4) == 0){ /* first line */
+ outnl(2);
+ p += 4;
+ spc = 0;
+ }
+
+ if (p < e.end -2 && strncmp(p, "[ ", 4) == 0){ /* twiddle layout */
+ outchars(" [");
+ continue;
+ }
+
+ if (p < e.end -4 && strncmp(p, "&c (", 4) == 0){ /* usefull xref */
+ if (spc)
+ outchar(' ');
+ outchar('/');
+ while(p < e.end && *p != '(')
+ p++;
+ p++;
+ while(p < e.end && *p != ')')
+ outchar(*p++);
+ p++;
+ while(p < e.end && isspace(*p))
+ p++;
+ while(p < e.end && isdigit(*p))
+ p++;
+ outchar('/');
+ continue;
+ }
+
+ if (p < e.end -3 && strncmp(p, "&c ", 3) == 0){ /* less usefull xref */
+ while(p < e.end && !isdigit(*p))
+ p++;
+ while(p < e.end && isdigit(*p))
+ p++;
+ continue;
+ }
+
+ if (*p == '\n' && p < (e.end -1)){ /* their newlines */
+ spc = 0;
+ p++;
+ if (isspace(*p)){ /* their continuation line */
+ while (isspace(*p))
+ p++;
+ p--;
+ }
+ else{
+ outnl(2);
+ }
+ }
+ if (spc && *p != ';' && *p != '.' &&
+ *p != ',' && !isspace(*p)){ /* drop spaces before punct */
+ spc = 0;
+ outchar(' ');
+ }
+ if (isspace(*p))
+ spc = 1;
+ else
+ outchar(*p);
+ p++;
+ }
+ outnl(0);
+}
+
+long
+rogetnextoff(long fromoff)
+{
+ int i;
+ vlong l;
+ char *p;
+
+ Bseek(bdict, fromoff, 0);
+ Brdline(bdict, '\n');
+ while ((p = Brdline(bdict, '\n')) != nil){
+ l = Blinelen(bdict);
+ if (!isdigit(*p))
+ continue;
+ for (i = 0; i < l-4; i++)
+ if (strncmp(p+i, " -- ", 4) == 0)
+ return Boffset(bdict)-l;
+ }
+ return Boffset(bdict);
+}
+
+void
+rogetprintkey(void)
+{
+ Bprint(bout, "No pronunciation key.\n");
+}
diff --git a/sys/src/cmd/dict/simple.c b/sys/src/cmd/dict/simple.c
new file mode 100755
index 000000000..ea0443bac
--- /dev/null
+++ b/sys/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/sys/src/cmd/dict/slang.c b/sys/src/cmd/dict/slang.c
new file mode 100755
index 000000000..bd32b9762
--- /dev/null
+++ b/sys/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/sys/src/cmd/dict/t.awk b/sys/src/cmd/dict/t.awk
new file mode 100755
index 000000000..e722a3cc1
--- /dev/null
+++ b/sys/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/sys/src/cmd/dict/thesaurus.c b/sys/src/cmd/dict/thesaurus.c
new file mode 100755
index 000000000..8ad3006bb
--- /dev/null
+++ b/sys/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/sys/src/cmd/dict/utils.c b/sys/src/cmd/dict/utils.c
new file mode 100755
index 000000000..d13a71333
--- /dev/null
+++ b/sys/src/cmd/dict/utils.c
@@ -0,0 +1,580 @@
+#include <u.h>
+#include <libc.h>
+#include <bio.h>
+#include "dict.h"
+
+Dict dicts[] = {
+ {"oed", "Oxford English Dictionary, 2nd Ed.",
+ "/lib/dict/oed2", "/lib/dict/oed2index",
+ oednextoff, oedprintentry, oedprintkey},
+ {"ahd", "American Heritage Dictionary, 2nd College Ed.",
+ "/lib/ahd/DICT.DB", "/lib/ahd/index",
+ ahdnextoff, ahdprintentry, ahdprintkey},
+ {"pgw", "Project Gutenberg Webster Dictionary",
+ "/lib/dict/pgw", "/lib/dict/pgwindex",
+ pgwnextoff, pgwprintentry, pgwprintkey},
+ {"thesaurus", "Collins Thesaurus",
+ "/lib/dict/thesaurus", "/lib/dict/thesindex",
+ thesnextoff, thesprintentry, thesprintkey},
+ {"roget", "Project Gutenberg Roget's Thesaurus",
+ "/lib/dict/roget", "/lib/dict/rogetindex",
+ rogetnextoff, rogetprintentry, rogetprintkey},
+
+ {"ce", "Gendai Chinese->English",
+ "/lib/dict/world/sansdata/sandic24.dat",
+ "/lib/dict/world/sansdata/ceindex",
+ worldnextoff, worldprintentry, worldprintkey},
+ {"ceh", "Gendai Chinese->English (Hanzi index)",
+ "/lib/dict/world/sansdata/sandic24.dat",
+ "/lib/dict/world/sansdata/cehindex",
+ worldnextoff, worldprintentry, worldprintkey},
+ {"ec", "Gendai English->Chinese",
+ "/lib/dict/world/sansdata/sandic24.dat",
+ "/lib/dict/world/sansdata/ecindex",
+ worldnextoff, worldprintentry, worldprintkey},
+
+ {"dae", "Gyldendal Danish->English",
+ "/lib/dict/world/gylddata/sandic30.dat",
+ "/lib/dict/world/gylddata/daeindex",
+ worldnextoff, worldprintentry, worldprintkey},
+ {"eda", "Gyldendal English->Danish",
+ "/lib/dict/world/gylddata/sandic29.dat",
+ "/lib/dict/world/gylddata/edaindex",
+ worldnextoff, worldprintentry, worldprintkey},
+
+ {"due", "Wolters-Noordhoff Dutch->English",
+ "/lib/dict/world/woltdata/sandic07.dat",
+ "/lib/dict/world/woltdata/deindex",
+ worldnextoff, worldprintentry, worldprintkey},
+ {"edu", "Wolters-Noordhoff English->Dutch",
+ "/lib/dict/world/woltdata/sandic06.dat",
+ "/lib/dict/world/woltdata/edindex",
+ worldnextoff, worldprintentry, worldprintkey},
+
+ {"fie", "WSOY Finnish->English",
+ "/lib/dict/world/werndata/sandic32.dat",
+ "/lib/dict/world/werndata/fieindex",
+ worldnextoff, worldprintentry, worldprintkey},
+ {"efi", "WSOY English->Finnish",
+ "/lib/dict/world/werndata/sandic31.dat",
+ "/lib/dict/world/werndata/efiindex",
+ worldnextoff, worldprintentry, worldprintkey},
+
+ {"fe", "Collins French->English",
+ "/lib/dict/fe", "/lib/dict/feindex",
+ pcollnextoff, pcollprintentry, pcollprintkey},
+ {"ef", "Collins English->French",
+ "/lib/dict/ef", "/lib/dict/efindex",
+ pcollnextoff, pcollprintentry, pcollprintkey},
+
+ {"ge", "Collins German->English",
+ "/lib/dict/ge", "/lib/dict/geindex",
+ pcollgnextoff, pcollgprintentry, pcollgprintkey},
+ {"eg", "Collins English->German",
+ "/lib/dict/eg", "/lib/dict/egindex",
+ pcollgnextoff, pcollgprintentry, pcollgprintkey},
+
+ {"ie", "Collins Italian->English",
+ "/lib/dict/ie", "/lib/dict/ieindex",
+ pcollnextoff, pcollprintentry, pcollprintkey},
+ {"ei", "Collins English->Italian",
+ "/lib/dict/ei", "/lib/dict/eiindex",
+ pcollnextoff, pcollprintentry, pcollprintkey},
+
+ {"je", "Sanshusha Japanese->English",
+ "/lib/dict/world/sansdata/sandic18.dat",
+ "/lib/dict/world/sansdata/jeindex",
+ worldnextoff, worldprintentry, worldprintkey},
+ {"jek", "Sanshusha Japanese->English (Kanji index)",
+ "/lib/dict/world/sansdata/sandic18.dat",
+ "/lib/dict/world/sansdata/jekindex",
+ worldnextoff, worldprintentry, worldprintkey},
+ {"ej", "Sanshusha English->Japanese",
+ "/lib/dict/world/sansdata/sandic18.dat",
+ "/lib/dict/world/sansdata/ejindex",
+ worldnextoff, worldprintentry, worldprintkey},
+
+ {"tjeg", "Sanshusha technical Japanese->English,German",
+ "/lib/dict/world/sansdata/sandic16.dat",
+ "/lib/dict/world/sansdata/tjegindex",
+ worldnextoff, worldprintentry, worldprintkey},
+ {"tjegk", "Sanshusha technical Japanese->English,German (Kanji index)",
+ "/lib/dict/world/sansdata/sandic16.dat",
+ "/lib/dict/world/sansdata/tjegkindex",
+ worldnextoff, worldprintentry, worldprintkey},
+ {"tegj", "Sanshusha technical English->German,Japanese",
+ "/lib/dict/world/sansdata/sandic16.dat",
+ "/lib/dict/world/sansdata/tegjindex",
+ worldnextoff, worldprintentry, worldprintkey},
+ {"tgje", "Sanshusha technical German->Japanese,English",
+ "/lib/dict/world/sansdata/sandic16.dat",
+ "/lib/dict/world/sansdata/tgjeindex",
+ worldnextoff, worldprintentry, worldprintkey},
+
+ {"ne", "Kunnskapforlaget Norwegian->English",
+ "/lib/dict/world/kunndata/sandic28.dat",
+ "/lib/dict/world/kunndata/neindex",
+ worldnextoff, worldprintentry, worldprintkey},
+ {"en", "Kunnskapforlaget English->Norwegian",
+ "/lib/dict/world/kunndata/sandic27.dat",
+ "/lib/dict/world/kunndata/enindex",
+ worldnextoff, worldprintentry, worldprintkey},
+
+ {"re", "Leon Ungier Russian->English",
+ "/lib/dict/re", "/lib/dict/reindex",
+ simplenextoff, simpleprintentry, simpleprintkey},
+ {"er", "Leon Ungier English->Russian",
+ "/lib/dict/re", "/lib/dict/erindex",
+ simplenextoff, simpleprintentry, simpleprintkey},
+
+ {"se", "Collins Spanish->English",
+ "/lib/dict/se", "/lib/dict/seindex",
+ pcollnextoff, pcollprintentry, pcollprintkey},
+ {"es", "Collins English->Spanish",
+ "/lib/dict/es", "/lib/dict/esindex",
+ pcollnextoff, pcollprintentry, pcollprintkey},
+
+ {"swe", "Esselte Studium Swedish->English",
+ "/lib/dict/world/essedata/sandic34.dat",
+ "/lib/dict/world/essedata/sweindex",
+ worldnextoff, worldprintentry, worldprintkey},
+ {"esw", "Esselte Studium English->Swedish",
+ "/lib/dict/world/essedata/sandic33.dat",
+ "/lib/dict/world/essedata/eswindex",
+ worldnextoff, worldprintentry, worldprintkey},
+
+ {"movie", "Movies -- by title",
+ "/lib/movie/data", "/lib/dict/movtindex",
+ movienextoff, movieprintentry, movieprintkey},
+ {"moviea", "Movies -- by actor",
+ "/lib/movie/data", "/lib/dict/movaindex",
+ movienextoff, movieprintentry, movieprintkey},
+ {"movied", "Movies -- by director",
+ "/lib/movie/data", "/lib/dict/movdindex",
+ movienextoff, movieprintentry, movieprintkey},
+
+ {"slang", "English Slang",
+ "/lib/dict/slang", "/lib/dict/slangindex",
+ slangnextoff, slangprintentry, slangprintkey},
+
+ {"robert", "Robert Électronique",
+ "/lib/dict/robert/_pointers", "/lib/dict/robert/_index",
+ robertnextoff, robertindexentry, robertprintkey},
+ {"robertv", "Robert Électronique - formes des verbes",
+ "/lib/dict/robert/flex.rob", "/lib/dict/robert/_flexindex",
+ robertnextflex, robertflexentry, robertprintkey},
+
+ {0, 0, 0, 0, 0}
+};
+
+typedef struct Lig Lig;
+struct Lig {
+ Rune start; /* accent rune */
+ Rune *pairs; /* <char,accented version> pairs */
+};
+
+static Lig ligtab[Nligs] = {
+[LACU-LIGS] {L'´', L"AÁaáCĆcćEÉeégģIÍiíıíLĹlĺNŃnńOÓoóRŔrŕSŚsśUÚuúYÝyýZŹzź"},
+[LGRV-LIGS] {L'ˋ', L"AÀaàEÈeèIÌiìıìOÒoòUÙuù"},
+[LUML-LIGS] {L'¨', L"AÄaäEËeëIÏiïOÖoöUÜuüYŸyÿ"},
+[LCED-LIGS] {L'¸', L"CÇcçGĢKĶkķLĻlļNŅnņRŖrŗSŞsşTŢtţ"},
+[LTIL-LIGS] {L'˜', L"AÃaãIĨiĩıĩNÑnñOÕoõUŨuũ"},
+[LBRV-LIGS] {L'˘', L"AĂaăEĔeĕGĞgğIĬiĭıĭOŎoŏUŬuŭ"},
+[LRNG-LIGS] {L'˚', L"AÅaåUŮuů"},
+[LDOT-LIGS] {L'˙', L"CĊcċEĖeėGĠgġIİLĿlŀZŻzż"},
+[LDTB-LIGS] {L'.', L""},
+[LFRN-LIGS] {L'⌢', L"AÂaâCĈcĉEÊeêGĜgĝHĤhĥIÎiîıîJĴjĵOÔoôSŜsŝUÛuûWŴwŵYŶyŷ"},
+[LFRB-LIGS] {L'̯', L""},
+[LOGO-LIGS] {L'˛', L"AĄaąEĘeęIĮiįıįUŲuų"},
+[LMAC-LIGS] {L'¯', L"AĀaāEĒeēIĪiīıīOŌoōUŪuū"},
+[LHCK-LIGS] {L'ˇ', L"CČcčDĎdďEĚeěLĽlľNŇnňRŘrřSŠsšTŤtťZŽzž"},
+[LASP-LIGS] {L'ʽ', L""},
+[LLEN-LIGS] {L'ʼ', L""},
+[LBRB-LIGS] {L'̮', L""}
+};
+
+Rune *multitab[Nmulti] = {
+[MAAS-MULTI] L"ʽα",
+[MALN-MULTI] L"ʼα",
+[MAND-MULTI] L"and",
+[MAOQ-MULTI] L"a/q",
+[MBRA-MULTI] L"<|",
+[MDD-MULTI] L"..",
+[MDDD-MULTI] L"...",
+[MEAS-MULTI] L"ʽε",
+[MELN-MULTI] L"ʼε",
+[MEMM-MULTI] L"——",
+[MHAS-MULTI] L"ʽη",
+[MHLN-MULTI] L"ʼη",
+[MIAS-MULTI] L"ʽι",
+[MILN-MULTI] L"ʼι",
+[MLCT-MULTI] L"ct",
+[MLFF-MULTI] L"ff",
+[MLFFI-MULTI] L"ffi",
+[MLFFL-MULTI] L"ffl",
+[MLFL-MULTI] L"fl",
+[MLFI-MULTI] L"fi",
+[MLLS-MULTI] L"ɫɫ",
+[MLST-MULTI] L"st",
+[MOAS-MULTI] L"ʽο",
+[MOLN-MULTI] L"ʼο",
+[MOR-MULTI] L"or",
+[MRAS-MULTI] L"ʽρ",
+[MRLN-MULTI] L"ʼρ",
+[MTT-MULTI] L"~~",
+[MUAS-MULTI] L"ʽυ",
+[MULN-MULTI] L"ʼυ",
+[MWAS-MULTI] L"ʽω",
+[MWLN-MULTI] L"ʼω",
+[MOE-MULTI] L"oe",
+[MES-MULTI] L" ",
+};
+
+#define risupper(r) (L'A' <= (r) && (r) <= L'Z')
+#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 == L' ') {
+ 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(L'0'<=c && c<=L'9')
+ 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/sys/src/cmd/dict/world.c b/sys/src/cmd/dict/world.c
new file mode 100755
index 000000000..51cb7f588
--- /dev/null
+++ b/sys/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', L'æ', L'ø', L'å', L'ä', L'ö',
+/*10*/ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+ NONE, NONE, NONE, L'Æ', L'Ø', L'Å', L'Ä', L'Ö',
+
+/*20*/ L' ', L'!', L'"', L'#', L'$', L'%', L'&', L'\'',
+ L'(', L')', L'*', L'+', L',', L'-', L'.', L'/',
+/*30*/ L'0', L'1', L'2', L'3', L'4', L'5', L'6', L'7',
+ L'8', L'9', L':', L';', L'<', L'=', L'>', L'?',
+/*40*/ L'@', L'A', L'B', L'C', L'D', L'E', L'F', L'G',
+ L'H', L'I', L'J', L'K', L'L', L'M', L'N', L'O',
+/*50*/ L'P', L'Q', L'R', L'S', L'T', L'U', L'V', L'W',
+ L'X', L'Y', L'Z', L'[', L'\\', L']', L'^', L'_',
+/*60*/ L'`', L'a', L'b', L'c', L'd', L'e', L'f', L'g',
+ L'h', L'i', L'j', L'k', L'l', L'm', L'n', L'o',
+/*70*/ L'p', L'q', L'r', L's', L't', L'u', L'v', L'w',
+ L'x', L'y', L'z', L'{', L'|', L'}', L'~', NONE,
+
+/*80*/ L'Ç', L'ü', L'é', L'â', L'ä', L'à', L'å', L'ç',
+ L'ê', L'ë', L'è', L'ï', L'î', L'ì', L'Ä', L'Å',
+/*90*/ L'É', L'æ', L'Æ', L'ô', L'ö', L'ò', L'û', L'ù',
+ L'ÿ', L'Ö', L'Ü', L'¢', L'£', L'¥', L'₧', L'ʃ',
+/*a0*/ L'á', L'í', L'ó', L'ú', L'ñ', L'Ñ', L'ª', L'º',
+ L'¿', L'⌐', L'¬', L'½', L'¼', L'¡', L'«', L'»',
+
+/*b0*/ L'ɔ', L'ə', L'ð', L'ʃ', L'ʒ', L'ŋ', L'ɑ', L'z',
+ L'ɪ', L'ð', L'ʒ', L'ã', L'œ', L'ũ', L'ʌ', L'ɥ',
+/*c0*/ L'ʀ', L'ë', L'l', L'ʌ', L'õ', L'ñ', L'Œ', NONE,
+ NONE, L'S', L's', L'Z', L'z', NONE, NONE, NONE,
+/*d0*/ L'ß', NONE, NONE, L'ā', L'ī', L'ū', L'ē', L'ō',
+ NONE, NONE, NONE, L' ', NONE, NONE, NONE, NONE,
+
+/*e0*/ L'α', L'β', L'γ', L'π', L'Σ', L'σ', L'µ', L'τ',
+ L'Φ', L'Θ', L'Ω', L'δ', L'∞', L'Ø', L'ε', L'∩',
+/*f0*/ L'≡', L'±', L'≥', L'≤', L'⌠', L'⌡', L'÷', L'≈',
+ L'°', L'∙', L'·', 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");
+}