summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorAndreas Rumpf <rumpf_a@web.de>2008-12-12 14:02:27 +0100
committerAndreas Rumpf <rumpf_a@web.de>2008-12-12 14:02:27 +0100
commitddaedab835fa7ea3457f21a772d636921defdc46 (patch)
tree8f96b5a3a6700704e0a64bdcdedee1d2caf68517
parent2cd136cf7a0210e3cfde7a6f8ba32c9f09560047 (diff)
downloadNim-ddaedab835fa7ea3457f21a772d636921defdc46.tar.gz
version 0.7.2
-rw-r--r--.bzrignore5
-rw-r--r--config/nimdoc.cfg293
-rw-r--r--copying.txt18
-rw-r--r--deinstall.sh38
-rw-r--r--doc/endb.txt2
-rw-r--r--doc/grammar.txt65
-rw-r--r--doc/manual.txt160
-rw-r--r--doc/theindex.txt101
-rw-r--r--gpl.html493
-rw-r--r--ide/config.nim93
-rw-r--r--ide/main.nim21
-rw-r--r--ide/nimide.glade416
-rw-r--r--ide/nimide.nim118
-rw-r--r--install.sh126
-rw-r--r--install.txt3
-rw-r--r--koch.py20
-rw-r--r--lib/alloc.nim394
-rw-r--r--lib/arithm.nim2
-rw-r--r--lib/atomic.h2716
-rw-r--r--lib/base/cgi.html486
-rw-r--r--lib/base/cgi.nim305
-rw-r--r--lib/base/devel/FGInt.pas2199
-rw-r--r--lib/base/devel/bignums.nim1712
-rw-r--r--lib/base/devel/diff.nim460
-rw-r--r--lib/base/devel/lex.nim73
-rw-r--r--lib/base/devel/nregex.nim124
-rw-r--r--lib/base/devel/python.nim1877
-rw-r--r--lib/base/devel/python.pas2205
-rw-r--r--lib/base/gtk/atk.nim6
-rw-r--r--lib/base/gtk/gdk2.nim80
-rw-r--r--lib/base/gtk/gdk2pixbuf.nim4
-rw-r--r--lib/base/gtk/gtk2.nim383
-rw-r--r--lib/base/gtk/gtkhtml.nim4
-rw-r--r--lib/base/gtk/pango.nim54
-rw-r--r--lib/base/x11/xcms.nim18
-rw-r--r--lib/base/x11/xi.nim2
-rw-r--r--lib/cycle.h514
-rw-r--r--lib/gc.nim28
-rw-r--r--lib/macros.nim106
-rw-r--r--lib/os.nim4
-rw-r--r--lib/osproc.nim395
-rw-r--r--lib/profiler.nim61
-rw-r--r--lib/streams.nim244
-rw-r--r--lib/sysio.nim20
-rw-r--r--lib/target.h12
-rw-r--r--lib/tlsf.c1005
-rw-r--r--lib/tlsf.h39
-rw-r--r--lib/ucmaps/8859-1.txt303
-rw-r--r--lib/ucmaps/8859-10.txt303
-rw-r--r--lib/ucmaps/8859-13.txt299
-rw-r--r--lib/ucmaps/8859-14.txt301
-rw-r--r--lib/ucmaps/8859-15.txt303
-rw-r--r--lib/ucmaps/8859-2.txt303
-rw-r--r--lib/ucmaps/8859-3.txt296
-rw-r--r--lib/ucmaps/8859-4.txt303
-rw-r--r--lib/ucmaps/8859-5.txt303
-rw-r--r--lib/ucmaps/8859-6.txt260
-rw-r--r--lib/ucmaps/8859-7.txt302
-rw-r--r--lib/ucmaps/8859-8.txt270
-rw-r--r--lib/ucmaps/8859-9.txt307
-rw-r--r--lib/ucmaps/cp1250.txt274
-rw-r--r--lib/ucmaps/cp1251.txt274
-rw-r--r--lib/ucmaps/cp1252.txt274
-rw-r--r--lib/ucmaps/cp1253.txt274
-rw-r--r--lib/ucmaps/cp1254.txt274
-rw-r--r--lib/ucmaps/cp1255.txt274
-rw-r--r--lib/ucmaps/cp1256.txt274
-rw-r--r--lib/ucmaps/cp1257.txt274
-rw-r--r--lib/ucmaps/cp1258.txt274
-rw-r--r--lib/ucmaps/cp437.txt273
-rw-r--r--lib/ucmaps/cp737.txt273
-rw-r--r--lib/ucmaps/cp775.txt274
-rw-r--r--lib/ucmaps/cp850.txt273
-rw-r--r--lib/ucmaps/cp852.txt273
-rw-r--r--lib/ucmaps/cp855.txt274
-rw-r--r--lib/ucmaps/cp856.txt303
-rw-r--r--lib/ucmaps/cp857.txt274
-rw-r--r--lib/ucmaps/cp860.txt274
-rw-r--r--lib/ucmaps/cp861.txt274
-rw-r--r--lib/ucmaps/cp862.txt274
-rw-r--r--lib/ucmaps/cp863.txt274
-rw-r--r--lib/ucmaps/cp864.txt274
-rw-r--r--lib/ucmaps/cp865.txt274
-rw-r--r--lib/ucmaps/cp866.txt274
-rw-r--r--lib/ucmaps/cp869.txt274
-rw-r--r--lib/ucmaps/cp874.txt274
-rw-r--r--lib/ucmaps/cp932.txt7998
-rw-r--r--lib/unicode.nim74
-rw-r--r--lib/windows/windows.nim2
-rw-r--r--nim/ast.pas549
-rw-r--r--nim/astalgo.pas5
-rw-r--r--nim/ccgexprs.pas324
-rw-r--r--nim/ccgstmts.pas47
-rw-r--r--nim/ccgtypes.pas14
-rw-r--r--nim/ccgutils.pas20
-rw-r--r--nim/cgen.pas8
-rw-r--r--nim/condsyms.pas1
-rw-r--r--nim/crc.pas3
-rw-r--r--nim/debugids.pas129
-rw-r--r--nim/depends.pas97
-rw-r--r--nim/docgen.pas15
-rw-r--r--nim/evals.pas1308
-rw-r--r--nim/hashes.pas15
-rw-r--r--nim/hashtest.pas10
-rw-r--r--nim/interact.pas22
-rw-r--r--nim/lists.pas2
-rw-r--r--nim/llstream.pas250
-rw-r--r--nim/lookups.pas289
-rw-r--r--nim/main.pas2
-rw-r--r--nim/nsystem.pas40
-rw-r--r--nim/nversion.pas4
-rw-r--r--nim/paslex.pas8
-rw-r--r--nim/passaux.pas74
-rw-r--r--nim/passes.pas216
-rw-r--r--nim/pragmas.pas4
-rw-r--r--nim/ptmplsyn.pas270
-rw-r--r--nim/rodread.pas1134
-rw-r--r--nim/rodwrite.pas609
-rw-r--r--nim/rst.pas24
-rw-r--r--nim/scanner.pas33
-rw-r--r--nim/semdata.pas254
-rw-r--r--nim/semexprs.pas2
-rw-r--r--nim/semfold.pas26
-rw-r--r--nim/seminst.pas278
-rw-r--r--nim/semtypes.pas2
-rw-r--r--nim/sigmatch.pas3
-rw-r--r--nim/transf.pas16
-rw-r--r--nim/types.pas14
-rw-r--r--objdata.txt8
-rw-r--r--rod/nimrod.cfg11
-rw-r--r--rod/nimrod.dot532
-rw-r--r--rod/nimrod.ini90
-rw-r--r--tests/cairotest.nim14
-rw-r--r--tests/cgitest.nim15
-rw-r--r--tests/stckovfl.nim8
-rw-r--r--tests/sunset.tmpl67
-rw-r--r--tests/tambsym2.nim18
-rw-r--r--tests/tambsym3.nim8
-rw-r--r--tests/tester.nim161
-rw-r--r--tests/tints.nim41
-rw-r--r--tests/tisopr.nim20
-rw-r--r--tests/tlibs.nim19
-rw-r--r--tests/topenlen.nim12
-rw-r--r--tests/tos.nim12
-rw-r--r--tests/trectype.nim2
-rw-r--r--tests/tsets.nim8
-rw-r--r--tests/tstreams.nim7
-rw-r--r--tests/ttempl.nim27
-rw-r--r--tests/tvarnums.nim8
-rw-r--r--tests/typalias.nim15
-rw-r--r--tests/x11test.nim71
-rw-r--r--todo.txt39
-rw-r--r--tools/inno.tmpl180
-rw-r--r--tools/install.tmpl97
-rw-r--r--tools/niminstbin0 -> 354714 bytes
-rw-r--r--tools/niminst.nim346
-rw-r--r--tools/nimweb.nim203
-rw-r--r--tools/sunset.tmpl72
158 files changed, 34811 insertions, 10001 deletions
diff --git a/.bzrignore b/.bzrignore
index 72d60500a..0fbaa3444 100644
--- a/.bzrignore
+++ b/.bzrignore
@@ -10,4 +10,7 @@ doc/*.html
 *.zip
 *.tar.gz
 dist
-dist
+web
+lib/base/devel
+lib/base/devel/*
+
diff --git a/config/nimdoc.cfg b/config/nimdoc.cfg
new file mode 100644
index 000000000..a2a638a89
--- /dev/null
+++ b/config/nimdoc.cfg
@@ -0,0 +1,293 @@
+# This is the config file for the documentation generator.

+# (c) 2008 Andreas Rumpf

+# Feel free to edit the templates as you need.

+

+split.item.toc = "20"  

+# too long entries in the table of contents get truncated

+# after this number of characters

+

+doc.section = """

+<div class="section" id="$sectionID">

+<h1><a class="toc-backref" href="#$sectionTitleID">$sectionTitle</a></h1>

+<dl class="item">

+$content

+</dl></div>

+"""

+

+doc.section.toc = """

+<li>

+  <a class="reference" href="#$sectionID" id="$sectionTitleID">$sectionTitle</a>

+  <ul class="simple">

+    $content

+  </ul>

+</li>

+"""

+

+doc.item = """

+<dt id="$itemID"><pre>$header</pre></dt>

+<dd>

+$desc

+</dd>

+"""

+

+doc.item.toc = """

+  <li><a class="reference" href="#$itemID">$name</a></li>

+"""

+

+doc.toc = """

+<div class="navigation">

+<p class="topic-title first">Navigation</p>

+<ul class="simple">

+$content

+</ul>

+</div>"""

+

+doc.body_toc = """

+$tableofcontents

+<div class="content">

+$moduledesc

+$content

+</div>

+"""

+

+doc.body_no_toc = """

+$moduledesc

+$content

+"""

+

+doc.file = """<?xml version="1.0" encoding="utf-8" ?>

+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"

+  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

+<!--  This file is generated by Nimrod. -->

+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">

+<head>

+<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

+<title>$title</title>

+<style type="text/css">

+

+span.DecNumber {color: blue}

+span.BinNumber {color: blue}

+span.HexNumber {color: blue}

+span.OctNumber {color: blue}

+span.FloatNumber {color: blue}

+span.Identifier  {color: black}

+span.Keyword {font-weight: bold}

+span.StringLit {color: blue}

+span.LongStringLit {color: blue}

+span.CharLit {color: blue}

+span.EscapeSequence {color: black}

+span.Operator {color: black}

+span.Punctation {color: black}

+span.Comment, span.LongComment {font-style:italic; color: green}

+span.RegularExpression  {color: pink}

+span.TagStart {color: yellow}

+span.TagEnd {color: yellow}

+span.Key  {color: blue}

+span.Value  {color: black}

+span.RawData {color: blue}

+span.Assembler  {color: blue}

+span.Preprocessor {color: yellow}

+span.Directive  {color: yellow}

+span.Command, span.Rule, span.Hyperlink, span.Label, span.Reference, 

+span.Other  {color: black}

+

+div.navigation {

+  float: left; 

+  width: 27%;  //25em;

+  margin: 0; padding: 0; /*

+  border: 1px dashed gold; */

+  outline: 3px outset #7F7F7F; //#99ff99; //gold;

+  background-color: #7F7F7F;

+}

+

+div.navigation ul {list-style-type: none;}

+div.navigation ul li a, div.navigation ul li a:visited {

+  font-weight: bold;

+  color: #FFFFFF; // #CC0000;

+  text-decoration: none;

+}

+div.navigation ul li a:hover {

+  font-weight: bold;

+  text-decoration: none;

+  /*outline: 2px outset #7F7F7F;*/

+  color: gold;

+  /* background-color: #FFFFFF; // #1A1A1A; // #779977;*/

+}

+

+div.content {

+  margin-left: 27%; // 25em;

+  padding: 0 1em; 

+  /*border: 1px dashed #1A1A1A;*/

+  min-width: 16em;

+}

+

+dl.item dd, dl.item dd p {

+  margin-top:3px;

+}

+dl.item dd pre {

+  margin-left: 15pt;

+  border: 0px;

+}

+dl.item dt, dl.item dt pre {

+  margin:  20pt 0 0 0;

+}

+

+pre, span.tok {

+  background-color:#F9F9F9;

+  border:1px dotted #2F6FAB;

+  color:black;

+}

+

+/*

+:Author: David Goodger

+:Contact: goodger@python.org

+:Date: Date: 2006-05-21 22:44:42 +0200 (Sun, 21 May 2006)

+:Revision: Revision: 4564

+:Copyright: This stylesheet has been placed in the public domain.

+

+Default cascading style sheet for the HTML output of Docutils.

+

+See http://docutils.sf.net/docs/howto/html-stylesheets.html for how to

+customize this style sheet.

+*/

+/* used to remove borders from tables and images */

+.borderless, table.borderless td, table.borderless th { border: 0 }

+

+table.borderless td, table.borderless th {

+  /* Override padding for "table.docutils td" with "! important".

+     The right padding separates the table cells. */

+  padding: 0 0.5em 0 0 ! important }

+

+.first { margin-top: 0 ! important }

+.last, .with-subtitle { margin-bottom: 0 ! important }

+.hidden { display: none }

+a.toc-backref { text-decoration: none ; color: black }

+blockquote.epigraph { margin: 2em 5em ; }

+dl.docutils dd { margin-bottom: 0.5em }

+div.abstract { margin: 2em 5em }

+div.abstract p.topic-title { font-weight: bold ; text-align: center }

+div.admonition, div.attention, div.caution, div.danger, div.error,

+div.hint, div.important, div.note, div.tip, div.warning {

+  margin: 2em ; border: medium outset ; padding: 1em }

+div.admonition p.admonition-title, div.hint p.admonition-title,

+div.important p.admonition-title, div.note p.admonition-title,

+div.tip p.admonition-title { font-weight: bold ; font-family: sans-serif }

+

+div.attention p.admonition-title, div.caution p.admonition-title,

+div.danger p.admonition-title, div.error p.admonition-title,

+div.warning p.admonition-title { color: red ; font-weight: bold ;

+  font-family: sans-serif }

+

+/* Uncomment (and remove this text!) to get reduced vertical space in

+   compound paragraphs.

+div.compound .compound-first, div.compound .compound-middle {

+  margin-bottom: 0.5em }

+

+div.compound .compound-last, div.compound .compound-middle {

+  margin-top: 0.5em }

+*/

+

+div.dedication { margin: 2em 5em ; text-align: center ; font-style: italic }

+div.dedication p.topic-title { font-weight: bold ; font-style: normal }

+div.figure { margin-left: 2em ; margin-right: 2em }

+div.footer, div.header { clear: both; font-size: smaller }

+div.line-block { display: block ; margin-top: 1em ; margin-bottom: 1em }

+div.line-block div.line-block { margin-top: 0 ; margin-bottom: 0 ;

+  margin-left: 1.5em }

+div.sidebar { margin-left: 1em ; border: medium outset ;

+  padding: 1em ; background-color: #ffffee ; width: 40% ; float: right ;

+  clear: right }

+

+div.sidebar p.rubric { font-family: sans-serif ; font-size: medium }

+div.system-messages { margin: 5em }

+div.system-messages h1 { color: red }

+div.system-message { border: medium outset ; padding: 1em }

+div.system-message p.system-message-title { color: red ; font-weight: bold }

+div.topic { margin: 2em;}

+h1.section-subtitle, h2.section-subtitle, h3.section-subtitle,

+h4.section-subtitle, h5.section-subtitle, h6.section-subtitle {

+  margin-top: 0.4em }

+h1.title { text-align: center }

+h2.subtitle { text-align: center }

+hr.docutils { width: 75% }

+img.align-left { clear: left }

+img.align-right { clear: right }

+ol.simple, ul.simple { margin-bottom: 1em }

+ol.arabic { list-style: decimal }

+ol.loweralpha { list-style: lower-alpha }

+ol.upperalpha { list-style: upper-alpha }

+ol.lowerroman { list-style: lower-roman }

+ol.upperroman { list-style: upper-roman }

+p.attribution { text-align: right ; margin-left: 50% }

+p.caption { font-style: italic }

+p.credits { font-style: italic ; font-size: smaller }

+p.label { white-space: nowrap }

+p.rubric { font-weight:bold;font-size:larger;color:maroon;text-align:center}

+p.sidebar-title {font-family: sans-serif ;font-weight: bold ;font-size: larger }

+p.sidebar-subtitle {font-family: sans-serif ; font-weight: bold }

+p.topic-title { font-weight: bold }

+pre.address { margin-bottom: 0;margin-top:0;font-family:serif;font-size:100% }

+pre.literal-block, pre.doctest-block {margin-left: 2em ;margin-right: 2em }

+span.classifier {font-family: sans-serif;font-style: oblique }

+span.classifier-delimiter {font-family: sans-serif;font-weight: bold }

+span.interpreted {font-family: sans-serif }

+span.option {white-space: nowrap }

+span.pre {white-space: pre }

+span.problematic {color: red }

+span.section-subtitle {

+  /* font-size relative to parent (h1..h6 element) */

+  font-size: 80% }

+

+table.citation { border-left: solid 1px gray; margin-left: 1px }

+table.docinfo {margin: 2em 4em }

+table.docutils {margin-top: 0.5em;margin-bottom: 0.5em }

+table.footnote {border-left: solid 1px black;margin-left: 1px }

+

+table.docutils td, table.docutils th,

+table.docinfo td, table.docinfo th {padding-left: 0.5em;padding-right: 0.5em;

+  vertical-align: top}

+

+table.docutils th.field-name, table.docinfo th.docinfo-name {

+  font-weight: bold;text-align: left;white-space: nowrap;padding-left: 0 }

+h1 tt.docutils, h2 tt.docutils, h3 tt.docutils,

+h4 tt.docutils, h5 tt.docutils, h6 tt.docutils {font-size: 100% }

+ul.auto-toc { list-style-type: none }

+/*a.reference { color: #E00000; font-weight:bold;}

+a.reference:hover {color: #E00000;background-color: #ffff00;display: margin;

+  font-weight:bold;}*/

+

+</style>

+<script type="text/javascript">

+  //<![CDATA[

+    function toggleElem(id) {

+      var e = document.getElementById(id);

+      e.style.display = e.style.display == 'none' ? 'block' : 'none';

+    }

+

+    var gOpen = 'none'

+    function toggleAll() {

+      gOpen = gOpen == 'none' ? 'block' : 'none';

+      var i = 1

+      while (1) {

+        var e = document.getElementById("m"+i)

+        if (!e) break;

+        e.style.display = gOpen

+        i++;

+      }

+      document.getElementById('toggleButton').value =

+        gOpen == 'none' ? 'Show Details' : 'Hide Details';

+    }

+  //]]>

+</script>

+

+</head>

+<body>

+<div class="document" id="documentId">

+<h1 class="title">$title</h1>

+$content

+<small>Generated: $date $time UTC</small>

+</div>

+</body>

+</html>

+"""

+

diff --git a/copying.txt b/copying.txt
new file mode 100644
index 000000000..65b743e4a
--- /dev/null
+++ b/copying.txt
@@ -0,0 +1,18 @@
+=======================================================
+                The Nimrod Compiler
+         Copyright (C) 2004-2008  Andreas Rumpf
+=======================================================
+
+This program is free software; you can redistribute it and/or
+modify it under the terms of the GNU General Public License
+as published by the Free Software Foundation; version 2
+of the License.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
diff --git a/deinstall.sh b/deinstall.sh
new file mode 100644
index 000000000..818b276dc
--- /dev/null
+++ b/deinstall.sh
@@ -0,0 +1,38 @@
+#! /bin/sh
+# 
+# Nimrod deinstallation script
+#   (c) 2008 Andreas Rumpf
+#
+
+if [ $# -eq 1 ] ; then
+  case $1 in
+    "/usr/bin")
+      rm -rf /usr/lib/nimrod
+      rm -rf /usr/share/nimrod/doc
+      rm -f /usr/bin/nimrod
+      rm -f /etc/nimrod.cfg
+      rm -f /etc/nimdoc.cfg || exit 1
+      ;;
+    "/usr/local/bin") 
+      rm -rf /usr/local/lib/nimrod
+      rm -rf /usr/local/share/nimrod/doc
+      rm -f /usr/local/bin/nimrod
+      rm -f /etc/nimrod.cfg
+      rm -f /etc/nimdoc.cfg || exit 1
+      ;;
+    *) 
+      rm -rf $1/nimrod || exit 1
+      ;;
+  esac
+  echo "deinstallation successful"
+else
+  echo "Nimrod deinstallation script"
+  echo "Usage: [sudo] sh deinstall.sh DIR"
+  echo "Where DIR may be:"
+  echo "  /usr/bin"
+  echo "  /usr/local/bin"
+  echo "  /opt"
+  echo "  <some other dir> (treated like '/opt')"
+  exit 1
+fi
+
diff --git a/doc/endb.txt b/doc/endb.txt
index b69a6ec6d..63e382859 100644
--- a/doc/endb.txt
+++ b/doc/endb.txt
@@ -14,7 +14,7 @@ compiled with the ``--debugger:on`` command line option.
 This also defines the conditional symbol ``ENDB`` for you.

 

 Note: You must not compile your program with the ``--app:gui``

-command line option because then there is no console

+command line option because then there would be no console

 available for the debugger.

 

 If you start your program the debugger will immediately show

diff --git a/doc/grammar.txt b/doc/grammar.txt
index d8387670b..ee46cd63a 100644
--- a/doc/grammar.txt
+++ b/doc/grammar.txt
@@ -1,6 +1,6 @@
 module ::= ([COMMENT] [SAD] stmt)*
 
-optComma ::= [ ',' ] [COMMENT] [IND]
+comma ::= ',' [COMMENT] [IND]
 operator ::= OP0 | OR | XOR | AND | OP3 | OP4 | OP5 | IS | ISNOT | IN | NOTIN
            | OP6 | DIV | MOD | SHL | SHR | OP7 | NOT
 
@@ -34,11 +34,9 @@ primary ::= ( prefixOperator optInd )* ( symbol | constructor |
                                                 | castExpr | addrExpr ) (
                DOT optInd symbol
              #| CURLY_LE namedTypeDescList CURLY_RI
-             | PAR_LE optInd
-               namedExprList
-               PAR_RI
+             | PAR_LE optInd namedExprList PAR_RI
              | BRACKET_LE optInd
-               (namedTypeOrExpr optComma)*
+               [ namedTypeOrExpr (comma namedTypeOrExpr)* [comma] ]
                BRACKET_RI
              | CIRCUM
              | pragma )*
@@ -50,17 +48,20 @@ literal ::= INT_LIT | INT8_LIT | INT16_LIT | INT32_LIT | INT64_LIT
           | NIL
 
 constructor ::= literal
-          | BRACKET_LE optInd (expr [COLON expr] optComma )* BRACKET_RI # []-Constructor
-          | CURLY_LE optInd (expr [DOTDOT expr] optComma )* CURLY_RI    # {}-Constructor
-          | PAR_LE optInd (expr [COLON expr] optComma )* PAR_RI         # ()-Constructor
+          | BRACKET_LE optInd colonExprList BRACKET_RI # []-Constructor
+          | CURLY_LE optInd sliceExprList CURLY_RI     # {}-Constructor
+          | PAR_LE optInd colonExprList PAR_RI         # ()-Constructor
 
-exprList ::= ( expr optComma )*
+exprList ::= [ expr (comma expr)* [comma] ]
+
+colonExpr ::= expr [COLON expr]
+colonExprList ::= [ colonExpr (comma colonExpr)* [comma] ]
 
 namedExpr ::= expr [EQUALS expr] # actually this is symbol EQUALS expr|expr
-namedExprList ::= ( namedExpr optComma )*
+namedExprList ::= [ namedExpr (comma namedExpr)* [comma] ]
 
-exprOrSlice ::= expr [ DOTDOT expr ]
-sliceList ::= ( exprOrSlice optComma )+
+sliceExpr ::= expr [ DOTDOT expr ]
+sliceExprList ::= [ sliceExpr (comma sliceExpr)* [comma] ]
 
 anonymousProc ::= LAMBDA paramList [pragma] EQUALS stmt
 expr ::= lowestExpr
@@ -70,7 +71,7 @@ expr ::= lowestExpr
        ELSE COLON expr
 
 namedTypeDesc ::= typeDescK | expr [EQUALS (typeDescK | expr)]
-namedTypeDescList ::= ( namedTypeDesc optComma )*
+namedTypeDescList ::= [ namedTypeDesc (comma namedTypeDesc)* [comma] ]
 
 qualifiedIdent ::= symbol [ DOT symbol ]
 
@@ -85,7 +86,7 @@ typeDesc ::= typeDescK | primary
 
 optSemicolon ::= [SEMICOLON]
 
-macroStmt ::= COLON [stmt] (OF [sliceList] COLON stmt
+macroStmt ::= COLON [stmt] (OF [sliceExprList] COLON stmt
                            | ELIF expr COLON stmt
                            | EXCEPT exceptList COLON stmt )*
                            [ELSE COLON stmt]
@@ -112,7 +113,7 @@ stmt ::= simpleStmt [SAD]
   ([SAD] (complexStmt | simpleStmt) )*
    DED
 
-exprStmt ::= lowestExpr [EQUALS expr | (expr optComma)* [macroStmt]]
+exprStmt ::= lowestExpr [EQUALS expr | [expr (comma expr)* [comma]] [macroStmt]]
 returnStmt ::= RETURN [expr]
 yieldStmt ::= YIELD expr
 discardStmt ::= DISCARD expr
@@ -121,25 +122,27 @@ breakStmt ::= BREAK [symbol]
 continueStmt ::= CONTINUE
 ifStmt ::= IF expr COLON stmt (ELIF expr COLON stmt)* [ELSE COLON stmt]
 whenStmt ::= WHEN expr COLON stmt (ELIF expr COLON stmt)* [ELSE COLON stmt]
-caseStmt ::= CASE expr (OF sliceList COLON stmt)*
+caseStmt ::= CASE expr (OF sliceExprList COLON stmt)*
                        (ELIF expr COLON stmt)*
                        [ELSE COLON stmt]
 whileStmt ::= WHILE expr COLON stmt
-forStmt ::= FOR (symbol optComma)+ IN expr [DOTDOT expr] COLON stmt
-exceptList ::= (qualifiedIdent optComma)*
+forStmt ::= FOR symbol (comma symbol)* [comma] IN expr [DOTDOT expr] COLON stmt
+exceptList ::= [qualifiedIdent (comma qualifiedIdent)* [comma]]
 
 tryStmt ::= TRY COLON stmt
           (EXCEPT exceptList COLON stmt)*
           [FINALLY COLON stmt]
 asmStmt ::= ASM [pragma] (STR_LIT | RSTR_LIT | TRIPLESTR_LIT)
 blockStmt ::= BLOCK [symbol] COLON stmt
-importStmt ::= IMPORT ((symbol | STR_LIT | RSTR_LIT | TRIPLESTR_LIT) [AS symbol] optComma)+
-includeStmt ::= INCLUDE ((symbol | STR_LIT | RSTR_LIT | TRIPLESTR_LIT) optComma)+
-fromStmt ::= FROM (symbol | STR_LIT | RSTR_LIT | TRIPLESTR_LIT) IMPORT (symbol optComma)+
+filename ::= symbol | STR_LIT | RSTR_LIT | TRIPLESTR_LIT
+importStmt ::= IMPORT filename (comma filename)* [comma]
+includeStmt ::= INCLUDE filename (comma filename)* [comma]
+fromStmt ::= FROM filename IMPORT symbol (comma symbol)* [comma]
 
-pragma ::= CURLYDOT_LE (expr [COLON expr] optComma)+ (CURLYDOT_RI | CURLY_RI)
+pragma ::= CURLYDOT_LE colonExprList (CURLYDOT_RI | CURLY_RI)
 
-paramList ::= [PAR_LE ((symbol optComma)+ COLON typeDesc optComma)* PAR_RI] [COLON typeDesc]
+param ::= symbol (comma symbol)* [comma] COLON typeDesc
+paramList ::= [PAR_LE [param (comma param)* [comma]] PAR_RI] [COLON typeDesc]
 
 genericParams ::= BRACKET_LE (symbol [EQUALS typeDesc] )* BRACKET_RI
 
@@ -160,22 +163,24 @@ constDecl ::= symbol ["*"] [pragma] colonAndEquals [COMMENT | IND COMMENT]
 constSection ::= CONST indPush constDecl (SAD constDecl)* DED
 typeDef ::= typeDesc | objectDef | enumDef
 
+objectField ::= symbol ["*"] [pragma]
 objectIdentPart ::=
-   (symbol ["*" | "-"] [pragma] optComma)+ COLON typeDesc [COMMENT | IND COMMENT]
+  objectField (comma objectField)* [comma] COLON typeDesc [COMMENT|IND COMMENT]
 
 objectWhen ::= WHEN expr COLON [COMMENT] objectPart
               (ELIF expr COLON [COMMENT] objectPart)*
               [ELSE COLON [COMMENT] objectPart]
 objectCase ::= CASE expr COLON typeDesc [COMMENT]
-              (OF sliceList COLON [COMMENT] objectPart)*
+              (OF sliceExprList COLON [COMMENT] objectPart)*
               [ELSE COLON [COMMENT] objectPart]
 
 objectPart ::= objectWhen | objectCase | objectIdentPart | NIL
              | indPush objectPart (SAD objectPart)* DED
-tupleDesc ::= BRACKET_LE optInd ((symbol optComma)+ COLON typeDesc optComma)* BRACKET_RI
+tupleDesc ::= BRACKET_LE optInd [param (comma param)* [comma]] BRACKET_RI
 
 objectDef ::= OBJECT [pragma] [OF typeDesc] objectPart
-enumDef ::= ENUM [OF typeDesc] (symbol [EQUALS expr] optComma [COMMENT | IND COMMENT])+
+enumField ::= symbol [EQUALS expr]
+enumDef ::= ENUM [OF typeDesc] (enumField [comma | COMMENT | IND COMMENT])+
 
 typeDecl ::= COMMENT
            | symbol ["*"] [genericParams] [EQUALS typeDef] [COMMENT | IND COMMENT]
@@ -183,5 +188,7 @@ typeDecl ::= COMMENT
 typeSection ::= TYPE indPush typeDecl (SAD typeDecl)* DED
 
 colonOrEquals ::= COLON typeDesc [EQUALS expr] | EQUALS expr
-varPart ::= (symbol ["*" | "-"] [pragma] optComma)+ colonOrEquals [COMMENT | IND COMMENT]
-varSection ::= VAR (varPart | indPush (COMMENT|varPart) (SAD (COMMENT|varPart))* DED)
+varField ::= symbol ["*"] [pragma]
+varPart ::= symbol (comma symbol)* [comma] colonOrEquals [COMMENT | IND COMMENT]
+varSection ::= VAR (varPart
+                   | indPush (COMMENT|varPart) (SAD (COMMENT|varPart))* DED)
diff --git a/doc/manual.txt b/doc/manual.txt
index 1c8faf4ac..cd982302f 100644
--- a/doc/manual.txt
+++ b/doc/manual.txt
@@ -223,7 +223,7 @@ A character is not an Unicode character but a single byte. The reason for this
 is efficiency: For the overwhelming majority of use-cases, the resulting
 programs will still handle UTF-8 properly as UTF-8 was specially designed for
 this.
-Another reason is that Nimrod should support ``array[char, int]`` or
+Another reason is that Nimrod can thus support ``array[char, int]`` or
 ``set[char]`` efficiently as many algorithms rely on this feature.
 
 
@@ -363,9 +363,9 @@ constant declaration at compile time.
 Types
 -----
 
-All expressions have a `type`:idx: which is known at compile time. Thus Nimrod
-is statically typed. One can declare new types, which is in
-essence defining an identifier that can be used to denote this custom type.
+All expressions have a `type`:idx: which is known at compile time. Nimrod
+is statically typed. One can declare new types, which is in essence defining
+an identifier that can be used to denote this custom type.
 
 These are the major type classes:
 
@@ -386,9 +386,9 @@ Ordinal types
 - Ordinal types are countable and ordered. This property allows
   the operation of functions as ``Inc``, ``Ord``, ``Dec`` on ordinal types to
   be defined.
-- Ordinal values have a smallest possible value. Trying to count farther
+- Ordinal values have a smallest possible value. Trying to count further
   down than the smallest value gives a checked runtime or static error.
-- Ordinal values have a largest possible value. Trying to count farther
+- Ordinal values have a largest possible value. Trying to count further
   than the largest value gives a checked runtime or static error.
 
 Integers, bool, characters and enumeration types (and subrange of these
@@ -453,16 +453,16 @@ floatXX
   implementation supports ``float32`` and ``float64``. Literals of these types
   have the suffix 'fXX.
 
-`Automatic type conversion`:idx: in expressions where different kinds
-of integer types are used is performed. However, if the type conversion
-loses information, the `EInvalidValue`:idx: exception is raised. Certain cases
-of the convert error are detected at compile time.
+`Automatic type conversion`:idx: is performed in expressions where different 
+kinds of integer types are used. However, if the type conversion
+loses information, the `EOutOfRange`:idx: exception is raised (if the error
+cannot be detected at compile time).
 
 Automatic type conversion in expressions with different kinds
 of floating point types is performed: The smaller type is
 converted to the larger. Arithmetic performed on floating point types
-follows the IEEE standard. Only the ``int`` type is converted to a floating
-point type automatically, other integer types are not.
+follows the IEEE standard. Integer types are not converted to floating point
+types automatically and vice versa.
 
 
 Boolean type
@@ -475,7 +475,7 @@ This condition holds::
 
   ord(false) == 0 and ord(true) == 1
 
-The operators ``not, and, or, xor, implies, <, <=, >, >=, !=, ==`` are defined
+The operators ``not, and, or, xor, <, <=, >, >=, !=, ==`` are defined
 for the bool type. The ``and`` and ``or`` operators perform short-cut
 evaluation. Example:
 
@@ -633,6 +633,8 @@ The lower bound of an array or sequence may be received by the built-in proc
 received by ``len()``. ``low()`` for a sequence or an open array always returns
 0, as this is the first valid index.
 
+The notation ``x[i]`` can be used to access the i-th element of ``x``. 
+
 Arrays are always bounds checked (at compile-time or at runtime). These
 checks can be disabled via pragmas or invoking the compiler with the
 ``--bound_checks:off`` command line switch.
@@ -642,8 +644,8 @@ Tuples and object types
 ~~~~~~~~~~~~~~~~~~~~~~~
 A variable of a `tuple`:idx: or `object`:idx: type is a heterogenous storage
 container.
-A tuple or object defines various named *fields* of a type. A tuple defines an
-*order* of the fields additionally. Tuples are meant for heterogenous storage
+A tuple or object defines various named *fields* of a type. A tuple also 
+defines an *order* of the fields. Tuples are meant for heterogenous storage
 types with no overhead and few abstraction possibilities. The constructor ``()``
 can be used to construct tuples. The order of the fields in the constructor
 must match the order of the tuple's definition. Different tuple-types are
@@ -651,8 +653,9 @@ must match the order of the tuple's definition. Different tuple-types are
 order.
 
 The assignment operator for tuples copies each component.
-The default assignment operator for objects is not defined. The programmer may
-provide one, however.
+The default assignment operator for objects copies each component. Overloading
+of the assignment operator for objects is not possible, but this may change in
+future versions of the compiler.
 
 .. code-block:: nimrod
 
@@ -667,7 +670,7 @@ provide one, however.
   person = ("Peter", 30)
 
 The implementation aligns the fields for best access performance. The alignment
-is done in a way that is compatible the way the C compiler does it.
+is compatible with the way the C compiler does it.
 
 Objects provide many features that tuples do not. Object provide inheritance
 and information hiding. Objects have access to their type at runtime, so that
@@ -677,7 +680,7 @@ the ``is`` operator can be used to determine the object's type.
 
   type
     TPerson = object
-      name*: string   # the * means that `name` is accessible from the outside
+      name*: string   # the * means that `name` is accessible from other modules
       age: int        # no * means that the field is hidden
 
     TStudent = object of TPerson # a student is a person
@@ -692,6 +695,7 @@ Object fields that should be visible outside from the defining module, have to
 marked by ``*``. In contrast to tuples, different object types are
 never *equivalent*.
 
+
 Object variants
 ~~~~~~~~~~~~~~~
 Often an object hierarchy is overkill in certain situations where simple
@@ -726,6 +730,7 @@ An example:
   new(n)  # creates a new node
   n.kind = nkFloat
   n.floatVal = 0.0 # valid, because ``n.kind==nkFloat``, so that it fits
+  
   # the following statement raises an `EInvalidField` exception, because
   # n.kind's value does not fit:
   n.strVal = ""
@@ -739,9 +744,7 @@ Set type
 ~~~~~~~~
 The `set type`:idx: models the mathematical notion of a set. The set's
 basetype can only be an ordinal type. The reason is that sets are implemented
-as bit vectors. Sets are designed for high performance computing.
-
-Note: The sets module can be used for sets of other types.
+as high performance bit vectors.
 
 Sets can be constructed via the set constructor: ``{}`` is the empty set. The
 empty set is type combatible with any special set type. The constructor
@@ -767,22 +770,23 @@ operation             meaning
 ``e in A``            set membership (A contains element e)
 ``A -+- B``           symmetric set difference (= (A - B) + (B - A))
 ``card(A)``           the cardinality of A (number of elements in A)
-``incl(A, elem)``     same as A = A + {elem}, but may be faster
-``excl(A, elem)``     same as A = A - {elem}, but may be faster
+``incl(A, elem)``     same as A = A + {elem}
+``excl(A, elem)``     same as A = A - {elem}
 ==================    ========================================================
 
-Reference type
-~~~~~~~~~~~~~~
+
+Reference and pointer types
+~~~~~~~~~~~~~~~~~~~~~~~~~~~
 References (similiar to `pointers`:idx: in other programming languages) are a
 way to introduce many-to-one relationships. This means different references can
-point to and modify the same location in memory. References should be used
-sparingly in a program. They are only needed for constructing graphs.
+point to and modify the same location in memory.
 
 Nimrod distinguishes between `traced`:idx: and `untraced`:idx: references.
-Untraced references are also called *pointers*. The difference between them is
-that traced references are garbage collected, untraced are not. Thus untraced
-references are *unsafe*. However for certain low-level operations (accessing
-the hardware) untraced references are unavoidable.
+Untraced references are also called *pointers*. Traced references point to
+objects of a garbage collected heap, untraced references point to 
+manually allocated objects or to objects somewhere else in memory. Thus 
+untraced references are *unsafe*. However for certain low-level operations
+(accessing the hardware) untraced references are unavoidable.
 
 Traced references are declared with the **ref** keyword, untraced references
 are declared with the **ptr** keyword.
@@ -806,13 +810,15 @@ dereferencing operations for reference types:
   var
     n: PNode
   new(n)
-  n.data = 9 # no need to write n^.data
+  n.data = 9 # no need to write n^ .data
 
 To allocate a new traced object, the built-in procedure ``new`` has to be used.
 To deal with untraced memory, the procedures ``alloc``, ``dealloc`` and
 ``realloc`` can be used. The documentation of the system module contains
 further information.
 
+If a reference points to *nothing*, it has the value ``nil``. 
+
 Special care has to be taken if an untraced object contains traced objects like
 traced references, strings or sequences: In order to free everything properly,
 the built-in procedure ``GCunref`` has to be called before freeing the
@@ -822,7 +828,7 @@ untraced memory manually!
 
 Procedural type
 ~~~~~~~~~~~~~~~
-A `procedural type`:idx: is internally a pointer to procedure. ``nil`` is
+A `procedural type`:idx: is internally a pointer to a procedure. ``nil`` is
 an allowed value for variables of a procedural type. Nimrod uses procedural
 types to achieve `functional`:idx: programming techniques. Dynamic dispatch
 for OOP constructs can also be implemented with procedural types.
@@ -928,7 +934,7 @@ statements always have to be intended::
   complexStmt ::= ifStmt | whileStmt | caseStmt | tryStmt | forStmt
                    | blockStmt | asmStmt
                    | procDecl | iteratorDecl | macroDecl | templateDecl
-                   | constDecl | typeDecl | whenStmt | varStmt
+                   | constSection | typeSection | whenStmt | varSection
 
 
 
@@ -957,8 +963,10 @@ Var statement
 Syntax::
 
   colonOrEquals ::= COLON typeDesc [EQUALS expr] | EQUALS expr
-  varPart ::= (symbol ["*" | "-"] [pragma] optComma)+ colonOrEquals [COMMENT]
-  varStmt ::= VAR (varPart | indPush varPart (SAD varPart)* DED)
+  varField ::= symbol ["*"] [pragma]
+  varPart ::= symbol (comma symbol)* [comma] colonOrEquals [COMMENT | IND COMMENT]
+  varSection ::= VAR (varPart
+                     | indPush (COMMENT|varPart) (SAD (COMMENT|varPart))* DED)
 
 `Var`:idx: statements declare new local and global variables and
 initialize them. A comma seperated list of variables can be used to specify
@@ -1126,14 +1134,12 @@ Syntax::
 Example:
 
 .. code-block:: nimrod
-  raise EOS("operating system failed")
+  raise newEOS("operating system failed")
 
 Apart from built-in operations like array indexing, memory allocation, etc.
-the ``raise`` statement is the only way to raise an exception. The
-identifier has to be the name of a previously declared exception. A
-comma followed by an expression may follow; the expression must be of type
-``string`` or ``cstring``; this is an error message that can be extracted
-with the `getCurrentExceptionMsg`:idx: procedure in the module ``system``.
+the ``raise`` statement is the only way to raise an exception. 
+
+.. XXX document this better!
 
 If no exception name is given, the current exception is `re-raised`:idx:. The
 `ENoExceptionToReraise`:idx: exception is raised if there is no exception to
@@ -1146,10 +1152,11 @@ Try statement
 
 Syntax::
 
-  exceptList ::= (qualifiedIdent optComma)*
+  exceptList ::= [qualifiedIdent (comma qualifiedIdent)* [comma]]
   tryStmt ::= TRY COLON stmt
-             (EXCEPT exceptList COLON stmt)*
-             [FINALLY COLON stmt]
+            (EXCEPT exceptList COLON stmt)*
+            [FINALLY COLON stmt]
+             
 
 Example:
 
@@ -1209,10 +1216,15 @@ sugar for:
 
 .. code-block:: nimrod
   result = expr
-  return
+  return result
+
+``return`` without an expression is a short notation for ``return result`` if
+the proc has a return type. The `result`:idx: variable is always the return 
+value of the procedure. It is automatically declared by the compiler. As all
+variables, ``result`` is initialized to (binary) zero::
 
-The `result`:idx: variable is always the return value of the procedure. It is
-automatically declared by the compiler.
+.. code-block:: nimrod
+    proc returnZero(): int = nil # implicitely returns 0
 
 
 Yield statement
@@ -1274,7 +1286,7 @@ Example:
 
 The `break`:idx: statement is used to leave a block immediately. If ``symbol``
 is given, it is the name of the enclosing block that is to leave. If it is
-absent, the innermost block is leaved.
+absent, the innermost block is left.
 
 
 While statement
@@ -1343,14 +1355,16 @@ called `procedures`:idx: in Nimrod (which is the correct terminology). A
 procedure declaration defines an identifier and associates it with a block
 of code. A procedure may call itself recursively. The syntax is::
 
-  paramList ::= [PAR_LE ((symbol optComma)+ COLON typeDesc optComma)* PAR_RI]
-                [COLON typeDesc]
+  param ::= symbol (comma symbol)* [comma] COLON typeDesc
+  paramList ::= [PAR_LE [param (comma param)* [comma]] PAR_RI] [COLON typeDesc]
+  
   genericParams ::= BRACKET_LE (symbol [EQUALS typeDesc] )* BRACKET_RI
-
-  procDecl ::= PROC symbol ["*"] [genericParams] paramList [pragma]
+  
+  procDecl ::= PROC symbol ["*"] [genericParams]
+               paramList [pragma]
                [EQUALS stmt]
-
-If the ``EQUALS stms`` part is missing, it is a `forward`:idx: declaration. If
+               
+If the ``EQUALS stmt`` part is missing, it is a `forward`:idx: declaration. If
 the proc returns a value, the procedure body can access an implicit declared
 variable named `result`:idx: that represents the return value. Procs can be
 overloaded. The overloading resolution algorithm tries to find the proc that is
@@ -1388,8 +1402,8 @@ Calling a procedure can be done in many different ways:
   callme(y=1, x=0, "abd", '\t')   # (x=0, y=1, s="abd", c='\t', b=false)
   # call with named arguments (order is not relevant):
   callme(c='\t', y=1, x=0)        # (x=0, y=1, s="", c='\t', b=false)
-  # call as a command statement: no () or , needed:
-  callme 0 1 "abc" '\t'
+  # call as a command statement: no () needed:
+  callme 0, 1, "abc", '\t'
 
 
 Iterators and the for statement
@@ -1397,12 +1411,13 @@ Iterators and the for statement
 
 Syntax::
 
-  forStmt ::= FOR (symbol optComma)+ IN expr [DOTDOT expr] COLON stmt
+  forStmt ::= FOR symbol (comma symbol)* [comma] IN expr [DOTDOT expr] COLON stmt
 
-  paramList ::= [PAR_LE ((symbol optComma)+ COLON typeDesc optComma)* PAR_RI]
-                [COLON typeDesc]
+  param ::= symbol (comma symbol)* [comma] COLON typeDesc
+  paramList ::= [PAR_LE [param (comma param)* [comma]] PAR_RI] [COLON typeDesc]
+  
   genericParams ::= BRACKET_LE (symbol [EQUALS typeDesc] )* BRACKET_RI
-
+  
   iteratorDecl ::= ITERATOR symbol ["*"] [genericParams] paramList [pragma]
                [EQUALS stmt]
 
@@ -1482,7 +1497,7 @@ Example:
 
 A `type`:idx: section begins with the ``type`` keyword. It contains multiple
 type definitions. A type definition binds a type to a name. Type definitions
-can be recursive or even mutually recursive. Mutually Recursive types are only
+can be recursive or even mutually recursive. Mutually recursive types are only
 possible within a single ``type`` section.
 
 
@@ -1579,17 +1594,16 @@ macros.
 Modules
 -------
 Nimrod supports splitting a program into pieces by a `module`:idx: concept.
-Modules make separate compilation possible. Each module needs to be in its
-own file. Modules enable `information hiding`:idx: and
-`separate compilation`:idx:. A module may gain access to symbols of another
-module by the `import`:idx: statement. `Recursive module dependancies`:idx: are
-allowed, but slightly subtle. Only top-level symbols that are marked with an
-asterisk (``*``) are exported.
+Each module needs to be in its own file. Modules enable 
+`information hiding`:idx: and `separate compilation`:idx:. A module may gain
+access to symbols of another module by the `import`:idx: statement. 
+`Recursive module dependancies`:idx: are allowed, but slightly subtle. Only 
+top-level symbols that are marked with an asterisk (``*``) are exported.
 
 The algorithm for compiling modules is:
 
 - Compile the whole module as usual, following import statements recursively
-- if we have a cycle only import the already parsed symbols (that are
+- if there is a cycle only import the already parsed symbols (that are
   exported); if an unknown identifier occurs then abort
 
 This is best illustrated by an example:
@@ -1684,7 +1698,10 @@ Pragmas
 
 Syntax::
 
-  pragma ::= CURLYDOT_LE (expr [COLON expr] optComma)+ (CURLYDOT_RI | CURLY_RI)
+  colonExpr ::= expr [COLON expr]
+  colonExprList ::= [ colonExpr (comma colonExpr)* [comma] ]
+
+  pragma ::= CURLYDOT_LE colonExprList (CURLYDOT_RI | CURLY_RI)
 
 Pragmas are Nimrod's method to give the compiler additional information/
 commands without introducing a massive number of new keywords. Pragmas are
@@ -1770,7 +1787,6 @@ hints            on|off           Turns the hint messages of the compiler
 optimization     none|speed|size  Optimize the code for speed or size, or
                                   disable optimization. For non-optimizing
                                   compilers this option has no effect.
-                                  Neverless they must parse it properly.
 callconv         cdecl|...        Specifies the default calling convention for
                                   all procedures (and procedure types) that
                                   follow.
diff --git a/doc/theindex.txt b/doc/theindex.txt
index 997329242..f60e85d28 100644
--- a/doc/theindex.txt
+++ b/doc/theindex.txt
@@ -400,7 +400,7 @@ Index
      `posix.html#1093 <posix.html#1093>`_
 
    `assembler`:idx:
-     `manual.html#198 <manual.html#198>`_
+     `manual.html#197 <manual.html#197>`_
 
    `assert`:idx:
      `system.html#416 <system.html#416>`_
@@ -425,7 +425,7 @@ Index
      `system.html#373 <system.html#373>`_
 
    `block`:idx:
-     `manual.html#194 <manual.html#194>`_
+     `manual.html#193 <manual.html#193>`_
 
    `bool`:idx:
      `system.html#109 <system.html#109>`_
@@ -434,7 +434,7 @@ Index
      `manual.html#147 <manual.html#147>`_
 
    `break`:idx:
-     `manual.html#195 <manual.html#195>`_
+     `manual.html#194 <manual.html#194>`_
 
    `breakpoint`:idx:
      `endb.html#103 <endb.html#103>`_
@@ -702,7 +702,7 @@ Index
      `libzip.html#169 <libzip.html#169>`_
 
    `continue`:idx:
-     `manual.html#197 <manual.html#197>`_
+     `manual.html#196 <manual.html#196>`_
 
    `copy`:idx:
      * `system.html#403 <system.html#403>`_
@@ -857,7 +857,7 @@ Index
      `system.html#157 <system.html#157>`_
 
    `define`:idx:
-     `manual.html#224 <manual.html#224>`_
+     `manual.html#223 <manual.html#223>`_
 
    `defined`:idx:
      `system.html#114 <system.html#114>`_
@@ -933,7 +933,7 @@ Index
      `nimrodc.html#120 <nimrodc.html#120>`_
 
    `domain specific languages`:idx:
-     `manual.html#213 <manual.html#213>`_
+     `manual.html#212 <manual.html#212>`_
 
    `D_T_FMT`:idx:
      `posix.html#390 <posix.html#390>`_
@@ -1083,8 +1083,7 @@ Index
      `regexprs.html#104 <regexprs.html#104>`_
 
    `EInvalidValue`:idx:
-     * `manual.html#146 <manual.html#146>`_
-     * `system.html#143 <system.html#143>`_
+     `system.html#143 <system.html#143>`_
 
    `EIO`:idx:
      * `system.html#134 <system.html#134>`_
@@ -1161,7 +1160,7 @@ Index
      `posix.html#264 <posix.html#264>`_
 
    `ENoExceptionToReraise`:idx:
-     * `manual.html#186 <manual.html#186>`_
+     * `manual.html#185 <manual.html#185>`_
      * `system.html#149 <system.html#149>`_
 
    `ENOEXEC`:idx:
@@ -1228,7 +1227,8 @@ Index
      `system.html#144 <system.html#144>`_
 
    `EOutOfRange`:idx:
-     `system.html#147 <system.html#147>`_
+     * `manual.html#146 <manual.html#146>`_
+     * `system.html#147 <system.html#147>`_
 
    `EOVERFLOW`:idx:
      `posix.html#283 <posix.html#283>`_
@@ -1279,8 +1279,8 @@ Index
      `posix.html#219 <posix.html#219>`_
 
    `error`:idx:
-     * `manual.html#223 <manual.html#223>`_
-     * `manual.html#226 <manual.html#226>`_
+     * `manual.html#222 <manual.html#222>`_
+     * `manual.html#225 <manual.html#225>`_
      * `dialogs.html#104 <dialogs.html#104>`_
 
    `errorStr`:idx:
@@ -1324,10 +1324,10 @@ Index
      `posix.html#297 <posix.html#297>`_
 
    `except`:idx:
-     `manual.html#189 <manual.html#189>`_
+     `manual.html#188 <manual.html#188>`_
 
    `exception handlers`:idx:
-     `manual.html#188 <manual.html#188>`_
+     `manual.html#187 <manual.html#187>`_
 
    `excl`:idx:
      `system.html#165 <system.html#165>`_
@@ -1396,7 +1396,7 @@ Index
      `manual.html#169 <manual.html#169>`_
 
    `fatal`:idx:
-     `manual.html#227 <manual.html#227>`_
+     `manual.html#226 <manual.html#226>`_
 
    `fchdir`:idx:
      `posix.html#984 <posix.html#984>`_
@@ -1522,7 +1522,7 @@ Index
      `os.html#106 <os.html#106>`_
 
    `finally`:idx:
-     `manual.html#190 <manual.html#190>`_
+     `manual.html#189 <manual.html#189>`_
 
    `find`:idx:
      * `system.html#456 <system.html#456>`_
@@ -1573,7 +1573,7 @@ Index
      `posix.html#478 <posix.html#478>`_
 
    `for`:idx:
-     `manual.html#205 <manual.html#205>`_
+     `manual.html#204 <manual.html#204>`_
 
    `fork`:idx:
      `posix.html#986 <posix.html#986>`_
@@ -1582,7 +1582,7 @@ Index
      `manual.html#124 <manual.html#124>`_
 
    `forward`:idx:
-     `manual.html#202 <manual.html#202>`_
+     `manual.html#201 <manual.html#201>`_
 
    `fpathconf`:idx:
      `posix.html#987 <posix.html#987>`_
@@ -1678,7 +1678,7 @@ Index
      `posix.html#311 <posix.html#311>`_
 
    `funtions`:idx:
-     `manual.html#200 <manual.html#200>`_
+     `manual.html#199 <manual.html#199>`_
 
    `F_WRLCK`:idx:
      `posix.html#312 <posix.html#312>`_
@@ -1718,7 +1718,7 @@ Index
      `regexprs.html#102 <regexprs.html#102>`_
 
    `Generics`:idx:
-     `manual.html#209 <manual.html#209>`_
+     `manual.html#208 <manual.html#208>`_
 
    `getApplicationDir`:idx:
      `os.html#110 <os.html#110>`_
@@ -1748,8 +1748,7 @@ Index
      `os.html#112 <os.html#112>`_
 
    `getCurrentExceptionMsg`:idx:
-     * `manual.html#184 <manual.html#184>`_
-     * `system.html#428 <system.html#428>`_
+     `system.html#428 <system.html#428>`_
 
    `getCurrentLine`:idx:
      `lexbase.html#106 <lexbase.html#106>`_
@@ -2027,8 +2026,8 @@ Index
      `system.html#118 <system.html#118>`_
 
    `hint`:idx:
-     * `manual.html#221 <manual.html#221>`_
-     * `manual.html#229 <manual.html#229>`_
+     * `manual.html#220 <manual.html#220>`_
+     * `manual.html#228 <manual.html#228>`_
 
    `htonl`:idx:
      `posix.html#792 <posix.html#792>`_
@@ -2058,10 +2057,10 @@ Index
      `manual.html#181 <manual.html#181>`_
 
    `implicit block`:idx:
-     `manual.html#207 <manual.html#207>`_
+     `manual.html#206 <manual.html#206>`_
 
    `import`:idx:
-     `manual.html#217 <manual.html#217>`_
+     `manual.html#216 <manual.html#216>`_
 
    `importc`:idx:
      `nimrodc.html#101 <nimrodc.html#101>`_
@@ -2127,7 +2126,7 @@ Index
      `dialogs.html#102 <dialogs.html#102>`_
 
    `information hiding`:idx:
-     `manual.html#215 <manual.html#215>`_
+     `manual.html#214 <manual.html#214>`_
 
    `init`:idx:
      `parseopt.html#103 <parseopt.html#103>`_
@@ -2213,7 +2212,7 @@ Index
      * `system.html#443 <system.html#443>`_
 
    `iterator`:idx:
-     `manual.html#206 <manual.html#206>`_
+     `manual.html#205 <manual.html#205>`_
 
    `iterOverEnvironment`:idx:
      `os.html#152 <os.html#152>`_
@@ -2339,7 +2338,7 @@ Index
      `posix.html#1061 <posix.html#1061>`_
 
    `Macros`:idx:
-     `manual.html#212 <manual.html#212>`_
+     `manual.html#211 <manual.html#211>`_
 
    `makecontext`:idx:
      `posix.html#1189 <posix.html#1189>`_
@@ -2384,7 +2383,7 @@ Index
      `posix.html#685 <posix.html#685>`_
 
    `methods`:idx:
-     `manual.html#199 <manual.html#199>`_
+     `manual.html#198 <manual.html#198>`_
 
    `min`:idx:
      * `system.html#263 <system.html#263>`_
@@ -2501,7 +2500,7 @@ Index
      * `system.html#217 <system.html#217>`_
 
    `module`:idx:
-     `manual.html#214 <manual.html#214>`_
+     `manual.html#213 <manual.html#213>`_
 
    `MON_1`:idx:
      `posix.html#410 <posix.html#410>`_
@@ -2775,7 +2774,7 @@ Index
      `manual.html#139 <manual.html#139>`_
 
    `Operators`:idx:
-     `manual.html#204 <manual.html#204>`_
+     `manual.html#203 <manual.html#203>`_
 
    `or`:idx:
      * `system.html#233 <system.html#233>`_
@@ -3122,7 +3121,7 @@ Index
      `manual.html#162 <manual.html#162>`_
 
    `procedures`:idx:
-     `manual.html#201 <manual.html#201>`_
+     `manual.html#200 <manual.html#200>`_
 
    `PROT_EXEC`:idx:
      `posix.html#676 <posix.html#676>`_
@@ -3563,7 +3562,7 @@ Index
      `zlib.html#104 <zlib.html#104>`_
 
    `push/pop`:idx:
-     `manual.html#230 <manual.html#230>`_
+     `manual.html#229 <manual.html#229>`_
 
    `putEnv`:idx:
      `os.html#142 <os.html#142>`_
@@ -3624,7 +3623,7 @@ Index
      `system.html#120 <system.html#120>`_
 
    `re-raised`:idx:
-     `manual.html#185 <manual.html#185>`_
+     `manual.html#184 <manual.html#184>`_
 
    `read`:idx:
      `posix.html#1018 <posix.html#1018>`_
@@ -3686,7 +3685,7 @@ Index
      `system.html#413 <system.html#413>`_
 
    `Recursive module dependancies`:idx:
-     `manual.html#218 <manual.html#218>`_
+     `manual.html#217 <manual.html#217>`_
 
    `register`:idx:
      `nimrodc.html#113 <nimrodc.html#113>`_
@@ -3708,11 +3707,11 @@ Index
      `system.html#371 <system.html#371>`_
 
    `result`:idx:
-     * `manual.html#192 <manual.html#192>`_
-     * `manual.html#203 <manual.html#203>`_
+     * `manual.html#191 <manual.html#191>`_
+     * `manual.html#202 <manual.html#202>`_
 
    `return`:idx:
-     `manual.html#191 <manual.html#191>`_
+     `manual.html#190 <manual.html#190>`_
 
    `rewinddir`:idx:
      `posix.html#804 <posix.html#804>`_
@@ -3965,7 +3964,7 @@ Index
 
    `scope`:idx:
      * `manual.html#106 <manual.html#106>`_
-     * `manual.html#219 <manual.html#219>`_
+     * `manual.html#218 <manual.html#218>`_
 
    `SC_OPEN_MAX`:idx:
      `posix.html#571 <posix.html#571>`_
@@ -4229,7 +4228,7 @@ Index
      `posix.html#1054 <posix.html#1054>`_
 
    `separate compilation`:idx:
-     `manual.html#216 <manual.html#216>`_
+     `manual.html#215 <manual.html#215>`_
 
    `seq`:idx:
      `system.html#123 <system.html#123>`_
@@ -6355,7 +6354,7 @@ Index
      `posix.html#1034 <posix.html#1034>`_
 
    `system`:idx:
-     `manual.html#220 <manual.html#220>`_
+     `manual.html#219 <manual.html#219>`_
 
    `tabulator`:idx:
      `manual.html#125 <manual.html#125>`_
@@ -6427,7 +6426,7 @@ Index
      `posix.html#806 <posix.html#806>`_
 
    `template`:idx:
-     `manual.html#211 <manual.html#211>`_
+     `manual.html#210 <manual.html#210>`_
 
    `TEndian`:idx:
      `system.html#385 <system.html#385>`_
@@ -6696,7 +6695,7 @@ Index
      `posix.html#1037 <posix.html#1037>`_
 
    `try`:idx:
-     `manual.html#187 <manual.html#187>`_
+     `manual.html#186 <manual.html#186>`_
 
    `Tsched_param`:idx:
      `posix.html#199 <posix.html#199>`_
@@ -6854,10 +6853,10 @@ Index
    `type`:idx:
      * `manual.html#102 <manual.html#102>`_
      * `manual.html#141 <manual.html#141>`_
-     * `manual.html#208 <manual.html#208>`_
+     * `manual.html#207 <manual.html#207>`_
 
    `type parameters`:idx:
-     `manual.html#210 <manual.html#210>`_
+     `manual.html#209 <manual.html#209>`_
 
    `type suffix`:idx:
      `manual.html#138 <manual.html#138>`_
@@ -6908,7 +6907,7 @@ Index
      `zlib.html#156 <zlib.html#156>`_
 
    `undef`:idx:
-     `manual.html#225 <manual.html#225>`_
+     `manual.html#224 <manual.html#224>`_
 
    `UnixToNativePath`:idx:
      `os.html#124 <os.html#124>`_
@@ -6963,8 +6962,8 @@ Index
      * `zipfiles.html#110 <zipfiles.html#110>`_
 
    `warning`:idx:
-     * `manual.html#222 <manual.html#222>`_
-     * `manual.html#228 <manual.html#228>`_
+     * `manual.html#221 <manual.html#221>`_
+     * `manual.html#227 <manual.html#227>`_
      * `dialogs.html#103 <dialogs.html#103>`_
 
    `WCONTINUED`:idx:
@@ -6980,7 +6979,7 @@ Index
      `manual.html#183 <manual.html#183>`_
 
    `while`:idx:
-     `manual.html#196 <manual.html#196>`_
+     `manual.html#195 <manual.html#195>`_
 
    `Whitespace`:idx:
      `strutils.html#102 <strutils.html#102>`_
@@ -7058,7 +7057,7 @@ Index
      `posix.html#441 <posix.html#441>`_
 
    `yield`:idx:
-     `manual.html#193 <manual.html#193>`_
+     `manual.html#192 <manual.html#192>`_
 
    `Z_ASCII`:idx:
      `zlib.html#138 <zlib.html#138>`_
diff --git a/gpl.html b/gpl.html
new file mode 100644
index 000000000..0aec9fff0
--- /dev/null
+++ b/gpl.html
@@ -0,0 +1,493 @@
+<!DOCTYPE html PUBLIC "-//IETF//DTD HTML 2.0//EN">

+<html>

+<head>

+<title>GNU General Public License - GNU Project - Free Software Foundation (FSF)</title>

+</head>

+<body bgcolor="#FFFFFF" text="#000000" link="#1F00FF" alink="#FF0000" vlink="#9900DD">

+<h1>GNU General Public License</h1>

+<hr>

+<h2>Table of Contents</h2>

+<ul>

+  <li><a name="TOC1" href="gpl.html#SEC1">GNU GENERAL PUBLIC LICENSE</a>

+<ul>

+<li><a name="TOC2" href="gpl.html#SEC2">Preamble</a>

+<li><a name="TOC3" href="gpl.html#SEC3">TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION</a>

+<li><a name="TOC4" href="gpl.html#SEC4">How to Apply These Terms to Your New Programs</a>

+

+</ul>

+</ul>

+

+<p>

+

+<hr>

+

+<p>

+

+

+

+<h2><a name="SEC1" href="gpl.html#TOC1">GNU GENERAL PUBLIC LICENSE</a></h2>

+<p>

+Version 2, June 1991

+

+</p>

+

+<pre>

+Copyright (C) 1989, 1991 Free Software Foundation, Inc.  

+59 Temple Place - Suite 330, Boston, MA  02111-1307, USA

+

+Everyone is permitted to copy and distribute verbatim copies

+of this license document, but changing it is not allowed.

+</pre>

+

+

+

+<h2><a name="SEC2" href="gpl.html#TOC2">Preamble</a></h2>

+

+<p>

+  The licenses for most software are designed to take away your

+freedom to share and change it.  By contrast, the GNU General Public

+License is intended to guarantee your freedom to share and change free

+software--to make sure the software is free for all its users.  This

+General Public License applies to most of the Free Software

+Foundation's software and to any other program whose authors commit to

+using it.  (Some other Free Software Foundation software is covered by

+the GNU Library General Public License instead.)  You can apply it to

+your programs, too.

+

+</p>

+<p>

+  When we speak of free software, we are referring to freedom, not

+price.  Our General Public Licenses are designed to make sure that you

+have the freedom to distribute copies of free software (and charge for

+this service if you wish), that you receive source code or can get it

+if you want it, that you can change the software or use pieces of it

+in new free programs; and that you know you can do these things.

+

+</p>

+<p>

+  To protect your rights, we need to make restrictions that forbid

+anyone to deny you these rights or to ask you to surrender the rights.

+These restrictions translate to certain responsibilities for you if you

+distribute copies of the software, or if you modify it.

+

+</p>

+<p>

+  For example, if you distribute copies of such a program, whether

+gratis or for a fee, you must give the recipients all the rights that

+you have.  You must make sure that they, too, receive or can get the

+source code.  And you must show them these terms so they know their

+rights.

+

+</p>

+<p>

+  We protect your rights with two steps: (1) copyright the software, and

+(2) offer you this license which gives you legal permission to copy,

+distribute and/or modify the software.

+

+</p>

+<p>

+  Also, for each author's protection and ours, we want to make certain

+that everyone understands that there is no warranty for this free

+software.  If the software is modified by someone else and passed on, we

+want its recipients to know that what they have is not the original, so

+that any problems introduced by others will not reflect on the original

+authors' reputations.

+

+</p>

+<p>

+  Finally, any free program is threatened constantly by software

+patents.  We wish to avoid the danger that redistributors of a free

+program will individually obtain patent licenses, in effect making the

+program proprietary.  To prevent this, we have made it clear that any

+patent must be licensed for everyone's free use or not licensed at all.

+

+</p>

+<p>

+  The precise terms and conditions for copying, distribution and

+modification follow.

+

+</p>

+

+

+<h2><a name="SEC3" href="gpl.html#TOC3">TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION</a></h2>

+

+

+<p>

+

+<strong>0.</strong>

+ This License applies to any program or other work which contains

+a notice placed by the copyright holder saying it may be distributed

+under the terms of this General Public License.  The "Program", below,

+refers to any such program or work, and a "work based on the Program"

+means either the Program or any derivative work under copyright law:

+that is to say, a work containing the Program or a portion of it,

+either verbatim or with modifications and/or translated into another

+language.  (Hereinafter, translation is included without limitation in

+the term "modification".)  Each licensee is addressed as "you".

+<p>

+

+Activities other than copying, distribution and modification are not

+covered by this License; they are outside its scope.  The act of

+running the Program is not restricted, and the output from the Program

+is covered only if its contents constitute a work based on the

+Program (independent of having been made by running the Program).

+Whether that is true depends on what the Program does.

+

+<p>

+

+<strong>1.</strong>

+ You may copy and distribute verbatim copies of the Program's

+source code as you receive it, in any medium, provided that you

+conspicuously and appropriately publish on each copy an appropriate

+copyright notice and disclaimer of warranty; keep intact all the

+notices that refer to this License and to the absence of any warranty;

+and give any other recipients of the Program a copy of this License

+along with the Program.

+<p>

+

+You may charge a fee for the physical act of transferring a copy, and

+you may at your option offer warranty protection in exchange for a fee.

+<p>

+

+<strong>2.</strong>

+ You may modify your copy or copies of the Program or any portion

+of it, thus forming a work based on the Program, and copy and

+distribute such modifications or work under the terms of Section 1

+above, provided that you also meet all of these conditions:

+<p>

+

+<ul>

+

+<li><strong>a)</strong>

+     You must cause the modified files to carry prominent notices

+     stating that you changed the files and the date of any change.

+

+<p>

+<li><strong>b)</strong>

+     You must cause any work that you distribute or publish, that in

+     whole or in part contains or is derived from the Program or any

+     part thereof, to be licensed as a whole at no charge to all third

+     parties under the terms of this License.

+

+<p>

+<li><strong>c)</strong>

+     If the modified program normally reads commands interactively

+     when run, you must cause it, when started running for such

+     interactive use in the most ordinary way, to print or display an

+     announcement including an appropriate copyright notice and a

+     notice that there is no warranty (or else, saying that you provide

+     a warranty) and that users may redistribute the program under

+     these conditions, and telling the user how to view a copy of this

+     License.  (Exception: if the Program itself is interactive but

+     does not normally print such an announcement, your work based on

+     the Program is not required to print an announcement.)

+</ul>

+

+These requirements apply to the modified work as a whole.  If

+identifiable sections of that work are not derived from the Program,

+and can be reasonably considered independent and separate works in

+themselves, then this License, and its terms, do not apply to those

+sections when you distribute them as separate works.  But when you

+distribute the same sections as part of a whole which is a work based

+on the Program, the distribution of the whole must be on the terms of

+this License, whose permissions for other licensees extend to the

+entire whole, and thus to each and every part regardless of who wrote it.

+<p>

+

+Thus, it is not the intent of this section to claim rights or contest

+your rights to work written entirely by you; rather, the intent is to

+exercise the right to control the distribution of derivative or

+collective works based on the Program.

+<p>

+

+In addition, mere aggregation of another work not based on the Program

+with the Program (or with a work based on the Program) on a volume of

+a storage or distribution medium does not bring the other work under

+the scope of this License.

+

+<p>

+

+<strong>3.</strong>

+ You may copy and distribute the Program (or a work based on it,

+under Section 2) in object code or executable form under the terms of

+Sections 1 and 2 above provided that you also do one of the following:

+

+

+<!-- we use this doubled UL to get the sub-sections indented, -->

+<!-- while making the bullets as unobvious as possible. -->

+<ul>

+

+<li><strong>a)</strong>

+     Accompany it with the complete corresponding machine-readable

+     source code, which must be distributed under the terms of Sections

+     1 and 2 above on a medium customarily used for software interchange; or,

+

+<p>

+<li><strong>b)</strong>

+     Accompany it with a written offer, valid for at least three

+     years, to give any third party, for a charge no more than your

+     cost of physically performing source distribution, a complete

+     machine-readable copy of the corresponding source code, to be

+     distributed under the terms of Sections 1 and 2 above on a medium

+     customarily used for software interchange; or,

+

+<p>

+<li><strong>c)</strong>

+     Accompany it with the information you received as to the offer

+     to distribute corresponding source code.  (This alternative is

+     allowed only for noncommercial distribution and only if you

+     received the program in object code or executable form with such

+     an offer, in accord with Subsection b above.)

+</ul>

+

+The source code for a work means the preferred form of the work for

+making modifications to it.  For an executable work, complete source

+code means all the source code for all modules it contains, plus any

+associated interface definition files, plus the scripts used to

+control compilation and installation of the executable.  However, as a

+special exception, the source code distributed need not include

+anything that is normally distributed (in either source or binary

+form) with the major components (compiler, kernel, and so on) of the

+operating system on which the executable runs, unless that component

+itself accompanies the executable.

+<p>

+

+If distribution of executable or object code is made by offering

+access to copy from a designated place, then offering equivalent

+access to copy the source code from the same place counts as

+distribution of the source code, even though third parties are not

+compelled to copy the source along with the object code.

+<p>

+

+<strong>4.</strong>

+ You may not copy, modify, sublicense, or distribute the Program

+except as expressly provided under this License.  Any attempt

+otherwise to copy, modify, sublicense or distribute the Program is

+void, and will automatically terminate your rights under this License.

+However, parties who have received copies, or rights, from you under

+this License will not have their licenses terminated so long as such

+parties remain in full compliance.

+

+<p>

+

+<strong>5.</strong>

+ You are not required to accept this License, since you have not

+signed it.  However, nothing else grants you permission to modify or

+distribute the Program or its derivative works.  These actions are

+prohibited by law if you do not accept this License.  Therefore, by

+modifying or distributing the Program (or any work based on the

+Program), you indicate your acceptance of this License to do so, and

+all its terms and conditions for copying, distributing or modifying

+the Program or works based on it.

+

+<p>

+

+<strong>6.</strong>

+ Each time you redistribute the Program (or any work based on the

+Program), the recipient automatically receives a license from the

+original licensor to copy, distribute or modify the Program subject to

+these terms and conditions.  You may not impose any further

+restrictions on the recipients' exercise of the rights granted herein.

+You are not responsible for enforcing compliance by third parties to

+this License.

+

+<p>

+

+<strong>7.</strong>

+ If, as a consequence of a court judgment or allegation of patent

+infringement or for any other reason (not limited to patent issues),

+conditions are imposed on you (whether by court order, agreement or

+otherwise) that contradict the conditions of this License, they do not

+excuse you from the conditions of this License.  If you cannot

+distribute so as to satisfy simultaneously your obligations under this

+License and any other pertinent obligations, then as a consequence you

+may not distribute the Program at all.  For example, if a patent

+license would not permit royalty-free redistribution of the Program by

+all those who receive copies directly or indirectly through you, then

+the only way you could satisfy both it and this License would be to

+refrain entirely from distribution of the Program.

+<p>

+

+If any portion of this section is held invalid or unenforceable under

+any particular circumstance, the balance of the section is intended to

+apply and the section as a whole is intended to apply in other

+circumstances.

+<p>

+

+It is not the purpose of this section to induce you to infringe any

+patents or other property right claims or to contest validity of any

+such claims; this section has the sole purpose of protecting the

+integrity of the free software distribution system, which is

+implemented by public license practices.  Many people have made

+generous contributions to the wide range of software distributed

+through that system in reliance on consistent application of that

+system; it is up to the author/donor to decide if he or she is willing

+to distribute software through any other system and a licensee cannot

+impose that choice.

+<p>

+

+This section is intended to make thoroughly clear what is believed to

+be a consequence of the rest of this License.

+

+<p>

+

+<strong>8.</strong>

+ If the distribution and/or use of the Program is restricted in

+certain countries either by patents or by copyrighted interfaces, the

+original copyright holder who places the Program under this License

+may add an explicit geographical distribution limitation excluding

+those countries, so that distribution is permitted only in or among

+countries not thus excluded.  In such case, this License incorporates

+the limitation as if written in the body of this License.

+

+<p>

+

+<strong>9.</strong>

+ The Free Software Foundation may publish revised and/or new versions

+of the General Public License from time to time.  Such new versions will

+be similar in spirit to the present version, but may differ in detail to

+address new problems or concerns.

+<p>

+

+Each version is given a distinguishing version number.  If the Program

+specifies a version number of this License which applies to it and "any

+later version", you have the option of following the terms and conditions

+either of that version or of any later version published by the Free

+Software Foundation.  If the Program does not specify a version number of

+this License, you may choose any version ever published by the Free Software

+Foundation.

+

+<p>

+

+

+<strong>10.</strong>

+ If you wish to incorporate parts of the Program into other free

+programs whose distribution conditions are different, write to the author

+to ask for permission.  For software which is copyrighted by the Free

+Software Foundation, write to the Free Software Foundation; we sometimes

+make exceptions for this.  Our decision will be guided by the two goals

+of preserving the free status of all derivatives of our free software and

+of promoting the sharing and reuse of software generally.

+

+

+

+<p><strong>NO WARRANTY</strong></p>

+

+<p>

+

+<strong>11.</strong>

+ BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY

+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN

+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES

+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED

+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF

+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS

+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE

+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,

+REPAIR OR CORRECTION.

+

+<p>

+

+<strong>12.</strong>

+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING

+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR

+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,

+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING

+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED

+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY

+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER

+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE

+POSSIBILITY OF SUCH DAMAGES.

+

+<p>

+

+

+<h2>END OF TERMS AND CONDITIONS</h2>

+

+

+

+<h2><a name="SEC4" href="gpl.html#TOC4">How to Apply These Terms to Your New Programs</a></h2>

+

+<p>

+  If you develop a new program, and you want it to be of the greatest

+possible use to the public, the best way to achieve this is to make it

+free software which everyone can redistribute and change under these terms.

+

+</p>

+<p>

+  To do so, attach the following notices to the program.  It is safest

+to attach them to the start of each source file to most effectively

+convey the exclusion of warranty; and each file should have at least

+the "copyright" line and a pointer to where the full notice is found.

+

+</p>

+

+<pre>

+<var>one line to give the program's name and an idea of what it does.</var>

+Copyright (C) <var>yyyy</var>  <var>name of author</var>

+

+This program is free software; you can redistribute it and/or

+modify it under the terms of the GNU General Public License

+as published by the Free Software Foundation; either version 2

+of the License, or (at your option) any later version.

+

+This program is distributed in the hope that it will be useful,

+but WITHOUT ANY WARRANTY; without even the implied warranty of

+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the

+GNU General Public License for more details.

+

+You should have received a copy of the GNU General Public License

+along with this program; if not, write to the Free Software

+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.

+</pre>

+

+<p>

+Also add information on how to contact you by electronic and paper mail.

+

+</p>

+<p>

+If the program is interactive, make it output a short notice like this

+when it starts in an interactive mode:

+

+</p>

+

+<pre>

+Gnomovision version 69, Copyright (C) <var>year</var> <var>name of author</var>

+Gnomovision comes with ABSOLUTELY NO WARRANTY; for details

+type `show w'.  This is free software, and you are welcome

+to redistribute it under certain conditions; type `show c' 

+for details.

+</pre>

+

+<p>

+The hypothetical commands <samp>`show w'</samp> and <samp>`show c'</samp> should show

+the appropriate parts of the General Public License.  Of course, the

+commands you use may be called something other than <samp>`show w'</samp> and

+<samp>`show c'</samp>; they could even be mouse-clicks or menu items--whatever

+suits your program.

+

+</p>

+<p>

+You should also get your employer (if you work as a programmer) or your

+school, if any, to sign a "copyright disclaimer" for the program, if

+necessary.  Here is a sample; alter the names:

+

+</p>

+

+<pre>

+Yoyodyne, Inc., hereby disclaims all copyright

+interest in the program `Gnomovision'

+(which makes passes at compilers) written 

+by James Hacker.

+

+<var>signature of Ty Coon</var>, 1 April 1989

+Ty Coon, President of Vice

+</pre>

+

+<p>

+This General Public License does not permit incorporating your program into

+proprietary programs.  If your program is a subroutine library, you may

+consider it more useful to permit linking proprietary applications with the

+library.  If this is what you want to do, use the GNU Library General

+Public License instead of this License.

+</body></html>

diff --git a/ide/config.nim b/ide/config.nim
new file mode 100644
index 000000000..448a67bda
--- /dev/null
+++ b/ide/config.nim
@@ -0,0 +1,93 @@
+# Does the config parsing for us

+

+import 

+  parsecfg, strtabs, strutils

+  

+type

+  TTokenClass* = enum

+    gtBackground,

+    gtNone,

+    gtWhitespace,

+    gtDecNumber,

+    gtBinNumber,

+    gtHexNumber,

+    gtOctNumber,

+    gtFloatNumber,

+    gtIdentifier,

+    gtKeyword,

+    gtStringLit,

+    gtLongStringLit,

+    gtCharLit,

+    gtEscapeSequence,

+    gtOperator,

+    gtPunctation,

+    gtComment,

+    gtLongComment,

+    gtRegularExpression,

+    gtTagStart,

+    gtTagEnd,

+    gtKey,

+    gtValue,

+    gtRawData,

+    gtAssembler,

+    gtPreprocessor,

+    gtDirective,

+    gtCommand,

+    gtRule,

+    gtHyperlink,

+    gtLabel,

+    gtReference,

+    gtOther,

+    gtCursor

+

+  TColor* = colKeywords, colIdentifiers, colComments

+  TConfiguration* = object of TObject       ## the configuration object

+    colors*: array [TTokenClass] of TColor  ## the colors to use

+    filelist*: seq[string]                  ## the filelist

+  

+const

+  colWhite = 0x00ffffff # rgb

+  colBlack = 0x00000000

+  colYellow = 

+  

+proc readConfig(filename: string): TConfiguration = 

+  # fill with reasonable defaults:

+  result.filelist = []

+  result.colors[gtBackground] = colWhite

+     gtNone: 

+    gtWhitespace,

+    gtDecNumber,

+    gtBinNumber,

+    gtHexNumber,

+    gtOctNumber,

+    gtFloatNumber,

+    gtIdentifier,

+    gtKeyword,

+    gtStringLit,

+    gtLongStringLit,

+    gtCharLit,

+    gtEscapeSequence,

+    gtOperator,

+    gtPunctation,

+    gtComment,

+    gtLongComment,

+    gtRegularExpression,

+    gtTagStart,

+    gtTagEnd,

+    gtKey,

+    gtValue,

+    gtRawData,

+    gtAssembler,

+    gtPreprocessor,

+    gtDirective,

+    gtCommand,

+    gtRule,

+    gtHyperlink,

+    gtLabel,

+    gtReference,

+    gtOther

+    gtCursor

+  var

+    p: TCfgParser

+  if open(p, filename):

+  

diff --git a/ide/main.nim b/ide/main.nim
index 22ab88d67..a7e9bb642 100644
--- a/ide/main.nim
+++ b/ide/main.nim
@@ -1,13 +1,13 @@
 # The beginning of an IDE for Nimrod
 #  (c) 2008 Andreas Rumpf
 
-import glib2, gtk2, libglade2, dialogs, parseopt
+import os, glib2, gtk2, libglade2, dialogs, parseopt
 
 proc on_window_destroy(obj: PGtkObject, data: pointer) {.cdecl.} =
   gtk_main_quit()
 
 const
-  GuiTemplate = "/media/hda4/nimrod/ide/nimide.glade"
+  GuiTemplate = "/media/hda1/Eigenes/nimrod/ide/nimide.glade"
 
 type
   TTab = object of TObject
@@ -35,19 +35,19 @@ proc on_about_menu_item_activate(menuItem: PGtkMenuItem,
 
 proc load_file(e: var TMyTextEditor, filename: string) =
   var
-    err: ptr GError
+    err: pointer
     status: cstring
     text: cstring
     result: bool
     buffer: PGtkTextBuffer
-  gtk_statusbar_push(e.statusbar, e.statusbar_context_id, "Loading...")
-  while gtk_events_pending(): gtk_main_iteration()
+  discard gtk_statusbar_push(e.statusbar, e.statusbar_context_id, "Loading...")
+  while gtk_events_pending() != 0: discard gtk_main_iteration()
 
   # get the file contents
   result = g_file_get_contents(filename, addr(text), nil, addr(err))
   if not result:
-    error_message("Cannot load file")
-    g_error_free(err)
+    error(e.window, "Cannot load file")
+    #g_error_free(err)
 
   # disable the text view while loading the buffer with the text
   gtk_widget_set_sensitive(e.text_view, false)
@@ -103,7 +103,8 @@ proc check_for_save(e: var TMyTextEditor): bool =
     GtkWidget       *dialog;
     const gchar *msg  = "Do you want to save the changes you have made?";
     dialog = gtk_message_dialog_new (nil,
-                                     GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
+                                     GTK_DIALOG_MODAL or
+                                       GTK_DIALOG_DESTROY_WITH_PARENT,
                                      GTK_MESSAGE_QUESTION,
                                      GTK_BUTTONS_YES_NO,
                                      msg);
@@ -146,15 +147,13 @@ proc main() =
   var
     editor: TMyTextEditor
 
-  gtk_nimrod_init()
   initApp(editor)
   gtk_widget_show(editor.window)
   gtk_main()
 
+gtk_nimrod_init()
 main()
 
-
-
 proc on_window_delete_event(widget: PGtkWidget, event: PGdkEvent,
                        e: TMyTextEditor): bool {.cdecl.} =
   if check_for_save(editor):
diff --git a/ide/nimide.glade b/ide/nimide.glade
index 0bd5f11f1..ce24683b2 100644
--- a/ide/nimide.glade
+++ b/ide/nimide.glade
@@ -1,224 +1,192 @@
-<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*-->

-<!DOCTYPE glade-interface SYSTEM "http://glade.gnome.org/glade-2.0.dtd">

-

-<glade-interface>

-

-<widget class="GtkWindow" id="window">

-  <property name="extension_events">GDK_EXTENSION_EVENTS_ALL</property>

-  <property name="title" translatable="yes"></property>

-  <property name="type">GTK_WINDOW_TOPLEVEL</property>

-  <property name="window_position">GTK_WIN_POS_NONE</property>

-  <property name="modal">False</property>

-  <property name="resizable">True</property>

-  <property name="destroy_with_parent">False</property>

-  <property name="decorated">True</property>

-  <property name="skip_taskbar_hint">False</property>

-  <property name="skip_pager_hint">False</property>

-  <property name="type_hint">GDK_WINDOW_TYPE_HINT_NORMAL</property>

-  <property name="gravity">GDK_GRAVITY_NORTH_WEST</property>

-  <property name="focus_on_map">True</property>

-  <property name="urgency_hint">False</property>

-  <signal name="destroy" handler="on_window_destroy" object="destroy"/>

-

-  <child>

-    <widget class="GtkVBox" id="mainvbox">

-      <property name="width_request">600</property>

-      <property name="height_request">400</property>

-      <property name="visible">True</property>

-      <property name="homogeneous">False</property>

-      <property name="spacing">0</property>

-

-      <child>

-	<widget class="GtkMenuBar" id="menubar">

-	  <property name="visible">True</property>

-	  <property name="pack_direction">GTK_PACK_DIRECTION_LTR</property>

-	  <property name="child_pack_direction">GTK_PACK_DIRECTION_LTR</property>

-

-	  <child>

-	    <widget class="GtkMenuItem" id="menuitem1">

-	      <property name="visible">True</property>

-	      <property name="label" translatable="yes">_Datei</property>

-	      <property name="use_underline">True</property>

-

-	      <child>

-		<widget class="GtkMenu" id="menu1">

-		  <property name="visible">True</property>

-

-		  <child>

-		    <widget class="GtkImageMenuItem" id="new_menu_item">

-		      <property name="visible">True</property>

-		      <property name="label">gtk-new</property>

-		      <property name="use_stock">True</property>

-		    </widget>

-		  </child>

-

-		  <child>

-		    <widget class="GtkImageMenuItem" id="open_menu_item">

-		      <property name="visible">True</property>

-		      <property name="label">gtk-open</property>

-		      <property name="use_stock">True</property>

-		    </widget>

-		  </child>

-

-		  <child>

-		    <widget class="GtkImageMenuItem" id="save_menu_item">

-		      <property name="visible">True</property>

-		      <property name="label">gtk-save</property>

-		      <property name="use_stock">True</property>

-		    </widget>

-		  </child>

-

-		  <child>

-		    <widget class="GtkImageMenuItem" id="save_as_menu_item">

-		      <property name="visible">True</property>

-		      <property name="label">gtk-save-as</property>

-		      <property name="use_stock">True</property>

-		    </widget>

-		  </child>

-

-		  <child>

-		    <widget class="GtkSeparatorMenuItem" id="separatormenuitem1">

-		      <property name="visible">True</property>

-		    </widget>

-		  </child>

-

-		  <child>

-		    <widget class="GtkImageMenuItem" id="quit_menu_item">

-		      <property name="visible">True</property>

-		      <property name="label">gtk-quit</property>

-		      <property name="use_stock">True</property>

-		    </widget>

-		  </child>

-		</widget>

-	      </child>

-	    </widget>

-	  </child>

-

-	  <child>

-	    <widget class="GtkMenuItem" id="menuitem2">

-	      <property name="visible">True</property>

-	      <property name="label" translatable="yes">_Bearbeiten</property>

-	      <property name="use_underline">True</property>

-

-	      <child>

-		<widget class="GtkMenu" id="menu2">

-		  <property name="visible">True</property>

-

-		  <child>

-		    <widget class="GtkImageMenuItem" id="cut_menu_item">

-		      <property name="visible">True</property>

-		      <property name="label">gtk-cut</property>

-		      <property name="use_stock">True</property>

-		    </widget>

-		  </child>

-

-		  <child>

-		    <widget class="GtkImageMenuItem" id="copy_menu_item">

-		      <property name="visible">True</property>

-		      <property name="label">gtk-copy</property>

-		      <property name="use_stock">True</property>

-		    </widget>

-		  </child>

-

-		  <child>

-		    <widget class="GtkImageMenuItem" id="paste_menu_item">

-		      <property name="visible">True</property>

-		      <property name="label">gtk-paste</property>

-		      <property name="use_stock">True</property>

-		    </widget>

-		  </child>

-

-		  <child>

-		    <widget class="GtkImageMenuItem" id="delete_menu_item">

-		      <property name="visible">True</property>

-		      <property name="label">gtk-delete</property>

-		      <property name="use_stock">True</property>

-		    </widget>

-		  </child>

-		</widget>

-	      </child>

-	    </widget>

-	  </child>

-

-	  <child>

-	    <widget class="GtkMenuItem" id="menuitem4">

-	      <property name="visible">True</property>

-	      <property name="label" translatable="yes">_Hilfe</property>

-	      <property name="use_underline">True</property>

-

-	      <child>

-		<widget class="GtkMenu" id="menu3">

-		  <property name="visible">True</property>

-

-		  <child>

-		    <widget class="GtkImageMenuItem" id="about_menu_item">

-		      <property name="visible">True</property>

-		      <property name="label">gtk-about</property>

-		      <property name="use_stock">True</property>

-		    </widget>

-		  </child>

-		</widget>

-	      </child>

-	    </widget>

-	  </child>

-	</widget>

-	<packing>

-	  <property name="padding">0</property>

-	  <property name="expand">False</property>

-	  <property name="fill">True</property>

-	</packing>

-      </child>

-

-      <child>

-	<widget class="GtkScrolledWindow" id="scrolledwindow">

-	  <property name="border_width">1</property>

-	  <property name="visible">True</property>

-	  <property name="can_focus">True</property>

-	  <property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>

-	  <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>

-	  <property name="shadow_type">GTK_SHADOW_ETCHED_IN</property>

-	  <property name="window_placement">GTK_CORNER_TOP_LEFT</property>

-

-	  <child>

-	    <widget class="GtkTextView" id="textview">

-	      <property name="visible">True</property>

-	      <property name="can_focus">True</property>

-	      <property name="editable">True</property>

-	      <property name="overwrite">False</property>

-	      <property name="accepts_tab">True</property>

-	      <property name="justification">GTK_JUSTIFY_LEFT</property>

-	      <property name="wrap_mode">GTK_WRAP_NONE</property>

-	      <property name="cursor_visible">True</property>

-	      <property name="pixels_above_lines">0</property>

-	      <property name="pixels_below_lines">0</property>

-	      <property name="pixels_inside_wrap">0</property>

-	      <property name="left_margin">2</property>

-	      <property name="right_margin">2</property>

-	      <property name="indent">0</property>

-	      <property name="text" translatable="yes"></property>

-	    </widget>

-	  </child>

-	</widget>

-	<packing>

-	  <property name="padding">0</property>

-	  <property name="expand">True</property>

-	  <property name="fill">True</property>

-	</packing>

-      </child>

-

-      <child>

-	<widget class="GtkStatusbar" id="statusbar">

-	  <property name="visible">True</property>

-	  <property name="has_resize_grip">True</property>

-	</widget>

-	<packing>

-	  <property name="padding">0</property>

-	  <property name="expand">False</property>

-	  <property name="fill">True</property>

-	</packing>

-      </child>

-    </widget>

-  </child>

-</widget>

-

-</glade-interface>

+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE glade-interface SYSTEM "glade-2.0.dtd">
+<!--*- mode: xml -*-->
+<glade-interface>
+  <widget class="GtkWindow" id="window">
+    <property name="extension_events">GDK_EXTENSION_EVENTS_ALL</property>
+    <signal name="destroy" handler="on_window_destroy" object="destroy"/>
+    <child>
+      <widget class="GtkVBox" id="mainvbox">
+        <property name="width_request">600</property>
+        <property name="height_request">400</property>
+        <property name="visible">True</property>
+        <child>
+          <widget class="GtkMenuBar" id="menubar">
+            <property name="visible">True</property>
+            <child>
+              <widget class="GtkMenuItem" id="menuitem1">
+                <property name="visible">True</property>
+                <property name="label" translatable="yes">_Datei</property>
+                <property name="use_underline">True</property>
+                <child>
+                  <widget class="GtkMenu" id="menu1">
+                    <property name="visible">True</property>
+                    <child>
+                      <widget class="GtkImageMenuItem" id="new_menu_item">
+                        <property name="visible">True</property>
+                        <property name="label">gtk-new</property>
+                        <property name="use_underline">True</property>
+                        <property name="use_stock">True</property>
+                      </widget>
+                    </child>
+                    <child>
+                      <widget class="GtkImageMenuItem" id="open_menu_item">
+                        <property name="visible">True</property>
+                        <property name="label">gtk-open</property>
+                        <property name="use_underline">True</property>
+                        <property name="use_stock">True</property>
+                      </widget>
+                    </child>
+                    <child>
+                      <widget class="GtkImageMenuItem" id="save_menu_item">
+                        <property name="visible">True</property>
+                        <property name="label">gtk-save</property>
+                        <property name="use_underline">True</property>
+                        <property name="use_stock">True</property>
+                      </widget>
+                    </child>
+                    <child>
+                      <widget class="GtkImageMenuItem" id="save_as_menu_item">
+                        <property name="visible">True</property>
+                        <property name="label">gtk-save-as</property>
+                        <property name="use_underline">True</property>
+                        <property name="use_stock">True</property>
+                      </widget>
+                    </child>
+                    <child>
+                      <widget class="GtkSeparatorMenuItem" id="separatormenuitem1">
+                        <property name="visible">True</property>
+                      </widget>
+                    </child>
+                    <child>
+                      <widget class="GtkImageMenuItem" id="quit_menu_item">
+                        <property name="visible">True</property>
+                        <property name="label">gtk-quit</property>
+                        <property name="use_underline">True</property>
+                        <property name="use_stock">True</property>
+                      </widget>
+                    </child>
+                  </widget>
+                </child>
+              </widget>
+            </child>
+            <child>
+              <widget class="GtkMenuItem" id="menuitem2">
+                <property name="visible">True</property>
+                <property name="label" translatable="yes">_Bearbeiten</property>
+                <property name="use_underline">True</property>
+                <child>
+                  <widget class="GtkMenu" id="menu2">
+                    <property name="visible">True</property>
+                    <child>
+                      <widget class="GtkImageMenuItem" id="cut_menu_item">
+                        <property name="visible">True</property>
+                        <property name="label">gtk-cut</property>
+                        <property name="use_underline">True</property>
+                        <property name="use_stock">True</property>
+                      </widget>
+                    </child>
+                    <child>
+                      <widget class="GtkImageMenuItem" id="copy_menu_item">
+                        <property name="visible">True</property>
+                        <property name="label">gtk-copy</property>
+                        <property name="use_underline">True</property>
+                        <property name="use_stock">True</property>
+                      </widget>
+                    </child>
+                    <child>
+                      <widget class="GtkImageMenuItem" id="paste_menu_item">
+                        <property name="visible">True</property>
+                        <property name="label">gtk-paste</property>
+                        <property name="use_underline">True</property>
+                        <property name="use_stock">True</property>
+                      </widget>
+                    </child>
+                    <child>
+                      <widget class="GtkImageMenuItem" id="delete_menu_item">
+                        <property name="visible">True</property>
+                        <property name="label">gtk-delete</property>
+                        <property name="use_underline">True</property>
+                        <property name="use_stock">True</property>
+                      </widget>
+                    </child>
+                  </widget>
+                </child>
+              </widget>
+            </child>
+            <child>
+              <widget class="GtkMenuItem" id="menuitem4">
+                <property name="visible">True</property>
+                <property name="label" translatable="yes">_Hilfe</property>
+                <property name="use_underline">True</property>
+                <child>
+                  <widget class="GtkMenu" id="menu3">
+                    <property name="visible">True</property>
+                    <child>
+                      <widget class="GtkImageMenuItem" id="about_menu_item">
+                        <property name="visible">True</property>
+                        <property name="label">gtk-about</property>
+                        <property name="use_underline">True</property>
+                        <property name="use_stock">True</property>
+                      </widget>
+                    </child>
+                  </widget>
+                </child>
+              </widget>
+            </child>
+          </widget>
+          <packing>
+            <property name="expand">False</property>
+          </packing>
+        </child>
+        <child>
+          <widget class="GtkNotebook" id="notebook">
+            <property name="visible">True</property>
+            <property name="can_focus">True</property>
+            <property name="tab_hborder">10</property>
+            <property name="tab_vborder">0</property>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+              <packing>
+                <property name="type">tab</property>
+              </packing>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+              <packing>
+                <property name="type">tab</property>
+              </packing>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+              <packing>
+                <property name="type">tab</property>
+              </packing>
+            </child>
+          </widget>
+          <packing>
+            <property name="position">1</property>
+          </packing>
+        </child>
+        <child>
+          <widget class="GtkStatusbar" id="statusbar">
+            <property name="visible">True</property>
+          </widget>
+          <packing>
+            <property name="expand">False</property>
+            <property name="position">2</property>
+          </packing>
+        </child>
+      </widget>
+    </child>
+  </widget>
+</glade-interface>
diff --git a/ide/nimide.nim b/ide/nimide.nim
new file mode 100644
index 000000000..c5abc3bbf
--- /dev/null
+++ b/ide/nimide.nim
@@ -0,0 +1,118 @@
+# The beginning of an IDE for Nimrod
+#  (c) 2008 Andreas Rumpf
+
+import os, glib2, gdk2, gtk2, libglade2, pango, dialogs, parseopt
+
+const
+  GuiTemplate = "nimide.glade"
+  dummyConst = ""
+
+type
+  TTab {.pure, final.} = object
+    textview: PGtkTextView
+    filename: string
+    untitled: bool
+    hbox: PGtkHBox
+    e: PEditor
+  PTab = ptr TTab
+    
+  TEditor = object of TObject
+    window: PGtkWindow
+    statusbar: PGtkStatusBar
+    menu: PGtkMenuBar
+    notebook: PGtkNotebook
+    tabname: int               # used for generating tab names
+  PEditor = ptr TEditor
+
+proc on_window_destroy(obj: PGtkObject, event: PGdkEvent, 
+                       data: pointer): gboolean {.cdecl.} =
+  gtk_main_quit()
+
+proc on_about_menu_item_activate(menuItem: PGtkMenuItem, e: PEditor) {.cdecl.} =
+  gtk_show_about_dialog(e.window,
+    "comments", "A fast and leight-weight IDE for Nimrod",
+    "copyright", "Copyright \xc2\xa9 2008 Andreas Rumpf",
+    "version", "0.1",
+    "website", "http://nimrod.ethexor.com",
+    "program-name", "Nimrod IDE",
+    nil)
+
+proc getTabIndex(e: PEditor, tab: PTab): int = 
+  var i = 0
+  while true:
+    var w = gtk_notebook_get_nth_page(e.notebook, i)
+    if w == nil: return -1
+    var v = gtk_notebook_get_tab_label(e.notebook, w)
+    if tab.hbox == v: return i
+    inc(i)
+  
+proc OnCloseTab(button: PGtkButton, tab: PTab) {.cdecl.} = 
+  var idx = getTabIndex(tab.e, tab)
+  if idx >= 0: gtk_notebook_remove_page(tab.e.notebook, idx)
+
+proc createTab(e: PEditor, filename: string, untitled: bool) = 
+  var t = cast[PTab](alloc0(sizeof(TTab)))
+  t.textview = gtk_text_view_new_with_buffer(gtk_text_buffer_new(nil))
+  var font_desc = pango_font_description_from_string("monospace 10")
+  gtk_widget_modify_font(t.textview, font_desc)
+  pango_font_description_free(font_desc)
+  t.filename = filename
+  t.untitled = untitled
+  gtk_widget_show(t.textview)
+  var scroll = gtk_scrolled_window_new(nil, nil)
+  gtk_container_add(scroll, t.textview)
+  gtk_widget_show(scroll)
+  
+  t.e = e
+  t.hbox = gtk_hbox_new(false, 0)
+  var image = gtk_image_new_from_stock(GTK_STOCK_CLOSE, GTK_ICON_SIZE_MENU)
+  var button = gtk_button_new()
+  var lab = gtk_label_new(filename)
+  gtk_button_set_image(button, image)
+  gtk_button_set_relief(button, GTK_RELIEF_NONE)
+  gtk_box_pack_start(t.hbox, lab, false, false, 2)
+  gtk_box_pack_end(t.hbox, button, false, false, 0)
+  
+  discard g_signal_connect(button, "clicked", G_Callback(onCloseTab), t)
+  gtk_widget_show(button)
+  gtk_widget_show(lab)
+ 
+  var idx = gtk_notebook_append_page(e.notebook, scroll, t.hbox)
+  gtk_notebook_set_current_page(e.notebook, idx)
+
+proc on_new_menu_item_activate(menuItem: PGtkMenuItem, e: PEditor) {.cdecl.} =
+  inc(e.tabname)
+  createTab(e, "untitled-" & $e.tabname, true)
+
+proc main(e: PEditor) = 
+  var builder = glade_xml_new(getApplicationDir() / GuiTemplate, nil, nil)
+  if builder == nil: quit("cannot open: " & GuiTemplate)
+  # get the components:
+  e.window = GTK_WINDOW(glade_xml_get_widget(builder, "window"))
+  e.statusbar = GTK_STATUSBAR(glade_xml_get_widget(builder, "statusbar"))
+  e.notebook = GTK_NOTEBOOK(glade_xml_get_widget(builder, "notebook"))
+  setHomogeneous(e.notebook^, 1)
+
+  # connect the signal handlers:
+  glade_xml_signal_connect(builder, "on_window_destroy",
+                           GCallback(on_window_destroy))
+  var about = GTK_MENU_ITEM(glade_xml_get_widget(builder, "about_menu_item"))
+  discard g_signal_connect(about, "activate", 
+                           G_CALLBACK(on_about_menu_item_activate), e)
+
+  var newItem = GTK_MENU_ITEM(glade_xml_get_widget(builder, "new_menu_item"))
+  discard g_signal_connect(newItem, "activate", 
+                           G_CALLBACK(on_new_menu_item_activate), e)
+
+  var quitItem = GTK_MENU_ITEM(glade_xml_get_widget(builder, "quit_menu_item"))
+  discard g_signal_connect(quitItem, "activate", 
+                           G_CALLBACK(on_window_destroy), e)
+
+  gtk_window_set_default_icon_name(GTK_STOCK_EDIT)
+  gtk_widget_show(e.window)
+  gtk_main()
+
+
+gtk_nimrod_init()
+var e = cast[PEditor](alloc0(sizeof(TEditor)))
+main(e)
diff --git a/install.sh b/install.sh
new file mode 100644
index 000000000..eb592da84
--- /dev/null
+++ b/install.sh
@@ -0,0 +1,126 @@
+#! /bin/sh
+# 
+# Nimrod installation script
+#   (c) 2008 Andreas Rumpf
+#
+
+if [ $# -eq 1 ] ; then
+
+  if test -f bin/nimrod
+  then 
+    echo "Nimrod already built -- skipping this phase"
+  else
+    echo "building Nimrod..."
+    sh ./build.sh || exit 1
+    echo "...done"
+  fi
+  
+  case $1 in
+    "/usr/bin")
+      configdir=/etc
+      libdir=/usr/lib/nimrod
+      mkdir -p /usr/lib/nimrod
+      mkdir -p /usr/share/nimrod/doc
+
+      cp bin/nimrod /usr/bin/nimrod
+      cp config/nimdoc.cfg /etc/nimdoc.cfg
+      cp -r -p lib /usr/lib/nimrod
+      cp -r -p doc /usr/share/nimrod/doc
+      ;;
+    "/usr/local/bin")
+      configdir=/etc
+      libdir=/usr/local/lib/nimrod
+      mkdir -p /usr/local/lib/nimrod
+      mkdir -p /usr/local/share/nimrod/doc
+
+      cp bin/nimrod /usr/local/bin/nimrod
+      cp config/nimdoc.cfg /etc/nimdoc.cfg
+      cp -r -p lib /usr/local/lib/nimrod
+      cp -r -p doc /usr/local/share/nimrod/doc
+      ;;
+    *)
+      configdir="$1/nimrod/config"
+      libdir="$1/nimrod/lib"
+      mkdir -p $1/nimrod
+      mkdir -p $1/nimrod/bin
+      mkdir -p $1/nimrod/config
+      mkdir -p $1/nimrod/lib
+      mkdir -p $1/nimrod/doc
+
+      cp bin/nimrod $1/nimrod/bin/nimrod
+      cp config/nimdoc.cfg $1/nimrod/config/nimdoc.cfg
+      cp -r -p lib $1/nimrod
+      cp -r -p doc $1/nimrod
+      ;;
+  esac
+  # write the configuration file
+  cat >$configdir/nimrod.cfg <<EOF
+# Configuration file for the Nimrod Compiler.
+# Feel free to edit the default values as you need.
+
+cc = gcc
+lib=$libdir
+path="\$lib/base"
+path="\$lib/base/gtk"
+path="\$lib/base/cairo"
+path="\$lib/base/x11"
+path="\$lib/base/sdl"
+path="\$lib/base/opengl"
+path="\$lib/base/zip"
+path="\$lib/windows"
+path="\$lib/posix"
+path="\$lib/ecmas"
+path="\$lib/extra"
+
+@if release:
+  obj_checks:off
+  field_checks:off
+  range_checks:off
+  bound_checks:off
+  overflow_checks:off
+  assertions:off
+
+  stacktrace:off
+  debugger:off
+  line_dir:off
+  opt:speed
+@end
+
+# additional options always passed to the compiler:
+--verbosity: "1"
+hint[LineTooLong]=off
+
+@if unix and not bsd:
+  passl= "-ldl"
+@end
+
+@if icc:
+  passl = "-cxxlib"
+  passc = "-cxxlib"
+@end
+
+# Configuration for the GNU C/C++ compiler:
+#gcc.exe = "gcc-4.3"
+#gcc.linkerExe = "gcc-4.3"
+gcc.options.debug = "-g"
+@if macosx:
+  gcc.options.always = "-w -fasm-blocks"
+@else:
+  gcc.options.always = "-w"
+@end
+gcc.options.speed = "-O3 -fno-strict-aliasing"
+gcc.options.size = "-Os"
+EOF
+  echo "installation successful"
+else
+  echo "Nimrod installation script"
+  echo "Usage: [sudo] sh install.h DIR"
+  echo "Where DIR may be:"
+  echo "  /usr/bin"
+  echo "  /usr/local/bin"
+  echo "  /opt"
+  echo "  <some other dir> (treated like '/opt')"
+  echo "To deinstall, use the command:"
+  echo "sh deinstall.sh DIR"
+  exit 1
+fi
diff --git a/install.txt b/install.txt
index 60d52e228..c6059882a 100644
--- a/install.txt
+++ b/install.txt
@@ -61,5 +61,6 @@ Currently, the following C compilers are supported under Windows:
 - | Digital Mars C++
   | http://www.digitalmars.com/download/freecompiler.html
 
-For faster compile times I recommend Digital Mars C++ -- it is easy to install
+For better compile times I recommend Digital Mars C++ -- it is easy to install
 and a small package.
+
diff --git a/koch.py b/koch.py
index d8d42a02b..1f5ae0d2c 100644
--- a/koch.py
+++ b/koch.py
@@ -18,7 +18,7 @@ False = 0 == 1
 
 # --------------------- constants  ----------------------------------------
 
-NIMROD_VERSION = '0.7.0'
+NIMROD_VERSION = '0.7.2'
 # This string contains Nimrod's version. It is the only place
 # where the version needs to be updated. The rest is done by
 # the build process automatically. It is replaced **everywhere**
@@ -405,8 +405,10 @@ Possible Commands:
   clean                    cleans Nimrod project; removes generated files
   boot [options]           bootstraps with given command line options
   rodsrc                   generates Nimrod version from Pascal version
-  web                      generates the website (requires Cheetah)
+  web                      generates the website
   profile                  profile the Nimrod compiler
+  zip                      build the installation ZIP package
+  inno                     build the Inno Setup installer
 """ % (NIMROD_VERSION + ' ' * (44-len(NIMROD_VERSION)), sys.version)
 
 def main(args):
@@ -440,8 +442,20 @@ def main(args):
     elif cmd == "rodsrc": cmd_rodsrc()
     elif cmd == "web": cmd_web()
     elif cmd == "profile": cmd_profile()
+    elif cmd == "zip": cmd_zip()
+    elif cmd == "inno": cmd_inno()
     else: Error("illegal command: " + cmd)
 
+def cmd_zip():
+  Exec("nimrod cc -r tools/niminst --var:version=%s csource rod/nimrod" %
+       NIMROD_VERSION)
+  Exec("nimrod cc -r tools/niminst --var:version=%s zip rod/nimrod" %
+       NIMROD_VERSION)
+  
+def cmd_inno():
+  Exec("nimrod cc -r tools/niminst --var:version=%s inno rod/nimrod" %
+       NIMROD_VERSION)
+
 # -------------------------- bootstrap ----------------------------------------
 
 def readCFiles():
@@ -678,6 +692,8 @@ def getOSandProcessor():
   else: processor = os.uname()[4]
   if lower(processor) in ("i686", "i586", "i468", "i386"):
     processor = "i386"
+  if lower(processor) in ("x86_64", "x86-64", "amd64"):
+    processor = "amd64" 
   if find(lower(processor), "sparc") >= 0:
     processor = "sparc"
   return (host, processor)
diff --git a/lib/alloc.nim b/lib/alloc.nim
new file mode 100644
index 000000000..504453699
--- /dev/null
+++ b/lib/alloc.nim
@@ -0,0 +1,394 @@
+#
+#
+#            Nimrod's Runtime Library
+#        (c) Copyright 2008 Andreas Rumpf
+#
+#    See the file "copying.txt", included in this
+#    distribution, for details about the copyright.
+#
+
+# Low level allocator for Nimrod.
+
+# ------------ platform specific chunk allocation code -----------------------
+
+when defined(posix): 
+  const # XXX: make these variables for portability?
+    PROT_READ  = 1             # page can be read 
+    PROT_WRITE = 2             # page can be written 
+    PROT_EXEC  = 4             # page can be executed 
+    PROT_NONE  = 0             # page can not be accessed 
+
+    MAP_SHARED    = 1          # Share changes 
+    MAP_PRIVATE   = 2          # Changes are private 
+    MAP_TYPE      = 0xf        # Mask for type of mapping 
+    MAP_FIXED     = 0x10       # Interpret addr exactly 
+    MAP_ANONYMOUS = 0x20       # don't use a file 
+
+    MAP_GROWSDOWN  = 0x100     # stack-like segment 
+    MAP_DENYWRITE  = 0x800     # ETXTBSY 
+    MAP_EXECUTABLE = 0x1000    # mark it as an executable 
+    MAP_LOCKED     = 0x2000    # pages are locked 
+    MAP_NORESERVE  = 0x4000    # don't check for reservations 
+
+  proc mmap(adr: pointer, len: int, prot, flags, fildes: cint,
+            off: int): pointer {.header: "<sys/mman.h>".}
+
+  proc munmap(adr: pointer, len: int) {.header: "<sys/mman.h>".}
+  
+  proc osAllocPages(size: int): pointer {.inline.} = 
+    result = mmap(nil, size, PROT_READ or PROT_WRITE, 
+                           MAP_PRIVATE or MAP_ANONYMOUS, -1, 0)
+    if result == nil or result == cast[pointer](-1):
+      raiseOutOfMem()
+      
+  proc osDeallocPages(p: pointer, size: int) {.inline} =
+    munmap(p, len)
+  
+elif defined(windows): 
+  const
+    MEM_RESERVE = 0x2000 
+    MEM_COMMIT = 0x1000
+    MEM_TOP_DOWN = 0x100000
+    PAGE_READWRITE = 0x04
+
+  proc VirtualAlloc(lpAddress: pointer, dwSize: int, flAllocationType,
+                    flProtect: int32): pointer {.
+                    header: "<windows.h>", stdcall.}
+  
+  proc osAllocPages(size: int): pointer {.inline.} = 
+    result = VirtualAlloc(nil, size, MEM_RESERVE or MEM_COMMIT,
+                          PAGE_READWRITE)
+    if result == nil: raiseOutOfMem()
+
+  proc osDeallocPages(p: pointer, size: int) {.inline.} =
+    nil
+
+else: 
+  {.error: "Port GC to your platform".}
+
+# --------------------- end of non-portable code -----------------------------
+
+# We manage *chunks* of memory. Each chunk is a multiple of the page size.
+# The page size may or may not the operating system's page size. Each chunk
+# starts at an address that is divisible by the page size. Chunks that are
+# bigger than ``ChunkOsReturn`` are returned back to the operating system
+# immediately.
+
+
+# Guess the page size of the system; if it is the
+# wrong value, performance may be worse (this is not
+# for sure though), but GC still works; must be a power of two!
+const
+  PageShift = if sizeof(pointer) == 4: 12 else: 13
+  PageSize = 1 shl PageShift # on 32 bit systems 4096
+
+  MemAlignment = sizeof(pointer)*2 # minimal memory block that can be allocated
+  BitsPerUnit = sizeof(int)*8
+    # a "unit" is a word, i.e. 4 bytes
+    # on a 32 bit system; I do not use the term "word" because under 32-bit
+    # Windows it is sometimes only 16 bits
+
+  BitsPerPage = PageSize div MemAlignment
+  UnitsPerPage = BitsPerPage div BitsPerUnit
+    # how many units do we need to describe a page:
+    # on 32 bit systems this is only 16 (!)
+
+  smallRequest = PageSize div 4
+  ChunkOsReturn = 1024 # in pages
+  InitialMemoryRequest = ChunkOsReturn div 2 # < ChunkOsReturn!
+  debugMemMan = true # we wish to debug the memory manager...
+
+type
+  PChunkDesc = ptr TChunkDesc
+  TChunkDesc {.final, pure.} = object
+    key: TAddress    # address at bit 0
+    next: PChunkDesc
+    bits: array[0..127, int] # a bit vector
+
+  PChunkDescArray = ptr array[0..1000_000, PChunkDesc]
+  TChunkSet {.final, pure.} = object
+    counter, max: int
+    head: PChunkDesc
+    data: PChunkDescArray
+  
+when sizeof(int) == 4:
+  type THalfWord = int16
+else:
+  type THalfWord = int32
+  
+type
+  TFreeCell {.final, pure.} = object
+    zeroField: pointer   # type info nil means cell is not used
+    next: ptr TFreeCell  # next free cell in chunk
+
+  PChunk = ptr TChunk
+  TChunk {.final, pure.} = object
+    size: int            # lowest two bits are used for merging:
+                         # bit 0: chunk to the left is accessible and free
+                         # bit 1: chunk to the right is accessible and free
+    len: int             # for small object allocation
+    prev, next: PChunk   # chunks of the same (or bigger) size
+                         #len, used: THalfWord # index of next to allocate cell
+    freeList: ptr TFreeCell
+    data: float          # a float for alignment purposes
+
+proc roundup(x, v: int): int {.inline.} = return ((-x) and (v-1)) +% x
+
+assert(roundup(14, PageSize) == PageSize)
+assert(roundup(15, 8) == 16)
+
+# ------------- chunk table ---------------------------------------------------
+# We use a PtrSet of chunk starts and a table[Page, chunksize] for chunk
+# endings of big chunks. This is needed by the merging operation. The only
+# remaining operation is best-fit for big chunks. Since there is a size-limit
+# for big chunks (because greater than the limit means they are returned back
+# to the OS), a fixed size array can be used. 
+
+type
+  PLLChunk = ptr TLLChunk
+  TLLChunk {.pure.} = object ## *low-level* chunk
+    size: int
+    when sizeof(int) == 4:
+      align: int
+    
+  TAllocator {.final, pure.} = object
+    llmem: PLLChunk
+    UsedPagesCount, FreePagesCount, maxPagesCount: int
+    freeSmallChunks: array[0..smallRequest div MemAlign-1, PChunk]
+    freeBigChunks: array[0..ChunkOsReturn-1, PChunk]
+    
+
+proc llAlloc(a: var TAllocator, size: int): pointer =
+  # *low-level* alloc for the memory managers data structures. Deallocation
+  # is never done.
+  assert(size <= PageSize-8)
+  if a.llmem.size + size > PageSize:
+    a.llmem = osGetPages(PageSize)
+    inc(a.gUsedPages)
+    a.llmem.size = 8
+  result = cast[pointer](cast[TAddress](a.llmem) + a.llmem.size)
+  inc(llmem.size, size)
+  zeroMem(result, size)
+
+
+const
+  InitChunkSetSize = 1024 # must be a power of two!
+
+proc ChunkSetInit(s: var TChunkSet) =
+  s.data = cast[PChunkDescArray](llAlloc(InitChunkSetSize * sizeof(PChunkDesc)))
+  s.max = InitChunkSetSize-1
+  s.counter = 0
+  s.head = nil
+
+proc ChunkSetGet(t: TChunkSet, key: TAddress): PChunkDesc =
+  var h = cast[int](key) and t.max
+  while t.data[h] != nil:
+    if t.data[h].key == key: return t.data[h]
+    h = nextTry(h, t.max)
+  return nil
+
+proc ChunkSetRawInsert(t: TChunkSet, data: PChunkDescArray,
+                       desc: PChunkDesc) =
+  var h = cast[int](desc.key) and t.max
+  while data[h] != nil:
+    assert(data[h] != desc)
+    h = nextTry(h, t.max)
+  assert(data[h] == nil)
+  data[h] = desc
+
+proc ChunkSetEnlarge(t: var TChunkSet) =
+  var oldMax = t.max
+  t.max = ((t.max+1)*2)-1
+  var n = cast[PChunkDescArray](llAlloc((t.max + 1) * sizeof(PChunkDescArray)))
+  for i in 0 .. oldmax:
+    if t.data[i] != nil:
+      ChunkSetRawInsert(t, n, t.data[i])
+  tlsf_free(t.data)
+  t.data = n
+
+proc ChunkSetPut(t: var TChunkSet, key: TAddress): PChunkDesc =
+  var h = cast[int](key) and t.max
+  while true:
+    var x = t.data[h]
+    if x == nil: break
+    if x.key == key: return x
+    h = nextTry(h, t.max)
+
+  if ((t.max+1)*2 < t.counter*3) or ((t.max+1)-t.counter < 4):
+    ChunkSetEnlarge(t)
+  inc(t.counter)
+  h = cast[int](key) and t.max
+  while t.data[h] != nil: h = nextTry(h, t.max)
+  assert(t.data[h] == nil)
+  # the new page descriptor goes into result
+  result = cast[PChunkDesc](llAlloc(sizeof(TChunkDesc)))
+  result.next = t.head
+  result.key = key
+  t.head = result
+  t.data[h] = result
+
+# ---------- slightly higher level procs --------------------------------------
+
+proc in_Operator(s: TChunkSet, cell: PChunk): bool =
+  var u = cast[TAddress](cell)
+  var t = ChunkSetGet(s, u shr PageShift)
+  if t != nil:
+    u = (u %% PageSize) /% MemAlignment
+    result = (t.bits[u /% BitsPerUnit] and (1 shl (u %% BitsPerUnit))) != 0
+  else:
+    result = false
+
+proc incl(s: var TCellSet, cell: PCell) =
+  var u = cast[TAddress](cell)
+  var t = ChunkSetPut(s, u shr PageShift)
+  u = (u %% PageSize) /% MemAlignment
+  t.bits[u /% BitsPerUnit] = t.bits[u /% BitsPerUnit] or
+    (1 shl (u %% BitsPerUnit))
+
+proc excl(s: var TCellSet, cell: PCell) =
+  var u = cast[TAddress](cell)
+  var t = ChunkSetGet(s, u shr PageShift)
+  if t != nil:
+    u = (u %% PageSize) /% MemAlignment
+    t.bits[u /% BitsPerUnit] = (t.bits[u /% BitsPerUnit] and
+                                  not (1 shl (u %% BitsPerUnit)))
+
+iterator elements(t: TChunkSet): PChunk {.inline.} =
+  # while traversing it is forbidden to add pointers to the tree!
+  var r = t.head
+  while r != nil:
+    var i = 0
+    while i <= high(r.bits):
+      var w = r.bits[i] # taking a copy of r.bits[i] here is correct, because
+      # modifying operations are not allowed during traversation
+      var j = 0
+      while w != 0:         # test all remaining bits for zero
+        if (w and 1) != 0:  # the bit is set!
+          yield cast[PCell]((r.key shl PageShift) or # +%
+                              (i*%BitsPerUnit+%j) *% MemAlignment)
+        inc(j)
+        w = w shr 1
+      inc(i)
+    r = r.next
+
+
+# ------------- chunk management ----------------------------------------------
+proc removeChunk(a: var TAllocator, c: PChunk) {.inline.} = 
+  if c.prev != nil: c.prev.next = c.next
+  if c.next != nil: c.next.prev = c.prev
+  if a.freeChunks[c.size div PageSize] == c: 
+    a.freeChunks[c.size div PageSize] = c.next
+  
+proc addChunk(a: var TAllocator, c: PChunk) {.inline.} = 
+  var s = abs(c.size) div PageSize
+  c.prev = nil
+  c.next = a.freeChunks[s]
+  a.freeChunks[s] = c
+
+proc freeChunk(a: var TAllocator, c: PChunk) = 
+  assert(c.size > 0)
+  if c.size < PageSize: c.size = PageSize
+  var le = cast[PChunk](cast[TAddress](p) and not PageMask -% PageSize)
+  var ri = cast[PChunk](cast[TAddress](p) and not PageMask +% 
+                        c.size +% PageSize)
+  if isStartOfAChunk(ri) and ri.size < 0:
+    removeChunk(a, ri)
+    inc(c.size, -ri.size)
+  if isEndOfAChunk(le): 
+    le = cast[PChunk](cast[TAddress](p) and not PageMask -% 
+                      le.chunkStart+PageSize)
+    if le.size < 0:
+      removeChunk(a, le)
+      inc(le.size, c.size)
+      addChunk(a, le)
+      return
+  c.size = -c.size
+  addChunk(a, c)
+
+proc splitChunk(a: var TAllocator, c: PChunk, size: int) = 
+  var rest = cast[PChunk](cast[TAddress](p) + size)
+  rest.size = size - c.size # results in negative number, because rest is free
+  addChunk(a, rest)
+  # mark pages as accessible:
+  ChunkTablePut(a, rest, bitAccessible)
+  c.size = size
+
+proc getChunkOfSize(a: var TAllocator, size: int): PChunk = 
+  for i in size..high(a.freeChunks):
+    result = a.freeChunks[i]
+    if result != nil:
+      if i != size: splitChunk(a, result, size)
+      else: removeChunk(a, result)
+      result.prev = nil
+      result.next = nil
+      break
+
+# -----------------------------------------------------------------------------
+
+proc getChunk(p: pointer): PChunk {.inline.} = 
+  result = cast[PChunk](cast[TAddress](p) and not PageMask)
+
+proc getCellSize(p: pointer): int {.inline.} = 
+  var c = getChunk(p)
+  result = abs(c.size)
+  
+proc alloc(a: var TAllocator, size: int): pointer =
+  if size <= smallRequest: 
+    # allocate a small block
+    var s = size div MemAlign
+    var c = a.freeSmallChunks[s]
+    if c == nil: 
+      c = getChunkOfSize(0)
+      c.freeList = nil
+      c.size = size
+      a.freeSmallChunks[s] = c
+      c.len = 1
+      c.used = 1
+      c.chunkStart = 0
+      result = addr(c.data[0])
+    elif c.freeList != nil:
+      result = c.freeList
+      assert(c.freeList.zeroField == nil)
+      c.freeList = c.freeList.next
+      inc(c.used)
+      if c.freeList == nil: removeChunk(a, c)
+    else:
+      assert(c.len*size <= high(c.data))
+      result = addr(c.data[c.len*size])
+      inc(c.len)
+      inc(c.used)
+      if c.len*size > high(c.data): removeChunk(a, c)
+  else:
+    # allocate a large block
+    var c = getChunkOfSize(size shr PageShift)
+    result = addr(c.data[0])
+    c.freeList = nil
+    c.size = size
+    c.len = 0
+    c.used = 0
+    c.chunkStart = 0
+
+proc dealloc(a: var TAllocator, p: pointer) = 
+  var c = getChunk(p)
+  if c.size <= smallRequest: 
+    # free small block:
+    var f = cast[ptr TFreeCell](p)
+    f.zeroField = nil
+    f.next = c.freeList
+    c.freeList = p
+    dec(c.used)
+    if c.used == 0: freeChunk(c)
+  else:
+    # free big chunk
+    freeChunk(c)
+
+proc realloc(a: var TAllocator, p: pointer, size: int): pointer = 
+  # could be made faster, but this is unnecessary, the GC does not use it anyway
+  result = alloc(a, size)
+  copyMem(result, p, getCellSize(p))
+  dealloc(a, p)
+
+proc isAllocatedPtr(a: TAllocator, p: pointer): bool = 
+  var c = getChunk(p)
+  if c in a.accessibleChunks and c.size > 0:
+    result = cast[ptr TFreeCell](p).zeroField != nil
diff --git a/lib/arithm.nim b/lib/arithm.nim
index 91a2232c9..5c8b5726c 100644
--- a/lib/arithm.nim
+++ b/lib/arithm.nim
@@ -14,7 +14,7 @@ proc raiseOverflow {.compilerproc, noinline.} =
   # a single proc to reduce code size to a minimum
   raise newException(EOverflow, "over- or underflow")
 
-proc raiseDivByZero {.exportc: "raiseDivByZero", noinline.} =
+proc raiseDivByZero {.compilerproc, noinline.} =
   raise newException(EDivByZero, "divison by zero")
 
 proc addInt64(a, b: int64): int64 {.compilerProc, inline.} =
diff --git a/lib/atomic.h b/lib/atomic.h
new file mode 100644
index 000000000..afab4843f
--- /dev/null
+++ b/lib/atomic.h
@@ -0,0 +1,2716 @@
+/* Atomic operations for Nimrod */
+
+#if defined(_MSCVER)
+__declspec(naked) int __fastcall Xadd (volatile int* pNum, int val)
+{
+    __asm
+    {
+        lock xadd dword ptr [ECX], EDX
+        mov EAX, EDX
+        ret
+    }
+}
+
+
+
+#endif
+
+
+#define ATOMIC_ASM(type,op)     \
+    __asm __volatile ("lock; " op : "=m" (*(type *)p) : "ir" (v), "0" (*(type *)p))
+
+#define ATOMIC_ASM_NOLOCK(type,op)     \
+    __asm __volatile (op : "=m" (*(type *)p) : "ir" (v), "0" (*(type *)p))
+
+static __inline void
+atomic_add_int(void *p, u_int v)
+{
+        ATOMIC_ASM(int, "addl %1,%0");
+}
+
+static __inline void
+atomic_add_int_nolock(void *p, u_int v)
+{
+        ATOMIC_ASM_NOLOCK(int, "addl %1,%0");
+}
+
+
+
+/*
+Atomic.h
+
+Joshua Scholar
+May 26, 2003
+
+This header contains:
+
+a multiprocessor nonblocking FIFO,  
+
+a multiprocessor nonblocking LIFO
+
+multiprocessor nonblocking reference counting (including volatile pointers 
+that can be safely shared between processors)
+
+nonblocking memory allocation routines
+
+template types that encapsulate variables meant to be shared between 
+processors - all changes to these variables are atomic and globally visible
+
+All kinds of atomic operations that are useful in a multiprocessor context.
+
+The philosophy behind this code is that I created templates that encapsulate
+atomic access so that while the templates themselves may not be the easiest
+code to read, code that uses these templates can be simple, abstract and
+reliable.
+
+I also created regular C style functions, overloaded by type for some of
+the more basic operations.  If you have regular variables or memory 
+locations that you want to use in a globally visible way you have two 
+choices.
+
+If the operation you want is one of the basic building blocks you can
+call one of the overloaded functions like InterlockedSetIfEqual().
+
+Otherwise it's perfectly safe to cast a pointer to your data to be a pointer
+to one of the atomic types so that you can use their methods.  For instance:
+if (((AtomicInt *)foo)->CompareSomeBitsAndExchangeSomeOtherBits(exchange, 
+        bitsToExchange,
+        comperand, 
+        bitsToCompare))
+    ...
+or even
+
+//atomically allocate n bytes out of the pool
+ data = ((*(AtomicPtr<char> *)curPool)+= n) - n;
+
+
+
+State of code:
+
+Unlike other libraries of similar routines that I wrote in the past, this
+has not been thoroughly tested. In fact I don't remember how much of it has
+been tested at this point.
+
+It would take an 8 way machine for me to really pound on the routines.
+
+
+
+Overview
+
+Some basic types are:
+typedef Atomic<int> AtomicInt;
+typedef Atomic<unsigned int> AtomicUInt;
+typedef Atomic<__int64> AtomicInt64;
+typedef Atomic<unsigned __int64> AtomicUInt64;
+
+Fancier types include
+template <typename T> struct AtomicPtr;
+This is a pointer that has the same semantics as the above integer types
+
+template <typename T>struct AtomicPtrWithCount;
+
+AtomicPtrWithCount<T> is a very important type.  It has 32 bits of pointer
+and 32 bits of counter.  There are a number of algorithms that are possible
+when a pointer and a counter can be changed atomically together including a
+lock free pushdown stack and reference counted garbage collection where
+multiple processors can share pointers as well as sharing the data that's
+pointed at.
+
+template <typename T> struct AtomicPtrWithMark;
+
+This is similar to AtomicPtrWithCount<T> but the extra 32 bits are accessed
+as individual bits instead of being accessed as a counter.  It's not as
+important.  I was playing with algorithms before I realized that the
+important ones I was afraid of using had been published independently of my
+former employer.
+
+
+
+The atomic number types act as integer variables, but all changes to these
+variable happen through interlocked atomic instructions.
+All changes are therefor "globally visible" in Intel's parlance.
+
+Note that incrementing (or decrementing or adding to) one of these uses
+InterlockedExchangeAdd, which for 64 bit numbers ends up relying on "lock
+CMPXCHG8B"
+
+There's an Exchange method.
+
+There are also special methods that use compare exchange in some forms that
+I've found useful:
+
+T CompareExchange(T exchange, T comperand)
+bool SetIfEqual(T exchange, T comperand)
+
+and fancier ones I found some uses for
+
+ inline bool SetIfSomeBitsAreEqual(T exchange, T comperand, T bitsToCompare)
+ inline bool SetSomeBitsIfThoseBitsAreEqual(T exchange, 
+                                             T comperand, 
+                                             T bitsToCompare)
+ inline bool SetSomeBitsIfSomeOtherBitsAreEqual(T exchange,
+              T bitsToExchange,
+              T comperand,
+              T bitsToCompare
+              )
+
+ inline T CompareSomeBitsAndExchange(T exchange, 
+                                     T comperand, 
+                                     T bitsToCompare)
+ inline T CompareSomeBitsAndExchangeThoseBits(T exchange, 
+                                             T comperand, 
+                                             T bitsToCompare)
+ inline T CompareSomeBitsAndExchangeSomeOtherBits(T exchange,
+              T bitsToExchange,
+              T comperand,
+              T bitsToCompare
+              )
+
+There are also atomic bit test, bit test and set etc. methods:
+
+ inline bool BTS(int bit)
+ inline bool BTC(int bit)
+ inline bool BTR(int bit)
+ inline bool BT(int bit)
+
+ALGORITHMS and their classes:
+
+The important ones are:
+
+struct Counted
+Use this as the base type for any object you want to be reference counted
+
+template <typename T> class CountedPtr;
+Safely acts as pointer to a reference counted type.  This pointer can not be
+shared between threads safely.
+
+template <typename T> class AtomicCountedPtr;
+Like CountedPtr<T> but this pointer CAN be shared between threads/processors
+safely.
+
+template <typename T> class MPQueue;
+Multiprocessor queue.  This is the nonblocking shared FIFO.
+
+Note, for the sake of convenience there is a Fifo that has the same
+semantics but can only be used single threaded:
+template <typename T> class Queue ;
+
+class MPCountStack;
+This is the multiprocessor nonblocking LIFO stack.  Note that what gets
+pushed on the stack are pointers to MPStackElement. Your data must be
+objects derived from MPStackElements.  Note that it is not legal to push a
+NULL onto the stack - NULL is used to signal an empty stack.
+
+Note that for the sake of convienience there is, once again, a single
+threaded version of the stack:
+class SimpleStack.
+
+There are also classes for allocators that use the MPCountStack as a
+freelist.
+template <typename T, typename BLOCK_ALLOCATOR>
+struct MPCountFreeListAllocator;
+
+This template is recursive in the sense that each allocator gets new blocks
+from a shared allocatorn passed in the constructor (of type
+BLOCK_ALLOCATOR).  You can build a tree of allocators this way.  The root of
+the tree should be of type SimpleAllocator<T> which just calls new and
+delete.
+
+Once again, for the sake of simplicity, there is a single threaded version
+of the block allocator called
+template <typename T, typename BLOCK_ALLOCATOR> struct SimpleBlockAllocator
+
+*/
+#ifndef ATOMIC_H
+#define ATOMIC_H
+#include <windows.h>
+#include <assert.h>
+#include <new>
+using namespace std;
+/* 
+    windows defines the following interlocked routines
+    we need to define the equivalent for volatiles (which 
+    they should have been in the first place, and the following 
+    types voltatile long, volatile int, volatile unsigned long, 
+    volatile unsigned int,  volatile T*, volatile __int64, 
+    volatile unsigned __int64.
+
+    Note: I use the platform SDK which has different header files 
+    for interlocked instructions than the Windows includes in Visual 
+    C
+
+    If you have the platform SDK and the code doesn't compile then
+    you need to make sure that 
+    "C:\Program Files\Microsoft Platform SDK\include"
+    is the first directory listed under menus "Tools" -> menu item
+    "Options" -> tab "Directories" (of course if you installed the 
+    platform SDK in a different directory than 
+    "C:\Program Files\Microsoft Platform SDK" then you should use 
+    YOUR path.
+
+    If you don't have the plaform SDK then InterlockedCompareExchange 
+    is defined for void * instead of being defined for longs...  and 
+    there is no InterlockedCompareExchangePointer
+
+    The whole point of Microsoft having different headers was an update
+    to support 64 bit platforms which doesn't matter here at all (some 
+    of the code here relies on CMPXCHG8B swaping out both a pointer AND
+    a counter - a trick that won't work on the current 64 bit platforms).
+
+    In any case, if you don't have the platform SDK then just 
+    appropriate casts to make the code compile.  Keep in mind that 
+    casting from 64 bit types to 32 bit types is wrong - where there's 
+    a 64 bit type I meant it to call one of my assembly language
+    routines that uses CMPXCHG8B.
+
+    LONG
+    InterlockedIncrement(
+    LPLONG lpAddend
+    );
+
+    LONG
+    InterlockedDecrement(
+    LPLONG lpAddend
+    );
+
+    LONG
+    InterlockedExchange(
+    LPLONG Target,
+    LONG Value
+    );
+
+    LONG
+    InterlockedExchangeAdd(
+    LPLONG Addend,
+    LONG Value
+    );
+
+    LONG
+    InterlockedCompareExchange (
+    PLONG Destination,
+    LONG ExChange,
+    LONG Comperand
+    );
+
+    PVOID
+    InterlockedExchangePointer (
+    PVOID *Target,
+    PVOID Value
+    );
+
+    PVOID
+    InterlockedCompareExchangePointer (
+    PVOID *Destination,
+    PVOID ExChange,
+    PVOID Comperand
+    );
+*/
+
+//we'll need a special cases for volatile __int64 and 
+//volatile unsigned __int64
+
+template <typename T>
+inline T InterlockedIncrement(volatile T * ptr)
+{
+    return (T)InterlockedIncrement((LPLONG)ptr);
+}
+
+template <typename T>
+inline T InterlockedDecrement(volatile T * ptr)
+{
+    return (T)InterlockedDecrement((LPLONG)ptr);
+}
+
+template <typename T>
+inline T InterlockedExchange(volatile T * target,T value)
+{
+    return (T)InterlockedExchange((LPLONG)target,(LONG)value);
+}
+
+template <typename T>
+inline T InterlockedExchangeAdd(volatile T *addend,T value)
+{
+    return (T)InterlockedExchangeAdd((LPLONG)addend,(LONG)value);
+}
+
+template <typename T>
+T InterlockedCompareExchange (volatile T * dest,T exchange,T comperand)
+{
+    return (T)InterlockedCompareExchange ((LPLONG)dest,
+                                        (LONG)exchange,
+                                        (LONG)comperand);
+}
+//most common use of InterlockedCompareExchange
+template <typename T>
+bool InterlockedSetIfEqual (volatile T * dest,T exchange,T comperand)
+{
+    return comperand==InterlockedCompareExchange(dest,exchange,comperand);
+}
+
+//disable the no return value warning, because the assembly language
+//routines load the appropriate registers directly
+#pragma warning(disable:4035)
+
+inline unsigned __int64 
+InterlockedCompareExchange(volatile unsigned __int64 *dest
+                           ,unsigned __int64 exchange
+                           ,unsigned __int64 comperand) 
+{
+    //value returned in eax::edx
+    __asm {
+        lea esi,comperand;
+        lea edi,exchange;
+        
+        mov eax,[esi];
+        mov edx,4[esi];
+        mov ebx,[edi];
+        mov ecx,4[edi];
+        mov esi,dest;
+        //lock CMPXCHG8B [esi] is equivalent to the following except
+        //that it's atomic:
+        //ZeroFlag = (edx:eax == *esi);
+        //if (ZeroFlag) *esi = ecx:ebx;
+        //else edx:eax = *esi;
+        lock CMPXCHG8B [esi];			
+    }
+}
+
+//most common use of InterlockedCompareExchange
+//It's more efficient to use the z flag than to do another compare
+inline bool 
+InterlockedSetIfEqual(volatile unsigned __int64 *dest
+                      ,unsigned __int64 exchange
+                      ,unsigned __int64 comperand) 
+{
+    //value returned in eax
+    __asm {
+        lea esi,comperand;
+        lea edi,exchange;
+        
+        mov eax,[esi];
+        mov edx,4[esi];
+        mov ebx,[edi];
+        mov ecx,4[edi];
+        mov esi,dest;
+        //lock CMPXCHG8B [esi] is equivalent to the following except
+        //that it's atomic:
+        //ZeroFlag = (edx:eax == *esi);
+        //if (ZeroFlag) *esi = ecx:ebx;
+        //else edx:eax = *esi;
+        lock CMPXCHG8B [esi];			
+        mov eax,0;
+        setz al;
+    }
+}
+#pragma warning(default:4035)
+
+inline unsigned __int64 InterlockedIncrement(volatile unsigned __int64 * ptr)
+{
+    unsigned __int64 comperand;
+    unsigned __int64 exchange;
+    do {
+        comperand = *ptr;
+        exchange = comperand+1;
+    }while(!InterlockedSetIfEqual(ptr,exchange,comperand));
+    return exchange;
+}
+
+inline unsigned __int64 InterlockedDecrement(volatile unsigned __int64 * ptr)
+{
+    unsigned __int64 comperand;
+    unsigned __int64 exchange;
+    do {
+        comperand = *ptr;
+        exchange = comperand-1;
+    }while(!InterlockedSetIfEqual(ptr,exchange,comperand));
+    return exchange;
+}
+
+inline unsigned __int64 InterlockedExchange(volatile unsigned __int64 * target,
+                                            unsigned __int64 value)
+{
+    unsigned __int64 comperand;
+    do {
+        comperand = *target;
+    }while(!InterlockedSetIfEqual(target,value,comperand));
+    return comperand;
+}
+
+inline unsigned __int64 InterlockedExchangeAdd(volatile unsigned __int64 *addend,
+                                               unsigned __int64 value)
+{
+    unsigned __int64 comperand;
+    do {
+        comperand = *addend;
+    }while(!InterlockedSetIfEqual(addend,comperand+value,comperand));
+    return comperand;
+}
+
+#pragma warning(disable:4035)
+inline __int64 
+InterlockedCompareExchange(volatile __int64 *dest
+                           ,__int64 exchange
+                           ,__int64 comperand) 
+{
+    //value returned in eax::edx
+    __asm {
+        lea esi,comperand;
+        lea edi,exchange;
+        
+        mov eax,[esi];
+        mov edx,4[esi];
+        mov ebx,[edi];
+        mov ecx,4[edi];
+        mov esi,dest;
+        //lock CMPXCHG8B [esi] is equivalent to the following except
+        //that it's atomic:
+        //ZeroFlag = (edx:eax == *esi);
+        //if (ZeroFlag) *esi = ecx:ebx;
+        //else edx:eax = *esi;
+        lock CMPXCHG8B [esi];			
+    }
+}
+
+//most common use of InterlockedCompareExchange
+//It's more efficient to use the z flag than to do another compare
+inline bool 
+InterlockedSetIfEqual(volatile __int64 *dest
+                      ,__int64 exchange
+                      ,__int64 comperand) 
+{
+    //value returned in eax
+    __asm {
+        lea esi,comperand;
+        lea edi,exchange;
+        
+        mov eax,[esi];
+        mov edx,4[esi];
+        mov ebx,[edi];
+        mov ecx,4[edi];
+        mov esi,dest;
+        //lock CMPXCHG8B [esi] is equivalent to the following except
+        //that it's atomic:
+        //ZeroFlag = (edx:eax == *esi);
+        //if (ZeroFlag) *esi = ecx:ebx;
+        //else edx:eax = *esi;
+        lock CMPXCHG8B [esi];			
+        mov eax,0;
+        setz al;
+    }
+}
+#pragma warning(default:4035)
+
+inline __int64 InterlockedIncrement(volatile __int64 * dest)
+{
+    __int64 comperand;
+    __int64 exchange;
+    do {
+        comperand = *dest;
+        exchange = comperand+1;
+    }while(!InterlockedSetIfEqual(dest,exchange,comperand));
+    return exchange;
+}
+
+inline __int64 InterlockedDecrement(volatile __int64 * dest)
+{
+    __int64 comperand;
+    __int64 exchange;
+    do {
+        comperand = *dest;
+        exchange = comperand-1;
+    }while(!InterlockedSetIfEqual(dest,exchange,comperand));
+    return exchange;
+}
+
+inline __int64 InterlockedExchange(volatile __int64 * target,__int64 value)
+{
+    __int64 comperand;
+    do {
+        comperand = *target;
+    }while(!InterlockedSetIfEqual(target,value,comperand));
+    return comperand;
+}
+
+inline __int64 InterlockedExchangeAdd(volatile __int64 *addend,
+                                      __int64 value)
+{
+    __int64 comperand;
+    do {
+        comperand = *addend;
+    }while(!InterlockedSetIfEqual(addend,comperand+value,comperand));
+    return comperand;
+}
+
+#pragma warning(disable:4035)
+//I've just thought of some algorithms that use BTS and all so I'm including them
+inline bool InterlockedBTS(volatile int *dest, int bit)
+{
+    //value returned in eax
+    __asm{
+        mov eax,bit;
+        mov ebx,dest;
+        lock bts [ebx],eax;
+        mov eax,0;
+        setc al;
+    }
+}
+inline bool InterlockedBTC(volatile int *dest, int bit)
+{
+    //value returned in eax
+    __asm{
+        mov eax,bit;
+        mov ebx,dest;
+        lock btc [ebx],eax;
+        mov eax,0;
+        setc al;
+    }
+}
+inline bool InterlockedBTR(volatile int *dest, int bit)
+{
+    //value returned in eax
+    __asm{
+        mov eax,bit;
+        mov ebx,dest;
+        lock btr [ebx],eax;
+        mov eax,0;
+        setc al;
+    }
+}
+//you can lock BT but since it doesn't change memory there isn't really any point
+inline bool BT(volatile int *dest, int bit)
+{
+    //value returned in eax
+    __asm{
+        mov eax,bit;
+        mov ebx,dest;
+        bt [ebx],eax;
+        mov eax,0;
+        setc al;
+    }
+}
+#pragma warning(default:4035)
+
+inline bool InterlockedBTS(volatile unsigned *dest, int bit)
+{
+    return InterlockedBTS((volatile int *)dest,bit);
+}
+inline bool InterlockedBTC(volatile unsigned *dest, int bit)
+{
+    return InterlockedBTC((volatile int *)dest,bit);
+}
+inline bool InterlockedBTR(volatile unsigned *dest, int bit)
+{
+    return InterlockedBTR((volatile int *)dest,bit);
+}
+inline bool BT(volatile unsigned *dest, int bit)
+{
+    return BT((volatile int *)dest,bit);
+}
+
+inline bool InterlockedBTS(volatile unsigned long *dest, int bit)
+{
+    return InterlockedBTS((volatile int *)dest,bit);
+}
+inline bool InterlockedBTC(volatile unsigned long *dest, int bit)
+{
+    return InterlockedBTC((volatile int *)dest,bit);
+}
+inline bool InterlockedBTR(volatile unsigned long *dest, int bit)
+{
+    return InterlockedBTR((volatile int *)dest,bit);
+}
+inline bool BT(volatile unsigned long *dest, int bit)
+{
+    return BT((volatile int *)dest,bit);
+}
+
+inline bool InterlockedBTS(volatile long *dest, int bit)
+{
+    return InterlockedBTS((volatile int *)dest,bit);
+}
+inline bool InterlockedBTC(volatile long *dest, int bit)
+{
+    return InterlockedBTC((volatile int *)dest,bit);
+}
+inline bool InterlockedBTR(volatile long *dest, int bit)
+{
+    return InterlockedBTR((volatile int *)dest,bit);
+}
+inline bool BT(volatile long *dest, int bit)
+{
+    return BT((volatile int *)dest,bit);
+}
+
+inline bool InterlockedBTS(volatile __int64 *dest, int bit)
+{
+    if (bit<32) return InterlockedBTS((volatile int *)&dest,bit);
+    return InterlockedBTS(1+(volatile int *)&dest,bit-32);
+}
+inline bool InterlockedBTC(volatile __int64 *dest, int bit)
+{
+    if (bit<32) return InterlockedBTC((volatile int *)&dest,bit);
+    return InterlockedBTC(1+(volatile int *)&dest,bit-32);
+}
+inline bool InterlockedBTR(volatile __int64 *dest, int bit)
+{
+    if (bit<32) return InterlockedBTR((volatile int *)&dest,bit);
+    return InterlockedBTR(1+(volatile int *)&dest,bit-32);
+}
+inline bool BT(volatile __int64 *dest, int bit)
+{
+    if (bit<32) return BT((volatile int *)&dest,bit);
+    return BT(1+(volatile int *)&dest,bit-32);
+}
+inline bool InterlockedBTS(volatile unsigned __int64 *dest, int bit)
+{
+    if (bit<32) return InterlockedBTS((volatile int *)&dest,bit);
+    return InterlockedBTS(1+(volatile int *)&dest,bit-32);
+}
+inline bool InterlockedBTC(volatile unsigned __int64 *dest, int bit)
+{
+    if (bit<32) return InterlockedBTC((volatile int *)&dest,bit);
+    return InterlockedBTC(1+(volatile int *)&dest,bit-32);
+}
+inline bool InterlockedBTR(volatile unsigned __int64 *dest, int bit)
+{
+    if (bit<32) return InterlockedBTR((volatile int *)&dest,bit);
+    return InterlockedBTR(1+(volatile int *)&dest,bit-32);
+}
+inline bool BT(volatile unsigned __int64 *dest, int bit)
+{
+    if (bit<32) return BT((volatile int *)&dest,bit);
+    return BT(1+(volatile int *)&dest,bit-32);
+}
+
+//T can be int, unsigned int, long, unsigned long
+//__int64 or unsigned __int64
+template <typename T>
+struct Atomic 
+{
+    volatile T value;
+    
+    inline Atomic(){}
+    
+    explicit inline Atomic(T n)
+    { //so that it's globally visible (to use intel's terminology)
+        InterlockedExchange(&value,n);
+    }
+    
+    //if you need an atomic load then use (*this += 0)
+    //but I haven't found any algorithms that
+    //require an atomic load
+    inline operator T() const
+    {
+        return value;
+    }
+    
+    inline T CompareExchange(T exchange, T comperand)
+    {
+        return InterlockedCompareExchange(&value,exchange,comperand);
+    }
+    
+    //useful - simulates having a compareexchange that ignores some bits in
+    //the compare
+    inline T CompareSomeBitsAndExchange(T exchange, T comperand, T bitsToCompare)
+    {
+        T returned;
+        T bitsToIgnore = ~bitsToCompare;
+        for (;;){
+            returned = InterlockedCompareExchange(&value,exchange,comperand);
+            if (returned == comperand) return returned;
+            if (0 != ((returned ^ comperand) & bitsToCompare)) break;
+            comparand = (comparand&bitsToCompare) | (bitsToIgnore&returned);
+        }
+        return returned;
+    }
+    
+    //useful - simulates having a compareexchange that ignores some bits in
+    //the compare and in the set
+    inline T CompareSomeBitsAndExchangeThoseBits(T exchange, T comperand, T bitsToCompare)
+    {
+        T returned = comperand;
+        T bitsToIgnore = ~bitsToCompare;
+        for (;;){
+            exchange = (exchange&bitsToCompare) | (bitsToIgnore&returned);
+            returned = InterlockedCompareExchange(&value,exchange,comperand);
+            if (returned == comperand) return returned;
+            if (0 != ((returned ^ comperand) & bitsToCompare)) break;
+            comparand = (comparand&bitsToCompare) | (bitsToIgnore&returned);
+        }
+        return returned;
+    }
+    
+    //useful - simulates having a compareexchange that ignores some bits in
+    //the compare and others in the set
+    inline T CompareSomeBitsAndExchangeSomeOtherBits(T exchange, 
+        T bitsToExchange,
+        T comperand, 
+        T bitsToCompare
+        )
+    {
+        T returned = value;
+        T bitsToIgnore = ~bitsToCompare;
+        T bitsToLeave = ~bitsToExchange;
+        for (;;){
+            exchange = (exchange&bitsToExchange) | (bitsToLeave&returned);
+            returned = InterlockedCompareExchange(&value,exchange,comperand);
+            if (returned == comperand) return returned;
+            if (0 != ((returned ^ comperand) & bitsToCompare)) break;
+            comparand = (comparand&bitsToCompare) | (bitsToIgnore&returned);
+        }
+        return returned;
+    }
+    
+    inline T Exchange(T exchange) 
+    {
+        return InterlockedExchange(&value,exchange);
+    }
+    
+    inline bool SetIfEqual(T exchange, T comperand)
+    {
+        return InterlockedSetIfEqual(&value,exchange,comperand);
+    }
+    
+    //useful - simulates having a compareexchange that ignores some bits in
+    //the compare
+    inline bool SetIfSomeBitsAreEqual(T exchange, T comperand, T bitsToCompare)
+    {
+        T returned;
+        T bitsToIgnore = ~bitsToCompare;
+        for (;;){
+            returned = InterlockedCompareExchange(&value,exchange,comperand);
+            if (returned == comperand) return true;
+            if (0 != ((returned ^ comperand) & bitsToCompare)) break;
+            comparand = (comparand&bitsToCompare) | (bitsToIgnore&returned);
+        }
+        return false;
+    }
+    
+    //useful - simulates having a compareexchange that ignores some bits in
+    //the compare and in the set
+    inline bool SetSomeBitsIfThoseBitsAreEqual(T exchange, T comperand, T bitsToCompare)
+    {
+        T returned = comperand;
+        T bitsToIgnore = ~bitsToCompare;
+        for (;;){
+            exchange = (exchange&bitsToCompare) | (bitsToIgnore&returned);
+            returned = InterlockedCompareExchange(&value,exchange,comperand);
+            if (returned == comperand) return true;
+            if (0 != ((returned ^ comperand) & bitsToCompare)) break;
+            comperand = (comperand&bitsToCompare) | (bitsToIgnore&returned);
+        }
+        return false;
+    }
+    //useful - simulates having a compareexchange that ignores some bits in
+    //the compare and others in the set
+    inline bool SetSomeBitsIfSomeOtherBitsAreEqual(T exchange, 
+        T bitsToExchange,
+        T comperand, 
+        T bitsToCompare
+        )
+    {
+        T returned = value;
+        T bitsToIgnore = ~bitsToCompare;
+        T bitsToLeave = ~bitsToExchange;
+        for (;;){
+            exchange = (exchange&bitsToExchange) | (bitsToLeave&returned);
+            returned = InterlockedCompareExchange(&value,exchange,comperand);
+            if (returned == comperand) return true;
+            if (0 != ((returned ^ comperand) & bitsToCompare)) break;
+            comperand = (comperand&bitsToCompare) | (bitsToIgnore&returned);
+        }
+        return false;
+    }
+    
+    inline T operator =(T exchange)
+    {
+        Exchange(exchange);
+        return exchange;
+    }
+    
+    inline T operator +=(T n)
+    {
+        return n + InterlockedExchangeAdd(&value, n);
+    }
+    
+    inline T operator -=(T n)
+    {
+        return InterlockedExchangeAdd(&value, -n) - n;
+    }
+    inline T operator ++()
+    {
+        return (*this += 1);
+    }
+    
+    inline T operator --() 
+    {
+        return (*this -= 1);
+    }
+    
+    inline T operator ++(int)
+    {
+        return InterlockedExchangeAdd(&value, (T)1);
+    }
+    
+    inline T operator --(int)
+    {
+        return InterlockedExchangeAdd(&value, (T)-1);
+    }
+    
+    inline T operator &=(T n)
+    {
+        T comperand;
+        T exchange;
+        do {
+            comperand = value; 
+            exchange = comperand & n;
+        }while(!SetIfEqual(exchange, comperand));
+        return exchange;
+    }
+    
+    inline T operator |= (T n) 
+    {
+        T comperand;
+        T exchange;
+        do {
+            comperand = value; 
+            exchange = comperand | n;
+        }while(!SetIfEqual(exchange, comperand));
+        return exchange;
+    }
+    
+    //yes this isn't standard, but it's useful
+    inline T Mask(T bitsToKeep, T bitsToSet) 
+    {
+        T comperand;
+        T exchange;
+        do {
+            comperand = value ; 
+            exchange = ((comperand & bitsToKeep) | bitsToSet);
+        }while(!SetIfEqual(exchange, comperand));
+        return exchange;
+    }
+    
+    inline T operator ^= (T n)
+    {
+        T comperand;
+        T exchange;
+        do {
+            comperand = value;  
+            exchange = comperand ^ n;
+        }while(!SetIfEqual(exchange, comperand));
+        return exchange;
+    }
+    inline T operator *= (T n) 
+    {
+        T comperand;
+        T exchange;
+        do {
+            comperand = value;  
+            exchange = comperand * n;
+        }while(!SetIfEqual(exchange, comperand));
+        return exchange;
+    }
+    
+    inline T operator /= (T n) 
+    {
+        T comperand;
+        T exchange;
+        do {
+            comperand = value;
+            exchange = comperand / n;
+        }while(!SetIfEqual(exchange, comperand));
+        return exchange;
+    }
+    
+    inline T operator >>= (unsigned n) 
+    {
+        T comperand;
+        T exchange;
+        do {
+            comperand = value;
+            exchange = comperand >> n;
+        }while(!SetIfEqual(exchange, comperand));
+        return exchange;
+    }
+    
+    inline T operator <<= (unsigned n)
+    {
+        T comperand;
+        T exchange;
+        do {
+            comperand = value;
+            exchange = comperand << n;
+        }while(!SetIfEqual(exchange, comperand));
+        return exchange;
+    }
+    inline bool BTS(int bit)
+    {
+        return InterlockedBTS(&value,bit);
+    }
+    inline bool BTC(int bit)
+    {
+        return InterlockedBTC(&value,bit);
+    }
+    inline bool BTR(int bit)
+    {
+        return InterlockedBTR(&value,bit);
+    }
+    inline bool BT(int bit)
+    {
+        return BT(&value,bit);
+    }
+}; 
+
+template <typename T>
+T * InterlockedCompareExchangePointer (
+                                       T *volatile *dest,
+                                       T * exchange,
+                                       T * comperand
+                                       )
+{
+    return (T*)InterlockedCompareExchangePointer((PVOID *)dest,(PVOID)exchange,(PVOID)comperand);
+}
+
+template <typename T>
+struct AtomicPtr 
+{
+    T * volatile value;
+    
+    inline AtomicPtr(){}
+    
+    explicit inline AtomicPtr(T *n)
+    { //so that it's globally visible (to use intel's terminology)
+        InterlockedExchange(&value,n);
+    }
+    explicit inline AtomicPtr(const T *n)
+    { //so that it's globally visible (to use intel's terminology)
+        InterlockedExchange(&value,(T *)n);
+    }
+    
+    inline operator T *() const
+    {
+        return value;
+    }
+    
+    inline operator const T *() const
+    {
+        return value;
+    }
+    
+    inline T *CompareExchange(T *exchange, T *comperand)
+    {
+        return InterlockedCompareExchangePointer(&value,exchange,comperand);
+    }
+    
+    //useful - simulates having a compareexchange that ignores some bits in
+    //the compare
+    inline T * CompareSomeBitsAndExchange(T * exchange, T * comperand, int bitsToCompare)
+    {
+        T  *returned;
+        int bitsToIgnore = ~bitsToCompare;
+        for (;;){
+            returned = InterlockedCompareExchangePointer(&value,exchange,comperand);
+            if (returned == comperand) return returned;
+            if (0 != ((returned ^ comperand) & bitsToCompare)) break;
+            comparand = (comparand&bitsToCompare) | (bitsToIgnore&returned);
+        }
+        return returned;
+    }
+    
+    //useful - simulates having a compareexchange that ignores some bits in
+    //the compare and in the set
+    inline T * CompareSomeBitsAndExchangeThoseBits(T * exchange, T * comperand, int bitsToCompare)
+    {
+        T *returned = comperand;
+        int bitsToIgnore = ~bitsToCompare;
+        for (;;){
+            exchange = (T*)((int)exchange&bitsToCompare) | (bitsToIgnore&(int)returned);
+            returned = InterlockedCompareExchangePointer(&value,exchange,comperand);
+            if (returned == comperand) return returned;
+            if (0 != ((returned ^ comperand) & bitsToCompare)) break;
+            comparand = (T*)((int)comparand&bitsToCompare) | (bitsToIgnore&(int)returned);
+        }
+        return returned;
+    }
+    //useful - simulates having a compareexchange that ignores some bits in
+    //the compare and others in the set
+    inline T* CompareSomeBitsAndExchangeSomeOtherBits(T *exchange, 
+        int bitsToExchange,
+        T * comperand, 
+        int bitsToCompare
+        )
+    {
+        T * returned = value;
+        int bitsToIgnore = ~bitsToCompare;
+        int bitsToLeave = ~bitsToExchange;
+        for (;;){
+            exchange = (T*)((int)exchange&bitsToExchange) | (bitsToLeave&(int)returned);
+            returned = InterlockedCompareExchange(&value,exchange,comperand);
+            if (returned == comperand) return returned;
+            if (0 != ((returned ^ comperand) & bitsToCompare)) break;
+            comparand = (T*)((int)comparand&bitsToCompare) | (bitsToIgnore&(int)returned);
+        }
+        return returned;
+    }
+    
+    inline T * operator ->() const
+    {
+        assert (value != NULL);
+        return value;
+    }
+    
+    inline T *Exchange(T *exchange) 
+    {
+        return InterlockedExchange(&value,exchange);
+    }
+    
+    inline bool SetIfEqual(T *exchange, T *comperand)
+    {
+        return comperand==InterlockedCompareExchangePointer(&value,exchange,comperand);
+    }
+    
+    //useful - simulates having a compareexchange that ignores some bits in
+    //the compare
+    inline bool SetIfSomeBitsAreEqual(T * exchange, T * comperand, int bitsToCompare)
+    {
+        T  *returned;
+        int bitsToIgnore = ~bitsToCompare;
+        for (;;){
+            returned = InterlockedCompareExchangePointer(&value,exchange,comperand);
+            if (returned == comperand) return true;
+            if (0 != ((returned ^ comperand) & bitsToCompare)) break;
+            comparand = (comparand&bitsToCompare) | (bitsToIgnore&returned);
+        }
+        return false;
+    }
+    
+    //useful - simulates having a compareexchange that ignores some bits in
+    //the compare and in the set
+    inline bool SetSomeBitsIfThoseBitsAreEqual(T * exchange, T * comperand, int bitsToCompare)
+    {
+        T *returned = comperand;
+        int bitsToIgnore = ~bitsToCompare;
+        for (;;){
+            exchange = (T*)((int)exchange&bitsToCompare) | (bitsToIgnore&(int)returned);
+            returned = InterlockedCompareExchangePointer(&value,exchange,comperand);
+            if (returned == comperand) return true;
+            if (0 != ((returned ^ comperand) & bitsToCompare)) break;
+            comparand = (T*)((int)comparand&bitsToCompare) | (bitsToIgnore&(int)returned);
+        }
+        return false;
+    }
+    
+    //useful - simulates having a compareexchange that ignores some bits in
+    //the compare and others in the set
+    inline bool SetSomeBitsIfSomeOtherBitsAreEqual(T *exchange, 
+        int bitsToExchange,
+        T * comperand, 
+        int bitsToCompare
+        )
+    {
+        T * returned = value;
+        int bitsToIgnore = ~bitsToCompare;
+        int bitsToLeave = ~bitsToExchange;
+        for (;;){
+            exchange = (T*)((int)exchange&bitsToExchange) | (bitsToLeave&(int)returned);
+            returned = InterlockedCompareExchange(&value,exchange,comperand);
+            if (returned == comperand) return true;
+            if (0 != ((returned ^ comperand) & bitsToCompare)) break;
+            comparand = (T*)((int)comparand&bitsToCompare) | (bitsToIgnore&(int)returned);
+        }
+        return false;
+    }
+    
+    inline T *operator =(T *exchange)
+    {
+        Exchange(exchange);
+        return exchange;
+    }
+    
+    template <typename INT_TYPE>
+        inline T *operator +=(INT_TYPE n)
+    {
+        return n + (T *)InterlockedExchangeAdd((LPLONG)&value, (LONG)(n * (LONG)sizeof(T)));
+    }
+    
+    template <typename INT_TYPE>
+        inline T *operator -=(INT_TYPE n)
+    {
+        return (T *)InterlockedExchangeAdd((LPLONG)&value, (LONG)(-n * (LONG)sizeof(T))) - n;
+    }
+    inline T *operator ++()
+    {
+        return (T *)InterlockedExchangeAdd((LPLONG)&value, (LONG)(sizeof(T))) + 1;
+    }
+    
+    inline T *operator --() 
+    {
+        return (T *)InterlockedExchangeAdd((LPLONG)&value, -(LONG)(sizeof(T))) - 1;
+    }
+    
+    inline T *operator ++(int)
+    {
+        return (T*)InterlockedExchangeAdd((LPLONG)&value, (LONG)sizeof(T));
+    }
+    
+    inline T *operator --(int)
+    {
+        return (T*)InterlockedExchangeAdd((LPLONG)&value, -(LONG)sizeof(T));
+    }
+    
+    //yes this isn't standard, but it's useful
+    template <typename INT_TYPE>
+        inline T *operator &=(INT_TYPE n)
+    {
+        T * comperand;
+        T * exchange;
+        do {
+            comperand = value; 
+            exchange = (T *)((LONG)comperand & n);
+        }while(!SetIfEqual(exchange, comperand));
+        return exchange;
+    }
+    
+    //yes this isn't standard, but it's useful
+    template <typename INT_TYPE>
+        inline T *operator |= (INT_TYPE n) 
+    {
+        T * comperand;
+        T * exchange;
+        do {
+            comperand = value; 
+            exchange = (T *)((LONG)comperand | n);
+        }while(!SetIfEqual(exchange, comperand));
+        return exchange;
+    }
+    
+    //yes this isn't standard, but it's useful
+    template <typename INT_TYPE>
+        inline T operator ^= (INT_TYPE n)
+    {
+        T * comperand;
+        T * exchange;
+        do {
+            comperand = value;  
+            exchange = (T *)((LONG)comperand ^ n);
+        }while(!SetIfEqual(exchange, comperand));
+        return exchange;
+    }
+    
+    //yes this isn't standard, but it's useful
+    template <typename INT_TYPE_A, typename INT_TYPE_B>
+        inline T * Mask(INT_TYPE_A bitsToKeep, INT_TYPE_B bitsToSet) 
+    {
+        T * comperand;
+        T * exchange;
+        do {
+            comperand = value ; 
+            exchange = (T *)(((LONG)comperand & bitsToKeep) | bitsToSet);
+        }while(!SetIfEqual(exchange, comperand));
+        return exchange;
+    }
+    
+    
+    inline bool BTS(int bit)
+    {
+        return InterlockedBTS((volatile int *)&value,bit);
+    }
+    inline bool BTC(int bit)
+    {
+        return InterlockedBTC((volatile int *)&value,bit);
+    }
+    inline bool BTR(int bit)
+    {
+        return InterlockedBTR((volatile int *)&value,bit);
+    }
+    inline bool BT(int bit)
+    {
+        return BT((volatile int *)&value,bit);
+    }
+};
+
+typedef Atomic<int> AtomicInt;
+typedef Atomic<unsigned int> AtomicUInt;
+typedef Atomic<__int64> AtomicInt64;
+typedef Atomic<unsigned __int64> AtomicUInt64;
+
+template
+<typename T, typename A = AtomicUInt64>
+struct AtomicUnion
+{
+    A whole;
+    
+    AtomicUnion()
+    {
+        assert(sizeof(T)<=sizeof(A));
+        new((void *)&whole) T();//in place new
+        
+    }
+    
+    ~AtomicUnion()
+    {
+        ((T *)&whole)->~T();
+    }
+    
+    T &Value() 
+    {
+        return *(T *)&whole;
+    }
+    const T &Value() const
+    {
+        return *(const T *)&whole;
+    }
+};
+
+
+template <typename T>
+struct AtomicPtrWithCountStruct
+{
+    AtomicPtr<T> ptr;
+    AtomicInt count;
+};
+
+
+template <typename T>
+struct PtrWithCountStruct
+{
+    T* ptr;
+    int count;
+};
+
+template <typename T, int MARKBITS=3>
+struct BitMarkedAtomicPtr : public AtomicPtr<T>
+{
+    const int MarkMask() const
+    {
+        return (1<<MARKBITS)-1;
+    }
+    
+    const int DataMask() const
+    {
+        return ~ThreadBitMask();
+    }
+    
+    static T * MaskPtr(T *data)
+    {
+        return (T*)((int)data & DataMask());
+    }
+    
+    static int MaskMark(T * data)
+    {
+        return ((int)data & MarkMask());
+    }
+    
+    static T* Mark(T * data, int bit)
+    {
+        return (T*)((int)data | 1<<bit);
+    }
+    
+    static T* Unmark(T * data, int bit)
+    {
+        return (T*)((int)data & ~(1<<bit));
+    }
+    
+    T * MaskPtr()
+    {
+        return MaskPtr(value);
+    }
+    
+    int MaskMark()
+    {
+        return MaskMark(value);
+    }
+    
+    //note new value has the marks in exchange not the original marks
+    inline bool SetIfMarked(T *exchange, int bit)
+    {
+        assert(bit<MARKBITS);
+        return SetIfSomeBitsAreEqual(exchange,DataMask(),(T*)(1<<bit),1<<bit);
+    }
+    
+    //note new value has the marks in exchange not the original marks
+    T * ExchangeIfMarked(T *exchange, int bit)
+    {
+        assert(bit<MARKBITS);
+        return CompareSomeBitsAndExchange(exchange,DataMask(),(T*)(1<<bit),1<<bit);
+    }
+    
+    inline bool SetAndClearMarksIfMarked(T *exchange, int bit)
+    {
+        return SetIfMarked(MaskPtr(exchange),bit);
+    }
+    
+    inline T * ExchangeAndClearMarksIfMarked(T *exchange, int bit)
+    {
+        return ExchangeIfMarked(MaskPtr(exchange),bit);
+    }
+    
+    inline bool SetAndClearOtherMarksIfMarked(T *exchange, int bit)
+    {
+        return SetIfMarked(Mark(MaskPtr(exchange),bit),
+            bit);
+    }
+    
+    //note new value has the marks in exchange not the original marks
+    T * ExchangeAndClearOtherMarksIfMarked(T *exchange, int bit)
+    {
+        return ExchangeIfMarked(Mark(MaskPtr(exchange),bit),
+            bit);
+    }
+    
+    inline bool SetAndMarkIfMarked(T *exchange, int bit)
+    {
+        return SetSomeBitsIfSomeOtherBitsAreEqual(
+            Mark(MaskPtr(exchange),bit),
+            DataMask() | 1<<bit,
+            (T*)(1<<bit),
+            1<<bit);
+    }
+    
+    inline T * ExchangeAndMarkIfMarked(T *exchange, int bit)
+    {
+        return CompareSomeBitsAndExchangeSomeOtherBits(
+            Mark(MaskPtr(exchange),bit),
+            DataMask() | 1<<bit,
+            (T*)(1<<bit),
+            1<<bit);
+    }	 
+    
+    bool Mark(int bit)
+    {
+        assert(bit<MARKBITS);
+        return BTS(bit);
+    }
+    
+    bool Unmark(int bit)
+    {
+        assert(bit<MARKBITS);
+        return BTC(bit);
+    }
+    
+    bool InvertMark(int bit)
+    {
+        assert(bit<MARKBITS);
+        return BTR(bit);
+    }
+    
+    bool IsMarked(int bit)
+    {
+        assert(bit<MARKBITS);
+        return BT(bit);
+    }
+};
+
+template <typename T>
+struct AtomicPtrWithCount : public AtomicUnion< AtomicPtrWithCountStruct<T> >
+{
+    typedef AtomicUnion< PtrWithCountStruct<T>, unsigned __int64 > SimpleUnionType;
+    AtomicPtrWithCount()
+    {
+        whole = 0;
+    }
+    AtomicPtrWithCount(unsigned __int64 o)
+    {
+        whole = o.whole;
+    }
+    AtomicPtrWithCount(T *ptr)
+    {
+        SimpleUnionType o;
+        o.Value().ptr = ptr;
+        o.Value().count = 0;
+        whole = o.whole;
+    }
+    
+    operator unsigned __int64() const
+    {
+        return whole;
+    }
+    T *Ptr() const
+    {
+        return Value().ptr;
+    }
+    int Count() const
+    {
+        return Value().count;
+    }
+    unsigned __int64 Whole() const
+    {
+        return whole;
+    }
+    
+    AtomicPtr<T> & Ptr()
+    {
+        return Value().ptr;
+    }
+    AtomicInt & Count()
+    {
+        return Value().count;
+    }
+    AtomicUInt64 & Whole()
+    {
+        return whole;
+    }
+    unsigned __int64 SetPtrAndIncCount(T *ptr)
+    {
+        SimpleUnionType was;
+        SimpleUnionType to;
+        to.Value().ptr = ptr;
+        do {
+            was.whole = whole;
+            to.Value().count = was.Value().count+1;
+        }while(!whole.SetIfEqual(to.whole,was.whole));
+        return to.whole;
+    }
+    bool SetIfPtrEqualAndIncCount(T *exchange, T *comperand)
+    {
+        SimpleUnionType was;
+        SimpleUnionType to;
+        to.ptr = exchange;
+        do {
+            was.whole = whole;
+            if (was.Value().ptr != comperand) return false;
+            to.Value().count = was.Value().count+1;
+        }while(!whole.SetIfEqual(to.whole,was.whole));
+        return true;
+    }
+    unsigned __int64 ExchangeIfPtrEqualAndIncCount(T *exchange, T *comperand)
+    {
+        SimpleUnionType was;
+        SimpleUnionType to;
+        to.ptr = exchange;
+        do {
+            was.whole = whole;
+            if (was.Value().ptr != comperand) return was.whole;
+            to.Value().count = was.Value().count+1;
+        }while(!whole.SetIfEqual(to.whole,was.whole));
+        return was.whole;
+    }
+    inline T *operator =(T *exchange)
+    {
+        SetPtrAndIncCount(exchange);
+        return exchange;
+    }
+    
+    template <typename INT_TYPE>
+        inline T *operator +=(INT_TYPE n)
+    {
+        T *was;
+        T *to;
+        do {
+            was = Ptr();
+            to = was + n;
+        }while (!SetIfPtrEqualAndIncCount(to,was));
+        return to;
+    }
+    
+    template <typename INT_TYPE>
+        inline T *operator -=(INT_TYPE n)
+    {
+        T *was;
+        T *to;
+        do {
+            was = Ptr();
+            to = was - n;
+        }while (!SetIfPtrEqualAndIncCount(to,was));
+        return to;
+    }
+    inline T *operator ++()
+    {
+        return (*this += 1);
+    }
+    
+    inline T *operator --() 
+    {
+        return (*this -= 1);
+    }
+    
+    inline T *operator ++(int)
+    {
+        return (++ *this) - 1;
+    }
+    
+    inline T *operator --(int)
+    {
+        return (-- *this) + 1;
+    }
+};
+
+template <typename T>
+struct AtomicPtrWithMarkStruct
+{
+    AtomicPtr<T> ptr;
+    AtomicUInt mark;
+};
+
+
+template <typename T>
+struct PtrWithMarkStruct
+{
+    T* ptr;
+    unsigned int mark;
+};
+
+template <typename T>
+struct AtomicPtrWithMark : public AtomicUnion< AtomicPtrWithMarkStruct<T> >
+{
+    typedef AtomicUnion< PtrWithMarkStruct<T>, unsigned __int64 > SimpleUnionType;
+    AtomicPtrWithMark()
+    {
+        whole = 0;
+    }
+    AtomicPtrWithMark(unsigned __int64 o)
+    {
+        whole = o.whole;
+    }
+    AtomicPtrWithMark(T *ptr)
+    {
+        SimpleUnionType o;
+        o.Value().ptr = ptr;
+        o.Value().mark = 0;
+        whole = o.whole;
+    }
+    
+    operator unsigned __int64() const
+    {
+        return whole;
+    }
+    T *Ptr() const
+    {
+        return Value().ptr;
+    }
+    int Mark() const
+    {
+        return Value().mark;
+    }
+    unsigned __int64 Whole() const
+    {
+        return whole;
+    }
+    
+    AtomicPtr<T> & Ptr()
+    {
+        return Value().ptr;
+    }
+    AtomicInt & Mark()
+    {
+        return Value().mark;
+    }
+    AtomicUInt64 & Whole()
+    {
+        return whole;
+    }
+    
+    inline bool SetAndClearOtherMarksIfMarked(T *exchange, int bit)
+    {
+        assert(bit<32);
+        SimpleUnionType compareMask;
+        compareMask.Value().ptr = NULL;
+        compareMask.Value().mark = 1u<<bit;
+        
+        SimpleUnionType exchangeValue;
+        exchangeValue.Value().ptr = exchange;
+        exchangeValue.Value().mark = compareMask.Value().mark;
+        
+        return whole.SetSomeBitsIfSomeOtherBitsAreEqual(exchangeValue.whole,
+            (unsigned __int64)-1i64,
+            compareMask.whole,
+            compareMask.whole);
+    }
+    inline bool SetAndClearMarksIfPtrEqual(T *exchange, T*comparend)
+    {
+        SimpleUnionType compareMask;
+        compareMask.Value().ptr = (T*)-1;
+        compareMask.Value().mark = 0;
+        
+        SimpleUnionType compareValue;
+        compareValue.Value().ptr = comparend;
+        compareValue.Value().mark = 0;
+        
+        SimpleUnionType exchangeValue;
+        exchangeValue.Value().ptr = exchange;
+        exchangeValue.Value().mark = 0;
+        
+        return whole.SetSomeBitsIfThoseBitsAreEqual(exchangeValue.whole,
+            compareValue.whole,
+            compareMask.whole);
+    }
+    
+    inline bool SetAndClearMarksIfMarked(T *exchange, int bit)
+    {
+        assert(bit<32);
+        SimpleUnionType compareMask;
+        compareMask.Value().ptr = NULL;
+        compareMask.Value().mark = 1u<<bit;
+        
+        SimpleUnionType exchangeValue;
+        exchangeValue.Value().ptr = exchange;
+        exchangeValue.Value().mark = 0;
+        
+        return whole.SetSomeBitsIfSomeOtherBitsAreEqual(exchangeValue.whole,
+            (unsigned __int64)-1i64,
+            compareMask.whole,
+            compareMask.whole);
+    }
+    //note new value has the marks in exchange not the original marks
+    unsigned __int64 ExchangeAndClearOtherMarksIfMarked(T *exchange, int bit)
+    {
+        assert(bit<32);
+        SimpleUnionType compareMask;
+        compareMask.Value().ptr = NULL;
+        compareMask.Value().mark = 1u<<bit;
+        
+        SimpleUnionType exchangeValue;
+        exchangeValue.Value().ptr = exchange;
+        exchangeValue.Value().mark = compareMask.Value().mark;
+        
+        return whole.CompareSomeBitsAndExchangeSomeOtherBits(exchangeValue.whole,
+            exchangeMask.whole,
+            compareMask.whole,
+            compareMask.whole);
+    }
+    
+    unsigned __int64 ExchangeAndClearMarksIfMarked(T *exchange, int bit)
+    {
+        assert(bit<32);
+        SimpleUnionType compareMask;
+        compareMask.Value().ptr = NULL;
+        compareMask.Value().mark = 1u<<bit;
+        
+        SimpleUnionType exchangeValue;
+        exchangeValue.Value().ptr = exchange;
+        exchangeValue.Value().mark = 0;
+        
+        return whole.CompareSomeBitsAndExchangeSomeOtherBits(exchangeValue.whole,
+            exchangeMask.whole,
+            compareMask.whole,
+            compareMask.whole);
+    }
+    
+    
+    bool Mark(int bit)
+    {
+        assert(bit<32);
+        return whole.BTS(bit);
+    }
+    
+    bool Unmark(int bit)
+    {
+        assert(bit<32);
+        return whole.BTC(bit);
+    }
+    
+    bool InvertMark(int bit)
+    {
+        assert(bit<32);
+        return whole.BTR(bit);
+    }
+    
+    bool IsMarked(int bit)
+    {
+        assert(bit<32);
+        return whole.BT(bit);
+    }
+};
+
+struct MPStackElement
+{
+    MPStackElement * next;
+};
+
+class MPMarkStack
+{
+protected:
+    AtomicPtrWithMark<MPStackElement> tos;
+    AtomicUInt availableThreadBits;
+    AtomicInt lastReserved;
+    
+public:
+    
+    MPStackElement* ExchangeStack(MPStackElement *newStack = NULL)
+    {
+        AtomicPtrWithMark<MPStackElement>::SimpleUnionType newWhole, ret;
+        newWhole.Value().mark = 0;
+        newWhole.Value().ptr = newStack;
+        ret.whole = tos.whole.Exchange(newWhole.whole);
+        return ret.Value().ptr;
+    }
+    
+    MPMarkStack()
+    {
+        lastReserved = 0;
+        tos.whole = 0;
+        availableThreadBits = (unsigned)-1;
+    }
+    
+    //expensive - call once per thread to reserve a bit
+    int ReserveThreadBit()
+    {
+        int offset = lastReserved;
+        //since locked operations are slow we only do
+        //bit tests on bits that look acceptable because
+        //of a nonlocked read.
+        unsigned readOnce = availableThreadBits;
+        for (int i=0; i< 32;++i){
+            const int bit = (31&(i+offset));
+            const unsigned mask = 1u<<bit;
+            if ((readOnce & mask)!=0){
+                if (availableThreadBits.BTR(bit)) {
+                    lastReserved = ((bit+1)&31);//try the next one
+                    return bit+1;
+                }
+                readOnce = availableThreadBits;
+            }
+        }
+        return 0;
+    }
+    int BlockingReserveThreadBit()
+    {
+        int i;
+        while (0==(i=ReserveThreadBit()));
+        return i;
+    }
+    int ReturnThreadBit(int i)
+    {
+        availableThreadBits.BTS(i-1);
+    }
+    
+    void PushElement(MPStackElement *element)
+    {
+        MPStackElement * next;
+        do {
+            next = tos.Value().ptr;
+            element->next = tos.Value().ptr;
+        }while(!tos.SetAndClearMarksIfPtrEqual(element,next));
+    }
+    
+    void PushList(MPStackElement *top, MPStackElement *bottom)
+    {
+        MPStackElement * next;
+        do {
+            next = tos.Value().ptr;
+            bottom->next = tos.Value().ptr;
+        }while(!tos.SetAndClearMarksIfPtrEqual(top,next));
+    }
+    
+    MPStackElement* PopElement(int i)
+    {
+        for(;;) {
+            tos.Value().mark.BTS(i-1);
+            MPStackElement * was = tos.Value().ptr;
+            if (was == NULL) return NULL;
+            if (tos.SetAndClearMarksIfMarked(was->next,i-1)) return was;
+        }
+    }
+    MPStackElement* PopElement()
+    {
+        int id = BlockingReserveThreadBit();
+        MPStackElement * ret = PopElement(id);
+        ReturnThreadBit(id);
+        return ret;
+    }
+};
+class MPCountStack
+{
+protected:
+    AtomicPtrWithCount<MPStackElement> tos;
+    
+public:
+    
+    MPStackElement* ExchangeStack(MPStackElement *newStack = NULL)
+    {
+        return tos.Value().ptr.Exchange(newStack);
+    }
+    
+    MPCountStack()
+    {
+        tos = 0;
+    }
+    
+    
+    void PushElement(MPStackElement *element)
+    {
+        MPStackElement * next;
+        do {
+            next = tos.Value().ptr;
+            element->next = tos.Value().ptr;
+        }while(!tos.Value().ptr.SetIfEqual(element,next));
+    }
+    
+    void PushList(MPStackElement *top, MPStackElement *bottom)
+    {
+        MPStackElement * next;
+        do {
+            next = tos.Value().ptr;
+            bottom->next = tos.Value().ptr;
+        }while(!tos.Value().ptr.SetIfEqual(top,next));
+    }
+    
+    MPStackElement* PopElement()
+    {
+        AtomicPtrWithCount<MPStackElement>::SimpleUnionType was;
+        AtomicPtrWithCount<MPStackElement>::SimpleUnionType to;
+        do {
+            was.whole = tos.whole;
+            if (was.Value().ptr == NULL) return NULL;
+            to.Value().count = was.Value().count + 1;
+            to.Value().ptr = was.Value().ptr->next;
+        }while(!tos.whole.SetIfEqual(was.whole,to.whole));
+        return was.Value().ptr;
+    }
+};
+
+class SimpleStack
+{
+protected:
+    MPStackElement * tos;
+    
+public:
+    
+    MPStackElement* ExchangeStack(MPStackElement *newStack = NULL)
+    {
+        MPStackElement* was = tos;
+        tos = newStack;
+        return was;
+    }
+    
+    SimpleStack()
+    {
+        tos = 0;
+    }
+    
+    
+    void PushElement(MPStackElement *element)
+    {
+        element->next = tos;
+        tos = element;
+    }
+    
+    void PushList(MPStackElement *top, MPStackElement *bottom)
+    {
+        bottom->next = tos;
+        tos = top;
+    }
+    
+    MPStackElement* PopElement()
+    {
+        MPStackElement* was = tos;
+        if (was) tos = was->next;
+        return was;
+    }
+};
+
+template <typename T>
+struct MPMemBlock : public MPStackElement
+{
+    T data;
+    char bottomOfBlock;
+};
+
+#define OFFSET_OF_MEMBER(type,member) ((int)&(((type *)0)->member))
+
+//put one of these in each thread object 
+//and you have thread local allocation
+template <typename T, typename BLOCK_ALLOCATOR>
+struct SimpleBlockAllocator
+{
+    SimpleStack data;
+    
+    typedef SimpleBlockAllocator<T,BLOCK_ALLOCATOR> AllocatorType;
+    
+    BLOCK_ALLOCATOR & MyAllocator;
+    
+    SimpleBlockAllocator(BLOCK_ALLOCATOR &source)
+        :MyAllocator(source)
+    {}
+    
+    int ReserveThreadBit(){return 1;}
+    int BlockingReserveThreadBit(){return 1;}
+    void ReturnThreadBit(int){  }
+    
+    int Size() const { return sizeof(T); }
+    void AddBlock()
+    {
+        int blockSize = MyAllocator.Size();
+        int elementSize = sizeof(MPMemBlock<T>);
+        assert( MyAllocator.Size() >= elementSize);
+        MPMemBlock<T> *bottom = (MPMemBlock<T> *)MyAllocator.Allocate();
+        void *prev = 0;
+        MPMemBlock<T> *top = bottom;  
+        do {
+            top->bottomOfBlock = 0;
+            top->next = prev;
+            prev = (void *)top;
+            ++top;
+        }while( (blockSize-=elementSize) >= elementSize);
+        bottom->bottomOfBlock = 1;
+        data.PushList(top-1,bottom);
+    }
+    void *Allocate(int) 
+    {	
+        return Allocate();
+    }
+    void *Allocate() 
+    {	
+        MPMemBlock<T> *ret;
+        for(;;) {
+            ret = (MPMemBlock<T> *)data.PopElement();
+            if (ret!=NULL) return &ret->data;
+            AddBlock();
+        }
+    }
+    void Deallocate(void *ob) 
+    {
+        if (!ob) return;
+        MPMemBlock<T> *ret = (MPMemBlock<T> *)
+            ((char *)data - OFFSET_OF_MEMBER(MPMemBlock<T>,ob));
+        data.PushElement(ret);
+    }
+    //all memory allocated must be Deallocated before Clear() or the destructor is called
+    void Clear() 
+    {
+        MPMemBlock<T> *stackWas = (MPMemBlock<T> *)data.ExchangeStack(NULL);
+        MPMemBlock<T> *blocks = NULL;
+        while(stackWas){
+            if (stackWas->bottomOfBlock){
+                if (blocks) {
+                    blocks->next = stackWas;
+                }
+                blocks = stackWas;
+            }
+            stackWas = (MPMemBlock<T> *)(stackWas->next);
+        }
+        while(blocks)
+        {
+            stackWas = (MPMemBlock<T> *)blocks->next;
+            MyAllocator.Deallocate(blocks);
+            blocks = stackWas;
+        }
+    }
+    //all memory allocated must be Deallocated before Clear() or the destructor is called
+    ~SimpleBlockAllocator()
+    {
+        Clear();
+    }
+};
+
+template<class T>
+struct SimpleAllocator
+{
+    void *Allocate() { return (void *)new char[sizeof(T)]; }
+    void *Allocate(int) { return Allocate(); }
+    
+    int ReserveThreadBit(){return 1;}
+    int BlockingReserveThreadBit(){return 1;}
+    void ReturnThreadBit(int){}
+    
+    void Deallocate(void *data) { delete[] (char[])data; }
+    int Size() const { return sizeof(T); }
+    typedef SimpleAllocator AllocatorType;
+};
+
+enum DontReserve{ DONT_RESERVE };
+
+template<class T>
+struct ThreadMarkedAllocator
+{
+    T& allocator;
+    int bit;
+    
+    ThreadMarkedAllocator(T &sourceAllocator)
+        :allocator(sourceAllocator)
+        ,bit(sourceAllocator.BlockingReserveThreadBit())
+    {}
+    
+    ThreadMarkedAllocator(T &sourceAllocator,DontReserve)
+        :allocator(sourceAllocator)
+        ,bit(0)
+    {}
+    
+    ~ThreadMarkedAllocator()
+    {
+        allocator.ReturnThreadBit(bit);
+    }
+    
+    bool ReserveThreadBit()
+    {
+        if (bit==0) bit=sourceAllocator.ReserveThreadBit();
+        return bit!=0;
+    }
+    void BlockingReserveThreadBit()
+    {
+        if (bit==0) bit=sourceAllocator.BlockingReserveThreadBit();
+    }
+    void ReturnThreadBit()
+    {
+        int was = bit;
+        bit = 0;
+        sourceAllocator.ReturnThreadBit(was);
+    }
+    
+    void *Allocate() 
+    { 
+        assert(bit!=0);
+        return allocator.Allocate(bit); 
+    }
+    
+    void Deallocate(void *data) { allocator.Deallocate(data); }
+    int Size() const { return Allocator.Size(); }
+    typedef ThreadMarkedAllocator<T> AllocatorType;
+};
+
+template <typename T, typename BLOCK_ALLOCATOR>
+struct MPMarkFreeListAllocator
+{
+    MPMarkStack data;
+    
+    typedef MPMarkFreeListAllocator<T,BLOCK_ALLOCATOR> AllocatorType;
+    
+    BLOCK_ALLOCATOR &MyAllocator;
+    
+    MPMarkFreeListAllocator(BLOCK_ALLOCATOR &source)
+        :MyAllocator(source)
+    {}
+    
+    int ReserveThreadBit(){return data.ReserveThreadBit();}
+    int BlockingReserveThreadBit(){return data.BlockingReserveThreadBit();}
+    void ReturnThreadBit(int bit){ data.ReturnThreadBit(bit); }
+    
+    int Size() const { return sizeof(T); }
+    void AddBlock()
+    {
+        int blockSize = MyAllocator.Size();
+        int elementSize = sizeof(MPMemBlock<T>);
+        assert( MyAllocator.Size() >= elementSize);
+        MPMemBlock<T> *bottom = (MPMemBlock<T> *)MyAllocator.Allocate();
+        void *prev = 0;
+        MPMemBlock<T> *top = bottom;  
+        do {
+            top->bottomOfBlock = 0;
+            top->next = prev;
+            prev = (void *)top;
+            ++top;
+        }while( (blockSize-=elementSize) >= elementSize);
+        bottom->bottomOfBlock = 1;
+        data.PushList(top-1,bottom);
+    }
+    void *Allocate(int mark) 
+    {	
+        MPMemBlock<T> *ret;
+        for(;;) {
+            ret = (MPMemBlock<T> *)data.PopElement(mark);
+            if (ret!=NULL) return ret;
+            AddBlock();
+        }
+    }
+    void *Allocate() 
+    {	
+        MPMemBlock<T> *ret;
+        for(;;) {
+            ret = (MPMemBlock<T> *)data.PopElement();
+            if (ret!=NULL) return &ret->data;
+            AddBlock();
+        }
+    }
+    void Deallocate(void *ob) 
+    {
+        if (!ob) return;
+        MPMemBlock<T> *ret = (MPMemBlock<T> *)
+            ((char *)data - OFFSET_OF_MEMBER(MPMemBlock<T>,ob));
+        data.PushElement(ret);
+    }
+    //all memory allocated must be Deallocated before Clear() or the destructor is called
+    void Clear()
+    {
+        MPMemBlock<T> *stackWas = (MPMemBlock<T> *)data.ExchangeStack(NULL);
+        MPMemBlock<T> *blocks = NULL;
+        while(stackWas){
+            if (stackWas->bottomOfBlock){
+                if (blocks) {
+                    blocks->next = stackWas;
+                }
+                blocks = stackWas;
+            }
+            stackWas = (MPMemBlock<T> *)(stackWas->next);
+        }
+        while(blocks)
+        {
+            stackWas = (MPMemBlock<T> *)blocks->next;
+            MyAllocator.Deallocate(blocks);
+            blocks = stackWas;
+        }
+    }
+    //all memory allocated must be Deallocated before Clear() or the destructor is called
+    ~MPMarkFreeListAllocator()
+    {
+        Clear();
+    }
+};
+template <typename T, typename BLOCK_ALLOCATOR>
+struct MPCountFreeListAllocator
+{
+    MPCountStack data;
+    
+    typedef MPCountFreeListAllocator<T,BLOCK_ALLOCATOR> AllocatorType;
+    
+    BLOCK_ALLOCATOR & MyAllocator;
+    
+    MPCountFreeListAllocator(BLOCK_ALLOCATOR &source)
+        :MyAllocator(source)
+    {}
+    
+    int ReserveThreadBit(){return 1;}
+    int BlockingReserveThreadBit(){return 1;}
+    void ReturnThreadBit(int){  }
+    
+    int Size() const { return sizeof(T); }
+    void AddBlock()
+    {
+        int blockSize = MyAllocator.Size();
+        int elementSize = sizeof(MPMemBlock<T>);
+        assert( MyAllocator.Size() >= elementSize);
+        MPMemBlock<T> *bottom = (MPMemBlock<T> *)MyAllocator.Allocate();
+        void *prev = 0;
+        MPMemBlock<T> *top = bottom;  
+        do {
+            top->bottomOfBlock = 0;
+            top->next = prev;
+            prev = (void *)top;
+            ++top;
+        }while( (blockSize-=elementSize) >= elementSize);
+        bottom->bottomOfBlock = 1;
+        data.PushList(top-1,bottom);
+    }
+    void *Allocate(int) 
+    {	
+        return Allocate();
+    }
+    void *Allocate() 
+    {	
+        MPMemBlock<T> *ret;
+        for(;;) {
+            ret = (MPMemBlock<T> *)data.PopElement();
+            if (ret!=NULL) return &ret->data;
+            AddBlock();
+        }
+    }
+    void Deallocate(void *ob) 
+    {
+        if (!ob) return;
+        MPMemBlock<T> *ret = (MPMemBlock<T> *)
+            ((char *)data - OFFSET_OF_MEMBER(MPMemBlock<T>,ob));
+        data.PushElement(ret);
+    }
+    //all memory allocated must be Deallocated before Clear() or the destructor is called
+    void Clear() 
+    {
+        MPMemBlock<T> *stackWas = (MPMemBlock<T> *)data.ExchangeStack(NULL);
+        MPMemBlock<T> *blocks = NULL;
+        while(stackWas){
+            if (stackWas->bottomOfBlock){
+                if (blocks) {
+                    blocks->next = stackWas;
+                }
+                blocks = stackWas;
+            }
+            stackWas = (MPMemBlock<T> *)(stackWas->next);
+        }
+        while(blocks)
+        {
+            stackWas = (MPMemBlock<T> *)blocks->next;
+            MyAllocator.Deallocate(blocks);
+            blocks = stackWas;
+        }
+    }
+    //all memory allocated must be Deallocated before Clear() or the destructor is called
+    ~MPCountFreeListAllocator()
+    {
+        Clear();
+    }
+};
+
+struct Counted
+{
+    mutable AtomicInt refCount;
+    Counted():refCount(0){}
+};
+
+//it is NOT safe to read or write from more than one thread at a time
+template <typename T> 
+class CountedPtr
+{
+    
+protected:
+    T *value;
+    void decRefCount()
+    {
+        decRefCount(value);
+    }
+public:
+    static void decRefCount(T *ptr)
+    {
+        if (ptr && 0 == --ptr->refCount){
+            delete ptr;
+        }
+    }
+    void SetValueIgnoringRefCounts(T *ptr) 
+    { 
+        value = ptr; 
+    }
+    CountedPtr():letter(NULL){}
+    
+    CountedPtr(T *ptr)
+    {
+        value = ptr;
+        if (value) ++value->refCount;
+    }
+    
+    operator const T *() const { return value; }
+    operator T *() { return value; }
+    
+    CountedPtr<T> & operator=(const T *ptr)
+    {
+        if (ptr) ++ptr->refCount;
+        decRefCount();
+        value = ptr;
+        return *this;
+    }
+    
+    operator bool() const
+    { return value!=NULL; }
+    
+    bool operator !() const
+    { return value==NULL; }
+    
+    
+    const T & operator*() const
+    { return *value; }
+    
+    T & operator*()
+    { return *value; }
+    
+    T * operator->()
+    { assert(value); return value; }
+    const T * operator->()const
+    { assert(value); return value; }
+    
+    ~CountedPtr()
+    {
+        decRefCount();
+    }
+};
+
+template <typename T>
+class AtomicCountedPtr
+{
+protected:
+    mutable AtomicPtrWithCount<T> value;
+public:
+    
+    
+    CountedPtr<T> & LoadValue(CountedPtr<T> &dest) const 
+    { 
+retry:
+    AtomicPtrWithCount<T>::SimpleUnionType inc;
+    inc.Value().ptr = 0;
+    inc.Value().count = 1;
+    AtomicPtrWithCount<T>::SimpleUnionType ret;
+    ret.whole = (value.whole+=inc.whole); //increment in ptr
+    dest = ret.Value().ptr ; //increment in object
+    AtomicPtrWithCount<T>::SimpleUnionType update;
+    update.Value().ptr = ret.Value().ptr;
+    for(;;){
+        update.Value().count = ret.Value().count-1;
+        AtomicPtrWithCount<T>::SimpleUnionType current;
+        current.whole = value.whole.SetIfEqual(update.whole,ret.whole);
+        if (current.whole == ret.whole) break; //successfully decremented in ptr
+        if (current.Value().ptr != ret.Value().ptr) || current.Value().count < 1){
+            //because of the line "dest = ret.Value().ptr" above
+            //the old value will decrement in the prev object as the next object is loaded
+            goto retry; 
+        }
+        ret.Value().count = current.Value().count;
+    }
+    return dest; 
+    }
+    
+    CountedPtr<T> & LoadValue(CountedPtr<T> &dest, int &count) const 
+    { 
+retry:
+    AtomicPtrWithCount<T>::SimpleUnionType inc;
+    inc.Value().ptr = 0;
+    inc.Value().count = 1;
+    AtomicPtrWithCount<T>::SimpleUnionType ret;
+    ret.whole = (value.whole+=inc.whole); //increment in ptr
+    dest = ret.Value().ptr ; //increment in object
+    AtomicPtrWithCount<T>::SimpleUnionType update;
+    update.Value().ptr = ret.Value().ptr;
+    for(;;){
+        update.Value().count = ret.Value().count-1;
+        AtomicPtrWithCount<T>::SimpleUnionType current;
+        current.whole = value.whole.SetIfEqual(update.whole,ret.whole);
+        if (current.whole == ret.whole) break; //successfully decremented in ptr
+        if (current.Value().ptr != ret.Value().ptr) || current.Value().count < 1){
+            //because of the line "dest = ret.Value().ptr" above
+            //the old value will decrement in the prev object as the next object is loaded
+            goto retry; 
+        }
+        ret.Value().count = current.Value().count;
+    }
+    count = ret.Value().count;
+    return dest; 
+    }
+    
+    CountedPtr<T> & ExchangeInPlace(CountedPtr<T> &dest)
+    { 
+        AtomicPtrWithCount<T>::SimpleUnionType destWhole;
+        destWhole.Value().ptr = dest;
+        destWhole.Value().count = 0;
+        destWhole.whole = value.whole.Exchange(destWhole.whole);
+        if (destWhole.Value().ptr != NULL && destWhole.Value().count != 0) 
+            destWhole.Value().ptr->refCount += destWhole.Value().count;
+        dest.SetValueIgnoringRefCounts(destWhole.Value().ptr);
+        return dest; 
+    }
+    
+    CountedPtr<T> & Exchange(CountedPtr<T> &dest, T *source)
+    { 
+        dest = source;
+        return ExchangeInPlace(dest);
+    }
+    
+    bool CompareExchange(CountedPtr<T> &dest, T *exchange, T * comparend)
+    { 
+        CountedPtr<T> holdExchange(exchange);
+retry:
+        AtomicPtrWithCount<T>::SimpleUnionType comp;
+        if (LoadValue(dest,comp.Value().count) != comparend) return false;
+        comp.Value().ptr = dest;
+        AtomicPtrWithCount<T>::SimpleUnionType exch;
+        exch.Value().ptr=exchange;
+        exch.Value().count = 0;
+        AtomicPtrWithCount<T>::SimpleUnionType ret;
+        for (;;){
+            ret.whole = value.whole.CompareExchange(exch.whole,comp.whole);
+            if (ret.whole == comp.whole) {
+                //transfer increment from holdExchange to this
+                holdExchange.SetValueIgnoringRefCounts(NULL);
+                //had inc from Load and the one from this 
+                if (dest) {
+                    const int dec = 1-comp.Value().count;
+                    if (dec!=0) dest->refCount -= dec;
+                }
+                return true;
+            }
+            if (ret.Value().ptr != comp.Value().ptr) {
+                //cant return the new pointer because there's no
+                //reason to think it hasn't been collected already
+                goto retry;
+            }
+            comp.Value().count = ret.Value().count;
+        }
+    }
+    
+    bool SetIfEqual(T *exchange, T * comparend)
+    { 
+        CountedPtr<T> holdExchange(exchange);
+retry:
+        AtomicPtrWithCount<T>::SimpleUnionType comp;
+        comp.whole = value.whole;
+        if (comp.Value().ptr != comparend) return false;
+        AtomicPtrWithCount<T>::SimpleUnionType exch;
+        exch.Value().ptr=exchange;
+        exch.Value().count = 0;
+        AtomicPtrWithCount<T>::SimpleUnionType ret;
+        for (;;){
+            ret.whole = value.whole.CompareExchange(exch.whole,comp.whole);
+            if (ret.whole == comp.whole) {
+                if (comp.Value().ptr) {
+                    const int dec = 1-comp.Value().count;
+                    if (dec!=0 && 0==(comp.Value().ptr->refCount -= dec)){
+                        delete comp.Value().ptr;
+                    };
+                }
+                //transfer increment from holdExchange to this
+                holdExchange.SetValueIgnoringRefCounts(NULL);
+                return true;
+            }
+            if (ret.Value().ptr != comp.Value().ptr) {
+                return false;
+            }
+            comp.Value().count = ret.Value().count;
+        }
+    }
+    
+    void operator = (const T *ptr)
+    {
+        CountedPtr<T> dest(ptr);
+        ExchangeInPlace(dest);
+    }
+    
+    //not recommended because value won't be consistant throughout 
+    //a given expression
+    operator bool() const
+    { return value.Value().ptr!=NULL; }
+    
+    //not recommended because value won't be consistant throughout 
+    //a given expression
+    bool operator !() const
+    { return value.Value().ptr==NULL; }
+    
+    
+    AtomicCountedPtr()
+    {}
+    
+    ~AtomicCountedPtr()
+    {
+        *this = (T*)NULL;
+    }
+};
+
+class MPQueueBase
+{
+    AtomicUInt * data;
+    int len;
+    
+    struct AtomicHeadAndTail{
+        AtomicInt head;
+        AtomicInt tail;
+    };
+    
+    AtomicUnion<AtomicHeadAndTail> headAndTail;
+    
+    struct HeadAndTailStruct{
+        int head;
+        int tail;
+    };
+    union HeadAndTailUnion
+    {
+        HeadAndTailStruct value;
+        unsigned __int64 whole;
+    };
+    
+    AtomicUInt & Index(int i)
+    {
+        return data[i & (len-1)];
+    }
+    bool IsNil(int i)
+    {
+        return (i & 1) != 0;
+    }
+    
+    public:
+        
+        int Used() const
+        {
+            HeadAndTailUnion ht;
+            ht.whole = headAndTail.whole;
+            return ht.value.head-ht.value.tail;
+            
+        }
+        bool Empty() const
+        {
+            HeadAndTailUnion ht;
+            ht.whole = headAndTail.whole;
+            return ht.value.head==ht.value.tail;
+        }
+        int Available() const
+        {
+            return MaxLen()-Used();
+            
+        }
+        int MaxLen() const
+        {
+            return len;
+        }
+        
+        MPQueueBase(int lenLn2)
+            :len(1<<lenLn2)
+        {
+            headAndTail.whole = 0;
+            data = new AtomicUInt[len];
+            for (int i=0;i<len;++i) data[i] = 1;
+        }
+        
+        ~MPQueueBase()
+        {
+            delete [] data;
+        }
+        
+        bool Put(int v)
+        {
+            assert((v&1)==0);
+            for(;;){
+                HeadAndTailUnion ht;
+                ht.whole = headAndTail.whole;
+                if (ht.value.head-ht.value.tail >= len) return false;
+                
+                int wasThere = Index(ht.value.head);
+                
+                if (IsNil(wasThere)){
+                    if (Index(ht.value.head).SetIfEqual(v,wasThere)){
+                        headAndTail.Value().head.SetIfEqual(1+ht.value.head,ht.value.head);
+                        return true;
+                    }
+                }
+                headAndTail.Value().head.SetIfEqual(1+ht.value.head,ht.value.head);
+            }
+        }
+        int Get()
+        {
+            for(;;){
+                HeadAndTailUnion ht;
+                ht.whole = headAndTail.whole;
+                if (ht.value.head-ht.value.tail < 1) return 0;
+                
+                int wasThere = Index(ht.value.tail);
+                int newNil = (ht.value.tail|1);
+                
+                if (!IsNil(wasThere)){
+                    if (Index(ht.value.tail).SetIfEqual(newNil,wasThere)){
+                        headAndTail.Value().tail.SetIfEqual(1+ht.value.tail,ht.value.tail);
+                        return wasThere;
+                    }
+                }
+                headAndTail.Value().tail.SetIfEqual(1+ht.value.tail,ht.value.tail);
+            }
+        }
+};
+
+template <typename T>
+class MPQueue 
+{
+    MPQueueBase queue;
+public:
+    MPQueue(int lenLn2)
+        :queue(lenLn2)
+    {}
+    T *Get()
+    {
+        return (T*)queue.Get();
+    }
+    bool Put(T * v)
+    {
+        return queue.Put((int)v);
+    }
+    bool Empty() const
+    {
+        return queue.Empty();
+    }
+    int Used() const
+    {
+        return queue.Used();
+        
+    }
+    int Available() const
+    {
+        return queue.Available();
+        
+    }
+    int MaxLen() const
+    {
+        return queue.MaxLen();
+    }
+};
+
+class QueueBase
+{
+    unsigned * data;
+    int len;
+    
+    int head;
+    int tail;
+    
+    unsigned & Index(int i)
+    {
+        return data[i & (len-1)];
+    }
+    
+public:
+    
+    int Used() const
+    {
+        return head-tail;
+        
+    }
+    bool Empty() const
+    {
+        return head==tail;
+        
+    }
+    
+    int Available() const
+    {
+        return MaxLen()-Used();
+        
+    }
+    int MaxLen() const
+    {
+        return len;
+    }
+    
+    QueueBase(int lenLn2)
+        :len(1<<lenLn2)
+        ,head(0)
+        ,tail(0)
+    {
+        data = new unsigned[len];
+        for (int i=0;i<len;++i) data[i] = 1;
+    }
+    
+    ~QueueBase()
+    {
+        delete [] data;
+    }
+    
+    bool Put(int v)
+    {
+        if (Available() < 1) return false;
+        Index(head++) = v;
+        return true;
+    }
+    
+    int Get()
+    {
+        if (Used() < 1) return 0;
+        return Index(tail++);
+    }
+};
+template <typename T>
+class Queue 
+{
+    QueueBase queue;
+public:
+    Queue(int lenLn2)
+        :queue(lenLn2)
+    {}
+    T *Get()
+    {
+        return (T*)queue.Get();
+    }
+    bool Put(T * v)
+    {
+        return queue.Put((int)v);
+    }
+    bool Empty() const
+    {
+        return queue.Empty();
+    }
+    int Used() const
+    {
+        return queue.Used();
+        
+    }
+    int Available() const
+    {
+        return queue.Available();
+        
+    }
+    int MaxLen() const
+    {
+        return queue.MaxLen();
+    }
+};
+
+
+#endif
diff --git a/lib/base/cgi.html b/lib/base/cgi.html
new file mode 100644
index 000000000..dded002bc
--- /dev/null
+++ b/lib/base/cgi.html
@@ -0,0 +1,486 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<!--  This file is generated by Nimrod. -->
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+<title>Module cgi</title>
+<style type="text/css">
+
+span.DecNumber {color: blue}
+span.BinNumber {color: blue}
+span.HexNumber {color: blue}
+span.OctNumber {color: blue}
+span.FloatNumber {color: blue}
+span.Identifier  {color: black}
+span.Keyword {font-weight: bold}
+span.StringLit {color: blue}
+span.LongStringLit {color: blue}
+span.CharLit {color: blue}
+span.EscapeSequence {color: black}
+span.Operator {color: black}
+span.Punctation {color: black}
+span.Comment, span.LongComment {font-style:italic; color: green}
+span.RegularExpression  {color: pink}
+span.TagStart {color: yellow}
+span.TagEnd {color: yellow}
+span.Key  {color: blue}
+span.Value  {color: black}
+span.RawData {color: blue}
+span.Assembler  {color: blue}
+span.Preprocessor {color: yellow}
+span.Directive  {color: yellow}
+span.Command, span.Rule, span.Hyperlink, span.Label, span.Reference, 
+span.Other  {color: black}
+
+div.navigation {
+  float: left; 
+  width: 27%;  //25em;
+  margin: 0; padding: 0; /*
+  border: 1px dashed gold; */
+  outline: 3px outset #7F7F7F; //#99ff99; //gold;
+  background-color: #7F7F7F;
+}
+
+div.navigation ul {list-style-type: none;}
+div.navigation ul li a, div.navigation ul li a:visited {
+  font-weight: bold;
+  color: #FFFFFF; // #CC0000;
+  text-decoration: none;
+}
+div.navigation ul li a:hover {
+  font-weight: bold;
+  text-decoration: none;
+  /*outline: 2px outset #7F7F7F;*/
+  color: gold;
+  /* background-color: #FFFFFF; // #1A1A1A; // #779977;*/
+}
+
+div.content {
+  margin-left: 27%; // 25em;
+  padding: 0 1em; 
+  /*border: 1px dashed #1A1A1A;*/
+  min-width: 16em;
+}
+
+dl.item dd, dl.item dd p {
+  margin-top:3px;
+}
+dl.item dd pre {
+  margin-left: 15pt;
+  border: 0px;
+}
+dl.item dt, dl.item dt pre {
+  margin:  20pt 0 0 0;
+}
+
+pre, span.tok {
+  background-color:#F9F9F9;
+  border:1px dotted #2F6FAB;
+  color:black;
+}
+
+/*
+:Author: David Goodger
+:Contact: goodger@python.org
+:Date: Date: 2006-05-21 22:44:42 +0200 (Sun, 21 May 2006)
+:Revision: Revision: 4564
+:Copyright: This stylesheet has been placed in the public domain.
+
+Default cascading style sheet for the HTML output of Docutils.
+
+See http://docutils.sf.net/docs/howto/html-stylesheets.html for how to
+customize this style sheet.
+*/
+/* used to remove borders from tables and images */
+.borderless, table.borderless td, table.borderless th { border: 0 }
+
+table.borderless td, table.borderless th {
+  /* Override padding for "table.docutils td" with "! important".
+     The right padding separates the table cells. */
+  padding: 0 0.5em 0 0 ! important }
+
+.first { margin-top: 0 ! important }
+.last, .with-subtitle { margin-bottom: 0 ! important }
+.hidden { display: none }
+a.toc-backref { text-decoration: none ; color: black }
+blockquote.epigraph { margin: 2em 5em ; }
+dl.docutils dd { margin-bottom: 0.5em }
+div.abstract { margin: 2em 5em }
+div.abstract p.topic-title { font-weight: bold ; text-align: center }
+div.admonition, div.attention, div.caution, div.danger, div.error,
+div.hint, div.important, div.note, div.tip, div.warning {
+  margin: 2em ; border: medium outset ; padding: 1em }
+div.admonition p.admonition-title, div.hint p.admonition-title,
+div.important p.admonition-title, div.note p.admonition-title,
+div.tip p.admonition-title { font-weight: bold ; font-family: sans-serif }
+
+div.attention p.admonition-title, div.caution p.admonition-title,
+div.danger p.admonition-title, div.error p.admonition-title,
+div.warning p.admonition-title { color: red ; font-weight: bold ;
+  font-family: sans-serif }
+
+/* Uncomment (and remove this text!) to get reduced vertical space in
+   compound paragraphs.
+div.compound .compound-first, div.compound .compound-middle {
+  margin-bottom: 0.5em }
+
+div.compound .compound-last, div.compound .compound-middle {
+  margin-top: 0.5em }
+*/
+
+div.dedication { margin: 2em 5em ; text-align: center ; font-style: italic }
+div.dedication p.topic-title { font-weight: bold ; font-style: normal }
+div.figure { margin-left: 2em ; margin-right: 2em }
+div.footer, div.header { clear: both; font-size: smaller }
+div.line-block { display: block ; margin-top: 1em ; margin-bottom: 1em }
+div.line-block div.line-block { margin-top: 0 ; margin-bottom: 0 ;
+  margin-left: 1.5em }
+div.sidebar { margin-left: 1em ; border: medium outset ;
+  padding: 1em ; background-color: #ffffee ; width: 40% ; float: right ;
+  clear: right }
+
+div.sidebar p.rubric { font-family: sans-serif ; font-size: medium }
+div.system-messages { margin: 5em }
+div.system-messages h1 { color: red }
+div.system-message { border: medium outset ; padding: 1em }
+div.system-message p.system-message-title { color: red ; font-weight: bold }
+div.topic { margin: 2em;}
+h1.section-subtitle, h2.section-subtitle, h3.section-subtitle,
+h4.section-subtitle, h5.section-subtitle, h6.section-subtitle {
+  margin-top: 0.4em }
+h1.title { text-align: center }
+h2.subtitle { text-align: center }
+hr.docutils { width: 75% }
+img.align-left { clear: left }
+img.align-right { clear: right }
+ol.simple, ul.simple { margin-bottom: 1em }
+ol.arabic { list-style: decimal }
+ol.loweralpha { list-style: lower-alpha }
+ol.upperalpha { list-style: upper-alpha }
+ol.lowerroman { list-style: lower-roman }
+ol.upperroman { list-style: upper-roman }
+p.attribution { text-align: right ; margin-left: 50% }
+p.caption { font-style: italic }
+p.credits { font-style: italic ; font-size: smaller }
+p.label { white-space: nowrap }
+p.rubric { font-weight:bold;font-size:larger;color:maroon;text-align:center}
+p.sidebar-title {font-family: sans-serif ;font-weight: bold ;font-size: larger }
+p.sidebar-subtitle {font-family: sans-serif ; font-weight: bold }
+p.topic-title { font-weight: bold }
+pre.address { margin-bottom: 0;margin-top:0;font-family:serif;font-size:100% }
+pre.literal-block, pre.doctest-block {margin-left: 2em ;margin-right: 2em }
+span.classifier {font-family: sans-serif;font-style: oblique }
+span.classifier-delimiter {font-family: sans-serif;font-weight: bold }
+span.interpreted {font-family: sans-serif }
+span.option {white-space: nowrap }
+span.pre {white-space: pre }
+span.problematic {color: red }
+span.section-subtitle {
+  /* font-size relative to parent (h1..h6 element) */
+  font-size: 80% }
+
+table.citation { border-left: solid 1px gray; margin-left: 1px }
+table.docinfo {margin: 2em 4em }
+table.docutils {margin-top: 0.5em;margin-bottom: 0.5em }
+table.footnote {border-left: solid 1px black;margin-left: 1px }
+
+table.docutils td, table.docutils th,
+table.docinfo td, table.docinfo th {padding-left: 0.5em;padding-right: 0.5em;
+  vertical-align: top}
+
+table.docutils th.field-name, table.docinfo th.docinfo-name {
+  font-weight: bold;text-align: left;white-space: nowrap;padding-left: 0 }
+h1 tt.docutils, h2 tt.docutils, h3 tt.docutils,
+h4 tt.docutils, h5 tt.docutils, h6 tt.docutils {font-size: 100% }
+ul.auto-toc { list-style-type: none }
+/*a.reference { color: #E00000; font-weight:bold;}
+a.reference:hover {color: #E00000;background-color: #ffff00;display: margin;
+  font-weight:bold;}*/
+
+</style>
+<script type="text/javascript">
+  //<![CDATA[
+    function toggleElem(id) {
+      var e = document.getElementById(id);
+      e.style.display = e.style.display == 'none' ? 'block' : 'none';
+    }
+
+    var gOpen = 'none'
+    function toggleAll() {
+      gOpen = gOpen == 'none' ? 'block' : 'none';
+      var i = 1
+      while (1) {
+        var e = document.getElementById("m"+i)
+        if (!e) break;
+        e.style.display = gOpen
+        i++;
+      }
+      document.getElementById('toggleButton').value =
+        gOpen == 'none' ? 'Show Details' : 'Hide Details';
+    }
+  //]]>
+</script>
+
+</head>
+<body>
+<div class="document" id="documentId">
+<h1 class="title">Module cgi</h1>
+<div class="navigation">
+<p class="topic-title first">Navigation</p>
+<ul class="simple">
+<li>
+  <a class="reference" href="#6" id="56">Types</a>
+  <ul class="simple">
+      <li><a class="reference" href="#103">ECgi</a></li>
+  <li><a class="reference" href="#104">TRequestMethod</a></li>
+
+  </ul>
+</li>
+<li>
+  <a class="reference" href="#9" id="59">Procs</a>
+  <ul class="simple">
+      <li><a class="reference" href="#101">URLencode</a></li>
+  <li><a class="reference" href="#102">URLdecode</a></li>
+  <li><a class="reference" href="#105">readData</a></li>
+  <li><a class="reference" href="#106">validateData</a></li>
+  <li><a class="reference" href="#107">getContentLength</a></li>
+  <li><a class="reference" href="#108">getContentType</a></li>
+  <li><a class="reference" href="#109">getDocumentRoot</a></li>
+  <li><a class="reference" href="#110">getGatewayInterface</a></li>
+  <li><a class="reference" href="#111">getHttpAccept</a></li>
+  <li><a class="reference" href="#112">getHttpAcceptCharset</a></li>
+  <li><a class="reference" href="#113">getHttpAccept Encoding</a></li>
+  <li><a class="reference" href="#114">getHttpAccept Language</a></li>
+  <li><a class="reference" href="#115">getHttpConnection</a></li>
+  <li><a class="reference" href="#116">getHttpCookie</a></li>
+  <li><a class="reference" href="#117">getHttpHost</a></li>
+  <li><a class="reference" href="#118">getHttpReferer</a></li>
+  <li><a class="reference" href="#119">getHttpUserAgent</a></li>
+  <li><a class="reference" href="#120">getPathInfo</a></li>
+  <li><a class="reference" href="#121">getPathTranslated</a></li>
+  <li><a class="reference" href="#122">getQueryString</a></li>
+  <li><a class="reference" href="#123">getRemoteAddr</a></li>
+  <li><a class="reference" href="#124">getRemoteHost</a></li>
+  <li><a class="reference" href="#125">getRemoteIdent</a></li>
+  <li><a class="reference" href="#126">getRemotePort</a></li>
+  <li><a class="reference" href="#127">getRemoteUser</a></li>
+  <li><a class="reference" href="#128">getRequestMethod</a></li>
+  <li><a class="reference" href="#129">getRequestURI</a></li>
+  <li><a class="reference" href="#130">getScriptFilename</a></li>
+  <li><a class="reference" href="#131">getScriptName</a></li>
+  <li><a class="reference" href="#132">getServerAddr</a></li>
+  <li><a class="reference" href="#133">getServerAdmin</a></li>
+  <li><a class="reference" href="#134">getServerName</a></li>
+  <li><a class="reference" href="#135">getServerPort</a></li>
+  <li><a class="reference" href="#136">getServerProtocol</a></li>
+  <li><a class="reference" href="#137">getServerSignature</a></li>
+  <li><a class="reference" href="#138">getServerSoftware</a></li>
+  <li><a class="reference" href="#139">setTestData</a></li>
+  <li><a class="reference" href="#140">writeContentType</a></li>
+
+  </ul>
+</li>
+
+</ul>
+</div>
+<div class="content">
+This module implements helper procs for CGI applictions. Example:<pre>
+<span class="Keyword">import</span> <span class="Identifier">strtabs</span><span class="Punctation">,</span> <span class="Identifier">cgi</span>
+
+<span class="Comment"># Fill the values when debugging:</span>
+<span class="Keyword">when</span> <span class="Identifier">debug</span><span class="Punctation">:</span>
+  <span class="Identifier">setTestData</span><span class="Punctation">(</span><span class="StringLit">&quot;name&quot;</span><span class="Punctation">,</span> <span class="StringLit">&quot;Klaus&quot;</span><span class="Punctation">,</span> <span class="StringLit">&quot;password&quot;</span><span class="Punctation">,</span> <span class="StringLit">&quot;123456&quot;</span><span class="Punctation">)</span>
+<span class="Comment"># read the data into `myData`</span>
+<span class="Keyword">var</span> <span class="Identifier">myData</span> <span class="Operator">=</span> <span class="Identifier">readData</span><span class="Punctation">(</span><span class="Punctation">)</span>
+<span class="Comment"># check that the data's variable names are &quot;name&quot; or &quot;passwort&quot;</span>
+<span class="Identifier">validateData</span><span class="Punctation">(</span><span class="Identifier">myData</span><span class="Punctation">,</span> <span class="StringLit">&quot;name&quot;</span><span class="Punctation">,</span> <span class="StringLit">&quot;password&quot;</span><span class="Punctation">)</span>
+<span class="Comment"># start generating content:</span>
+<span class="Identifier">writeContentType</span><span class="Punctation">(</span><span class="Punctation">)</span>
+<span class="Comment"># generate content:</span>
+<span class="Identifier">write</span><span class="Punctation">(</span><span class="Identifier">stdout</span><span class="Punctation">,</span> <span class="StringLit">&quot;&lt;!DOCTYPE HTML PUBLIC </span><span class="EscapeSequence">\&quot;</span>-//W3C//DTD HTML 4.01//EN<span class="EscapeSequence">\&quot;</span><span class="EscapeSequence">&gt;\n</span><span class="StringLit">&quot;</span><span class="Punctation">)</span>
+<span class="Identifier">write</span><span class="Punctation">(</span><span class="Identifier">stdout</span><span class="Punctation">,</span> <span class="StringLit">&quot;&lt;html&gt;&lt;head&gt;&lt;title&gt;Test&lt;/title&gt;&lt;/head&gt;&lt;body&gt;</span><span class="EscapeSequence">\n</span><span class="StringLit">&quot;</span><span class="Punctation">)</span>
+<span class="Identifier">writeln</span><span class="Punctation">(</span><span class="Identifier">stdout</span><span class="Punctation">,</span> <span class="StringLit">&quot;your name: &quot;</span> <span class="Operator">&amp;</span> <span class="Identifier">myData</span><span class="Punctation">[</span><span class="StringLit">&quot;name&quot;</span><span class="Punctation">]</span><span class="Punctation">)</span>
+<span class="Identifier">writeln</span><span class="Punctation">(</span><span class="Identifier">stdout</span><span class="Punctation">,</span> <span class="StringLit">&quot;your password: &quot;</span> <span class="Operator">&amp;</span> <span class="Identifier">myData</span><span class="Punctation">[</span><span class="StringLit">&quot;password&quot;</span><span class="Punctation">]</span><span class="Punctation">)</span>
+<span class="Identifier">writeln</span><span class="Punctation">(</span><span class="Identifier">stdout</span><span class="Punctation">,</span> <span class="StringLit">&quot;&lt;/body&gt;&lt;/html&gt;&quot;</span><span class="Punctation">)</span></pre>
+<div class="section" id="6">
+<h1><a class="toc-backref" href="#56">Types</a></h1>
+<dl class="item">
+<dt id="103"><pre><span class="Identifier">ECgi</span><span class="Operator">*</span> <span class="Other">=</span> <span class="Keyword">object</span> <span class="Keyword">of</span> <span class="Identifier">EIO</span></pre></dt>
+<dd>
+the exception that is raised, if a CGI error occurs
+</dd>
+<dt id="104"><pre><span class="Identifier">TRequestMethod</span><span class="Operator">*</span> <span class="Other">=</span> <span class="Keyword">enum</span> 
+  <span class="Identifier">methodPost</span><span class="Other">,</span>                 <span class="Comment">## query uses the POST method</span>
+  <span class="Identifier">methodGet</span>                   <span class="Comment">## query uses the GET method</span></pre></dt>
+<dd>
+the used request method
+</dd>
+
+</dl></div>
+<div class="section" id="9">
+<h1><a class="toc-backref" href="#59">Procs</a></h1>
+<dl class="item">
+<dt id="101"><pre><span class="Keyword">proc</span> <span class="Identifier">URLencode</span><span class="Operator">*</span><span class="Other">(</span><span class="Identifier">s</span><span class="Other">:</span> <span class="Identifier">string</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">string</span></pre></dt>
+<dd>
+Encodes a value to be HTTP safe: This means that characters in the set <tt class="docutils literal"><span class="pre">{'A'..'Z', 'a'..'z', '0'..'9', '_'}</span></tt> are carried over to the result, a space is converted to <tt class="docutils literal"><span class="pre">'+'</span></tt> and every other character is encoded as <tt class="docutils literal"><span class="pre">'%xx'</span></tt> where <tt class="docutils literal"><span class="pre">xx</span></tt> denotes its hexadecimal value. 
+</dd>
+<dt id="102"><pre><span class="Keyword">proc</span> <span class="Identifier">URLdecode</span><span class="Operator">*</span><span class="Other">(</span><span class="Identifier">s</span><span class="Other">:</span> <span class="Identifier">string</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">string</span></pre></dt>
+<dd>
+Decodes a value from its HTTP representation: This means that a <tt class="docutils literal"><span class="pre">'+'</span></tt> is converted to a space, <tt class="docutils literal"><span class="pre">'%xx'</span></tt> (where <tt class="docutils literal"><span class="pre">xx</span></tt> denotes a hexadecimal value) is converted to the character with ordinal number <tt class="docutils literal"><span class="pre">xx</span></tt>, and and every other character is carried over. 
+</dd>
+<dt id="105"><pre><span class="Keyword">proc</span> <span class="Identifier">readData</span><span class="Operator">*</span><span class="Other">(</span><span class="Identifier">allowedMethods</span><span class="Other">:</span> <span class="Identifier">set</span><span class="Other">[</span><span class="Identifier">TRequestMethod</span><span class="Other">]</span> <span class="Other">=</span> <span class="Other">{</span><span class="Identifier">methodPost</span><span class="Other">,</span> <span class="Identifier">methodGet</span><span class="Other">}</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">PStringTable</span></pre></dt>
+<dd>
+Read CGI data. If the client does not use a method listed in the <cite>allowedMethods</cite> set, an <cite>ECgi</cite> exception is raised.
+</dd>
+<dt id="106"><pre><span class="Keyword">proc</span> <span class="Identifier">validateData</span><span class="Operator">*</span><span class="Other">(</span><span class="Identifier">data</span><span class="Other">:</span> <span class="Identifier">PStringTable</span><span class="Other">,</span> <span class="Identifier">validKeys</span><span class="Other">:</span> <span class="Identifier">openarray</span><span class="Other">[</span><span class="Identifier">string</span><span class="Other">]</span><span class="Other">)</span></pre></dt>
+<dd>
+validates data; raises <cite>ECgi</cite> if this fails. This checks that each variable name of the CGI <cite>data</cite> occurs in the <cite>validKeys</cite> array.
+</dd>
+<dt id="107"><pre><span class="Keyword">proc</span> <span class="Identifier">getContentLength</span><span class="Operator">*</span><span class="Other">(</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">string</span></pre></dt>
+<dd>
+returns contents of the <tt class="docutils literal"><span class="pre">CONTENT_LENGTH</span></tt> environment variable
+</dd>
+<dt id="108"><pre><span class="Keyword">proc</span> <span class="Identifier">getContentType</span><span class="Operator">*</span><span class="Other">(</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">string</span></pre></dt>
+<dd>
+returns contents of the <tt class="docutils literal"><span class="pre">CONTENT_TYPE</span></tt> environment variable
+</dd>
+<dt id="109"><pre><span class="Keyword">proc</span> <span class="Identifier">getDocumentRoot</span><span class="Operator">*</span><span class="Other">(</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">string</span></pre></dt>
+<dd>
+returns contents of the <tt class="docutils literal"><span class="pre">DOCUMENT_ROOT</span></tt> environment variable
+</dd>
+<dt id="110"><pre><span class="Keyword">proc</span> <span class="Identifier">getGatewayInterface</span><span class="Operator">*</span><span class="Other">(</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">string</span></pre></dt>
+<dd>
+returns contents of the <tt class="docutils literal"><span class="pre">GATEWAY_INTERFACE</span></tt> environment variable
+</dd>
+<dt id="111"><pre><span class="Keyword">proc</span> <span class="Identifier">getHttpAccept</span><span class="Operator">*</span><span class="Other">(</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">string</span></pre></dt>
+<dd>
+returns contents of the <tt class="docutils literal"><span class="pre">HTTP_ACCEPT</span></tt> environment variable
+</dd>
+<dt id="112"><pre><span class="Keyword">proc</span> <span class="Identifier">getHttpAcceptCharset</span><span class="Operator">*</span><span class="Other">(</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">string</span></pre></dt>
+<dd>
+returns contents of the <tt class="docutils literal"><span class="pre">HTTP_ACCEPT_CHARSET</span></tt> environment variable
+</dd>
+<dt id="113"><pre><span class="Keyword">proc</span> <span class="Identifier">getHttpAcceptEncoding</span><span class="Operator">*</span><span class="Other">(</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">string</span></pre></dt>
+<dd>
+returns contents of the <tt class="docutils literal"><span class="pre">HTTP_ACCEPT_ENCODING</span></tt> environment variable
+</dd>
+<dt id="114"><pre><span class="Keyword">proc</span> <span class="Identifier">getHttpAcceptLanguage</span><span class="Operator">*</span><span class="Other">(</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">string</span></pre></dt>
+<dd>
+returns contents of the <tt class="docutils literal"><span class="pre">HTTP_ACCEPT_LANGUAGE</span></tt> environment variable
+</dd>
+<dt id="115"><pre><span class="Keyword">proc</span> <span class="Identifier">getHttpConnection</span><span class="Operator">*</span><span class="Other">(</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">string</span></pre></dt>
+<dd>
+returns contents of the <tt class="docutils literal"><span class="pre">HTTP_CONNECTION</span></tt> environment variable
+</dd>
+<dt id="116"><pre><span class="Keyword">proc</span> <span class="Identifier">getHttpCookie</span><span class="Operator">*</span><span class="Other">(</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">string</span></pre></dt>
+<dd>
+returns contents of the <tt class="docutils literal"><span class="pre">HTTP_COOKIE</span></tt> environment variable
+</dd>
+<dt id="117"><pre><span class="Keyword">proc</span> <span class="Identifier">getHttpHost</span><span class="Operator">*</span><span class="Other">(</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">string</span></pre></dt>
+<dd>
+returns contents of the <tt class="docutils literal"><span class="pre">HTTP_HOST</span></tt> environment variable
+</dd>
+<dt id="118"><pre><span class="Keyword">proc</span> <span class="Identifier">getHttpReferer</span><span class="Operator">*</span><span class="Other">(</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">string</span></pre></dt>
+<dd>
+returns contents of the <tt class="docutils literal"><span class="pre">HTTP_REFERER</span></tt> environment variable
+</dd>
+<dt id="119"><pre><span class="Keyword">proc</span> <span class="Identifier">getHttpUserAgent</span><span class="Operator">*</span><span class="Other">(</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">string</span></pre></dt>
+<dd>
+returns contents of the <tt class="docutils literal"><span class="pre">HTTP_USER_AGENT</span></tt> environment variable
+</dd>
+<dt id="120"><pre><span class="Keyword">proc</span> <span class="Identifier">getPathInfo</span><span class="Operator">*</span><span class="Other">(</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">string</span></pre></dt>
+<dd>
+returns contents of the <tt class="docutils literal"><span class="pre">PATH_INFO</span></tt> environment variable
+</dd>
+<dt id="121"><pre><span class="Keyword">proc</span> <span class="Identifier">getPathTranslated</span><span class="Operator">*</span><span class="Other">(</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">string</span></pre></dt>
+<dd>
+returns contents of the <tt class="docutils literal"><span class="pre">PATH_TRANSLATED</span></tt> environment variable
+</dd>
+<dt id="122"><pre><span class="Keyword">proc</span> <span class="Identifier">getQueryString</span><span class="Operator">*</span><span class="Other">(</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">string</span></pre></dt>
+<dd>
+returns contents of the <tt class="docutils literal"><span class="pre">QUERY_STRING</span></tt> environment variable
+</dd>
+<dt id="123"><pre><span class="Keyword">proc</span> <span class="Identifier">getRemoteAddr</span><span class="Operator">*</span><span class="Other">(</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">string</span></pre></dt>
+<dd>
+returns contents of the <tt class="docutils literal"><span class="pre">REMOTE_ADDR</span></tt> environment variable
+</dd>
+<dt id="124"><pre><span class="Keyword">proc</span> <span class="Identifier">getRemoteHost</span><span class="Operator">*</span><span class="Other">(</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">string</span></pre></dt>
+<dd>
+returns contents of the <tt class="docutils literal"><span class="pre">REMOTE_HOST</span></tt> environment variable
+</dd>
+<dt id="125"><pre><span class="Keyword">proc</span> <span class="Identifier">getRemoteIdent</span><span class="Operator">*</span><span class="Other">(</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">string</span></pre></dt>
+<dd>
+returns contents of the <tt class="docutils literal"><span class="pre">REMOTE_IDENT</span></tt> environment variable
+</dd>
+<dt id="126"><pre><span class="Keyword">proc</span> <span class="Identifier">getRemotePort</span><span class="Operator">*</span><span class="Other">(</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">string</span></pre></dt>
+<dd>
+returns contents of the <tt class="docutils literal"><span class="pre">REMOTE_PORT</span></tt> environment variable
+</dd>
+<dt id="127"><pre><span class="Keyword">proc</span> <span class="Identifier">getRemoteUser</span><span class="Operator">*</span><span class="Other">(</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">string</span></pre></dt>
+<dd>
+returns contents of the <tt class="docutils literal"><span class="pre">REMOTE_USER</span></tt> environment variable
+</dd>
+<dt id="128"><pre><span class="Keyword">proc</span> <span class="Identifier">getRequestMethod</span><span class="Operator">*</span><span class="Other">(</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">string</span></pre></dt>
+<dd>
+returns contents of the <tt class="docutils literal"><span class="pre">REQUEST_METHOD</span></tt> environment variable
+</dd>
+<dt id="129"><pre><span class="Keyword">proc</span> <span class="Identifier">getRequestURI</span><span class="Operator">*</span><span class="Other">(</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">string</span></pre></dt>
+<dd>
+returns contents of the <tt class="docutils literal"><span class="pre">REQUEST_URI</span></tt> environment variable
+</dd>
+<dt id="130"><pre><span class="Keyword">proc</span> <span class="Identifier">getScriptFilename</span><span class="Operator">*</span><span class="Other">(</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">string</span></pre></dt>
+<dd>
+returns contents of the <tt class="docutils literal"><span class="pre">SCRIPT_FILENAME</span></tt> environment variable
+</dd>
+<dt id="131"><pre><span class="Keyword">proc</span> <span class="Identifier">getScriptName</span><span class="Operator">*</span><span class="Other">(</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">string</span></pre></dt>
+<dd>
+returns contents of the <tt class="docutils literal"><span class="pre">SCRIPT_NAME</span></tt> environment variable
+</dd>
+<dt id="132"><pre><span class="Keyword">proc</span> <span class="Identifier">getServerAddr</span><span class="Operator">*</span><span class="Other">(</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">string</span></pre></dt>
+<dd>
+returns contents of the <tt class="docutils literal"><span class="pre">SERVER_ADDR</span></tt> environment variable
+</dd>
+<dt id="133"><pre><span class="Keyword">proc</span> <span class="Identifier">getServerAdmin</span><span class="Operator">*</span><span class="Other">(</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">string</span></pre></dt>
+<dd>
+returns contents of the <tt class="docutils literal"><span class="pre">SERVER_ADMIN</span></tt> environment variable
+</dd>
+<dt id="134"><pre><span class="Keyword">proc</span> <span class="Identifier">getServerName</span><span class="Operator">*</span><span class="Other">(</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">string</span></pre></dt>
+<dd>
+returns contents of the <tt class="docutils literal"><span class="pre">SERVER_NAME</span></tt> environment variable
+</dd>
+<dt id="135"><pre><span class="Keyword">proc</span> <span class="Identifier">getServerPort</span><span class="Operator">*</span><span class="Other">(</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">string</span></pre></dt>
+<dd>
+returns contents of the <tt class="docutils literal"><span class="pre">SERVER_PORT</span></tt> environment variable
+</dd>
+<dt id="136"><pre><span class="Keyword">proc</span> <span class="Identifier">getServerProtocol</span><span class="Operator">*</span><span class="Other">(</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">string</span></pre></dt>
+<dd>
+returns contents of the <tt class="docutils literal"><span class="pre">SERVER_PROTOCOL</span></tt> environment variable
+</dd>
+<dt id="137"><pre><span class="Keyword">proc</span> <span class="Identifier">getServerSignature</span><span class="Operator">*</span><span class="Other">(</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">string</span></pre></dt>
+<dd>
+returns contents of the <tt class="docutils literal"><span class="pre">SERVER_SIGNATURE</span></tt> environment variable
+</dd>
+<dt id="138"><pre><span class="Keyword">proc</span> <span class="Identifier">getServerSoftware</span><span class="Operator">*</span><span class="Other">(</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">string</span></pre></dt>
+<dd>
+returns contents of the <tt class="docutils literal"><span class="pre">SERVER_SOFTWARE</span></tt> environment variable
+</dd>
+<dt id="139"><pre><span class="Keyword">proc</span> <span class="Identifier">setTestData</span><span class="Operator">*</span><span class="Other">(</span><span class="Identifier">keysvalues</span><span class="Other">:</span> <span class="Identifier">openarray</span><span class="Other">[</span><span class="Identifier">string</span><span class="Other">]</span><span class="Other">)</span></pre></dt>
+<dd>
+fills the appropriate environment variables to test your CGI application. This can only simulate the 'GET' 'REQUEST_METHOD'. <cite>keysvalues</cite> should provide embedded (name, value)-pairs. Example:<pre><span class="Identifier">setTestData</span><span class="Punctation">(</span><span class="StringLit">&quot;name&quot;</span><span class="Punctation">,</span> <span class="StringLit">&quot;Hanz&quot;</span><span class="Punctation">,</span> <span class="StringLit">&quot;password&quot;</span><span class="Punctation">,</span> <span class="StringLit">&quot;12345&quot;</span><span class="Punctation">)</span></pre>
+</dd>
+<dt id="140"><pre><span class="Keyword">proc</span> <span class="Identifier">writeContentType</span><span class="Operator">*</span><span class="Other">(</span><span class="Other">)</span></pre></dt>
+<dd>
+call this before starting to send your HTML data to <cite>stdout</cite>. This is just a shorthand for: .. code-block:: Nimrod<blockquote>write(stdout, &quot;Content-type: text/htmlnn&quot;)</blockquote>
+
+</dd>
+
+</dl></div>
+
+</div>
+
+<small>Generated: 2008-12-08 20:29:49 UTC</small>
+</div>
+</body>
+</html>
diff --git a/lib/base/cgi.nim b/lib/base/cgi.nim
new file mode 100644
index 000000000..3ed94c9b7
--- /dev/null
+++ b/lib/base/cgi.nim
@@ -0,0 +1,305 @@
+#
+#
+#            Nimrod's Runtime Library
+#        (c) Copyright 2008 Andreas Rumpf
+#
+#    See the file "copying.txt", included in this
+#    distribution, for details about the copyright.
+#
+
+## This module implements helper procs for CGI applictions. Example:
+## 
+## .. code-block:: Nimrod
+##
+##    import strtabs, cgi
+##
+##    # Fill the values when debugging:
+##    when debug: 
+##      setTestData("name", "Klaus", "password", "123456")
+##    # read the data into `myData`
+##    var myData = readData()
+##    # check that the data's variable names are "name" or "passwort" 
+##    validateData(myData, "name", "password")
+##    # start generating content:
+##    writeContentType()
+##    # generate content:
+##    write(stdout, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\">\n")
+##    write(stdout, "<html><head><title>Test</title></head><body>\n")
+##    writeln(stdout, "your name: " & myData["name"])
+##    writeln(stdout, "your password: " & myData["password"])
+##    writeln(stdout, "</body></html>")
+
+import strutils, os, strtabs
+
+proc URLencode*(s: string): string =
+  ## Encodes a value to be HTTP safe: This means that characters in the set
+  ## ``{'A'..'Z', 'a'..'z', '0'..'9', '_'}`` are carried over to the result,
+  ## a space is converted to ``'+'`` and every other character is encoded as
+  ## ``'%xx'`` where ``xx`` denotes its hexadecimal value. 
+  result = ""
+  for i in 0..s.len-1:
+    case s[i]
+    of 'a'..'z', 'A'..'Z', '0'..'9', '_': add(result, s[i])
+    of ' ': add(result, '+')
+    else: 
+      add(result, '%')
+      add(result, toHex(ord(s[i]), 2))
+
+proc handleHexChar(c: char, x: var int) {.inline.} = 
+  case c
+  of '0'..'9': x = (x shl 4) or (ord(c) - ord('0'))
+  of 'a'..'f': x = (x shl 4) or (ord(c) - ord('a') + 10)
+  of 'A'..'F': x = (x shl 4) or (ord(c) - ord('A') + 10)
+  else: assert(false)
+
+proc URLdecode*(s: string): string = 
+  ## Decodes a value from its HTTP representation: This means that a ``'+'`` 
+  ## is converted to a space, ``'%xx'`` (where ``xx`` denotes a hexadecimal
+  ## value) is converted to the character with ordinal number ``xx``, and  
+  ## and every other character is carried over. 
+  result = ""
+  var i = 0
+  while i < s.len:
+    case s[i]
+    of '%': 
+      var x = 0
+      handleHexChar(s[i+1], x)
+      handleHexChar(s[i+2], x)
+      inc(i, 2)
+      add(result, chr(x))
+    of '+': add(result, ' ')
+    else: add(result, s[i])
+    inc(i)
+
+type
+  ECgi* = object of EIO  ## the exception that is raised, if a CGI error occurs
+  TRequestMethod* = enum ## the used request method
+    methodPost,          ## query uses the POST method
+    methodGet            ## query uses the GET method
+
+proc cgiError(msg: string) {.noreturn.} = 
+  var e: ref ECgi
+  new(e)
+  e.msg = msg
+  raise e
+
+proc readData*(allowedMethods: set[TRequestMethod] = 
+               {methodPost, methodGet}): PStringTable = 
+  ## Read CGI data. If the client does not use a method listed in the
+  ## `allowedMethods` set, an `ECgi` exception is raised.
+  result = newStringTable()
+  var enc: string # encoded data
+  case getenv("REQUEST_METHOD") 
+  of "POST": 
+    if methodPost notin allowedMethods: 
+      cgiError("'REQUEST_METHOD' 'POST' is not supported")
+    # read from stdin:
+    var L = parseInt(getenv("CONTENT_LENGTH"))
+    enc = newString(L)
+    if readBuffer(stdin, addr(enc[0]), L) != L:
+      cgiError("cannot read from stdin")
+  of "GET":
+    if methodGet notin allowedMethods: 
+      cgiError("'REQUEST_METHOD' 'GET' is not supported")
+    # read from the QUERY_STRING environment variable:
+    enc = getenv("QUERY_STRING")
+  else: cgiError("'REQUEST_METHOD' must be 'POST' or 'GET'")
+  
+  # decode everything in one pass:
+  var i = 0
+  var name = ""
+  var value = ""
+  while true:
+    setLen(name, 0) # reuse memory
+    while true:
+      case enc[i]
+      of '\0': return
+      of '%': 
+        var x = 0
+        handleHexChar(enc[i+1], x)
+        handleHexChar(enc[i+2], x)
+        inc(i, 2)
+        add(name, chr(x))
+      of '+': add(name, ' ')
+      of '=', '&': break
+      else: add(name, enc[i])
+      inc(i)
+    if enc[i] != '=': cgiError("'=' expected")
+    inc(i) # skip '='
+    setLen(value, 0) # reuse memory
+    while true:
+      case enc[i]
+      of '\0': return
+      of '%': 
+        var x = 0
+        handleHexChar(enc[i+1], x)
+        handleHexChar(enc[i+2], x)
+        inc(i, 2)
+        add(value, chr(x))
+      of '+': add(value, ' ')
+      of '=', '&': break
+      else: add(value, enc[i])
+      inc(i)
+    if enc[i] != '&': cgiError("'&' expected")
+    inc(i) # skip '='
+    result[name] = value
+
+proc validateData*(data: PStringTable, validKeys: openarray[string]) = 
+  ## validates data; raises `ECgi` if this fails. This checks that each variable
+  ## name of the CGI `data` occurs in the `validKeys` array.
+  for key, val in pairs(data):
+    if find(validKeys, key) < 0: 
+      cgiError("unknown variable name: " & key)
+
+proc getContentLength*(): string =
+  ## returns contents of the ``CONTENT_LENGTH`` environment variable
+  return getenv("CONTENT_LENGTH")
+
+proc getContentType*(): string =
+  ## returns contents of the ``CONTENT_TYPE`` environment variable
+  return getenv("CONTENT_Type")
+
+proc getDocumentRoot*(): string =
+  ## returns contents of the ``DOCUMENT_ROOT`` environment variable
+  return getenv("DOCUMENT_ROOT")
+
+proc getGatewayInterface*(): string =
+  ## returns contents of the ``GATEWAY_INTERFACE`` environment variable
+  return getenv("GATEWAY_INTERFACE")
+
+proc getHttpAccept*(): string =
+  ## returns contents of the ``HTTP_ACCEPT`` environment variable
+  return getenv("HTTP_ACCEPT")
+
+proc getHttpAcceptCharset*(): string =
+  ## returns contents of the ``HTTP_ACCEPT_CHARSET`` environment variable
+  return getenv("HTTP_ACCEPT_CHARSET")
+
+proc getHttpAcceptEncoding*(): string =
+  ## returns contents of the ``HTTP_ACCEPT_ENCODING`` environment variable
+  return getenv("HTTP_ACCEPT_ENCODING")
+
+proc getHttpAcceptLanguage*(): string =
+  ## returns contents of the ``HTTP_ACCEPT_LANGUAGE`` environment variable
+  return getenv("HTTP_ACCEPT_LANGUAGE")
+
+proc getHttpConnection*(): string =
+  ## returns contents of the ``HTTP_CONNECTION`` environment variable
+  return getenv("HTTP_CONNECTION")
+
+proc getHttpCookie*(): string =
+  ## returns contents of the ``HTTP_COOKIE`` environment variable
+  return getenv("HTTP_COOKIE")
+
+proc getHttpHost*(): string =
+  ## returns contents of the ``HTTP_HOST`` environment variable
+  return getenv("HTTP_HOST")
+
+proc getHttpReferer*(): string =
+  ## returns contents of the ``HTTP_REFERER`` environment variable
+  return getenv("HTTP_REFERER")
+
+proc getHttpUserAgent*(): string =
+  ## returns contents of the ``HTTP_USER_AGENT`` environment variable
+  return getenv("HTTP_USER_AGENT")
+
+proc getPathInfo*(): string =
+  ## returns contents of the ``PATH_INFO`` environment variable
+  return getenv("PATH_INFO")
+
+proc getPathTranslated*(): string =
+  ## returns contents of the ``PATH_TRANSLATED`` environment variable
+  return getenv("PATH_TRANSLATED")
+
+proc getQueryString*(): string =
+  ## returns contents of the ``QUERY_STRING`` environment variable
+  return getenv("QUERY_STRING")
+
+proc getRemoteAddr*(): string =
+  ## returns contents of the ``REMOTE_ADDR`` environment variable
+  return getenv("REMOTE_ADDR")
+
+proc getRemoteHost*(): string =
+  ## returns contents of the ``REMOTE_HOST`` environment variable
+  return getenv("REMOTE_HOST")
+
+proc getRemoteIdent*(): string =
+  ## returns contents of the ``REMOTE_IDENT`` environment variable
+  return getenv("REMOTE_IDENT")
+
+proc getRemotePort*(): string =
+  ## returns contents of the ``REMOTE_PORT`` environment variable
+  return getenv("REMOTE_PORT")
+
+proc getRemoteUser*(): string =
+  ## returns contents of the ``REMOTE_USER`` environment variable
+  return getenv("REMOTE_USER")
+
+proc getRequestMethod*(): string =
+  ## returns contents of the ``REQUEST_METHOD`` environment variable
+  return getenv("REQUEST_METHOD")
+
+proc getRequestURI*(): string =
+  ## returns contents of the ``REQUEST_URI`` environment variable
+  return getenv("REQUEST_URI")
+
+proc getScriptFilename*(): string =
+  ## returns contents of the ``SCRIPT_FILENAME`` environment variable
+  return getenv("SCRIPT_FILENAME")
+
+proc getScriptName*(): string =
+  ## returns contents of the ``SCRIPT_NAME`` environment variable
+  return getenv("SCRIPT_NAME")
+
+proc getServerAddr*(): string =
+  ## returns contents of the ``SERVER_ADDR`` environment variable
+  return getenv("SERVER_ADDR")
+
+proc getServerAdmin*(): string =
+  ## returns contents of the ``SERVER_ADMIN`` environment variable
+  return getenv("SERVER_ADMIN")
+
+proc getServerName*(): string =
+  ## returns contents of the ``SERVER_NAME`` environment variable
+  return getenv("SERVER_NAME")
+
+proc getServerPort*(): string =
+  ## returns contents of the ``SERVER_PORT`` environment variable
+  return getenv("SERVER_PORT")
+
+proc getServerProtocol*(): string =
+  ## returns contents of the ``SERVER_PROTOCOL`` environment variable
+  return getenv("SERVER_PROTOCOL")
+
+proc getServerSignature*(): string =
+  ## returns contents of the ``SERVER_SIGNATURE`` environment variable
+  return getenv("SERVER_SIGNATURE")
+
+proc getServerSoftware*(): string =
+  ## returns contents of the ``SERVER_SOFTWARE`` environment variable
+  return getenv("SERVER_SOFTWARE")
+
+proc setTestData*(keysvalues: openarray[string]) = 
+  ## fills the appropriate environment variables to test your CGI application.
+  ## This can only simulate the 'GET' 'REQUEST_METHOD'. `keysvalues` should
+  ## provide embedded (name, value)-pairs. Example:
+  ##
+  ## .. code-block:: Nimrod
+  ##    setTestData("name", "Hanz", "password", "12345")
+  putenv("REQUEST_METHOD", "GET")
+  var i = 0
+  var query = ""
+  while i < keysvalues.len:
+    add(query, URLencode(keysvalues[i]))
+    add(query, '=')
+    add(query, URLencode(keysvalues[i+1]))
+    add(query, '&')
+    inc(i, 2)
+  putenv("QUERY_STRING", query)
+
+proc writeContentType*() = 
+  ## call this before starting to send your HTML data to `stdout`. This
+  ## is just a shorthand for: 
+  ## .. code-block:: Nimrod
+  ##     write(stdout, "Content-type: text/html\n\n")
+  write(stdout, "Content-type: text/html\n\n")
diff --git a/lib/base/devel/FGInt.pas b/lib/base/devel/FGInt.pas
deleted file mode 100644
index 7cb5a8516..000000000
--- a/lib/base/devel/FGInt.pas
+++ /dev/null
@@ -1,2199 +0,0 @@
-{License, info, etc

- ------------------

-

-This implementation is made by me, Walied Othman, to contact me

-mail to Walied.Othman@belgacom.net or Triade@ulyssis.org,

-always mention wether it 's about the FGInt for Delphi or for

-FreePascal, or wether it 's about the 6xs, preferably in the subject line.

-If you 're going to use these implementations, at least mention my

-name or something and notify me so I may even put a link on my page.

-This implementation is freeware and according to the coderpunks'

-manifesto it should remain so, so don 't use these implementations

-in commercial software.  Encryption, as a tool to ensure privacy

-should be free and accessible for anyone.  If you plan to use these

-implementations in a commercial application, contact me before

-doing so, that way you can license the software to use it in commercial

-Software.  If any algorithm is patented in your country, you should

-acquire a license before using this software.  Modified versions of this

-software must contain an acknowledgement of the original author (=me).

-This implementation is available at

-http://triade.studentenweb.org

-

-copyright 2000, Walied Othman

-This header may not be removed.

-}

-

-Unit FGInt;

-

-{$H+}

-

-Interface

-

-Uses SysUtils, Math;

-

-Type

-   TCompare = (Lt, St, Eq, Er);

-   TSign = (negative, positive);

-   TFGInt = Record

-      Sign : TSign;

-      Number : Array Of LongWord;

-   End;

-

-Procedure zeronetochar8(Var g : char; Const x : String);

-Procedure zeronetochar6(Var g : integer; Const x : String);

-Procedure initialize8(Var trans : Array Of String);

-Procedure initialize6(Var trans : Array Of String);

-Procedure initialize6PGP(Var trans : Array Of String);

-Procedure ConvertBase256to64(Const str256 : String; Var str64 : String);

-Procedure ConvertBase64to256(Const str64 : String; Var str256 : String);

-Procedure ConvertBase256to2(Const str256 : String; Var str2 : String);

-Procedure ConvertBase64to2(Const str64 : String; Var str2 : String);

-Procedure ConvertBase2to256(str2 : String; Var str256 : String);

-Procedure ConvertBase2to64(str2 : String; Var str64 : String);

-Procedure ConvertBase256StringToHexString(Str256 : String; Var HexStr : String);

-Procedure ConvertHexStringToBase256String(HexStr : String; Var Str256 : String);

-Procedure PGPConvertBase256to64(Var str256, str64 : String);

-Procedure PGPConvertBase64to256(str64 : String; Var str256 : String);

-Procedure PGPConvertBase64to2(str64 : String; Var str2 : String);

-Procedure FGIntToBase2String(Const FGInt : TFGInt; Var S : String);

-Procedure Base2StringToFGInt(S : String; Var FGInt : TFGInt);

-Procedure FGIntToBase256String(Const FGInt : TFGInt; Var str256 : String);

-Procedure Base256StringToFGInt(str256 : String; Var FGInt : TFGInt);

-Procedure PGPMPIToFGInt(PGPMPI : String; Var FGInt : TFGInt);

-Procedure FGIntToPGPMPI(FGInt : TFGInt; Var PGPMPI : String);

-Procedure Base10StringToFGInt(Base10 : String; Var FGInt : TFGInt);

-Procedure FGIntToBase10String(Const FGInt : TFGInt; Var Base10 : String);

-Procedure FGIntDestroy(Var FGInt : TFGInt);

-Function FGIntCompareAbs(Const FGInt1, FGInt2 : TFGInt) : TCompare;

-Procedure FGIntAdd(Const FGInt1, FGInt2 : TFGInt; Var Sum : TFGInt);

-Procedure FGIntChangeSign(Var FGInt : TFGInt);

-Procedure FGIntSub(Var FGInt1, FGInt2, dif : TFGInt);

-Procedure FGIntMulByInt(Const FGInt : TFGInt; Var res : TFGInt; by : LongWord);

-Procedure FGIntMulByIntbis(Var FGInt : TFGInt; by : LongWord);

-Procedure FGIntDivByInt(Const FGInt : TFGInt; Var res : TFGInt; by : LongWord; Var modres : LongWord);

-Procedure FGIntDivByIntBis(Var FGInt : TFGInt; by : LongWord; Var modres : LongWord);

-Procedure FGIntModByInt(Const FGInt : TFGInt; by : LongWord; Var modres : LongWord);

-Procedure FGIntAbs(Var FGInt : TFGInt);

-Procedure FGIntCopy(Const FGInt1 : TFGInt; Var FGInt2 : TFGInt);

-Procedure FGIntShiftLeft(Var FGInt : TFGInt);

-Procedure FGIntShiftRight(Var FGInt : TFGInt);

-Procedure FGIntShiftRightBy31(Var FGInt : TFGInt);

-Procedure FGIntAddBis(Var FGInt1 : TFGInt; Const FGInt2 : TFGInt);

-Procedure FGIntSubBis(Var FGInt1 : TFGInt; Const FGInt2 : TFGInt);

-Procedure FGIntMul(Const FGInt1, FGInt2 : TFGInt; Var Prod : TFGInt);

-Procedure FGIntSquare(Const FGInt : TFGInt; Var Square : TFGInt);

-Procedure FGIntExp(Const FGInt, exp : TFGInt; Var res : TFGInt);

-Procedure FGIntFac(Const FGInt : TFGInt; Var res : TFGInt);

-Procedure FGIntShiftLeftBy31(Var FGInt : TFGInt);

-Procedure FGIntDivMod(Var FGInt1, FGInt2, QFGInt, MFGInt : TFGInt);

-Procedure FGIntDiv(Var FGInt1, FGInt2, QFGInt : TFGInt);

-Procedure FGIntMod(Var FGInt1, FGInt2, MFGInt : TFGInt);

-Procedure FGIntSquareMod(Var FGInt, Modb, FGIntSM : TFGInt);

-Procedure FGIntAddMod(Var FGInt1, FGInt2, base, FGIntres : TFGInt);

-Procedure FGIntMulMod(Var FGInt1, FGInt2, base, FGIntres : TFGInt);

-Procedure FGIntModExp(Var FGInt, exp, modb, res : TFGInt);

-Procedure FGIntModBis(Const FGInt : TFGInt; Var FGIntOut : TFGInt; b, head : LongWord);

-Procedure FGIntMulModBis(Const FGInt1, FGInt2 : TFGInt; Var Prod : TFGInt; b, head : LongWord);

-Procedure FGIntMontgomeryMod(Const GInt, base, baseInv : TFGInt; Var MGInt : TFGInt; b : Longword; head : LongWord);

-Procedure FGIntMontgomeryModExp(Var FGInt, exp, modb, res : TFGInt);

-Procedure FGIntGCD(Const FGInt1, FGInt2 : TFGInt; Var GCD : TFGInt);

-Procedure FGIntLCM(Const FGInt1, FGInt2 : TFGInt; Var LCM : TFGInt);

-Procedure FGIntTrialDiv9999(Const FGInt : TFGInt; Var ok : boolean);

-Procedure FGIntRandom1(Var Seed, RandomFGInt : TFGInt);

-Procedure FGIntRabinMiller(Var FGIntp : TFGInt; nrtest : Longword; Var ok : boolean);

-Procedure FGIntBezoutBachet(Var FGInt1, FGInt2, a, b : TFGInt);

-Procedure FGIntModInv(Const FGInt1, base : TFGInt; Var Inverse : TFGInt);

-Procedure FGIntPrimetest(Var FGIntp : TFGInt; nrRMtests : integer; Var ok : boolean);

-Procedure FGIntLegendreSymbol(Var a, p : TFGInt; Var L : integer);

-Procedure FGIntSquareRootModP(Square, Prime : TFGInt; Var SquareRoot : TFGInt);

-

-

-

-Implementation

-

-Var

-   primes : Array[1..1228] Of integer =

-      (3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127,

-      131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251,

-      257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389,

-      397, 401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, 521, 523, 541,

-      547, 557, 563, 569, 571, 577, 587, 593, 599, 601, 607, 613, 617, 619, 631, 641, 643, 647, 653, 659, 661, 673, 677,

-      683, 691, 701, 709, 719, 727, 733, 739, 743, 751, 757, 761, 769, 773, 787, 797, 809, 811, 821, 823, 827, 829, 839,

-      853, 857, 859, 863, 877, 881, 883, 887, 907, 911, 919, 929, 937, 941, 947, 953, 967, 971, 977, 983, 991, 997, 1009,

-      1013, 1019, 1021, 1031, 1033, 1039, 1049, 1051, 1061, 1063, 1069, 1087, 1091, 1093, 1097, 1103, 1109, 1117, 1123,

-      1129, 1151, 1153, 1163, 1171, 1181, 1187, 1193, 1201, 1213, 1217, 1223, 1229, 1231, 1237, 1249, 1259, 1277, 1279,

-      1283, 1289, 1291, 1297, 1301, 1303, 1307, 1319, 1321, 1327, 1361, 1367, 1373, 1381, 1399, 1409, 1423, 1427, 1429,

-      1433, 1439, 1447, 1451, 1453, 1459, 1471, 1481, 1483, 1487, 1489, 1493, 1499, 1511, 1523, 1531, 1543, 1549, 1553,

-      1559, 1567, 1571, 1579, 1583, 1597, 1601, 1607, 1609, 1613, 1619, 1621, 1627, 1637, 1657, 1663, 1667, 1669, 1693,

-      1697, 1699, 1709, 1721, 1723, 1733, 1741, 1747, 1753, 1759, 1777, 1783, 1787, 1789, 1801, 1811, 1823, 1831, 1847,

-      1861, 1867, 1871, 1873, 1877, 1879, 1889, 1901, 1907, 1913, 1931, 1933, 1949, 1951, 1973, 1979, 1987, 1993, 1997,

-      1999, 2003, 2011, 2017, 2027, 2029, 2039, 2053, 2063, 2069, 2081, 2083, 2087, 2089, 2099, 2111, 2113, 2129, 2131,

-      2137, 2141, 2143, 2153, 2161, 2179, 2203, 2207, 2213, 2221, 2237, 2239, 2243, 2251, 2267, 2269, 2273, 2281, 2287,

-      2293, 2297, 2309, 2311, 2333, 2339, 2341, 2347, 2351, 2357, 2371, 2377, 2381, 2383, 2389, 2393, 2399, 2411, 2417,

-      2423, 2437, 2441, 2447, 2459, 2467, 2473, 2477, 2503, 2521, 2531, 2539, 2543, 2549, 2551, 2557, 2579, 2591, 2593,

-      2609, 2617, 2621, 2633, 2647, 2657, 2659, 2663, 2671, 2677, 2683, 2687, 2689, 2693, 2699, 2707, 2711, 2713, 2719,

-      2729, 2731, 2741, 2749, 2753, 2767, 2777, 2789, 2791, 2797, 2801, 2803, 2819, 2833, 2837, 2843, 2851, 2857, 2861,

-      2879, 2887, 2897, 2903, 2909, 2917, 2927, 2939, 2953, 2957, 2963, 2969, 2971, 2999, 3001, 3011, 3019, 3023, 3037,

-      3041, 3049, 3061, 3067, 3079, 3083, 3089, 3109, 3119, 3121, 3137, 3163, 3167, 3169, 3181, 3187, 3191, 3203, 3209,

-      3217, 3221, 3229, 3251, 3253, 3257, 3259, 3271, 3299, 3301, 3307, 3313, 3319, 3323, 3329, 3331, 3343, 3347, 3359,

-      3361, 3371, 3373, 3389, 3391, 3407, 3413, 3433, 3449, 3457, 3461, 3463, 3467, 3469, 3491, 3499, 3511, 3517, 3527,

-      3529, 3533, 3539, 3541, 3547, 3557, 3559, 3571, 3581, 3583, 3593, 3607, 3613, 3617, 3623, 3631, 3637, 3643, 3659,

-      3671, 3673, 3677, 3691, 3697, 3701, 3709, 3719, 3727, 3733, 3739, 3761, 3767, 3769, 3779, 3793, 3797, 3803, 3821,

-      3823, 3833, 3847, 3851, 3853, 3863, 3877, 3881, 3889, 3907, 3911, 3917, 3919, 3923, 3929, 3931, 3943, 3947, 3967,

-      3989, 4001, 4003, 4007, 4013, 4019, 4021, 4027, 4049, 4051, 4057, 4073, 4079, 4091, 4093, 4099, 4111, 4127, 4129,

-      4133, 4139, 4153, 4157, 4159, 4177, 4201, 4211, 4217, 4219, 4229, 4231, 4241, 4243, 4253, 4259, 4261, 4271, 4273,

-      4283, 4289, 4297, 4327, 4337, 4339, 4349, 4357, 4363, 4373, 4391, 4397, 4409, 4421, 4423, 4441, 4447, 4451, 4457,

-      4463, 4481, 4483, 4493, 4507, 4513, 4517, 4519, 4523, 4547, 4549, 4561, 4567, 4583, 4591, 4597, 4603, 4621, 4637,

-      4639, 4643, 4649, 4651, 4657, 4663, 4673, 4679, 4691, 4703, 4721, 4723, 4729, 4733, 4751, 4759, 4783, 4787, 4789,

-      4793, 4799, 4801, 4813, 4817, 4831, 4861, 4871, 4877, 4889, 4903, 4909, 4919, 4931, 4933, 4937, 4943, 4951, 4957,

-      4967, 4969, 4973, 4987, 4993, 4999, 5003, 5009, 5011, 5021, 5023, 5039, 5051, 5059, 5077, 5081, 5087, 5099, 5101,

-      5107, 5113, 5119, 5147, 5153, 5167, 5171, 5179, 5189, 5197, 5209, 5227, 5231, 5233, 5237, 5261, 5273, 5279, 5281,

-      5297, 5303, 5309, 5323, 5333, 5347, 5351, 5381, 5387, 5393, 5399, 5407, 5413, 5417, 5419, 5431, 5437, 5441, 5443,

-      5449, 5471, 5477, 5479, 5483, 5501, 5503, 5507, 5519, 5521, 5527, 5531, 5557, 5563, 5569, 5573, 5581, 5591, 5623,

-      5639, 5641, 5647, 5651, 5653, 5657, 5659, 5669, 5683, 5689, 5693, 5701, 5711, 5717, 5737, 5741, 5743, 5749, 5779,

-      5783, 5791, 5801, 5807, 5813, 5821, 5827, 5839, 5843, 5849, 5851, 5857, 5861, 5867, 5869, 5879, 5881, 5897, 5903,

-      5923, 5927, 5939, 5953, 5981, 5987, 6007, 6011, 6029, 6037, 6043, 6047, 6053, 6067, 6073, 6079, 6089, 6091, 6101,

-      6113, 6121, 6131, 6133, 6143, 6151, 6163, 6173, 6197, 6199, 6203, 6211, 6217, 6221, 6229, 6247, 6257, 6263, 6269,

-      6271, 6277, 6287, 6299, 6301, 6311, 6317, 6323, 6329, 6337, 6343, 6353, 6359, 6361, 6367, 6373, 6379, 6389, 6397,

-      6421, 6427, 6449, 6451, 6469, 6473, 6481, 6491, 6521, 6529, 6547, 6551, 6553, 6563, 6569, 6571, 6577, 6581, 6599,

-      6607, 6619, 6637, 6653, 6659, 6661, 6673, 6679, 6689, 6691, 6701, 6703, 6709, 6719, 6733, 6737, 6761, 6763, 6779,

-      6781, 6791, 6793, 6803, 6823, 6827, 6829, 6833, 6841, 6857, 6863, 6869, 6871, 6883, 6899, 6907, 6911, 6917, 6947,

-      6949, 6959, 6961, 6967, 6971, 6977, 6983, 6991, 6997, 7001, 7013, 7019, 7027, 7039, 7043, 7057, 7069, 7079, 7103,

-      7109, 7121, 7127, 7129, 7151, 7159, 7177, 7187, 7193, 7207, 7211, 7213, 7219, 7229, 7237, 7243, 7247, 7253, 7283,

-      7297, 7307, 7309, 7321, 7331, 7333, 7349, 7351, 7369, 7393, 7411, 7417, 7433, 7451, 7457, 7459, 7477, 7481, 7487,

-      7489, 7499, 7507, 7517, 7523, 7529, 7537, 7541, 7547, 7549, 7559, 7561, 7573, 7577, 7583, 7589, 7591, 7603, 7607,

-      7621, 7639, 7643, 7649, 7669, 7673, 7681, 7687, 7691, 7699, 7703, 7717, 7723, 7727, 7741, 7753, 7757, 7759, 7789,

-      7793, 7817, 7823, 7829, 7841, 7853, 7867, 7873, 7877, 7879, 7883, 7901, 7907, 7919, 7927, 7933, 7937, 7949, 7951,

-      7963, 7993, 8009, 8011, 8017, 8039, 8053, 8059, 8069, 8081, 8087, 8089, 8093, 8101, 8111, 8117, 8123, 8147, 8161,

-      8167, 8171, 8179, 8191, 8209, 8219, 8221, 8231, 8233, 8237, 8243, 8263, 8269, 8273, 8287, 8291, 8293, 8297, 8311,

-      8317, 8329, 8353, 8363, 8369, 8377, 8387, 8389, 8419, 8423, 8429, 8431, 8443, 8447, 8461, 8467, 8501, 8513, 8521,

-      8527, 8537, 8539, 8543, 8563, 8573, 8581, 8597, 8599, 8609, 8623, 8627, 8629, 8641, 8647, 8663, 8669, 8677, 8681,

-      8689, 8693, 8699, 8707, 8713, 8719, 8731, 8737, 8741, 8747, 8753, 8761, 8779, 8783, 8803, 8807, 8819, 8821, 8831,

-      8837, 8839, 8849, 8861, 8863, 8867, 8887, 8893, 8923, 8929, 8933, 8941, 8951, 8963, 8969, 8971, 8999, 9001, 9007,

-      9011, 9013, 9029, 9041, 9043, 9049, 9059, 9067, 9091, 9103, 9109, 9127, 9133, 9137, 9151, 9157, 9161, 9173, 9181,

-      9187, 9199, 9203, 9209, 9221, 9227, 9239, 9241, 9257, 9277, 9281, 9283, 9293, 9311, 9319, 9323, 9337, 9341, 9343,

-      9349, 9371, 9377, 9391, 9397, 9403, 9413, 9419, 9421, 9431, 9433, 9437, 9439, 9461, 9463, 9467, 9473, 9479, 9491,

-      9497, 9511, 9521, 9533, 9539, 9547, 9551, 9587, 9601, 9613, 9619, 9623, 9629, 9631, 9643, 9649, 9661, 9677, 9679,

-      9689, 9697, 9719, 9721, 9733, 9739, 9743, 9749, 9767, 9769, 9781, 9787, 9791, 9803, 9811, 9817, 9829, 9833, 9839,

-      9851, 9857, 9859, 9871, 9883, 9887, 9901, 9907, 9923, 9929, 9931, 9941, 9949, 9967, 9973);

-   chr64 : Array[1..64] Of char = ('a', 'A', 'b', 'B', 'c', 'C', 'd', 'D', 'e', 'E', 'f', 'F',

-      'g', 'G', 'h', 'H', 'i', 'I', 'j', 'J', 'k', 'K', 'l', 'L', 'm', 'M', 'n', 'N', 'o', 'O', 'p',

-      'P', 'q', 'Q', 'r', 'R', 's', 'S', 't', 'T', 'u', 'U', 'v', 'V', 'w', 'W', 'x', 'X', 'y', 'Y',

-      'z', 'Z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '=');

-   PGPchr64 : Array[1..64] Of char = ('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',

-      'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f',

-      'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y',

-      'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/');

-

-

-

-Procedure zeronetochar8(Var g : char; Const x : String);

-Var

-   i : Integer;

-   b : byte;

-Begin

-   b := 0;

-   For i := 1 To 8 Do

-   Begin

-      If copy(x, i, 1) = '1' Then

-         b := b Or (1 Shl (8 - I));

-   End;

-   g := chr(b);

-End;

-

-

-Procedure zeronetochar6(Var g : integer; Const x : String);

-Var

-   I : Integer;

-Begin

-   G := 0;

-   For I := 1 To Length(X) Do

-   Begin

-      If I > 6 Then

-         Break;

-      If X[I] <> '0' Then

-         G := G Or (1 Shl (6 - I));

-   End;

-   Inc(G);

-End;

-

-

-Procedure initialize8(Var trans : Array Of String);

-Var

-   c1, c2, c3, c4, c5, c6, c7, c8 : integer;

-   x : String;

-   g : char;

-Begin

-   For c1 := 0 To 1 Do

-      For c2 := 0 To 1 Do

-         For c3 := 0 To 1 Do

-            For c4 := 0 To 1 Do

-               For c5 := 0 To 1 Do

-                  For c6 := 0 To 1 Do

-                     For c7 := 0 To 1 Do

-                        For c8 := 0 To 1 Do

-                        Begin

-                           x := chr(48+c1) + chr(48+c2) + chr(48+c3) + chr(48+c4) + chr(48+c5) + chr(48+c6) + chr(48+c7) + chr(48+c8);

-                           zeronetochar8(g, x);

-                           trans[ord(g)] := x;

-                        End;

-End;

-

-

-Procedure initialize6(Var trans : Array Of String);

-Var

-   c1, c2, c3, c4, c5, c6 : integer;

-   x : String;

-   g : integer;

-Begin

-   For c1 := 0 To 1 Do

-      For c2 := 0 To 1 Do

-         For c3 := 0 To 1 Do

-            For c4 := 0 To 1 Do

-               For c5 := 0 To 1 Do

-                  For c6 := 0 To 1 Do

-                  Begin

-                     x := chr(48+c1) + chr(48+c2) + chr(48+c3) + chr(48+c4) + chr(48+c5) + chr(48+c6);

-                     zeronetochar6(g, x);

-                     trans[ord(chr64[g])] := x;

-                  End;

-End;

-

-Procedure initialize6PGP(Var trans : Array Of String);

-Var

-   c1, c2, c3, c4, c5, c6 : integer;

-   x : String;

-   g : integer;

-Begin

-   For c1 := 0 To 1 Do

-      For c2 := 0 To 1 Do

-         For c3 := 0 To 1 Do

-            For c4 := 0 To 1 Do

-               For c5 := 0 To 1 Do

-                  For c6 := 0 To 1 Do

-                  Begin

-                     x := chr(48+c1) + chr(48+c2) + chr(48+c3) + chr(48+c4) + chr(48+c5) + chr(48+c6);

-                     zeronetochar6(g, x);

-                     trans[ord(PGPchr64[g])] := x;

-                  End;

-End;

-

-

-// Convert base 8 strings to base 6 strings and visa versa

-

-Procedure ConvertBase256to64(Const str256 : String; Var str64 : String);

-Var

-   temp : String;

-   trans : Array[0..255] Of String;

-   i, len6 : longint;

-   g : integer;

-Begin

-   initialize8(trans);

-   temp := '';

-   For i := 1 To length(str256) Do temp := temp + trans[ord(str256[i])];

-   While (length(temp) Mod 6) <> 0 Do temp := temp + '0';

-   len6 := length(temp) Div 6;

-   str64 := '';

-   For i := 1 To len6 Do

-   Begin

-      zeronetochar6(g, copy(temp, 1, 6));

-      str64 := str64 + chr64[g];

-      delete(temp, 1, 6);

-   End;

-End;

-

-

-Procedure ConvertBase64to256(Const str64 : String; Var str256 : String);

-Var

-   temp : String;

-   trans : Array[0..255] Of String;

-   i, len8 : longint;

-   g : char;

-Begin

-   initialize6(trans);

-   temp := '';

-   For i := 1 To length(str64) Do temp := temp + trans[ord(str64[i])];

-   str256 := '';

-   len8 := length(temp) Div 8;

-   For i := 1 To len8 Do

-   Begin

-      zeronetochar8(g, copy(temp, 1, 8));

-      str256 := str256 + g;

-      delete(temp, 1, 8);

-   End;

-End;

-

-

-// Convert base 8 & 6 bit strings to base 2 strings and visa versa

-

-Procedure ConvertBase256to2(Const str256 : String; Var str2 : String);

-Var

-   trans : Array[0..255] Of String;

-   i : longint;

-Begin

-   str2 := '';

-   initialize8(trans);

-   For i := 1 To length(str256) Do str2 := str2 + trans[ord(str256[i])];

-End;

-

-

-Procedure ConvertBase64to2(Const str64 : String; Var str2 : String);

-Var

-   trans : Array[0..255] Of String;

-   i : longint;

-Begin

-   str2 := '';

-   initialize6(trans);

-   For i := 1 To length(str64) Do str2 := str2 + trans[ord(str64[i])];

-End;

-

-

-Procedure ConvertBase2to256(str2 : String; Var str256 : String);

-Var

-   i, len8 : longint;

-   g : char;

-Begin

-   str256 := '';

-   While (length(str2) Mod 8) <> 0 Do str2 := '0' + str2;

-   len8 := length(str2) Div 8;

-   For i := 1 To len8 Do

-   Begin

-      zeronetochar8(g, copy(str2, 1, 8));

-      str256 := str256 + g;

-      delete(str2, 1, 8);

-   End;

-End;

-

-

-Procedure ConvertBase2to64(str2 : String; Var str64 : String);

-Var

-   i, len6 : longint;

-   g : integer;

-Begin

-   str64 := '';

-   While (length(str2) Mod 6) <> 0 Do str2 := '0' + str2;

-   len6 := length(str2) Div 6;

-   For i := 1 To len6 Do

-   Begin

-      zeronetochar6(g, copy(str2, 1, 6));

-      str64 := str64 + chr64[g];

-      delete(str2, 1, 6);

-   End;

-End;

-

-

-// Convert base 256 strings to base 16 (HexaDecimal) strings and visa versa

-

-Procedure ConvertBase256StringToHexString(Str256 : String; Var HexStr : String);

-Var

-   i : longint;

-   b : byte;

-Begin

-   HexStr := '';

-   For i := 1 To length(str256) Do

-   Begin

-      b := ord(str256[i]);

-      If (b Shr 4) < 10 Then HexStr := HexStr + chr(48 + (b Shr 4))

-      Else HexStr := HexStr + chr(55 + (b Shr 4));

-      If (b And 15) < 10 Then HexStr := HexStr + chr(48 + (b And 15))

-      Else HexStr := HexStr + chr(55 + (b And 15));

-   End;

-End;

-

-

-Procedure ConvertHexStringToBase256String(HexStr : String; Var Str256 : String);

-Var

-   i : longint;

-   b, h1, h2 : byte;

-   temp : string;

-Begin

-   Str256 := '';

-   If (length(Hexstr) mod 2) = 1 Then temp := '0' + HexStr Else temp := HexStr;

-   For i := 1 To (length(temp) Div 2) Do

-   Begin

-      h2 := ord(temp[2 * i]);

-      h1 := ord(temp[2 * i - 1]);

-      If h1 < 58 Then

-         b := ((h1 - 48) Shl 4)

-      Else

-         b := ((h1 - 55) Shl 4);

-      If h2 < 58 Then

-         b := (b Or (h2 - 48))

-      Else

-         b := (b Or ((h2 - 55) and 15));

-      Str256 := Str256 + chr(b);

-   End;

-End;

-

-

-// Convert base 256 strings to base 64 strings and visa versa, PGP style

-

-Procedure PGPConvertBase256to64(Var str256, str64 : String);

-Var

-   temp, x, a : String;

-   i, len6 : longint;

-   g : integer;

-   trans : Array[0..255] Of String;

-Begin

-   initialize8(trans);

-   temp := '';

-   For i := 1 To length(str256) Do temp := temp + trans[ord(str256[i])];

-   If (length(temp) Mod 6) = 0 Then a := '' Else

-      If (length(temp) Mod 6) = 4 Then

-      Begin

-         temp := temp + '00';

-         a := '='

-      End

-      Else

-      Begin

-         temp := temp + '0000';

-         a := '=='

-      End;

-   str64 := '';

-   len6 := length(temp) Div 6;

-   For i := 1 To len6 Do

-   Begin

-      x := copy(temp, 1, 6);

-      zeronetochar6(g, x);

-      str64 := str64 + PGPchr64[g];

-      delete(temp, 1, 6);

-   End;

-   str64 := str64 + a;

-End;

-

-

-Procedure PGPConvertBase64to256(str64 : String; Var str256 : String);

-Var

-   temp, x : String;

-   i, j, len8 : longint;

-   g : char;

-   trans : Array[0..255] Of String;

-Begin

-   initialize6PGP(trans);

-   temp := '';

-   str256 := '';

-   If str64[length(str64) - 1] = '=' Then j := 2 Else

-      If str64[length(str64)] = '=' Then j := 1 Else j := 0;

-   For i := 1 To (length(str64) - j) Do temp := temp + trans[ord(str64[i])];

-   If j <> 0 Then delete(temp, length(temp) - 2 * j + 1, 2 * j);

-   len8 := length(temp) Div 8;

-   For i := 1 To len8 Do

-   Begin

-      x := copy(temp, 1, 8);

-      zeronetochar8(g, x);

-      str256 := str256 + g;

-      delete(temp, 1, 8);

-   End;

-End;

-

-// Convert base 64 strings to base 2 strings, PGP style

-

-

-Procedure PGPConvertBase64to2(str64 : String; Var str2 : String);

-Var

-   i, j : longint;

-   trans : Array[0..255] Of String;

-Begin

-   str2 := '';

-   initialize6(trans);

-   If str64[length(str64) - 1] = '=' Then j := 2 Else

-      If str64[length(str64)] = '=' Then j := 1 Else j := 0;

-   For i := 1 To (length(str64) - j) Do str2 := str2 + trans[ord(str64[i])];

-   delete(str2, length(str2) - 2 * j + 1, 2 * j);

-End;

-

-

-// Convert a FGInt to a binary string (base 2) & visa versa

-

-Procedure FGIntToBase2String(Const FGInt : TFGInt; Var S : String);

-Var

-   i : LongWord;

-   j : integer;

-Begin

-   S := '';

-   For i := 1 To FGInt.Number[0] Do

-   Begin

-      For j := 0 To 30 Do

-         If (1 And (FGInt.Number[i] Shr j)) = 1 Then

-            S := '1' + S

-         Else

-            S := '0' + S;

-   End;

-   While (length(S) > 1) And (S[1] = '0') Do

-      delete(S, 1, 1);

-   If S = '' Then S := '0';

-End;

-

-

-Procedure Base2StringToFGInt(S : String; Var FGInt : TFGInt);

-Var

-   i, j, size : LongWord;

-Begin

-   While (S[1] = '0') And (length(S) > 1) Do

-      delete(S, 1, 1);

-   size := length(S) Div 31;

-   If (length(S) Mod 31) <> 0 Then size := size + 1;

-   SetLength(FGInt.Number, (size + 1));

-   FGInt.Number[0] := size;

-   j := 1;

-   FGInt.Number[j] := 0;

-   i := 0;

-   While length(S) > 0 Do

-   Begin

-      If S[length(S)] = '1' Then

-         FGInt.Number[j] := FGInt.Number[j] Or (1 Shl i);

-      i := i + 1;

-      If i = 31 Then

-      Begin

-         i := 0;

-         j := j + 1;

-         If j <= size Then FGInt.Number[j] := 0;

-      End;

-      delete(S, length(S), 1);

-   End;

-   FGInt.Sign := positive;

-End;

-

-

-// Convert a FGInt to an base 256 string & visa versa

-

-Procedure FGIntToBase256String(Const FGInt : TFGInt; Var str256 : String);

-Var

-   temp1 : String;

-   i, len8 : LongWord;

-   g : char;

-Begin

-   FGIntToBase2String(FGInt, temp1);

-   While (length(temp1) Mod 8) <> 0 Do temp1 := '0' + temp1;

-   len8 := length(temp1) Div 8;

-   str256 := '';

-   For i := 1 To len8 Do

-   Begin

-      zeronetochar8(g, copy(temp1, 1, 8));

-      str256 := str256 + g;

-      delete(temp1, 1, 8);

-   End;

-End;

-

-

-Procedure Base256StringToFGInt(str256 : String; Var FGInt : TFGInt);

-Var

-   temp1 : String;

-   i : longint;

-   trans : Array[0..255] Of String;

-Begin

-   temp1 := '';

-   initialize8(trans);

-   For i := 1 To length(str256) Do temp1 := temp1 + trans[ord(str256[i])];

-   While (temp1[1] = '0') And (temp1 <> '0') Do delete(temp1, 1, 1);

-   Base2StringToFGInt(temp1, FGInt);

-End;

-

-// Convert an MPI (Multiple Precision Integer, PGP style) to an FGInt &

-// visa versa

-

-Procedure PGPMPIToFGInt(PGPMPI : String; Var FGInt : TFGInt);

-Var

-   temp : String;

-Begin

-   temp := PGPMPI;

-   delete(temp, 1, 2);

-   Base256StringToFGInt(temp, FGInt);

-End;

-

-

-Procedure FGIntToPGPMPI(FGInt : TFGInt; Var PGPMPI : String);

-Var

-   len, i : word;

-   c : char;

-   b : byte;

-Begin

-   FGIntToBase256String(FGInt, PGPMPI);

-   len := length(PGPMPI) * 8;

-   c := PGPMPI[1];

-   For i := 7 Downto 0 Do If (ord(c) Shr i) = 0 Then len := len - 1 Else break;

-   b := len Mod 256;

-   PGPMPI := chr(b) + PGPMPI;

-   b := len Div 256;

-   PGPMPI := chr(b) + PGPMPI;

-End;

-

-

-// Convert a base 10 string to a FGInt

-// NESTED

-Procedure GIntDivByIntBis1(Var GInt : TFGInt; by : LongWord; Var modres : word);

-Var

-   i, size, rest, temp : LongWord;

-Begin

-   size := GInt.Number[0];

-   temp := 0;

-   For i := size Downto 1 Do

-   Begin

-      temp := temp * 10000;

-      rest := temp + GInt.Number[i];

-      GInt.Number[i] := rest Div by;

-      temp := rest Mod by;

-   End;

-     modres := temp;

-   While (GInt.Number[size] = 0) And (size > 1) Do

-      size := size - 1;

-   If size <> GInt.Number[0] Then

-   Begin

-      SetLength(GInt.Number, size + 1);

-      GInt.Number[0] := size;

-   End;

-End;

-

-Procedure Base10StringToFGInt(Base10 : String; Var FGInt : TFGInt);

-Var

-   i, size : LongWord;

-   j : word;

-   S, x : String;

-   sign : TSign;

-

-

-Begin

-   While (Not (Base10[1] In ['-', '0'..'9'])) And (length(Base10) > 1) Do

-      delete(Base10, 1, 1);

-   If copy(Base10, 1, 1) = '-' Then

-   Begin

-      Sign := negative;

-      delete(Base10, 1, 1);

-   End

-   Else

-      Sign := positive;

-   While (length(Base10) > 1) And (copy(Base10, 1, 1) = '0') Do

-      delete(Base10, 1, 1);

-   size := length(Base10) Div 4;

-   If (length(Base10) Mod 4) <> 0 Then size := size + 1;

-   SetLength(FGInt.Number, size + 1);

-   FGInt.Number[0] := size;

-   For i := 1 To (size - 1) Do

-   Begin

-      x := copy(Base10, length(Base10) - 3, 4);

-      FGInt.Number[i] := StrToInt(x);

-      delete(Base10, length(Base10) - 3, 4);

-   End;

-   FGInt.Number[size] := StrToInt(Base10);

-

-   S := '';

-   While (FGInt.Number[0] <> 1) Or (FGInt.Number[1] <> 0) Do

-   Begin

-      GIntDivByIntBis1(FGInt, 2, j);

-      S := inttostr(j) + S;

-   End;

-   If S = '' Then S := '0';

-   FGIntDestroy(FGInt);

-   Base2StringToFGInt(S, FGInt);

-   FGInt.Sign := sign;

-End;

-

-

-// Convert a FGInt to a base 10 string

-

-Procedure FGIntToBase10String(Const FGInt : TFGInt; Var Base10 : String);

-Var

-   S : String;

-   j : LongWord;

-   temp : TFGInt;

-Begin

-   FGIntCopy(FGInt, temp);

-   Base10 := '';

-   While (temp.Number[0] > 1) Or (temp.Number[1] > 0) Do

-   Begin

-      FGIntDivByIntBis(temp, 10000, j);

-      S := IntToStr(j);

-      While Length(S) < 4 Do

-         S := '0' + S;

-      Base10 := S + Base10;

-   End;

-   Base10 := '0' + Base10;

-   While (length(Base10) > 1) And (Base10[1] = '0') Do

-      delete(Base10, 1, 1);

-   If FGInt.Sign = negative Then Base10 := '-' + Base10;

-End;

-

-

-// Destroy a FGInt to free memory

-

-Procedure FGIntDestroy(Var FGInt : TFGInt);

-Begin

-   FGInt.Number := Nil;

-End;

-

-

-// Compare 2 FGInts in absolute value, returns

-// Lt if FGInt1 > FGInt2, St if FGInt1 < FGInt2, Eq if FGInt1 = FGInt2,

-// Er otherwise

-

-Function FGIntCompareAbs(Const FGInt1, FGInt2 : TFGInt) : TCompare;

-Var

-   size1, size2, i : LongWord;

-Begin

-   FGIntCompareAbs := Er;

-   size1 := FGInt1.Number[0];

-   size2 := FGInt2.Number[0];

-   If size1 > size2 Then FGIntCompareAbs := Lt Else

-      If size1 < size2 Then FGIntCompareAbs := St Else

-      Begin

-         i := size2;

-         While (FGInt1.Number[i] = FGInt2.Number[i]) And (i > 1) Do i := i - 1;

-         If FGInt1.Number[i] = FGInt2.Number[i] Then FGIntCompareAbs := Eq Else

-            If FGInt1.Number[i] < FGInt2.Number[i] Then FGIntCompareAbs := St Else

-               If FGInt1.Number[i] > FGInt2.Number[i] Then FGIntCompareAbs := Lt;

-      End;

-End;

-

-

-// Add 2 FGInts, FGInt1 + FGInt2 = Sum

-

-Procedure FGIntAdd(Const FGInt1, FGInt2 : TFGInt; Var Sum : TFGInt);

-Var

-   i, size1, size2, size, rest, Trest : LongWord;

-Begin

-   size1 := FGInt1.Number[0];

-   size2 := FGInt2.Number[0];

-   If size1 < size2 Then

-      FGIntAdd(FGInt2, FGInt1, Sum)

-   Else

-   Begin

-      If FGInt1.Sign = FGInt2.Sign Then

-      Begin

-         Sum.Sign := FGInt1.Sign;

-         setlength(Sum.Number, (size1 + 2));

-         rest := 0;

-         For i := 1 To size2 Do

-         Begin

-            Trest := FGInt1.Number[i];

-            Trest := Trest + FGInt2.Number[i];

-            Trest := Trest + rest;

-            Sum.Number[i] := Trest And 2147483647;

-            rest := Trest Shr 31;

-         End;

-         For i := (size2 + 1) To size1 Do

-         Begin

-            Trest := FGInt1.Number[i] + rest;

-            Sum.Number[i] := Trest And 2147483647;

-            rest := Trest Shr 31;

-         End;

-         size := size1 + 1;

-         Sum.Number[0] := size;

-         Sum.Number[size] := rest;

-         While (Sum.Number[size] = 0) And (size > 1) Do

-            size := size - 1;

-         If Sum.Number[0] <> size Then SetLength(Sum.Number, size + 1);

-         Sum.Number[0] := size;

-      End

-      Else

-      Begin

-         If FGIntCompareAbs(FGInt2, FGInt1) = Lt Then

-            FGIntAdd(FGInt2, FGInt1, Sum)

-         Else

-         Begin

-            SetLength(Sum.Number, (size1 + 1));

-            rest := 0;

-            For i := 1 To size2 Do

-            Begin

-               Trest := $80000000; // 2147483648;

-               TRest := Trest + FGInt1.Number[i];

-               TRest := Trest - FGInt2.Number[i];

-               TRest := Trest - rest;

-               Sum.Number[i] := Trest And 2147483647;

-               If (Trest > 2147483647) Then

-                  rest := 0

-               Else

-                  rest := 1;

-            End;

-            For i := (size2 + 1) To size1 Do

-            Begin

-               Trest := $80000000;

-               TRest := Trest + FGInt1.Number[i];

-               TRest := Trest - rest;

-               Sum.Number[i] := Trest And 2147483647;

-               If (Trest > 2147483647) Then

-                  rest := 0

-               Else

-                  rest := 1;

-            End;

-            size := size1;

-            While (Sum.Number[size] = 0) And (size > 1) Do

-               size := size - 1;

-            If size <> size1 Then SetLength(Sum.Number, size + 1);

-            Sum.Number[0] := size;

-            Sum.Sign := FGInt1.Sign;

-         End;

-      End;

-   End;

-End;

-

-

-

-Procedure FGIntChangeSign(Var FGInt : TFGInt);

-Begin

-   If FGInt.Sign = negative Then FGInt.Sign := positive Else FGInt.Sign := negative;

-End;

-

-

-// Substract 2 FGInts, FGInt1 - FGInt2 = dif

-

-Procedure FGIntSub(Var FGInt1, FGInt2, dif : TFGInt);

-Begin

-   FGIntChangeSign(FGInt2);

-   FGIntAdd(FGInt1, FGInt2, dif);

-   FGIntChangeSign(FGInt2);

-End;

-

-

-// multiply a FGInt by an integer, FGInt * by = res, by < 2147483648

-

-Procedure FGIntMulByInt(Const FGInt : TFGInt; Var res : TFGInt; by : LongWord);

-Var

-   i, size, rest : LongWord;

-   Trest : int64;

-Begin

-   size := FGInt.Number[0];

-   setlength(res.Number, (size + 2));

-   rest := 0;

-   For i := 1 To size Do

-   Begin

-      Trest := FGInt.Number[i];

-      TRest := Trest * by;

-      TRest := Trest + rest;

-      res.Number[i] := Trest And 2147483647;

-      rest := Trest Shr 31;

-   End;

-   If rest <> 0 Then

-   Begin

-      size := size + 1;

-      Res.Number[size] := rest;

-   End

-   Else

-      SetLength(Res.Number, size + 1);

-   Res.Number[0] := size;

-   Res.Sign := FGInt.Sign;

-End;

-

-

-// multiply a FGInt by an integer, FGInt * by = res, by < 1000000000

-

-Procedure FGIntMulByIntbis(Var FGInt : TFGInt; by : LongWord);

-Var

-   i, size, rest : LongWord;

-   Trest : int64;

-Begin

-   size := FGInt.Number[0];

-   Setlength(FGInt.Number, size + 2);

-   rest := 0;

-   For i := 1 To size Do

-   Begin

-      Trest := FGInt.Number[i];

-      TRest := Trest * by;

-      TRest := Trest + rest;

-      FGInt.Number[i] := Trest And 2147483647;

-      rest := Trest Shr 31;

-   End;

-   If rest <> 0 Then

-   Begin

-      size := size + 1;

-      FGInt.Number[size] := rest;

-   End

-   Else

-      SetLength(FGInt.Number, size + 1);

-   FGInt.Number[0] := size;

-End;

-

-

-// divide a FGInt by an integer, FGInt = res * by + modres

-

-Procedure FGIntDivByInt(Const FGInt : TFGInt; Var res : TFGInt; by : LongWord; Var modres : LongWord);

-Var

-   i, size : LongWord;

-   rest : int64;

-Begin

-   size := FGInt.Number[0];

-   setlength(res.Number, (size + 1));

-   modres := 0;

-   For i := size Downto 1 Do

-   Begin

-      rest := modres;

-      rest := rest Shl 31;

-      rest := rest Or FGInt.Number[i];

-      res.Number[i] := rest Div by;

-      modres := rest Mod by;

-   End;

-   While (res.Number[size] = 0) And (size > 1) Do

-      size := size - 1;

-   If size <> FGInt.Number[0] Then SetLength(res.Number, size + 1);

-   res.Number[0] := size;

-   Res.Sign := FGInt.Sign;

-   If FGInt.sign = negative Then modres := by - modres;

-End;

-                                                         

-

-// divide a FGInt by an integer, FGInt = FGInt * by + modres

-

-Procedure FGIntDivByIntBis(Var FGInt : TFGInt; by : LongWord; Var modres : LongWord);

-Var

-   i, size : LongWord;

-   temp, rest : int64;

-Begin

-   size := FGInt.Number[0];

-   temp := 0;

-   For i := size Downto 1 Do

-   Begin

-      temp := temp Shl 31;

-      rest := temp Or FGInt.Number[i];

-      FGInt.Number[i] := rest Div by;

-      temp := rest Mod by;

-   End;

-   modres := temp;

-   While (FGInt.Number[size] = 0) And (size > 1) Do

-      size := size - 1;

-   If size <> FGInt.Number[0] Then

-   Begin

-      SetLength(FGInt.Number, size + 1);

-      FGInt.Number[0] := size;

-   End;

-End;

-

-

-// Reduce a FGInt modulo by (=an integer), FGInt mod by = modres

-

-Procedure FGIntModByInt(Const FGInt : TFGInt; by : LongWord; Var modres : LongWord);

-Var

-   i, size : LongWord;

-   temp, rest : int64;

-Begin

-   size := FGInt.Number[0];

-   temp := 0;

-   For i := size Downto 1 Do

-   Begin

-      temp := temp Shl 31;

-      rest := temp Or FGInt.Number[i];

-      temp := rest Mod by;

-   End;

-   modres := temp;

-   If FGInt.sign = negative Then modres := by - modres;

-End;

-

-

-// Returns the FGInt in absolute value

-

-Procedure FGIntAbs(Var FGInt : TFGInt);

-Begin

-   FGInt.Sign := positive;

-End;

-

-

-// Copy a FGInt1 into FGInt2

-

-Procedure FGIntCopy(Const FGInt1 : TFGInt; Var FGInt2 : TFGInt);

-Begin

-   FGInt2.Sign := FGInt1.Sign;

-   FGInt2.Number := Nil;

-   FGInt2.Number := Copy(FGInt1.Number, 0, FGInt1.Number[0] + 1);

-End;

-

-

-// Shift the FGInt to the left in base 2 notation, ie FGInt = FGInt * 2

-

-Procedure FGIntShiftLeft(Var FGInt : TFGInt);

-Var

-   l, m, i, size : LongWord;

-Begin

-   size := FGInt.Number[0];

-   l := 0;

-   For i := 1 To Size Do

-   Begin

-      m := FGInt.Number[i] Shr 30;

-      FGInt.Number[i] := ((FGInt.Number[i] Shl 1) Or l) And 2147483647;

-      l := m;

-   End;

-   If l <> 0 Then

-   Begin

-      setlength(FGInt.Number, size + 2);

-      FGInt.Number[size + 1] := l;

-      FGInt.Number[0] := size + 1;

-   End;

-End;

-

-

-// Shift the FGInt to the right in base 2 notation, ie FGInt = FGInt div 2

-

-Procedure FGIntShiftRight(Var FGInt : TFGInt);

-Var

-   l, m, i, size : LongWord;

-Begin

-   size := FGInt.Number[0];

-   l := 0;

-   For i := size Downto 1 Do

-   Begin

-      m := FGInt.Number[i] And 1;

-      FGInt.Number[i] := (FGInt.Number[i] Shr 1) Or l;

-      l := m Shl 30;

-   End;

-   If (FGInt.Number[size] = 0) And (size > 1) Then

-   Begin

-      setlength(FGInt.Number, size);

-      FGInt.Number[0] := size - 1;

-   End;

-End;

-

-

-// FGInt = FGInt / 2147483648

-

-Procedure FGIntShiftRightBy31(Var FGInt : TFGInt);

-Var

-   size, i : LongWord;

-Begin

-   size := FGInt.Number[0];

-   If size > 1 Then

-   Begin

-      For i := 1 To size - 1 Do

-      Begin

-         FGInt.Number[i] := FGInt.Number[i + 1];

-      End;

-      SetLength(FGInt.Number, Size);

-      FGInt.Number[0] := size - 1;

-   End

-   Else

-      FGInt.Number[1] := 0;

-End;

-

-

-// FGInt1 = FGInt1 + FGInt2, FGInt1 > FGInt2

-

-Procedure FGIntAddBis(Var FGInt1 : TFGInt; Const FGInt2 : TFGInt);

-Var

-   i, size1, size2, Trest, rest : LongWord;

-Begin

-   size1 := FGInt1.Number[0];

-   size2 := FGInt2.Number[0];

-   rest := 0;

-   For i := 1 To size2 Do

-   Begin

-      Trest := FGInt1.Number[i] + FGInt2.Number[i] + rest;

-      rest := Trest Shr 31;

-      FGInt1.Number[i] := Trest And 2147483647;

-   End;

-   For i := size2 + 1 To size1 Do

-   Begin

-      Trest := FGInt1.Number[i] + rest;

-      rest := Trest Shr 31;

-      FGInt1.Number[i] := Trest And 2147483647;

-   End;

-   If rest <> 0 Then

-   Begin

-      SetLength(FGInt1.Number, size1 + 2);

-      FGInt1.Number[0] := size1 + 1;

-      FGInt1.Number[size1 + 1] := rest;

-   End;

-End;

-

-

-// FGInt1 = FGInt1 - FGInt2, use only when 0 < FGInt2 < FGInt1

-

-Procedure FGIntSubBis(Var FGInt1 : TFGInt; Const FGInt2 : TFGInt);

-Var

-   i, size1, size2, rest, Trest : LongWord;

-Begin

-   size1 := FGInt1.Number[0];

-   size2 := FGInt2.Number[0];

-   rest := 0;

-   For i := 1 To size2 Do

-   Begin

-      Trest := ($80000000 Or FGInt1.Number[i]) - FGInt2.Number[i] - rest;

-      If (Trest > 2147483647) Then

-         rest := 0

-      Else

-         rest := 1;

-      FGInt1.Number[i] := Trest And 2147483647;

-   End;

-   For i := size2 + 1 To size1 Do

-   Begin

-      Trest := ($80000000 Or FGInt1.Number[i]) - rest;

-      If (Trest > 2147483647) Then

-         rest := 0

-      Else

-         rest := 1;

-      FGInt1.Number[i] := Trest And 2147483647;

-   End;

-   i := size1;

-   While (FGInt1.Number[i] = 0) And (i > 1) Do

-      i := i - 1;

-   If i <> size1 Then

-   Begin

-      SetLength(FGInt1.Number, i + 1);

-      FGInt1.Number[0] := i;

-   End;

-End;

-

-

-// Multiply 2 FGInts, FGInt1 * FGInt2 = Prod

-

-Procedure FGIntMul(Const FGInt1, FGInt2 : TFGInt; Var Prod : TFGInt);

-Var

-   i, j, size, size1, size2, rest : LongWord;

-   Trest : int64;

-Begin

-   size1 := FGInt1.Number[0];

-   size2 := FGInt2.Number[0];

-   size := size1 + size2;

-   SetLength(Prod.Number, (size + 1));

-   For i := 1 To size Do

-      Prod.Number[i] := 0;

-

-   For i := 1 To size2 Do

-   Begin

-      rest := 0;

-      For j := 1 To size1 Do

-      Begin

-         Trest := FGInt1.Number[j];

-         Trest := Trest * FGInt2.Number[i];

-         Trest := Trest + Prod.Number[j + i - 1];

-         Trest := Trest + rest;

-         Prod.Number[j + i - 1] := Trest And 2147483647;

-         rest := Trest Shr 31;

-      End;

-      Prod.Number[i + size1] := rest;

-   End;

-

-   Prod.Number[0] := size;

-   While (Prod.Number[size] = 0) And (size > 1) Do

-      size := size - 1;

-   If size <> Prod.Number[0] Then

-   Begin

-      SetLength(Prod.Number, size + 1);

-      Prod.Number[0] := size;

-   End;

-   If FGInt1.Sign = FGInt2.Sign Then

-      Prod.Sign := Positive

-   Else

-      prod.Sign := negative;

-End;

-

-

-// Square a FGInt, FGInt² = Square

-

-Procedure FGIntSquare(Const FGInt : TFGInt; Var Square : TFGInt);

-Var

-   size, size1, i, j, rest : LongWord;

-   Trest : int64;

-Begin

-   size1 := FGInt.Number[0];

-   size := 2 * size1;

-   SetLength(Square.Number, (size + 1));

-   Square.Number[0] := size;

-   For i := 1 To size Do

-      Square.Number[i] := 0;

-   For i := 1 To size1 Do

-   Begin

-      Trest := FGInt.Number[i];

-      Trest := Trest * FGInt.Number[i];

-      Trest := Trest + Square.Number[2 * i - 1];

-      Square.Number[2 * i - 1] := Trest And 2147483647;

-      rest := Trest Shr 31;

-      For j := i + 1 To size1 Do

-      Begin

-         Trest := FGInt.Number[i] Shl 1;

-         Trest := Trest * FGInt.Number[j];

-         Trest := Trest + Square.Number[i + j - 1];

-         Trest := Trest + rest;

-         Square.Number[i + j - 1] := Trest And 2147483647;

-         rest := Trest Shr 31;

-      End;

-      Square.Number[i + size1] := rest;

-   End;

-   Square.Sign := positive;

-   While (Square.Number[size] = 0) And (size > 1) Do

-      size := size - 1;

-   If size <> (2 * size1) Then

-   Begin

-      SetLength(Square.Number, size + 1);

-      Square.Number[0] := size;

-   End;

-End;

-

-

-// Exponentiate a FGInt, FGInt^exp = res

-

-Procedure FGIntExp(Const FGInt, exp : TFGInt; Var res : TFGInt);

-Var

-   temp2, temp3 : TFGInt;

-   S : String;

-   i : LongWord;

-Begin

-   FGIntToBase2String(exp, S);

-   If S[length(S)] = '0' Then Base10StringToFGInt('1', res) Else FGIntCopy(FGInt, res);

-   FGIntCopy(FGInt, temp2);

-   If length(S) > 1 Then

-      For i := (length(S) - 1) Downto 1 Do

-      Begin

-         FGIntSquare(temp2, temp3);

-         FGIntCopy(temp3, temp2);

-         If S[i] = '1' Then

-         Begin

-            FGIntMul(res, temp2, temp3);

-            FGIntCopy(temp3, res);

-         End;

-      End;

-End;

-

-

-// Compute FGInt! = FGInt * (FGInt - 1) * (FGInt - 2) * ... * 3 * 2 * 1

-

-Procedure FGIntFac(Const FGInt : TFGInt; Var res : TFGInt);

-Var

-   one, temp, temp1 : TFGInt;

-Begin

-   FGIntCopy(FGInt, temp);

-   Base10StringToFGInt('1', res);

-   Base10StringToFGInt('1', one);

-

-   While Not (FGIntCompareAbs(temp, one) = Eq) Do

-   Begin

-      FGIntMul(temp, res, temp1);

-      FGIntCopy(temp1, res);

-      FGIntSubBis(temp, one);

-   End;

-

-   FGIntDestroy(one);

-   FGIntDestroy(temp);

-End;

-

-

-// FGInt = FGInt * 2147483648

-

-Procedure FGIntShiftLeftBy31(Var FGInt : TFGInt);

-Var

-   f1, f2 : LongWord;

-   i, size : longint;

-Begin

-   size := FGInt.Number[0];

-   SetLength(FGInt.Number, size + 2);

-   f1 := 0;

-   For i := 1 To (size + 1) Do

-   Begin

-      f2 := FGInt.Number[i];

-      FGInt.Number[i] := f1;

-      f1 := f2;

-   End;

-   FGInt.Number[0] := size + 1;

-End;

-

-

-// Divide 2 FGInts, FGInt1 = FGInt2 * QFGInt + MFGInt, MFGInt is always positive

-

-Procedure FGIntDivMod(Var FGInt1, FGInt2, QFGInt, MFGInt : TFGInt);

-Var

-   one, zero, temp1, temp2 : TFGInt;

-   s1, s2 : TSign;

-   j, s, t : LongWord;

-   i : int64;

-Begin

-   s1 := FGInt1.Sign;

-   s2 := FGInt2.Sign;

-   FGIntAbs(FGInt1);

-   FGIntAbs(FGInt2);

-   FGIntCopy(FGInt1, MFGInt);

-   FGIntCopy(FGInt2, temp1);

-

-   If FGIntCompareAbs(FGInt1, FGInt2) <> St Then

-   Begin

-      s := FGInt1.Number[0] - FGInt2.Number[0];

-      SetLength(QFGInt.Number, (s + 2));

-      QFGInt.Number[0] := s + 1;

-      For t := 1 To s Do

-      Begin

-         FGIntShiftLeftBy31(temp1);

-         QFGInt.Number[t] := 0;

-      End;

-      j := s + 1;

-      QFGInt.Number[j] := 0;

-      While FGIntCompareAbs(MFGInt, FGInt2) <> St Do

-      Begin

-         While FGIntCompareAbs(MFGInt, temp1) <> St Do

-         Begin

-            If MFGInt.Number[0] > temp1.Number[0] Then

-            Begin

-               i := MFGInt.Number[MFGInt.Number[0]];

-               i := i Shl 31;

-               i := i + MFGInt.Number[MFGInt.Number[0] - 1];

-               i := i Div (temp1.Number[temp1.Number[0]] + 1);

-            End

-            Else

-               i := MFGInt.Number[MFGInt.Number[0]] Div (temp1.Number[temp1.Number[0]] + 1);

-            If (i <> 0) Then

-            Begin

-               FGIntCopy(temp1, temp2);

-               FGIntMulByIntBis(temp2, i);

-               FGIntSubBis(MFGInt, temp2);

-               QFGInt.Number[j] := QFGInt.Number[j] + i;

-               If FGIntCompareAbs(MFGInt, temp2) <> St Then

-               Begin

-                  QFGInt.Number[j] := QFGInt.Number[j] + i;

-                  FGIntSubBis(MFGInt, temp2);

-               End;

-               FGIntDestroy(temp2);

-            End

-            Else

-            Begin

-               QFGInt.Number[j] := QFGInt.Number[j] + 1;

-               FGIntSubBis(MFGInt, temp1);

-            End;

-         End;

-         If MFGInt.Number[0] <= temp1.Number[0] Then

-            If FGIntCompareAbs(temp1, FGInt2) <> Eq Then

-            Begin

-               FGIntShiftRightBy31(temp1);

-               j := j - 1;

-            End;

-      End;

-   End

-   Else

-      Base10StringToFGInt('0', QFGInt);

-   s := QFGInt.Number[0];

-   While (s > 1) And (QFGInt.Number[s] = 0) Do

-      s := s - 1;

-   If s < QFGInt.Number[0] Then

-   Begin

-      setlength(QFGInt.Number, s + 1);

-      QFGInt.Number[0] := s;

-   End;

-   QFGInt.Sign := positive;

-

-   FGIntDestroy(temp1);

-   Base10StringToFGInt('0', zero);

-   Base10StringToFGInt('1', one);

-   If s1 = negative Then

-   Begin

-      If FGIntCompareAbs(MFGInt, zero) <> Eq Then

-      Begin

-         FGIntadd(QFGInt, one, temp1);

-         FGIntDestroy(QFGInt);

-         FGIntCopy(temp1, QFGInt);

-         FGIntDestroy(temp1);

-         FGIntsub(FGInt2, MFGInt, temp1);

-         FGIntDestroy(MFGInt);

-         FGIntCopy(temp1, MFGInt);

-         FGIntDestroy(temp1);

-      End;

-      If s2 = positive Then QFGInt.Sign := negative;

-   End

-   Else

-      QFGInt.Sign := s2;

-   FGIntDestroy(one);

-   FGIntDestroy(zero);

-

-   FGInt1.Sign := s1;

-   FGInt2.Sign := s2;

-End;

-

-

-// Same as above but doesn 't compute MFGInt

-

-Procedure FGIntDiv(Var FGInt1, FGInt2, QFGInt : TFGInt);

-Var

-   one, zero, temp1, temp2, MFGInt : TFGInt;

-   s1, s2 : TSign;

-   j, s, t : LongWord;

-   i : int64;

-Begin

-   s1 := FGInt1.Sign;

-   s2 := FGInt2.Sign;

-   FGIntAbs(FGInt1);

-   FGIntAbs(FGInt2);

-   FGIntCopy(FGInt1, MFGInt);

-   FGIntCopy(FGInt2, temp1);

-

-   If FGIntCompareAbs(FGInt1, FGInt2) <> St Then

-   Begin

-      s := FGInt1.Number[0] - FGInt2.Number[0];

-      SetLength(QFGInt.Number, (s + 2));

-      QFGInt.Number[0] := s + 1;

-      For t := 1 To s Do

-      Begin

-         FGIntShiftLeftBy31(temp1);

-         QFGInt.Number[t] := 0;

-      End;

-      j := s + 1;

-      QFGInt.Number[j] := 0;

-      While FGIntCompareAbs(MFGInt, FGInt2) <> St Do

-      Begin

-         While FGIntCompareAbs(MFGInt, temp1) <> St Do

-         Begin

-            If MFGInt.Number[0] > temp1.Number[0] Then

-            Begin

-               i := MFGInt.Number[MFGInt.Number[0]];

-               i := i Shl 31;

-               i := i + MFGInt.Number[MFGInt.Number[0] - 1];

-               i := i Div (temp1.Number[temp1.Number[0]] + 1);

-            End

-            Else

-               i := MFGInt.Number[MFGInt.Number[0]] Div (temp1.Number[temp1.Number[0]] + 1);

-            If (i <> 0) Then

-            Begin

-               FGIntCopy(temp1, temp2);

-               FGIntMulByIntBis(temp2, i);

-               FGIntSubBis(MFGInt, temp2);

-               QFGInt.Number[j] := QFGInt.Number[j] + i;

-               If FGIntCompareAbs(MFGInt, temp2) <> St Then

-               Begin

-                  QFGInt.Number[j] := QFGInt.Number[j] + i;

-                  FGIntSubBis(MFGInt, temp2);

-               End;

-               FGIntDestroy(temp2);

-            End

-            Else

-            Begin

-               QFGInt.Number[j] := QFGInt.Number[j] + 1;

-               FGIntSubBis(MFGInt, temp1);

-            End;

-         End;

-         If MFGInt.Number[0] <= temp1.Number[0] Then

-            If FGIntCompareAbs(temp1, FGInt2) <> Eq Then

-            Begin

-               FGIntShiftRightBy31(temp1);

-               j := j - 1;

-            End;

-      End;

-   End

-   Else

-      Base10StringToFGInt('0', QFGInt);

-   s := QFGInt.Number[0];

-   While (s > 1) And (QFGInt.Number[s] = 0) Do

-      s := s - 1;

-   If s < QFGInt.Number[0] Then

-   Begin

-      setlength(QFGInt.Number, s + 1);

-      QFGInt.Number[0] := s;

-   End;

-   QFGInt.Sign := positive;

-

-   FGIntDestroy(temp1);

-   Base10StringToFGInt('0', zero);

-   Base10StringToFGInt('1', one);

-   If s1 = negative Then

-   Begin

-      If FGIntCompareAbs(MFGInt, zero) <> Eq Then

-      Begin

-         FGIntadd(QFGInt, one, temp1);

-         FGIntDestroy(QFGInt);

-         FGIntCopy(temp1, QFGInt);

-         FGIntDestroy(temp1);

-         FGIntsub(FGInt2, MFGInt, temp1);

-         FGIntDestroy(MFGInt);

-         FGIntCopy(temp1, MFGInt);

-         FGIntDestroy(temp1);

-      End;

-      If s2 = positive Then QFGInt.Sign := negative;

-   End

-   Else

-      QFGInt.Sign := s2;

-   FGIntDestroy(one);

-   FGIntDestroy(zero);

-   FGIntDestroy(MFGInt);

-

-   FGInt1.Sign := s1;

-   FGInt2.Sign := s2;

-End;

-

-

-

-// Same as above but this computes MFGInt in stead of QFGInt

-// MFGInt = FGInt1 mod FGInt2

-

-Procedure FGIntMod(Var FGInt1, FGInt2, MFGInt : TFGInt);

-Var

-   one, zero, temp1, temp2 : TFGInt;

-   s1, s2 : TSign;

-   s, t : LongWord;

-   i : int64;

-Begin

-   s1 := FGInt1.Sign;

-   s2 := FGInt2.Sign;

-   FGIntAbs(FGInt1);

-   FGIntAbs(FGInt2);

-   FGIntCopy(FGInt1, MFGInt);

-   FGIntCopy(FGInt2, temp1);

-

-   If FGIntCompareAbs(FGInt1, FGInt2) <> St Then

-   Begin

-      s := FGInt1.Number[0] - FGInt2.Number[0];

-      For t := 1 To s Do

-         FGIntShiftLeftBy31(temp1);

-      While FGIntCompareAbs(MFGInt, FGInt2) <> St Do

-      Begin

-         While FGIntCompareAbs(MFGInt, temp1) <> St Do

-         Begin

-            If MFGInt.Number[0] > temp1.Number[0] Then

-            Begin

-               i := MFGInt.Number[MFGInt.Number[0]];

-               i := i Shl 31;

-               i := i + MFGInt.Number[MFGInt.Number[0] - 1];

-               i := i Div (temp1.Number[temp1.Number[0]] + 1);

-            End

-            Else

-               i := MFGInt.Number[MFGInt.Number[0]] Div (temp1.Number[temp1.Number[0]] + 1);

-            If (i <> 0) Then

-            Begin

-               FGIntCopy(temp1, temp2);

-               FGIntMulByIntBis(temp2, i);

-               FGIntSubBis(MFGInt, temp2);

-               If FGIntCompareAbs(MFGInt, temp2) <> St Then FGIntSubBis(MFGInt, temp2);

-               FGIntDestroy(temp2);

-            End

-            Else

-               FGIntSubBis(MFGInt, temp1);

-//         If FGIntCompareAbs(MFGInt, temp1) <> St Then FGIntSubBis(MFGInt,temp1);

-         End;

-         If MFGInt.Number[0] <= temp1.Number[0] Then

-            If FGIntCompareAbs(temp1, FGInt2) <> Eq Then FGIntShiftRightBy31(temp1);

-      End;

-   End;

-

-   FGIntDestroy(temp1);

-   Base10StringToFGInt('0', zero);

-   Base10StringToFGInt('1', one);

-   If s1 = negative Then

-   Begin

-      If FGIntCompareAbs(MFGInt, zero) <> Eq Then

-      Begin

-         FGIntSub(FGInt2, MFGInt, temp1);

-         FGIntDestroy(MFGInt);

-         FGIntCopy(temp1, MFGInt);

-         FGIntDestroy(temp1);

-      End;

-   End;

-   FGIntDestroy(one);

-   FGIntDestroy(zero);

-

-   FGInt1.Sign := s1;

-   FGInt2.Sign := s2;

-End;

-

-

-// Square a FGInt modulo Modb, FGInt^2 mod Modb = FGIntSM

-

-Procedure FGIntSquareMod(Var FGInt, Modb, FGIntSM : TFGInt);

-Var

-   temp : TFGInt;

-Begin

-   FGIntSquare(FGInt, temp);

-   FGIntMod(temp, Modb, FGIntSM);

-   FGIntDestroy(temp);

-End;

-

-

-// Add 2 FGInts modulo base, (FGInt1 + FGInt2) mod base = FGIntres

-

-Procedure FGIntAddMod(Var FGInt1, FGInt2, base, FGIntres : TFGInt);

-Var

-   temp : TFGInt;

-Begin

-   FGIntadd(FGInt1, FGInt2, temp);

-   FGIntMod(temp, base, FGIntres);

-   FGIntDestroy(temp);

-End;

-

-

-// Multiply 2 FGInts modulo base, (FGInt1 * FGInt2) mod base = FGIntres

-

-Procedure FGIntMulMod(Var FGInt1, FGInt2, base, FGIntres : TFGInt);

-Var

-   temp : TFGInt;

-Begin

-   FGIntMul(FGInt1, FGInt2, temp);

-   FGIntMod(temp, base, FGIntres);

-   FGIntDestroy(temp);

-End;

-

-

-// Exponentiate 2 FGInts modulo base, (FGInt1 ^ FGInt2) mod modb = res

-

-Procedure FGIntModExp(Var FGInt, exp, modb, res : TFGInt);

-Var

-   temp2, temp3 : TFGInt;

-   i : LongWord;

-   S : String;

-Begin

-   If (Modb.Number[1] Mod 2) = 1 Then

-   Begin

-      FGIntMontgomeryModExp(FGInt, exp, modb, res);

-      exit;

-   End;

-   FGIntToBase2String(exp, S);

-   Base10StringToFGInt('1', res);

-   FGIntcopy(FGInt, temp2);

-

-   For i := length(S) Downto 1 Do

-   Begin

-      If S[i] = '1' Then

-      Begin

-         FGIntmulMod(res, temp2, modb, temp3);

-         FGIntCopy(temp3, res);

-      End;

-      FGIntSquareMod(temp2, Modb, temp3);

-      FGIntCopy(temp3, temp2);

-   End;

-   FGIntDestroy(temp2);

-End;

-

-

-// Procedures for Montgomery Exponentiation

-

-Procedure FGIntModBis(Const FGInt : TFGInt; Var FGIntOut : TFGInt; b, head : LongWord);

-Var

-   i : LongWord;

-Begin

-   If b <= FGInt.Number[0] Then

-   Begin

-      SetLength(FGIntOut.Number, (b + 1));

-      For i := 0 To b Do

-         FGIntOut.Number[i] := FGInt.Number[i];

-      FGIntOut.Number[b] := FGIntOut.Number[b] And head;

-      i := b;

-      While (FGIntOut.Number[i] = 0) And (i > 1) Do

-         i := i - 1;

-      If i < b Then SetLength(FGIntOut.Number, i + 1);

-      FGIntOut.Number[0] := i;

-      FGIntOut.Sign := positive;

-   End

-   Else

-      FGIntCopy(FGInt, FGIntOut);

-End;

-

-

-Procedure FGIntMulModBis(Const FGInt1, FGInt2 : TFGInt; Var Prod : TFGInt; b, head : LongWord);

-Var

-   i, j, size, size1, size2, t, rest : LongWord;

-   Trest : int64;

-Begin

-   size1 := FGInt1.Number[0];

-   size2 := FGInt2.Number[0];

-   size := min(b, size1 + size2);

-   SetLength(Prod.Number, (size + 1));

-   For i := 1 To size Do

-      Prod.Number[i] := 0;

-

-   For i := 1 To size2 Do

-   Begin

-      rest := 0;

-      t := min(size1, b - i + 1);

-      For j := 1 To t Do

-      Begin

-         Trest := FGInt1.Number[j];

-	   Trest := Trest * FGInt2.Number[i];

-	   Trest := Trest + Prod.Number[j + i - 1];

-	   Trest := Trest + rest;

-         Prod.Number[j + i - 1] := Trest And 2147483647;

-         rest := Trest Shr 31;

-      End;

-      If (i + size1) <= b Then Prod.Number[i + size1] := rest;

-   End;

-

-   Prod.Number[0] := size;

-   If size = b Then Prod.Number[b] := Prod.Number[b] And head;

-   While (Prod.Number[size] = 0) And (size > 1) Do

-      size := size - 1;

-   If size < Prod.Number[0] Then

-   Begin

-      SetLength(Prod.Number, size + 1);

-      Prod.Number[0] := size;

-   End;

-   If FGInt1.Sign = FGInt2.Sign Then

-      Prod.Sign := Positive

-   Else

-      prod.Sign := negative;

-End;

-

-

-Procedure FGIntMontgomeryMod(Const GInt, base, baseInv : TFGInt; Var MGInt : TFGInt; b : Longword; head : LongWord);

-Var

-   m, temp, temp1 : TFGInt;

-   r : LongWord;

-Begin

-   FGIntModBis(GInt, temp, b, head);

-   FGIntMulModBis(temp, baseInv, m, b, head);

-   FGIntMul(m, base, temp1);

-   FGIntDestroy(temp);

-   FGIntAdd(temp1, GInt, temp);

-   FGIntDestroy(temp1);

-   MGInt.Number := copy(temp.Number, b - 1, temp.Number[0] - b + 2);

-   MGInt.Sign := positive;

-   MGInt.Number[0] := temp.Number[0] - b + 1;

-   FGIntDestroy(temp);

-   If (head Shr 30) = 0 Then FGIntDivByIntBis(MGInt, head + 1, r)

-   Else FGIntShiftRightBy31(MGInt);

-   If FGIntCompareAbs(MGInt, base) <> St Then FGIntSubBis(MGInt, base);

-   FGIntDestroy(temp);

-   FGIntDestroy(m);

-End;

-

-

-Procedure FGIntMontgomeryModExp(Var FGInt, exp, modb, res : TFGInt);

-Var

-   temp2, temp3, baseInv, r, zero : TFGInt;

-   i, j, t, b, head : LongWord;

-   S : String;

-Begin

-   Base2StringToFGInt('0', zero);

-   FGIntMod(FGInt, modb, res);

-   If FGIntCompareAbs(res, zero)=Eq then

-	Begin

-	  FGIntDestroy(zero);

-	  Exit;

-	End else FGIntDestroy(res);

-   FGIntDestroy(zero);

-

-   FGIntToBase2String(exp, S);

-   t := modb.Number[0];

-   b := t;

-

-   If (modb.Number[t] Shr 30) = 1 Then t := t + 1;

-   SetLength(r.Number, (t + 1));

-   r.Number[0] := t;

-   r.Sign := positive;

-   For i := 1 To t Do

-      r.Number[i] := 0;

-   If t = modb.Number[0] Then

-   Begin

-      head := 2147483647;

-      For j := 29 Downto 0 Do

-      Begin

-         head := head Shr 1;

-         If (modb.Number[t] Shr j) = 1 Then

-         Begin

-            r.Number[t] := 1 Shl (j + 1);

-            break;

-         End;

-      End;

-   End

-   Else

-   Begin

-      r.Number[t] := 1;

-      head := 2147483647;

-   End;

-

-   FGIntModInv(modb, r, temp2);

-   If temp2.Sign = negative Then

-      FGIntCopy(temp2, BaseInv)

-   Else

-   Begin

-      FGIntCopy(r, BaseInv);

-      FGIntSubBis(BaseInv, temp2);

-   End;

-//   FGIntBezoutBachet(r, modb, temp2, BaseInv);

-   FGIntAbs(BaseInv);

-   FGIntDestroy(temp2);

-   FGIntMod(r, modb, res);

-   FGIntMulMod(FGInt, res, modb, temp2);

-   FGIntDestroy(r);

-

-   For i := length(S) Downto 1 Do

-   Begin

-      If S[i] = '1' Then

-      Begin

-         FGIntmul(res, temp2, temp3);

-         FGIntDestroy(res);

-         FGIntMontgomeryMod(temp3, modb, baseinv, res, b, head);

-         FGIntDestroy(temp3);

-      End;

-      FGIntSquare(temp2, temp3);

-      FGIntDestroy(temp2);

-      FGIntMontgomeryMod(temp3, modb, baseinv, temp2, b, head);

-      FGIntDestroy(temp3);

-   End;

-   FGIntDestroy(temp2);

-   FGIntMontgomeryMod(res, modb, baseinv, temp3, b, head);

-   FGIntCopy(temp3, res);

-   FGIntDestroy(temp3);

-   FGIntDestroy(baseinv);

-End;

-

-

-// Compute the Greatest Common Divisor of 2 FGInts

-

-Procedure FGIntGCD(Const FGInt1, FGInt2 : TFGInt; Var GCD : TFGInt);

-Var

-   k : TCompare;

-   zero, temp1, temp2, temp3 : TFGInt;

-Begin

-   k := FGIntCompareAbs(FGInt1, FGInt2);

-   If (k = Eq) Then FGIntCopy(FGInt1, GCD) Else

-      If (k = St) Then FGIntGCD(FGInt2, FGInt1, GCD) Else

-      Begin

-         Base10StringToFGInt('0', zero);

-         FGIntCopy(FGInt1, temp1);

-         FGIntCopy(FGInt2, temp2);

-         While (temp2.Number[0] <> 1) Or (temp2.Number[1] <> 0) Do

-         Begin

-            FGIntMod(temp1, temp2, temp3);

-            FGIntCopy(temp2, temp1);

-            FGIntCopy(temp3, temp2);

-            FGIntDestroy(temp3);

-         End;

-         FGIntCopy(temp1, GCD);

-         FGIntDestroy(temp2);

-         FGIntDestroy(zero);

-      End;

-End;

-

-

-// Compute the Least Common Multiple of 2 FGInts

-

-Procedure FGIntLCM(Const FGInt1, FGInt2 : TFGInt; Var LCM : TFGInt);

-Var

-   temp1, temp2 : TFGInt;

-Begin

-   FGIntGCD(FGInt1, FGInt2, temp1);

-   FGIntmul(FGInt1, FGInt2, temp2);

-   FGIntdiv(temp2, temp1, LCM);

-   FGIntDestroy(temp1);

-   FGIntDestroy(temp2);

-End;

-

-

-// Trialdivision of a FGInt upto 9999 and stopping when a divisor is found, returning ok=false

-

-Procedure FGIntTrialDiv9999(Const FGInt : TFGInt; Var ok : boolean);

-Var

-   j : LongWord;

-   i : integer;

-Begin

-   If ((FGInt.Number[1] Mod 2) = 0) Then ok := false

-   Else

-   Begin

-      i := 0;

-      ok := true;

-      While ok And (i < 1228) Do

-      Begin

-         i := i + 1;

-         FGIntmodbyint(FGInt, primes[i], j);

-         If j = 0 Then ok := false;

-      End;

-   End;

-End;

-

-

-// A prng

-

-Procedure FGIntRandom1(Var Seed, RandomFGInt : TFGInt);

-Var

-   temp, base : TFGInt;

-Begin

-   Base10StringToFGInt('281474976710656', base);

-   Base10StringToFGInt('44485709377909', temp);

-   FGIntMulMod(seed, temp, base, RandomFGInt);

-   FGIntDestroy(temp);

-   FGIntDestroy(base);

-End;

-

-

-// Perform a Rabin Miller Primality Test nrtest times on FGIntp, returns ok=true when FGIntp passes the test

-

-Procedure FGIntRabinMiller(Var FGIntp : TFGInt; nrtest : Longword; Var ok : boolean);

-Var

-   j, b, i : LongWord;

-   m, z, temp1, temp2, temp3, zero, one, two, pmin1 : TFGInt;

-   ok1, ok2 : boolean;

-Begin

-   randomize;

-   j := 0;

-   Base10StringToFGInt('0', zero);

-   Base10StringToFGInt('1', one);

-   Base10StringToFGInt('2', two);

-   FGIntsub(FGIntp, one, temp1);

-   FGIntsub(FGIntp, one, pmin1);

-

-   b := 0;

-   While (temp1.Number[1] Mod 2) = 0 Do

-   Begin

-      b := b + 1;

-      FGIntShiftRight(temp1);

-   End;

-   m := temp1;

-

-   i := 0;

-   ok := true;

-   Randomize;

-   While (i < nrtest) And ok Do

-   Begin

-      i := i + 1;

-      Base10StringToFGInt(inttostr(Primes[Random(1227) + 1]), temp2);

-      FGIntMontGomeryModExp(temp2, m, FGIntp, z);

-      FGIntDestroy(temp2);

-      ok1 := (FGIntCompareAbs(z, one) = Eq);

-      ok2 := (FGIntCompareAbs(z, pmin1) = Eq);

-      If Not (ok1 Or ok2) Then

-      Begin

-

-         While (ok And (j < b)) Do

-         Begin

-            If (j > 0) And ok1 Then ok := false

-            Else

-            Begin

-               j := j + 1;

-               If (j < b) And (Not ok2) Then

-               Begin

-                  FGIntSquaremod(z, FGIntp, temp3);

-                  FGIntCopy(temp3, z);

-                  ok1 := (FGIntCompareAbs(z, one) = Eq);

-                  ok2 := (FGIntCompareAbs(z, pmin1) = Eq);

-                  If ok2 Then j := b;

-               End

-               Else If (Not ok2) And (j >= b) Then ok := false;

-            End;

-         End;

-

-      End

-   End;

-

-   FGIntDestroy(zero);

-   FGIntDestroy(one);

-   FGIntDestroy(two);

-   FGIntDestroy(m);

-   FGIntDestroy(z);

-   FGIntDestroy(pmin1);

-End;

-

-

-// Compute the coefficients from the Bezout Bachet theorem, FGInt1 * a + FGInt2 * b = GCD(FGInt1, FGInt2)

-

-Procedure FGIntBezoutBachet(Var FGInt1, FGInt2, a, b : TFGInt);

-Var

-   zero, r1, r2, r3, ta, gcd, temp, temp1, temp2 : TFGInt;

-Begin

-   If FGIntCompareAbs(FGInt1, FGInt2) <> St Then

-   Begin

-      FGIntcopy(FGInt1, r1);

-      FGIntcopy(FGInt2, r2);

-      Base10StringToFGInt('0', zero);

-      Base10StringToFGInt('1', a);

-      Base10StringToFGInt('0', ta);

-

-      Repeat

-         FGIntdivmod(r1, r2, temp, r3);

-         FGIntDestroy(r1);

-         r1 := r2;

-         r2 := r3;

-

-         FGIntmul(ta, temp, temp1);

-         FGIntsub(a, temp1, temp2);

-         FGIntCopy(ta, a);

-         FGIntCopy(temp2, ta);

-         FGIntDestroy(temp1);

-

-         FGIntDestroy(temp);

-      Until FGIntCompareAbs(r3, zero) = Eq;

-

-      FGIntGCD(FGInt1, FGInt2, gcd);

-      FGIntmul(a, FGInt1, temp1);

-      FGIntsub(gcd, temp1, temp2);

-      FGIntDestroy(temp1);

-      FGIntdiv(temp2, FGInt2, b);

-      FGIntDestroy(temp2);

-

-      FGIntDestroy(ta);

-      FGIntDestroy(r1);

-      FGIntDestroy(r2);

-      FGIntDestroy(gcd);

-   End

-   Else FGIntBezoutBachet(FGInt2, FGInt1, b, a);

-End;

-

-

-// Find the (multiplicative) Modular inverse of a FGInt in a finite ring

-// of additive order base

-

-Procedure FGIntModInv(Const FGInt1, base : TFGInt; Var Inverse : TFGInt);

-Var

-   zero, one, r1, r2, r3, tb, gcd, temp, temp1, temp2 : TFGInt;

-Begin

-   Base10StringToFGInt('1', one);

-   FGIntGCD(FGInt1, base, gcd);

-   If FGIntCompareAbs(one, gcd) = Eq Then

-   Begin

-      FGIntcopy(base, r1);

-      FGIntcopy(FGInt1, r2);

-      Base10StringToFGInt('0', zero);

-      Base10StringToFGInt('0', inverse);

-      Base10StringToFGInt('1', tb);

-

-      Repeat

-         FGIntDestroy(r3);

-         FGIntdivmod(r1, r2, temp, r3);

-         FGIntCopy(r2, r1);

-         FGIntCopy(r3, r2);

-

-         FGIntmul(tb, temp, temp1);

-         FGIntsub(inverse, temp1, temp2);

-         FGIntDestroy(inverse);

-         FGIntDestroy(temp1);

-         FGIntCopy(tb, inverse);

-         FGIntCopy(temp2, tb);

-

-         FGIntDestroy(temp);

-      Until FGIntCompareAbs(r3, zero) = Eq;

-

-      If inverse.Sign = negative Then

-      Begin

-         FGIntadd(base, inverse, temp);

-         FGIntCopy(temp, inverse);

-      End;

-

-      FGIntDestroy(tb);

-      FGIntDestroy(r1);

-      FGIntDestroy(r2);

-   End;

-   FGIntDestroy(gcd);

-   FGIntDestroy(one);

-End;

-

-

-// Perform a (combined) primality test on FGIntp consisting of a trialdivision upto 8192,

-// if the FGInt passes perform nrRMtests Rabin Miller primality tests, returns ok when a

-// FGInt is probably prime

-

-Procedure FGIntPrimetest(Var FGIntp : TFGInt; nrRMtests : integer; Var ok : boolean);

-Begin

-   FGIntTrialdiv9999(FGIntp, ok);

-   If ok Then FGIntRabinMiller(FGIntp, nrRMtests, ok);

-End;

-

-

-// Computes the Legendre symbol for a any number and

-// p a prime, returns 0 if p divides a, 1 if a is a

-// quadratic residu mod p, -1 if a is a quadratic

-// nonresidu mod p

-

-Procedure FGIntLegendreSymbol(Var a, p : TFGInt; Var L : integer);

-Var

-   temp1, temp2, temp3, temp4, temp5, zero, one : TFGInt;

-   i : LongWord;

-   ok1, ok2 : boolean;

-Begin

-   Base10StringToFGInt('0', zero);

-   Base10StringToFGInt('1', one);

-   FGIntMod(a, p, temp1);

-   If FGIntCompareAbs(zero, temp1) = Eq Then

-   Begin

-      FGIntDestroy(temp1);

-      L := 0;

-   End

-   Else

-   Begin

-      FGIntDestroy(temp1);

-      FGIntCopy(p, temp1);

-      FGIntCopy(a, temp2);

-      L := 1;

-      While FGIntCompareAbs(temp2, one) <> Eq Do

-      Begin

-         If (temp2.Number[1] Mod 2) = 0 Then

-         Begin

-            FGIntSquare(temp1, temp3);

-            FGIntSub(temp3, one, temp4);

-            FGIntDestroy(temp3);

-            FGIntDivByInt(temp4, temp3, 8, i);

-            If (temp3.Number[1] Mod 2) = 0 Then ok1 := false Else ok1 := true;

-            FGIntDestroy(temp3);

-            FGIntDestroy(temp4);

-            If ok1 = true Then L := L * (-1);

-            FGIntDivByIntBis(temp2, 2, i);

-         End

-         Else

-         Begin

-            FGIntSub(temp1, one, temp3);

-            FGIntSub(temp2, one, temp4);

-            FGIntMul(temp3, temp4, temp5);

-            FGIntDestroy(temp3);

-            FGIntDestroy(temp4);

-            FGIntDivByInt(temp5, temp3, 4, i);

-            If (temp3.Number[1] Mod 2) = 0 Then ok2 := false Else ok2 := true;

-            FGIntDestroy(temp5);

-            FGIntDestroy(temp3);

-            If ok2 = true Then L := L * (-1);

-            FGIntMod(temp1, temp2, temp3);

-            FGIntCopy(temp2, temp1);

-            FGIntCopy(temp3, temp2);

-         End;

-      End;

-      FGIntDestroy(temp1);

-      FGIntDestroy(temp2);

-   End;

-   FGIntDestroy(zero);

-   FGIntDestroy(one);

-End;

-

-

-// Compute a square root modulo a prime number

-// SquareRoot^2 mod Prime = Square

-

-Procedure FGIntSquareRootModP(Square, Prime : TFGInt; Var SquareRoot : TFGInt);

-Var

-   one, n, b, s, r, temp, temp1, temp2, temp3 : TFGInt;

-   a, i, j : longint;

-   L : Integer;

-Begin

-   Base2StringToFGInt('1', one);

-   Base2StringToFGInt('10', n);

-   a := 0;

-   FGIntLegendreSymbol(n, Prime, L);

-   While L <> -1 Do

-   Begin

-      FGIntAddBis(n, one);

-      FGIntLegendreSymbol(n, Prime, L);

-   End;

-   FGIntCopy(Prime, s);

-   s.Number[1] := s.Number[1] - 1;

-   While (s.Number[1] Mod 2) = 0 Do

-   Begin

-      FGIntShiftRight(s);

-      a := a + 1;

-   End;

-   FGIntMontgomeryModExp(n, s, Prime, b);

-   FGIntAdd(s, one, temp);

-   FGIntShiftRight(temp);

-   FGIntMontgomeryModExp(Square, temp, Prime, r);

-   FGIntDestroy(temp);

-   FGIntModInv(Square, Prime, temp1);

-

-   For i := 0 To (a - 2) Do

-   Begin

-      FGIntSquareMod(r, Prime, temp2);

-      FGIntMulMod(temp1, temp2, Prime, temp);

-      FGIntDestroy(temp2);

-      For j := 1 To (a - i - 2) Do

-      Begin

-         FGIntSquareMod(temp, Prime, temp2);

-         FGIntDestroy(temp);

-         FGIntCopy(temp2, temp);

-         FGIntDestroy(temp2);

-      End;

-      If FGIntCompareAbs(temp, one) <> Eq Then

-      Begin

-         FGIntMulMod(r, b, Prime, temp3);

-         FGIntDestroy(r);

-         FGIntCopy(temp3, r);

-         FGIntDestroy(temp3);

-      End;

-      FGIntDestroy(temp);

-      FGIntDestroy(temp2);

-      If i = (a - 2) Then break;

-      FGIntSquareMod(b, Prime, temp3);

-      FGIntDestroy(b);

-      FGIntCopy(temp3, b);

-      FGIntDestroy(temp3);

-   End;

-

-   FGIntCopy(r, SquareRoot);

-   FGIntDestroy(r);

-   FGIntDestroy(s);

-   FGIntDestroy(b);

-   FGIntDestroy(temp1);

-   FGIntDestroy(one);

-   FGIntDestroy(n);

-End;

-

-

-End.

diff --git a/lib/base/devel/bignums.nim b/lib/base/devel/bignums.nim
deleted file mode 100644
index 1d2b3685d..000000000
--- a/lib/base/devel/bignums.nim
+++ /dev/null
@@ -1,1712 +0,0 @@
-#
-#
-#            Nimrod's Runtime Library
-#        (c) Copyright 2008 Andreas Rumpf
-#
-#    See the file "copying.txt", included in this
-#    distribution, for details about the copyright.
-#
-
-## This module implements big integers for Nimrod.
-## This module is an adaptation of the FGInt module for Pascal by Walied
-## Othman: http://triade.studentenweb.org
-
-
-# License, info, etc
-# ------------------
-#
-# This implementation is made by me, Walied Othman, to contact me
-# mail to Walied.Othman@belgacom.net or Triade@ulyssis.org,
-# always mention wether it 's about the FGInt for Delphi or for
-# FreePascal, or wether it 's about the 6xs, preferably in the subject line.
-# If you 're going to use these implementations, at least mention my
-# name or something and notify me so I may even put a link on my page.
-# This implementation is freeware and according to the coderpunks'
-# manifesto it should remain so, so don 't use these implementations
-# in commercial software.  Encryption, as a tool to ensure privacy
-# should be free and accessible for anyone.  If you plan to use these
-# implementations in a commercial application, contact me before
-# doing so, that way you can license the software to use it in commercial
-# Software.  If any algorithm is patented in your country, you should
-# acquire a license before using this software.  Modified versions of this
-# software must contain an acknowledgement of the original author (=me).
-# This implementation is available at
-# http://triade.studentenweb.org
-#
-# copyright 2000, Walied Othman
-# This header may not be removed.
-#
-
-type
-  TBigInt* {.final.} = object ## type that represent an arbitrary long
-                              ## signed integer
-    s: int       # sign: -1 or 1
-    n: seq[int]  # the number part
-
-proc len(x: TBigInt): int {.inline.} = return x.n.len
-
-proc CompareAbs(a, b: TBigInt): int = 
-  result = a.len - b.len
-  if result == 0:
-    var i = b.len-1
-    while (i > 0) and a.n[i] == b.n[i]: dec(i)
-    result = a.n[i] - b.n[i]
-  
-const
-  bitMask = high(int)
-  bitshift = sizeof(int)*8 - 1
-  
-proc cutZeros(a: var TBigInt) =
-  var L = a.len
-  while a.len > 0 and a[L-1] == 0: dec(L)
-  setLen(a.n, L)
-  
-proc addAux(a, b: TBigInt, bSign: int): TBigInt
-  if a.len < b.len:
-    result = addAux(b, a, bSign)
-  elif a.s == bSign:
-    result.s = a.s
-    result.n = []
-    setlen(result.n, a.len+1)
-    var rest = 0
-    for i in 0..b.len-1:
-      var trest = a.n[i]
-      trest = trest +% b.n[i] +% rest
-      result.n[i] = trest and bitMask
-      rest = trest shr bitshift
-    for i in b.len .. a.len-1:
-      var trest = a.n[i] +% rest
-      result.n[i] = trest and bitMask
-      rest = trest shr bitshift
-    result.n[a.len] = rest
-    cutZeros(result)
-  elif compareAbs(a, b) > 0:
-    result = addAux(b, a, bSign)
-  else:
-    setlen(result.n, a.len+1)
-    result.s = a.s
-    var rest = 0
-    for i in 0..b.len-1: 
-      var Trest = low(int)
-      TRest = Trest +% a.n[i] -% b.n[i] -% rest
-      result.n[i] = Trest and bitmask
-      if Trest >% bitMask: rest = 0 else: rest = 1
-    for i in b.len .. a.len-1: 
-      var Trest = low(int)
-      TRest = Trest +% a.n[i] -% rest
-      result.n[i] = Trest and bitmask
-      if (Trest >% bitmask): rest = 0 else: rest = 1
-    cutZeros(result)
-
-proc `+` *(a, b: TBigInt): TBigInt =
-  ## the `+` operator for bigints
-  result = addAux(a, b, +1)
-
-proc `-` *(a, b: TBigInt): TBigInt =
-  ## the `-` operator for bigints
-  result = addAux(a, b, -1)
-
-proc mulInPlace(a: var TBigInt, b: int) = 
-  var 
-    size, rest: int32
-    Trest: int64
-  size = FGInt.Number[0]
-  setlen(FGInt.Number, size + 2)
-  rest = 0
-  for i in countup(1, size): 
-    Trest = FGInt.Number[i]
-    TRest = Trest * by
-    TRest = Trest + rest
-    FGInt.Number[i] = Trest And 2147483647
-    rest = Trest Shr 31
-  if rest != 0: 
-    size = size + 1
-    FGInt.Number[size] = rest
-  else: 
-    setlen(FGInt.Number, size + 1)
-  FGInt.Number[0] = size
-
-
-import 
-  SysUtils, Math
-
-type 
-  TCompare* = enum 
-    Lt, St, Eq, Er
-  TSign = enum 
-    negative, positive
-  TBigInt* {.final.} = object 
-    Sign: TSign
-    Number: seq[int32]
-
-
-proc zeronetochar8*(g: var char, x: String)
-proc zeronetochar6*(g: var int, x: String)
-proc initialize8*(trans: var openarray[String])
-proc initialize6*(trans: var openarray[String])
-proc initialize6PGP*(trans: var openarray[String])
-proc ConvertBase256to64*(str256: String, str64: var String)
-proc ConvertBase64to256*(str64: String, str256: var String)
-proc ConvertBase256to2*(str256: String, str2: var String)
-proc ConvertBase64to2*(str64: String, str2: var String)
-proc ConvertBase2to256*(str2: String, str256: var String)
-proc ConvertBase2to64*(str2: String, str64: var String)
-proc ConvertBase256StringToHexString*(Str256: String, HexStr: var String)
-proc ConvertHexStringToBase256String*(HexStr: String, Str256: var String)
-proc PGPConvertBase256to64*(str256, str64: var String)
-proc PGPConvertBase64to256*(str64: String, str256: var String)
-proc PGPConvertBase64to2*(str64: String, str2: var String)
-proc FGIntToBase2String*(FGInt: TBigInt, S: var String)
-proc Base2StringToFGInt*(S: String, FGInt: var TBigInt)
-proc FGIntToBase256String*(FGInt: TBigInt, str256: var String)
-proc Base256StringToFGInt*(str256: String, FGInt: var TBigInt)
-proc PGPMPIToFGInt*(PGPMPI: String, FGInt: var TBigInt)
-proc FGIntToPGPMPI*(FGInt: TBigInt, PGPMPI: var String)
-proc Base10StringToFGInt*(Base10: String, FGInt: var TBigInt)
-proc FGIntToBase10String*(FGInt: TBigInt, Base10: var String)
-proc FGIntDestroy*(FGInt: var TBigInt)
-proc FGIntCompareAbs*(FGInt1, FGInt2: TBigInt): TCompare
-proc FGIntAdd*(FGInt1, FGInt2: TBigInt, Sum: var TBigInt)
-proc FGIntChangeSign*(FGInt: var TBigInt)
-proc FGIntSub*(FGInt1, FGInt2, dif: var TBigInt)
-proc FGIntMulByInt*(FGInt: TBigInt, res: var TBigInt, by: int32)
-proc FGIntMulByIntbis*(FGInt: var TBigInt, by: int32)
-proc FGIntDivByInt*(FGInt: TBigInt, res: var TBigInt, by: int32, modres: var int32)
-proc FGIntDivByIntBis*(FGInt: var TBigInt, by: int32, modres: var int32)
-proc FGIntModByInt*(FGInt: TBigInt, by: int32, modres: var int32)
-proc FGIntAbs*(FGInt: var TBigInt)
-proc FGIntCopy*(FGInt1: TBigInt, FGInt2: var TBigInt)
-proc FGIntShiftLeft*(FGInt: var TBigInt)
-proc FGIntShiftRight*(FGInt: var TBigInt)
-proc FGIntShiftRightBy31*(FGInt: var TBigInt)
-proc FGIntAddBis*(FGInt1: var TBigInt, FGInt2: TBigInt)
-proc FGIntSubBis*(FGInt1: var TBigInt, FGInt2: TBigInt)
-proc FGIntMul*(FGInt1, FGInt2: TBigInt, Prod: var TBigInt)
-proc FGIntSquare*(FGInt: TBigInt, Square: var TBigInt)
-proc FGIntExp*(FGInt, exp: TBigInt, res: var TBigInt)
-proc FGIntFac*(FGInt: TBigInt, res: var TBigInt)
-proc FGIntShiftLeftBy31*(FGInt: var TBigInt)
-proc FGIntDivMod*(FGInt1, FGInt2, QFGInt, MFGInt: var TBigInt)
-proc FGIntDiv*(FGInt1, FGInt2, QFGInt: var TBigInt)
-proc FGIntMod*(FGInt1, FGInt2, MFGInt: var TBigInt)
-proc FGIntSquareMod*(FGInt, Modb, FGIntSM: var TBigInt)
-proc FGIntAddMod*(FGInt1, FGInt2, base, FGIntres: var TBigInt)
-proc FGIntMulMod*(FGInt1, FGInt2, base, FGIntres: var TBigInt)
-proc FGIntModExp*(FGInt, exp, modb, res: var TBigInt)
-proc FGIntModBis*(FGInt: TBigInt, FGIntOut: var TBigInt, b, head: int32)
-proc FGIntMulModBis*(FGInt1, FGInt2: TBigInt, Prod: var TBigInt, b, head: int32)
-proc FGIntMontgomeryMod*(GInt, base, baseInv: TBigInt, MGInt: var TBigInt, 
-                         b: int32, head: int32)
-proc FGIntMontgomeryModExp*(FGInt, exp, modb, res: var TBigInt)
-proc FGIntGCD*(FGInt1, FGInt2: TBigInt, GCD: var TBigInt)
-proc FGIntLCM*(FGInt1, FGInt2: TBigInt, LCM: var TBigInt)
-proc FGIntTrialDiv9999*(FGInt: TBigInt, ok: var bool)
-proc FGIntRandom1*(Seed, RandomFGInt: var TBigInt)
-proc FGIntRabinMiller*(FGIntp: var TBigInt, nrtest: int32, ok: var bool)
-proc FGIntBezoutBachet*(FGInt1, FGInt2, a, b: var TBigInt)
-proc FGIntModInv*(FGInt1, base: TBigInt, Inverse: var TBigInt)
-proc FGIntPrimetest*(FGIntp: var TBigInt, nrRMtests: int, ok: var bool)
-proc FGIntLegendreSymbol*(a, p: var TBigInt, L: var int)
-proc FGIntSquareRootModP*(Square, Prime: TBigInt, SquareRoot: var TBigInt)
-# implementation
-
-var 
-  primes: array[1..1228, int] = [3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 
-                                 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 
-                                 101, 103, 107, 109, 113, 127, 131, 137, 139, 
-                                 149, 151, 157, 163, 167, 173, 179, 181, 191, 
-                                 193, 197, 199, 211, 223, 227, 229, 233, 239, 
-                                 241, 251, 257, 263, 269, 271, 277, 281, 283, 
-                                 293, 307, 311, 313, 317, 331, 337, 347, 349, 
-                                 353, 359, 367, 373, 379, 383, 389, 397, 401, 
-                                 409, 419, 421, 431, 433, 439, 443, 449, 457, 
-                                 461, 463, 467, 479, 487, 491, 499, 503, 509, 
-                                 521, 523, 541, 547, 557, 563, 569, 571, 577, 
-                                 587, 593, 599, 601, 607, 613, 617, 619, 631, 
-                                 641, 643, 647, 653, 659, 661, 673, 677, 683, 
-                                 691, 701, 709, 719, 727, 733, 739, 743, 751, 
-                                 757, 761, 769, 773, 787, 797, 809, 811, 821, 
-                                 823, 827, 829, 839, 853, 857, 859, 863, 877, 
-                                 881, 883, 887, 907, 911, 919, 929, 937, 941, 
-                                 947, 953, 967, 971, 977, 983, 991, 997, 1009, 
-                                 1013, 1019, 1021, 1031, 1033, 1039, 1049, 1051, 
-                                 1061, 1063, 1069, 1087, 1091, 1093, 1097, 1103, 
-                                 1109, 1117, 1123, 1129, 1151, 1153, 1163, 1171, 
-                                 1181, 1187, 1193, 1201, 1213, 1217, 1223, 1229, 
-                                 1231, 1237, 1249, 1259, 1277, 1279, 1283, 1289, 
-                                 1291, 1297, 1301, 1303, 1307, 1319, 1321, 1327, 
-                                 1361, 1367, 1373, 1381, 1399, 1409, 1423, 1427, 
-                                 1429, 1433, 1439, 1447, 1451, 1453, 1459, 1471, 
-                                 1481, 1483, 1487, 1489, 1493, 1499, 1511, 1523, 
-                                 1531, 1543, 1549, 1553, 1559, 1567, 1571, 1579, 
-                                 1583, 1597, 1601, 1607, 1609, 1613, 1619, 1621, 
-                                 1627, 1637, 1657, 1663, 1667, 1669, 1693, 1697, 
-                                 1699, 1709, 1721, 1723, 1733, 1741, 1747, 1753, 
-                                 1759, 1777, 1783, 1787, 1789, 1801, 1811, 1823, 
-                                 1831, 1847, 1861, 1867, 1871, 1873, 1877, 1879, 
-                                 1889, 1901, 1907, 1913, 1931, 1933, 1949, 1951, 
-                                 1973, 1979, 1987, 1993, 1997, 1999, 2003, 2011, 
-                                 2017, 2027, 2029, 2039, 2053, 2063, 2069, 2081, 
-                                 2083, 2087, 2089, 2099, 2111, 2113, 2129, 2131, 
-                                 2137, 2141, 2143, 2153, 2161, 2179, 2203, 2207, 
-                                 2213, 2221, 2237, 2239, 2243, 2251, 2267, 2269, 
-                                 2273, 2281, 2287, 2293, 2297, 2309, 2311, 2333, 
-                                 2339, 2341, 2347, 2351, 2357, 2371, 2377, 2381, 
-                                 2383, 2389, 2393, 2399, 2411, 2417, 2423, 2437, 
-                                 2441, 2447, 2459, 2467, 2473, 2477, 2503, 2521, 
-                                 2531, 2539, 2543, 2549, 2551, 2557, 2579, 2591, 
-                                 2593, 2609, 2617, 2621, 2633, 2647, 2657, 2659, 
-                                 2663, 2671, 2677, 2683, 2687, 2689, 2693, 2699, 
-                                 2707, 2711, 2713, 2719, 2729, 2731, 2741, 2749, 
-                                 2753, 2767, 2777, 2789, 2791, 2797, 2801, 2803, 
-                                 2819, 2833, 2837, 2843, 2851, 2857, 2861, 2879, 
-                                 2887, 2897, 2903, 2909, 2917, 2927, 2939, 2953, 
-                                 2957, 2963, 2969, 2971, 2999, 3001, 3011, 3019, 
-                                 3023, 3037, 3041, 3049, 3061, 3067, 3079, 3083, 
-                                 3089, 3109, 3119, 3121, 3137, 3163, 3167, 3169, 
-                                 3181, 3187, 3191, 3203, 3209, 3217, 3221, 3229, 
-                                 3251, 3253, 3257, 3259, 3271, 3299, 3301, 3307, 
-                                 3313, 3319, 3323, 3329, 3331, 3343, 3347, 3359, 
-                                 3361, 3371, 3373, 3389, 3391, 3407, 3413, 3433, 
-                                 3449, 3457, 3461, 3463, 3467, 3469, 3491, 3499, 
-                                 3511, 3517, 3527, 3529, 3533, 3539, 3541, 3547, 
-                                 3557, 3559, 3571, 3581, 3583, 3593, 3607, 3613, 
-                                 3617, 3623, 3631, 3637, 3643, 3659, 3671, 3673, 
-                                 3677, 3691, 3697, 3701, 3709, 3719, 3727, 3733, 
-                                 3739, 3761, 3767, 3769, 3779, 3793, 3797, 3803, 
-                                 3821, 3823, 3833, 3847, 3851, 3853, 3863, 3877, 
-                                 3881, 3889, 3907, 3911, 3917, 3919, 3923, 3929, 
-                                 3931, 3943, 3947, 3967, 3989, 4001, 4003, 4007, 
-                                 4013, 4019, 4021, 4027, 4049, 4051, 4057, 4073, 
-                                 4079, 4091, 4093, 4099, 4111, 4127, 4129, 4133, 
-                                 4139, 4153, 4157, 4159, 4177, 4201, 4211, 4217, 
-                                 4219, 4229, 4231, 4241, 4243, 4253, 4259, 4261, 
-                                 4271, 4273, 4283, 4289, 4297, 4327, 4337, 4339, 
-                                 4349, 4357, 4363, 4373, 4391, 4397, 4409, 4421, 
-                                 4423, 4441, 4447, 4451, 4457, 4463, 4481, 4483, 
-                                 4493, 4507, 4513, 4517, 4519, 4523, 4547, 4549, 
-                                 4561, 4567, 4583, 4591, 4597, 4603, 4621, 4637, 
-                                 4639, 4643, 4649, 4651, 4657, 4663, 4673, 4679, 
-                                 4691, 4703, 4721, 4723, 4729, 4733, 4751, 4759, 
-                                 4783, 4787, 4789, 4793, 4799, 4801, 4813, 4817, 
-                                 4831, 4861, 4871, 4877, 4889, 4903, 4909, 4919, 
-                                 4931, 4933, 4937, 4943, 4951, 4957, 4967, 4969, 
-                                 4973, 4987, 4993, 4999, 5003, 5009, 5011, 5021, 
-                                 5023, 5039, 5051, 5059, 5077, 5081, 5087, 5099, 
-                                 5101, 5107, 5113, 5119, 5147, 5153, 5167, 5171, 
-                                 5179, 5189, 5197, 5209, 5227, 5231, 5233, 5237, 
-                                 5261, 5273, 5279, 5281, 5297, 5303, 5309, 5323, 
-                                 5333, 5347, 5351, 5381, 5387, 5393, 5399, 5407, 
-                                 5413, 5417, 5419, 5431, 5437, 5441, 5443, 5449, 
-                                 5471, 5477, 5479, 5483, 5501, 5503, 5507, 5519, 
-                                 5521, 5527, 5531, 5557, 5563, 5569, 5573, 5581, 
-                                 5591, 5623, 5639, 5641, 5647, 5651, 5653, 5657, 
-                                 5659, 5669, 5683, 5689, 5693, 5701, 5711, 5717, 
-                                 5737, 5741, 5743, 5749, 5779, 5783, 5791, 5801, 
-                                 5807, 5813, 5821, 5827, 5839, 5843, 5849, 5851, 
-                                 5857, 5861, 5867, 5869, 5879, 5881, 5897, 5903, 
-                                 5923, 5927, 5939, 5953, 5981, 5987, 6007, 6011, 
-                                 6029, 6037, 6043, 6047, 6053, 6067, 6073, 6079, 
-                                 6089, 6091, 6101, 6113, 6121, 6131, 6133, 6143, 
-                                 6151, 6163, 6173, 6197, 6199, 6203, 6211, 6217, 
-                                 6221, 6229, 6247, 6257, 6263, 6269, 6271, 6277, 
-                                 6287, 6299, 6301, 6311, 6317, 6323, 6329, 6337, 
-                                 6343, 6353, 6359, 6361, 6367, 6373, 6379, 6389, 
-                                 6397, 6421, 6427, 6449, 6451, 6469, 6473, 6481, 
-                                 6491, 6521, 6529, 6547, 6551, 6553, 6563, 6569, 
-                                 6571, 6577, 6581, 6599, 6607, 6619, 6637, 6653, 
-                                 6659, 6661, 6673, 6679, 6689, 6691, 6701, 6703, 
-                                 6709, 6719, 6733, 6737, 6761, 6763, 6779, 6781, 
-                                 6791, 6793, 6803, 6823, 6827, 6829, 6833, 6841, 
-                                 6857, 6863, 6869, 6871, 6883, 6899, 6907, 6911, 
-                                 6917, 6947, 6949, 6959, 6961, 6967, 6971, 6977, 
-                                 6983, 6991, 6997, 7001, 7013, 7019, 7027, 7039, 
-                                 7043, 7057, 7069, 7079, 7103, 7109, 7121, 7127, 
-                                 7129, 7151, 7159, 7177, 7187, 7193, 7207, 7211, 
-                                 7213, 7219, 7229, 7237, 7243, 7247, 7253, 7283, 
-                                 7297, 7307, 7309, 7321, 7331, 7333, 7349, 7351, 
-                                 7369, 7393, 7411, 7417, 7433, 7451, 7457, 7459, 
-                                 7477, 7481, 7487, 7489, 7499, 7507, 7517, 7523, 
-                                 7529, 7537, 7541, 7547, 7549, 7559, 7561, 7573, 
-                                 7577, 7583, 7589, 7591, 7603, 7607, 7621, 7639, 
-                                 7643, 7649, 7669, 7673, 7681, 7687, 7691, 7699, 
-                                 7703, 7717, 7723, 7727, 7741, 7753, 7757, 7759, 
-                                 7789, 7793, 7817, 7823, 7829, 7841, 7853, 7867, 
-                                 7873, 7877, 7879, 7883, 7901, 7907, 7919, 7927, 
-                                 7933, 7937, 7949, 7951, 7963, 7993, 8009, 8011, 
-                                 8017, 8039, 8053, 8059, 8069, 8081, 8087, 8089, 
-                                 8093, 8101, 8111, 8117, 8123, 8147, 8161, 8167, 
-                                 8171, 8179, 8191, 8209, 8219, 8221, 8231, 8233, 
-                                 8237, 8243, 8263, 8269, 8273, 8287, 8291, 8293, 
-                                 8297, 8311, 8317, 8329, 8353, 8363, 8369, 8377, 
-                                 8387, 8389, 8419, 8423, 8429, 8431, 8443, 8447, 
-                                 8461, 8467, 8501, 8513, 8521, 8527, 8537, 8539, 
-                                 8543, 8563, 8573, 8581, 8597, 8599, 8609, 8623, 
-                                 8627, 8629, 8641, 8647, 8663, 8669, 8677, 8681, 
-                                 8689, 8693, 8699, 8707, 8713, 8719, 8731, 8737, 
-                                 8741, 8747, 8753, 8761, 8779, 8783, 8803, 8807, 
-                                 8819, 8821, 8831, 8837, 8839, 8849, 8861, 8863, 
-                                 8867, 8887, 8893, 8923, 8929, 8933, 8941, 8951, 
-                                 8963, 8969, 8971, 8999, 9001, 9007, 9011, 9013, 
-                                 9029, 9041, 9043, 9049, 9059, 9067, 9091, 9103, 
-                                 9109, 9127, 9133, 9137, 9151, 9157, 9161, 9173, 
-                                 9181, 9187, 9199, 9203, 9209, 9221, 9227, 9239, 
-                                 9241, 9257, 9277, 9281, 9283, 9293, 9311, 9319, 
-                                 9323, 9337, 9341, 9343, 9349, 9371, 9377, 9391, 
-                                 9397, 9403, 9413, 9419, 9421, 9431, 9433, 9437, 
-                                 9439, 9461, 9463, 9467, 9473, 9479, 9491, 9497, 
-                                 9511, 9521, 9533, 9539, 9547, 9551, 9587, 9601, 
-                                 9613, 9619, 9623, 9629, 9631, 9643, 9649, 9661, 
-                                 9677, 9679, 9689, 9697, 9719, 9721, 9733, 9739, 
-                                 9743, 9749, 9767, 9769, 9781, 9787, 9791, 9803, 
-                                 9811, 9817, 9829, 9833, 9839, 9851, 9857, 9859, 
-                                 9871, 9883, 9887, 9901, 9907, 9923, 9929, 9931, 
-                                 9941, 9949, 9967, 9973]
-  chr64: array[1..64, char] = ['a', 'A', 'b', 'B', 'c', 'C', 'd', 'D', 'e', 'E', 
-                               'f', 'F', 'g', 'G', 'h', 'H', 'i', 'I', 'j', 'J', 
-                               'k', 'K', 'l', 'L', 'm', 'M', 'n', 'N', 'o', 'O', 
-                               'p', 'P', 'q', 'Q', 'r', 'R', 's', 'S', 't', 'T', 
-                               'u', 'U', 'v', 'V', 'w', 'W', 'x', 'X', 'y', 'Y', 
-                               'z', 'Z', '0', '1', '2', '3', '4', '5', '6', '7', 
-                               '8', '9', '+', '=']
-  PGPchr64: array[1..64, char] = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 
-                                  'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 
-                                  'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 
-                                  'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 
-                                  'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 
-                                  't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', 
-                                  '2', '3', '4', '5', '6', '7', '8', '9', '+', 
-                                  '/']
-
-proc zeronetochar8(g: var char, x: String) = 
-  var b: int8
-  b = 0
-  for i in countup(1, 8): 
-    if copy(x, i, 1) == '1': b = b Or (1 Shl (8 - I))
-  g = chr(b)
-
-proc zeronetochar6(g: var int, x: String) = 
-  G = 0
-  for I in countup(1, len(X)): 
-    if I > 6: break 
-    if X[I] != '0': G = G Or (1 Shl (6 - I))
-  Inc(G)
-
-proc initialize8(trans: var openarray[String]) = 
-  var 
-    x: String
-    g: char
-  for c1 in countup(0, 1): 
-    for c2 in countup(0, 1): 
-      for c3 in countup(0, 1): 
-        for c4 in countup(0, 1): 
-          for c5 in countup(0, 1): 
-            for c6 in countup(0, 1): 
-              for c7 in countup(0, 1): 
-                for c8 in countup(0, 1): 
-                  x = chr(48 + c1) + chr(48 + c2) + chr(48 + c3) + chr(48 + c4) +
-                      chr(48 + c5) + chr(48 + c6) + chr(48 + c7) + chr(48 + c8)
-                  zeronetochar8(g, x)
-                  trans[ord(g)] = x
-  
-proc initialize6(trans: var openarray[String]) = 
-  var 
-    x: String
-    g: int
-  for c1 in countup(0, 1): 
-    for c2 in countup(0, 1): 
-      for c3 in countup(0, 1): 
-        for c4 in countup(0, 1): 
-          for c5 in countup(0, 1): 
-            for c6 in countup(0, 1): 
-              x = chr(48 + c1) + chr(48 + c2) + chr(48 + c3) + chr(48 + c4) +
-                  chr(48 + c5) + chr(48 + c6)
-              zeronetochar6(g, x)
-              trans[ord(chr64[g])] = x
-  
-proc initialize6PGP(trans: var openarray[String]) = 
-  var 
-    x: String
-    g: int
-  for c1 in countup(0, 1): 
-    for c2 in countup(0, 1): 
-      for c3 in countup(0, 1): 
-        for c4 in countup(0, 1): 
-          for c5 in countup(0, 1): 
-            for c6 in countup(0, 1): 
-              x = chr(48 + c1) + chr(48 + c2) + chr(48 + c3) + chr(48 + c4) +
-                  chr(48 + c5) + chr(48 + c6)
-              zeronetochar6(g, x)
-              trans[ord(PGPchr64[g])] = x
-  
-proc ConvertBase256to64(str256: String, str64: var String) = 
-  var 
-    temp: String
-    trans: array[0..255, String]
-    len6: int32
-    g: int
-  initialize8(trans)
-  temp = ""
-  for i in countup(1, len(str256)): temp = temp + trans[ord(str256[i])]
-  while (len(temp) Mod 6) != 0: temp = temp & '0'
-  len6 = len(temp) Div 6
-  str64 = ""
-  for i in countup(1, len6): 
-    zeronetochar6(g, copy(temp, 1, 6))
-    str64 = str64 + chr64[g]
-    delete(temp, 1, 6)
-
-proc ConvertBase64to256(str64: String, str256: var String) = 
-  var 
-    temp: String
-    trans: array[0..255, String]
-    len8: int32
-    g: char
-  initialize6(trans)
-  temp = ""
-  for i in countup(1, len(str64)): temp = temp + trans[ord(str64[i])]
-  str256 = ""
-  len8 = len(temp) Div 8
-  for i in countup(1, len8): 
-    zeronetochar8(g, copy(temp, 1, 8))
-    str256 = str256 + g
-    delete(temp, 1, 8)
-
-proc ConvertBase256to2(str256: String, str2: var String) = 
-  var trans: array[0..255, String]
-  str2 = ""
-  initialize8(trans)
-  for i in countup(1, len(str256)): str2 = str2 + trans[ord(str256[i])]
-  
-proc ConvertBase64to2(str64: String, str2: var String) = 
-  var trans: array[0..255, String]
-  str2 = ""
-  initialize6(trans)
-  for i in countup(1, len(str64)): str2 = str2 + trans[ord(str64[i])]
-  
-proc ConvertBase2to256(str2: String, str256: var String) = 
-  var 
-    len8: int32
-    g: char
-  str256 = ""
-  while (len(str2) Mod 8) != 0: str2 = '0' & str2
-  len8 = len(str2) Div 8
-  for i in countup(1, len8): 
-    zeronetochar8(g, copy(str2, 1, 8))
-    str256 = str256 + g
-    delete(str2, 1, 8)
-
-proc ConvertBase2to64(str2: String, str64: var String) = 
-  var 
-    len6: int32
-    g: int
-  str64 = ""
-  while (len(str2) Mod 6) != 0: str2 = '0' & str2
-  len6 = len(str2) Div 6
-  for i in countup(1, len6): 
-    zeronetochar6(g, copy(str2, 1, 6))
-    str64 = str64 + chr64[g]
-    delete(str2, 1, 6)
-
-proc ConvertBase256StringToHexString(Str256: String, HexStr: var String) = 
-  var b: int8
-  HexStr = ""
-  for i in countup(1, len(str256)): 
-    b = ord(str256[i])
-    if (b Shr 4) < 10: HexStr = HexStr + chr(48 + (b Shr 4))
-    else: HexStr = HexStr + chr(55 + (b Shr 4))
-    if (b And 15) < 10: HexStr = HexStr + chr(48 + (b And 15))
-    else: HexStr = HexStr + chr(55 + (b And 15))
-  
-proc ConvertHexStringToBase256String(HexStr: String, Str256: var String) = 
-  var 
-    b, h1, h2: int8
-    temp: string
-  Str256 = ""
-  if (len(Hexstr) mod 2) == 1: temp = '0' & HexStr
-  else: temp = HexStr
-  for i in countup(1, (len(temp) Div 2)): 
-    h2 = ord(temp[2 * i])
-    h1 = ord(temp[2 * i - 1])
-    if h1 < 58: b = ((h1 - 48) Shl 4)
-    else: b = ((h1 - 55) Shl 4)
-    if h2 < 58: b = (b Or (h2 - 48))
-    else: b = (b Or ((h2 - 55) and 15))
-    Str256 = Str256 + chr(b)
-
-proc PGPConvertBase256to64(str256, str64: var String) = 
-  var 
-    temp, x, a: String
-    len6: int32
-    g: int
-    trans: array[0..255, String]
-  initialize8(trans)
-  temp = ""
-  for i in countup(1, len(str256)): temp = temp + trans[ord(str256[i])]
-  if (len(temp) Mod 6) == 0: 
-    a = ""
-  elif (len(temp) Mod 6) == 4: 
-    temp = temp & "00"
-    a = '='
-  else: 
-    temp = temp & "0000"
-    a = "=="
-  str64 = ""
-  len6 = len(temp) Div 6
-  for i in countup(1, len6): 
-    x = copy(temp, 1, 6)
-    zeronetochar6(g, x)
-    str64 = str64 + PGPchr64[g]
-    delete(temp, 1, 6)
-  str64 = str64 + a
-
-proc PGPConvertBase64to256(str64: String, str256: var String) = 
-  var 
-    temp, x: String
-    j, len8: int32
-    g: char
-    trans: array[0..255, String]
-  initialize6PGP(trans)
-  temp = ""
-  str256 = ""
-  if str64[len(str64) - 1] == '=': j = 2
-  elif str64[len(str64)] == '=': j = 1
-  else: j = 0
-  for i in countup(1, (len(str64) - j)): temp = temp + trans[ord(str64[i])]
-  if j != 0: delete(temp, len(temp) - 2 * j + 1, 2 * j)
-  len8 = len(temp) Div 8
-  for i in countup(1, len8): 
-    x = copy(temp, 1, 8)
-    zeronetochar8(g, x)
-    str256 = str256 + g
-    delete(temp, 1, 8)
-
-proc PGPConvertBase64to2(str64: String, str2: var String) = 
-  var 
-    j: int32
-    trans: array[0..255, String]
-  str2 = ""
-  initialize6(trans)
-  if str64[len(str64) - 1] == '=': j = 2
-  elif str64[len(str64)] == '=': j = 1
-  else: j = 0
-  for i in countup(1, (len(str64) - j)): str2 = str2 + trans[ord(str64[i])]
-  delete(str2, len(str2) - 2 * j + 1, 2 * j)
-
-proc FGIntToBase2String(FGInt: TBigInt, S: var String) = 
-  S = ""
-  for i in countup(1, FGInt.Number[0]): 
-    for j in countup(0, 30): 
-      if (1 And (FGInt.Number[i] Shr j)) == 1: S = '1' & S
-      else: S = '0' & S
-  while (len(S) > 1) And (S[1] == '0'): delete(S, 1, 1)
-  if S == "": S = '0'
-  
-proc Base2StringToFGInt(S: String, FGInt: var TBigInt) = 
-  var i, j, size: int32
-  while (S[1] == '0') And (len(S) > 1): delete(S, 1, 1)
-  size = len(S) Div 31
-  if (len(S) Mod 31) != 0: size = size + 1
-  setlen(FGInt.Number, (size + 1))
-  FGInt.Number[0] = size
-  j = 1
-  FGInt.Number[j] = 0
-  i = 0
-  while len(S) > 0: 
-    if S[len(S)] == '1': FGInt.Number[j] = FGInt.Number[j] Or (1 Shl i)
-    i = i + 1
-    if i == 31: 
-      i = 0
-      j = j + 1
-      if j <= size: FGInt.Number[j] = 0
-    delete(S, len(S), 1)
-  FGInt.Sign = positive
-
-proc FGIntToBase256String(FGInt: TBigInt, str256: var String) = 
-  var 
-    temp1: String
-    len8: int32
-    g: char
-  FGIntToBase2String(FGInt, temp1)
-  while (len(temp1) Mod 8) != 0: temp1 = '0' & temp1
-  len8 = len(temp1) Div 8
-  str256 = ""
-  for i in countup(1, len8): 
-    zeronetochar8(g, copy(temp1, 1, 8))
-    str256 = str256 + g
-    delete(temp1, 1, 8)
-
-proc Base256StringToFGInt(str256: String, FGInt: var TBigInt) = 
-  var 
-    temp1: String
-    trans: array[0..255, String]
-  temp1 = ""
-  initialize8(trans)
-  for i in countup(1, len(str256)): temp1 = temp1 + trans[ord(str256[i])]
-  while (temp1[1] == '0') And (temp1 != '0'): delete(temp1, 1, 1)
-  Base2StringToFGInt(temp1, FGInt)
-
-proc PGPMPIToFGInt(PGPMPI: String, FGInt: var TBigInt) = 
-  var temp: String
-  temp = PGPMPI
-  delete(temp, 1, 2)
-  Base256StringToFGInt(temp, FGInt)
-
-proc FGIntToPGPMPI(FGInt: TBigInt, PGPMPI: var String) = 
-  var 
-    length: int16
-    c: char
-    b: int8
-  FGIntToBase256String(FGInt, PGPMPI)
-  length = len(PGPMPI) * 8
-  c = PGPMPI[1]
-  for i in countdown(7, 0): 
-    if (ord(c) Shr i) == 0: length = length - 1
-    else: break 
-  b = length Mod 256
-  PGPMPI = chr(b) + PGPMPI
-  b = length Div 256
-  PGPMPI = chr(b) + PGPMPI
-
-proc GIntDivByIntBis1(GInt: var TBigInt, by: int32, modres: var int16) = 
-  var size, rest, temp: int32
-  size = GInt.Number[0]
-  temp = 0
-  for i in countdown(size, 1): 
-    temp = temp * 10000
-    rest = temp + GInt.Number[i]
-    GInt.Number[i] = rest Div by
-    temp = rest Mod by
-  modres = temp
-  while (GInt.Number[size] == 0) And (size > 1): size = size - 1
-  if size != GInt.Number[0]: 
-    setlen(GInt.Number, size + 1)
-    GInt.Number[0] = size
-
-proc Base10StringToFGInt(Base10: String, FGInt: var TBigInt) = 
-  var 
-    size: int32
-    j: int16
-    S, x: String
-    sign: TSign
-  while (Not (Base10[1] In {'-', '0'..'9'})) And (len(Base10) > 1): 
-    delete(Base10, 1, 1)
-  if copy(Base10, 1, 1) == '-': 
-    Sign = negative
-    delete(Base10, 1, 1)
-  else: 
-    Sign = positive
-  while (len(Base10) > 1) And (copy(Base10, 1, 1) == '0'): delete(Base10, 1, 1)
-  size = len(Base10) Div 4
-  if (len(Base10) Mod 4) != 0: size = size + 1
-  setlen(FGInt.Number, size + 1)
-  FGInt.Number[0] = size
-  for i in countup(1, (size - 1)): 
-    x = copy(Base10, len(Base10) - 3, 4)
-    FGInt.Number[i] = StrToInt(x)
-    delete(Base10, len(Base10) - 3, 4)
-  FGInt.Number[size] = StrToInt(Base10)
-  S = ""
-  while (FGInt.Number[0] != 1) Or (FGInt.Number[1] != 0): 
-    GIntDivByIntBis1(FGInt, 2, j)
-    S = inttostr(j) + S
-  if S == "": S = '0'
-  FGIntDestroy(FGInt)
-  Base2StringToFGInt(S, FGInt)
-  FGInt.Sign = sign
-
-proc FGIntToBase10String(FGInt: TBigInt, Base10: var String) = 
-  var 
-    S: String
-    j: int32
-    temp: TBigInt
-  FGIntCopy(FGInt, temp)
-  Base10 = ""
-  while (temp.Number[0] > 1) Or (temp.Number[1] > 0): 
-    FGIntDivByIntBis(temp, 10000, j)
-    S = IntToStr(j)
-    while len(S) < 4: S = '0' & S
-    Base10 = S + Base10
-  Base10 = '0' & Base10
-  while (len(Base10) > 1) And (Base10[1] == '0'): delete(Base10, 1, 1)
-  if FGInt.Sign == negative: Base10 = '-' & Base10
-  
-proc FGIntDestroy(FGInt: var TBigInt) = 
-  FGInt.Number = nil
-
-proc FGIntCompareAbs(FGInt1, FGInt2: TBigInt): TCompare = 
-  var size1, size2, i: int32
-  FGIntCompareAbs = Er
-  size1 = FGInt1.Number[0]
-  size2 = FGInt2.Number[0]
-  if size1 > size2: 
-    FGIntCompareAbs = Lt
-  elif size1 < size2: 
-    FGIntCompareAbs = St
-  else: 
-    i = size2
-    while (FGInt1.Number[i] == FGInt2.Number[i]) And (i > 1): i = i - 1
-    if FGInt1.Number[i] == FGInt2.Number[i]: FGIntCompareAbs = Eq
-    elif FGInt1.Number[i] < FGInt2.Number[i]: FGIntCompareAbs = St
-    elif FGInt1.Number[i] > FGInt2.Number[i]: FGIntCompareAbs = Lt
-  
-proc FGIntAdd(FGInt1, FGInt2: TBigInt, Sum: var TBigInt) = 
-  var size1, size2, size, rest, Trest: int32
-  size1 = FGInt1.Number[0]
-  size2 = FGInt2.Number[0]
-  if size1 < size2: 
-    FGIntAdd(FGInt2, FGInt1, Sum)
-  else: 
-    if FGInt1.Sign == FGInt2.Sign: 
-      Sum.Sign = FGInt1.Sign
-      setlen(Sum.Number, (size1 + 2))
-      rest = 0
-      for i in countup(1, size2): 
-        Trest = FGInt1.Number[i]
-        Trest = Trest + FGInt2.Number[i]
-        Trest = Trest + rest
-        Sum.Number[i] = Trest And 2147483647
-        rest = Trest Shr 31
-      for i in countup((size2 + 1), size1): 
-        Trest = FGInt1.Number[i] + rest
-        Sum.Number[i] = Trest And 2147483647
-        rest = Trest Shr 31
-      size = size1 + 1
-      Sum.Number[0] = size
-      Sum.Number[size] = rest
-      while (Sum.Number[size] == 0) And (size > 1): size = size - 1
-      if Sum.Number[0] != size: setlen(Sum.Number, size + 1)
-      Sum.Number[0] = size
-    else: 
-      if FGIntCompareAbs(FGInt2, FGInt1) == Lt: 
-        FGIntAdd(FGInt2, FGInt1, Sum)
-      else: 
-        setlen(Sum.Number, (size1 + 1))
-        rest = 0
-        for i in countup(1, size2): 
-          Trest = 0x80000000  # 2147483648;
-          TRest = Trest + FGInt1.Number[i]
-          TRest = Trest - FGInt2.Number[i]
-          TRest = Trest - rest
-          Sum.Number[i] = Trest And 2147483647
-          if (Trest > 2147483647): rest = 0
-          else: rest = 1
-        for i in countup((size2 + 1), size1): 
-          Trest = 0x80000000
-          TRest = Trest + FGInt1.Number[i]
-          TRest = Trest - rest
-          Sum.Number[i] = Trest And 2147483647
-          if (Trest > 2147483647): rest = 0
-          else: rest = 1
-        size = size1
-        while (Sum.Number[size] == 0) And (size > 1): size = size - 1
-        if size != size1: setlen(Sum.Number, size + 1)
-        Sum.Number[0] = size
-        Sum.Sign = FGInt1.Sign
-
-proc FGIntChangeSign(FGInt: var TBigInt) = 
-  if FGInt.Sign == negative: FGInt.Sign = positive
-  else: FGInt.Sign = negative
-  
-proc FGIntSub(FGInt1, FGInt2, dif: var TBigInt) = 
-  FGIntChangeSign(FGInt2)
-  FGIntAdd(FGInt1, FGInt2, dif)
-  FGIntChangeSign(FGInt2)
-
-proc FGIntMulByInt(FGInt: TBigInt, res: var TBigInt, by: int32) = 
-  var 
-    size, rest: int32
-    Trest: int64
-  size = FGInt.Number[0]
-  setlen(res.Number, (size + 2))
-  rest = 0
-  for i in countup(1, size): 
-    Trest = FGInt.Number[i]
-    TRest = Trest * by
-    TRest = Trest + rest
-    res.Number[i] = Trest And 2147483647
-    rest = Trest Shr 31
-  if rest != 0: 
-    size = size + 1
-    Res.Number[size] = rest
-  else: 
-    setlen(Res.Number, size + 1)
-  Res.Number[0] = size
-  Res.Sign = FGInt.Sign
-
-proc FGIntMulByIntbis(FGInt: var TBigInt, by: int32) = 
-  var 
-    size, rest: int32
-    Trest: int64
-  size = FGInt.Number[0]
-  setlen(FGInt.Number, size + 2)
-  rest = 0
-  for i in countup(1, size): 
-    Trest = FGInt.Number[i]
-    TRest = Trest * by
-    TRest = Trest + rest
-    FGInt.Number[i] = Trest And 2147483647
-    rest = Trest Shr 31
-  if rest != 0: 
-    size = size + 1
-    FGInt.Number[size] = rest
-  else: 
-    setlen(FGInt.Number, size + 1)
-  FGInt.Number[0] = size
-
-proc FGIntDivByInt(FGInt: TBigInt, res: var TBigInt, by: int32, modres: var int32) = 
-  var 
-    size: int32
-    rest: int64
-  size = FGInt.Number[0]
-  setlen(res.Number, (size + 1))
-  modres = 0
-  for i in countdown(size, 1): 
-    rest = modres
-    rest = rest Shl 31
-    rest = rest Or FGInt.Number[i]
-    res.Number[i] = rest Div by
-    modres = rest Mod by
-  while (res.Number[size] == 0) And (size > 1): size = size - 1
-  if size != FGInt.Number[0]: setlen(res.Number, size + 1)
-  res.Number[0] = size
-  Res.Sign = FGInt.Sign
-  if FGInt.sign == negative: modres = by - modres
-  
-proc FGIntDivByIntBis(FGInt: var TBigInt, by: int32, modres: var int32) = 
-  var 
-    size: int32
-    temp, rest: int64
-  size = FGInt.Number[0]
-  temp = 0
-  for i in countdown(size, 1): 
-    temp = temp Shl 31
-    rest = temp Or FGInt.Number[i]
-    FGInt.Number[i] = rest Div by
-    temp = rest Mod by
-  modres = temp
-  while (FGInt.Number[size] == 0) And (size > 1): size = size - 1
-  if size != FGInt.Number[0]: 
-    setlen(FGInt.Number, size + 1)
-    FGInt.Number[0] = size
-
-proc FGIntModByInt(FGInt: TBigInt, by: int32, modres: var int32) = 
-  var 
-    size: int32
-    temp, rest: int64
-  size = FGInt.Number[0]
-  temp = 0
-  for i in countdown(size, 1): 
-    temp = temp Shl 31
-    rest = temp Or FGInt.Number[i]
-    temp = rest Mod by
-  modres = temp
-  if FGInt.sign == negative: modres = by - modres
-  
-proc FGIntAbs(FGInt: var TBigInt) = 
-  FGInt.Sign = positive
-
-proc FGIntCopy(FGInt1: TBigInt, FGInt2: var TBigInt) = 
-  FGInt2.Sign = FGInt1.Sign
-  FGInt2.Number = nil
-  FGInt2.Number = Copy(FGInt1.Number, 0, FGInt1.Number[0] + 1)
-
-proc FGIntShiftLeft(FGInt: var TBigInt) = 
-  var l, m, size: int32
-  size = FGInt.Number[0]
-  l = 0
-  for i in countup(1, Size): 
-    m = FGInt.Number[i] Shr 30
-    FGInt.Number[i] = ((FGInt.Number[i] Shl 1) Or l) And 2147483647
-    l = m
-  if l != 0: 
-    setlen(FGInt.Number, size + 2)
-    FGInt.Number[size + 1] = l
-    FGInt.Number[0] = size + 1
-
-proc FGIntShiftRight(FGInt: var TBigInt) = 
-  var l, m, size: int32
-  size = FGInt.Number[0]
-  l = 0
-  for i in countdown(size, 1): 
-    m = FGInt.Number[i] And 1
-    FGInt.Number[i] = (FGInt.Number[i] Shr 1) Or l
-    l = m Shl 30
-  if (FGInt.Number[size] == 0) And (size > 1): 
-    setlen(FGInt.Number, size)
-    FGInt.Number[0] = size - 1
-
-proc FGIntShiftRightBy31(FGInt: var TBigInt) = 
-  var size: int32
-  size = FGInt.Number[0]
-  if size > 1: 
-    for i in countup(1, size - 1): 
-      FGInt.Number[i] = FGInt.Number[i + 1]
-    setlen(FGInt.Number, Size)
-    FGInt.Number[0] = size - 1
-  else: 
-    FGInt.Number[1] = 0
-  
-proc FGIntAddBis(FGInt1: var TBigInt, FGInt2: TBigInt) = 
-  var size1, size2, Trest, rest: int32
-  size1 = FGInt1.Number[0]
-  size2 = FGInt2.Number[0]
-  rest = 0
-  for i in countup(1, size2): 
-    Trest = FGInt1.Number[i] + FGInt2.Number[i] + rest
-    rest = Trest Shr 31
-    FGInt1.Number[i] = Trest And 2147483647
-  for i in countup(size2 + 1, size1): 
-    Trest = FGInt1.Number[i] + rest
-    rest = Trest Shr 31
-    FGInt1.Number[i] = Trest And 2147483647
-  if rest != 0: 
-    setlen(FGInt1.Number, size1 + 2)
-    FGInt1.Number[0] = size1 + 1
-    FGInt1.Number[size1 + 1] = rest
-
-proc FGIntSubBis(FGInt1: var TBigInt, FGInt2: TBigInt) = 
-  var size1, size2, rest, Trest: int32
-  size1 = FGInt1.Number[0]
-  size2 = FGInt2.Number[0]
-  rest = 0
-  for i in countup(1, size2): 
-    Trest = (0x80000000 Or FGInt1.Number[i]) - FGInt2.Number[i] - rest
-    if (Trest > 2147483647): rest = 0
-    else: rest = 1
-    FGInt1.Number[i] = Trest And 2147483647
-  for i in countup(size2 + 1, size1): 
-    Trest = (0x80000000 Or FGInt1.Number[i]) - rest
-    if (Trest > 2147483647): rest = 0
-    else: rest = 1
-    FGInt1.Number[i] = Trest And 2147483647
-  i = size1
-  while (FGInt1.Number[i] == 0) And (i > 1): i = i - 1
-  if i != size1: 
-    setlen(FGInt1.Number, i + 1)
-    FGInt1.Number[0] = i
-
-proc FGIntMul(FGInt1, FGInt2: TBigInt, Prod: var TBigInt) = 
-  var 
-    size, size1, size2, rest: int32
-    Trest: int64
-  size1 = FGInt1.Number[0]
-  size2 = FGInt2.Number[0]
-  size = size1 + size2
-  setlen(Prod.Number, (size + 1))
-  for i in countup(1, size): Prod.Number[i] = 0
-  for i in countup(1, size2): 
-    rest = 0
-    for j in countup(1, size1): 
-      Trest = FGInt1.Number[j]
-      Trest = Trest * FGInt2.Number[i]
-      Trest = Trest + Prod.Number[j + i - 1]
-      Trest = Trest + rest
-      Prod.Number[j + i - 1] = Trest And 2147483647
-      rest = Trest Shr 31
-    Prod.Number[i + size1] = rest
-  Prod.Number[0] = size
-  while (Prod.Number[size] == 0) And (size > 1): size = size - 1
-  if size != Prod.Number[0]: 
-    setlen(Prod.Number, size + 1)
-    Prod.Number[0] = size
-  if FGInt1.Sign == FGInt2.Sign: Prod.Sign = Positive
-  else: prod.Sign = negative
-  
-proc FGIntSquare(FGInt: TBigInt, Square: var TBigInt) = 
-  var 
-    size, size1, rest: int32
-    Trest: int64
-  size1 = FGInt.Number[0]
-  size = 2 * size1
-  setlen(Square.Number, (size + 1))
-  Square.Number[0] = size
-  for i in countup(1, size): Square.Number[i] = 0
-  for i in countup(1, size1): 
-    Trest = FGInt.Number[i]
-    Trest = Trest * FGInt.Number[i]
-    Trest = Trest + Square.Number[2 * i - 1]
-    Square.Number[2 * i - 1] = Trest And 2147483647
-    rest = Trest Shr 31
-    for j in countup(i + 1, size1): 
-      Trest = FGInt.Number[i] Shl 1
-      Trest = Trest * FGInt.Number[j]
-      Trest = Trest + Square.Number[i + j - 1]
-      Trest = Trest + rest
-      Square.Number[i + j - 1] = Trest And 2147483647
-      rest = Trest Shr 31
-    Square.Number[i + size1] = rest
-  Square.Sign = positive
-  while (Square.Number[size] == 0) And (size > 1): size = size - 1
-  if size != (2 * size1): 
-    setlen(Square.Number, size + 1)
-    Square.Number[0] = size
-
-proc FGIntExp(FGInt, exp: TBigInt, res: var TBigInt) = 
-  var 
-    temp2, temp3: TBigInt
-    S: String
-  FGIntToBase2String(exp, S)
-  if S[len(S)] == '0': Base10StringToFGInt('1', res)
-  else: FGIntCopy(FGInt, res)
-  FGIntCopy(FGInt, temp2)
-  if len(S) > 1: 
-    for i in countdown((len(S) - 1), 1): 
-      FGIntSquare(temp2, temp3)
-      FGIntCopy(temp3, temp2)
-      if S[i] == '1': 
-        FGIntMul(res, temp2, temp3)
-        FGIntCopy(temp3, res)
-  
-proc FGIntFac(FGInt: TBigInt, res: var TBigInt) = 
-  var one, temp, temp1: TBigInt
-  FGIntCopy(FGInt, temp)
-  Base10StringToFGInt('1', res)
-  Base10StringToFGInt('1', one)
-  while Not (FGIntCompareAbs(temp, one) == Eq): 
-    FGIntMul(temp, res, temp1)
-    FGIntCopy(temp1, res)
-    FGIntSubBis(temp, one)
-  FGIntDestroy(one)
-  FGIntDestroy(temp)
-
-proc FGIntShiftLeftBy31(FGInt: var TBigInt) = 
-  var 
-    f1, f2: int32
-    size: int32
-  size = FGInt.Number[0]
-  setlen(FGInt.Number, size + 2)
-  f1 = 0
-  for i in countup(1, (size + 1)): 
-    f2 = FGInt.Number[i]
-    FGInt.Number[i] = f1
-    f1 = f2
-  FGInt.Number[0] = size + 1
-
-proc FGIntDivMod(FGInt1, FGInt2, QFGInt, MFGInt: var TBigInt) = 
-  var 
-    one, zero, temp1, temp2: TBigInt
-    s1, s2: TSign
-    j, s: int32
-    i: int64
-  s1 = FGInt1.Sign
-  s2 = FGInt2.Sign
-  FGIntAbs(FGInt1)
-  FGIntAbs(FGInt2)
-  FGIntCopy(FGInt1, MFGInt)
-  FGIntCopy(FGInt2, temp1)
-  if FGIntCompareAbs(FGInt1, FGInt2) != St: 
-    s = FGInt1.Number[0] - FGInt2.Number[0]
-    setlen(QFGInt.Number, (s + 2))
-    QFGInt.Number[0] = s + 1
-    for t in countup(1, s): 
-      FGIntShiftLeftBy31(temp1)
-      QFGInt.Number[t] = 0
-    j = s + 1
-    QFGInt.Number[j] = 0
-    while FGIntCompareAbs(MFGInt, FGInt2) != St: 
-      while FGIntCompareAbs(MFGInt, temp1) != St: 
-        if MFGInt.Number[0] > temp1.Number[0]: 
-          i = MFGInt.Number[MFGInt.Number[0]]
-          i = i Shl 31
-          i = i + MFGInt.Number[MFGInt.Number[0] - 1]
-          i = i Div (temp1.Number[temp1.Number[0]] + 1)
-        else: 
-          i = MFGInt.Number[MFGInt.Number[0]] Div
-              (temp1.Number[temp1.Number[0]] + 1)
-        if (i != 0): 
-          FGIntCopy(temp1, temp2)
-          FGIntMulByIntBis(temp2, i)
-          FGIntSubBis(MFGInt, temp2)
-          QFGInt.Number[j] = QFGInt.Number[j] + i
-          if FGIntCompareAbs(MFGInt, temp2) != St: 
-            QFGInt.Number[j] = QFGInt.Number[j] + i
-            FGIntSubBis(MFGInt, temp2)
-          FGIntDestroy(temp2)
-        else: 
-          QFGInt.Number[j] = QFGInt.Number[j] + 1
-          FGIntSubBis(MFGInt, temp1)
-      if MFGInt.Number[0] <= temp1.Number[0]: 
-        if FGIntCompareAbs(temp1, FGInt2) != Eq: 
-          FGIntShiftRightBy31(temp1)
-          j = j - 1
-  else: 
-    Base10StringToFGInt('0', QFGInt)
-  s = QFGInt.Number[0]
-  while (s > 1) And (QFGInt.Number[s] == 0): s = s - 1
-  if s < QFGInt.Number[0]: 
-    setlen(QFGInt.Number, s + 1)
-    QFGInt.Number[0] = s
-  QFGInt.Sign = positive
-  FGIntDestroy(temp1)
-  Base10StringToFGInt('0', zero)
-  Base10StringToFGInt('1', one)
-  if s1 == negative: 
-    if FGIntCompareAbs(MFGInt, zero) != Eq: 
-      FGIntadd(QFGInt, one, temp1)
-      FGIntDestroy(QFGInt)
-      FGIntCopy(temp1, QFGInt)
-      FGIntDestroy(temp1)
-      FGIntsub(FGInt2, MFGInt, temp1)
-      FGIntDestroy(MFGInt)
-      FGIntCopy(temp1, MFGInt)
-      FGIntDestroy(temp1)
-    if s2 == positive: QFGInt.Sign = negative
-  else: 
-    QFGInt.Sign = s2
-  FGIntDestroy(one)
-  FGIntDestroy(zero)
-  FGInt1.Sign = s1
-  FGInt2.Sign = s2
-
-proc FGIntDiv(FGInt1, FGInt2, QFGInt: var TBigInt) = 
-  var 
-    one, zero, temp1, temp2, MFGInt: TBigInt
-    s1, s2: TSign
-    j, s: int32
-    i: int64
-  s1 = FGInt1.Sign
-  s2 = FGInt2.Sign
-  FGIntAbs(FGInt1)
-  FGIntAbs(FGInt2)
-  FGIntCopy(FGInt1, MFGInt)
-  FGIntCopy(FGInt2, temp1)
-  if FGIntCompareAbs(FGInt1, FGInt2) != St: 
-    s = FGInt1.Number[0] - FGInt2.Number[0]
-    setlen(QFGInt.Number, (s + 2))
-    QFGInt.Number[0] = s + 1
-    for t in countup(1, s): 
-      FGIntShiftLeftBy31(temp1)
-      QFGInt.Number[t] = 0
-    j = s + 1
-    QFGInt.Number[j] = 0
-    while FGIntCompareAbs(MFGInt, FGInt2) != St: 
-      while FGIntCompareAbs(MFGInt, temp1) != St: 
-        if MFGInt.Number[0] > temp1.Number[0]: 
-          i = MFGInt.Number[MFGInt.Number[0]]
-          i = i Shl 31
-          i = i + MFGInt.Number[MFGInt.Number[0] - 1]
-          i = i Div (temp1.Number[temp1.Number[0]] + 1)
-        else: 
-          i = MFGInt.Number[MFGInt.Number[0]] Div
-              (temp1.Number[temp1.Number[0]] + 1)
-        if (i != 0): 
-          FGIntCopy(temp1, temp2)
-          FGIntMulByIntBis(temp2, i)
-          FGIntSubBis(MFGInt, temp2)
-          QFGInt.Number[j] = QFGInt.Number[j] + i
-          if FGIntCompareAbs(MFGInt, temp2) != St: 
-            QFGInt.Number[j] = QFGInt.Number[j] + i
-            FGIntSubBis(MFGInt, temp2)
-          FGIntDestroy(temp2)
-        else: 
-          QFGInt.Number[j] = QFGInt.Number[j] + 1
-          FGIntSubBis(MFGInt, temp1)
-      if MFGInt.Number[0] <= temp1.Number[0]: 
-        if FGIntCompareAbs(temp1, FGInt2) != Eq: 
-          FGIntShiftRightBy31(temp1)
-          j = j - 1
-  else: 
-    Base10StringToFGInt('0', QFGInt)
-  s = QFGInt.Number[0]
-  while (s > 1) And (QFGInt.Number[s] == 0): s = s - 1
-  if s < QFGInt.Number[0]: 
-    setlen(QFGInt.Number, s + 1)
-    QFGInt.Number[0] = s
-  QFGInt.Sign = positive
-  FGIntDestroy(temp1)
-  Base10StringToFGInt('0', zero)
-  Base10StringToFGInt('1', one)
-  if s1 == negative: 
-    if FGIntCompareAbs(MFGInt, zero) != Eq: 
-      FGIntadd(QFGInt, one, temp1)
-      FGIntDestroy(QFGInt)
-      FGIntCopy(temp1, QFGInt)
-      FGIntDestroy(temp1)
-      FGIntsub(FGInt2, MFGInt, temp1)
-      FGIntDestroy(MFGInt)
-      FGIntCopy(temp1, MFGInt)
-      FGIntDestroy(temp1)
-    if s2 == positive: QFGInt.Sign = negative
-  else: 
-    QFGInt.Sign = s2
-  FGIntDestroy(one)
-  FGIntDestroy(zero)
-  FGIntDestroy(MFGInt)
-  FGInt1.Sign = s1
-  FGInt2.Sign = s2
-
-proc FGIntMod(FGInt1, FGInt2, MFGInt: var TBigInt) = 
-  var 
-    one, zero, temp1, temp2: TBigInt
-    s1, s2: TSign
-    s: int32
-    i: int64
-  s1 = FGInt1.Sign
-  s2 = FGInt2.Sign
-  FGIntAbs(FGInt1)
-  FGIntAbs(FGInt2)
-  FGIntCopy(FGInt1, MFGInt)
-  FGIntCopy(FGInt2, temp1)
-  if FGIntCompareAbs(FGInt1, FGInt2) != St: 
-    s = FGInt1.Number[0] - FGInt2.Number[0]
-    for t in countup(1, s): FGIntShiftLeftBy31(temp1)
-    while FGIntCompareAbs(MFGInt, FGInt2) != St: 
-      while FGIntCompareAbs(MFGInt, temp1) != St: 
-        if MFGInt.Number[0] > temp1.Number[0]: 
-          i = MFGInt.Number[MFGInt.Number[0]]
-          i = i Shl 31
-          i = i + MFGInt.Number[MFGInt.Number[0] - 1]
-          i = i Div (temp1.Number[temp1.Number[0]] + 1)
-        else: 
-          i = MFGInt.Number[MFGInt.Number[0]] Div
-              (temp1.Number[temp1.Number[0]] + 1)
-        if (i != 0): 
-          FGIntCopy(temp1, temp2)
-          FGIntMulByIntBis(temp2, i)
-          FGIntSubBis(MFGInt, temp2)
-          if FGIntCompareAbs(MFGInt, temp2) != St: FGIntSubBis(MFGInt, temp2)
-          FGIntDestroy(temp2)
-        else: 
-          FGIntSubBis(MFGInt, temp1) #         If FGIntCompareAbs(MFGInt, temp1) <> St Then FGIntSubBis(MFGInt,temp1);
-      if MFGInt.Number[0] <= temp1.Number[0]: 
-        if FGIntCompareAbs(temp1, FGInt2) != Eq: FGIntShiftRightBy31(temp1)
-  FGIntDestroy(temp1)
-  Base10StringToFGInt('0', zero)
-  Base10StringToFGInt('1', one)
-  if s1 == negative: 
-    if FGIntCompareAbs(MFGInt, zero) != Eq: 
-      FGIntSub(FGInt2, MFGInt, temp1)
-      FGIntDestroy(MFGInt)
-      FGIntCopy(temp1, MFGInt)
-      FGIntDestroy(temp1)
-  FGIntDestroy(one)
-  FGIntDestroy(zero)
-  FGInt1.Sign = s1
-  FGInt2.Sign = s2
-
-proc FGIntSquareMod(FGInt, Modb, FGIntSM: var TBigInt) = 
-  var temp: TBigInt
-  FGIntSquare(FGInt, temp)
-  FGIntMod(temp, Modb, FGIntSM)
-  FGIntDestroy(temp)
-
-proc FGIntAddMod(FGInt1, FGInt2, base, FGIntres: var TBigInt) = 
-  var temp: TBigInt
-  FGIntadd(FGInt1, FGInt2, temp)
-  FGIntMod(temp, base, FGIntres)
-  FGIntDestroy(temp)
-
-proc FGIntMulMod(FGInt1, FGInt2, base, FGIntres: var TBigInt) = 
-  var temp: TBigInt
-  FGIntMul(FGInt1, FGInt2, temp)
-  FGIntMod(temp, base, FGIntres)
-  FGIntDestroy(temp)
-
-proc FGIntModExp(FGInt, exp, modb, res: var TBigInt) = 
-  var 
-    temp2, temp3: TBigInt
-    S: String
-  if (Modb.Number[1] Mod 2) == 1: 
-    FGIntMontgomeryModExp(FGInt, exp, modb, res)
-    return 
-  FGIntToBase2String(exp, S)
-  Base10StringToFGInt('1', res)
-  FGIntcopy(FGInt, temp2)
-  for i in countdown(len(S), 1): 
-    if S[i] == '1': 
-      FGIntmulMod(res, temp2, modb, temp3)
-      FGIntCopy(temp3, res)
-    FGIntSquareMod(temp2, Modb, temp3)
-    FGIntCopy(temp3, temp2)
-  FGIntDestroy(temp2)
-
-proc FGIntModBis(FGInt: TBigInt, FGIntOut: var TBigInt, b, head: int32) = 
-  if b <= FGInt.Number[0]: 
-    setlen(FGIntOut.Number, (b + 1))
-    for i in countup(0, b): FGIntOut.Number[i] = FGInt.Number[i]
-    FGIntOut.Number[b] = FGIntOut.Number[b] And head
-    i = b
-    while (FGIntOut.Number[i] == 0) And (i > 1): i = i - 1
-    if i < b: setlen(FGIntOut.Number, i + 1)
-    FGIntOut.Number[0] = i
-    FGIntOut.Sign = positive
-  else: 
-    FGIntCopy(FGInt, FGIntOut)
-  
-proc FGIntMulModBis(FGInt1, FGInt2: TBigInt, Prod: var TBigInt, b, head: int32) = 
-  var 
-    size, size1, size2, t, rest: int32
-    Trest: int64
-  size1 = FGInt1.Number[0]
-  size2 = FGInt2.Number[0]
-  size = min(b, size1 + size2)
-  setlen(Prod.Number, (size + 1))
-  for i in countup(1, size): Prod.Number[i] = 0
-  for i in countup(1, size2): 
-    rest = 0
-    t = min(size1, b - i + 1)
-    for j in countup(1, t): 
-      Trest = FGInt1.Number[j]
-      Trest = Trest * FGInt2.Number[i]
-      Trest = Trest + Prod.Number[j + i - 1]
-      Trest = Trest + rest
-      Prod.Number[j + i - 1] = Trest And 2147483647
-      rest = Trest Shr 31
-    if (i + size1) <= b: Prod.Number[i + size1] = rest
-  Prod.Number[0] = size
-  if size == b: Prod.Number[b] = Prod.Number[b] And head
-  while (Prod.Number[size] == 0) And (size > 1): size = size - 1
-  if size < Prod.Number[0]: 
-    setlen(Prod.Number, size + 1)
-    Prod.Number[0] = size
-  if FGInt1.Sign == FGInt2.Sign: Prod.Sign = Positive
-  else: prod.Sign = negative
-  
-proc FGIntMontgomeryMod(GInt, base, baseInv: TBigInt, MGInt: var TBigInt, 
-                        b: int32, head: int32) = 
-  var 
-    m, temp, temp1: TBigInt
-    r: int32
-  FGIntModBis(GInt, temp, b, head)
-  FGIntMulModBis(temp, baseInv, m, b, head)
-  FGIntMul(m, base, temp1)
-  FGIntDestroy(temp)
-  FGIntAdd(temp1, GInt, temp)
-  FGIntDestroy(temp1)
-  MGInt.Number = copy(temp.Number, b - 1, temp.Number[0] - b + 2)
-  MGInt.Sign = positive
-  MGInt.Number[0] = temp.Number[0] - b + 1
-  FGIntDestroy(temp)
-  if (head Shr 30) == 0: FGIntDivByIntBis(MGInt, head + 1, r)
-  else: FGIntShiftRightBy31(MGInt)
-  if FGIntCompareAbs(MGInt, base) != St: FGIntSubBis(MGInt, base)
-  FGIntDestroy(temp)
-  FGIntDestroy(m)
-
-proc FGIntMontgomeryModExp(FGInt, exp, modb, res: var TBigInt) = 
-  var 
-    temp2, temp3, baseInv, r, zero: TBigInt
-    t, b, head: int32
-    S: String
-  Base2StringToFGInt('0', zero)
-  FGIntMod(FGInt, modb, res)
-  if FGIntCompareAbs(res, zero) == Eq: 
-    FGIntDestroy(zero)
-    return 
-  else: 
-    FGIntDestroy(res)
-  FGIntDestroy(zero)
-  FGIntToBase2String(exp, S)
-  t = modb.Number[0]
-  b = t
-  if (modb.Number[t] Shr 30) == 1: t = t + 1
-  setlen(r.Number, (t + 1))
-  r.Number[0] = t
-  r.Sign = positive
-  for i in countup(1, t): r.Number[i] = 0
-  if t == modb.Number[0]: 
-    head = 2147483647
-    for j in countdown(29, 0): 
-      head = head Shr 1
-      if (modb.Number[t] Shr j) == 1: 
-        r.Number[t] = 1 Shl (j + 1)
-        break 
-  else: 
-    r.Number[t] = 1
-    head = 2147483647
-  FGIntModInv(modb, r, temp2)
-  if temp2.Sign == negative: 
-    FGIntCopy(temp2, BaseInv)
-  else: 
-    FGIntCopy(r, BaseInv)
-    FGIntSubBis(BaseInv, temp2)
-  FGIntAbs(BaseInv)
-  FGIntDestroy(temp2)
-  FGIntMod(r, modb, res)
-  FGIntMulMod(FGInt, res, modb, temp2)
-  FGIntDestroy(r)
-  for i in countdown(len(S), 1): 
-    if S[i] == '1': 
-      FGIntmul(res, temp2, temp3)
-      FGIntDestroy(res)
-      FGIntMontgomeryMod(temp3, modb, baseinv, res, b, head)
-      FGIntDestroy(temp3)
-    FGIntSquare(temp2, temp3)
-    FGIntDestroy(temp2)
-    FGIntMontgomeryMod(temp3, modb, baseinv, temp2, b, head)
-    FGIntDestroy(temp3)
-  FGIntDestroy(temp2)
-  FGIntMontgomeryMod(res, modb, baseinv, temp3, b, head)
-  FGIntCopy(temp3, res)
-  FGIntDestroy(temp3)
-  FGIntDestroy(baseinv)
-
-proc FGIntGCD(FGInt1, FGInt2: TBigInt, GCD: var TBigInt) = 
-  var 
-    k: TCompare
-    zero, temp1, temp2, temp3: TBigInt
-  k = FGIntCompareAbs(FGInt1, FGInt2)
-  if (k == Eq): 
-    FGIntCopy(FGInt1, GCD)
-  elif (k == St): 
-    FGIntGCD(FGInt2, FGInt1, GCD)
-  else: 
-    Base10StringToFGInt('0', zero)
-    FGIntCopy(FGInt1, temp1)
-    FGIntCopy(FGInt2, temp2)
-    while (temp2.Number[0] != 1) Or (temp2.Number[1] != 0): 
-      FGIntMod(temp1, temp2, temp3)
-      FGIntCopy(temp2, temp1)
-      FGIntCopy(temp3, temp2)
-      FGIntDestroy(temp3)
-    FGIntCopy(temp1, GCD)
-    FGIntDestroy(temp2)
-    FGIntDestroy(zero)
-
-proc FGIntLCM(FGInt1, FGInt2: TBigInt, LCM: var TBigInt) = 
-  var temp1, temp2: TBigInt
-  FGIntGCD(FGInt1, FGInt2, temp1)
-  FGIntmul(FGInt1, FGInt2, temp2)
-  FGIntdiv(temp2, temp1, LCM)
-  FGIntDestroy(temp1)
-  FGIntDestroy(temp2)
-
-proc FGIntTrialDiv9999(FGInt: TBigInt, ok: var bool) = 
-  var 
-    j: int32
-    i: int
-  if ((FGInt.Number[1] Mod 2) == 0): 
-    ok = false
-  else: 
-    i = 0
-    ok = true
-    while ok And (i < 1228): 
-      i = i + 1
-      FGIntmodbyint(FGInt, primes[i], j)
-      if j == 0: ok = false
-  
-proc FGIntRandom1(Seed, RandomFGInt: var TBigInt) = 
-  var temp, base: TBigInt
-  Base10StringToFGInt("281474976710656", base)
-  Base10StringToFGInt("44485709377909", temp)
-  FGIntMulMod(seed, temp, base, RandomFGInt)
-  FGIntDestroy(temp)
-  FGIntDestroy(base)
-
-proc FGIntRabinMiller(FGIntp: var TBigInt, nrtest: int32, ok: var bool) = 
-  var 
-    j, b, i: int32
-    m, z, temp1, temp2, temp3, zero, one, two, pmin1: TBigInt
-    ok1, ok2: bool
-  randomize
-  j = 0
-  Base10StringToFGInt('0', zero)
-  Base10StringToFGInt('1', one)
-  Base10StringToFGInt('2', two)
-  FGIntsub(FGIntp, one, temp1)
-  FGIntsub(FGIntp, one, pmin1)
-  b = 0
-  while (temp1.Number[1] Mod 2) == 0: 
-    b = b + 1
-    FGIntShiftRight(temp1)
-  m = temp1
-  i = 0
-  ok = true
-  Randomize
-  while (i < nrtest) And ok: 
-    i = i + 1
-    Base10StringToFGInt(inttostr(Primes[Random(1227) + 1]), temp2)
-    FGIntMontGomeryModExp(temp2, m, FGIntp, z)
-    FGIntDestroy(temp2)
-    ok1 = (FGIntCompareAbs(z, one) == Eq)
-    ok2 = (FGIntCompareAbs(z, pmin1) == Eq)
-    if Not (ok1 Or ok2): 
-      while (ok And (j < b)): 
-        if (j > 0) And ok1: 
-          ok = false
-        else: 
-          j = j + 1
-          if (j < b) And (Not ok2): 
-            FGIntSquaremod(z, FGIntp, temp3)
-            FGIntCopy(temp3, z)
-            ok1 = (FGIntCompareAbs(z, one) == Eq)
-            ok2 = (FGIntCompareAbs(z, pmin1) == Eq)
-            if ok2: j = b
-          elif (Not ok2) And (j >= b): 
-            ok = false
-  FGIntDestroy(zero)
-  FGIntDestroy(one)
-  FGIntDestroy(two)
-  FGIntDestroy(m)
-  FGIntDestroy(z)
-  FGIntDestroy(pmin1)
-
-proc FGIntBezoutBachet(FGInt1, FGInt2, a, b: var TBigInt) = 
-  var zero, r1, r2, r3, ta, gcd, temp, temp1, temp2: TBigInt
-  if FGIntCompareAbs(FGInt1, FGInt2) != St: 
-    FGIntcopy(FGInt1, r1)
-    FGIntcopy(FGInt2, r2)
-    Base10StringToFGInt('0', zero)
-    Base10StringToFGInt('1', a)
-    Base10StringToFGInt('0', ta)
-    while true: 
-      FGIntdivmod(r1, r2, temp, r3)
-      FGIntDestroy(r1)
-      r1 = r2
-      r2 = r3
-      FGIntmul(ta, temp, temp1)
-      FGIntsub(a, temp1, temp2)
-      FGIntCopy(ta, a)
-      FGIntCopy(temp2, ta)
-      FGIntDestroy(temp1)
-      FGIntDestroy(temp)
-      if FGIntCompareAbs(r3, zero) == Eq: break 
-    FGIntGCD(FGInt1, FGInt2, gcd)
-    FGIntmul(a, FGInt1, temp1)
-    FGIntsub(gcd, temp1, temp2)
-    FGIntDestroy(temp1)
-    FGIntdiv(temp2, FGInt2, b)
-    FGIntDestroy(temp2)
-    FGIntDestroy(ta)
-    FGIntDestroy(r1)
-    FGIntDestroy(r2)
-    FGIntDestroy(gcd)
-  else: 
-    FGIntBezoutBachet(FGInt2, FGInt1, b, a)
-  
-proc FGIntModInv(FGInt1, base: TBigInt, Inverse: var TBigInt) = 
-  var zero, one, r1, r2, r3, tb, gcd, temp, temp1, temp2: TBigInt
-  Base10StringToFGInt('1', one)
-  FGIntGCD(FGInt1, base, gcd)
-  if FGIntCompareAbs(one, gcd) == Eq: 
-    FGIntcopy(base, r1)
-    FGIntcopy(FGInt1, r2)
-    Base10StringToFGInt('0', zero)
-    Base10StringToFGInt('0', inverse)
-    Base10StringToFGInt('1', tb)
-    while true: 
-      FGIntDestroy(r3)
-      FGIntdivmod(r1, r2, temp, r3)
-      FGIntCopy(r2, r1)
-      FGIntCopy(r3, r2)
-      FGIntmul(tb, temp, temp1)
-      FGIntsub(inverse, temp1, temp2)
-      FGIntDestroy(inverse)
-      FGIntDestroy(temp1)
-      FGIntCopy(tb, inverse)
-      FGIntCopy(temp2, tb)
-      FGIntDestroy(temp)
-      if FGIntCompareAbs(r3, zero) == Eq: break 
-    if inverse.Sign == negative: 
-      FGIntadd(base, inverse, temp)
-      FGIntCopy(temp, inverse)
-    FGIntDestroy(tb)
-    FGIntDestroy(r1)
-    FGIntDestroy(r2)
-  FGIntDestroy(gcd)
-  FGIntDestroy(one)
-
-proc FGIntPrimetest(FGIntp: var TBigInt, nrRMtests: int, ok: var bool) = 
-  FGIntTrialdiv9999(FGIntp, ok)
-  if ok: FGIntRabinMiller(FGIntp, nrRMtests, ok)
-  
-proc FGIntLegendreSymbol(a, p: var TBigInt, L: var int) = 
-  var 
-    temp1, temp2, temp3, temp4, temp5, zero, one: TBigInt
-    i: int32
-    ok1, ok2: bool
-  Base10StringToFGInt('0', zero)
-  Base10StringToFGInt('1', one)
-  FGIntMod(a, p, temp1)
-  if FGIntCompareAbs(zero, temp1) == Eq: 
-    FGIntDestroy(temp1)
-    L = 0
-  else: 
-    FGIntDestroy(temp1)
-    FGIntCopy(p, temp1)
-    FGIntCopy(a, temp2)
-    L = 1
-    while FGIntCompareAbs(temp2, one) != Eq: 
-      if (temp2.Number[1] Mod 2) == 0: 
-        FGIntSquare(temp1, temp3)
-        FGIntSub(temp3, one, temp4)
-        FGIntDestroy(temp3)
-        FGIntDivByInt(temp4, temp3, 8, i)
-        if (temp3.Number[1] Mod 2) == 0: ok1 = false
-        else: ok1 = true
-        FGIntDestroy(temp3)
-        FGIntDestroy(temp4)
-        if ok1 == true: L = L * (- 1)
-        FGIntDivByIntBis(temp2, 2, i)
-      else: 
-        FGIntSub(temp1, one, temp3)
-        FGIntSub(temp2, one, temp4)
-        FGIntMul(temp3, temp4, temp5)
-        FGIntDestroy(temp3)
-        FGIntDestroy(temp4)
-        FGIntDivByInt(temp5, temp3, 4, i)
-        if (temp3.Number[1] Mod 2) == 0: ok2 = false
-        else: ok2 = true
-        FGIntDestroy(temp5)
-        FGIntDestroy(temp3)
-        if ok2 == true: L = L * (- 1)
-        FGIntMod(temp1, temp2, temp3)
-        FGIntCopy(temp2, temp1)
-        FGIntCopy(temp3, temp2)
-    FGIntDestroy(temp1)
-    FGIntDestroy(temp2)
-  FGIntDestroy(zero)
-  FGIntDestroy(one)
-
-proc FGIntSquareRootModP(Square, Prime: TBigInt, SquareRoot: var TBigInt) = 
-  var 
-    one, n, b, s, r, temp, temp1, temp2, temp3: TBigInt
-    a: int32
-    L: int
-  Base2StringToFGInt('1', one)
-  Base2StringToFGInt("10", n)
-  a = 0
-  FGIntLegendreSymbol(n, Prime, L)
-  while L != - 1: 
-    FGIntAddBis(n, one)
-    FGIntLegendreSymbol(n, Prime, L)
-  FGIntCopy(Prime, s)
-  s.Number[1] = s.Number[1] - 1
-  while (s.Number[1] Mod 2) == 0: 
-    FGIntShiftRight(s)
-    a = a + 1
-  FGIntMontgomeryModExp(n, s, Prime, b)
-  FGIntAdd(s, one, temp)
-  FGIntShiftRight(temp)
-  FGIntMontgomeryModExp(Square, temp, Prime, r)
-  FGIntDestroy(temp)
-  FGIntModInv(Square, Prime, temp1)
-  for i in countup(0, (a - 2)): 
-    FGIntSquareMod(r, Prime, temp2)
-    FGIntMulMod(temp1, temp2, Prime, temp)
-    FGIntDestroy(temp2)
-    for j in countup(1, (a - i - 2)): 
-      FGIntSquareMod(temp, Prime, temp2)
-      FGIntDestroy(temp)
-      FGIntCopy(temp2, temp)
-      FGIntDestroy(temp2)
-    if FGIntCompareAbs(temp, one) != Eq: 
-      FGIntMulMod(r, b, Prime, temp3)
-      FGIntDestroy(r)
-      FGIntCopy(temp3, r)
-      FGIntDestroy(temp3)
-    FGIntDestroy(temp)
-    FGIntDestroy(temp2)
-    if i == (a - 2): break 
-    FGIntSquareMod(b, Prime, temp3)
-    FGIntDestroy(b)
-    FGIntCopy(temp3, b)
-    FGIntDestroy(temp3)
-  FGIntCopy(r, SquareRoot)
-  FGIntDestroy(r)
-  FGIntDestroy(s)
-  FGIntDestroy(b)
-  FGIntDestroy(temp1)
-  FGIntDestroy(one)
-  FGIntDestroy(n)
diff --git a/lib/base/devel/diff.nim b/lib/base/devel/diff.nim
deleted file mode 100644
index 4fda69b45..000000000
--- a/lib/base/devel/diff.nim
+++ /dev/null
@@ -1,460 +0,0 @@
-#
-#
-#            Nimrod's Runtime Library
-#        (c) Copyright 2008 Andreas Rumpf
-#
-#    See the file "copying.txt", included in this
-#    distribution, for details about the copyright.
-#
-
-## This module implements the Difference Algorithm published in
-## "An O(ND) Difference Algorithm and its Variations" by Eugene Myers
-## Algorithmica Vol. 1 No. 2, 1986, p 251.  
-
-## This implementation is based on:
-##
-## diff.cs: A port of the algorythm to C#
-## Copyright (c) by Matthias Hertel, http://www.mathertel.de
-## This work is licensed under a BSD style license. 
-## See http://www.mathertel.de/License.aspx
-
-{.push debugger:off .} # the user does not want to trace a part
-                       # of the standard library!
-
-import 
-  strutils
-
-type
-  TResultItem* = object of TObject
-    startA*: int ## start of line number in A
-    startB*: int ## start of line number in B
-    deletedA*: int ## number of deletions in A
-    deletedB*: int ## number of deletions in B
-
-  SMSRD = tuple[x, y: int] ## shortest middle snake return data
-  
-  TDiffData {.final.} = object 
-    len: int
-    data: seq[int]
-    modified: seq[bool]
-  
-proc diffText*(a, b: seq[string], 
-               eq: proc (x, y: string): bool): seq[TResultItem] =
-  ## returns the difference of two texts `a` and `b`. The texts are compared
-  ## line by line with the `eq` proc.
-  nil
-
-proc diffText*(a, b: string, eq: proc (x, y: string): bool): seq[TResultItem] =
-  ## returns the difference of two texts `a` and `b`. The texts are compared
-  ## line by line with the `eq` proc.
-  result = diffText(linesSeq(a), linesSeq(b), eq)
-
-    /// <summary>details of one difference.</summary>
-    public struct Item
-    {
-      /// <summary>Start Line number in Data A.</summary>
-      public int StartA;
-      /// <summary>Start Line number in Data B.</summary>
-      public int StartB;
-
-      /// <summary>Number of changes in Data A.</summary>
-      public int deletedA;
-      /// <summary>Number of changes in Data B.</summary>
-      public int insertedB;
-    } // Item
-
-    /// <summary>
-    /// Shortest Middle Snake Return Data
-    /// </summary>
-    private struct SMSRD
-    {
-      internal int x, y;
-      // internal int u, v;  // 2002.09.20: no need for 2 points 
-    }
-
-
-    /// <summary>
-    /// Find the difference in 2 texts, comparing by textlines.
-    /// </summary>
-    /// <param name="TextA">A-version of the text (usualy the old one)</param>
-    /// <param name="TextB">B-version of the text (usualy the new one)</param>
-    /// <returns>Returns a array of Items that describe the differences.</returns>
-    public Item[] DiffText(string TextA, string TextB) {
-      return (DiffText(TextA, TextB, false, false, false));
-    } // DiffText
-
-
-    /// <summary>
-    /// Find the difference in 2 text documents, comparing by textlines.
-    /// The algorithm itself is comparing 2 arrays of numbers so when comparing 2 text documents
-    /// each line is converted into a (hash) number. This hash-value is computed by storing all
-    /// textlines into a common hashtable so i can find dublicates in there, and generating a 
-    /// new number each time a new textline is inserted.
-    /// </summary>
-    /// <param name="TextA">A-version of the text (usualy the old one)</param>
-    /// <param name="TextB">B-version of the text (usualy the new one)</param>
-    /// <param name="trimSpace">When set to true, all leading and trailing whitespace characters are stripped out before the comparation is done.</param>
-    /// <param name="ignoreSpace">When set to true, all whitespace characters are converted to a single space character before the comparation is done.</param>
-    /// <param name="ignoreCase">When set to true, all characters are converted to their lowercase equivivalence before the comparation is done.</param>
-    /// <returns>Returns a array of Items that describe the differences.</returns>
-    public static Item[] DiffText(string TextA, string TextB, bool trimSpace, bool ignoreSpace, bool ignoreCase) {
-      // prepare the input-text and convert to comparable numbers.
-      Hashtable h = new Hashtable(TextA.Length + TextB.Length);
-
-      // The A-Version of the data (original data) to be compared.
-      DiffData DataA = new DiffData(DiffCodes(TextA, h, trimSpace, ignoreSpace, ignoreCase));
-
-      // The B-Version of the data (modified data) to be compared.
-      DiffData DataB = new DiffData(DiffCodes(TextB, h, trimSpace, ignoreSpace, ignoreCase));
-
-      h = null; // free up hashtable memory (maybe)
-
-      int MAX = DataA.Length + DataB.Length + 1;
-      /// vector for the (0,0) to (x,y) search
-      int[] DownVector = new int[2 * MAX + 2];
-      /// vector for the (u,v) to (N,M) search
-      int[] UpVector = new int[2 * MAX + 2];
-
-      LCS(DataA, 0, DataA.Length, DataB, 0, DataB.Length, DownVector, UpVector);
-
-      Optimize(DataA);
-      Optimize(DataB);
-      return CreateDiffs(DataA, DataB);
-    } // DiffText
-
-
-proc Optimize(d: var TDiffData) =
-  ## If a sequence of modified lines starts with a line that contains the 
-  ## same content as the line that appends the changes, the difference sequence
-  ## is modified so that the appended line and not the starting line is marked
-  ## as modified. This leads to more readable diff sequences when comparing
-  ## text files.
-  var startPos = 0
-  while startPos < d.len:
-    while StartPos < d.len and not d.modified[StartPos]: inc(startPos)
-    var endPos = startPos
-    while EndPos < d.len and d.modified[EndPos]: inc(endPos)
-    if EndPos < d.len and d.data[StartPos] == d.data[EndPos]:
-      d.modified[StartPos] = false
-      d.modified[EndPos] = true
-    else:
-      StartPos = EndPos
-
-
-    /// <summary>
-    /// Find the difference in 2 arrays of integers.
-    /// </summary>
-    /// <param name="ArrayA">A-version of the numbers (usualy the old one)</param>
-    /// <param name="ArrayB">B-version of the numbers (usualy the new one)</param>
-    /// <returns>Returns a array of Items that describe the differences.</returns>
-    public static Item[] DiffInt(int[] ArrayA, int[] ArrayB) {
-      // The A-Version of the data (original data) to be compared.
-      DiffData DataA = new DiffData(ArrayA);
-
-      // The B-Version of the data (modified data) to be compared.
-      DiffData DataB = new DiffData(ArrayB);
-
-      int MAX = DataA.Length + DataB.Length + 1;
-      /// vector for the (0,0) to (x,y) search
-      int[] DownVector = new int[2 * MAX + 2];
-      /// vector for the (u,v) to (N,M) search
-      int[] UpVector = new int[2 * MAX + 2];
-
-      LCS(DataA, 0, DataA.Length, DataB, 0, DataB.Length, DownVector, UpVector);
-      return CreateDiffs(DataA, DataB);
-    } // Diff
-
-
-    /// <summary>
-    /// This function converts all textlines of the text into unique numbers for every unique textline
-    /// so further work can work only with simple numbers.
-    /// </summary>
-    /// <param name="aText">the input text</param>
-    /// <param name="h">This extern initialized hashtable is used for storing all ever used textlines.</param>
-    /// <param name="trimSpace">ignore leading and trailing space characters</param>
-    /// <returns>a array of integers.</returns>
-    private static int[] DiffCodes(string aText, Hashtable h, bool trimSpace, bool ignoreSpace, bool ignoreCase) {
-      // get all codes of the text
-      string[] Lines;
-      int[] Codes;
-      int lastUsedCode = h.Count;
-      object aCode;
-      string s;
-
-      // strip off all cr, only use lf as textline separator.
-      aText = aText.Replace("\r", "");
-      Lines = aText.Split('\n');
-
-      Codes = new int[Lines.Length];
-
-      for (int i = 0; i < Lines.Length; ++i) {
-        s = Lines[i];
-        if (trimSpace)
-          s = s.Trim();
-
-        if (ignoreSpace) {
-          s = Regex.Replace(s, "\\s+", " ");            // TODO: optimization: faster blank removal.
-        }
-
-        if (ignoreCase)
-          s = s.ToLower();
-
-        aCode = h[s];
-        if (aCode == null) {
-          lastUsedCode++;
-          h[s] = lastUsedCode;
-          Codes[i] = lastUsedCode;
-        } else {
-          Codes[i] = (int)aCode;
-        } // if
-      } // for
-      return (Codes);
-    } // DiffCodes
-
-
-    /// <summary>
-    /// This is the algorithm to find the Shortest Middle Snake (SMS).
-    /// </summary>
-    /// <param name="DataA">sequence A</param>
-    /// <param name="LowerA">lower bound of the actual range in DataA</param>
-    /// <param name="UpperA">upper bound of the actual range in DataA (exclusive)</param>
-    /// <param name="DataB">sequence B</param>
-    /// <param name="LowerB">lower bound of the actual range in DataB</param>
-    /// <param name="UpperB">upper bound of the actual range in DataB (exclusive)</param>
-    /// <param name="DownVector">a vector for the (0,0) to (x,y) search. Passed as a parameter for speed reasons.</param>
-    /// <param name="UpVector">a vector for the (u,v) to (N,M) search. Passed as a parameter for speed reasons.</param>
-    /// <returns>a MiddleSnakeData record containing x,y and u,v</returns>
-    private static SMSRD SMS(DiffData DataA, int LowerA, int UpperA, DiffData DataB, int LowerB, int UpperB,
-      int[] DownVector, int[] UpVector) {
-
-      SMSRD ret;
-      int MAX = DataA.Length + DataB.Length + 1;
-
-      int DownK = LowerA - LowerB; // the k-line to start the forward search
-      int UpK = UpperA - UpperB; // the k-line to start the reverse search
-
-      int Delta = (UpperA - LowerA) - (UpperB - LowerB);
-      bool oddDelta = (Delta & 1) != 0;
-
-      // The vectors in the publication accepts negative indexes. the vectors implemented here are 0-based
-      // and are access using a specific offset: UpOffset UpVector and DownOffset for DownVektor
-      int DownOffset = MAX - DownK;
-      int UpOffset = MAX - UpK;
-
-      int MaxD = ((UpperA - LowerA + UpperB - LowerB) / 2) + 1;
-
-      // Debug.Write(2, "SMS", String.Format("Search the box: A[{0}-{1}] to B[{2}-{3}]", LowerA, UpperA, LowerB, UpperB));
-
-      // init vectors
-      DownVector[DownOffset + DownK + 1] = LowerA;
-      UpVector[UpOffset + UpK - 1] = UpperA;
-
-      for (int D = 0; D <= MaxD; D++) {
-
-        // Extend the forward path.
-        for (int k = DownK - D; k <= DownK + D; k += 2) {
-          // Debug.Write(0, "SMS", "extend forward path " + k.ToString());
-
-          // find the only or better starting point
-          int x, y;
-          if (k == DownK - D) {
-            x = DownVector[DownOffset + k + 1]; // down
-          } else {
-            x = DownVector[DownOffset + k - 1] + 1; // a step to the right
-            if ((k < DownK + D) && (DownVector[DownOffset + k + 1] >= x))
-              x = DownVector[DownOffset + k + 1]; // down
-          }
-          y = x - k;
-
-          // find the end of the furthest reaching forward D-path in diagonal k.
-          while ((x < UpperA) && (y < UpperB) && (DataA.data[x] == DataB.data[y])) {
-            x++; y++;
-          }
-          DownVector[DownOffset + k] = x;
-
-          // overlap ?
-          if (oddDelta && (UpK - D < k) && (k < UpK + D)) {
-            if (UpVector[UpOffset + k] <= DownVector[DownOffset + k]) {
-              ret.x = DownVector[DownOffset + k];
-              ret.y = DownVector[DownOffset + k] - k;
-              // ret.u = UpVector[UpOffset + k];      // 2002.09.20: no need for 2 points 
-              // ret.v = UpVector[UpOffset + k] - k;
-              return (ret);
-            } // if
-          } // if
-
-        } // for k
-
-        // Extend the reverse path.
-        for (int k = UpK - D; k <= UpK + D; k += 2) {
-          // Debug.Write(0, "SMS", "extend reverse path " + k.ToString());
-
-          // find the only or better starting point
-          int x, y;
-          if (k == UpK + D) {
-            x = UpVector[UpOffset + k - 1]; // up
-          } else {
-            x = UpVector[UpOffset + k + 1] - 1; // left
-            if ((k > UpK - D) && (UpVector[UpOffset + k - 1] < x))
-              x = UpVector[UpOffset + k - 1]; // up
-          } // if
-          y = x - k;
-
-          while ((x > LowerA) && (y > LowerB) && (DataA.data[x - 1] == DataB.data[y - 1])) {
-            x--; y--; // diagonal
-          }
-          UpVector[UpOffset + k] = x;
-
-          // overlap ?
-          if (!oddDelta && (DownK - D <= k) && (k <= DownK + D)) {
-            if (UpVector[UpOffset + k] <= DownVector[DownOffset + k]) {
-              ret.x = DownVector[DownOffset + k];
-              ret.y = DownVector[DownOffset + k] - k;
-              // ret.u = UpVector[UpOffset + k];     // 2002.09.20: no need for 2 points 
-              // ret.v = UpVector[UpOffset + k] - k;
-              return (ret);
-            } // if
-          } // if
-
-        } // for k
-
-      } // for D
-
-      throw new ApplicationException("the algorithm should never come here.");
-    } // SMS
-
-
-    /// <summary>
-    /// This is the divide-and-conquer implementation of the longes common-subsequence (LCS) 
-    /// algorithm.
-    /// The published algorithm passes recursively parts of the A and B sequences.
-    /// To avoid copying these arrays the lower and upper bounds are passed while the sequences stay constant.
-    /// </summary>
-    /// <param name="DataA">sequence A</param>
-    /// <param name="LowerA">lower bound of the actual range in DataA</param>
-    /// <param name="UpperA">upper bound of the actual range in DataA (exclusive)</param>
-    /// <param name="DataB">sequence B</param>
-    /// <param name="LowerB">lower bound of the actual range in DataB</param>
-    /// <param name="UpperB">upper bound of the actual range in DataB (exclusive)</param>
-    /// <param name="DownVector">a vector for the (0,0) to (x,y) search. Passed as a parameter for speed reasons.</param>
-    /// <param name="UpVector">a vector for the (u,v) to (N,M) search. Passed as a parameter for speed reasons.</param>
-    private static void LCS(DiffData DataA, int LowerA, int UpperA, DiffData DataB, int LowerB, int UpperB, int[] DownVector, int[] UpVector) {
-      // Debug.Write(2, "LCS", String.Format("Analyse the box: A[{0}-{1}] to B[{2}-{3}]", LowerA, UpperA, LowerB, UpperB));
-
-      // Fast walkthrough equal lines at the start
-      while (LowerA < UpperA && LowerB < UpperB && DataA.data[LowerA] == DataB.data[LowerB]) {
-        LowerA++; LowerB++;
-      }
-
-      // Fast walkthrough equal lines at the end
-      while (LowerA < UpperA && LowerB < UpperB && DataA.data[UpperA - 1] == DataB.data[UpperB - 1]) {
-        --UpperA; --UpperB;
-      }
-
-      if (LowerA == UpperA) {
-        // mark as inserted lines.
-        while (LowerB < UpperB)
-          DataB.modified[LowerB++] = true;
-
-      } else if (LowerB == UpperB) {
-        // mark as deleted lines.
-        while (LowerA < UpperA)
-          DataA.modified[LowerA++] = true;
-
-      } else {
-        // Find the middle snakea and length of an optimal path for A and B
-        SMSRD smsrd = SMS(DataA, LowerA, UpperA, DataB, LowerB, UpperB, DownVector, UpVector);
-        // Debug.Write(2, "MiddleSnakeData", String.Format("{0},{1}", smsrd.x, smsrd.y));
-
-        // The path is from LowerX to (x,y) and (x,y) to UpperX
-        LCS(DataA, LowerA, smsrd.x, DataB, LowerB, smsrd.y, DownVector, UpVector);
-        LCS(DataA, smsrd.x, UpperA, DataB, smsrd.y, UpperB, DownVector, UpVector);  // 2002.09.20: no need for 2 points 
-      }
-    } // LCS()
-
-
-    /// <summary>Scan the tables of which lines are inserted and deleted,
-    /// producing an edit script in forward order.  
-    /// </summary>
-    /// dynamic array
-    private static Item[] CreateDiffs(DiffData DataA, DiffData DataB) {
-      ArrayList a = new ArrayList();
-      Item aItem;
-      Item[] result;
-
-      int StartA, StartB;
-      int LineA, LineB;
-
-      LineA = 0;
-      LineB = 0;
-      while (LineA < DataA.Length || LineB < DataB.Length) {
-        if ((LineA < DataA.Length) && (!DataA.modified[LineA])
-          && (LineB < DataB.Length) && (!DataB.modified[LineB])) {
-          // equal lines
-          LineA++;
-          LineB++;
-
-        } else {
-          // maybe deleted and/or inserted lines
-          StartA = LineA;
-          StartB = LineB;
-
-          while (LineA < DataA.Length && (LineB >= DataB.Length || DataA.modified[LineA]))
-            // while (LineA < DataA.Length && DataA.modified[LineA])
-            LineA++;
-
-          while (LineB < DataB.Length && (LineA >= DataA.Length || DataB.modified[LineB]))
-            // while (LineB < DataB.Length && DataB.modified[LineB])
-            LineB++;
-
-          if ((StartA < LineA) || (StartB < LineB)) {
-            // store a new difference-item
-            aItem = new Item();
-            aItem.StartA = StartA;
-            aItem.StartB = StartB;
-            aItem.deletedA = LineA - StartA;
-            aItem.insertedB = LineB - StartB;
-            a.Add(aItem);
-          } // if
-        } // if
-      } // while
-
-      result = new Item[a.Count];
-      a.CopyTo(result);
-
-      return (result);
-    }
-
-  } // class Diff
-
-  /// <summary>Data on one input file being compared.  
-  /// </summary>
-  internal class DiffData
-  {
-
-    /// <summary>Number of elements (lines).</summary>
-    internal int Length;
-
-    /// <summary>Buffer of numbers that will be compared.</summary>
-    internal int[] data;
-
-    /// <summary>
-    /// Array of booleans that flag for modified data.
-    /// This is the result of the diff.
-    /// This means deletedA in the first Data or inserted in the second Data.
-    /// </summary>
-    internal bool[] modified;
-
-    /// <summary>
-    /// Initialize the Diff-Data buffer.
-    /// </summary>
-    /// <param name="data">reference to the buffer</param>
-    internal DiffData(int[] initData) {
-      data = initData;
-      Length = initData.Length;
-      modified = new bool[Length + 2];
-    } // DiffData
-
-  } // class DiffData
-
-{.pop.}
diff --git a/lib/base/devel/lex.nim b/lib/base/devel/lex.nim
deleted file mode 100644
index 34f0c32a8..000000000
--- a/lib/base/devel/lex.nim
+++ /dev/null
@@ -1,73 +0,0 @@
-# Lexer generator for Nimrod
-#   (c) 2008 Andreas Rumpf
-
-# Stress testing for the macro feature
-
-# the syntax that should be supported is:
-
-# template numpostfix = 
-#   '\'' & 'F'|'f'|'i'|'I' & "32"|"64"|"8"|"16"
-# template edigits = 
-#   'e'|'E' & +digits
-# tokens(
-#   tkIdent: +UniIdentStart & *UniIdentRest,
-#   tkHexNumber: '0' & ('x'|'X') & +hexDigits & ?( numpostfix ),
-#   tkOctNumber: '0' & ('c'|'C') & +octDigits & ?( numpostfix ),
-#   tkBinNumber: '0' & ('b'|'B') & +binDigits & ?( numpostfix ),
-#   tkIntNumber: +digits & ?( numpostfix ), 
-#   tkFloatNumber: +digits & ('.' & +digits & ?(edigits) | edigits) & ?(numpostfix),
-#   
-# )
-# actions(
-#   tkIdent: lookup
-# ) 
-# 
-
-#
-#  match inputstream
-#  of +('A'..'Z' | '_' | 'a'..'z') *('A'..'Z' | '_' | 'a'..'z' | '0'..'9') :
-#    
-#    x = inputstream[pos..length]
-#  of '0' 'x' +('0'..'9' | 'a'..'f' | '_' | 'A'..'F') : 
-#    y = ...
-
-const
-  AsciiLetter = {'A'..'Z', 'a'..'z'}
-  uniLetter = AsciiLetter + {'\128'..'\255'}
-  digits = {'0'..'9'}
-  hexDigits = {'0'..'9', 'a'..'f', 'A'..'F'}
-  octDigits = {'0'..'7'}
-  binDigits = {'0'..'1'}
-  AsciiIdentStart = AsciiLetter + {'_'} 
-  AsciiIdentRest = AsciiIdentStart + Digits
-  UniIdentStart = UniLetter + {'_'} 
-  UniIdentRest = UniIdentStart + Digits
-
-# --> if match(s, +AsciiIdentStart & *AsciiIdentRest): 
-
-#  Regular expressions in Nimrod itself!
-#  -------------------------------------
-#  
-#  'a' -- matches the character a
-#  'a'..'z'  -- range operator '-'
-#  'A' | 'B' -- alternative operator |
-#  * 'a' -- prefix * is needed
-#  + 'a' -- prefix + is needed
-#  ? 'a' -- prefix ? is needed
-#  *? prefix is needed
-#  +? prefix is needed
-#  letter  -- character classes with real names!
-#  letters
-#  white
-#  whites
-#  any   -- any character
-#  ()    -- are Nimrod syntax
-#  ! 'a'-'z'
-#  
-#  -- concatentation via proc call:
-#  
-#  re('A' 'Z' *word  )
-
-macro re(n: expr): expr = 
-  
-  result = newCall("magic_re", x)
diff --git a/lib/base/devel/nregex.nim b/lib/base/devel/nregex.nim
deleted file mode 100644
index 77afb8421..000000000
--- a/lib/base/devel/nregex.nim
+++ /dev/null
@@ -1,124 +0,0 @@
-# new implementation of regular expressions
-
-type
-  TRegexKind = enum 
-    regNone,
-    regChar, 
-    regSet,
-    regConc,
-    regAlt,
-    regStar,
-    regPlus,
-    regMN,
-    regNewline
-  
-  TRegex = object of TObject
-    case kind: TRegexKind
-    of regChar: c: char
-    of regSet: s: ref set[char]
-    else: a, b: PRegEx
-    
-  PRegEx* = ref TRegEx
-
-  TRegExFlag* = enum   ## Flags concerning the semantics of regular expressions
-    reCaseInsensitive, ## case insensitive match 
-    reStyleInsensitive ## style insensitive match
-    
-    
-  TRegExFlags* = set[TRegExFlag]
-    ## Flags concerning the semantics of regular expressions
-    
-proc raiseRegex(msg: string) {.noreturn.} = 
-  var e: ref Exception
-  new(e)
-  e.msg = msg
-  raise e
-
-proc compileAux(i: int, s: string, r: PRegEx): int
-    
-proc compileBackslash(i: int, s: string, r: PRegEx): int = 
-  var i = i
-  inc(i)
-  case s[i]
-  of 'A'..'Z': 
-  of 'a'..'z':
-  of '0':
-  of '1'..'9': 
-  
-  else:
-    r.kind = regChar
-    r.c = s[i]
-  inc(i)
-  result = i
-
-proc compileAtom(i: int, s: string, r: PRegEx): int = 
-  var i = i
-  case s[i]
-  of '[':
-    inc(i)
-    var inverse = s[i] == '^'
-    if inverse: inc(i)
-    r.kind = regSet
-    new(r.s)
-    while true: 
-      case s[i]
-      of '\\': i = compileBackslash(i, s, r)
-      of ']': 
-        inc(i)
-        break
-      of '\0': 
-        raiseRegex("']' expected")
-      elif s[i+1] == '-':
-        var x = s[i]
-        inc(i, 2)
-        var y = s[i]
-        inc(i)
-        r.s = r.s + {x..y}
-      else:
-        incl(r.s, s[i])
-        inc(i)
-    if inverse:
-      r.s = {'\0'..'\255'} - r.s
-  of '\\':
-    inc(i)
-    i = compileBackslash(i, s, r)
-  of '.':
-    r.kind = regAny
-    inc(i)
-  of '(': 
-    inc(i)
-    i = compileAux(i, s, r)
-    if s[i] = ')': inc(i)
-    else: raiseRegex("')' expected")
-  of '\0': nil # do nothing
-  else:
-    r.kind = regChar
-    r.c = s[i]
-    inc(i)
-  result = i
-    
-proc compilePostfix(i: int, s: string, r: PRegEx): int = 
-  var i = compileAtom(i, s, r)
-  var a: PRegEx
-  case s[i]
-  of '*':
-  of '+':
-  of '?':
-  else: nil
-
-proc compileAux(i: int, s: string, r: PRegEx): int = 
-  var i = i
-  i = compileAtom(i, s, r)
-  
-  while s[i] != '\0':
-    
-  result = i
-    
-proc compile*(regex: string, flags: TRegExFlags = {}): PRegEx = 
-  ## Compiles the string `regex` that represents a regular expression into 
-  ## an internal data structure that can be used for matching.
-  new(result)
-  var i = compileAux(0, regex, result)
-  if i < len(regex)-1:
-    # not all characters used for the regular expression?
-    raiseRegEx("invalid regular expression")
diff --git a/lib/base/devel/python.nim b/lib/base/devel/python.nim
deleted file mode 100644
index d9e87af8c..000000000
--- a/lib/base/devel/python.nim
+++ /dev/null
@@ -1,1877 +0,0 @@
-#
-#    Light-weight binding for the Python interpreter
-#       (c) 2008 Andreas Rumpf 
-#    Based on 'PythonEngine' module by Dr. Dietmar Budelsky
-#
-#
-#************************************************************************
-#                                                                        
-# Module:  Unit 'PythonEngine'     Copyright (c) 1997                    
-#                                                                        
-# Version: 3.0                     Dr. Dietmar Budelsky                  
-# Sub-Version: 0.25                dbudelsky@web.de                      
-#                                  Germany                               
-#                                                                        
-#                                  Morgan Martinet                       
-#                                  4721 rue Brebeuf                      
-#                                  H2J 3L2 MONTREAL (QC)                 
-#                                  CANADA                                
-#                                  e-mail: mmm@free.fr                   
-#                                                                        
-#  look our page at: http://www.multimania.com/marat                     
-#************************************************************************
-#  Functionality:  Delphi Components that provide an interface to the    
-#                  Python language (see python.txt for more infos on     
-#                  Python itself).                                       
-#                                                                        
-#************************************************************************
-#  Contributors:                                                         
-#      Grzegorz Makarewicz (mak@mikroplan.com.pl)                        
-#      Andrew Robinson (andy@hps1.demon.co.uk)                           
-#      Mark Watts(mark_watts@hotmail.com)                                
-#      Olivier Deckmyn (olivier.deckmyn@mail.dotcom.fr)                  
-#      Sigve Tjora (public@tjora.no)                                     
-#      Mark Derricutt (mark@talios.com)                                  
-#      Igor E. Poteryaev (jah@mail.ru)                                   
-#      Yuri Filimonov (fil65@mail.ru)                                    
-#      Stefan Hoffmeister (Stefan.Hoffmeister@Econos.de)                 
-#************************************************************************
-# This source code is distributed with no WARRANTY, for no reason or use.
-# Everyone is allowed to use and change this code free for his own tasks 
-# and projects, as long as this header and its copyright text is intact. 
-# For changed versions of this code, which are public distributed the    
-# following additional conditions have to be fullfilled:                 
-# 1) The header has to contain a comment on the change and the author of 
-#    it.                                                                 
-# 2) A copy of the changed source has to be sent to the above E-Mail     
-#    address or my then valid address, if this is possible to the        
-#    author.                                                             
-# The second condition has the target to maintain an up to date central  
-# version of the component. If this condition is not acceptable for      
-# confidential or legal reasons, everyone is free to derive a component  
-# or to generate a diff file to my or other original sources.            
-# Dr. Dietmar Budelsky, 1997-11-17                                       
-#************************************************************************
-
-import 
-  dyncalls
-
-when defined(windows): 
-  const 
-    DllName* = "python24.dll"
-else: 
-  const 
-    DllName* = "libpython2.4.so" # for UNIX systems
-const 
-  PYT_METHOD_BUFFER_INCREASE* = 10
-  PYT_MEMBER_BUFFER_INCREASE* = 10
-  PYT_GETSET_BUFFER_INCREASE* = 10
-  METH_VARARGS* = 0x0001
-  METH_KEYWORDS* = 0x0002 # Masks for the co_flags field of PyCodeObject
-  CO_OPTIMIZED* = 0x0001
-  CO_NEWLOCALS* = 0x0002
-  CO_VARARGS* = 0x0004
-  CO_VARKEYWORDS* = 0x0008
-
-type                          # Rich comparison opcodes introduced in version 2.1
-  TRichComparisonOpcode* = enum 
-    pyLT, pyLE, pyEQ, pyNE, pyGT, pyGE
-
-const
-  Py_TPFLAGS_HAVE_GETCHARBUFFER* = (1 shl 0) # PySequenceMethods contains sq_contains
-  Py_TPFLAGS_HAVE_SEQUENCE_IN* = (1 shl 1) # Objects which participate in garbage collection (see objimp.h)
-  Py_TPFLAGS_GC* = (1 shl 2)  # PySequenceMethods and PyNumberMethods contain in-place operators
-  Py_TPFLAGS_HAVE_INPLACEOPS* = (1 shl 3) # PyNumberMethods do their own coercion */
-  Py_TPFLAGS_CHECKTYPES* = (1 shl 4)
-  Py_TPFLAGS_HAVE_RICHCOMPARE* = (1 shl 5) # Objects which are weakly referencable if their tp_weaklistoffset is >0
-                                           # XXX Should this have the same value as Py_TPFLAGS_HAVE_RICHCOMPARE?
-                                           # These both indicate a feature that appeared in the same alpha release.
-  Py_TPFLAGS_HAVE_WEAKREFS* = (1 shl 6) # tp_iter is defined
-  Py_TPFLAGS_HAVE_ITER* = (1 shl 7) # New members introduced by Python 2.2 exist
-  Py_TPFLAGS_HAVE_CLASS* = (1 shl 8) # Set if the type object is dynamically allocated
-  Py_TPFLAGS_HEAPTYPE* = (1 shl 9) # Set if the type allows subclassing
-  Py_TPFLAGS_BASETYPE* = (1 shl 10) # Set if the type is 'ready' -- fully initialized
-  Py_TPFLAGS_READY* = (1 shl 12) # Set while the type is being 'readied', to prevent recursive ready calls
-  Py_TPFLAGS_READYING* = (1 shl 13) # Objects support garbage collection (see objimp.h)
-  Py_TPFLAGS_HAVE_GC* = (1 shl 14)
-  Py_TPFLAGS_DEFAULT* = Py_TPFLAGS_HAVE_GETCHARBUFFER or
-      Py_TPFLAGS_HAVE_SEQUENCE_IN or Py_TPFLAGS_HAVE_INPLACEOPS or
-      Py_TPFLAGS_HAVE_RICHCOMPARE or Py_TPFLAGS_HAVE_WEAKREFS or
-      Py_TPFLAGS_HAVE_ITER or Py_TPFLAGS_HAVE_CLASS 
-
-type 
-  TPFlag* = enum 
-    tpfHaveGetCharBuffer, tpfHaveSequenceIn, tpfGC, tpfHaveInplaceOps, 
-    tpfCheckTypes, tpfHaveRichCompare, tpfHaveWeakRefs, tpfHaveIter, 
-    tpfHaveClass, tpfHeapType, tpfBaseType, tpfReady, tpfReadying, tpfHaveGC
-  TPFlags* = set[TPFlag]
-
-const 
-  TPFLAGS_DEFAULT* = {tpfHaveGetCharBuffer, tpfHaveSequenceIn, 
-    tpfHaveInplaceOps, tpfHaveRichCompare, tpfHaveWeakRefs, tpfHaveIter, 
-    tpfHaveClass}
-
-const # Python opcodes
-  single_input* = 256 
-  file_input* = 257
-  eval_input* = 258
-  funcdef* = 259
-  parameters* = 260
-  varargslist* = 261
-  fpdef* = 262
-  fplist* = 263
-  stmt* = 264
-  simple_stmt* = 265
-  small_stmt* = 266
-  expr_stmt* = 267
-  augassign* = 268
-  print_stmt* = 269
-  del_stmt* = 270
-  pass_stmt* = 271
-  flow_stmt* = 272
-  break_stmt* = 273
-  continue_stmt* = 274
-  return_stmt* = 275
-  raise_stmt* = 276
-  import_stmt* = 277
-  import_as_name* = 278
-  dotted_as_name* = 279
-  dotted_name* = 280
-  global_stmt* = 281
-  exec_stmt* = 282
-  assert_stmt* = 283
-  compound_stmt* = 284
-  if_stmt* = 285
-  while_stmt* = 286
-  for_stmt* = 287
-  try_stmt* = 288
-  except_clause* = 289
-  suite* = 290
-  test* = 291
-  and_test* = 291
-  not_test* = 293
-  comparison* = 294
-  comp_op* = 295
-  expr* = 296
-  xor_expr* = 297
-  and_expr* = 298
-  shift_expr* = 299
-  arith_expr* = 300
-  term* = 301
-  factor* = 302
-  power* = 303
-  atom* = 304
-  listmaker* = 305
-  lambdef* = 306
-  trailer* = 307
-  subscriptlist* = 308
-  subscript* = 309
-  sliceop* = 310
-  exprlist* = 311
-  testlist* = 312
-  dictmaker* = 313
-  classdef* = 314
-  arglist* = 315
-  argument* = 316
-  list_iter* = 317
-  list_for* = 318
-  list_if* = 319
-
-const 
-  T_SHORT* = 0
-  T_INT* = 1
-  T_LONG* = 2
-  T_FLOAT* = 3
-  T_DOUBLE* = 4
-  T_STRING* = 5
-  T_OBJECT* = 6
-  T_CHAR* = 7                 # 1-character string
-  T_BYTE* = 8                 # 8-bit signed int
-  T_UBYTE* = 9
-  T_USHORT* = 10
-  T_UINT* = 11
-  T_ULONG* = 12
-  T_STRING_INPLACE* = 13
-  T_OBJECT_EX* = 16 
-  READONLY* = 1
-  RO* = READONLY              # Shorthand 
-  READ_RESTRICTED* = 2
-  WRITE_RESTRICTED* = 4
-  RESTRICTED* = (READ_RESTRICTED or WRITE_RESTRICTED)
-
-type 
-  TPyMemberType* = enum 
-    mtShort, mtInt, mtLong, mtFloat, mtDouble, mtString, mtObject, mtChar, 
-    mtByte, mtUByte, mtUShort, mtUInt, mtULong, mtStringInplace, mtObjectEx
-  TPyMemberFlag* = enum 
-    mfDefault, mfReadOnly, mfReadRestricted, mfWriteRestricted, mfRestricted
-
-type 
-  TPChar* = array[0..16000, cstring]
-  PPChar* = ptr TPChar
-  PInt* = ptr int
-  PDouble* = ptr float64
-  PFloat* = ptr float
-  PLong* = ptr int32
-  PShort* = ptr int8
-  PString* = ptr cstring 
-  
-type 
-  PP_frozen* = ptr Pfrozen
-  P_frozen* = ptr Tfrozen
-  PPyObject* = ptr PyObject
-  PPPyObject* = ptr PPyObject
-  PPPPyObject* = ptr PPPyObject
-  PPyIntObject* = ptr PyIntObject
-  PPyTypeObject* = ptr PyTypeObject
-  PPySliceObject* = ptr PySliceObject
-  TPyCFunction* = proc (self, args: PPyObject): PPyObject{.cdecl.}
-  Tunaryfunc* = proc (ob1: PPyObject): PPyObject{.cdecl.}
-  Tbinaryfunc* = proc (ob1, ob2: PPyObject): PPyObject{.cdecl.}
-  Tternaryfunc* = proc (ob1, ob2, ob3: PPyObject): PPyObject{.cdecl.}
-  Tinquiry* = proc (ob1: PPyObject): int{.cdecl.}
-  Tcoercion* = proc (ob1, ob2: PPPyObject): int{.cdecl.}
-  Tintargfunc* = proc (ob1: PPyObject, i: int): PPyObject{.cdecl.}
-  Tintintargfunc* = proc (ob1: PPyObject, i1, i2: int): PPyObject{.cdecl.}
-  Tintobjargproc* = proc (ob1: PPyObject, i: int, ob2: PPyObject): int{.cdecl.}
-  Tintintobjargproc* = proc (ob1: PPyObject, i1, i2: int, ob2: PPyObject): int{.
-      cdecl.}
-  Tobjobjargproc* = proc (ob1, ob2, ob3: PPyObject): int{.cdecl.}
-  Tpydestructor* = proc (ob: PPyObject){.cdecl.}
-  Tprintfunc* = proc (ob: PPyObject, f: var file, i: int): int{.cdecl.}
-  Tgetattrfunc* = proc (ob1: PPyObject, name: cstring): PPyObject{.cdecl.}
-  Tsetattrfunc* = proc (ob1: PPyObject, name: cstring, ob2: PPyObject): int{.
-      cdecl.}
-  Tcmpfunc* = proc (ob1, ob2: PPyObject): int{.cdecl.}
-  Treprfunc* = proc (ob: PPyObject): PPyObject{.cdecl.}
-  Thashfunc* = proc (ob: PPyObject): int32{.cdecl.}
-  Tgetattrofunc* = proc (ob1, ob2: PPyObject): PPyObject{.cdecl.}
-  Tsetattrofunc* = proc (ob1, ob2, ob3: PPyObject): int{.cdecl.} 
-  Tgetreadbufferproc* = proc (ob1: PPyObject, i: int, ptr: Pointer): int{.cdecl.}
-  Tgetwritebufferproc* = proc (ob1: PPyObject, i: int, ptr: Pointer): int{.cdecl.}
-  Tgetsegcountproc* = proc (ob1: PPyObject, i: int): int{.cdecl.}
-  Tgetcharbufferproc* = proc (ob1: PPyObject, i: int, pstr: cstring): int{.cdecl.}
-  Tobjobjproc* = proc (ob1, ob2: PPyObject): int{.cdecl.}
-  Tvisitproc* = proc (ob1: PPyObject, ptr: Pointer): int{.cdecl.}
-  Ttraverseproc* = proc (ob1: PPyObject, proc: visitproc, ptr: Pointer): int{.
-      cdecl.}
-  Trichcmpfunc* = proc (ob1, ob2: PPyObject, i: int): PPyObject{.cdecl.}
-  Tgetiterfunc* = proc (ob1: PPyObject): PPyObject{.cdecl.}
-  Titernextfunc* = proc (ob1: PPyObject): PPyObject{.cdecl.}
-  Tdescrgetfunc* = proc (ob1, ob2, ob3: PPyObject): PPyObject{.cdecl.}
-  Tdescrsetfunc* = proc (ob1, ob2, ob3: PPyObject): int{.cdecl.}
-  Tinitproc* = proc (self, args, kwds: PPyObject): int{.cdecl.}
-  Tnewfunc* = proc (subtype: PPyTypeObject, args, kwds: PPyObject): PPyObject{.
-      cdecl.}
-  Tallocfunc* = proc (self: PPyTypeObject, nitems: int): PPyObject{.cdecl.}
-  TPyNumberMethods*{.final.} = object 
-    nb_add*: Tbinaryfunc
-    nb_substract*: Tbinaryfunc
-    nb_multiply*: Tbinaryfunc
-    nb_divide*: Tbinaryfunc
-    nb_remainder*: Tbinaryfunc
-    nb_divmod*: Tbinaryfunc
-    nb_power*: Tternaryfunc
-    nb_negative*: Tunaryfunc
-    nb_positive*: Tunaryfunc
-    nb_absolute*: Tunaryfunc
-    nb_nonzero*: Tinquiry
-    nb_invert*: Tunaryfunc
-    nb_lshift*: Tbinaryfunc
-    nb_rshift*: Tbinaryfunc
-    nb_and*: Tbinaryfunc
-    nb_xor*: Tbinaryfunc
-    nb_or*: Tbinaryfunc
-    nb_coerce*: Tcoercion
-    nb_int*: Tunaryfunc
-    nb_long*: Tunaryfunc
-    nb_float*: Tunaryfunc
-    nb_oct*: Tunaryfunc
-    nb_hex*: Tunaryfunc       #/ jah 29-sep-2000: updated for python 2.0
-                              #/                   added from .h
-    nb_inplace_add*: Tbinaryfunc
-    nb_inplace_subtract*: Tbinaryfunc
-    nb_inplace_multiply*: Tbinaryfunc
-    nb_inplace_divide*: Tbinaryfunc
-    nb_inplace_remainder*: Tbinaryfunc
-    nb_inplace_power*: Tternaryfunc
-    nb_inplace_lshift*: Tbinaryfunc
-    nb_inplace_rshift*: Tbinaryfunc
-    nb_inplace_and*: Tbinaryfunc
-    nb_inplace_xor*: Tbinaryfunc
-    nb_inplace_or*: Tbinaryfunc # Added in release 2.2
-                                # The following require the Py_TPFLAGS_HAVE_CLASS flag
-    nb_floor_divide*: Tbinaryfunc
-    nb_true_divide*: Tbinaryfunc
-    nb_inplace_floor_divide*: Tbinaryfunc
-    nb_inplace_true_divide*: Tbinaryfunc
-
-  PPyNumberMethods* = ptr TPyNumberMethods
-  TPySequenceMethods*{.final.} = object 
-    sq_length*: Tinquiry
-    sq_concat*: Tbinaryfunc
-    sq_repeat*: Tintargfunc
-    sq_item*: Tintargfunc
-    sq_slice*: Tintintargfunc
-    sq_ass_item*: Tintobjargproc
-    sq_ass_slice*: Tintintobjargproc #/ jah 29-sep-2000: updated for python 2.0
-                                     #/                   added from .h
-    sq_contains*: Tobjobjproc
-    sq_inplace_concat*: Tbinaryfunc
-    sq_inplace_repeat*: Tintargfunc
-
-  PPySequenceMethods* = ptr TPySequenceMethods
-  TPyMappingMethods*{.final.} = object 
-    mp_length*: Tinquiry
-    mp_subscript*: Tbinaryfunc
-    mp_ass_subscript*: Tobjobjargproc
-
-  PPyMappingMethods* = ptr PyMappingMethods #/ jah 29-sep-2000: updated for python 2.0
-                                            #/                   added from .h
-  TPyBufferProcs*{.final.} = object 
-    bf_getreadbuffer*: Tgetreadbufferproc
-    bf_getwritebuffer*: Tgetwritebufferproc
-    bf_getsegcount*: Tgetsegcountproc
-    bf_getcharbuffer*: Tgetcharbufferproc
-
-  PPyBufferProcs* = ptr TPyBufferProcs
-  TPy_complex*{.final.} = object 
-    float*: float64
-    imag*: float64
-
-  TPyObject*{.pure.} = object 
-    ob_refcnt*: int
-    ob_type*: PPyTypeObject
-
-  TPyIntObject* = object of TPyObject
-    ob_ival*: int32
-
-  PByte* = ptr int8
-  Tfrozen*{.final.} = object 
-    name*: cstring
-    code*: PByte
-    size*: int
-
-  TPySliceObject* = object of TPyObject
-    start*, stop*, step*: PPyObject
-
-  PPyMethodDef* = ptr TPyMethodDef
-  TPyMethodDef*{.final.} = object  # structmember.h
-    ml_name*: cstring
-    ml_meth*: TPyCFunction
-    ml_flags*: int
-    ml_doc*: cstring
-
-  PPyMemberDef* = ptr TPyMemberDef
-  TPyMemberDef*{.final.} = object  # descrobject.h
-                                   # Descriptors
-    name*: cstring
-    theType*: int
-    offset*: int
-    flags*: int
-    doc*: cstring
-
-  Tgetter* = proc (obj: PPyObject, context: Pointer): PPyObject{.cdecl.}
-  Tsetter* = proc (obj, value: PPyObject, context: Pointer): int{.cdecl.}
-  PPyGetSetDef* = ptr TPyGetSetDef
-  TPyGetSetDef*{.final.} = object 
-    name*: cstring
-    get*: Tgetter
-    set_*: Tsetter
-    doc*: cstring
-    closure*: Pointer
-
-  Twrapperfunc* = proc (self, args: PPyObject, wrapped: Pointer): PPyObject{.
-      cdecl.}
-  pwrapperbase* = ptr Twrapperbase
-  Twrapperbase*{.final.} = object  # Various kinds of descriptor objects
-                                   ##define PyDescr_COMMON \
-                                   #          PyObject_HEAD \
-                                   #          PyTypeObject *d_type; \
-                                   #          PyObject *d_name
-                                   #  
-    name*: cstring
-    wrapper*: Twrapperfunc
-    doc*: cstring
-
-  PPyDescrObject* = ptr TPyDescrObject
-  TPyDescrObject* = object of TPyObject
-    d_type*: PPyTypeObject
-    d_name*: PPyObject
-
-  PPyMethodDescrObject* = ptr TPyMethodDescrObject
-  TPyMethodDescrObject* = object of TPyDescrObject
-    d_method*: PPyMethodDef
-
-  PPyMemberDescrObject* = ptr TPyMemberDescrObject
-  TPyMemberDescrObject* = object of TPyDescrObject
-    d_member*: PPyMemberDef
-
-  PPyGetSetDescrObject* = ptr TPyGetSetDescrObject
-  TPyGetSetDescrObject* = object of TPyDescrObject
-    d_getset*: PPyGetSetDef
-
-  PPyWrapperDescrObject* = ptr TPyWrapperDescrObject
-  TPyWrapperDescrObject* = object of TPyDescrObject # object.h
-    d_base*: pwrapperbase
-    d_wrapped*: Pointer       # This can be any function pointer
-  
-  TPyTypeObject* = object of TPyObject
-    ob_size*: int             # Number of items in variable part
-    tp_name*: cstring         # For printing
-    tp_basicsize*, tp_itemsize*: int # For allocation
-                                     # Methods to implement standard operations
-    tp_dealloc*: Tpydestructor
-    tp_print*: Tprintfunc
-    tp_getattr*: Tgetattrfunc
-    tp_setattr*: Tsetattrfunc
-    tp_compare*: Tcmpfunc
-    tp_repr*: Treprfunc       # Method suites for standard classes
-    tp_as_number*: PPyNumberMethods
-    tp_as_sequence*: PPySequenceMethods
-    tp_as_mapping*: PPyMappingMethods # More standard operations (here for binary compatibility)
-    tp_hash*: Thashfunc
-    tp_call*: Tternaryfunc
-    tp_str*: Treprfunc
-    tp_getattro*: Tgetattrofunc
-    tp_setattro*: Tsetattrofunc #/ jah 29-sep-2000: updated for python 2.0
-                                # Functions to access object as input/output buffer
-    tp_as_buffer*: PPyBufferProcs # Flags to define presence of optional/expanded features
-    tp_flags*: int32
-    tp_doc*: cstring          # Documentation string
-                              # call function for all accessible objects
-    tp_traverse*: Ttraverseproc # delete references to contained objects
-    tp_clear*: Tinquiry       # rich comparisons
-    tp_richcompare*: Trichcmpfunc # weak reference enabler
-    tp_weaklistoffset*: int32 # Iterators
-    tp_iter*: Tgetiterfunc
-    tp_iternext*: Titernextfunc # Attribute descriptor and subclassing stuff
-    tp_methods*: PPyMethodDef
-    tp_members*: PPyMemberDef
-    tp_getset*: PPyGetSetDef
-    tp_base*: PPyTypeObject
-    tp_dict*: PPyObject
-    tp_descr_get*: Tdescrgetfunc
-    tp_descr_set*: Tdescrsetfunc
-    tp_dictoffset*: int32
-    tp_init*: Tinitproc
-    tp_alloc*: Tallocfunc
-    tp_new*: Tnewfunc
-    tp_free*: Tpydestructor   # Low-level free-memory routine
-    tp_is_gc*: Tinquiry       # For PyObject_IS_GC
-    tp_bases*: PPyObject
-    tp_mro*: PPyObject        # method resolution order
-    tp_cache*: PPyObject
-    tp_subclasses*: PPyObject
-    tp_weaklist*: PPyObject   #More spares
-    tp_xxx7*: pointer
-    tp_xxx8*: pointer
-
-  PPyMethodChain* = ptr TPyMethodChain
-  TPyMethodChain*{.final.} = object 
-    methods*: PPyMethodDef
-    link*: PPyMethodChain
-
-  PPyClassObject* = ptr TPyClassObject
-  TPyClassObject* = object of TPyObject
-    cl_bases*: PPyObject      # A tuple of class objects
-    cl_dict*: PPyObject       # A dictionary
-    cl_name*: PPyObject       # A string
-                              # The following three are functions or NULL
-    cl_getattr*: PPyObject
-    cl_setattr*: PPyObject
-    cl_delattr*: PPyObject
-
-  PPyInstanceObject* = ptr TPyInstanceObject
-  TPyInstanceObject* = object of TPyObject # Instance method objects are used for two purposes:
-                                           #   (a) as bound instance methods (returned by instancename.methodname)
-                                           #   (b) as unbound methods (returned by ClassName.methodname)
-                                           #   In case (b), im_self is NULL
-                                           #
-    in_class*: PPyClassObject # The class object
-    in_dict*: PPyObject       # A dictionary
-  
-  PPyMethodObject* = ptr TPyMethodObject
-  TPyMethodObject* = object of TPyObject # Bytecode object, compile.h
-    im_func*: PPyObject       # The function implementing the method
-    im_self*: PPyObject       # The instance it is bound to, or NULL
-    im_class*: PPyObject      # The class that defined the method
-  
-  PPyCodeObject* = ptr TPyCodeObject
-  TPyCodeObject* = object of TPyObject # from pystate.h
-    co_argcount*: int         # #arguments, except *args
-    co_nlocals*: int          # #local variables
-    co_stacksize*: int        # #entries needed for evaluation stack
-    co_flags*: int            # CO_..., see below
-    co_code*: PPyObject       # instruction opcodes (it hides a PyStringObject)
-    co_consts*: PPyObject     # list (constants used)
-    co_names*: PPyObject      # list of strings (names used)
-    co_varnames*: PPyObject   # tuple of strings (local variable names)
-    co_freevars*: PPyObject   # tuple of strings (free variable names)
-    co_cellvars*: PPyObject   # tuple of strings (cell variable names)
-                              # The rest doesn't count for hash/cmp
-    co_filename*: PPyObject   # string (where it was loaded from)
-    co_name*: PPyObject       # string (name, for reference)
-    co_firstlineno*: int      # first source line number
-    co_lnotab*: PPyObject     # string (encoding addr<->lineno mapping)
-  
-  PPyInterpreterState* = ptr TPyInterpreterState
-  PPyThreadState* = ptr TPyThreadState
-  PPyFrameObject* = ptr TPyFrameObject # Interpreter environments
-  TPyInterpreterState*{.final.} = object  # Thread specific information
-    next*: PPyInterpreterState
-    tstate_head*: PPyThreadState
-    modules*: PPyObject
-    sysdict*: PPyObject
-    builtins*: PPyObject
-    checkinterval*: int
-
-  TPyThreadState*{.final.} = object  # from frameobject.h
-    next*: PPyThreadState
-    interp*: PPyInterpreterState
-    frame*: PPyFrameObject
-    recursion_depth*: int
-    ticker*: int
-    tracing*: int
-    sys_profilefunc*: PPyObject
-    sys_tracefunc*: PPyObject
-    curexc_type*: PPyObject
-    curexc_value*: PPyObject
-    curexc_traceback*: PPyObject
-    exc_type*: PPyObject
-    exc_value*: PPyObject
-    exc_traceback*: PPyObject
-    dict*: PPyObject
-
-  PPyTryBlock* = ptr TPyTryBlock
-  TPyTryBlock*{.final.} = object 
-    b_type*: int              # what kind of block this is
-    b_handler*: int           # where to jump to find handler
-    b_level*: int             # value stack level to pop to
-  
-  CO_MAXBLOCKS* = range[0..19]
-  TPyFrameObject* = object of TPyObject # start of the VAR_HEAD of an object
-                                        # From traceback.c
-    ob_size*: int             # Number of items in variable part
-                              # End of the Head of an object
-    f_back*: PPyFrameObject   # previous frame, or NULL
-    f_code*: PPyCodeObject    # code segment
-    f_builtins*: PPyObject    # builtin symbol table (PyDictObject)
-    f_globals*: PPyObject     # global symbol table (PyDictObject)
-    f_locals*: PPyObject      # local symbol table (PyDictObject)
-    f_valuestack*: PPPyObject # points after the last local
-                              # Next free slot in f_valuestack.  Frame creation sets to f_valuestack.
-                              #       Frame evaluation usually NULLs it, but a frame that yields sets it
-                              #       to the current stack top. 
-    f_stacktop*: PPPyObject
-    f_trace*: PPyObject       # Trace function
-    f_exc_type*, f_exc_value*, f_exc_traceback*: PPyObject
-    f_tstate*: PPyThreadState
-    f_lasti*: int             # Last instruction if called
-    f_lineno*: int            # Current line number
-    f_restricted*: int        # Flag set if restricted operations
-                              # in this scope
-    f_iblock*: int            # index in f_blockstack
-    f_blockstack*: array[CO_MAXBLOCKS, PyTryBlock] # for try and loop blocks
-    f_nlocals*: int           # number of locals
-    f_ncells*: int
-    f_nfreevars*: int
-    f_stacksize*: int         # size of value stack
-    f_localsplus*: array[0..0, PPyObject] # locals+stack, dynamically sized
-  
-  PPyTraceBackObject* = ptr TPyTraceBackObject
-  TPyTraceBackObject* = object of TPyObject # Parse tree node interface
-    tb_next*: PPyTraceBackObject
-    tb_frame*: PPyFrameObject
-    tb_lasti*: int
-    tb_lineno*: int
-
-  PNode* = ptr Tnode
-  Tnode*{.final.} = object    # From weakrefobject.h
-    n_type*: int16
-    n_str*: cstring
-    n_lineno*: int16
-    n_nchildren*: int16
-    n_child*: PNode
-
-  PPyWeakReference* = ptr TPyWeakReference
-  TPyWeakReference* = object of TPyObject # from datetime.h
-                                          #* Fields are packed into successive bytes, each viewed as unsigned and
-                                          # * big-endian, unless otherwise noted:
-                                          # *
-                                          # * byte offset
-                                          # *  0 		year     2 bytes, 1-9999
-                                          # *  2	  	month    1 byte,  1-12
-                                          # *  3 		day      1 byte,  1-31
-                                          # *  4     hour     1 byte,  0-23
-                                          # *  5 		minute   1 byte,  0-59
-                                          # *  6 		second   1 byte,  0-59
-                                          # *  7 		usecond  3 bytes, 0-999999
-                                          # * 10
-                                          # *
-    wr_object*: PPyObject
-    wr_callback*: PPyObject
-    hash*: int32
-    wr_prev*: PPyWeakReference
-    wr_next*: PPyWeakReference
-
-
-const                         # # of bytes for year, month, and day. 
-  PyDateTime_DATE_DATASIZE* = 4 # # of bytes for hour, minute, second, and usecond. 
-  PyDateTime_TIME_DATASIZE* = 6 # # of bytes for year, month, day, hour, minute, second, and usecond. 
-  PyDateTime_DATETIME_DATASIZE* = 10
-
-type 
-  TPyDateTime_Delta* = object of TPyObject
-    hashcode*: int            # -1 when unknown
-    days*: int                # -MAX_DELTA_DAYS <= days <= MAX_DELTA_DAYS
-    seconds*: int             # 0 <= seconds < 24*3600 is invariant
-    microseconds*: int        # 0 <= microseconds < 1000000 is invariant
-  
-  PPyDateTime_Delta* = ptr TPyDateTime_Delta
-  TPyDateTime_TZInfo* = object of TPyObject # a pure abstract base clase
-  PPyDateTime_TZInfo* = ptr TPyDateTime_TZInfo #
-                                               #/* The datetime and time types have hashcodes, and an optional tzinfo member,
-                                               # * present if and only if hastzinfo is true.
-                                               # */
-                                               ##define _PyTZINFO_HEAD		\
-                                               #	PyObject_HEAD		\
-                                               #	long hashcode;		\
-                                               #	char hastzinfo;		/* boolean flag */
-                                               #
-                                               #* No _PyDateTime_BaseTZInfo is allocated; it's just to have something
-                                               # * convenient to cast to, when getting at the hastzinfo member of objects
-                                               # * starting with _PyTZINFO_HEAD.
-                                               # *
-  TPyDateTime_BaseTZInfo* = object of TPyObject
-    hashcode*: int
-    hastzinfo*: bool          # boolean flag
-  
-  PPyDateTime_BaseTZInfo* = ptr TPyDateTime_BaseTZInfo #* All time objects are of PyDateTime_TimeType, but that can be allocated
-                                                       # * in two ways, with or without a tzinfo member.  Without is the same as
-                                                       # * tzinfo == None, but consumes less memory.  _PyDateTime_BaseTime is an
-                                                       # * internal struct used to allocate the right amount of space for the
-                                                       # * "without" case.
-                                                       # *
-                                                       ##define _PyDateTime_TIMEHEAD	\
-                                                       #	_PyTZINFO_HEAD		\
-                                                       #	unsigned char data[_PyDateTime_TIME_DATASIZE];
-                                                       #
-  TPyDateTime_BaseTime* = object of TPyDateTime_BaseTZInfo
-    data*: array[0..Pred(PyDateTime_TIME_DATASIZE), int8]
-
-  PPyDateTime_BaseTime* = ptr TPyDateTime_BaseTime
-  TPyDateTime_Time* = object of TPyDateTime_BaseTime # hastzinfo true
-    tzinfo*: PPyObject
-
-  PPyDateTime_Time* = ptr PyDateTime_Time #* All datetime objects are of PyDateTime_DateTimeType, but that can be
-                                          # * allocated in two ways too, just like for time objects above.  In addition,
-                                          # * the plain date type is a base class for datetime, so it must also have
-                                          # * a hastzinfo member (although it's unused there).
-                                          # *
-  TPyDateTime_Date* = object of TPyDateTime_BaseTZInfo
-    data*: array[0..Pred(PyDateTime_DATE_DATASIZE), int8]
-
-  PPyDateTime_Date* = ptr TPyDateTime_Date #
-                                           ##define _PyDateTime_DATETIMEHEAD	\
-                                           #	_PyTZINFO_HEAD			\
-                                           #	unsigned char data[_PyDateTime_DATETIME_DATASIZE];
-                                           #
-  TPyDateTime_BaseDateTime* = object of TPyDateTime_BaseTZInfo # hastzinfo false
-    data*: array[0..Pred(PyDateTime_DATETIME_DATASIZE), int8]
-
-  PPyDateTime_BaseDateTime* = ptr TPyDateTime_BaseDateTime
-  TPyDateTime_DateTime* = object of TPyDateTime_BaseTZInfo # hastzinfo true
-    data*: array[0..Pred(PyDateTime_DATETIME_DATASIZE), int8]
-    tzinfo*: PPyObject
-
-  PPyDateTime_DateTime* = ptr TPyDateTime_DateTime 
-
-########################################################
-###                                                   ##
-###         New exception classes                     ##
-###                                                   ##
-########################################################
-#
-#  // Python's exceptions
-#  EPythonError   = object(Exception)
-#      EName: String;
-#      EValue: String;
-#  end;
-#  EPyExecError   = object(EPythonError)
-#  end;
-#
-#  // Standard exception classes of Python
-#
-#/// jah 29-sep-2000: updated for python 2.0
-#///                   base classes updated according python documentation
-#
-#{ Hierarchy of Python exceptions, Python 2.3, copied from <INSTALL>\Python\exceptions.c
-#
-#Exception\n\
-# |\n\
-# +-- SystemExit\n\
-# +-- StopIteration\n\
-# +-- StandardError\n\
-# |    |\n\
-# |    +-- KeyboardInterrupt\n\
-# |    +-- ImportError\n\
-# |    +-- EnvironmentError\n\
-# |    |    |\n\
-# |    |    +-- IOError\n\
-# |    |    +-- OSError\n\
-# |    |         |\n\
-# |    |         +-- WindowsError\n\
-# |    |         +-- VMSError\n\
-# |    |\n\
-# |    +-- EOFError\n\
-# |    +-- RuntimeError\n\
-# |    |    |\n\
-# |    |    +-- NotImplementedError\n\
-# |    |\n\
-# |    +-- NameError\n\
-# |    |    |\n\
-# |    |    +-- UnboundLocalError\n\
-# |    |\n\
-# |    +-- AttributeError\n\
-# |    +-- SyntaxError\n\
-# |    |    |\n\
-# |    |    +-- IndentationError\n\
-# |    |         |\n\
-# |    |         +-- TabError\n\
-# |    |\n\
-# |    +-- TypeError\n\
-# |    +-- AssertionError\n\
-# |    +-- LookupError\n\
-# |    |    |\n\
-# |    |    +-- IndexError\n\
-# |    |    +-- KeyError\n\
-# |    |\n\
-# |    +-- ArithmeticError\n\
-# |    |    |\n\
-# |    |    +-- OverflowError\n\
-# |    |    +-- ZeroDivisionError\n\
-# |    |    +-- FloatingPointError\n\
-# |    |\n\
-# |    +-- ValueError\n\
-# |    |    |\n\
-# |    |    +-- UnicodeError\n\
-# |    |        |\n\
-# |    |        +-- UnicodeEncodeError\n\
-# |    |        +-- UnicodeDecodeError\n\
-# |    |        +-- UnicodeTranslateError\n\
-# |    |\n\
-# |    +-- ReferenceError\n\
-# |    +-- SystemError\n\
-# |    +-- MemoryError\n\
-# |\n\
-# +---Warning\n\
-#      |\n\
-#      +-- UserWarning\n\
-#      +-- DeprecationWarning\n\
-#      +-- PendingDeprecationWarning\n\
-#      +-- SyntaxWarning\n\
-#      +-- OverflowWarning\n\
-#      +-- RuntimeWarning\n\
-#      +-- FutureWarning"
-#}
-#   EPyException = class (EPythonError);
-#   EPyStandardError = class (EPyException);
-#   EPyArithmeticError = class (EPyStandardError);
-#   EPyLookupError = class (EPyStandardError);
-#   EPyAssertionError = class (EPyStandardError);
-#   EPyAttributeError = class (EPyStandardError);
-#   EPyEOFError = class (EPyStandardError);
-#   EPyFloatingPointError = class (EPyArithmeticError);
-#   EPyEnvironmentError = class (EPyStandardError);
-#   EPyIOError = class (EPyEnvironmentError);
-#   EPyOSError = class (EPyEnvironmentError);
-#   EPyImportError = class (EPyStandardError);
-#   EPyIndexError = class (EPyLookupError);
-#   EPyKeyError = class (EPyLookupError);
-#   EPyKeyboardInterrupt = class (EPyStandardError);
-#   EPyMemoryError = class (EPyStandardError);
-#   EPyNameError = class (EPyStandardError);
-#   EPyOverflowError = class (EPyArithmeticError);
-#   EPyRuntimeError = class (EPyStandardError);
-#   EPyNotImplementedError = class (EPyRuntimeError);
-#   EPySyntaxError = class (EPyStandardError)
-#   public
-#      EFileName: string;
-#      ELineStr: string;
-#      ELineNumber: Integer;
-#      EOffset: Integer;
-#   end;
-#   EPyIndentationError = class (EPySyntaxError);
-#   EPyTabError = class (EPyIndentationError);
-#   EPySystemError = class (EPyStandardError);
-#   EPySystemExit = class (EPyException);
-#   EPyTypeError = class (EPyStandardError);
-#   EPyUnboundLocalError = class (EPyNameError);
-#   EPyValueError = class (EPyStandardError);
-#   EPyUnicodeError = class (EPyValueError);
-#   UnicodeEncodeError = class (EPyUnicodeError);
-#   UnicodeDecodeError = class (EPyUnicodeError);
-#   UnicodeTranslateError = class (EPyUnicodeError);
-#   EPyZeroDivisionError = class (EPyArithmeticError);
-#   EPyStopIteration = class(EPyException);
-#   EPyWarning = class (EPyException);
-#   EPyUserWarning = class (EPyWarning);
-#   EPyDeprecationWarning = class (EPyWarning);
-#   PendingDeprecationWarning = class (EPyWarning);
-#   FutureWarning = class (EPyWarning);
-#   EPySyntaxWarning = class (EPyWarning);
-#   EPyOverflowWarning = class (EPyWarning);
-#   EPyRuntimeWarning = class (EPyWarning);
-#   EPyReferenceError = class (EPyStandardError);
-#
-
-var 
-  PyArg_Parse*: proc (args: PPyObject, format: cstring): int{.cdecl, varargs.} 
-  PyArg_ParseTuple*: proc (args: PPyObject, format: cstring, x1: Pointer = nil, 
-                           x2: Pointer = nil, x3: Pointer = nil): int{.cdecl, varargs.} 
-  Py_BuildValue*: proc (format: cstring): PPyObject{.cdecl, varargs.} 
-  PyCode_Addr2Line*: proc (co: PPyCodeObject, addrq: int): int{.cdecl.}
-  DLL_Py_GetBuildInfo*: proc (): cstring{.cdecl.} # define Python flags. See file pyDebug.h
-  Py_DebugFlag*: PInt
-  Py_VerboseFlag*: PInt
-  Py_InteractiveFlag*: PInt
-  Py_OptimizeFlag*: PInt
-  Py_NoSiteFlag*: PInt
-  Py_UseClassExceptionsFlag*: PInt
-  Py_FrozenFlag*: PInt
-  Py_TabcheckFlag*: PInt
-  Py_UnicodeFlag*: PInt
-  Py_IgnoreEnvironmentFlag*: PInt
-  Py_DivisionWarningFlag*: PInt #_PySys_TraceFunc:    PPPyObject;
-                                #_PySys_ProfileFunc: PPPPyObject;
-  PyImport_FrozenModules*: PP_frozen
-  Py_None*: PPyObject
-  Py_Ellipsis*: PPyObject
-  Py_False*: PPyIntObject
-  Py_True*: PPyIntObject
-  Py_NotImplemented*: PPyObject
-  PyExc_AttributeError*: PPPyObject
-  PyExc_EOFError*: PPPyObject
-  PyExc_IOError*: PPPyObject
-  PyExc_ImportError*: PPPyObject
-  PyExc_IndexError*: PPPyObject
-  PyExc_KeyError*: PPPyObject
-  PyExc_KeyboardInterrupt*: PPPyObject
-  PyExc_MemoryError*: PPPyObject
-  PyExc_NameError*: PPPyObject
-  PyExc_OverflowError*: PPPyObject
-  PyExc_RuntimeError*: PPPyObject
-  PyExc_SyntaxError*: PPPyObject
-  PyExc_SystemError*: PPPyObject
-  PyExc_SystemExit*: PPPyObject
-  PyExc_TypeError*: PPPyObject
-  PyExc_ValueError*: PPPyObject
-  PyExc_ZeroDivisionError*: PPPyObject
-  PyExc_ArithmeticError*: PPPyObject
-  PyExc_Exception*: PPPyObject
-  PyExc_FloatingPointError*: PPPyObject
-  PyExc_LookupError*: PPPyObject
-  PyExc_StandardError*: PPPyObject
-  PyExc_AssertionError*: PPPyObject
-  PyExc_EnvironmentError*: PPPyObject
-  PyExc_IndentationError*: PPPyObject
-  PyExc_MemoryErrorInst*: PPPyObject
-  PyExc_NotImplementedError*: PPPyObject
-  PyExc_OSError*: PPPyObject
-  PyExc_TabError*: PPPyObject
-  PyExc_UnboundLocalError*: PPPyObject
-  PyExc_UnicodeError*: PPPyObject
-  PyExc_Warning*: PPPyObject
-  PyExc_DeprecationWarning*: PPPyObject
-  PyExc_RuntimeWarning*: PPPyObject
-  PyExc_SyntaxWarning*: PPPyObject
-  PyExc_UserWarning*: PPPyObject
-  PyExc_OverflowWarning*: PPPyObject
-  PyExc_ReferenceError*: PPPyObject
-  PyExc_StopIteration*: PPPyObject
-  PyExc_FutureWarning*: PPPyObject
-  PyExc_PendingDeprecationWarning*: PPPyObject
-  PyExc_UnicodeDecodeError*: PPPyObject
-  PyExc_UnicodeEncodeError*: PPPyObject
-  PyExc_UnicodeTranslateError*: PPPyObject
-  PyType_Type*: PPyTypeObject
-  PyCFunction_Type*: PPyTypeObject
-  PyCObject_Type*: PPyTypeObject
-  PyClass_Type*: PPyTypeObject
-  PyCode_Type*: PPyTypeObject
-  PyComplex_Type*: PPyTypeObject
-  PyDict_Type*: PPyTypeObject
-  PyFile_Type*: PPyTypeObject
-  PyFloat_Type*: PPyTypeObject
-  PyFrame_Type*: PPyTypeObject
-  PyFunction_Type*: PPyTypeObject
-  PyInstance_Type*: PPyTypeObject
-  PyInt_Type*: PPyTypeObject
-  PyList_Type*: PPyTypeObject
-  PyLong_Type*: PPyTypeObject
-  PyMethod_Type*: PPyTypeObject
-  PyModule_Type*: PPyTypeObject
-  PyObject_Type*: PPyTypeObject
-  PyRange_Type*: PPyTypeObject
-  PySlice_Type*: PPyTypeObject
-  PyString_Type*: PPyTypeObject
-  PyTuple_Type*: PPyTypeObject
-  PyBaseObject_Type*: PPyTypeObject
-  PyBuffer_Type*: PPyTypeObject
-  PyCallIter_Type*: PPyTypeObject
-  PyCell_Type*: PPyTypeObject
-  PyClassMethod_Type*: PPyTypeObject
-  PyProperty_Type*: PPyTypeObject
-  PySeqIter_Type*: PPyTypeObject
-  PyStaticMethod_Type*: PPyTypeObject
-  PySuper_Type*: PPyTypeObject
-  PySymtableEntry_Type*: PPyTypeObject
-  PyTraceBack_Type*: PPyTypeObject
-  PyUnicode_Type*: PPyTypeObject
-  PyWrapperDescr_Type*: PPyTypeObject
-  PyBaseString_Type*: PPyTypeObject
-  PyBool_Type*: PPyTypeObject
-  PyEnum_Type*: PPyTypeObject #PyArg_GetObject: function(args: PPyObject; nargs, i: integer; p_a: PPPyObject): integer; cdecl;
-                              #PyArg_GetLong:   function(args: PPyObject; nargs, i: integer; p_a: PLong): integer; cdecl;
-                              #PyArg_GetShort:  function(args: PPyObject; nargs, i: integer; p_a: PShort): integer; cdecl;
-                              #PyArg_GetFloat:  function(args: PPyObject; nargs, i: integer; p_a: PFloat): integer; cdecl;
-                              #PyArg_GetString: function(args: PPyObject; nargs, i: integer; p_a: PString): integer; cdecl;
-                              #PyArgs_VaParse:  function (args: PPyObject; format: PChar; va_list: array of const): integer; cdecl;
-                              # Does not work!
-                              # Py_VaBuildValue: function (format: PChar; va_list: array of const): PPyObject; cdecl;
-                              #PyBuiltin_Init:     procedure; cdecl;
-  PyComplex_FromCComplex*: proc (c: TPy_complex): PPyObject{.cdecl.}
-  PyComplex_FromDoubles*: proc (realv, imag: float64): PPyObject{.cdecl.}
-  PyComplex_RealAsDouble*: proc (op: PPyObject): float64{.cdecl.}
-  PyComplex_ImagAsDouble*: proc (op: PPyObject): float64{.cdecl.}
-  PyComplex_AsCComplex*: proc (op: PPyObject): TPy_complex{.cdecl.}
-  PyCFunction_GetFunction*: proc (ob: PPyObject): Pointer{.cdecl.}
-  PyCFunction_GetSelf*: proc (ob: PPyObject): PPyObject{.cdecl.}
-  PyCallable_Check*: proc (ob: PPyObject): int{.cdecl.}
-  PyCObject_FromVoidPtr*: proc (cobj, destruct: Pointer): PPyObject{.cdecl.}
-  PyCObject_AsVoidPtr*: proc (ob: PPyObject): Pointer{.cdecl.}
-  PyClass_New*: proc (ob1, ob2, ob3: PPyObject): PPyObject{.cdecl.}
-  PyClass_IsSubclass*: proc (ob1, ob2: PPyObject): int{.cdecl.}
-  Py_InitModule4*: proc (name: cstring, methods: PPyMethodDef, doc: cstring, 
-                         passthrough: PPyObject, Api_Version: int): PPyObject{.
-      cdecl.}
-  PyErr_BadArgument*: proc (): int{.cdecl.}
-  PyErr_BadInternalCall*: proc (){.cdecl.}
-  PyErr_CheckSignals*: proc (): int{.cdecl.}
-  PyErr_Clear*: proc (){.cdecl.}
-  PyErr_Fetch*: proc (errtype, errvalue, errtraceback: PPPyObject){.cdecl.}
-  PyErr_NoMemory*: proc (): PPyObject{.cdecl.}
-  PyErr_Occurred*: proc (): PPyObject{.cdecl.}
-  PyErr_Print*: proc (){.cdecl.}
-  PyErr_Restore*: proc (errtype, errvalue, errtraceback: PPyObject){.cdecl.}
-  PyErr_SetFromErrno*: proc (ob: PPyObject): PPyObject{.cdecl.}
-  PyErr_SetNone*: proc (value: PPyObject){.cdecl.}
-  PyErr_SetObject*: proc (ob1, ob2: PPyObject){.cdecl.}
-  PyErr_SetString*: proc (ErrorObject: PPyObject, text: cstring){.cdecl.}
-  PyImport_GetModuleDict*: proc (): PPyObject{.cdecl.}
-  PyInt_FromLong*: proc (x: int32): PPyObject{.cdecl.}
-  Py_Initialize*: proc (){.cdecl.}
-  Py_Exit*: proc (RetVal: int){.cdecl.}
-  PyEval_GetBuiltins*: proc (): PPyObject{.cdecl.}
-  PyDict_GetItem*: proc (mp, key: PPyObject): PPyObject{.cdecl.}
-  PyDict_SetItem*: proc (mp, key, item: PPyObject): int{.cdecl.}
-  PyDict_DelItem*: proc (mp, key: PPyObject): int{.cdecl.}
-  PyDict_Clear*: proc (mp: PPyObject){.cdecl.}
-  PyDict_Next*: proc (mp: PPyObject, pos: PInt, key, value: PPPyObject): int{.
-      cdecl.}
-  PyDict_Keys*: proc (mp: PPyObject): PPyObject{.cdecl.}
-  PyDict_Values*: proc (mp: PPyObject): PPyObject{.cdecl.}
-  PyDict_Items*: proc (mp: PPyObject): PPyObject{.cdecl.}
-  PyDict_Size*: proc (mp: PPyObject): int{.cdecl.}
-  PyDict_DelItemString*: proc (dp: PPyObject, key: cstring): int{.cdecl.}
-  PyDict_New*: proc (): PPyObject{.cdecl.}
-  PyDict_GetItemString*: proc (dp: PPyObject, key: cstring): PPyObject{.cdecl.}
-  PyDict_SetItemString*: proc (dp: PPyObject, key: cstring, item: PPyObject): int{.
-      cdecl.}
-  PyDictProxy_New*: proc (obj: PPyObject): PPyObject{.cdecl.}
-  PyModule_GetDict*: proc (module: PPyObject): PPyObject{.cdecl.}
-  PyObject_Str*: proc (v: PPyObject): PPyObject{.cdecl.}
-  PyRun_String*: proc (str: cstring, start: int, globals: PPyObject, 
-                       locals: PPyObject): PPyObject{.cdecl.}
-  PyRun_SimpleString*: proc (str: cstring): int{.cdecl.}
-  PyString_AsString*: proc (ob: PPyObject): cstring{.cdecl.}
-  PyString_FromString*: proc (str: cstring): PPyObject{.cdecl.}
-  PySys_SetArgv*: proc (argc: int, argv: PPChar){.cdecl.} #+ means, Grzegorz or me has tested his non object version of this function
-                                                          #+
-  PyCFunction_New*: proc (md: PPyMethodDef, ob: PPyObject): PPyObject{.cdecl.} #+
-  PyEval_CallObject*: proc (ob1, ob2: PPyObject): PPyObject{.cdecl.} #-
-  PyEval_CallObjectWithKeywords*: proc (ob1, ob2, ob3: PPyObject): PPyObject{.
-      cdecl.}                 #-
-  PyEval_GetFrame*: proc (): PPyObject{.cdecl.} #-
-  PyEval_GetGlobals*: proc (): PPyObject{.cdecl.} #-
-  PyEval_GetLocals*: proc (): PPyObject{.cdecl.} #-
-                                                 #PyEval_GetOwner:function:PPyObject; cdecl;
-                                                 #-
-  PyEval_GetRestricted*: proc (): int{.cdecl.} #-
-  PyEval_InitThreads*: proc (){.cdecl.} #-
-  PyEval_RestoreThread*: proc (tstate: PPyThreadState){.cdecl.} #-
-  PyEval_SaveThread*: proc (): PPyThreadState{.cdecl.} #-
-  PyFile_FromString*: proc (pc1, pc2: cstring): PPyObject{.cdecl.} #-
-  PyFile_GetLine*: proc (ob: PPyObject, i: int): PPyObject{.cdecl.} #-
-  PyFile_Name*: proc (ob: PPyObject): PPyObject{.cdecl.} #-
-  PyFile_SetBufSize*: proc (ob: PPyObject, i: int){.cdecl.} #-
-  PyFile_SoftSpace*: proc (ob: PPyObject, i: int): int{.cdecl.} #-
-  PyFile_WriteObject*: proc (ob1, ob2: PPyObject, i: int): int{.cdecl.} #-
-  PyFile_WriteString*: proc (s: cstring, ob: PPyObject){.cdecl.} #+
-  PyFloat_AsDouble*: proc (ob: PPyObject): float64{.cdecl.} #+
-  PyFloat_FromDouble*: proc (db: float64): PPyObject{.cdecl.} #-
-  PyFunction_GetCode*: proc (ob: PPyObject): PPyObject{.cdecl.} #-
-  PyFunction_GetGlobals*: proc (ob: PPyObject): PPyObject{.cdecl.} #-
-  PyFunction_New*: proc (ob1, ob2: PPyObject): PPyObject{.cdecl.} #-
-  PyImport_AddModule*: proc (name: cstring): PPyObject{.cdecl.} #-
-  PyImport_Cleanup*: proc (){.cdecl.} #-
-  PyImport_GetMagicNumber*: proc (): int32{.cdecl.} #+
-  PyImport_ImportFrozenModule*: proc (key: cstring): int{.cdecl.} #+
-  PyImport_ImportModule*: proc (name: cstring): PPyObject{.cdecl.} #+
-  PyImport_Import*: proc (name: PPyObject): PPyObject{.cdecl.} #-
-                                                               #PyImport_Init:procedure; cdecl;
-                                                               #-
-  PyImport_ReloadModule*: proc (ob: PPyObject): PPyObject{.cdecl.} #-
-  PyInstance_New*: proc (obClass, obArg, obKW: PPyObject): PPyObject{.cdecl.} #+
-  PyInt_AsLong*: proc (ob: PPyObject): int32{.cdecl.} #-
-  PyList_Append*: proc (ob1, ob2: PPyObject): int{.cdecl.} #-
-  PyList_AsTuple*: proc (ob: PPyObject): PPyObject{.cdecl.} #+
-  PyList_GetItem*: proc (ob: PPyObject, i: int): PPyObject{.cdecl.} #-
-  PyList_GetSlice*: proc (ob: PPyObject, i1, i2: int): PPyObject{.cdecl.} #-
-  PyList_Insert*: proc (dp: PPyObject, idx: int, item: PPyObject): int{.cdecl.} #-
-  PyList_New*: proc (size: int): PPyObject{.cdecl.} #-
-  PyList_Reverse*: proc (ob: PPyObject): int{.cdecl.} #-
-  PyList_SetItem*: proc (dp: PPyObject, idx: int, item: PPyObject): int{.cdecl.} #-
-  PyList_SetSlice*: proc (ob: PPyObject, i1, i2: int, ob2: PPyObject): int{.
-      cdecl.}                 #+
-  PyList_Size*: proc (ob: PPyObject): int{.cdecl.} #-
-  PyList_Sort*: proc (ob: PPyObject): int{.cdecl.} #-
-  PyLong_AsDouble*: proc (ob: PPyObject): float64{.cdecl.} #+
-  PyLong_AsLong*: proc (ob: PPyObject): int32{.cdecl.} #+
-  PyLong_FromDouble*: proc (db: float64): PPyObject{.cdecl.} #+
-  PyLong_FromLong*: proc (l: int32): PPyObject{.cdecl.} #-
-  PyLong_FromString*: proc (pc: cstring, ppc: var cstring, i: int): PPyObject{.
-      cdecl.}                 #-
-  PyLong_FromUnsignedLong*: proc (val: int): PPyObject{.cdecl.} #-
-  PyLong_AsUnsignedLong*: proc (ob: PPyObject): int{.cdecl.} #-
-  PyLong_FromUnicode*: proc (ob: PPyObject, a, b: int): PPyObject{.cdecl.} #-
-  PyLong_FromLongLong*: proc (val: Int64): PPyObject{.cdecl.} #-
-  PyLong_AsLongLong*: proc (ob: PPyObject): Int64{.cdecl.} #-
-  PyMapping_Check*: proc (ob: PPyObject): int{.cdecl.} #-
-  PyMapping_GetItemString*: proc (ob: PPyObject, key: cstring): PPyObject{.cdecl.} #-
-  PyMapping_HasKey*: proc (ob, key: PPyObject): int{.cdecl.} #-
-  PyMapping_HasKeyString*: proc (ob: PPyObject, key: cstring): int{.cdecl.} #-
-  PyMapping_Length*: proc (ob: PPyObject): int{.cdecl.} #-
-  PyMapping_SetItemString*: proc (ob: PPyObject, key: cstring, value: PPyObject): int{.
-      cdecl.}                 #-
-  PyMethod_Class*: proc (ob: PPyObject): PPyObject{.cdecl.} #-
-  PyMethod_Function*: proc (ob: PPyObject): PPyObject{.cdecl.} #-
-  PyMethod_New*: proc (ob1, ob2, ob3: PPyObject): PPyObject{.cdecl.} #-
-  PyMethod_Self*: proc (ob: PPyObject): PPyObject{.cdecl.} #-
-  PyModule_GetName*: proc (ob: PPyObject): cstring{.cdecl.} #-
-  PyModule_New*: proc (key: cstring): PPyObject{.cdecl.} #-
-  PyNumber_Absolute*: proc (ob: PPyObject): PPyObject{.cdecl.} #-
-  PyNumber_Add*: proc (ob1, ob2: PPyObject): PPyObject{.cdecl.} #-
-  PyNumber_And*: proc (ob1, ob2: PPyObject): PPyObject{.cdecl.} #-
-  PyNumber_Check*: proc (ob: PPyObject): int{.cdecl.} #-
-  PyNumber_Coerce*: proc (ob1, ob2: var PPyObject): int{.cdecl.} #-
-  PyNumber_Divide*: proc (ob1, ob2: PPyObject): PPyObject{.cdecl.} #-
-  PyNumber_FloorDivide*: proc (ob1, ob2: PPyObject): PPyObject{.cdecl.} #-
-  PyNumber_TrueDivide*: proc (ob1, ob2: PPyObject): PPyObject{.cdecl.} #-
-  PyNumber_Divmod*: proc (ob1, ob2: PPyObject): PPyObject{.cdecl.} #-
-  PyNumber_Float*: proc (ob: PPyObject): PPyObject{.cdecl.} #-
-  PyNumber_Int*: proc (ob: PPyObject): PPyObject{.cdecl.} #-
-  PyNumber_Invert*: proc (ob: PPyObject): PPyObject{.cdecl.} #-
-  PyNumber_Long*: proc (ob: PPyObject): PPyObject{.cdecl.} #-
-  PyNumber_Lshift*: proc (ob1, ob2: PPyObject): PPyObject{.cdecl.} #-
-  PyNumber_Multiply*: proc (ob1, ob2: PPyObject): PPyObject{.cdecl.} #-
-  PyNumber_Negative*: proc (ob: PPyObject): PPyObject{.cdecl.} #-
-  PyNumber_Or*: proc (ob1, ob2: PPyObject): PPyObject{.cdecl.} #-
-  PyNumber_Positive*: proc (ob: PPyObject): PPyObject{.cdecl.} #-
-  PyNumber_Power*: proc (ob1, ob2, ob3: PPyObject): PPyObject{.cdecl.} #-
-  PyNumber_Remainder*: proc (ob1, ob2: PPyObject): PPyObject{.cdecl.} #-
-  PyNumber_Rshift*: proc (ob1, ob2: PPyObject): PPyObject{.cdecl.} #-
-  PyNumber_Subtract*: proc (ob1, ob2: PPyObject): PPyObject{.cdecl.} #-
-  PyNumber_Xor*: proc (ob1, ob2: PPyObject): PPyObject{.cdecl.} #-
-  PyOS_InitInterrupts*: proc (){.cdecl.} #-
-  PyOS_InterruptOccurred*: proc (): int{.cdecl.} #-
-  PyObject_CallObject*: proc (ob, args: PPyObject): PPyObject{.cdecl.} #-
-  PyObject_Compare*: proc (ob1, ob2: PPyObject): int{.cdecl.} #-
-  PyObject_GetAttr*: proc (ob1, ob2: PPyObject): PPyObject{.cdecl.} #+
-  PyObject_GetAttrString*: proc (ob: PPyObject, c: cstring): PPyObject{.cdecl.} #-
-  PyObject_GetItem*: proc (ob, key: PPyObject): PPyObject{.cdecl.} #-
-  PyObject_DelItem*: proc (ob, key: PPyObject): PPyObject{.cdecl.} #-
-  PyObject_HasAttrString*: proc (ob: PPyObject, key: cstring): int{.cdecl.} #-
-  PyObject_Hash*: proc (ob: PPyObject): int32{.cdecl.} #-
-  PyObject_IsTrue*: proc (ob: PPyObject): int{.cdecl.} #-
-  PyObject_Length*: proc (ob: PPyObject): int{.cdecl.} #-
-  PyObject_Repr*: proc (ob: PPyObject): PPyObject{.cdecl.} #-
-  PyObject_SetAttr*: proc (ob1, ob2, ob3: PPyObject): int{.cdecl.} #-
-  PyObject_SetAttrString*: proc (ob: PPyObject, key: cstring, value: PPyObject): int{.
-      cdecl.}                 #-
-  PyObject_SetItem*: proc (ob1, ob2, ob3: PPyObject): int{.cdecl.} #-
-  PyObject_Init*: proc (ob: PPyObject, t: PPyTypeObject): PPyObject{.cdecl.} #-
-  PyObject_InitVar*: proc (ob: PPyObject, t: PPyTypeObject, size: int): PPyObject{.
-      cdecl.}                 #-
-  PyObject_New*: proc (t: PPyTypeObject): PPyObject{.cdecl.} #-
-  PyObject_NewVar*: proc (t: PPyTypeObject, size: int): PPyObject{.cdecl.}
-  PyObject_Free*: proc (ob: PPyObject){.cdecl.} #-
-  PyObject_IsInstance*: proc (inst, cls: PPyObject): int{.cdecl.} #-
-  PyObject_IsSubclass*: proc (derived, cls: PPyObject): int{.cdecl.}
-  PyObject_GenericGetAttr*: proc (obj, name: PPyObject): PPyObject{.cdecl.}
-  PyObject_GenericSetAttr*: proc (obj, name, value: PPyObject): int{.cdecl.} #-
-  PyObject_GC_Malloc*: proc (size: int): PPyObject{.cdecl.} #-
-  PyObject_GC_New*: proc (t: PPyTypeObject): PPyObject{.cdecl.} #-
-  PyObject_GC_NewVar*: proc (t: PPyTypeObject, size: int): PPyObject{.cdecl.} #-
-  PyObject_GC_Resize*: proc (t: PPyObject, newsize: int): PPyObject{.cdecl.} #-
-  PyObject_GC_Del*: proc (ob: PPyObject){.cdecl.} #-
-  PyObject_GC_Track*: proc (ob: PPyObject){.cdecl.} #-
-  PyObject_GC_UnTrack*: proc (ob: PPyObject){.cdecl.} #-
-  PyRange_New*: proc (l1, l2, l3: int32, i: int): PPyObject{.cdecl.} #-
-  PySequence_Check*: proc (ob: PPyObject): int{.cdecl.} #-
-  PySequence_Concat*: proc (ob1, ob2: PPyObject): PPyObject{.cdecl.} #-
-  PySequence_Count*: proc (ob1, ob2: PPyObject): int{.cdecl.} #-
-  PySequence_GetItem*: proc (ob: PPyObject, i: int): PPyObject{.cdecl.} #-
-  PySequence_GetSlice*: proc (ob: PPyObject, i1, i2: int): PPyObject{.cdecl.} #-
-  PySequence_In*: proc (ob1, ob2: PPyObject): int{.cdecl.} #-
-  PySequence_Index*: proc (ob1, ob2: PPyObject): int{.cdecl.} #-
-  PySequence_Length*: proc (ob: PPyObject): int{.cdecl.} #-
-  PySequence_Repeat*: proc (ob: PPyObject, count: int): PPyObject{.cdecl.} #-
-  PySequence_SetItem*: proc (ob: PPyObject, i: int, value: PPyObject): int{.
-      cdecl.}                 #-
-  PySequence_SetSlice*: proc (ob: PPyObject, i1, i2: int, value: PPyObject): int{.
-      cdecl.}                 #-
-  PySequence_DelSlice*: proc (ob: PPyObject, i1, i2: int): int{.cdecl.} #-
-  PySequence_Tuple*: proc (ob: PPyObject): PPyObject{.cdecl.} #-
-  PySequence_Contains*: proc (ob, value: PPyObject): int{.cdecl.} #-
-  PySlice_GetIndices*: proc (ob: PPySliceObject, len: int, 
-                             start, stop, step: var int): int{.cdecl.} #-
-  PySlice_GetIndicesEx*: proc (ob: PPySliceObject, len: int, 
-                               start, stop, step, slicelength: var int): int{.
-      cdecl.}                 #-
-  PySlice_New*: proc (start, stop, step: PPyObject): PPyObject{.cdecl.} #-
-  PyString_Concat*: proc (ob1: var PPyObject, ob2: PPyObject){.cdecl.} #-
-  PyString_ConcatAndDel*: proc (ob1: var PPyObject, ob2: PPyObject){.cdecl.} #-
-  PyString_Format*: proc (ob1, ob2: PPyObject): PPyObject{.cdecl.} #-
-  PyString_FromStringAndSize*: proc (s: cstring, i: int): PPyObject{.cdecl.} #-
-  PyString_Size*: proc (ob: PPyObject): int{.cdecl.} #-
-  PyString_DecodeEscape*: proc (s: cstring, length: int, errors: cstring, 
-                                unicode: int, recode_encoding: cstring): PPyObject{.
-      cdecl.}                 #-
-  PyString_Repr*: proc (ob: PPyObject, smartquotes: int): PPyObject{.cdecl.} #+
-  PySys_GetObject*: proc (s: cstring): PPyObject{.cdecl.} #-
-                                                          #PySys_Init:procedure; cdecl;
-                                                          #-
-  PySys_SetObject*: proc (s: cstring, ob: PPyObject): int{.cdecl.} #-
-  PySys_SetPath*: proc (path: cstring){.cdecl.} #-
-                                                #PyTraceBack_Fetch:function:PPyObject; cdecl;
-                                                #-
-  PyTraceBack_Here*: proc (p: pointer): int{.cdecl.} #-
-  PyTraceBack_Print*: proc (ob1, ob2: PPyObject): int{.cdecl.} #-
-                                                               #PyTraceBack_Store:function (ob:PPyObject):integer; cdecl;
-                                                               #+
-  PyTuple_GetItem*: proc (ob: PPyObject, i: int): PPyObject{.cdecl.} #-
-  PyTuple_GetSlice*: proc (ob: PPyObject, i1, i2: int): PPyObject{.cdecl.} #+
-  PyTuple_New*: proc (size: int): PPyObject{.cdecl.} #+
-  PyTuple_SetItem*: proc (ob: PPyObject, key: int, value: PPyObject): int{.cdecl.} #+
-  PyTuple_Size*: proc (ob: PPyObject): int{.cdecl.} #+
-  PyType_IsSubtype*: proc (a, b: PPyTypeObject): int{.cdecl.}
-  PyType_GenericAlloc*: proc (atype: PPyTypeObject, nitems: int): PPyObject{.
-      cdecl.}
-  PyType_GenericNew*: proc (atype: PPyTypeObject, args, kwds: PPyObject): PPyObject{.
-      cdecl.}
-  PyType_Ready*: proc (atype: PPyTypeObject): int{.cdecl.} #+
-  PyUnicode_FromWideChar*: proc (w: PWideChar, size: int): PPyObject{.cdecl.} #+
-  PyUnicode_AsWideChar*: proc (unicode: PPyObject, w: PWideChar, size: int): int{.
-      cdecl.}                 #-
-  PyUnicode_FromOrdinal*: proc (ordinal: int): PPyObject{.cdecl.}
-  PyWeakref_GetObject*: proc (ref: PPyObject): PPyObject{.cdecl.}
-  PyWeakref_NewProxy*: proc (ob, callback: PPyObject): PPyObject{.cdecl.}
-  PyWeakref_NewRef*: proc (ob, callback: PPyObject): PPyObject{.cdecl.}
-  PyWrapper_New*: proc (ob1, ob2: PPyObject): PPyObject{.cdecl.}
-  PyBool_FromLong*: proc (ok: int): PPyObject{.cdecl.} #-
-  Py_AtExit*: proc (proc: proc ()): int{.cdecl.} #-
-                                                 #Py_Cleanup:procedure; cdecl;
-                                                 #-
-  Py_CompileString*: proc (s1, s2: cstring, i: int): PPyObject{.cdecl.} #-
-  Py_FatalError*: proc (s: cstring){.cdecl.} #-
-  Py_FindMethod*: proc (md: PPyMethodDef, ob: PPyObject, key: cstring): PPyObject{.
-      cdecl.}                 #-
-  Py_FindMethodInChain*: proc (mc: PPyMethodChain, ob: PPyObject, key: cstring): PPyObject{.
-      cdecl.}                 #-
-  Py_FlushLine*: proc (){.cdecl.} #+
-  Py_Finalize*: proc (){.cdecl.} #-
-  PyErr_ExceptionMatches*: proc (exc: PPyObject): int{.cdecl.} #-
-  PyErr_GivenExceptionMatches*: proc (raised_exc, exc: PPyObject): int{.cdecl.} #-
-  PyEval_EvalCode*: proc (co: PPyCodeObject, globals, locals: PPyObject): PPyObject{.
-      cdecl.}                 #+
-  Py_GetVersion*: proc (): cstring{.cdecl.} #+
-  Py_GetCopyright*: proc (): cstring{.cdecl.} #+
-  Py_GetExecPrefix*: proc (): cstring{.cdecl.} #+
-  Py_GetPath*: proc (): cstring{.cdecl.} #+
-  Py_GetPrefix*: proc (): cstring{.cdecl.} #+
-  Py_GetProgramName*: proc (): cstring{.cdecl.} #-
-  PyParser_SimpleParseString*: proc (str: cstring, start: int): PNode{.cdecl.} #-
-  PyNode_Free*: proc (n: PNode){.cdecl.} #-
-  PyErr_NewException*: proc (name: cstring, base, dict: PPyObject): PPyObject{.
-      cdecl.}                 #-
-  Py_Malloc*: proc (size: int): Pointer #-
-  PyMem_Malloc*: proc (size: int): Pointer #-
-  PyObject_CallMethod*: proc (obj: PPyObject, method, format: cstring): PPyObject{.
-      cdecl.}                 #New exported Objects in Python 1.5
-  Py_SetProgramName*: proc (name: cstring){.cdecl.}
-  Py_IsInitialized*: proc (): int{.cdecl.}
-  Py_GetProgramFullPath*: proc (): cstring{.cdecl.}
-  Py_NewInterpreter*: proc (): PPyThreadState{.cdecl.}
-  Py_EndInterpreter*: proc (tstate: PPyThreadState){.cdecl.}
-  PyEval_AcquireLock*: proc (){.cdecl.}
-  PyEval_ReleaseLock*: proc (){.cdecl.}
-  PyEval_AcquireThread*: proc (tstate: PPyThreadState){.cdecl.}
-  PyEval_ReleaseThread*: proc (tstate: PPyThreadState){.cdecl.}
-  PyInterpreterState_New*: proc (): PPyInterpreterState{.cdecl.}
-  PyInterpreterState_Clear*: proc (interp: PPyInterpreterState){.cdecl.}
-  PyInterpreterState_Delete*: proc (interp: PPyInterpreterState){.cdecl.}
-  PyThreadState_New*: proc (interp: PPyInterpreterState): PPyThreadState{.cdecl.}
-  PyThreadState_Clear*: proc (tstate: PPyThreadState){.cdecl.}
-  PyThreadState_Delete*: proc (tstate: PPyThreadState){.cdecl.}
-  PyThreadState_Get*: proc (): PPyThreadState{.cdecl.}
-  PyThreadState_Swap*: proc (tstate: PPyThreadState): PPyThreadState{.cdecl.} 
-
-#Further exported Objects, may be implemented later
-#
-#    PyCode_New: Pointer;
-#    PyErr_SetInterrupt: Pointer;
-#    PyFile_AsFile: Pointer;
-#    PyFile_FromFile: Pointer;
-#    PyFloat_AsString: Pointer;
-#    PyFrame_BlockPop: Pointer;
-#    PyFrame_BlockSetup: Pointer;
-#    PyFrame_ExtendStack: Pointer;
-#    PyFrame_FastToLocals: Pointer;
-#    PyFrame_LocalsToFast: Pointer;
-#    PyFrame_New: Pointer;
-#    PyGrammar_AddAccelerators: Pointer;
-#    PyGrammar_FindDFA: Pointer;
-#    PyGrammar_LabelRepr: Pointer;
-#    PyInstance_DoBinOp: Pointer;
-#    PyInt_GetMax: Pointer;
-#    PyMarshal_Init: Pointer;
-#    PyMarshal_ReadLongFromFile: Pointer;
-#    PyMarshal_ReadObjectFromFile: Pointer;
-#    PyMarshal_ReadObjectFromString: Pointer;
-#    PyMarshal_WriteLongToFile: Pointer;
-#    PyMarshal_WriteObjectToFile: Pointer;
-#    PyMember_Get: Pointer;
-#    PyMember_Set: Pointer;
-#    PyNode_AddChild: Pointer;
-#    PyNode_Compile: Pointer;
-#    PyNode_New: Pointer;
-#    PyOS_GetLastModificationTime: Pointer;
-#    PyOS_Readline: Pointer;
-#    PyOS_strtol: Pointer;
-#    PyOS_strtoul: Pointer;
-#    PyObject_CallFunction: Pointer;
-#    PyObject_CallMethod: Pointer;
-#    PyObject_Print: Pointer;
-#    PyParser_AddToken: Pointer;
-#    PyParser_Delete: Pointer;
-#    PyParser_New: Pointer;
-#    PyParser_ParseFile: Pointer;
-#    PyParser_ParseString: Pointer;
-#    PyParser_SimpleParseFile: Pointer;
-#    PyRun_AnyFile: Pointer;
-#    PyRun_File: Pointer;
-#    PyRun_InteractiveLoop: Pointer;
-#    PyRun_InteractiveOne: Pointer;
-#    PyRun_SimpleFile: Pointer;
-#    PySys_GetFile: Pointer;
-#    PyToken_OneChar: Pointer;
-#    PyToken_TwoChars: Pointer;
-#    PyTokenizer_Free: Pointer;
-#    PyTokenizer_FromFile: Pointer;
-#    PyTokenizer_FromString: Pointer;
-#    PyTokenizer_Get: Pointer;
-#    Py_Main: Pointer;
-#    _PyObject_NewVar: Pointer;
-#    _PyParser_Grammar: Pointer;
-#    _PyParser_TokenNames: Pointer;
-#    _PyThread_Started: Pointer;
-#    _Py_c_diff: Pointer;
-#    _Py_c_neg: Pointer;
-#    _Py_c_pow: Pointer;
-#    _Py_c_prod: Pointer;
-#    _Py_c_quot: Pointer;
-#    _Py_c_sum: Pointer;
-#
-
-# This function handles all cardinals, pointer types (with no adjustment of pointers!)
-# (Extended) floats, which are handled as Python doubles and currencies, handled
-# as (normalized) Python doubles.
-proc PyImport_ExecCodeModule*(name: String, codeobject: PPyObject): PPyObject
-proc PyString_Check*(obj: PPyObject): bool
-proc PyString_CheckExact*(obj: PPyObject): bool
-proc PyFloat_Check*(obj: PPyObject): bool
-proc PyFloat_CheckExact*(obj: PPyObject): bool
-proc PyInt_Check*(obj: PPyObject): bool
-proc PyInt_CheckExact*(obj: PPyObject): bool
-proc PyLong_Check*(obj: PPyObject): bool
-proc PyLong_CheckExact*(obj: PPyObject): bool
-proc PyTuple_Check*(obj: PPyObject): bool
-proc PyTuple_CheckExact*(obj: PPyObject): bool
-proc PyInstance_Check*(obj: PPyObject): bool
-proc PyClass_Check*(obj: PPyObject): bool
-proc PyMethod_Check*(obj: PPyObject): bool
-proc PyList_Check*(obj: PPyObject): bool
-proc PyList_CheckExact*(obj: PPyObject): bool
-proc PyDict_Check*(obj: PPyObject): bool
-proc PyDict_CheckExact*(obj: PPyObject): bool
-proc PyModule_Check*(obj: PPyObject): bool
-proc PyModule_CheckExact*(obj: PPyObject): bool
-proc PySlice_Check*(obj: PPyObject): bool
-proc PyFunction_Check*(obj: PPyObject): bool
-proc PyUnicode_Check*(obj: PPyObject): bool
-proc PyUnicode_CheckExact*(obj: PPyObject): bool
-proc PyType_IS_GC*(t: PPyTypeObject): bool
-proc PyObject_IS_GC*(obj: PPyObject): bool
-proc PyWeakref_Check*(obj: PPyObject): bool
-proc PyWeakref_CheckRef*(obj: PPyObject): bool
-proc PyWeakref_CheckProxy*(obj: PPyObject): bool
-proc PyBool_Check*(obj: PPyObject): bool
-proc PyBaseString_Check*(obj: PPyObject): bool
-proc PyEnum_Check*(obj: PPyObject): bool
-proc PyObject_TypeCheck*(obj: PPyObject, t: PPyTypeObject): bool
-proc Py_InitModule*(name: cstring, md: PPyMethodDef): PPyObject
-proc PyType_HasFeature*(AType: PPyTypeObject, AFlag: int): bool
-# implementation
-
-proc Py_INCREF*(op: PPyObject) {.inline.} = 
-  Inc(op.ob_refcnt)
-
-proc Py_DECREF*(op: PPyObject) {.inline.} = 
-  Dec(op.ob_refcnt)
-  if op.ob_refcnt == 0: 
-    op.ob_type.tp_dealloc(op)
-
-proc Py_XINCREF*(op: PPyObject) {.inline.} = 
-  if op != nil: Py_INCREF(op)
-  
-proc Py_XDECREF*(op: PPyObject) {.inline.} = 
-  if op != nil: Py_DECREF(op)
-  
-proc PyImport_ExecCodeModule(name: String, codeobject: PPyObject): PPyObject = 
-  var m, d, v, modules: PPyObject
-  m = PyImport_AddModule(cstring(name))
-  if m == nil: 
-    return nil
-  d = PyModule_GetDict(m)
-  if PyDict_GetItemString(d, "__builtins__") == nil: 
-    if PyDict_SetItemString(d, "__builtins__", PyEval_GetBuiltins) != 0: 
-      return nil
-  if PyDict_SetItemString(d, "__file__", PPyCodeObject(codeobject).co_filename) !=
-      0: 
-    PyErr_Clear()             # Not important enough to report
-  v = PyEval_EvalCode(PPyCodeObject(codeobject), d, d) # XXX owner ?
-  if v == nil: 
-    return nil
-  Py_XDECREF(v)
-  modules = PyImport_GetModuleDict()
-  if PyDict_GetItemString(modules, cstring(name)) == nil: 
-    PyErr_SetString(PyExc_ImportError^ , cstring(
-        Format("Loaded module %.200s not found in sys.modules", [name])))
-    return nil
-  Py_XINCREF(m)
-  Result = m
-
-proc PyString_Check(obj: PPyObject): bool = 
-  Result = PyObject_TypeCheck(obj, PyString_Type)
-
-proc PyString_CheckExact(obj: PPyObject): bool = 
-  Result = (obj != nil) and (obj.ob_type == PPyTypeObject(PyString_Type))
-
-proc PyFloat_Check(obj: PPyObject): bool = 
-  Result = PyObject_TypeCheck(obj, PyFloat_Type)
-
-proc PyFloat_CheckExact(obj: PPyObject): bool = 
-  Result = (obj != nil) and (obj.ob_type == PPyTypeObject(PyFloat_Type))
-
-proc PyInt_Check(obj: PPyObject): bool = 
-  Result = PyObject_TypeCheck(obj, PyInt_Type)
-
-proc PyInt_CheckExact(obj: PPyObject): bool = 
-  Result = (obj != nil) and (obj.ob_type == PPyTypeObject(PyInt_Type))
-
-proc PyLong_Check(obj: PPyObject): bool = 
-  Result = PyObject_TypeCheck(obj, PyLong_Type)
-
-proc PyLong_CheckExact(obj: PPyObject): bool = 
-  Result = (obj != nil) and (obj.ob_type == PPyTypeObject(PyLong_Type))
-
-proc PyTuple_Check(obj: PPyObject): bool = 
-  Result = PyObject_TypeCheck(obj, PyTuple_Type)
-
-proc PyTuple_CheckExact(obj: PPyObject): bool = 
-  Result = (obj != nil) and (obj^ .ob_type == PPyTypeObject(PyTuple_Type))
-
-proc PyInstance_Check(obj: PPyObject): bool = 
-  Result = (obj != nil) and (obj^ .ob_type == PPyTypeObject(PyInstance_Type))
-
-proc PyClass_Check(obj: PPyObject): bool = 
-  Result = (obj != nil) and (obj^ .ob_type == PPyTypeObject(PyClass_Type))
-
-proc PyMethod_Check(obj: PPyObject): bool = 
-  Result = (obj != nil) and (obj^ .ob_type == PPyTypeObject(PyMethod_Type))
-
-proc PyList_Check(obj: PPyObject): bool = 
-  Result = PyObject_TypeCheck(obj, PyList_Type)
-
-proc PyList_CheckExact(obj: PPyObject): bool = 
-  Result = (obj != nil) and (obj^ .ob_type == PPyTypeObject(PyList_Type))
-
-proc PyDict_Check(obj: PPyObject): bool = 
-  Result = PyObject_TypeCheck(obj, PyDict_Type)
-
-proc PyDict_CheckExact(obj: PPyObject): bool = 
-  Result = (obj != nil) and (obj^ .ob_type == PPyTypeObject(PyDict_Type))
-
-proc PyModule_Check(obj: PPyObject): bool = 
-  Result = PyObject_TypeCheck(obj, PyModule_Type)
-
-proc PyModule_CheckExact(obj: PPyObject): bool = 
-  Result = (obj != nil) and (obj^ .ob_type == PPyTypeObject(PyModule_Type))
-
-proc PySlice_Check(obj: PPyObject): bool = 
-  Result = (obj != nil) and (obj^ .ob_type == PPyTypeObject(PySlice_Type))
-
-proc PyFunction_Check(obj: PPyObject): bool = 
-  Result = (obj != nil) and
-      ((obj.ob_type == PPyTypeObject(PyCFunction_Type)) or
-      (obj.ob_type == PPyTypeObject(PyFunction_Type)))
-
-proc PyUnicode_Check(obj: PPyObject): bool = 
-  Result = PyObject_TypeCheck(obj, PyUnicode_Type)
-
-proc PyUnicode_CheckExact(obj: PPyObject): bool = 
-  Result = (obj != nil) and (obj^ .ob_type == PPyTypeObject(PyUnicode_Type))
-
-proc PyType_IS_GC(t: PPyTypeObject): bool = 
-  Result = PyType_HasFeature(t, Py_TPFLAGS_HAVE_GC)
-
-proc PyObject_IS_GC(obj: PPyObject): bool = 
-  Result = PyType_IS_GC(obj.ob_type) and
-      ((obj.ob_type.tp_is_gc == nil) or (obj.ob_type.tp_is_gc(obj) == 1))
-
-proc PyWeakref_Check(obj: PPyObject): bool = 
-  Result = (obj != nil) and
-      (PyWeakref_CheckRef(obj) or PyWeakref_CheckProxy(obj))
-
-proc PyWeakref_CheckRef(obj: PPyObject): bool = 
-  Result = (obj != nil) and (obj.ob_type == PPyTypeObject(PyWeakref_RefType))
-
-proc PyWeakref_CheckProxy(obj: PPyObject): bool = 
-  Result = (obj != nil) and
-      ((obj.ob_type == PPyTypeObject(PyWeakref_ProxyType)) or
-      (obj.ob_type == PPyTypeObject(PyWeakref_CallableProxyType)))
-
-proc PyBool_Check(obj: PPyObject): bool = 
-  Result = (obj != nil) and (obj.ob_type == PPyTypeObject(PyBool_Type))
-
-proc PyBaseString_Check(obj: PPyObject): bool = 
-  Result = PyObject_TypeCheck(obj, PyBaseString_Type)
-
-proc PyEnum_Check(obj: PPyObject): bool = 
-  Result = (obj != nil) and (obj.ob_type == PPyTypeObject(PyEnum_Type))
-
-proc PyObject_TypeCheck(obj: PPyObject, t: PPyTypeObject): bool = 
-  Result = (obj != nil) and (obj.ob_type == t)
-  if not Result and (obj != nil) and (t != nil): 
-    Result = PyType_IsSubtype(obj.ob_type, t) == 1
-  
-proc Py_InitModule(name: cstring, md: PPyMethodDef): PPyObject = 
-  result = Py_InitModule4(name, md, nil, nil, 1012)
-
-proc PyType_HasFeature(AType: PPyTypeObject, AFlag: int): bool = 
-  #(((t)->tp_flags & (f)) != 0)
-  Result = (AType.tp_flags and AFlag) != 0
-
-proc init(lib: TLibHandle) = 
-  Py_DebugFlag = getProcAddr(lib, "Py_DebugFlag")
-  Py_VerboseFlag = getProcAddr(lib, "Py_VerboseFlag")
-  Py_InteractiveFlag = getProcAddr(lib, "Py_InteractiveFlag")
-  Py_OptimizeFlag = getProcAddr(lib, "Py_OptimizeFlag")
-  Py_NoSiteFlag = getProcAddr(lib, "Py_NoSiteFlag")
-  Py_UseClassExceptionsFlag = getProcAddr(lib, "Py_UseClassExceptionsFlag")
-  Py_FrozenFlag = getProcAddr(lib, "Py_FrozenFlag")
-  Py_TabcheckFlag = getProcAddr(lib, "Py_TabcheckFlag")
-  Py_UnicodeFlag = getProcAddr(lib, "Py_UnicodeFlag")
-  Py_IgnoreEnvironmentFlag = getProcAddr(lib, "Py_IgnoreEnvironmentFlag")
-  Py_DivisionWarningFlag = getProcAddr(lib, "Py_DivisionWarningFlag")
-  Py_None = getProcAddr(lib, "_Py_NoneStruct")
-  Py_Ellipsis = getProcAddr(lib, "_Py_EllipsisObject")
-  Py_False = getProcAddr(lib, "_Py_ZeroStruct")
-  Py_True = getProcAddr(lib, "_Py_TrueStruct")
-  Py_NotImplemented = getProcAddr(lib, "_Py_NotImplementedStruct")
-  PyImport_FrozenModules = getProcAddr(lib, "PyImport_FrozenModules")
-  PyExc_AttributeError = getProcAddr(lib, "PyExc_AttributeError")
-  PyExc_EOFError = getProcAddr(lib, "PyExc_EOFError")
-  PyExc_IOError = getProcAddr(lib, "PyExc_IOError")
-  PyExc_ImportError = getProcAddr(lib, "PyExc_ImportError")
-  PyExc_IndexError = getProcAddr(lib, "PyExc_IndexError")
-  PyExc_KeyError = getProcAddr(lib, "PyExc_KeyError")
-  PyExc_KeyboardInterrupt = getProcAddr(lib, "PyExc_KeyboardInterrupt")
-  PyExc_MemoryError = getProcAddr(lib, "PyExc_MemoryError")
-  PyExc_NameError = getProcAddr(lib, "PyExc_NameError")
-  PyExc_OverflowError = getProcAddr(lib, "PyExc_OverflowError")
-  PyExc_RuntimeError = getProcAddr(lib, "PyExc_RuntimeError")
-  PyExc_SyntaxError = getProcAddr(lib, "PyExc_SyntaxError")
-  PyExc_SystemError = getProcAddr(lib, "PyExc_SystemError")
-  PyExc_SystemExit = getProcAddr(lib, "PyExc_SystemExit")
-  PyExc_TypeError = getProcAddr(lib, "PyExc_TypeError")
-  PyExc_ValueError = getProcAddr(lib, "PyExc_ValueError")
-  PyExc_ZeroDivisionError = getProcAddr(lib, "PyExc_ZeroDivisionError")
-  PyExc_ArithmeticError = getProcAddr(lib, "PyExc_ArithmeticError")
-  PyExc_Exception = getProcAddr(lib, "PyExc_Exception")
-  PyExc_FloatingPointError = getProcAddr(lib, "PyExc_FloatingPointError")
-  PyExc_LookupError = getProcAddr(lib, "PyExc_LookupError")
-  PyExc_StandardError = getProcAddr(lib, "PyExc_StandardError")
-  PyExc_AssertionError = getProcAddr(lib, "PyExc_AssertionError")
-  PyExc_EnvironmentError = getProcAddr(lib, "PyExc_EnvironmentError")
-  PyExc_IndentationError = getProcAddr(lib, "PyExc_IndentationError")
-  PyExc_MemoryErrorInst = getProcAddr(lib, "PyExc_MemoryErrorInst")
-  PyExc_NotImplementedError = getProcAddr(lib, "PyExc_NotImplementedError")
-  PyExc_OSError = getProcAddr(lib, "PyExc_OSError")
-  PyExc_TabError = getProcAddr(lib, "PyExc_TabError")
-  PyExc_UnboundLocalError = getProcAddr(lib, "PyExc_UnboundLocalError")
-  PyExc_UnicodeError = getProcAddr(lib, "PyExc_UnicodeError")
-  PyExc_Warning = getProcAddr(lib, "PyExc_Warning")
-  PyExc_DeprecationWarning = getProcAddr(lib, "PyExc_DeprecationWarning")
-  PyExc_RuntimeWarning = getProcAddr(lib, "PyExc_RuntimeWarning")
-  PyExc_SyntaxWarning = getProcAddr(lib, "PyExc_SyntaxWarning")
-  PyExc_UserWarning = getProcAddr(lib, "PyExc_UserWarning")
-  PyExc_OverflowWarning = getProcAddr(lib, "PyExc_OverflowWarning")
-  PyExc_ReferenceError = getProcAddr(lib, "PyExc_ReferenceError")
-  PyExc_StopIteration = getProcAddr(lib, "PyExc_StopIteration")
-  PyExc_FutureWarning = getProcAddr(lib, "PyExc_FutureWarning")
-  PyExc_PendingDeprecationWarning = getProcAddr(lib, 
-      "PyExc_PendingDeprecationWarning")
-  PyExc_UnicodeDecodeError = getProcAddr(lib, "PyExc_UnicodeDecodeError")
-  PyExc_UnicodeEncodeError = getProcAddr(lib, "PyExc_UnicodeEncodeError")
-  PyExc_UnicodeTranslateError = getProcAddr(lib, "PyExc_UnicodeTranslateError")
-  PyType_Type = getProcAddr(lib, "PyType_Type")
-  PyCFunction_Type = getProcAddr(lib, "PyCFunction_Type")
-  PyCObject_Type = getProcAddr(lib, "PyCObject_Type")
-  PyClass_Type = getProcAddr(lib, "PyClass_Type")
-  PyCode_Type = getProcAddr(lib, "PyCode_Type")
-  PyComplex_Type = getProcAddr(lib, "PyComplex_Type")
-  PyDict_Type = getProcAddr(lib, "PyDict_Type")
-  PyFile_Type = getProcAddr(lib, "PyFile_Type")
-  PyFloat_Type = getProcAddr(lib, "PyFloat_Type")
-  PyFrame_Type = getProcAddr(lib, "PyFrame_Type")
-  PyFunction_Type = getProcAddr(lib, "PyFunction_Type")
-  PyInstance_Type = getProcAddr(lib, "PyInstance_Type")
-  PyInt_Type = getProcAddr(lib, "PyInt_Type")
-  PyList_Type = getProcAddr(lib, "PyList_Type")
-  PyLong_Type = getProcAddr(lib, "PyLong_Type")
-  PyMethod_Type = getProcAddr(lib, "PyMethod_Type")
-  PyModule_Type = getProcAddr(lib, "PyModule_Type")
-  PyObject_Type = getProcAddr(lib, "PyObject_Type")
-  PyRange_Type = getProcAddr(lib, "PyRange_Type")
-  PySlice_Type = getProcAddr(lib, "PySlice_Type")
-  PyString_Type = getProcAddr(lib, "PyString_Type")
-  PyTuple_Type = getProcAddr(lib, "PyTuple_Type")
-  PyUnicode_Type = getProcAddr(lib, "PyUnicode_Type")
-  PyBaseObject_Type = getProcAddr(lib, "PyBaseObject_Type")
-  PyBuffer_Type = getProcAddr(lib, "PyBuffer_Type")
-  PyCallIter_Type = getProcAddr(lib, "PyCallIter_Type")
-  PyCell_Type = getProcAddr(lib, "PyCell_Type")
-  PyClassMethod_Type = getProcAddr(lib, "PyClassMethod_Type")
-  PyProperty_Type = getProcAddr(lib, "PyProperty_Type")
-  PySeqIter_Type = getProcAddr(lib, "PySeqIter_Type")
-  PyStaticMethod_Type = getProcAddr(lib, "PyStaticMethod_Type")
-  PySuper_Type = getProcAddr(lib, "PySuper_Type")
-  PySymtableEntry_Type = getProcAddr(lib, "PySymtableEntry_Type")
-  PyTraceBack_Type = getProcAddr(lib, "PyTraceBack_Type")
-  PyWrapperDescr_Type = getProcAddr(lib, "PyWrapperDescr_Type")
-  PyBaseString_Type = getProcAddr(lib, "PyBaseString_Type")
-  PyBool_Type = getProcAddr(lib, "PyBool_Type")
-  PyEnum_Type = getProcAddr(lib, "PyEnum_Type") #PyArg_GetObject           := getProcAddr(lib, 'PyArg_GetObject');
-                                                #PyArg_GetLong             := getProcAddr(lib, 'PyArg_GetLong');
-                                                #PyArg_GetShort            := getProcAddr(lib, 'PyArg_GetShort');
-                                                #PyArg_GetFloat            := getProcAddr(lib, 'PyArg_GetFloat');
-                                                #PyArg_GetString           := getProcAddr(lib, 'PyArg_GetString');
-                                                #PyArgs_VaParse            := getProcAddr(lib, 'PyArgs_VaParse');
-                                                #Py_VaBuildValue           := getProcAddr(lib, 'Py_VaBuildValue');
-                                                #PyBuiltin_Init            := getProcAddr(lib, 'PyBuiltin_Init');
-  PyComplex_FromCComplex = getProcAddr(lib, "PyComplex_FromCComplex")
-  PyComplex_FromDoubles = getProcAddr(lib, "PyComplex_FromDoubles")
-  PyComplex_RealAsDouble = getProcAddr(lib, "PyComplex_RealAsDouble")
-  PyComplex_ImagAsDouble = getProcAddr(lib, "PyComplex_ImagAsDouble")
-  PyComplex_AsCComplex = getProcAddr(lib, "PyComplex_AsCComplex")
-  PyCFunction_GetFunction = getProcAddr(lib, "PyCFunction_GetFunction")
-  PyCFunction_GetSelf = getProcAddr(lib, "PyCFunction_GetSelf")
-  PyCallable_Check = getProcAddr(lib, "PyCallable_Check")
-  PyCObject_FromVoidPtr = getProcAddr(lib, "PyCObject_FromVoidPtr")
-  PyCObject_AsVoidPtr = getProcAddr(lib, "PyCObject_AsVoidPtr")
-  PyClass_New = getProcAddr(lib, "PyClass_New")
-  PyClass_IsSubclass = getProcAddr(lib, "PyClass_IsSubclass")
-  PyDict_GetItem = getProcAddr(lib, "PyDict_GetItem")
-  PyDict_SetItem = getProcAddr(lib, "PyDict_SetItem")
-  PyDict_DelItem = getProcAddr(lib, "PyDict_DelItem")
-  PyDict_Clear = getProcAddr(lib, "PyDict_Clear")
-  PyDict_Next = getProcAddr(lib, "PyDict_Next")
-  PyDict_Keys = getProcAddr(lib, "PyDict_Keys")
-  PyDict_Values = getProcAddr(lib, "PyDict_Values")
-  PyDict_Items = getProcAddr(lib, "PyDict_Items")
-  PyDict_Size = getProcAddr(lib, "PyDict_Size")
-  PyDict_DelItemString = getProcAddr(lib, "PyDict_DelItemString")
-  PyDictProxy_New = getProcAddr(lib, "PyDictProxy_New")
-  Py_InitModule4 = getProcAddr(lib, "Py_InitModule4")
-  PyErr_Print = getProcAddr(lib, "PyErr_Print")
-  PyErr_SetNone = getProcAddr(lib, "PyErr_SetNone")
-  PyErr_SetObject = getProcAddr(lib, "PyErr_SetObject")
-  PyErr_Restore = getProcAddr(lib, "PyErr_Restore")
-  PyErr_BadArgument = getProcAddr(lib, "PyErr_BadArgument")
-  PyErr_NoMemory = getProcAddr(lib, "PyErr_NoMemory")
-  PyErr_SetFromErrno = getProcAddr(lib, "PyErr_SetFromErrno")
-  PyErr_BadInternalCall = getProcAddr(lib, "PyErr_BadInternalCall")
-  PyErr_CheckSignals = getProcAddr(lib, "PyErr_CheckSignals")
-  PyErr_Occurred = getProcAddr(lib, "PyErr_Occurred")
-  PyErr_Clear = getProcAddr(lib, "PyErr_Clear")
-  PyErr_Fetch = getProcAddr(lib, "PyErr_Fetch")
-  PyErr_SetString = getProcAddr(lib, "PyErr_SetString")
-  PyEval_GetBuiltins = getProcAddr(lib, "PyEval_GetBuiltins")
-  PyImport_GetModuleDict = getProcAddr(lib, "PyImport_GetModuleDict")
-  PyInt_FromLong = getProcAddr(lib, "PyInt_FromLong")
-  PyArg_ParseTuple = getProcAddr(lib, "PyArg_ParseTuple")
-  PyArg_Parse = getProcAddr(lib, "PyArg_Parse")
-  Py_BuildValue = getProcAddr(lib, "Py_BuildValue")
-  Py_Initialize = getProcAddr(lib, "Py_Initialize")
-  PyDict_New = getProcAddr(lib, "PyDict_New")
-  PyDict_SetItemString = getProcAddr(lib, "PyDict_SetItemString")
-  PyModule_GetDict = getProcAddr(lib, "PyModule_GetDict")
-  PyObject_Str = getProcAddr(lib, "PyObject_Str")
-  PyRun_String = getProcAddr(lib, "PyRun_String")
-  PyRun_SimpleString = getProcAddr(lib, "PyRun_SimpleString")
-  PyDict_GetItemString = getProcAddr(lib, "PyDict_GetItemString")
-  PyString_AsString = getProcAddr(lib, "PyString_AsString")
-  PyString_FromString = getProcAddr(lib, "PyString_FromString")
-  PySys_SetArgv = getProcAddr(lib, "PySys_SetArgv")
-  Py_Exit = getProcAddr(lib, "Py_Exit")
-  PyCFunction_New = getProcAddr(lib, "PyCFunction_New")
-  PyEval_CallObject = getProcAddr(lib, "PyEval_CallObject")
-  PyEval_CallObjectWithKeywords = getProcAddr(lib, 
-      "PyEval_CallObjectWithKeywords")
-  PyEval_GetFrame = getProcAddr(lib, "PyEval_GetFrame")
-  PyEval_GetGlobals = getProcAddr(lib, "PyEval_GetGlobals")
-  PyEval_GetLocals = getProcAddr(lib, "PyEval_GetLocals") #PyEval_GetOwner           :=getProcAddr(lib, 'PyEval_GetOwner');
-  PyEval_GetRestricted = getProcAddr(lib, "PyEval_GetRestricted")
-  PyEval_InitThreads = getProcAddr(lib, "PyEval_InitThreads")
-  PyEval_RestoreThread = getProcAddr(lib, "PyEval_RestoreThread")
-  PyEval_SaveThread = getProcAddr(lib, "PyEval_SaveThread")
-  PyFile_FromString = getProcAddr(lib, "PyFile_FromString")
-  PyFile_GetLine = getProcAddr(lib, "PyFile_GetLine")
-  PyFile_Name = getProcAddr(lib, "PyFile_Name")
-  PyFile_SetBufSize = getProcAddr(lib, "PyFile_SetBufSize")
-  PyFile_SoftSpace = getProcAddr(lib, "PyFile_SoftSpace")
-  PyFile_WriteObject = getProcAddr(lib, "PyFile_WriteObject")
-  PyFile_WriteString = getProcAddr(lib, "PyFile_WriteString")
-  PyFloat_AsDouble = getProcAddr(lib, "PyFloat_AsDouble")
-  PyFloat_FromDouble = getProcAddr(lib, "PyFloat_FromDouble")
-  PyFunction_GetCode = getProcAddr(lib, "PyFunction_GetCode")
-  PyFunction_GetGlobals = getProcAddr(lib, "PyFunction_GetGlobals")
-  PyFunction_New = getProcAddr(lib, "PyFunction_New")
-  PyImport_AddModule = getProcAddr(lib, "PyImport_AddModule")
-  PyImport_Cleanup = getProcAddr(lib, "PyImport_Cleanup")
-  PyImport_GetMagicNumber = getProcAddr(lib, "PyImport_GetMagicNumber")
-  PyImport_ImportFrozenModule = getProcAddr(lib, "PyImport_ImportFrozenModule")
-  PyImport_ImportModule = getProcAddr(lib, "PyImport_ImportModule")
-  PyImport_Import = getProcAddr(lib, "PyImport_Import") #@PyImport_Init             :=getProcAddr(lib, 'PyImport_Init');
-  PyImport_ReloadModule = getProcAddr(lib, "PyImport_ReloadModule")
-  PyInstance_New = getProcAddr(lib, "PyInstance_New")
-  PyInt_AsLong = getProcAddr(lib, "PyInt_AsLong")
-  PyList_Append = getProcAddr(lib, "PyList_Append")
-  PyList_AsTuple = getProcAddr(lib, "PyList_AsTuple")
-  PyList_GetItem = getProcAddr(lib, "PyList_GetItem")
-  PyList_GetSlice = getProcAddr(lib, "PyList_GetSlice")
-  PyList_Insert = getProcAddr(lib, "PyList_Insert")
-  PyList_New = getProcAddr(lib, "PyList_New")
-  PyList_Reverse = getProcAddr(lib, "PyList_Reverse")
-  PyList_SetItem = getProcAddr(lib, "PyList_SetItem")
-  PyList_SetSlice = getProcAddr(lib, "PyList_SetSlice")
-  PyList_Size = getProcAddr(lib, "PyList_Size")
-  PyList_Sort = getProcAddr(lib, "PyList_Sort")
-  PyLong_AsDouble = getProcAddr(lib, "PyLong_AsDouble")
-  PyLong_AsLong = getProcAddr(lib, "PyLong_AsLong")
-  PyLong_FromDouble = getProcAddr(lib, "PyLong_FromDouble")
-  PyLong_FromLong = getProcAddr(lib, "PyLong_FromLong")
-  PyLong_FromString = getProcAddr(lib, "PyLong_FromString")
-  PyLong_FromString = getProcAddr(lib, "PyLong_FromString")
-  PyLong_FromUnsignedLong = getProcAddr(lib, "PyLong_FromUnsignedLong")
-  PyLong_AsUnsignedLong = getProcAddr(lib, "PyLong_AsUnsignedLong")
-  PyLong_FromUnicode = getProcAddr(lib, "PyLong_FromUnicode")
-  PyLong_FromLongLong = getProcAddr(lib, "PyLong_FromLongLong")
-  PyLong_AsLongLong = getProcAddr(lib, "PyLong_AsLongLong")
-  PyMapping_Check = getProcAddr(lib, "PyMapping_Check")
-  PyMapping_GetItemString = getProcAddr(lib, "PyMapping_GetItemString")
-  PyMapping_HasKey = getProcAddr(lib, "PyMapping_HasKey")
-  PyMapping_HasKeyString = getProcAddr(lib, "PyMapping_HasKeyString")
-  PyMapping_Length = getProcAddr(lib, "PyMapping_Length")
-  PyMapping_SetItemString = getProcAddr(lib, "PyMapping_SetItemString")
-  PyMethod_Class = getProcAddr(lib, "PyMethod_Class")
-  PyMethod_Function = getProcAddr(lib, "PyMethod_Function")
-  PyMethod_New = getProcAddr(lib, "PyMethod_New")
-  PyMethod_Self = getProcAddr(lib, "PyMethod_Self")
-  PyModule_GetName = getProcAddr(lib, "PyModule_GetName")
-  PyModule_New = getProcAddr(lib, "PyModule_New")
-  PyNumber_Absolute = getProcAddr(lib, "PyNumber_Absolute")
-  PyNumber_Add = getProcAddr(lib, "PyNumber_Add")
-  PyNumber_And = getProcAddr(lib, "PyNumber_And")
-  PyNumber_Check = getProcAddr(lib, "PyNumber_Check")
-  PyNumber_Coerce = getProcAddr(lib, "PyNumber_Coerce")
-  PyNumber_Divide = getProcAddr(lib, "PyNumber_Divide")
-  PyNumber_FloorDivide = getProcAddr(lib, "PyNumber_FloorDivide")
-  PyNumber_TrueDivide = getProcAddr(lib, "PyNumber_TrueDivide")
-  PyNumber_Divmod = getProcAddr(lib, "PyNumber_Divmod")
-  PyNumber_Float = getProcAddr(lib, "PyNumber_Float")
-  PyNumber_Int = getProcAddr(lib, "PyNumber_Int")
-  PyNumber_Invert = getProcAddr(lib, "PyNumber_Invert")
-  PyNumber_Long = getProcAddr(lib, "PyNumber_Long")
-  PyNumber_Lshift = getProcAddr(lib, "PyNumber_Lshift")
-  PyNumber_Multiply = getProcAddr(lib, "PyNumber_Multiply")
-  PyNumber_Negative = getProcAddr(lib, "PyNumber_Negative")
-  PyNumber_Or = getProcAddr(lib, "PyNumber_Or")
-  PyNumber_Positive = getProcAddr(lib, "PyNumber_Positive")
-  PyNumber_Power = getProcAddr(lib, "PyNumber_Power")
-  PyNumber_Remainder = getProcAddr(lib, "PyNumber_Remainder")
-  PyNumber_Rshift = getProcAddr(lib, "PyNumber_Rshift")
-  PyNumber_Subtract = getProcAddr(lib, "PyNumber_Subtract")
-  PyNumber_Xor = getProcAddr(lib, "PyNumber_Xor")
-  PyOS_InitInterrupts = getProcAddr(lib, "PyOS_InitInterrupts")
-  PyOS_InterruptOccurred = getProcAddr(lib, "PyOS_InterruptOccurred")
-  PyObject_CallObject = getProcAddr(lib, "PyObject_CallObject")
-  PyObject_Compare = getProcAddr(lib, "PyObject_Compare")
-  PyObject_GetAttr = getProcAddr(lib, "PyObject_GetAttr")
-  PyObject_GetAttrString = getProcAddr(lib, "PyObject_GetAttrString")
-  PyObject_GetItem = getProcAddr(lib, "PyObject_GetItem")
-  PyObject_DelItem = getProcAddr(lib, "PyObject_DelItem")
-  PyObject_HasAttrString = getProcAddr(lib, "PyObject_HasAttrString")
-  PyObject_Hash = getProcAddr(lib, "PyObject_Hash")
-  PyObject_IsTrue = getProcAddr(lib, "PyObject_IsTrue")
-  PyObject_Length = getProcAddr(lib, "PyObject_Length")
-  PyObject_Repr = getProcAddr(lib, "PyObject_Repr")
-  PyObject_SetAttr = getProcAddr(lib, "PyObject_SetAttr")
-  PyObject_SetAttrString = getProcAddr(lib, "PyObject_SetAttrString")
-  PyObject_SetItem = getProcAddr(lib, "PyObject_SetItem")
-  PyObject_Init = getProcAddr(lib, "PyObject_Init")
-  PyObject_InitVar = getProcAddr(lib, "PyObject_InitVar")
-  PyObject_New = getProcAddr(lib, "_PyObject_New")
-  PyObject_NewVar = getProcAddr(lib, "_PyObject_NewVar")
-  PyObject_Free = getProcAddr(lib, "PyObject_Free")
-  PyObject_IsInstance = getProcAddr(lib, "PyObject_IsInstance")
-  PyObject_IsSubclass = getProcAddr(lib, "PyObject_IsSubclass")
-  PyObject_GenericGetAttr = getProcAddr(lib, "PyObject_GenericGetAttr")
-  PyObject_GenericSetAttr = getProcAddr(lib, "PyObject_GenericSetAttr")
-  PyObject_GC_Malloc = getProcAddr(lib, "_PyObject_GC_Malloc")
-  PyObject_GC_New = getProcAddr(lib, "_PyObject_GC_New")
-  PyObject_GC_NewVar = getProcAddr(lib, "_PyObject_GC_NewVar")
-  PyObject_GC_Resize = getProcAddr(lib, "_PyObject_GC_Resize")
-  PyObject_GC_Del = getProcAddr(lib, "PyObject_GC_Del")
-  PyObject_GC_Track = getProcAddr(lib, "PyObject_GC_Track")
-  PyObject_GC_UnTrack = getProcAddr(lib, "PyObject_GC_UnTrack")
-  PyRange_New = getProcAddr(lib, "PyRange_New")
-  PySequence_Check = getProcAddr(lib, "PySequence_Check")
-  PySequence_Concat = getProcAddr(lib, "PySequence_Concat")
-  PySequence_Count = getProcAddr(lib, "PySequence_Count")
-  PySequence_GetItem = getProcAddr(lib, "PySequence_GetItem")
-  PySequence_GetSlice = getProcAddr(lib, "PySequence_GetSlice")
-  PySequence_In = getProcAddr(lib, "PySequence_In")
-  PySequence_Index = getProcAddr(lib, "PySequence_Index")
-  PySequence_Length = getProcAddr(lib, "PySequence_Length")
-  PySequence_Repeat = getProcAddr(lib, "PySequence_Repeat")
-  PySequence_SetItem = getProcAddr(lib, "PySequence_SetItem")
-  PySequence_SetSlice = getProcAddr(lib, "PySequence_SetSlice")
-  PySequence_DelSlice = getProcAddr(lib, "PySequence_DelSlice")
-  PySequence_Tuple = getProcAddr(lib, "PySequence_Tuple")
-  PySequence_Contains = getProcAddr(lib, "PySequence_Contains")
-  PySlice_GetIndices = getProcAddr(lib, "PySlice_GetIndices")
-  PySlice_GetIndicesEx = getProcAddr(lib, "PySlice_GetIndicesEx")
-  PySlice_New = getProcAddr(lib, "PySlice_New")
-  PyString_Concat = getProcAddr(lib, "PyString_Concat")
-  PyString_ConcatAndDel = getProcAddr(lib, "PyString_ConcatAndDel")
-  PyString_Format = getProcAddr(lib, "PyString_Format")
-  PyString_FromStringAndSize = getProcAddr(lib, "PyString_FromStringAndSize")
-  PyString_Size = getProcAddr(lib, "PyString_Size")
-  PyString_DecodeEscape = getProcAddr(lib, "PyString_DecodeEscape")
-  PyString_Repr = getProcAddr(lib, "PyString_Repr")
-  PySys_GetObject = getProcAddr(lib, "PySys_GetObject") #PySys_Init                :=getProcAddr(lib, 'PySys_Init');
-  PySys_SetObject = getProcAddr(lib, "PySys_SetObject")
-  PySys_SetPath = getProcAddr(lib, "PySys_SetPath") #PyTraceBack_Fetch         :=getProcAddr(lib, 'PyTraceBack_Fetch');
-  PyTraceBack_Here = getProcAddr(lib, "PyTraceBack_Here")
-  PyTraceBack_Print = getProcAddr(lib, "PyTraceBack_Print") #PyTraceBack_Store         :=getProcAddr(lib, 'PyTraceBack_Store');
-  PyTuple_GetItem = getProcAddr(lib, "PyTuple_GetItem")
-  PyTuple_GetSlice = getProcAddr(lib, "PyTuple_GetSlice")
-  PyTuple_New = getProcAddr(lib, "PyTuple_New")
-  PyTuple_SetItem = getProcAddr(lib, "PyTuple_SetItem")
-  PyTuple_Size = getProcAddr(lib, "PyTuple_Size")
-  PyType_IsSubtype = getProcAddr(lib, "PyType_IsSubtype")
-  PyType_GenericAlloc = getProcAddr(lib, "PyType_GenericAlloc")
-  PyType_GenericNew = getProcAddr(lib, "PyType_GenericNew")
-  PyType_Ready = getProcAddr(lib, "PyType_Ready")
-  PyUnicode_FromWideChar = getProcAddr(lib, "PyUnicodeUCS2_FromWideChar")
-  PyUnicode_AsWideChar = getProcAddr(lib, "PyUnicodeUCS2_AsWideChar")
-  PyUnicode_FromOrdinal = getProcAddr(lib, "PyUnicodeUCS2_FromOrdinal")
-  PyWeakref_GetObject = getProcAddr(lib, "PyWeakref_GetObject")
-  PyWeakref_NewProxy = getProcAddr(lib, "PyWeakref_NewProxy")
-  PyWeakref_NewRef = getProcAddr(lib, "PyWeakref_NewRef")
-  PyWrapper_New = getProcAddr(lib, "PyWrapper_New")
-  PyBool_FromLong = getProcAddr(lib, "PyBool_FromLong")
-  Py_AtExit = getProcAddr(lib, "Py_AtExit") #Py_Cleanup                :=getProcAddr(lib, 'Py_Cleanup');
-  Py_CompileString = getProcAddr(lib, "Py_CompileString")
-  Py_FatalError = getProcAddr(lib, "Py_FatalError")
-  Py_FindMethod = getProcAddr(lib, "Py_FindMethod")
-  Py_FindMethodInChain = getProcAddr(lib, "Py_FindMethodInChain")
-  Py_FlushLine = getProcAddr(lib, "Py_FlushLine")
-  Py_Finalize = getProcAddr(lib, "Py_Finalize")
-  PyCode_Addr2Line = getProcAddr(lib, "PyCode_Addr2Line")
-  PyClass_IsSubclass = getProcAddr(lib, "PyClass_IsSubclass")
-  PyErr_ExceptionMatches = getProcAddr(lib, "PyErr_ExceptionMatches")
-  PyErr_GivenExceptionMatches = getProcAddr(lib, "PyErr_GivenExceptionMatches")
-  PyEval_EvalCode = getProcAddr(lib, "PyEval_EvalCode")
-  Py_GetVersion = getProcAddr(lib, "Py_GetVersion")
-  Py_GetCopyright = getProcAddr(lib, "Py_GetCopyright")
-  Py_GetExecPrefix = getProcAddr(lib, "Py_GetExecPrefix")
-  Py_GetPath = getProcAddr(lib, "Py_GetPath")
-  Py_GetPrefix = getProcAddr(lib, "Py_GetPrefix")
-  Py_GetProgramName = getProcAddr(lib, "Py_GetProgramName")
-  PyParser_SimpleParseString = getProcAddr(lib, "PyParser_SimpleParseString")
-  PyNode_Free = getProcAddr(lib, "PyNode_Free")
-  PyErr_NewException = getProcAddr(lib, "PyErr_NewException") #/ jah 29-sep-2000 : updated for python 2.0
-                                                              #/                   replaced Py_Malloc with PyMem_Malloc
-                                                              #/---   @Py_Malloc := Import ('Py_Malloc');
-                                                              #/+++   @Py_Malloc := Import ('PyMem_Malloc');
-  Py_Malloc = getProcAddr(lib, "PyMem_Malloc")
-  PyMem_Malloc = getProcAddr(lib, "PyMem_Malloc")
-  PyObject_CallMethod = getProcAddr(lib, "PyObject_CallMethod")
-  Py_SetProgramName = getProcAddr(lib, "Py_SetProgramName")
-  Py_IsInitialized = getProcAddr(lib, "Py_IsInitialized")
-  Py_GetProgramFullPath = getProcAddr(lib, "Py_GetProgramFullPath")
-  DLL_Py_GetBuildInfo = getProcAddr(lib, "Py_GetBuildInfo")
-  Py_NewInterpreter = getProcAddr(lib, "Py_NewInterpreter")
-  Py_EndInterpreter = getProcAddr(lib, "Py_EndInterpreter")
-  PyEval_AcquireLock = getProcAddr(lib, "PyEval_AcquireLock")
-  PyEval_ReleaseLock = getProcAddr(lib, "PyEval_ReleaseLock")
-  PyEval_AcquireThread = getProcAddr(lib, "PyEval_AcquireThread")
-  PyEval_ReleaseThread = getProcAddr(lib, "PyEval_ReleaseThread")
-  PyInterpreterState_New = getProcAddr(lib, "PyInterpreterState_New")
-  PyInterpreterState_Clear = getProcAddr(lib, "PyInterpreterState_Clear")
-  PyInterpreterState_Delete = getProcAddr(lib, "PyInterpreterState_Delete")
-  PyThreadState_New = getProcAddr(lib, "PyThreadState_New")
-  PyThreadState_Clear = getProcAddr(lib, "PyThreadState_Clear")
-  PyThreadState_Delete = getProcAddr(lib, "PyThreadState_Delete")
-  PyThreadState_Get = getProcAddr(lib, "PyThreadState_Get")
-  PyThreadState_Swap = getProcAddr(lib, "PyThreadState_Swap")
-
-var lib: TLibHandle
-
-lib = loadLibrary(dllName)
-if lib != NilLibHandle: init(lib)
diff --git a/lib/base/devel/python.pas b/lib/base/devel/python.pas
deleted file mode 100644
index 587ec6dc9..000000000
--- a/lib/base/devel/python.pas
+++ /dev/null
@@ -1,2205 +0,0 @@
-{

-    Light-weight binding for the Python interpreter

-       (c) 2008 Andreas Rumpf 

-    Based on 'PythonEngine' module by Dr. Dietmar Budelsky

-

-}

-

-(**************************************************************************)

-(*                                                                        *)

-(* Module:  Unit 'PythonEngine'     Copyright (c) 1997                    *)

-(*                                                                        *)

-(* Version: 3.0                     Dr. Dietmar Budelsky                  *)

-(* Sub-Version: 0.25                dbudelsky@web.de                      *)

-(*                                  Germany                               *)

-(*                                                                        *)

-(*                                  Morgan Martinet                       *)

-(*                                  4721 rue Brebeuf                      *)

-(*                                  H2J 3L2 MONTREAL (QC)                 *)

-(*                                  CANADA                                *)

-(*                                  e-mail: mmm@free.fr                   *)

-(*                                                                        *)

-(*  look our page at: http://www.multimania.com/marat                     *)

-(**************************************************************************)

-(*  Functionality:  Delphi Components that provide an interface to the    *)

-(*                  Python language (see python.txt for more infos on     *)

-(*                  Python itself).                                       *)

-(*                                                                        *)

-(**************************************************************************)

-(*  Contributors:                                                         *)

-(*      Grzegorz Makarewicz (mak@mikroplan.com.pl)                        *)

-(*      Andrew Robinson (andy@hps1.demon.co.uk)                           *)

-(*      Mark Watts(mark_watts@hotmail.com)                                *)

-(*      Olivier Deckmyn (olivier.deckmyn@mail.dotcom.fr)                  *)

-(*      Sigve Tjora (public@tjora.no)                                     *)

-(*      Mark Derricutt (mark@talios.com)                                  *)

-(*      Igor E. Poteryaev (jah@mail.ru)                                   *)

-(*      Yuri Filimonov (fil65@mail.ru)                                    *)

-(*      Stefan Hoffmeister (Stefan.Hoffmeister@Econos.de)                 *)

-(**************************************************************************)

-(* This source code is distributed with no WARRANTY, for no reason or use.*)

-(* Everyone is allowed to use and change this code free for his own tasks *)

-(* and projects, as long as this header and its copyright text is intact. *)

-(* For changed versions of this code, which are public distributed the    *)

-(* following additional conditions have to be fullfilled:                 *)

-(* 1) The header has to contain a comment on the change and the author of *)

-(*    it.                                                                 *)

-(* 2) A copy of the changed source has to be sent to the above E-Mail     *)

-(*    address or my then valid address, if this is possible to the        *)

-(*    author.                                                             *)

-(* The second condition has the target to maintain an up to date central  *)

-(* version of the component. If this condition is not acceptable for      *)

-(* confidential or legal reasons, everyone is free to derive a component  *)

-(* or to generate a diff file to my or other original sources.            *)

-(* Dr. Dietmar Budelsky, 1997-11-17                                       *)

-(**************************************************************************)

-unit python;

-

-interface

-

-uses

-  dyncalls;

-

-{$ifdef windows}

-const

-  DllName = 'python24.dll';

-{$else}

-const

-  DllName = 'libpython2.4.so'; // for UNIX systems

-{$endif}

-

-const

-  PYT_METHOD_BUFFER_INCREASE = 10;

-  PYT_MEMBER_BUFFER_INCREASE = 10;

-  PYT_GETSET_BUFFER_INCREASE = 10;

-

-  METH_VARARGS  = $0001;

-  METH_KEYWORDS = $0002;

-

-  // Masks for the co_flags field of PyCodeObject

-  CO_OPTIMIZED   = $0001;

-  CO_NEWLOCALS   = $0002;

-  CO_VARARGS     = $0004;

-  CO_VARKEYWORDS = $0008;

-

-type

-  // Rich comparison opcodes introduced in version 2.1

-  TRichComparisonOpcode = (pyLT, pyLE, pyEQ, pyNE, pyGT, pyGE);

-const

-{Type flags (tp_flags) introduced in version 2.0

-

-These flags are used to extend the type structure in a backwards-compatible

-fashion. Extensions can use the flags to indicate (and test) when a given

-type structure contains a new feature. The Python core will use these when

-introducing new functionality between major revisions (to avoid mid-version

-changes in the PYTHON_API_VERSION).

-

-Arbitration of the flag bit positions will need to be coordinated among

-all extension writers who publically release their extensions (this will

-be fewer than you might expect!)..

-

-Python 1.5.2 introduced the bf_getcharbuffer slot into PyBufferProcs.

-

-Type definitions should use Py_TPFLAGS_DEFAULT for their tp_flags value.

-

-Code can use PyType_HasFeature(type_ob, flag_value) to test whether the

-given type object has a specified feature.

-}

-

-// PyBufferProcs contains bf_getcharbuffer

-  Py_TPFLAGS_HAVE_GETCHARBUFFER = (1 shl 0);

-

-// PySequenceMethods contains sq_contains

-  Py_TPFLAGS_HAVE_SEQUENCE_IN = (1 shl 1);

-

-// Objects which participate in garbage collection (see objimp.h)

-  Py_TPFLAGS_GC = (1 shl 2);

-

-// PySequenceMethods and PyNumberMethods contain in-place operators

-  Py_TPFLAGS_HAVE_INPLACEOPS = (1 shl 3);

-

-// PyNumberMethods do their own coercion */

-  Py_TPFLAGS_CHECKTYPES = (1 shl 4);

-

-  Py_TPFLAGS_HAVE_RICHCOMPARE = (1 shl 5);

-

-// Objects which are weakly referencable if their tp_weaklistoffset is >0

-// XXX Should this have the same value as Py_TPFLAGS_HAVE_RICHCOMPARE?

-// These both indicate a feature that appeared in the same alpha release.

-

-  Py_TPFLAGS_HAVE_WEAKREFS = (1 shl 6);

-

-// tp_iter is defined

-  Py_TPFLAGS_HAVE_ITER = (1 shl 7);

-

-// New members introduced by Python 2.2 exist

-  Py_TPFLAGS_HAVE_CLASS = (1 shl 8);

-

-// Set if the type object is dynamically allocated

-  Py_TPFLAGS_HEAPTYPE = (1 shl 9);

-

-// Set if the type allows subclassing

-  Py_TPFLAGS_BASETYPE = (1 shl 10);

-

-// Set if the type is 'ready' -- fully initialized

-  Py_TPFLAGS_READY = (1 shl 12);

-

-// Set while the type is being 'readied', to prevent recursive ready calls

-  Py_TPFLAGS_READYING = (1 shl 13);

-

-// Objects support garbage collection (see objimp.h)

-  Py_TPFLAGS_HAVE_GC = (1 shl 14);

-

-  Py_TPFLAGS_DEFAULT  =      Py_TPFLAGS_HAVE_GETCHARBUFFER

-                             or Py_TPFLAGS_HAVE_SEQUENCE_IN

-                             or Py_TPFLAGS_HAVE_INPLACEOPS

-                             or Py_TPFLAGS_HAVE_RICHCOMPARE

-                             or Py_TPFLAGS_HAVE_WEAKREFS

-                             or Py_TPFLAGS_HAVE_ITER

-                             or Py_TPFLAGS_HAVE_CLASS;

-

-// See function PyType_HasFeature below for testing the flags.

-

-// Delphi equivalent used by TPythonType

-type

-  TPFlag = (tpfHaveGetCharBuffer, tpfHaveSequenceIn, tpfGC, tpfHaveInplaceOps,

-            tpfCheckTypes, tpfHaveRichCompare, tpfHaveWeakRefs,

-            tpfHaveIter, tpfHaveClass, tpfHeapType, tpfBaseType, tpfReady, 

-            tpfReadying, tpfHaveGC

-           );

-  TPFlags = set of TPFlag;

-const

-  TPFLAGS_DEFAULT = [tpfHaveGetCharBuffer, tpfHaveSequenceIn, tpfHaveInplaceOps,

-                     tpfHaveRichCompare, tpfHaveWeakRefs, tpfHaveIter, 

-                     tpfHaveClass];

-//-------  Python opcodes  ----------//

-Const

-   single_input                 = 256;

-   file_input                   = 257;

-   eval_input                   = 258;

-   funcdef                      = 259;

-   parameters                   = 260;

-   varargslist                  = 261;

-   fpdef                        = 262;

-   fplist                       = 263;

-   stmt                         = 264;

-   simple_stmt                  = 265;

-   small_stmt                   = 266;

-   expr_stmt                    = 267;

-   augassign                    = 268;

-   print_stmt                   = 269;

-   del_stmt                     = 270;

-   pass_stmt                    = 271;

-   flow_stmt                    = 272;

-   break_stmt                   = 273;

-   continue_stmt                = 274;

-   return_stmt                  = 275;

-   raise_stmt                   = 276;

-   import_stmt                  = 277;

-   import_as_name               = 278;

-   dotted_as_name               = 279;

-   dotted_name                  = 280;

-   global_stmt                  = 281;

-   exec_stmt                    = 282;

-   assert_stmt                  = 283;

-   compound_stmt                = 284;

-   if_stmt                      = 285;

-   while_stmt                   = 286;

-   for_stmt                     = 287;

-   try_stmt                     = 288;

-   except_clause                = 289;

-   suite                        = 290;

-   test                         = 291;

-   and_test                     = 291;

-   not_test                     = 293;

-   comparison                   = 294;

-   comp_op                      = 295;

-   expr                         = 296;

-   xor_expr                     = 297;

-   and_expr                     = 298;

-   shift_expr                   = 299;

-   arith_expr                   = 300;

-   term                         = 301;

-   factor                       = 302;

-   power                        = 303;

-   atom                         = 304;

-   listmaker                    = 305;

-   lambdef                      = 306;

-   trailer                      = 307;

-   subscriptlist                = 308;

-   subscript                    = 309;

-   sliceop                      = 310;

-   exprlist                     = 311;

-   testlist                     = 312;

-   dictmaker                    = 313;

-   classdef                     = 314;

-   arglist                      = 315;

-   argument                     = 316;

-   list_iter                    = 317;

-   list_for                     = 318;

-   list_if                      = 319;

-

-const

-  T_SHORT                       = 0;

-  T_INT                         = 1;

-  T_LONG                        = 2;

-  T_FLOAT                       = 3;

-  T_DOUBLE                      = 4;

-  T_STRING                      = 5;

-  T_OBJECT                      = 6;

-  T_CHAR                        = 7;	// 1-character string

-  T_BYTE                        = 8;	// 8-bit signed int

-  T_UBYTE                       = 9;

-  T_USHORT                      = 10;

-  T_UINT                        = 11;

-  T_ULONG                       = 12;

-

-// Added by Jack: strings contained in the structure

-  T_STRING_INPLACE= 13;

-

-  T_OBJECT_EX                   = 16;{ Like T_OBJECT, but raises AttributeError

-                                        when the value is NULL, instead of

-                                        converting to None. }

-

-// Flags

-  READONLY                      = 1;

-  RO                            = READONLY;		// Shorthand 

-  READ_RESTRICTED               = 2;

-  WRITE_RESTRICTED              = 4;

-  RESTRICTED                    = (READ_RESTRICTED or WRITE_RESTRICTED);

-type

-  TPyMemberType = (mtShort, mtInt, mtLong, mtFloat, mtDouble, mtString, 

-                   mtObject, mtChar, mtByte, mtUByte, mtUShort, mtUInt, 

-                   mtULong, mtStringInplace, mtObjectEx);

-  TPyMemberFlag = (mfDefault, mfReadOnly, mfReadRestricted, mfWriteRestricted, mfRestricted);

-

-//#######################################################

-//##                                                   ##

-//##    Global declarations, nothing Python specific   ##

-//##                                                   ##

-//#######################################################

-

-type

-  TPChar  = array[0..16000] of PChar;

-  PPChar  = ^TPChar;

-  PInt	   = ^Integer;

-  PDouble = ^Double;

-  PFloat  = ^Real;

-  PLong   = ^LongInt;

-  PShort  = ^ShortInt;

-  PString = ^PChar;

-

-//#######################################################

-//##                                                   ##

-//##            Python specific interface              ##

-//##                                                   ##

-//#######################################################

-

-type

-  PP_frozen	    = ^Pfrozen;

-  P_frozen	    = ^Tfrozen;

-  PPyObject	    = ^PyObject;

-  PPPyObject	    = ^PPyObject;

-  PPPPyObject	    = ^PPPyObject;

-  PPyIntObject	    = ^PyIntObject;

-  PPyTypeObject     = ^PyTypeObject;

-  PPySliceObject    = ^PySliceObject;

-

-  TPyCFunction       = function (self, args: PPyObject): PPyObject; cdecl;

-

-  Tunaryfunc         = function (ob1: PPyObject): PPyObject; cdecl;

-  Tbinaryfunc        = function (ob1,ob2: PPyObject): PPyObject; cdecl;

-  Tternaryfunc       = function (ob1,ob2,ob3: PPyObject): PPyObject; cdecl;

-  Tinquiry           = function (ob1: PPyObject): integer; cdecl;

-  Tcoercion          = function (ob1,ob2: PPPyObject): integer; cdecl;

-  Tintargfunc        = function (ob1: PPyObject; i: integer): PPyObject; cdecl;

-  Tintintargfunc     = function (ob1: PPyObject; i1, i2: integer):

-                                PPyObject; cdecl;

-  Tintobjargproc     = function (ob1: PPyObject; i: integer; ob2: PPyObject):

-                                integer; cdecl;

-  Tintintobjargproc  = function (ob1: PPyObject; i1, i2: integer;

-                                ob2: PPyObject): integer; cdecl;

-  Tobjobjargproc     = function (ob1,ob2,ob3: PPyObject): integer; cdecl;

-

-  Tpydestructor      = procedure (ob: PPyObject); cdecl;

-  Tprintfunc         = function (ob: PPyObject; var f: file; i: integer): integer; cdecl;

-  Tgetattrfunc       = function (ob1: PPyObject; name: PChar): PPyObject; cdecl;

-  Tsetattrfunc       = function (ob1: PPyObject; name: PChar; ob2: PPyObject): integer; cdecl;

-  Tcmpfunc           = function (ob1, ob2: PPyObject): integer; cdecl;

-  Treprfunc          = function (ob: PPyObject): PPyObject; cdecl;

-  Thashfunc          = function (ob: PPyObject): LongInt; cdecl;

-  Tgetattrofunc      = function (ob1, ob2: PPyObject): PPyObject; cdecl;

-  Tsetattrofunc      = function (ob1, ob2, ob3: PPyObject): integer; cdecl;

-

-/// jah 29-sep-2000: updated for python 2.0

-///                   added from object.h

-  Tgetreadbufferproc = function (ob1: PPyObject; i: integer; ptr: Pointer): integer; cdecl;

-  Tgetwritebufferproc= function (ob1: PPyObject; i: integer; ptr: Pointer): integer; cdecl;

-  Tgetsegcountproc   = function (ob1: PPyObject; i: integer): integer; cdecl;

-  Tgetcharbufferproc = function (ob1: PPyObject; i: integer; const pstr: PChar): integer; cdecl;

-  Tobjobjproc        = function (ob1, ob2: PPyObject): integer; cdecl;

-  Tvisitproc         = function (ob1: PPyObject; ptr: Pointer): integer; cdecl;

-  Ttraverseproc      = function (ob1: PPyObject; proc: visitproc; ptr: Pointer): integer; cdecl;

-

-  Trichcmpfunc       = function (ob1, ob2: PPyObject; i: Integer): PPyObject; cdecl;

-  Tgetiterfunc       = function (ob1: PPyObject): PPyObject; cdecl;

-  Titernextfunc      = function (ob1: PPyObject): PPyObject; cdecl;

-  Tdescrgetfunc      = function (ob1, ob2, ob3: PPyObject): PPyObject; cdecl;

-  Tdescrsetfunc      = function (ob1, ob2, ob3: PPyObject): Integer; cdecl;

-  Tinitproc          = function (self, args, kwds: PPyObject): Integer; cdecl;

-  Tnewfunc           = function (subtype: PPyTypeObject; args, kwds: PPyObject): PPyObject; cdecl;

-  Tallocfunc         = function (self: PPyTypeObject; nitems: integer): PPyObject; cdecl;

-

-  TPyNumberMethods = record

-     nb_add: Tbinaryfunc;

-     nb_substract: Tbinaryfunc;

-     nb_multiply: Tbinaryfunc;

-     nb_divide: Tbinaryfunc;

-     nb_remainder: Tbinaryfunc;

-     nb_divmod: Tbinaryfunc;

-     nb_power: Tternaryfunc;

-     nb_negative: Tunaryfunc;

-     nb_positive: Tunaryfunc;

-     nb_absolute: Tunaryfunc;

-     nb_nonzero: Tinquiry;

-     nb_invert: Tunaryfunc;

-     nb_lshift: Tbinaryfunc;

-     nb_rshift: Tbinaryfunc;

-     nb_and: Tbinaryfunc;

-     nb_xor: Tbinaryfunc;

-     nb_or: Tbinaryfunc;

-     nb_coerce: Tcoercion;

-     nb_int: Tunaryfunc;

-     nb_long: Tunaryfunc;

-     nb_float: Tunaryfunc;

-     nb_oct: Tunaryfunc;

-     nb_hex: Tunaryfunc;

-/// jah 29-sep-2000: updated for python 2.0

-///                   added from .h

-     nb_inplace_add: Tbinaryfunc;

-     nb_inplace_subtract: Tbinaryfunc;

-     nb_inplace_multiply: Tbinaryfunc;

-     nb_inplace_divide: Tbinaryfunc;

-     nb_inplace_remainder: Tbinaryfunc;

-     nb_inplace_power: Tternaryfunc;

-     nb_inplace_lshift: Tbinaryfunc;

-     nb_inplace_rshift: Tbinaryfunc;

-     nb_inplace_and: Tbinaryfunc;

-     nb_inplace_xor: Tbinaryfunc;

-     nb_inplace_or: Tbinaryfunc;

-     // Added in release 2.2

-     // The following require the Py_TPFLAGS_HAVE_CLASS flag

-     nb_floor_divide:         Tbinaryfunc;

-     nb_true_divide:          Tbinaryfunc;

-     nb_inplace_floor_divide: Tbinaryfunc;

-     nb_inplace_true_divide:  Tbinaryfunc;

-  end;

-  PPyNumberMethods = ^TPyNumberMethods;

-

-  TPySequenceMethods = record

-     sq_length: Tinquiry;

-     sq_concat: Tbinaryfunc;

-     sq_repeat: Tintargfunc;

-     sq_item: Tintargfunc;

-     sq_slice: Tintintargfunc;

-     sq_ass_item: Tintobjargproc;

-     sq_ass_slice: Tintintobjargproc;

-/// jah 29-sep-2000: updated for python 2.0

-///                   added from .h

-     sq_contains: Tobjobjproc;

-     sq_inplace_concat: Tbinaryfunc;

-     sq_inplace_repeat: Tintargfunc;

-  end;

-  PPySequenceMethods = ^TPySequenceMethods;

-

-  TPyMappingMethods = record

-     mp_length	: Tinquiry;

-     mp_subscript: Tbinaryfunc;

-     mp_ass_subscript: Tobjobjargproc;

-  end;

-  PPyMappingMethods = ^PyMappingMethods;

-

-/// jah 29-sep-2000: updated for python 2.0

-///                   added from .h

-  TPyBufferProcs = record

-     bf_getreadbuffer: Tgetreadbufferproc;

-     bf_getwritebuffer: Tgetwritebufferproc;

-     bf_getsegcount: Tgetsegcountproc;

-     bf_getcharbuffer: Tgetcharbufferproc;

-  end;

-  PPyBufferProcs = ^TPyBufferProcs;

-

-  TPy_complex =  record

-     real: double;

-     imag: double;

-  end;

-

-  TPyObject = record

-    ob_refcnt: Integer;

-    ob_type:   PPyTypeObject;

-  end;

-

-  TPyIntObject = object(TPyObject)

-    ob_ival: LongInt;

-  end;

-

-  PByte = ^Byte;

-  Tfrozen = packed record

-     name: PChar;

-     code: PByte;

-     size: Integer;

-  end;

-

-  TPySliceObject = object(TPyObject)

-    start, stop, step:  PPyObject;

-  end;

-

-  PPyMethodDef = ^TPyMethodDef;

-  TPyMethodDef  = record

-     ml_name:  PChar;

-     ml_meth:  TPyCFunction;

-     ml_flags: Integer;

-     ml_doc:   PChar;

-  end;

-

-  // structmember.h

-  PPyMemberDef = ^TPyMemberDef;

-  TPyMemberDef = record

-    name: PChar;

-    theType: integer;

-    offset: integer;

-    flags: integer;

-    doc: PChar;

-  end;

-

-  // descrobject.h

-

-  // Descriptors

-

-  Tgetter = function (obj: PPyObject; context: Pointer): PPyObject; cdecl;

-  Tsetter = function (obj, value: PPyObject; context: Pointer): integer; cdecl;

-

-  PPyGetSetDef = ^TPyGetSetDef;

-  TPyGetSetDef = record

-    name: PChar;

-    get: Tgetter;

-    set_: Tsetter;

-    doc: PChar;

-    closure: Pointer;

-  end;

-

-  Twrapperfunc = function (self, args: PPyObject; wrapped: Pointer): PPyObject; cdecl;

-

-  pwrapperbase = ^Twrapperbase;

-  Twrapperbase = record

-    name: PChar;

-    wrapper: Twrapperfunc;

-    doc: PChar;

-  end;

-

-  // Various kinds of descriptor objects

-

-  {#define PyDescr_COMMON \

-          PyObject_HEAD \

-          PyTypeObject *d_type; \

-          PyObject *d_name

-  }

-

-  PPyDescrObject = ^TPyDescrObject;

-  TPyDescrObject = object(TPyObject)

-    d_type: PPyTypeObject;

-    d_name: PPyObject;

-  end;

-

-  PPyMethodDescrObject = ^TPyMethodDescrObject;

-  TPyMethodDescrObject = object(TPyDescrObject)

-    d_method: PPyMethodDef;

-  end;

-

-  PPyMemberDescrObject = ^TPyMemberDescrObject;

-  TPyMemberDescrObject = object(TPyDescrObject)

-    d_member: PPyMemberDef;

-  end;

-

-  PPyGetSetDescrObject = ^TPyGetSetDescrObject;

-  TPyGetSetDescrObject = object(TPyDescrObject)

-    d_getset: PPyGetSetDef;

-  end;

-

-  PPyWrapperDescrObject = ^TPyWrapperDescrObject;

-  TPyWrapperDescrObject = object(TPyDescrObject)

-    d_base: pwrapperbase;

-    d_wrapped: Pointer; // This can be any function pointer

-  end;

-

-  // object.h

-  TPyTypeObject = object(TPyObject)

-    ob_size:        Integer; // Number of items in variable part

-    tp_name:        PChar;   // For printing

-    tp_basicsize, tp_itemsize: Integer; // For allocation

-

-    // Methods to implement standard operations

-

-    tp_dealloc:     Tpydestructor;

-    tp_print:       Tprintfunc;

-    tp_getattr:     Tgetattrfunc;

-    tp_setattr:     Tsetattrfunc;

-    tp_compare:     Tcmpfunc;

-    tp_repr:        Treprfunc;

-

-    // Method suites for standard classes

-

-    tp_as_number:   PPyNumberMethods;

-    tp_as_sequence: PPySequenceMethods;

-    tp_as_mapping:  PPyMappingMethods;

-

-    // More standard operations (here for binary compatibility)

-

-    tp_hash:        Thashfunc;

-    tp_call:        Tternaryfunc;

-    tp_str:         Treprfunc;

-    tp_getattro:    Tgetattrofunc;

-    tp_setattro:    Tsetattrofunc;

-

-/// jah 29-sep-2000: updated for python 2.0

-

-    // Functions to access object as input/output buffer

-    tp_as_buffer:   PPyBufferProcs;

-    // Flags to define presence of optional/expanded features

-    tp_flags:       LongInt;

-

-    tp_doc:         PChar; // Documentation string

-

-    // call function for all accessible objects

-    tp_traverse:    Ttraverseproc;

-

-    // delete references to contained objects

-    tp_clear:       Tinquiry;

-    // rich comparisons

-    tp_richcompare: Trichcmpfunc;

-

-    // weak reference enabler

-    tp_weaklistoffset: Longint;

-    // Iterators

-    tp_iter: Tgetiterfunc;

-    tp_iternext: Titernextfunc;

-

-    // Attribute descriptor and subclassing stuff

-    tp_methods: PPyMethodDef;

-    tp_members: PPyMemberDef;

-    tp_getset: PPyGetSetDef;

-    tp_base: PPyTypeObject;

-    tp_dict: PPyObject;

-    tp_descr_get: Tdescrgetfunc;

-    tp_descr_set: Tdescrsetfunc;

-    tp_dictoffset: longint;

-    tp_init: Tinitproc;

-    tp_alloc: Tallocfunc;

-    tp_new: Tnewfunc;

-    tp_free: Tpydestructor; // Low-level free-memory routine

-    tp_is_gc: Tinquiry; // For PyObject_IS_GC

-    tp_bases: PPyObject;

-    tp_mro: PPyObject; // method resolution order

-    tp_cache: PPyObject;

-    tp_subclasses: PPyObject;

-    tp_weaklist: PPyObject;

-    //More spares

-    tp_xxx7:        pointer;

-    tp_xxx8:        pointer;

-  end;

-

-  PPyMethodChain = ^TPyMethodChain;

-  TPyMethodChain = record

-    methods: PPyMethodDef;

-    link:    PPyMethodChain;

-  end;

-

-  PPyClassObject = ^TPyClassObject;

-  TPyClassObject = object(TPyObject)

-    cl_bases: PPyObject;      // A tuple of class objects

-    cl_dict: PPyObject;       // A dictionary

-    cl_name: PPyObject;       // A string

-    // The following three are functions or NULL

-    cl_getattr: PPyObject;

-    cl_setattr: PPyObject;

-    cl_delattr: PPyObject;

-  end;

-

-  PPyInstanceObject = ^TPyInstanceObject;

-  TPyInstanceObject = object(TPyObject)

-    in_class: PPyClassObject;      // The class object

-    in_dict: PPyObject;           // A dictionary

-  end;

-

-{ Instance method objects are used for two purposes:

-   (a) as bound instance methods (returned by instancename.methodname)

-   (b) as unbound methods (returned by ClassName.methodname)

-   In case (b), im_self is NULL

-}

-

-  PPyMethodObject = ^TPyMethodObject;

-  TPyMethodObject = object(TPyObject)

-    im_func: PPyObject;      // The function implementing the method

-    im_self: PPyObject;      // The instance it is bound to, or NULL

-    im_class: PPyObject;      // The class that defined the method

-  end;

-

-  // Bytecode object, compile.h

-  PPyCodeObject = ^TPyCodeObject;

-  TPyCodeObject = object(TPyObject)

-    co_argcount: Integer;         // #arguments, except *args

-    co_nlocals: Integer;         // #local variables

-    co_stacksize: Integer;          // #entries needed for evaluation stack

-    co_flags: Integer;         // CO_..., see below

-    co_code: PPyObject;       // instruction opcodes (it hides a PyStringObject)

-    co_consts: PPyObject;       // list (constants used)

-    co_names: PPyObject;       // list of strings (names used)

-    co_varnames: PPyObject;       // tuple of strings (local variable names)

-    co_freevars: PPyObject;	      // tuple of strings (free variable names)

-    co_cellvars: PPyObject;       // tuple of strings (cell variable names)

-    // The rest doesn't count for hash/cmp

-    co_filename: PPyObject;       // string (where it was loaded from)

-    co_name: PPyObject;       // string (name, for reference)

-    co_firstlineno: Integer;         // first source line number

-    co_lnotab: PPyObject;       // string (encoding addr<->lineno mapping)

-  end;

-

-  // from pystate.h

-  PPyInterpreterState = ^TPyInterpreterState;

-  PPyThreadState = ^TPyThreadState;

-  PPyFrameObject = ^TPyFrameObject;

-

-  // Interpreter environments

-  TPyInterpreterState = record

-    next: PPyInterpreterState;

-    tstate_head: PPyThreadState;

-

-    modules: PPyObject;

-    sysdict: PPyObject;

-    builtins: PPyObject;

-

-    checkinterval: integer;

-  end;

-

-  // Thread specific information

-  TPyThreadState = record

-    next: PPyThreadState;

-    interp: PPyInterpreterState;

-

-    frame: PPyFrameObject;

-    recursion_depth: integer;

-    ticker: integer;

-    tracing: integer;

-

-    sys_profilefunc: PPyObject;

-    sys_tracefunc: PPyObject;

-

-    curexc_type: PPyObject;

-    curexc_value: PPyObject;

-    curexc_traceback: PPyObject;

-

-    exc_type: PPyObject;

-    exc_value: PPyObject;

-    exc_traceback: PPyObject;

-

-    dict: PPyObject;

-  end;

-

-  // from frameobject.h

-

-  PPyTryBlock = ^TPyTryBlock;

-  TPyTryBlock = record

-    b_type: Integer;       // what kind of block this is

-    b_handler: Integer;       // where to jump to find handler

-    b_level: Integer;       // value stack level to pop to

-  end;

-

-  CO_MAXBLOCKS  = 0..19;

-  TPyFrameObject = object(TPyObject)

-    // start of the VAR_HEAD of an object

-    ob_size: Integer;           // Number of items in variable part

-    // End of the Head of an object

-    f_back: PPyFrameObject;    // previous frame, or NULL

-    f_code: PPyCodeObject;     // code segment

-    f_builtins: PPyObject;         // builtin symbol table (PyDictObject)

-    f_globals: PPyObject;         // global symbol table (PyDictObject)

-    f_locals: PPyObject;         // local symbol table (PyDictObject)

-    f_valuestack: PPPyObject;        // points after the last local

-    (* Next free slot in f_valuestack.  Frame creation sets to f_valuestack.

-       Frame evaluation usually NULLs it, but a frame that yields sets it

-       to the current stack top. *)

-    f_stacktop: PPPyObject;

-    f_trace: PPyObject;         // Trace function

-    f_exc_type, f_exc_value, f_exc_traceback: PPyObject;

-    f_tstate: PPyThreadState;

-    f_lasti: Integer;           // Last instruction if called

-    f_lineno: Integer;           // Current line number

-    f_restricted: Integer;           // Flag set if restricted operations

-                                      // in this scope

-    f_iblock: Integer;           // index in f_blockstack

-    f_blockstack: array[CO_MAXBLOCKS] of PyTryBlock; // for try and loop blocks

-    f_nlocals: Integer;           // number of locals

-    f_ncells: Integer;

-    f_nfreevars: Integer;

-    f_stacksize: Integer;           // size of value stack

-    f_localsplus: array[0..0] of PPyObject; // locals+stack, dynamically sized

-  end;

-

-  // From traceback.c

-  PPyTraceBackObject = ^TPyTraceBackObject;

-  TPyTraceBackObject = object(TPyObject)

-    tb_next: PPyTraceBackObject;

-    tb_frame: PPyFrameObject;

-    tb_lasti: Integer;

-    tb_lineno: Integer;

-  end;

-

-  // Parse tree node interface

-

-  PNode = ^Tnode;

-  Tnode = record

-    n_type: smallint;

-    n_str: PChar;

-    n_lineno: smallint;

-    n_nchildren: smallint;

-    n_child: PNode;

-  end;

-

-  // From weakrefobject.h

-

-  PPyWeakReference = ^TPyWeakReference;

-  TPyWeakReference = object(TPyObject)

-    wr_object: PPyObject;

-    wr_callback: PPyObject;

-    hash: longint;

-    wr_prev: PPyWeakReference;

-    wr_next: PPyWeakReference;

-  end;

-

-  // from datetime.h

-

-

-{* Fields are packed into successive bytes, each viewed as unsigned and

- * big-endian, unless otherwise noted:

- *

- * byte offset

- *  0 		year     2 bytes, 1-9999

- *  2	  	month    1 byte,  1-12

- *  3 		day      1 byte,  1-31

- *  4     hour     1 byte,  0-23

- *  5 		minute   1 byte,  0-59

- *  6 		second   1 byte,  0-59

- *  7 		usecond  3 bytes, 0-999999

- * 10

- *}

-

-const

-  { # of bytes for year, month, and day. }

-  PyDateTime_DATE_DATASIZE = 4;

-

-  { # of bytes for hour, minute, second, and usecond. }

-  PyDateTime_TIME_DATASIZE = 6;

-

-  { # of bytes for year, month, day, hour, minute, second, and usecond. }

-  PyDateTime_DATETIME_DATASIZE = 10;

-type

-  TPyDateTime_Delta = object(TPyObject)

-    hashcode: Integer;  // -1 when unknown

-    days: Integer;  // -MAX_DELTA_DAYS <= days <= MAX_DELTA_DAYS

-    seconds: Integer;  // 0 <= seconds < 24*3600 is invariant

-    microseconds: Integer;  // 0 <= microseconds < 1000000 is invariant

-  end;

-  PPyDateTime_Delta = ^TPyDateTime_Delta;

-

-  TPyDateTime_TZInfo = object(TPyObject) // a pure abstract base clase

-  end;

-  PPyDateTime_TZInfo = ^TPyDateTime_TZInfo;

-

-{

-/* The datetime and time types have hashcodes, and an optional tzinfo member,

- * present if and only if hastzinfo is true.

- */

-#define _PyTZINFO_HEAD		\

-	PyObject_HEAD		\

-	long hashcode;		\

-	char hastzinfo;		/* boolean flag */

-}

-

-{* No _PyDateTime_BaseTZInfo is allocated; it's just to have something

- * convenient to cast to, when getting at the hastzinfo member of objects

- * starting with _PyTZINFO_HEAD.

- *}

-  TPyDateTime_BaseTZInfo = object(TPyObject)

-    hashcode: Integer;

-    hastzinfo: bool;  // boolean flag

-  end;

-  PPyDateTime_BaseTZInfo = ^TPyDateTime_BaseTZInfo;

-

-{* All time objects are of PyDateTime_TimeType, but that can be allocated

- * in two ways, with or without a tzinfo member.  Without is the same as

- * tzinfo == None, but consumes less memory.  _PyDateTime_BaseTime is an

- * internal struct used to allocate the right amount of space for the

- * "without" case.

- *}

-{#define _PyDateTime_TIMEHEAD	\

-	_PyTZINFO_HEAD		\

-	unsigned char data[_PyDateTime_TIME_DATASIZE];

-}

-

-  TPyDateTime_BaseTime = object(TPyDateTime_BaseTZInfo) 

-    data: array[0..Pred(PyDateTime_TIME_DATASIZE)] of Byte;

-  end;

-  PPyDateTime_BaseTime = ^TPyDateTime_BaseTime;

-

-  TPyDateTime_Time = object(TPyDateTime_BaseTime) // hastzinfo true

-    tzinfo: PPyObject;

-  end;

-  PPyDateTime_Time = ^PyDateTime_Time;

-

-{* All datetime objects are of PyDateTime_DateTimeType, but that can be

- * allocated in two ways too, just like for time objects above.  In addition,

- * the plain date type is a base class for datetime, so it must also have

- * a hastzinfo member (although it's unused there).

- *}

-  TPyDateTime_Date = object(TPyDateTime_BaseTZInfo) 

-    data: array [0..Pred(PyDateTime_DATE_DATASIZE)] of Byte;

-  end;

-  PPyDateTime_Date = ^TPyDateTime_Date;

-

- {

-#define _PyDateTime_DATETIMEHEAD	\

-	_PyTZINFO_HEAD			\

-	unsigned char data[_PyDateTime_DATETIME_DATASIZE];

-}

-

-  TPyDateTime_BaseDateTime = object(TPyDateTime_BaseTZInfo) // hastzinfo false

-    data: array[0..Pred(PyDateTime_DATETIME_DATASIZE)] of Byte;

-  end;

-  PPyDateTime_BaseDateTime = ^TPyDateTime_BaseDateTime;

-

-  TPyDateTime_DateTime = object(TPyDateTime_BaseTZInfo) // hastzinfo true

-    data: array[0..Pred(PyDateTime_DATETIME_DATASIZE)] of Byte;

-    tzinfo: PPyObject;

-  end;

-  PPyDateTime_DateTime = ^TPyDateTime_DateTime;

-

-

-//#######################################################

-//##                                                   ##

-//##         New exception classes                     ##

-//##                                                   ##

-//#######################################################

-(*

-  // Python's exceptions

-  EPythonError   = object(Exception)

-      EName: String;

-      EValue: String;

-  end;

-  EPyExecError   = object(EPythonError)

-  end;

-

-  // Standard exception classes of Python

-

-/// jah 29-sep-2000: updated for python 2.0

-///                   base classes updated according python documentation

-

-{ Hierarchy of Python exceptions, Python 2.3, copied from <INSTALL>\Python\exceptions.c

-

-Exception\n\

- |\n\

- +-- SystemExit\n\

- +-- StopIteration\n\

- +-- StandardError\n\

- |    |\n\

- |    +-- KeyboardInterrupt\n\

- |    +-- ImportError\n\

- |    +-- EnvironmentError\n\

- |    |    |\n\

- |    |    +-- IOError\n\

- |    |    +-- OSError\n\

- |    |         |\n\

- |    |         +-- WindowsError\n\

- |    |         +-- VMSError\n\

- |    |\n\

- |    +-- EOFError\n\

- |    +-- RuntimeError\n\

- |    |    |\n\

- |    |    +-- NotImplementedError\n\

- |    |\n\

- |    +-- NameError\n\

- |    |    |\n\

- |    |    +-- UnboundLocalError\n\

- |    |\n\

- |    +-- AttributeError\n\

- |    +-- SyntaxError\n\

- |    |    |\n\

- |    |    +-- IndentationError\n\

- |    |         |\n\

- |    |         +-- TabError\n\

- |    |\n\

- |    +-- TypeError\n\

- |    +-- AssertionError\n\

- |    +-- LookupError\n\

- |    |    |\n\

- |    |    +-- IndexError\n\

- |    |    +-- KeyError\n\

- |    |\n\

- |    +-- ArithmeticError\n\

- |    |    |\n\

- |    |    +-- OverflowError\n\

- |    |    +-- ZeroDivisionError\n\

- |    |    +-- FloatingPointError\n\

- |    |\n\

- |    +-- ValueError\n\

- |    |    |\n\

- |    |    +-- UnicodeError\n\

- |    |        |\n\

- |    |        +-- UnicodeEncodeError\n\

- |    |        +-- UnicodeDecodeError\n\

- |    |        +-- UnicodeTranslateError\n\

- |    |\n\

- |    +-- ReferenceError\n\

- |    +-- SystemError\n\

- |    +-- MemoryError\n\

- |\n\

- +---Warning\n\

-      |\n\

-      +-- UserWarning\n\

-      +-- DeprecationWarning\n\

-      +-- PendingDeprecationWarning\n\

-      +-- SyntaxWarning\n\

-      +-- OverflowWarning\n\

-      +-- RuntimeWarning\n\

-      +-- FutureWarning"

-}

-   EPyException = class (EPythonError);

-   EPyStandardError = class (EPyException);

-   EPyArithmeticError = class (EPyStandardError);

-   EPyLookupError = class (EPyStandardError);

-   EPyAssertionError = class (EPyStandardError);

-   EPyAttributeError = class (EPyStandardError);

-   EPyEOFError = class (EPyStandardError);

-   EPyFloatingPointError = class (EPyArithmeticError);

-   EPyEnvironmentError = class (EPyStandardError);

-   EPyIOError = class (EPyEnvironmentError);

-   EPyOSError = class (EPyEnvironmentError);

-   EPyImportError = class (EPyStandardError);

-   EPyIndexError = class (EPyLookupError);

-   EPyKeyError = class (EPyLookupError);

-   EPyKeyboardInterrupt = class (EPyStandardError);

-   EPyMemoryError = class (EPyStandardError);

-   EPyNameError = class (EPyStandardError);

-   EPyOverflowError = class (EPyArithmeticError);

-   EPyRuntimeError = class (EPyStandardError);

-   EPyNotImplementedError = class (EPyRuntimeError);

-   EPySyntaxError = class (EPyStandardError)

-   public

-      EFileName: string;

-      ELineStr: string;

-      ELineNumber: Integer;

-      EOffset: Integer;

-   end;

-   EPyIndentationError = class (EPySyntaxError);

-   EPyTabError = class (EPyIndentationError);

-   EPySystemError = class (EPyStandardError);

-   EPySystemExit = class (EPyException);

-   EPyTypeError = class (EPyStandardError);

-   EPyUnboundLocalError = class (EPyNameError);

-   EPyValueError = class (EPyStandardError);

-   EPyUnicodeError = class (EPyValueError);

-   UnicodeEncodeError = class (EPyUnicodeError);

-   UnicodeDecodeError = class (EPyUnicodeError);

-   UnicodeTranslateError = class (EPyUnicodeError);

-   EPyZeroDivisionError = class (EPyArithmeticError);

-   EPyStopIteration = class(EPyException);

-   EPyWarning = class (EPyException);

-   EPyUserWarning = class (EPyWarning);

-   EPyDeprecationWarning = class (EPyWarning);

-   PendingDeprecationWarning = class (EPyWarning);

-   FutureWarning = class (EPyWarning);

-   EPySyntaxWarning = class (EPyWarning);

-   EPyOverflowWarning = class (EPyWarning);

-   EPyRuntimeWarning = class (EPyWarning);

-   EPyReferenceError = class (EPyStandardError);

-*)

-

-var

-    PyArg_Parse: function(args: PPyObject; format: PChar):

-                     Integer; cdecl;// varargs; 

-    PyArg_ParseTuple: function(args: PPyObject; format: PChar;

-                              x1: Pointer = nil;

-                              x2: Pointer = nil;

-                              x3: Pointer = nil):

-                     Integer; cdecl;// varargs

-    Py_BuildValue: function(format: PChar): PPyObject; cdecl; // varargs

-    PyCode_Addr2Line: function (co: PPyCodeObject; addrq: Integer): Integer; cdecl;

-    DLL_Py_GetBuildInfo: function: PChar; cdecl;

-

-    // define Python flags. See file pyDebug.h

-    Py_DebugFlag: PInt;

-    Py_VerboseFlag: PInt;

-    Py_InteractiveFlag: PInt;

-    Py_OptimizeFlag: PInt;

-    Py_NoSiteFlag: PInt;

-    Py_UseClassExceptionsFlag: PInt;

-    Py_FrozenFlag: PInt;

-    Py_TabcheckFlag: PInt;

-    Py_UnicodeFlag: PInt;

-    Py_IgnoreEnvironmentFlag: PInt;

-    Py_DivisionWarningFlag: PInt;

-    //_PySys_TraceFunc:    PPPyObject;

-    //_PySys_ProfileFunc: PPPPyObject;

-

-    PyImport_FrozenModules: PP_frozen;

-

-    Py_None:            PPyObject;

-    Py_Ellipsis:        PPyObject;

-    Py_False:           PPyIntObject;

-    Py_True:            PPyIntObject;

-    Py_NotImplemented:  PPyObject;

-

-    PyExc_AttributeError: PPPyObject;

-    PyExc_EOFError: PPPyObject;

-    PyExc_IOError: PPPyObject;

-    PyExc_ImportError: PPPyObject;

-    PyExc_IndexError: PPPyObject;

-    PyExc_KeyError: PPPyObject;

-    PyExc_KeyboardInterrupt: PPPyObject;

-    PyExc_MemoryError: PPPyObject;

-    PyExc_NameError: PPPyObject;

-    PyExc_OverflowError: PPPyObject;

-    PyExc_RuntimeError: PPPyObject;

-    PyExc_SyntaxError: PPPyObject;

-    PyExc_SystemError: PPPyObject;

-    PyExc_SystemExit: PPPyObject;

-    PyExc_TypeError: PPPyObject;

-    PyExc_ValueError: PPPyObject;

-    PyExc_ZeroDivisionError: PPPyObject;

-    PyExc_ArithmeticError: PPPyObject;

-    PyExc_Exception: PPPyObject;

-    PyExc_FloatingPointError: PPPyObject;

-    PyExc_LookupError: PPPyObject;

-    PyExc_StandardError: PPPyObject;

-    PyExc_AssertionError: PPPyObject;

-    PyExc_EnvironmentError: PPPyObject;

-    PyExc_IndentationError: PPPyObject;

-    PyExc_MemoryErrorInst: PPPyObject;

-    PyExc_NotImplementedError: PPPyObject;

-    PyExc_OSError: PPPyObject;

-    PyExc_TabError: PPPyObject;

-    PyExc_UnboundLocalError: PPPyObject;

-    PyExc_UnicodeError: PPPyObject;

-

-    PyExc_Warning: PPPyObject;

-    PyExc_DeprecationWarning: PPPyObject;

-    PyExc_RuntimeWarning: PPPyObject;

-    PyExc_SyntaxWarning: PPPyObject;

-    PyExc_UserWarning: PPPyObject;

-    PyExc_OverflowWarning: PPPyObject;

-    PyExc_ReferenceError: PPPyObject;

-    PyExc_StopIteration: PPPyObject;

-    PyExc_FutureWarning: PPPyObject;

-    PyExc_PendingDeprecationWarning: PPPyObject;

-    PyExc_UnicodeDecodeError: PPPyObject;

-    PyExc_UnicodeEncodeError: PPPyObject;

-    PyExc_UnicodeTranslateError: PPPyObject;

-

-    PyType_Type: PPyTypeObject;

-    PyCFunction_Type: PPyTypeObject;

-    PyCObject_Type: PPyTypeObject;

-    PyClass_Type: PPyTypeObject;

-    PyCode_Type: PPyTypeObject;

-    PyComplex_Type: PPyTypeObject;

-    PyDict_Type: PPyTypeObject;

-    PyFile_Type: PPyTypeObject;

-    PyFloat_Type: PPyTypeObject;

-    PyFrame_Type: PPyTypeObject;

-    PyFunction_Type: PPyTypeObject;

-    PyInstance_Type: PPyTypeObject;

-    PyInt_Type: PPyTypeObject;

-    PyList_Type: PPyTypeObject;

-    PyLong_Type: PPyTypeObject;

-    PyMethod_Type: PPyTypeObject;

-    PyModule_Type: PPyTypeObject;

-    PyObject_Type: PPyTypeObject;

-    PyRange_Type: PPyTypeObject;

-    PySlice_Type: PPyTypeObject;

-    PyString_Type: PPyTypeObject;

-    PyTuple_Type: PPyTypeObject;

-

-    PyBaseObject_Type: PPyTypeObject;

-    PyBuffer_Type: PPyTypeObject;

-    PyCallIter_Type: PPyTypeObject;

-    PyCell_Type: PPyTypeObject;

-    PyClassMethod_Type: PPyTypeObject;

-    PyProperty_Type: PPyTypeObject;

-    PySeqIter_Type: PPyTypeObject;

-    PyStaticMethod_Type: PPyTypeObject;

-    PySuper_Type: PPyTypeObject;

-    PySymtableEntry_Type: PPyTypeObject;

-    PyTraceBack_Type: PPyTypeObject;

-    PyUnicode_Type: PPyTypeObject;

-    PyWrapperDescr_Type: PPyTypeObject;

-

-    PyBaseString_Type: PPyTypeObject;

-    PyBool_Type: PPyTypeObject;

-    PyEnum_Type: PPyTypeObject;

-

-    //PyArg_GetObject: function(args: PPyObject; nargs, i: integer; p_a: PPPyObject): integer; cdecl;

-    //PyArg_GetLong:   function(args: PPyObject; nargs, i: integer; p_a: PLong): integer; cdecl;

-    //PyArg_GetShort:  function(args: PPyObject; nargs, i: integer; p_a: PShort): integer; cdecl;

-    //PyArg_GetFloat:  function(args: PPyObject; nargs, i: integer; p_a: PFloat): integer; cdecl;

-    //PyArg_GetString: function(args: PPyObject; nargs, i: integer; p_a: PString): integer; cdecl;

-    //PyArgs_VaParse:  function (args: PPyObject; format: PChar; va_list: array of const): integer; cdecl;

-    // Does not work!

-    // Py_VaBuildValue: function (format: PChar; va_list: array of const): PPyObject; cdecl;

-    //PyBuiltin_Init:     procedure; cdecl;

-

-    PyComplex_FromCComplex: function(c: TPy_complex):PPyObject; cdecl;

-    PyComplex_FromDoubles: function(realv,imag: double):PPyObject; cdecl;

-    PyComplex_RealAsDouble: function(op: PPyObject): double; cdecl;

-    PyComplex_ImagAsDouble: function(op: PPyObject): double; cdecl;

-    PyComplex_AsCComplex: function(op: PPyObject): TPy_complex; cdecl;

-    PyCFunction_GetFunction: function(ob: PPyObject): Pointer; cdecl;

-    PyCFunction_GetSelf: function(ob: PPyObject): PPyObject; cdecl;

-    PyCallable_Check: function(ob	: PPyObject): integer; cdecl;

-    PyCObject_FromVoidPtr: function(cobj, destruct: Pointer): PPyObject; cdecl;

-    PyCObject_AsVoidPtr: function(ob: PPyObject): Pointer; cdecl;

-    PyClass_New: function (ob1,ob2,ob3:  PPyObject): PPyObject; cdecl;

-    PyClass_IsSubclass: function (ob1, ob2: PPyObject): integer cdecl;

-

-    Py_InitModule4: function(name: PChar; methods: PPyMethodDef; doc: PChar;

-                              passthrough: PPyObject; Api_Version: Integer):PPyObject; cdecl;

-    PyErr_BadArgument:  function: integer; cdecl;

-    PyErr_BadInternalCall: procedure; cdecl;

-    PyErr_CheckSignals: function: integer; cdecl;

-    PyErr_Clear:        procedure; cdecl;

-    PyErr_Fetch:        procedure(errtype, errvalue, errtraceback: PPPyObject); cdecl;

-    PyErr_NoMemory: function: PPyObject; cdecl;

-    PyErr_Occurred:     function: PPyObject; cdecl;

-    PyErr_Print:        procedure; cdecl;

-    PyErr_Restore:      procedure  (errtype, errvalue, errtraceback: PPyObject); cdecl;

-    PyErr_SetFromErrno: function (ob:  PPyObject):PPyObject; cdecl;

-    PyErr_SetNone:      procedure(value: PPyObject); cdecl;

-    PyErr_SetObject:    procedure  (ob1, ob2	: PPyObject); cdecl;

-    PyErr_SetString:    procedure(ErrorObject: PPyObject; text: PChar); cdecl;

-    PyImport_GetModuleDict: function: PPyObject; cdecl;

-    PyInt_FromLong:     function(x: LongInt):PPyObject; cdecl;

-    Py_Initialize:      procedure; cdecl;

-    Py_Exit:            procedure(RetVal: Integer); cdecl;

-    PyEval_GetBuiltins: function: PPyObject; cdecl;

-    PyDict_GetItem: function(mp, key: PPyObject):PPyObject; cdecl;

-    PyDict_SetItem: function(mp, key, item:PPyObject):integer; cdecl;

-    PyDict_DelItem: function(mp, key: PPyObject):integer; cdecl;

-    PyDict_Clear: procedure(mp: PPyObject); cdecl;

-    PyDict_Next: function(mp: PPyObject; pos: PInt; key, value: PPPyObject):integer; cdecl;

-    PyDict_Keys: function(mp: PPyObject):PPyObject; cdecl;

-    PyDict_Values: function(mp: PPyObject):PPyObject; cdecl;

-    PyDict_Items: function(mp: PPyObject):PPyObject; cdecl;

-    PyDict_Size: function(mp: PPyObject):integer; cdecl;

-    PyDict_DelItemString: function(dp: PPyObject;key: PChar):integer; cdecl;

-    PyDict_New: function: PPyObject; cdecl;

-    PyDict_GetItemString: function(dp: PPyObject; key: PChar): PPyObject; cdecl;

-    PyDict_SetItemString: function(dp: PPyObject; key: PChar; item: PPyObject):

-                          Integer; cdecl;

-    PyDictProxy_New: function (obj: PPyObject): PPyObject; cdecl;

-    PyModule_GetDict:     function(module:PPyObject): PPyObject; cdecl;

-    PyObject_Str:         function(v: PPyObject): PPyObject; cdecl;

-    PyRun_String:         function(str: PChar; start: Integer; globals: PPyObject;

-                                    locals: PPyObject): PPyObject; cdecl;

-    PyRun_SimpleString:   function(str: PChar): Integer; cdecl;

-    PyString_AsString:    function(ob: PPyObject): PChar; cdecl;

-    PyString_FromString:  function(str: PChar): PPyObject; cdecl;

-    PySys_SetArgv:        procedure(argc: Integer; argv: PPChar); cdecl;

-

-{+ means, Grzegorz or me has tested his non object version of this function}

-{+} PyCFunction_New: function(md:PPyMethodDef;ob:PPyObject):PPyObject; cdecl;

-{+} PyEval_CallObject: function(ob1,ob2:PPyObject):PPyObject; cdecl;

-{-} PyEval_CallObjectWithKeywords:function (ob1,ob2,ob3:PPyObject):PPyObject; cdecl;

-{-} PyEval_GetFrame:function:PPyObject; cdecl;

-{-} PyEval_GetGlobals:function:PPyObject; cdecl;

-{-} PyEval_GetLocals:function:PPyObject; cdecl;

-{-} //PyEval_GetOwner:function:PPyObject; cdecl;

-{-} PyEval_GetRestricted:function:integer; cdecl;

-

-{-} PyEval_InitThreads:procedure; cdecl;

-{-} PyEval_RestoreThread:procedure(tstate: PPyThreadState); cdecl;

-{-} PyEval_SaveThread:function:PPyThreadState; cdecl;

-

-{-} PyFile_FromString:function (pc1,pc2:PChar):PPyObject; cdecl;

-{-} PyFile_GetLine:function (ob:PPyObject;i:integer):PPyObject; cdecl;

-{-} PyFile_Name:function (ob:PPyObject):PPyObject; cdecl;

-{-} PyFile_SetBufSize:procedure(ob:PPyObject;i:integer); cdecl;

-{-} PyFile_SoftSpace:function (ob:PPyObject;i:integer):integer; cdecl;

-{-} PyFile_WriteObject:function (ob1,ob2:PPyObject;i:integer):integer; cdecl;

-{-} PyFile_WriteString:procedure(s:PChar;ob:PPyObject); cdecl;

-{+} PyFloat_AsDouble:function (ob:PPyObject):DOUBLE; cdecl;

-{+} PyFloat_FromDouble:function (db:double):PPyObject; cdecl;

-{-} PyFunction_GetCode:function (ob:PPyObject):PPyObject; cdecl;

-{-} PyFunction_GetGlobals:function (ob:PPyObject):PPyObject; cdecl;

-{-} PyFunction_New:function (ob1,ob2:PPyObject):PPyObject; cdecl;

-{-} PyImport_AddModule:function (name:PChar):PPyObject; cdecl;

-{-} PyImport_Cleanup:procedure; cdecl;

-{-} PyImport_GetMagicNumber:function:LONGINT; cdecl;

-{+} PyImport_ImportFrozenModule:function (key:PChar):integer; cdecl;

-{+} PyImport_ImportModule:function (name:PChar):PPyObject; cdecl;

-{+} PyImport_Import:function (name:PPyObject):PPyObject; cdecl;

-{-} //PyImport_Init:procedure; cdecl;

-{-} PyImport_ReloadModule:function (ob:PPyObject):PPyObject; cdecl;

-{-} PyInstance_New:function (obClass, obArg, obKW:PPyObject):PPyObject; cdecl;

-{+} PyInt_AsLong:function (ob:PPyObject):LONGINT; cdecl;

-{-} PyList_Append:function (ob1,ob2:PPyObject):integer; cdecl;

-{-} PyList_AsTuple:function (ob:PPyObject):PPyObject; cdecl;

-{+} PyList_GetItem:function (ob:PPyObject;i:integer):PPyObject; cdecl;

-{-} PyList_GetSlice:function (ob:PPyObject;i1,i2:integer):PPyObject; cdecl;

-{-} PyList_Insert:function (dp:PPyObject;idx:Integer;item:PPyObject):integer; cdecl;

-{-} PyList_New:function (size:integer):PPyObject; cdecl;

-{-} PyList_Reverse:function (ob:PPyObject):integer; cdecl;

-{-} PyList_SetItem:function (dp:PPyObject;idx:Integer;item:PPyObject):integer; cdecl;

-{-} PyList_SetSlice:function (ob:PPyObject;i1,i2:integer;ob2:PPyObject):integer; cdecl;

-{+} PyList_Size:function (ob:PPyObject):integer; cdecl;

-{-} PyList_Sort:function (ob:PPyObject):integer; cdecl;

-{-} PyLong_AsDouble:function (ob:PPyObject):DOUBLE; cdecl;

-{+} PyLong_AsLong:function (ob:PPyObject):LONGINT; cdecl;

-{+} PyLong_FromDouble:function (db:double):PPyObject; cdecl;

-{+} PyLong_FromLong:function (l:longint):PPyObject; cdecl;

-{-} PyLong_FromString:function (pc:PChar;var ppc:PChar;i:integer):PPyObject; cdecl;

-{-} PyLong_FromUnsignedLong:function(val:cardinal): PPyObject; cdecl;

-{-} PyLong_AsUnsignedLong:function(ob:PPyObject): Cardinal; cdecl;

-{-} PyLong_FromUnicode:function(ob:PPyObject; a, b: integer): PPyObject; cdecl;

-{-} PyLong_FromLongLong:function(val:Int64): PPyObject; cdecl;

-{-} PyLong_AsLongLong:function(ob:PPyObject): Int64; cdecl;

-{-} PyMapping_Check:function (ob:PPyObject):integer; cdecl;

-{-} PyMapping_GetItemString:function (ob:PPyObject;key:PChar):PPyObject; cdecl;

-{-} PyMapping_HasKey:function (ob,key:PPyObject):integer; cdecl;

-{-} PyMapping_HasKeyString:function (ob:PPyObject;key:PChar):integer; cdecl;

-{-} PyMapping_Length:function (ob:PPyObject):integer; cdecl;

-{-} PyMapping_SetItemString:function (ob:PPyObject; key:PChar; value:PPyObject):integer; cdecl;

-{-} PyMethod_Class:function (ob:PPyObject):PPyObject; cdecl;

-{-} PyMethod_Function:function (ob:PPyObject):PPyObject; cdecl;

-{-} PyMethod_New:function (ob1,ob2,ob3:PPyObject):PPyObject; cdecl;

-{-} PyMethod_Self:function (ob:PPyObject):PPyObject; cdecl;

-{-} PyModule_GetName:function (ob:PPyObject):PChar; cdecl;

-{-} PyModule_New:function (key:PChar):PPyObject; cdecl;

-{-} PyNumber_Absolute:function (ob:PPyObject):PPyObject; cdecl;

-{-} PyNumber_Add:function (ob1,ob2:PPyObject):PPyObject; cdecl;

-{-} PyNumber_And:function (ob1,ob2:PPyObject):PPyObject; cdecl;

-{-} PyNumber_Check:function (ob:PPyObject):integer; cdecl;

-{-} PyNumber_Coerce:function (var ob1,ob2:PPyObject):integer; cdecl;

-{-} PyNumber_Divide:function (ob1,ob2:PPyObject):PPyObject; cdecl;

-{-} PyNumber_FloorDivide:function (ob1,ob2:PPyObject):PPyObject; cdecl;

-{-} PyNumber_TrueDivide:function (ob1,ob2:PPyObject):PPyObject; cdecl;

-{-} PyNumber_Divmod:function (ob1,ob2:PPyObject):PPyObject; cdecl;

-{-} PyNumber_Float:function (ob:PPyObject):PPyObject; cdecl;

-{-} PyNumber_Int:function (ob:PPyObject):PPyObject; cdecl;

-{-} PyNumber_Invert:function (ob:PPyObject):PPyObject; cdecl;

-{-} PyNumber_Long:function (ob:PPyObject):PPyObject; cdecl;

-{-} PyNumber_Lshift:function (ob1,ob2:PPyObject):PPyObject; cdecl;

-{-} PyNumber_Multiply:function (ob1,ob2:PPyObject):PPyObject; cdecl;

-{-} PyNumber_Negative:function (ob:PPyObject):PPyObject; cdecl;

-{-} PyNumber_Or:function (ob1,ob2:PPyObject):PPyObject; cdecl;

-{-} PyNumber_Positive:function (ob:PPyObject):PPyObject; cdecl;

-{-} PyNumber_Power:function (ob1,ob2,ob3:PPyObject):PPyObject; cdecl;

-{-} PyNumber_Remainder:function (ob1,ob2:PPyObject):PPyObject; cdecl;

-{-} PyNumber_Rshift:function (ob1,ob2:PPyObject):PPyObject; cdecl;

-{-} PyNumber_Subtract:function (ob1,ob2:PPyObject):PPyObject; cdecl;

-{-} PyNumber_Xor:function (ob1,ob2:PPyObject):PPyObject; cdecl;

-{-} PyOS_InitInterrupts:procedure; cdecl;

-{-} PyOS_InterruptOccurred:function:integer; cdecl;

-{-} PyObject_CallObject:function (ob,args:PPyObject):PPyObject; cdecl;

-{-} PyObject_Compare:function (ob1,ob2:PPyObject):integer; cdecl;

-{-} PyObject_GetAttr:function (ob1,ob2:PPyObject):PPyObject; cdecl;

-{+} PyObject_GetAttrString:function (ob:PPyObject;c:PChar):PPyObject; cdecl;

-{-} PyObject_GetItem:function (ob,key:PPyObject):PPyObject; cdecl;

-{-} PyObject_DelItem:function (ob,key:PPyObject):PPyObject; cdecl;

-{-} PyObject_HasAttrString:function (ob:PPyObject;key:PChar):integer; cdecl;

-{-} PyObject_Hash:function (ob:PPyObject):LONGINT; cdecl;

-{-} PyObject_IsTrue:function (ob:PPyObject):integer; cdecl;

-{-} PyObject_Length:function (ob:PPyObject):integer; cdecl;

-{-} PyObject_Repr:function (ob:PPyObject):PPyObject; cdecl;

-{-} PyObject_SetAttr:function (ob1,ob2,ob3:PPyObject):integer; cdecl;

-{-} PyObject_SetAttrString:function (ob:PPyObject;key:Pchar;value:PPyObject):integer; cdecl;

-{-} PyObject_SetItem:function (ob1,ob2,ob3:PPyObject):integer; cdecl;

-{-} PyObject_Init:function (ob:PPyObject; t:PPyTypeObject):PPyObject; cdecl;

-{-} PyObject_InitVar:function (ob:PPyObject; t:PPyTypeObject; size:integer):PPyObject; cdecl;

-{-} PyObject_New:function (t:PPyTypeObject):PPyObject; cdecl;

-{-} PyObject_NewVar:function (t:PPyTypeObject; size:integer):PPyObject; cdecl;

-    PyObject_Free:procedure (ob:PPyObject); cdecl;

-{-} PyObject_IsInstance:function (inst, cls:PPyObject):integer; cdecl;

-{-} PyObject_IsSubclass:function (derived, cls:PPyObject):integer; cdecl;

-    PyObject_GenericGetAttr:function (obj, name: PPyObject): PPyObject; cdecl;

-    PyObject_GenericSetAttr:function (obj, name, value: PPyObject): Integer; cdecl;

-{-} PyObject_GC_Malloc:function (size:integer):PPyObject; cdecl;

-{-} PyObject_GC_New:function (t:PPyTypeObject):PPyObject; cdecl;

-{-} PyObject_GC_NewVar:function (t:PPyTypeObject; size:integer):PPyObject; cdecl;

-{-} PyObject_GC_Resize:function (t:PPyObject; newsize:integer):PPyObject; cdecl;

-{-} PyObject_GC_Del:procedure (ob:PPyObject); cdecl;

-{-} PyObject_GC_Track:procedure (ob:PPyObject); cdecl;

-{-} PyObject_GC_UnTrack:procedure (ob:PPyObject); cdecl;

-{-} PyRange_New:function (l1,l2,l3:longint;i:integer):PPyObject; cdecl;

-{-} PySequence_Check:function (ob:PPyObject):integer; cdecl;

-{-} PySequence_Concat:function (ob1,ob2:PPyObject):PPyObject; cdecl;

-{-} PySequence_Count:function (ob1,ob2:PPyObject):integer; cdecl;

-{-} PySequence_GetItem:function (ob:PPyObject;i:integer):PPyObject; cdecl;

-{-} PySequence_GetSlice:function (ob:PPyObject;i1,i2:integer):PPyObject; cdecl;

-{-} PySequence_In:function (ob1,ob2:PPyObject):integer; cdecl;

-{-} PySequence_Index:function (ob1,ob2:PPyObject):integer; cdecl;

-{-} PySequence_Length:function (ob:PPyObject):integer; cdecl;

-{-} PySequence_Repeat:function (ob:PPyObject;count:integer):PPyObject; cdecl;

-{-} PySequence_SetItem:function (ob:PPyObject;i:integer;value:PPyObject):integer; cdecl;

-{-} PySequence_SetSlice:function (ob:PPyObject;i1,i2:integer;value:PPyObject):integer; cdecl;

-{-} PySequence_DelSlice:function (ob:PPyObject;i1,i2:integer):integer; cdecl;

-{-} PySequence_Tuple:function (ob:PPyObject):PPyObject; cdecl;

-{-} PySequence_Contains:function (ob, value:PPyObject):integer; cdecl;

-{-} PySlice_GetIndices:function (ob:PPySliceObject;length:integer;var start,stop,step:integer):integer; cdecl;

-{-} PySlice_GetIndicesEx:function (ob:PPySliceObject;length:integer;var start,stop,step,slicelength:integer):integer; cdecl;

-{-} PySlice_New:function (start,stop,step:PPyObject):PPyObject; cdecl;

-{-} PyString_Concat:procedure(var ob1:PPyObject;ob2:PPyObject); cdecl;

-{-} PyString_ConcatAndDel:procedure(var ob1:PPyObject;ob2:PPyObject); cdecl;

-{-} PyString_Format:function (ob1,ob2:PPyObject):PPyObject; cdecl;

-{-} PyString_FromStringAndSize:function (s:PChar;i:integer):PPyObject; cdecl;

-{-} PyString_Size:function (ob:PPyObject):integer; cdecl;

-{-} PyString_DecodeEscape:function(s:PChar; len:integer; errors:PChar; unicode:integer; recode_encoding:PChar):PPyObject; cdecl;

-{-} PyString_Repr:function(ob:PPyObject; smartquotes:integer):PPyObject; cdecl;

-{+} PySys_GetObject:function (s:PChar):PPyObject; cdecl;

-{-} //PySys_Init:procedure; cdecl;

-{-} PySys_SetObject:function (s:PChar;ob:PPyObject):integer; cdecl;

-{-} PySys_SetPath:procedure(path:PChar); cdecl;

-{-} //PyTraceBack_Fetch:function:PPyObject; cdecl;

-{-} PyTraceBack_Here:function (p:pointer):integer; cdecl;

-{-} PyTraceBack_Print:function (ob1,ob2:PPyObject):integer; cdecl;

-{-} //PyTraceBack_Store:function (ob:PPyObject):integer; cdecl;

-{+} PyTuple_GetItem:function (ob:PPyObject;i:integer):PPyObject; cdecl;

-{-} PyTuple_GetSlice:function (ob:PPyObject;i1,i2:integer):PPyObject; cdecl;

-{+} PyTuple_New:function (size:Integer):PPyObject; cdecl;

-{+} PyTuple_SetItem:function (ob:PPyObject;key:integer;value:PPyObject):integer; cdecl;

-{+} PyTuple_Size:function (ob:PPyObject):integer; cdecl;

-{+} PyType_IsSubtype:function (a, b: PPyTypeObject):integer; cdecl;

-    PyType_GenericAlloc:function(atype: PPyTypeObject; nitems:Integer): PPyObject; cdecl;

-    PyType_GenericNew:function(atype: PPyTypeObject; args, kwds: PPyObject): PPyObject; cdecl;

-    PyType_Ready:function(atype: PPyTypeObject): integer; cdecl;

-{+} PyUnicode_FromWideChar:function (const w:PWideChar; size:integer):PPyObject; cdecl;

-{+} PyUnicode_AsWideChar:function (unicode: PPyObject; w:PWideChar; size:integer):integer; cdecl;

-{-} PyUnicode_FromOrdinal:function (ordinal:integer):PPyObject; cdecl;

-    PyWeakref_GetObject: function (ref: PPyObject): PPyObject; cdecl;

-    PyWeakref_NewProxy: function (ob, callback: PPyObject): PPyObject; cdecl;

-    PyWeakref_NewRef: function (ob, callback: PPyObject): PPyObject; cdecl;

-    PyWrapper_New: function (ob1, ob2: PPyObject): PPyObject; cdecl;

-    PyBool_FromLong: function (ok: Integer): PPyObject; cdecl;

-{-} Py_AtExit:function (proc: procedure):integer; cdecl;

-{-} //Py_Cleanup:procedure; cdecl;

-{-} Py_CompileString:function (s1,s2:PChar;i:integer):PPyObject; cdecl;

-{-} Py_FatalError:procedure(s:PChar); cdecl;

-{-} Py_FindMethod:function (md:PPyMethodDef;ob:PPyObject;key:PChar):PPyObject; cdecl;

-{-} Py_FindMethodInChain:function (mc:PPyMethodChain;ob:PPyObject;key:PChar):PPyObject; cdecl;

-{-} Py_FlushLine:procedure; cdecl;

-{+} Py_Finalize: procedure; cdecl;

-{-} PyErr_ExceptionMatches: function (exc: PPyObject): Integer; cdecl;

-{-} PyErr_GivenExceptionMatches: function (raised_exc, exc: PPyObject): Integer; cdecl;

-{-} PyEval_EvalCode: function (co: PPyCodeObject; globals, locals: PPyObject): PPyObject; cdecl;

-{+} Py_GetVersion: function: PChar; cdecl;

-{+} Py_GetCopyright: function: PChar; cdecl;

-{+} Py_GetExecPrefix: function: PChar; cdecl;

-{+} Py_GetPath: function: PChar; cdecl;

-{+} Py_GetPrefix: function: PChar; cdecl;

-{+} Py_GetProgramName: function: PChar; cdecl;

-

-{-} PyParser_SimpleParseString: function (str: PChar; start: Integer): PNode; cdecl;

-{-} PyNode_Free: procedure(n: PNode); cdecl;

-{-} PyErr_NewException: function (name: PChar; base, dict: PPyObject): PPyObject; cdecl;

-{-} Py_Malloc: function (size: Integer): Pointer;

-{-} PyMem_Malloc: function (size: Integer): Pointer;

-{-} PyObject_CallMethod: function (obj: PPyObject; method, format: PChar): PPyObject; cdecl;

-

-{New exported Objects in Python 1.5}

-    Py_SetProgramName: procedure(name: PChar); cdecl;

-    Py_IsInitialized: function: integer; cdecl;

-    Py_GetProgramFullPath: function: PChar; cdecl;

-    Py_NewInterpreter: function: PPyThreadState; cdecl;

-    Py_EndInterpreter: procedure(tstate: PPyThreadState); cdecl;

-    PyEval_AcquireLock: procedure; cdecl;

-    PyEval_ReleaseLock: procedure; cdecl;

-    PyEval_AcquireThread: procedure(tstate: PPyThreadState); cdecl;

-    PyEval_ReleaseThread: procedure(tstate: PPyThreadState); cdecl;

-    PyInterpreterState_New: function: PPyInterpreterState; cdecl;

-    PyInterpreterState_Clear: procedure(interp: PPyInterpreterState); cdecl;

-    PyInterpreterState_Delete: procedure(interp: PPyInterpreterState); cdecl;

-    PyThreadState_New: function (interp: PPyInterpreterState): PPyThreadState; cdecl;

-    PyThreadState_Clear: procedure(tstate: PPyThreadState); cdecl;

-    PyThreadState_Delete: procedure(tstate: PPyThreadState); cdecl;

-    PyThreadState_Get: function: PPyThreadState; cdecl;

-    PyThreadState_Swap: function (tstate: PPyThreadState): PPyThreadState; cdecl;

-

-{Further exported Objects, may be implemented later}

-{

-    PyCode_New: Pointer;

-    PyErr_SetInterrupt: Pointer;

-    PyFile_AsFile: Pointer;

-    PyFile_FromFile: Pointer;

-    PyFloat_AsString: Pointer;

-    PyFrame_BlockPop: Pointer;

-    PyFrame_BlockSetup: Pointer;

-    PyFrame_ExtendStack: Pointer;

-    PyFrame_FastToLocals: Pointer;

-    PyFrame_LocalsToFast: Pointer;

-    PyFrame_New: Pointer;

-    PyGrammar_AddAccelerators: Pointer;

-    PyGrammar_FindDFA: Pointer;

-    PyGrammar_LabelRepr: Pointer;

-    PyInstance_DoBinOp: Pointer;

-    PyInt_GetMax: Pointer;

-    PyMarshal_Init: Pointer;

-    PyMarshal_ReadLongFromFile: Pointer;

-    PyMarshal_ReadObjectFromFile: Pointer;

-    PyMarshal_ReadObjectFromString: Pointer;

-    PyMarshal_WriteLongToFile: Pointer;

-    PyMarshal_WriteObjectToFile: Pointer;

-    PyMember_Get: Pointer;

-    PyMember_Set: Pointer;

-    PyNode_AddChild: Pointer;

-    PyNode_Compile: Pointer;

-    PyNode_New: Pointer;

-    PyOS_GetLastModificationTime: Pointer;

-    PyOS_Readline: Pointer;

-    PyOS_strtol: Pointer;

-    PyOS_strtoul: Pointer;

-    PyObject_CallFunction: Pointer;

-    PyObject_CallMethod: Pointer;

-    PyObject_Print: Pointer;

-    PyParser_AddToken: Pointer;

-    PyParser_Delete: Pointer;

-    PyParser_New: Pointer;

-    PyParser_ParseFile: Pointer;

-    PyParser_ParseString: Pointer;

-    PyParser_SimpleParseFile: Pointer;

-    PyRun_AnyFile: Pointer;

-    PyRun_File: Pointer;

-    PyRun_InteractiveLoop: Pointer;

-    PyRun_InteractiveOne: Pointer;

-    PyRun_SimpleFile: Pointer;

-    PySys_GetFile: Pointer;

-    PyToken_OneChar: Pointer;

-    PyToken_TwoChars: Pointer;

-    PyTokenizer_Free: Pointer;

-    PyTokenizer_FromFile: Pointer;

-    PyTokenizer_FromString: Pointer;

-    PyTokenizer_Get: Pointer;

-    Py_Main: Pointer;

-    _PyObject_NewVar: Pointer;

-    _PyParser_Grammar: Pointer;

-    _PyParser_TokenNames: Pointer;

-    _PyThread_Started: Pointer;

-    _Py_c_diff: Pointer;

-    _Py_c_neg: Pointer;

-    _Py_c_pow: Pointer;

-    _Py_c_prod: Pointer;

-    _Py_c_quot: Pointer;

-    _Py_c_sum: Pointer;

-}

-// functions redefined in Delphi

-procedure Py_INCREF(op: PPyObject);

-procedure Py_DECREF(op: PPyObject);

-procedure Py_XINCREF(op: PPyObject);

-procedure Py_XDECREF(op: PPyObject);

-

-// This function handles all cardinals, pointer types (with no adjustment of pointers!)

-// (Extended) floats, which are handled as Python doubles and currencies, handled

-// as (normalized) Python doubles.

-function PyImport_ExecCodeModule(const name: String; codeobject: PPyObject): PPyObject;

-function PyString_Check(obj: PPyObject): Boolean;

-function PyString_CheckExact(obj: PPyObject): Boolean;

-function PyFloat_Check(obj: PPyObject): Boolean;

-function PyFloat_CheckExact(obj: PPyObject): Boolean;

-function PyInt_Check(obj: PPyObject): Boolean;

-function PyInt_CheckExact(obj: PPyObject): Boolean;

-function PyLong_Check(obj: PPyObject): Boolean;

-function PyLong_CheckExact(obj: PPyObject): Boolean;

-function PyTuple_Check(obj: PPyObject): Boolean;

-function PyTuple_CheckExact(obj: PPyObject): Boolean;

-function PyInstance_Check(obj: PPyObject): Boolean;

-function PyClass_Check(obj: PPyObject): Boolean;

-function PyMethod_Check(obj: PPyObject): Boolean;

-function PyList_Check(obj: PPyObject): Boolean;

-function PyList_CheckExact(obj: PPyObject): Boolean;

-function PyDict_Check(obj: PPyObject): Boolean;

-function PyDict_CheckExact(obj: PPyObject): Boolean;

-function PyModule_Check(obj: PPyObject): Boolean;

-function PyModule_CheckExact(obj: PPyObject): Boolean;

-function PySlice_Check(obj: PPyObject): Boolean;

-function PyFunction_Check(obj: PPyObject): Boolean;

-function PyUnicode_Check(obj: PPyObject): Boolean;

-function PyUnicode_CheckExact(obj: PPyObject): Boolean;

-function PyType_IS_GC(t: PPyTypeObject): Boolean;

-function PyObject_IS_GC(obj: PPyObject): Boolean;

-function PyWeakref_Check(obj: PPyObject): Boolean;

-function PyWeakref_CheckRef(obj: PPyObject): Boolean;

-function PyWeakref_CheckProxy(obj: PPyObject): Boolean;

-function PyBool_Check(obj: PPyObject): Boolean;

-function PyBaseString_Check(obj: PPyObject): Boolean;

-function PyEnum_Check(obj: PPyObject): Boolean;

-function PyObject_TypeCheck(obj:PPyObject; t:PPyTypeObject): Boolean;

-function Py_InitModule(const name: PChar; md: PPyMethodDef): PPyObject;

-

-function  PyType_HasFeature(AType: PPyTypeObject; AFlag: Integer): Boolean;

-

-implementation

-

-procedure Py_INCREF(op: PPyObject);

-begin

-  Inc(op.ob_refcnt);

-end;

-

-procedure Py_DECREF(op: PPyObject);

-begin

-  Dec(op.ob_refcnt);

-  if op.ob_refcnt = 0 then begin

-    op.ob_type.tp_dealloc(op);

-  end;

-end;

-

-procedure Py_XINCREF(op: PPyObject);

-begin

-  if op <> nil then Py_INCREF(op);

-end;

-

-procedure Py_XDECREF(op: PPyObject);

-begin

-  if op <> nil then Py_DECREF(op);

-end;

-

-function PyImport_ExecCodeModule(const name: String; 

-             codeobject: PPyObject): PPyObject;

-var

-  m, d, v, modules: PPyObject;

-begin

-  m:= PyImport_AddModule(PChar(name));

-  if m = nil then

-    begin

-      Result:= nil;

-      Exit;

-    end;

-  d:= PyModule_GetDict(m);

-  if PyDict_GetItemString(d, '__builtins__') = nil then

-    begin

-      if PyDict_SetItemString(d, '__builtins__', PyEval_GetBuiltins) <> 0 then

-        begin

-          Result:= nil;

-          Exit;

-        end;

-    end;

-  // Remember the fielname as the __file__ attribute

-  if PyDict_SetItemString(d, '__file__', PPyCodeObject(codeobject).co_filename) <> 0 then

-    PyErr_Clear(); // Not important enough to report

-  v:= PyEval_EvalCode(PPyCodeObject(codeobject), d, d); // XXX owner ?

-  if v = nil then

-    begin

-      Result:= nil;

-      Exit;

-    end;

-  Py_XDECREF(v);

-  modules:= PyImport_GetModuleDict();

-  if PyDict_GetItemString(modules, PChar(name)) = nil then

-    begin

-      PyErr_SetString(PyExc_ImportError^, PChar(Format('Loaded module %.200s not found in sys.modules', [name])));

-      Result:= nil;

-      Exit;

-    end;

-  Py_XINCREF(m);

-  Result:= m;

-end;

-

-function PyString_Check(obj: PPyObject): Boolean;

-begin

-  Result:= PyObject_TypeCheck(obj, PyString_Type);

-end;

-

-function PyString_CheckExact(obj: PPyObject): Boolean;

-begin

-  Result:= (obj <> nil) and (obj.ob_type = PPyTypeObject(PyString_Type));

-end;

-

-function PyFloat_Check(obj: PPyObject): Boolean;

-begin

-  Result:= PyObject_TypeCheck(obj, PyFloat_Type);

-end;

-

-function PyFloat_CheckExact(obj: PPyObject): Boolean;

-begin

-  Result:= (obj <> nil) and (obj.ob_type = PPyTypeObject(PyFloat_Type));

-end;

-

-function PyInt_Check(obj: PPyObject): Boolean;

-begin

-  Result:= PyObject_TypeCheck(obj, PyInt_Type);

-end;

-

-function PyInt_CheckExact(obj: PPyObject): Boolean;

-begin

-  Result:= (obj <> nil) and (obj.ob_type = PPyTypeObject(PyInt_Type));

-end;

-

-function PyLong_Check(obj: PPyObject): Boolean;

-begin

-  Result:= PyObject_TypeCheck(obj, PyLong_Type);

-end;

-

-function PyLong_CheckExact(obj: PPyObject): Boolean;

-begin

-  Result:= (obj <> nil) and (obj.ob_type = PPyTypeObject(PyLong_Type));

-end;

-

-function PyTuple_Check(obj: PPyObject): Boolean;

-begin

-  Result:= PyObject_TypeCheck(obj, PyTuple_Type);

-end;

-

-function PyTuple_CheckExact(obj: PPyObject): Boolean;

-begin

-  Result:= ( obj<> nil) and (obj^.ob_type = PPyTypeObject(PyTuple_Type));

-end;

-

-function PyInstance_Check(obj: PPyObject): Boolean;

-begin

-  Result:= (obj <> nil) and (obj^.ob_type = PPyTypeObject(PyInstance_Type));

-end;

-

-function PyClass_Check(obj: PPyObject): Boolean;

-begin

-  Result:= ( obj<> nil) and (obj^.ob_type = PPyTypeObject(PyClass_Type));

-end;

-

-function PyMethod_Check(obj: PPyObject): Boolean;

-begin

-  Result:= (obj <> nil) and (obj^.ob_type = PPyTypeObject(PyMethod_Type));

-end;

-

-function PyList_Check(obj: PPyObject): Boolean;

-begin

-  Result:= PyObject_TypeCheck(obj, PyList_Type);

-end;

-

-function PyList_CheckExact(obj: PPyObject): Boolean;

-begin

-  Result:= (obj<>nil) and (obj^.ob_type = PPyTypeObject(PyList_Type));

-end;

-

-function PyDict_Check(obj: PPyObject): Boolean;

-begin

-  Result:= PyObject_TypeCheck(obj, PyDict_Type);

-end;

-

-function PyDict_CheckExact(obj: PPyObject): Boolean;

-begin

-  Result:= (obj<>nil) and (obj^.ob_type = PPyTypeObject(PyDict_Type));

-end;

-

-function PyModule_Check(obj: PPyObject): Boolean;

-begin

-  Result:= PyObject_TypeCheck(obj, PyModule_Type);

-end;

-

-function PyModule_CheckExact(obj: PPyObject): Boolean;

-begin

-  Result:= (obj<>nil) and (obj^.ob_type = PPyTypeObject(PyModule_Type));

-end;

-

-function PySlice_Check(obj: PPyObject): Boolean;

-begin

-  Result:= (obj<>nil) and (obj^.ob_type = PPyTypeObject(PySlice_Type));

-end;

-

-function PyFunction_Check(obj: PPyObject): Boolean;

-begin

-  Result:= (obj<>nil) and

-    ((obj.ob_type = PPyTypeObject(PyCFunction_Type)) or

-     (obj.ob_type = PPyTypeObject(PyFunction_Type)));

-end;

-

-function PyUnicode_Check(obj: PPyObject): Boolean;

-begin

-  Result:= PyObject_TypeCheck(obj, PyUnicode_Type);

-end;

-

-function PyUnicode_CheckExact(obj: PPyObject): Boolean;

-begin

-  Result:= (obj<>nil) and (obj^.ob_type = PPyTypeObject(PyUnicode_Type));

-end;

-

-function PyType_IS_GC(t: PPyTypeObject): Boolean;

-begin

-  Result:= PyType_HasFeature(t, Py_TPFLAGS_HAVE_GC);

-end;

-

-function PyObject_IS_GC(obj: PPyObject): Boolean;

-begin

-  Result:= PyType_IS_GC(obj.ob_type) and

-            ((obj.ob_type.tp_is_gc = nil) or (obj.ob_type.tp_is_gc(obj) = 1));

-end;

-

-function PyWeakref_Check(obj: PPyObject): Boolean;

-begin

-  Result:= (obj<>nil) and (PyWeakref_CheckRef(obj) or PyWeakref_CheckProxy(obj));

-end;

-

-function PyWeakref_CheckRef(obj: PPyObject): Boolean;

-begin

-  Result:= (obj<>nil) and (obj.ob_type = PPyTypeObject(PyWeakref_RefType));

-end;

-

-function PyWeakref_CheckProxy(obj: PPyObject): Boolean;

-begin

-  Result:= (obj<>nil) and

-            ((obj.ob_type = PPyTypeObject(PyWeakref_ProxyType)) or

-              (obj.ob_type = PPyTypeObject(PyWeakref_CallableProxyType)));

-end;

-

-function PyBool_Check(obj: PPyObject): Boolean;

-begin

-  Result:= (obj<>nil) and (obj.ob_type = PPyTypeObject(PyBool_Type));

-end;

-

-function PyBaseString_Check(obj: PPyObject): Boolean;

-begin

-  Result:= PyObject_TypeCheck(obj, PyBaseString_Type);

-end;

-

-function PyEnum_Check(obj: PPyObject): Boolean;

-begin

-  Result:= (obj<>nil) and (obj.ob_type = PPyTypeObject(PyEnum_Type));

-end;

-

-function PyObject_TypeCheck(obj: PPyObject; t: PPyTypeObject): Boolean;

-begin

-  Result:= (obj<>nil) and (obj.ob_type = t);

-  if not Result and (obj<>nil) and (t<>nil) then

-    Result:= PyType_IsSubtype(obj.ob_type, t) = 1;

-end;

-

-function Py_InitModule(const name: PChar; md: PPyMethodDef): PPyObject;

-begin

-  result:= Py_InitModule4(name, md, nil, nil, 1012);

-end;

-

-function PyType_HasFeature(AType: PPyTypeObject; AFlag: Integer): Boolean;

-begin

-  //(((t)->tp_flags & (f)) != 0)

-  Result:= (AType.tp_flags and AFlag) <> 0;

-end;

-

-procedure init(lib: TLibHandle);

-begin

-  Py_DebugFlag               := getProcAddr(lib, 'Py_DebugFlag');

-  Py_VerboseFlag             := getProcAddr(lib, 'Py_VerboseFlag');

-  Py_InteractiveFlag         := getProcAddr(lib, 'Py_InteractiveFlag');

-  Py_OptimizeFlag            := getProcAddr(lib, 'Py_OptimizeFlag');

-  Py_NoSiteFlag              := getProcAddr(lib, 'Py_NoSiteFlag');

-  Py_UseClassExceptionsFlag  := getProcAddr(lib, 'Py_UseClassExceptionsFlag');

-  Py_FrozenFlag              := getProcAddr(lib, 'Py_FrozenFlag');

-  Py_TabcheckFlag            := getProcAddr(lib, 'Py_TabcheckFlag');

-  Py_UnicodeFlag             := getProcAddr(lib, 'Py_UnicodeFlag');

-

-  Py_IgnoreEnvironmentFlag   := getProcAddr(lib, 'Py_IgnoreEnvironmentFlag');

-  Py_DivisionWarningFlag     := getProcAddr(lib, 'Py_DivisionWarningFlag');

-  Py_None                    := getProcAddr(lib, '_Py_NoneStruct');

-  Py_Ellipsis                := getProcAddr(lib, '_Py_EllipsisObject');

-  Py_False                   := getProcAddr(lib, '_Py_ZeroStruct');

-  Py_True                    := getProcAddr(lib, '_Py_TrueStruct');

-  Py_NotImplemented          := getProcAddr(lib, '_Py_NotImplementedStruct');

-

-  PyImport_FrozenModules     := getProcAddr(lib, 'PyImport_FrozenModules');

-

-  PyExc_AttributeError       := getProcAddr(lib, 'PyExc_AttributeError');

-  PyExc_EOFError             := getProcAddr(lib, 'PyExc_EOFError');

-  PyExc_IOError              := getProcAddr(lib, 'PyExc_IOError');

-  PyExc_ImportError          := getProcAddr(lib, 'PyExc_ImportError');

-  PyExc_IndexError           := getProcAddr(lib, 'PyExc_IndexError');

-  PyExc_KeyError             := getProcAddr(lib, 'PyExc_KeyError');

-  PyExc_KeyboardInterrupt    := getProcAddr(lib, 'PyExc_KeyboardInterrupt');

-  PyExc_MemoryError          := getProcAddr(lib, 'PyExc_MemoryError');

-  PyExc_NameError            := getProcAddr(lib, 'PyExc_NameError');

-  PyExc_OverflowError        := getProcAddr(lib, 'PyExc_OverflowError');

-  PyExc_RuntimeError         := getProcAddr(lib, 'PyExc_RuntimeError');

-  PyExc_SyntaxError          := getProcAddr(lib, 'PyExc_SyntaxError');

-  PyExc_SystemError          := getProcAddr(lib, 'PyExc_SystemError');

-  PyExc_SystemExit           := getProcAddr(lib, 'PyExc_SystemExit');

-  PyExc_TypeError            := getProcAddr(lib, 'PyExc_TypeError');

-  PyExc_ValueError           := getProcAddr(lib, 'PyExc_ValueError');

-  PyExc_ZeroDivisionError    := getProcAddr(lib, 'PyExc_ZeroDivisionError');

-  PyExc_ArithmeticError      := getProcAddr(lib, 'PyExc_ArithmeticError');

-  PyExc_Exception            := getProcAddr(lib, 'PyExc_Exception');

-  PyExc_FloatingPointError   := getProcAddr(lib, 'PyExc_FloatingPointError');

-  PyExc_LookupError          := getProcAddr(lib, 'PyExc_LookupError');

-  PyExc_StandardError        := getProcAddr(lib, 'PyExc_StandardError');

-

-  PyExc_AssertionError       := getProcAddr(lib, 'PyExc_AssertionError');

-  PyExc_EnvironmentError     := getProcAddr(lib, 'PyExc_EnvironmentError');

-  PyExc_IndentationError     := getProcAddr(lib, 'PyExc_IndentationError');

-  PyExc_MemoryErrorInst      := getProcAddr(lib, 'PyExc_MemoryErrorInst');

-  PyExc_NotImplementedError  := getProcAddr(lib, 'PyExc_NotImplementedError');

-  PyExc_OSError              := getProcAddr(lib, 'PyExc_OSError');

-  PyExc_TabError             := getProcAddr(lib, 'PyExc_TabError');

-  PyExc_UnboundLocalError    := getProcAddr(lib, 'PyExc_UnboundLocalError');

-  PyExc_UnicodeError         := getProcAddr(lib, 'PyExc_UnicodeError');

-

-  PyExc_Warning              := getProcAddr(lib, 'PyExc_Warning');

-  PyExc_DeprecationWarning   := getProcAddr(lib, 'PyExc_DeprecationWarning');

-  PyExc_RuntimeWarning       := getProcAddr(lib, 'PyExc_RuntimeWarning');

-  PyExc_SyntaxWarning        := getProcAddr(lib, 'PyExc_SyntaxWarning');

-  PyExc_UserWarning          := getProcAddr(lib, 'PyExc_UserWarning');

-

-  PyExc_OverflowWarning      := getProcAddr(lib, 'PyExc_OverflowWarning');

-  PyExc_ReferenceError       := getProcAddr(lib, 'PyExc_ReferenceError');

-  PyExc_StopIteration        := getProcAddr(lib, 'PyExc_StopIteration');

-

-  PyExc_FutureWarning        := getProcAddr(lib, 'PyExc_FutureWarning');

-  PyExc_PendingDeprecationWarning:= getProcAddr(lib, 'PyExc_PendingDeprecationWarning');

-  PyExc_UnicodeDecodeError   := getProcAddr(lib, 'PyExc_UnicodeDecodeError');

-  PyExc_UnicodeEncodeError   := getProcAddr(lib, 'PyExc_UnicodeEncodeError');

-  PyExc_UnicodeTranslateError:= getProcAddr(lib, 'PyExc_UnicodeTranslateError');

-

-  PyType_Type                := getProcAddr(lib, 'PyType_Type');

-  PyCFunction_Type           := getProcAddr(lib, 'PyCFunction_Type');

-  PyCObject_Type             := getProcAddr(lib, 'PyCObject_Type');

-  PyClass_Type               := getProcAddr(lib, 'PyClass_Type');

-  PyCode_Type                := getProcAddr(lib, 'PyCode_Type');

-  PyComplex_Type             := getProcAddr(lib, 'PyComplex_Type');

-  PyDict_Type                := getProcAddr(lib, 'PyDict_Type');

-  PyFile_Type                := getProcAddr(lib, 'PyFile_Type');

-  PyFloat_Type               := getProcAddr(lib, 'PyFloat_Type');

-  PyFrame_Type               := getProcAddr(lib, 'PyFrame_Type');

-  PyFunction_Type            := getProcAddr(lib, 'PyFunction_Type');

-  PyInstance_Type            := getProcAddr(lib, 'PyInstance_Type');

-  PyInt_Type                 := getProcAddr(lib, 'PyInt_Type');

-  PyList_Type                := getProcAddr(lib, 'PyList_Type');

-  PyLong_Type                := getProcAddr(lib, 'PyLong_Type');

-  PyMethod_Type              := getProcAddr(lib, 'PyMethod_Type');

-  PyModule_Type              := getProcAddr(lib, 'PyModule_Type');

-  PyObject_Type              := getProcAddr(lib, 'PyObject_Type');

-  PyRange_Type               := getProcAddr(lib, 'PyRange_Type');

-  PySlice_Type               := getProcAddr(lib, 'PySlice_Type');

-  PyString_Type              := getProcAddr(lib, 'PyString_Type');

-  PyTuple_Type               := getProcAddr(lib, 'PyTuple_Type');

-

-  PyUnicode_Type             := getProcAddr(lib, 'PyUnicode_Type');

-

-  PyBaseObject_Type          := getProcAddr(lib, 'PyBaseObject_Type');

-  PyBuffer_Type              := getProcAddr(lib, 'PyBuffer_Type');

-  PyCallIter_Type            := getProcAddr(lib, 'PyCallIter_Type');

-  PyCell_Type                := getProcAddr(lib, 'PyCell_Type');

-  PyClassMethod_Type         := getProcAddr(lib, 'PyClassMethod_Type');

-  PyProperty_Type            := getProcAddr(lib, 'PyProperty_Type');

-  PySeqIter_Type             := getProcAddr(lib, 'PySeqIter_Type');

-  PyStaticMethod_Type        := getProcAddr(lib, 'PyStaticMethod_Type');

-  PySuper_Type               := getProcAddr(lib, 'PySuper_Type');

-  PySymtableEntry_Type       := getProcAddr(lib, 'PySymtableEntry_Type');

-  PyTraceBack_Type           := getProcAddr(lib, 'PyTraceBack_Type');

-  PyWrapperDescr_Type        := getProcAddr(lib, 'PyWrapperDescr_Type');

-

-  PyBaseString_Type          := getProcAddr(lib, 'PyBaseString_Type');

-  PyBool_Type                := getProcAddr(lib, 'PyBool_Type');

-  PyEnum_Type                := getProcAddr(lib, 'PyEnum_Type');

-

-

-  //PyArg_GetObject           := getProcAddr(lib, 'PyArg_GetObject');

-  //PyArg_GetLong             := getProcAddr(lib, 'PyArg_GetLong');

-  //PyArg_GetShort            := getProcAddr(lib, 'PyArg_GetShort');

-  //PyArg_GetFloat            := getProcAddr(lib, 'PyArg_GetFloat');

-  //PyArg_GetString           := getProcAddr(lib, 'PyArg_GetString');

-  //PyArgs_VaParse            := getProcAddr(lib, 'PyArgs_VaParse');

-  //Py_VaBuildValue           := getProcAddr(lib, 'Py_VaBuildValue');

-  //PyBuiltin_Init            := getProcAddr(lib, 'PyBuiltin_Init');

-  PyComplex_FromCComplex    := getProcAddr(lib, 'PyComplex_FromCComplex');

-  PyComplex_FromDoubles     := getProcAddr(lib, 'PyComplex_FromDoubles');

-  PyComplex_RealAsDouble    := getProcAddr(lib, 'PyComplex_RealAsDouble');

-  PyComplex_ImagAsDouble    := getProcAddr(lib, 'PyComplex_ImagAsDouble');

-  PyComplex_AsCComplex      := getProcAddr(lib, 'PyComplex_AsCComplex');

-  PyCFunction_GetFunction   := getProcAddr(lib, 'PyCFunction_GetFunction');

-  PyCFunction_GetSelf       := getProcAddr(lib, 'PyCFunction_GetSelf');

-  PyCallable_Check          := getProcAddr(lib, 'PyCallable_Check');

-  PyCObject_FromVoidPtr     := getProcAddr(lib, 'PyCObject_FromVoidPtr');

-  PyCObject_AsVoidPtr       := getProcAddr(lib, 'PyCObject_AsVoidPtr');

-  PyClass_New               := getProcAddr(lib, 'PyClass_New');

-  PyClass_IsSubclass        := getProcAddr(lib, 'PyClass_IsSubclass');

-  PyDict_GetItem            := getProcAddr(lib, 'PyDict_GetItem');

-  PyDict_SetItem            := getProcAddr(lib, 'PyDict_SetItem');

-  PyDict_DelItem            := getProcAddr(lib, 'PyDict_DelItem');

-  PyDict_Clear              := getProcAddr(lib, 'PyDict_Clear');

-  PyDict_Next               := getProcAddr(lib, 'PyDict_Next');

-  PyDict_Keys               := getProcAddr(lib, 'PyDict_Keys');

-  PyDict_Values             := getProcAddr(lib, 'PyDict_Values');

-  PyDict_Items              := getProcAddr(lib, 'PyDict_Items');

-  PyDict_Size               := getProcAddr(lib, 'PyDict_Size');

-  PyDict_DelItemString      := getProcAddr(lib, 'PyDict_DelItemString');

-  PyDictProxy_New           := getProcAddr(lib, 'PyDictProxy_New');

-  Py_InitModule4            := getProcAddr(lib, 'Py_InitModule4');

-  PyErr_Print               := getProcAddr(lib, 'PyErr_Print');

-  PyErr_SetNone             := getProcAddr(lib, 'PyErr_SetNone');

-  PyErr_SetObject           := getProcAddr(lib, 'PyErr_SetObject');

-  PyErr_Restore             := getProcAddr(lib, 'PyErr_Restore');

-  PyErr_BadArgument         := getProcAddr(lib, 'PyErr_BadArgument');

-  PyErr_NoMemory            := getProcAddr(lib, 'PyErr_NoMemory');

-  PyErr_SetFromErrno        := getProcAddr(lib, 'PyErr_SetFromErrno');

-  PyErr_BadInternalCall     := getProcAddr(lib, 'PyErr_BadInternalCall');

-  PyErr_CheckSignals        := getProcAddr(lib, 'PyErr_CheckSignals');

-  PyErr_Occurred            := getProcAddr(lib, 'PyErr_Occurred');

-  PyErr_Clear               := getProcAddr(lib, 'PyErr_Clear');

-  PyErr_Fetch               := getProcAddr(lib, 'PyErr_Fetch');

-  PyErr_SetString           := getProcAddr(lib, 'PyErr_SetString');

-  PyEval_GetBuiltins        := getProcAddr(lib, 'PyEval_GetBuiltins');

-  PyImport_GetModuleDict    := getProcAddr(lib, 'PyImport_GetModuleDict');

-  PyInt_FromLong            := getProcAddr(lib, 'PyInt_FromLong');

-  PyArg_ParseTuple      := getProcAddr(lib, 'PyArg_ParseTuple');

-  PyArg_Parse           := getProcAddr(lib, 'PyArg_Parse');

-  Py_BuildValue         := getProcAddr(lib, 'Py_BuildValue');

-  Py_Initialize             := getProcAddr(lib, 'Py_Initialize');

-  PyDict_New                := getProcAddr(lib, 'PyDict_New');

-  PyDict_SetItemString      := getProcAddr(lib, 'PyDict_SetItemString');

-  PyModule_GetDict          := getProcAddr(lib, 'PyModule_GetDict');

-  PyObject_Str              := getProcAddr(lib, 'PyObject_Str');

-  PyRun_String              := getProcAddr(lib, 'PyRun_String');

-  PyRun_SimpleString        := getProcAddr(lib, 'PyRun_SimpleString');

-  PyDict_GetItemString      := getProcAddr(lib, 'PyDict_GetItemString');

-  PyString_AsString         := getProcAddr(lib, 'PyString_AsString');

-  PyString_FromString       := getProcAddr(lib, 'PyString_FromString');

-  PySys_SetArgv             := getProcAddr(lib, 'PySys_SetArgv');

-  Py_Exit                   := getProcAddr(lib, 'Py_Exit');

-

-  PyCFunction_New           :=getProcAddr(lib, 'PyCFunction_New');

-  PyEval_CallObject         :=getProcAddr(lib, 'PyEval_CallObject');

-  PyEval_CallObjectWithKeywords:=getProcAddr(lib, 'PyEval_CallObjectWithKeywords');

-  PyEval_GetFrame           :=getProcAddr(lib, 'PyEval_GetFrame');

-  PyEval_GetGlobals         :=getProcAddr(lib, 'PyEval_GetGlobals');

-  PyEval_GetLocals          :=getProcAddr(lib, 'PyEval_GetLocals');

-  //PyEval_GetOwner           :=getProcAddr(lib, 'PyEval_GetOwner');

-  PyEval_GetRestricted      :=getProcAddr(lib, 'PyEval_GetRestricted');

-  PyEval_InitThreads        :=getProcAddr(lib, 'PyEval_InitThreads');

-  PyEval_RestoreThread      :=getProcAddr(lib, 'PyEval_RestoreThread');

-  PyEval_SaveThread         :=getProcAddr(lib, 'PyEval_SaveThread');

-  PyFile_FromString         :=getProcAddr(lib, 'PyFile_FromString');

-  PyFile_GetLine            :=getProcAddr(lib, 'PyFile_GetLine');

-  PyFile_Name               :=getProcAddr(lib, 'PyFile_Name');

-  PyFile_SetBufSize         :=getProcAddr(lib, 'PyFile_SetBufSize');

-  PyFile_SoftSpace          :=getProcAddr(lib, 'PyFile_SoftSpace');

-  PyFile_WriteObject        :=getProcAddr(lib, 'PyFile_WriteObject');

-  PyFile_WriteString        :=getProcAddr(lib, 'PyFile_WriteString');

-  PyFloat_AsDouble          :=getProcAddr(lib, 'PyFloat_AsDouble');

-  PyFloat_FromDouble        :=getProcAddr(lib, 'PyFloat_FromDouble');

-  PyFunction_GetCode        :=getProcAddr(lib, 'PyFunction_GetCode');

-  PyFunction_GetGlobals     :=getProcAddr(lib, 'PyFunction_GetGlobals');

-  PyFunction_New            :=getProcAddr(lib, 'PyFunction_New');

-  PyImport_AddModule        :=getProcAddr(lib, 'PyImport_AddModule');

-  PyImport_Cleanup          :=getProcAddr(lib, 'PyImport_Cleanup');

-  PyImport_GetMagicNumber   :=getProcAddr(lib, 'PyImport_GetMagicNumber');

-  PyImport_ImportFrozenModule:=getProcAddr(lib, 'PyImport_ImportFrozenModule');

-  PyImport_ImportModule     :=getProcAddr(lib, 'PyImport_ImportModule');

-  PyImport_Import           :=getProcAddr(lib, 'PyImport_Import');

-  //@PyImport_Init             :=getProcAddr(lib, 'PyImport_Init');

-  PyImport_ReloadModule     :=getProcAddr(lib, 'PyImport_ReloadModule');

-  PyInstance_New            :=getProcAddr(lib, 'PyInstance_New');

-  PyInt_AsLong              :=getProcAddr(lib, 'PyInt_AsLong');

-  PyList_Append             :=getProcAddr(lib, 'PyList_Append');

-  PyList_AsTuple            :=getProcAddr(lib, 'PyList_AsTuple');

-  PyList_GetItem            :=getProcAddr(lib, 'PyList_GetItem');

-  PyList_GetSlice           :=getProcAddr(lib, 'PyList_GetSlice');

-  PyList_Insert             :=getProcAddr(lib, 'PyList_Insert');

-  PyList_New                :=getProcAddr(lib, 'PyList_New');

-  PyList_Reverse            :=getProcAddr(lib, 'PyList_Reverse');

-  PyList_SetItem            :=getProcAddr(lib, 'PyList_SetItem');

-  PyList_SetSlice           :=getProcAddr(lib, 'PyList_SetSlice');

-  PyList_Size               :=getProcAddr(lib, 'PyList_Size');

-  PyList_Sort               :=getProcAddr(lib, 'PyList_Sort');

-  PyLong_AsDouble           :=getProcAddr(lib, 'PyLong_AsDouble');

-  PyLong_AsLong             :=getProcAddr(lib, 'PyLong_AsLong');

-  PyLong_FromDouble         :=getProcAddr(lib, 'PyLong_FromDouble');

-  PyLong_FromLong           :=getProcAddr(lib, 'PyLong_FromLong');

-  PyLong_FromString         :=getProcAddr(lib, 'PyLong_FromString');

-  PyLong_FromString         :=getProcAddr(lib, 'PyLong_FromString');

-  PyLong_FromUnsignedLong   :=getProcAddr(lib, 'PyLong_FromUnsignedLong');

-  PyLong_AsUnsignedLong     :=getProcAddr(lib, 'PyLong_AsUnsignedLong');

-  PyLong_FromUnicode        :=getProcAddr(lib, 'PyLong_FromUnicode');

-  PyLong_FromLongLong       :=getProcAddr(lib, 'PyLong_FromLongLong');

-  PyLong_AsLongLong         :=getProcAddr(lib, 'PyLong_AsLongLong');

-

-  PyMapping_Check           :=getProcAddr(lib, 'PyMapping_Check');

-  PyMapping_GetItemString   :=getProcAddr(lib, 'PyMapping_GetItemString');

-  PyMapping_HasKey          :=getProcAddr(lib, 'PyMapping_HasKey');

-  PyMapping_HasKeyString    :=getProcAddr(lib, 'PyMapping_HasKeyString');

-  PyMapping_Length          :=getProcAddr(lib, 'PyMapping_Length');

-  PyMapping_SetItemString   :=getProcAddr(lib, 'PyMapping_SetItemString');

-  PyMethod_Class            :=getProcAddr(lib, 'PyMethod_Class');

-  PyMethod_Function         :=getProcAddr(lib, 'PyMethod_Function');

-  PyMethod_New              :=getProcAddr(lib, 'PyMethod_New');

-  PyMethod_Self             :=getProcAddr(lib, 'PyMethod_Self');

-  PyModule_GetName          :=getProcAddr(lib, 'PyModule_GetName');

-  PyModule_New              :=getProcAddr(lib, 'PyModule_New');

-  PyNumber_Absolute         :=getProcAddr(lib, 'PyNumber_Absolute');

-  PyNumber_Add              :=getProcAddr(lib, 'PyNumber_Add');

-  PyNumber_And              :=getProcAddr(lib, 'PyNumber_And');

-  PyNumber_Check            :=getProcAddr(lib, 'PyNumber_Check');

-  PyNumber_Coerce           :=getProcAddr(lib, 'PyNumber_Coerce');

-  PyNumber_Divide           :=getProcAddr(lib, 'PyNumber_Divide');

-

-  PyNumber_FloorDivide      :=getProcAddr(lib, 'PyNumber_FloorDivide');

-  PyNumber_TrueDivide       :=getProcAddr(lib, 'PyNumber_TrueDivide');

-  PyNumber_Divmod           :=getProcAddr(lib, 'PyNumber_Divmod');

-  PyNumber_Float            :=getProcAddr(lib, 'PyNumber_Float');

-  PyNumber_Int              :=getProcAddr(lib, 'PyNumber_Int');

-  PyNumber_Invert           :=getProcAddr(lib, 'PyNumber_Invert');

-  PyNumber_Long             :=getProcAddr(lib, 'PyNumber_Long');

-  PyNumber_Lshift           :=getProcAddr(lib, 'PyNumber_Lshift');

-  PyNumber_Multiply         :=getProcAddr(lib, 'PyNumber_Multiply');

-  PyNumber_Negative         :=getProcAddr(lib, 'PyNumber_Negative');

-  PyNumber_Or               :=getProcAddr(lib, 'PyNumber_Or');

-  PyNumber_Positive         :=getProcAddr(lib, 'PyNumber_Positive');

-  PyNumber_Power            :=getProcAddr(lib, 'PyNumber_Power');

-  PyNumber_Remainder        :=getProcAddr(lib, 'PyNumber_Remainder');

-  PyNumber_Rshift           :=getProcAddr(lib, 'PyNumber_Rshift');

-  PyNumber_Subtract         :=getProcAddr(lib, 'PyNumber_Subtract');

-  PyNumber_Xor              :=getProcAddr(lib, 'PyNumber_Xor');

-  PyOS_InitInterrupts       :=getProcAddr(lib, 'PyOS_InitInterrupts');

-  PyOS_InterruptOccurred    :=getProcAddr(lib, 'PyOS_InterruptOccurred');

-  PyObject_CallObject       :=getProcAddr(lib, 'PyObject_CallObject');

-  PyObject_Compare          :=getProcAddr(lib, 'PyObject_Compare');

-  PyObject_GetAttr          :=getProcAddr(lib, 'PyObject_GetAttr');

-  PyObject_GetAttrString    :=getProcAddr(lib, 'PyObject_GetAttrString');

-  PyObject_GetItem          :=getProcAddr(lib, 'PyObject_GetItem');

-  PyObject_DelItem          :=getProcAddr(lib, 'PyObject_DelItem');

-  PyObject_HasAttrString    :=getProcAddr(lib, 'PyObject_HasAttrString');

-  PyObject_Hash             :=getProcAddr(lib, 'PyObject_Hash');

-  PyObject_IsTrue           :=getProcAddr(lib, 'PyObject_IsTrue');

-  PyObject_Length           :=getProcAddr(lib, 'PyObject_Length');

-  PyObject_Repr             :=getProcAddr(lib, 'PyObject_Repr');

-  PyObject_SetAttr          :=getProcAddr(lib, 'PyObject_SetAttr');

-  PyObject_SetAttrString    :=getProcAddr(lib, 'PyObject_SetAttrString');

-  PyObject_SetItem          :=getProcAddr(lib, 'PyObject_SetItem');

-

-  PyObject_Init             :=getProcAddr(lib, 'PyObject_Init');

-  PyObject_InitVar          :=getProcAddr(lib, 'PyObject_InitVar');

-  PyObject_New              :=getProcAddr(lib, '_PyObject_New');

-  PyObject_NewVar           :=getProcAddr(lib, '_PyObject_NewVar');

-  PyObject_Free             :=getProcAddr(lib, 'PyObject_Free');

-

-  PyObject_IsInstance       :=getProcAddr(lib, 'PyObject_IsInstance');

-  PyObject_IsSubclass       :=getProcAddr(lib, 'PyObject_IsSubclass');

-

-  PyObject_GenericGetAttr   :=getProcAddr(lib, 'PyObject_GenericGetAttr');

-  PyObject_GenericSetAttr   :=getProcAddr(lib, 'PyObject_GenericSetAttr');

-

-  PyObject_GC_Malloc         :=getProcAddr(lib, '_PyObject_GC_Malloc');

-  PyObject_GC_New            :=getProcAddr(lib, '_PyObject_GC_New');

-  PyObject_GC_NewVar         :=getProcAddr(lib, '_PyObject_GC_NewVar');

-  PyObject_GC_Resize         :=getProcAddr(lib, '_PyObject_GC_Resize');

-  PyObject_GC_Del            :=getProcAddr(lib, 'PyObject_GC_Del');

-  PyObject_GC_Track          :=getProcAddr(lib, 'PyObject_GC_Track');

-  PyObject_GC_UnTrack        :=getProcAddr(lib, 'PyObject_GC_UnTrack');

-

-  PyRange_New               :=getProcAddr(lib, 'PyRange_New');

-  PySequence_Check          :=getProcAddr(lib, 'PySequence_Check');

-  PySequence_Concat         :=getProcAddr(lib, 'PySequence_Concat');

-  PySequence_Count          :=getProcAddr(lib, 'PySequence_Count');

-  PySequence_GetItem        :=getProcAddr(lib, 'PySequence_GetItem');

-  PySequence_GetSlice       :=getProcAddr(lib, 'PySequence_GetSlice');

-  PySequence_In             :=getProcAddr(lib, 'PySequence_In');

-  PySequence_Index          :=getProcAddr(lib, 'PySequence_Index');

-  PySequence_Length         :=getProcAddr(lib, 'PySequence_Length');

-  PySequence_Repeat         :=getProcAddr(lib, 'PySequence_Repeat');

-  PySequence_SetItem        :=getProcAddr(lib, 'PySequence_SetItem');

-  PySequence_SetSlice       :=getProcAddr(lib, 'PySequence_SetSlice');

-  PySequence_DelSlice       :=getProcAddr(lib, 'PySequence_DelSlice');

-  PySequence_Tuple          :=getProcAddr(lib, 'PySequence_Tuple');

-  PySequence_Contains       :=getProcAddr(lib, 'PySequence_Contains');

-  PySlice_GetIndices        :=getProcAddr(lib, 'PySlice_GetIndices');

-  PySlice_GetIndicesEx      :=getProcAddr(lib, 'PySlice_GetIndicesEx');

-  PySlice_New               :=getProcAddr(lib, 'PySlice_New');

-  PyString_Concat           :=getProcAddr(lib, 'PyString_Concat');

-  PyString_ConcatAndDel     :=getProcAddr(lib, 'PyString_ConcatAndDel');

-  PyString_Format           :=getProcAddr(lib, 'PyString_Format');

-  PyString_FromStringAndSize:=getProcAddr(lib, 'PyString_FromStringAndSize');

-  PyString_Size             :=getProcAddr(lib, 'PyString_Size');

-  PyString_DecodeEscape     :=getProcAddr(lib, 'PyString_DecodeEscape');

-  PyString_Repr             :=getProcAddr(lib, 'PyString_Repr');

-  PySys_GetObject           :=getProcAddr(lib, 'PySys_GetObject');

-  //PySys_Init                :=getProcAddr(lib, 'PySys_Init');

-  PySys_SetObject           :=getProcAddr(lib, 'PySys_SetObject');

-  PySys_SetPath             :=getProcAddr(lib, 'PySys_SetPath');

-  //PyTraceBack_Fetch         :=getProcAddr(lib, 'PyTraceBack_Fetch');

-  PyTraceBack_Here          :=getProcAddr(lib, 'PyTraceBack_Here');

-  PyTraceBack_Print         :=getProcAddr(lib, 'PyTraceBack_Print');

-  //PyTraceBack_Store         :=getProcAddr(lib, 'PyTraceBack_Store');

-  PyTuple_GetItem           :=getProcAddr(lib, 'PyTuple_GetItem');

-  PyTuple_GetSlice          :=getProcAddr(lib, 'PyTuple_GetSlice');

-  PyTuple_New               :=getProcAddr(lib, 'PyTuple_New');

-  PyTuple_SetItem           :=getProcAddr(lib, 'PyTuple_SetItem');

-  PyTuple_Size              :=getProcAddr(lib, 'PyTuple_Size');

-

-  PyType_IsSubtype          :=getProcAddr(lib, 'PyType_IsSubtype');

-  PyType_GenericAlloc       :=getProcAddr(lib, 'PyType_GenericAlloc');

-  PyType_GenericNew         :=getProcAddr(lib, 'PyType_GenericNew');

-  PyType_Ready              :=getProcAddr(lib, 'PyType_Ready');

-

-  PyUnicode_FromWideChar    :=getProcAddr(lib, 'PyUnicodeUCS2_FromWideChar');

-  PyUnicode_AsWideChar      :=getProcAddr(lib, 'PyUnicodeUCS2_AsWideChar');

-  PyUnicode_FromOrdinal     :=getProcAddr(lib, 'PyUnicodeUCS2_FromOrdinal');

-

-  PyWeakref_GetObject       :=getProcAddr(lib, 'PyWeakref_GetObject');

-  PyWeakref_NewProxy        :=getProcAddr(lib, 'PyWeakref_NewProxy');

-  PyWeakref_NewRef          :=getProcAddr(lib, 'PyWeakref_NewRef');

-  PyWrapper_New             :=getProcAddr(lib, 'PyWrapper_New');

-

-  PyBool_FromLong           :=getProcAddr(lib, 'PyBool_FromLong'); 

-

-  Py_AtExit                 :=getProcAddr(lib, 'Py_AtExit');

-  //Py_Cleanup                :=getProcAddr(lib, 'Py_Cleanup');

-  Py_CompileString          :=getProcAddr(lib, 'Py_CompileString');

-  Py_FatalError             :=getProcAddr(lib, 'Py_FatalError');

-  Py_FindMethod             :=getProcAddr(lib, 'Py_FindMethod');

-  Py_FindMethodInChain      :=getProcAddr(lib, 'Py_FindMethodInChain');

-  Py_FlushLine              :=getProcAddr(lib, 'Py_FlushLine');

-  Py_Finalize                :=getProcAddr(lib, 'Py_Finalize');

-  PyCode_Addr2Line     := getProcAddr(lib, 'PyCode_Addr2Line');

-  PyClass_IsSubclass         :=getProcAddr(lib, 'PyClass_IsSubclass');

-  PyErr_ExceptionMatches     :=getProcAddr(lib, 'PyErr_ExceptionMatches');

-  PyErr_GivenExceptionMatches:=getProcAddr(lib, 'PyErr_GivenExceptionMatches');

-  PyEval_EvalCode            :=getProcAddr(lib, 'PyEval_EvalCode');

-  Py_GetVersion              :=getProcAddr(lib, 'Py_GetVersion');

-  Py_GetCopyright            :=getProcAddr(lib, 'Py_GetCopyright');

-  Py_GetExecPrefix           :=getProcAddr(lib, 'Py_GetExecPrefix');

-  Py_GetPath                 :=getProcAddr(lib, 'Py_GetPath');

-  Py_GetPrefix               :=getProcAddr(lib, 'Py_GetPrefix');

-  Py_GetProgramName          :=getProcAddr(lib, 'Py_GetProgramName');

-  PyParser_SimpleParseString :=getProcAddr(lib, 'PyParser_SimpleParseString');

-  PyNode_Free                :=getProcAddr(lib, 'PyNode_Free');

-  PyErr_NewException         :=getProcAddr(lib, 'PyErr_NewException');

-/// jah 29-sep-2000 : updated for python 2.0

-///                   replaced Py_Malloc with PyMem_Malloc

-///---   @Py_Malloc := Import ('Py_Malloc');

-///+++   @Py_Malloc := Import ('PyMem_Malloc');

-  Py_Malloc := getProcAddr(lib, 'PyMem_Malloc');

-  PyMem_Malloc := getProcAddr(lib, 'PyMem_Malloc');

-  PyObject_CallMethod        := getProcAddr(lib, 'PyObject_CallMethod');

-  Py_SetProgramName        := getProcAddr(lib, 'Py_SetProgramName');

-  Py_IsInitialized         := getProcAddr(lib, 'Py_IsInitialized');

-  Py_GetProgramFullPath    := getProcAddr(lib, 'Py_GetProgramFullPath');

-  DLL_Py_GetBuildInfo    := getProcAddr(lib, 'Py_GetBuildInfo');

-  Py_NewInterpreter        := getProcAddr(lib, 'Py_NewInterpreter');

-  Py_EndInterpreter        := getProcAddr(lib, 'Py_EndInterpreter');

-  PyEval_AcquireLock       := getProcAddr(lib, 'PyEval_AcquireLock');

-  PyEval_ReleaseLock       := getProcAddr(lib, 'PyEval_ReleaseLock');

-  PyEval_AcquireThread     := getProcAddr(lib, 'PyEval_AcquireThread');

-  PyEval_ReleaseThread     := getProcAddr(lib, 'PyEval_ReleaseThread');

-  PyInterpreterState_New   := getProcAddr(lib, 'PyInterpreterState_New');

-  PyInterpreterState_Clear := getProcAddr(lib, 'PyInterpreterState_Clear');

-  PyInterpreterState_Delete:= getProcAddr(lib, 'PyInterpreterState_Delete');

-  PyThreadState_New        := getProcAddr(lib, 'PyThreadState_New');

-  PyThreadState_Clear      := getProcAddr(lib, 'PyThreadState_Clear');

-  PyThreadState_Delete     := getProcAddr(lib, 'PyThreadState_Delete');

-  PyThreadState_Get        := getProcAddr(lib, 'PyThreadState_Get');

-  PyThreadState_Swap       := getProcAddr(lib, 'PyThreadState_Swap');

-end;

-

-var

-  lib: TLibHandle;

-initialization

-  lib := loadLibrary(dllName);

-  if lib <> NilLibHandle then init(lib);

-end.

diff --git a/lib/base/gtk/atk.nim b/lib/base/gtk/atk.nim
index 84017bf03..8004eccfc 100644
--- a/lib/base/gtk/atk.nim
+++ b/lib/base/gtk/atk.nim
@@ -55,7 +55,7 @@ type
     ATK_LAYER_INVALID, ATK_LAYER_BACKGROUND, ATK_LAYER_CANVAS, ATK_LAYER_WIDGET,
     ATK_LAYER_MDI, ATK_LAYER_POPUP, ATK_LAYER_OVERLAY
   PAtkPropertyValues* = ptr TAtkPropertyValues
-  TAtkPropertyValues* {.final.} = object
+  TAtkPropertyValues* {.final, pure.} = object
     property_name*: cstring
     old_value*: TGValue
     new_value*: TGValue
@@ -378,7 +378,7 @@ type
 
   TAtkAttributeSet* = TGSList
   PAtkAttribute* = ptr TAtkAttribute
-  TAtkAttribute* {.final.} = object
+  TAtkAttribute* {.final, pure.} = object
     name*: cstring
     value*: cstring
 
@@ -452,7 +452,7 @@ type
   TAtkEventListenerInitProc* = proc ()
   TAtkEventListenerInit* = proc (para1: TAtkEventListenerInitProc){.cdecl.}
   PAtkKeyEventStruct* = ptr TAtkKeyEventStruct
-  TAtkKeyEventStruct* {.final.} = object
+  TAtkKeyEventStruct* {.final, pure.} = object
     `type`*: gint
     state*: guint
     keyval*: guint
diff --git a/lib/base/gtk/gdk2.nim b/lib/base/gtk/gdk2.nim
index 497f5619f..66838ab99 100644
--- a/lib/base/gtk/gdk2.nim
+++ b/lib/base/gtk/gdk2.nim
@@ -31,7 +31,7 @@ type
   TGdkVisualClass* = object of TGObjectClass
 
   PGdkColor* = ptr TGdkColor
-  TGdkColor* {.final.} = object
+  TGdkColor* {.final, pure.} = object
     pixel*: guint32
     red*: guint16
     green*: guint16
@@ -51,7 +51,7 @@ type
   TGdkFontType* = enum
     GDK_FONT_FONT, GDK_FONT_FONTSET
   PGdkFont* = ptr TGdkFont
-  TGdkFont* {.final.} = object
+  TGdkFont* {.final, pure.} = object
     `type`*: TGdkFontType
     ascent*: gint
     descent*: gint
@@ -78,7 +78,7 @@ type
   PGdkGCValuesMask* = ptr TGdkGCValuesMask
   TGdkGCValuesMask* = int32
   PGdkGCValues* = ptr TGdkGCValues
-  TGdkGCValues* {.final.} = object
+  TGdkGCValues* {.final, pure.} = object
     foreground*: TGdkColor
     background*: TGdkColor
     font*: PGdkFont
@@ -124,7 +124,7 @@ type
   TGdkInputCondition* = int32
   PGdkStatus* = ptr TGdkStatus
   TGdkStatus* = int32
-  TGdkPoint* {.final.} = object
+  TGdkPoint* {.final, pure.} = object
     x*: gint
     y*: gint
 
@@ -134,14 +134,14 @@ type
   PGdkWChar* = ptr TGdkWChar
   TGdkWChar* = guint32
   PGdkSegment* = ptr TGdkSegment
-  TGdkSegment* {.final.} = object
+  TGdkSegment* {.final, pure.} = object
     x1*: gint
     y1*: gint
     x2*: gint
     y2*: gint
 
   PGdkRectangle* = ptr TGdkRectangle
-  TGdkRectangle* {.final.} = object
+  TGdkRectangle* {.final, pure.} = object
     x*: gint
     y*: gint
     width*: gint
@@ -189,7 +189,7 @@ type
   PGdkCursorType* = ptr TGdkCursorType
   TGdkCursorType* = gint
   PGdkCursor* = ptr TGdkCursor
-  TGdkCursor* {.final.} = object
+  TGdkCursor* {.final, pure.} = object
     `type`*: TGdkCursorType
     ref_count*: guint
 
@@ -219,14 +219,14 @@ type
   PGdkRegionBox* = ptr TGdkRegionBox
   TGdkRegionBox* = TGdkSegment
   PGdkRegion* = ptr TGdkRegion
-  TGdkRegion* {.final.} = object
+  TGdkRegion* {.final, pure.} = object
     size*: int32
     numRects*: int32
     rects*: PGdkRegionBox
     extents*: TGdkRegionBox
 
   PPOINTBLOCK* = ptr TPOINTBLOCK
-  TPOINTBLOCK* {.final.} = object
+  TPOINTBLOCK* {.final, pure.} = object
     pts*: array[0..(NUMPTSTOBUFFER) - 1, TGdkPoint]
     next*: PPOINTBLOCK
 
@@ -335,13 +335,13 @@ type
     GDK_SETTING_ACTION_NEW, GDK_SETTING_ACTION_CHANGED,
     GDK_SETTING_ACTION_DELETED
   PGdkEventAny* = ptr TGdkEventAny
-  TGdkEventAny* {.final.} = object
+  TGdkEventAny* {.final, pure.} = object
     `type`*: TGdkEventType
     window*: PGdkWindow
     send_event*: gint8
 
   PGdkEventExpose* = ptr TGdkEventExpose
-  TGdkEventExpose* {.final.} = object
+  TGdkEventExpose* {.final, pure.} = object
     `type`*: TGdkEventType
     window*: PGdkWindow
     send_event*: gint8
@@ -350,20 +350,20 @@ type
     count*: gint
 
   PGdkEventNoExpose* = ptr TGdkEventNoExpose
-  TGdkEventNoExpose* {.final.} = object
+  TGdkEventNoExpose* {.final, pure.} = object
     `type`*: TGdkEventType
     window*: PGdkWindow
     send_event*: gint8
 
   PGdkEventVisibility* = ptr TGdkEventVisibility
-  TGdkEventVisibility* {.final.} = object
+  TGdkEventVisibility* {.final, pure.} = object
     `type`*: TGdkEventType
     window*: PGdkWindow
     send_event*: gint8
     state*: TGdkVisibilityState
 
   PGdkEventMotion* = ptr TGdkEventMotion
-  TGdkEventMotion* {.final.} = object
+  TGdkEventMotion* {.final, pure.} = object
     `type`*: TGdkEventType
     window*: PGdkWindow
     send_event*: gint8
@@ -378,7 +378,7 @@ type
     y_root*: gdouble
 
   PGdkEventButton* = ptr TGdkEventButton
-  TGdkEventButton* {.final.} = object
+  TGdkEventButton* {.final, pure.} = object
     `type`*: TGdkEventType
     window*: PGdkWindow
     send_event*: gint8
@@ -393,7 +393,7 @@ type
     y_root*: gdouble
 
   PGdkEventScroll* = ptr TGdkEventScroll
-  TGdkEventScroll* {.final.} = object
+  TGdkEventScroll* {.final, pure.} = object
     `type`*: TGdkEventType
     window*: PGdkWindow
     send_event*: gint8
@@ -407,7 +407,7 @@ type
     y_root*: gdouble
 
   PGdkEventKey* = ptr TGdkEventKey
-  TGdkEventKey* {.final.} = object
+  TGdkEventKey* {.final, pure.} = object
     `type`*: TGdkEventType
     window*: PGdkWindow
     send_event*: gint8
@@ -420,7 +420,7 @@ type
     group*: guint8
 
   PGdkEventCrossing* = ptr TGdkEventCrossing
-  TGdkEventCrossing* {.final.} = object
+  TGdkEventCrossing* {.final, pure.} = object
     `type`*: TGdkEventType
     window*: PGdkWindow
     send_event*: gint8
@@ -436,14 +436,14 @@ type
     state*: guint
 
   PGdkEventFocus* = ptr TGdkEventFocus
-  TGdkEventFocus* {.final.} = object
+  TGdkEventFocus* {.final, pure.} = object
     `type`*: TGdkEventType
     window*: PGdkWindow
     send_event*: gint8
     `in`*: gint16
 
   PGdkEventConfigure* = ptr TGdkEventConfigure
-  TGdkEventConfigure* {.final.} = object
+  TGdkEventConfigure* {.final, pure.} = object
     `type`*: TGdkEventType
     window*: PGdkWindow
     send_event*: gint8
@@ -453,7 +453,7 @@ type
     height*: gint
 
   PGdkEventProperty* = ptr TGdkEventProperty
-  TGdkEventProperty* {.final.} = object
+  TGdkEventProperty* {.final, pure.} = object
     `type`*: TGdkEventType
     window*: PGdkWindow
     send_event*: gint8
@@ -463,7 +463,7 @@ type
 
   TGdkNativeWindow* = pointer
   PGdkEventSelection* = ptr TGdkEventSelection
-  TGdkEventSelection* {.final.} = object
+  TGdkEventSelection* {.final, pure.} = object
     `type`*: TGdkEventType
     window*: PGdkWindow
     send_event*: gint8
@@ -474,7 +474,7 @@ type
     requestor*: TGdkNativeWindow
 
   PGdkEventProximity* = ptr TGdkEventProximity
-  TGdkEventProximity* {.final.} = object
+  TGdkEventProximity* {.final, pure.} = object
     `type`*: TGdkEventType
     window*: PGdkWindow
     send_event*: gint8
@@ -482,11 +482,11 @@ type
     device*: PGdkDevice
 
   PmatDUMMY* = ptr TmatDUMMY
-  TmatDUMMY* {.final.} = object
+  TmatDUMMY* {.final, pure.} = object
     b*: array[0..19, char]
 
   PGdkEventClient* = ptr TGdkEventClient
-  TGdkEventClient* {.final.} = object
+  TGdkEventClient* {.final, pure.} = object
     `type`*: TGdkEventType
     window*: PGdkWindow
     send_event*: gint8
@@ -495,7 +495,7 @@ type
     b*: array[0..19, char]
 
   PGdkEventSetting* = ptr TGdkEventSetting
-  TGdkEventSetting* {.final.} = object
+  TGdkEventSetting* {.final, pure.} = object
     `type`*: TGdkEventType
     window*: PGdkWindow
     send_event*: gint8
@@ -503,7 +503,7 @@ type
     name*: cstring
 
   PGdkEventWindowState* = ptr TGdkEventWindowState
-  TGdkEventWindowState* {.final.} = object
+  TGdkEventWindowState* {.final, pure.} = object
     `type`*: TGdkEventType
     window*: PGdkWindow
     send_event*: gint8
@@ -511,7 +511,7 @@ type
     new_window_state*: TGdkWindowState
 
   PGdkEventDND* = ptr TGdkEventDND
-  TGdkEventDND* {.final.} = object
+  TGdkEventDND* {.final, pure.} = object
     `type`*: TGdkEventType
     window*: PGdkWindow
     send_event*: gint8
@@ -520,7 +520,7 @@ type
     x_root*: gshort
     y_root*: gshort
 
-  TGdkEvent* {.final.} = object
+  TGdkEvent* {.final, pure.} = object
     data*: array[0..255, char] # union of
                                # `type`: TGdkEventType
                                #  any: TGdkEventAny
@@ -584,12 +584,12 @@ type
   PGdkAxisUse* = ptr TGdkAxisUse
   TGdkAxisUse* = int32
   PGdkDeviceKey* = ptr TGdkDeviceKey
-  TGdkDeviceKey* {.final.} = object
+  TGdkDeviceKey* {.final, pure.} = object
     keyval*: guint
     modifiers*: TGdkModifierType
 
   PGdkDeviceAxis* = ptr TGdkDeviceAxis
-  TGdkDeviceAxis* {.final.} = object
+  TGdkDeviceAxis* {.final, pure.} = object
     use*: TGdkAxisUse
     min*: gdouble
     max*: gdouble
@@ -604,12 +604,12 @@ type
     num_keys*: gint
     keys*: PGdkDeviceKey
 
-  TGdkTimeCoord* {.final.} = object
+  TGdkTimeCoord* {.final, pure.} = object
     time*: guint32
     axes*: array[0..(GDK_MAX_TIMECOORD_AXES) - 1, gdouble]
 
   PGdkKeymapKey* = ptr TGdkKeymapKey
-  TGdkKeymapKey* {.final.} = object
+  TGdkKeymapKey* {.final, pure.} = object
     keycode*: guint
     group*: gint
     level*: gint
@@ -623,12 +623,12 @@ type
     direction_changed*: proc (keymap: PGdkKeymap){.cdecl.}
 
   PGdkPangoAttrStipple* = ptr TGdkPangoAttrStipple
-  TGdkPangoAttrStipple* {.final.} = object
+  TGdkPangoAttrStipple* {.final, pure.} = object
     attr*: TPangoAttribute
     stipple*: PGdkBitmap
 
   PGdkPangoAttrEmbossed* = ptr TGdkPangoAttrEmbossed
-  TGdkPangoAttrEmbossed* {.final.} = object
+  TGdkPangoAttrEmbossed* {.final, pure.} = object
     attr*: TPangoAttribute
     embossed*: gboolean
 
@@ -652,7 +652,7 @@ type
     GDK_OVERLAP_RECTANGLE_PART
   TGdkSpanFunc* = proc (span: PGdkSpan, data: gpointer){.cdecl.}
   PGdkRgbCmap* = ptr TGdkRgbCmap
-  TGdkRgbCmap* {.final.} = object
+  TGdkRgbCmap* {.final, pure.} = object
     colors*: array[0..255, guint32]
     n_colors*: gint
     info_list*: PGSList
@@ -697,7 +697,7 @@ type
   TGdkInputFunction* = proc (data: gpointer, source: gint,
                              condition: TGdkInputCondition){.cdecl.}
   TGdkDestroyNotify* = proc (data: gpointer){.cdecl.}
-  TGdkSpan* {.final.} = object
+  TGdkSpan* {.final, pure.} = object
     x*: gint
     y*: gint
     width*: gint
@@ -730,7 +730,7 @@ type
     GDK_WINDOW_EDGE_SOUTH_WEST, GDK_WINDOW_EDGE_SOUTH,
     GDK_WINDOW_EDGE_SOUTH_EAST
   PGdkWindowAttr* = ptr TGdkWindowAttr
-  TGdkWindowAttr* {.final.} = object
+  TGdkWindowAttr* {.final, pure.} = object
     title*: cstring
     event_mask*: gint
     x*: gint
@@ -747,7 +747,7 @@ type
     override_redirect*: gboolean
 
   PGdkGeometry* = ptr TGdkGeometry
-  TGdkGeometry* {.final.} = object
+  TGdkGeometry* {.final, pure.} = object
     min_width*: gint
     min_height*: gint
     max_width*: gint
@@ -761,7 +761,7 @@ type
     win_gravity*: TGdkGravity
 
   PGdkPointerHooks* = ptr TGdkPointerHooks
-  TGdkPointerHooks* {.final.} = object
+  TGdkPointerHooks* {.final, pure.} = object
     get_pointer*: proc (window: PGdkWindow, x: Pgint, y: Pgint,
                         mask: PGdkModifierType): PGdkWindow{.cdecl.}
     window_at_pointer*: proc (screen: PGdkScreen, win_x: Pgint, win_y: Pgint): PGdkWindow{.
diff --git a/lib/base/gtk/gdk2pixbuf.nim b/lib/base/gtk/gdk2pixbuf.nim
index bcf9690e8..8ef3ac0f9 100644
--- a/lib/base/gtk/gdk2pixbuf.nim
+++ b/lib/base/gtk/gdk2pixbuf.nim
@@ -187,12 +187,12 @@ proc gdk_pixbuf_get_option*(pixbuf: PGdkPixbuf, key: cstring): cstring{.cdecl,
     dynlib: gdkpixbuflib, importc: "gdk_pixbuf_get_option".}
 type
   PGdkPixbufLoader* = ptr TGdkPixbufLoader
-  TGdkPixbufLoader* {.final.} = object
+  TGdkPixbufLoader* {.final, pure.} = object
     parent_instance*: TGObject
     priv*: gpointer
 
   PGdkPixbufLoaderClass* = ptr TGdkPixbufLoaderClass
-  TGdkPixbufLoaderClass* {.final.} = object
+  TGdkPixbufLoaderClass* {.final, pure.} = object
     parent_class*: TGObjectClass
     area_prepared*: proc (loader: PGdkPixbufLoader){.cdecl.}
     area_updated*: proc (loader: PGdkPixbufLoader, x: int32, y: int32,
diff --git a/lib/base/gtk/gtk2.nim b/lib/base/gtk/gtk2.nim
index 81e09f85d..22bbd3c6c 100644
--- a/lib/base/gtk/gtk2.nim
+++ b/lib/base/gtk/gtk2.nim
@@ -155,17 +155,17 @@ type
   TGtkSignalFunc* = proc (para1: TGtkSignalFuncProc){.cdecl.}
   PGtkSignalMarshaller* = ptr TGtkSignalMarshaller
   TGtkSignalMarshaller* = TGSignalCMarshaller
-  TGtkArgSignalData* {.final.} = object
+  TGtkArgSignalData* {.final, pure.} = object
     f*: TGtkSignalFunc
     d*: gpointer
 
-  TGtkArg* {.final.} = object
+  TGtkArg* {.final, pure.} = object
     `type`*: TGtkType
     name*: cstring
     d*: gdouble               # was a union type
 
   PGtkTypeInfo* = ptr TGtkTypeInfo
-  TGtkTypeInfo* {.final.} = object
+  TGtkTypeInfo* {.final, pure.} = object
     type_name*: cstring
     object_size*: guint
     class_size*: guint
@@ -188,7 +188,7 @@ type
   TGtkAllocation* = TGdkRectangle
   TGtkCallback* = proc (widget: PGtkWidget, data: gpointer){.cdecl.}
   PGtkRequisition* = ptr TGtkRequisition
-  TGtkRequisition* {.final.} = object
+  TGtkRequisition* {.final, pure.} = object
     width*: gint
     height*: gint
 
@@ -323,7 +323,7 @@ type
     gtk_reserved8*: proc (){.cdecl.}
 
   PGtkWidgetAuxInfo* = ptr TGtkWidgetAuxInfo
-  TGtkWidgetAuxInfo* {.final.} = object
+  TGtkWidgetAuxInfo* {.final, pure.} = object
     x*: gint
     y*: gint
     width*: gint
@@ -331,7 +331,7 @@ type
     flag0*: guint16
 
   PGtkWidgetShapeInfo* = ptr TGtkWidgetShapeInfo
-  TGtkWidgetShapeInfo* {.final.} = object
+  TGtkWidgetShapeInfo* {.final, pure.} = object
     offset_x*: gint16
     offset_y*: gint16
     shape_mask*: PGdkBitmap
@@ -370,12 +370,12 @@ type
     gtk_reserved4: proc (){.cdecl.}
 
   PGtkAccelKey* = ptr TGtkAccelKey
-  TGtkAccelKey* {.final.} = object
+  TGtkAccelKey* {.final, pure.} = object
     accel_key*: guint
     accel_mods*: TGdkModifierType
     flag0*: guint16
 
-  TGtkAccelGroupEntry* {.final.} = object
+  TGtkAccelGroupEntry* {.final, pure.} = object
     key*: TGtkAccelKey
     closure*: PGClosure
     accel_path_quark*: TGQuark
@@ -595,7 +595,7 @@ type
   PGtkBindingSignal* = ptr TGtkBindingSignal
   PGtkBindingArg* = ptr TGtkBindingArg
   PGtkBindingSet* = ptr TGtkBindingSet
-  TGtkBindingSet* {.final.} = object
+  TGtkBindingSet* {.final, pure.} = object
     set_name*: cstring
     priority*: gint
     widget_path_pspecs*: PGSList
@@ -605,7 +605,7 @@ type
     current*: PGtkBindingEntry
     flag0*: guint16
 
-  TGtkBindingEntry* {.final.} = object
+  TGtkBindingEntry* {.final, pure.} = object
     keyval*: guint
     modifiers*: TGdkModifierType
     binding_set*: PGtkBindingSet
@@ -614,13 +614,13 @@ type
     hash_next*: PGtkBindingEntry
     signals*: PGtkBindingSignal
 
-  TGtkBindingSignal* {.final.} = object
+  TGtkBindingSignal* {.final, pure.} = object
     next*: PGtkBindingSignal
     signal_name*: cstring
     n_args*: guint
     args*: PGtkBindingArg
 
-  TGtkBindingArg* {.final.} = object
+  TGtkBindingArg* {.final, pure.} = object
     arg_type*: TGtkType
     d*: gdouble
 
@@ -634,7 +634,7 @@ type
   TGtkBoxClass* = object of TGtkContainerClass
 
   PGtkBoxChild* = ptr TGtkBoxChild
-  TGtkBoxChild* {.final.} = object
+  TGtkBoxChild* {.final, pure.} = object
     widget*: PGtkWidget
     padding*: guint16
     flag0*: guint16
@@ -906,12 +906,12 @@ type
   TGtkCListCompareFunc* = proc (clist: PGtkCList, ptr1: gconstpointer,
                                 ptr2: gconstpointer): gint{.cdecl.}
   PGtkCListCellInfo* = ptr TGtkCListCellInfo
-  TGtkCListCellInfo* {.final.} = object
+  TGtkCListCellInfo* {.final, pure.} = object
     row*: gint
     column*: gint
 
   PGtkCListDestInfo* = ptr TGtkCListDestInfo
-  TGtkCListDestInfo* {.final.} = object
+  TGtkCListDestInfo* {.final, pure.} = object
     cell*: TGtkCListCellInfo
     insert_pos*: TGtkCListDragPos
 
@@ -1014,7 +1014,7 @@ type
 
   PGPtrArray = pointer
   PGArray = pointer
-  TGtkCListColumn* {.final.} = object
+  TGtkCListColumn* {.final, pure.} = object
     title*: cstring
     area*: TGdkRectangle
     button*: PGtkWidget
@@ -1025,7 +1025,7 @@ type
     justification*: TGtkJustification
     flag0*: guint16
 
-  TGtkCListRow* {.final.} = object
+  TGtkCListRow* {.final, pure.} = object
     cell*: PGtkCell
     state*: TGtkStateType
     foreground*: TGdkColor
@@ -1036,7 +1036,7 @@ type
     flag0*: guint16
 
   PGtkCellText* = ptr TGtkCellText
-  TGtkCellText* {.final.} = object
+  TGtkCellText* {.final, pure.} = object
     `type`*: TGtkCellType
     vertical*: gint16
     horizontal*: gint16
@@ -1044,7 +1044,7 @@ type
     text*: cstring
 
   PGtkCellPixmap* = ptr TGtkCellPixmap
-  TGtkCellPixmap* {.final.} = object
+  TGtkCellPixmap* {.final, pure.} = object
     `type`*: TGtkCellType
     vertical*: gint16
     horizontal*: gint16
@@ -1053,7 +1053,7 @@ type
     mask*: PGdkBitmap
 
   PGtkCellPixText* = ptr TGtkCellPixText
-  TGtkCellPixText* {.final.} = object
+  TGtkCellPixText* {.final, pure.} = object
     `type`*: TGtkCellType
     vertical*: gint16
     horizontal*: gint16
@@ -1064,14 +1064,14 @@ type
     mask*: PGdkBitmap
 
   PGtkCellWidget* = ptr TGtkCellWidget
-  TGtkCellWidget* {.final.} = object
+  TGtkCellWidget* {.final, pure.} = object
     `type`*: TGtkCellType
     vertical*: gint16
     horizontal*: gint16
     style*: PGtkStyle
     widget*: PGtkWidget
 
-  TGtkCell* {.final.} = object
+  TGtkCell* {.final, pure.} = object
     `type`*: TGtkCellType
     vertical*: gint16
     horizontal*: gint16
@@ -1212,7 +1212,7 @@ type
                                        action: TGtkCTreeExpansionType){.cdecl.}
 
   PGtkCTreeRow* = ptr TGtkCTreeRow
-  TGtkCTreeRow* {.final.} = object
+  TGtkCTreeRow* {.final, pure.} = object
     row*: TGtkCListRow
     parent*: PGtkCTreeNode
     sibling*: PGtkCTreeNode
@@ -1224,7 +1224,7 @@ type
     level*: guint16
     GtkCTreeRow_flag0*: guint16
 
-  TGtkCTreeNode* {.final.} = object
+  TGtkCTreeNode* {.final, pure.} = object
     list*: TGList
 
   PGtkDrawingArea* = ptr TGtkDrawingArea
@@ -1479,7 +1479,7 @@ type
   TGtkFixedClass* = object of TGtkContainerClass
 
   PGtkFixedChild* = ptr TGtkFixedChild
-  TGtkFixedChild* {.final.} = object
+  TGtkFixedChild* {.final, pure.} = object
     widget*: PGtkWidget
     x*: gint
     y*: gint
@@ -1632,7 +1632,7 @@ type
     gtk_reserved363: proc (){.cdecl.}
     gtk_reserved364: proc (){.cdecl.}
 
-  TGtkRulerMetric* {.final.} = object
+  TGtkRulerMetric* {.final, pure.} = object
     metric_name*: cstring
     abbrev*: cstring
     pixels_per_unit*: gdouble
@@ -1657,7 +1657,7 @@ type
   TGtkSettingsClass* = object of TGObjectClass
 
   PGtkSettingsValue* = ptr TGtkSettingsValue
-  TGtkSettingsValue* {.final.} = object
+  TGtkSettingsValue* {.final, pure.} = object
     origin*: cstring
     value*: TGValue
 
@@ -1708,7 +1708,7 @@ type
     GTK_RC_TOKEN_IM_MODULE_FILE, GTK_RC_TOKEN_STOCK, GTK_RC_TOKEN_LTR,
     GTK_RC_TOKEN_RTL, GTK_RC_TOKEN_LAST
   PGtkRcProperty* = ptr TGtkRcProperty
-  TGtkRcProperty* {.final.} = object
+  TGtkRcProperty* {.final, pure.} = object
     type_name*: TGQuark
     property_name*: TGQuark
     origin*: cstring
@@ -1877,7 +1877,7 @@ type
     gtk_reserved3812: proc (){.cdecl.}
 
   PGtkBorder* = ptr TGtkBorder
-  TGtkBorder* {.final.} = object
+  TGtkBorder* {.final, pure.} = object
     left*: gint
     right*: gint
     top*: gint
@@ -1978,27 +1978,27 @@ type
 
   PGtkIconSet* = pointer
   PGtkImagePixmapData* = ptr TGtkImagePixmapData
-  TGtkImagePixmapData* {.final.} = object
+  TGtkImagePixmapData* {.final, pure.} = object
     pixmap*: PGdkPixmap
 
   PGtkImageImageData* = ptr TGtkImageImageData
-  TGtkImageImageData* {.final.} = object
+  TGtkImageImageData* {.final, pure.} = object
     image*: PGdkImage
 
   PGtkImagePixbufData* = ptr TGtkImagePixbufData
-  TGtkImagePixbufData* {.final.} = object
+  TGtkImagePixbufData* {.final, pure.} = object
     pixbuf*: PGdkPixbuf
 
   PGtkImageStockData* = ptr TGtkImageStockData
-  TGtkImageStockData* {.final.} = object
+  TGtkImageStockData* {.final, pure.} = object
     stock_id*: cstring
 
   PGtkImageIconSetData* = ptr TGtkImageIconSetData
-  TGtkImageIconSetData* {.final.} = object
+  TGtkImageIconSetData* {.final, pure.} = object
     icon_set*: PGtkIconSet
 
   PGtkImageAnimationData* = ptr TGtkImageAnimationData
-  TGtkImageAnimationData* {.final.} = object
+  TGtkImageAnimationData* {.final, pure.} = object
     anim*: PGdkPixbufAnimation
     iter*: PGdkPixbufAnimationIter
     frame_timeout*: guint
@@ -2111,7 +2111,7 @@ type
     gtk_reserved474: proc (){.cdecl.}
 
   PGtkItemFactoryEntry* = ptr TGtkItemFactoryEntry
-  TGtkItemFactoryEntry* {.final.} = object
+  TGtkItemFactoryEntry* {.final, pure.} = object
     path*: cstring
     accelerator*: cstring
     callback*: TGtkItemFactoryCallback
@@ -2120,7 +2120,7 @@ type
     extra_data*: gconstpointer
 
   PGtkItemFactoryItem* = ptr TGtkItemFactoryItem
-  TGtkItemFactoryItem* {.final.} = object
+  TGtkItemFactoryItem* {.final, pure.} = object
     path*: cstring
     widgets*: PGSList
 
@@ -2173,7 +2173,7 @@ type
       cdecl.}
   PGtkTreeModelFlags* = ptr TGtkTreeModelFlags
   TGtkTreeModelFlags* = int32
-  TGtkTreeIter* {.final.} = object
+  TGtkTreeIter* {.final, pure.} = object
     stamp*: gint
     user_data*: gpointer
     user_data2*: gpointer
@@ -2435,12 +2435,12 @@ type
     GtkPreview_flag0*: guint16
 
   PGtkPreviewInfo* = ptr TGtkPreviewInfo
-  TGtkPreviewInfo* {.final.} = object
+  TGtkPreviewInfo* {.final, pure.} = object
     lookup*: Pguchar
     gamma*: gdouble
 
   PGtkDitherInfo* = ptr TGtkDitherInfo
-  TGtkDitherInfo* {.final.} = object
+  TGtkDitherInfo* {.final, pure.} = object
     c*: array[0..3, guchar]
 
   PGtkPreviewClass* = ptr TGtkPreviewClass
@@ -2533,7 +2533,7 @@ type
     gtk_reserved603: proc (){.cdecl.}
     gtk_reserved604: proc (){.cdecl.}
 
-  TGtkSelectionData* {.final.} = object
+  TGtkSelectionData* {.final, pure.} = object
     selection*: TGdkAtom
     target*: TGdkAtom
     thetype*: TGdkAtom
@@ -2543,18 +2543,18 @@ type
     display*: PGdkDisplay
 
   PGtkTargetEntry* = ptr TGtkTargetEntry
-  TGtkTargetEntry* {.final.} = object
+  TGtkTargetEntry* {.final, pure.} = object
     target*: cstring
     flags*: guint
     info*: guint
 
   PGtkTargetList* = ptr TGtkTargetList
-  TGtkTargetList* {.final.} = object
+  TGtkTargetList* {.final, pure.} = object
     list*: PGList
     ref_count*: guint
 
   PGtkTargetPair* = ptr TGtkTargetPair
-  TGtkTargetPair* {.final.} = object
+  TGtkTargetPair* {.final, pure.} = object
     target*: TGdkAtom
     flags*: guint
     info*: guint
@@ -2635,7 +2635,7 @@ type
     gtk_reserved634: proc (){.cdecl.}
 
   PGtkStockItem* = ptr TGtkStockItem
-  TGtkStockItem* {.final.} = object
+  TGtkStockItem* {.final, pure.} = object
     stock_id*: cstring
     label*: cstring
     modifier*: TGdkModifierType
@@ -2681,7 +2681,7 @@ type
   TGtkTableClass* = object of TGtkContainerClass
 
   PGtkTableChild* = ptr TGtkTableChild
-  TGtkTableChild* {.final.} = object
+  TGtkTableChild* {.final, pure.} = object
     widget*: PGtkWidget
     left_attach*: guint16
     right_attach*: guint16
@@ -2691,7 +2691,7 @@ type
     ypadding*: guint16
     GtkTableChild_flag0*: guint16
 
-  TGtkTableRowCol* {.final.} = object
+  TGtkTableRowCol* {.final, pure.} = object
     requisition*: guint16
     allocation*: guint16
     spacing*: guint16
@@ -2710,7 +2710,7 @@ type
 
   PGtkTextFont* = pointer
   PGtkPropertyMark* = ptr TGtkPropertyMark
-  TGtkPropertyMark* {.final.} = object
+  TGtkPropertyMark* {.final, pure.} = object
     `property`*: PGList
     offset*: guint
     index*: guint
@@ -2764,7 +2764,7 @@ type
   PGtkTextSearchFlags* = ptr TGtkTextSearchFlags
   TGtkTextSearchFlags* = int32
   PGtkTextIter* = ptr TGtkTextIter
-  TGtkTextIter* {.final.} = object
+  TGtkTextIter* {.final, pure.} = object
     dummy1*: gpointer
     dummy2*: gpointer
     dummy3*: gint
@@ -2802,7 +2802,7 @@ type
     gtk_reserved664: proc (){.cdecl.}
 
   PGtkTextAppearance* = ptr TGtkTextAppearance
-  TGtkTextAppearance* {.final.} = object
+  TGtkTextAppearance* {.final, pure.} = object
     bg_color*: TGdkColor
     fg_color*: TGdkColor
     bg_stipple*: PGdkBitmap
@@ -2811,7 +2811,7 @@ type
     padding1*: gpointer
     flag0*: guint16
 
-  TGtkTextAttributes* {.final.} = object
+  TGtkTextAttributes* {.final, pure.} = object
     refcount*: guint
     appearance*: TGtkTextAppearance
     justification*: TGtkJustification
@@ -2860,7 +2860,7 @@ type
     gtk_reserved4: proc (){.cdecl.}
 
   PGtkTextMarkBody* = ptr TGtkTextMarkBody
-  TGtkTextMarkBody* {.final.} = object
+  TGtkTextMarkBody* {.final, pure.} = object
     obj*: PGtkTextMark
     name*: cstring
     tree*: PGtkTextBTree
@@ -2879,11 +2879,11 @@ type
     gtk_reserved4: proc (){.cdecl.}
 
   PGtkTextPixbuf* = ptr TGtkTextPixbuf
-  TGtkTextPixbuf* {.final.} = object
+  TGtkTextPixbuf* {.final, pure.} = object
     pixbuf*: PGdkPixbuf
 
   PGtkTextChildBody* = ptr TGtkTextChildBody
-  TGtkTextChildBody* {.final.} = object
+  TGtkTextChildBody* {.final, pure.} = object
     obj*: PGtkTextChildAnchor
     widgets*: PGSList
     tree*: PGtkTextBTree
@@ -2892,17 +2892,17 @@ type
   PGtkTextLineSegment* = ptr TGtkTextLineSegment
   PGtkTextLineSegmentClass* = ptr TGtkTextLineSegmentClass
   PGtkTextTagInfo* = ptr TGtkTextTagInfo
-  TGtkTextTagInfo* {.final.} = object
+  TGtkTextTagInfo* {.final, pure.} = object
     tag*: PGtkTextTag
     tag_root*: PGtkTextBTreeNode
     toggle_count*: gint
 
   PGtkTextToggleBody* = ptr TGtkTextToggleBody
-  TGtkTextToggleBody* {.final.} = object
+  TGtkTextToggleBody* {.final, pure.} = object
     info*: PGtkTextTagInfo
     inNodeCounts*: gboolean
 
-  TGtkTextLineSegment* {.final.} = object
+  TGtkTextLineSegment* {.final, pure.} = object
     `type`*: PGtkTextLineSegmentClass
     next*: PGtkTextLineSegment
     char_count*: int32
@@ -2919,7 +2919,7 @@ type
                                      line: PGtkTextLine){.cdecl.}
   TGtkTextSegCheckFunc* = proc (seg: PGtkTextLineSegment, line: PGtkTextLine){.
       cdecl.}
-  TGtkTextLineSegmentClass* {.final.} = object
+  TGtkTextLineSegmentClass* {.final, pure.} = object
     name*: cstring
     leftGravity*: gboolean
     splitFunc*: TGtkTextSegSplitFunc
@@ -2929,13 +2929,13 @@ type
     checkFunc*: TGtkTextSegCheckFunc
 
   PGtkTextLineData* = ptr TGtkTextLineData
-  TGtkTextLineData* {.final.} = object
+  TGtkTextLineData* {.final, pure.} = object
     view_id*: gpointer
     next*: PGtkTextLineData
     height*: gint
     flag0*: int32
 
-  TGtkTextLine* {.final.} = object
+  TGtkTextLine* {.final, pure.} = object
     parent*: PGtkTextBTreeNode
     next*: PGtkTextLine
     segments*: PGtkTextLineSegment
@@ -3020,18 +3020,18 @@ type
     gtk_reserved4: proc (){.cdecl.}
 
   PGtkTextAttrAppearance* = ptr TGtkTextAttrAppearance
-  TGtkTextAttrAppearance* {.final.} = object
+  TGtkTextAttrAppearance* {.final, pure.} = object
     attr*: TPangoAttribute
     appearance*: TGtkTextAppearance
 
   PGtkTextCursorDisplay* = ptr TGtkTextCursorDisplay
-  TGtkTextCursorDisplay* {.final.} = object
+  TGtkTextCursorDisplay* {.final, pure.} = object
     x*: gint
     y*: gint
     height*: gint
     flag0*: guint16
 
-  TGtkTextLineDisplay* {.final.} = object
+  TGtkTextLineDisplay* {.final, pure.} = object
     layout*: PPangoLayout
     cursors*: PGSList
     shaped_objects*: PGSList
@@ -3152,7 +3152,7 @@ type
 
   PGtkTooltips* = ptr TGtkTooltips
   PGtkTooltipsData* = ptr TGtkTooltipsData
-  TGtkTooltipsData* {.final.} = object
+  TGtkTooltipsData* {.final, pure.} = object
     tooltips*: PGtkTooltips
     widget*: PGtkWidget
     tip_text*: cstring
@@ -3184,7 +3184,7 @@ type
   TGtkToolbarSpaceStyle* = enum
     GTK_TOOLBAR_SPACE_EMPTY, GTK_TOOLBAR_SPACE_LINE
   PGtkToolbarChild* = ptr TGtkToolbarChild
-  TGtkToolbarChild* {.final.} = object
+  TGtkToolbarChild* {.final, pure.} = object
     `type`*: TGtkToolbarChildType
     widget*: PGtkWidget
     icon*: PGtkWidget
@@ -3365,13 +3365,13 @@ type
   PGtkRBNode* = ptr TGtkRBNode
   TGtkRBTreeTraverseFunc* = proc (tree: PGtkRBTree, node: PGtkRBNode,
                                   data: gpointer){.cdecl.}
-  TGtkRBTree* {.final.} = object
+  TGtkRBTree* {.final, pure.} = object
     root*: PGtkRBNode
     `nil`*: PGtkRBNode
     parent_tree*: PGtkRBTree
     parent_node*: PGtkRBNode
 
-  TGtkRBNode* {.final.} = object
+  TGtkRBNode* {.final, pure.} = object
     flag0*: guint16
     left*: PGtkRBNode
     right*: PGtkRBNode
@@ -3386,14 +3386,14 @@ type
   TGtkTreeViewSearchDialogPositionFunc* = proc (tree_view: PGtkTreeView,
       search_dialog: PGtkWidget){.cdecl.}
   PGtkTreeViewColumnReorder* = ptr TGtkTreeViewColumnReorder
-  TGtkTreeViewColumnReorder* {.final.} = object
+  TGtkTreeViewColumnReorder* {.final, pure.} = object
     left_align*: gint
     right_align*: gint
     left_column*: PGtkTreeViewColumn
     right_column*: PGtkTreeViewColumn
 
   PGtkTreeViewPrivate* = ptr TGtkTreeViewPrivate
-  TGtkTreeViewPrivate* {.final.} = object
+  TGtkTreeViewPrivate* {.final, pure.} = object
     model*: PGtkTreeModel
     flags*: guint
     tree*: PGtkRBTree
@@ -4236,7 +4236,7 @@ proc GTK_IS_WINDOW_GROUP_CLASS*(klass: pointer): bool
 proc GTK_WINDOW_GROUP_GET_CLASS*(obj: pointer): PGtkWindowGroupClass
 proc gtk_window_get_type*(): TGtkType{.cdecl, dynlib: gtklib,
                                        importc: "gtk_window_get_type".}
-proc gtk_window_new*(thetype: TGtkWindowType): PGtkWidget{.cdecl,
+proc gtk_window_new*(thetype: TGtkWindowType): PGtkWindow {.cdecl,
     dynlib: gtklib, importc: "gtk_window_new".}
 proc gtk_window_set_title*(window: PGtkWindow, title: cstring){.cdecl,
     dynlib: gtklib, importc: "gtk_window_set_title".}
@@ -4389,6 +4389,8 @@ proc gtk_window_group_add_window*(window_group: PGtkWindowGroup,
 proc gtk_window_group_remove_window*(window_group: PGtkWindowGroup,
                                      window: PGtkWindow){.cdecl, dynlib: gtklib,
     importc: "gtk_window_group_remove_window".}
+proc gtk_window_set_default_icon_name*(name: cstring) {.
+    cdecl, dynlib: gtklib, importc.}
 proc gtk_window_internal_set_focus*(window: PGtkWindow, focus: PGtkWidget){.
     cdecl, dynlib: gtklib, importc: "_gtk_window_internal_set_focus".}
 proc gtk_window_remove_embedded_xid*(window: PGtkWindow, xid: guint){.cdecl,
@@ -4437,9 +4439,9 @@ proc use_markup*(a: var TGtkLabel): guint
 proc set_use_markup*(a: var TGtkLabel, `use_markup`: guint)
 proc gtk_label_get_type*(): TGtkType{.cdecl, dynlib: gtklib,
                                       importc: "gtk_label_get_type".}
-proc gtk_label_new*(str: cstring): PGtkWidget{.cdecl, dynlib: gtklib,
+proc gtk_label_new*(str: cstring): PGtkLabel {.cdecl, dynlib: gtklib,
     importc: "gtk_label_new".}
-proc gtk_label_new_with_mnemonic*(str: cstring): PGtkWidget{.cdecl,
+proc gtk_label_new_with_mnemonic*(str: cstring): PGtkLabel {.cdecl,
     dynlib: gtklib, importc: "gtk_label_new_with_mnemonic".}
 proc gtk_label_set_text*(`label`: PGtkLabel, str: cstring){.cdecl,
     dynlib: gtklib, importc: "gtk_label_set_text".}
@@ -4511,7 +4513,7 @@ proc latin1_to_char*(a: var TGtkAccelLabelClass): guint
 proc set_latin1_to_char*(a: var TGtkAccelLabelClass, `latin1_to_char`: guint)
 proc gtk_accel_label_get_type*(): TGtkType{.cdecl, dynlib: gtklib,
     importc: "gtk_accel_label_get_type".}
-proc gtk_accel_label_new*(`string`: cstring): PGtkWidget{.cdecl, dynlib: gtklib,
+proc gtk_accel_label_new*(`string`: cstring): PGtkAccelLabel {.cdecl, dynlib: gtklib,
     importc: "gtk_accel_label_new".}
 proc gtk_accel_label_get_accel_widget*(accel_label: PGtkAccelLabel): PGtkWidget{.
     cdecl, dynlib: gtklib, importc: "gtk_accel_label_get_accel_widget".}
@@ -4579,7 +4581,7 @@ proc gtk_adjustment_get_type*(): TGtkType{.cdecl, dynlib: gtklib,
     importc: "gtk_adjustment_get_type".}
 proc gtk_adjustment_new*(value: gdouble, lower: gdouble, upper: gdouble,
                          step_increment: gdouble, page_increment: gdouble,
-                         page_size: gdouble): PGtkObject{.cdecl, dynlib: gtklib,
+                         page_size: gdouble): PGtkAdjustment {.cdecl, dynlib: gtklib,
     importc: "gtk_adjustment_new".}
 proc gtk_adjustment_changed*(adjustment: PGtkAdjustment){.cdecl, dynlib: gtklib,
     importc: "gtk_adjustment_changed".}
@@ -4601,7 +4603,7 @@ proc GTK_ALIGNMENT_GET_CLASS*(obj: pointer): PGtkAlignmentClass
 proc gtk_alignment_get_type*(): TGtkType{.cdecl, dynlib: gtklib,
     importc: "gtk_alignment_get_type".}
 proc gtk_alignment_new*(xalign: gfloat, yalign: gfloat, xscale: gfloat,
-                        yscale: gfloat): PGtkWidget{.cdecl, dynlib: gtklib,
+                        yscale: gfloat): PGtkAlignment {.cdecl, dynlib: gtklib,
     importc: "gtk_alignment_new".}
 proc gtk_alignment_set*(alignment: PGtkAlignment, xalign: gfloat,
                         yalign: gfloat, xscale: gfloat, yscale: gfloat){.cdecl,
@@ -4614,7 +4616,7 @@ proc GTK_IS_FRAME_CLASS*(klass: pointer): bool
 proc GTK_FRAME_GET_CLASS*(obj: pointer): PGtkFrameClass
 proc gtk_frame_get_type*(): TGtkType{.cdecl, dynlib: gtklib,
                                       importc: "gtk_frame_get_type".}
-proc gtk_frame_new*(`label`: cstring): PGtkWidget{.cdecl, dynlib: gtklib,
+proc gtk_frame_new*(`label`: cstring): PGtkFrame {.cdecl, dynlib: gtklib,
     importc: "gtk_frame_new".}
 proc gtk_frame_set_label*(frame: PGtkFrame, `label`: cstring){.cdecl,
     dynlib: gtklib, importc: "gtk_frame_set_label".}
@@ -4642,7 +4644,7 @@ proc GTK_ASPECT_FRAME_GET_CLASS*(obj: pointer): PGtkAspectFrameClass
 proc gtk_aspect_frame_get_type*(): TGtkType{.cdecl, dynlib: gtklib,
     importc: "gtk_aspect_frame_get_type".}
 proc gtk_aspect_frame_new*(`label`: cstring, xalign: gfloat, yalign: gfloat,
-                           ratio: gfloat, obey_child: gboolean): PGtkWidget{.
+                           ratio: gfloat, obey_child: gboolean): PGtkAspectFrame {.
     cdecl, dynlib: gtklib, importc: "gtk_aspect_frame_new".}
 proc gtk_aspect_frame_set*(aspect_frame: PGtkAspectFrame, xalign: gfloat,
                            yalign: gfloat, ratio: gfloat, obey_child: gboolean){.
@@ -4655,7 +4657,7 @@ proc GTK_IS_ARROW_CLASS*(klass: pointer): bool
 proc GTK_ARROW_GET_CLASS*(obj: pointer): PGtkArrowClass
 proc gtk_arrow_get_type*(): TGtkType{.cdecl, dynlib: gtklib,
                                       importc: "gtk_arrow_get_type".}
-proc gtk_arrow_new*(arrow_type: TGtkArrowType, shadow_type: TGtkShadowType): PGtkWidget{.
+proc gtk_arrow_new*(arrow_type: TGtkArrowType, shadow_type: TGtkShadowType): PGtkArrow{.
     cdecl, dynlib: gtklib, importc: "gtk_arrow_new".}
 proc gtk_arrow_set*(arrow: PGtkArrow, arrow_type: TGtkArrowType,
                     shadow_type: TGtkShadowType){.cdecl, dynlib: gtklib,
@@ -4831,13 +4833,13 @@ proc depress_on_activate*(a: var TGtkButton): guint
 proc set_depress_on_activate*(a: var TGtkButton, `depress_on_activate`: guint)
 proc gtk_button_get_type*(): TGtkType{.cdecl, dynlib: gtklib,
                                        importc: "gtk_button_get_type".}
-proc gtk_button_new*(): PGtkWidget{.cdecl, dynlib: gtklib,
+proc gtk_button_new*(): PGtkButton {.cdecl, dynlib: gtklib,
                                     importc: "gtk_button_new".}
-proc gtk_button_new_with_label*(`label`: cstring): PGtkWidget{.cdecl,
+proc gtk_button_new_with_label*(`label`: cstring): PGtkButton {.cdecl,
     dynlib: gtklib, importc: "gtk_button_new_with_label".}
-proc gtk_button_new_from_stock*(stock_id: cstring): PGtkWidget{.cdecl,
+proc gtk_button_new_from_stock*(stock_id: cstring): PGtkButton {.cdecl,
     dynlib: gtklib, importc: "gtk_button_new_from_stock".}
-proc gtk_button_new_with_mnemonic*(`label`: cstring): PGtkWidget{.cdecl,
+proc gtk_button_new_with_mnemonic*(`label`: cstring): PGtkButton {.cdecl,
     dynlib: gtklib, importc: "gtk_button_new_with_mnemonic".}
 proc gtk_button_pressed*(button: PGtkButton){.cdecl, dynlib: gtklib,
     importc: "gtk_button_pressed".}
@@ -4871,6 +4873,11 @@ proc gtk_button_paint*(button: PGtkButton, area: PGdkRectangle,
                          state_type: TGtkStateType, shadow_type: TGtkShadowType,
                          main_detail: cstring, default_detail: cstring){.cdecl,
     dynlib: gtklib, importc: "_gtk_button_paint".}
+proc gtk_button_set_image*(button: PGtkButton, image: PGtkWidget) {.cdecl,
+    dynlib: gtklib, importc.}
+proc gtk_button_get_image*(button: PGtkButton): PGtkWidget {.cdecl, 
+    dynlib: gtklib, importc.}
+    
 const
   GTK_CALENDAR_SHOW_HEADING* = 1 shl 0
   GTK_CALENDAR_SHOW_DAY_NAMES* = 1 shl 1
@@ -4886,7 +4893,7 @@ proc GTK_IS_CALENDAR_CLASS*(klass: pointer): bool
 proc GTK_CALENDAR_GET_CLASS*(obj: pointer): PGtkCalendarClass
 proc gtk_calendar_get_type*(): TGtkType{.cdecl, dynlib: gtklib,
     importc: "gtk_calendar_get_type".}
-proc gtk_calendar_new*(): PGtkWidget{.cdecl, dynlib: gtklib,
+proc gtk_calendar_new*(): PGtkCalendar {.cdecl, dynlib: gtklib,
                                       importc: "gtk_calendar_new".}
 proc gtk_calendar_select_month*(calendar: PGtkCalendar, month: guint,
                                 year: guint): gboolean{.cdecl, dynlib: gtklib,
@@ -5139,11 +5146,11 @@ proc hide_on_activate*(a: var TGtkMenuItemClass): guint
 proc set_hide_on_activate*(a: var TGtkMenuItemClass, `hide_on_activate`: guint)
 proc gtk_menu_item_get_type*(): TGtkType{.cdecl, dynlib: gtklib,
     importc: "gtk_menu_item_get_type".}
-proc gtk_menu_item_new*(): PGtkWidget{.cdecl, dynlib: gtklib,
+proc gtk_menu_item_new*(): PGtkMenuItem {.cdecl, dynlib: gtklib,
                                        importc: "gtk_menu_item_new".}
-proc gtk_menu_item_new_with_label*(`label`: cstring): PGtkWidget{.cdecl,
+proc gtk_menu_item_new_with_label*(`label`: cstring): PGtkMenuItem {.cdecl,
     dynlib: gtklib, importc: "gtk_menu_item_new_with_label".}
-proc gtk_menu_item_new_with_mnemonic*(`label`: cstring): PGtkWidget{.cdecl,
+proc gtk_menu_item_new_with_mnemonic*(`label`: cstring): PGtkMenuItem {.cdecl,
     dynlib: gtklib, importc: "gtk_menu_item_new_with_mnemonic".}
 proc gtk_menu_item_set_submenu*(menu_item: PGtkMenuItem, submenu: PGtkWidget){.
     cdecl, dynlib: gtklib, importc: "gtk_menu_item_set_submenu".}
@@ -5197,11 +5204,11 @@ proc inconsistent*(a: var TGtkToggleButton): guint
 proc set_inconsistent*(a: var TGtkToggleButton, `inconsistent`: guint)
 proc gtk_toggle_button_get_type*(): TGtkType{.cdecl, dynlib: gtklib,
     importc: "gtk_toggle_button_get_type".}
-proc gtk_toggle_button_new*(): PGtkWidget{.cdecl, dynlib: gtklib,
+proc gtk_toggle_button_new*(): PGtkToggleButton {.cdecl, dynlib: gtklib,
     importc: "gtk_toggle_button_new".}
-proc gtk_toggle_button_new_with_label*(`label`: cstring): PGtkWidget{.cdecl,
+proc gtk_toggle_button_new_with_label*(`label`: cstring): PGtkToggleButton {.cdecl,
     dynlib: gtklib, importc: "gtk_toggle_button_new_with_label".}
-proc gtk_toggle_button_new_with_mnemonic*(`label`: cstring): PGtkWidget{.cdecl,
+proc gtk_toggle_button_new_with_mnemonic*(`label`: cstring): PGtkToggleButton {.cdecl,
     dynlib: gtklib, importc: "gtk_toggle_button_new_with_mnemonic".}
 proc gtk_toggle_button_set_mode*(toggle_button: PGtkToggleButton,
                                  draw_indicator: gboolean){.cdecl,
@@ -5228,11 +5235,11 @@ proc GTK_IS_CHECK_BUTTON_CLASS*(klass: pointer): bool
 proc GTK_CHECK_BUTTON_GET_CLASS*(obj: pointer): PGtkCheckButtonClass
 proc gtk_check_button_get_type*(): TGtkType{.cdecl, dynlib: gtklib,
     importc: "gtk_check_button_get_type".}
-proc gtk_check_button_new*(): PGtkWidget{.cdecl, dynlib: gtklib,
+proc gtk_check_button_new*(): PGtkCheckButton{.cdecl, dynlib: gtklib,
     importc: "gtk_check_button_new".}
-proc gtk_check_button_new_with_label*(`label`: cstring): PGtkWidget{.cdecl,
+proc gtk_check_button_new_with_label*(`label`: cstring): PGtkCheckButton{.cdecl,
     dynlib: gtklib, importc: "gtk_check_button_new_with_label".}
-proc gtk_check_button_new_with_mnemonic*(`label`: cstring): PGtkWidget{.cdecl,
+proc gtk_check_button_new_with_mnemonic*(`label`: cstring): PGtkCheckButton {.cdecl,
     dynlib: gtklib, importc: "gtk_check_button_new_with_mnemonic".}
 proc gtk_check_button_get_props*(check_button: PGtkCheckButton,
                                    indicator_size: Pgint,
@@ -5391,7 +5398,7 @@ proc selectable*(a: var TGtkCListRow): guint
 proc set_selectable*(a: var TGtkCListRow, `selectable`: guint)
 proc gtk_clist_get_type*(): TGtkType{.cdecl, dynlib: gtklib,
                                       importc: "gtk_clist_get_type".}
-proc gtk_clist_new*(columns: gint): PGtkWidget{.cdecl, dynlib: gtklib,
+proc gtk_clist_new*(columns: gint): PGtkCList {.cdecl, dynlib: gtklib,
     importc: "gtk_clist_new".}
 proc gtk_clist_set_hadjustment*(clist: PGtkCList, adjustment: PGtkAdjustment){.
     cdecl, dynlib: gtklib, importc: "gtk_clist_set_hadjustment".}
@@ -5572,7 +5579,7 @@ proc GTK_IS_DIALOG_CLASS*(klass: pointer): bool
 proc GTK_DIALOG_GET_CLASS*(obj: pointer): PGtkDialogClass
 proc gtk_dialog_get_type*(): TGtkType{.cdecl, dynlib: gtklib,
                                        importc: "gtk_dialog_get_type".}
-proc gtk_dialog_new*(): PGtkWidget{.cdecl, dynlib: gtklib,
+proc gtk_dialog_new*(): PGtkDialog {.cdecl, dynlib: gtklib,
                                     importc: "gtk_dialog_new".}
 proc gtk_dialog_add_action_widget*(dialog: PGtkDialog, child: PGtkWidget,
                                    response_id: gint){.cdecl, dynlib: gtklib,
@@ -5593,6 +5600,9 @@ proc gtk_dialog_response*(dialog: PGtkDialog, response_id: gint){.cdecl,
     dynlib: gtklib, importc: "gtk_dialog_response".}
 proc gtk_dialog_run*(dialog: PGtkDialog): gint{.cdecl, dynlib: gtklib,
     importc: "gtk_dialog_run".}
+proc gtk_show_about_dialog*(parent: PGtkWindow, firstPropertyName: cstring) {.
+    cdecl, dynlib: gtklib, importc: "gtk_show_about_dialog", varargs.}
+    
 proc GTK_TYPE_VBOX*(): GType
 proc GTK_VBOX*(obj: pointer): PGtkVBox
 proc GTK_VBOX_CLASS*(klass: pointer): PGtkVBoxClass
@@ -5601,7 +5611,7 @@ proc GTK_IS_VBOX_CLASS*(klass: pointer): bool
 proc GTK_VBOX_GET_CLASS*(obj: pointer): PGtkVBoxClass
 proc gtk_vbox_get_type*(): TGtkType{.cdecl, dynlib: gtklib,
                                      importc: "gtk_vbox_get_type".}
-proc gtk_vbox_new*(homogeneous: gboolean, spacing: gint): PGtkWidget{.cdecl,
+proc gtk_vbox_new*(homogeneous: gboolean, spacing: gint): PGtkVBox {.cdecl,
     dynlib: gtklib, importc: "gtk_vbox_new".}
 proc GTK_TYPE_COLOR_SELECTION*(): GType
 proc GTK_COLOR_SELECTION*(obj: pointer): PGtkColorSelection
@@ -5611,7 +5621,7 @@ proc GTK_IS_COLOR_SELECTION_CLASS*(klass: pointer): bool
 proc GTK_COLOR_SELECTION_GET_CLASS*(obj: pointer): PGtkColorSelectionClass
 proc gtk_color_selection_get_type*(): TGtkType{.cdecl, dynlib: gtklib,
     importc: "gtk_color_selection_get_type".}
-proc gtk_color_selection_new*(): PGtkWidget{.cdecl, dynlib: gtklib,
+proc gtk_color_selection_new*(): PGtkColorSelection {.cdecl, dynlib: gtklib,
     importc: "gtk_color_selection_new".}
 proc gtk_color_selection_get_has_opacity_control*(colorsel: PGtkColorSelection): gboolean{.
     cdecl, dynlib: gtklib,
@@ -5664,7 +5674,7 @@ proc GTK_IS_COLOR_SELECTION_DIALOG_CLASS*(klass: pointer): bool
 proc GTK_COLOR_SELECTION_DIALOG_GET_CLASS*(obj: pointer): PGtkColorSelectionDialogClass
 proc gtk_color_selection_dialog_get_type*(): TGtkType{.cdecl, dynlib: gtklib,
     importc: "gtk_color_selection_dialog_get_type".}
-proc gtk_color_selection_dialog_new*(title: cstring): PGtkWidget{.cdecl,
+proc gtk_color_selection_dialog_new*(title: cstring): PGtkColorSelectionDialog {.cdecl,
     dynlib: gtklib, importc: "gtk_color_selection_dialog_new".}
 proc GTK_TYPE_HBOX*(): GType
 proc GTK_HBOX*(obj: pointer): PGtkHBox
@@ -5674,7 +5684,7 @@ proc GTK_IS_HBOX_CLASS*(klass: pointer): bool
 proc GTK_HBOX_GET_CLASS*(obj: pointer): PGtkHBoxClass
 proc gtk_hbox_get_type*(): TGtkType{.cdecl, dynlib: gtklib,
                                      importc: "gtk_hbox_get_type".}
-proc gtk_hbox_new*(homogeneous: gboolean, spacing: gint): PGtkWidget{.cdecl,
+proc gtk_hbox_new*(homogeneous: gboolean, spacing: gint): PGtkHBox {.cdecl,
     dynlib: gtklib, importc: "gtk_hbox_new".}
 const
   bm_TGtkCombo_value_in_list* = 0x00000001'i16
@@ -5706,7 +5716,7 @@ proc use_arrows_always*(a: var TGtkCombo): guint
 proc set_use_arrows_always*(a: var TGtkCombo, `use_arrows_always`: guint)
 proc gtk_combo_get_type*(): TGtkType{.cdecl, dynlib: gtklib,
                                       importc: "gtk_combo_get_type".}
-proc gtk_combo_new*(): PGtkWidget{.cdecl, dynlib: gtklib,
+proc gtk_combo_new*(): PGtkCombo {.cdecl, dynlib: gtklib,
                                    importc: "gtk_combo_new".}
 proc gtk_combo_set_value_in_list*(combo: PGtkCombo, val: gboolean,
                                   ok_if_empty: gboolean){.cdecl, dynlib: gtklib,
@@ -5760,7 +5770,7 @@ proc expanded*(a: var TGtkCTreeRow): guint
 proc set_expanded*(a: var TGtkCTreeRow, `expanded`: guint)
 proc gtk_ctree_get_type*(): TGtkType{.cdecl, dynlib: gtklib,
                                       importc: "gtk_ctree_get_type".}
-proc gtk_ctree_new*(columns: gint, tree_column: gint): PGtkWidget{.cdecl,
+proc gtk_ctree_new*(columns: gint, tree_column: gint): PGtkCTree {.cdecl,
     dynlib: gtklib, importc: "gtk_ctree_new".}
 proc gtk_ctree_insert_node*(ctree: PGtkCTree, parent: PGtkCTreeNode,
                             sibling: PGtkCTreeNode, text: openarray[cstring],
@@ -5947,7 +5957,7 @@ proc GTK_IS_DRAWING_AREA_CLASS*(klass: pointer): bool
 proc GTK_DRAWING_AREA_GET_CLASS*(obj: pointer): PGtkDrawingAreaClass
 proc gtk_drawing_area_get_type*(): TGtkType{.cdecl, dynlib: gtklib,
     importc: "gtk_drawing_area_get_type".}
-proc gtk_drawing_area_new*(): PGtkWidget{.cdecl, dynlib: gtklib,
+proc gtk_drawing_area_new*(): PGtkDrawingArea {.cdecl, dynlib: gtklib,
     importc: "gtk_drawing_area_new".}
 proc GTK_TYPE_CURVE*(): GType
 proc GTK_CURVE*(obj: pointer): PGtkCurve
@@ -5957,7 +5967,7 @@ proc GTK_IS_CURVE_CLASS*(klass: pointer): bool
 proc GTK_CURVE_GET_CLASS*(obj: pointer): PGtkCurveClass
 proc gtk_curve_get_type*(): TGtkType{.cdecl, dynlib: gtklib,
                                       importc: "gtk_curve_get_type".}
-proc gtk_curve_new*(): PGtkWidget{.cdecl, dynlib: gtklib,
+proc gtk_curve_new*(): PGtkCurve {.cdecl, dynlib: gtklib,
                                    importc: "gtk_curve_new".}
 proc gtk_curve_reset*(curve: PGtkCurve){.cdecl, dynlib: gtklib,
     importc: "gtk_curve_reset".}
@@ -6222,7 +6232,7 @@ proc lower_arrow_prelight*(a: var TGtkMenu): guint
 proc set_lower_arrow_prelight*(a: var TGtkMenu, `lower_arrow_prelight`: guint)
 proc gtk_menu_get_type*(): TGtkType{.cdecl, dynlib: gtklib,
                                      importc: "gtk_menu_get_type".}
-proc gtk_menu_new*(): PGtkWidget{.cdecl, dynlib: gtklib, importc: "gtk_menu_new".}
+proc gtk_menu_new*(): PGtkMenu {.cdecl, dynlib: gtklib, importc: "gtk_menu_new".}
 proc gtk_menu_popup*(menu: PGtkMenu, parent_menu_shell: PGtkWidget,
                      parent_menu_item: PGtkWidget, func_: TGtkMenuPositionFunc,
                      data: gpointer, button: guint, activate_time: guint32){.
@@ -6323,7 +6333,7 @@ proc mouse_cursor_obscured*(a: var TGtkEntry): guint
 proc set_mouse_cursor_obscured*(a: var TGtkEntry, `mouse_cursor_obscured`: guint)
 proc gtk_entry_get_type*(): TGtkType{.cdecl, dynlib: gtklib,
                                       importc: "gtk_entry_get_type".}
-proc gtk_entry_new*(): PGtkWidget{.cdecl, dynlib: gtklib,
+proc gtk_entry_new*(): PGtkEntry {.cdecl, dynlib: gtklib,
                                    importc: "gtk_entry_new".}
 proc gtk_entry_set_visibility*(entry: PGtkEntry, visible: gboolean){.cdecl,
     dynlib: gtklib, importc: "gtk_entry_set_visibility".}
@@ -6536,8 +6546,8 @@ proc GTK_IS_EVENT_BOX_CLASS*(klass: pointer): bool
 proc GTK_EVENT_BOX_GET_CLASS*(obj: pointer): PGtkEventBoxClass
 proc gtk_event_box_get_type*(): TGtkType{.cdecl, dynlib: gtklib,
     importc: "gtk_event_box_get_type".}
-proc gtk_event_box_new*(): PGtkWidget{.cdecl, dynlib: gtklib,
-                                       importc: "gtk_event_box_new".}
+proc gtk_event_box_new*(): PGtkEventBox {.cdecl, dynlib: gtklib,
+                                          importc: "gtk_event_box_new".}
 const
   FNM_PATHNAME* = 1 shl 0
   FNM_NOESCAPE* = 1 shl 1
@@ -6561,7 +6571,7 @@ proc GTK_IS_FILE_SELECTION_CLASS*(klass: pointer): bool
 proc GTK_FILE_SELECTION_GET_CLASS*(obj: pointer): PGtkFileSelectionClass
 proc gtk_file_selection_get_type*(): TGtkType{.cdecl, dynlib: gtklib,
     importc: "gtk_file_selection_get_type".}
-proc gtk_file_selection_new*(title: cstring): PGtkWidget{.cdecl, dynlib: gtklib,
+proc gtk_file_selection_new*(title: cstring): PGtkFileSelection {.cdecl, dynlib: gtklib,
     importc: "gtk_file_selection_new".}
 proc gtk_file_selection_set_filename*(filesel: PGtkFileSelection,
                                       filename: cstring){.cdecl, dynlib: gtklib,
@@ -6588,7 +6598,7 @@ proc GTK_IS_FIXED_CLASS*(klass: pointer): bool
 proc GTK_FIXED_GET_CLASS*(obj: pointer): PGtkFixedClass
 proc gtk_fixed_get_type*(): TGtkType{.cdecl, dynlib: gtklib,
                                       importc: "gtk_fixed_get_type".}
-proc gtk_fixed_new*(): PGtkWidget{.cdecl, dynlib: gtklib,
+proc gtk_fixed_new*(): PGtkFixed {.cdecl, dynlib: gtklib,
                                    importc: "gtk_fixed_new".}
 proc gtk_fixed_put*(fixed: PGtkFixed, widget: PGtkWidget, x: gint, y: gint){.
     cdecl, dynlib: gtklib, importc: "gtk_fixed_put".}
@@ -6612,7 +6622,7 @@ proc GTK_IS_FONT_SELECTION_DIALOG_CLASS*(klass: pointer): bool
 proc GTK_FONT_SELECTION_DIALOG_GET_CLASS*(obj: pointer): PGtkFontSelectionDialogClass
 proc gtk_font_selection_get_type*(): TGtkType{.cdecl, dynlib: gtklib,
     importc: "gtk_font_selection_get_type".}
-proc gtk_font_selection_new*(): PGtkWidget{.cdecl, dynlib: gtklib,
+proc gtk_font_selection_new*(): PGtkFontSelection{.cdecl, dynlib: gtklib,
     importc: "gtk_font_selection_new".}
 proc gtk_font_selection_get_font_name*(fontsel: PGtkFontSelection): cstring{.
     cdecl, dynlib: gtklib, importc: "gtk_font_selection_get_font_name".}
@@ -6626,7 +6636,7 @@ proc gtk_font_selection_set_preview_text*(fontsel: PGtkFontSelection,
                    importc: "gtk_font_selection_set_preview_text".}
 proc gtk_font_selection_dialog_get_type*(): TGtkType{.cdecl, dynlib: gtklib,
     importc: "gtk_font_selection_dialog_get_type".}
-proc gtk_font_selection_dialog_new*(title: cstring): PGtkWidget{.cdecl,
+proc gtk_font_selection_dialog_new*(title: cstring): PGtkFontSelectionDialog{.cdecl,
     dynlib: gtklib, importc: "gtk_font_selection_dialog_new".}
 proc gtk_font_selection_dialog_get_font_name*(fsd: PGtkFontSelectionDialog): cstring{.
     cdecl, dynlib: gtklib, importc: "gtk_font_selection_dialog_get_font_name".}
@@ -6645,7 +6655,7 @@ proc GTK_IS_GAMMA_CURVE_CLASS*(klass: pointer): bool
 proc GTK_GAMMA_CURVE_GET_CLASS*(obj: pointer): PGtkGammaCurveClass
 proc gtk_gamma_curve_get_type*(): TGtkType{.cdecl, dynlib: gtklib,
     importc: "gtk_gamma_curve_get_type".}
-proc gtk_gamma_curve_new*(): PGtkWidget{.cdecl, dynlib: gtklib,
+proc gtk_gamma_curve_new*(): PGtkGammaCurve{.cdecl, dynlib: gtklib,
     importc: "gtk_gamma_curve_new".}
 proc gtk_gc_get*(depth: gint, colormap: PGdkColormap, values: PGdkGCValues,
                  values_mask: TGdkGCValuesMask): PGdkGC{.cdecl, dynlib: gtklib,
@@ -6686,7 +6696,7 @@ proc snap_edge*(a: var TGtkHandleBox): gint
 proc set_snap_edge*(a: var TGtkHandleBox, `snap_edge`: gint)
 proc gtk_handle_box_get_type*(): TGtkType{.cdecl, dynlib: gtklib,
     importc: "gtk_handle_box_get_type".}
-proc gtk_handle_box_new*(): PGtkWidget{.cdecl, dynlib: gtklib,
+proc gtk_handle_box_new*(): PGtkHandleBox{.cdecl, dynlib: gtklib,
                                         importc: "gtk_handle_box_new".}
 proc gtk_handle_box_set_shadow_type*(handle_box: PGtkHandleBox,
                                      thetype: TGtkShadowType){.cdecl,
@@ -6774,7 +6784,7 @@ proc GTK_IS_HBUTTON_BOX_CLASS*(klass: pointer): bool
 proc GTK_HBUTTON_BOX_GET_CLASS*(obj: pointer): PGtkHButtonBoxClass
 proc gtk_hbutton_box_get_type*(): TGtkType{.cdecl, dynlib: gtklib,
     importc: "gtk_hbutton_box_get_type".}
-proc gtk_hbutton_box_new*(): PGtkWidget{.cdecl, dynlib: gtklib,
+proc gtk_hbutton_box_new*(): PGtkHButtonBox{.cdecl, dynlib: gtklib,
     importc: "gtk_hbutton_box_new".}
 proc GTK_TYPE_HPANED*(): GType
 proc GTK_HPANED*(obj: pointer): PGtkHPaned
@@ -6784,7 +6794,7 @@ proc GTK_IS_HPANED_CLASS*(klass: pointer): bool
 proc GTK_HPANED_GET_CLASS*(obj: pointer): PGtkHPanedClass
 proc gtk_hpaned_get_type*(): TGtkType{.cdecl, dynlib: gtklib,
                                        importc: "gtk_hpaned_get_type".}
-proc gtk_hpaned_new*(): PGtkWidget{.cdecl, dynlib: gtklib,
+proc gtk_hpaned_new*(): PGtkHPaned{.cdecl, dynlib: gtklib,
                                     importc: "gtk_hpaned_new".}
 proc GTK_TYPE_RULER*(): GType
 proc GTK_RULER*(obj: pointer): PGtkRuler
@@ -6816,7 +6826,7 @@ proc GTK_IS_HRULER_CLASS*(klass: pointer): bool
 proc GTK_HRULER_GET_CLASS*(obj: pointer): PGtkHRulerClass
 proc gtk_hruler_get_type*(): TGtkType{.cdecl, dynlib: gtklib,
                                        importc: "gtk_hruler_get_type".}
-proc gtk_hruler_new*(): PGtkWidget{.cdecl, dynlib: gtklib,
+proc gtk_hruler_new*(): PGtkHRuler{.cdecl, dynlib: gtklib,
                                     importc: "gtk_hruler_new".}
 proc GTK_TYPE_SETTINGS*(): GType
 proc GTK_SETTINGS*(obj: pointer): PGtkSettings
@@ -7212,9 +7222,9 @@ proc GTK_IS_HSCALE_CLASS*(klass: pointer): bool
 proc GTK_HSCALE_GET_CLASS*(obj: pointer): PGtkHScaleClass
 proc gtk_hscale_get_type*(): TGtkType{.cdecl, dynlib: gtklib,
                                        importc: "gtk_hscale_get_type".}
-proc gtk_hscale_new*(adjustment: PGtkAdjustment): PGtkWidget{.cdecl,
+proc gtk_hscale_new*(adjustment: PGtkAdjustment): PGtkHScale{.cdecl,
     dynlib: gtklib, importc: "gtk_hscale_new".}
-proc gtk_hscale_new_with_range*(min: gdouble, max: gdouble, step: gdouble): PGtkWidget{.
+proc gtk_hscale_new_with_range*(min: gdouble, max: gdouble, step: gdouble): PGtkHScale{.
     cdecl, dynlib: gtklib, importc: "gtk_hscale_new_with_range".}
 proc GTK_TYPE_SCROLLBAR*(): GType
 proc GTK_SCROLLBAR*(obj: pointer): PGtkScrollbar
@@ -7232,7 +7242,7 @@ proc GTK_IS_HSCROLLBAR_CLASS*(klass: pointer): bool
 proc GTK_HSCROLLBAR_GET_CLASS*(obj: pointer): PGtkHScrollbarClass
 proc gtk_hscrollbar_get_type*(): TGtkType{.cdecl, dynlib: gtklib,
     importc: "gtk_hscrollbar_get_type".}
-proc gtk_hscrollbar_new*(adjustment: PGtkAdjustment): PGtkWidget{.cdecl,
+proc gtk_hscrollbar_new*(adjustment: PGtkAdjustment): PGtkHScrollbar{.cdecl,
     dynlib: gtklib, importc: "gtk_hscrollbar_new".}
 proc GTK_TYPE_SEPARATOR*(): GType
 proc GTK_SEPARATOR*(obj: pointer): PGtkSeparator
@@ -7250,7 +7260,7 @@ proc GTK_IS_HSEPARATOR_CLASS*(klass: pointer): bool
 proc GTK_HSEPARATOR_GET_CLASS*(obj: pointer): PGtkHSeparatorClass
 proc gtk_hseparator_get_type*(): TGtkType{.cdecl, dynlib: gtklib,
     importc: "gtk_hseparator_get_type".}
-proc gtk_hseparator_new*(): PGtkWidget{.cdecl, dynlib: gtklib,
+proc gtk_hseparator_new*(): PGtkHSeparator{.cdecl, dynlib: gtklib,
                                         importc: "gtk_hseparator_new".}
 proc GTK_TYPE_ICON_FACTORY*(): GType
 proc GTK_ICON_FACTORY*(anObject: pointer): PGtkIconFactory
@@ -7363,21 +7373,21 @@ proc GTK_IS_IMAGE_CLASS*(klass: pointer): bool
 proc GTK_IMAGE_GET_CLASS*(obj: pointer): PGtkImageClass
 proc gtk_image_get_type*(): TGtkType{.cdecl, dynlib: gtklib,
                                       importc: "gtk_image_get_type".}
-proc gtk_image_new*(): PGtkWidget{.cdecl, dynlib: gtklib,
+proc gtk_image_new*(): PGtkImage{.cdecl, dynlib: gtklib,
                                    importc: "gtk_image_new".}
-proc gtk_image_new_from_pixmap*(pixmap: PGdkPixmap, mask: PGdkBitmap): PGtkWidget{.
+proc gtk_image_new_from_pixmap*(pixmap: PGdkPixmap, mask: PGdkBitmap): PGtkImage{.
     cdecl, dynlib: gtklib, importc: "gtk_image_new_from_pixmap".}
-proc gtk_image_new_from_image*(image: PGdkImage, mask: PGdkBitmap): PGtkWidget{.
+proc gtk_image_new_from_image*(image: PGdkImage, mask: PGdkBitmap): PGtkImage{.
     cdecl, dynlib: gtklib, importc: "gtk_image_new_from_image".}
-proc gtk_image_new_from_file*(filename: cstring): PGtkWidget{.cdecl,
+proc gtk_image_new_from_file*(filename: cstring): PGtkImage{.cdecl,
     dynlib: gtklib, importc: "gtk_image_new_from_file".}
-proc gtk_image_new_from_pixbuf*(pixbuf: PGdkPixbuf): PGtkWidget{.cdecl,
+proc gtk_image_new_from_pixbuf*(pixbuf: PGdkPixbuf): PGtkImage{.cdecl,
     dynlib: gtklib, importc: "gtk_image_new_from_pixbuf".}
-proc gtk_image_new_from_stock*(stock_id: cstring, size: TGtkIconSize): PGtkWidget{.
+proc gtk_image_new_from_stock*(stock_id: cstring, size: TGtkIconSize): PGtkImage{.
     cdecl, dynlib: gtklib, importc: "gtk_image_new_from_stock".}
-proc gtk_image_new_from_icon_set*(icon_set: PGtkIconSet, size: TGtkIconSize): PGtkWidget{.
+proc gtk_image_new_from_icon_set*(icon_set: PGtkIconSet, size: TGtkIconSize): PGtkImage{.
     cdecl, dynlib: gtklib, importc: "gtk_image_new_from_icon_set".}
-proc gtk_image_new_from_animation*(animation: PGdkPixbufAnimation): PGtkWidget{.
+proc gtk_image_new_from_animation*(animation: PGdkPixbufAnimation): PGtkImage{.
     cdecl, dynlib: gtklib, importc: "gtk_image_new_from_animation".}
 proc gtk_image_set_from_pixmap*(image: PGtkImage, pixmap: PGdkPixmap,
                                 mask: PGdkBitmap){.cdecl, dynlib: gtklib,
@@ -7415,14 +7425,14 @@ proc GTK_IS_IMAGE_MENU_ITEM_CLASS*(klass: pointer): bool
 proc GTK_IMAGE_MENU_ITEM_GET_CLASS*(obj: pointer): PGtkImageMenuItemClass
 proc gtk_image_menu_item_get_type*(): TGtkType{.cdecl, dynlib: gtklib,
     importc: "gtk_image_menu_item_get_type".}
-proc gtk_image_menu_item_new*(): PGtkWidget{.cdecl, dynlib: gtklib,
+proc gtk_image_menu_item_new*(): PGtkImageMenuItem{.cdecl, dynlib: gtklib,
     importc: "gtk_image_menu_item_new".}
-proc gtk_image_menu_item_new_with_label*(`label`: cstring): PGtkWidget{.cdecl,
+proc gtk_image_menu_item_new_with_label*(`label`: cstring): PGtkImageMenuItem{.cdecl,
     dynlib: gtklib, importc: "gtk_image_menu_item_new_with_label".}
-proc gtk_image_menu_item_new_with_mnemonic*(`label`: cstring): PGtkWidget{.cdecl,
+proc gtk_image_menu_item_new_with_mnemonic*(`label`: cstring): PGtkImageMenuItem{.cdecl,
     dynlib: gtklib, importc: "gtk_image_menu_item_new_with_mnemonic".}
 proc gtk_image_menu_item_new_from_stock*(stock_id: cstring,
-    accel_group: PGtkAccelGroup): PGtkWidget{.cdecl, dynlib: gtklib,
+    accel_group: PGtkAccelGroup): PGtkImageMenuItem{.cdecl, dynlib: gtklib,
     importc: "gtk_image_menu_item_new_from_stock".}
 proc gtk_image_menu_item_set_image*(image_menu_item: PGtkImageMenuItem,
                                     image: PGtkWidget){.cdecl, dynlib: gtklib,
@@ -7470,7 +7480,7 @@ proc GTK_IS_INPUT_DIALOG_CLASS*(klass: pointer): bool
 proc GTK_INPUT_DIALOG_GET_CLASS*(obj: pointer): PGtkInputDialogClass
 proc gtk_input_dialog_get_type*(): TGtkType{.cdecl, dynlib: gtklib,
     importc: "gtk_input_dialog_get_type".}
-proc gtk_input_dialog_new*(): PGtkWidget{.cdecl, dynlib: gtklib,
+proc gtk_input_dialog_new*(): PGtkInputDialog{.cdecl, dynlib: gtklib,
     importc: "gtk_input_dialog_new".}
 proc GTK_TYPE_INVISIBLE*(): GType
 proc GTK_INVISIBLE*(obj: pointer): PGtkInvisible
@@ -7480,9 +7490,9 @@ proc GTK_IS_INVISIBLE_CLASS*(klass: pointer): bool
 proc GTK_INVISIBLE_GET_CLASS*(obj: pointer): PGtkInvisibleClass
 proc gtk_invisible_get_type*(): TGtkType{.cdecl, dynlib: gtklib,
     importc: "gtk_invisible_get_type".}
-proc gtk_invisible_new*(): PGtkWidget{.cdecl, dynlib: gtklib,
+proc gtk_invisible_new*(): PGtkInvisible{.cdecl, dynlib: gtklib,
                                        importc: "gtk_invisible_new".}
-proc gtk_invisible_new_for_screen*(screen: PGdkScreen): PGtkWidget{.cdecl,
+proc gtk_invisible_new_for_screen*(screen: PGdkScreen): PGtkInvisible{.cdecl,
     dynlib: gtklib, importc: "gtk_invisible_new_for_screen".}
 proc gtk_invisible_set_screen*(invisible: PGtkInvisible, screen: PGdkScreen){.
     cdecl, dynlib: gtklib, importc: "gtk_invisible_set_screen".}
@@ -7561,7 +7571,7 @@ proc GTK_IS_LAYOUT_CLASS*(klass: pointer): bool
 proc GTK_LAYOUT_GET_CLASS*(obj: pointer): PGtkLayoutClass
 proc gtk_layout_get_type*(): TGtkType{.cdecl, dynlib: gtklib,
                                        importc: "gtk_layout_get_type".}
-proc gtk_layout_new*(hadjustment: PGtkAdjustment, vadjustment: PGtkAdjustment): PGtkWidget{.
+proc gtk_layout_new*(hadjustment: PGtkAdjustment, vadjustment: PGtkAdjustment): PGtkLayout{.
     cdecl, dynlib: gtklib, importc: "gtk_layout_new".}
 proc gtk_layout_put*(layout: PGtkLayout, child_widget: PGtkWidget, x: gint,
                      y: gint){.cdecl, dynlib: gtklib, importc: "gtk_layout_put".}
@@ -7602,7 +7612,7 @@ proc add_mode*(a: var TGtkList): guint
 proc set_add_mode*(a: var TGtkList, `add_mode`: guint)
 proc gtk_list_get_type*(): TGtkType{.cdecl, dynlib: gtklib,
                                      importc: "gtk_list_get_type".}
-proc gtk_list_new*(): PGtkWidget{.cdecl, dynlib: gtklib, importc: "gtk_list_new".}
+proc gtk_list_new*(): PGtkList{.cdecl, dynlib: gtklib, importc: "gtk_list_new".}
 proc gtk_list_insert_items*(list: PGtkList, items: PGList, position: gint){.
     cdecl, dynlib: gtklib, importc: "gtk_list_insert_items".}
 proc gtk_list_append_items*(list: PGtkList, items: PGList){.cdecl,
@@ -7994,7 +8004,7 @@ proc GTK_IS_MENU_BAR_CLASS*(klass: pointer): bool
 proc GTK_MENU_BAR_GET_CLASS*(obj: pointer): PGtkMenuBarClass
 proc gtk_menu_bar_get_type*(): TGtkType{.cdecl, dynlib: gtklib,
     importc: "gtk_menu_bar_get_type".}
-proc gtk_menu_bar_new*(): PGtkWidget{.cdecl, dynlib: gtklib,
+proc gtk_menu_bar_new*(): PGtkMenuBar{.cdecl, dynlib: gtklib,
                                       importc: "gtk_menu_bar_new".}
 proc gtk_menu_bar_cycle_focus*(menubar: PGtkMenuBar, dir: TGtkDirectionType){.
     cdecl, dynlib: gtklib, importc: "_gtk_menu_bar_cycle_focus".}
@@ -8064,7 +8074,7 @@ proc focus_out*(a: var TGtkNotebook): guint
 proc set_focus_out*(a: var TGtkNotebook, `focus_out`: guint)
 proc gtk_notebook_get_type*(): TGtkType{.cdecl, dynlib: gtklib,
     importc: "gtk_notebook_get_type".}
-proc gtk_notebook_new*(): PGtkWidget{.cdecl, dynlib: gtklib,
+proc gtk_notebook_new*(): PGtkNotebook{.cdecl, dynlib: gtklib,
                                       importc: "gtk_notebook_new".}
 proc gtk_notebook_append_page*(notebook: PGtkNotebook, child: PGtkWidget,
                                tab_label: PGtkWidget): gint{.cdecl,
@@ -8091,6 +8101,8 @@ proc gtk_notebook_remove_page*(notebook: PGtkNotebook, page_num: gint){.cdecl,
     dynlib: gtklib, importc: "gtk_notebook_remove_page".}
 proc gtk_notebook_get_current_page*(notebook: PGtkNotebook): gint{.cdecl,
     dynlib: gtklib, importc: "gtk_notebook_get_current_page".}
+proc gtk_notebook_get_n_pages*(notebook: PGtkNotebook): gint {.cdecl, 
+    dynlib: gtklib, importc.}
 proc gtk_notebook_get_nth_page*(notebook: PGtkNotebook, page_num: gint): PGtkWidget{.
     cdecl, dynlib: gtklib, importc: "gtk_notebook_get_nth_page".}
 proc gtk_notebook_page_num*(notebook: PGtkNotebook, child: PGtkWidget): gint{.
@@ -8186,7 +8198,7 @@ proc GTK_IS_OPTION_MENU_CLASS*(klass: pointer): bool
 proc GTK_OPTION_MENU_GET_CLASS*(obj: pointer): PGtkOptionMenuClass
 proc gtk_option_menu_get_type*(): TGtkType{.cdecl, dynlib: gtklib,
     importc: "gtk_option_menu_get_type".}
-proc gtk_option_menu_new*(): PGtkWidget{.cdecl, dynlib: gtklib,
+proc gtk_option_menu_new*(): PGtkOptionMenu{.cdecl, dynlib: gtklib,
     importc: "gtk_option_menu_new".}
 proc gtk_option_menu_get_menu*(option_menu: PGtkOptionMenu): PGtkWidget{.cdecl,
     dynlib: gtklib, importc: "gtk_option_menu_get_menu".}
@@ -8212,7 +8224,7 @@ proc build_insensitive*(a: var TGtkPixmap): guint
 proc set_build_insensitive*(a: var TGtkPixmap, `build_insensitive`: guint)
 proc gtk_pixmap_get_type*(): TGtkType{.cdecl, dynlib: gtklib,
                                        importc: "gtk_pixmap_get_type".}
-proc gtk_pixmap_new*(pixmap: PGdkPixmap, mask: PGdkBitmap): PGtkWidget{.cdecl,
+proc gtk_pixmap_new*(pixmap: PGdkPixmap, mask: PGdkBitmap): PGtkPixmap{.cdecl,
     dynlib: gtklib, importc: "gtk_pixmap_new".}
 proc gtk_pixmap_set*(pixmap: PGtkPixmap, val: PGdkPixmap, mask: PGdkBitmap){.
     cdecl, dynlib: gtklib, importc: "gtk_pixmap_set".}
@@ -8238,7 +8250,7 @@ proc gtk_plug_get_type*(): TGtkType{.cdecl, dynlib: gtklib,
 proc gtk_plug_construct_for_display*(plug: PGtkPlug, display: PGdkDisplay,
                                      socket_id: TGdkNativeWindow){.cdecl,
     dynlib: gtklib, importc: "gtk_plug_construct_for_display".}
-proc gtk_plug_new_for_display*(display: PGdkDisplay, socket_id: TGdkNativeWindow): PGtkWidget{.
+proc gtk_plug_new_for_display*(display: PGdkDisplay, socket_id: TGdkNativeWindow): PGtkPlug{.
     cdecl, dynlib: gtklib, importc: "gtk_plug_new_for_display".}
 proc gtk_plug_get_id*(plug: PGtkPlug): TGdkNativeWindow{.cdecl, dynlib: gtklib,
     importc: "gtk_plug_get_id".}
@@ -8265,7 +8277,7 @@ proc set_expand*(a: var TGtkPreview, `expand`: guint)
 proc gtk_preview_get_type*(): TGtkType{.cdecl, dynlib: gtklib,
                                         importc: "gtk_preview_get_type".}
 proc gtk_preview_uninit*(){.cdecl, dynlib: gtklib, importc: "gtk_preview_uninit".}
-proc gtk_preview_new*(thetype: TGtkPreviewClass): PGtkWidget{.cdecl,
+proc gtk_preview_new*(thetype: TGtkPreviewClass): PGtkPreview{.cdecl,
     dynlib: gtklib, importc: "gtk_preview_new".}
 proc gtk_preview_size*(preview: PGtkPreview, width: gint, height: gint){.cdecl,
     dynlib: gtklib, importc: "gtk_preview_size".}
@@ -8320,7 +8332,7 @@ proc activity_dir*(a: var TGtkProgressBar): guint
 proc set_activity_dir*(a: var TGtkProgressBar, `activity_dir`: guint)
 proc gtk_progress_bar_get_type*(): TGtkType{.cdecl, dynlib: gtklib,
     importc: "gtk_progress_bar_get_type".}
-proc gtk_progress_bar_new*(): PGtkWidget{.cdecl, dynlib: gtklib,
+proc gtk_progress_bar_new*(): PGtkProgressBar{.cdecl, dynlib: gtklib,
     importc: "gtk_progress_bar_new".}
 proc gtk_progress_bar_pulse*(pbar: PGtkProgressBar){.cdecl, dynlib: gtklib,
     importc: "gtk_progress_bar_pulse".}
@@ -8349,18 +8361,18 @@ proc GTK_IS_RADIO_BUTTON_CLASS*(klass: pointer): bool
 proc GTK_RADIO_BUTTON_GET_CLASS*(obj: pointer): PGtkRadioButtonClass
 proc gtk_radio_button_get_type*(): TGtkType{.cdecl, dynlib: gtklib,
     importc: "gtk_radio_button_get_type".}
-proc gtk_radio_button_new*(group: PGSList): PGtkWidget{.cdecl, dynlib: gtklib,
+proc gtk_radio_button_new*(group: PGSList): PGtkRadioButton{.cdecl, dynlib: gtklib,
     importc: "gtk_radio_button_new".}
-proc gtk_radio_button_new_from_widget*(group: PGtkRadioButton): PGtkWidget{.
+proc gtk_radio_button_new_from_widget*(group: PGtkRadioButton): PGtkRadioButton{.
     cdecl, dynlib: gtklib, importc: "gtk_radio_button_new_from_widget".}
-proc gtk_radio_button_new_with_label*(group: PGSList, `label`: cstring): PGtkWidget{.
+proc gtk_radio_button_new_with_label*(group: PGSList, `label`: cstring): PGtkRadioButton{.
     cdecl, dynlib: gtklib, importc: "gtk_radio_button_new_with_label".}
 proc gtk_radio_button_new_with_label_from_widget*(group: PGtkRadioButton,
-    `label`: cstring): PGtkWidget{.cdecl, dynlib: gtklib, importc: "gtk_radio_button_new_with_label_from_widget".}
-proc gtk_radio_button_new_with_mnemonic*(group: PGSList, `label`: cstring): PGtkWidget{.
+    `label`: cstring): PGtkRadioButton{.cdecl, dynlib: gtklib, importc: "gtk_radio_button_new_with_label_from_widget".}
+proc gtk_radio_button_new_with_mnemonic*(group: PGSList, `label`: cstring): PGtkRadioButton{.
     cdecl, dynlib: gtklib, importc: "gtk_radio_button_new_with_mnemonic".}
 proc gtk_radio_button_new_with_mnemonic_from_widget*(group: PGtkRadioButton,
-    `label`: cstring): PGtkWidget{.cdecl, dynlib: gtklib, importc: "gtk_radio_button_new_with_mnemonic_from_widget".}
+    `label`: cstring): PGtkRadioButton{.cdecl, dynlib: gtklib, importc: "gtk_radio_button_new_with_mnemonic_from_widget".}
 proc gtk_radio_button_get_group*(radio_button: PGtkRadioButton): PGSList{.cdecl,
     dynlib: gtklib, importc: "gtk_radio_button_get_group".}
 proc gtk_radio_button_set_group*(radio_button: PGtkRadioButton, group: PGSList){.
@@ -8373,11 +8385,11 @@ proc GTK_IS_RADIO_MENU_ITEM_CLASS*(klass: pointer): bool
 proc GTK_RADIO_MENU_ITEM_GET_CLASS*(obj: pointer): PGtkRadioMenuItemClass
 proc gtk_radio_menu_item_get_type*(): TGtkType{.cdecl, dynlib: gtklib,
     importc: "gtk_radio_menu_item_get_type".}
-proc gtk_radio_menu_item_new*(group: PGSList): PGtkWidget{.cdecl,
+proc gtk_radio_menu_item_new*(group: PGSList): PGtkRadioMenuItem{.cdecl,
     dynlib: gtklib, importc: "gtk_radio_menu_item_new".}
-proc gtk_radio_menu_item_new_with_label*(group: PGSList, `label`: cstring): PGtkWidget{.
+proc gtk_radio_menu_item_new_with_label*(group: PGSList, `label`: cstring): PGtkRadioMenuItem{.
     cdecl, dynlib: gtklib, importc: "gtk_radio_menu_item_new_with_label".}
-proc gtk_radio_menu_item_new_with_mnemonic*(group: PGSList, `label`: cstring): PGtkWidget{.
+proc gtk_radio_menu_item_new_with_mnemonic*(group: PGSList, `label`: cstring): PGtkRadioMenuItem{.
     cdecl, dynlib: gtklib, importc: "gtk_radio_menu_item_new_with_mnemonic".}
 proc gtk_radio_menu_item_get_group*(radio_menu_item: PGtkRadioMenuItem): PGSList{.
     cdecl, dynlib: gtklib, importc: "gtk_radio_menu_item_get_group".}
@@ -8423,7 +8435,7 @@ proc set_focus_out*(a: var TGtkScrolledWindow, `focus_out`: guint)
 proc gtk_scrolled_window_get_type*(): TGtkType{.cdecl, dynlib: gtklib,
     importc: "gtk_scrolled_window_get_type".}
 proc gtk_scrolled_window_new*(hadjustment: PGtkAdjustment,
-                              vadjustment: PGtkAdjustment): PGtkWidget{.cdecl,
+                              vadjustment: PGtkAdjustment): PGtkScrolledWindow{.cdecl,
     dynlib: gtklib, importc: "gtk_scrolled_window_new".}
 proc gtk_scrolled_window_set_hadjustment*(scrolled_window: PGtkScrolledWindow,
     hadjustment: PGtkAdjustment){.cdecl, dynlib: gtklib, importc: "gtk_scrolled_window_set_hadjustment".}
@@ -8525,7 +8537,7 @@ proc GTK_IS_SEPARATOR_MENU_ITEM_CLASS*(klass: pointer): bool
 proc GTK_SEPARATOR_MENU_ITEM_GET_CLASS*(obj: pointer): PGtkSeparatorMenuItemClass
 proc gtk_separator_menu_item_get_type*(): GType{.cdecl, dynlib: gtklib,
     importc: "gtk_separator_menu_item_get_type".}
-proc gtk_separator_menu_item_new*(): PGtkWidget{.cdecl, dynlib: gtklib,
+proc gtk_separator_menu_item_new*(): PGtkSeparatorMenuItem{.cdecl, dynlib: gtklib,
     importc: "gtk_separator_menu_item_new".}
 const
   bm_TGtkSizeGroup_have_width* = 0x00000001'i16
@@ -8589,7 +8601,7 @@ proc need_map*(a: var TGtkSocket): guint
 proc set_need_map*(a: var TGtkSocket, `need_map`: guint)
 proc is_mapped*(a: var TGtkSocket): guint
 proc set_is_mapped*(a: var TGtkSocket, `is_mapped`: guint)
-proc gtk_socket_new*(): PGtkWidget{.cdecl, dynlib: gtklib,
+proc gtk_socket_new*(): PGtkSocket {.cdecl, dynlib: gtklib,
                                     importc: "gtk_socket_new".}
 proc gtk_socket_get_type*(): TGtkType{.cdecl, dynlib: gtklib,
                                        importc: "gtk_socket_get_type".}
@@ -8649,9 +8661,9 @@ proc gtk_spin_button_configure*(spin_button: PGtkSpinButton,
                                 digits: guint){.cdecl, dynlib: gtklib,
     importc: "gtk_spin_button_configure".}
 proc gtk_spin_button_new*(adjustment: PGtkAdjustment, climb_rate: gdouble,
-                          digits: guint): PGtkWidget{.cdecl, dynlib: gtklib,
+                          digits: guint): PGtkSpinButton{.cdecl, dynlib: gtklib,
     importc: "gtk_spin_button_new".}
-proc gtk_spin_button_new_with_range*(min: gdouble, max: gdouble, step: gdouble): PGtkWidget{.
+proc gtk_spin_button_new_with_range*(min: gdouble, max: gdouble, step: gdouble): PGtkSpinButton{.
     cdecl, dynlib: gtklib, importc: "gtk_spin_button_new_with_range".}
 proc gtk_spin_button_set_adjustment*(spin_button: PGtkSpinButton,
                                      adjustment: PGtkAdjustment){.cdecl,
@@ -8724,6 +8736,7 @@ const
   GTK_STOCK_COPY* = "gtk-copy"
   GTK_STOCK_CUT* = "gtk-cut"
   GTK_STOCK_DELETE* = "gtk-delete"
+  GTK_STOCK_EDIT* = "gtk-edit"
   GTK_STOCK_EXECUTE* = "gtk-execute"
   GTK_STOCK_FIND* = "gtk-find"
   GTK_STOCK_FIND_AND_REPLACE* = "gtk-find-and-replace"
@@ -8812,7 +8825,7 @@ proc has_resize_grip*(a: var TGtkStatusbar): guint
 proc set_has_resize_grip*(a: var TGtkStatusbar, `has_resize_grip`: guint)
 proc gtk_statusbar_get_type*(): TGtkType{.cdecl, dynlib: gtklib,
     importc: "gtk_statusbar_get_type".}
-proc gtk_statusbar_new*(): PGtkWidget{.cdecl, dynlib: gtklib,
+proc gtk_statusbar_new*(): PGtkStatusbar{.cdecl, dynlib: gtklib,
                                        importc: "gtk_statusbar_new".}
 proc gtk_statusbar_get_context_id*(statusbar: PGtkStatusbar,
                                    context_description: cstring): guint{.cdecl,
@@ -8888,7 +8901,7 @@ proc empty*(a: var TGtkTableRowCol): guint
 proc set_empty*(a: var TGtkTableRowCol, `empty`: guint)
 proc gtk_table_get_type*(): TGtkType{.cdecl, dynlib: gtklib,
                                       importc: "gtk_table_get_type".}
-proc gtk_table_new*(rows: guint, columns: guint, homogeneous: gboolean): PGtkWidget{.
+proc gtk_table_new*(rows: guint, columns: guint, homogeneous: gboolean): PGtkTable{.
     cdecl, dynlib: gtklib, importc: "gtk_table_new".}
 proc gtk_table_resize*(table: PGtkTable, rows: guint, columns: guint){.cdecl,
     dynlib: gtklib, importc: "gtk_table_resize".}
@@ -8936,7 +8949,7 @@ proc torn_off*(a: var TGtkTearoffMenuItem): guint
 proc set_torn_off*(a: var TGtkTearoffMenuItem, `torn_off`: guint)
 proc gtk_tearoff_menu_item_get_type*(): TGtkType{.cdecl, dynlib: gtklib,
     importc: "gtk_tearoff_menu_item_get_type".}
-proc gtk_tearoff_menu_item_new*(): PGtkWidget{.cdecl, dynlib: gtklib,
+proc gtk_tearoff_menu_item_new*(): PGtkTearoffMenuItem{.cdecl, dynlib: gtklib,
     importc: "gtk_tearoff_menu_item_new".}
 const
   bm_TGtkText_line_wrap* = 0x00000001'i16
@@ -8960,7 +8973,7 @@ proc use_wchar*(a: PGtkText): gboolean
 proc set_use_wchar*(a: PGtkText, `use_wchar`: gboolean)
 proc gtk_text_get_type*(): TGtkType{.cdecl, dynlib: gtklib,
                                      importc: "gtk_text_get_type".}
-proc gtk_text_new*(hadj: PGtkAdjustment, vadj: PGtkAdjustment): PGtkWidget{.
+proc gtk_text_new*(hadj: PGtkAdjustment, vadj: PGtkAdjustment): PGtkText{.
     cdecl, dynlib: gtklib, importc: "gtk_text_new".}
 proc gtk_text_set_editable*(text: PGtkText, editable: gboolean){.cdecl,
     dynlib: gtklib, importc: "gtk_text_set_editable".}
@@ -10056,9 +10069,9 @@ proc set_mouse_cursor_obscured*(a: var TGtkTextView,
                                 `mouse_cursor_obscured`: guint)
 proc gtk_text_view_get_type*(): TGtkType{.cdecl, dynlib: gtklib,
     importc: "gtk_text_view_get_type".}
-proc gtk_text_view_new*(): PGtkWidget{.cdecl, dynlib: gtklib,
+proc gtk_text_view_new*(): PGtkTextView{.cdecl, dynlib: gtklib,
                                        importc: "gtk_text_view_new".}
-proc gtk_text_view_new_with_buffer*(buffer: PGtkTextBuffer): PGtkWidget{.cdecl,
+proc gtk_text_view_new_with_buffer*(buffer: PGtkTextBuffer): PGtkTextView{.cdecl,
     dynlib: gtklib, importc: "gtk_text_view_new_with_buffer".}
 proc gtk_text_view_set_buffer*(text_view: PGtkTextView, buffer: PGtkTextBuffer){.
     cdecl, dynlib: gtklib, importc: "gtk_text_view_set_buffer".}
@@ -10210,7 +10223,7 @@ proc in_query*(a: var TGtkTipsQuery): guint
 proc set_in_query*(a: var TGtkTipsQuery, `in_query`: guint)
 proc gtk_tips_query_get_type*(): TGtkType{.cdecl, dynlib: gtklib,
     importc: "gtk_tips_query_get_type".}
-proc gtk_tips_query_new*(): PGtkWidget{.cdecl, dynlib: gtklib,
+proc gtk_tips_query_new*(): PGtkTipsQuery{.cdecl, dynlib: gtklib,
                                         importc: "gtk_tips_query_new".}
 proc gtk_tips_query_start_query*(tips_query: PGtkTipsQuery){.cdecl,
     dynlib: gtklib, importc: "gtk_tips_query_start_query".}
@@ -10280,7 +10293,7 @@ proc icon_size_set*(a: var TGtkToolbar): guint
 proc set_icon_size_set*(a: var TGtkToolbar, `icon_size_set`: guint)
 proc gtk_toolbar_get_type*(): TGtkType{.cdecl, dynlib: gtklib,
                                         importc: "gtk_toolbar_get_type".}
-proc gtk_toolbar_new*(): PGtkWidget{.cdecl, dynlib: gtklib,
+proc gtk_toolbar_new*(): PGtkToolbar{.cdecl, dynlib: gtklib,
                                      importc: "gtk_toolbar_new".}
 proc gtk_toolbar_append_item*(toolbar: PGtkToolbar, text: cstring,
                               tooltip_text: cstring,
@@ -10394,7 +10407,7 @@ proc view_line*(a: var TGtkTree): guint
 proc set_view_line*(a: var TGtkTree, `view_line`: guint)
 proc gtk_tree_get_type*(): TGtkType{.cdecl, dynlib: gtklib,
                                      importc: "gtk_tree_get_type".}
-proc gtk_tree_new*(): PGtkWidget{.cdecl, dynlib: gtklib, importc: "gtk_tree_new".}
+proc gtk_tree_new*(): PGtkTree{.cdecl, dynlib: gtklib, importc: "gtk_tree_new".}
 proc gtk_tree_append*(tree: PGtkTree, tree_item: PGtkWidget){.cdecl,
     dynlib: gtklib, importc: "gtk_tree_append".}
 proc gtk_tree_prepend*(tree: PGtkTree, tree_item: PGtkWidget){.cdecl,
@@ -10466,9 +10479,9 @@ proc expanded*(a: var TGtkTreeItem): guint
 proc set_expanded*(a: var TGtkTreeItem, `expanded`: guint)
 proc gtk_tree_item_get_type*(): TGtkType{.cdecl, dynlib: gtklib,
     importc: "gtk_tree_item_get_type".}
-proc gtk_tree_item_new*(): PGtkWidget{.cdecl, dynlib: gtklib,
+proc gtk_tree_item_new*(): PGtkTreeItem{.cdecl, dynlib: gtklib,
                                        importc: "gtk_tree_item_new".}
-proc gtk_tree_item_new_with_label*(`label`: cstring): PGtkWidget{.cdecl,
+proc gtk_tree_item_new_with_label*(`label`: cstring): PGtkTreeItem{.cdecl,
     dynlib: gtklib, importc: "gtk_tree_item_new_with_label".}
 proc gtk_tree_item_set_subtree*(tree_item: PGtkTreeItem, subtree: PGtkWidget){.
     cdecl, dynlib: gtklib, importc: "gtk_tree_item_set_subtree".}
@@ -10973,9 +10986,9 @@ proc GTK_IS_TREE_VIEW_CLASS*(klass: pointer): bool
 proc GTK_TREE_VIEW_GET_CLASS*(obj: pointer): PGtkTreeViewClass
 proc gtk_tree_view_get_type*(): TGtkType{.cdecl, dynlib: gtklib,
     importc: "gtk_tree_view_get_type".}
-proc gtk_tree_view_new*(): PGtkWidget{.cdecl, dynlib: gtklib,
+proc gtk_tree_view_new*(): PGtkTreeView{.cdecl, dynlib: gtklib,
                                        importc: "gtk_tree_view_new".}
-proc gtk_tree_view_new_with_model*(model: PGtkTreeModel): PGtkWidget{.cdecl,
+proc gtk_tree_view_new_with_model*(model: PGtkTreeModel): PGtkTreeView{.cdecl,
     dynlib: gtklib, importc: "gtk_tree_view_new_with_model".}
 proc gtk_tree_view_get_model*(tree_view: PGtkTreeView): PGtkTreeModel{.cdecl,
     dynlib: gtklib, importc: "gtk_tree_view_get_model".}
@@ -11137,7 +11150,7 @@ proc GTK_IS_VBUTTON_BOX_CLASS*(klass: pointer): bool
 proc GTK_VBUTTON_BOX_GET_CLASS*(obj: pointer): PGtkVButtonBoxClass
 proc gtk_vbutton_box_get_type*(): TGtkType{.cdecl, dynlib: gtklib,
     importc: "gtk_vbutton_box_get_type".}
-proc gtk_vbutton_box_new*(): PGtkWidget{.cdecl, dynlib: gtklib,
+proc gtk_vbutton_box_new*(): PGtkVButtonBox{.cdecl, dynlib: gtklib,
     importc: "gtk_vbutton_box_new".}
 proc GTK_TYPE_VIEWPORT*(): GType
 proc GTK_VIEWPORT*(obj: pointer): PGtkViewport
@@ -11147,7 +11160,7 @@ proc GTK_IS_VIEWPORT_CLASS*(klass: pointer): bool
 proc GTK_VIEWPORT_GET_CLASS*(obj: pointer): PGtkViewportClass
 proc gtk_viewport_get_type*(): TGtkType{.cdecl, dynlib: gtklib,
     importc: "gtk_viewport_get_type".}
-proc gtk_viewport_new*(hadjustment: PGtkAdjustment, vadjustment: PGtkAdjustment): PGtkWidget{.
+proc gtk_viewport_new*(hadjustment: PGtkAdjustment, vadjustment: PGtkAdjustment): PGtkViewport{.
     cdecl, dynlib: gtklib, importc: "gtk_viewport_new".}
 proc gtk_viewport_get_hadjustment*(viewport: PGtkViewport): PGtkAdjustment{.
     cdecl, dynlib: gtklib, importc: "gtk_viewport_get_hadjustment".}
@@ -11172,7 +11185,7 @@ proc GTK_IS_VPANED_CLASS*(klass: pointer): bool
 proc GTK_VPANED_GET_CLASS*(obj: pointer): PGtkVPanedClass
 proc gtk_vpaned_get_type*(): TGtkType{.cdecl, dynlib: gtklib,
                                        importc: "gtk_vpaned_get_type".}
-proc gtk_vpaned_new*(): PGtkWidget{.cdecl, dynlib: gtklib,
+proc gtk_vpaned_new*(): PGtkVPaned{.cdecl, dynlib: gtklib,
                                     importc: "gtk_vpaned_new".}
 proc GTK_TYPE_VRULER*(): GType
 proc GTK_VRULER*(obj: pointer): PGtkVRuler
@@ -11182,7 +11195,7 @@ proc GTK_IS_VRULER_CLASS*(klass: pointer): bool
 proc GTK_VRULER_GET_CLASS*(obj: pointer): PGtkVRulerClass
 proc gtk_vruler_get_type*(): TGtkType{.cdecl, dynlib: gtklib,
                                        importc: "gtk_vruler_get_type".}
-proc gtk_vruler_new*(): PGtkWidget{.cdecl, dynlib: gtklib,
+proc gtk_vruler_new*(): PGtkVRuler{.cdecl, dynlib: gtklib,
                                     importc: "gtk_vruler_new".}
 proc GTK_TYPE_VSCALE*(): GType
 proc GTK_VSCALE*(obj: pointer): PGtkVScale
@@ -11192,9 +11205,9 @@ proc GTK_IS_VSCALE_CLASS*(klass: pointer): bool
 proc GTK_VSCALE_GET_CLASS*(obj: pointer): PGtkVScaleClass
 proc gtk_vscale_get_type*(): TGtkType{.cdecl, dynlib: gtklib,
                                        importc: "gtk_vscale_get_type".}
-proc gtk_vscale_new*(adjustment: PGtkAdjustment): PGtkWidget{.cdecl,
+proc gtk_vscale_new*(adjustment: PGtkAdjustment): PGtkVScale{.cdecl,
     dynlib: gtklib, importc: "gtk_vscale_new".}
-proc gtk_vscale_new_with_range*(min: gdouble, max: gdouble, step: gdouble): PGtkWidget{.
+proc gtk_vscale_new_with_range*(min: gdouble, max: gdouble, step: gdouble): PGtkVScale{.
     cdecl, dynlib: gtklib, importc: "gtk_vscale_new_with_range".}
 proc GTK_TYPE_VSCROLLBAR*(): GType
 proc GTK_VSCROLLBAR*(obj: pointer): PGtkVScrollbar
@@ -11204,7 +11217,7 @@ proc GTK_IS_VSCROLLBAR_CLASS*(klass: pointer): bool
 proc GTK_VSCROLLBAR_GET_CLASS*(obj: pointer): PGtkVScrollbarClass
 proc gtk_vscrollbar_get_type*(): TGtkType{.cdecl, dynlib: gtklib,
     importc: "gtk_vscrollbar_get_type".}
-proc gtk_vscrollbar_new*(adjustment: PGtkAdjustment): PGtkWidget{.cdecl,
+proc gtk_vscrollbar_new*(adjustment: PGtkAdjustment): PGtkVScrollbar{.cdecl,
     dynlib: gtklib, importc: "gtk_vscrollbar_new".}
 proc GTK_TYPE_VSEPARATOR*(): GType
 proc GTK_VSEPARATOR*(obj: pointer): PGtkVSeparator
@@ -11214,7 +11227,7 @@ proc GTK_IS_VSEPARATOR_CLASS*(klass: pointer): bool
 proc GTK_VSEPARATOR_GET_CLASS*(obj: pointer): PGtkVSeparatorClass
 proc gtk_vseparator_get_type*(): TGtkType{.cdecl, dynlib: gtklib,
     importc: "gtk_vseparator_get_type".}
-proc gtk_vseparator_new*(): PGtkWidget{.cdecl, dynlib: gtklib,
+proc gtk_vseparator_new*(): PGtkVSeparator{.cdecl, dynlib: gtklib,
                                         importc: "gtk_vseparator_new".}
 proc GTK_TYPE_OBJECT*(): GType =
   result = gtk_object_get_type()
@@ -16902,7 +16915,7 @@ proc gtk_binding_entry_add_signal*(binding_set: PGtkBindingSet, keyval: guint,
                                    modifiers: TGdkModifierType, 
                                    signal_name: cstring, n_args: guint){.varargs, 
     importc, cdecl, dynlib: gtklib.}
-proc gtk_clist_new_with_titles*(columns: gint): PGtkWidget{.varargs, cdecl, 
+proc gtk_clist_new_with_titles*(columns: gint): PGtkCList{.varargs, cdecl, 
     importc, dynlib: gtklib.}
 proc gtk_clist_prepend*(clist: PGtkCList): gint{.importc, varargs, cdecl, dynlib: gtklib.}
 proc gtk_clist_append*(clist: PGtkCList): gint{.importc, varargs, cdecl, dynlib: gtklib.}
@@ -16929,7 +16942,7 @@ proc gtk_container_child_get_valist*(container: PGtkContainer,
                                      child: PGtkWidget, 
                                      first_property_name: cstring){.varargs, 
     importc, cdecl, dynlib: gtklib.}
-proc gtk_ctree_new_with_titles*(columns: gint, tree_column: gint): PGtkWidget{.
+proc gtk_ctree_new_with_titles*(columns: gint, tree_column: gint): PGtkCTree{.
     importc, varargs, cdecl, dynlib: gtklib.}
 proc gtk_curve_get_vector*(curve: PGtkCurve, veclen: int32){.varargs, cdecl, 
     importc, dynlib: gtklib.}
@@ -16939,7 +16952,7 @@ proc gtk_dialog_add_buttons*(dialog: PGtkDialog, first_button_text: cstring){.
     varargs, cdecl, importc, dynlib: gtklib.}
 proc gtk_dialog_new_with_buttons*(title: cstring, parent: PGtkWindow, 
                                   flags: TGtkDialogFlags, 
-                                  first_button_text: cstring): PGtkWidget{.
+                                  first_button_text: cstring): PGtkDialog{.
     varargs, cdecl, importc, dynlib: gtklib.}
 proc gtk_list_store_new*(n_columns: gint): PGtkListStore{.varargs, cdecl, 
     importc, dynlib: gtklib.}
@@ -16949,7 +16962,7 @@ proc gtk_list_store_set_valist*(list_store: PGtkListStore, iter: PGtkTreeIter){.
     varargs, cdecl, importc, dynlib: gtklib.}
 proc gtk_message_dialog_new*(parent: PGtkWindow, flags: TGtkDialogFlags, 
                              thetype: TGtkMessageType, buttons: TGtkButtonsType, 
-                             message_format: cstring): PGtkWidget{.varargs, 
+                             message_format: cstring): PGtkMessageDialog{.varargs, 
     cdecl, importc, dynlib: gtklib.}
 proc gtk_signal_new*(name: cstring, signal_flags: TGtkSignalRunType, 
                      object_type: TGtkType, function_offset: guint, 
@@ -17014,11 +17027,11 @@ proc gtk_widget_style_get*(widget: PGtkWidget, first_property_name: cstring){.
     varargs, cdecl, importc, dynlib: gtklib.}
 proc gtk_file_chooser_dialog_new*(title: cstring, parent: PGtkWindow, 
                                   action: TGtkFileChooserAction, 
-                                  first_button_text: cstring): PGtkWidget{.cdecl, 
+                                  first_button_text: cstring): PGtkDialog {.cdecl, 
     varargs, dynlib: gtklib, importc: "gtk_file_chooser_dialog_new".}
 proc gtk_file_chooser_dialog_new_with_backend*(title: cstring, 
     parent: PGtkWindow, action: TGtkFileChooserAction, backend: cstring, 
-    first_button_text: cstring): PGtkWidget{.varargs, cdecl, dynlib: gtklib, 
+    first_button_text: cstring): PGtkDialog {.varargs, cdecl, dynlib: gtklib, 
     importc: "gtk_file_chooser_dialog_new_with_backend".}
 proc gtk_object_ref*(anObject: PGtkObject): PGtkObject{.cdecl,importc,  dynlib: gtklib.}
 proc gtk_object_unref*(anObject: PGtkObject){.cdecl, importc, dynlib: gtklib.}
@@ -17075,7 +17088,7 @@ type
     GTK_FILE_FILTER_FILENAME = 1 shl 0, GTK_FILE_FILTER_URI = 1 shl 1, 
     GTK_FILE_FILTER_DISPLAY_NAME = 1 shl 2, GTK_FILE_FILTER_MIME_TYPE = 1 shl 3
   PGtkFileFilterInfo* = ref TGtkFileFilterInfo
-  TGtkFileFilterInfo* {.final.} = object 
+  TGtkFileFilterInfo* {.final, pure.} = object 
     contains*: TGtkFileFilterFlags
     filename*: cstring
     uri*: cstring
diff --git a/lib/base/gtk/gtkhtml.nim b/lib/base/gtk/gtkhtml.nim
index ca1ce883d..17d3ac56c 100644
--- a/lib/base/gtk/gtkhtml.nim
+++ b/lib/base/gtk/gtkhtml.nim
@@ -68,12 +68,12 @@ type
                             exc: PDomException): PDomString{.cdecl.}
 
   PDomDocument* = ptr TDomDocument
-  TDomDocument* {.final.} = object 
+  TDomDocument* {.final, pure.} = object 
     parent*: PDomNode
     iterators*: PGSList
 
   PDomDocumentClass* = ptr TDomDocumentClass
-  TDomDocumentClass* {.final.} = object 
+  TDomDocumentClass* {.final, pure.} = object 
     parent_class*: PDomNodeClass
 
   PHtmlFocusIterator* = ptr THtmlFocusIterator
diff --git a/lib/base/gtk/pango.nim b/lib/base/gtk/pango.nim
index 363d02cd6..363650f1f 100644
--- a/lib/base/gtk/pango.nim
+++ b/lib/base/gtk/pango.nim
@@ -47,7 +47,7 @@ type
   PPangoGlyph* = ptr TPangoGlyph
   TPangoGlyph* = guint32
   PPangoRectangle* = ptr TPangoRectangle
-  TPangoRectangle* {.final.} = object
+  TPangoRectangle* {.final, pure.} = object
     x*: int32
     y*: int32
     width*: int32
@@ -58,7 +58,7 @@ type
     PANGO_DIRECTION_LTR, PANGO_DIRECTION_RTL, PANGO_DIRECTION_TTB_LTR,
     PANGO_DIRECTION_TTB_RTL
   PPangoColor* = ptr TPangoColor
-  TPangoColor* {.final.} = object
+  TPangoColor* {.final, pure.} = object
     red*: guint16
     green*: guint16
     blue*: guint16
@@ -69,12 +69,12 @@ type
   TPangoUnderline* = int32
   PPangoAttribute* = ptr TPangoAttribute
   PPangoAttrClass* = ptr TPangoAttrClass
-  TPangoAttribute* {.final.} = object
+  TPangoAttribute* {.final, pure.} = object
     klass*: PPangoAttrClass
     start_index*: int
     end_index*: int
 
-  TPangoAttrClass* {.final.} = object
+  TPangoAttrClass* {.final, pure.} = object
     `type`*: TPangoAttrType
     copy*: proc (attr: PPangoAttribute): PPangoAttribute{.cdecl.}
     destroy*: proc (attr: PPangoAttribute){.cdecl.}
@@ -82,43 +82,43 @@ type
         cdecl.}
 
   PPangoAttrString* = ptr TPangoAttrString
-  TPangoAttrString* {.final.} = object
+  TPangoAttrString* {.final, pure.} = object
     attr*: TPangoAttribute
     value*: cstring
 
   PPangoAttrLanguage* = ptr TPangoAttrLanguage
-  TPangoAttrLanguage* {.final.} = object
+  TPangoAttrLanguage* {.final, pure.} = object
     attr*: TPangoAttribute
     value*: PPangoLanguage
 
   PPangoAttrInt* = ptr TPangoAttrInt
-  TPangoAttrInt* {.final.} = object
+  TPangoAttrInt* {.final, pure.} = object
     attr*: TPangoAttribute
     value*: int32
 
   PPangoAttrFloat* = ptr TPangoAttrFloat
-  TPangoAttrFloat* {.final.} = object
+  TPangoAttrFloat* {.final, pure.} = object
     attr*: TPangoAttribute
     value*: gdouble
 
   PPangoAttrColor* = ptr TPangoAttrColor
-  TPangoAttrColor* {.final.} = object
+  TPangoAttrColor* {.final, pure.} = object
     attr*: TPangoAttribute
     color*: TPangoColor
 
   PPangoAttrShape* = ptr TPangoAttrShape
-  TPangoAttrShape* {.final.} = object
+  TPangoAttrShape* {.final, pure.} = object
     attr*: TPangoAttribute
     ink_rect*: TPangoRectangle
     logical_rect*: TPangoRectangle
 
   PPangoAttrFontDesc* = ptr TPangoAttrFontDesc
-  TPangoAttrFontDesc* {.final.} = object
+  TPangoAttrFontDesc* {.final, pure.} = object
     attr*: TPangoAttribute
     desc*: PPangoFontDescription
 
   PPangoLogAttr* = ptr TPangoLogAttr
-  TPangoLogAttr* {.final.} = object
+  TPangoLogAttr* {.final, pure.} = object
     flag0*: guint16
 
   PPangoCoverageLevel* = ptr TPangoCoverageLevel
@@ -126,25 +126,25 @@ type
     PANGO_COVERAGE_NONE, PANGO_COVERAGE_FALLBACK, PANGO_COVERAGE_APPROXIMATE,
     PANGO_COVERAGE_EXACT
   PPangoBlockInfo* = ptr TPangoBlockInfo
-  TPangoBlockInfo* {.final.} = object
+  TPangoBlockInfo* {.final, pure.} = object
     data*: Pguchar
     level*: TPangoCoverageLevel
 
   PPangoCoverage* = ptr TPangoCoverage
-  TPangoCoverage* {.final.} = object
+  TPangoCoverage* {.final, pure.} = object
     ref_count*: int
     n_blocks*: int32
     data_size*: int32
     blocks*: PPangoBlockInfo
 
   PPangoEngineRange* = ptr TPangoEngineRange
-  TPangoEngineRange* {.final.} = object
+  TPangoEngineRange* {.final, pure.} = object
     start*: int32
     theEnd*: int32
     langs*: cstring
 
   PPangoEngineInfo* = ptr TPangoEngineInfo
-  TPangoEngineInfo* {.final.} = object
+  TPangoEngineInfo* {.final, pure.} = object
     id*: cstring
     engine_type*: cstring
     render_type*: cstring
@@ -152,7 +152,7 @@ type
     n_ranges*: gint
 
   PPangoEngine* = ptr TPangoEngine
-  TPangoEngine* {.final.} = object
+  TPangoEngine* {.final, pure.} = object
     id*: cstring
     `type`*: cstring
     length*: gint
@@ -162,7 +162,7 @@ type
                                        attrs: PPangoLogAttr, attrs_len: int32){.
       cdecl.}
   PPangoEngineLang* = ptr TPangoEngineLang
-  TPangoEngineLang* {.final.} = object
+  TPangoEngineLang* {.final, pure.} = object
     engine*: TPangoEngine
     script_break*: TPangoEngineLangScriptBreak
 
@@ -173,7 +173,7 @@ type
                                         language: PPangoLanguage): PPangoCoverage{.
       cdecl.}
   PPangoEngineShape* = ptr TPangoEngineShape
-  TPangoEngineShape* {.final.} = object
+  TPangoEngineShape* {.final, pure.} = object
     engine*: TPangoEngine
     script_shape*: TPangoEngineShapeScript
     get_coverage*: TPangoEngineShapeGetCoverage
@@ -191,28 +191,28 @@ type
   PPangoGlyphUnit* = ptr TPangoGlyphUnit
   TPangoGlyphUnit* = gint32
   PPangoGlyphGeometry* = ptr TPangoGlyphGeometry
-  TPangoGlyphGeometry* {.final.} = object
+  TPangoGlyphGeometry* {.final, pure.} = object
     width*: TPangoGlyphUnit
     x_offset*: TPangoGlyphUnit
     y_offset*: TPangoGlyphUnit
 
   PPangoGlyphVisAttr* = ptr TPangoGlyphVisAttr
-  TPangoGlyphVisAttr* {.final.} = object
+  TPangoGlyphVisAttr* {.final, pure.} = object
     flag0*: int16
 
   PPangoGlyphInfo* = ptr TPangoGlyphInfo
-  TPangoGlyphInfo* {.final.} = object
+  TPangoGlyphInfo* {.final, pure.} = object
     glyph*: TPangoGlyph
     geometry*: TPangoGlyphGeometry
     attr*: TPangoGlyphVisAttr
 
-  TPangoGlyphString* {.final.} = object
+  TPangoGlyphString* {.final, pure.} = object
     num_glyphs*: gint
     glyphs*: PPangoGlyphInfo
     log_clusters*: Pgint
     space*: gint
 
-  TPangoAnalysis* {.final.} = object
+  TPangoAnalysis* {.final, pure.} = object
     shape_engine*: PPangoEngineShape
     lang_engine*: PPangoEngineLang
     font*: PPangoFont
@@ -220,7 +220,7 @@ type
     language*: PPangoLanguage
     extra_attrs*: PGSList
 
-  TPangoItem* {.final.} = object
+  TPangoItem* {.final, pure.} = object
     offset*: gint
     length*: gint
     num_chars*: gint
@@ -233,14 +233,14 @@ type
   TPangoWrapMode* = enum
     PANGO_WRAP_WORD, PANGO_WRAP_CHAR
   PPangoLayoutLine* = ptr TPangoLayoutLine
-  TPangoLayoutLine* {.final.} = object
+  TPangoLayoutLine* {.final, pure.} = object
     layout*: PPangoLayout
     start_index*: gint
     length*: gint
     runs*: PGSList
 
   PPangoLayoutRun* = ptr TPangoLayoutRun
-  TPangoLayoutRun* {.final.} = object
+  TPangoLayoutRun* {.final, pure.} = object
     item*: PPangoItem
     glyphs*: PPangoGlyphString
 
diff --git a/lib/base/x11/xcms.nim b/lib/base/x11/xcms.nim
index ab535ffc3..57aad6ae0 100644
--- a/lib/base/x11/xcms.nim
+++ b/lib/base/x11/xcms.nim
@@ -350,31 +350,31 @@ proc XcmsVisualOfCCC*(para1: TXcmsCCC): PVisual{.cdecl, dynlib: libX11, importc.
 # implementation
 
 proc XcmsUndefinedFormat(): TXcmsColorFormat = 
-  result = TXcmsColorFormat(0x00000000)
+  result = 0x00000000'i32
 
 proc XcmsCIEXYZFormat(): TXcmsColorFormat = 
-  result = TXcmsColorFormat(0x00000001)
+  result = 0x00000001'i32
 
 proc XcmsCIEuvYFormat(): TXcmsColorFormat = 
-  result = TXcmsColorFormat(0x00000002)
+  result = 0x00000002'i32
 
 proc XcmsCIExyYFormat(): TXcmsColorFormat = 
-  result = TXcmsColorFormat(0x00000003)
+  result = 0x00000003'i32
 
 proc XcmsCIELabFormat(): TXcmsColorFormat = 
-  result = TXcmsColorFormat(0x00000004)
+  result = 0x00000004'i32
 
 proc XcmsCIELuvFormat(): TXcmsColorFormat = 
-  result = TXcmsColorFormat(0x00000005)
+  result = 0x00000005'i32
 
 proc XcmsTekHVCFormat(): TXcmsColorFormat = 
-  result = TXcmsColorFormat(0x00000006)
+  result = 0x00000006'i32
 
 proc XcmsRGBFormat(): TXcmsColorFormat = 
-  result = TXcmsColorFormat(0x80000000)
+  result = 0x80000000'i32
 
 proc XcmsRGBiFormat(): TXcmsColorFormat = 
-  result = TXcmsColorFormat(0x80000001)
+  result = 0x80000001'i32
 
 when defined(MACROS): 
   proc DisplayOfCCC(ccc: int32): int32 = 
diff --git a/lib/base/x11/xi.nim b/lib/base/x11/xi.nim
index 194b0eff4..d1b9f7846 100644
--- a/lib/base/x11/xi.nim
+++ b/lib/base/x11/xi.nim
@@ -219,7 +219,7 @@ const
   DvLed* = int(1) shl 4
   DvLedMode* = int(1) shl 5
   DvKey* = int(1) shl 6
-  DvAutoRepeatMode* = int(1) shl 7
+  DvAutoRepeatMode* = 1 shl 7
 
 const 
   DvString* = int(1) shl 0
diff --git a/lib/cycle.h b/lib/cycle.h
new file mode 100644
index 000000000..4d714ba3f
--- /dev/null
+++ b/lib/cycle.h
@@ -0,0 +1,514 @@
+/*
+ * Copyright (c) 2003, 2007 Matteo Frigo
+ * Copyright (c) 2003, 2007 Massachusetts Institute of Technology
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining
+ * a copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sublicense, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject to
+ * the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+ * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+ * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ */
+
+
+/* machine-dependent cycle counters code. Needs to be inlined. */
+
+/***************************************************************************/
+/* To use the cycle counters in your code, simply #include "cycle.h" (this
+   file), and then use the functions/macros:
+
+                 ticks getticks(void);
+
+   ticks is an opaque typedef defined below, representing the current time.
+   You extract the elapsed time between two calls to gettick() via:
+
+                 double elapsed(ticks t1, ticks t0);
+
+   which returns a double-precision variable in arbitrary units.  You
+   are not expected to convert this into human units like seconds; it
+   is intended only for *comparisons* of time intervals.
+
+   (In order to use some of the OS-dependent timer routines like
+   Solaris' gethrtime, you need to paste the autoconf snippet below
+   into your configure.ac file and #include "config.h" before cycle.h,
+   or define the relevant macros manually if you are not using autoconf.)
+*/
+
+/***************************************************************************/
+/* This file uses macros like HAVE_GETHRTIME that are assumed to be
+   defined according to whether the corresponding function/type/header
+   is available on your system.  The necessary macros are most
+   conveniently defined if you are using GNU autoconf, via the tests:
+   
+   dnl ---------------------------------------------------------------------
+
+   AC_C_INLINE
+   AC_HEADER_TIME
+   AC_CHECK_HEADERS([sys/time.h c_asm.h intrinsics.h mach/mach_time.h])
+
+   AC_CHECK_TYPE([hrtime_t],[AC_DEFINE(HAVE_HRTIME_T, 1, [Define to 1 if hrtime_t is defined in <sys/time.h>])],,[#if HAVE_SYS_TIME_H
+#include <sys/time.h>
+#endif])
+
+   AC_CHECK_FUNCS([gethrtime read_real_time time_base_to_time clock_gettime mach_absolute_time])
+
+   dnl Cray UNICOS _rtc() (real-time clock) intrinsic
+   AC_MSG_CHECKING([for _rtc intrinsic])
+   rtc_ok=yes
+   AC_TRY_LINK([#ifdef HAVE_INTRINSICS_H
+#include <intrinsics.h>
+#endif], [_rtc()], [AC_DEFINE(HAVE__RTC,1,[Define if you have the UNICOS _rtc() intrinsic.])], [rtc_ok=no])
+   AC_MSG_RESULT($rtc_ok)
+
+   dnl ---------------------------------------------------------------------
+*/
+
+/***************************************************************************/
+
+#if TIME_WITH_SYS_TIME
+# include <sys/time.h>
+# include <time.h>
+#else
+# if HAVE_SYS_TIME_H
+#  include <sys/time.h>
+# else
+#  include <time.h>
+# endif
+#endif
+
+#define INLINE_ELAPSED(INL) static INL double elapsed(ticks t1, ticks t0) \
+{									  \
+     return (double)t1 - (double)t0;					  \
+}
+
+/*----------------------------------------------------------------*/
+/* Solaris */
+#if defined(HAVE_GETHRTIME) && defined(HAVE_HRTIME_T) && !defined(HAVE_TICK_COUNTER)
+typedef hrtime_t ticks;
+
+#define getticks gethrtime
+
+INLINE_ELAPSED(inline)
+
+#define HAVE_TICK_COUNTER
+#endif
+
+/*----------------------------------------------------------------*/
+/* AIX v. 4+ routines to read the real-time clock or time-base register */
+#if defined(HAVE_READ_REAL_TIME) && defined(HAVE_TIME_BASE_TO_TIME) && !defined(HAVE_TICK_COUNTER)
+typedef timebasestruct_t ticks;
+
+static __inline ticks getticks(void)
+{
+     ticks t;
+     read_real_time(&t, TIMEBASE_SZ);
+     return t;
+}
+
+static __inline double elapsed(ticks t1, ticks t0) /* time in nanoseconds */
+{
+     time_base_to_time(&t1, TIMEBASE_SZ);
+     time_base_to_time(&t0, TIMEBASE_SZ);
+     return (((double)t1.tb_high - (double)t0.tb_high) * 1.0e9 + 
+	     ((double)t1.tb_low - (double)t0.tb_low));
+}
+
+#define HAVE_TICK_COUNTER
+#endif
+
+/*----------------------------------------------------------------*/
+/*
+ * PowerPC ``cycle'' counter using the time base register.
+ */
+#if ((((defined(__GNUC__) && (defined(__powerpc__) || defined(__ppc__))) || (defined(__MWERKS__) && defined(macintosh)))) || (defined(__IBM_GCC_ASM) && (defined(__powerpc__) || defined(__ppc__))))  && !defined(HAVE_TICK_COUNTER)
+typedef unsigned long long ticks;
+
+static __inline__ ticks getticks(void)
+{
+     unsigned int tbl, tbu0, tbu1;
+
+     do {
+	  __asm__ __volatile__ ("mftbu %0" : "=r"(tbu0));
+	  __asm__ __volatile__ ("mftb %0" : "=r"(tbl));
+	  __asm__ __volatile__ ("mftbu %0" : "=r"(tbu1));
+     } while (tbu0 != tbu1);
+
+     return (((unsigned long long)tbu0) << 32) | tbl;
+}
+
+INLINE_ELAPSED(__inline__)
+
+#define HAVE_TICK_COUNTER
+#endif
+
+/* MacOS/Mach (Darwin) time-base register interface (unlike UpTime,
+   from Carbon, requires no additional libraries to be linked). */
+#if defined(HAVE_MACH_ABSOLUTE_TIME) && defined(HAVE_MACH_MACH_TIME_H) && !defined(HAVE_TICK_COUNTER)
+#include <mach/mach_time.h>
+typedef uint64_t ticks;
+#define getticks mach_absolute_time
+INLINE_ELAPSED(__inline__)
+#define HAVE_TICK_COUNTER
+#endif
+
+/*----------------------------------------------------------------*/
+/*
+ * Pentium cycle counter 
+ */
+#if (defined(__GNUC__) || defined(__ICC)) && defined(__i386__)  && !defined(HAVE_TICK_COUNTER)
+typedef unsigned long long ticks;
+
+static __inline__ ticks getticks(void)
+{
+     ticks ret;
+
+     __asm__ __volatile__("rdtsc": "=A" (ret));
+     /* no input, nothing else clobbered */
+     return ret;
+}
+
+INLINE_ELAPSED(__inline__)
+
+#define HAVE_TICK_COUNTER
+#define TIME_MIN 5000.0   /* unreliable pentium IV cycle counter */
+#endif
+
+/* Visual C++ -- thanks to Morten Nissov for his help with this */
+#if _MSC_VER >= 1200 && _M_IX86 >= 500 && !defined(HAVE_TICK_COUNTER)
+#include <windows.h>
+typedef LARGE_INTEGER ticks;
+#define RDTSC __asm __emit 0fh __asm __emit 031h /* hack for VC++ 5.0 */
+
+static __inline ticks getticks(void)
+{
+     ticks retval;
+
+     __asm {
+	  RDTSC
+	  mov retval.HighPart, edx
+	  mov retval.LowPart, eax
+     }
+     return retval;
+}
+
+static __inline double elapsed(ticks t1, ticks t0)
+{  
+     return (double)t1.QuadPart - (double)t0.QuadPart;
+}  
+
+#define HAVE_TICK_COUNTER
+#define TIME_MIN 5000.0   /* unreliable pentium IV cycle counter */
+#endif
+
+/*----------------------------------------------------------------*/
+/*
+ * X86-64 cycle counter
+ */
+#if (defined(__GNUC__) || defined(__ICC) || defined(__SUNPRO_C)) && defined(__x86_64__)  && !defined(HAVE_TICK_COUNTER)
+typedef unsigned long long ticks;
+
+static __inline__ ticks getticks(void)
+{
+     unsigned a, d; 
+     asm volatile("rdtsc" : "=a" (a), "=d" (d)); 
+     return ((ticks)a) | (((ticks)d) << 32); 
+}
+
+INLINE_ELAPSED(__inline__)
+
+#define HAVE_TICK_COUNTER
+#endif
+
+/* PGI compiler, courtesy Cristiano Calonaci, Andrea Tarsi, & Roberto Gori.
+   NOTE: this code will fail to link unless you use the -Masmkeyword compiler
+   option (grrr). */
+#if defined(__PGI) && defined(__x86_64__) && !defined(HAVE_TICK_COUNTER) 
+typedef unsigned long long ticks;
+static ticks getticks(void)
+{
+    asm(" rdtsc; shl    $0x20,%rdx; mov    %eax,%eax; or     %rdx,%rax;    ");
+}
+INLINE_ELAPSED(__inline__)
+#define HAVE_TICK_COUNTER
+#endif
+
+/* Visual C++, courtesy of Dirk Michaelis */
+#if _MSC_VER >= 1400 && (defined(_M_AMD64) || defined(_M_X64)) && !defined(HAVE_TICK_COUNTER)
+
+#include <intrin.h>
+#pragma intrinsic(__rdtsc)
+typedef unsigned __int64 ticks;
+#define getticks __rdtsc
+INLINE_ELAPSED(__inline)
+
+#define HAVE_TICK_COUNTER
+#endif
+
+/*----------------------------------------------------------------*/
+/*
+ * IA64 cycle counter
+ */
+
+/* intel's icc/ecc compiler */
+#if (defined(__EDG_VERSION) || defined(__ECC)) && defined(__ia64__) && !defined(HAVE_TICK_COUNTER)
+typedef unsigned long ticks;
+#include <ia64intrin.h>
+
+static __inline__ ticks getticks(void)
+{
+     return __getReg(_IA64_REG_AR_ITC);
+}
+ 
+INLINE_ELAPSED(__inline__)
+ 
+#define HAVE_TICK_COUNTER
+#endif
+
+/* gcc */
+#if defined(__GNUC__) && defined(__ia64__) && !defined(HAVE_TICK_COUNTER)
+typedef unsigned long ticks;
+
+static __inline__ ticks getticks(void)
+{
+     ticks ret;
+
+     __asm__ __volatile__ ("mov %0=ar.itc" : "=r"(ret));
+     return ret;
+}
+
+INLINE_ELAPSED(__inline__)
+
+#define HAVE_TICK_COUNTER
+#endif
+
+/* HP/UX IA64 compiler, courtesy Teresa L. Johnson: */
+#if defined(__hpux) && defined(__ia64) && !defined(HAVE_TICK_COUNTER)
+#include <machine/sys/inline.h>
+typedef unsigned long ticks;
+
+static inline ticks getticks(void)
+{
+     ticks ret;
+
+     ret = _Asm_mov_from_ar (_AREG_ITC);
+     return ret;
+}
+
+INLINE_ELAPSED(inline)
+
+#define HAVE_TICK_COUNTER
+#endif
+
+/* Microsoft Visual C++ */
+#if defined(_MSC_VER) && defined(_M_IA64) && !defined(HAVE_TICK_COUNTER)
+typedef unsigned __int64 ticks;
+
+#  ifdef __cplusplus
+extern "C"
+#  endif
+ticks __getReg(int whichReg);
+#pragma intrinsic(__getReg)
+
+static __inline ticks getticks(void)
+{
+     volatile ticks temp;
+     temp = __getReg(3116);
+     return temp;
+}
+
+INLINE_ELAPSED(inline)
+
+#define HAVE_TICK_COUNTER
+#endif
+
+/*----------------------------------------------------------------*/
+/*
+ * PA-RISC cycle counter 
+ */
+#if defined(__hppa__) || defined(__hppa) && !defined(HAVE_TICK_COUNTER)
+typedef unsigned long ticks;
+
+#  ifdef __GNUC__
+static __inline__ ticks getticks(void)
+{
+     ticks ret;
+
+     __asm__ __volatile__("mfctl 16, %0": "=r" (ret));
+     /* no input, nothing else clobbered */
+     return ret;
+}
+#  else
+#  include <machine/inline.h>
+static inline unsigned long getticks(void)
+{
+     register ticks ret;
+     _MFCTL(16, ret);
+     return ret;
+}
+#  endif
+
+INLINE_ELAPSED(inline)
+
+#define HAVE_TICK_COUNTER
+#endif
+
+/*----------------------------------------------------------------*/
+/* S390, courtesy of James Treacy */
+#if defined(__GNUC__) && defined(__s390__) && !defined(HAVE_TICK_COUNTER)
+typedef unsigned long long ticks;
+
+static __inline__ ticks getticks(void)
+{
+     ticks cycles;
+     __asm__("stck 0(%0)" : : "a" (&(cycles)) : "memory", "cc");
+     return cycles;
+}
+
+INLINE_ELAPSED(__inline__)
+
+#define HAVE_TICK_COUNTER
+#endif
+/*----------------------------------------------------------------*/
+#if defined(__GNUC__) && defined(__alpha__) && !defined(HAVE_TICK_COUNTER)
+/*
+ * The 32-bit cycle counter on alpha overflows pretty quickly, 
+ * unfortunately.  A 1GHz machine overflows in 4 seconds.
+ */
+typedef unsigned int ticks;
+
+static __inline__ ticks getticks(void)
+{
+     unsigned long cc;
+     __asm__ __volatile__ ("rpcc %0" : "=r"(cc));
+     return (cc & 0xFFFFFFFF);
+}
+
+INLINE_ELAPSED(__inline__)
+
+#define HAVE_TICK_COUNTER
+#endif
+
+/*----------------------------------------------------------------*/
+#if defined(__GNUC__) && defined(__sparc_v9__) && !defined(HAVE_TICK_COUNTER)
+typedef unsigned long ticks;
+
+static __inline__ ticks getticks(void)
+{
+     ticks ret;
+     __asm__ __volatile__("rd %%tick, %0" : "=r" (ret));
+     return ret;
+}
+
+INLINE_ELAPSED(__inline__)
+
+#define HAVE_TICK_COUNTER
+#endif
+
+/*----------------------------------------------------------------*/
+#if (defined(__DECC) || defined(__DECCXX)) && defined(__alpha) && defined(HAVE_C_ASM_H) && !defined(HAVE_TICK_COUNTER)
+#  include <c_asm.h>
+typedef unsigned int ticks;
+
+static __inline ticks getticks(void)
+{
+     unsigned long cc;
+     cc = asm("rpcc %v0");
+     return (cc & 0xFFFFFFFF);
+}
+
+INLINE_ELAPSED(__inline)
+
+#define HAVE_TICK_COUNTER
+#endif
+/*----------------------------------------------------------------*/
+/* SGI/Irix */
+#if defined(HAVE_CLOCK_GETTIME) && defined(CLOCK_SGI_CYCLE) && !defined(HAVE_TICK_COUNTER)
+typedef struct timespec ticks;
+
+static inline ticks getticks(void)
+{
+     struct timespec t;
+     clock_gettime(CLOCK_SGI_CYCLE, &t);
+     return t;
+}
+
+static inline double elapsed(ticks t1, ticks t0)
+{
+     return ((double)t1.tv_sec - (double)t0.tv_sec) * 1.0E9 +
+	  ((double)t1.tv_nsec - (double)t0.tv_nsec);
+}
+#define HAVE_TICK_COUNTER
+#endif
+
+/*----------------------------------------------------------------*/
+/* Cray UNICOS _rtc() intrinsic function */
+#if defined(HAVE__RTC) && !defined(HAVE_TICK_COUNTER)
+#ifdef HAVE_INTRINSICS_H
+#  include <intrinsics.h>
+#endif
+
+typedef long long ticks;
+
+#define getticks _rtc
+
+INLINE_ELAPSED(inline)
+
+#define HAVE_TICK_COUNTER
+#endif
+
+/*----------------------------------------------------------------*/
+/* MIPS ZBus */
+#if HAVE_MIPS_ZBUS_TIMER
+#if defined(__mips__) && !defined(HAVE_TICK_COUNTER)
+#include <sys/mman.h>
+#include <unistd.h>
+#include <fcntl.h>
+
+typedef uint64_t ticks;
+
+static inline ticks getticks(void)
+{
+  static uint64_t* addr = 0;
+
+  if (addr == 0)
+  {
+    uint32_t rq_addr = 0x10030000;
+    int fd;
+    int pgsize;
+
+    pgsize = getpagesize();
+    fd = open ("/dev/mem", O_RDONLY | O_SYNC, 0);
+    if (fd < 0) {
+      perror("open");
+      return NULL;
+    }
+    addr = mmap(0, pgsize, PROT_READ, MAP_SHARED, fd, rq_addr);
+    close(fd);
+    if (addr == (uint64_t *)-1) {
+      perror("mmap");
+      return NULL;
+    }
+  }
+
+  return *addr;
+}
+
+INLINE_ELAPSED(inline)
+
+#define HAVE_TICK_COUNTER
+#endif
+#endif /* HAVE_MIPS_ZBUS_TIMER */
+
diff --git a/lib/gc.nim b/lib/gc.nim
index 680256a93..344aa33f3 100644
--- a/lib/gc.nim
+++ b/lib/gc.nim
@@ -54,19 +54,6 @@ proc getTotalMem(): int = return tlsfMax()
 
 # ---------------------------------------------------------------------------
 
-# After several attempts, we now use a novel approach for cycle detection:
-# increments/decrements of the reference counters are enqued into a buffer
-# and not immediately performed. The reason is that increments may introduce
-# new garbage cycles. The cycle detector only scans the changed subgraph. This
-# provides superior performance. Of course only cells that may be part of
-# a cycle are considered. However, reallocation does not work with this scheme!
-# Because the queue may contain references to the old cell.
-# The queue is thread-local storage, so that no synchronization is needed for
-# reference counting.
-
-# With this scheme, the entire heap is never searched and there is no need for
-# the AT.
-
 const
   debugGC = false # we wish to debug the GC...
   logGC = false
@@ -89,7 +76,7 @@ const
                       # this seems to be a good value
 
 const
-  MemAlignment = sizeof(pointer)*2 # minimal memory block that can be allocated
+  MemAlignment = 8 # BUGFIX: on AMD64, dlmalloc aligns at 8 byte boundary
   BitsPerUnit = sizeof(int)*8
     # a "unit" is a word, i.e. 4 bytes
     # on a 32 bit system; I do not use the term "word" because under 32-bit
@@ -255,8 +242,14 @@ proc inOperator(s: TCellSeq, c: PCell): bool {.inline.} =
 proc add(s: var TCellSeq, c: PCell) {.inline.} =
   if s.len >= s.cap:
     s.cap = s.cap * 3 div 2
-    s.d = cast[PCellArray](tlsf_realloc(s.d, s.cap * sizeof(PCell)))
-    if s.d == nil: raiseOutOfMem()
+    var d = cast[PCellArray](tlsf_malloc(s.cap * sizeof(PCell)))
+    if d == nil: raiseOutOfMem()
+    copyMem(d, s.d, s.len * sizeof(PCell))
+    tlsf_free(s.d)
+    s.d = d
+    # BUGFIX: realloc failes on AMD64, sigh...
+    #s.d = cast[PCellArray](tlsf_realloc(s.d, s.cap * sizeof(PCell)))
+    #if s.d == nil: raiseOutOfMem()
   s.d[s.len] = c
   inc(s.len)
 
@@ -383,7 +376,7 @@ iterator elements(t: TCellSet): PCell {.inline.} =
 
 # --------------- end of Cellset routines -------------------------------------
 
-when logGC or traceGC:
+when debugGC:
   proc writeCell(msg: CString, c: PCell) =
     var kind = -1
     if c.typ != nil: kind = ord(c.typ.kind)
@@ -707,7 +700,6 @@ proc collectCycles(gch: var TGcHeap) =
   var tabSize = 0
   for c in elements(gch.cycleRoots):
     inc(tabSize)
-    assert(c.typ != nil)
     forallChildren(c, waCycleDecRef)
   gch.cycleTableSize = max(gch.cycleTableSize, tabSize)
 
diff --git a/lib/macros.nim b/lib/macros.nim
index 809531c4c..b307c00cb 100644
--- a/lib/macros.nim
+++ b/lib/macros.nim
@@ -30,59 +30,59 @@
 #  if key[-4:] == "Flag": continue

 #  cog.out(toEnum(key, val))

 #]]]

-type

-  TNimrodTypeKind* = enum

-    ntyNone, ntyBool, ntyChar, ntyEmpty, 

-    ntyArrayConstr, ntyNil, ntyGeneric, ntyGenericInst, 

-    ntyGenericParam, ntyEnum, ntyAnyEnum, ntyArray, 

-    ntyObject, ntyTuple, ntySet, ntyRange, 

-    ntyPtr, ntyRef, ntyVar, ntySequence, 

-    ntyProc, ntyPointer, ntyOpenArray, ntyString, 

-    ntyCString, ntyForward, ntyInt, ntyInt8, 

-    ntyInt16, ntyInt32, ntyInt64, ntyFloat, 

-    ntyFloat32, ntyFloat64, ntyFloat128

-  TNimTypeKinds* = set[TNimrodTypeKind]

-  TNimrodSymKind* = enum

-    nskUnknownSym, nskConditional, nskDynLib, nskParam, 

-    nskTypeParam, nskTemp, nskType, nskConst, 

-    nskVar, nskProc, nskIterator, nskConverter, 

-    nskMacro, nskTemplate, nskField, nskEnumField, 

-    nskForVar, nskModule, nskLabel, nskStub

-  TNimSymKinds* = set[TNimrodSymKind]

-  TNimrodNodeKind* = enum

-    nnkNone, nnkEmpty, nnkIdent, nnkSym, 

-    nnkType, nnkCharLit, nnkIntLit, nnkInt8Lit, 

-    nnkInt16Lit, nnkInt32Lit, nnkInt64Lit, nnkFloatLit, 

-    nnkFloat32Lit, nnkFloat64Lit, nnkStrLit, nnkRStrLit, 

-    nnkTripleStrLit, nnkMetaNode, nnkNilLit, nnkDotCall, 

-    nnkCommand, nnkCall, nnkGenericCall, nnkExplicitTypeListCall, 

-    nnkExprEqExpr, nnkExprColonExpr, nnkIdentDefs, nnkInfix, 

-    nnkPrefix, nnkPostfix, nnkPar, nnkCurly, 

-    nnkBracket, nnkBracketExpr, nnkPragmaExpr, nnkRange, 

-    nnkDotExpr, nnkCheckedFieldExpr, nnkDerefExpr, nnkIfExpr, 

-    nnkElifExpr, nnkElseExpr, nnkLambda, nnkAccQuoted, 

-    nnkHeaderQuoted, nnkTableConstr, nnkQualified, nnkHiddenStdConv, 

-    nnkHiddenSubConv, nnkHiddenCallConv, nnkConv, nnkCast, 

-    nnkAddr, nnkHiddenAddr, nnkHiddenDeref, nnkObjDownConv, 

-    nnkObjUpConv, nnkChckRangeF, nnkChckRange64, nnkChckRange, 

-    nnkStringToCString, nnkCStringToString, nnkPassAsOpenArray, nnkAsgn, 

-    nnkDefaultTypeParam, nnkGenericParams, nnkFormalParams, nnkOfInherit, 

-    nnkModule, nnkProcDef, nnkConverterDef, nnkMacroDef, 

-    nnkTemplateDef, nnkIteratorDef, nnkOfBranch, nnkElifBranch, 

-    nnkExceptBranch, nnkElse, nnkMacroStmt, nnkAsmStmt, 

-    nnkPragma, nnkIfStmt, nnkWhenStmt, nnkForStmt, 

-    nnkWhileStmt, nnkCaseStmt, nnkVarSection, nnkConstSection, 

-    nnkConstDef, nnkTypeSection, nnkTypeDef, nnkYieldStmt, 

-    nnkTryStmt, nnkFinally, nnkRaiseStmt, nnkReturnStmt, 

-    nnkBreakStmt, nnkContinueStmt, nnkBlockStmt, nnkDiscardStmt, 

-    nnkStmtList, nnkImportStmt, nnkFromStmt, nnkImportAs, 

-    nnkIncludeStmt, nnkAccessStmt, nnkCommentStmt, nnkStmtListExpr, 

-    nnkBlockExpr, nnkStmtListType, nnkBlockType, nnkVm, 

-    nnkTypeOfExpr, nnkObjectTy, nnkTupleTy, nnkRecList, 

-    nnkRecCase, nnkRecWhen, nnkRefTy, nnkPtrTy, 

-    nnkVarTy, nnkProcTy, nnkEnumTy, nnkEnumFieldDef, 

-    nnkReturnToken

-  TNimNodeKinds* = set[TNimrodNodeKind]

+type
+  TNimrodNodeKind* = enum
+    nnkNone, nnkEmpty, nnkIdent, nnkSym, 
+    nnkType, nnkCharLit, nnkIntLit, nnkInt8Lit, 
+    nnkInt16Lit, nnkInt32Lit, nnkInt64Lit, nnkFloatLit, 
+    nnkFloat32Lit, nnkFloat64Lit, nnkStrLit, nnkRStrLit, 
+    nnkTripleStrLit, nnkMetaNode, nnkNilLit, nnkDotCall, 
+    nnkCommand, nnkCall, nnkGenericCall, nnkExplicitTypeListCall, 
+    nnkExprEqExpr, nnkExprColonExpr, nnkIdentDefs, nnkInfix, 
+    nnkPrefix, nnkPostfix, nnkPar, nnkCurly, 
+    nnkBracket, nnkBracketExpr, nnkPragmaExpr, nnkRange, 
+    nnkDotExpr, nnkCheckedFieldExpr, nnkDerefExpr, nnkIfExpr, 
+    nnkElifExpr, nnkElseExpr, nnkLambda, nnkAccQuoted, 
+    nnkHeaderQuoted, nnkTableConstr, nnkQualified, nnkHiddenStdConv, 
+    nnkHiddenSubConv, nnkHiddenCallConv, nnkConv, nnkCast, 
+    nnkAddr, nnkHiddenAddr, nnkHiddenDeref, nnkObjDownConv, 
+    nnkObjUpConv, nnkChckRangeF, nnkChckRange64, nnkChckRange, 
+    nnkStringToCString, nnkCStringToString, nnkPassAsOpenArray, nnkAsgn, 
+    nnkDefaultTypeParam, nnkGenericParams, nnkFormalParams, nnkOfInherit, 
+    nnkModule, nnkProcDef, nnkConverterDef, nnkMacroDef, 
+    nnkTemplateDef, nnkIteratorDef, nnkOfBranch, nnkElifBranch, 
+    nnkExceptBranch, nnkElse, nnkMacroStmt, nnkAsmStmt, 
+    nnkPragma, nnkIfStmt, nnkWhenStmt, nnkForStmt, 
+    nnkWhileStmt, nnkCaseStmt, nnkVarSection, nnkConstSection, 
+    nnkConstDef, nnkTypeSection, nnkTypeDef, nnkYieldStmt, 
+    nnkTryStmt, nnkFinally, nnkRaiseStmt, nnkReturnStmt, 
+    nnkBreakStmt, nnkContinueStmt, nnkBlockStmt, nnkDiscardStmt, 
+    nnkStmtList, nnkImportStmt, nnkFromStmt, nnkImportAs, 
+    nnkIncludeStmt, nnkAccessStmt, nnkCommentStmt, nnkStmtListExpr, 
+    nnkBlockExpr, nnkStmtListType, nnkBlockType, nnkVm, 
+    nnkTypeOfExpr, nnkObjectTy, nnkTupleTy, nnkRecList, 
+    nnkRecCase, nnkRecWhen, nnkRefTy, nnkPtrTy, 
+    nnkVarTy, nnkProcTy, nnkEnumTy, nnkEnumFieldDef, 
+    nnkReturnToken
+  TNimNodeKinds* = set[TNimrodNodeKind]
+  TNimrodTypeKind* = enum
+    ntyNone, ntyBool, ntyChar, ntyEmpty, 
+    ntyArrayConstr, ntyNil, ntyGeneric, ntyGenericInst, 
+    ntyGenericParam, ntyEnum, ntyAnyEnum, ntyArray, 
+    ntyObject, ntyTuple, ntySet, ntyRange, 
+    ntyPtr, ntyRef, ntyVar, ntySequence, 
+    ntyProc, ntyPointer, ntyOpenArray, ntyString, 
+    ntyCString, ntyForward, ntyInt, ntyInt8, 
+    ntyInt16, ntyInt32, ntyInt64, ntyFloat, 
+    ntyFloat32, ntyFloat64, ntyFloat128
+  TNimTypeKinds* = set[TNimrodTypeKind]
+  TNimrodSymKind* = enum
+    nskUnknownSym, nskConditional, nskDynLib, nskParam, 
+    nskTypeParam, nskTemp, nskType, nskConst, 
+    nskVar, nskProc, nskIterator, nskConverter, 
+    nskMacro, nskTemplate, nskField, nskEnumField, 
+    nskForVar, nskModule, nskLabel, nskStub
+  TNimSymKinds* = set[TNimrodSymKind]
 #[[[end]]]

 

 type

diff --git a/lib/os.nim b/lib/os.nim
index 8ec781000..fa53fa3e2 100644
--- a/lib/os.nim
+++ b/lib/os.nim
@@ -1062,14 +1062,14 @@ proc cmpPaths(pathA, pathB: string): int =
     result = cmpIgnoreCase(pathA, pathB)
 
 proc extractDir(path: string): string =
-  if path[path.len-1] in {dirSep, altSep}:
+  if path.len == 0 or path[path.len-1] in {dirSep, altSep}:
     result = path
   else:
     var tail: string
     splitPath(path, result, tail)
 
 proc extractFilename(path: string): string =
-  if path[path.len-1] in {dirSep, altSep}:
+  if path.len == 0 or path[path.len-1] in {dirSep, altSep}:
     result = ""
   else:
     var head: string
diff --git a/lib/osproc.nim b/lib/osproc.nim
new file mode 100644
index 000000000..2282e802d
--- /dev/null
+++ b/lib/osproc.nim
@@ -0,0 +1,395 @@
+#
+#
+#            Nimrod's Runtime Library
+#        (c) Copyright 2008 Andreas Rumpf
+#
+#    See the file "copying.txt", included in this
+#    distribution, for details about the copyright.
+#
+
+## This module implements an advanced facility for executing OS processes.
+## On Windows this module is currently broken. Please help!
+
+import
+  os, strtabs, streams
+
+when defined(windows):
+  import windows
+
+type
+  TProcess = object of TObject
+    when defined(windows):
+      FProcessHandle: Thandle
+      FThreadHandle: Thandle
+      inputHandle, outputHandle, errorHandle: TFileHandle
+    else:
+      inputHandle, outputHandle, errorHandle: TFileHandle
+    id: cint
+    exitCode: cint
+
+  PProcess* = ref TProcess ## represents an operating system process
+
+  TProcessOption* = enum ## options that can be passed `startProcess`
+    poNone,              ## none option
+    poUseShell,          ## use the shell to execute the command; NOTE: This
+                         ## often creates a security whole!
+    poStdErrToStdOut     ## merge stdout and stderr to the stdout stream
+
+proc executeProcess*(command: string,
+                     options: set[TProcessOption] = {poStdErrToStdOut,
+                                                     poUseShell}): string
+  ## A convience procedure that executes ``command`` with ``startProcess``
+  ## and returns its output as a string.
+
+proc startProcess*(command: string,
+                   workingDir: string = "",
+                   args: openarray[string] = [],
+                   env: PStringTable = nil,
+                   options: set[TProcessOption] = {poStdErrToStdOut}): PProcess
+  ## Starts a process. `Command` is the executable file, `workingDir` is the
+  ## process's working directory. If ``workingDir == ""`` the current directory
+  ## is used. `args` are the command line arguments that are passed to the
+  ## process. On many operating systems, the first command line argument is the
+  ## name of the executable. `args` should not contain this argument!
+  ## `startProcess` takes care of that. `env` is the environment that will be
+  ## passed to the process. If ``env == nil`` the environment is inherited of
+  ## the parent process. `options` are additional flags that may be passed
+  ## to `startProcess`. See the documentation of ``TProcessOption`` for the
+  ## meaning of these flags.
+  ## Return value: The newly created process object. Nil is never returned,
+  ## but ``EOS`` is raised in case of an error.
+
+when true:
+  nil
+else:
+  proc startGUIProcess*(command: string,
+                     workingDir: string = "",
+                     args: openarray[string] = [],
+                     env: PStringTable = nil,
+                     x = -1,
+                     y = -1,
+                     width = -1,
+                     height = -1): PProcess
+
+proc suspend*(p: PProcess)
+  ## Suspends the process `p`.
+
+proc resume*(p: PProcess)
+  ## Resumes the process `p`.
+
+proc terminate*(p: PProcess)
+  ## Terminates the process `p`.
+
+proc running*(p: PProcess): bool
+  ## Returns true iff the process `p` is still running. Returns immediately.
+
+proc processID*(p: PProcess): int =
+  ## returns `p`'s process ID.
+  return p.id
+
+proc waitForExit*(p: PProcess): int
+  ## waits for the process to finish and returns `p`'s error code.
+
+proc inputStream*(p: PProcess): PStream
+  ## returns ``p``'s input stream for writing to
+
+proc outputStream*(p: PProcess): PStream
+  ## returns ``p``'s output stream for reading from
+
+proc errorStream*(p: PProcess): PStream
+  ## returns ``p``'s output stream for reading from
+
+proc executeProcess*(command: string,
+                     options: set[TProcessOption] = {poStdErrToStdOut,
+                                                     poUseShell}): string =
+  var c = parseCmdLine(command)
+  var a: seq[string] = @[] # slicing is not yet implemented :-(
+  for i in 1 .. c.len-1: add(a, c[i])
+  var p = startProcess(command=c[0], args=a, options=options)
+  var outp = outputStream(p)
+  result = ""
+  while running(p) or not outp.atEnd(outp):
+    result.add(outp.readLine())
+    result.add("\n")
+
+when false:
+  proc deallocCStringArray(a: cstringArray) =
+    var i = 0
+    while a[i] != nil:
+      dealloc(a[i])
+      inc(i)
+    dealloc(a)
+
+when defined(Windows):
+  # We need to implement a handle stream for Windows:
+  type
+    PFileHandleStream = ref TFileHandleStream
+    TFileHandleStream = object of TStream
+      handle: THandle
+      atTheEnd: bool
+
+  proc hsClose(s: PFileHandleStream) = nil # nothing to do here
+  proc hsAtEnd(s: PFileHandleStream): bool = return true
+
+  proc hsReadData(s: PFileHandleStream, buffer: pointer, bufLen: int): int =
+    var br: int32
+    var a = windows.ReadFile(s.handle, buffer, bufLen, br, nil)
+    if a == 0: OSError()
+    result = br
+    #atEnd = bytesRead < bufLen
+
+  proc hsWriteData(s: PFileHandleStream, buffer: pointer, bufLen: int) =
+    var bytesWritten: int32
+    var a = windows.writeFile(s.handle, buffer, bufLen, bytesWritten, nil)
+    if a == 0: OSError()
+
+  proc newFileHandleStream(handle: THandle): PFileHandleStream =
+    new(result)
+    result.handle = handle
+    result.close = hsClose
+    result.atEnd = hsAtEnd
+    result.readData = hsReadData
+    result.writeData = hsWriteData
+
+  proc buildCommandLine(a: string, args: openarray[string]): cstring =
+    var L = a.len
+    for i in 0..high(args): inc(L, args[i].len+1)
+    result = cast[cstring](alloc0(L+1))
+    copyMem(result, cstring(a), a.len)
+    L = a.len
+    for i in 0..high(args):
+      result[L] = ' '
+      inc(L)
+      copyMem(addr(result[L]), cstring(args[i]), args[i].len)
+      inc(L, args[i].len)
+
+  proc buildEnv(env: PStringTable): cstring =
+    var L = 0
+    for key, val in pairs(env): inc(L, key.len + val.len + 2)
+    result = cast[cstring](alloc0(L+2))
+    L = 0
+    for key, val in pairs(env):
+      var x = key & "=" & val
+      copyMem(addr(result[L]), cstring(x), x.len+1) # copy \0
+      inc(L, x.len+1)
+
+  #proc open_osfhandle(osh: THandle, mode: int): int {.
+  #  importc: "_open_osfhandle", header: "<fcntl.h>".}
+
+  #var
+  #  O_WRONLY {.importc: "_O_WRONLY", header: "<fcntl.h>".}: int
+  #  O_RDONLY {.importc: "_O_RDONLY", header: "<fcntl.h>".}: int
+
+  proc CreatePipeHandles(Inhandle, OutHandle: ptr THandle) =
+    var piInheritablePipe: TSecurityAttributes
+    piInheritablePipe.nlength = SizeOF(TSecurityAttributes)
+    piInheritablePipe.lpSecurityDescriptor = Nil
+    piInheritablePipe.Binherithandle = 1
+    if CreatePipe(Inhandle, Outhandle, addr(piInheritablePipe), 0) == 0'i32:
+      OSError()
+
+  proc startProcess*(command: string,
+                 workingDir: string = "",
+                 args: openarray[string] = [],
+                 env: PStringTable = nil,
+                 options: set[TProcessOption] = {poStdErrToStdOut}): PProcess =
+    new(result)
+    var
+      SI: TStartupInfo
+      ProcInfo: TProcessInformation
+      success: int
+      hi, ho, he: THandle
+    SI.cb = SizeOf(SI)
+    SI.dwFlags = STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES
+    CreatePipeHandles(addr(SI.hStdInput), addr(HI))
+    CreatePipeHandles(addr(HO), addr(Si.hStdOutput))
+    #SI.hStdInput = GetStdHandle(STD_INPUT_HANDLE())
+    #SI.hStdOutput = GetStdHandle(STD_OUTPUT_HANDLE())
+    if poStdErrToStdOut in options:
+      SI.hStdError = SI.hStdOutput
+      HE = HO
+    else:
+      CreatePipeHandles(addr(HE), addr(Si.hStdError))
+      #SI.hStdError = GetStdHandle(STD_ERROR_HANDLE())
+    #result.inputHandle = open_osfhandle(HI, O_WRONLY)
+    #if result.inputHandle == -1'i32: OSError()
+    result.inputHandle = hi
+    result.outputHandle = ho
+    result.errorHandle = he
+    #result.outputHandle = open_osfhandle(HO, O_RDONLY)
+    #if result.outputHandle == -1'i32: OSError()
+    #result.errorHandle = open_osfhandle(HE, O_RDONLY)
+    #if result.errorHandle == -1'i32: OSError()
+    var cmdl = buildCommandLine(command, args)
+    var wd: cstring = nil
+    if len(workingDir) > 0: wd = workingDir
+    if env == nil:
+      success = Windows.CreateProcess(nil,
+        cmdl, nil, nil, 0,
+        NORMAL_PRIORITY_CLASS, nil, wd,
+        addr(SI), addr(ProcInfo))
+    else:
+      var e = buildEnv(env)
+      success = Windows.CreateProcess(nil,
+        cmdl, nil, nil, 0,
+        NORMAL_PRIORITY_CLASS, e, wd,
+        addr(SI), addr(ProcInfo))
+      dealloc(e)
+    dealloc(cmdl)
+    if success == 0:
+      OSError()
+    result.FProcessHandle = procInfo.hProcess
+    result.FThreadHandle = procInfo.hThread
+    result.id = procInfo.dwProcessID
+
+  proc suspend(p: PProcess) =
+    discard SuspendThread(p.FThreadHandle)
+
+  proc resume(p: PProcess) =
+    discard ResumeThread(p.FThreadHandle)
+
+  proc running(p: PProcess): bool =
+    var x = waitForSingleObject(p.FThreadHandle, 50)
+    return x == WAIT_TIMEOUT
+
+  proc terminate(p: PProcess) =
+    if running(p):
+      discard TerminateProcess(p.FProcessHandle, 0)
+
+  proc waitForExit(p: PProcess): int =
+    discard WaitForSingleObject(p.FThreadHandle, Infinite)
+    var res: dword
+    discard GetExitCodeProcess(p.FProcessHandle, res)
+    result = res
+    discard CloseHandle(p.FThreadHandle)
+    discard CloseHandle(p.FProcessHandle)
+
+  proc inputStream(p: PProcess): PStream =
+    result = newFileHandleStream(p.inputHandle)
+
+  proc outputStream(p: PProcess): PStream =
+    result = newFileHandleStream(p.outputHandle)
+
+  proc errorStream(p: PProcess): PStream =
+    result = newFileHandleStream(p.errorHandle)
+
+else:
+  import posix
+
+  const
+    readIdx = 0
+    writeIdx = 1
+
+  proc addCmdArgs(command: string, args: openarray[string]): string =
+    result = command
+    for i in 0 .. high(args):
+      add(result, " ")
+      add(result, args[i])
+
+  proc toCStringArray(b, a: openarray[string]): cstringArray =
+    result = cast[cstringArray](alloc0((a.len + b.len + 1) * sizeof(cstring)))
+    for i in 0..high(b):
+      result[i] = cast[cstring](alloc(b[i].len+1))
+      copyMem(result[i], cstring(b[i]), b[i].len+1)
+    for i in 0..high(a):
+      result[i+b.len] = cast[cstring](alloc(a[i].len+1))
+      copyMem(result[i+b.len], cstring(a[i]), a[i].len+1)
+
+  proc ToCStringArray(t: PStringTable): cstringArray =
+    result = cast[cstringArray](alloc0((t.len + 1) * sizeof(cstring)))
+    var i = 0
+    for key, val in pairs(t):
+      var x = key & "=" & val
+      result[i] = cast[cstring](alloc(x.len+1))
+      copyMem(result[i], addr(x[0]), x.len+1)
+      inc(i)
+
+  proc startProcess*(command: string,
+                 workingDir: string = "",
+                 args: openarray[string] = [],
+                 env: PStringTable = nil,
+                 options: set[TProcessOption] = {poStdErrToStdOut}): PProcess =
+    new(result)
+    var
+      p_stdin, p_stdout, p_stderr: array [0..1, cint]
+    if pipe(p_stdin) != 0'i32 or pipe(p_stdout) != 0'i32:
+      OSError("failed to create a pipe")
+    var Pid = fork()
+    if Pid < 0:
+      OSError("failed to fork process")
+
+    if pid == 0:
+      ## child process:
+      discard close(p_stdin[writeIdx])
+      discard dup2(p_stdin[readIdx], readIdx)
+      discard close(p_stdout[readIdx])
+      discard dup2(p_stdout[writeIdx], writeIdx)
+      if poStdErrToStdOut in options:
+        discard dup2(p_stdout[writeIdx], 2)
+      else:
+        if pipe(p_stderr) != 0'i32: OSError("failed to create a pipe")
+        discard close(p_stderr[readIdx])
+        discard dup2(p_stderr[writeIdx], 2)
+
+      if workingDir.len > 0:
+        os.setCurrentDir(workingDir)
+      if poUseShell notin options:
+        var a = toCStringArray([extractFilename(command)], args)
+        if env == nil:
+          discard execv(command, a)
+        else:
+          discard execve(command, a, ToCStringArray(env))
+      else:
+        var x = addCmdArgs(command, args)
+        var a = toCStringArray(["sh", "-c"], [x])
+        if env == nil:
+          discard execv("/bin/sh", a)
+        else:
+          discard execve("/bin/sh", a, ToCStringArray(env))
+      # too risky to raise an exception here:
+      echo("execve call failed: " & $strerror(errno))
+      quit(1)
+    # Parent process. Copy process information.
+    result.id = pid
+
+    result.inputHandle = p_stdin[writeIdx]
+    result.outputHandle = p_stdout[readIdx]
+    if poStdErrToStdOut in options:
+      result.errorHandle = result.outputHandle
+    else:
+      result.errorHandle = p_stderr[readIdx]
+      discard close(p_stderr[writeIdx])
+    discard close(p_stdin[readIdx])
+    discard close(p_stdout[writeIdx])
+
+  proc suspend(p: PProcess) =
+    discard kill(p.id, SIGSTOP)
+
+  proc resume(p: PProcess) =
+    discard kill(p.id, SIGCONT)
+
+  proc running(p: PProcess): bool =
+    result = waitPid(p.id, p.exitCode, WNOHANG) == int(p.id)
+
+  proc terminate(p: PProcess) =
+    if kill(p.id, SIGTERM) == 0'i32:
+      if running(p): discard kill(p.id, SIGKILL)
+
+  proc waitForExit(p: PProcess): int =
+    if waitPid(p.id, p.exitCode, 0) == int(p.id):
+      result = p.exitCode
+
+  proc inputStream(p: PProcess): PStream =
+    var f: TFile
+    if not openFile(f, p.inputHandle, fmWrite): OSError()
+    result = newFileStream(f)
+
+  proc outputStream(p: PProcess): PStream =
+    var f: TFile
+    if not openFile(f, p.outputHandle, fmRead): OSError()
+    result = newFileStream(f)
+
+  proc errorStream(p: PProcess): PStream =
+    var f: TFile
+    if not openFile(f, p.errorHandle, fmRead): OSError()
+    result = newFileStream(f)
diff --git a/lib/profiler.nim b/lib/profiler.nim
new file mode 100644
index 000000000..97c7dcfeb
--- /dev/null
+++ b/lib/profiler.nim
@@ -0,0 +1,61 @@
+#
+#
+#            Nimrod's Runtime Library
+#        (c) Copyright 2008 Andreas Rumpf
+#
+#    See the file "copying.txt", included in this
+#    distribution, for details about the copyright.
+#
+
+# This file implements the Nimrod profiler. The profiler needs support by the
+# code generator. 
+
+type
+  TProfileData {.compilerproc, final.} = object
+    procname: cstring
+    total: float
+
+var
+  profileData {.compilerproc.}: array [0..64*1024-1, TProfileData]
+
+proc sortProfile(a: var array[0..64*1024-1, TProfileData], N: int) = 
+  # we use shellsort here; fast enough and simple
+  var h = 1
+  while true: 
+    h = 3 * h + 1
+    if h > N: break 
+  while true: 
+    h = h div 3
+    for i in countup(h, N - 1): 
+      var v = a[i]
+      var j = i
+      while a[j-h].total <= v.total: 
+        a[j] = a[j-h]
+        j = j-h
+        if j < h: break 
+      a[j] = v
+    if h == 1: break
+
+proc writeProfile() {.noconv.} =
+  const filename = "profile_results"
+  var i = 0
+  var f: TFile
+  var j = 1
+  while openFile(f, filename & $j & ".txt"):
+    closeFile(f)
+    inc(j)
+  if openFile(f, filename & $j & ".txt", fmWrite):
+    var N = 0
+    # we have to compute the actual length of the array:
+    while profileData[N].procname != nil: inc(N)
+    sortProfile(profileData, N)
+    writeln(f, "total running time of each proc" &
+               " (interpret these numbers relatively)")
+    while profileData[i].procname != nil:
+      write(f, profileData[i].procname)
+      write(f, ": ")
+      writeln(f, profileData[i].total)
+      inc(i)
+    closeFile(f)
+
+addQuitProc(writeProfile)
diff --git a/lib/streams.nim b/lib/streams.nim
new file mode 100644
index 000000000..f09b91625
--- /dev/null
+++ b/lib/streams.nim
@@ -0,0 +1,244 @@
+#
+#
+#            Nimrod's Runtime Library
+#        (c) Copyright 2008 Andreas Rumpf
+#
+#    See the file "copying.txt", included in this
+#    distribution, for details about the copyright.
+#
+
+## This module provides a stream interface and two implementations thereof:
+## the `PFileStream` and the `PStringStream` which implement the stream
+## interface for Nimrod file objects (`TFile`) and strings. Other modules
+## may provide other implementations for this standard stream interface.
+
+proc newEIO(msg: string): ref EIO =
+  new(result)
+  result.msg = msg
+
+type
+  PStream* = ref TStream
+  TStream* = object of TObject ## Stream interface that supports
+                               ## writing or reading.
+    close*: proc (s: PStream)
+    atEnd*: proc (s: PStream): bool
+    setPosition*: proc (s: PStream, pos: int)
+    getPosition*: proc (s: PStream): int
+    readData*: proc (s: PStream, buffer: pointer, bufLen: int): int
+    writeData*: proc (s: PStream, buffer: pointer, bufLen: int)
+
+proc write*[T](s: PStream, x: T) = 
+  ## generic write procedure. Writes `x` to the stream `s`. Implementation:
+  ##
+  ## .. code-block:: Nimrod
+  ##
+  ##     s.writeData(s, addr(x), sizeof(x))
+  var x = x
+  s.writeData(s, addr(x), sizeof(x))
+
+proc write*(s: PStream, x: string) = 
+  ## writes the string `x` to the the stream `s`. No length field or 
+  ## terminating zero is written.
+  s.writeData(s, cstring(x), x.len)
+
+proc read[T](s: PStream, result: var T) = 
+  ## generic write procedure. Reads `result` from the stream `s`.
+  if s.readData(s, addr(result), sizeof(T)) != sizeof(T):
+    raise newEIO("cannot read from stream")
+
+proc readChar*(s: PStream): char =
+  ## reads a char from the stream `s`. Raises `EIO` if an error occured.
+  read(s, result)
+
+proc readBool*(s: PStream): bool = 
+  ## reads a bool from the stream `s`. Raises `EIO` if an error occured.
+  read(s, result)
+
+proc readInt8*(s: PStream): int8 = 
+  ## reads an int8 from the stream `s`. Raises `EIO` if an error occured.
+  read(s, result)
+
+proc readInt16*(s: PStream): int16 = 
+  ## reads an int16 from the stream `s`. Raises `EIO` if an error occured.
+  read(s, result)
+
+proc readInt32*(s: PStream): int32 = 
+  ## reads an int32 from the stream `s`. Raises `EIO` if an error occured.
+  read(s, result)
+
+proc readInt64*(s: PStream): int64 = 
+  ## reads an int64 from the stream `s`. Raises `EIO` if an error occured.
+  read(s, result)
+
+proc readFloat32*(s: PStream): float32 = 
+  ## reads a float32 from the stream `s`. Raises `EIO` if an error occured.
+  read(s, result)
+
+proc readFloat64*(s: PStream): float64 = 
+  ## reads a float64 from the stream `s`. Raises `EIO` if an error occured.
+  read(s, result)
+
+proc readStr*(s: PStream, length: int): string = 
+  ## reads a string of length `length` from the stream `s`. Raises `EIO` if 
+  ## an error occured.
+  result = newString(length)
+  var L = s.readData(s, addr(result[0]), length)
+  if L != length: setLen(result, L)
+
+proc readLine*(s: PStream): string =
+  ## Reads a line from a stream `s`. Note: This is not very efficient. Raises 
+  ## `EIO` if an error occured.
+  result = ""
+  while not s.atEnd(s): 
+    var c = readChar(s)
+    if c == '\c': 
+      c = readChar(s)
+      break
+    elif c == '\L': break
+    result.add(c)
+
+type
+  PStringStream* = ref TStringStream ## a stream that encapsulates a string
+  TStringStream* = object of TStream
+    data: string
+    pos: int
+    
+proc ssAtEnd(s: PStringStream): bool = 
+  return s.pos >= s.data.len
+    
+proc ssSetPosition(s: PStringStream, pos: int) = 
+  s.pos = min(pos, s.data.len-1)
+
+proc ssGetPosition(s: PStringStream): int =
+  return s.pos
+
+proc ssReadData(s: PStringStream, buffer: pointer, bufLen: int): int =
+  result = min(bufLen, s.data.len - s.pos)
+  if result > 0: 
+    copyMem(buffer, addr(s.data[s.pos]), result)
+    inc(s.pos, result)
+
+proc ssWriteData(s: PStringStream, buffer: pointer, bufLen: int) = 
+  if bufLen > 0: 
+    setLen(s.data, s.data.len + bufLen)
+    copyMem(addr(s.data[s.pos]), buffer, bufLen)
+    inc(s.pos, bufLen)
+
+proc ssClose(s: PStringStream) =
+  s.data = nil
+
+proc newStringStream*(s: string = ""): PStringStream = 
+  ## creates a new stream from the string `s`.
+  new(result)
+  result.data = s
+  result.pos = 0
+  result.close = ssClose
+  result.atEnd = ssAtEnd
+  result.setPosition = ssSetPosition
+  result.getPosition = ssGetPosition
+  result.readData = ssReadData
+  result.writeData = ssWriteData
+
+type
+  PFileStream* = ref TFileStream ## a stream that encapsulates a `TFile`
+  TFileStream* = object of TStream
+    f: TFile
+
+proc fsClose(s: PFileStream) = closeFile(s.f)
+proc fsAtEnd(s: PFileStream): bool = return EndOfFile(s.f)
+proc fsSetPosition(s: PFileStream, pos: int) = setFilePos(s.f, pos)
+proc fsGetPosition(s: PFileStream): int = return int(getFilePos(s.f))
+
+proc fsReadData(s: PFileStream, buffer: pointer, bufLen: int): int = 
+  result = readBuffer(s.f, buffer, bufLen)
+  
+proc fsWriteData(s: PFileStream, buffer: pointer, bufLen: int) = 
+  if writeBuffer(s.f, buffer, bufLen) != bufLen: 
+    raise newEIO("cannot write to stream")
+
+proc newFileStream*(f: TFile): PFileStream = 
+  ## creates a new stream from the file `f`.
+  new(result)
+  result.f = f
+  result.close = fsClose
+  result.atEnd = fsAtEnd
+  result.setPosition = fsSetPosition
+  result.getPosition = fsGetPosition
+  result.readData = fsReadData
+  result.writeData = fsWriteData
+
+proc newFileStream*(filename: string, mode: TFileMode): PFileStream = 
+  ## creates a new stream from the file named `filename` with the mode `mode`.
+  ## If the file cannot be opened, nil is returned.
+  var f: TFile
+  if OpenFile(f, filename, mode): result = newFileStream(f)
+
+
+when true:
+  nil
+else:
+  type
+    TFileHandle* = cint ## Operating system file handle
+    PFileHandleStream* = ref TFileHandleStream
+    TFileHandleStream* = object of TStream
+      handle*: TFileHandle
+      pos: int
+
+  proc newEOS(msg: string): ref EOS =
+    new(result)
+    result.msg = msg
+
+  proc hsGetPosition(s: PFileHandleStream): int = 
+    return s.pos
+
+  when defined(windows):
+    # do not import windows as this increases compile times:
+    nil
+  else:
+    import posix
+    
+    proc hsSetPosition(s: PFileHandleStream, pos: int) = 
+      discard lseek(s.handle, pos, SEEK_SET)
+
+    proc hsClose(s: PFileHandleStream) = discard close(s.handle)
+    proc hsAtEnd(s: PFileHandleStream): bool = 
+      var pos = hsGetPosition(s)
+      var theEnd = lseek(s.handle, 0, SEEK_END)
+      result = pos >= theEnd
+      hsSetPosition(s, pos) # set position back
+
+    proc hsReadData(s: PFileHandleStream, buffer: pointer, bufLen: int): int = 
+      result = posix.read(s.handle, buffer, bufLen)
+      inc(s.pos, result)
+      
+    proc hsWriteData(s: PFileHandleStream, buffer: pointer, bufLen: int) = 
+      if posix.write(s.handle, buffer, bufLen) != bufLen: 
+        raise newEIO("cannot write to stream")
+      inc(s.pos, bufLen)
+
+  proc newFileHandleStream*(handle: TFileHandle): PFileHandleStream = 
+    new(result)
+    result.handle = handle
+    result.pos = 0
+    result.close = hsClose
+    result.atEnd = hsAtEnd
+    result.setPosition = hsSetPosition
+    result.getPosition = hsGetPosition
+    result.readData = hsReadData
+    result.writeData = hsWriteData
+
+  proc newFileHandleStream*(filename: string, 
+                            mode: TFileMode): PFileHandleStream = 
+    when defined(windows): 
+      nil
+    else:
+      var flags: cint
+      case mode
+      of fmRead:              flags = posix.O_RDONLY
+      of fmWrite:             flags = O_WRONLY or int(O_CREAT)
+      of fmReadWrite:         flags = O_RDWR or int(O_CREAT)
+      of fmReadWriteExisting: flags = O_RDWR
+      of fmAppend:            flags = O_WRONLY or int(O_CREAT) or O_APPEND
+      var handle = open(filename, flags)
+      if handle < 0: raise newEOS("posix.open() call failed")
+    result = newFileHandleStream(handle)
diff --git a/lib/sysio.nim b/lib/sysio.nim
index 8887effa8..c178ff559 100644
--- a/lib/sysio.nim
+++ b/lib/sysio.nim
@@ -53,6 +53,16 @@ proc readLine(f: TFile): string =
   result = ""
   rawReadLine(f, result)
 
+proc write(f: TFile, s: string) = fputs(s, f)
+proc write(f: TFile, i: int) = fprintf(f, "%ld", i)
+proc write(f: TFile, b: bool) =
+  if b: write(f, "true")
+  else: write(f, "false")
+proc write(f: TFile, r: float) = fprintf(f, "%g", r)
+proc write(f: TFile, c: Char) = putc(c, f)
+proc write(f: TFile, a: openArray[string]) =
+  for x in items(a): write(f, x)
+
 proc readFile(filename: string): string =
   var f: TFile
   try:
@@ -68,16 +78,6 @@ proc readFile(filename: string): string =
   except EIO:
     result = nil
 
-proc write(f: TFile, s: string) = fputs(s, f)
-proc write(f: TFile, i: int) = fprintf(f, "%ld", i)
-proc write(f: TFile, b: bool) =
-  if b: write(f, "true")
-  else: write(f, "false")
-proc write(f: TFile, r: float) = fprintf(f, "%g", r)
-proc write(f: TFile, c: Char) = putc(c, f)
-proc write(f: TFile, a: openArray[string]) =
-  for x in items(a): write(f, x)
-
 proc EndOfFile(f: TFile): bool =
   # do not blame me; blame the ANSI C standard this is so brain-damaged
   var
diff --git a/lib/target.h b/lib/target.h
new file mode 100644
index 000000000..1afd62aef
--- /dev/null
+++ b/lib/target.h
@@ -0,0 +1,12 @@
+#ifndef _TARGET_H_
+#define _TARGET_H_
+
+#include <pthread.h>
+
+#define TLSF_MLOCK_T            pthread_mutex_t
+#define TLSF_CREATE_LOCK(l)     pthread_mutex_init (l, NULL)
+#define TLSF_DESTROY_LOCK(l)    pthread_mutex_destroy(l)
+#define TLSF_ACQUIRE_LOCK(l)    pthread_mutex_lock(l)
+#define TLSF_RELEASE_LOCK(l)    pthread_mutex_unlock(l)
+
+#endif
diff --git a/lib/tlsf.c b/lib/tlsf.c
new file mode 100644
index 000000000..767299ed6
--- /dev/null
+++ b/lib/tlsf.c
@@ -0,0 +1,1005 @@
+/* 
+ * Two Levels Segregate Fit memory allocator (TLSF)
+ * Version 2.4.3
+ *
+ * Written by Miguel Masmano Tello <mimastel@doctor.upv.es>
+ *
+ * Thanks to Ismael Ripoll for his suggestions and reviews
+ *
+ * Copyright (C) 2008, 2007, 2006, 2005, 2004
+ *
+ * This code is released using a dual license strategy: GPL/LGPL
+ * You can choose the licence that better fits your requirements.
+ *
+ * Released under the terms of the GNU General Public License Version 2.0
+ * Released under the terms of the GNU Lesser General Public License Version 2.1
+ *
+ */
+
+/*
+ * Code contributions:
+ *
+ * (Jul 28 2007)  Herman ten Brugge <hermantenbrugge@home.nl>:
+ *
+ * - Add 64 bit support. It now runs on x86_64 and solaris64.
+ * - I also tested this on vxworks/32and solaris/32 and i386/32 processors.
+ * - Remove assembly code. I could not measure any performance difference 
+ *   on my core2 processor. This also makes the code more portable.
+ * - Moved defines/typedefs from tlsf.h to tlsf.c
+ * - Changed MIN_BLOCK_SIZE to sizeof (free_ptr_t) and BHDR_OVERHEAD to 
+ *   (sizeof (bhdr_t) - MIN_BLOCK_SIZE). This does not change the fact 
+ *    that the minumum size is still sizeof 
+ *   (bhdr_t).
+ * - Changed all C++ comment style to C style. (// -> /.* ... *./)
+ * - Used ls_bit instead of ffs and ms_bit instead of fls. I did this to 
+ *   avoid confusion with the standard ffs function which returns 
+ *   different values.
+ * - Created set_bit/clear_bit fuctions because they are not present 
+ *   on x86_64.
+ * - Added locking support + extra file target.h to show how to use it.
+ * - Added get_used_size function (REMOVED in 2.4)
+ * - Added rtl_realloc and rtl_calloc function
+ * - Implemented realloc clever support.
+ * - Added some test code in the example directory.
+ *        
+ *
+ * (Oct 23 2006) Adam Scislowicz: 
+ *
+ * - Support for ARMv5 implemented
+ *
+ */
+
+/************************************************************************/
+
+#define USE_SBRK        (1) 
+#define USE_MMAP        (1) 
+#define TLSF_STATISTIC  (1)
+
+#include <stdio.h>
+#include <string.h>
+
+#ifndef TLSF_USE_LOCKS
+#define  TLSF_USE_LOCKS   (0)
+#endif
+
+#ifndef TLSF_STATISTIC
+#define  TLSF_STATISTIC   (0)
+#endif
+
+#ifndef USE_MMAP
+#define  USE_MMAP   (0)
+#endif
+
+#ifndef USE_SBRK
+#define  USE_SBRK   (0)
+#endif
+
+
+#if TLSF_USE_LOCKS
+#include "target.h"
+#else
+#define TLSF_CREATE_LOCK(_unused_)   do {} while(0)
+#define TLSF_DESTROY_LOCK(_unused_)  do {} while(0) 
+#define TLSF_ACQUIRE_LOCK(_unused_)  do {} while(0)
+#define TLSF_RELEASE_LOCK(_unused_)  do {} while(0)
+#endif
+
+#if TLSF_STATISTIC
+#define  TLSF_ADD_SIZE(tlsf, b) do {                  \
+    tlsf->used_size += (b->size & BLOCK_SIZE) + BHDR_OVERHEAD;  \
+    if (tlsf->used_size > tlsf->max_size)             \
+      tlsf->max_size = tlsf->used_size;            \
+    } while(0)
+
+#define  TLSF_REMOVE_SIZE(tlsf, b) do {                \
+    tlsf->used_size -= (b->size & BLOCK_SIZE) + BHDR_OVERHEAD;  \
+  } while(0)
+#else
+#define  TLSF_ADD_SIZE(tlsf, b)       do{}while(0)
+#define  TLSF_REMOVE_SIZE(tlsf, b)    do{}while(0)
+#endif
+
+#if USE_MMAP || USE_SBRK
+#include <unistd.h>
+#endif
+
+#if USE_MMAP
+#include <sys/mman.h>
+#endif
+
+#include "tlsf.h"
+
+#if !defined(__GNUC__)
+#ifndef __inline__
+#define __inline__
+#endif
+#endif
+
+/* The  debug functions  only can  be used  when _DEBUG_TLSF_  is set. */
+#ifndef _DEBUG_TLSF_
+#define _DEBUG_TLSF_  (0)
+#endif
+
+/*************************************************************************/
+/* Definition of the structures used by TLSF */
+
+
+/* Some IMPORTANT TLSF parameters */
+/* Unlike the preview TLSF versions, now they are statics */
+#define BLOCK_ALIGN (sizeof(void *) * 2)
+
+#define MAX_FLI    (30)
+#define MAX_LOG2_SLI  (5)
+#define MAX_SLI    (1 << MAX_LOG2_SLI)     /* MAX_SLI = 2^MAX_LOG2_SLI */
+
+#define FLI_OFFSET  (6)     /* tlsf structure just will manage blocks bigger */
+/* than 128 bytes */
+#define SMALL_BLOCK  (128)
+#define REAL_FLI  (MAX_FLI - FLI_OFFSET)
+#define MIN_BLOCK_SIZE  (sizeof (free_ptr_t))
+#define BHDR_OVERHEAD  (sizeof (bhdr_t) - MIN_BLOCK_SIZE)
+#define TLSF_SIGNATURE  (0x2A59FA59)
+
+#define  PTR_MASK  (sizeof(void *) - 1)
+#define BLOCK_SIZE  (0xFFFFFFFF - PTR_MASK)
+
+#define GET_NEXT_BLOCK(_addr, _r) ((bhdr_t *) ((char *) (_addr) + (_r)))
+#define  MEM_ALIGN      ((BLOCK_ALIGN) - 1)
+#define ROUNDUP_SIZE(_r)          (((_r) + MEM_ALIGN) & ~MEM_ALIGN)
+#define ROUNDDOWN_SIZE(_r)        ((_r) & ~MEM_ALIGN)
+#define ROUNDUP(_x, _v)           ((((~(_x)) + 1) & ((_v)-1)) + (_x))
+
+#define BLOCK_STATE  (0x1)
+#define PREV_STATE  (0x2)
+
+/* bit 0 of the block size */
+#define FREE_BLOCK  (0x1)
+#define USED_BLOCK  (0x0)
+
+/* bit 1 of the block size */
+#define PREV_FREE  (0x2)
+#define PREV_USED  (0x0)
+
+
+#define DEFAULT_AREA_SIZE (1024*10)
+
+#ifdef USE_MMAP
+#define PAGE_SIZE (getpagesize())
+#endif
+
+#define PRINT_MSG(fmt, args...) printf(fmt, ## args)
+#define ERROR_MSG(fmt, args...) printf(fmt, ## args)
+
+typedef unsigned int u32_t;     /* NOTE: Make sure that this type is 4 bytes long on your computer */
+typedef unsigned char u8_t;     /* NOTE: Make sure that this type is 1 byte on your computer */
+
+typedef struct free_ptr_struct {
+    struct bhdr_struct *prev;
+    struct bhdr_struct *next;
+} free_ptr_t;
+
+typedef struct bhdr_struct {
+    /* This pointer is just valid if the first bit of size is set */
+    struct bhdr_struct *prev_hdr;
+    /* The size is stored in bytes */
+    size_t size;                /* bit 0 indicates whether the block is used and */
+    /* bit 1 allows to know whether the previous block is free */
+    union {
+        struct free_ptr_struct free_ptr;
+        u8_t buffer[1];         /*sizeof(struct free_ptr_struct)]; */
+    } ptr;
+} bhdr_t;
+
+/* This structure is embedded at the beginning of each area, giving us
+ * enough information to cope with a set of areas */
+
+typedef struct area_info_struct {
+    bhdr_t *end;
+    struct area_info_struct *next;
+} area_info_t;
+
+typedef struct TLSF_struct {
+    /* the TLSF's structure signature */
+    u32_t tlsf_signature;
+
+#if TLSF_USE_LOCKS
+    TLSF_MLOCK_T lock;
+#endif
+
+#if TLSF_STATISTIC
+    /* These can not be calculated outside tlsf because we
+     * do not know the sizes when freeing/reallocing memory. */
+    size_t used_size;
+    size_t max_size;
+#endif
+
+    /* A linked list holding all the existing areas */
+    area_info_t *area_head;
+
+    /* the first-level bitmap */
+    /* This array should have a size of REAL_FLI bits */
+    u32_t fl_bitmap;
+
+    /* the second-level bitmap */
+    u32_t sl_bitmap[REAL_FLI];
+
+    bhdr_t *matrix[REAL_FLI][MAX_SLI];
+} tlsf_t;
+
+
+/******************************************************************/
+/**************     Helping functions    **************************/
+/******************************************************************/
+static __inline__ void set_bit(int nr, u32_t * addr);
+static __inline__ void clear_bit(int nr, u32_t * addr);
+static __inline__ int ls_bit(int x);
+static __inline__ int ms_bit(int x);
+static __inline__ void MAPPING_SEARCH(size_t * _r, int *_fl, int *_sl);
+static __inline__ void MAPPING_INSERT(size_t _r, int *_fl, int *_sl);
+static __inline__ bhdr_t *FIND_SUITABLE_BLOCK(tlsf_t * _tlsf, int *_fl, int *_sl);
+static __inline__ bhdr_t *process_area(void *area, size_t size);
+#if USE_SBRK || USE_MMAP
+static __inline__ void *get_new_area(size_t * size);
+#endif
+
+static const int table[] = {
+    -1, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4,
+    4, 4,
+    4, 4, 4, 4, 4, 4, 4,
+    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+    5,
+    5, 5, 5, 5, 5, 5, 5,
+    6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+    6,
+    6, 6, 6, 6, 6, 6, 6,
+    6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+    6,
+    6, 6, 6, 6, 6, 6, 6,
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+    7,
+    7, 7, 7, 7, 7, 7, 7,
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+    7,
+    7, 7, 7, 7, 7, 7, 7,
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+    7,
+    7, 7, 7, 7, 7, 7, 7,
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+    7,
+    7, 7, 7, 7, 7, 7, 7
+};
+
+static __inline__ int ls_bit(int i)
+{
+    unsigned int a;
+    unsigned int x = i & -i;
+
+    a = x <= 0xffff ? (x <= 0xff ? 0 : 8) : (x <= 0xffffff ? 16 : 24);
+    return table[x >> a] + a;
+}
+
+static __inline__ int ms_bit(int i)
+{
+    unsigned int a;
+    unsigned int x = (unsigned int) i;
+
+    a = x <= 0xffff ? (x <= 0xff ? 0 : 8) : (x <= 0xffffff ? 16 : 24);
+    return table[x >> a] + a;
+}
+
+static __inline__ void set_bit(int nr, u32_t * addr)
+{
+    addr[nr >> 5] |= 1 << (nr & 0x1f);
+}
+
+static __inline__ void clear_bit(int nr, u32_t * addr)
+{
+    addr[nr >> 5] &= ~(1 << (nr & 0x1f));
+}
+
+static __inline__ void MAPPING_SEARCH(size_t * _r, int *_fl, int *_sl)
+{
+    int _t;
+
+    if (*_r < SMALL_BLOCK) {
+        *_fl = 0;
+        *_sl = *_r / (SMALL_BLOCK / MAX_SLI);
+    } else {
+        _t = (1 << (ms_bit(*_r) - MAX_LOG2_SLI)) - 1;
+        *_r = *_r + _t;
+        *_fl = ms_bit(*_r);
+        *_sl = (*_r >> (*_fl - MAX_LOG2_SLI)) - MAX_SLI;
+        *_fl -= FLI_OFFSET;
+        /*if ((*_fl -= FLI_OFFSET) < 0) // FL wil be always >0!
+         *_fl = *_sl = 0;
+         */
+        *_r &= ~_t;
+    }
+}
+
+static __inline__ void MAPPING_INSERT(size_t _r, int *_fl, int *_sl)
+{
+    if (_r < SMALL_BLOCK) {
+        *_fl = 0;
+        *_sl = _r / (SMALL_BLOCK / MAX_SLI);
+    } else {
+        *_fl = ms_bit(_r);
+        *_sl = (_r >> (*_fl - MAX_LOG2_SLI)) - MAX_SLI;
+        *_fl -= FLI_OFFSET;
+    }
+}
+
+
+static __inline__ bhdr_t *FIND_SUITABLE_BLOCK(tlsf_t * _tlsf, int *_fl, int *_sl)
+{
+    u32_t _tmp = _tlsf->sl_bitmap[*_fl] & (~0 << *_sl);
+    bhdr_t *_b = NULL;
+
+    if (_tmp) {
+        *_sl = ls_bit(_tmp);
+        _b = _tlsf->matrix[*_fl][*_sl];
+    } else {
+        *_fl = ls_bit(_tlsf->fl_bitmap & (~0 << (*_fl + 1)));
+        if (*_fl > 0) {         /* likely */
+            *_sl = ls_bit(_tlsf->sl_bitmap[*_fl]);
+            _b = _tlsf->matrix[*_fl][*_sl];
+        }
+    }
+    return _b;
+}
+
+
+#define EXTRACT_BLOCK_HDR(_b, _tlsf, _fl, _sl) do {          \
+    _tlsf -> matrix [_fl] [_sl] = _b -> ptr.free_ptr.next;    \
+    if (_tlsf -> matrix[_fl][_sl])                \
+      _tlsf -> matrix[_fl][_sl] -> ptr.free_ptr.prev = NULL;  \
+    else {                            \
+      clear_bit (_sl, &_tlsf -> sl_bitmap [_fl]);        \
+      if (!_tlsf -> sl_bitmap [_fl])              \
+        clear_bit (_fl, &_tlsf -> fl_bitmap);        \
+    }                              \
+    _b -> ptr.free_ptr.prev =  NULL;        \
+    _b -> ptr.free_ptr.next =  NULL;        \
+  }while(0)
+
+
+#define EXTRACT_BLOCK(_b, _tlsf, _fl, _sl) do {              \
+    if (_b -> ptr.free_ptr.next)                  \
+      _b -> ptr.free_ptr.next -> ptr.free_ptr.prev = _b -> ptr.free_ptr.prev; \
+    if (_b -> ptr.free_ptr.prev)                  \
+      _b -> ptr.free_ptr.prev -> ptr.free_ptr.next = _b -> ptr.free_ptr.next; \
+    if (_tlsf -> matrix [_fl][_sl] == _b) {              \
+      _tlsf -> matrix [_fl][_sl] = _b -> ptr.free_ptr.next;    \
+      if (!_tlsf -> matrix [_fl][_sl]) {              \
+        clear_bit (_sl, &_tlsf -> sl_bitmap[_fl]);        \
+        if (!_tlsf -> sl_bitmap [_fl])              \
+          clear_bit (_fl, &_tlsf -> fl_bitmap);        \
+      }                              \
+    }                                \
+    _b -> ptr.free_ptr.prev = NULL;          \
+    _b -> ptr.free_ptr.next = NULL;          \
+  } while(0)
+
+#define INSERT_BLOCK(_b, _tlsf, _fl, _sl) do {              \
+    _b -> ptr.free_ptr.prev = NULL; \
+    _b -> ptr.free_ptr.next = _tlsf -> matrix [_fl][_sl]; \
+    if (_tlsf -> matrix [_fl][_sl])                  \
+      _tlsf -> matrix [_fl][_sl] -> ptr.free_ptr.prev = _b;    \
+    _tlsf -> matrix [_fl][_sl] = _b;                \
+    set_bit (_sl, &_tlsf -> sl_bitmap [_fl]);            \
+    set_bit (_fl, &_tlsf -> fl_bitmap);                \
+  } while(0)
+
+#ifndef MAP_ANONYMOUS
+#  ifdef MAP_ANON
+#    define MAP_ANONYMOUS MAP_ANON
+#  else
+#    define MAP_ANONYMOUS 0x20
+#  endif
+#endif
+
+#if USE_SBRK || USE_MMAP
+static __inline__ void *get_new_area(size_t * size) 
+{
+    void *area;
+
+#if USE_SBRK
+    area = (void *)sbrk(0);
+    if (((void *)sbrk(*size)) != ((void *) -1))
+        return area;
+#endif
+
+#if USE_MMAP
+    *size = ROUNDUP(*size, PAGE_SIZE);
+    if ((area = mmap(0, *size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0)) != MAP_FAILED)
+        return area;
+#endif
+    return ((void *) ~0);
+}
+#endif
+
+static __inline__ bhdr_t *process_area(void *area, size_t size)
+{
+    bhdr_t *b, *lb, *ib;
+    area_info_t *ai;
+
+    ib = (bhdr_t *) area;
+    ib->size =
+        (sizeof(area_info_t) <
+         MIN_BLOCK_SIZE) ? MIN_BLOCK_SIZE : ROUNDUP_SIZE(sizeof(area_info_t)) | USED_BLOCK | PREV_USED;
+    b = (bhdr_t *) GET_NEXT_BLOCK(ib->ptr.buffer, ib->size & BLOCK_SIZE);
+    b->size = ROUNDDOWN_SIZE(size - 3 * BHDR_OVERHEAD - (ib->size & BLOCK_SIZE)) | USED_BLOCK | PREV_USED;
+    b->ptr.free_ptr.prev = b->ptr.free_ptr.next = 0;
+    lb = GET_NEXT_BLOCK(b->ptr.buffer, b->size & BLOCK_SIZE);
+    lb->prev_hdr = b;
+    lb->size = 0 | USED_BLOCK | PREV_FREE;
+    ai = (area_info_t *) ib->ptr.buffer;
+    ai->next = 0;
+    ai->end = lb;
+    return ib;
+}
+
+/******************************************************************/
+/******************** Begin of the allocator code *****************/
+/******************************************************************/
+
+static char *mp = NULL;         /* Default memory pool. */
+
+/******************************************************************/
+size_t init_memory_pool(size_t mem_pool_size, void *mem_pool)
+{
+/******************************************************************/
+    tlsf_t *tlsf;
+    bhdr_t *b, *ib;
+
+    if (!mem_pool || !mem_pool_size || mem_pool_size < sizeof(tlsf_t) + BHDR_OVERHEAD * 8) {
+        ERROR_MSG("init_memory_pool (): memory_pool invalid\n");
+        return -1;
+    }
+
+    if (((unsigned long) mem_pool & PTR_MASK)) {
+        ERROR_MSG("init_memory_pool (): mem_pool must be aligned to a word\n");
+        return -1;
+    }
+    tlsf = (tlsf_t *) mem_pool;
+    /* Check if already initialised */
+    if (tlsf->tlsf_signature == TLSF_SIGNATURE) {
+        mp = mem_pool;
+        b = GET_NEXT_BLOCK(mp, ROUNDUP_SIZE(sizeof(tlsf_t)));
+        return b->size & BLOCK_SIZE;
+    }
+
+    mp = mem_pool;
+
+    /* Zeroing the memory pool */
+    memset(mem_pool, 0, sizeof(tlsf_t));
+
+    tlsf->tlsf_signature = TLSF_SIGNATURE;
+
+    TLSF_CREATE_LOCK(&tlsf->lock);
+
+    ib = process_area(GET_NEXT_BLOCK
+                      (mem_pool, ROUNDUP_SIZE(sizeof(tlsf_t))), ROUNDDOWN_SIZE(mem_pool_size - sizeof(tlsf_t)));
+    b = GET_NEXT_BLOCK(ib->ptr.buffer, ib->size & BLOCK_SIZE);
+    free_ex(b->ptr.buffer, tlsf);
+    tlsf->area_head = (area_info_t *) ib->ptr.buffer;
+
+#if TLSF_STATISTIC
+    tlsf->used_size = mem_pool_size - (b->size & BLOCK_SIZE);
+    tlsf->max_size = tlsf->used_size;
+#endif
+
+    return (b->size & BLOCK_SIZE);
+}
+
+/******************************************************************/
+size_t add_new_area(void *area, size_t area_size, void *mem_pool)
+{
+/******************************************************************/
+    tlsf_t *tlsf = (tlsf_t *) mem_pool;
+    area_info_t *ptr, *ptr_prev, *ai;
+    bhdr_t *ib0, *b0, *lb0, *ib1, *b1, *lb1, *next_b;
+
+    memset(area, 0, area_size);
+    ptr = tlsf->area_head;
+    ptr_prev = 0;
+
+    ib0 = process_area(area, area_size);
+    b0 = GET_NEXT_BLOCK(ib0->ptr.buffer, ib0->size & BLOCK_SIZE);
+    lb0 = GET_NEXT_BLOCK(b0->ptr.buffer, b0->size & BLOCK_SIZE);
+
+    /* Before inserting the new area, we have to merge this area with the
+       already existing ones */
+
+    while (ptr) {
+        ib1 = (bhdr_t *) ((char *) ptr - BHDR_OVERHEAD);
+        b1 = GET_NEXT_BLOCK(ib1->ptr.buffer, ib1->size & BLOCK_SIZE);
+        lb1 = ptr->end;
+
+        /* Merging the new area with the next physically contigous one */
+        if ((unsigned long) ib1 == (unsigned long) lb0 + BHDR_OVERHEAD) {
+            if (tlsf->area_head == ptr) {
+                tlsf->area_head = ptr->next;
+                ptr = ptr->next;
+            } else {
+                ptr_prev->next = ptr->next;
+                ptr = ptr->next;
+            }
+
+            b0->size =
+                ROUNDDOWN_SIZE((b0->size & BLOCK_SIZE) +
+                               (ib1->size & BLOCK_SIZE) + 2 * BHDR_OVERHEAD) | USED_BLOCK | PREV_USED;
+
+            b1->prev_hdr = b0;
+            lb0 = lb1;
+
+            continue;
+        }
+
+        /* Merging the new area with the previous physically contigous
+           one */
+        if ((unsigned long) lb1->ptr.buffer == (unsigned long) ib0) {
+            if (tlsf->area_head == ptr) {
+                tlsf->area_head = ptr->next;
+                ptr = ptr->next;
+            } else {
+                ptr_prev->next = ptr->next;
+                ptr = ptr->next;
+            }
+
+            lb1->size =
+                ROUNDDOWN_SIZE((b0->size & BLOCK_SIZE) +
+                               (ib0->size & BLOCK_SIZE) + 2 * BHDR_OVERHEAD) | USED_BLOCK | (lb1->size & PREV_STATE);
+            next_b = GET_NEXT_BLOCK(lb1->ptr.buffer, lb1->size & BLOCK_SIZE);
+            next_b->prev_hdr = lb1;
+            b0 = lb1;
+            ib0 = ib1;
+
+            continue;
+        }
+        ptr_prev = ptr;
+        ptr = ptr->next;
+    }
+
+    /* Inserting the area in the list of linked areas */
+    ai = (area_info_t *) ib0->ptr.buffer;
+    ai->next = tlsf->area_head;
+    ai->end = lb0;
+    tlsf->area_head = ai;
+    free_ex(b0->ptr.buffer, mem_pool);
+    return (b0->size & BLOCK_SIZE);
+}
+
+
+/******************************************************************/
+size_t get_used_size(void *mem_pool)
+{
+/******************************************************************/
+#if TLSF_STATISTIC
+    return ((tlsf_t *) mem_pool)->used_size;
+#else
+    return 0;
+#endif
+}
+
+/******************************************************************/
+size_t get_max_size(void *mem_pool)
+{
+/******************************************************************/
+#if TLSF_STATISTIC
+    return ((tlsf_t *) mem_pool)->max_size;
+#else
+    return 0;
+#endif
+}
+
+/******************************************************************/
+void destroy_memory_pool(void *mem_pool)
+{
+/******************************************************************/
+    tlsf_t *tlsf = (tlsf_t *) mem_pool;
+
+    tlsf->tlsf_signature = 0;
+
+    TLSF_DESTROY_LOCK(&tlsf->lock);
+
+}
+
+
+/******************************************************************/
+void *tlsf_malloc(size_t size)
+{
+/******************************************************************/
+    void *ret;
+
+#if USE_MMAP || USE_SBRK
+    if (!mp) {
+        size_t area_size;
+        void *area;
+
+        area_size = sizeof(tlsf_t) + BHDR_OVERHEAD * 8; /* Just a safety constant */
+        area_size = (area_size > DEFAULT_AREA_SIZE) ? area_size : DEFAULT_AREA_SIZE;
+        area = get_new_area(&area_size);
+        if (area == ((void *) ~0))
+            return NULL;        /* Not enough system memory */
+        init_memory_pool(area_size, area);
+    }
+#endif
+
+    TLSF_ACQUIRE_LOCK(&((tlsf_t *)mp)->lock);
+
+    ret = malloc_ex(size, mp);
+
+    TLSF_RELEASE_LOCK(&((tlsf_t *)mp)->lock);
+
+    return ret;
+}
+
+/******************************************************************/
+void tlsf_free(void *ptr)
+{
+/******************************************************************/
+
+    TLSF_ACQUIRE_LOCK(&((tlsf_t *)mp)->lock);
+
+    free_ex(ptr, mp);
+
+    TLSF_RELEASE_LOCK(&((tlsf_t *)mp)->lock);
+
+}
+
+/******************************************************************/
+void *tlsf_realloc(void *ptr, size_t size)
+{
+/******************************************************************/
+    void *ret;
+
+#if USE_MMAP || USE_SBRK
+  if (!mp) {
+    return tlsf_malloc(size);
+  }
+#endif
+
+    TLSF_ACQUIRE_LOCK(&((tlsf_t *)mp)->lock);
+
+    ret = realloc_ex(ptr, size, mp);
+
+    TLSF_RELEASE_LOCK(&((tlsf_t *)mp)->lock);
+
+    return ret;
+}
+
+/******************************************************************/
+void *tlsf_calloc(size_t nelem, size_t elem_size)
+{
+/******************************************************************/
+    void *ret;
+
+    TLSF_ACQUIRE_LOCK(&((tlsf_t *)mp)->lock);
+
+    ret = calloc_ex(nelem, elem_size, mp);
+
+    TLSF_RELEASE_LOCK(&((tlsf_t *)mp)->lock);
+
+    return ret;
+}
+
+/******************************************************************/
+void *malloc_ex(size_t size, void *mem_pool)
+{
+/******************************************************************/
+    tlsf_t *tlsf = (tlsf_t *) mem_pool;
+    bhdr_t *b, *b2, *next_b;
+    int fl, sl;
+    size_t tmp_size;
+
+    size = (size < MIN_BLOCK_SIZE) ? MIN_BLOCK_SIZE : ROUNDUP_SIZE(size);
+
+    /* Rounding up the requested size and calculating fl and sl */
+    MAPPING_SEARCH(&size, &fl, &sl);
+
+    /* Searching a free block, recall that this function changes the values of fl and sl,
+       so they are not longer valid when the function fails */
+    b = FIND_SUITABLE_BLOCK(tlsf, &fl, &sl);
+#if USE_MMAP || USE_SBRK
+    if (!b) {
+        size_t area_size;
+        void *area;
+        /* Growing the pool size when needed */
+        area_size = size + BHDR_OVERHEAD * 8;   /* size plus enough room for the requered headers. */
+        area_size = (area_size > DEFAULT_AREA_SIZE) ? area_size : DEFAULT_AREA_SIZE;
+        area = get_new_area(&area_size);        /* Call sbrk or mmap */
+        if (area == ((void *) ~0))
+            return NULL;        /* Not enough system memory */
+        add_new_area(area, area_size, mem_pool);
+        /* Rounding up the requested size and calculating fl and sl */
+        MAPPING_SEARCH(&size, &fl, &sl);
+        /* Searching a free block */
+        b = FIND_SUITABLE_BLOCK(tlsf, &fl, &sl);
+    }
+#endif
+    if (!b)
+        return NULL;            /* Not found */
+
+    EXTRACT_BLOCK_HDR(b, tlsf, fl, sl);
+
+    /*-- found: */
+    next_b = GET_NEXT_BLOCK(b->ptr.buffer, b->size & BLOCK_SIZE);
+    /* Should the block be split? */
+    tmp_size = (b->size & BLOCK_SIZE) - size;
+    if (tmp_size >= sizeof(bhdr_t)) {
+        tmp_size -= BHDR_OVERHEAD;
+        b2 = GET_NEXT_BLOCK(b->ptr.buffer, size);
+        b2->size = tmp_size | FREE_BLOCK | PREV_USED;
+        next_b->prev_hdr = b2;
+        MAPPING_INSERT(tmp_size, &fl, &sl);
+        INSERT_BLOCK(b2, tlsf, fl, sl);
+
+        b->size = size | (b->size & PREV_STATE);
+    } else {
+        next_b->size &= (~PREV_FREE);
+        b->size &= (~FREE_BLOCK);       /* Now it's used */
+    }
+
+    TLSF_ADD_SIZE(tlsf, b);
+
+    return (void *) b->ptr.buffer;
+}
+
+extern void free_ex(void *ptr, void *mem_pool) {
+    tlsf_t *tlsf = (tlsf_t *) mem_pool;
+    bhdr_t *b, *tmp_b;
+    int fl = 0, sl = 0;
+
+    if (!ptr) {
+        return;
+    }
+    b = (bhdr_t *) ((char *) ptr - BHDR_OVERHEAD);
+    b->size |= FREE_BLOCK;
+
+    TLSF_REMOVE_SIZE(tlsf, b);
+
+    b->ptr.free_ptr.prev = NULL;
+    b->ptr.free_ptr.next = NULL;
+    tmp_b = GET_NEXT_BLOCK(b->ptr.buffer, b->size & BLOCK_SIZE);
+    if (tmp_b->size & FREE_BLOCK) {
+        MAPPING_INSERT(tmp_b->size & BLOCK_SIZE, &fl, &sl);
+        EXTRACT_BLOCK(tmp_b, tlsf, fl, sl);
+        b->size += (tmp_b->size & BLOCK_SIZE) + BHDR_OVERHEAD;
+    }
+    if (b->size & PREV_FREE) {
+        tmp_b = b->prev_hdr;
+        MAPPING_INSERT(tmp_b->size & BLOCK_SIZE, &fl, &sl);
+        EXTRACT_BLOCK(tmp_b, tlsf, fl, sl);
+        tmp_b->size += (b->size & BLOCK_SIZE) + BHDR_OVERHEAD;
+        b = tmp_b;
+    }
+    MAPPING_INSERT(b->size & BLOCK_SIZE, &fl, &sl);
+    INSERT_BLOCK(b, tlsf, fl, sl);
+
+    tmp_b = GET_NEXT_BLOCK(b->ptr.buffer, b->size & BLOCK_SIZE);
+    tmp_b->size |= PREV_FREE;
+    tmp_b->prev_hdr = b;
+}
+
+/******************************************************************/
+void *realloc_ex(void *ptr, size_t new_size, void *mem_pool)
+{
+/******************************************************************/
+    tlsf_t *tlsf = (tlsf_t *) mem_pool;
+    void *ptr_aux;
+    unsigned int cpsize;
+    bhdr_t *b, *tmp_b, *next_b;
+    int fl, sl;
+    size_t tmp_size;
+
+    if (!ptr) {
+        if (new_size)
+            return (void *) malloc_ex(new_size, mem_pool);
+        if (!new_size)
+            return NULL;
+    } else if (!new_size) {
+        free_ex(ptr, mem_pool);
+        return NULL;
+    }
+
+    b = (bhdr_t *) ((char *) ptr - BHDR_OVERHEAD);
+    next_b = GET_NEXT_BLOCK(b->ptr.buffer, b->size & BLOCK_SIZE);
+    new_size = (new_size < MIN_BLOCK_SIZE) ? MIN_BLOCK_SIZE : ROUNDUP_SIZE(new_size);
+    tmp_size = (b->size & BLOCK_SIZE);
+    if (new_size <= tmp_size) {
+        TLSF_REMOVE_SIZE(tlsf, b);
+        if (next_b->size & FREE_BLOCK) {
+            MAPPING_INSERT(next_b->size & BLOCK_SIZE, &fl, &sl);
+            EXTRACT_BLOCK(next_b, tlsf, fl, sl);
+            tmp_size += (next_b->size & BLOCK_SIZE) + BHDR_OVERHEAD;
+            next_b = GET_NEXT_BLOCK(next_b->ptr.buffer, next_b->size & BLOCK_SIZE);
+            /* We allways reenter this free block because tmp_size will
+               be greater then sizeof (bhdr_t) */
+        }
+        tmp_size -= new_size;
+        if (tmp_size >= sizeof(bhdr_t)) {
+            tmp_size -= BHDR_OVERHEAD;
+            tmp_b = GET_NEXT_BLOCK(b->ptr.buffer, new_size);
+            tmp_b->size = tmp_size | FREE_BLOCK | PREV_USED;
+            next_b->prev_hdr = tmp_b;
+            next_b->size |= PREV_FREE;
+            MAPPING_INSERT(tmp_size, &fl, &sl);
+            INSERT_BLOCK(tmp_b, tlsf, fl, sl);
+            b->size = new_size | (b->size & PREV_STATE);
+        }
+        TLSF_ADD_SIZE(tlsf, b);
+        return (void *) b->ptr.buffer;
+    }
+    if ((next_b->size & FREE_BLOCK)) {
+        if (new_size <= (tmp_size + (next_b->size & BLOCK_SIZE))) {
+            TLSF_REMOVE_SIZE(tlsf, b);
+            MAPPING_INSERT(next_b->size & BLOCK_SIZE, &fl, &sl);
+            EXTRACT_BLOCK(next_b, tlsf, fl, sl);
+            b->size += (next_b->size & BLOCK_SIZE) + BHDR_OVERHEAD;
+            next_b = GET_NEXT_BLOCK(b->ptr.buffer, b->size & BLOCK_SIZE);
+            next_b->prev_hdr = b;
+            next_b->size &= ~PREV_FREE;
+            tmp_size = (b->size & BLOCK_SIZE) - new_size;
+            if (tmp_size >= sizeof(bhdr_t)) {
+                tmp_size -= BHDR_OVERHEAD;
+                tmp_b = GET_NEXT_BLOCK(b->ptr.buffer, new_size);
+                tmp_b->size = tmp_size | FREE_BLOCK | PREV_USED;
+                next_b->prev_hdr = tmp_b;
+                next_b->size |= PREV_FREE;
+                MAPPING_INSERT(tmp_size, &fl, &sl);
+                INSERT_BLOCK(tmp_b, tlsf, fl, sl);
+                b->size = new_size | (b->size & PREV_STATE);
+            }
+            TLSF_ADD_SIZE(tlsf, b);
+            return (void *) b->ptr.buffer;
+        }
+    }
+
+    ptr_aux = malloc_ex(new_size, mem_pool);
+
+    cpsize = ((b->size & BLOCK_SIZE) > new_size) ? new_size : (b->size & BLOCK_SIZE);
+
+    memcpy(ptr_aux, ptr, cpsize);
+
+    free_ex(ptr, mem_pool);
+    return ptr_aux;
+}
+
+
+/******************************************************************/
+void *calloc_ex(size_t nelem, size_t elem_size, void *mem_pool)
+{
+/******************************************************************/
+    void *ptr;
+
+    if (nelem <= 0 || elem_size <= 0)
+        return NULL;
+
+    if (!(ptr = malloc_ex(nelem * elem_size, mem_pool)))
+        return NULL;
+    memset(ptr, 0, nelem * elem_size);
+
+    return ptr;
+}
+
+/* for Nimrod: */
+size_t TLSF_GET_USED_SIZE(void) { return (((tlsf_t *)mp)->used_size); }
+size_t TLSF_GET_MAX_SIZE(void) { return (((tlsf_t *)mp)->max_size); }
+
+
+#if _DEBUG_TLSF_
+
+/***************  DEBUG FUNCTIONS   **************/
+
+/* The following functions have been designed to ease the debugging of */
+/* the TLSF  structure.  For non-developing  purposes, it may  be they */
+/* haven't too much worth.  To enable them, _DEBUG_TLSF_ must be set.  */
+
+extern void dump_memory_region(unsigned char *mem_ptr, unsigned int size);
+extern void print_block(bhdr_t * b);
+extern void print_tlsf(tlsf_t * tlsf);
+void print_all_blocks(tlsf_t * tlsf);
+
+void dump_memory_region(unsigned char *mem_ptr, unsigned int size)
+{
+
+    unsigned long begin = (unsigned long) mem_ptr;
+    unsigned long end = (unsigned long) mem_ptr + size;
+    int column = 0;
+
+    begin >>= 2;
+    begin <<= 2;
+
+    end >>= 2;
+    end++;
+    end <<= 2;
+
+    PRINT_MSG("\nMemory region dumped: 0x%lx - 0x%lx\n\n", begin, end);
+
+    column = 0;
+    PRINT_MSG("0x%lx ", begin);
+
+    while (begin < end) {
+        if (((unsigned char *) begin)[0] == 0)
+            PRINT_MSG("00");
+        else
+            PRINT_MSG("%02x", ((unsigned char *) begin)[0]);
+        if (((unsigned char *) begin)[1] == 0)
+            PRINT_MSG("00 ");
+        else
+            PRINT_MSG("%02x ", ((unsigned char *) begin)[1]);
+        begin += 2;
+        column++;
+        if (column == 8) {
+            PRINT_MSG("\n0x%lx ", begin);
+            column = 0;
+        }
+
+    }
+    PRINT_MSG("\n\n");
+}
+
+void print_block(bhdr_t * b)
+{
+    if (!b)
+        return;
+    PRINT_MSG(">> [%p] (", b);
+    if ((b->size & BLOCK_SIZE))
+        PRINT_MSG("%lu bytes, ", (unsigned long) (b->size & BLOCK_SIZE));
+    else
+        PRINT_MSG("sentinel, ");
+    if ((b->size & BLOCK_STATE) == FREE_BLOCK)
+        PRINT_MSG("free [%p, %p], ", b->ptr.free_ptr.prev, b->ptr.free_ptr.next);
+    else
+        PRINT_MSG("used, ");
+    if ((b->size & PREV_STATE) == PREV_FREE)
+        PRINT_MSG("prev. free [%p])\n", b->prev_hdr);
+    else
+        PRINT_MSG("prev used)\n");
+}
+
+void print_tlsf(tlsf_t * tlsf)
+{
+    bhdr_t *next;
+    int i, j;
+
+    PRINT_MSG("\nTLSF at %p\n", tlsf);
+
+    PRINT_MSG("FL bitmap: 0x%x\n\n", (unsigned) tlsf->fl_bitmap);
+
+    for (i = 0; i < REAL_FLI; i++) {
+        if (tlsf->sl_bitmap[i])
+            PRINT_MSG("SL bitmap 0x%x\n", (unsigned) tlsf->sl_bitmap[i]);
+        for (j = 0; j < MAX_SLI; j++) {
+            next = tlsf->matrix[i][j];
+            if (next)
+                PRINT_MSG("-> [%d][%d]\n", i, j);
+            while (next) {
+                print_block(next);
+                next = next->ptr.free_ptr.next;
+            }
+        }
+    }
+}
+
+void print_all_blocks(tlsf_t * tlsf)
+{
+    area_info_t *ai;
+    bhdr_t *next;
+    PRINT_MSG("\nTLSF at %p\nALL BLOCKS\n\n", tlsf);
+    ai = tlsf->area_head;
+    while (ai) {
+        next = (bhdr_t *) ((char *) ai - BHDR_OVERHEAD);
+        while (next) {
+            print_block(next);
+            if ((next->size & BLOCK_SIZE))
+                next = GET_NEXT_BLOCK(next->ptr.buffer, next->size & BLOCK_SIZE);
+            else
+                next = NULL;
+        }
+        ai = ai->next;
+    }
+}
+
+#endif
diff --git a/lib/tlsf.h b/lib/tlsf.h
new file mode 100644
index 000000000..7c8e2ad66
--- /dev/null
+++ b/lib/tlsf.h
@@ -0,0 +1,39 @@
+/*
+ * Two Levels Segregate Fit memory allocator (TLSF)
+ * Version 2.4.3
+ *
+ * Written by Miguel Masmano Tello <mimastel@doctor.upv.es>
+ *
+ * Thanks to Ismael Ripoll for his suggestions and reviews
+ *
+ * Copyright (C) 2008, 2007, 2006, 2005, 2004
+ *
+ * This code is released using a dual license strategy: GPL/LGPL
+ * You can choose the licence that better fits your requirements.
+ *
+ * Released under the terms of the GNU General Public License Version 2.0
+ * Released under the terms of the GNU Lesser General Public License Version 2.1
+ *
+ */
+
+#ifndef _TLSF_H_
+#define _TLSF_H_
+
+#include <sys/types.h>
+
+extern size_t init_memory_pool(size_t, void *);
+extern size_t get_used_size(void *);
+extern size_t get_max_size(void *);
+extern void destroy_memory_pool(void *);
+extern size_t add_new_area(void *, size_t, void *);
+extern void *malloc_ex(size_t, void *);
+extern void free_ex(void *, void *);
+extern void *realloc_ex(void *, size_t, void *);
+extern void *calloc_ex(size_t, size_t, void *);
+
+extern void *tlsf_malloc(size_t size);
+extern void tlsf_free(void *ptr);
+extern void *tlsf_realloc(void *ptr, size_t size);
+extern void *tlsf_calloc(size_t nelem, size_t elem_size);
+
+#endif
diff --git a/lib/ucmaps/8859-1.txt b/lib/ucmaps/8859-1.txt
new file mode 100644
index 000000000..473ecabc1
--- /dev/null
+++ b/lib/ucmaps/8859-1.txt
@@ -0,0 +1,303 @@
+#
+#	Name:             ISO/IEC 8859-1:1998 to Unicode
+#	Unicode version:  3.0
+#	Table version:    1.0
+#	Table format:     Format A
+#	Date:             1999 July 27
+#	Authors:          Ken Whistler <kenw@sybase.com>
+#
+#	Copyright (c) 1991-1999 Unicode, Inc.  All Rights reserved.
+#
+#	This file is provided as-is by Unicode, Inc. (The Unicode Consortium).
+#	No claims are made as to fitness for any particular purpose.  No
+#	warranties of any kind are expressed or implied.  The recipient
+#	agrees to determine applicability of information provided.  If this
+#	file has been provided on optical media by Unicode, Inc., the sole
+#	remedy for any claim will be exchange of defective media within 90
+#	days of receipt.
+#
+#	Unicode, Inc. hereby grants the right to freely use the information
+#	supplied in this file in the creation of products supporting the
+#	Unicode Standard, and to make copies of this file in any form for
+#	internal or external distribution as long as this notice remains
+#	attached.
+#
+#	General notes:
+#
+#	This table contains the data the Unicode Consortium has on how
+#       ISO/IEC 8859-1:1998 characters map into Unicode.
+#
+#	Format:  Three tab-separated columns
+#		 Column #1 is the ISO/IEC 8859-1 code (in hex as 0xXX)
+#		 Column #2 is the Unicode (in hex as 0xXXXX)
+#		 Column #3 the Unicode name (follows a comment sign, '#')
+#
+#	The entries are in ISO/IEC 8859-1 order.
+#
+#	Version history
+#	1.0 version updates 0.1 version by adding mappings for all
+#	control characters.
+#
+#	Updated versions of this file may be found in:
+#		<ftp://ftp.unicode.org/Public/MAPPINGS/>
+#
+#	Any comments or problems, contact <errata@unicode.org>
+#	Please note that <errata@unicode.org> is an archival address;
+#	notices will be checked, but do not expect an immediate response.
+#
+0x00	0x0000	#	NULL
+0x01	0x0001	#	START OF HEADING
+0x02	0x0002	#	START OF TEXT
+0x03	0x0003	#	END OF TEXT
+0x04	0x0004	#	END OF TRANSMISSION
+0x05	0x0005	#	ENQUIRY
+0x06	0x0006	#	ACKNOWLEDGE
+0x07	0x0007	#	BELL
+0x08	0x0008	#	BACKSPACE
+0x09	0x0009	#	HORIZONTAL TABULATION
+0x0A	0x000A	#	LINE FEED
+0x0B	0x000B	#	VERTICAL TABULATION
+0x0C	0x000C	#	FORM FEED
+0x0D	0x000D	#	CARRIAGE RETURN
+0x0E	0x000E	#	SHIFT OUT
+0x0F	0x000F	#	SHIFT IN
+0x10	0x0010	#	DATA LINK ESCAPE
+0x11	0x0011	#	DEVICE CONTROL ONE
+0x12	0x0012	#	DEVICE CONTROL TWO
+0x13	0x0013	#	DEVICE CONTROL THREE
+0x14	0x0014	#	DEVICE CONTROL FOUR
+0x15	0x0015	#	NEGATIVE ACKNOWLEDGE
+0x16	0x0016	#	SYNCHRONOUS IDLE
+0x17	0x0017	#	END OF TRANSMISSION BLOCK
+0x18	0x0018	#	CANCEL
+0x19	0x0019	#	END OF MEDIUM
+0x1A	0x001A	#	SUBSTITUTE
+0x1B	0x001B	#	ESCAPE
+0x1C	0x001C	#	FILE SEPARATOR
+0x1D	0x001D	#	GROUP SEPARATOR
+0x1E	0x001E	#	RECORD SEPARATOR
+0x1F	0x001F	#	UNIT SEPARATOR
+0x20	0x0020	#	SPACE
+0x21	0x0021	#	EXCLAMATION MARK
+0x22	0x0022	#	QUOTATION MARK
+0x23	0x0023	#	NUMBER SIGN
+0x24	0x0024	#	DOLLAR SIGN
+0x25	0x0025	#	PERCENT SIGN
+0x26	0x0026	#	AMPERSAND
+0x27	0x0027	#	APOSTROPHE
+0x28	0x0028	#	LEFT PARENTHESIS
+0x29	0x0029	#	RIGHT PARENTHESIS
+0x2A	0x002A	#	ASTERISK
+0x2B	0x002B	#	PLUS SIGN
+0x2C	0x002C	#	COMMA
+0x2D	0x002D	#	HYPHEN-MINUS
+0x2E	0x002E	#	FULL STOP
+0x2F	0x002F	#	SOLIDUS
+0x30	0x0030	#	DIGIT ZERO
+0x31	0x0031	#	DIGIT ONE
+0x32	0x0032	#	DIGIT TWO
+0x33	0x0033	#	DIGIT THREE
+0x34	0x0034	#	DIGIT FOUR
+0x35	0x0035	#	DIGIT FIVE
+0x36	0x0036	#	DIGIT SIX
+0x37	0x0037	#	DIGIT SEVEN
+0x38	0x0038	#	DIGIT EIGHT
+0x39	0x0039	#	DIGIT NINE
+0x3A	0x003A	#	COLON
+0x3B	0x003B	#	SEMICOLON
+0x3C	0x003C	#	LESS-THAN SIGN
+0x3D	0x003D	#	EQUALS SIGN
+0x3E	0x003E	#	GREATER-THAN SIGN
+0x3F	0x003F	#	QUESTION MARK
+0x40	0x0040	#	COMMERCIAL AT
+0x41	0x0041	#	LATIN CAPITAL LETTER A
+0x42	0x0042	#	LATIN CAPITAL LETTER B
+0x43	0x0043	#	LATIN CAPITAL LETTER C
+0x44	0x0044	#	LATIN CAPITAL LETTER D
+0x45	0x0045	#	LATIN CAPITAL LETTER E
+0x46	0x0046	#	LATIN CAPITAL LETTER F
+0x47	0x0047	#	LATIN CAPITAL LETTER G
+0x48	0x0048	#	LATIN CAPITAL LETTER H
+0x49	0x0049	#	LATIN CAPITAL LETTER I
+0x4A	0x004A	#	LATIN CAPITAL LETTER J
+0x4B	0x004B	#	LATIN CAPITAL LETTER K
+0x4C	0x004C	#	LATIN CAPITAL LETTER L
+0x4D	0x004D	#	LATIN CAPITAL LETTER M
+0x4E	0x004E	#	LATIN CAPITAL LETTER N
+0x4F	0x004F	#	LATIN CAPITAL LETTER O
+0x50	0x0050	#	LATIN CAPITAL LETTER P
+0x51	0x0051	#	LATIN CAPITAL LETTER Q
+0x52	0x0052	#	LATIN CAPITAL LETTER R
+0x53	0x0053	#	LATIN CAPITAL LETTER S
+0x54	0x0054	#	LATIN CAPITAL LETTER T
+0x55	0x0055	#	LATIN CAPITAL LETTER U
+0x56	0x0056	#	LATIN CAPITAL LETTER V
+0x57	0x0057	#	LATIN CAPITAL LETTER W
+0x58	0x0058	#	LATIN CAPITAL LETTER X
+0x59	0x0059	#	LATIN CAPITAL LETTER Y
+0x5A	0x005A	#	LATIN CAPITAL LETTER Z
+0x5B	0x005B	#	LEFT SQUARE BRACKET
+0x5C	0x005C	#	REVERSE SOLIDUS
+0x5D	0x005D	#	RIGHT SQUARE BRACKET
+0x5E	0x005E	#	CIRCUMFLEX ACCENT
+0x5F	0x005F	#	LOW LINE
+0x60	0x0060	#	GRAVE ACCENT
+0x61	0x0061	#	LATIN SMALL LETTER A
+0x62	0x0062	#	LATIN SMALL LETTER B
+0x63	0x0063	#	LATIN SMALL LETTER C
+0x64	0x0064	#	LATIN SMALL LETTER D
+0x65	0x0065	#	LATIN SMALL LETTER E
+0x66	0x0066	#	LATIN SMALL LETTER F
+0x67	0x0067	#	LATIN SMALL LETTER G
+0x68	0x0068	#	LATIN SMALL LETTER H
+0x69	0x0069	#	LATIN SMALL LETTER I
+0x6A	0x006A	#	LATIN SMALL LETTER J
+0x6B	0x006B	#	LATIN SMALL LETTER K
+0x6C	0x006C	#	LATIN SMALL LETTER L
+0x6D	0x006D	#	LATIN SMALL LETTER M
+0x6E	0x006E	#	LATIN SMALL LETTER N
+0x6F	0x006F	#	LATIN SMALL LETTER O
+0x70	0x0070	#	LATIN SMALL LETTER P
+0x71	0x0071	#	LATIN SMALL LETTER Q
+0x72	0x0072	#	LATIN SMALL LETTER R
+0x73	0x0073	#	LATIN SMALL LETTER S
+0x74	0x0074	#	LATIN SMALL LETTER T
+0x75	0x0075	#	LATIN SMALL LETTER U
+0x76	0x0076	#	LATIN SMALL LETTER V
+0x77	0x0077	#	LATIN SMALL LETTER W
+0x78	0x0078	#	LATIN SMALL LETTER X
+0x79	0x0079	#	LATIN SMALL LETTER Y
+0x7A	0x007A	#	LATIN SMALL LETTER Z
+0x7B	0x007B	#	LEFT CURLY BRACKET
+0x7C	0x007C	#	VERTICAL LINE
+0x7D	0x007D	#	RIGHT CURLY BRACKET
+0x7E	0x007E	#	TILDE
+0x7F	0x007F	#	DELETE
+0x80	0x0080	#	<control>
+0x81	0x0081	#	<control>
+0x82	0x0082	#	<control>
+0x83	0x0083	#	<control>
+0x84	0x0084	#	<control>
+0x85	0x0085	#	<control>
+0x86	0x0086	#	<control>
+0x87	0x0087	#	<control>
+0x88	0x0088	#	<control>
+0x89	0x0089	#	<control>
+0x8A	0x008A	#	<control>
+0x8B	0x008B	#	<control>
+0x8C	0x008C	#	<control>
+0x8D	0x008D	#	<control>
+0x8E	0x008E	#	<control>
+0x8F	0x008F	#	<control>
+0x90	0x0090	#	<control>
+0x91	0x0091	#	<control>
+0x92	0x0092	#	<control>
+0x93	0x0093	#	<control>
+0x94	0x0094	#	<control>
+0x95	0x0095	#	<control>
+0x96	0x0096	#	<control>
+0x97	0x0097	#	<control>
+0x98	0x0098	#	<control>
+0x99	0x0099	#	<control>
+0x9A	0x009A	#	<control>
+0x9B	0x009B	#	<control>
+0x9C	0x009C	#	<control>
+0x9D	0x009D	#	<control>
+0x9E	0x009E	#	<control>
+0x9F	0x009F	#	<control>
+0xA0	0x00A0	#	NO-BREAK SPACE
+0xA1	0x00A1	#	INVERTED EXCLAMATION MARK
+0xA2	0x00A2	#	CENT SIGN
+0xA3	0x00A3	#	POUND SIGN
+0xA4	0x00A4	#	CURRENCY SIGN
+0xA5	0x00A5	#	YEN SIGN
+0xA6	0x00A6	#	BROKEN BAR
+0xA7	0x00A7	#	SECTION SIGN
+0xA8	0x00A8	#	DIAERESIS
+0xA9	0x00A9	#	COPYRIGHT SIGN
+0xAA	0x00AA	#	FEMININE ORDINAL INDICATOR
+0xAB	0x00AB	#	LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xAC	0x00AC	#	NOT SIGN
+0xAD	0x00AD	#	SOFT HYPHEN
+0xAE	0x00AE	#	REGISTERED SIGN
+0xAF	0x00AF	#	MACRON
+0xB0	0x00B0	#	DEGREE SIGN
+0xB1	0x00B1	#	PLUS-MINUS SIGN
+0xB2	0x00B2	#	SUPERSCRIPT TWO
+0xB3	0x00B3	#	SUPERSCRIPT THREE
+0xB4	0x00B4	#	ACUTE ACCENT
+0xB5	0x00B5	#	MICRO SIGN
+0xB6	0x00B6	#	PILCROW SIGN
+0xB7	0x00B7	#	MIDDLE DOT
+0xB8	0x00B8	#	CEDILLA
+0xB9	0x00B9	#	SUPERSCRIPT ONE
+0xBA	0x00BA	#	MASCULINE ORDINAL INDICATOR
+0xBB	0x00BB	#	RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xBC	0x00BC	#	VULGAR FRACTION ONE QUARTER
+0xBD	0x00BD	#	VULGAR FRACTION ONE HALF
+0xBE	0x00BE	#	VULGAR FRACTION THREE QUARTERS
+0xBF	0x00BF	#	INVERTED QUESTION MARK
+0xC0	0x00C0	#	LATIN CAPITAL LETTER A WITH GRAVE
+0xC1	0x00C1	#	LATIN CAPITAL LETTER A WITH ACUTE
+0xC2	0x00C2	#	LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+0xC3	0x00C3	#	LATIN CAPITAL LETTER A WITH TILDE
+0xC4	0x00C4	#	LATIN CAPITAL LETTER A WITH DIAERESIS
+0xC5	0x00C5	#	LATIN CAPITAL LETTER A WITH RING ABOVE
+0xC6	0x00C6	#	LATIN CAPITAL LETTER AE
+0xC7	0x00C7	#	LATIN CAPITAL LETTER C WITH CEDILLA
+0xC8	0x00C8	#	LATIN CAPITAL LETTER E WITH GRAVE
+0xC9	0x00C9	#	LATIN CAPITAL LETTER E WITH ACUTE
+0xCA	0x00CA	#	LATIN CAPITAL LETTER E WITH CIRCUMFLEX
+0xCB	0x00CB	#	LATIN CAPITAL LETTER E WITH DIAERESIS
+0xCC	0x00CC	#	LATIN CAPITAL LETTER I WITH GRAVE
+0xCD	0x00CD	#	LATIN CAPITAL LETTER I WITH ACUTE
+0xCE	0x00CE	#	LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+0xCF	0x00CF	#	LATIN CAPITAL LETTER I WITH DIAERESIS
+0xD0	0x00D0	#	LATIN CAPITAL LETTER ETH (Icelandic)
+0xD1	0x00D1	#	LATIN CAPITAL LETTER N WITH TILDE
+0xD2	0x00D2	#	LATIN CAPITAL LETTER O WITH GRAVE
+0xD3	0x00D3	#	LATIN CAPITAL LETTER O WITH ACUTE
+0xD4	0x00D4	#	LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+0xD5	0x00D5	#	LATIN CAPITAL LETTER O WITH TILDE
+0xD6	0x00D6	#	LATIN CAPITAL LETTER O WITH DIAERESIS
+0xD7	0x00D7	#	MULTIPLICATION SIGN
+0xD8	0x00D8	#	LATIN CAPITAL LETTER O WITH STROKE
+0xD9	0x00D9	#	LATIN CAPITAL LETTER U WITH GRAVE
+0xDA	0x00DA	#	LATIN CAPITAL LETTER U WITH ACUTE
+0xDB	0x00DB	#	LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+0xDC	0x00DC	#	LATIN CAPITAL LETTER U WITH DIAERESIS
+0xDD	0x00DD	#	LATIN CAPITAL LETTER Y WITH ACUTE
+0xDE	0x00DE	#	LATIN CAPITAL LETTER THORN (Icelandic)
+0xDF	0x00DF	#	LATIN SMALL LETTER SHARP S (German)
+0xE0	0x00E0	#	LATIN SMALL LETTER A WITH GRAVE
+0xE1	0x00E1	#	LATIN SMALL LETTER A WITH ACUTE
+0xE2	0x00E2	#	LATIN SMALL LETTER A WITH CIRCUMFLEX
+0xE3	0x00E3	#	LATIN SMALL LETTER A WITH TILDE
+0xE4	0x00E4	#	LATIN SMALL LETTER A WITH DIAERESIS
+0xE5	0x00E5	#	LATIN SMALL LETTER A WITH RING ABOVE
+0xE6	0x00E6	#	LATIN SMALL LETTER AE
+0xE7	0x00E7	#	LATIN SMALL LETTER C WITH CEDILLA
+0xE8	0x00E8	#	LATIN SMALL LETTER E WITH GRAVE
+0xE9	0x00E9	#	LATIN SMALL LETTER E WITH ACUTE
+0xEA	0x00EA	#	LATIN SMALL LETTER E WITH CIRCUMFLEX
+0xEB	0x00EB	#	LATIN SMALL LETTER E WITH DIAERESIS
+0xEC	0x00EC	#	LATIN SMALL LETTER I WITH GRAVE
+0xED	0x00ED	#	LATIN SMALL LETTER I WITH ACUTE
+0xEE	0x00EE	#	LATIN SMALL LETTER I WITH CIRCUMFLEX
+0xEF	0x00EF	#	LATIN SMALL LETTER I WITH DIAERESIS
+0xF0	0x00F0	#	LATIN SMALL LETTER ETH (Icelandic)
+0xF1	0x00F1	#	LATIN SMALL LETTER N WITH TILDE
+0xF2	0x00F2	#	LATIN SMALL LETTER O WITH GRAVE
+0xF3	0x00F3	#	LATIN SMALL LETTER O WITH ACUTE
+0xF4	0x00F4	#	LATIN SMALL LETTER O WITH CIRCUMFLEX
+0xF5	0x00F5	#	LATIN SMALL LETTER O WITH TILDE
+0xF6	0x00F6	#	LATIN SMALL LETTER O WITH DIAERESIS
+0xF7	0x00F7	#	DIVISION SIGN
+0xF8	0x00F8	#	LATIN SMALL LETTER O WITH STROKE
+0xF9	0x00F9	#	LATIN SMALL LETTER U WITH GRAVE
+0xFA	0x00FA	#	LATIN SMALL LETTER U WITH ACUTE
+0xFB	0x00FB	#	LATIN SMALL LETTER U WITH CIRCUMFLEX
+0xFC	0x00FC	#	LATIN SMALL LETTER U WITH DIAERESIS
+0xFD	0x00FD	#	LATIN SMALL LETTER Y WITH ACUTE
+0xFE	0x00FE	#	LATIN SMALL LETTER THORN (Icelandic)
+0xFF	0x00FF	#	LATIN SMALL LETTER Y WITH DIAERESIS
diff --git a/lib/ucmaps/8859-10.txt b/lib/ucmaps/8859-10.txt
new file mode 100644
index 000000000..374a42b1a
--- /dev/null
+++ b/lib/ucmaps/8859-10.txt
@@ -0,0 +1,303 @@
+#
+#	Name:             ISO/IEC 8859-10:1998 to Unicode
+#	Unicode version:  3.0
+#	Table version:    1.1
+#	Table format:     Format A
+#	Date:             1999 October 11
+#	Authors:          Ken Whistler <kenw@sybase.com>
+#
+#	Copyright (c) 1999 Unicode, Inc.  All Rights reserved.
+#
+#	This file is provided as-is by Unicode, Inc. (The Unicode Consortium).
+#	No claims are made as to fitness for any particular purpose.  No
+#	warranties of any kind are expressed or implied.  The recipient
+#	agrees to determine applicability of information provided.  If this
+#	file has been provided on optical media by Unicode, Inc., the sole
+#	remedy for any claim will be exchange of defective media within 90
+#	days of receipt.
+#
+#	Unicode, Inc. hereby grants the right to freely use the information
+#	supplied in this file in the creation of products supporting the
+#	Unicode Standard, and to make copies of this file in any form for
+#	internal or external distribution as long as this notice remains
+#	attached.
+#
+#	General notes:
+#
+#	This table contains the data the Unicode Consortium has on how
+#       ISO/IEC 8859-10:1998 characters map into Unicode.
+#
+#	Format:  Three tab-separated columns
+#		 Column #1 is the ISO/IEC 8859-10 code (in hex as 0xXX)
+#		 Column #2 is the Unicode (in hex as 0xXXXX)
+#		 Column #3 the Unicode name (follows a comment sign, '#')
+#
+#	The entries are in ISO/IEC 8859-10 order.
+#
+#	Version history
+#	1.0 version new.
+#       1.1 corrected mistake in mapping of 0xA4
+#
+#	Updated versions of this file may be found in:
+#		<ftp://ftp.unicode.org/Public/MAPPINGS/>
+#
+#	Any comments or problems, contact <errata@unicode.org>
+#	Please note that <errata@unicode.org> is an archival address;
+#	notices will be checked, but do not expect an immediate response.
+#
+0x00	0x0000	#	NULL
+0x01	0x0001	#	START OF HEADING
+0x02	0x0002	#	START OF TEXT
+0x03	0x0003	#	END OF TEXT
+0x04	0x0004	#	END OF TRANSMISSION
+0x05	0x0005	#	ENQUIRY
+0x06	0x0006	#	ACKNOWLEDGE
+0x07	0x0007	#	BELL
+0x08	0x0008	#	BACKSPACE
+0x09	0x0009	#	HORIZONTAL TABULATION
+0x0A	0x000A	#	LINE FEED
+0x0B	0x000B	#	VERTICAL TABULATION
+0x0C	0x000C	#	FORM FEED
+0x0D	0x000D	#	CARRIAGE RETURN
+0x0E	0x000E	#	SHIFT OUT
+0x0F	0x000F	#	SHIFT IN
+0x10	0x0010	#	DATA LINK ESCAPE
+0x11	0x0011	#	DEVICE CONTROL ONE
+0x12	0x0012	#	DEVICE CONTROL TWO
+0x13	0x0013	#	DEVICE CONTROL THREE
+0x14	0x0014	#	DEVICE CONTROL FOUR
+0x15	0x0015	#	NEGATIVE ACKNOWLEDGE
+0x16	0x0016	#	SYNCHRONOUS IDLE
+0x17	0x0017	#	END OF TRANSMISSION BLOCK
+0x18	0x0018	#	CANCEL
+0x19	0x0019	#	END OF MEDIUM
+0x1A	0x001A	#	SUBSTITUTE
+0x1B	0x001B	#	ESCAPE
+0x1C	0x001C	#	FILE SEPARATOR
+0x1D	0x001D	#	GROUP SEPARATOR
+0x1E	0x001E	#	RECORD SEPARATOR
+0x1F	0x001F	#	UNIT SEPARATOR
+0x20	0x0020	#	SPACE
+0x21	0x0021	#	EXCLAMATION MARK
+0x22	0x0022	#	QUOTATION MARK
+0x23	0x0023	#	NUMBER SIGN
+0x24	0x0024	#	DOLLAR SIGN
+0x25	0x0025	#	PERCENT SIGN
+0x26	0x0026	#	AMPERSAND
+0x27	0x0027	#	APOSTROPHE
+0x28	0x0028	#	LEFT PARENTHESIS
+0x29	0x0029	#	RIGHT PARENTHESIS
+0x2A	0x002A	#	ASTERISK
+0x2B	0x002B	#	PLUS SIGN
+0x2C	0x002C	#	COMMA
+0x2D	0x002D	#	HYPHEN-MINUS
+0x2E	0x002E	#	FULL STOP
+0x2F	0x002F	#	SOLIDUS
+0x30	0x0030	#	DIGIT ZERO
+0x31	0x0031	#	DIGIT ONE
+0x32	0x0032	#	DIGIT TWO
+0x33	0x0033	#	DIGIT THREE
+0x34	0x0034	#	DIGIT FOUR
+0x35	0x0035	#	DIGIT FIVE
+0x36	0x0036	#	DIGIT SIX
+0x37	0x0037	#	DIGIT SEVEN
+0x38	0x0038	#	DIGIT EIGHT
+0x39	0x0039	#	DIGIT NINE
+0x3A	0x003A	#	COLON
+0x3B	0x003B	#	SEMICOLON
+0x3C	0x003C	#	LESS-THAN SIGN
+0x3D	0x003D	#	EQUALS SIGN
+0x3E	0x003E	#	GREATER-THAN SIGN
+0x3F	0x003F	#	QUESTION MARK
+0x40	0x0040	#	COMMERCIAL AT
+0x41	0x0041	#	LATIN CAPITAL LETTER A
+0x42	0x0042	#	LATIN CAPITAL LETTER B
+0x43	0x0043	#	LATIN CAPITAL LETTER C
+0x44	0x0044	#	LATIN CAPITAL LETTER D
+0x45	0x0045	#	LATIN CAPITAL LETTER E
+0x46	0x0046	#	LATIN CAPITAL LETTER F
+0x47	0x0047	#	LATIN CAPITAL LETTER G
+0x48	0x0048	#	LATIN CAPITAL LETTER H
+0x49	0x0049	#	LATIN CAPITAL LETTER I
+0x4A	0x004A	#	LATIN CAPITAL LETTER J
+0x4B	0x004B	#	LATIN CAPITAL LETTER K
+0x4C	0x004C	#	LATIN CAPITAL LETTER L
+0x4D	0x004D	#	LATIN CAPITAL LETTER M
+0x4E	0x004E	#	LATIN CAPITAL LETTER N
+0x4F	0x004F	#	LATIN CAPITAL LETTER O
+0x50	0x0050	#	LATIN CAPITAL LETTER P
+0x51	0x0051	#	LATIN CAPITAL LETTER Q
+0x52	0x0052	#	LATIN CAPITAL LETTER R
+0x53	0x0053	#	LATIN CAPITAL LETTER S
+0x54	0x0054	#	LATIN CAPITAL LETTER T
+0x55	0x0055	#	LATIN CAPITAL LETTER U
+0x56	0x0056	#	LATIN CAPITAL LETTER V
+0x57	0x0057	#	LATIN CAPITAL LETTER W
+0x58	0x0058	#	LATIN CAPITAL LETTER X
+0x59	0x0059	#	LATIN CAPITAL LETTER Y
+0x5A	0x005A	#	LATIN CAPITAL LETTER Z
+0x5B	0x005B	#	LEFT SQUARE BRACKET
+0x5C	0x005C	#	REVERSE SOLIDUS
+0x5D	0x005D	#	RIGHT SQUARE BRACKET
+0x5E	0x005E	#	CIRCUMFLEX ACCENT
+0x5F	0x005F	#	LOW LINE
+0x60	0x0060	#	GRAVE ACCENT
+0x61	0x0061	#	LATIN SMALL LETTER A
+0x62	0x0062	#	LATIN SMALL LETTER B
+0x63	0x0063	#	LATIN SMALL LETTER C
+0x64	0x0064	#	LATIN SMALL LETTER D
+0x65	0x0065	#	LATIN SMALL LETTER E
+0x66	0x0066	#	LATIN SMALL LETTER F
+0x67	0x0067	#	LATIN SMALL LETTER G
+0x68	0x0068	#	LATIN SMALL LETTER H
+0x69	0x0069	#	LATIN SMALL LETTER I
+0x6A	0x006A	#	LATIN SMALL LETTER J
+0x6B	0x006B	#	LATIN SMALL LETTER K
+0x6C	0x006C	#	LATIN SMALL LETTER L
+0x6D	0x006D	#	LATIN SMALL LETTER M
+0x6E	0x006E	#	LATIN SMALL LETTER N
+0x6F	0x006F	#	LATIN SMALL LETTER O
+0x70	0x0070	#	LATIN SMALL LETTER P
+0x71	0x0071	#	LATIN SMALL LETTER Q
+0x72	0x0072	#	LATIN SMALL LETTER R
+0x73	0x0073	#	LATIN SMALL LETTER S
+0x74	0x0074	#	LATIN SMALL LETTER T
+0x75	0x0075	#	LATIN SMALL LETTER U
+0x76	0x0076	#	LATIN SMALL LETTER V
+0x77	0x0077	#	LATIN SMALL LETTER W
+0x78	0x0078	#	LATIN SMALL LETTER X
+0x79	0x0079	#	LATIN SMALL LETTER Y
+0x7A	0x007A	#	LATIN SMALL LETTER Z
+0x7B	0x007B	#	LEFT CURLY BRACKET
+0x7C	0x007C	#	VERTICAL LINE
+0x7D	0x007D	#	RIGHT CURLY BRACKET
+0x7E	0x007E	#	TILDE
+0x7F	0x007F	#	DELETE
+0x80	0x0080	#	<control>
+0x81	0x0081	#	<control>
+0x82	0x0082	#	<control>
+0x83	0x0083	#	<control>
+0x84	0x0084	#	<control>
+0x85	0x0085	#	<control>
+0x86	0x0086	#	<control>
+0x87	0x0087	#	<control>
+0x88	0x0088	#	<control>
+0x89	0x0089	#	<control>
+0x8A	0x008A	#	<control>
+0x8B	0x008B	#	<control>
+0x8C	0x008C	#	<control>
+0x8D	0x008D	#	<control>
+0x8E	0x008E	#	<control>
+0x8F	0x008F	#	<control>
+0x90	0x0090	#	<control>
+0x91	0x0091	#	<control>
+0x92	0x0092	#	<control>
+0x93	0x0093	#	<control>
+0x94	0x0094	#	<control>
+0x95	0x0095	#	<control>
+0x96	0x0096	#	<control>
+0x97	0x0097	#	<control>
+0x98	0x0098	#	<control>
+0x99	0x0099	#	<control>
+0x9A	0x009A	#	<control>
+0x9B	0x009B	#	<control>
+0x9C	0x009C	#	<control>
+0x9D	0x009D	#	<control>
+0x9E	0x009E	#	<control>
+0x9F	0x009F	#	<control>
+0xA0	0x00A0	#	NO-BREAK SPACE
+0xA1	0x0104	#	LATIN CAPITAL LETTER A WITH OGONEK
+0xA2	0x0112	#	LATIN CAPITAL LETTER E WITH MACRON
+0xA3	0x0122	#	LATIN CAPITAL LETTER G WITH CEDILLA
+0xA4	0x012A	#	LATIN CAPITAL LETTER I WITH MACRON
+0xA5	0x0128	#	LATIN CAPITAL LETTER I WITH TILDE
+0xA6	0x0136	#	LATIN CAPITAL LETTER K WITH CEDILLA
+0xA7	0x00A7	#	SECTION SIGN
+0xA8	0x013B	#	LATIN CAPITAL LETTER L WITH CEDILLA
+0xA9	0x0110	#	LATIN CAPITAL LETTER D WITH STROKE
+0xAA	0x0160	#	LATIN CAPITAL LETTER S WITH CARON
+0xAB	0x0166	#	LATIN CAPITAL LETTER T WITH STROKE
+0xAC	0x017D	#	LATIN CAPITAL LETTER Z WITH CARON
+0xAD	0x00AD	#	SOFT HYPHEN
+0xAE	0x016A	#	LATIN CAPITAL LETTER U WITH MACRON
+0xAF	0x014A	#	LATIN CAPITAL LETTER ENG
+0xB0	0x00B0	#	DEGREE SIGN
+0xB1	0x0105	#	LATIN SMALL LETTER A WITH OGONEK
+0xB2	0x0113	#	LATIN SMALL LETTER E WITH MACRON
+0xB3	0x0123	#	LATIN SMALL LETTER G WITH CEDILLA
+0xB4	0x012B	#	LATIN SMALL LETTER I WITH MACRON
+0xB5	0x0129	#	LATIN SMALL LETTER I WITH TILDE
+0xB6	0x0137	#	LATIN SMALL LETTER K WITH CEDILLA
+0xB7	0x00B7	#	MIDDLE DOT
+0xB8	0x013C	#	LATIN SMALL LETTER L WITH CEDILLA
+0xB9	0x0111	#	LATIN SMALL LETTER D WITH STROKE
+0xBA	0x0161	#	LATIN SMALL LETTER S WITH CARON
+0xBB	0x0167	#	LATIN SMALL LETTER T WITH STROKE
+0xBC	0x017E	#	LATIN SMALL LETTER Z WITH CARON
+0xBD	0x2015	#	HORIZONTAL BAR
+0xBE	0x016B	#	LATIN SMALL LETTER U WITH MACRON
+0xBF	0x014B	#	LATIN SMALL LETTER ENG
+0xC0	0x0100	#	LATIN CAPITAL LETTER A WITH MACRON
+0xC1	0x00C1	#	LATIN CAPITAL LETTER A WITH ACUTE
+0xC2	0x00C2	#	LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+0xC3	0x00C3	#	LATIN CAPITAL LETTER A WITH TILDE
+0xC4	0x00C4	#	LATIN CAPITAL LETTER A WITH DIAERESIS
+0xC5	0x00C5	#	LATIN CAPITAL LETTER A WITH RING ABOVE
+0xC6	0x00C6	#	LATIN CAPITAL LETTER AE
+0xC7	0x012E	#	LATIN CAPITAL LETTER I WITH OGONEK
+0xC8	0x010C	#	LATIN CAPITAL LETTER C WITH CARON
+0xC9	0x00C9	#	LATIN CAPITAL LETTER E WITH ACUTE
+0xCA	0x0118	#	LATIN CAPITAL LETTER E WITH OGONEK
+0xCB	0x00CB	#	LATIN CAPITAL LETTER E WITH DIAERESIS
+0xCC	0x0116	#	LATIN CAPITAL LETTER E WITH DOT ABOVE
+0xCD	0x00CD	#	LATIN CAPITAL LETTER I WITH ACUTE
+0xCE	0x00CE	#	LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+0xCF	0x00CF	#	LATIN CAPITAL LETTER I WITH DIAERESIS
+0xD0	0x00D0	#	LATIN CAPITAL LETTER ETH (Icelandic)
+0xD1	0x0145	#	LATIN CAPITAL LETTER N WITH CEDILLA
+0xD2	0x014C	#	LATIN CAPITAL LETTER O WITH MACRON
+0xD3	0x00D3	#	LATIN CAPITAL LETTER O WITH ACUTE
+0xD4	0x00D4	#	LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+0xD5	0x00D5	#	LATIN CAPITAL LETTER O WITH TILDE
+0xD6	0x00D6	#	LATIN CAPITAL LETTER O WITH DIAERESIS
+0xD7	0x0168	#	LATIN CAPITAL LETTER U WITH TILDE
+0xD8	0x00D8	#	LATIN CAPITAL LETTER O WITH STROKE
+0xD9	0x0172	#	LATIN CAPITAL LETTER U WITH OGONEK
+0xDA	0x00DA	#	LATIN CAPITAL LETTER U WITH ACUTE
+0xDB	0x00DB	#	LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+0xDC	0x00DC	#	LATIN CAPITAL LETTER U WITH DIAERESIS
+0xDD	0x00DD	#	LATIN CAPITAL LETTER Y WITH ACUTE
+0xDE	0x00DE	#	LATIN CAPITAL LETTER THORN (Icelandic)
+0xDF	0x00DF	#	LATIN SMALL LETTER SHARP S (German)
+0xE0	0x0101	#	LATIN SMALL LETTER A WITH MACRON
+0xE1	0x00E1	#	LATIN SMALL LETTER A WITH ACUTE
+0xE2	0x00E2	#	LATIN SMALL LETTER A WITH CIRCUMFLEX
+0xE3	0x00E3	#	LATIN SMALL LETTER A WITH TILDE
+0xE4	0x00E4	#	LATIN SMALL LETTER A WITH DIAERESIS
+0xE5	0x00E5	#	LATIN SMALL LETTER A WITH RING ABOVE
+0xE6	0x00E6	#	LATIN SMALL LETTER AE
+0xE7	0x012F	#	LATIN SMALL LETTER I WITH OGONEK
+0xE8	0x010D	#	LATIN SMALL LETTER C WITH CARON
+0xE9	0x00E9	#	LATIN SMALL LETTER E WITH ACUTE
+0xEA	0x0119	#	LATIN SMALL LETTER E WITH OGONEK
+0xEB	0x00EB	#	LATIN SMALL LETTER E WITH DIAERESIS
+0xEC	0x0117	#	LATIN SMALL LETTER E WITH DOT ABOVE
+0xED	0x00ED	#	LATIN SMALL LETTER I WITH ACUTE
+0xEE	0x00EE	#	LATIN SMALL LETTER I WITH CIRCUMFLEX
+0xEF	0x00EF	#	LATIN SMALL LETTER I WITH DIAERESIS
+0xF0	0x00F0	#	LATIN SMALL LETTER ETH (Icelandic)
+0xF1	0x0146	#	LATIN SMALL LETTER N WITH CEDILLA
+0xF2	0x014D	#	LATIN SMALL LETTER O WITH MACRON
+0xF3	0x00F3	#	LATIN SMALL LETTER O WITH ACUTE
+0xF4	0x00F4	#	LATIN SMALL LETTER O WITH CIRCUMFLEX
+0xF5	0x00F5	#	LATIN SMALL LETTER O WITH TILDE
+0xF6	0x00F6	#	LATIN SMALL LETTER O WITH DIAERESIS
+0xF7	0x0169	#	LATIN SMALL LETTER U WITH TILDE
+0xF8	0x00F8	#	LATIN SMALL LETTER O WITH STROKE
+0xF9	0x0173	#	LATIN SMALL LETTER U WITH OGONEK
+0xFA	0x00FA	#	LATIN SMALL LETTER U WITH ACUTE
+0xFB	0x00FB	#	LATIN SMALL LETTER U WITH CIRCUMFLEX
+0xFC	0x00FC	#	LATIN SMALL LETTER U WITH DIAERESIS
+0xFD	0x00FD	#	LATIN SMALL LETTER Y WITH ACUTE
+0xFE	0x00FE	#	LATIN SMALL LETTER THORN (Icelandic)
+0xFF	0x0138	#	LATIN SMALL LETTER KRA
diff --git a/lib/ucmaps/8859-13.txt b/lib/ucmaps/8859-13.txt
new file mode 100644
index 000000000..cd11b53fd
--- /dev/null
+++ b/lib/ucmaps/8859-13.txt
@@ -0,0 +1,299 @@
+#
+#	Name:             ISO/IEC 8859-13:1998  to Unicode
+#	Unicode version:  3.0
+#	Table version:    1.0
+#	Table format:     Format A
+#	Date:             1999 July 27
+#	Authors:          Ken Whistler <kenw@sybase.com>
+#
+#	Copyright (c) 1998 - 1999 Unicode, Inc.  All Rights reserved.
+#
+#	This file is provided as-is by Unicode, Inc. (The Unicode Consortium).
+#	No claims are made as to fitness for any particular purpose.  No
+#	warranties of any kind are expressed or implied.  The recipient
+#	agrees to determine applicability of information provided.  If this
+#	file has been provided on optical media by Unicode, Inc., the sole
+#	remedy for any claim will be exchange of defective media within 90
+#	days of receipt.
+#
+#	Unicode, Inc. hereby grants the right to freely use the information
+#	supplied in this file in the creation of products supporting the
+#	Unicode Standard, and to make copies of this file in any form for
+#	internal or external distribution as long as this notice remains
+#	attached.
+#
+#	General notes:
+#
+#	This table contains the data the Unicode Consortium has on how
+#       ISO/IEC 8859-13:1998 characters map into Unicode.
+#
+#	Format:  Three tab-separated columns
+#		 Column #1 is the ISO/IEC 8859-13 code (in hex as 0xXX)
+#		 Column #2 is the Unicode (in hex as 0xXXXX)
+#		 Column #3 the Unicode name (follows a comment sign, '#')
+#
+#	The entries are in ISO/IEC 8859-13 order.
+#
+#	Updated versions of this file may be found in:
+#		<ftp://ftp.unicode.org/Public/MAPPINGS/>
+#
+#	Any comments or problems, contact <errata@unicode.org>
+#	Please note that <errata@unicode.org> is an archival address;
+#	notices will be checked, but do not expect an immediate response.
+#
+0x00	0x0000	#	NULL
+0x01	0x0001	#	START OF HEADING
+0x02	0x0002	#	START OF TEXT
+0x03	0x0003	#	END OF TEXT
+0x04	0x0004	#	END OF TRANSMISSION
+0x05	0x0005	#	ENQUIRY
+0x06	0x0006	#	ACKNOWLEDGE
+0x07	0x0007	#	BELL
+0x08	0x0008	#	BACKSPACE
+0x09	0x0009	#	HORIZONTAL TABULATION
+0x0A	0x000A	#	LINE FEED
+0x0B	0x000B	#	VERTICAL TABULATION
+0x0C	0x000C	#	FORM FEED
+0x0D	0x000D	#	CARRIAGE RETURN
+0x0E	0x000E	#	SHIFT OUT
+0x0F	0x000F	#	SHIFT IN
+0x10	0x0010	#	DATA LINK ESCAPE
+0x11	0x0011	#	DEVICE CONTROL ONE
+0x12	0x0012	#	DEVICE CONTROL TWO
+0x13	0x0013	#	DEVICE CONTROL THREE
+0x14	0x0014	#	DEVICE CONTROL FOUR
+0x15	0x0015	#	NEGATIVE ACKNOWLEDGE
+0x16	0x0016	#	SYNCHRONOUS IDLE
+0x17	0x0017	#	END OF TRANSMISSION BLOCK
+0x18	0x0018	#	CANCEL
+0x19	0x0019	#	END OF MEDIUM
+0x1A	0x001A	#	SUBSTITUTE
+0x1B	0x001B	#	ESCAPE
+0x1C	0x001C	#	FILE SEPARATOR
+0x1D	0x001D	#	GROUP SEPARATOR
+0x1E	0x001E	#	RECORD SEPARATOR
+0x1F	0x001F	#	UNIT SEPARATOR
+0x20	0x0020	#	SPACE
+0x21	0x0021	#	EXCLAMATION MARK
+0x22	0x0022	#	QUOTATION MARK
+0x23	0x0023	#	NUMBER SIGN
+0x24	0x0024	#	DOLLAR SIGN
+0x25	0x0025	#	PERCENT SIGN
+0x26	0x0026	#	AMPERSAND
+0x27	0x0027	#	APOSTROPHE
+0x28	0x0028	#	LEFT PARENTHESIS
+0x29	0x0029	#	RIGHT PARENTHESIS
+0x2A	0x002A	#	ASTERISK
+0x2B	0x002B	#	PLUS SIGN
+0x2C	0x002C	#	COMMA
+0x2D	0x002D	#	HYPHEN-MINUS
+0x2E	0x002E	#	FULL STOP
+0x2F	0x002F	#	SOLIDUS
+0x30	0x0030	#	DIGIT ZERO
+0x31	0x0031	#	DIGIT ONE
+0x32	0x0032	#	DIGIT TWO
+0x33	0x0033	#	DIGIT THREE
+0x34	0x0034	#	DIGIT FOUR
+0x35	0x0035	#	DIGIT FIVE
+0x36	0x0036	#	DIGIT SIX
+0x37	0x0037	#	DIGIT SEVEN
+0x38	0x0038	#	DIGIT EIGHT
+0x39	0x0039	#	DIGIT NINE
+0x3A	0x003A	#	COLON
+0x3B	0x003B	#	SEMICOLON
+0x3C	0x003C	#	LESS-THAN SIGN
+0x3D	0x003D	#	EQUALS SIGN
+0x3E	0x003E	#	GREATER-THAN SIGN
+0x3F	0x003F	#	QUESTION MARK
+0x40	0x0040	#	COMMERCIAL AT
+0x41	0x0041	#	LATIN CAPITAL LETTER A
+0x42	0x0042	#	LATIN CAPITAL LETTER B
+0x43	0x0043	#	LATIN CAPITAL LETTER C
+0x44	0x0044	#	LATIN CAPITAL LETTER D
+0x45	0x0045	#	LATIN CAPITAL LETTER E
+0x46	0x0046	#	LATIN CAPITAL LETTER F
+0x47	0x0047	#	LATIN CAPITAL LETTER G
+0x48	0x0048	#	LATIN CAPITAL LETTER H
+0x49	0x0049	#	LATIN CAPITAL LETTER I
+0x4A	0x004A	#	LATIN CAPITAL LETTER J
+0x4B	0x004B	#	LATIN CAPITAL LETTER K
+0x4C	0x004C	#	LATIN CAPITAL LETTER L
+0x4D	0x004D	#	LATIN CAPITAL LETTER M
+0x4E	0x004E	#	LATIN CAPITAL LETTER N
+0x4F	0x004F	#	LATIN CAPITAL LETTER O
+0x50	0x0050	#	LATIN CAPITAL LETTER P
+0x51	0x0051	#	LATIN CAPITAL LETTER Q
+0x52	0x0052	#	LATIN CAPITAL LETTER R
+0x53	0x0053	#	LATIN CAPITAL LETTER S
+0x54	0x0054	#	LATIN CAPITAL LETTER T
+0x55	0x0055	#	LATIN CAPITAL LETTER U
+0x56	0x0056	#	LATIN CAPITAL LETTER V
+0x57	0x0057	#	LATIN CAPITAL LETTER W
+0x58	0x0058	#	LATIN CAPITAL LETTER X
+0x59	0x0059	#	LATIN CAPITAL LETTER Y
+0x5A	0x005A	#	LATIN CAPITAL LETTER Z
+0x5B	0x005B	#	LEFT SQUARE BRACKET
+0x5C	0x005C	#	REVERSE SOLIDUS
+0x5D	0x005D	#	RIGHT SQUARE BRACKET
+0x5E	0x005E	#	CIRCUMFLEX ACCENT
+0x5F	0x005F	#	LOW LINE
+0x60	0x0060	#	GRAVE ACCENT
+0x61	0x0061	#	LATIN SMALL LETTER A
+0x62	0x0062	#	LATIN SMALL LETTER B
+0x63	0x0063	#	LATIN SMALL LETTER C
+0x64	0x0064	#	LATIN SMALL LETTER D
+0x65	0x0065	#	LATIN SMALL LETTER E
+0x66	0x0066	#	LATIN SMALL LETTER F
+0x67	0x0067	#	LATIN SMALL LETTER G
+0x68	0x0068	#	LATIN SMALL LETTER H
+0x69	0x0069	#	LATIN SMALL LETTER I
+0x6A	0x006A	#	LATIN SMALL LETTER J
+0x6B	0x006B	#	LATIN SMALL LETTER K
+0x6C	0x006C	#	LATIN SMALL LETTER L
+0x6D	0x006D	#	LATIN SMALL LETTER M
+0x6E	0x006E	#	LATIN SMALL LETTER N
+0x6F	0x006F	#	LATIN SMALL LETTER O
+0x70	0x0070	#	LATIN SMALL LETTER P
+0x71	0x0071	#	LATIN SMALL LETTER Q
+0x72	0x0072	#	LATIN SMALL LETTER R
+0x73	0x0073	#	LATIN SMALL LETTER S
+0x74	0x0074	#	LATIN SMALL LETTER T
+0x75	0x0075	#	LATIN SMALL LETTER U
+0x76	0x0076	#	LATIN SMALL LETTER V
+0x77	0x0077	#	LATIN SMALL LETTER W
+0x78	0x0078	#	LATIN SMALL LETTER X
+0x79	0x0079	#	LATIN SMALL LETTER Y
+0x7A	0x007A	#	LATIN SMALL LETTER Z
+0x7B	0x007B	#	LEFT CURLY BRACKET
+0x7C	0x007C	#	VERTICAL LINE
+0x7D	0x007D	#	RIGHT CURLY BRACKET
+0x7E	0x007E	#	TILDE
+0x7F	0x007F	#	DELETE
+0x80	0x0080	#	<control>
+0x81	0x0081	#	<control>
+0x82	0x0082	#	<control>
+0x83	0x0083	#	<control>
+0x84	0x0084	#	<control>
+0x85	0x0085	#	<control>
+0x86	0x0086	#	<control>
+0x87	0x0087	#	<control>
+0x88	0x0088	#	<control>
+0x89	0x0089	#	<control>
+0x8A	0x008A	#	<control>
+0x8B	0x008B	#	<control>
+0x8C	0x008C	#	<control>
+0x8D	0x008D	#	<control>
+0x8E	0x008E	#	<control>
+0x8F	0x008F	#	<control>
+0x90	0x0090	#	<control>
+0x91	0x0091	#	<control>
+0x92	0x0092	#	<control>
+0x93	0x0093	#	<control>
+0x94	0x0094	#	<control>
+0x95	0x0095	#	<control>
+0x96	0x0096	#	<control>
+0x97	0x0097	#	<control>
+0x98	0x0098	#	<control>
+0x99	0x0099	#	<control>
+0x9A	0x009A	#	<control>
+0x9B	0x009B	#	<control>
+0x9C	0x009C	#	<control>
+0x9D	0x009D	#	<control>
+0x9E	0x009E	#	<control>
+0x9F	0x009F	#	<control>
+0xA0	0x00A0	#	NO-BREAK SPACE
+0xA1	0x201D	#	RIGHT DOUBLE QUOTATION MARK
+0xA2	0x00A2	#	CENT SIGN
+0xA3	0x00A3	#	POUND SIGN
+0xA4	0x00A4	#	CURRENCY SIGN
+0xA5	0x201E	#	DOUBLE LOW-9 QUOTATION MARK
+0xA6	0x00A6	#	BROKEN BAR
+0xA7	0x00A7	#	SECTION SIGN
+0xA8	0x00D8	#	LATIN CAPITAL LETTER O WITH STROKE
+0xA9	0x00A9	#	COPYRIGHT SIGN
+0xAA	0x0156	#	LATIN CAPITAL LETTER R WITH CEDILLA
+0xAB	0x00AB	#	LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xAC	0x00AC	#	NOT SIGN
+0xAD	0x00AD	#	SOFT HYPHEN
+0xAE	0x00AE	#	REGISTERED SIGN
+0xAF	0x00C6	#	LATIN CAPITAL LETTER AE
+0xB0	0x00B0	#	DEGREE SIGN
+0xB1	0x00B1	#	PLUS-MINUS SIGN
+0xB2	0x00B2	#	SUPERSCRIPT TWO
+0xB3	0x00B3	#	SUPERSCRIPT THREE
+0xB4	0x201C	#	LEFT DOUBLE QUOTATION MARK
+0xB5	0x00B5	#	MICRO SIGN
+0xB6	0x00B6	#	PILCROW SIGN
+0xB7	0x00B7	#	MIDDLE DOT
+0xB8	0x00F8	#	LATIN SMALL LETTER O WITH STROKE
+0xB9	0x00B9	#	SUPERSCRIPT ONE
+0xBA	0x0157	#	LATIN SMALL LETTER R WITH CEDILLA
+0xBB	0x00BB	#	RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xBC	0x00BC	#	VULGAR FRACTION ONE QUARTER
+0xBD	0x00BD	#	VULGAR FRACTION ONE HALF
+0xBE	0x00BE	#	VULGAR FRACTION THREE QUARTERS
+0xBF	0x00E6	#	LATIN SMALL LETTER AE
+0xC0	0x0104	#	LATIN CAPITAL LETTER A WITH OGONEK
+0xC1	0x012E	#	LATIN CAPITAL LETTER I WITH OGONEK
+0xC2	0x0100	#	LATIN CAPITAL LETTER A WITH MACRON
+0xC3	0x0106	#	LATIN CAPITAL LETTER C WITH ACUTE
+0xC4	0x00C4	#	LATIN CAPITAL LETTER A WITH DIAERESIS
+0xC5	0x00C5	#	LATIN CAPITAL LETTER A WITH RING ABOVE
+0xC6	0x0118	#	LATIN CAPITAL LETTER E WITH OGONEK
+0xC7	0x0112	#	LATIN CAPITAL LETTER E WITH MACRON
+0xC8	0x010C	#	LATIN CAPITAL LETTER C WITH CARON
+0xC9	0x00C9	#	LATIN CAPITAL LETTER E WITH ACUTE
+0xCA	0x0179	#	LATIN CAPITAL LETTER Z WITH ACUTE
+0xCB	0x0116	#	LATIN CAPITAL LETTER E WITH DOT ABOVE
+0xCC	0x0122	#	LATIN CAPITAL LETTER G WITH CEDILLA
+0xCD	0x0136	#	LATIN CAPITAL LETTER K WITH CEDILLA
+0xCE	0x012A	#	LATIN CAPITAL LETTER I WITH MACRON
+0xCF	0x013B	#	LATIN CAPITAL LETTER L WITH CEDILLA
+0xD0	0x0160	#	LATIN CAPITAL LETTER S WITH CARON
+0xD1	0x0143	#	LATIN CAPITAL LETTER N WITH ACUTE
+0xD2	0x0145	#	LATIN CAPITAL LETTER N WITH CEDILLA
+0xD3	0x00D3	#	LATIN CAPITAL LETTER O WITH ACUTE
+0xD4	0x014C	#	LATIN CAPITAL LETTER O WITH MACRON
+0xD5	0x00D5	#	LATIN CAPITAL LETTER O WITH TILDE
+0xD6	0x00D6	#	LATIN CAPITAL LETTER O WITH DIAERESIS
+0xD7	0x00D7	#	MULTIPLICATION SIGN
+0xD8	0x0172	#	LATIN CAPITAL LETTER U WITH OGONEK
+0xD9	0x0141	#	LATIN CAPITAL LETTER L WITH STROKE
+0xDA	0x015A	#	LATIN CAPITAL LETTER S WITH ACUTE
+0xDB	0x016A	#	LATIN CAPITAL LETTER U WITH MACRON
+0xDC	0x00DC	#	LATIN CAPITAL LETTER U WITH DIAERESIS
+0xDD	0x017B	#	LATIN CAPITAL LETTER Z WITH DOT ABOVE
+0xDE	0x017D	#	LATIN CAPITAL LETTER Z WITH CARON
+0xDF	0x00DF	#	LATIN SMALL LETTER SHARP S (German)
+0xE0	0x0105	#	LATIN SMALL LETTER A WITH OGONEK
+0xE1	0x012F	#	LATIN SMALL LETTER I WITH OGONEK
+0xE2	0x0101	#	LATIN SMALL LETTER A WITH MACRON
+0xE3	0x0107	#	LATIN SMALL LETTER C WITH ACUTE
+0xE4	0x00E4	#	LATIN SMALL LETTER A WITH DIAERESIS
+0xE5	0x00E5	#	LATIN SMALL LETTER A WITH RING ABOVE
+0xE6	0x0119	#	LATIN SMALL LETTER E WITH OGONEK
+0xE7	0x0113	#	LATIN SMALL LETTER E WITH MACRON
+0xE8	0x010D	#	LATIN SMALL LETTER C WITH CARON
+0xE9	0x00E9	#	LATIN SMALL LETTER E WITH ACUTE
+0xEA	0x017A	#	LATIN SMALL LETTER Z WITH ACUTE
+0xEB	0x0117	#	LATIN SMALL LETTER E WITH DOT ABOVE
+0xEC	0x0123	#	LATIN SMALL LETTER G WITH CEDILLA
+0xED	0x0137	#	LATIN SMALL LETTER K WITH CEDILLA
+0xEE	0x012B	#	LATIN SMALL LETTER I WITH MACRON
+0xEF	0x013C	#	LATIN SMALL LETTER L WITH CEDILLA
+0xF0	0x0161	#	LATIN SMALL LETTER S WITH CARON
+0xF1	0x0144	#	LATIN SMALL LETTER N WITH ACUTE
+0xF2	0x0146	#	LATIN SMALL LETTER N WITH CEDILLA
+0xF3	0x00F3	#	LATIN SMALL LETTER O WITH ACUTE
+0xF4	0x014D	#	LATIN SMALL LETTER O WITH MACRON
+0xF5	0x00F5	#	LATIN SMALL LETTER O WITH TILDE
+0xF6	0x00F6	#	LATIN SMALL LETTER O WITH DIAERESIS
+0xF7	0x00F7	#	DIVISION SIGN
+0xF8	0x0173	#	LATIN SMALL LETTER U WITH OGONEK
+0xF9	0x0142	#	LATIN SMALL LETTER L WITH STROKE
+0xFA	0x015B	#	LATIN SMALL LETTER S WITH ACUTE
+0xFB	0x016B	#	LATIN SMALL LETTER U WITH MACRON
+0xFC	0x00FC	#	LATIN SMALL LETTER U WITH DIAERESIS
+0xFD	0x017C	#	LATIN SMALL LETTER Z WITH DOT ABOVE
+0xFE	0x017E	#	LATIN SMALL LETTER Z WITH CARON
+0xFF	0x2019	#	RIGHT SINGLE QUOTATION MARK
diff --git a/lib/ucmaps/8859-14.txt b/lib/ucmaps/8859-14.txt
new file mode 100644
index 000000000..36038f413
--- /dev/null
+++ b/lib/ucmaps/8859-14.txt
@@ -0,0 +1,301 @@
+#
+#	Name:             ISO/IEC 8859-14:1998 to Unicode
+#	Unicode version:  3.0
+#	Table version:    1.0
+#	Table format:     Format A
+#	Date:             1999 July 27
+#	Authors:          Markus Kuhn <mkuhn@acm.org>
+#			  Ken Whistler <kenw@sybase.com>
+#
+#	Copyright (c) 1998 - 1999 Unicode, Inc.  All Rights reserved.
+#
+#	This file is provided as-is by Unicode, Inc. (The Unicode Consortium).
+#	No claims are made as to fitness for any particular purpose.  No
+#	warranties of any kind are expressed or implied.  The recipient
+#	agrees to determine applicability of information provided.  If this
+#	file has been provided on optical media by Unicode, Inc., the sole
+#	remedy for any claim will be exchange of defective media within 90
+#	days of receipt.
+#
+#	Unicode, Inc. hereby grants the right to freely use the information
+#	supplied in this file in the creation of products supporting the
+#	Unicode Standard, and to make copies of this file in any form for
+#	internal or external distribution as long as this notice remains
+#	attached.
+#
+#	General notes:
+#
+#	This table contains the data the Unicode Consortium has on how
+#       ISO/IEC 8859-14:1998 characters map into Unicode.
+#
+#	Format:  Three tab-separated columns
+#		 Column #1 is the ISO/IEC 8859-14 code (in hex as 0xXX)
+#		 Column #2 is the Unicode (in hex as 0xXXXX)
+#		 Column #3 the Unicode name (follows a comment sign, '#')
+#
+#	The entries are in ISO/IEC 8859-14 order.
+#
+#	Updated versions of this file may be found in:
+#		<ftp://ftp.unicode.org/Public/MAPPINGS/>
+#
+#	Any comments or problems, contact <errata@unicode.org>
+#	Please note that <errata@unicode.org> is an archival address;
+#	notices will be checked, but do not expect an immediate response.
+#
+0x00	0x0000	#	NULL
+0x01	0x0001	#	START OF HEADING
+0x02	0x0002	#	START OF TEXT
+0x03	0x0003	#	END OF TEXT
+0x04	0x0004	#	END OF TRANSMISSION
+0x05	0x0005	#	ENQUIRY
+0x06	0x0006	#	ACKNOWLEDGE
+0x07	0x0007	#	BELL
+0x08	0x0008	#	BACKSPACE
+0x09	0x0009	#	HORIZONTAL TABULATION
+0x0A	0x000A	#	LINE FEED
+0x0B	0x000B	#	VERTICAL TABULATION
+0x0C	0x000C	#	FORM FEED
+0x0D	0x000D	#	CARRIAGE RETURN
+0x0E	0x000E	#	SHIFT OUT
+0x0F	0x000F	#	SHIFT IN
+0x10	0x0010	#	DATA LINK ESCAPE
+0x11	0x0011	#	DEVICE CONTROL ONE
+0x12	0x0012	#	DEVICE CONTROL TWO
+0x13	0x0013	#	DEVICE CONTROL THREE
+0x14	0x0014	#	DEVICE CONTROL FOUR
+0x15	0x0015	#	NEGATIVE ACKNOWLEDGE
+0x16	0x0016	#	SYNCHRONOUS IDLE
+0x17	0x0017	#	END OF TRANSMISSION BLOCK
+0x18	0x0018	#	CANCEL
+0x19	0x0019	#	END OF MEDIUM
+0x1A	0x001A	#	SUBSTITUTE
+0x1B	0x001B	#	ESCAPE
+0x1C	0x001C	#	FILE SEPARATOR
+0x1D	0x001D	#	GROUP SEPARATOR
+0x1E	0x001E	#	RECORD SEPARATOR
+0x1F	0x001F	#	UNIT SEPARATOR
+0x20	0x0020	#	SPACE
+0x21	0x0021	#	EXCLAMATION MARK
+0x22	0x0022	#	QUOTATION MARK
+0x23	0x0023	#	NUMBER SIGN
+0x24	0x0024	#	DOLLAR SIGN
+0x25	0x0025	#	PERCENT SIGN
+0x26	0x0026	#	AMPERSAND
+0x27	0x0027	#	APOSTROPHE
+0x28	0x0028	#	LEFT PARENTHESIS
+0x29	0x0029	#	RIGHT PARENTHESIS
+0x2A	0x002A	#	ASTERISK
+0x2B	0x002B	#	PLUS SIGN
+0x2C	0x002C	#	COMMA
+0x2D	0x002D	#	HYPHEN-MINUS
+0x2E	0x002E	#	FULL STOP
+0x2F	0x002F	#	SOLIDUS
+0x30	0x0030	#	DIGIT ZERO
+0x31	0x0031	#	DIGIT ONE
+0x32	0x0032	#	DIGIT TWO
+0x33	0x0033	#	DIGIT THREE
+0x34	0x0034	#	DIGIT FOUR
+0x35	0x0035	#	DIGIT FIVE
+0x36	0x0036	#	DIGIT SIX
+0x37	0x0037	#	DIGIT SEVEN
+0x38	0x0038	#	DIGIT EIGHT
+0x39	0x0039	#	DIGIT NINE
+0x3A	0x003A	#	COLON
+0x3B	0x003B	#	SEMICOLON
+0x3C	0x003C	#	LESS-THAN SIGN
+0x3D	0x003D	#	EQUALS SIGN
+0x3E	0x003E	#	GREATER-THAN SIGN
+0x3F	0x003F	#	QUESTION MARK
+0x40	0x0040	#	COMMERCIAL AT
+0x41	0x0041	#	LATIN CAPITAL LETTER A
+0x42	0x0042	#	LATIN CAPITAL LETTER B
+0x43	0x0043	#	LATIN CAPITAL LETTER C
+0x44	0x0044	#	LATIN CAPITAL LETTER D
+0x45	0x0045	#	LATIN CAPITAL LETTER E
+0x46	0x0046	#	LATIN CAPITAL LETTER F
+0x47	0x0047	#	LATIN CAPITAL LETTER G
+0x48	0x0048	#	LATIN CAPITAL LETTER H
+0x49	0x0049	#	LATIN CAPITAL LETTER I
+0x4A	0x004A	#	LATIN CAPITAL LETTER J
+0x4B	0x004B	#	LATIN CAPITAL LETTER K
+0x4C	0x004C	#	LATIN CAPITAL LETTER L
+0x4D	0x004D	#	LATIN CAPITAL LETTER M
+0x4E	0x004E	#	LATIN CAPITAL LETTER N
+0x4F	0x004F	#	LATIN CAPITAL LETTER O
+0x50	0x0050	#	LATIN CAPITAL LETTER P
+0x51	0x0051	#	LATIN CAPITAL LETTER Q
+0x52	0x0052	#	LATIN CAPITAL LETTER R
+0x53	0x0053	#	LATIN CAPITAL LETTER S
+0x54	0x0054	#	LATIN CAPITAL LETTER T
+0x55	0x0055	#	LATIN CAPITAL LETTER U
+0x56	0x0056	#	LATIN CAPITAL LETTER V
+0x57	0x0057	#	LATIN CAPITAL LETTER W
+0x58	0x0058	#	LATIN CAPITAL LETTER X
+0x59	0x0059	#	LATIN CAPITAL LETTER Y
+0x5A	0x005A	#	LATIN CAPITAL LETTER Z
+0x5B	0x005B	#	LEFT SQUARE BRACKET
+0x5C	0x005C	#	REVERSE SOLIDUS
+0x5D	0x005D	#	RIGHT SQUARE BRACKET
+0x5E	0x005E	#	CIRCUMFLEX ACCENT
+0x5F	0x005F	#	LOW LINE
+0x60	0x0060	#	GRAVE ACCENT
+0x61	0x0061	#	LATIN SMALL LETTER A
+0x62	0x0062	#	LATIN SMALL LETTER B
+0x63	0x0063	#	LATIN SMALL LETTER C
+0x64	0x0064	#	LATIN SMALL LETTER D
+0x65	0x0065	#	LATIN SMALL LETTER E
+0x66	0x0066	#	LATIN SMALL LETTER F
+0x67	0x0067	#	LATIN SMALL LETTER G
+0x68	0x0068	#	LATIN SMALL LETTER H
+0x69	0x0069	#	LATIN SMALL LETTER I
+0x6A	0x006A	#	LATIN SMALL LETTER J
+0x6B	0x006B	#	LATIN SMALL LETTER K
+0x6C	0x006C	#	LATIN SMALL LETTER L
+0x6D	0x006D	#	LATIN SMALL LETTER M
+0x6E	0x006E	#	LATIN SMALL LETTER N
+0x6F	0x006F	#	LATIN SMALL LETTER O
+0x70	0x0070	#	LATIN SMALL LETTER P
+0x71	0x0071	#	LATIN SMALL LETTER Q
+0x72	0x0072	#	LATIN SMALL LETTER R
+0x73	0x0073	#	LATIN SMALL LETTER S
+0x74	0x0074	#	LATIN SMALL LETTER T
+0x75	0x0075	#	LATIN SMALL LETTER U
+0x76	0x0076	#	LATIN SMALL LETTER V
+0x77	0x0077	#	LATIN SMALL LETTER W
+0x78	0x0078	#	LATIN SMALL LETTER X
+0x79	0x0079	#	LATIN SMALL LETTER Y
+0x7A	0x007A	#	LATIN SMALL LETTER Z
+0x7B	0x007B	#	LEFT CURLY BRACKET
+0x7C	0x007C	#	VERTICAL LINE
+0x7D	0x007D	#	RIGHT CURLY BRACKET
+0x7E	0x007E	#	TILDE
+0x7F	0x007F	#	DELETE
+0x80	0x0080	#	<control>
+0x81	0x0081	#	<control>
+0x82	0x0082	#	<control>
+0x83	0x0083	#	<control>
+0x84	0x0084	#	<control>
+0x85	0x0085	#	<control>
+0x86	0x0086	#	<control>
+0x87	0x0087	#	<control>
+0x88	0x0088	#	<control>
+0x89	0x0089	#	<control>
+0x8A	0x008A	#	<control>
+0x8B	0x008B	#	<control>
+0x8C	0x008C	#	<control>
+0x8D	0x008D	#	<control>
+0x8E	0x008E	#	<control>
+0x8F	0x008F	#	<control>
+0x90	0x0090	#	<control>
+0x91	0x0091	#	<control>
+0x92	0x0092	#	<control>
+0x93	0x0093	#	<control>
+0x94	0x0094	#	<control>
+0x95	0x0095	#	<control>
+0x96	0x0096	#	<control>
+0x97	0x0097	#	<control>
+0x98	0x0098	#	<control>
+0x99	0x0099	#	<control>
+0x9A	0x009A	#	<control>
+0x9B	0x009B	#	<control>
+0x9C	0x009C	#	<control>
+0x9D	0x009D	#	<control>
+0x9E	0x009E	#	<control>
+0x9F	0x009F	#	<control>
+0xA0	0x00A0	#	NO-BREAK SPACE
+0xA1	0x1E02	#	LATIN CAPITAL LETTER B WITH DOT ABOVE
+0xA2	0x1E03	#	LATIN SMALL LETTER B WITH DOT ABOVE
+0xA3	0x00A3	#	POUND SIGN
+0xA4	0x010A	#	LATIN CAPITAL LETTER C WITH DOT ABOVE
+0xA5	0x010B	#	LATIN SMALL LETTER C WITH DOT ABOVE
+0xA6	0x1E0A	#	LATIN CAPITAL LETTER D WITH DOT ABOVE
+0xA7	0x00A7	#	SECTION SIGN
+0xA8	0x1E80	#	LATIN CAPITAL LETTER W WITH GRAVE
+0xA9	0x00A9	#	COPYRIGHT SIGN
+0xAA	0x1E82	#	LATIN CAPITAL LETTER W WITH ACUTE
+0xAB	0x1E0B	#	LATIN SMALL LETTER D WITH DOT ABOVE
+0xAC	0x1EF2	#	LATIN CAPITAL LETTER Y WITH GRAVE
+0xAD	0x00AD	#	SOFT HYPHEN
+0xAE	0x00AE	#	REGISTERED SIGN
+0xAF	0x0178	#	LATIN CAPITAL LETTER Y WITH DIAERESIS
+0xB0	0x1E1E	#	LATIN CAPITAL LETTER F WITH DOT ABOVE
+0xB1	0x1E1F	#	LATIN SMALL LETTER F WITH DOT ABOVE
+0xB2	0x0120	#	LATIN CAPITAL LETTER G WITH DOT ABOVE
+0xB3	0x0121	#	LATIN SMALL LETTER G WITH DOT ABOVE
+0xB4	0x1E40	#	LATIN CAPITAL LETTER M WITH DOT ABOVE
+0xB5	0x1E41	#	LATIN SMALL LETTER M WITH DOT ABOVE
+0xB6	0x00B6	#	PILCROW SIGN
+0xB7	0x1E56	#	LATIN CAPITAL LETTER P WITH DOT ABOVE
+0xB8	0x1E81	#	LATIN SMALL LETTER W WITH GRAVE
+0xB9	0x1E57	#	LATIN SMALL LETTER P WITH DOT ABOVE
+0xBA	0x1E83	#	LATIN SMALL LETTER W WITH ACUTE
+0xBB	0x1E60	#	LATIN CAPITAL LETTER S WITH DOT ABOVE
+0xBC	0x1EF3	#	LATIN SMALL LETTER Y WITH GRAVE
+0xBD	0x1E84	#	LATIN CAPITAL LETTER W WITH DIAERESIS
+0xBE	0x1E85	#	LATIN SMALL LETTER W WITH DIAERESIS
+0xBF	0x1E61	#	LATIN SMALL LETTER S WITH DOT ABOVE
+0xC0	0x00C0	#	LATIN CAPITAL LETTER A WITH GRAVE
+0xC1	0x00C1	#	LATIN CAPITAL LETTER A WITH ACUTE
+0xC2	0x00C2	#	LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+0xC3	0x00C3	#	LATIN CAPITAL LETTER A WITH TILDE
+0xC4	0x00C4	#	LATIN CAPITAL LETTER A WITH DIAERESIS
+0xC5	0x00C5	#	LATIN CAPITAL LETTER A WITH RING ABOVE
+0xC6	0x00C6	#	LATIN CAPITAL LETTER AE
+0xC7	0x00C7	#	LATIN CAPITAL LETTER C WITH CEDILLA
+0xC8	0x00C8	#	LATIN CAPITAL LETTER E WITH GRAVE
+0xC9	0x00C9	#	LATIN CAPITAL LETTER E WITH ACUTE
+0xCA	0x00CA	#	LATIN CAPITAL LETTER E WITH CIRCUMFLEX
+0xCB	0x00CB	#	LATIN CAPITAL LETTER E WITH DIAERESIS
+0xCC	0x00CC	#	LATIN CAPITAL LETTER I WITH GRAVE
+0xCD	0x00CD	#	LATIN CAPITAL LETTER I WITH ACUTE
+0xCE	0x00CE	#	LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+0xCF	0x00CF	#	LATIN CAPITAL LETTER I WITH DIAERESIS
+0xD0	0x0174	#	LATIN CAPITAL LETTER W WITH CIRCUMFLEX
+0xD1	0x00D1	#	LATIN CAPITAL LETTER N WITH TILDE
+0xD2	0x00D2	#	LATIN CAPITAL LETTER O WITH GRAVE
+0xD3	0x00D3	#	LATIN CAPITAL LETTER O WITH ACUTE
+0xD4	0x00D4	#	LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+0xD5	0x00D5	#	LATIN CAPITAL LETTER O WITH TILDE
+0xD6	0x00D6	#	LATIN CAPITAL LETTER O WITH DIAERESIS
+0xD7	0x1E6A	#	LATIN CAPITAL LETTER T WITH DOT ABOVE
+0xD8	0x00D8	#	LATIN CAPITAL LETTER O WITH STROKE
+0xD9	0x00D9	#	LATIN CAPITAL LETTER U WITH GRAVE
+0xDA	0x00DA	#	LATIN CAPITAL LETTER U WITH ACUTE
+0xDB	0x00DB	#	LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+0xDC	0x00DC	#	LATIN CAPITAL LETTER U WITH DIAERESIS
+0xDD	0x00DD	#	LATIN CAPITAL LETTER Y WITH ACUTE
+0xDE	0x0176	#	LATIN CAPITAL LETTER Y WITH CIRCUMFLEX
+0xDF	0x00DF	#	LATIN SMALL LETTER SHARP S
+0xE0	0x00E0	#	LATIN SMALL LETTER A WITH GRAVE
+0xE1	0x00E1	#	LATIN SMALL LETTER A WITH ACUTE
+0xE2	0x00E2	#	LATIN SMALL LETTER A WITH CIRCUMFLEX
+0xE3	0x00E3	#	LATIN SMALL LETTER A WITH TILDE
+0xE4	0x00E4	#	LATIN SMALL LETTER A WITH DIAERESIS
+0xE5	0x00E5	#	LATIN SMALL LETTER A WITH RING ABOVE
+0xE6	0x00E6	#	LATIN SMALL LETTER AE
+0xE7	0x00E7	#	LATIN SMALL LETTER C WITH CEDILLA
+0xE8	0x00E8	#	LATIN SMALL LETTER E WITH GRAVE
+0xE9	0x00E9	#	LATIN SMALL LETTER E WITH ACUTE
+0xEA	0x00EA	#	LATIN SMALL LETTER E WITH CIRCUMFLEX
+0xEB	0x00EB	#	LATIN SMALL LETTER E WITH DIAERESIS
+0xEC	0x00EC	#	LATIN SMALL LETTER I WITH GRAVE
+0xED	0x00ED	#	LATIN SMALL LETTER I WITH ACUTE
+0xEE	0x00EE	#	LATIN SMALL LETTER I WITH CIRCUMFLEX
+0xEF	0x00EF	#	LATIN SMALL LETTER I WITH DIAERESIS
+0xF0	0x0175	#	LATIN SMALL LETTER W WITH CIRCUMFLEX
+0xF1	0x00F1	#	LATIN SMALL LETTER N WITH TILDE
+0xF2	0x00F2	#	LATIN SMALL LETTER O WITH GRAVE
+0xF3	0x00F3	#	LATIN SMALL LETTER O WITH ACUTE
+0xF4	0x00F4	#	LATIN SMALL LETTER O WITH CIRCUMFLEX
+0xF5	0x00F5	#	LATIN SMALL LETTER O WITH TILDE
+0xF6	0x00F6	#	LATIN SMALL LETTER O WITH DIAERESIS
+0xF7	0x1E6B	#	LATIN SMALL LETTER T WITH DOT ABOVE
+0xF8	0x00F8	#	LATIN SMALL LETTER O WITH STROKE
+0xF9	0x00F9	#	LATIN SMALL LETTER U WITH GRAVE
+0xFA	0x00FA	#	LATIN SMALL LETTER U WITH ACUTE
+0xFB	0x00FB	#	LATIN SMALL LETTER U WITH CIRCUMFLEX
+0xFC	0x00FC	#	LATIN SMALL LETTER U WITH DIAERESIS
+0xFD	0x00FD	#	LATIN SMALL LETTER Y WITH ACUTE
+0xFE	0x0177	#	LATIN SMALL LETTER Y WITH CIRCUMFLEX
+0xFF	0x00FF	#	LATIN SMALL LETTER Y WITH DIAERESIS
+
diff --git a/lib/ucmaps/8859-15.txt b/lib/ucmaps/8859-15.txt
new file mode 100644
index 000000000..1e319707d
--- /dev/null
+++ b/lib/ucmaps/8859-15.txt
@@ -0,0 +1,303 @@
+#
+#	Name:             ISO/IEC 8859-15:1999 to Unicode
+#	Unicode version:  3.0
+#	Table version:    1.0
+#	Table format:     Format A
+#	Date:             1999 July 27
+#	Authors:          Markus Kuhn <mkuhn@acm.org>
+#			  Ken Whistler <kenw@sybase.com>
+#
+#	Copyright (c) 1998 - 1999 Unicode, Inc.  All Rights reserved.
+#
+#	This file is provided as-is by Unicode, Inc. (The Unicode Consortium).
+#	No claims are made as to fitness for any particular purpose.  No
+#	warranties of any kind are expressed or implied.  The recipient
+#	agrees to determine applicability of information provided.  If this
+#	file has been provided on optical media by Unicode, Inc., the sole
+#	remedy for any claim will be exchange of defective media within 90
+#	days of receipt.
+#
+#	Unicode, Inc. hereby grants the right to freely use the information
+#	supplied in this file in the creation of products supporting the
+#	Unicode Standard, and to make copies of this file in any form for
+#	internal or external distribution as long as this notice remains
+#	attached.
+#
+#	General notes:
+#
+#	This table contains the data the Unicode Consortium has on how
+#       ISO/IEC 8859-15:1999 characters map into Unicode.
+#
+#	Format:  Three tab-separated columns
+#		 Column #1 is the ISO/IEC 8859-15 code (in hex as 0xXX)
+#		 Column #2 is the Unicode (in hex as 0xXXXX)
+#		 Column #3 the Unicode name (follows a comment sign, '#')
+#
+#	The entries are in ISO/IEC 8859-15 order.
+#
+#	Version history
+#
+#	Updated versions of this file may be found in:
+#		<ftp://ftp.unicode.org/Public/MAPPINGS/>
+#
+#	Any comments or problems, contact <errata@unicode.org>
+#	Please note that <errata@unicode.org> is an archival address;
+#	notices will be checked, but do not expect an immediate response.
+#
+0x00	0x0000	#	NULL
+0x01	0x0001	#	START OF HEADING
+0x02	0x0002	#	START OF TEXT
+0x03	0x0003	#	END OF TEXT
+0x04	0x0004	#	END OF TRANSMISSION
+0x05	0x0005	#	ENQUIRY
+0x06	0x0006	#	ACKNOWLEDGE
+0x07	0x0007	#	BELL
+0x08	0x0008	#	BACKSPACE
+0x09	0x0009	#	HORIZONTAL TABULATION
+0x0A	0x000A	#	LINE FEED
+0x0B	0x000B	#	VERTICAL TABULATION
+0x0C	0x000C	#	FORM FEED
+0x0D	0x000D	#	CARRIAGE RETURN
+0x0E	0x000E	#	SHIFT OUT
+0x0F	0x000F	#	SHIFT IN
+0x10	0x0010	#	DATA LINK ESCAPE
+0x11	0x0011	#	DEVICE CONTROL ONE
+0x12	0x0012	#	DEVICE CONTROL TWO
+0x13	0x0013	#	DEVICE CONTROL THREE
+0x14	0x0014	#	DEVICE CONTROL FOUR
+0x15	0x0015	#	NEGATIVE ACKNOWLEDGE
+0x16	0x0016	#	SYNCHRONOUS IDLE
+0x17	0x0017	#	END OF TRANSMISSION BLOCK
+0x18	0x0018	#	CANCEL
+0x19	0x0019	#	END OF MEDIUM
+0x1A	0x001A	#	SUBSTITUTE
+0x1B	0x001B	#	ESCAPE
+0x1C	0x001C	#	FILE SEPARATOR
+0x1D	0x001D	#	GROUP SEPARATOR
+0x1E	0x001E	#	RECORD SEPARATOR
+0x1F	0x001F	#	UNIT SEPARATOR
+0x20	0x0020	#	SPACE
+0x21	0x0021	#	EXCLAMATION MARK
+0x22	0x0022	#	QUOTATION MARK
+0x23	0x0023	#	NUMBER SIGN
+0x24	0x0024	#	DOLLAR SIGN
+0x25	0x0025	#	PERCENT SIGN
+0x26	0x0026	#	AMPERSAND
+0x27	0x0027	#	APOSTROPHE
+0x28	0x0028	#	LEFT PARENTHESIS
+0x29	0x0029	#	RIGHT PARENTHESIS
+0x2A	0x002A	#	ASTERISK
+0x2B	0x002B	#	PLUS SIGN
+0x2C	0x002C	#	COMMA
+0x2D	0x002D	#	HYPHEN-MINUS
+0x2E	0x002E	#	FULL STOP
+0x2F	0x002F	#	SOLIDUS
+0x30	0x0030	#	DIGIT ZERO
+0x31	0x0031	#	DIGIT ONE
+0x32	0x0032	#	DIGIT TWO
+0x33	0x0033	#	DIGIT THREE
+0x34	0x0034	#	DIGIT FOUR
+0x35	0x0035	#	DIGIT FIVE
+0x36	0x0036	#	DIGIT SIX
+0x37	0x0037	#	DIGIT SEVEN
+0x38	0x0038	#	DIGIT EIGHT
+0x39	0x0039	#	DIGIT NINE
+0x3A	0x003A	#	COLON
+0x3B	0x003B	#	SEMICOLON
+0x3C	0x003C	#	LESS-THAN SIGN
+0x3D	0x003D	#	EQUALS SIGN
+0x3E	0x003E	#	GREATER-THAN SIGN
+0x3F	0x003F	#	QUESTION MARK
+0x40	0x0040	#	COMMERCIAL AT
+0x41	0x0041	#	LATIN CAPITAL LETTER A
+0x42	0x0042	#	LATIN CAPITAL LETTER B
+0x43	0x0043	#	LATIN CAPITAL LETTER C
+0x44	0x0044	#	LATIN CAPITAL LETTER D
+0x45	0x0045	#	LATIN CAPITAL LETTER E
+0x46	0x0046	#	LATIN CAPITAL LETTER F
+0x47	0x0047	#	LATIN CAPITAL LETTER G
+0x48	0x0048	#	LATIN CAPITAL LETTER H
+0x49	0x0049	#	LATIN CAPITAL LETTER I
+0x4A	0x004A	#	LATIN CAPITAL LETTER J
+0x4B	0x004B	#	LATIN CAPITAL LETTER K
+0x4C	0x004C	#	LATIN CAPITAL LETTER L
+0x4D	0x004D	#	LATIN CAPITAL LETTER M
+0x4E	0x004E	#	LATIN CAPITAL LETTER N
+0x4F	0x004F	#	LATIN CAPITAL LETTER O
+0x50	0x0050	#	LATIN CAPITAL LETTER P
+0x51	0x0051	#	LATIN CAPITAL LETTER Q
+0x52	0x0052	#	LATIN CAPITAL LETTER R
+0x53	0x0053	#	LATIN CAPITAL LETTER S
+0x54	0x0054	#	LATIN CAPITAL LETTER T
+0x55	0x0055	#	LATIN CAPITAL LETTER U
+0x56	0x0056	#	LATIN CAPITAL LETTER V
+0x57	0x0057	#	LATIN CAPITAL LETTER W
+0x58	0x0058	#	LATIN CAPITAL LETTER X
+0x59	0x0059	#	LATIN CAPITAL LETTER Y
+0x5A	0x005A	#	LATIN CAPITAL LETTER Z
+0x5B	0x005B	#	LEFT SQUARE BRACKET
+0x5C	0x005C	#	REVERSE SOLIDUS
+0x5D	0x005D	#	RIGHT SQUARE BRACKET
+0x5E	0x005E	#	CIRCUMFLEX ACCENT
+0x5F	0x005F	#	LOW LINE
+0x60	0x0060	#	GRAVE ACCENT
+0x61	0x0061	#	LATIN SMALL LETTER A
+0x62	0x0062	#	LATIN SMALL LETTER B
+0x63	0x0063	#	LATIN SMALL LETTER C
+0x64	0x0064	#	LATIN SMALL LETTER D
+0x65	0x0065	#	LATIN SMALL LETTER E
+0x66	0x0066	#	LATIN SMALL LETTER F
+0x67	0x0067	#	LATIN SMALL LETTER G
+0x68	0x0068	#	LATIN SMALL LETTER H
+0x69	0x0069	#	LATIN SMALL LETTER I
+0x6A	0x006A	#	LATIN SMALL LETTER J
+0x6B	0x006B	#	LATIN SMALL LETTER K
+0x6C	0x006C	#	LATIN SMALL LETTER L
+0x6D	0x006D	#	LATIN SMALL LETTER M
+0x6E	0x006E	#	LATIN SMALL LETTER N
+0x6F	0x006F	#	LATIN SMALL LETTER O
+0x70	0x0070	#	LATIN SMALL LETTER P
+0x71	0x0071	#	LATIN SMALL LETTER Q
+0x72	0x0072	#	LATIN SMALL LETTER R
+0x73	0x0073	#	LATIN SMALL LETTER S
+0x74	0x0074	#	LATIN SMALL LETTER T
+0x75	0x0075	#	LATIN SMALL LETTER U
+0x76	0x0076	#	LATIN SMALL LETTER V
+0x77	0x0077	#	LATIN SMALL LETTER W
+0x78	0x0078	#	LATIN SMALL LETTER X
+0x79	0x0079	#	LATIN SMALL LETTER Y
+0x7A	0x007A	#	LATIN SMALL LETTER Z
+0x7B	0x007B	#	LEFT CURLY BRACKET
+0x7C	0x007C	#	VERTICAL LINE
+0x7D	0x007D	#	RIGHT CURLY BRACKET
+0x7E	0x007E	#	TILDE
+0x7F	0x007F	#	DELETE
+0x80	0x0080	#	<control>
+0x81	0x0081	#	<control>
+0x82	0x0082	#	<control>
+0x83	0x0083	#	<control>
+0x84	0x0084	#	<control>
+0x85	0x0085	#	<control>
+0x86	0x0086	#	<control>
+0x87	0x0087	#	<control>
+0x88	0x0088	#	<control>
+0x89	0x0089	#	<control>
+0x8A	0x008A	#	<control>
+0x8B	0x008B	#	<control>
+0x8C	0x008C	#	<control>
+0x8D	0x008D	#	<control>
+0x8E	0x008E	#	<control>
+0x8F	0x008F	#	<control>
+0x90	0x0090	#	<control>
+0x91	0x0091	#	<control>
+0x92	0x0092	#	<control>
+0x93	0x0093	#	<control>
+0x94	0x0094	#	<control>
+0x95	0x0095	#	<control>
+0x96	0x0096	#	<control>
+0x97	0x0097	#	<control>
+0x98	0x0098	#	<control>
+0x99	0x0099	#	<control>
+0x9A	0x009A	#	<control>
+0x9B	0x009B	#	<control>
+0x9C	0x009C	#	<control>
+0x9D	0x009D	#	<control>
+0x9E	0x009E	#	<control>
+0x9F	0x009F	#	<control>
+0xA0	0x00A0	#	NO-BREAK SPACE
+0xA1	0x00A1	#	INVERTED EXCLAMATION MARK
+0xA2	0x00A2	#	CENT SIGN
+0xA3	0x00A3	#	POUND SIGN
+0xA4	0x20AC	#	EURO SIGN
+0xA5	0x00A5	#	YEN SIGN
+0xA6	0x0160	#	LATIN CAPITAL LETTER S WITH CARON
+0xA7	0x00A7	#	SECTION SIGN
+0xA8	0x0161	#	LATIN SMALL LETTER S WITH CARON
+0xA9	0x00A9	#	COPYRIGHT SIGN
+0xAA	0x00AA	#	FEMININE ORDINAL INDICATOR
+0xAB	0x00AB	#	LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xAC	0x00AC	#	NOT SIGN
+0xAD	0x00AD	#	SOFT HYPHEN
+0xAE	0x00AE	#	REGISTERED SIGN
+0xAF	0x00AF	#	MACRON
+0xB0	0x00B0	#	DEGREE SIGN
+0xB1	0x00B1	#	PLUS-MINUS SIGN
+0xB2	0x00B2	#	SUPERSCRIPT TWO
+0xB3	0x00B3	#	SUPERSCRIPT THREE
+0xB4	0x017D	#	LATIN CAPITAL LETTER Z WITH CARON
+0xB5	0x00B5	#	MICRO SIGN
+0xB6	0x00B6	#	PILCROW SIGN
+0xB7	0x00B7	#	MIDDLE DOT
+0xB8	0x017E	#	LATIN SMALL LETTER Z WITH CARON
+0xB9	0x00B9	#	SUPERSCRIPT ONE
+0xBA	0x00BA	#	MASCULINE ORDINAL INDICATOR
+0xBB	0x00BB	#	RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xBC	0x0152	#	LATIN CAPITAL LIGATURE OE
+0xBD	0x0153	#	LATIN SMALL LIGATURE OE
+0xBE	0x0178	#	LATIN CAPITAL LETTER Y WITH DIAERESIS
+0xBF	0x00BF	#	INVERTED QUESTION MARK
+0xC0	0x00C0	#	LATIN CAPITAL LETTER A WITH GRAVE
+0xC1	0x00C1	#	LATIN CAPITAL LETTER A WITH ACUTE
+0xC2	0x00C2	#	LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+0xC3	0x00C3	#	LATIN CAPITAL LETTER A WITH TILDE
+0xC4	0x00C4	#	LATIN CAPITAL LETTER A WITH DIAERESIS
+0xC5	0x00C5	#	LATIN CAPITAL LETTER A WITH RING ABOVE
+0xC6	0x00C6	#	LATIN CAPITAL LETTER AE
+0xC7	0x00C7	#	LATIN CAPITAL LETTER C WITH CEDILLA
+0xC8	0x00C8	#	LATIN CAPITAL LETTER E WITH GRAVE
+0xC9	0x00C9	#	LATIN CAPITAL LETTER E WITH ACUTE
+0xCA	0x00CA	#	LATIN CAPITAL LETTER E WITH CIRCUMFLEX
+0xCB	0x00CB	#	LATIN CAPITAL LETTER E WITH DIAERESIS
+0xCC	0x00CC	#	LATIN CAPITAL LETTER I WITH GRAVE
+0xCD	0x00CD	#	LATIN CAPITAL LETTER I WITH ACUTE
+0xCE	0x00CE	#	LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+0xCF	0x00CF	#	LATIN CAPITAL LETTER I WITH DIAERESIS
+0xD0	0x00D0	#	LATIN CAPITAL LETTER ETH
+0xD1	0x00D1	#	LATIN CAPITAL LETTER N WITH TILDE
+0xD2	0x00D2	#	LATIN CAPITAL LETTER O WITH GRAVE
+0xD3	0x00D3	#	LATIN CAPITAL LETTER O WITH ACUTE
+0xD4	0x00D4	#	LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+0xD5	0x00D5	#	LATIN CAPITAL LETTER O WITH TILDE
+0xD6	0x00D6	#	LATIN CAPITAL LETTER O WITH DIAERESIS
+0xD7	0x00D7	#	MULTIPLICATION SIGN
+0xD8	0x00D8	#	LATIN CAPITAL LETTER O WITH STROKE
+0xD9	0x00D9	#	LATIN CAPITAL LETTER U WITH GRAVE
+0xDA	0x00DA	#	LATIN CAPITAL LETTER U WITH ACUTE
+0xDB	0x00DB	#	LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+0xDC	0x00DC	#	LATIN CAPITAL LETTER U WITH DIAERESIS
+0xDD	0x00DD	#	LATIN CAPITAL LETTER Y WITH ACUTE
+0xDE	0x00DE	#	LATIN CAPITAL LETTER THORN
+0xDF	0x00DF	#	LATIN SMALL LETTER SHARP S
+0xE0	0x00E0	#	LATIN SMALL LETTER A WITH GRAVE
+0xE1	0x00E1	#	LATIN SMALL LETTER A WITH ACUTE
+0xE2	0x00E2	#	LATIN SMALL LETTER A WITH CIRCUMFLEX
+0xE3	0x00E3	#	LATIN SMALL LETTER A WITH TILDE
+0xE4	0x00E4	#	LATIN SMALL LETTER A WITH DIAERESIS
+0xE5	0x00E5	#	LATIN SMALL LETTER A WITH RING ABOVE
+0xE6	0x00E6	#	LATIN SMALL LETTER AE
+0xE7	0x00E7	#	LATIN SMALL LETTER C WITH CEDILLA
+0xE8	0x00E8	#	LATIN SMALL LETTER E WITH GRAVE
+0xE9	0x00E9	#	LATIN SMALL LETTER E WITH ACUTE
+0xEA	0x00EA	#	LATIN SMALL LETTER E WITH CIRCUMFLEX
+0xEB	0x00EB	#	LATIN SMALL LETTER E WITH DIAERESIS
+0xEC	0x00EC	#	LATIN SMALL LETTER I WITH GRAVE
+0xED	0x00ED	#	LATIN SMALL LETTER I WITH ACUTE
+0xEE	0x00EE	#	LATIN SMALL LETTER I WITH CIRCUMFLEX
+0xEF	0x00EF	#	LATIN SMALL LETTER I WITH DIAERESIS
+0xF0	0x00F0	#	LATIN SMALL LETTER ETH
+0xF1	0x00F1	#	LATIN SMALL LETTER N WITH TILDE
+0xF2	0x00F2	#	LATIN SMALL LETTER O WITH GRAVE
+0xF3	0x00F3	#	LATIN SMALL LETTER O WITH ACUTE
+0xF4	0x00F4	#	LATIN SMALL LETTER O WITH CIRCUMFLEX
+0xF5	0x00F5	#	LATIN SMALL LETTER O WITH TILDE
+0xF6	0x00F6	#	LATIN SMALL LETTER O WITH DIAERESIS
+0xF7	0x00F7	#	DIVISION SIGN
+0xF8	0x00F8	#	LATIN SMALL LETTER O WITH STROKE
+0xF9	0x00F9	#	LATIN SMALL LETTER U WITH GRAVE
+0xFA	0x00FA	#	LATIN SMALL LETTER U WITH ACUTE
+0xFB	0x00FB	#	LATIN SMALL LETTER U WITH CIRCUMFLEX
+0xFC	0x00FC	#	LATIN SMALL LETTER U WITH DIAERESIS
+0xFD	0x00FD	#	LATIN SMALL LETTER Y WITH ACUTE
+0xFE	0x00FE	#	LATIN SMALL LETTER THORN
+0xFF	0x00FF	#	LATIN SMALL LETTER Y WITH DIAERESIS
+
diff --git a/lib/ucmaps/8859-2.txt b/lib/ucmaps/8859-2.txt
new file mode 100644
index 000000000..e45df25eb
--- /dev/null
+++ b/lib/ucmaps/8859-2.txt
@@ -0,0 +1,303 @@
+#
+#	Name:             ISO 8859-2:1999 to Unicode
+#	Unicode version:  3.0
+#	Table version:    1.0
+#	Table format:     Format A
+#	Date:             1999 July 27
+#	Authors:          Ken Whistler <kenw@sybase.com>
+#
+#	Copyright (c) 1991-1999 Unicode, Inc.  All Rights reserved.
+#
+#	This file is provided as-is by Unicode, Inc. (The Unicode Consortium).
+#	No claims are made as to fitness for any particular purpose.  No
+#	warranties of any kind are expressed or implied.  The recipient
+#	agrees to determine applicability of information provided.  If this
+#	file has been provided on optical media by Unicode, Inc., the sole
+#	remedy for any claim will be exchange of defective media within 90
+#	days of receipt.
+#
+#	Unicode, Inc. hereby grants the right to freely use the information
+#	supplied in this file in the creation of products supporting the
+#	Unicode Standard, and to make copies of this file in any form for
+#	internal or external distribution as long as this notice remains
+#	attached.
+#
+#	General notes:
+#
+#	This table contains the data the Unicode Consortium has on how
+#       ISO/IEC 8859-2:1999 characters map into Unicode.
+#
+#	Format:  Three tab-separated columns
+#		 Column #1 is the ISO/IEC 8859-2 code (in hex as 0xXX)
+#		 Column #2 is the Unicode (in hex as 0xXXXX)
+#		 Column #3 the Unicode name (follows a comment sign, '#')
+#
+#	The entries are in ISO/IEC 8859-2 order.
+#
+#	Version history
+#	1.0 version updates 0.1 version by adding mappings for all
+#	control characters.
+#
+#	Updated versions of this file may be found in:
+#		<ftp://ftp.unicode.org/Public/MAPPINGS/>
+#
+#	Any comments or problems, contact <errata@unicode.org>
+#	Please note that <errata@unicode.org> is an archival address;
+#	notices will be checked, but do not expect an immediate response.
+#
+0x00	0x0000	#	NULL
+0x01	0x0001	#	START OF HEADING
+0x02	0x0002	#	START OF TEXT
+0x03	0x0003	#	END OF TEXT
+0x04	0x0004	#	END OF TRANSMISSION
+0x05	0x0005	#	ENQUIRY
+0x06	0x0006	#	ACKNOWLEDGE
+0x07	0x0007	#	BELL
+0x08	0x0008	#	BACKSPACE
+0x09	0x0009	#	HORIZONTAL TABULATION
+0x0A	0x000A	#	LINE FEED
+0x0B	0x000B	#	VERTICAL TABULATION
+0x0C	0x000C	#	FORM FEED
+0x0D	0x000D	#	CARRIAGE RETURN
+0x0E	0x000E	#	SHIFT OUT
+0x0F	0x000F	#	SHIFT IN
+0x10	0x0010	#	DATA LINK ESCAPE
+0x11	0x0011	#	DEVICE CONTROL ONE
+0x12	0x0012	#	DEVICE CONTROL TWO
+0x13	0x0013	#	DEVICE CONTROL THREE
+0x14	0x0014	#	DEVICE CONTROL FOUR
+0x15	0x0015	#	NEGATIVE ACKNOWLEDGE
+0x16	0x0016	#	SYNCHRONOUS IDLE
+0x17	0x0017	#	END OF TRANSMISSION BLOCK
+0x18	0x0018	#	CANCEL
+0x19	0x0019	#	END OF MEDIUM
+0x1A	0x001A	#	SUBSTITUTE
+0x1B	0x001B	#	ESCAPE
+0x1C	0x001C	#	FILE SEPARATOR
+0x1D	0x001D	#	GROUP SEPARATOR
+0x1E	0x001E	#	RECORD SEPARATOR
+0x1F	0x001F	#	UNIT SEPARATOR
+0x20	0x0020	#	SPACE
+0x21	0x0021	#	EXCLAMATION MARK
+0x22	0x0022	#	QUOTATION MARK
+0x23	0x0023	#	NUMBER SIGN
+0x24	0x0024	#	DOLLAR SIGN
+0x25	0x0025	#	PERCENT SIGN
+0x26	0x0026	#	AMPERSAND
+0x27	0x0027	#	APOSTROPHE
+0x28	0x0028	#	LEFT PARENTHESIS
+0x29	0x0029	#	RIGHT PARENTHESIS
+0x2A	0x002A	#	ASTERISK
+0x2B	0x002B	#	PLUS SIGN
+0x2C	0x002C	#	COMMA
+0x2D	0x002D	#	HYPHEN-MINUS
+0x2E	0x002E	#	FULL STOP
+0x2F	0x002F	#	SOLIDUS
+0x30	0x0030	#	DIGIT ZERO
+0x31	0x0031	#	DIGIT ONE
+0x32	0x0032	#	DIGIT TWO
+0x33	0x0033	#	DIGIT THREE
+0x34	0x0034	#	DIGIT FOUR
+0x35	0x0035	#	DIGIT FIVE
+0x36	0x0036	#	DIGIT SIX
+0x37	0x0037	#	DIGIT SEVEN
+0x38	0x0038	#	DIGIT EIGHT
+0x39	0x0039	#	DIGIT NINE
+0x3A	0x003A	#	COLON
+0x3B	0x003B	#	SEMICOLON
+0x3C	0x003C	#	LESS-THAN SIGN
+0x3D	0x003D	#	EQUALS SIGN
+0x3E	0x003E	#	GREATER-THAN SIGN
+0x3F	0x003F	#	QUESTION MARK
+0x40	0x0040	#	COMMERCIAL AT
+0x41	0x0041	#	LATIN CAPITAL LETTER A
+0x42	0x0042	#	LATIN CAPITAL LETTER B
+0x43	0x0043	#	LATIN CAPITAL LETTER C
+0x44	0x0044	#	LATIN CAPITAL LETTER D
+0x45	0x0045	#	LATIN CAPITAL LETTER E
+0x46	0x0046	#	LATIN CAPITAL LETTER F
+0x47	0x0047	#	LATIN CAPITAL LETTER G
+0x48	0x0048	#	LATIN CAPITAL LETTER H
+0x49	0x0049	#	LATIN CAPITAL LETTER I
+0x4A	0x004A	#	LATIN CAPITAL LETTER J
+0x4B	0x004B	#	LATIN CAPITAL LETTER K
+0x4C	0x004C	#	LATIN CAPITAL LETTER L
+0x4D	0x004D	#	LATIN CAPITAL LETTER M
+0x4E	0x004E	#	LATIN CAPITAL LETTER N
+0x4F	0x004F	#	LATIN CAPITAL LETTER O
+0x50	0x0050	#	LATIN CAPITAL LETTER P
+0x51	0x0051	#	LATIN CAPITAL LETTER Q
+0x52	0x0052	#	LATIN CAPITAL LETTER R
+0x53	0x0053	#	LATIN CAPITAL LETTER S
+0x54	0x0054	#	LATIN CAPITAL LETTER T
+0x55	0x0055	#	LATIN CAPITAL LETTER U
+0x56	0x0056	#	LATIN CAPITAL LETTER V
+0x57	0x0057	#	LATIN CAPITAL LETTER W
+0x58	0x0058	#	LATIN CAPITAL LETTER X
+0x59	0x0059	#	LATIN CAPITAL LETTER Y
+0x5A	0x005A	#	LATIN CAPITAL LETTER Z
+0x5B	0x005B	#	LEFT SQUARE BRACKET
+0x5C	0x005C	#	REVERSE SOLIDUS
+0x5D	0x005D	#	RIGHT SQUARE BRACKET
+0x5E	0x005E	#	CIRCUMFLEX ACCENT
+0x5F	0x005F	#	LOW LINE
+0x60	0x0060	#	GRAVE ACCENT
+0x61	0x0061	#	LATIN SMALL LETTER A
+0x62	0x0062	#	LATIN SMALL LETTER B
+0x63	0x0063	#	LATIN SMALL LETTER C
+0x64	0x0064	#	LATIN SMALL LETTER D
+0x65	0x0065	#	LATIN SMALL LETTER E
+0x66	0x0066	#	LATIN SMALL LETTER F
+0x67	0x0067	#	LATIN SMALL LETTER G
+0x68	0x0068	#	LATIN SMALL LETTER H
+0x69	0x0069	#	LATIN SMALL LETTER I
+0x6A	0x006A	#	LATIN SMALL LETTER J
+0x6B	0x006B	#	LATIN SMALL LETTER K
+0x6C	0x006C	#	LATIN SMALL LETTER L
+0x6D	0x006D	#	LATIN SMALL LETTER M
+0x6E	0x006E	#	LATIN SMALL LETTER N
+0x6F	0x006F	#	LATIN SMALL LETTER O
+0x70	0x0070	#	LATIN SMALL LETTER P
+0x71	0x0071	#	LATIN SMALL LETTER Q
+0x72	0x0072	#	LATIN SMALL LETTER R
+0x73	0x0073	#	LATIN SMALL LETTER S
+0x74	0x0074	#	LATIN SMALL LETTER T
+0x75	0x0075	#	LATIN SMALL LETTER U
+0x76	0x0076	#	LATIN SMALL LETTER V
+0x77	0x0077	#	LATIN SMALL LETTER W
+0x78	0x0078	#	LATIN SMALL LETTER X
+0x79	0x0079	#	LATIN SMALL LETTER Y
+0x7A	0x007A	#	LATIN SMALL LETTER Z
+0x7B	0x007B	#	LEFT CURLY BRACKET
+0x7C	0x007C	#	VERTICAL LINE
+0x7D	0x007D	#	RIGHT CURLY BRACKET
+0x7E	0x007E	#	TILDE
+0x7F	0x007F	#	DELETE
+0x80	0x0080	#	<control>
+0x81	0x0081	#	<control>
+0x82	0x0082	#	<control>
+0x83	0x0083	#	<control>
+0x84	0x0084	#	<control>
+0x85	0x0085	#	<control>
+0x86	0x0086	#	<control>
+0x87	0x0087	#	<control>
+0x88	0x0088	#	<control>
+0x89	0x0089	#	<control>
+0x8A	0x008A	#	<control>
+0x8B	0x008B	#	<control>
+0x8C	0x008C	#	<control>
+0x8D	0x008D	#	<control>
+0x8E	0x008E	#	<control>
+0x8F	0x008F	#	<control>
+0x90	0x0090	#	<control>
+0x91	0x0091	#	<control>
+0x92	0x0092	#	<control>
+0x93	0x0093	#	<control>
+0x94	0x0094	#	<control>
+0x95	0x0095	#	<control>
+0x96	0x0096	#	<control>
+0x97	0x0097	#	<control>
+0x98	0x0098	#	<control>
+0x99	0x0099	#	<control>
+0x9A	0x009A	#	<control>
+0x9B	0x009B	#	<control>
+0x9C	0x009C	#	<control>
+0x9D	0x009D	#	<control>
+0x9E	0x009E	#	<control>
+0x9F	0x009F	#	<control>
+0xA0	0x00A0	#	NO-BREAK SPACE
+0xA1	0x0104	#	LATIN CAPITAL LETTER A WITH OGONEK
+0xA2	0x02D8	#	BREVE
+0xA3	0x0141	#	LATIN CAPITAL LETTER L WITH STROKE
+0xA4	0x00A4	#	CURRENCY SIGN
+0xA5	0x013D	#	LATIN CAPITAL LETTER L WITH CARON
+0xA6	0x015A	#	LATIN CAPITAL LETTER S WITH ACUTE
+0xA7	0x00A7	#	SECTION SIGN
+0xA8	0x00A8	#	DIAERESIS
+0xA9	0x0160	#	LATIN CAPITAL LETTER S WITH CARON
+0xAA	0x015E	#	LATIN CAPITAL LETTER S WITH CEDILLA
+0xAB	0x0164	#	LATIN CAPITAL LETTER T WITH CARON
+0xAC	0x0179	#	LATIN CAPITAL LETTER Z WITH ACUTE
+0xAD	0x00AD	#	SOFT HYPHEN
+0xAE	0x017D	#	LATIN CAPITAL LETTER Z WITH CARON
+0xAF	0x017B	#	LATIN CAPITAL LETTER Z WITH DOT ABOVE
+0xB0	0x00B0	#	DEGREE SIGN
+0xB1	0x0105	#	LATIN SMALL LETTER A WITH OGONEK
+0xB2	0x02DB	#	OGONEK
+0xB3	0x0142	#	LATIN SMALL LETTER L WITH STROKE
+0xB4	0x00B4	#	ACUTE ACCENT
+0xB5	0x013E	#	LATIN SMALL LETTER L WITH CARON
+0xB6	0x015B	#	LATIN SMALL LETTER S WITH ACUTE
+0xB7	0x02C7	#	CARON
+0xB8	0x00B8	#	CEDILLA
+0xB9	0x0161	#	LATIN SMALL LETTER S WITH CARON
+0xBA	0x015F	#	LATIN SMALL LETTER S WITH CEDILLA
+0xBB	0x0165	#	LATIN SMALL LETTER T WITH CARON
+0xBC	0x017A	#	LATIN SMALL LETTER Z WITH ACUTE
+0xBD	0x02DD	#	DOUBLE ACUTE ACCENT
+0xBE	0x017E	#	LATIN SMALL LETTER Z WITH CARON
+0xBF	0x017C	#	LATIN SMALL LETTER Z WITH DOT ABOVE
+0xC0	0x0154	#	LATIN CAPITAL LETTER R WITH ACUTE
+0xC1	0x00C1	#	LATIN CAPITAL LETTER A WITH ACUTE
+0xC2	0x00C2	#	LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+0xC3	0x0102	#	LATIN CAPITAL LETTER A WITH BREVE
+0xC4	0x00C4	#	LATIN CAPITAL LETTER A WITH DIAERESIS
+0xC5	0x0139	#	LATIN CAPITAL LETTER L WITH ACUTE
+0xC6	0x0106	#	LATIN CAPITAL LETTER C WITH ACUTE
+0xC7	0x00C7	#	LATIN CAPITAL LETTER C WITH CEDILLA
+0xC8	0x010C	#	LATIN CAPITAL LETTER C WITH CARON
+0xC9	0x00C9	#	LATIN CAPITAL LETTER E WITH ACUTE
+0xCA	0x0118	#	LATIN CAPITAL LETTER E WITH OGONEK
+0xCB	0x00CB	#	LATIN CAPITAL LETTER E WITH DIAERESIS
+0xCC	0x011A	#	LATIN CAPITAL LETTER E WITH CARON
+0xCD	0x00CD	#	LATIN CAPITAL LETTER I WITH ACUTE
+0xCE	0x00CE	#	LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+0xCF	0x010E	#	LATIN CAPITAL LETTER D WITH CARON
+0xD0	0x0110	#	LATIN CAPITAL LETTER D WITH STROKE
+0xD1	0x0143	#	LATIN CAPITAL LETTER N WITH ACUTE
+0xD2	0x0147	#	LATIN CAPITAL LETTER N WITH CARON
+0xD3	0x00D3	#	LATIN CAPITAL LETTER O WITH ACUTE
+0xD4	0x00D4	#	LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+0xD5	0x0150	#	LATIN CAPITAL LETTER O WITH DOUBLE ACUTE
+0xD6	0x00D6	#	LATIN CAPITAL LETTER O WITH DIAERESIS
+0xD7	0x00D7	#	MULTIPLICATION SIGN
+0xD8	0x0158	#	LATIN CAPITAL LETTER R WITH CARON
+0xD9	0x016E	#	LATIN CAPITAL LETTER U WITH RING ABOVE
+0xDA	0x00DA	#	LATIN CAPITAL LETTER U WITH ACUTE
+0xDB	0x0170	#	LATIN CAPITAL LETTER U WITH DOUBLE ACUTE
+0xDC	0x00DC	#	LATIN CAPITAL LETTER U WITH DIAERESIS
+0xDD	0x00DD	#	LATIN CAPITAL LETTER Y WITH ACUTE
+0xDE	0x0162	#	LATIN CAPITAL LETTER T WITH CEDILLA
+0xDF	0x00DF	#	LATIN SMALL LETTER SHARP S
+0xE0	0x0155	#	LATIN SMALL LETTER R WITH ACUTE
+0xE1	0x00E1	#	LATIN SMALL LETTER A WITH ACUTE
+0xE2	0x00E2	#	LATIN SMALL LETTER A WITH CIRCUMFLEX
+0xE3	0x0103	#	LATIN SMALL LETTER A WITH BREVE
+0xE4	0x00E4	#	LATIN SMALL LETTER A WITH DIAERESIS
+0xE5	0x013A	#	LATIN SMALL LETTER L WITH ACUTE
+0xE6	0x0107	#	LATIN SMALL LETTER C WITH ACUTE
+0xE7	0x00E7	#	LATIN SMALL LETTER C WITH CEDILLA
+0xE8	0x010D	#	LATIN SMALL LETTER C WITH CARON
+0xE9	0x00E9	#	LATIN SMALL LETTER E WITH ACUTE
+0xEA	0x0119	#	LATIN SMALL LETTER E WITH OGONEK
+0xEB	0x00EB	#	LATIN SMALL LETTER E WITH DIAERESIS
+0xEC	0x011B	#	LATIN SMALL LETTER E WITH CARON
+0xED	0x00ED	#	LATIN SMALL LETTER I WITH ACUTE
+0xEE	0x00EE	#	LATIN SMALL LETTER I WITH CIRCUMFLEX
+0xEF	0x010F	#	LATIN SMALL LETTER D WITH CARON
+0xF0	0x0111	#	LATIN SMALL LETTER D WITH STROKE
+0xF1	0x0144	#	LATIN SMALL LETTER N WITH ACUTE
+0xF2	0x0148	#	LATIN SMALL LETTER N WITH CARON
+0xF3	0x00F3	#	LATIN SMALL LETTER O WITH ACUTE
+0xF4	0x00F4	#	LATIN SMALL LETTER O WITH CIRCUMFLEX
+0xF5	0x0151	#	LATIN SMALL LETTER O WITH DOUBLE ACUTE
+0xF6	0x00F6	#	LATIN SMALL LETTER O WITH DIAERESIS
+0xF7	0x00F7	#	DIVISION SIGN
+0xF8	0x0159	#	LATIN SMALL LETTER R WITH CARON
+0xF9	0x016F	#	LATIN SMALL LETTER U WITH RING ABOVE
+0xFA	0x00FA	#	LATIN SMALL LETTER U WITH ACUTE
+0xFB	0x0171	#	LATIN SMALL LETTER U WITH DOUBLE ACUTE
+0xFC	0x00FC	#	LATIN SMALL LETTER U WITH DIAERESIS
+0xFD	0x00FD	#	LATIN SMALL LETTER Y WITH ACUTE
+0xFE	0x0163	#	LATIN SMALL LETTER T WITH CEDILLA
+0xFF	0x02D9	#	DOT ABOVE
diff --git a/lib/ucmaps/8859-3.txt b/lib/ucmaps/8859-3.txt
new file mode 100644
index 000000000..9b6ac69dd
--- /dev/null
+++ b/lib/ucmaps/8859-3.txt
@@ -0,0 +1,296 @@
+#
+#	Name:             ISO/IEC 8859-3:1999 to Unicode
+#	Unicode version:  3.0
+#	Table version:    1.0
+#	Table format:     Format A
+#	Date:             1999 July 27
+#	Authors:          Ken Whistler <kenw@sybase.com>
+#
+#	Copyright (c) 1991-1999 Unicode, Inc.  All Rights reserved.
+#
+#	This file is provided as-is by Unicode, Inc. (The Unicode Consortium).
+#	No claims are made as to fitness for any particular purpose.  No
+#	warranties of any kind are expressed or implied.  The recipient
+#	agrees to determine applicability of information provided.  If this
+#	file has been provided on optical media by Unicode, Inc., the sole
+#	remedy for any claim will be exchange of defective media within 90
+#	days of receipt.
+#
+#	Unicode, Inc. hereby grants the right to freely use the information
+#	supplied in this file in the creation of products supporting the
+#	Unicode Standard, and to make copies of this file in any form for
+#	internal or external distribution as long as this notice remains
+#	attached.
+#
+#	General notes:
+#
+#	This table contains the data the Unicode Consortium has on how
+#       ISO/IEC 8859-3:1999 characters map into Unicode.
+#
+#	Format:  Three tab-separated columns
+#		 Column #1 is the ISO/IEC 8859-3 code (in hex as 0xXX)
+#		 Column #2 is the Unicode (in hex as 0xXXXX)
+#		 Column #3 the Unicode name (follows a comment sign, '#')
+#
+#	The entries are in ISO/IEC 8859-3 order.
+#
+#	Version history
+#	1.0 version updates 0.1 version by adding mappings for all
+#	control characters.
+#
+#	Updated versions of this file may be found in:
+#		<ftp://ftp.unicode.org/Public/MAPPINGS/>
+#
+#	Any comments or problems, contact <errata@unicode.org>
+#	Please note that <errata@unicode.org> is an archival address;
+#	notices will be checked, but do not expect an immediate response.
+#
+0x00	0x0000	#	NULL
+0x01	0x0001	#	START OF HEADING
+0x02	0x0002	#	START OF TEXT
+0x03	0x0003	#	END OF TEXT
+0x04	0x0004	#	END OF TRANSMISSION
+0x05	0x0005	#	ENQUIRY
+0x06	0x0006	#	ACKNOWLEDGE
+0x07	0x0007	#	BELL
+0x08	0x0008	#	BACKSPACE
+0x09	0x0009	#	HORIZONTAL TABULATION
+0x0A	0x000A	#	LINE FEED
+0x0B	0x000B	#	VERTICAL TABULATION
+0x0C	0x000C	#	FORM FEED
+0x0D	0x000D	#	CARRIAGE RETURN
+0x0E	0x000E	#	SHIFT OUT
+0x0F	0x000F	#	SHIFT IN
+0x10	0x0010	#	DATA LINK ESCAPE
+0x11	0x0011	#	DEVICE CONTROL ONE
+0x12	0x0012	#	DEVICE CONTROL TWO
+0x13	0x0013	#	DEVICE CONTROL THREE
+0x14	0x0014	#	DEVICE CONTROL FOUR
+0x15	0x0015	#	NEGATIVE ACKNOWLEDGE
+0x16	0x0016	#	SYNCHRONOUS IDLE
+0x17	0x0017	#	END OF TRANSMISSION BLOCK
+0x18	0x0018	#	CANCEL
+0x19	0x0019	#	END OF MEDIUM
+0x1A	0x001A	#	SUBSTITUTE
+0x1B	0x001B	#	ESCAPE
+0x1C	0x001C	#	FILE SEPARATOR
+0x1D	0x001D	#	GROUP SEPARATOR
+0x1E	0x001E	#	RECORD SEPARATOR
+0x1F	0x001F	#	UNIT SEPARATOR
+0x20	0x0020	#	SPACE
+0x21	0x0021	#	EXCLAMATION MARK
+0x22	0x0022	#	QUOTATION MARK
+0x23	0x0023	#	NUMBER SIGN
+0x24	0x0024	#	DOLLAR SIGN
+0x25	0x0025	#	PERCENT SIGN
+0x26	0x0026	#	AMPERSAND
+0x27	0x0027	#	APOSTROPHE
+0x28	0x0028	#	LEFT PARENTHESIS
+0x29	0x0029	#	RIGHT PARENTHESIS
+0x2A	0x002A	#	ASTERISK
+0x2B	0x002B	#	PLUS SIGN
+0x2C	0x002C	#	COMMA
+0x2D	0x002D	#	HYPHEN-MINUS
+0x2E	0x002E	#	FULL STOP
+0x2F	0x002F	#	SOLIDUS
+0x30	0x0030	#	DIGIT ZERO
+0x31	0x0031	#	DIGIT ONE
+0x32	0x0032	#	DIGIT TWO
+0x33	0x0033	#	DIGIT THREE
+0x34	0x0034	#	DIGIT FOUR
+0x35	0x0035	#	DIGIT FIVE
+0x36	0x0036	#	DIGIT SIX
+0x37	0x0037	#	DIGIT SEVEN
+0x38	0x0038	#	DIGIT EIGHT
+0x39	0x0039	#	DIGIT NINE
+0x3A	0x003A	#	COLON
+0x3B	0x003B	#	SEMICOLON
+0x3C	0x003C	#	LESS-THAN SIGN
+0x3D	0x003D	#	EQUALS SIGN
+0x3E	0x003E	#	GREATER-THAN SIGN
+0x3F	0x003F	#	QUESTION MARK
+0x40	0x0040	#	COMMERCIAL AT
+0x41	0x0041	#	LATIN CAPITAL LETTER A
+0x42	0x0042	#	LATIN CAPITAL LETTER B
+0x43	0x0043	#	LATIN CAPITAL LETTER C
+0x44	0x0044	#	LATIN CAPITAL LETTER D
+0x45	0x0045	#	LATIN CAPITAL LETTER E
+0x46	0x0046	#	LATIN CAPITAL LETTER F
+0x47	0x0047	#	LATIN CAPITAL LETTER G
+0x48	0x0048	#	LATIN CAPITAL LETTER H
+0x49	0x0049	#	LATIN CAPITAL LETTER I
+0x4A	0x004A	#	LATIN CAPITAL LETTER J
+0x4B	0x004B	#	LATIN CAPITAL LETTER K
+0x4C	0x004C	#	LATIN CAPITAL LETTER L
+0x4D	0x004D	#	LATIN CAPITAL LETTER M
+0x4E	0x004E	#	LATIN CAPITAL LETTER N
+0x4F	0x004F	#	LATIN CAPITAL LETTER O
+0x50	0x0050	#	LATIN CAPITAL LETTER P
+0x51	0x0051	#	LATIN CAPITAL LETTER Q
+0x52	0x0052	#	LATIN CAPITAL LETTER R
+0x53	0x0053	#	LATIN CAPITAL LETTER S
+0x54	0x0054	#	LATIN CAPITAL LETTER T
+0x55	0x0055	#	LATIN CAPITAL LETTER U
+0x56	0x0056	#	LATIN CAPITAL LETTER V
+0x57	0x0057	#	LATIN CAPITAL LETTER W
+0x58	0x0058	#	LATIN CAPITAL LETTER X
+0x59	0x0059	#	LATIN CAPITAL LETTER Y
+0x5A	0x005A	#	LATIN CAPITAL LETTER Z
+0x5B	0x005B	#	LEFT SQUARE BRACKET
+0x5C	0x005C	#	REVERSE SOLIDUS
+0x5D	0x005D	#	RIGHT SQUARE BRACKET
+0x5E	0x005E	#	CIRCUMFLEX ACCENT
+0x5F	0x005F	#	LOW LINE
+0x60	0x0060	#	GRAVE ACCENT
+0x61	0x0061	#	LATIN SMALL LETTER A
+0x62	0x0062	#	LATIN SMALL LETTER B
+0x63	0x0063	#	LATIN SMALL LETTER C
+0x64	0x0064	#	LATIN SMALL LETTER D
+0x65	0x0065	#	LATIN SMALL LETTER E
+0x66	0x0066	#	LATIN SMALL LETTER F
+0x67	0x0067	#	LATIN SMALL LETTER G
+0x68	0x0068	#	LATIN SMALL LETTER H
+0x69	0x0069	#	LATIN SMALL LETTER I
+0x6A	0x006A	#	LATIN SMALL LETTER J
+0x6B	0x006B	#	LATIN SMALL LETTER K
+0x6C	0x006C	#	LATIN SMALL LETTER L
+0x6D	0x006D	#	LATIN SMALL LETTER M
+0x6E	0x006E	#	LATIN SMALL LETTER N
+0x6F	0x006F	#	LATIN SMALL LETTER O
+0x70	0x0070	#	LATIN SMALL LETTER P
+0x71	0x0071	#	LATIN SMALL LETTER Q
+0x72	0x0072	#	LATIN SMALL LETTER R
+0x73	0x0073	#	LATIN SMALL LETTER S
+0x74	0x0074	#	LATIN SMALL LETTER T
+0x75	0x0075	#	LATIN SMALL LETTER U
+0x76	0x0076	#	LATIN SMALL LETTER V
+0x77	0x0077	#	LATIN SMALL LETTER W
+0x78	0x0078	#	LATIN SMALL LETTER X
+0x79	0x0079	#	LATIN SMALL LETTER Y
+0x7A	0x007A	#	LATIN SMALL LETTER Z
+0x7B	0x007B	#	LEFT CURLY BRACKET
+0x7C	0x007C	#	VERTICAL LINE
+0x7D	0x007D	#	RIGHT CURLY BRACKET
+0x7E	0x007E	#	TILDE
+0x7F	0x007F	#	DELETE
+0x80	0x0080	#	<control>
+0x81	0x0081	#	<control>
+0x82	0x0082	#	<control>
+0x83	0x0083	#	<control>
+0x84	0x0084	#	<control>
+0x85	0x0085	#	<control>
+0x86	0x0086	#	<control>
+0x87	0x0087	#	<control>
+0x88	0x0088	#	<control>
+0x89	0x0089	#	<control>
+0x8A	0x008A	#	<control>
+0x8B	0x008B	#	<control>
+0x8C	0x008C	#	<control>
+0x8D	0x008D	#	<control>
+0x8E	0x008E	#	<control>
+0x8F	0x008F	#	<control>
+0x90	0x0090	#	<control>
+0x91	0x0091	#	<control>
+0x92	0x0092	#	<control>
+0x93	0x0093	#	<control>
+0x94	0x0094	#	<control>
+0x95	0x0095	#	<control>
+0x96	0x0096	#	<control>
+0x97	0x0097	#	<control>
+0x98	0x0098	#	<control>
+0x99	0x0099	#	<control>
+0x9A	0x009A	#	<control>
+0x9B	0x009B	#	<control>
+0x9C	0x009C	#	<control>
+0x9D	0x009D	#	<control>
+0x9E	0x009E	#	<control>
+0x9F	0x009F	#	<control>
+0xA0	0x00A0	#	NO-BREAK SPACE
+0xA1	0x0126	#	LATIN CAPITAL LETTER H WITH STROKE
+0xA2	0x02D8	#	BREVE
+0xA3	0x00A3	#	POUND SIGN
+0xA4	0x00A4	#	CURRENCY SIGN
+0xA6	0x0124	#	LATIN CAPITAL LETTER H WITH CIRCUMFLEX
+0xA7	0x00A7	#	SECTION SIGN
+0xA8	0x00A8	#	DIAERESIS
+0xA9	0x0130	#	LATIN CAPITAL LETTER I WITH DOT ABOVE
+0xAA	0x015E	#	LATIN CAPITAL LETTER S WITH CEDILLA
+0xAB	0x011E	#	LATIN CAPITAL LETTER G WITH BREVE
+0xAC	0x0134	#	LATIN CAPITAL LETTER J WITH CIRCUMFLEX
+0xAD	0x00AD	#	SOFT HYPHEN
+0xAF	0x017B	#	LATIN CAPITAL LETTER Z WITH DOT ABOVE
+0xB0	0x00B0	#	DEGREE SIGN
+0xB1	0x0127	#	LATIN SMALL LETTER H WITH STROKE
+0xB2	0x00B2	#	SUPERSCRIPT TWO
+0xB3	0x00B3	#	SUPERSCRIPT THREE
+0xB4	0x00B4	#	ACUTE ACCENT
+0xB5	0x00B5	#	MICRO SIGN
+0xB6	0x0125	#	LATIN SMALL LETTER H WITH CIRCUMFLEX
+0xB7	0x00B7	#	MIDDLE DOT
+0xB8	0x00B8	#	CEDILLA
+0xB9	0x0131	#	LATIN SMALL LETTER DOTLESS I
+0xBA	0x015F	#	LATIN SMALL LETTER S WITH CEDILLA
+0xBB	0x011F	#	LATIN SMALL LETTER G WITH BREVE
+0xBC	0x0135	#	LATIN SMALL LETTER J WITH CIRCUMFLEX
+0xBD	0x00BD	#	VULGAR FRACTION ONE HALF
+0xBF	0x017C	#	LATIN SMALL LETTER Z WITH DOT ABOVE
+0xC0	0x00C0	#	LATIN CAPITAL LETTER A WITH GRAVE
+0xC1	0x00C1	#	LATIN CAPITAL LETTER A WITH ACUTE
+0xC2	0x00C2	#	LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+0xC4	0x00C4	#	LATIN CAPITAL LETTER A WITH DIAERESIS
+0xC5	0x010A	#	LATIN CAPITAL LETTER C WITH DOT ABOVE
+0xC6	0x0108	#	LATIN CAPITAL LETTER C WITH CIRCUMFLEX
+0xC7	0x00C7	#	LATIN CAPITAL LETTER C WITH CEDILLA
+0xC8	0x00C8	#	LATIN CAPITAL LETTER E WITH GRAVE
+0xC9	0x00C9	#	LATIN CAPITAL LETTER E WITH ACUTE
+0xCA	0x00CA	#	LATIN CAPITAL LETTER E WITH CIRCUMFLEX
+0xCB	0x00CB	#	LATIN CAPITAL LETTER E WITH DIAERESIS
+0xCC	0x00CC	#	LATIN CAPITAL LETTER I WITH GRAVE
+0xCD	0x00CD	#	LATIN CAPITAL LETTER I WITH ACUTE
+0xCE	0x00CE	#	LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+0xCF	0x00CF	#	LATIN CAPITAL LETTER I WITH DIAERESIS
+0xD1	0x00D1	#	LATIN CAPITAL LETTER N WITH TILDE
+0xD2	0x00D2	#	LATIN CAPITAL LETTER O WITH GRAVE
+0xD3	0x00D3	#	LATIN CAPITAL LETTER O WITH ACUTE
+0xD4	0x00D4	#	LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+0xD5	0x0120	#	LATIN CAPITAL LETTER G WITH DOT ABOVE
+0xD6	0x00D6	#	LATIN CAPITAL LETTER O WITH DIAERESIS
+0xD7	0x00D7	#	MULTIPLICATION SIGN
+0xD8	0x011C	#	LATIN CAPITAL LETTER G WITH CIRCUMFLEX
+0xD9	0x00D9	#	LATIN CAPITAL LETTER U WITH GRAVE
+0xDA	0x00DA	#	LATIN CAPITAL LETTER U WITH ACUTE
+0xDB	0x00DB	#	LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+0xDC	0x00DC	#	LATIN CAPITAL LETTER U WITH DIAERESIS
+0xDD	0x016C	#	LATIN CAPITAL LETTER U WITH BREVE
+0xDE	0x015C	#	LATIN CAPITAL LETTER S WITH CIRCUMFLEX
+0xDF	0x00DF	#	LATIN SMALL LETTER SHARP S
+0xE0	0x00E0	#	LATIN SMALL LETTER A WITH GRAVE
+0xE1	0x00E1	#	LATIN SMALL LETTER A WITH ACUTE
+0xE2	0x00E2	#	LATIN SMALL LETTER A WITH CIRCUMFLEX
+0xE4	0x00E4	#	LATIN SMALL LETTER A WITH DIAERESIS
+0xE5	0x010B	#	LATIN SMALL LETTER C WITH DOT ABOVE
+0xE6	0x0109	#	LATIN SMALL LETTER C WITH CIRCUMFLEX
+0xE7	0x00E7	#	LATIN SMALL LETTER C WITH CEDILLA
+0xE8	0x00E8	#	LATIN SMALL LETTER E WITH GRAVE
+0xE9	0x00E9	#	LATIN SMALL LETTER E WITH ACUTE
+0xEA	0x00EA	#	LATIN SMALL LETTER E WITH CIRCUMFLEX
+0xEB	0x00EB	#	LATIN SMALL LETTER E WITH DIAERESIS
+0xEC	0x00EC	#	LATIN SMALL LETTER I WITH GRAVE
+0xED	0x00ED	#	LATIN SMALL LETTER I WITH ACUTE
+0xEE	0x00EE	#	LATIN SMALL LETTER I WITH CIRCUMFLEX
+0xEF	0x00EF	#	LATIN SMALL LETTER I WITH DIAERESIS
+0xF1	0x00F1	#	LATIN SMALL LETTER N WITH TILDE
+0xF2	0x00F2	#	LATIN SMALL LETTER O WITH GRAVE
+0xF3	0x00F3	#	LATIN SMALL LETTER O WITH ACUTE
+0xF4	0x00F4	#	LATIN SMALL LETTER O WITH CIRCUMFLEX
+0xF5	0x0121	#	LATIN SMALL LETTER G WITH DOT ABOVE
+0xF6	0x00F6	#	LATIN SMALL LETTER O WITH DIAERESIS
+0xF7	0x00F7	#	DIVISION SIGN
+0xF8	0x011D	#	LATIN SMALL LETTER G WITH CIRCUMFLEX
+0xF9	0x00F9	#	LATIN SMALL LETTER U WITH GRAVE
+0xFA	0x00FA	#	LATIN SMALL LETTER U WITH ACUTE
+0xFB	0x00FB	#	LATIN SMALL LETTER U WITH CIRCUMFLEX
+0xFC	0x00FC	#	LATIN SMALL LETTER U WITH DIAERESIS
+0xFD	0x016D	#	LATIN SMALL LETTER U WITH BREVE
+0xFE	0x015D	#	LATIN SMALL LETTER S WITH CIRCUMFLEX
+0xFF	0x02D9	#	DOT ABOVE
diff --git a/lib/ucmaps/8859-4.txt b/lib/ucmaps/8859-4.txt
new file mode 100644
index 000000000..662e698ab
--- /dev/null
+++ b/lib/ucmaps/8859-4.txt
@@ -0,0 +1,303 @@
+#
+#	Name:             ISO/IEC 8859-4:1998 to Unicode
+#	Unicode version:  3.0
+#	Table version:    1.0
+#	Table format:     Format A
+#	Date:             1999 July 27
+#	Authors:          Ken Whistler <kenw@sybase.com>
+#
+#	Copyright (c) 1991-1999 Unicode, Inc.  All Rights reserved.
+#
+#	This file is provided as-is by Unicode, Inc. (The Unicode Consortium).
+#	No claims are made as to fitness for any particular purpose.  No
+#	warranties of any kind are expressed or implied.  The recipient
+#	agrees to determine applicability of information provided.  If this
+#	file has been provided on optical media by Unicode, Inc., the sole
+#	remedy for any claim will be exchange of defective media within 90
+#	days of receipt.
+#
+#	Unicode, Inc. hereby grants the right to freely use the information
+#	supplied in this file in the creation of products supporting the
+#	Unicode Standard, and to make copies of this file in any form for
+#	internal or external distribution as long as this notice remains
+#	attached.
+#
+#	General notes:
+#
+#	This table contains the data the Unicode Consortium has on how
+#       ISO/IEC 8859-4:1998 characters map into Unicode.
+#
+#	Format:  Three tab-separated columns
+#		 Column #1 is the ISO/IEC 8859-4 code (in hex as 0xXX)
+#		 Column #2 is the Unicode (in hex as 0xXXXX)
+#		 Column #3 the Unicode name (follows a comment sign, '#')
+#
+#	The entries are in ISO/IEC 8859-4 order.
+#
+#	Version history
+#	1.0 version updates 0.1 version by adding mappings for all
+#	control characters.
+#
+#	Updated versions of this file may be found in:
+#		<ftp://ftp.unicode.org/Public/MAPPINGS/>
+#
+#	Any comments or problems, contact <errata@unicode.org>
+#	Please note that <errata@unicode.org> is an archival address;
+#	notices will be checked, but do not expect an immediate response.
+#
+0x00	0x0000	#	NULL
+0x01	0x0001	#	START OF HEADING
+0x02	0x0002	#	START OF TEXT
+0x03	0x0003	#	END OF TEXT
+0x04	0x0004	#	END OF TRANSMISSION
+0x05	0x0005	#	ENQUIRY
+0x06	0x0006	#	ACKNOWLEDGE
+0x07	0x0007	#	BELL
+0x08	0x0008	#	BACKSPACE
+0x09	0x0009	#	HORIZONTAL TABULATION
+0x0A	0x000A	#	LINE FEED
+0x0B	0x000B	#	VERTICAL TABULATION
+0x0C	0x000C	#	FORM FEED
+0x0D	0x000D	#	CARRIAGE RETURN
+0x0E	0x000E	#	SHIFT OUT
+0x0F	0x000F	#	SHIFT IN
+0x10	0x0010	#	DATA LINK ESCAPE
+0x11	0x0011	#	DEVICE CONTROL ONE
+0x12	0x0012	#	DEVICE CONTROL TWO
+0x13	0x0013	#	DEVICE CONTROL THREE
+0x14	0x0014	#	DEVICE CONTROL FOUR
+0x15	0x0015	#	NEGATIVE ACKNOWLEDGE
+0x16	0x0016	#	SYNCHRONOUS IDLE
+0x17	0x0017	#	END OF TRANSMISSION BLOCK
+0x18	0x0018	#	CANCEL
+0x19	0x0019	#	END OF MEDIUM
+0x1A	0x001A	#	SUBSTITUTE
+0x1B	0x001B	#	ESCAPE
+0x1C	0x001C	#	FILE SEPARATOR
+0x1D	0x001D	#	GROUP SEPARATOR
+0x1E	0x001E	#	RECORD SEPARATOR
+0x1F	0x001F	#	UNIT SEPARATOR
+0x20	0x0020	#	SPACE
+0x21	0x0021	#	EXCLAMATION MARK
+0x22	0x0022	#	QUOTATION MARK
+0x23	0x0023	#	NUMBER SIGN
+0x24	0x0024	#	DOLLAR SIGN
+0x25	0x0025	#	PERCENT SIGN
+0x26	0x0026	#	AMPERSAND
+0x27	0x0027	#	APOSTROPHE
+0x28	0x0028	#	LEFT PARENTHESIS
+0x29	0x0029	#	RIGHT PARENTHESIS
+0x2A	0x002A	#	ASTERISK
+0x2B	0x002B	#	PLUS SIGN
+0x2C	0x002C	#	COMMA
+0x2D	0x002D	#	HYPHEN-MINUS
+0x2E	0x002E	#	FULL STOP
+0x2F	0x002F	#	SOLIDUS
+0x30	0x0030	#	DIGIT ZERO
+0x31	0x0031	#	DIGIT ONE
+0x32	0x0032	#	DIGIT TWO
+0x33	0x0033	#	DIGIT THREE
+0x34	0x0034	#	DIGIT FOUR
+0x35	0x0035	#	DIGIT FIVE
+0x36	0x0036	#	DIGIT SIX
+0x37	0x0037	#	DIGIT SEVEN
+0x38	0x0038	#	DIGIT EIGHT
+0x39	0x0039	#	DIGIT NINE
+0x3A	0x003A	#	COLON
+0x3B	0x003B	#	SEMICOLON
+0x3C	0x003C	#	LESS-THAN SIGN
+0x3D	0x003D	#	EQUALS SIGN
+0x3E	0x003E	#	GREATER-THAN SIGN
+0x3F	0x003F	#	QUESTION MARK
+0x40	0x0040	#	COMMERCIAL AT
+0x41	0x0041	#	LATIN CAPITAL LETTER A
+0x42	0x0042	#	LATIN CAPITAL LETTER B
+0x43	0x0043	#	LATIN CAPITAL LETTER C
+0x44	0x0044	#	LATIN CAPITAL LETTER D
+0x45	0x0045	#	LATIN CAPITAL LETTER E
+0x46	0x0046	#	LATIN CAPITAL LETTER F
+0x47	0x0047	#	LATIN CAPITAL LETTER G
+0x48	0x0048	#	LATIN CAPITAL LETTER H
+0x49	0x0049	#	LATIN CAPITAL LETTER I
+0x4A	0x004A	#	LATIN CAPITAL LETTER J
+0x4B	0x004B	#	LATIN CAPITAL LETTER K
+0x4C	0x004C	#	LATIN CAPITAL LETTER L
+0x4D	0x004D	#	LATIN CAPITAL LETTER M
+0x4E	0x004E	#	LATIN CAPITAL LETTER N
+0x4F	0x004F	#	LATIN CAPITAL LETTER O
+0x50	0x0050	#	LATIN CAPITAL LETTER P
+0x51	0x0051	#	LATIN CAPITAL LETTER Q
+0x52	0x0052	#	LATIN CAPITAL LETTER R
+0x53	0x0053	#	LATIN CAPITAL LETTER S
+0x54	0x0054	#	LATIN CAPITAL LETTER T
+0x55	0x0055	#	LATIN CAPITAL LETTER U
+0x56	0x0056	#	LATIN CAPITAL LETTER V
+0x57	0x0057	#	LATIN CAPITAL LETTER W
+0x58	0x0058	#	LATIN CAPITAL LETTER X
+0x59	0x0059	#	LATIN CAPITAL LETTER Y
+0x5A	0x005A	#	LATIN CAPITAL LETTER Z
+0x5B	0x005B	#	LEFT SQUARE BRACKET
+0x5C	0x005C	#	REVERSE SOLIDUS
+0x5D	0x005D	#	RIGHT SQUARE BRACKET
+0x5E	0x005E	#	CIRCUMFLEX ACCENT
+0x5F	0x005F	#	LOW LINE
+0x60	0x0060	#	GRAVE ACCENT
+0x61	0x0061	#	LATIN SMALL LETTER A
+0x62	0x0062	#	LATIN SMALL LETTER B
+0x63	0x0063	#	LATIN SMALL LETTER C
+0x64	0x0064	#	LATIN SMALL LETTER D
+0x65	0x0065	#	LATIN SMALL LETTER E
+0x66	0x0066	#	LATIN SMALL LETTER F
+0x67	0x0067	#	LATIN SMALL LETTER G
+0x68	0x0068	#	LATIN SMALL LETTER H
+0x69	0x0069	#	LATIN SMALL LETTER I
+0x6A	0x006A	#	LATIN SMALL LETTER J
+0x6B	0x006B	#	LATIN SMALL LETTER K
+0x6C	0x006C	#	LATIN SMALL LETTER L
+0x6D	0x006D	#	LATIN SMALL LETTER M
+0x6E	0x006E	#	LATIN SMALL LETTER N
+0x6F	0x006F	#	LATIN SMALL LETTER O
+0x70	0x0070	#	LATIN SMALL LETTER P
+0x71	0x0071	#	LATIN SMALL LETTER Q
+0x72	0x0072	#	LATIN SMALL LETTER R
+0x73	0x0073	#	LATIN SMALL LETTER S
+0x74	0x0074	#	LATIN SMALL LETTER T
+0x75	0x0075	#	LATIN SMALL LETTER U
+0x76	0x0076	#	LATIN SMALL LETTER V
+0x77	0x0077	#	LATIN SMALL LETTER W
+0x78	0x0078	#	LATIN SMALL LETTER X
+0x79	0x0079	#	LATIN SMALL LETTER Y
+0x7A	0x007A	#	LATIN SMALL LETTER Z
+0x7B	0x007B	#	LEFT CURLY BRACKET
+0x7C	0x007C	#	VERTICAL LINE
+0x7D	0x007D	#	RIGHT CURLY BRACKET
+0x7E	0x007E	#	TILDE
+0x7F	0x007F	#	DELETE
+0x80	0x0080	#	<control>
+0x81	0x0081	#	<control>
+0x82	0x0082	#	<control>
+0x83	0x0083	#	<control>
+0x84	0x0084	#	<control>
+0x85	0x0085	#	<control>
+0x86	0x0086	#	<control>
+0x87	0x0087	#	<control>
+0x88	0x0088	#	<control>
+0x89	0x0089	#	<control>
+0x8A	0x008A	#	<control>
+0x8B	0x008B	#	<control>
+0x8C	0x008C	#	<control>
+0x8D	0x008D	#	<control>
+0x8E	0x008E	#	<control>
+0x8F	0x008F	#	<control>
+0x90	0x0090	#	<control>
+0x91	0x0091	#	<control>
+0x92	0x0092	#	<control>
+0x93	0x0093	#	<control>
+0x94	0x0094	#	<control>
+0x95	0x0095	#	<control>
+0x96	0x0096	#	<control>
+0x97	0x0097	#	<control>
+0x98	0x0098	#	<control>
+0x99	0x0099	#	<control>
+0x9A	0x009A	#	<control>
+0x9B	0x009B	#	<control>
+0x9C	0x009C	#	<control>
+0x9D	0x009D	#	<control>
+0x9E	0x009E	#	<control>
+0x9F	0x009F	#	<control>
+0xA0	0x00A0	#	NO-BREAK SPACE
+0xA1	0x0104	#	LATIN CAPITAL LETTER A WITH OGONEK
+0xA2	0x0138	#	LATIN SMALL LETTER KRA
+0xA3	0x0156	#	LATIN CAPITAL LETTER R WITH CEDILLA
+0xA4	0x00A4	#	CURRENCY SIGN
+0xA5	0x0128	#	LATIN CAPITAL LETTER I WITH TILDE
+0xA6	0x013B	#	LATIN CAPITAL LETTER L WITH CEDILLA
+0xA7	0x00A7	#	SECTION SIGN
+0xA8	0x00A8	#	DIAERESIS
+0xA9	0x0160	#	LATIN CAPITAL LETTER S WITH CARON
+0xAA	0x0112	#	LATIN CAPITAL LETTER E WITH MACRON
+0xAB	0x0122	#	LATIN CAPITAL LETTER G WITH CEDILLA
+0xAC	0x0166	#	LATIN CAPITAL LETTER T WITH STROKE
+0xAD	0x00AD	#	SOFT HYPHEN
+0xAE	0x017D	#	LATIN CAPITAL LETTER Z WITH CARON
+0xAF	0x00AF	#	MACRON
+0xB0	0x00B0	#	DEGREE SIGN
+0xB1	0x0105	#	LATIN SMALL LETTER A WITH OGONEK
+0xB2	0x02DB	#	OGONEK
+0xB3	0x0157	#	LATIN SMALL LETTER R WITH CEDILLA
+0xB4	0x00B4	#	ACUTE ACCENT
+0xB5	0x0129	#	LATIN SMALL LETTER I WITH TILDE
+0xB6	0x013C	#	LATIN SMALL LETTER L WITH CEDILLA
+0xB7	0x02C7	#	CARON
+0xB8	0x00B8	#	CEDILLA
+0xB9	0x0161	#	LATIN SMALL LETTER S WITH CARON
+0xBA	0x0113	#	LATIN SMALL LETTER E WITH MACRON
+0xBB	0x0123	#	LATIN SMALL LETTER G WITH CEDILLA
+0xBC	0x0167	#	LATIN SMALL LETTER T WITH STROKE
+0xBD	0x014A	#	LATIN CAPITAL LETTER ENG
+0xBE	0x017E	#	LATIN SMALL LETTER Z WITH CARON
+0xBF	0x014B	#	LATIN SMALL LETTER ENG
+0xC0	0x0100	#	LATIN CAPITAL LETTER A WITH MACRON
+0xC1	0x00C1	#	LATIN CAPITAL LETTER A WITH ACUTE
+0xC2	0x00C2	#	LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+0xC3	0x00C3	#	LATIN CAPITAL LETTER A WITH TILDE
+0xC4	0x00C4	#	LATIN CAPITAL LETTER A WITH DIAERESIS
+0xC5	0x00C5	#	LATIN CAPITAL LETTER A WITH RING ABOVE
+0xC6	0x00C6	#	LATIN CAPITAL LETTER AE
+0xC7	0x012E	#	LATIN CAPITAL LETTER I WITH OGONEK
+0xC8	0x010C	#	LATIN CAPITAL LETTER C WITH CARON
+0xC9	0x00C9	#	LATIN CAPITAL LETTER E WITH ACUTE
+0xCA	0x0118	#	LATIN CAPITAL LETTER E WITH OGONEK
+0xCB	0x00CB	#	LATIN CAPITAL LETTER E WITH DIAERESIS
+0xCC	0x0116	#	LATIN CAPITAL LETTER E WITH DOT ABOVE
+0xCD	0x00CD	#	LATIN CAPITAL LETTER I WITH ACUTE
+0xCE	0x00CE	#	LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+0xCF	0x012A	#	LATIN CAPITAL LETTER I WITH MACRON
+0xD0	0x0110	#	LATIN CAPITAL LETTER D WITH STROKE
+0xD1	0x0145	#	LATIN CAPITAL LETTER N WITH CEDILLA
+0xD2	0x014C	#	LATIN CAPITAL LETTER O WITH MACRON
+0xD3	0x0136	#	LATIN CAPITAL LETTER K WITH CEDILLA
+0xD4	0x00D4	#	LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+0xD5	0x00D5	#	LATIN CAPITAL LETTER O WITH TILDE
+0xD6	0x00D6	#	LATIN CAPITAL LETTER O WITH DIAERESIS
+0xD7	0x00D7	#	MULTIPLICATION SIGN
+0xD8	0x00D8	#	LATIN CAPITAL LETTER O WITH STROKE
+0xD9	0x0172	#	LATIN CAPITAL LETTER U WITH OGONEK
+0xDA	0x00DA	#	LATIN CAPITAL LETTER U WITH ACUTE
+0xDB	0x00DB	#	LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+0xDC	0x00DC	#	LATIN CAPITAL LETTER U WITH DIAERESIS
+0xDD	0x0168	#	LATIN CAPITAL LETTER U WITH TILDE
+0xDE	0x016A	#	LATIN CAPITAL LETTER U WITH MACRON
+0xDF	0x00DF	#	LATIN SMALL LETTER SHARP S
+0xE0	0x0101	#	LATIN SMALL LETTER A WITH MACRON
+0xE1	0x00E1	#	LATIN SMALL LETTER A WITH ACUTE
+0xE2	0x00E2	#	LATIN SMALL LETTER A WITH CIRCUMFLEX
+0xE3	0x00E3	#	LATIN SMALL LETTER A WITH TILDE
+0xE4	0x00E4	#	LATIN SMALL LETTER A WITH DIAERESIS
+0xE5	0x00E5	#	LATIN SMALL LETTER A WITH RING ABOVE
+0xE6	0x00E6	#	LATIN SMALL LETTER AE
+0xE7	0x012F	#	LATIN SMALL LETTER I WITH OGONEK
+0xE8	0x010D	#	LATIN SMALL LETTER C WITH CARON
+0xE9	0x00E9	#	LATIN SMALL LETTER E WITH ACUTE
+0xEA	0x0119	#	LATIN SMALL LETTER E WITH OGONEK
+0xEB	0x00EB	#	LATIN SMALL LETTER E WITH DIAERESIS
+0xEC	0x0117	#	LATIN SMALL LETTER E WITH DOT ABOVE
+0xED	0x00ED	#	LATIN SMALL LETTER I WITH ACUTE
+0xEE	0x00EE	#	LATIN SMALL LETTER I WITH CIRCUMFLEX
+0xEF	0x012B	#	LATIN SMALL LETTER I WITH MACRON
+0xF0	0x0111	#	LATIN SMALL LETTER D WITH STROKE
+0xF1	0x0146	#	LATIN SMALL LETTER N WITH CEDILLA
+0xF2	0x014D	#	LATIN SMALL LETTER O WITH MACRON
+0xF3	0x0137	#	LATIN SMALL LETTER K WITH CEDILLA
+0xF4	0x00F4	#	LATIN SMALL LETTER O WITH CIRCUMFLEX
+0xF5	0x00F5	#	LATIN SMALL LETTER O WITH TILDE
+0xF6	0x00F6	#	LATIN SMALL LETTER O WITH DIAERESIS
+0xF7	0x00F7	#	DIVISION SIGN
+0xF8	0x00F8	#	LATIN SMALL LETTER O WITH STROKE
+0xF9	0x0173	#	LATIN SMALL LETTER U WITH OGONEK
+0xFA	0x00FA	#	LATIN SMALL LETTER U WITH ACUTE
+0xFB	0x00FB	#	LATIN SMALL LETTER U WITH CIRCUMFLEX
+0xFC	0x00FC	#	LATIN SMALL LETTER U WITH DIAERESIS
+0xFD	0x0169	#	LATIN SMALL LETTER U WITH TILDE
+0xFE	0x016B	#	LATIN SMALL LETTER U WITH MACRON
+0xFF	0x02D9	#	DOT ABOVE
diff --git a/lib/ucmaps/8859-5.txt b/lib/ucmaps/8859-5.txt
new file mode 100644
index 000000000..a7ed1ce2a
--- /dev/null
+++ b/lib/ucmaps/8859-5.txt
@@ -0,0 +1,303 @@
+#
+#	Name:             ISO 8859-5:1999 to Unicode
+#	Unicode version:  3.0
+#	Table version:    1.0
+#	Table format:     Format A
+#	Date:             1999 July 27
+#	Authors:          Ken Whistler <kenw@sybase.com>
+#
+#	Copyright (c) 1991-1999 Unicode, Inc.  All Rights reserved.
+#
+#	This file is provided as-is by Unicode, Inc. (The Unicode Consortium).
+#	No claims are made as to fitness for any particular purpose.  No
+#	warranties of any kind are expressed or implied.  The recipient
+#	agrees to determine applicability of information provided.  If this
+#	file has been provided on optical media by Unicode, Inc., the sole
+#	remedy for any claim will be exchange of defective media within 90
+#	days of receipt.
+#
+#	Unicode, Inc. hereby grants the right to freely use the information
+#	supplied in this file in the creation of products supporting the
+#	Unicode Standard, and to make copies of this file in any form for
+#	internal or external distribution as long as this notice remains
+#	attached.
+#
+#	General notes:
+#
+#	This table contains the data the Unicode Consortium has on how
+#       ISO/IEC 8859-5:1999 characters map into Unicode.
+#
+#	Format:  Three tab-separated columns
+#		 Column #1 is the ISO/IEC 8859-5 code (in hex as 0xXX)
+#		 Column #2 is the Unicode (in hex as 0xXXXX)
+#		 Column #3 the Unicode name (follows a comment sign, '#')
+#
+#	The entries are in ISO/IEC 8859-5 order.
+#
+#	Version history
+#	1.0 version updates 0.1 version by adding mappings for all
+#	control characters.
+#
+#	Updated versions of this file may be found in:
+#		<ftp://ftp.unicode.org/Public/MAPPINGS/>
+#
+#	Any comments or problems, contact <errata@unicode.org>
+#	Please note that <errata@unicode.org> is an archival address;
+#	notices will be checked, but do not expect an immediate response.
+#
+0x00	0x0000	#	NULL
+0x01	0x0001	#	START OF HEADING
+0x02	0x0002	#	START OF TEXT
+0x03	0x0003	#	END OF TEXT
+0x04	0x0004	#	END OF TRANSMISSION
+0x05	0x0005	#	ENQUIRY
+0x06	0x0006	#	ACKNOWLEDGE
+0x07	0x0007	#	BELL
+0x08	0x0008	#	BACKSPACE
+0x09	0x0009	#	HORIZONTAL TABULATION
+0x0A	0x000A	#	LINE FEED
+0x0B	0x000B	#	VERTICAL TABULATION
+0x0C	0x000C	#	FORM FEED
+0x0D	0x000D	#	CARRIAGE RETURN
+0x0E	0x000E	#	SHIFT OUT
+0x0F	0x000F	#	SHIFT IN
+0x10	0x0010	#	DATA LINK ESCAPE
+0x11	0x0011	#	DEVICE CONTROL ONE
+0x12	0x0012	#	DEVICE CONTROL TWO
+0x13	0x0013	#	DEVICE CONTROL THREE
+0x14	0x0014	#	DEVICE CONTROL FOUR
+0x15	0x0015	#	NEGATIVE ACKNOWLEDGE
+0x16	0x0016	#	SYNCHRONOUS IDLE
+0x17	0x0017	#	END OF TRANSMISSION BLOCK
+0x18	0x0018	#	CANCEL
+0x19	0x0019	#	END OF MEDIUM
+0x1A	0x001A	#	SUBSTITUTE
+0x1B	0x001B	#	ESCAPE
+0x1C	0x001C	#	FILE SEPARATOR
+0x1D	0x001D	#	GROUP SEPARATOR
+0x1E	0x001E	#	RECORD SEPARATOR
+0x1F	0x001F	#	UNIT SEPARATOR
+0x20	0x0020	#	SPACE
+0x21	0x0021	#	EXCLAMATION MARK
+0x22	0x0022	#	QUOTATION MARK
+0x23	0x0023	#	NUMBER SIGN
+0x24	0x0024	#	DOLLAR SIGN
+0x25	0x0025	#	PERCENT SIGN
+0x26	0x0026	#	AMPERSAND
+0x27	0x0027	#	APOSTROPHE
+0x28	0x0028	#	LEFT PARENTHESIS
+0x29	0x0029	#	RIGHT PARENTHESIS
+0x2A	0x002A	#	ASTERISK
+0x2B	0x002B	#	PLUS SIGN
+0x2C	0x002C	#	COMMA
+0x2D	0x002D	#	HYPHEN-MINUS
+0x2E	0x002E	#	FULL STOP
+0x2F	0x002F	#	SOLIDUS
+0x30	0x0030	#	DIGIT ZERO
+0x31	0x0031	#	DIGIT ONE
+0x32	0x0032	#	DIGIT TWO
+0x33	0x0033	#	DIGIT THREE
+0x34	0x0034	#	DIGIT FOUR
+0x35	0x0035	#	DIGIT FIVE
+0x36	0x0036	#	DIGIT SIX
+0x37	0x0037	#	DIGIT SEVEN
+0x38	0x0038	#	DIGIT EIGHT
+0x39	0x0039	#	DIGIT NINE
+0x3A	0x003A	#	COLON
+0x3B	0x003B	#	SEMICOLON
+0x3C	0x003C	#	LESS-THAN SIGN
+0x3D	0x003D	#	EQUALS SIGN
+0x3E	0x003E	#	GREATER-THAN SIGN
+0x3F	0x003F	#	QUESTION MARK
+0x40	0x0040	#	COMMERCIAL AT
+0x41	0x0041	#	LATIN CAPITAL LETTER A
+0x42	0x0042	#	LATIN CAPITAL LETTER B
+0x43	0x0043	#	LATIN CAPITAL LETTER C
+0x44	0x0044	#	LATIN CAPITAL LETTER D
+0x45	0x0045	#	LATIN CAPITAL LETTER E
+0x46	0x0046	#	LATIN CAPITAL LETTER F
+0x47	0x0047	#	LATIN CAPITAL LETTER G
+0x48	0x0048	#	LATIN CAPITAL LETTER H
+0x49	0x0049	#	LATIN CAPITAL LETTER I
+0x4A	0x004A	#	LATIN CAPITAL LETTER J
+0x4B	0x004B	#	LATIN CAPITAL LETTER K
+0x4C	0x004C	#	LATIN CAPITAL LETTER L
+0x4D	0x004D	#	LATIN CAPITAL LETTER M
+0x4E	0x004E	#	LATIN CAPITAL LETTER N
+0x4F	0x004F	#	LATIN CAPITAL LETTER O
+0x50	0x0050	#	LATIN CAPITAL LETTER P
+0x51	0x0051	#	LATIN CAPITAL LETTER Q
+0x52	0x0052	#	LATIN CAPITAL LETTER R
+0x53	0x0053	#	LATIN CAPITAL LETTER S
+0x54	0x0054	#	LATIN CAPITAL LETTER T
+0x55	0x0055	#	LATIN CAPITAL LETTER U
+0x56	0x0056	#	LATIN CAPITAL LETTER V
+0x57	0x0057	#	LATIN CAPITAL LETTER W
+0x58	0x0058	#	LATIN CAPITAL LETTER X
+0x59	0x0059	#	LATIN CAPITAL LETTER Y
+0x5A	0x005A	#	LATIN CAPITAL LETTER Z
+0x5B	0x005B	#	LEFT SQUARE BRACKET
+0x5C	0x005C	#	REVERSE SOLIDUS
+0x5D	0x005D	#	RIGHT SQUARE BRACKET
+0x5E	0x005E	#	CIRCUMFLEX ACCENT
+0x5F	0x005F	#	LOW LINE
+0x60	0x0060	#	GRAVE ACCENT
+0x61	0x0061	#	LATIN SMALL LETTER A
+0x62	0x0062	#	LATIN SMALL LETTER B
+0x63	0x0063	#	LATIN SMALL LETTER C
+0x64	0x0064	#	LATIN SMALL LETTER D
+0x65	0x0065	#	LATIN SMALL LETTER E
+0x66	0x0066	#	LATIN SMALL LETTER F
+0x67	0x0067	#	LATIN SMALL LETTER G
+0x68	0x0068	#	LATIN SMALL LETTER H
+0x69	0x0069	#	LATIN SMALL LETTER I
+0x6A	0x006A	#	LATIN SMALL LETTER J
+0x6B	0x006B	#	LATIN SMALL LETTER K
+0x6C	0x006C	#	LATIN SMALL LETTER L
+0x6D	0x006D	#	LATIN SMALL LETTER M
+0x6E	0x006E	#	LATIN SMALL LETTER N
+0x6F	0x006F	#	LATIN SMALL LETTER O
+0x70	0x0070	#	LATIN SMALL LETTER P
+0x71	0x0071	#	LATIN SMALL LETTER Q
+0x72	0x0072	#	LATIN SMALL LETTER R
+0x73	0x0073	#	LATIN SMALL LETTER S
+0x74	0x0074	#	LATIN SMALL LETTER T
+0x75	0x0075	#	LATIN SMALL LETTER U
+0x76	0x0076	#	LATIN SMALL LETTER V
+0x77	0x0077	#	LATIN SMALL LETTER W
+0x78	0x0078	#	LATIN SMALL LETTER X
+0x79	0x0079	#	LATIN SMALL LETTER Y
+0x7A	0x007A	#	LATIN SMALL LETTER Z
+0x7B	0x007B	#	LEFT CURLY BRACKET
+0x7C	0x007C	#	VERTICAL LINE
+0x7D	0x007D	#	RIGHT CURLY BRACKET
+0x7E	0x007E	#	TILDE
+0x7F	0x007F	#	DELETE
+0x80	0x0080	#	<control>
+0x81	0x0081	#	<control>
+0x82	0x0082	#	<control>
+0x83	0x0083	#	<control>
+0x84	0x0084	#	<control>
+0x85	0x0085	#	<control>
+0x86	0x0086	#	<control>
+0x87	0x0087	#	<control>
+0x88	0x0088	#	<control>
+0x89	0x0089	#	<control>
+0x8A	0x008A	#	<control>
+0x8B	0x008B	#	<control>
+0x8C	0x008C	#	<control>
+0x8D	0x008D	#	<control>
+0x8E	0x008E	#	<control>
+0x8F	0x008F	#	<control>
+0x90	0x0090	#	<control>
+0x91	0x0091	#	<control>
+0x92	0x0092	#	<control>
+0x93	0x0093	#	<control>
+0x94	0x0094	#	<control>
+0x95	0x0095	#	<control>
+0x96	0x0096	#	<control>
+0x97	0x0097	#	<control>
+0x98	0x0098	#	<control>
+0x99	0x0099	#	<control>
+0x9A	0x009A	#	<control>
+0x9B	0x009B	#	<control>
+0x9C	0x009C	#	<control>
+0x9D	0x009D	#	<control>
+0x9E	0x009E	#	<control>
+0x9F	0x009F	#	<control>
+0xA0	0x00A0	#	NO-BREAK SPACE
+0xA1	0x0401	#	CYRILLIC CAPITAL LETTER IO
+0xA2	0x0402	#	CYRILLIC CAPITAL LETTER DJE
+0xA3	0x0403	#	CYRILLIC CAPITAL LETTER GJE
+0xA4	0x0404	#	CYRILLIC CAPITAL LETTER UKRAINIAN IE
+0xA5	0x0405	#	CYRILLIC CAPITAL LETTER DZE
+0xA6	0x0406	#	CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I
+0xA7	0x0407	#	CYRILLIC CAPITAL LETTER YI
+0xA8	0x0408	#	CYRILLIC CAPITAL LETTER JE
+0xA9	0x0409	#	CYRILLIC CAPITAL LETTER LJE
+0xAA	0x040A	#	CYRILLIC CAPITAL LETTER NJE
+0xAB	0x040B	#	CYRILLIC CAPITAL LETTER TSHE
+0xAC	0x040C	#	CYRILLIC CAPITAL LETTER KJE
+0xAD	0x00AD	#	SOFT HYPHEN
+0xAE	0x040E	#	CYRILLIC CAPITAL LETTER SHORT U
+0xAF	0x040F	#	CYRILLIC CAPITAL LETTER DZHE
+0xB0	0x0410	#	CYRILLIC CAPITAL LETTER A
+0xB1	0x0411	#	CYRILLIC CAPITAL LETTER BE
+0xB2	0x0412	#	CYRILLIC CAPITAL LETTER VE
+0xB3	0x0413	#	CYRILLIC CAPITAL LETTER GHE
+0xB4	0x0414	#	CYRILLIC CAPITAL LETTER DE
+0xB5	0x0415	#	CYRILLIC CAPITAL LETTER IE
+0xB6	0x0416	#	CYRILLIC CAPITAL LETTER ZHE
+0xB7	0x0417	#	CYRILLIC CAPITAL LETTER ZE
+0xB8	0x0418	#	CYRILLIC CAPITAL LETTER I
+0xB9	0x0419	#	CYRILLIC CAPITAL LETTER SHORT I
+0xBA	0x041A	#	CYRILLIC CAPITAL LETTER KA
+0xBB	0x041B	#	CYRILLIC CAPITAL LETTER EL
+0xBC	0x041C	#	CYRILLIC CAPITAL LETTER EM
+0xBD	0x041D	#	CYRILLIC CAPITAL LETTER EN
+0xBE	0x041E	#	CYRILLIC CAPITAL LETTER O
+0xBF	0x041F	#	CYRILLIC CAPITAL LETTER PE
+0xC0	0x0420	#	CYRILLIC CAPITAL LETTER ER
+0xC1	0x0421	#	CYRILLIC CAPITAL LETTER ES
+0xC2	0x0422	#	CYRILLIC CAPITAL LETTER TE
+0xC3	0x0423	#	CYRILLIC CAPITAL LETTER U
+0xC4	0x0424	#	CYRILLIC CAPITAL LETTER EF
+0xC5	0x0425	#	CYRILLIC CAPITAL LETTER HA
+0xC6	0x0426	#	CYRILLIC CAPITAL LETTER TSE
+0xC7	0x0427	#	CYRILLIC CAPITAL LETTER CHE
+0xC8	0x0428	#	CYRILLIC CAPITAL LETTER SHA
+0xC9	0x0429	#	CYRILLIC CAPITAL LETTER SHCHA
+0xCA	0x042A	#	CYRILLIC CAPITAL LETTER HARD SIGN
+0xCB	0x042B	#	CYRILLIC CAPITAL LETTER YERU
+0xCC	0x042C	#	CYRILLIC CAPITAL LETTER SOFT SIGN
+0xCD	0x042D	#	CYRILLIC CAPITAL LETTER E
+0xCE	0x042E	#	CYRILLIC CAPITAL LETTER YU
+0xCF	0x042F	#	CYRILLIC CAPITAL LETTER YA
+0xD0	0x0430	#	CYRILLIC SMALL LETTER A
+0xD1	0x0431	#	CYRILLIC SMALL LETTER BE
+0xD2	0x0432	#	CYRILLIC SMALL LETTER VE
+0xD3	0x0433	#	CYRILLIC SMALL LETTER GHE
+0xD4	0x0434	#	CYRILLIC SMALL LETTER DE
+0xD5	0x0435	#	CYRILLIC SMALL LETTER IE
+0xD6	0x0436	#	CYRILLIC SMALL LETTER ZHE
+0xD7	0x0437	#	CYRILLIC SMALL LETTER ZE
+0xD8	0x0438	#	CYRILLIC SMALL LETTER I
+0xD9	0x0439	#	CYRILLIC SMALL LETTER SHORT I
+0xDA	0x043A	#	CYRILLIC SMALL LETTER KA
+0xDB	0x043B	#	CYRILLIC SMALL LETTER EL
+0xDC	0x043C	#	CYRILLIC SMALL LETTER EM
+0xDD	0x043D	#	CYRILLIC SMALL LETTER EN
+0xDE	0x043E	#	CYRILLIC SMALL LETTER O
+0xDF	0x043F	#	CYRILLIC SMALL LETTER PE
+0xE0	0x0440	#	CYRILLIC SMALL LETTER ER
+0xE1	0x0441	#	CYRILLIC SMALL LETTER ES
+0xE2	0x0442	#	CYRILLIC SMALL LETTER TE
+0xE3	0x0443	#	CYRILLIC SMALL LETTER U
+0xE4	0x0444	#	CYRILLIC SMALL LETTER EF
+0xE5	0x0445	#	CYRILLIC SMALL LETTER HA
+0xE6	0x0446	#	CYRILLIC SMALL LETTER TSE
+0xE7	0x0447	#	CYRILLIC SMALL LETTER CHE
+0xE8	0x0448	#	CYRILLIC SMALL LETTER SHA
+0xE9	0x0449	#	CYRILLIC SMALL LETTER SHCHA
+0xEA	0x044A	#	CYRILLIC SMALL LETTER HARD SIGN
+0xEB	0x044B	#	CYRILLIC SMALL LETTER YERU
+0xEC	0x044C	#	CYRILLIC SMALL LETTER SOFT SIGN
+0xED	0x044D	#	CYRILLIC SMALL LETTER E
+0xEE	0x044E	#	CYRILLIC SMALL LETTER YU
+0xEF	0x044F	#	CYRILLIC SMALL LETTER YA
+0xF0	0x2116	#	NUMERO SIGN
+0xF1	0x0451	#	CYRILLIC SMALL LETTER IO
+0xF2	0x0452	#	CYRILLIC SMALL LETTER DJE
+0xF3	0x0453	#	CYRILLIC SMALL LETTER GJE
+0xF4	0x0454	#	CYRILLIC SMALL LETTER UKRAINIAN IE
+0xF5	0x0455	#	CYRILLIC SMALL LETTER DZE
+0xF6	0x0456	#	CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
+0xF7	0x0457	#	CYRILLIC SMALL LETTER YI
+0xF8	0x0458	#	CYRILLIC SMALL LETTER JE
+0xF9	0x0459	#	CYRILLIC SMALL LETTER LJE
+0xFA	0x045A	#	CYRILLIC SMALL LETTER NJE
+0xFB	0x045B	#	CYRILLIC SMALL LETTER TSHE
+0xFC	0x045C	#	CYRILLIC SMALL LETTER KJE
+0xFD	0x00A7	#	SECTION SIGN
+0xFE	0x045E	#	CYRILLIC SMALL LETTER SHORT U
+0xFF	0x045F	#	CYRILLIC SMALL LETTER DZHE
diff --git a/lib/ucmaps/8859-6.txt b/lib/ucmaps/8859-6.txt
new file mode 100644
index 000000000..69ac7f589
--- /dev/null
+++ b/lib/ucmaps/8859-6.txt
@@ -0,0 +1,260 @@
+#
+#	Name:             ISO 8859-6:1999 to Unicode
+#	Unicode version:  3.0
+#	Table version:    1.0
+#	Table format:     Format A
+#	Date:             1999 July 27
+#	Authors:          Ken Whistler <kenw@sybase.com>
+#
+#	Copyright (c) 1991-1999 Unicode, Inc.  All Rights reserved.
+#
+#	This file is provided as-is by Unicode, Inc. (The Unicode Consortium).
+#	No claims are made as to fitness for any particular purpose.  No
+#	warranties of any kind are expressed or implied.  The recipient
+#	agrees to determine applicability of information provided.  If this
+#	file has been provided on optical media by Unicode, Inc., the sole
+#	remedy for any claim will be exchange of defective media within 90
+#	days of receipt.
+#
+#	Unicode, Inc. hereby grants the right to freely use the information
+#	supplied in this file in the creation of products supporting the
+#	Unicode Standard, and to make copies of this file in any form for
+#	internal or external distribution as long as this notice remains
+#	attached.
+#
+#	General notes:
+#
+#	This table contains the data the Unicode Consortium has on how
+#       ISO/IEC 8859-6:1999 characters map into Unicode.
+#
+#	Format:  Three tab-separated columns
+#		 Column #1 is the ISO/IEC 8859-6 code (in hex as 0xXX)
+#		 Column #2 is the Unicode (in hex as 0xXXXX)
+#		 Column #3 the Unicode name (follows a comment sign, '#')
+#
+#	The entries are in ISO/IEC 8859-6 order.
+#
+#	Version history
+#	1.0 version updates 0.1 version by adding mappings for all
+#	control characters.
+#	0x30..0x39 remapped to the ASCII digits (U+0030..U+0039) instead
+#	of the Arabic digits (U+0660..U+0669).
+#
+#	Updated versions of this file may be found in:
+#		<ftp://ftp.unicode.org/Public/MAPPINGS/>
+#
+#	Any comments or problems, contact <errata@unicode.org>
+#	Please note that <errata@unicode.org> is an archival address;
+#	notices will be checked, but do not expect an immediate response.
+#
+0x00	0x0000	#	NULL
+0x01	0x0001	#	START OF HEADING
+0x02	0x0002	#	START OF TEXT
+0x03	0x0003	#	END OF TEXT
+0x04	0x0004	#	END OF TRANSMISSION
+0x05	0x0005	#	ENQUIRY
+0x06	0x0006	#	ACKNOWLEDGE
+0x07	0x0007	#	BELL
+0x08	0x0008	#	BACKSPACE
+0x09	0x0009	#	HORIZONTAL TABULATION
+0x0A	0x000A	#	LINE FEED
+0x0B	0x000B	#	VERTICAL TABULATION
+0x0C	0x000C	#	FORM FEED
+0x0D	0x000D	#	CARRIAGE RETURN
+0x0E	0x000E	#	SHIFT OUT
+0x0F	0x000F	#	SHIFT IN
+0x10	0x0010	#	DATA LINK ESCAPE
+0x11	0x0011	#	DEVICE CONTROL ONE
+0x12	0x0012	#	DEVICE CONTROL TWO
+0x13	0x0013	#	DEVICE CONTROL THREE
+0x14	0x0014	#	DEVICE CONTROL FOUR
+0x15	0x0015	#	NEGATIVE ACKNOWLEDGE
+0x16	0x0016	#	SYNCHRONOUS IDLE
+0x17	0x0017	#	END OF TRANSMISSION BLOCK
+0x18	0x0018	#	CANCEL
+0x19	0x0019	#	END OF MEDIUM
+0x1A	0x001A	#	SUBSTITUTE
+0x1B	0x001B	#	ESCAPE
+0x1C	0x001C	#	FILE SEPARATOR
+0x1D	0x001D	#	GROUP SEPARATOR
+0x1E	0x001E	#	RECORD SEPARATOR
+0x1F	0x001F	#	UNIT SEPARATOR
+0x20	0x0020	#	SPACE
+0x21	0x0021	#	EXCLAMATION MARK
+0x22	0x0022	#	QUOTATION MARK
+0x23	0x0023	#	NUMBER SIGN
+0x24	0x0024	#	DOLLAR SIGN
+0x25	0x0025	#	PERCENT SIGN
+0x26	0x0026	#	AMPERSAND
+0x27	0x0027	#	APOSTROPHE
+0x28	0x0028	#	LEFT PARENTHESIS
+0x29	0x0029	#	RIGHT PARENTHESIS
+0x2A	0x002A	#	ASTERISK
+0x2B	0x002B	#	PLUS SIGN
+0x2C	0x002C	#	COMMA
+0x2D	0x002D	#	HYPHEN-MINUS
+0x2E	0x002E	#	FULL STOP
+0x2F	0x002F	#	SOLIDUS
+0x30	0x0030	#	DIGIT ZERO
+0x31	0x0031	#	DIGIT ONE
+0x32	0x0032	#	DIGIT TWO
+0x33	0x0033	#	DIGIT THREE
+0x34	0x0034	#	DIGIT FOUR
+0x35	0x0035	#	DIGIT FIVE
+0x36	0x0036	#	DIGIT SIX
+0x37	0x0037	#	DIGIT SEVEN
+0x38	0x0038	#	DIGIT EIGHT
+0x39	0x0039	#	DIGIT NINE
+0x3A	0x003A	#	COLON
+0x3B	0x003B	#	SEMICOLON
+0x3C	0x003C	#	LESS-THAN SIGN
+0x3D	0x003D	#	EQUALS SIGN
+0x3E	0x003E	#	GREATER-THAN SIGN
+0x3F	0x003F	#	QUESTION MARK
+0x40	0x0040	#	COMMERCIAL AT
+0x41	0x0041	#	LATIN CAPITAL LETTER A
+0x42	0x0042	#	LATIN CAPITAL LETTER B
+0x43	0x0043	#	LATIN CAPITAL LETTER C
+0x44	0x0044	#	LATIN CAPITAL LETTER D
+0x45	0x0045	#	LATIN CAPITAL LETTER E
+0x46	0x0046	#	LATIN CAPITAL LETTER F
+0x47	0x0047	#	LATIN CAPITAL LETTER G
+0x48	0x0048	#	LATIN CAPITAL LETTER H
+0x49	0x0049	#	LATIN CAPITAL LETTER I
+0x4A	0x004A	#	LATIN CAPITAL LETTER J
+0x4B	0x004B	#	LATIN CAPITAL LETTER K
+0x4C	0x004C	#	LATIN CAPITAL LETTER L
+0x4D	0x004D	#	LATIN CAPITAL LETTER M
+0x4E	0x004E	#	LATIN CAPITAL LETTER N
+0x4F	0x004F	#	LATIN CAPITAL LETTER O
+0x50	0x0050	#	LATIN CAPITAL LETTER P
+0x51	0x0051	#	LATIN CAPITAL LETTER Q
+0x52	0x0052	#	LATIN CAPITAL LETTER R
+0x53	0x0053	#	LATIN CAPITAL LETTER S
+0x54	0x0054	#	LATIN CAPITAL LETTER T
+0x55	0x0055	#	LATIN CAPITAL LETTER U
+0x56	0x0056	#	LATIN CAPITAL LETTER V
+0x57	0x0057	#	LATIN CAPITAL LETTER W
+0x58	0x0058	#	LATIN CAPITAL LETTER X
+0x59	0x0059	#	LATIN CAPITAL LETTER Y
+0x5A	0x005A	#	LATIN CAPITAL LETTER Z
+0x5B	0x005B	#	LEFT SQUARE BRACKET
+0x5C	0x005C	#	REVERSE SOLIDUS
+0x5D	0x005D	#	RIGHT SQUARE BRACKET
+0x5E	0x005E	#	CIRCUMFLEX ACCENT
+0x5F	0x005F	#	LOW LINE
+0x60	0x0060	#	GRAVE ACCENT
+0x61	0x0061	#	LATIN SMALL LETTER A
+0x62	0x0062	#	LATIN SMALL LETTER B
+0x63	0x0063	#	LATIN SMALL LETTER C
+0x64	0x0064	#	LATIN SMALL LETTER D
+0x65	0x0065	#	LATIN SMALL LETTER E
+0x66	0x0066	#	LATIN SMALL LETTER F
+0x67	0x0067	#	LATIN SMALL LETTER G
+0x68	0x0068	#	LATIN SMALL LETTER H
+0x69	0x0069	#	LATIN SMALL LETTER I
+0x6A	0x006A	#	LATIN SMALL LETTER J
+0x6B	0x006B	#	LATIN SMALL LETTER K
+0x6C	0x006C	#	LATIN SMALL LETTER L
+0x6D	0x006D	#	LATIN SMALL LETTER M
+0x6E	0x006E	#	LATIN SMALL LETTER N
+0x6F	0x006F	#	LATIN SMALL LETTER O
+0x70	0x0070	#	LATIN SMALL LETTER P
+0x71	0x0071	#	LATIN SMALL LETTER Q
+0x72	0x0072	#	LATIN SMALL LETTER R
+0x73	0x0073	#	LATIN SMALL LETTER S
+0x74	0x0074	#	LATIN SMALL LETTER T
+0x75	0x0075	#	LATIN SMALL LETTER U
+0x76	0x0076	#	LATIN SMALL LETTER V
+0x77	0x0077	#	LATIN SMALL LETTER W
+0x78	0x0078	#	LATIN SMALL LETTER X
+0x79	0x0079	#	LATIN SMALL LETTER Y
+0x7A	0x007A	#	LATIN SMALL LETTER Z
+0x7B	0x007B	#	LEFT CURLY BRACKET
+0x7C	0x007C	#	VERTICAL LINE
+0x7D	0x007D	#	RIGHT CURLY BRACKET
+0x7E	0x007E	#	TILDE
+0x7F	0x007F	#	DELETE
+0x80	0x0080	#	<control>
+0x81	0x0081	#	<control>
+0x82	0x0082	#	<control>
+0x83	0x0083	#	<control>
+0x84	0x0084	#	<control>
+0x85	0x0085	#	<control>
+0x86	0x0086	#	<control>
+0x87	0x0087	#	<control>
+0x88	0x0088	#	<control>
+0x89	0x0089	#	<control>
+0x8A	0x008A	#	<control>
+0x8B	0x008B	#	<control>
+0x8C	0x008C	#	<control>
+0x8D	0x008D	#	<control>
+0x8E	0x008E	#	<control>
+0x8F	0x008F	#	<control>
+0x90	0x0090	#	<control>
+0x91	0x0091	#	<control>
+0x92	0x0092	#	<control>
+0x93	0x0093	#	<control>
+0x94	0x0094	#	<control>
+0x95	0x0095	#	<control>
+0x96	0x0096	#	<control>
+0x97	0x0097	#	<control>
+0x98	0x0098	#	<control>
+0x99	0x0099	#	<control>
+0x9A	0x009A	#	<control>
+0x9B	0x009B	#	<control>
+0x9C	0x009C	#	<control>
+0x9D	0x009D	#	<control>
+0x9E	0x009E	#	<control>
+0x9F	0x009F	#	<control>
+0xA0	0x00A0	#	NO-BREAK SPACE
+0xA4	0x00A4	#	CURRENCY SIGN
+0xAC	0x060C	#	ARABIC COMMA
+0xAD	0x00AD	#	SOFT HYPHEN
+0xBB	0x061B	#	ARABIC SEMICOLON
+0xBF	0x061F	#	ARABIC QUESTION MARK
+0xC1	0x0621	#	ARABIC LETTER HAMZA
+0xC2	0x0622	#	ARABIC LETTER ALEF WITH MADDA ABOVE
+0xC3	0x0623	#	ARABIC LETTER ALEF WITH HAMZA ABOVE
+0xC4	0x0624	#	ARABIC LETTER WAW WITH HAMZA ABOVE
+0xC5	0x0625	#	ARABIC LETTER ALEF WITH HAMZA BELOW
+0xC6	0x0626	#	ARABIC LETTER YEH WITH HAMZA ABOVE
+0xC7	0x0627	#	ARABIC LETTER ALEF
+0xC8	0x0628	#	ARABIC LETTER BEH
+0xC9	0x0629	#	ARABIC LETTER TEH MARBUTA
+0xCA	0x062A	#	ARABIC LETTER TEH
+0xCB	0x062B	#	ARABIC LETTER THEH
+0xCC	0x062C	#	ARABIC LETTER JEEM
+0xCD	0x062D	#	ARABIC LETTER HAH
+0xCE	0x062E	#	ARABIC LETTER KHAH
+0xCF	0x062F	#	ARABIC LETTER DAL
+0xD0	0x0630	#	ARABIC LETTER THAL
+0xD1	0x0631	#	ARABIC LETTER REH
+0xD2	0x0632	#	ARABIC LETTER ZAIN
+0xD3	0x0633	#	ARABIC LETTER SEEN
+0xD4	0x0634	#	ARABIC LETTER SHEEN
+0xD5	0x0635	#	ARABIC LETTER SAD
+0xD6	0x0636	#	ARABIC LETTER DAD
+0xD7	0x0637	#	ARABIC LETTER TAH
+0xD8	0x0638	#	ARABIC LETTER ZAH
+0xD9	0x0639	#	ARABIC LETTER AIN
+0xDA	0x063A	#	ARABIC LETTER GHAIN
+0xE0	0x0640	#	ARABIC TATWEEL
+0xE1	0x0641	#	ARABIC LETTER FEH
+0xE2	0x0642	#	ARABIC LETTER QAF
+0xE3	0x0643	#	ARABIC LETTER KAF
+0xE4	0x0644	#	ARABIC LETTER LAM
+0xE5	0x0645	#	ARABIC LETTER MEEM
+0xE6	0x0646	#	ARABIC LETTER NOON
+0xE7	0x0647	#	ARABIC LETTER HEH
+0xE8	0x0648	#	ARABIC LETTER WAW
+0xE9	0x0649	#	ARABIC LETTER ALEF MAKSURA
+0xEA	0x064A	#	ARABIC LETTER YEH
+0xEB	0x064B	#	ARABIC FATHATAN
+0xEC	0x064C	#	ARABIC DAMMATAN
+0xED	0x064D	#	ARABIC KASRATAN
+0xEE	0x064E	#	ARABIC FATHA
+0xEF	0x064F	#	ARABIC DAMMA
+0xF0	0x0650	#	ARABIC KASRA
+0xF1	0x0651	#	ARABIC SHADDA
+0xF2	0x0652	#	ARABIC SUKUN
diff --git a/lib/ucmaps/8859-7.txt b/lib/ucmaps/8859-7.txt
new file mode 100644
index 000000000..52c42d08a
--- /dev/null
+++ b/lib/ucmaps/8859-7.txt
@@ -0,0 +1,302 @@
+#
+#	Name:             ISO 8859-7:1987 to Unicode
+#	Unicode version:  3.0
+#	Table version:    1.0
+#	Table format:     Format A
+#	Date:             1999 July 27
+#	Authors:          Ken Whistler <kenw@sybase.com>
+#
+#	Copyright (c) 1991-1999 Unicode, Inc.  All Rights reserved.
+#
+#	This file is provided as-is by Unicode, Inc. (The Unicode Consortium).
+#	No claims are made as to fitness for any particular purpose.  No
+#	warranties of any kind are expressed or implied.  The recipient
+#	agrees to determine applicability of information provided.  If this
+#	file has been provided on optical media by Unicode, Inc., the sole
+#	remedy for any claim will be exchange of defective media within 90
+#	days of receipt.
+#
+#	Unicode, Inc. hereby grants the right to freely use the information
+#	supplied in this file in the creation of products supporting the
+#	Unicode Standard, and to make copies of this file in any form for
+#	internal or external distribution as long as this notice remains
+#	attached.
+#
+#	General notes:
+#
+#	This table contains the data the Unicode Consortium has on how
+#       ISO 8859-7:1987 characters map into Unicode.
+#
+#	ISO 8859-7:1987 is equivalent to ISO-IR-126, ELOT 928,
+#	and ECMA 118.
+#
+#	Format:  Three tab-separated columns
+#		 Column #1 is the ISO 8859-7 code (in hex as 0xXX)
+#		 Column #2 is the Unicode (in hex as 0xXXXX)
+#		 Column #3 the Unicode name (follows a comment sign, '#')
+#
+#	The entries are in ISO 8859-7 order.
+#
+#	Version history
+#	1.0 version updates 0.1 version by adding mappings for all
+#	control characters.
+#	Remap 0xA1 to U+2018 (instead of 0x02BD) to match text of 8859-7
+#	Remap 0xA2 to U+2019 (instead of 0x02BC) to match text of 8859-7
+#
+#	Updated versions of this file may be found in:
+#		<ftp://ftp.unicode.org/Public/MAPPINGS/>
+#
+#	Any comments or problems, contact <errata@unicode.org>
+#	Please note that <errata@unicode.org> is an archival address;
+#	notices will be checked, but do not expect an immediate response.
+#
+0x00	0x0000	#	NULL
+0x01	0x0001	#	START OF HEADING
+0x02	0x0002	#	START OF TEXT
+0x03	0x0003	#	END OF TEXT
+0x04	0x0004	#	END OF TRANSMISSION
+0x05	0x0005	#	ENQUIRY
+0x06	0x0006	#	ACKNOWLEDGE
+0x07	0x0007	#	BELL
+0x08	0x0008	#	BACKSPACE
+0x09	0x0009	#	HORIZONTAL TABULATION
+0x0A	0x000A	#	LINE FEED
+0x0B	0x000B	#	VERTICAL TABULATION
+0x0C	0x000C	#	FORM FEED
+0x0D	0x000D	#	CARRIAGE RETURN
+0x0E	0x000E	#	SHIFT OUT
+0x0F	0x000F	#	SHIFT IN
+0x10	0x0010	#	DATA LINK ESCAPE
+0x11	0x0011	#	DEVICE CONTROL ONE
+0x12	0x0012	#	DEVICE CONTROL TWO
+0x13	0x0013	#	DEVICE CONTROL THREE
+0x14	0x0014	#	DEVICE CONTROL FOUR
+0x15	0x0015	#	NEGATIVE ACKNOWLEDGE
+0x16	0x0016	#	SYNCHRONOUS IDLE
+0x17	0x0017	#	END OF TRANSMISSION BLOCK
+0x18	0x0018	#	CANCEL
+0x19	0x0019	#	END OF MEDIUM
+0x1A	0x001A	#	SUBSTITUTE
+0x1B	0x001B	#	ESCAPE
+0x1C	0x001C	#	FILE SEPARATOR
+0x1D	0x001D	#	GROUP SEPARATOR
+0x1E	0x001E	#	RECORD SEPARATOR
+0x1F	0x001F	#	UNIT SEPARATOR
+0x20	0x0020	#	SPACE
+0x21	0x0021	#	EXCLAMATION MARK
+0x22	0x0022	#	QUOTATION MARK
+0x23	0x0023	#	NUMBER SIGN
+0x24	0x0024	#	DOLLAR SIGN
+0x25	0x0025	#	PERCENT SIGN
+0x26	0x0026	#	AMPERSAND
+0x27	0x0027	#	APOSTROPHE
+0x28	0x0028	#	LEFT PARENTHESIS
+0x29	0x0029	#	RIGHT PARENTHESIS
+0x2A	0x002A	#	ASTERISK
+0x2B	0x002B	#	PLUS SIGN
+0x2C	0x002C	#	COMMA
+0x2D	0x002D	#	HYPHEN-MINUS
+0x2E	0x002E	#	FULL STOP
+0x2F	0x002F	#	SOLIDUS
+0x30	0x0030	#	DIGIT ZERO
+0x31	0x0031	#	DIGIT ONE
+0x32	0x0032	#	DIGIT TWO
+0x33	0x0033	#	DIGIT THREE
+0x34	0x0034	#	DIGIT FOUR
+0x35	0x0035	#	DIGIT FIVE
+0x36	0x0036	#	DIGIT SIX
+0x37	0x0037	#	DIGIT SEVEN
+0x38	0x0038	#	DIGIT EIGHT
+0x39	0x0039	#	DIGIT NINE
+0x3A	0x003A	#	COLON
+0x3B	0x003B	#	SEMICOLON
+0x3C	0x003C	#	LESS-THAN SIGN
+0x3D	0x003D	#	EQUALS SIGN
+0x3E	0x003E	#	GREATER-THAN SIGN
+0x3F	0x003F	#	QUESTION MARK
+0x40	0x0040	#	COMMERCIAL AT
+0x41	0x0041	#	LATIN CAPITAL LETTER A
+0x42	0x0042	#	LATIN CAPITAL LETTER B
+0x43	0x0043	#	LATIN CAPITAL LETTER C
+0x44	0x0044	#	LATIN CAPITAL LETTER D
+0x45	0x0045	#	LATIN CAPITAL LETTER E
+0x46	0x0046	#	LATIN CAPITAL LETTER F
+0x47	0x0047	#	LATIN CAPITAL LETTER G
+0x48	0x0048	#	LATIN CAPITAL LETTER H
+0x49	0x0049	#	LATIN CAPITAL LETTER I
+0x4A	0x004A	#	LATIN CAPITAL LETTER J
+0x4B	0x004B	#	LATIN CAPITAL LETTER K
+0x4C	0x004C	#	LATIN CAPITAL LETTER L
+0x4D	0x004D	#	LATIN CAPITAL LETTER M
+0x4E	0x004E	#	LATIN CAPITAL LETTER N
+0x4F	0x004F	#	LATIN CAPITAL LETTER O
+0x50	0x0050	#	LATIN CAPITAL LETTER P
+0x51	0x0051	#	LATIN CAPITAL LETTER Q
+0x52	0x0052	#	LATIN CAPITAL LETTER R
+0x53	0x0053	#	LATIN CAPITAL LETTER S
+0x54	0x0054	#	LATIN CAPITAL LETTER T
+0x55	0x0055	#	LATIN CAPITAL LETTER U
+0x56	0x0056	#	LATIN CAPITAL LETTER V
+0x57	0x0057	#	LATIN CAPITAL LETTER W
+0x58	0x0058	#	LATIN CAPITAL LETTER X
+0x59	0x0059	#	LATIN CAPITAL LETTER Y
+0x5A	0x005A	#	LATIN CAPITAL LETTER Z
+0x5B	0x005B	#	LEFT SQUARE BRACKET
+0x5C	0x005C	#	REVERSE SOLIDUS
+0x5D	0x005D	#	RIGHT SQUARE BRACKET
+0x5E	0x005E	#	CIRCUMFLEX ACCENT
+0x5F	0x005F	#	LOW LINE
+0x60	0x0060	#	GRAVE ACCENT
+0x61	0x0061	#	LATIN SMALL LETTER A
+0x62	0x0062	#	LATIN SMALL LETTER B
+0x63	0x0063	#	LATIN SMALL LETTER C
+0x64	0x0064	#	LATIN SMALL LETTER D
+0x65	0x0065	#	LATIN SMALL LETTER E
+0x66	0x0066	#	LATIN SMALL LETTER F
+0x67	0x0067	#	LATIN SMALL LETTER G
+0x68	0x0068	#	LATIN SMALL LETTER H
+0x69	0x0069	#	LATIN SMALL LETTER I
+0x6A	0x006A	#	LATIN SMALL LETTER J
+0x6B	0x006B	#	LATIN SMALL LETTER K
+0x6C	0x006C	#	LATIN SMALL LETTER L
+0x6D	0x006D	#	LATIN SMALL LETTER M
+0x6E	0x006E	#	LATIN SMALL LETTER N
+0x6F	0x006F	#	LATIN SMALL LETTER O
+0x70	0x0070	#	LATIN SMALL LETTER P
+0x71	0x0071	#	LATIN SMALL LETTER Q
+0x72	0x0072	#	LATIN SMALL LETTER R
+0x73	0x0073	#	LATIN SMALL LETTER S
+0x74	0x0074	#	LATIN SMALL LETTER T
+0x75	0x0075	#	LATIN SMALL LETTER U
+0x76	0x0076	#	LATIN SMALL LETTER V
+0x77	0x0077	#	LATIN SMALL LETTER W
+0x78	0x0078	#	LATIN SMALL LETTER X
+0x79	0x0079	#	LATIN SMALL LETTER Y
+0x7A	0x007A	#	LATIN SMALL LETTER Z
+0x7B	0x007B	#	LEFT CURLY BRACKET
+0x7C	0x007C	#	VERTICAL LINE
+0x7D	0x007D	#	RIGHT CURLY BRACKET
+0x7E	0x007E	#	TILDE
+0x7F	0x007F	#	DELETE
+0x80	0x0080	#	<control>
+0x81	0x0081	#	<control>
+0x82	0x0082	#	<control>
+0x83	0x0083	#	<control>
+0x84	0x0084	#	<control>
+0x85	0x0085	#	<control>
+0x86	0x0086	#	<control>
+0x87	0x0087	#	<control>
+0x88	0x0088	#	<control>
+0x89	0x0089	#	<control>
+0x8A	0x008A	#	<control>
+0x8B	0x008B	#	<control>
+0x8C	0x008C	#	<control>
+0x8D	0x008D	#	<control>
+0x8E	0x008E	#	<control>
+0x8F	0x008F	#	<control>
+0x90	0x0090	#	<control>
+0x91	0x0091	#	<control>
+0x92	0x0092	#	<control>
+0x93	0x0093	#	<control>
+0x94	0x0094	#	<control>
+0x95	0x0095	#	<control>
+0x96	0x0096	#	<control>
+0x97	0x0097	#	<control>
+0x98	0x0098	#	<control>
+0x99	0x0099	#	<control>
+0x9A	0x009A	#	<control>
+0x9B	0x009B	#	<control>
+0x9C	0x009C	#	<control>
+0x9D	0x009D	#	<control>
+0x9E	0x009E	#	<control>
+0x9F	0x009F	#	<control>
+0xA0	0x00A0	#	NO-BREAK SPACE
+0xA1	0x2018	#	LEFT SINGLE QUOTATION MARK
+0xA2	0x2019	#	RIGHT SINGLE QUOTATION MARK
+0xA3	0x00A3	#	POUND SIGN
+0xA6	0x00A6	#	BROKEN BAR
+0xA7	0x00A7	#	SECTION SIGN
+0xA8	0x00A8	#	DIAERESIS
+0xA9	0x00A9	#	COPYRIGHT SIGN
+0xAB	0x00AB	#	LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xAC	0x00AC	#	NOT SIGN
+0xAD	0x00AD	#	SOFT HYPHEN
+0xAF	0x2015	#	HORIZONTAL BAR
+0xB0	0x00B0	#	DEGREE SIGN
+0xB1	0x00B1	#	PLUS-MINUS SIGN
+0xB2	0x00B2	#	SUPERSCRIPT TWO
+0xB3	0x00B3	#	SUPERSCRIPT THREE
+0xB4	0x0384	#	GREEK TONOS
+0xB5	0x0385	#	GREEK DIALYTIKA TONOS
+0xB6	0x0386	#	GREEK CAPITAL LETTER ALPHA WITH TONOS
+0xB7	0x00B7	#	MIDDLE DOT
+0xB8	0x0388	#	GREEK CAPITAL LETTER EPSILON WITH TONOS
+0xB9	0x0389	#	GREEK CAPITAL LETTER ETA WITH TONOS
+0xBA	0x038A	#	GREEK CAPITAL LETTER IOTA WITH TONOS
+0xBB	0x00BB	#	RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xBC	0x038C	#	GREEK CAPITAL LETTER OMICRON WITH TONOS
+0xBD	0x00BD	#	VULGAR FRACTION ONE HALF
+0xBE	0x038E	#	GREEK CAPITAL LETTER UPSILON WITH TONOS
+0xBF	0x038F	#	GREEK CAPITAL LETTER OMEGA WITH TONOS
+0xC0	0x0390	#	GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS
+0xC1	0x0391	#	GREEK CAPITAL LETTER ALPHA
+0xC2	0x0392	#	GREEK CAPITAL LETTER BETA
+0xC3	0x0393	#	GREEK CAPITAL LETTER GAMMA
+0xC4	0x0394	#	GREEK CAPITAL LETTER DELTA
+0xC5	0x0395	#	GREEK CAPITAL LETTER EPSILON
+0xC6	0x0396	#	GREEK CAPITAL LETTER ZETA
+0xC7	0x0397	#	GREEK CAPITAL LETTER ETA
+0xC8	0x0398	#	GREEK CAPITAL LETTER THETA
+0xC9	0x0399	#	GREEK CAPITAL LETTER IOTA
+0xCA	0x039A	#	GREEK CAPITAL LETTER KAPPA
+0xCB	0x039B	#	GREEK CAPITAL LETTER LAMDA
+0xCC	0x039C	#	GREEK CAPITAL LETTER MU
+0xCD	0x039D	#	GREEK CAPITAL LETTER NU
+0xCE	0x039E	#	GREEK CAPITAL LETTER XI
+0xCF	0x039F	#	GREEK CAPITAL LETTER OMICRON
+0xD0	0x03A0	#	GREEK CAPITAL LETTER PI
+0xD1	0x03A1	#	GREEK CAPITAL LETTER RHO
+0xD3	0x03A3	#	GREEK CAPITAL LETTER SIGMA
+0xD4	0x03A4	#	GREEK CAPITAL LETTER TAU
+0xD5	0x03A5	#	GREEK CAPITAL LETTER UPSILON
+0xD6	0x03A6	#	GREEK CAPITAL LETTER PHI
+0xD7	0x03A7	#	GREEK CAPITAL LETTER CHI
+0xD8	0x03A8	#	GREEK CAPITAL LETTER PSI
+0xD9	0x03A9	#	GREEK CAPITAL LETTER OMEGA
+0xDA	0x03AA	#	GREEK CAPITAL LETTER IOTA WITH DIALYTIKA
+0xDB	0x03AB	#	GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA
+0xDC	0x03AC	#	GREEK SMALL LETTER ALPHA WITH TONOS
+0xDD	0x03AD	#	GREEK SMALL LETTER EPSILON WITH TONOS
+0xDE	0x03AE	#	GREEK SMALL LETTER ETA WITH TONOS
+0xDF	0x03AF	#	GREEK SMALL LETTER IOTA WITH TONOS
+0xE0	0x03B0	#	GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS
+0xE1	0x03B1	#	GREEK SMALL LETTER ALPHA
+0xE2	0x03B2	#	GREEK SMALL LETTER BETA
+0xE3	0x03B3	#	GREEK SMALL LETTER GAMMA
+0xE4	0x03B4	#	GREEK SMALL LETTER DELTA
+0xE5	0x03B5	#	GREEK SMALL LETTER EPSILON
+0xE6	0x03B6	#	GREEK SMALL LETTER ZETA
+0xE7	0x03B7	#	GREEK SMALL LETTER ETA
+0xE8	0x03B8	#	GREEK SMALL LETTER THETA
+0xE9	0x03B9	#	GREEK SMALL LETTER IOTA
+0xEA	0x03BA	#	GREEK SMALL LETTER KAPPA
+0xEB	0x03BB	#	GREEK SMALL LETTER LAMDA
+0xEC	0x03BC	#	GREEK SMALL LETTER MU
+0xED	0x03BD	#	GREEK SMALL LETTER NU
+0xEE	0x03BE	#	GREEK SMALL LETTER XI
+0xEF	0x03BF	#	GREEK SMALL LETTER OMICRON
+0xF0	0x03C0	#	GREEK SMALL LETTER PI
+0xF1	0x03C1	#	GREEK SMALL LETTER RHO
+0xF2	0x03C2	#	GREEK SMALL LETTER FINAL SIGMA
+0xF3	0x03C3	#	GREEK SMALL LETTER SIGMA
+0xF4	0x03C4	#	GREEK SMALL LETTER TAU
+0xF5	0x03C5	#	GREEK SMALL LETTER UPSILON
+0xF6	0x03C6	#	GREEK SMALL LETTER PHI
+0xF7	0x03C7	#	GREEK SMALL LETTER CHI
+0xF8	0x03C8	#	GREEK SMALL LETTER PSI
+0xF9	0x03C9	#	GREEK SMALL LETTER OMEGA
+0xFA	0x03CA	#	GREEK SMALL LETTER IOTA WITH DIALYTIKA
+0xFB	0x03CB	#	GREEK SMALL LETTER UPSILON WITH DIALYTIKA
+0xFC	0x03CC	#	GREEK SMALL LETTER OMICRON WITH TONOS
+0xFD	0x03CD	#	GREEK SMALL LETTER UPSILON WITH TONOS
+0xFE	0x03CE	#	GREEK SMALL LETTER OMEGA WITH TONOS
diff --git a/lib/ucmaps/8859-8.txt b/lib/ucmaps/8859-8.txt
new file mode 100644
index 000000000..bc8da4c7f
--- /dev/null
+++ b/lib/ucmaps/8859-8.txt
@@ -0,0 +1,270 @@
+#
+#	Name:             ISO/IEC 8859-8:1999 to Unicode
+#	Unicode version:  3.0
+#	Table version:    1.1
+#	Table format:     Format A
+#	Date:             2000-Jan-03
+#	Authors:          Ken Whistler <kenw@sybase.com>
+#
+#	Copyright (c) 1991-1999 Unicode, Inc.  All Rights reserved.
+#
+#	This file is provided as-is by Unicode, Inc. (The Unicode Consortium).
+#	No claims are made as to fitness for any particular purpose.  No
+#	warranties of any kind are expressed or implied.  The recipient
+#	agrees to determine applicability of information provided.  If this
+#	file has been provided on optical media by Unicode, Inc., the sole
+#	remedy for any claim will be exchange of defective media within 90
+#	days of receipt.
+#
+#	Unicode, Inc. hereby grants the right to freely use the information
+#	supplied in this file in the creation of products supporting the
+#	Unicode Standard, and to make copies of this file in any form for
+#	internal or external distribution as long as this notice remains
+#	attached.
+#
+#	General notes:
+#
+#	This table contains the data the Unicode Consortium has on how
+#       ISO/IEC 8859-8:1999 characters map into Unicode.
+#
+#	Format:  Three tab-separated columns
+#		 Column #1 is the ISO/IEC 8859-8 code (in hex as 0xXX)
+#		 Column #2 is the Unicode (in hex as 0xXXXX)
+#		 Column #3 the Unicode name (follows a comment sign, '#')
+#
+#	The entries are in ISO/IEC 8859-8 order.
+#
+#	Version history
+#	1.0 version updates 0.1 version by adding mappings for all
+#	control characters.
+#       1.1 version updates to the published 8859-8:1999, correcting
+#          the mapping of 0xAF and adding mappings for LRM and RLM.
+#
+#	Updated versions of this file may be found in:
+#		<ftp://ftp.unicode.org/Public/MAPPINGS/>
+#
+#	Any comments or problems, contact <errata@unicode.org>
+#	Please note that <errata@unicode.org> is an archival address;
+#	notices will be checked, but do not expect an immediate response.
+#
+0x00	0x0000	#	NULL
+0x01	0x0001	#	START OF HEADING
+0x02	0x0002	#	START OF TEXT
+0x03	0x0003	#	END OF TEXT
+0x04	0x0004	#	END OF TRANSMISSION
+0x05	0x0005	#	ENQUIRY
+0x06	0x0006	#	ACKNOWLEDGE
+0x07	0x0007	#	BELL
+0x08	0x0008	#	BACKSPACE
+0x09	0x0009	#	HORIZONTAL TABULATION
+0x0A	0x000A	#	LINE FEED
+0x0B	0x000B	#	VERTICAL TABULATION
+0x0C	0x000C	#	FORM FEED
+0x0D	0x000D	#	CARRIAGE RETURN
+0x0E	0x000E	#	SHIFT OUT
+0x0F	0x000F	#	SHIFT IN
+0x10	0x0010	#	DATA LINK ESCAPE
+0x11	0x0011	#	DEVICE CONTROL ONE
+0x12	0x0012	#	DEVICE CONTROL TWO
+0x13	0x0013	#	DEVICE CONTROL THREE
+0x14	0x0014	#	DEVICE CONTROL FOUR
+0x15	0x0015	#	NEGATIVE ACKNOWLEDGE
+0x16	0x0016	#	SYNCHRONOUS IDLE
+0x17	0x0017	#	END OF TRANSMISSION BLOCK
+0x18	0x0018	#	CANCEL
+0x19	0x0019	#	END OF MEDIUM
+0x1A	0x001A	#	SUBSTITUTE
+0x1B	0x001B	#	ESCAPE
+0x1C	0x001C	#	FILE SEPARATOR
+0x1D	0x001D	#	GROUP SEPARATOR
+0x1E	0x001E	#	RECORD SEPARATOR
+0x1F	0x001F	#	UNIT SEPARATOR
+0x20	0x0020	#	SPACE
+0x21	0x0021	#	EXCLAMATION MARK
+0x22	0x0022	#	QUOTATION MARK
+0x23	0x0023	#	NUMBER SIGN
+0x24	0x0024	#	DOLLAR SIGN
+0x25	0x0025	#	PERCENT SIGN
+0x26	0x0026	#	AMPERSAND
+0x27	0x0027	#	APOSTROPHE
+0x28	0x0028	#	LEFT PARENTHESIS
+0x29	0x0029	#	RIGHT PARENTHESIS
+0x2A	0x002A	#	ASTERISK
+0x2B	0x002B	#	PLUS SIGN
+0x2C	0x002C	#	COMMA
+0x2D	0x002D	#	HYPHEN-MINUS
+0x2E	0x002E	#	FULL STOP
+0x2F	0x002F	#	SOLIDUS
+0x30	0x0030	#	DIGIT ZERO
+0x31	0x0031	#	DIGIT ONE
+0x32	0x0032	#	DIGIT TWO
+0x33	0x0033	#	DIGIT THREE
+0x34	0x0034	#	DIGIT FOUR
+0x35	0x0035	#	DIGIT FIVE
+0x36	0x0036	#	DIGIT SIX
+0x37	0x0037	#	DIGIT SEVEN
+0x38	0x0038	#	DIGIT EIGHT
+0x39	0x0039	#	DIGIT NINE
+0x3A	0x003A	#	COLON
+0x3B	0x003B	#	SEMICOLON
+0x3C	0x003C	#	LESS-THAN SIGN
+0x3D	0x003D	#	EQUALS SIGN
+0x3E	0x003E	#	GREATER-THAN SIGN
+0x3F	0x003F	#	QUESTION MARK
+0x40	0x0040	#	COMMERCIAL AT
+0x41	0x0041	#	LATIN CAPITAL LETTER A
+0x42	0x0042	#	LATIN CAPITAL LETTER B
+0x43	0x0043	#	LATIN CAPITAL LETTER C
+0x44	0x0044	#	LATIN CAPITAL LETTER D
+0x45	0x0045	#	LATIN CAPITAL LETTER E
+0x46	0x0046	#	LATIN CAPITAL LETTER F
+0x47	0x0047	#	LATIN CAPITAL LETTER G
+0x48	0x0048	#	LATIN CAPITAL LETTER H
+0x49	0x0049	#	LATIN CAPITAL LETTER I
+0x4A	0x004A	#	LATIN CAPITAL LETTER J
+0x4B	0x004B	#	LATIN CAPITAL LETTER K
+0x4C	0x004C	#	LATIN CAPITAL LETTER L
+0x4D	0x004D	#	LATIN CAPITAL LETTER M
+0x4E	0x004E	#	LATIN CAPITAL LETTER N
+0x4F	0x004F	#	LATIN CAPITAL LETTER O
+0x50	0x0050	#	LATIN CAPITAL LETTER P
+0x51	0x0051	#	LATIN CAPITAL LETTER Q
+0x52	0x0052	#	LATIN CAPITAL LETTER R
+0x53	0x0053	#	LATIN CAPITAL LETTER S
+0x54	0x0054	#	LATIN CAPITAL LETTER T
+0x55	0x0055	#	LATIN CAPITAL LETTER U
+0x56	0x0056	#	LATIN CAPITAL LETTER V
+0x57	0x0057	#	LATIN CAPITAL LETTER W
+0x58	0x0058	#	LATIN CAPITAL LETTER X
+0x59	0x0059	#	LATIN CAPITAL LETTER Y
+0x5A	0x005A	#	LATIN CAPITAL LETTER Z
+0x5B	0x005B	#	LEFT SQUARE BRACKET
+0x5C	0x005C	#	REVERSE SOLIDUS
+0x5D	0x005D	#	RIGHT SQUARE BRACKET
+0x5E	0x005E	#	CIRCUMFLEX ACCENT
+0x5F	0x005F	#	LOW LINE
+0x60	0x0060	#	GRAVE ACCENT
+0x61	0x0061	#	LATIN SMALL LETTER A
+0x62	0x0062	#	LATIN SMALL LETTER B
+0x63	0x0063	#	LATIN SMALL LETTER C
+0x64	0x0064	#	LATIN SMALL LETTER D
+0x65	0x0065	#	LATIN SMALL LETTER E
+0x66	0x0066	#	LATIN SMALL LETTER F
+0x67	0x0067	#	LATIN SMALL LETTER G
+0x68	0x0068	#	LATIN SMALL LETTER H
+0x69	0x0069	#	LATIN SMALL LETTER I
+0x6A	0x006A	#	LATIN SMALL LETTER J
+0x6B	0x006B	#	LATIN SMALL LETTER K
+0x6C	0x006C	#	LATIN SMALL LETTER L
+0x6D	0x006D	#	LATIN SMALL LETTER M
+0x6E	0x006E	#	LATIN SMALL LETTER N
+0x6F	0x006F	#	LATIN SMALL LETTER O
+0x70	0x0070	#	LATIN SMALL LETTER P
+0x71	0x0071	#	LATIN SMALL LETTER Q
+0x72	0x0072	#	LATIN SMALL LETTER R
+0x73	0x0073	#	LATIN SMALL LETTER S
+0x74	0x0074	#	LATIN SMALL LETTER T
+0x75	0x0075	#	LATIN SMALL LETTER U
+0x76	0x0076	#	LATIN SMALL LETTER V
+0x77	0x0077	#	LATIN SMALL LETTER W
+0x78	0x0078	#	LATIN SMALL LETTER X
+0x79	0x0079	#	LATIN SMALL LETTER Y
+0x7A	0x007A	#	LATIN SMALL LETTER Z
+0x7B	0x007B	#	LEFT CURLY BRACKET
+0x7C	0x007C	#	VERTICAL LINE
+0x7D	0x007D	#	RIGHT CURLY BRACKET
+0x7E	0x007E	#	TILDE
+0x7F	0x007F	#	DELETE
+0x80	0x0080	#	<control>
+0x81	0x0081	#	<control>
+0x82	0x0082	#	<control>
+0x83	0x0083	#	<control>
+0x84	0x0084	#	<control>
+0x85	0x0085	#	<control>
+0x86	0x0086	#	<control>
+0x87	0x0087	#	<control>
+0x88	0x0088	#	<control>
+0x89	0x0089	#	<control>
+0x8A	0x008A	#	<control>
+0x8B	0x008B	#	<control>
+0x8C	0x008C	#	<control>
+0x8D	0x008D	#	<control>
+0x8E	0x008E	#	<control>
+0x8F	0x008F	#	<control>
+0x90	0x0090	#	<control>
+0x91	0x0091	#	<control>
+0x92	0x0092	#	<control>
+0x93	0x0093	#	<control>
+0x94	0x0094	#	<control>
+0x95	0x0095	#	<control>
+0x96	0x0096	#	<control>
+0x97	0x0097	#	<control>
+0x98	0x0098	#	<control>
+0x99	0x0099	#	<control>
+0x9A	0x009A	#	<control>
+0x9B	0x009B	#	<control>
+0x9C	0x009C	#	<control>
+0x9D	0x009D	#	<control>
+0x9E	0x009E	#	<control>
+0x9F	0x009F	#	<control>
+0xA0	0x00A0	#	NO-BREAK SPACE
+0xA2	0x00A2	#	CENT SIGN
+0xA3	0x00A3	#	POUND SIGN
+0xA4	0x00A4	#	CURRENCY SIGN
+0xA5	0x00A5	#	YEN SIGN
+0xA6	0x00A6	#	BROKEN BAR
+0xA7	0x00A7	#	SECTION SIGN
+0xA8	0x00A8	#	DIAERESIS
+0xA9	0x00A9	#	COPYRIGHT SIGN
+0xAA	0x00D7	#	MULTIPLICATION SIGN
+0xAB	0x00AB	#	LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xAC	0x00AC	#	NOT SIGN
+0xAD	0x00AD	#	SOFT HYPHEN
+0xAE	0x00AE	#	REGISTERED SIGN
+0xAF	0x00AF	#	MACRON
+0xB0	0x00B0	#	DEGREE SIGN
+0xB1	0x00B1	#	PLUS-MINUS SIGN
+0xB2	0x00B2	#	SUPERSCRIPT TWO
+0xB3	0x00B3	#	SUPERSCRIPT THREE
+0xB4	0x00B4	#	ACUTE ACCENT
+0xB5	0x00B5	#	MICRO SIGN
+0xB6	0x00B6	#	PILCROW SIGN
+0xB7	0x00B7	#	MIDDLE DOT
+0xB8	0x00B8	#	CEDILLA
+0xB9	0x00B9	#	SUPERSCRIPT ONE
+0xBA	0x00F7	#	DIVISION SIGN
+0xBB	0x00BB	#	RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xBC	0x00BC	#	VULGAR FRACTION ONE QUARTER
+0xBD	0x00BD	#	VULGAR FRACTION ONE HALF
+0xBE	0x00BE	#	VULGAR FRACTION THREE QUARTERS
+0xDF	0x2017	#	DOUBLE LOW LINE
+0xE0	0x05D0	#	HEBREW LETTER ALEF
+0xE1	0x05D1	#	HEBREW LETTER BET
+0xE2	0x05D2	#	HEBREW LETTER GIMEL
+0xE3	0x05D3	#	HEBREW LETTER DALET
+0xE4	0x05D4	#	HEBREW LETTER HE
+0xE5	0x05D5	#	HEBREW LETTER VAV
+0xE6	0x05D6	#	HEBREW LETTER ZAYIN
+0xE7	0x05D7	#	HEBREW LETTER HET
+0xE8	0x05D8	#	HEBREW LETTER TET
+0xE9	0x05D9	#	HEBREW LETTER YOD
+0xEA	0x05DA	#	HEBREW LETTER FINAL KAF
+0xEB	0x05DB	#	HEBREW LETTER KAF
+0xEC	0x05DC	#	HEBREW LETTER LAMED
+0xED	0x05DD	#	HEBREW LETTER FINAL MEM
+0xEE	0x05DE	#	HEBREW LETTER MEM
+0xEF	0x05DF	#	HEBREW LETTER FINAL NUN
+0xF0	0x05E0	#	HEBREW LETTER NUN
+0xF1	0x05E1	#	HEBREW LETTER SAMEKH
+0xF2	0x05E2	#	HEBREW LETTER AYIN
+0xF3	0x05E3	#	HEBREW LETTER FINAL PE
+0xF4	0x05E4	#	HEBREW LETTER PE
+0xF5	0x05E5	#	HEBREW LETTER FINAL TSADI
+0xF6	0x05E6	#	HEBREW LETTER TSADI
+0xF7	0x05E7	#	HEBREW LETTER QOF
+0xF8	0x05E8	#	HEBREW LETTER RESH
+0xF9	0x05E9	#	HEBREW LETTER SHIN
+0xFA	0x05EA	#	HEBREW LETTER TAV
+0xFD	0x200E	#	LEFT-TO-RIGHT MARK
+0xFE	0x200F	#	RIGHT-TO-LEFT MARK
+
diff --git a/lib/ucmaps/8859-9.txt b/lib/ucmaps/8859-9.txt
new file mode 100644
index 000000000..22901f107
--- /dev/null
+++ b/lib/ucmaps/8859-9.txt
@@ -0,0 +1,307 @@
+#
+#	Name:             ISO/IEC 8859-9:1999 to Unicode
+#	Unicode version:  3.0
+#	Table version:    1.0
+#	Table format:     Format A
+#	Date:             1999 July 27
+#	Authors:          Ken Whistler <kenw@sybase.com>
+#
+#	Copyright (c) 1991-1999 Unicode, Inc.  All Rights reserved.
+#
+#	This file is provided as-is by Unicode, Inc. (The Unicode Consortium).
+#	No claims are made as to fitness for any particular purpose.  No
+#	warranties of any kind are expressed or implied.  The recipient
+#	agrees to determine applicability of information provided.  If this
+#	file has been provided on magnetic media by Unicode, Inc., the sole
+#	remedy for any claim will be exchange of defective media within 90
+#	days of receipt.
+#
+#	Unicode, Inc. hereby grants the right to freely use the information
+#	supplied in this file in the creation of products supporting the
+#	Unicode Standard, and to make copies of this file in any form for
+#	internal or external distribution as long as this notice remains
+#	attached.
+#
+#	General notes:
+#
+#	This table contains the data the Unicode Consortium has on how
+#       ISO/IEC 8859-9:1999 characters map into Unicode.
+#
+#	Format:  Three tab-separated columns
+#		 Column #1 is the ISO/IEC 8859-9 code (in hex as 0xXX)
+#		 Column #2 is the Unicode (in hex as 0xXXXX)
+#		 Column #3 the Unicode name (follows a comment sign, '#')
+#
+#	The entries are in ISO/IEC 8859-9 order.
+#
+#	ISO/IEC 8859-9 is also equivalent to ISO-IR-148.
+#
+#	Version history
+#	1.0 version updates 0.1 version by adding mappings for all
+#	control characters.
+#
+#	Updated versions of this file may be found in:
+#		<ftp://ftp.unicode.org/Public/MAPPINGS/>
+#
+#	Any comments or problems, contact <errata@unicode.org>
+#	Please note that <errata@unicode.org> is an archival address;
+#	notices will be checked, but do not expect an immediate response.
+#
+0x00	0x0000	#	NULL
+0x01	0x0001	#	START OF HEADING
+0x02	0x0002	#	START OF TEXT
+0x03	0x0003	#	END OF TEXT
+0x04	0x0004	#	END OF TRANSMISSION
+0x05	0x0005	#	ENQUIRY
+0x06	0x0006	#	ACKNOWLEDGE
+0x07	0x0007	#	BELL
+0x08	0x0008	#	BACKSPACE
+0x09	0x0009	#	HORIZONTAL TABULATION
+0x0A	0x000A	#	LINE FEED
+0x0B	0x000B	#	VERTICAL TABULATION
+0x0C	0x000C	#	FORM FEED
+0x0D	0x000D	#	CARRIAGE RETURN
+0x0E	0x000E	#	SHIFT OUT
+0x0F	0x000F	#	SHIFT IN
+0x10	0x0010	#	DATA LINK ESCAPE
+0x11	0x0011	#	DEVICE CONTROL ONE
+0x12	0x0012	#	DEVICE CONTROL TWO
+0x13	0x0013	#	DEVICE CONTROL THREE
+0x14	0x0014	#	DEVICE CONTROL FOUR
+0x15	0x0015	#	NEGATIVE ACKNOWLEDGE
+0x16	0x0016	#	SYNCHRONOUS IDLE
+0x17	0x0017	#	END OF TRANSMISSION BLOCK
+0x18	0x0018	#	CANCEL
+0x19	0x0019	#	END OF MEDIUM
+0x1A	0x001A	#	SUBSTITUTE
+0x1B	0x001B	#	ESCAPE
+0x1C	0x001C	#	FILE SEPARATOR
+0x1D	0x001D	#	GROUP SEPARATOR
+0x1E	0x001E	#	RECORD SEPARATOR
+0x1F	0x001F	#	UNIT SEPARATOR
+0x20	0x0020	#	SPACE
+0x21	0x0021	#	EXCLAMATION MARK
+0x22	0x0022	#	QUOTATION MARK
+0x23	0x0023	#	NUMBER SIGN
+0x24	0x0024	#	DOLLAR SIGN
+0x25	0x0025	#	PERCENT SIGN
+0x26	0x0026	#	AMPERSAND
+0x27	0x0027	#	APOSTROPHE
+0x28	0x0028	#	LEFT PARENTHESIS
+0x29	0x0029	#	RIGHT PARENTHESIS
+0x2A	0x002A	#	ASTERISK
+0x2B	0x002B	#	PLUS SIGN
+0x2C	0x002C	#	COMMA
+0x2D	0x002D	#	HYPHEN-MINUS
+0x2E	0x002E	#	FULL STOP
+0x2F	0x002F	#	SOLIDUS
+0x30	0x0030	#	DIGIT ZERO
+0x31	0x0031	#	DIGIT ONE
+0x32	0x0032	#	DIGIT TWO
+0x33	0x0033	#	DIGIT THREE
+0x34	0x0034	#	DIGIT FOUR
+0x35	0x0035	#	DIGIT FIVE
+0x36	0x0036	#	DIGIT SIX
+0x37	0x0037	#	DIGIT SEVEN
+0x38	0x0038	#	DIGIT EIGHT
+0x39	0x0039	#	DIGIT NINE
+0x3A	0x003A	#	COLON
+0x3B	0x003B	#	SEMICOLON
+0x3C	0x003C	#	LESS-THAN SIGN
+0x3D	0x003D	#	EQUALS SIGN
+0x3E	0x003E	#	GREATER-THAN SIGN
+0x3F	0x003F	#	QUESTION MARK
+0x40	0x0040	#	COMMERCIAL AT
+0x41	0x0041	#	LATIN CAPITAL LETTER A
+0x42	0x0042	#	LATIN CAPITAL LETTER B
+0x43	0x0043	#	LATIN CAPITAL LETTER C
+0x44	0x0044	#	LATIN CAPITAL LETTER D
+0x45	0x0045	#	LATIN CAPITAL LETTER E
+0x46	0x0046	#	LATIN CAPITAL LETTER F
+0x47	0x0047	#	LATIN CAPITAL LETTER G
+0x48	0x0048	#	LATIN CAPITAL LETTER H
+0x49	0x0049	#	LATIN CAPITAL LETTER I
+0x4A	0x004A	#	LATIN CAPITAL LETTER J
+0x4B	0x004B	#	LATIN CAPITAL LETTER K
+0x4C	0x004C	#	LATIN CAPITAL LETTER L
+0x4D	0x004D	#	LATIN CAPITAL LETTER M
+0x4E	0x004E	#	LATIN CAPITAL LETTER N
+0x4F	0x004F	#	LATIN CAPITAL LETTER O
+0x50	0x0050	#	LATIN CAPITAL LETTER P
+0x51	0x0051	#	LATIN CAPITAL LETTER Q
+0x52	0x0052	#	LATIN CAPITAL LETTER R
+0x53	0x0053	#	LATIN CAPITAL LETTER S
+0x54	0x0054	#	LATIN CAPITAL LETTER T
+0x55	0x0055	#	LATIN CAPITAL LETTER U
+0x56	0x0056	#	LATIN CAPITAL LETTER V
+0x57	0x0057	#	LATIN CAPITAL LETTER W
+0x58	0x0058	#	LATIN CAPITAL LETTER X
+0x59	0x0059	#	LATIN CAPITAL LETTER Y
+0x5A	0x005A	#	LATIN CAPITAL LETTER Z
+0x5B	0x005B	#	LEFT SQUARE BRACKET
+0x5C	0x005C	#	REVERSE SOLIDUS
+0x5D	0x005D	#	RIGHT SQUARE BRACKET
+0x5E	0x005E	#	CIRCUMFLEX ACCENT
+0x5F	0x005F	#	LOW LINE
+0x60	0x0060	#	GRAVE ACCENT
+0x61	0x0061	#	LATIN SMALL LETTER A
+0x62	0x0062	#	LATIN SMALL LETTER B
+0x63	0x0063	#	LATIN SMALL LETTER C
+0x64	0x0064	#	LATIN SMALL LETTER D
+0x65	0x0065	#	LATIN SMALL LETTER E
+0x66	0x0066	#	LATIN SMALL LETTER F
+0x67	0x0067	#	LATIN SMALL LETTER G
+0x68	0x0068	#	LATIN SMALL LETTER H
+0x69	0x0069	#	LATIN SMALL LETTER I
+0x6A	0x006A	#	LATIN SMALL LETTER J
+0x6B	0x006B	#	LATIN SMALL LETTER K
+0x6C	0x006C	#	LATIN SMALL LETTER L
+0x6D	0x006D	#	LATIN SMALL LETTER M
+0x6E	0x006E	#	LATIN SMALL LETTER N
+0x6F	0x006F	#	LATIN SMALL LETTER O
+0x70	0x0070	#	LATIN SMALL LETTER P
+0x71	0x0071	#	LATIN SMALL LETTER Q
+0x72	0x0072	#	LATIN SMALL LETTER R
+0x73	0x0073	#	LATIN SMALL LETTER S
+0x74	0x0074	#	LATIN SMALL LETTER T
+0x75	0x0075	#	LATIN SMALL LETTER U
+0x76	0x0076	#	LATIN SMALL LETTER V
+0x77	0x0077	#	LATIN SMALL LETTER W
+0x78	0x0078	#	LATIN SMALL LETTER X
+0x79	0x0079	#	LATIN SMALL LETTER Y
+0x7A	0x007A	#	LATIN SMALL LETTER Z
+0x7B	0x007B	#	LEFT CURLY BRACKET
+0x7C	0x007C	#	VERTICAL LINE
+0x7D	0x007D	#	RIGHT CURLY BRACKET
+0x7E	0x007E	#	TILDE
+0x7F	0x007F	#	DELETE
+0x80	0x0080	#	<control>
+0x81	0x0081	#	<control>
+0x82	0x0082	#	<control>
+0x83	0x0083	#	<control>
+0x84	0x0084	#	<control>
+0x85	0x0085	#	<control>
+0x86	0x0086	#	<control>
+0x87	0x0087	#	<control>
+0x88	0x0088	#	<control>
+0x89	0x0089	#	<control>
+0x8A	0x008A	#	<control>
+0x8B	0x008B	#	<control>
+0x8C	0x008C	#	<control>
+0x8D	0x008D	#	<control>
+0x8E	0x008E	#	<control>
+0x8F	0x008F	#	<control>
+0x90	0x0090	#	<control>
+0x91	0x0091	#	<control>
+0x92	0x0092	#	<control>
+0x93	0x0093	#	<control>
+0x94	0x0094	#	<control>
+0x95	0x0095	#	<control>
+0x96	0x0096	#	<control>
+0x97	0x0097	#	<control>
+0x98	0x0098	#	<control>
+0x99	0x0099	#	<control>
+0x9A	0x009A	#	<control>
+0x9B	0x009B	#	<control>
+0x9C	0x009C	#	<control>
+0x9D	0x009D	#	<control>
+0x9E	0x009E	#	<control>
+0x9F	0x009F	#	<control>
+0xA0	0x00A0	#	NO-BREAK SPACE
+0xA1	0x00A1	#	INVERTED EXCLAMATION MARK
+0xA2	0x00A2	#	CENT SIGN
+0xA3	0x00A3	#	POUND SIGN
+0xA4	0x00A4	#	CURRENCY SIGN
+0xA5	0x00A5	#	YEN SIGN
+0xA6	0x00A6	#	BROKEN BAR
+0xA7	0x00A7	#	SECTION SIGN
+0xA8	0x00A8	#	DIAERESIS
+0xA9	0x00A9	#	COPYRIGHT SIGN
+0xAA	0x00AA	#	FEMININE ORDINAL INDICATOR
+0xAB	0x00AB	#	LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xAC	0x00AC	#	NOT SIGN
+0xAD	0x00AD	#	SOFT HYPHEN
+0xAE	0x00AE	#	REGISTERED SIGN
+0xAF	0x00AF	#	MACRON
+0xB0	0x00B0	#	DEGREE SIGN
+0xB1	0x00B1	#	PLUS-MINUS SIGN
+0xB2	0x00B2	#	SUPERSCRIPT TWO
+0xB3	0x00B3	#	SUPERSCRIPT THREE
+0xB4	0x00B4	#	ACUTE ACCENT
+0xB5	0x00B5	#	MICRO SIGN
+0xB6	0x00B6	#	PILCROW SIGN
+0xB7	0x00B7	#	MIDDLE DOT
+0xB8	0x00B8	#	CEDILLA
+0xB9	0x00B9	#	SUPERSCRIPT ONE
+0xBA	0x00BA	#	MASCULINE ORDINAL INDICATOR
+0xBB	0x00BB	#	RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xBC	0x00BC	#	VULGAR FRACTION ONE QUARTER
+0xBD	0x00BD	#	VULGAR FRACTION ONE HALF
+0xBE	0x00BE	#	VULGAR FRACTION THREE QUARTERS
+0xBF	0x00BF	#	INVERTED QUESTION MARK
+0xC0	0x00C0	#	LATIN CAPITAL LETTER A WITH GRAVE
+0xC1	0x00C1	#	LATIN CAPITAL LETTER A WITH ACUTE
+0xC2	0x00C2	#	LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+0xC3	0x00C3	#	LATIN CAPITAL LETTER A WITH TILDE
+0xC4	0x00C4	#	LATIN CAPITAL LETTER A WITH DIAERESIS
+0xC5	0x00C5	#	LATIN CAPITAL LETTER A WITH RING ABOVE
+0xC6	0x00C6	#	LATIN CAPITAL LETTER AE
+0xC7	0x00C7	#	LATIN CAPITAL LETTER C WITH CEDILLA
+0xC8	0x00C8	#	LATIN CAPITAL LETTER E WITH GRAVE
+0xC9	0x00C9	#	LATIN CAPITAL LETTER E WITH ACUTE
+0xCA	0x00CA	#	LATIN CAPITAL LETTER E WITH CIRCUMFLEX
+0xCB	0x00CB	#	LATIN CAPITAL LETTER E WITH DIAERESIS
+0xCC	0x00CC	#	LATIN CAPITAL LETTER I WITH GRAVE
+0xCD	0x00CD	#	LATIN CAPITAL LETTER I WITH ACUTE
+0xCE	0x00CE	#	LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+0xCF	0x00CF	#	LATIN CAPITAL LETTER I WITH DIAERESIS
+0xD0	0x011E	#	LATIN CAPITAL LETTER G WITH BREVE
+0xD1	0x00D1	#	LATIN CAPITAL LETTER N WITH TILDE
+0xD2	0x00D2	#	LATIN CAPITAL LETTER O WITH GRAVE
+0xD3	0x00D3	#	LATIN CAPITAL LETTER O WITH ACUTE
+0xD4	0x00D4	#	LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+0xD5	0x00D5	#	LATIN CAPITAL LETTER O WITH TILDE
+0xD6	0x00D6	#	LATIN CAPITAL LETTER O WITH DIAERESIS
+0xD7	0x00D7	#	MULTIPLICATION SIGN
+0xD8	0x00D8	#	LATIN CAPITAL LETTER O WITH STROKE
+0xD9	0x00D9	#	LATIN CAPITAL LETTER U WITH GRAVE
+0xDA	0x00DA	#	LATIN CAPITAL LETTER U WITH ACUTE
+0xDB	0x00DB	#	LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+0xDC	0x00DC	#	LATIN CAPITAL LETTER U WITH DIAERESIS
+0xDD	0x0130	#	LATIN CAPITAL LETTER I WITH DOT ABOVE
+0xDE	0x015E	#	LATIN CAPITAL LETTER S WITH CEDILLA
+0xDF	0x00DF	#	LATIN SMALL LETTER SHARP S
+0xE0	0x00E0	#	LATIN SMALL LETTER A WITH GRAVE
+0xE1	0x00E1	#	LATIN SMALL LETTER A WITH ACUTE
+0xE2	0x00E2	#	LATIN SMALL LETTER A WITH CIRCUMFLEX
+0xE3	0x00E3	#	LATIN SMALL LETTER A WITH TILDE
+0xE4	0x00E4	#	LATIN SMALL LETTER A WITH DIAERESIS
+0xE5	0x00E5	#	LATIN SMALL LETTER A WITH RING ABOVE
+0xE6	0x00E6	#	LATIN SMALL LETTER AE
+0xE7	0x00E7	#	LATIN SMALL LETTER C WITH CEDILLA
+0xE8	0x00E8	#	LATIN SMALL LETTER E WITH GRAVE
+0xE9	0x00E9	#	LATIN SMALL LETTER E WITH ACUTE
+0xEA	0x00EA	#	LATIN SMALL LETTER E WITH CIRCUMFLEX
+0xEB	0x00EB	#	LATIN SMALL LETTER E WITH DIAERESIS
+0xEC	0x00EC	#	LATIN SMALL LETTER I WITH GRAVE
+0xED	0x00ED	#	LATIN SMALL LETTER I WITH ACUTE
+0xEE	0x00EE	#	LATIN SMALL LETTER I WITH CIRCUMFLEX
+0xEF	0x00EF	#	LATIN SMALL LETTER I WITH DIAERESIS
+0xF0	0x011F	#	LATIN SMALL LETTER G WITH BREVE
+0xF1	0x00F1	#	LATIN SMALL LETTER N WITH TILDE
+0xF2	0x00F2	#	LATIN SMALL LETTER O WITH GRAVE
+0xF3	0x00F3	#	LATIN SMALL LETTER O WITH ACUTE
+0xF4	0x00F4	#	LATIN SMALL LETTER O WITH CIRCUMFLEX
+0xF5	0x00F5	#	LATIN SMALL LETTER O WITH TILDE
+0xF6	0x00F6	#	LATIN SMALL LETTER O WITH DIAERESIS
+0xF7	0x00F7	#	DIVISION SIGN
+0xF8	0x00F8	#	LATIN SMALL LETTER O WITH STROKE
+0xF9	0x00F9	#	LATIN SMALL LETTER U WITH GRAVE
+0xFA	0x00FA	#	LATIN SMALL LETTER U WITH ACUTE
+0xFB	0x00FB	#	LATIN SMALL LETTER U WITH CIRCUMFLEX
+0xFC	0x00FC	#	LATIN SMALL LETTER U WITH DIAERESIS
+0xFD	0x0131	#	LATIN SMALL LETTER DOTLESS I
+0xFE	0x015F	#	LATIN SMALL LETTER S WITH CEDILLA
+0xFF	0x00FF	#	LATIN SMALL LETTER Y WITH DIAERESIS
+
+
diff --git a/lib/ucmaps/cp1250.txt b/lib/ucmaps/cp1250.txt
new file mode 100644
index 000000000..081d7763b
--- /dev/null
+++ b/lib/ucmaps/cp1250.txt
@@ -0,0 +1,274 @@
+#
+#    Name:     cp1250 to Unicode table
+#    Unicode version: 2.0
+#    Table version: 2.01
+#    Table format:  Format A
+#    Date:          04/15/98
+#
+#    Contact:       cpxlate@microsoft.com
+#
+#    General notes: none
+#
+#    Format: Three tab-separated columns
+#        Column #1 is the cp1250 code (in hex)
+#        Column #2 is the Unicode (in hex as 0xXXXX)
+#        Column #3 is the Unicode name (follows a comment sign, '#')
+#
+#    The entries are in cp1250 order
+#
+0x00	0x0000	#NULL
+0x01	0x0001	#START OF HEADING
+0x02	0x0002	#START OF TEXT
+0x03	0x0003	#END OF TEXT
+0x04	0x0004	#END OF TRANSMISSION
+0x05	0x0005	#ENQUIRY
+0x06	0x0006	#ACKNOWLEDGE
+0x07	0x0007	#BELL
+0x08	0x0008	#BACKSPACE
+0x09	0x0009	#HORIZONTAL TABULATION
+0x0A	0x000A	#LINE FEED
+0x0B	0x000B	#VERTICAL TABULATION
+0x0C	0x000C	#FORM FEED
+0x0D	0x000D	#CARRIAGE RETURN
+0x0E	0x000E	#SHIFT OUT
+0x0F	0x000F	#SHIFT IN
+0x10	0x0010	#DATA LINK ESCAPE
+0x11	0x0011	#DEVICE CONTROL ONE
+0x12	0x0012	#DEVICE CONTROL TWO
+0x13	0x0013	#DEVICE CONTROL THREE
+0x14	0x0014	#DEVICE CONTROL FOUR
+0x15	0x0015	#NEGATIVE ACKNOWLEDGE
+0x16	0x0016	#SYNCHRONOUS IDLE
+0x17	0x0017	#END OF TRANSMISSION BLOCK
+0x18	0x0018	#CANCEL
+0x19	0x0019	#END OF MEDIUM
+0x1A	0x001A	#SUBSTITUTE
+0x1B	0x001B	#ESCAPE
+0x1C	0x001C	#FILE SEPARATOR
+0x1D	0x001D	#GROUP SEPARATOR
+0x1E	0x001E	#RECORD SEPARATOR
+0x1F	0x001F	#UNIT SEPARATOR
+0x20	0x0020	#SPACE
+0x21	0x0021	#EXCLAMATION MARK
+0x22	0x0022	#QUOTATION MARK
+0x23	0x0023	#NUMBER SIGN
+0x24	0x0024	#DOLLAR SIGN
+0x25	0x0025	#PERCENT SIGN
+0x26	0x0026	#AMPERSAND
+0x27	0x0027	#APOSTROPHE
+0x28	0x0028	#LEFT PARENTHESIS
+0x29	0x0029	#RIGHT PARENTHESIS
+0x2A	0x002A	#ASTERISK
+0x2B	0x002B	#PLUS SIGN
+0x2C	0x002C	#COMMA
+0x2D	0x002D	#HYPHEN-MINUS
+0x2E	0x002E	#FULL STOP
+0x2F	0x002F	#SOLIDUS
+0x30	0x0030	#DIGIT ZERO
+0x31	0x0031	#DIGIT ONE
+0x32	0x0032	#DIGIT TWO
+0x33	0x0033	#DIGIT THREE
+0x34	0x0034	#DIGIT FOUR
+0x35	0x0035	#DIGIT FIVE
+0x36	0x0036	#DIGIT SIX
+0x37	0x0037	#DIGIT SEVEN
+0x38	0x0038	#DIGIT EIGHT
+0x39	0x0039	#DIGIT NINE
+0x3A	0x003A	#COLON
+0x3B	0x003B	#SEMICOLON
+0x3C	0x003C	#LESS-THAN SIGN
+0x3D	0x003D	#EQUALS SIGN
+0x3E	0x003E	#GREATER-THAN SIGN
+0x3F	0x003F	#QUESTION MARK
+0x40	0x0040	#COMMERCIAL AT
+0x41	0x0041	#LATIN CAPITAL LETTER A
+0x42	0x0042	#LATIN CAPITAL LETTER B
+0x43	0x0043	#LATIN CAPITAL LETTER C
+0x44	0x0044	#LATIN CAPITAL LETTER D
+0x45	0x0045	#LATIN CAPITAL LETTER E
+0x46	0x0046	#LATIN CAPITAL LETTER F
+0x47	0x0047	#LATIN CAPITAL LETTER G
+0x48	0x0048	#LATIN CAPITAL LETTER H
+0x49	0x0049	#LATIN CAPITAL LETTER I
+0x4A	0x004A	#LATIN CAPITAL LETTER J
+0x4B	0x004B	#LATIN CAPITAL LETTER K
+0x4C	0x004C	#LATIN CAPITAL LETTER L
+0x4D	0x004D	#LATIN CAPITAL LETTER M
+0x4E	0x004E	#LATIN CAPITAL LETTER N
+0x4F	0x004F	#LATIN CAPITAL LETTER O
+0x50	0x0050	#LATIN CAPITAL LETTER P
+0x51	0x0051	#LATIN CAPITAL LETTER Q
+0x52	0x0052	#LATIN CAPITAL LETTER R
+0x53	0x0053	#LATIN CAPITAL LETTER S
+0x54	0x0054	#LATIN CAPITAL LETTER T
+0x55	0x0055	#LATIN CAPITAL LETTER U
+0x56	0x0056	#LATIN CAPITAL LETTER V
+0x57	0x0057	#LATIN CAPITAL LETTER W
+0x58	0x0058	#LATIN CAPITAL LETTER X
+0x59	0x0059	#LATIN CAPITAL LETTER Y
+0x5A	0x005A	#LATIN CAPITAL LETTER Z
+0x5B	0x005B	#LEFT SQUARE BRACKET
+0x5C	0x005C	#REVERSE SOLIDUS
+0x5D	0x005D	#RIGHT SQUARE BRACKET
+0x5E	0x005E	#CIRCUMFLEX ACCENT
+0x5F	0x005F	#LOW LINE
+0x60	0x0060	#GRAVE ACCENT
+0x61	0x0061	#LATIN SMALL LETTER A
+0x62	0x0062	#LATIN SMALL LETTER B
+0x63	0x0063	#LATIN SMALL LETTER C
+0x64	0x0064	#LATIN SMALL LETTER D
+0x65	0x0065	#LATIN SMALL LETTER E
+0x66	0x0066	#LATIN SMALL LETTER F
+0x67	0x0067	#LATIN SMALL LETTER G
+0x68	0x0068	#LATIN SMALL LETTER H
+0x69	0x0069	#LATIN SMALL LETTER I
+0x6A	0x006A	#LATIN SMALL LETTER J
+0x6B	0x006B	#LATIN SMALL LETTER K
+0x6C	0x006C	#LATIN SMALL LETTER L
+0x6D	0x006D	#LATIN SMALL LETTER M
+0x6E	0x006E	#LATIN SMALL LETTER N
+0x6F	0x006F	#LATIN SMALL LETTER O
+0x70	0x0070	#LATIN SMALL LETTER P
+0x71	0x0071	#LATIN SMALL LETTER Q
+0x72	0x0072	#LATIN SMALL LETTER R
+0x73	0x0073	#LATIN SMALL LETTER S
+0x74	0x0074	#LATIN SMALL LETTER T
+0x75	0x0075	#LATIN SMALL LETTER U
+0x76	0x0076	#LATIN SMALL LETTER V
+0x77	0x0077	#LATIN SMALL LETTER W
+0x78	0x0078	#LATIN SMALL LETTER X
+0x79	0x0079	#LATIN SMALL LETTER Y
+0x7A	0x007A	#LATIN SMALL LETTER Z
+0x7B	0x007B	#LEFT CURLY BRACKET
+0x7C	0x007C	#VERTICAL LINE
+0x7D	0x007D	#RIGHT CURLY BRACKET
+0x7E	0x007E	#TILDE
+0x7F	0x007F	#DELETE
+0x80	0x20AC	#EURO SIGN
+0x81	      	#UNDEFINED
+0x82	0x201A	#SINGLE LOW-9 QUOTATION MARK
+0x83	      	#UNDEFINED
+0x84	0x201E	#DOUBLE LOW-9 QUOTATION MARK
+0x85	0x2026	#HORIZONTAL ELLIPSIS
+0x86	0x2020	#DAGGER
+0x87	0x2021	#DOUBLE DAGGER
+0x88	      	#UNDEFINED
+0x89	0x2030	#PER MILLE SIGN
+0x8A	0x0160	#LATIN CAPITAL LETTER S WITH CARON
+0x8B	0x2039	#SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+0x8C	0x015A	#LATIN CAPITAL LETTER S WITH ACUTE
+0x8D	0x0164	#LATIN CAPITAL LETTER T WITH CARON
+0x8E	0x017D	#LATIN CAPITAL LETTER Z WITH CARON
+0x8F	0x0179	#LATIN CAPITAL LETTER Z WITH ACUTE
+0x90	      	#UNDEFINED
+0x91	0x2018	#LEFT SINGLE QUOTATION MARK
+0x92	0x2019	#RIGHT SINGLE QUOTATION MARK
+0x93	0x201C	#LEFT DOUBLE QUOTATION MARK
+0x94	0x201D	#RIGHT DOUBLE QUOTATION MARK
+0x95	0x2022	#BULLET
+0x96	0x2013	#EN DASH
+0x97	0x2014	#EM DASH
+0x98	      	#UNDEFINED
+0x99	0x2122	#TRADE MARK SIGN
+0x9A	0x0161	#LATIN SMALL LETTER S WITH CARON
+0x9B	0x203A	#SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+0x9C	0x015B	#LATIN SMALL LETTER S WITH ACUTE
+0x9D	0x0165	#LATIN SMALL LETTER T WITH CARON
+0x9E	0x017E	#LATIN SMALL LETTER Z WITH CARON
+0x9F	0x017A	#LATIN SMALL LETTER Z WITH ACUTE
+0xA0	0x00A0	#NO-BREAK SPACE
+0xA1	0x02C7	#CARON
+0xA2	0x02D8	#BREVE
+0xA3	0x0141	#LATIN CAPITAL LETTER L WITH STROKE
+0xA4	0x00A4	#CURRENCY SIGN
+0xA5	0x0104	#LATIN CAPITAL LETTER A WITH OGONEK
+0xA6	0x00A6	#BROKEN BAR
+0xA7	0x00A7	#SECTION SIGN
+0xA8	0x00A8	#DIAERESIS
+0xA9	0x00A9	#COPYRIGHT SIGN
+0xAA	0x015E	#LATIN CAPITAL LETTER S WITH CEDILLA
+0xAB	0x00AB	#LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xAC	0x00AC	#NOT SIGN
+0xAD	0x00AD	#SOFT HYPHEN
+0xAE	0x00AE	#REGISTERED SIGN
+0xAF	0x017B	#LATIN CAPITAL LETTER Z WITH DOT ABOVE
+0xB0	0x00B0	#DEGREE SIGN
+0xB1	0x00B1	#PLUS-MINUS SIGN
+0xB2	0x02DB	#OGONEK
+0xB3	0x0142	#LATIN SMALL LETTER L WITH STROKE
+0xB4	0x00B4	#ACUTE ACCENT
+0xB5	0x00B5	#MICRO SIGN
+0xB6	0x00B6	#PILCROW SIGN
+0xB7	0x00B7	#MIDDLE DOT
+0xB8	0x00B8	#CEDILLA
+0xB9	0x0105	#LATIN SMALL LETTER A WITH OGONEK
+0xBA	0x015F	#LATIN SMALL LETTER S WITH CEDILLA
+0xBB	0x00BB	#RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xBC	0x013D	#LATIN CAPITAL LETTER L WITH CARON
+0xBD	0x02DD	#DOUBLE ACUTE ACCENT
+0xBE	0x013E	#LATIN SMALL LETTER L WITH CARON
+0xBF	0x017C	#LATIN SMALL LETTER Z WITH DOT ABOVE
+0xC0	0x0154	#LATIN CAPITAL LETTER R WITH ACUTE
+0xC1	0x00C1	#LATIN CAPITAL LETTER A WITH ACUTE
+0xC2	0x00C2	#LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+0xC3	0x0102	#LATIN CAPITAL LETTER A WITH BREVE
+0xC4	0x00C4	#LATIN CAPITAL LETTER A WITH DIAERESIS
+0xC5	0x0139	#LATIN CAPITAL LETTER L WITH ACUTE
+0xC6	0x0106	#LATIN CAPITAL LETTER C WITH ACUTE
+0xC7	0x00C7	#LATIN CAPITAL LETTER C WITH CEDILLA
+0xC8	0x010C	#LATIN CAPITAL LETTER C WITH CARON
+0xC9	0x00C9	#LATIN CAPITAL LETTER E WITH ACUTE
+0xCA	0x0118	#LATIN CAPITAL LETTER E WITH OGONEK
+0xCB	0x00CB	#LATIN CAPITAL LETTER E WITH DIAERESIS
+0xCC	0x011A	#LATIN CAPITAL LETTER E WITH CARON
+0xCD	0x00CD	#LATIN CAPITAL LETTER I WITH ACUTE
+0xCE	0x00CE	#LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+0xCF	0x010E	#LATIN CAPITAL LETTER D WITH CARON
+0xD0	0x0110	#LATIN CAPITAL LETTER D WITH STROKE
+0xD1	0x0143	#LATIN CAPITAL LETTER N WITH ACUTE
+0xD2	0x0147	#LATIN CAPITAL LETTER N WITH CARON
+0xD3	0x00D3	#LATIN CAPITAL LETTER O WITH ACUTE
+0xD4	0x00D4	#LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+0xD5	0x0150	#LATIN CAPITAL LETTER O WITH DOUBLE ACUTE
+0xD6	0x00D6	#LATIN CAPITAL LETTER O WITH DIAERESIS
+0xD7	0x00D7	#MULTIPLICATION SIGN
+0xD8	0x0158	#LATIN CAPITAL LETTER R WITH CARON
+0xD9	0x016E	#LATIN CAPITAL LETTER U WITH RING ABOVE
+0xDA	0x00DA	#LATIN CAPITAL LETTER U WITH ACUTE
+0xDB	0x0170	#LATIN CAPITAL LETTER U WITH DOUBLE ACUTE
+0xDC	0x00DC	#LATIN CAPITAL LETTER U WITH DIAERESIS
+0xDD	0x00DD	#LATIN CAPITAL LETTER Y WITH ACUTE
+0xDE	0x0162	#LATIN CAPITAL LETTER T WITH CEDILLA
+0xDF	0x00DF	#LATIN SMALL LETTER SHARP S
+0xE0	0x0155	#LATIN SMALL LETTER R WITH ACUTE
+0xE1	0x00E1	#LATIN SMALL LETTER A WITH ACUTE
+0xE2	0x00E2	#LATIN SMALL LETTER A WITH CIRCUMFLEX
+0xE3	0x0103	#LATIN SMALL LETTER A WITH BREVE
+0xE4	0x00E4	#LATIN SMALL LETTER A WITH DIAERESIS
+0xE5	0x013A	#LATIN SMALL LETTER L WITH ACUTE
+0xE6	0x0107	#LATIN SMALL LETTER C WITH ACUTE
+0xE7	0x00E7	#LATIN SMALL LETTER C WITH CEDILLA
+0xE8	0x010D	#LATIN SMALL LETTER C WITH CARON
+0xE9	0x00E9	#LATIN SMALL LETTER E WITH ACUTE
+0xEA	0x0119	#LATIN SMALL LETTER E WITH OGONEK
+0xEB	0x00EB	#LATIN SMALL LETTER E WITH DIAERESIS
+0xEC	0x011B	#LATIN SMALL LETTER E WITH CARON
+0xED	0x00ED	#LATIN SMALL LETTER I WITH ACUTE
+0xEE	0x00EE	#LATIN SMALL LETTER I WITH CIRCUMFLEX
+0xEF	0x010F	#LATIN SMALL LETTER D WITH CARON
+0xF0	0x0111	#LATIN SMALL LETTER D WITH STROKE
+0xF1	0x0144	#LATIN SMALL LETTER N WITH ACUTE
+0xF2	0x0148	#LATIN SMALL LETTER N WITH CARON
+0xF3	0x00F3	#LATIN SMALL LETTER O WITH ACUTE
+0xF4	0x00F4	#LATIN SMALL LETTER O WITH CIRCUMFLEX
+0xF5	0x0151	#LATIN SMALL LETTER O WITH DOUBLE ACUTE
+0xF6	0x00F6	#LATIN SMALL LETTER O WITH DIAERESIS
+0xF7	0x00F7	#DIVISION SIGN
+0xF8	0x0159	#LATIN SMALL LETTER R WITH CARON
+0xF9	0x016F	#LATIN SMALL LETTER U WITH RING ABOVE
+0xFA	0x00FA	#LATIN SMALL LETTER U WITH ACUTE
+0xFB	0x0171	#LATIN SMALL LETTER U WITH DOUBLE ACUTE
+0xFC	0x00FC	#LATIN SMALL LETTER U WITH DIAERESIS
+0xFD	0x00FD	#LATIN SMALL LETTER Y WITH ACUTE
+0xFE	0x0163	#LATIN SMALL LETTER T WITH CEDILLA
+0xFF	0x02D9	#DOT ABOVE
diff --git a/lib/ucmaps/cp1251.txt b/lib/ucmaps/cp1251.txt
new file mode 100644
index 000000000..37eadbdbc
--- /dev/null
+++ b/lib/ucmaps/cp1251.txt
@@ -0,0 +1,274 @@
+#
+#    Name:     cp1251 to Unicode table
+#    Unicode version: 2.0
+#    Table version: 2.01
+#    Table format:  Format A
+#    Date:          04/15/98
+#
+#    Contact:       cpxlate@microsoft.com
+#
+#    General notes: none
+#
+#    Format: Three tab-separated columns
+#        Column #1 is the cp1251 code (in hex)
+#        Column #2 is the Unicode (in hex as 0xXXXX)
+#        Column #3 is the Unicode name (follows a comment sign, '#')
+#
+#    The entries are in cp1251 order
+#
+0x00	0x0000	#NULL
+0x01	0x0001	#START OF HEADING
+0x02	0x0002	#START OF TEXT
+0x03	0x0003	#END OF TEXT
+0x04	0x0004	#END OF TRANSMISSION
+0x05	0x0005	#ENQUIRY
+0x06	0x0006	#ACKNOWLEDGE
+0x07	0x0007	#BELL
+0x08	0x0008	#BACKSPACE
+0x09	0x0009	#HORIZONTAL TABULATION
+0x0A	0x000A	#LINE FEED
+0x0B	0x000B	#VERTICAL TABULATION
+0x0C	0x000C	#FORM FEED
+0x0D	0x000D	#CARRIAGE RETURN
+0x0E	0x000E	#SHIFT OUT
+0x0F	0x000F	#SHIFT IN
+0x10	0x0010	#DATA LINK ESCAPE
+0x11	0x0011	#DEVICE CONTROL ONE
+0x12	0x0012	#DEVICE CONTROL TWO
+0x13	0x0013	#DEVICE CONTROL THREE
+0x14	0x0014	#DEVICE CONTROL FOUR
+0x15	0x0015	#NEGATIVE ACKNOWLEDGE
+0x16	0x0016	#SYNCHRONOUS IDLE
+0x17	0x0017	#END OF TRANSMISSION BLOCK
+0x18	0x0018	#CANCEL
+0x19	0x0019	#END OF MEDIUM
+0x1A	0x001A	#SUBSTITUTE
+0x1B	0x001B	#ESCAPE
+0x1C	0x001C	#FILE SEPARATOR
+0x1D	0x001D	#GROUP SEPARATOR
+0x1E	0x001E	#RECORD SEPARATOR
+0x1F	0x001F	#UNIT SEPARATOR
+0x20	0x0020	#SPACE
+0x21	0x0021	#EXCLAMATION MARK
+0x22	0x0022	#QUOTATION MARK
+0x23	0x0023	#NUMBER SIGN
+0x24	0x0024	#DOLLAR SIGN
+0x25	0x0025	#PERCENT SIGN
+0x26	0x0026	#AMPERSAND
+0x27	0x0027	#APOSTROPHE
+0x28	0x0028	#LEFT PARENTHESIS
+0x29	0x0029	#RIGHT PARENTHESIS
+0x2A	0x002A	#ASTERISK
+0x2B	0x002B	#PLUS SIGN
+0x2C	0x002C	#COMMA
+0x2D	0x002D	#HYPHEN-MINUS
+0x2E	0x002E	#FULL STOP
+0x2F	0x002F	#SOLIDUS
+0x30	0x0030	#DIGIT ZERO
+0x31	0x0031	#DIGIT ONE
+0x32	0x0032	#DIGIT TWO
+0x33	0x0033	#DIGIT THREE
+0x34	0x0034	#DIGIT FOUR
+0x35	0x0035	#DIGIT FIVE
+0x36	0x0036	#DIGIT SIX
+0x37	0x0037	#DIGIT SEVEN
+0x38	0x0038	#DIGIT EIGHT
+0x39	0x0039	#DIGIT NINE
+0x3A	0x003A	#COLON
+0x3B	0x003B	#SEMICOLON
+0x3C	0x003C	#LESS-THAN SIGN
+0x3D	0x003D	#EQUALS SIGN
+0x3E	0x003E	#GREATER-THAN SIGN
+0x3F	0x003F	#QUESTION MARK
+0x40	0x0040	#COMMERCIAL AT
+0x41	0x0041	#LATIN CAPITAL LETTER A
+0x42	0x0042	#LATIN CAPITAL LETTER B
+0x43	0x0043	#LATIN CAPITAL LETTER C
+0x44	0x0044	#LATIN CAPITAL LETTER D
+0x45	0x0045	#LATIN CAPITAL LETTER E
+0x46	0x0046	#LATIN CAPITAL LETTER F
+0x47	0x0047	#LATIN CAPITAL LETTER G
+0x48	0x0048	#LATIN CAPITAL LETTER H
+0x49	0x0049	#LATIN CAPITAL LETTER I
+0x4A	0x004A	#LATIN CAPITAL LETTER J
+0x4B	0x004B	#LATIN CAPITAL LETTER K
+0x4C	0x004C	#LATIN CAPITAL LETTER L
+0x4D	0x004D	#LATIN CAPITAL LETTER M
+0x4E	0x004E	#LATIN CAPITAL LETTER N
+0x4F	0x004F	#LATIN CAPITAL LETTER O
+0x50	0x0050	#LATIN CAPITAL LETTER P
+0x51	0x0051	#LATIN CAPITAL LETTER Q
+0x52	0x0052	#LATIN CAPITAL LETTER R
+0x53	0x0053	#LATIN CAPITAL LETTER S
+0x54	0x0054	#LATIN CAPITAL LETTER T
+0x55	0x0055	#LATIN CAPITAL LETTER U
+0x56	0x0056	#LATIN CAPITAL LETTER V
+0x57	0x0057	#LATIN CAPITAL LETTER W
+0x58	0x0058	#LATIN CAPITAL LETTER X
+0x59	0x0059	#LATIN CAPITAL LETTER Y
+0x5A	0x005A	#LATIN CAPITAL LETTER Z
+0x5B	0x005B	#LEFT SQUARE BRACKET
+0x5C	0x005C	#REVERSE SOLIDUS
+0x5D	0x005D	#RIGHT SQUARE BRACKET
+0x5E	0x005E	#CIRCUMFLEX ACCENT
+0x5F	0x005F	#LOW LINE
+0x60	0x0060	#GRAVE ACCENT
+0x61	0x0061	#LATIN SMALL LETTER A
+0x62	0x0062	#LATIN SMALL LETTER B
+0x63	0x0063	#LATIN SMALL LETTER C
+0x64	0x0064	#LATIN SMALL LETTER D
+0x65	0x0065	#LATIN SMALL LETTER E
+0x66	0x0066	#LATIN SMALL LETTER F
+0x67	0x0067	#LATIN SMALL LETTER G
+0x68	0x0068	#LATIN SMALL LETTER H
+0x69	0x0069	#LATIN SMALL LETTER I
+0x6A	0x006A	#LATIN SMALL LETTER J
+0x6B	0x006B	#LATIN SMALL LETTER K
+0x6C	0x006C	#LATIN SMALL LETTER L
+0x6D	0x006D	#LATIN SMALL LETTER M
+0x6E	0x006E	#LATIN SMALL LETTER N
+0x6F	0x006F	#LATIN SMALL LETTER O
+0x70	0x0070	#LATIN SMALL LETTER P
+0x71	0x0071	#LATIN SMALL LETTER Q
+0x72	0x0072	#LATIN SMALL LETTER R
+0x73	0x0073	#LATIN SMALL LETTER S
+0x74	0x0074	#LATIN SMALL LETTER T
+0x75	0x0075	#LATIN SMALL LETTER U
+0x76	0x0076	#LATIN SMALL LETTER V
+0x77	0x0077	#LATIN SMALL LETTER W
+0x78	0x0078	#LATIN SMALL LETTER X
+0x79	0x0079	#LATIN SMALL LETTER Y
+0x7A	0x007A	#LATIN SMALL LETTER Z
+0x7B	0x007B	#LEFT CURLY BRACKET
+0x7C	0x007C	#VERTICAL LINE
+0x7D	0x007D	#RIGHT CURLY BRACKET
+0x7E	0x007E	#TILDE
+0x7F	0x007F	#DELETE
+0x80	0x0402	#CYRILLIC CAPITAL LETTER DJE
+0x81	0x0403	#CYRILLIC CAPITAL LETTER GJE
+0x82	0x201A	#SINGLE LOW-9 QUOTATION MARK
+0x83	0x0453	#CYRILLIC SMALL LETTER GJE
+0x84	0x201E	#DOUBLE LOW-9 QUOTATION MARK
+0x85	0x2026	#HORIZONTAL ELLIPSIS
+0x86	0x2020	#DAGGER
+0x87	0x2021	#DOUBLE DAGGER
+0x88	0x20AC	#EURO SIGN
+0x89	0x2030	#PER MILLE SIGN
+0x8A	0x0409	#CYRILLIC CAPITAL LETTER LJE
+0x8B	0x2039	#SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+0x8C	0x040A	#CYRILLIC CAPITAL LETTER NJE
+0x8D	0x040C	#CYRILLIC CAPITAL LETTER KJE
+0x8E	0x040B	#CYRILLIC CAPITAL LETTER TSHE
+0x8F	0x040F	#CYRILLIC CAPITAL LETTER DZHE
+0x90	0x0452	#CYRILLIC SMALL LETTER DJE
+0x91	0x2018	#LEFT SINGLE QUOTATION MARK
+0x92	0x2019	#RIGHT SINGLE QUOTATION MARK
+0x93	0x201C	#LEFT DOUBLE QUOTATION MARK
+0x94	0x201D	#RIGHT DOUBLE QUOTATION MARK
+0x95	0x2022	#BULLET
+0x96	0x2013	#EN DASH
+0x97	0x2014	#EM DASH
+0x98	      	#UNDEFINED
+0x99	0x2122	#TRADE MARK SIGN
+0x9A	0x0459	#CYRILLIC SMALL LETTER LJE
+0x9B	0x203A	#SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+0x9C	0x045A	#CYRILLIC SMALL LETTER NJE
+0x9D	0x045C	#CYRILLIC SMALL LETTER KJE
+0x9E	0x045B	#CYRILLIC SMALL LETTER TSHE
+0x9F	0x045F	#CYRILLIC SMALL LETTER DZHE
+0xA0	0x00A0	#NO-BREAK SPACE
+0xA1	0x040E	#CYRILLIC CAPITAL LETTER SHORT U
+0xA2	0x045E	#CYRILLIC SMALL LETTER SHORT U
+0xA3	0x0408	#CYRILLIC CAPITAL LETTER JE
+0xA4	0x00A4	#CURRENCY SIGN
+0xA5	0x0490	#CYRILLIC CAPITAL LETTER GHE WITH UPTURN
+0xA6	0x00A6	#BROKEN BAR
+0xA7	0x00A7	#SECTION SIGN
+0xA8	0x0401	#CYRILLIC CAPITAL LETTER IO
+0xA9	0x00A9	#COPYRIGHT SIGN
+0xAA	0x0404	#CYRILLIC CAPITAL LETTER UKRAINIAN IE
+0xAB	0x00AB	#LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xAC	0x00AC	#NOT SIGN
+0xAD	0x00AD	#SOFT HYPHEN
+0xAE	0x00AE	#REGISTERED SIGN
+0xAF	0x0407	#CYRILLIC CAPITAL LETTER YI
+0xB0	0x00B0	#DEGREE SIGN
+0xB1	0x00B1	#PLUS-MINUS SIGN
+0xB2	0x0406	#CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I
+0xB3	0x0456	#CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
+0xB4	0x0491	#CYRILLIC SMALL LETTER GHE WITH UPTURN
+0xB5	0x00B5	#MICRO SIGN
+0xB6	0x00B6	#PILCROW SIGN
+0xB7	0x00B7	#MIDDLE DOT
+0xB8	0x0451	#CYRILLIC SMALL LETTER IO
+0xB9	0x2116	#NUMERO SIGN
+0xBA	0x0454	#CYRILLIC SMALL LETTER UKRAINIAN IE
+0xBB	0x00BB	#RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xBC	0x0458	#CYRILLIC SMALL LETTER JE
+0xBD	0x0405	#CYRILLIC CAPITAL LETTER DZE
+0xBE	0x0455	#CYRILLIC SMALL LETTER DZE
+0xBF	0x0457	#CYRILLIC SMALL LETTER YI
+0xC0	0x0410	#CYRILLIC CAPITAL LETTER A
+0xC1	0x0411	#CYRILLIC CAPITAL LETTER BE
+0xC2	0x0412	#CYRILLIC CAPITAL LETTER VE
+0xC3	0x0413	#CYRILLIC CAPITAL LETTER GHE
+0xC4	0x0414	#CYRILLIC CAPITAL LETTER DE
+0xC5	0x0415	#CYRILLIC CAPITAL LETTER IE
+0xC6	0x0416	#CYRILLIC CAPITAL LETTER ZHE
+0xC7	0x0417	#CYRILLIC CAPITAL LETTER ZE
+0xC8	0x0418	#CYRILLIC CAPITAL LETTER I
+0xC9	0x0419	#CYRILLIC CAPITAL LETTER SHORT I
+0xCA	0x041A	#CYRILLIC CAPITAL LETTER KA
+0xCB	0x041B	#CYRILLIC CAPITAL LETTER EL
+0xCC	0x041C	#CYRILLIC CAPITAL LETTER EM
+0xCD	0x041D	#CYRILLIC CAPITAL LETTER EN
+0xCE	0x041E	#CYRILLIC CAPITAL LETTER O
+0xCF	0x041F	#CYRILLIC CAPITAL LETTER PE
+0xD0	0x0420	#CYRILLIC CAPITAL LETTER ER
+0xD1	0x0421	#CYRILLIC CAPITAL LETTER ES
+0xD2	0x0422	#CYRILLIC CAPITAL LETTER TE
+0xD3	0x0423	#CYRILLIC CAPITAL LETTER U
+0xD4	0x0424	#CYRILLIC CAPITAL LETTER EF
+0xD5	0x0425	#CYRILLIC CAPITAL LETTER HA
+0xD6	0x0426	#CYRILLIC CAPITAL LETTER TSE
+0xD7	0x0427	#CYRILLIC CAPITAL LETTER CHE
+0xD8	0x0428	#CYRILLIC CAPITAL LETTER SHA
+0xD9	0x0429	#CYRILLIC CAPITAL LETTER SHCHA
+0xDA	0x042A	#CYRILLIC CAPITAL LETTER HARD SIGN
+0xDB	0x042B	#CYRILLIC CAPITAL LETTER YERU
+0xDC	0x042C	#CYRILLIC CAPITAL LETTER SOFT SIGN
+0xDD	0x042D	#CYRILLIC CAPITAL LETTER E
+0xDE	0x042E	#CYRILLIC CAPITAL LETTER YU
+0xDF	0x042F	#CYRILLIC CAPITAL LETTER YA
+0xE0	0x0430	#CYRILLIC SMALL LETTER A
+0xE1	0x0431	#CYRILLIC SMALL LETTER BE
+0xE2	0x0432	#CYRILLIC SMALL LETTER VE
+0xE3	0x0433	#CYRILLIC SMALL LETTER GHE
+0xE4	0x0434	#CYRILLIC SMALL LETTER DE
+0xE5	0x0435	#CYRILLIC SMALL LETTER IE
+0xE6	0x0436	#CYRILLIC SMALL LETTER ZHE
+0xE7	0x0437	#CYRILLIC SMALL LETTER ZE
+0xE8	0x0438	#CYRILLIC SMALL LETTER I
+0xE9	0x0439	#CYRILLIC SMALL LETTER SHORT I
+0xEA	0x043A	#CYRILLIC SMALL LETTER KA
+0xEB	0x043B	#CYRILLIC SMALL LETTER EL
+0xEC	0x043C	#CYRILLIC SMALL LETTER EM
+0xED	0x043D	#CYRILLIC SMALL LETTER EN
+0xEE	0x043E	#CYRILLIC SMALL LETTER O
+0xEF	0x043F	#CYRILLIC SMALL LETTER PE
+0xF0	0x0440	#CYRILLIC SMALL LETTER ER
+0xF1	0x0441	#CYRILLIC SMALL LETTER ES
+0xF2	0x0442	#CYRILLIC SMALL LETTER TE
+0xF3	0x0443	#CYRILLIC SMALL LETTER U
+0xF4	0x0444	#CYRILLIC SMALL LETTER EF
+0xF5	0x0445	#CYRILLIC SMALL LETTER HA
+0xF6	0x0446	#CYRILLIC SMALL LETTER TSE
+0xF7	0x0447	#CYRILLIC SMALL LETTER CHE
+0xF8	0x0448	#CYRILLIC SMALL LETTER SHA
+0xF9	0x0449	#CYRILLIC SMALL LETTER SHCHA
+0xFA	0x044A	#CYRILLIC SMALL LETTER HARD SIGN
+0xFB	0x044B	#CYRILLIC SMALL LETTER YERU
+0xFC	0x044C	#CYRILLIC SMALL LETTER SOFT SIGN
+0xFD	0x044D	#CYRILLIC SMALL LETTER E
+0xFE	0x044E	#CYRILLIC SMALL LETTER YU
+0xFF	0x044F	#CYRILLIC SMALL LETTER YA
diff --git a/lib/ucmaps/cp1252.txt b/lib/ucmaps/cp1252.txt
new file mode 100644
index 000000000..2ca4486eb
--- /dev/null
+++ b/lib/ucmaps/cp1252.txt
@@ -0,0 +1,274 @@
+#
+#    Name:     cp1252 to Unicode table
+#    Unicode version: 2.0
+#    Table version: 2.01
+#    Table format:  Format A
+#    Date:          04/15/98
+#
+#    Contact:       cpxlate@microsoft.com
+#
+#    General notes: none
+#
+#    Format: Three tab-separated columns
+#        Column #1 is the cp1252 code (in hex)
+#        Column #2 is the Unicode (in hex as 0xXXXX)
+#        Column #3 is the Unicode name (follows a comment sign, '#')
+#
+#    The entries are in cp1252 order
+#
+0x00	0x0000	#NULL
+0x01	0x0001	#START OF HEADING
+0x02	0x0002	#START OF TEXT
+0x03	0x0003	#END OF TEXT
+0x04	0x0004	#END OF TRANSMISSION
+0x05	0x0005	#ENQUIRY
+0x06	0x0006	#ACKNOWLEDGE
+0x07	0x0007	#BELL
+0x08	0x0008	#BACKSPACE
+0x09	0x0009	#HORIZONTAL TABULATION
+0x0A	0x000A	#LINE FEED
+0x0B	0x000B	#VERTICAL TABULATION
+0x0C	0x000C	#FORM FEED
+0x0D	0x000D	#CARRIAGE RETURN
+0x0E	0x000E	#SHIFT OUT
+0x0F	0x000F	#SHIFT IN
+0x10	0x0010	#DATA LINK ESCAPE
+0x11	0x0011	#DEVICE CONTROL ONE
+0x12	0x0012	#DEVICE CONTROL TWO
+0x13	0x0013	#DEVICE CONTROL THREE
+0x14	0x0014	#DEVICE CONTROL FOUR
+0x15	0x0015	#NEGATIVE ACKNOWLEDGE
+0x16	0x0016	#SYNCHRONOUS IDLE
+0x17	0x0017	#END OF TRANSMISSION BLOCK
+0x18	0x0018	#CANCEL
+0x19	0x0019	#END OF MEDIUM
+0x1A	0x001A	#SUBSTITUTE
+0x1B	0x001B	#ESCAPE
+0x1C	0x001C	#FILE SEPARATOR
+0x1D	0x001D	#GROUP SEPARATOR
+0x1E	0x001E	#RECORD SEPARATOR
+0x1F	0x001F	#UNIT SEPARATOR
+0x20	0x0020	#SPACE
+0x21	0x0021	#EXCLAMATION MARK
+0x22	0x0022	#QUOTATION MARK
+0x23	0x0023	#NUMBER SIGN
+0x24	0x0024	#DOLLAR SIGN
+0x25	0x0025	#PERCENT SIGN
+0x26	0x0026	#AMPERSAND
+0x27	0x0027	#APOSTROPHE
+0x28	0x0028	#LEFT PARENTHESIS
+0x29	0x0029	#RIGHT PARENTHESIS
+0x2A	0x002A	#ASTERISK
+0x2B	0x002B	#PLUS SIGN
+0x2C	0x002C	#COMMA
+0x2D	0x002D	#HYPHEN-MINUS
+0x2E	0x002E	#FULL STOP
+0x2F	0x002F	#SOLIDUS
+0x30	0x0030	#DIGIT ZERO
+0x31	0x0031	#DIGIT ONE
+0x32	0x0032	#DIGIT TWO
+0x33	0x0033	#DIGIT THREE
+0x34	0x0034	#DIGIT FOUR
+0x35	0x0035	#DIGIT FIVE
+0x36	0x0036	#DIGIT SIX
+0x37	0x0037	#DIGIT SEVEN
+0x38	0x0038	#DIGIT EIGHT
+0x39	0x0039	#DIGIT NINE
+0x3A	0x003A	#COLON
+0x3B	0x003B	#SEMICOLON
+0x3C	0x003C	#LESS-THAN SIGN
+0x3D	0x003D	#EQUALS SIGN
+0x3E	0x003E	#GREATER-THAN SIGN
+0x3F	0x003F	#QUESTION MARK
+0x40	0x0040	#COMMERCIAL AT
+0x41	0x0041	#LATIN CAPITAL LETTER A
+0x42	0x0042	#LATIN CAPITAL LETTER B
+0x43	0x0043	#LATIN CAPITAL LETTER C
+0x44	0x0044	#LATIN CAPITAL LETTER D
+0x45	0x0045	#LATIN CAPITAL LETTER E
+0x46	0x0046	#LATIN CAPITAL LETTER F
+0x47	0x0047	#LATIN CAPITAL LETTER G
+0x48	0x0048	#LATIN CAPITAL LETTER H
+0x49	0x0049	#LATIN CAPITAL LETTER I
+0x4A	0x004A	#LATIN CAPITAL LETTER J
+0x4B	0x004B	#LATIN CAPITAL LETTER K
+0x4C	0x004C	#LATIN CAPITAL LETTER L
+0x4D	0x004D	#LATIN CAPITAL LETTER M
+0x4E	0x004E	#LATIN CAPITAL LETTER N
+0x4F	0x004F	#LATIN CAPITAL LETTER O
+0x50	0x0050	#LATIN CAPITAL LETTER P
+0x51	0x0051	#LATIN CAPITAL LETTER Q
+0x52	0x0052	#LATIN CAPITAL LETTER R
+0x53	0x0053	#LATIN CAPITAL LETTER S
+0x54	0x0054	#LATIN CAPITAL LETTER T
+0x55	0x0055	#LATIN CAPITAL LETTER U
+0x56	0x0056	#LATIN CAPITAL LETTER V
+0x57	0x0057	#LATIN CAPITAL LETTER W
+0x58	0x0058	#LATIN CAPITAL LETTER X
+0x59	0x0059	#LATIN CAPITAL LETTER Y
+0x5A	0x005A	#LATIN CAPITAL LETTER Z
+0x5B	0x005B	#LEFT SQUARE BRACKET
+0x5C	0x005C	#REVERSE SOLIDUS
+0x5D	0x005D	#RIGHT SQUARE BRACKET
+0x5E	0x005E	#CIRCUMFLEX ACCENT
+0x5F	0x005F	#LOW LINE
+0x60	0x0060	#GRAVE ACCENT
+0x61	0x0061	#LATIN SMALL LETTER A
+0x62	0x0062	#LATIN SMALL LETTER B
+0x63	0x0063	#LATIN SMALL LETTER C
+0x64	0x0064	#LATIN SMALL LETTER D
+0x65	0x0065	#LATIN SMALL LETTER E
+0x66	0x0066	#LATIN SMALL LETTER F
+0x67	0x0067	#LATIN SMALL LETTER G
+0x68	0x0068	#LATIN SMALL LETTER H
+0x69	0x0069	#LATIN SMALL LETTER I
+0x6A	0x006A	#LATIN SMALL LETTER J
+0x6B	0x006B	#LATIN SMALL LETTER K
+0x6C	0x006C	#LATIN SMALL LETTER L
+0x6D	0x006D	#LATIN SMALL LETTER M
+0x6E	0x006E	#LATIN SMALL LETTER N
+0x6F	0x006F	#LATIN SMALL LETTER O
+0x70	0x0070	#LATIN SMALL LETTER P
+0x71	0x0071	#LATIN SMALL LETTER Q
+0x72	0x0072	#LATIN SMALL LETTER R
+0x73	0x0073	#LATIN SMALL LETTER S
+0x74	0x0074	#LATIN SMALL LETTER T
+0x75	0x0075	#LATIN SMALL LETTER U
+0x76	0x0076	#LATIN SMALL LETTER V
+0x77	0x0077	#LATIN SMALL LETTER W
+0x78	0x0078	#LATIN SMALL LETTER X
+0x79	0x0079	#LATIN SMALL LETTER Y
+0x7A	0x007A	#LATIN SMALL LETTER Z
+0x7B	0x007B	#LEFT CURLY BRACKET
+0x7C	0x007C	#VERTICAL LINE
+0x7D	0x007D	#RIGHT CURLY BRACKET
+0x7E	0x007E	#TILDE
+0x7F	0x007F	#DELETE
+0x80	0x20AC	#EURO SIGN
+0x81	      	#UNDEFINED
+0x82	0x201A	#SINGLE LOW-9 QUOTATION MARK
+0x83	0x0192	#LATIN SMALL LETTER F WITH HOOK
+0x84	0x201E	#DOUBLE LOW-9 QUOTATION MARK
+0x85	0x2026	#HORIZONTAL ELLIPSIS
+0x86	0x2020	#DAGGER
+0x87	0x2021	#DOUBLE DAGGER
+0x88	0x02C6	#MODIFIER LETTER CIRCUMFLEX ACCENT
+0x89	0x2030	#PER MILLE SIGN
+0x8A	0x0160	#LATIN CAPITAL LETTER S WITH CARON
+0x8B	0x2039	#SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+0x8C	0x0152	#LATIN CAPITAL LIGATURE OE
+0x8D	      	#UNDEFINED
+0x8E	0x017D	#LATIN CAPITAL LETTER Z WITH CARON
+0x8F	      	#UNDEFINED
+0x90	      	#UNDEFINED
+0x91	0x2018	#LEFT SINGLE QUOTATION MARK
+0x92	0x2019	#RIGHT SINGLE QUOTATION MARK
+0x93	0x201C	#LEFT DOUBLE QUOTATION MARK
+0x94	0x201D	#RIGHT DOUBLE QUOTATION MARK
+0x95	0x2022	#BULLET
+0x96	0x2013	#EN DASH
+0x97	0x2014	#EM DASH
+0x98	0x02DC	#SMALL TILDE
+0x99	0x2122	#TRADE MARK SIGN
+0x9A	0x0161	#LATIN SMALL LETTER S WITH CARON
+0x9B	0x203A	#SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+0x9C	0x0153	#LATIN SMALL LIGATURE OE
+0x9D	      	#UNDEFINED
+0x9E	0x017E	#LATIN SMALL LETTER Z WITH CARON
+0x9F	0x0178	#LATIN CAPITAL LETTER Y WITH DIAERESIS
+0xA0	0x00A0	#NO-BREAK SPACE
+0xA1	0x00A1	#INVERTED EXCLAMATION MARK
+0xA2	0x00A2	#CENT SIGN
+0xA3	0x00A3	#POUND SIGN
+0xA4	0x00A4	#CURRENCY SIGN
+0xA5	0x00A5	#YEN SIGN
+0xA6	0x00A6	#BROKEN BAR
+0xA7	0x00A7	#SECTION SIGN
+0xA8	0x00A8	#DIAERESIS
+0xA9	0x00A9	#COPYRIGHT SIGN
+0xAA	0x00AA	#FEMININE ORDINAL INDICATOR
+0xAB	0x00AB	#LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xAC	0x00AC	#NOT SIGN
+0xAD	0x00AD	#SOFT HYPHEN
+0xAE	0x00AE	#REGISTERED SIGN
+0xAF	0x00AF	#MACRON
+0xB0	0x00B0	#DEGREE SIGN
+0xB1	0x00B1	#PLUS-MINUS SIGN
+0xB2	0x00B2	#SUPERSCRIPT TWO
+0xB3	0x00B3	#SUPERSCRIPT THREE
+0xB4	0x00B4	#ACUTE ACCENT
+0xB5	0x00B5	#MICRO SIGN
+0xB6	0x00B6	#PILCROW SIGN
+0xB7	0x00B7	#MIDDLE DOT
+0xB8	0x00B8	#CEDILLA
+0xB9	0x00B9	#SUPERSCRIPT ONE
+0xBA	0x00BA	#MASCULINE ORDINAL INDICATOR
+0xBB	0x00BB	#RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xBC	0x00BC	#VULGAR FRACTION ONE QUARTER
+0xBD	0x00BD	#VULGAR FRACTION ONE HALF
+0xBE	0x00BE	#VULGAR FRACTION THREE QUARTERS
+0xBF	0x00BF	#INVERTED QUESTION MARK
+0xC0	0x00C0	#LATIN CAPITAL LETTER A WITH GRAVE
+0xC1	0x00C1	#LATIN CAPITAL LETTER A WITH ACUTE
+0xC2	0x00C2	#LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+0xC3	0x00C3	#LATIN CAPITAL LETTER A WITH TILDE
+0xC4	0x00C4	#LATIN CAPITAL LETTER A WITH DIAERESIS
+0xC5	0x00C5	#LATIN CAPITAL LETTER A WITH RING ABOVE
+0xC6	0x00C6	#LATIN CAPITAL LETTER AE
+0xC7	0x00C7	#LATIN CAPITAL LETTER C WITH CEDILLA
+0xC8	0x00C8	#LATIN CAPITAL LETTER E WITH GRAVE
+0xC9	0x00C9	#LATIN CAPITAL LETTER E WITH ACUTE
+0xCA	0x00CA	#LATIN CAPITAL LETTER E WITH CIRCUMFLEX
+0xCB	0x00CB	#LATIN CAPITAL LETTER E WITH DIAERESIS
+0xCC	0x00CC	#LATIN CAPITAL LETTER I WITH GRAVE
+0xCD	0x00CD	#LATIN CAPITAL LETTER I WITH ACUTE
+0xCE	0x00CE	#LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+0xCF	0x00CF	#LATIN CAPITAL LETTER I WITH DIAERESIS
+0xD0	0x00D0	#LATIN CAPITAL LETTER ETH
+0xD1	0x00D1	#LATIN CAPITAL LETTER N WITH TILDE
+0xD2	0x00D2	#LATIN CAPITAL LETTER O WITH GRAVE
+0xD3	0x00D3	#LATIN CAPITAL LETTER O WITH ACUTE
+0xD4	0x00D4	#LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+0xD5	0x00D5	#LATIN CAPITAL LETTER O WITH TILDE
+0xD6	0x00D6	#LATIN CAPITAL LETTER O WITH DIAERESIS
+0xD7	0x00D7	#MULTIPLICATION SIGN
+0xD8	0x00D8	#LATIN CAPITAL LETTER O WITH STROKE
+0xD9	0x00D9	#LATIN CAPITAL LETTER U WITH GRAVE
+0xDA	0x00DA	#LATIN CAPITAL LETTER U WITH ACUTE
+0xDB	0x00DB	#LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+0xDC	0x00DC	#LATIN CAPITAL LETTER U WITH DIAERESIS
+0xDD	0x00DD	#LATIN CAPITAL LETTER Y WITH ACUTE
+0xDE	0x00DE	#LATIN CAPITAL LETTER THORN
+0xDF	0x00DF	#LATIN SMALL LETTER SHARP S
+0xE0	0x00E0	#LATIN SMALL LETTER A WITH GRAVE
+0xE1	0x00E1	#LATIN SMALL LETTER A WITH ACUTE
+0xE2	0x00E2	#LATIN SMALL LETTER A WITH CIRCUMFLEX
+0xE3	0x00E3	#LATIN SMALL LETTER A WITH TILDE
+0xE4	0x00E4	#LATIN SMALL LETTER A WITH DIAERESIS
+0xE5	0x00E5	#LATIN SMALL LETTER A WITH RING ABOVE
+0xE6	0x00E6	#LATIN SMALL LETTER AE
+0xE7	0x00E7	#LATIN SMALL LETTER C WITH CEDILLA
+0xE8	0x00E8	#LATIN SMALL LETTER E WITH GRAVE
+0xE9	0x00E9	#LATIN SMALL LETTER E WITH ACUTE
+0xEA	0x00EA	#LATIN SMALL LETTER E WITH CIRCUMFLEX
+0xEB	0x00EB	#LATIN SMALL LETTER E WITH DIAERESIS
+0xEC	0x00EC	#LATIN SMALL LETTER I WITH GRAVE
+0xED	0x00ED	#LATIN SMALL LETTER I WITH ACUTE
+0xEE	0x00EE	#LATIN SMALL LETTER I WITH CIRCUMFLEX
+0xEF	0x00EF	#LATIN SMALL LETTER I WITH DIAERESIS
+0xF0	0x00F0	#LATIN SMALL LETTER ETH
+0xF1	0x00F1	#LATIN SMALL LETTER N WITH TILDE
+0xF2	0x00F2	#LATIN SMALL LETTER O WITH GRAVE
+0xF3	0x00F3	#LATIN SMALL LETTER O WITH ACUTE
+0xF4	0x00F4	#LATIN SMALL LETTER O WITH CIRCUMFLEX
+0xF5	0x00F5	#LATIN SMALL LETTER O WITH TILDE
+0xF6	0x00F6	#LATIN SMALL LETTER O WITH DIAERESIS
+0xF7	0x00F7	#DIVISION SIGN
+0xF8	0x00F8	#LATIN SMALL LETTER O WITH STROKE
+0xF9	0x00F9	#LATIN SMALL LETTER U WITH GRAVE
+0xFA	0x00FA	#LATIN SMALL LETTER U WITH ACUTE
+0xFB	0x00FB	#LATIN SMALL LETTER U WITH CIRCUMFLEX
+0xFC	0x00FC	#LATIN SMALL LETTER U WITH DIAERESIS
+0xFD	0x00FD	#LATIN SMALL LETTER Y WITH ACUTE
+0xFE	0x00FE	#LATIN SMALL LETTER THORN
+0xFF	0x00FF	#LATIN SMALL LETTER Y WITH DIAERESIS
diff --git a/lib/ucmaps/cp1253.txt b/lib/ucmaps/cp1253.txt
new file mode 100644
index 000000000..2ba51a0c8
--- /dev/null
+++ b/lib/ucmaps/cp1253.txt
@@ -0,0 +1,274 @@
+#
+#    Name:     cp1253 to Unicode table
+#    Unicode version: 2.0
+#    Table version: 2.01
+#    Table format:  Format A
+#    Date:          04/15/98
+#
+#    Contact:       cpxlate@microsoft.com
+#
+#    General notes: none
+#
+#    Format: Three tab-separated columns
+#        Column #1 is the cp1253 code (in hex)
+#        Column #2 is the Unicode (in hex as 0xXXXX)
+#        Column #3 is the Unicode name (follows a comment sign, '#')
+#
+#    The entries are in cp1253 order
+#
+0x00	0x0000	#NULL
+0x01	0x0001	#START OF HEADING
+0x02	0x0002	#START OF TEXT
+0x03	0x0003	#END OF TEXT
+0x04	0x0004	#END OF TRANSMISSION
+0x05	0x0005	#ENQUIRY
+0x06	0x0006	#ACKNOWLEDGE
+0x07	0x0007	#BELL
+0x08	0x0008	#BACKSPACE
+0x09	0x0009	#HORIZONTAL TABULATION
+0x0A	0x000A	#LINE FEED
+0x0B	0x000B	#VERTICAL TABULATION
+0x0C	0x000C	#FORM FEED
+0x0D	0x000D	#CARRIAGE RETURN
+0x0E	0x000E	#SHIFT OUT
+0x0F	0x000F	#SHIFT IN
+0x10	0x0010	#DATA LINK ESCAPE
+0x11	0x0011	#DEVICE CONTROL ONE
+0x12	0x0012	#DEVICE CONTROL TWO
+0x13	0x0013	#DEVICE CONTROL THREE
+0x14	0x0014	#DEVICE CONTROL FOUR
+0x15	0x0015	#NEGATIVE ACKNOWLEDGE
+0x16	0x0016	#SYNCHRONOUS IDLE
+0x17	0x0017	#END OF TRANSMISSION BLOCK
+0x18	0x0018	#CANCEL
+0x19	0x0019	#END OF MEDIUM
+0x1A	0x001A	#SUBSTITUTE
+0x1B	0x001B	#ESCAPE
+0x1C	0x001C	#FILE SEPARATOR
+0x1D	0x001D	#GROUP SEPARATOR
+0x1E	0x001E	#RECORD SEPARATOR
+0x1F	0x001F	#UNIT SEPARATOR
+0x20	0x0020	#SPACE
+0x21	0x0021	#EXCLAMATION MARK
+0x22	0x0022	#QUOTATION MARK
+0x23	0x0023	#NUMBER SIGN
+0x24	0x0024	#DOLLAR SIGN
+0x25	0x0025	#PERCENT SIGN
+0x26	0x0026	#AMPERSAND
+0x27	0x0027	#APOSTROPHE
+0x28	0x0028	#LEFT PARENTHESIS
+0x29	0x0029	#RIGHT PARENTHESIS
+0x2A	0x002A	#ASTERISK
+0x2B	0x002B	#PLUS SIGN
+0x2C	0x002C	#COMMA
+0x2D	0x002D	#HYPHEN-MINUS
+0x2E	0x002E	#FULL STOP
+0x2F	0x002F	#SOLIDUS
+0x30	0x0030	#DIGIT ZERO
+0x31	0x0031	#DIGIT ONE
+0x32	0x0032	#DIGIT TWO
+0x33	0x0033	#DIGIT THREE
+0x34	0x0034	#DIGIT FOUR
+0x35	0x0035	#DIGIT FIVE
+0x36	0x0036	#DIGIT SIX
+0x37	0x0037	#DIGIT SEVEN
+0x38	0x0038	#DIGIT EIGHT
+0x39	0x0039	#DIGIT NINE
+0x3A	0x003A	#COLON
+0x3B	0x003B	#SEMICOLON
+0x3C	0x003C	#LESS-THAN SIGN
+0x3D	0x003D	#EQUALS SIGN
+0x3E	0x003E	#GREATER-THAN SIGN
+0x3F	0x003F	#QUESTION MARK
+0x40	0x0040	#COMMERCIAL AT
+0x41	0x0041	#LATIN CAPITAL LETTER A
+0x42	0x0042	#LATIN CAPITAL LETTER B
+0x43	0x0043	#LATIN CAPITAL LETTER C
+0x44	0x0044	#LATIN CAPITAL LETTER D
+0x45	0x0045	#LATIN CAPITAL LETTER E
+0x46	0x0046	#LATIN CAPITAL LETTER F
+0x47	0x0047	#LATIN CAPITAL LETTER G
+0x48	0x0048	#LATIN CAPITAL LETTER H
+0x49	0x0049	#LATIN CAPITAL LETTER I
+0x4A	0x004A	#LATIN CAPITAL LETTER J
+0x4B	0x004B	#LATIN CAPITAL LETTER K
+0x4C	0x004C	#LATIN CAPITAL LETTER L
+0x4D	0x004D	#LATIN CAPITAL LETTER M
+0x4E	0x004E	#LATIN CAPITAL LETTER N
+0x4F	0x004F	#LATIN CAPITAL LETTER O
+0x50	0x0050	#LATIN CAPITAL LETTER P
+0x51	0x0051	#LATIN CAPITAL LETTER Q
+0x52	0x0052	#LATIN CAPITAL LETTER R
+0x53	0x0053	#LATIN CAPITAL LETTER S
+0x54	0x0054	#LATIN CAPITAL LETTER T
+0x55	0x0055	#LATIN CAPITAL LETTER U
+0x56	0x0056	#LATIN CAPITAL LETTER V
+0x57	0x0057	#LATIN CAPITAL LETTER W
+0x58	0x0058	#LATIN CAPITAL LETTER X
+0x59	0x0059	#LATIN CAPITAL LETTER Y
+0x5A	0x005A	#LATIN CAPITAL LETTER Z
+0x5B	0x005B	#LEFT SQUARE BRACKET
+0x5C	0x005C	#REVERSE SOLIDUS
+0x5D	0x005D	#RIGHT SQUARE BRACKET
+0x5E	0x005E	#CIRCUMFLEX ACCENT
+0x5F	0x005F	#LOW LINE
+0x60	0x0060	#GRAVE ACCENT
+0x61	0x0061	#LATIN SMALL LETTER A
+0x62	0x0062	#LATIN SMALL LETTER B
+0x63	0x0063	#LATIN SMALL LETTER C
+0x64	0x0064	#LATIN SMALL LETTER D
+0x65	0x0065	#LATIN SMALL LETTER E
+0x66	0x0066	#LATIN SMALL LETTER F
+0x67	0x0067	#LATIN SMALL LETTER G
+0x68	0x0068	#LATIN SMALL LETTER H
+0x69	0x0069	#LATIN SMALL LETTER I
+0x6A	0x006A	#LATIN SMALL LETTER J
+0x6B	0x006B	#LATIN SMALL LETTER K
+0x6C	0x006C	#LATIN SMALL LETTER L
+0x6D	0x006D	#LATIN SMALL LETTER M
+0x6E	0x006E	#LATIN SMALL LETTER N
+0x6F	0x006F	#LATIN SMALL LETTER O
+0x70	0x0070	#LATIN SMALL LETTER P
+0x71	0x0071	#LATIN SMALL LETTER Q
+0x72	0x0072	#LATIN SMALL LETTER R
+0x73	0x0073	#LATIN SMALL LETTER S
+0x74	0x0074	#LATIN SMALL LETTER T
+0x75	0x0075	#LATIN SMALL LETTER U
+0x76	0x0076	#LATIN SMALL LETTER V
+0x77	0x0077	#LATIN SMALL LETTER W
+0x78	0x0078	#LATIN SMALL LETTER X
+0x79	0x0079	#LATIN SMALL LETTER Y
+0x7A	0x007A	#LATIN SMALL LETTER Z
+0x7B	0x007B	#LEFT CURLY BRACKET
+0x7C	0x007C	#VERTICAL LINE
+0x7D	0x007D	#RIGHT CURLY BRACKET
+0x7E	0x007E	#TILDE
+0x7F	0x007F	#DELETE
+0x80	0x20AC	#EURO SIGN
+0x81	      	#UNDEFINED
+0x82	0x201A	#SINGLE LOW-9 QUOTATION MARK
+0x83	0x0192	#LATIN SMALL LETTER F WITH HOOK
+0x84	0x201E	#DOUBLE LOW-9 QUOTATION MARK
+0x85	0x2026	#HORIZONTAL ELLIPSIS
+0x86	0x2020	#DAGGER
+0x87	0x2021	#DOUBLE DAGGER
+0x88	      	#UNDEFINED
+0x89	0x2030	#PER MILLE SIGN
+0x8A	      	#UNDEFINED
+0x8B	0x2039	#SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+0x8C	      	#UNDEFINED
+0x8D	      	#UNDEFINED
+0x8E	      	#UNDEFINED
+0x8F	      	#UNDEFINED
+0x90	      	#UNDEFINED
+0x91	0x2018	#LEFT SINGLE QUOTATION MARK
+0x92	0x2019	#RIGHT SINGLE QUOTATION MARK
+0x93	0x201C	#LEFT DOUBLE QUOTATION MARK
+0x94	0x201D	#RIGHT DOUBLE QUOTATION MARK
+0x95	0x2022	#BULLET
+0x96	0x2013	#EN DASH
+0x97	0x2014	#EM DASH
+0x98	      	#UNDEFINED
+0x99	0x2122	#TRADE MARK SIGN
+0x9A	      	#UNDEFINED
+0x9B	0x203A	#SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+0x9C	      	#UNDEFINED
+0x9D	      	#UNDEFINED
+0x9E	      	#UNDEFINED
+0x9F	      	#UNDEFINED
+0xA0	0x00A0	#NO-BREAK SPACE
+0xA1	0x0385	#GREEK DIALYTIKA TONOS
+0xA2	0x0386	#GREEK CAPITAL LETTER ALPHA WITH TONOS
+0xA3	0x00A3	#POUND SIGN
+0xA4	0x00A4	#CURRENCY SIGN
+0xA5	0x00A5	#YEN SIGN
+0xA6	0x00A6	#BROKEN BAR
+0xA7	0x00A7	#SECTION SIGN
+0xA8	0x00A8	#DIAERESIS
+0xA9	0x00A9	#COPYRIGHT SIGN
+0xAA	      	#UNDEFINED
+0xAB	0x00AB	#LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xAC	0x00AC	#NOT SIGN
+0xAD	0x00AD	#SOFT HYPHEN
+0xAE	0x00AE	#REGISTERED SIGN
+0xAF	0x2015	#HORIZONTAL BAR
+0xB0	0x00B0	#DEGREE SIGN
+0xB1	0x00B1	#PLUS-MINUS SIGN
+0xB2	0x00B2	#SUPERSCRIPT TWO
+0xB3	0x00B3	#SUPERSCRIPT THREE
+0xB4	0x0384	#GREEK TONOS
+0xB5	0x00B5	#MICRO SIGN
+0xB6	0x00B6	#PILCROW SIGN
+0xB7	0x00B7	#MIDDLE DOT
+0xB8	0x0388	#GREEK CAPITAL LETTER EPSILON WITH TONOS
+0xB9	0x0389	#GREEK CAPITAL LETTER ETA WITH TONOS
+0xBA	0x038A	#GREEK CAPITAL LETTER IOTA WITH TONOS
+0xBB	0x00BB	#RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xBC	0x038C	#GREEK CAPITAL LETTER OMICRON WITH TONOS
+0xBD	0x00BD	#VULGAR FRACTION ONE HALF
+0xBE	0x038E	#GREEK CAPITAL LETTER UPSILON WITH TONOS
+0xBF	0x038F	#GREEK CAPITAL LETTER OMEGA WITH TONOS
+0xC0	0x0390	#GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS
+0xC1	0x0391	#GREEK CAPITAL LETTER ALPHA
+0xC2	0x0392	#GREEK CAPITAL LETTER BETA
+0xC3	0x0393	#GREEK CAPITAL LETTER GAMMA
+0xC4	0x0394	#GREEK CAPITAL LETTER DELTA
+0xC5	0x0395	#GREEK CAPITAL LETTER EPSILON
+0xC6	0x0396	#GREEK CAPITAL LETTER ZETA
+0xC7	0x0397	#GREEK CAPITAL LETTER ETA
+0xC8	0x0398	#GREEK CAPITAL LETTER THETA
+0xC9	0x0399	#GREEK CAPITAL LETTER IOTA
+0xCA	0x039A	#GREEK CAPITAL LETTER KAPPA
+0xCB	0x039B	#GREEK CAPITAL LETTER LAMDA
+0xCC	0x039C	#GREEK CAPITAL LETTER MU
+0xCD	0x039D	#GREEK CAPITAL LETTER NU
+0xCE	0x039E	#GREEK CAPITAL LETTER XI
+0xCF	0x039F	#GREEK CAPITAL LETTER OMICRON
+0xD0	0x03A0	#GREEK CAPITAL LETTER PI
+0xD1	0x03A1	#GREEK CAPITAL LETTER RHO
+0xD2	      	#UNDEFINED
+0xD3	0x03A3	#GREEK CAPITAL LETTER SIGMA
+0xD4	0x03A4	#GREEK CAPITAL LETTER TAU
+0xD5	0x03A5	#GREEK CAPITAL LETTER UPSILON
+0xD6	0x03A6	#GREEK CAPITAL LETTER PHI
+0xD7	0x03A7	#GREEK CAPITAL LETTER CHI
+0xD8	0x03A8	#GREEK CAPITAL LETTER PSI
+0xD9	0x03A9	#GREEK CAPITAL LETTER OMEGA
+0xDA	0x03AA	#GREEK CAPITAL LETTER IOTA WITH DIALYTIKA
+0xDB	0x03AB	#GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA
+0xDC	0x03AC	#GREEK SMALL LETTER ALPHA WITH TONOS
+0xDD	0x03AD	#GREEK SMALL LETTER EPSILON WITH TONOS
+0xDE	0x03AE	#GREEK SMALL LETTER ETA WITH TONOS
+0xDF	0x03AF	#GREEK SMALL LETTER IOTA WITH TONOS
+0xE0	0x03B0	#GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS
+0xE1	0x03B1	#GREEK SMALL LETTER ALPHA
+0xE2	0x03B2	#GREEK SMALL LETTER BETA
+0xE3	0x03B3	#GREEK SMALL LETTER GAMMA
+0xE4	0x03B4	#GREEK SMALL LETTER DELTA
+0xE5	0x03B5	#GREEK SMALL LETTER EPSILON
+0xE6	0x03B6	#GREEK SMALL LETTER ZETA
+0xE7	0x03B7	#GREEK SMALL LETTER ETA
+0xE8	0x03B8	#GREEK SMALL LETTER THETA
+0xE9	0x03B9	#GREEK SMALL LETTER IOTA
+0xEA	0x03BA	#GREEK SMALL LETTER KAPPA
+0xEB	0x03BB	#GREEK SMALL LETTER LAMDA
+0xEC	0x03BC	#GREEK SMALL LETTER MU
+0xED	0x03BD	#GREEK SMALL LETTER NU
+0xEE	0x03BE	#GREEK SMALL LETTER XI
+0xEF	0x03BF	#GREEK SMALL LETTER OMICRON
+0xF0	0x03C0	#GREEK SMALL LETTER PI
+0xF1	0x03C1	#GREEK SMALL LETTER RHO
+0xF2	0x03C2	#GREEK SMALL LETTER FINAL SIGMA
+0xF3	0x03C3	#GREEK SMALL LETTER SIGMA
+0xF4	0x03C4	#GREEK SMALL LETTER TAU
+0xF5	0x03C5	#GREEK SMALL LETTER UPSILON
+0xF6	0x03C6	#GREEK SMALL LETTER PHI
+0xF7	0x03C7	#GREEK SMALL LETTER CHI
+0xF8	0x03C8	#GREEK SMALL LETTER PSI
+0xF9	0x03C9	#GREEK SMALL LETTER OMEGA
+0xFA	0x03CA	#GREEK SMALL LETTER IOTA WITH DIALYTIKA
+0xFB	0x03CB	#GREEK SMALL LETTER UPSILON WITH DIALYTIKA
+0xFC	0x03CC	#GREEK SMALL LETTER OMICRON WITH TONOS
+0xFD	0x03CD	#GREEK SMALL LETTER UPSILON WITH TONOS
+0xFE	0x03CE	#GREEK SMALL LETTER OMEGA WITH TONOS
+0xFF	      	#UNDEFINED
diff --git a/lib/ucmaps/cp1254.txt b/lib/ucmaps/cp1254.txt
new file mode 100644
index 000000000..ca1a1ebdb
--- /dev/null
+++ b/lib/ucmaps/cp1254.txt
@@ -0,0 +1,274 @@
+#
+#    Name:     cp1254 to Unicode table
+#    Unicode version: 2.0
+#    Table version: 2.01
+#    Table format:  Format A
+#    Date:          04/15/98
+#
+#    Contact:       cpxlate@microsoft.com
+#
+#    General notes: none
+#
+#    Format: Three tab-separated columns
+#        Column #1 is the cp1254 code (in hex)
+#        Column #2 is the Unicode (in hex as 0xXXXX)
+#        Column #3 is the Unicode name (follows a comment sign, '#')
+#
+#    The entries are in cp1254 order
+#
+0x00	0x0000	#NULL
+0x01	0x0001	#START OF HEADING
+0x02	0x0002	#START OF TEXT
+0x03	0x0003	#END OF TEXT
+0x04	0x0004	#END OF TRANSMISSION
+0x05	0x0005	#ENQUIRY
+0x06	0x0006	#ACKNOWLEDGE
+0x07	0x0007	#BELL
+0x08	0x0008	#BACKSPACE
+0x09	0x0009	#HORIZONTAL TABULATION
+0x0A	0x000A	#LINE FEED
+0x0B	0x000B	#VERTICAL TABULATION
+0x0C	0x000C	#FORM FEED
+0x0D	0x000D	#CARRIAGE RETURN
+0x0E	0x000E	#SHIFT OUT
+0x0F	0x000F	#SHIFT IN
+0x10	0x0010	#DATA LINK ESCAPE
+0x11	0x0011	#DEVICE CONTROL ONE
+0x12	0x0012	#DEVICE CONTROL TWO
+0x13	0x0013	#DEVICE CONTROL THREE
+0x14	0x0014	#DEVICE CONTROL FOUR
+0x15	0x0015	#NEGATIVE ACKNOWLEDGE
+0x16	0x0016	#SYNCHRONOUS IDLE
+0x17	0x0017	#END OF TRANSMISSION BLOCK
+0x18	0x0018	#CANCEL
+0x19	0x0019	#END OF MEDIUM
+0x1A	0x001A	#SUBSTITUTE
+0x1B	0x001B	#ESCAPE
+0x1C	0x001C	#FILE SEPARATOR
+0x1D	0x001D	#GROUP SEPARATOR
+0x1E	0x001E	#RECORD SEPARATOR
+0x1F	0x001F	#UNIT SEPARATOR
+0x20	0x0020	#SPACE
+0x21	0x0021	#EXCLAMATION MARK
+0x22	0x0022	#QUOTATION MARK
+0x23	0x0023	#NUMBER SIGN
+0x24	0x0024	#DOLLAR SIGN
+0x25	0x0025	#PERCENT SIGN
+0x26	0x0026	#AMPERSAND
+0x27	0x0027	#APOSTROPHE
+0x28	0x0028	#LEFT PARENTHESIS
+0x29	0x0029	#RIGHT PARENTHESIS
+0x2A	0x002A	#ASTERISK
+0x2B	0x002B	#PLUS SIGN
+0x2C	0x002C	#COMMA
+0x2D	0x002D	#HYPHEN-MINUS
+0x2E	0x002E	#FULL STOP
+0x2F	0x002F	#SOLIDUS
+0x30	0x0030	#DIGIT ZERO
+0x31	0x0031	#DIGIT ONE
+0x32	0x0032	#DIGIT TWO
+0x33	0x0033	#DIGIT THREE
+0x34	0x0034	#DIGIT FOUR
+0x35	0x0035	#DIGIT FIVE
+0x36	0x0036	#DIGIT SIX
+0x37	0x0037	#DIGIT SEVEN
+0x38	0x0038	#DIGIT EIGHT
+0x39	0x0039	#DIGIT NINE
+0x3A	0x003A	#COLON
+0x3B	0x003B	#SEMICOLON
+0x3C	0x003C	#LESS-THAN SIGN
+0x3D	0x003D	#EQUALS SIGN
+0x3E	0x003E	#GREATER-THAN SIGN
+0x3F	0x003F	#QUESTION MARK
+0x40	0x0040	#COMMERCIAL AT
+0x41	0x0041	#LATIN CAPITAL LETTER A
+0x42	0x0042	#LATIN CAPITAL LETTER B
+0x43	0x0043	#LATIN CAPITAL LETTER C
+0x44	0x0044	#LATIN CAPITAL LETTER D
+0x45	0x0045	#LATIN CAPITAL LETTER E
+0x46	0x0046	#LATIN CAPITAL LETTER F
+0x47	0x0047	#LATIN CAPITAL LETTER G
+0x48	0x0048	#LATIN CAPITAL LETTER H
+0x49	0x0049	#LATIN CAPITAL LETTER I
+0x4A	0x004A	#LATIN CAPITAL LETTER J
+0x4B	0x004B	#LATIN CAPITAL LETTER K
+0x4C	0x004C	#LATIN CAPITAL LETTER L
+0x4D	0x004D	#LATIN CAPITAL LETTER M
+0x4E	0x004E	#LATIN CAPITAL LETTER N
+0x4F	0x004F	#LATIN CAPITAL LETTER O
+0x50	0x0050	#LATIN CAPITAL LETTER P
+0x51	0x0051	#LATIN CAPITAL LETTER Q
+0x52	0x0052	#LATIN CAPITAL LETTER R
+0x53	0x0053	#LATIN CAPITAL LETTER S
+0x54	0x0054	#LATIN CAPITAL LETTER T
+0x55	0x0055	#LATIN CAPITAL LETTER U
+0x56	0x0056	#LATIN CAPITAL LETTER V
+0x57	0x0057	#LATIN CAPITAL LETTER W
+0x58	0x0058	#LATIN CAPITAL LETTER X
+0x59	0x0059	#LATIN CAPITAL LETTER Y
+0x5A	0x005A	#LATIN CAPITAL LETTER Z
+0x5B	0x005B	#LEFT SQUARE BRACKET
+0x5C	0x005C	#REVERSE SOLIDUS
+0x5D	0x005D	#RIGHT SQUARE BRACKET
+0x5E	0x005E	#CIRCUMFLEX ACCENT
+0x5F	0x005F	#LOW LINE
+0x60	0x0060	#GRAVE ACCENT
+0x61	0x0061	#LATIN SMALL LETTER A
+0x62	0x0062	#LATIN SMALL LETTER B
+0x63	0x0063	#LATIN SMALL LETTER C
+0x64	0x0064	#LATIN SMALL LETTER D
+0x65	0x0065	#LATIN SMALL LETTER E
+0x66	0x0066	#LATIN SMALL LETTER F
+0x67	0x0067	#LATIN SMALL LETTER G
+0x68	0x0068	#LATIN SMALL LETTER H
+0x69	0x0069	#LATIN SMALL LETTER I
+0x6A	0x006A	#LATIN SMALL LETTER J
+0x6B	0x006B	#LATIN SMALL LETTER K
+0x6C	0x006C	#LATIN SMALL LETTER L
+0x6D	0x006D	#LATIN SMALL LETTER M
+0x6E	0x006E	#LATIN SMALL LETTER N
+0x6F	0x006F	#LATIN SMALL LETTER O
+0x70	0x0070	#LATIN SMALL LETTER P
+0x71	0x0071	#LATIN SMALL LETTER Q
+0x72	0x0072	#LATIN SMALL LETTER R
+0x73	0x0073	#LATIN SMALL LETTER S
+0x74	0x0074	#LATIN SMALL LETTER T
+0x75	0x0075	#LATIN SMALL LETTER U
+0x76	0x0076	#LATIN SMALL LETTER V
+0x77	0x0077	#LATIN SMALL LETTER W
+0x78	0x0078	#LATIN SMALL LETTER X
+0x79	0x0079	#LATIN SMALL LETTER Y
+0x7A	0x007A	#LATIN SMALL LETTER Z
+0x7B	0x007B	#LEFT CURLY BRACKET
+0x7C	0x007C	#VERTICAL LINE
+0x7D	0x007D	#RIGHT CURLY BRACKET
+0x7E	0x007E	#TILDE
+0x7F	0x007F	#DELETE
+0x80	0x20AC	#EURO SIGN
+0x81	      	#UNDEFINED
+0x82	0x201A	#SINGLE LOW-9 QUOTATION MARK
+0x83	0x0192	#LATIN SMALL LETTER F WITH HOOK
+0x84	0x201E	#DOUBLE LOW-9 QUOTATION MARK
+0x85	0x2026	#HORIZONTAL ELLIPSIS
+0x86	0x2020	#DAGGER
+0x87	0x2021	#DOUBLE DAGGER
+0x88	0x02C6	#MODIFIER LETTER CIRCUMFLEX ACCENT
+0x89	0x2030	#PER MILLE SIGN
+0x8A	0x0160	#LATIN CAPITAL LETTER S WITH CARON
+0x8B	0x2039	#SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+0x8C	0x0152	#LATIN CAPITAL LIGATURE OE
+0x8D	      	#UNDEFINED
+0x8E	      	#UNDEFINED
+0x8F	      	#UNDEFINED
+0x90	      	#UNDEFINED
+0x91	0x2018	#LEFT SINGLE QUOTATION MARK
+0x92	0x2019	#RIGHT SINGLE QUOTATION MARK
+0x93	0x201C	#LEFT DOUBLE QUOTATION MARK
+0x94	0x201D	#RIGHT DOUBLE QUOTATION MARK
+0x95	0x2022	#BULLET
+0x96	0x2013	#EN DASH
+0x97	0x2014	#EM DASH
+0x98	0x02DC	#SMALL TILDE
+0x99	0x2122	#TRADE MARK SIGN
+0x9A	0x0161	#LATIN SMALL LETTER S WITH CARON
+0x9B	0x203A	#SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+0x9C	0x0153	#LATIN SMALL LIGATURE OE
+0x9D	      	#UNDEFINED
+0x9E	      	#UNDEFINED
+0x9F	0x0178	#LATIN CAPITAL LETTER Y WITH DIAERESIS
+0xA0	0x00A0	#NO-BREAK SPACE
+0xA1	0x00A1	#INVERTED EXCLAMATION MARK
+0xA2	0x00A2	#CENT SIGN
+0xA3	0x00A3	#POUND SIGN
+0xA4	0x00A4	#CURRENCY SIGN
+0xA5	0x00A5	#YEN SIGN
+0xA6	0x00A6	#BROKEN BAR
+0xA7	0x00A7	#SECTION SIGN
+0xA8	0x00A8	#DIAERESIS
+0xA9	0x00A9	#COPYRIGHT SIGN
+0xAA	0x00AA	#FEMININE ORDINAL INDICATOR
+0xAB	0x00AB	#LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xAC	0x00AC	#NOT SIGN
+0xAD	0x00AD	#SOFT HYPHEN
+0xAE	0x00AE	#REGISTERED SIGN
+0xAF	0x00AF	#MACRON
+0xB0	0x00B0	#DEGREE SIGN
+0xB1	0x00B1	#PLUS-MINUS SIGN
+0xB2	0x00B2	#SUPERSCRIPT TWO
+0xB3	0x00B3	#SUPERSCRIPT THREE
+0xB4	0x00B4	#ACUTE ACCENT
+0xB5	0x00B5	#MICRO SIGN
+0xB6	0x00B6	#PILCROW SIGN
+0xB7	0x00B7	#MIDDLE DOT
+0xB8	0x00B8	#CEDILLA
+0xB9	0x00B9	#SUPERSCRIPT ONE
+0xBA	0x00BA	#MASCULINE ORDINAL INDICATOR
+0xBB	0x00BB	#RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xBC	0x00BC	#VULGAR FRACTION ONE QUARTER
+0xBD	0x00BD	#VULGAR FRACTION ONE HALF
+0xBE	0x00BE	#VULGAR FRACTION THREE QUARTERS
+0xBF	0x00BF	#INVERTED QUESTION MARK
+0xC0	0x00C0	#LATIN CAPITAL LETTER A WITH GRAVE
+0xC1	0x00C1	#LATIN CAPITAL LETTER A WITH ACUTE
+0xC2	0x00C2	#LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+0xC3	0x00C3	#LATIN CAPITAL LETTER A WITH TILDE
+0xC4	0x00C4	#LATIN CAPITAL LETTER A WITH DIAERESIS
+0xC5	0x00C5	#LATIN CAPITAL LETTER A WITH RING ABOVE
+0xC6	0x00C6	#LATIN CAPITAL LETTER AE
+0xC7	0x00C7	#LATIN CAPITAL LETTER C WITH CEDILLA
+0xC8	0x00C8	#LATIN CAPITAL LETTER E WITH GRAVE
+0xC9	0x00C9	#LATIN CAPITAL LETTER E WITH ACUTE
+0xCA	0x00CA	#LATIN CAPITAL LETTER E WITH CIRCUMFLEX
+0xCB	0x00CB	#LATIN CAPITAL LETTER E WITH DIAERESIS
+0xCC	0x00CC	#LATIN CAPITAL LETTER I WITH GRAVE
+0xCD	0x00CD	#LATIN CAPITAL LETTER I WITH ACUTE
+0xCE	0x00CE	#LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+0xCF	0x00CF	#LATIN CAPITAL LETTER I WITH DIAERESIS
+0xD0	0x011E	#LATIN CAPITAL LETTER G WITH BREVE
+0xD1	0x00D1	#LATIN CAPITAL LETTER N WITH TILDE
+0xD2	0x00D2	#LATIN CAPITAL LETTER O WITH GRAVE
+0xD3	0x00D3	#LATIN CAPITAL LETTER O WITH ACUTE
+0xD4	0x00D4	#LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+0xD5	0x00D5	#LATIN CAPITAL LETTER O WITH TILDE
+0xD6	0x00D6	#LATIN CAPITAL LETTER O WITH DIAERESIS
+0xD7	0x00D7	#MULTIPLICATION SIGN
+0xD8	0x00D8	#LATIN CAPITAL LETTER O WITH STROKE
+0xD9	0x00D9	#LATIN CAPITAL LETTER U WITH GRAVE
+0xDA	0x00DA	#LATIN CAPITAL LETTER U WITH ACUTE
+0xDB	0x00DB	#LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+0xDC	0x00DC	#LATIN CAPITAL LETTER U WITH DIAERESIS
+0xDD	0x0130	#LATIN CAPITAL LETTER I WITH DOT ABOVE
+0xDE	0x015E	#LATIN CAPITAL LETTER S WITH CEDILLA
+0xDF	0x00DF	#LATIN SMALL LETTER SHARP S
+0xE0	0x00E0	#LATIN SMALL LETTER A WITH GRAVE
+0xE1	0x00E1	#LATIN SMALL LETTER A WITH ACUTE
+0xE2	0x00E2	#LATIN SMALL LETTER A WITH CIRCUMFLEX
+0xE3	0x00E3	#LATIN SMALL LETTER A WITH TILDE
+0xE4	0x00E4	#LATIN SMALL LETTER A WITH DIAERESIS
+0xE5	0x00E5	#LATIN SMALL LETTER A WITH RING ABOVE
+0xE6	0x00E6	#LATIN SMALL LETTER AE
+0xE7	0x00E7	#LATIN SMALL LETTER C WITH CEDILLA
+0xE8	0x00E8	#LATIN SMALL LETTER E WITH GRAVE
+0xE9	0x00E9	#LATIN SMALL LETTER E WITH ACUTE
+0xEA	0x00EA	#LATIN SMALL LETTER E WITH CIRCUMFLEX
+0xEB	0x00EB	#LATIN SMALL LETTER E WITH DIAERESIS
+0xEC	0x00EC	#LATIN SMALL LETTER I WITH GRAVE
+0xED	0x00ED	#LATIN SMALL LETTER I WITH ACUTE
+0xEE	0x00EE	#LATIN SMALL LETTER I WITH CIRCUMFLEX
+0xEF	0x00EF	#LATIN SMALL LETTER I WITH DIAERESIS
+0xF0	0x011F	#LATIN SMALL LETTER G WITH BREVE
+0xF1	0x00F1	#LATIN SMALL LETTER N WITH TILDE
+0xF2	0x00F2	#LATIN SMALL LETTER O WITH GRAVE
+0xF3	0x00F3	#LATIN SMALL LETTER O WITH ACUTE
+0xF4	0x00F4	#LATIN SMALL LETTER O WITH CIRCUMFLEX
+0xF5	0x00F5	#LATIN SMALL LETTER O WITH TILDE
+0xF6	0x00F6	#LATIN SMALL LETTER O WITH DIAERESIS
+0xF7	0x00F7	#DIVISION SIGN
+0xF8	0x00F8	#LATIN SMALL LETTER O WITH STROKE
+0xF9	0x00F9	#LATIN SMALL LETTER U WITH GRAVE
+0xFA	0x00FA	#LATIN SMALL LETTER U WITH ACUTE
+0xFB	0x00FB	#LATIN SMALL LETTER U WITH CIRCUMFLEX
+0xFC	0x00FC	#LATIN SMALL LETTER U WITH DIAERESIS
+0xFD	0x0131	#LATIN SMALL LETTER DOTLESS I
+0xFE	0x015F	#LATIN SMALL LETTER S WITH CEDILLA
+0xFF	0x00FF	#LATIN SMALL LETTER Y WITH DIAERESIS
diff --git a/lib/ucmaps/cp1255.txt b/lib/ucmaps/cp1255.txt
new file mode 100644
index 000000000..341517f11
--- /dev/null
+++ b/lib/ucmaps/cp1255.txt
@@ -0,0 +1,274 @@
+#
+#    Name:     cp1255 to Unicode table
+#    Unicode version: 2.0
+#    Table version: 2.01
+#    Table format:  Format A
+#    Date:          1/7/2000
+#
+#    Contact:       cpxlate@microsoft.com
+#
+#    General notes: none
+#
+#    Format: Three tab-separated columns
+#        Column #1 is the cp1255 code (in hex)
+#        Column #2 is the Unicode (in hex as 0xXXXX)
+#        Column #3 is the Unicode name (follows a comment sign, '#')
+#
+#    The entries are in cp1255 order
+#
+0x00	0x0000	#NULL
+0x01	0x0001	#START OF HEADING
+0x02	0x0002	#START OF TEXT
+0x03	0x0003	#END OF TEXT
+0x04	0x0004	#END OF TRANSMISSION
+0x05	0x0005	#ENQUIRY
+0x06	0x0006	#ACKNOWLEDGE
+0x07	0x0007	#BELL
+0x08	0x0008	#BACKSPACE
+0x09	0x0009	#HORIZONTAL TABULATION
+0x0A	0x000A	#LINE FEED
+0x0B	0x000B	#VERTICAL TABULATION
+0x0C	0x000C	#FORM FEED
+0x0D	0x000D	#CARRIAGE RETURN
+0x0E	0x000E	#SHIFT OUT
+0x0F	0x000F	#SHIFT IN
+0x10	0x0010	#DATA LINK ESCAPE
+0x11	0x0011	#DEVICE CONTROL ONE
+0x12	0x0012	#DEVICE CONTROL TWO
+0x13	0x0013	#DEVICE CONTROL THREE
+0x14	0x0014	#DEVICE CONTROL FOUR
+0x15	0x0015	#NEGATIVE ACKNOWLEDGE
+0x16	0x0016	#SYNCHRONOUS IDLE
+0x17	0x0017	#END OF TRANSMISSION BLOCK
+0x18	0x0018	#CANCEL
+0x19	0x0019	#END OF MEDIUM
+0x1A	0x001A	#SUBSTITUTE
+0x1B	0x001B	#ESCAPE
+0x1C	0x001C	#FILE SEPARATOR
+0x1D	0x001D	#GROUP SEPARATOR
+0x1E	0x001E	#RECORD SEPARATOR
+0x1F	0x001F	#UNIT SEPARATOR
+0x20	0x0020	#SPACE
+0x21	0x0021	#EXCLAMATION MARK
+0x22	0x0022	#QUOTATION MARK
+0x23	0x0023	#NUMBER SIGN
+0x24	0x0024	#DOLLAR SIGN
+0x25	0x0025	#PERCENT SIGN
+0x26	0x0026	#AMPERSAND
+0x27	0x0027	#APOSTROPHE
+0x28	0x0028	#LEFT PARENTHESIS
+0x29	0x0029	#RIGHT PARENTHESIS
+0x2A	0x002A	#ASTERISK
+0x2B	0x002B	#PLUS SIGN
+0x2C	0x002C	#COMMA
+0x2D	0x002D	#HYPHEN-MINUS
+0x2E	0x002E	#FULL STOP
+0x2F	0x002F	#SOLIDUS
+0x30	0x0030	#DIGIT ZERO
+0x31	0x0031	#DIGIT ONE
+0x32	0x0032	#DIGIT TWO
+0x33	0x0033	#DIGIT THREE
+0x34	0x0034	#DIGIT FOUR
+0x35	0x0035	#DIGIT FIVE
+0x36	0x0036	#DIGIT SIX
+0x37	0x0037	#DIGIT SEVEN
+0x38	0x0038	#DIGIT EIGHT
+0x39	0x0039	#DIGIT NINE
+0x3A	0x003A	#COLON
+0x3B	0x003B	#SEMICOLON
+0x3C	0x003C	#LESS-THAN SIGN
+0x3D	0x003D	#EQUALS SIGN
+0x3E	0x003E	#GREATER-THAN SIGN
+0x3F	0x003F	#QUESTION MARK
+0x40	0x0040	#COMMERCIAL AT
+0x41	0x0041	#LATIN CAPITAL LETTER A
+0x42	0x0042	#LATIN CAPITAL LETTER B
+0x43	0x0043	#LATIN CAPITAL LETTER C
+0x44	0x0044	#LATIN CAPITAL LETTER D
+0x45	0x0045	#LATIN CAPITAL LETTER E
+0x46	0x0046	#LATIN CAPITAL LETTER F
+0x47	0x0047	#LATIN CAPITAL LETTER G
+0x48	0x0048	#LATIN CAPITAL LETTER H
+0x49	0x0049	#LATIN CAPITAL LETTER I
+0x4A	0x004A	#LATIN CAPITAL LETTER J
+0x4B	0x004B	#LATIN CAPITAL LETTER K
+0x4C	0x004C	#LATIN CAPITAL LETTER L
+0x4D	0x004D	#LATIN CAPITAL LETTER M
+0x4E	0x004E	#LATIN CAPITAL LETTER N
+0x4F	0x004F	#LATIN CAPITAL LETTER O
+0x50	0x0050	#LATIN CAPITAL LETTER P
+0x51	0x0051	#LATIN CAPITAL LETTER Q
+0x52	0x0052	#LATIN CAPITAL LETTER R
+0x53	0x0053	#LATIN CAPITAL LETTER S
+0x54	0x0054	#LATIN CAPITAL LETTER T
+0x55	0x0055	#LATIN CAPITAL LETTER U
+0x56	0x0056	#LATIN CAPITAL LETTER V
+0x57	0x0057	#LATIN CAPITAL LETTER W
+0x58	0x0058	#LATIN CAPITAL LETTER X
+0x59	0x0059	#LATIN CAPITAL LETTER Y
+0x5A	0x005A	#LATIN CAPITAL LETTER Z
+0x5B	0x005B	#LEFT SQUARE BRACKET
+0x5C	0x005C	#REVERSE SOLIDUS
+0x5D	0x005D	#RIGHT SQUARE BRACKET
+0x5E	0x005E	#CIRCUMFLEX ACCENT
+0x5F	0x005F	#LOW LINE
+0x60	0x0060	#GRAVE ACCENT
+0x61	0x0061	#LATIN SMALL LETTER A
+0x62	0x0062	#LATIN SMALL LETTER B
+0x63	0x0063	#LATIN SMALL LETTER C
+0x64	0x0064	#LATIN SMALL LETTER D
+0x65	0x0065	#LATIN SMALL LETTER E
+0x66	0x0066	#LATIN SMALL LETTER F
+0x67	0x0067	#LATIN SMALL LETTER G
+0x68	0x0068	#LATIN SMALL LETTER H
+0x69	0x0069	#LATIN SMALL LETTER I
+0x6A	0x006A	#LATIN SMALL LETTER J
+0x6B	0x006B	#LATIN SMALL LETTER K
+0x6C	0x006C	#LATIN SMALL LETTER L
+0x6D	0x006D	#LATIN SMALL LETTER M
+0x6E	0x006E	#LATIN SMALL LETTER N
+0x6F	0x006F	#LATIN SMALL LETTER O
+0x70	0x0070	#LATIN SMALL LETTER P
+0x71	0x0071	#LATIN SMALL LETTER Q
+0x72	0x0072	#LATIN SMALL LETTER R
+0x73	0x0073	#LATIN SMALL LETTER S
+0x74	0x0074	#LATIN SMALL LETTER T
+0x75	0x0075	#LATIN SMALL LETTER U
+0x76	0x0076	#LATIN SMALL LETTER V
+0x77	0x0077	#LATIN SMALL LETTER W
+0x78	0x0078	#LATIN SMALL LETTER X
+0x79	0x0079	#LATIN SMALL LETTER Y
+0x7A	0x007A	#LATIN SMALL LETTER Z
+0x7B	0x007B	#LEFT CURLY BRACKET
+0x7C	0x007C	#VERTICAL LINE
+0x7D	0x007D	#RIGHT CURLY BRACKET
+0x7E	0x007E	#TILDE
+0x7F	0x007F	#DELETE
+0x80	0x20AC	#EURO SIGN
+0x81	      	#UNDEFINED
+0x82	0x201A	#SINGLE LOW-9 QUOTATION MARK
+0x83	0x0192	#LATIN SMALL LETTER F WITH HOOK
+0x84	0x201E	#DOUBLE LOW-9 QUOTATION MARK
+0x85	0x2026	#HORIZONTAL ELLIPSIS
+0x86	0x2020	#DAGGER
+0x87	0x2021	#DOUBLE DAGGER
+0x88	0x02C6	#MODIFIER LETTER CIRCUMFLEX ACCENT
+0x89	0x2030	#PER MILLE SIGN
+0x8A	      	#UNDEFINED
+0x8B	0x2039	#SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+0x8C	      	#UNDEFINED
+0x8D	      	#UNDEFINED
+0x8E	      	#UNDEFINED
+0x8F	      	#UNDEFINED
+0x90	      	#UNDEFINED
+0x91	0x2018	#LEFT SINGLE QUOTATION MARK
+0x92	0x2019	#RIGHT SINGLE QUOTATION MARK
+0x93	0x201C	#LEFT DOUBLE QUOTATION MARK
+0x94	0x201D	#RIGHT DOUBLE QUOTATION MARK
+0x95	0x2022	#BULLET
+0x96	0x2013	#EN DASH
+0x97	0x2014	#EM DASH
+0x98	0x02DC	#SMALL TILDE
+0x99	0x2122	#TRADE MARK SIGN
+0x9A	      	#UNDEFINED
+0x9B	0x203A	#SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+0x9C	      	#UNDEFINED
+0x9D	      	#UNDEFINED
+0x9E	      	#UNDEFINED
+0x9F	      	#UNDEFINED
+0xA0	0x00A0	#NO-BREAK SPACE
+0xA1	0x00A1	#INVERTED EXCLAMATION MARK
+0xA2	0x00A2	#CENT SIGN
+0xA3	0x00A3	#POUND SIGN
+0xA4	0x20AA	#NEW SHEQEL SIGN
+0xA5	0x00A5	#YEN SIGN
+0xA6	0x00A6	#BROKEN BAR
+0xA7	0x00A7	#SECTION SIGN
+0xA8	0x00A8	#DIAERESIS
+0xA9	0x00A9	#COPYRIGHT SIGN
+0xAA	0x00D7	#MULTIPLICATION SIGN
+0xAB	0x00AB	#LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xAC	0x00AC	#NOT SIGN
+0xAD	0x00AD	#SOFT HYPHEN
+0xAE	0x00AE	#REGISTERED SIGN
+0xAF	0x00AF	#MACRON
+0xB0	0x00B0	#DEGREE SIGN
+0xB1	0x00B1	#PLUS-MINUS SIGN
+0xB2	0x00B2	#SUPERSCRIPT TWO
+0xB3	0x00B3	#SUPERSCRIPT THREE
+0xB4	0x00B4	#ACUTE ACCENT
+0xB5	0x00B5	#MICRO SIGN
+0xB6	0x00B6	#PILCROW SIGN
+0xB7	0x00B7	#MIDDLE DOT
+0xB8	0x00B8	#CEDILLA
+0xB9	0x00B9	#SUPERSCRIPT ONE
+0xBA	0x00F7	#DIVISION SIGN
+0xBB	0x00BB	#RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xBC	0x00BC	#VULGAR FRACTION ONE QUARTER
+0xBD	0x00BD	#VULGAR FRACTION ONE HALF
+0xBE	0x00BE	#VULGAR FRACTION THREE QUARTERS
+0xBF	0x00BF	#INVERTED QUESTION MARK
+0xC0	0x05B0	#HEBREW POINT SHEVA
+0xC1	0x05B1	#HEBREW POINT HATAF SEGOL
+0xC2	0x05B2	#HEBREW POINT HATAF PATAH
+0xC3	0x05B3	#HEBREW POINT HATAF QAMATS
+0xC4	0x05B4	#HEBREW POINT HIRIQ
+0xC5	0x05B5	#HEBREW POINT TSERE
+0xC6	0x05B6	#HEBREW POINT SEGOL
+0xC7	0x05B7	#HEBREW POINT PATAH
+0xC8	0x05B8	#HEBREW POINT QAMATS
+0xC9	0x05B9	#HEBREW POINT HOLAM
+0xCA		#UNDEFINED
+0xCB	0x05BB	#HEBREW POINT QUBUTS
+0xCC	0x05BC	#HEBREW POINT DAGESH OR MAPIQ
+0xCD	0x05BD	#HEBREW POINT METEG
+0xCE	0x05BE	#HEBREW PUNCTUATION MAQAF
+0xCF	0x05BF	#HEBREW POINT RAFE
+0xD0	0x05C0	#HEBREW PUNCTUATION PASEQ
+0xD1	0x05C1	#HEBREW POINT SHIN DOT
+0xD2	0x05C2	#HEBREW POINT SIN DOT
+0xD3	0x05C3	#HEBREW PUNCTUATION SOF PASUQ
+0xD4	0x05F0	#HEBREW LIGATURE YIDDISH DOUBLE VAV
+0xD5	0x05F1	#HEBREW LIGATURE YIDDISH VAV YOD
+0xD6	0x05F2	#HEBREW LIGATURE YIDDISH DOUBLE YOD
+0xD7	0x05F3	#HEBREW PUNCTUATION GERESH
+0xD8	0x05F4	#HEBREW PUNCTUATION GERSHAYIM
+0xD9	      	#UNDEFINED
+0xDA	      	#UNDEFINED
+0xDB	      	#UNDEFINED
+0xDC	      	#UNDEFINED
+0xDD	      	#UNDEFINED
+0xDE	      	#UNDEFINED
+0xDF	      	#UNDEFINED
+0xE0	0x05D0	#HEBREW LETTER ALEF
+0xE1	0x05D1	#HEBREW LETTER BET
+0xE2	0x05D2	#HEBREW LETTER GIMEL
+0xE3	0x05D3	#HEBREW LETTER DALET
+0xE4	0x05D4	#HEBREW LETTER HE
+0xE5	0x05D5	#HEBREW LETTER VAV
+0xE6	0x05D6	#HEBREW LETTER ZAYIN
+0xE7	0x05D7	#HEBREW LETTER HET
+0xE8	0x05D8	#HEBREW LETTER TET
+0xE9	0x05D9	#HEBREW LETTER YOD
+0xEA	0x05DA	#HEBREW LETTER FINAL KAF
+0xEB	0x05DB	#HEBREW LETTER KAF
+0xEC	0x05DC	#HEBREW LETTER LAMED
+0xED	0x05DD	#HEBREW LETTER FINAL MEM
+0xEE	0x05DE	#HEBREW LETTER MEM
+0xEF	0x05DF	#HEBREW LETTER FINAL NUN
+0xF0	0x05E0	#HEBREW LETTER NUN
+0xF1	0x05E1	#HEBREW LETTER SAMEKH
+0xF2	0x05E2	#HEBREW LETTER AYIN
+0xF3	0x05E3	#HEBREW LETTER FINAL PE
+0xF4	0x05E4	#HEBREW LETTER PE
+0xF5	0x05E5	#HEBREW LETTER FINAL TSADI
+0xF6	0x05E6	#HEBREW LETTER TSADI
+0xF7	0x05E7	#HEBREW LETTER QOF
+0xF8	0x05E8	#HEBREW LETTER RESH
+0xF9	0x05E9	#HEBREW LETTER SHIN
+0xFA	0x05EA	#HEBREW LETTER TAV
+0xFB	      	#UNDEFINED
+0xFC	      	#UNDEFINED
+0xFD	0x200E	#LEFT-TO-RIGHT MARK
+0xFE	0x200F	#RIGHT-TO-LEFT MARK
+0xFF	      	#UNDEFINED
diff --git a/lib/ucmaps/cp1256.txt b/lib/ucmaps/cp1256.txt
new file mode 100644
index 000000000..0edd081b9
--- /dev/null
+++ b/lib/ucmaps/cp1256.txt
@@ -0,0 +1,274 @@
+#
+#    Name:     cp1256 to Unicode table
+#    Unicode version: 2.1
+#    Table version: 2.01
+#    Table format:  Format A
+#    Date:          01/5/99
+#
+#    Contact:       cpxlate@microsoft.com
+#
+#    General notes: none
+#
+#    Format: Three tab-separated columns
+#        Column #1 is the cp1256 code (in hex)
+#        Column #2 is the Unicode (in hex as 0xXXXX)
+#        Column #3 is the Unicode name (follows a comment sign, '#')
+#
+#    The entries are in cp1256 order
+#
+0x00	0x0000	#NULL
+0x01	0x0001	#START OF HEADING
+0x02	0x0002	#START OF TEXT
+0x03	0x0003	#END OF TEXT
+0x04	0x0004	#END OF TRANSMISSION
+0x05	0x0005	#ENQUIRY
+0x06	0x0006	#ACKNOWLEDGE
+0x07	0x0007	#BELL
+0x08	0x0008	#BACKSPACE
+0x09	0x0009	#HORIZONTAL TABULATION
+0x0A	0x000A	#LINE FEED
+0x0B	0x000B	#VERTICAL TABULATION
+0x0C	0x000C	#FORM FEED
+0x0D	0x000D	#CARRIAGE RETURN
+0x0E	0x000E	#SHIFT OUT
+0x0F	0x000F	#SHIFT IN
+0x10	0x0010	#DATA LINK ESCAPE
+0x11	0x0011	#DEVICE CONTROL ONE
+0x12	0x0012	#DEVICE CONTROL TWO
+0x13	0x0013	#DEVICE CONTROL THREE
+0x14	0x0014	#DEVICE CONTROL FOUR
+0x15	0x0015	#NEGATIVE ACKNOWLEDGE
+0x16	0x0016	#SYNCHRONOUS IDLE
+0x17	0x0017	#END OF TRANSMISSION BLOCK
+0x18	0x0018	#CANCEL
+0x19	0x0019	#END OF MEDIUM
+0x1A	0x001A	#SUBSTITUTE
+0x1B	0x001B	#ESCAPE
+0x1C	0x001C	#FILE SEPARATOR
+0x1D	0x001D	#GROUP SEPARATOR
+0x1E	0x001E	#RECORD SEPARATOR
+0x1F	0x001F	#UNIT SEPARATOR
+0x20	0x0020	#SPACE
+0x21	0x0021	#EXCLAMATION MARK
+0x22	0x0022	#QUOTATION MARK
+0x23	0x0023	#NUMBER SIGN
+0x24	0x0024	#DOLLAR SIGN
+0x25	0x0025	#PERCENT SIGN
+0x26	0x0026	#AMPERSAND
+0x27	0x0027	#APOSTROPHE
+0x28	0x0028	#LEFT PARENTHESIS
+0x29	0x0029	#RIGHT PARENTHESIS
+0x2A	0x002A	#ASTERISK
+0x2B	0x002B	#PLUS SIGN
+0x2C	0x002C	#COMMA
+0x2D	0x002D	#HYPHEN-MINUS
+0x2E	0x002E	#FULL STOP
+0x2F	0x002F	#SOLIDUS
+0x30	0x0030	#DIGIT ZERO
+0x31	0x0031	#DIGIT ONE
+0x32	0x0032	#DIGIT TWO
+0x33	0x0033	#DIGIT THREE
+0x34	0x0034	#DIGIT FOUR
+0x35	0x0035	#DIGIT FIVE
+0x36	0x0036	#DIGIT SIX
+0x37	0x0037	#DIGIT SEVEN
+0x38	0x0038	#DIGIT EIGHT
+0x39	0x0039	#DIGIT NINE
+0x3A	0x003A	#COLON
+0x3B	0x003B	#SEMICOLON
+0x3C	0x003C	#LESS-THAN SIGN
+0x3D	0x003D	#EQUALS SIGN
+0x3E	0x003E	#GREATER-THAN SIGN
+0x3F	0x003F	#QUESTION MARK
+0x40	0x0040	#COMMERCIAL AT
+0x41	0x0041	#LATIN CAPITAL LETTER A
+0x42	0x0042	#LATIN CAPITAL LETTER B
+0x43	0x0043	#LATIN CAPITAL LETTER C
+0x44	0x0044	#LATIN CAPITAL LETTER D
+0x45	0x0045	#LATIN CAPITAL LETTER E
+0x46	0x0046	#LATIN CAPITAL LETTER F
+0x47	0x0047	#LATIN CAPITAL LETTER G
+0x48	0x0048	#LATIN CAPITAL LETTER H
+0x49	0x0049	#LATIN CAPITAL LETTER I
+0x4A	0x004A	#LATIN CAPITAL LETTER J
+0x4B	0x004B	#LATIN CAPITAL LETTER K
+0x4C	0x004C	#LATIN CAPITAL LETTER L
+0x4D	0x004D	#LATIN CAPITAL LETTER M
+0x4E	0x004E	#LATIN CAPITAL LETTER N
+0x4F	0x004F	#LATIN CAPITAL LETTER O
+0x50	0x0050	#LATIN CAPITAL LETTER P
+0x51	0x0051	#LATIN CAPITAL LETTER Q
+0x52	0x0052	#LATIN CAPITAL LETTER R
+0x53	0x0053	#LATIN CAPITAL LETTER S
+0x54	0x0054	#LATIN CAPITAL LETTER T
+0x55	0x0055	#LATIN CAPITAL LETTER U
+0x56	0x0056	#LATIN CAPITAL LETTER V
+0x57	0x0057	#LATIN CAPITAL LETTER W
+0x58	0x0058	#LATIN CAPITAL LETTER X
+0x59	0x0059	#LATIN CAPITAL LETTER Y
+0x5A	0x005A	#LATIN CAPITAL LETTER Z
+0x5B	0x005B	#LEFT SQUARE BRACKET
+0x5C	0x005C	#REVERSE SOLIDUS
+0x5D	0x005D	#RIGHT SQUARE BRACKET
+0x5E	0x005E	#CIRCUMFLEX ACCENT
+0x5F	0x005F	#LOW LINE
+0x60	0x0060	#GRAVE ACCENT
+0x61	0x0061	#LATIN SMALL LETTER A
+0x62	0x0062	#LATIN SMALL LETTER B
+0x63	0x0063	#LATIN SMALL LETTER C
+0x64	0x0064	#LATIN SMALL LETTER D
+0x65	0x0065	#LATIN SMALL LETTER E
+0x66	0x0066	#LATIN SMALL LETTER F
+0x67	0x0067	#LATIN SMALL LETTER G
+0x68	0x0068	#LATIN SMALL LETTER H
+0x69	0x0069	#LATIN SMALL LETTER I
+0x6A	0x006A	#LATIN SMALL LETTER J
+0x6B	0x006B	#LATIN SMALL LETTER K
+0x6C	0x006C	#LATIN SMALL LETTER L
+0x6D	0x006D	#LATIN SMALL LETTER M
+0x6E	0x006E	#LATIN SMALL LETTER N
+0x6F	0x006F	#LATIN SMALL LETTER O
+0x70	0x0070	#LATIN SMALL LETTER P
+0x71	0x0071	#LATIN SMALL LETTER Q
+0x72	0x0072	#LATIN SMALL LETTER R
+0x73	0x0073	#LATIN SMALL LETTER S
+0x74	0x0074	#LATIN SMALL LETTER T
+0x75	0x0075	#LATIN SMALL LETTER U
+0x76	0x0076	#LATIN SMALL LETTER V
+0x77	0x0077	#LATIN SMALL LETTER W
+0x78	0x0078	#LATIN SMALL LETTER X
+0x79	0x0079	#LATIN SMALL LETTER Y
+0x7A	0x007A	#LATIN SMALL LETTER Z
+0x7B	0x007B	#LEFT CURLY BRACKET
+0x7C	0x007C	#VERTICAL LINE
+0x7D	0x007D	#RIGHT CURLY BRACKET
+0x7E	0x007E	#TILDE
+0x7F	0x007F	#DELETE
+0x80	0x20AC	#EURO SIGN
+0x81	0x067E	#ARABIC LETTER PEH
+0x82	0x201A	#SINGLE LOW-9 QUOTATION MARK
+0x83	0x0192	#LATIN SMALL LETTER F WITH HOOK
+0x84	0x201E	#DOUBLE LOW-9 QUOTATION MARK
+0x85	0x2026	#HORIZONTAL ELLIPSIS
+0x86	0x2020	#DAGGER
+0x87	0x2021	#DOUBLE DAGGER
+0x88	0x02C6	#MODIFIER LETTER CIRCUMFLEX ACCENT
+0x89	0x2030	#PER MILLE SIGN
+0x8A	0x0679	#ARABIC LETTER TTEH
+0x8B	0x2039	#SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+0x8C	0x0152	#LATIN CAPITAL LIGATURE OE
+0x8D	0x0686	#ARABIC LETTER TCHEH
+0x8E	0x0698	#ARABIC LETTER JEH
+0x8F	0x0688	#ARABIC LETTER DDAL
+0x90	0x06AF	#ARABIC LETTER GAF
+0x91	0x2018	#LEFT SINGLE QUOTATION MARK
+0x92	0x2019	#RIGHT SINGLE QUOTATION MARK
+0x93	0x201C	#LEFT DOUBLE QUOTATION MARK
+0x94	0x201D	#RIGHT DOUBLE QUOTATION MARK
+0x95	0x2022	#BULLET
+0x96	0x2013	#EN DASH
+0x97	0x2014	#EM DASH
+0x98	0x06A9	#ARABIC LETTER KEHEH
+0x99	0x2122	#TRADE MARK SIGN
+0x9A	0x0691	#ARABIC LETTER RREH
+0x9B	0x203A	#SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+0x9C	0x0153	#LATIN SMALL LIGATURE OE
+0x9D	0x200C	#ZERO WIDTH NON-JOINER
+0x9E	0x200D	#ZERO WIDTH JOINER
+0x9F	0x06BA	#ARABIC LETTER NOON GHUNNA
+0xA0	0x00A0	#NO-BREAK SPACE
+0xA1	0x060C	#ARABIC COMMA
+0xA2	0x00A2	#CENT SIGN
+0xA3	0x00A3	#POUND SIGN
+0xA4	0x00A4	#CURRENCY SIGN
+0xA5	0x00A5	#YEN SIGN
+0xA6	0x00A6	#BROKEN BAR
+0xA7	0x00A7	#SECTION SIGN
+0xA8	0x00A8	#DIAERESIS
+0xA9	0x00A9	#COPYRIGHT SIGN
+0xAA	0x06BE	#ARABIC LETTER HEH DOACHASHMEE
+0xAB	0x00AB	#LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xAC	0x00AC	#NOT SIGN
+0xAD	0x00AD	#SOFT HYPHEN
+0xAE	0x00AE	#REGISTERED SIGN
+0xAF	0x00AF	#MACRON
+0xB0	0x00B0	#DEGREE SIGN
+0xB1	0x00B1	#PLUS-MINUS SIGN
+0xB2	0x00B2	#SUPERSCRIPT TWO
+0xB3	0x00B3	#SUPERSCRIPT THREE
+0xB4	0x00B4	#ACUTE ACCENT
+0xB5	0x00B5	#MICRO SIGN
+0xB6	0x00B6	#PILCROW SIGN
+0xB7	0x00B7	#MIDDLE DOT
+0xB8	0x00B8	#CEDILLA
+0xB9	0x00B9	#SUPERSCRIPT ONE
+0xBA	0x061B	#ARABIC SEMICOLON
+0xBB	0x00BB	#RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xBC	0x00BC	#VULGAR FRACTION ONE QUARTER
+0xBD	0x00BD	#VULGAR FRACTION ONE HALF
+0xBE	0x00BE	#VULGAR FRACTION THREE QUARTERS
+0xBF	0x061F	#ARABIC QUESTION MARK
+0xC0	0x06C1	#ARABIC LETTER HEH GOAL
+0xC1	0x0621	#ARABIC LETTER HAMZA
+0xC2	0x0622	#ARABIC LETTER ALEF WITH MADDA ABOVE
+0xC3	0x0623	#ARABIC LETTER ALEF WITH HAMZA ABOVE
+0xC4	0x0624	#ARABIC LETTER WAW WITH HAMZA ABOVE
+0xC5	0x0625	#ARABIC LETTER ALEF WITH HAMZA BELOW
+0xC6	0x0626	#ARABIC LETTER YEH WITH HAMZA ABOVE
+0xC7	0x0627	#ARABIC LETTER ALEF
+0xC8	0x0628	#ARABIC LETTER BEH
+0xC9	0x0629	#ARABIC LETTER TEH MARBUTA
+0xCA	0x062A	#ARABIC LETTER TEH
+0xCB	0x062B	#ARABIC LETTER THEH
+0xCC	0x062C	#ARABIC LETTER JEEM
+0xCD	0x062D	#ARABIC LETTER HAH
+0xCE	0x062E	#ARABIC LETTER KHAH
+0xCF	0x062F	#ARABIC LETTER DAL
+0xD0	0x0630	#ARABIC LETTER THAL
+0xD1	0x0631	#ARABIC LETTER REH
+0xD2	0x0632	#ARABIC LETTER ZAIN
+0xD3	0x0633	#ARABIC LETTER SEEN
+0xD4	0x0634	#ARABIC LETTER SHEEN
+0xD5	0x0635	#ARABIC LETTER SAD
+0xD6	0x0636	#ARABIC LETTER DAD
+0xD7	0x00D7	#MULTIPLICATION SIGN
+0xD8	0x0637	#ARABIC LETTER TAH
+0xD9	0x0638	#ARABIC LETTER ZAH
+0xDA	0x0639	#ARABIC LETTER AIN
+0xDB	0x063A	#ARABIC LETTER GHAIN
+0xDC	0x0640	#ARABIC TATWEEL
+0xDD	0x0641	#ARABIC LETTER FEH
+0xDE	0x0642	#ARABIC LETTER QAF
+0xDF	0x0643	#ARABIC LETTER KAF
+0xE0	0x00E0	#LATIN SMALL LETTER A WITH GRAVE
+0xE1	0x0644	#ARABIC LETTER LAM
+0xE2	0x00E2	#LATIN SMALL LETTER A WITH CIRCUMFLEX
+0xE3	0x0645	#ARABIC LETTER MEEM
+0xE4	0x0646	#ARABIC LETTER NOON
+0xE5	0x0647	#ARABIC LETTER HEH
+0xE6	0x0648	#ARABIC LETTER WAW
+0xE7	0x00E7	#LATIN SMALL LETTER C WITH CEDILLA
+0xE8	0x00E8	#LATIN SMALL LETTER E WITH GRAVE
+0xE9	0x00E9	#LATIN SMALL LETTER E WITH ACUTE
+0xEA	0x00EA	#LATIN SMALL LETTER E WITH CIRCUMFLEX
+0xEB	0x00EB	#LATIN SMALL LETTER E WITH DIAERESIS
+0xEC	0x0649	#ARABIC LETTER ALEF MAKSURA
+0xED	0x064A	#ARABIC LETTER YEH
+0xEE	0x00EE	#LATIN SMALL LETTER I WITH CIRCUMFLEX
+0xEF	0x00EF	#LATIN SMALL LETTER I WITH DIAERESIS
+0xF0	0x064B	#ARABIC FATHATAN
+0xF1	0x064C	#ARABIC DAMMATAN
+0xF2	0x064D	#ARABIC KASRATAN
+0xF3	0x064E	#ARABIC FATHA
+0xF4	0x00F4	#LATIN SMALL LETTER O WITH CIRCUMFLEX
+0xF5	0x064F	#ARABIC DAMMA
+0xF6	0x0650	#ARABIC KASRA
+0xF7	0x00F7	#DIVISION SIGN
+0xF8	0x0651	#ARABIC SHADDA
+0xF9	0x00F9	#LATIN SMALL LETTER U WITH GRAVE
+0xFA	0x0652	#ARABIC SUKUN
+0xFB	0x00FB	#LATIN SMALL LETTER U WITH CIRCUMFLEX
+0xFC	0x00FC	#LATIN SMALL LETTER U WITH DIAERESIS
+0xFD	0x200E	#LEFT-TO-RIGHT MARK
+0xFE	0x200F	#RIGHT-TO-LEFT MARK
+0xFF	0x06D2	#ARABIC LETTER YEH BARREE
diff --git a/lib/ucmaps/cp1257.txt b/lib/ucmaps/cp1257.txt
new file mode 100644
index 000000000..97979d931
--- /dev/null
+++ b/lib/ucmaps/cp1257.txt
@@ -0,0 +1,274 @@
+#
+#    Name:     cp1257 to Unicode table
+#    Unicode version: 2.0
+#    Table version: 2.01
+#    Table format:  Format A
+#    Date:          04/15/98
+#
+#    Contact:       cpxlate@microsoft.com
+#
+#    General notes: none
+#
+#    Format: Three tab-separated columns
+#        Column #1 is the cp1257 code (in hex)
+#        Column #2 is the Unicode (in hex as 0xXXXX)
+#        Column #3 is the Unicode name (follows a comment sign, '#')
+#
+#    The entries are in cp1257 order
+#
+0x00	0x0000	#NULL
+0x01	0x0001	#START OF HEADING
+0x02	0x0002	#START OF TEXT
+0x03	0x0003	#END OF TEXT
+0x04	0x0004	#END OF TRANSMISSION
+0x05	0x0005	#ENQUIRY
+0x06	0x0006	#ACKNOWLEDGE
+0x07	0x0007	#BELL
+0x08	0x0008	#BACKSPACE
+0x09	0x0009	#HORIZONTAL TABULATION
+0x0A	0x000A	#LINE FEED
+0x0B	0x000B	#VERTICAL TABULATION
+0x0C	0x000C	#FORM FEED
+0x0D	0x000D	#CARRIAGE RETURN
+0x0E	0x000E	#SHIFT OUT
+0x0F	0x000F	#SHIFT IN
+0x10	0x0010	#DATA LINK ESCAPE
+0x11	0x0011	#DEVICE CONTROL ONE
+0x12	0x0012	#DEVICE CONTROL TWO
+0x13	0x0013	#DEVICE CONTROL THREE
+0x14	0x0014	#DEVICE CONTROL FOUR
+0x15	0x0015	#NEGATIVE ACKNOWLEDGE
+0x16	0x0016	#SYNCHRONOUS IDLE
+0x17	0x0017	#END OF TRANSMISSION BLOCK
+0x18	0x0018	#CANCEL
+0x19	0x0019	#END OF MEDIUM
+0x1A	0x001A	#SUBSTITUTE
+0x1B	0x001B	#ESCAPE
+0x1C	0x001C	#FILE SEPARATOR
+0x1D	0x001D	#GROUP SEPARATOR
+0x1E	0x001E	#RECORD SEPARATOR
+0x1F	0x001F	#UNIT SEPARATOR
+0x20	0x0020	#SPACE
+0x21	0x0021	#EXCLAMATION MARK
+0x22	0x0022	#QUOTATION MARK
+0x23	0x0023	#NUMBER SIGN
+0x24	0x0024	#DOLLAR SIGN
+0x25	0x0025	#PERCENT SIGN
+0x26	0x0026	#AMPERSAND
+0x27	0x0027	#APOSTROPHE
+0x28	0x0028	#LEFT PARENTHESIS
+0x29	0x0029	#RIGHT PARENTHESIS
+0x2A	0x002A	#ASTERISK
+0x2B	0x002B	#PLUS SIGN
+0x2C	0x002C	#COMMA
+0x2D	0x002D	#HYPHEN-MINUS
+0x2E	0x002E	#FULL STOP
+0x2F	0x002F	#SOLIDUS
+0x30	0x0030	#DIGIT ZERO
+0x31	0x0031	#DIGIT ONE
+0x32	0x0032	#DIGIT TWO
+0x33	0x0033	#DIGIT THREE
+0x34	0x0034	#DIGIT FOUR
+0x35	0x0035	#DIGIT FIVE
+0x36	0x0036	#DIGIT SIX
+0x37	0x0037	#DIGIT SEVEN
+0x38	0x0038	#DIGIT EIGHT
+0x39	0x0039	#DIGIT NINE
+0x3A	0x003A	#COLON
+0x3B	0x003B	#SEMICOLON
+0x3C	0x003C	#LESS-THAN SIGN
+0x3D	0x003D	#EQUALS SIGN
+0x3E	0x003E	#GREATER-THAN SIGN
+0x3F	0x003F	#QUESTION MARK
+0x40	0x0040	#COMMERCIAL AT
+0x41	0x0041	#LATIN CAPITAL LETTER A
+0x42	0x0042	#LATIN CAPITAL LETTER B
+0x43	0x0043	#LATIN CAPITAL LETTER C
+0x44	0x0044	#LATIN CAPITAL LETTER D
+0x45	0x0045	#LATIN CAPITAL LETTER E
+0x46	0x0046	#LATIN CAPITAL LETTER F
+0x47	0x0047	#LATIN CAPITAL LETTER G
+0x48	0x0048	#LATIN CAPITAL LETTER H
+0x49	0x0049	#LATIN CAPITAL LETTER I
+0x4A	0x004A	#LATIN CAPITAL LETTER J
+0x4B	0x004B	#LATIN CAPITAL LETTER K
+0x4C	0x004C	#LATIN CAPITAL LETTER L
+0x4D	0x004D	#LATIN CAPITAL LETTER M
+0x4E	0x004E	#LATIN CAPITAL LETTER N
+0x4F	0x004F	#LATIN CAPITAL LETTER O
+0x50	0x0050	#LATIN CAPITAL LETTER P
+0x51	0x0051	#LATIN CAPITAL LETTER Q
+0x52	0x0052	#LATIN CAPITAL LETTER R
+0x53	0x0053	#LATIN CAPITAL LETTER S
+0x54	0x0054	#LATIN CAPITAL LETTER T
+0x55	0x0055	#LATIN CAPITAL LETTER U
+0x56	0x0056	#LATIN CAPITAL LETTER V
+0x57	0x0057	#LATIN CAPITAL LETTER W
+0x58	0x0058	#LATIN CAPITAL LETTER X
+0x59	0x0059	#LATIN CAPITAL LETTER Y
+0x5A	0x005A	#LATIN CAPITAL LETTER Z
+0x5B	0x005B	#LEFT SQUARE BRACKET
+0x5C	0x005C	#REVERSE SOLIDUS
+0x5D	0x005D	#RIGHT SQUARE BRACKET
+0x5E	0x005E	#CIRCUMFLEX ACCENT
+0x5F	0x005F	#LOW LINE
+0x60	0x0060	#GRAVE ACCENT
+0x61	0x0061	#LATIN SMALL LETTER A
+0x62	0x0062	#LATIN SMALL LETTER B
+0x63	0x0063	#LATIN SMALL LETTER C
+0x64	0x0064	#LATIN SMALL LETTER D
+0x65	0x0065	#LATIN SMALL LETTER E
+0x66	0x0066	#LATIN SMALL LETTER F
+0x67	0x0067	#LATIN SMALL LETTER G
+0x68	0x0068	#LATIN SMALL LETTER H
+0x69	0x0069	#LATIN SMALL LETTER I
+0x6A	0x006A	#LATIN SMALL LETTER J
+0x6B	0x006B	#LATIN SMALL LETTER K
+0x6C	0x006C	#LATIN SMALL LETTER L
+0x6D	0x006D	#LATIN SMALL LETTER M
+0x6E	0x006E	#LATIN SMALL LETTER N
+0x6F	0x006F	#LATIN SMALL LETTER O
+0x70	0x0070	#LATIN SMALL LETTER P
+0x71	0x0071	#LATIN SMALL LETTER Q
+0x72	0x0072	#LATIN SMALL LETTER R
+0x73	0x0073	#LATIN SMALL LETTER S
+0x74	0x0074	#LATIN SMALL LETTER T
+0x75	0x0075	#LATIN SMALL LETTER U
+0x76	0x0076	#LATIN SMALL LETTER V
+0x77	0x0077	#LATIN SMALL LETTER W
+0x78	0x0078	#LATIN SMALL LETTER X
+0x79	0x0079	#LATIN SMALL LETTER Y
+0x7A	0x007A	#LATIN SMALL LETTER Z
+0x7B	0x007B	#LEFT CURLY BRACKET
+0x7C	0x007C	#VERTICAL LINE
+0x7D	0x007D	#RIGHT CURLY BRACKET
+0x7E	0x007E	#TILDE
+0x7F	0x007F	#DELETE
+0x80	0x20AC	#EURO SIGN
+0x81	      	#UNDEFINED
+0x82	0x201A	#SINGLE LOW-9 QUOTATION MARK
+0x83	      	#UNDEFINED
+0x84	0x201E	#DOUBLE LOW-9 QUOTATION MARK
+0x85	0x2026	#HORIZONTAL ELLIPSIS
+0x86	0x2020	#DAGGER
+0x87	0x2021	#DOUBLE DAGGER
+0x88	      	#UNDEFINED
+0x89	0x2030	#PER MILLE SIGN
+0x8A	      	#UNDEFINED
+0x8B	0x2039	#SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+0x8C	      	#UNDEFINED
+0x8D	0x00A8	#DIAERESIS
+0x8E	0x02C7	#CARON
+0x8F	0x00B8	#CEDILLA
+0x90	      	#UNDEFINED
+0x91	0x2018	#LEFT SINGLE QUOTATION MARK
+0x92	0x2019	#RIGHT SINGLE QUOTATION MARK
+0x93	0x201C	#LEFT DOUBLE QUOTATION MARK
+0x94	0x201D	#RIGHT DOUBLE QUOTATION MARK
+0x95	0x2022	#BULLET
+0x96	0x2013	#EN DASH
+0x97	0x2014	#EM DASH
+0x98	      	#UNDEFINED
+0x99	0x2122	#TRADE MARK SIGN
+0x9A	      	#UNDEFINED
+0x9B	0x203A	#SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+0x9C	      	#UNDEFINED
+0x9D	0x00AF	#MACRON
+0x9E	0x02DB	#OGONEK
+0x9F	      	#UNDEFINED
+0xA0	0x00A0	#NO-BREAK SPACE
+0xA1	      	#UNDEFINED
+0xA2	0x00A2	#CENT SIGN
+0xA3	0x00A3	#POUND SIGN
+0xA4	0x00A4	#CURRENCY SIGN
+0xA5	      	#UNDEFINED
+0xA6	0x00A6	#BROKEN BAR
+0xA7	0x00A7	#SECTION SIGN
+0xA8	0x00D8	#LATIN CAPITAL LETTER O WITH STROKE
+0xA9	0x00A9	#COPYRIGHT SIGN
+0xAA	0x0156	#LATIN CAPITAL LETTER R WITH CEDILLA
+0xAB	0x00AB	#LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xAC	0x00AC	#NOT SIGN
+0xAD	0x00AD	#SOFT HYPHEN
+0xAE	0x00AE	#REGISTERED SIGN
+0xAF	0x00C6	#LATIN CAPITAL LETTER AE
+0xB0	0x00B0	#DEGREE SIGN
+0xB1	0x00B1	#PLUS-MINUS SIGN
+0xB2	0x00B2	#SUPERSCRIPT TWO
+0xB3	0x00B3	#SUPERSCRIPT THREE
+0xB4	0x00B4	#ACUTE ACCENT
+0xB5	0x00B5	#MICRO SIGN
+0xB6	0x00B6	#PILCROW SIGN
+0xB7	0x00B7	#MIDDLE DOT
+0xB8	0x00F8	#LATIN SMALL LETTER O WITH STROKE
+0xB9	0x00B9	#SUPERSCRIPT ONE
+0xBA	0x0157	#LATIN SMALL LETTER R WITH CEDILLA
+0xBB	0x00BB	#RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xBC	0x00BC	#VULGAR FRACTION ONE QUARTER
+0xBD	0x00BD	#VULGAR FRACTION ONE HALF
+0xBE	0x00BE	#VULGAR FRACTION THREE QUARTERS
+0xBF	0x00E6	#LATIN SMALL LETTER AE
+0xC0	0x0104	#LATIN CAPITAL LETTER A WITH OGONEK
+0xC1	0x012E	#LATIN CAPITAL LETTER I WITH OGONEK
+0xC2	0x0100	#LATIN CAPITAL LETTER A WITH MACRON
+0xC3	0x0106	#LATIN CAPITAL LETTER C WITH ACUTE
+0xC4	0x00C4	#LATIN CAPITAL LETTER A WITH DIAERESIS
+0xC5	0x00C5	#LATIN CAPITAL LETTER A WITH RING ABOVE
+0xC6	0x0118	#LATIN CAPITAL LETTER E WITH OGONEK
+0xC7	0x0112	#LATIN CAPITAL LETTER E WITH MACRON
+0xC8	0x010C	#LATIN CAPITAL LETTER C WITH CARON
+0xC9	0x00C9	#LATIN CAPITAL LETTER E WITH ACUTE
+0xCA	0x0179	#LATIN CAPITAL LETTER Z WITH ACUTE
+0xCB	0x0116	#LATIN CAPITAL LETTER E WITH DOT ABOVE
+0xCC	0x0122	#LATIN CAPITAL LETTER G WITH CEDILLA
+0xCD	0x0136	#LATIN CAPITAL LETTER K WITH CEDILLA
+0xCE	0x012A	#LATIN CAPITAL LETTER I WITH MACRON
+0xCF	0x013B	#LATIN CAPITAL LETTER L WITH CEDILLA
+0xD0	0x0160	#LATIN CAPITAL LETTER S WITH CARON
+0xD1	0x0143	#LATIN CAPITAL LETTER N WITH ACUTE
+0xD2	0x0145	#LATIN CAPITAL LETTER N WITH CEDILLA
+0xD3	0x00D3	#LATIN CAPITAL LETTER O WITH ACUTE
+0xD4	0x014C	#LATIN CAPITAL LETTER O WITH MACRON
+0xD5	0x00D5	#LATIN CAPITAL LETTER O WITH TILDE
+0xD6	0x00D6	#LATIN CAPITAL LETTER O WITH DIAERESIS
+0xD7	0x00D7	#MULTIPLICATION SIGN
+0xD8	0x0172	#LATIN CAPITAL LETTER U WITH OGONEK
+0xD9	0x0141	#LATIN CAPITAL LETTER L WITH STROKE
+0xDA	0x015A	#LATIN CAPITAL LETTER S WITH ACUTE
+0xDB	0x016A	#LATIN CAPITAL LETTER U WITH MACRON
+0xDC	0x00DC	#LATIN CAPITAL LETTER U WITH DIAERESIS
+0xDD	0x017B	#LATIN CAPITAL LETTER Z WITH DOT ABOVE
+0xDE	0x017D	#LATIN CAPITAL LETTER Z WITH CARON
+0xDF	0x00DF	#LATIN SMALL LETTER SHARP S
+0xE0	0x0105	#LATIN SMALL LETTER A WITH OGONEK
+0xE1	0x012F	#LATIN SMALL LETTER I WITH OGONEK
+0xE2	0x0101	#LATIN SMALL LETTER A WITH MACRON
+0xE3	0x0107	#LATIN SMALL LETTER C WITH ACUTE
+0xE4	0x00E4	#LATIN SMALL LETTER A WITH DIAERESIS
+0xE5	0x00E5	#LATIN SMALL LETTER A WITH RING ABOVE
+0xE6	0x0119	#LATIN SMALL LETTER E WITH OGONEK
+0xE7	0x0113	#LATIN SMALL LETTER E WITH MACRON
+0xE8	0x010D	#LATIN SMALL LETTER C WITH CARON
+0xE9	0x00E9	#LATIN SMALL LETTER E WITH ACUTE
+0xEA	0x017A	#LATIN SMALL LETTER Z WITH ACUTE
+0xEB	0x0117	#LATIN SMALL LETTER E WITH DOT ABOVE
+0xEC	0x0123	#LATIN SMALL LETTER G WITH CEDILLA
+0xED	0x0137	#LATIN SMALL LETTER K WITH CEDILLA
+0xEE	0x012B	#LATIN SMALL LETTER I WITH MACRON
+0xEF	0x013C	#LATIN SMALL LETTER L WITH CEDILLA
+0xF0	0x0161	#LATIN SMALL LETTER S WITH CARON
+0xF1	0x0144	#LATIN SMALL LETTER N WITH ACUTE
+0xF2	0x0146	#LATIN SMALL LETTER N WITH CEDILLA
+0xF3	0x00F3	#LATIN SMALL LETTER O WITH ACUTE
+0xF4	0x014D	#LATIN SMALL LETTER O WITH MACRON
+0xF5	0x00F5	#LATIN SMALL LETTER O WITH TILDE
+0xF6	0x00F6	#LATIN SMALL LETTER O WITH DIAERESIS
+0xF7	0x00F7	#DIVISION SIGN
+0xF8	0x0173	#LATIN SMALL LETTER U WITH OGONEK
+0xF9	0x0142	#LATIN SMALL LETTER L WITH STROKE
+0xFA	0x015B	#LATIN SMALL LETTER S WITH ACUTE
+0xFB	0x016B	#LATIN SMALL LETTER U WITH MACRON
+0xFC	0x00FC	#LATIN SMALL LETTER U WITH DIAERESIS
+0xFD	0x017C	#LATIN SMALL LETTER Z WITH DOT ABOVE
+0xFE	0x017E	#LATIN SMALL LETTER Z WITH CARON
+0xFF	0x02D9	#DOT ABOVE
diff --git a/lib/ucmaps/cp1258.txt b/lib/ucmaps/cp1258.txt
new file mode 100644
index 000000000..392310a8c
--- /dev/null
+++ b/lib/ucmaps/cp1258.txt
@@ -0,0 +1,274 @@
+#
+#    Name:     cp1258 to Unicode table
+#    Unicode version: 2.0
+#    Table version: 2.01
+#    Table format:  Format A
+#    Date:          04/15/98
+#
+#    Contact:       cpxlate@microsoft.com
+#
+#    General notes: none
+#
+#    Format: Three tab-separated columns
+#        Column #1 is the cp1258 code (in hex)
+#        Column #2 is the Unicode (in hex as 0xXXXX)
+#        Column #3 is the Unicode name (follows a comment sign, '#')
+#
+#    The entries are in cp1258 order
+#
+0x00	0x0000	#NULL
+0x01	0x0001	#START OF HEADING
+0x02	0x0002	#START OF TEXT
+0x03	0x0003	#END OF TEXT
+0x04	0x0004	#END OF TRANSMISSION
+0x05	0x0005	#ENQUIRY
+0x06	0x0006	#ACKNOWLEDGE
+0x07	0x0007	#BELL
+0x08	0x0008	#BACKSPACE
+0x09	0x0009	#HORIZONTAL TABULATION
+0x0A	0x000A	#LINE FEED
+0x0B	0x000B	#VERTICAL TABULATION
+0x0C	0x000C	#FORM FEED
+0x0D	0x000D	#CARRIAGE RETURN
+0x0E	0x000E	#SHIFT OUT
+0x0F	0x000F	#SHIFT IN
+0x10	0x0010	#DATA LINK ESCAPE
+0x11	0x0011	#DEVICE CONTROL ONE
+0x12	0x0012	#DEVICE CONTROL TWO
+0x13	0x0013	#DEVICE CONTROL THREE
+0x14	0x0014	#DEVICE CONTROL FOUR
+0x15	0x0015	#NEGATIVE ACKNOWLEDGE
+0x16	0x0016	#SYNCHRONOUS IDLE
+0x17	0x0017	#END OF TRANSMISSION BLOCK
+0x18	0x0018	#CANCEL
+0x19	0x0019	#END OF MEDIUM
+0x1A	0x001A	#SUBSTITUTE
+0x1B	0x001B	#ESCAPE
+0x1C	0x001C	#FILE SEPARATOR
+0x1D	0x001D	#GROUP SEPARATOR
+0x1E	0x001E	#RECORD SEPARATOR
+0x1F	0x001F	#UNIT SEPARATOR
+0x20	0x0020	#SPACE
+0x21	0x0021	#EXCLAMATION MARK
+0x22	0x0022	#QUOTATION MARK
+0x23	0x0023	#NUMBER SIGN
+0x24	0x0024	#DOLLAR SIGN
+0x25	0x0025	#PERCENT SIGN
+0x26	0x0026	#AMPERSAND
+0x27	0x0027	#APOSTROPHE
+0x28	0x0028	#LEFT PARENTHESIS
+0x29	0x0029	#RIGHT PARENTHESIS
+0x2A	0x002A	#ASTERISK
+0x2B	0x002B	#PLUS SIGN
+0x2C	0x002C	#COMMA
+0x2D	0x002D	#HYPHEN-MINUS
+0x2E	0x002E	#FULL STOP
+0x2F	0x002F	#SOLIDUS
+0x30	0x0030	#DIGIT ZERO
+0x31	0x0031	#DIGIT ONE
+0x32	0x0032	#DIGIT TWO
+0x33	0x0033	#DIGIT THREE
+0x34	0x0034	#DIGIT FOUR
+0x35	0x0035	#DIGIT FIVE
+0x36	0x0036	#DIGIT SIX
+0x37	0x0037	#DIGIT SEVEN
+0x38	0x0038	#DIGIT EIGHT
+0x39	0x0039	#DIGIT NINE
+0x3A	0x003A	#COLON
+0x3B	0x003B	#SEMICOLON
+0x3C	0x003C	#LESS-THAN SIGN
+0x3D	0x003D	#EQUALS SIGN
+0x3E	0x003E	#GREATER-THAN SIGN
+0x3F	0x003F	#QUESTION MARK
+0x40	0x0040	#COMMERCIAL AT
+0x41	0x0041	#LATIN CAPITAL LETTER A
+0x42	0x0042	#LATIN CAPITAL LETTER B
+0x43	0x0043	#LATIN CAPITAL LETTER C
+0x44	0x0044	#LATIN CAPITAL LETTER D
+0x45	0x0045	#LATIN CAPITAL LETTER E
+0x46	0x0046	#LATIN CAPITAL LETTER F
+0x47	0x0047	#LATIN CAPITAL LETTER G
+0x48	0x0048	#LATIN CAPITAL LETTER H
+0x49	0x0049	#LATIN CAPITAL LETTER I
+0x4A	0x004A	#LATIN CAPITAL LETTER J
+0x4B	0x004B	#LATIN CAPITAL LETTER K
+0x4C	0x004C	#LATIN CAPITAL LETTER L
+0x4D	0x004D	#LATIN CAPITAL LETTER M
+0x4E	0x004E	#LATIN CAPITAL LETTER N
+0x4F	0x004F	#LATIN CAPITAL LETTER O
+0x50	0x0050	#LATIN CAPITAL LETTER P
+0x51	0x0051	#LATIN CAPITAL LETTER Q
+0x52	0x0052	#LATIN CAPITAL LETTER R
+0x53	0x0053	#LATIN CAPITAL LETTER S
+0x54	0x0054	#LATIN CAPITAL LETTER T
+0x55	0x0055	#LATIN CAPITAL LETTER U
+0x56	0x0056	#LATIN CAPITAL LETTER V
+0x57	0x0057	#LATIN CAPITAL LETTER W
+0x58	0x0058	#LATIN CAPITAL LETTER X
+0x59	0x0059	#LATIN CAPITAL LETTER Y
+0x5A	0x005A	#LATIN CAPITAL LETTER Z
+0x5B	0x005B	#LEFT SQUARE BRACKET
+0x5C	0x005C	#REVERSE SOLIDUS
+0x5D	0x005D	#RIGHT SQUARE BRACKET
+0x5E	0x005E	#CIRCUMFLEX ACCENT
+0x5F	0x005F	#LOW LINE
+0x60	0x0060	#GRAVE ACCENT
+0x61	0x0061	#LATIN SMALL LETTER A
+0x62	0x0062	#LATIN SMALL LETTER B
+0x63	0x0063	#LATIN SMALL LETTER C
+0x64	0x0064	#LATIN SMALL LETTER D
+0x65	0x0065	#LATIN SMALL LETTER E
+0x66	0x0066	#LATIN SMALL LETTER F
+0x67	0x0067	#LATIN SMALL LETTER G
+0x68	0x0068	#LATIN SMALL LETTER H
+0x69	0x0069	#LATIN SMALL LETTER I
+0x6A	0x006A	#LATIN SMALL LETTER J
+0x6B	0x006B	#LATIN SMALL LETTER K
+0x6C	0x006C	#LATIN SMALL LETTER L
+0x6D	0x006D	#LATIN SMALL LETTER M
+0x6E	0x006E	#LATIN SMALL LETTER N
+0x6F	0x006F	#LATIN SMALL LETTER O
+0x70	0x0070	#LATIN SMALL LETTER P
+0x71	0x0071	#LATIN SMALL LETTER Q
+0x72	0x0072	#LATIN SMALL LETTER R
+0x73	0x0073	#LATIN SMALL LETTER S
+0x74	0x0074	#LATIN SMALL LETTER T
+0x75	0x0075	#LATIN SMALL LETTER U
+0x76	0x0076	#LATIN SMALL LETTER V
+0x77	0x0077	#LATIN SMALL LETTER W
+0x78	0x0078	#LATIN SMALL LETTER X
+0x79	0x0079	#LATIN SMALL LETTER Y
+0x7A	0x007A	#LATIN SMALL LETTER Z
+0x7B	0x007B	#LEFT CURLY BRACKET
+0x7C	0x007C	#VERTICAL LINE
+0x7D	0x007D	#RIGHT CURLY BRACKET
+0x7E	0x007E	#TILDE
+0x7F	0x007F	#DELETE
+0x80	0x20AC	#EURO SIGN
+0x81	      	#UNDEFINED
+0x82	0x201A	#SINGLE LOW-9 QUOTATION MARK
+0x83	0x0192	#LATIN SMALL LETTER F WITH HOOK
+0x84	0x201E	#DOUBLE LOW-9 QUOTATION MARK
+0x85	0x2026	#HORIZONTAL ELLIPSIS
+0x86	0x2020	#DAGGER
+0x87	0x2021	#DOUBLE DAGGER
+0x88	0x02C6	#MODIFIER LETTER CIRCUMFLEX ACCENT
+0x89	0x2030	#PER MILLE SIGN
+0x8A	      	#UNDEFINED
+0x8B	0x2039	#SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+0x8C	0x0152	#LATIN CAPITAL LIGATURE OE
+0x8D	      	#UNDEFINED
+0x8E	      	#UNDEFINED
+0x8F	      	#UNDEFINED
+0x90	      	#UNDEFINED
+0x91	0x2018	#LEFT SINGLE QUOTATION MARK
+0x92	0x2019	#RIGHT SINGLE QUOTATION MARK
+0x93	0x201C	#LEFT DOUBLE QUOTATION MARK
+0x94	0x201D	#RIGHT DOUBLE QUOTATION MARK
+0x95	0x2022	#BULLET
+0x96	0x2013	#EN DASH
+0x97	0x2014	#EM DASH
+0x98	0x02DC	#SMALL TILDE
+0x99	0x2122	#TRADE MARK SIGN
+0x9A	      	#UNDEFINED
+0x9B	0x203A	#SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+0x9C	0x0153	#LATIN SMALL LIGATURE OE
+0x9D	      	#UNDEFINED
+0x9E	      	#UNDEFINED
+0x9F	0x0178	#LATIN CAPITAL LETTER Y WITH DIAERESIS
+0xA0	0x00A0	#NO-BREAK SPACE
+0xA1	0x00A1	#INVERTED EXCLAMATION MARK
+0xA2	0x00A2	#CENT SIGN
+0xA3	0x00A3	#POUND SIGN
+0xA4	0x00A4	#CURRENCY SIGN
+0xA5	0x00A5	#YEN SIGN
+0xA6	0x00A6	#BROKEN BAR
+0xA7	0x00A7	#SECTION SIGN
+0xA8	0x00A8	#DIAERESIS
+0xA9	0x00A9	#COPYRIGHT SIGN
+0xAA	0x00AA	#FEMININE ORDINAL INDICATOR
+0xAB	0x00AB	#LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xAC	0x00AC	#NOT SIGN
+0xAD	0x00AD	#SOFT HYPHEN
+0xAE	0x00AE	#REGISTERED SIGN
+0xAF	0x00AF	#MACRON
+0xB0	0x00B0	#DEGREE SIGN
+0xB1	0x00B1	#PLUS-MINUS SIGN
+0xB2	0x00B2	#SUPERSCRIPT TWO
+0xB3	0x00B3	#SUPERSCRIPT THREE
+0xB4	0x00B4	#ACUTE ACCENT
+0xB5	0x00B5	#MICRO SIGN
+0xB6	0x00B6	#PILCROW SIGN
+0xB7	0x00B7	#MIDDLE DOT
+0xB8	0x00B8	#CEDILLA
+0xB9	0x00B9	#SUPERSCRIPT ONE
+0xBA	0x00BA	#MASCULINE ORDINAL INDICATOR
+0xBB	0x00BB	#RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xBC	0x00BC	#VULGAR FRACTION ONE QUARTER
+0xBD	0x00BD	#VULGAR FRACTION ONE HALF
+0xBE	0x00BE	#VULGAR FRACTION THREE QUARTERS
+0xBF	0x00BF	#INVERTED QUESTION MARK
+0xC0	0x00C0	#LATIN CAPITAL LETTER A WITH GRAVE
+0xC1	0x00C1	#LATIN CAPITAL LETTER A WITH ACUTE
+0xC2	0x00C2	#LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+0xC3	0x0102	#LATIN CAPITAL LETTER A WITH BREVE
+0xC4	0x00C4	#LATIN CAPITAL LETTER A WITH DIAERESIS
+0xC5	0x00C5	#LATIN CAPITAL LETTER A WITH RING ABOVE
+0xC6	0x00C6	#LATIN CAPITAL LETTER AE
+0xC7	0x00C7	#LATIN CAPITAL LETTER C WITH CEDILLA
+0xC8	0x00C8	#LATIN CAPITAL LETTER E WITH GRAVE
+0xC9	0x00C9	#LATIN CAPITAL LETTER E WITH ACUTE
+0xCA	0x00CA	#LATIN CAPITAL LETTER E WITH CIRCUMFLEX
+0xCB	0x00CB	#LATIN CAPITAL LETTER E WITH DIAERESIS
+0xCC	0x0300	#COMBINING GRAVE ACCENT
+0xCD	0x00CD	#LATIN CAPITAL LETTER I WITH ACUTE
+0xCE	0x00CE	#LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+0xCF	0x00CF	#LATIN CAPITAL LETTER I WITH DIAERESIS
+0xD0	0x0110	#LATIN CAPITAL LETTER D WITH STROKE
+0xD1	0x00D1	#LATIN CAPITAL LETTER N WITH TILDE
+0xD2	0x0309	#COMBINING HOOK ABOVE
+0xD3	0x00D3	#LATIN CAPITAL LETTER O WITH ACUTE
+0xD4	0x00D4	#LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+0xD5	0x01A0	#LATIN CAPITAL LETTER O WITH HORN
+0xD6	0x00D6	#LATIN CAPITAL LETTER O WITH DIAERESIS
+0xD7	0x00D7	#MULTIPLICATION SIGN
+0xD8	0x00D8	#LATIN CAPITAL LETTER O WITH STROKE
+0xD9	0x00D9	#LATIN CAPITAL LETTER U WITH GRAVE
+0xDA	0x00DA	#LATIN CAPITAL LETTER U WITH ACUTE
+0xDB	0x00DB	#LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+0xDC	0x00DC	#LATIN CAPITAL LETTER U WITH DIAERESIS
+0xDD	0x01AF	#LATIN CAPITAL LETTER U WITH HORN
+0xDE	0x0303	#COMBINING TILDE
+0xDF	0x00DF	#LATIN SMALL LETTER SHARP S
+0xE0	0x00E0	#LATIN SMALL LETTER A WITH GRAVE
+0xE1	0x00E1	#LATIN SMALL LETTER A WITH ACUTE
+0xE2	0x00E2	#LATIN SMALL LETTER A WITH CIRCUMFLEX
+0xE3	0x0103	#LATIN SMALL LETTER A WITH BREVE
+0xE4	0x00E4	#LATIN SMALL LETTER A WITH DIAERESIS
+0xE5	0x00E5	#LATIN SMALL LETTER A WITH RING ABOVE
+0xE6	0x00E6	#LATIN SMALL LETTER AE
+0xE7	0x00E7	#LATIN SMALL LETTER C WITH CEDILLA
+0xE8	0x00E8	#LATIN SMALL LETTER E WITH GRAVE
+0xE9	0x00E9	#LATIN SMALL LETTER E WITH ACUTE
+0xEA	0x00EA	#LATIN SMALL LETTER E WITH CIRCUMFLEX
+0xEB	0x00EB	#LATIN SMALL LETTER E WITH DIAERESIS
+0xEC	0x0301	#COMBINING ACUTE ACCENT
+0xED	0x00ED	#LATIN SMALL LETTER I WITH ACUTE
+0xEE	0x00EE	#LATIN SMALL LETTER I WITH CIRCUMFLEX
+0xEF	0x00EF	#LATIN SMALL LETTER I WITH DIAERESIS
+0xF0	0x0111	#LATIN SMALL LETTER D WITH STROKE
+0xF1	0x00F1	#LATIN SMALL LETTER N WITH TILDE
+0xF2	0x0323	#COMBINING DOT BELOW
+0xF3	0x00F3	#LATIN SMALL LETTER O WITH ACUTE
+0xF4	0x00F4	#LATIN SMALL LETTER O WITH CIRCUMFLEX
+0xF5	0x01A1	#LATIN SMALL LETTER O WITH HORN
+0xF6	0x00F6	#LATIN SMALL LETTER O WITH DIAERESIS
+0xF7	0x00F7	#DIVISION SIGN
+0xF8	0x00F8	#LATIN SMALL LETTER O WITH STROKE
+0xF9	0x00F9	#LATIN SMALL LETTER U WITH GRAVE
+0xFA	0x00FA	#LATIN SMALL LETTER U WITH ACUTE
+0xFB	0x00FB	#LATIN SMALL LETTER U WITH CIRCUMFLEX
+0xFC	0x00FC	#LATIN SMALL LETTER U WITH DIAERESIS
+0xFD	0x01B0	#LATIN SMALL LETTER U WITH HORN
+0xFE	0x20AB	#DONG SIGN
+0xFF	0x00FF	#LATIN SMALL LETTER Y WITH DIAERESIS
diff --git a/lib/ucmaps/cp437.txt b/lib/ucmaps/cp437.txt
new file mode 100644
index 000000000..ae38e17ab
--- /dev/null
+++ b/lib/ucmaps/cp437.txt
@@ -0,0 +1,273 @@
+#
+#    Name:     cp437_DOSLatinUS to Unicode table
+#    Unicode version: 2.0
+#    Table version: 2.00
+#    Table format:  Format A
+#    Date:          04/24/96
+#    Authors:       Lori Brownell <loribr@microsoft.com>
+#                   K.D. Chang    <a-kchang@microsoft.com>
+#    General notes: none
+#
+#    Format: Three tab-separated columns
+#        Column #1 is the cp437_DOSLatinUS code (in hex)
+#        Column #2 is the Unicode (in hex as 0xXXXX)
+#        Column #3 is the Unicode name (follows a comment sign, '#')
+#
+#    The entries are in cp437_DOSLatinUS order
+#
+0x00	0x0000	#NULL
+0x01	0x0001	#START OF HEADING
+0x02	0x0002	#START OF TEXT
+0x03	0x0003	#END OF TEXT
+0x04	0x0004	#END OF TRANSMISSION
+0x05	0x0005	#ENQUIRY
+0x06	0x0006	#ACKNOWLEDGE
+0x07	0x0007	#BELL
+0x08	0x0008	#BACKSPACE
+0x09	0x0009	#HORIZONTAL TABULATION
+0x0a	0x000a	#LINE FEED
+0x0b	0x000b	#VERTICAL TABULATION
+0x0c	0x000c	#FORM FEED
+0x0d	0x000d	#CARRIAGE RETURN
+0x0e	0x000e	#SHIFT OUT
+0x0f	0x000f	#SHIFT IN
+0x10	0x0010	#DATA LINK ESCAPE
+0x11	0x0011	#DEVICE CONTROL ONE
+0x12	0x0012	#DEVICE CONTROL TWO
+0x13	0x0013	#DEVICE CONTROL THREE
+0x14	0x0014	#DEVICE CONTROL FOUR
+0x15	0x0015	#NEGATIVE ACKNOWLEDGE
+0x16	0x0016	#SYNCHRONOUS IDLE
+0x17	0x0017	#END OF TRANSMISSION BLOCK
+0x18	0x0018	#CANCEL
+0x19	0x0019	#END OF MEDIUM
+0x1a	0x001a	#SUBSTITUTE
+0x1b	0x001b	#ESCAPE
+0x1c	0x001c	#FILE SEPARATOR
+0x1d	0x001d	#GROUP SEPARATOR
+0x1e	0x001e	#RECORD SEPARATOR
+0x1f	0x001f	#UNIT SEPARATOR
+0x20	0x0020	#SPACE
+0x21	0x0021	#EXCLAMATION MARK
+0x22	0x0022	#QUOTATION MARK
+0x23	0x0023	#NUMBER SIGN
+0x24	0x0024	#DOLLAR SIGN
+0x25	0x0025	#PERCENT SIGN
+0x26	0x0026	#AMPERSAND
+0x27	0x0027	#APOSTROPHE
+0x28	0x0028	#LEFT PARENTHESIS
+0x29	0x0029	#RIGHT PARENTHESIS
+0x2a	0x002a	#ASTERISK
+0x2b	0x002b	#PLUS SIGN
+0x2c	0x002c	#COMMA
+0x2d	0x002d	#HYPHEN-MINUS
+0x2e	0x002e	#FULL STOP
+0x2f	0x002f	#SOLIDUS
+0x30	0x0030	#DIGIT ZERO
+0x31	0x0031	#DIGIT ONE
+0x32	0x0032	#DIGIT TWO
+0x33	0x0033	#DIGIT THREE
+0x34	0x0034	#DIGIT FOUR
+0x35	0x0035	#DIGIT FIVE
+0x36	0x0036	#DIGIT SIX
+0x37	0x0037	#DIGIT SEVEN
+0x38	0x0038	#DIGIT EIGHT
+0x39	0x0039	#DIGIT NINE
+0x3a	0x003a	#COLON
+0x3b	0x003b	#SEMICOLON
+0x3c	0x003c	#LESS-THAN SIGN
+0x3d	0x003d	#EQUALS SIGN
+0x3e	0x003e	#GREATER-THAN SIGN
+0x3f	0x003f	#QUESTION MARK
+0x40	0x0040	#COMMERCIAL AT
+0x41	0x0041	#LATIN CAPITAL LETTER A
+0x42	0x0042	#LATIN CAPITAL LETTER B
+0x43	0x0043	#LATIN CAPITAL LETTER C
+0x44	0x0044	#LATIN CAPITAL LETTER D
+0x45	0x0045	#LATIN CAPITAL LETTER E
+0x46	0x0046	#LATIN CAPITAL LETTER F
+0x47	0x0047	#LATIN CAPITAL LETTER G
+0x48	0x0048	#LATIN CAPITAL LETTER H
+0x49	0x0049	#LATIN CAPITAL LETTER I
+0x4a	0x004a	#LATIN CAPITAL LETTER J
+0x4b	0x004b	#LATIN CAPITAL LETTER K
+0x4c	0x004c	#LATIN CAPITAL LETTER L
+0x4d	0x004d	#LATIN CAPITAL LETTER M
+0x4e	0x004e	#LATIN CAPITAL LETTER N
+0x4f	0x004f	#LATIN CAPITAL LETTER O
+0x50	0x0050	#LATIN CAPITAL LETTER P
+0x51	0x0051	#LATIN CAPITAL LETTER Q
+0x52	0x0052	#LATIN CAPITAL LETTER R
+0x53	0x0053	#LATIN CAPITAL LETTER S
+0x54	0x0054	#LATIN CAPITAL LETTER T
+0x55	0x0055	#LATIN CAPITAL LETTER U
+0x56	0x0056	#LATIN CAPITAL LETTER V
+0x57	0x0057	#LATIN CAPITAL LETTER W
+0x58	0x0058	#LATIN CAPITAL LETTER X
+0x59	0x0059	#LATIN CAPITAL LETTER Y
+0x5a	0x005a	#LATIN CAPITAL LETTER Z
+0x5b	0x005b	#LEFT SQUARE BRACKET
+0x5c	0x005c	#REVERSE SOLIDUS
+0x5d	0x005d	#RIGHT SQUARE BRACKET
+0x5e	0x005e	#CIRCUMFLEX ACCENT
+0x5f	0x005f	#LOW LINE
+0x60	0x0060	#GRAVE ACCENT
+0x61	0x0061	#LATIN SMALL LETTER A
+0x62	0x0062	#LATIN SMALL LETTER B
+0x63	0x0063	#LATIN SMALL LETTER C
+0x64	0x0064	#LATIN SMALL LETTER D
+0x65	0x0065	#LATIN SMALL LETTER E
+0x66	0x0066	#LATIN SMALL LETTER F
+0x67	0x0067	#LATIN SMALL LETTER G
+0x68	0x0068	#LATIN SMALL LETTER H
+0x69	0x0069	#LATIN SMALL LETTER I
+0x6a	0x006a	#LATIN SMALL LETTER J
+0x6b	0x006b	#LATIN SMALL LETTER K
+0x6c	0x006c	#LATIN SMALL LETTER L
+0x6d	0x006d	#LATIN SMALL LETTER M
+0x6e	0x006e	#LATIN SMALL LETTER N
+0x6f	0x006f	#LATIN SMALL LETTER O
+0x70	0x0070	#LATIN SMALL LETTER P
+0x71	0x0071	#LATIN SMALL LETTER Q
+0x72	0x0072	#LATIN SMALL LETTER R
+0x73	0x0073	#LATIN SMALL LETTER S
+0x74	0x0074	#LATIN SMALL LETTER T
+0x75	0x0075	#LATIN SMALL LETTER U
+0x76	0x0076	#LATIN SMALL LETTER V
+0x77	0x0077	#LATIN SMALL LETTER W
+0x78	0x0078	#LATIN SMALL LETTER X
+0x79	0x0079	#LATIN SMALL LETTER Y
+0x7a	0x007a	#LATIN SMALL LETTER Z
+0x7b	0x007b	#LEFT CURLY BRACKET
+0x7c	0x007c	#VERTICAL LINE
+0x7d	0x007d	#RIGHT CURLY BRACKET
+0x7e	0x007e	#TILDE
+0x7f	0x007f	#DELETE
+0x80	0x00c7	#LATIN CAPITAL LETTER C WITH CEDILLA
+0x81	0x00fc	#LATIN SMALL LETTER U WITH DIAERESIS
+0x82	0x00e9	#LATIN SMALL LETTER E WITH ACUTE
+0x83	0x00e2	#LATIN SMALL LETTER A WITH CIRCUMFLEX
+0x84	0x00e4	#LATIN SMALL LETTER A WITH DIAERESIS
+0x85	0x00e0	#LATIN SMALL LETTER A WITH GRAVE
+0x86	0x00e5	#LATIN SMALL LETTER A WITH RING ABOVE
+0x87	0x00e7	#LATIN SMALL LETTER C WITH CEDILLA
+0x88	0x00ea	#LATIN SMALL LETTER E WITH CIRCUMFLEX
+0x89	0x00eb	#LATIN SMALL LETTER E WITH DIAERESIS
+0x8a	0x00e8	#LATIN SMALL LETTER E WITH GRAVE
+0x8b	0x00ef	#LATIN SMALL LETTER I WITH DIAERESIS
+0x8c	0x00ee	#LATIN SMALL LETTER I WITH CIRCUMFLEX
+0x8d	0x00ec	#LATIN SMALL LETTER I WITH GRAVE
+0x8e	0x00c4	#LATIN CAPITAL LETTER A WITH DIAERESIS
+0x8f	0x00c5	#LATIN CAPITAL LETTER A WITH RING ABOVE
+0x90	0x00c9	#LATIN CAPITAL LETTER E WITH ACUTE
+0x91	0x00e6	#LATIN SMALL LIGATURE AE
+0x92	0x00c6	#LATIN CAPITAL LIGATURE AE
+0x93	0x00f4	#LATIN SMALL LETTER O WITH CIRCUMFLEX
+0x94	0x00f6	#LATIN SMALL LETTER O WITH DIAERESIS
+0x95	0x00f2	#LATIN SMALL LETTER O WITH GRAVE
+0x96	0x00fb	#LATIN SMALL LETTER U WITH CIRCUMFLEX
+0x97	0x00f9	#LATIN SMALL LETTER U WITH GRAVE
+0x98	0x00ff	#LATIN SMALL LETTER Y WITH DIAERESIS
+0x99	0x00d6	#LATIN CAPITAL LETTER O WITH DIAERESIS
+0x9a	0x00dc	#LATIN CAPITAL LETTER U WITH DIAERESIS
+0x9b	0x00a2	#CENT SIGN
+0x9c	0x00a3	#POUND SIGN
+0x9d	0x00a5	#YEN SIGN
+0x9e	0x20a7	#PESETA SIGN
+0x9f	0x0192	#LATIN SMALL LETTER F WITH HOOK
+0xa0	0x00e1	#LATIN SMALL LETTER A WITH ACUTE
+0xa1	0x00ed	#LATIN SMALL LETTER I WITH ACUTE
+0xa2	0x00f3	#LATIN SMALL LETTER O WITH ACUTE
+0xa3	0x00fa	#LATIN SMALL LETTER U WITH ACUTE
+0xa4	0x00f1	#LATIN SMALL LETTER N WITH TILDE
+0xa5	0x00d1	#LATIN CAPITAL LETTER N WITH TILDE
+0xa6	0x00aa	#FEMININE ORDINAL INDICATOR
+0xa7	0x00ba	#MASCULINE ORDINAL INDICATOR
+0xa8	0x00bf	#INVERTED QUESTION MARK
+0xa9	0x2310	#REVERSED NOT SIGN
+0xaa	0x00ac	#NOT SIGN
+0xab	0x00bd	#VULGAR FRACTION ONE HALF
+0xac	0x00bc	#VULGAR FRACTION ONE QUARTER
+0xad	0x00a1	#INVERTED EXCLAMATION MARK
+0xae	0x00ab	#LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xaf	0x00bb	#RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xb0	0x2591	#LIGHT SHADE
+0xb1	0x2592	#MEDIUM SHADE
+0xb2	0x2593	#DARK SHADE
+0xb3	0x2502	#BOX DRAWINGS LIGHT VERTICAL
+0xb4	0x2524	#BOX DRAWINGS LIGHT VERTICAL AND LEFT
+0xb5	0x2561	#BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE
+0xb6	0x2562	#BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE
+0xb7	0x2556	#BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE
+0xb8	0x2555	#BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE
+0xb9	0x2563	#BOX DRAWINGS DOUBLE VERTICAL AND LEFT
+0xba	0x2551	#BOX DRAWINGS DOUBLE VERTICAL
+0xbb	0x2557	#BOX DRAWINGS DOUBLE DOWN AND LEFT
+0xbc	0x255d	#BOX DRAWINGS DOUBLE UP AND LEFT
+0xbd	0x255c	#BOX DRAWINGS UP DOUBLE AND LEFT SINGLE
+0xbe	0x255b	#BOX DRAWINGS UP SINGLE AND LEFT DOUBLE
+0xbf	0x2510	#BOX DRAWINGS LIGHT DOWN AND LEFT
+0xc0	0x2514	#BOX DRAWINGS LIGHT UP AND RIGHT
+0xc1	0x2534	#BOX DRAWINGS LIGHT UP AND HORIZONTAL
+0xc2	0x252c	#BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
+0xc3	0x251c	#BOX DRAWINGS LIGHT VERTICAL AND RIGHT
+0xc4	0x2500	#BOX DRAWINGS LIGHT HORIZONTAL
+0xc5	0x253c	#BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
+0xc6	0x255e	#BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE
+0xc7	0x255f	#BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE
+0xc8	0x255a	#BOX DRAWINGS DOUBLE UP AND RIGHT
+0xc9	0x2554	#BOX DRAWINGS DOUBLE DOWN AND RIGHT
+0xca	0x2569	#BOX DRAWINGS DOUBLE UP AND HORIZONTAL
+0xcb	0x2566	#BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
+0xcc	0x2560	#BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
+0xcd	0x2550	#BOX DRAWINGS DOUBLE HORIZONTAL
+0xce	0x256c	#BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
+0xcf	0x2567	#BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE
+0xd0	0x2568	#BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE
+0xd1	0x2564	#BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE
+0xd2	0x2565	#BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE
+0xd3	0x2559	#BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE
+0xd4	0x2558	#BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE
+0xd5	0x2552	#BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE
+0xd6	0x2553	#BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE
+0xd7	0x256b	#BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE
+0xd8	0x256a	#BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE
+0xd9	0x2518	#BOX DRAWINGS LIGHT UP AND LEFT
+0xda	0x250c	#BOX DRAWINGS LIGHT DOWN AND RIGHT
+0xdb	0x2588	#FULL BLOCK
+0xdc	0x2584	#LOWER HALF BLOCK
+0xdd	0x258c	#LEFT HALF BLOCK
+0xde	0x2590	#RIGHT HALF BLOCK
+0xdf	0x2580	#UPPER HALF BLOCK
+0xe0	0x03b1	#GREEK SMALL LETTER ALPHA
+0xe1	0x00df	#LATIN SMALL LETTER SHARP S
+0xe2	0x0393	#GREEK CAPITAL LETTER GAMMA
+0xe3	0x03c0	#GREEK SMALL LETTER PI
+0xe4	0x03a3	#GREEK CAPITAL LETTER SIGMA
+0xe5	0x03c3	#GREEK SMALL LETTER SIGMA
+0xe6	0x00b5	#MICRO SIGN
+0xe7	0x03c4	#GREEK SMALL LETTER TAU
+0xe8	0x03a6	#GREEK CAPITAL LETTER PHI
+0xe9	0x0398	#GREEK CAPITAL LETTER THETA
+0xea	0x03a9	#GREEK CAPITAL LETTER OMEGA
+0xeb	0x03b4	#GREEK SMALL LETTER DELTA
+0xec	0x221e	#INFINITY
+0xed	0x03c6	#GREEK SMALL LETTER PHI
+0xee	0x03b5	#GREEK SMALL LETTER EPSILON
+0xef	0x2229	#INTERSECTION
+0xf0	0x2261	#IDENTICAL TO
+0xf1	0x00b1	#PLUS-MINUS SIGN
+0xf2	0x2265	#GREATER-THAN OR EQUAL TO
+0xf3	0x2264	#LESS-THAN OR EQUAL TO
+0xf4	0x2320	#TOP HALF INTEGRAL
+0xf5	0x2321	#BOTTOM HALF INTEGRAL
+0xf6	0x00f7	#DIVISION SIGN
+0xf7	0x2248	#ALMOST EQUAL TO
+0xf8	0x00b0	#DEGREE SIGN
+0xf9	0x2219	#BULLET OPERATOR
+0xfa	0x00b7	#MIDDLE DOT
+0xfb	0x221a	#SQUARE ROOT
+0xfc	0x207f	#SUPERSCRIPT LATIN SMALL LETTER N
+0xfd	0x00b2	#SUPERSCRIPT TWO
+0xfe	0x25a0	#BLACK SQUARE
+0xff	0x00a0	#NO-BREAK SPACE
diff --git a/lib/ucmaps/cp737.txt b/lib/ucmaps/cp737.txt
new file mode 100644
index 000000000..0fc572fc3
--- /dev/null
+++ b/lib/ucmaps/cp737.txt
@@ -0,0 +1,273 @@
+#
+#    Name:     cp737_DOSGreek to Unicode table
+#    Unicode version: 2.0
+#    Table version: 2.00
+#    Table format:  Format A
+#    Date:          04/24/96
+#    Authors:       Lori Brownell <loribr@microsoft.com>
+#                   K.D. Chang    <a-kchang@microsoft.com>
+#    General notes: none
+#
+#    Format: Three tab-separated columns
+#        Column #1 is the cp737_DOSGreek code (in hex)
+#        Column #2 is the Unicode (in hex as 0xXXXX)
+#        Column #3 is the Unicode name (follows a comment sign, '#')
+#
+#    The entries are in cp737_DOSGreek order
+#
+0x00	0x0000	#NULL
+0x01	0x0001	#START OF HEADING
+0x02	0x0002	#START OF TEXT
+0x03	0x0003	#END OF TEXT
+0x04	0x0004	#END OF TRANSMISSION
+0x05	0x0005	#ENQUIRY
+0x06	0x0006	#ACKNOWLEDGE
+0x07	0x0007	#BELL
+0x08	0x0008	#BACKSPACE
+0x09	0x0009	#HORIZONTAL TABULATION
+0x0a	0x000a	#LINE FEED
+0x0b	0x000b	#VERTICAL TABULATION
+0x0c	0x000c	#FORM FEED
+0x0d	0x000d	#CARRIAGE RETURN
+0x0e	0x000e	#SHIFT OUT
+0x0f	0x000f	#SHIFT IN
+0x10	0x0010	#DATA LINK ESCAPE
+0x11	0x0011	#DEVICE CONTROL ONE
+0x12	0x0012	#DEVICE CONTROL TWO
+0x13	0x0013	#DEVICE CONTROL THREE
+0x14	0x0014	#DEVICE CONTROL FOUR
+0x15	0x0015	#NEGATIVE ACKNOWLEDGE
+0x16	0x0016	#SYNCHRONOUS IDLE
+0x17	0x0017	#END OF TRANSMISSION BLOCK
+0x18	0x0018	#CANCEL
+0x19	0x0019	#END OF MEDIUM
+0x1a	0x001a	#SUBSTITUTE
+0x1b	0x001b	#ESCAPE
+0x1c	0x001c	#FILE SEPARATOR
+0x1d	0x001d	#GROUP SEPARATOR
+0x1e	0x001e	#RECORD SEPARATOR
+0x1f	0x001f	#UNIT SEPARATOR
+0x20	0x0020	#SPACE
+0x21	0x0021	#EXCLAMATION MARK
+0x22	0x0022	#QUOTATION MARK
+0x23	0x0023	#NUMBER SIGN
+0x24	0x0024	#DOLLAR SIGN
+0x25	0x0025	#PERCENT SIGN
+0x26	0x0026	#AMPERSAND
+0x27	0x0027	#APOSTROPHE
+0x28	0x0028	#LEFT PARENTHESIS
+0x29	0x0029	#RIGHT PARENTHESIS
+0x2a	0x002a	#ASTERISK
+0x2b	0x002b	#PLUS SIGN
+0x2c	0x002c	#COMMA
+0x2d	0x002d	#HYPHEN-MINUS
+0x2e	0x002e	#FULL STOP
+0x2f	0x002f	#SOLIDUS
+0x30	0x0030	#DIGIT ZERO
+0x31	0x0031	#DIGIT ONE
+0x32	0x0032	#DIGIT TWO
+0x33	0x0033	#DIGIT THREE
+0x34	0x0034	#DIGIT FOUR
+0x35	0x0035	#DIGIT FIVE
+0x36	0x0036	#DIGIT SIX
+0x37	0x0037	#DIGIT SEVEN
+0x38	0x0038	#DIGIT EIGHT
+0x39	0x0039	#DIGIT NINE
+0x3a	0x003a	#COLON
+0x3b	0x003b	#SEMICOLON
+0x3c	0x003c	#LESS-THAN SIGN
+0x3d	0x003d	#EQUALS SIGN
+0x3e	0x003e	#GREATER-THAN SIGN
+0x3f	0x003f	#QUESTION MARK
+0x40	0x0040	#COMMERCIAL AT
+0x41	0x0041	#LATIN CAPITAL LETTER A
+0x42	0x0042	#LATIN CAPITAL LETTER B
+0x43	0x0043	#LATIN CAPITAL LETTER C
+0x44	0x0044	#LATIN CAPITAL LETTER D
+0x45	0x0045	#LATIN CAPITAL LETTER E
+0x46	0x0046	#LATIN CAPITAL LETTER F
+0x47	0x0047	#LATIN CAPITAL LETTER G
+0x48	0x0048	#LATIN CAPITAL LETTER H
+0x49	0x0049	#LATIN CAPITAL LETTER I
+0x4a	0x004a	#LATIN CAPITAL LETTER J
+0x4b	0x004b	#LATIN CAPITAL LETTER K
+0x4c	0x004c	#LATIN CAPITAL LETTER L
+0x4d	0x004d	#LATIN CAPITAL LETTER M
+0x4e	0x004e	#LATIN CAPITAL LETTER N
+0x4f	0x004f	#LATIN CAPITAL LETTER O
+0x50	0x0050	#LATIN CAPITAL LETTER P
+0x51	0x0051	#LATIN CAPITAL LETTER Q
+0x52	0x0052	#LATIN CAPITAL LETTER R
+0x53	0x0053	#LATIN CAPITAL LETTER S
+0x54	0x0054	#LATIN CAPITAL LETTER T
+0x55	0x0055	#LATIN CAPITAL LETTER U
+0x56	0x0056	#LATIN CAPITAL LETTER V
+0x57	0x0057	#LATIN CAPITAL LETTER W
+0x58	0x0058	#LATIN CAPITAL LETTER X
+0x59	0x0059	#LATIN CAPITAL LETTER Y
+0x5a	0x005a	#LATIN CAPITAL LETTER Z
+0x5b	0x005b	#LEFT SQUARE BRACKET
+0x5c	0x005c	#REVERSE SOLIDUS
+0x5d	0x005d	#RIGHT SQUARE BRACKET
+0x5e	0x005e	#CIRCUMFLEX ACCENT
+0x5f	0x005f	#LOW LINE
+0x60	0x0060	#GRAVE ACCENT
+0x61	0x0061	#LATIN SMALL LETTER A
+0x62	0x0062	#LATIN SMALL LETTER B
+0x63	0x0063	#LATIN SMALL LETTER C
+0x64	0x0064	#LATIN SMALL LETTER D
+0x65	0x0065	#LATIN SMALL LETTER E
+0x66	0x0066	#LATIN SMALL LETTER F
+0x67	0x0067	#LATIN SMALL LETTER G
+0x68	0x0068	#LATIN SMALL LETTER H
+0x69	0x0069	#LATIN SMALL LETTER I
+0x6a	0x006a	#LATIN SMALL LETTER J
+0x6b	0x006b	#LATIN SMALL LETTER K
+0x6c	0x006c	#LATIN SMALL LETTER L
+0x6d	0x006d	#LATIN SMALL LETTER M
+0x6e	0x006e	#LATIN SMALL LETTER N
+0x6f	0x006f	#LATIN SMALL LETTER O
+0x70	0x0070	#LATIN SMALL LETTER P
+0x71	0x0071	#LATIN SMALL LETTER Q
+0x72	0x0072	#LATIN SMALL LETTER R
+0x73	0x0073	#LATIN SMALL LETTER S
+0x74	0x0074	#LATIN SMALL LETTER T
+0x75	0x0075	#LATIN SMALL LETTER U
+0x76	0x0076	#LATIN SMALL LETTER V
+0x77	0x0077	#LATIN SMALL LETTER W
+0x78	0x0078	#LATIN SMALL LETTER X
+0x79	0x0079	#LATIN SMALL LETTER Y
+0x7a	0x007a	#LATIN SMALL LETTER Z
+0x7b	0x007b	#LEFT CURLY BRACKET
+0x7c	0x007c	#VERTICAL LINE
+0x7d	0x007d	#RIGHT CURLY BRACKET
+0x7e	0x007e	#TILDE
+0x7f	0x007f	#DELETE
+0x80	0x0391	#GREEK CAPITAL LETTER ALPHA
+0x81	0x0392	#GREEK CAPITAL LETTER BETA
+0x82	0x0393	#GREEK CAPITAL LETTER GAMMA
+0x83	0x0394	#GREEK CAPITAL LETTER DELTA
+0x84	0x0395	#GREEK CAPITAL LETTER EPSILON
+0x85	0x0396	#GREEK CAPITAL LETTER ZETA
+0x86	0x0397	#GREEK CAPITAL LETTER ETA
+0x87	0x0398	#GREEK CAPITAL LETTER THETA
+0x88	0x0399	#GREEK CAPITAL LETTER IOTA
+0x89	0x039a	#GREEK CAPITAL LETTER KAPPA
+0x8a	0x039b	#GREEK CAPITAL LETTER LAMDA
+0x8b	0x039c	#GREEK CAPITAL LETTER MU
+0x8c	0x039d	#GREEK CAPITAL LETTER NU
+0x8d	0x039e	#GREEK CAPITAL LETTER XI
+0x8e	0x039f	#GREEK CAPITAL LETTER OMICRON
+0x8f	0x03a0	#GREEK CAPITAL LETTER PI
+0x90	0x03a1	#GREEK CAPITAL LETTER RHO
+0x91	0x03a3	#GREEK CAPITAL LETTER SIGMA
+0x92	0x03a4	#GREEK CAPITAL LETTER TAU
+0x93	0x03a5	#GREEK CAPITAL LETTER UPSILON
+0x94	0x03a6	#GREEK CAPITAL LETTER PHI
+0x95	0x03a7	#GREEK CAPITAL LETTER CHI
+0x96	0x03a8	#GREEK CAPITAL LETTER PSI
+0x97	0x03a9	#GREEK CAPITAL LETTER OMEGA
+0x98	0x03b1	#GREEK SMALL LETTER ALPHA
+0x99	0x03b2	#GREEK SMALL LETTER BETA
+0x9a	0x03b3	#GREEK SMALL LETTER GAMMA
+0x9b	0x03b4	#GREEK SMALL LETTER DELTA
+0x9c	0x03b5	#GREEK SMALL LETTER EPSILON
+0x9d	0x03b6	#GREEK SMALL LETTER ZETA
+0x9e	0x03b7	#GREEK SMALL LETTER ETA
+0x9f	0x03b8	#GREEK SMALL LETTER THETA
+0xa0	0x03b9	#GREEK SMALL LETTER IOTA
+0xa1	0x03ba	#GREEK SMALL LETTER KAPPA
+0xa2	0x03bb	#GREEK SMALL LETTER LAMDA
+0xa3	0x03bc	#GREEK SMALL LETTER MU
+0xa4	0x03bd	#GREEK SMALL LETTER NU
+0xa5	0x03be	#GREEK SMALL LETTER XI
+0xa6	0x03bf	#GREEK SMALL LETTER OMICRON
+0xa7	0x03c0	#GREEK SMALL LETTER PI
+0xa8	0x03c1	#GREEK SMALL LETTER RHO
+0xa9	0x03c3	#GREEK SMALL LETTER SIGMA
+0xaa	0x03c2	#GREEK SMALL LETTER FINAL SIGMA
+0xab	0x03c4	#GREEK SMALL LETTER TAU
+0xac	0x03c5	#GREEK SMALL LETTER UPSILON
+0xad	0x03c6	#GREEK SMALL LETTER PHI
+0xae	0x03c7	#GREEK SMALL LETTER CHI
+0xaf	0x03c8	#GREEK SMALL LETTER PSI
+0xb0	0x2591	#LIGHT SHADE
+0xb1	0x2592	#MEDIUM SHADE
+0xb2	0x2593	#DARK SHADE
+0xb3	0x2502	#BOX DRAWINGS LIGHT VERTICAL
+0xb4	0x2524	#BOX DRAWINGS LIGHT VERTICAL AND LEFT
+0xb5	0x2561	#BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE
+0xb6	0x2562	#BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE
+0xb7	0x2556	#BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE
+0xb8	0x2555	#BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE
+0xb9	0x2563	#BOX DRAWINGS DOUBLE VERTICAL AND LEFT
+0xba	0x2551	#BOX DRAWINGS DOUBLE VERTICAL
+0xbb	0x2557	#BOX DRAWINGS DOUBLE DOWN AND LEFT
+0xbc	0x255d	#BOX DRAWINGS DOUBLE UP AND LEFT
+0xbd	0x255c	#BOX DRAWINGS UP DOUBLE AND LEFT SINGLE
+0xbe	0x255b	#BOX DRAWINGS UP SINGLE AND LEFT DOUBLE
+0xbf	0x2510	#BOX DRAWINGS LIGHT DOWN AND LEFT
+0xc0	0x2514	#BOX DRAWINGS LIGHT UP AND RIGHT
+0xc1	0x2534	#BOX DRAWINGS LIGHT UP AND HORIZONTAL
+0xc2	0x252c	#BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
+0xc3	0x251c	#BOX DRAWINGS LIGHT VERTICAL AND RIGHT
+0xc4	0x2500	#BOX DRAWINGS LIGHT HORIZONTAL
+0xc5	0x253c	#BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
+0xc6	0x255e	#BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE
+0xc7	0x255f	#BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE
+0xc8	0x255a	#BOX DRAWINGS DOUBLE UP AND RIGHT
+0xc9	0x2554	#BOX DRAWINGS DOUBLE DOWN AND RIGHT
+0xca	0x2569	#BOX DRAWINGS DOUBLE UP AND HORIZONTAL
+0xcb	0x2566	#BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
+0xcc	0x2560	#BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
+0xcd	0x2550	#BOX DRAWINGS DOUBLE HORIZONTAL
+0xce	0x256c	#BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
+0xcf	0x2567	#BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE
+0xd0	0x2568	#BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE
+0xd1	0x2564	#BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE
+0xd2	0x2565	#BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE
+0xd3	0x2559	#BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE
+0xd4	0x2558	#BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE
+0xd5	0x2552	#BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE
+0xd6	0x2553	#BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE
+0xd7	0x256b	#BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE
+0xd8	0x256a	#BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE
+0xd9	0x2518	#BOX DRAWINGS LIGHT UP AND LEFT
+0xda	0x250c	#BOX DRAWINGS LIGHT DOWN AND RIGHT
+0xdb	0x2588	#FULL BLOCK
+0xdc	0x2584	#LOWER HALF BLOCK
+0xdd	0x258c	#LEFT HALF BLOCK
+0xde	0x2590	#RIGHT HALF BLOCK
+0xdf	0x2580	#UPPER HALF BLOCK
+0xe0	0x03c9	#GREEK SMALL LETTER OMEGA
+0xe1	0x03ac	#GREEK SMALL LETTER ALPHA WITH TONOS
+0xe2	0x03ad	#GREEK SMALL LETTER EPSILON WITH TONOS
+0xe3	0x03ae	#GREEK SMALL LETTER ETA WITH TONOS
+0xe4	0x03ca	#GREEK SMALL LETTER IOTA WITH DIALYTIKA
+0xe5	0x03af	#GREEK SMALL LETTER IOTA WITH TONOS
+0xe6	0x03cc	#GREEK SMALL LETTER OMICRON WITH TONOS
+0xe7	0x03cd	#GREEK SMALL LETTER UPSILON WITH TONOS
+0xe8	0x03cb	#GREEK SMALL LETTER UPSILON WITH DIALYTIKA
+0xe9	0x03ce	#GREEK SMALL LETTER OMEGA WITH TONOS
+0xea	0x0386	#GREEK CAPITAL LETTER ALPHA WITH TONOS
+0xeb	0x0388	#GREEK CAPITAL LETTER EPSILON WITH TONOS
+0xec	0x0389	#GREEK CAPITAL LETTER ETA WITH TONOS
+0xed	0x038a	#GREEK CAPITAL LETTER IOTA WITH TONOS
+0xee	0x038c	#GREEK CAPITAL LETTER OMICRON WITH TONOS
+0xef	0x038e	#GREEK CAPITAL LETTER UPSILON WITH TONOS
+0xf0	0x038f	#GREEK CAPITAL LETTER OMEGA WITH TONOS
+0xf1	0x00b1	#PLUS-MINUS SIGN
+0xf2	0x2265	#GREATER-THAN OR EQUAL TO
+0xf3	0x2264	#LESS-THAN OR EQUAL TO
+0xf4	0x03aa	#GREEK CAPITAL LETTER IOTA WITH DIALYTIKA
+0xf5	0x03ab	#GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA
+0xf6	0x00f7	#DIVISION SIGN
+0xf7	0x2248	#ALMOST EQUAL TO
+0xf8	0x00b0	#DEGREE SIGN
+0xf9	0x2219	#BULLET OPERATOR
+0xfa	0x00b7	#MIDDLE DOT
+0xfb	0x221a	#SQUARE ROOT
+0xfc	0x207f	#SUPERSCRIPT LATIN SMALL LETTER N
+0xfd	0x00b2	#SUPERSCRIPT TWO
+0xfe	0x25a0	#BLACK SQUARE
+0xff	0x00a0	#NO-BREAK SPACE
diff --git a/lib/ucmaps/cp775.txt b/lib/ucmaps/cp775.txt
new file mode 100644
index 000000000..1ad4e4e58
--- /dev/null
+++ b/lib/ucmaps/cp775.txt
@@ -0,0 +1,274 @@
+#
+#    Name:     cp775_DOSBaltRim to Unicode table
+#    Unicode version: 2.0
+#    Table version: 2.00
+#    Table format:  Format A
+#    Date:          04/24/96
+#    Authors:       Lori Brownell <loribr@microsoft.com>
+#                   K.D. Chang    <a-kchang@microsoft.com>
+#    General notes: none
+#
+#    Format: Three tab-separated columns
+#        Column #1 is the cp775_DOSBaltRim code (in hex)
+#        Column #2 is the Unicode (in hex as 0xXXXX)
+#        Column #3 is the Unicode name (follows a comment sign, '#')
+#
+#    The entries are in cp775_DOSBaltRim order
+#
+0x00	0x0000	#NULL
+0x01	0x0001	#START OF HEADING
+0x02	0x0002	#START OF TEXT
+0x03	0x0003	#END OF TEXT
+0x04	0x0004	#END OF TRANSMISSION
+0x05	0x0005	#ENQUIRY
+0x06	0x0006	#ACKNOWLEDGE
+0x07	0x0007	#BELL
+0x08	0x0008	#BACKSPACE
+0x09	0x0009	#HORIZONTAL TABULATION
+0x0a	0x000a	#LINE FEED
+0x0b	0x000b	#VERTICAL TABULATION
+0x0c	0x000c	#FORM FEED
+0x0d	0x000d	#CARRIAGE RETURN
+0x0e	0x000e	#SHIFT OUT
+0x0f	0x000f	#SHIFT IN
+0x10	0x0010	#DATA LINK ESCAPE
+0x11	0x0011	#DEVICE CONTROL ONE
+0x12	0x0012	#DEVICE CONTROL TWO
+0x13	0x0013	#DEVICE CONTROL THREE
+0x14	0x0014	#DEVICE CONTROL FOUR
+0x15	0x0015	#NEGATIVE ACKNOWLEDGE
+0x16	0x0016	#SYNCHRONOUS IDLE
+0x17	0x0017	#END OF TRANSMISSION BLOCK
+0x18	0x0018	#CANCEL
+0x19	0x0019	#END OF MEDIUM
+0x1a	0x001a	#SUBSTITUTE
+0x1b	0x001b	#ESCAPE
+0x1c	0x001c	#FILE SEPARATOR
+0x1d	0x001d	#GROUP SEPARATOR
+0x1e	0x001e	#RECORD SEPARATOR
+0x1f	0x001f	#UNIT SEPARATOR
+0x20	0x0020	#SPACE
+0x21	0x0021	#EXCLAMATION MARK
+0x22	0x0022	#QUOTATION MARK
+0x23	0x0023	#NUMBER SIGN
+0x24	0x0024	#DOLLAR SIGN
+0x25	0x0025	#PERCENT SIGN
+0x26	0x0026	#AMPERSAND
+0x27	0x0027	#APOSTROPHE
+0x28	0x0028	#LEFT PARENTHESIS
+0x29	0x0029	#RIGHT PARENTHESIS
+0x2a	0x002a	#ASTERISK
+0x2b	0x002b	#PLUS SIGN
+0x2c	0x002c	#COMMA
+0x2d	0x002d	#HYPHEN-MINUS
+0x2e	0x002e	#FULL STOP
+0x2f	0x002f	#SOLIDUS
+0x30	0x0030	#DIGIT ZERO
+0x31	0x0031	#DIGIT ONE
+0x32	0x0032	#DIGIT TWO
+0x33	0x0033	#DIGIT THREE
+0x34	0x0034	#DIGIT FOUR
+0x35	0x0035	#DIGIT FIVE
+0x36	0x0036	#DIGIT SIX
+0x37	0x0037	#DIGIT SEVEN
+0x38	0x0038	#DIGIT EIGHT
+0x39	0x0039	#DIGIT NINE
+0x3a	0x003a	#COLON
+0x3b	0x003b	#SEMICOLON
+0x3c	0x003c	#LESS-THAN SIGN
+0x3d	0x003d	#EQUALS SIGN
+0x3e	0x003e	#GREATER-THAN SIGN
+0x3f	0x003f	#QUESTION MARK
+0x40	0x0040	#COMMERCIAL AT
+0x41	0x0041	#LATIN CAPITAL LETTER A
+0x42	0x0042	#LATIN CAPITAL LETTER B
+0x43	0x0043	#LATIN CAPITAL LETTER C
+0x44	0x0044	#LATIN CAPITAL LETTER D
+0x45	0x0045	#LATIN CAPITAL LETTER E
+0x46	0x0046	#LATIN CAPITAL LETTER F
+0x47	0x0047	#LATIN CAPITAL LETTER G
+0x48	0x0048	#LATIN CAPITAL LETTER H
+0x49	0x0049	#LATIN CAPITAL LETTER I
+0x4a	0x004a	#LATIN CAPITAL LETTER J
+0x4b	0x004b	#LATIN CAPITAL LETTER K
+0x4c	0x004c	#LATIN CAPITAL LETTER L
+0x4d	0x004d	#LATIN CAPITAL LETTER M
+0x4e	0x004e	#LATIN CAPITAL LETTER N
+0x4f	0x004f	#LATIN CAPITAL LETTER O
+0x50	0x0050	#LATIN CAPITAL LETTER P
+0x51	0x0051	#LATIN CAPITAL LETTER Q
+0x52	0x0052	#LATIN CAPITAL LETTER R
+0x53	0x0053	#LATIN CAPITAL LETTER S
+0x54	0x0054	#LATIN CAPITAL LETTER T
+0x55	0x0055	#LATIN CAPITAL LETTER U
+0x56	0x0056	#LATIN CAPITAL LETTER V
+0x57	0x0057	#LATIN CAPITAL LETTER W
+0x58	0x0058	#LATIN CAPITAL LETTER X
+0x59	0x0059	#LATIN CAPITAL LETTER Y
+0x5a	0x005a	#LATIN CAPITAL LETTER Z
+0x5b	0x005b	#LEFT SQUARE BRACKET
+0x5c	0x005c	#REVERSE SOLIDUS
+0x5d	0x005d	#RIGHT SQUARE BRACKET
+0x5e	0x005e	#CIRCUMFLEX ACCENT
+0x5f	0x005f	#LOW LINE
+0x60	0x0060	#GRAVE ACCENT
+0x61	0x0061	#LATIN SMALL LETTER A
+0x62	0x0062	#LATIN SMALL LETTER B
+0x63	0x0063	#LATIN SMALL LETTER C
+0x64	0x0064	#LATIN SMALL LETTER D
+0x65	0x0065	#LATIN SMALL LETTER E
+0x66	0x0066	#LATIN SMALL LETTER F
+0x67	0x0067	#LATIN SMALL LETTER G
+0x68	0x0068	#LATIN SMALL LETTER H
+0x69	0x0069	#LATIN SMALL LETTER I
+0x6a	0x006a	#LATIN SMALL LETTER J
+0x6b	0x006b	#LATIN SMALL LETTER K
+0x6c	0x006c	#LATIN SMALL LETTER L
+0x6d	0x006d	#LATIN SMALL LETTER M
+0x6e	0x006e	#LATIN SMALL LETTER N
+0x6f	0x006f	#LATIN SMALL LETTER O
+0x70	0x0070	#LATIN SMALL LETTER P
+0x71	0x0071	#LATIN SMALL LETTER Q
+0x72	0x0072	#LATIN SMALL LETTER R
+0x73	0x0073	#LATIN SMALL LETTER S
+0x74	0x0074	#LATIN SMALL LETTER T
+0x75	0x0075	#LATIN SMALL LETTER U
+0x76	0x0076	#LATIN SMALL LETTER V
+0x77	0x0077	#LATIN SMALL LETTER W
+0x78	0x0078	#LATIN SMALL LETTER X
+0x79	0x0079	#LATIN SMALL LETTER Y
+0x7a	0x007a	#LATIN SMALL LETTER Z
+0x7b	0x007b	#LEFT CURLY BRACKET
+0x7c	0x007c	#VERTICAL LINE
+0x7d	0x007d	#RIGHT CURLY BRACKET
+0x7e	0x007e	#TILDE
+0x7f	0x007f	#DELETE
+0x80	0x0106	#LATIN CAPITAL LETTER C WITH ACUTE
+0x81	0x00fc	#LATIN SMALL LETTER U WITH DIAERESIS
+0x82	0x00e9	#LATIN SMALL LETTER E WITH ACUTE
+0x83	0x0101	#LATIN SMALL LETTER A WITH MACRON
+0x84	0x00e4	#LATIN SMALL LETTER A WITH DIAERESIS
+0x85	0x0123	#LATIN SMALL LETTER G WITH CEDILLA
+0x86	0x00e5	#LATIN SMALL LETTER A WITH RING ABOVE
+0x87	0x0107	#LATIN SMALL LETTER C WITH ACUTE
+0x88	0x0142	#LATIN SMALL LETTER L WITH STROKE
+0x89	0x0113	#LATIN SMALL LETTER E WITH MACRON
+0x8a	0x0156	#LATIN CAPITAL LETTER R WITH CEDILLA
+0x8b	0x0157	#LATIN SMALL LETTER R WITH CEDILLA
+0x8c	0x012b	#LATIN SMALL LETTER I WITH MACRON
+0x8d	0x0179	#LATIN CAPITAL LETTER Z WITH ACUTE
+0x8e	0x00c4	#LATIN CAPITAL LETTER A WITH DIAERESIS
+0x8f	0x00c5	#LATIN CAPITAL LETTER A WITH RING ABOVE
+0x90	0x00c9	#LATIN CAPITAL LETTER E WITH ACUTE
+0x91	0x00e6	#LATIN SMALL LIGATURE AE
+0x92	0x00c6	#LATIN CAPITAL LIGATURE AE
+0x93	0x014d	#LATIN SMALL LETTER O WITH MACRON
+0x94	0x00f6	#LATIN SMALL LETTER O WITH DIAERESIS
+0x95	0x0122	#LATIN CAPITAL LETTER G WITH CEDILLA
+0x96	0x00a2	#CENT SIGN
+0x97	0x015a	#LATIN CAPITAL LETTER S WITH ACUTE
+0x98	0x015b	#LATIN SMALL LETTER S WITH ACUTE
+0x99	0x00d6	#LATIN CAPITAL LETTER O WITH DIAERESIS
+0x9a	0x00dc	#LATIN CAPITAL LETTER U WITH DIAERESIS
+0x9b	0x00f8	#LATIN SMALL LETTER O WITH STROKE
+0x9c	0x00a3	#POUND SIGN
+0x9d	0x00d8	#LATIN CAPITAL LETTER O WITH STROKE
+0x9e	0x00d7	#MULTIPLICATION SIGN
+0x9f	0x00a4	#CURRENCY SIGN
+0xa0	0x0100	#LATIN CAPITAL LETTER A WITH MACRON
+0xa1	0x012a	#LATIN CAPITAL LETTER I WITH MACRON
+0xa2	0x00f3	#LATIN SMALL LETTER O WITH ACUTE
+0xa3	0x017b	#LATIN CAPITAL LETTER Z WITH DOT ABOVE
+0xa4	0x017c	#LATIN SMALL LETTER Z WITH DOT ABOVE
+0xa5	0x017a	#LATIN SMALL LETTER Z WITH ACUTE
+0xa6	0x201d	#RIGHT DOUBLE QUOTATION MARK
+0xa7	0x00a6	#BROKEN BAR
+0xa8	0x00a9	#COPYRIGHT SIGN
+0xa9	0x00ae	#REGISTERED SIGN
+0xaa	0x00ac	#NOT SIGN
+0xab	0x00bd	#VULGAR FRACTION ONE HALF
+0xac	0x00bc	#VULGAR FRACTION ONE QUARTER
+0xad	0x0141	#LATIN CAPITAL LETTER L WITH STROKE
+0xae	0x00ab	#LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xaf	0x00bb	#RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xb0	0x2591	#LIGHT SHADE
+0xb1	0x2592	#MEDIUM SHADE
+0xb2	0x2593	#DARK SHADE
+0xb3	0x2502	#BOX DRAWINGS LIGHT VERTICAL
+0xb4	0x2524	#BOX DRAWINGS LIGHT VERTICAL AND LEFT
+0xb5	0x0104	#LATIN CAPITAL LETTER A WITH OGONEK
+0xb6	0x010c	#LATIN CAPITAL LETTER C WITH CARON
+0xb7	0x0118	#LATIN CAPITAL LETTER E WITH OGONEK
+0xb8	0x0116	#LATIN CAPITAL LETTER E WITH DOT ABOVE
+0xb9	0x2563	#BOX DRAWINGS DOUBLE VERTICAL AND LEFT
+0xba	0x2551	#BOX DRAWINGS DOUBLE VERTICAL
+0xbb	0x2557	#BOX DRAWINGS DOUBLE DOWN AND LEFT
+0xbc	0x255d	#BOX DRAWINGS DOUBLE UP AND LEFT
+0xbd	0x012e	#LATIN CAPITAL LETTER I WITH OGONEK
+0xbe	0x0160	#LATIN CAPITAL LETTER S WITH CARON
+0xbf	0x2510	#BOX DRAWINGS LIGHT DOWN AND LEFT
+0xc0	0x2514	#BOX DRAWINGS LIGHT UP AND RIGHT
+0xc1	0x2534	#BOX DRAWINGS LIGHT UP AND HORIZONTAL
+0xc2	0x252c	#BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
+0xc3	0x251c	#BOX DRAWINGS LIGHT VERTICAL AND RIGHT
+0xc4	0x2500	#BOX DRAWINGS LIGHT HORIZONTAL
+0xc5	0x253c	#BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
+0xc6	0x0172	#LATIN CAPITAL LETTER U WITH OGONEK
+0xc7	0x016a	#LATIN CAPITAL LETTER U WITH MACRON
+0xc8	0x255a	#BOX DRAWINGS DOUBLE UP AND RIGHT
+0xc9	0x2554	#BOX DRAWINGS DOUBLE DOWN AND RIGHT
+0xca	0x2569	#BOX DRAWINGS DOUBLE UP AND HORIZONTAL
+0xcb	0x2566	#BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
+0xcc	0x2560	#BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
+0xcd	0x2550	#BOX DRAWINGS DOUBLE HORIZONTAL
+0xce	0x256c	#BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
+0xcf	0x017d	#LATIN CAPITAL LETTER Z WITH CARON
+0xd0	0x0105	#LATIN SMALL LETTER A WITH OGONEK
+0xd1	0x010d	#LATIN SMALL LETTER C WITH CARON
+0xd2	0x0119	#LATIN SMALL LETTER E WITH OGONEK
+0xd3	0x0117	#LATIN SMALL LETTER E WITH DOT ABOVE
+0xd4	0x012f	#LATIN SMALL LETTER I WITH OGONEK
+0xd5	0x0161	#LATIN SMALL LETTER S WITH CARON
+0xd6	0x0173	#LATIN SMALL LETTER U WITH OGONEK
+0xd7	0x016b	#LATIN SMALL LETTER U WITH MACRON
+0xd8	0x017e	#LATIN SMALL LETTER Z WITH CARON
+0xd9	0x2518	#BOX DRAWINGS LIGHT UP AND LEFT
+0xda	0x250c	#BOX DRAWINGS LIGHT DOWN AND RIGHT
+0xdb	0x2588	#FULL BLOCK
+0xdc	0x2584	#LOWER HALF BLOCK
+0xdd	0x258c	#LEFT HALF BLOCK
+0xde	0x2590	#RIGHT HALF BLOCK
+0xdf	0x2580	#UPPER HALF BLOCK
+0xe0	0x00d3	#LATIN CAPITAL LETTER O WITH ACUTE
+0xe1	0x00df	#LATIN SMALL LETTER SHARP S (GERMAN)
+0xe2	0x014c	#LATIN CAPITAL LETTER O WITH MACRON
+0xe3	0x0143	#LATIN CAPITAL LETTER N WITH ACUTE
+0xe4	0x00f5	#LATIN SMALL LETTER O WITH TILDE
+0xe5	0x00d5	#LATIN CAPITAL LETTER O WITH TILDE
+0xe6	0x00b5	#MICRO SIGN
+0xe7	0x0144	#LATIN SMALL LETTER N WITH ACUTE
+0xe8	0x0136	#LATIN CAPITAL LETTER K WITH CEDILLA
+0xe9	0x0137	#LATIN SMALL LETTER K WITH CEDILLA
+0xea	0x013b	#LATIN CAPITAL LETTER L WITH CEDILLA
+0xeb	0x013c	#LATIN SMALL LETTER L WITH CEDILLA
+0xec	0x0146	#LATIN SMALL LETTER N WITH CEDILLA
+0xed	0x0112	#LATIN CAPITAL LETTER E WITH MACRON
+0xee	0x0145	#LATIN CAPITAL LETTER N WITH CEDILLA
+0xef	0x2019	#RIGHT SINGLE QUOTATION MARK
+0xf0	0x00ad	#SOFT HYPHEN
+0xf1	0x00b1	#PLUS-MINUS SIGN
+0xf2	0x201c	#LEFT DOUBLE QUOTATION MARK
+0xf3	0x00be	#VULGAR FRACTION THREE QUARTERS
+0xf4	0x00b6	#PILCROW SIGN
+0xf5	0x00a7	#SECTION SIGN
+0xf6	0x00f7	#DIVISION SIGN
+0xf7	0x201e	#DOUBLE LOW-9 QUOTATION MARK
+0xf8	0x00b0	#DEGREE SIGN
+0xf9	0x2219	#BULLET OPERATOR
+0xfa	0x00b7	#MIDDLE DOT
+0xfb	0x00b9	#SUPERSCRIPT ONE
+0xfc	0x00b3	#SUPERSCRIPT THREE
+0xfd	0x00b2	#SUPERSCRIPT TWO
+0xfe	0x25a0	#BLACK SQUARE
+0xff	0x00a0	#NO-BREAK SPACE
+
diff --git a/lib/ucmaps/cp850.txt b/lib/ucmaps/cp850.txt
new file mode 100644
index 000000000..590b1afe5
--- /dev/null
+++ b/lib/ucmaps/cp850.txt
@@ -0,0 +1,273 @@
+#
+#    Name:     cp850_DOSLatin1 to Unicode table
+#    Unicode version: 2.0
+#    Table version: 2.00
+#    Table format:  Format A
+#    Date:          04/24/96
+#    Authors:       Lori Brownell <loribr@microsoft.com>
+#                   K.D. Chang    <a-kchang@microsoft.com>
+#    General notes: none
+#
+#    Format: Three tab-separated columns
+#        Column #1 is the cp850_DOSLatin1 code (in hex)
+#        Column #2 is the Unicode (in hex as 0xXXXX)
+#        Column #3 is the Unicode name (follows a comment sign, '#')
+#
+#    The entries are in cp850_DOSLatin1 order
+#
+0x00	0x0000	#NULL
+0x01	0x0001	#START OF HEADING
+0x02	0x0002	#START OF TEXT
+0x03	0x0003	#END OF TEXT
+0x04	0x0004	#END OF TRANSMISSION
+0x05	0x0005	#ENQUIRY
+0x06	0x0006	#ACKNOWLEDGE
+0x07	0x0007	#BELL
+0x08	0x0008	#BACKSPACE
+0x09	0x0009	#HORIZONTAL TABULATION
+0x0a	0x000a	#LINE FEED
+0x0b	0x000b	#VERTICAL TABULATION
+0x0c	0x000c	#FORM FEED
+0x0d	0x000d	#CARRIAGE RETURN
+0x0e	0x000e	#SHIFT OUT
+0x0f	0x000f	#SHIFT IN
+0x10	0x0010	#DATA LINK ESCAPE
+0x11	0x0011	#DEVICE CONTROL ONE
+0x12	0x0012	#DEVICE CONTROL TWO
+0x13	0x0013	#DEVICE CONTROL THREE
+0x14	0x0014	#DEVICE CONTROL FOUR
+0x15	0x0015	#NEGATIVE ACKNOWLEDGE
+0x16	0x0016	#SYNCHRONOUS IDLE
+0x17	0x0017	#END OF TRANSMISSION BLOCK
+0x18	0x0018	#CANCEL
+0x19	0x0019	#END OF MEDIUM
+0x1a	0x001a	#SUBSTITUTE
+0x1b	0x001b	#ESCAPE
+0x1c	0x001c	#FILE SEPARATOR
+0x1d	0x001d	#GROUP SEPARATOR
+0x1e	0x001e	#RECORD SEPARATOR
+0x1f	0x001f	#UNIT SEPARATOR
+0x20	0x0020	#SPACE
+0x21	0x0021	#EXCLAMATION MARK
+0x22	0x0022	#QUOTATION MARK
+0x23	0x0023	#NUMBER SIGN
+0x24	0x0024	#DOLLAR SIGN
+0x25	0x0025	#PERCENT SIGN
+0x26	0x0026	#AMPERSAND
+0x27	0x0027	#APOSTROPHE
+0x28	0x0028	#LEFT PARENTHESIS
+0x29	0x0029	#RIGHT PARENTHESIS
+0x2a	0x002a	#ASTERISK
+0x2b	0x002b	#PLUS SIGN
+0x2c	0x002c	#COMMA
+0x2d	0x002d	#HYPHEN-MINUS
+0x2e	0x002e	#FULL STOP
+0x2f	0x002f	#SOLIDUS
+0x30	0x0030	#DIGIT ZERO
+0x31	0x0031	#DIGIT ONE
+0x32	0x0032	#DIGIT TWO
+0x33	0x0033	#DIGIT THREE
+0x34	0x0034	#DIGIT FOUR
+0x35	0x0035	#DIGIT FIVE
+0x36	0x0036	#DIGIT SIX
+0x37	0x0037	#DIGIT SEVEN
+0x38	0x0038	#DIGIT EIGHT
+0x39	0x0039	#DIGIT NINE
+0x3a	0x003a	#COLON
+0x3b	0x003b	#SEMICOLON
+0x3c	0x003c	#LESS-THAN SIGN
+0x3d	0x003d	#EQUALS SIGN
+0x3e	0x003e	#GREATER-THAN SIGN
+0x3f	0x003f	#QUESTION MARK
+0x40	0x0040	#COMMERCIAL AT
+0x41	0x0041	#LATIN CAPITAL LETTER A
+0x42	0x0042	#LATIN CAPITAL LETTER B
+0x43	0x0043	#LATIN CAPITAL LETTER C
+0x44	0x0044	#LATIN CAPITAL LETTER D
+0x45	0x0045	#LATIN CAPITAL LETTER E
+0x46	0x0046	#LATIN CAPITAL LETTER F
+0x47	0x0047	#LATIN CAPITAL LETTER G
+0x48	0x0048	#LATIN CAPITAL LETTER H
+0x49	0x0049	#LATIN CAPITAL LETTER I
+0x4a	0x004a	#LATIN CAPITAL LETTER J
+0x4b	0x004b	#LATIN CAPITAL LETTER K
+0x4c	0x004c	#LATIN CAPITAL LETTER L
+0x4d	0x004d	#LATIN CAPITAL LETTER M
+0x4e	0x004e	#LATIN CAPITAL LETTER N
+0x4f	0x004f	#LATIN CAPITAL LETTER O
+0x50	0x0050	#LATIN CAPITAL LETTER P
+0x51	0x0051	#LATIN CAPITAL LETTER Q
+0x52	0x0052	#LATIN CAPITAL LETTER R
+0x53	0x0053	#LATIN CAPITAL LETTER S
+0x54	0x0054	#LATIN CAPITAL LETTER T
+0x55	0x0055	#LATIN CAPITAL LETTER U
+0x56	0x0056	#LATIN CAPITAL LETTER V
+0x57	0x0057	#LATIN CAPITAL LETTER W
+0x58	0x0058	#LATIN CAPITAL LETTER X
+0x59	0x0059	#LATIN CAPITAL LETTER Y
+0x5a	0x005a	#LATIN CAPITAL LETTER Z
+0x5b	0x005b	#LEFT SQUARE BRACKET
+0x5c	0x005c	#REVERSE SOLIDUS
+0x5d	0x005d	#RIGHT SQUARE BRACKET
+0x5e	0x005e	#CIRCUMFLEX ACCENT
+0x5f	0x005f	#LOW LINE
+0x60	0x0060	#GRAVE ACCENT
+0x61	0x0061	#LATIN SMALL LETTER A
+0x62	0x0062	#LATIN SMALL LETTER B
+0x63	0x0063	#LATIN SMALL LETTER C
+0x64	0x0064	#LATIN SMALL LETTER D
+0x65	0x0065	#LATIN SMALL LETTER E
+0x66	0x0066	#LATIN SMALL LETTER F
+0x67	0x0067	#LATIN SMALL LETTER G
+0x68	0x0068	#LATIN SMALL LETTER H
+0x69	0x0069	#LATIN SMALL LETTER I
+0x6a	0x006a	#LATIN SMALL LETTER J
+0x6b	0x006b	#LATIN SMALL LETTER K
+0x6c	0x006c	#LATIN SMALL LETTER L
+0x6d	0x006d	#LATIN SMALL LETTER M
+0x6e	0x006e	#LATIN SMALL LETTER N
+0x6f	0x006f	#LATIN SMALL LETTER O
+0x70	0x0070	#LATIN SMALL LETTER P
+0x71	0x0071	#LATIN SMALL LETTER Q
+0x72	0x0072	#LATIN SMALL LETTER R
+0x73	0x0073	#LATIN SMALL LETTER S
+0x74	0x0074	#LATIN SMALL LETTER T
+0x75	0x0075	#LATIN SMALL LETTER U
+0x76	0x0076	#LATIN SMALL LETTER V
+0x77	0x0077	#LATIN SMALL LETTER W
+0x78	0x0078	#LATIN SMALL LETTER X
+0x79	0x0079	#LATIN SMALL LETTER Y
+0x7a	0x007a	#LATIN SMALL LETTER Z
+0x7b	0x007b	#LEFT CURLY BRACKET
+0x7c	0x007c	#VERTICAL LINE
+0x7d	0x007d	#RIGHT CURLY BRACKET
+0x7e	0x007e	#TILDE
+0x7f	0x007f	#DELETE
+0x80	0x00c7	#LATIN CAPITAL LETTER C WITH CEDILLA
+0x81	0x00fc	#LATIN SMALL LETTER U WITH DIAERESIS
+0x82	0x00e9	#LATIN SMALL LETTER E WITH ACUTE
+0x83	0x00e2	#LATIN SMALL LETTER A WITH CIRCUMFLEX
+0x84	0x00e4	#LATIN SMALL LETTER A WITH DIAERESIS
+0x85	0x00e0	#LATIN SMALL LETTER A WITH GRAVE
+0x86	0x00e5	#LATIN SMALL LETTER A WITH RING ABOVE
+0x87	0x00e7	#LATIN SMALL LETTER C WITH CEDILLA
+0x88	0x00ea	#LATIN SMALL LETTER E WITH CIRCUMFLEX
+0x89	0x00eb	#LATIN SMALL LETTER E WITH DIAERESIS
+0x8a	0x00e8	#LATIN SMALL LETTER E WITH GRAVE
+0x8b	0x00ef	#LATIN SMALL LETTER I WITH DIAERESIS
+0x8c	0x00ee	#LATIN SMALL LETTER I WITH CIRCUMFLEX
+0x8d	0x00ec	#LATIN SMALL LETTER I WITH GRAVE
+0x8e	0x00c4	#LATIN CAPITAL LETTER A WITH DIAERESIS
+0x8f	0x00c5	#LATIN CAPITAL LETTER A WITH RING ABOVE
+0x90	0x00c9	#LATIN CAPITAL LETTER E WITH ACUTE
+0x91	0x00e6	#LATIN SMALL LIGATURE AE
+0x92	0x00c6	#LATIN CAPITAL LIGATURE AE
+0x93	0x00f4	#LATIN SMALL LETTER O WITH CIRCUMFLEX
+0x94	0x00f6	#LATIN SMALL LETTER O WITH DIAERESIS
+0x95	0x00f2	#LATIN SMALL LETTER O WITH GRAVE
+0x96	0x00fb	#LATIN SMALL LETTER U WITH CIRCUMFLEX
+0x97	0x00f9	#LATIN SMALL LETTER U WITH GRAVE
+0x98	0x00ff	#LATIN SMALL LETTER Y WITH DIAERESIS
+0x99	0x00d6	#LATIN CAPITAL LETTER O WITH DIAERESIS
+0x9a	0x00dc	#LATIN CAPITAL LETTER U WITH DIAERESIS
+0x9b	0x00f8	#LATIN SMALL LETTER O WITH STROKE
+0x9c	0x00a3	#POUND SIGN
+0x9d	0x00d8	#LATIN CAPITAL LETTER O WITH STROKE
+0x9e	0x00d7	#MULTIPLICATION SIGN
+0x9f	0x0192	#LATIN SMALL LETTER F WITH HOOK
+0xa0	0x00e1	#LATIN SMALL LETTER A WITH ACUTE
+0xa1	0x00ed	#LATIN SMALL LETTER I WITH ACUTE
+0xa2	0x00f3	#LATIN SMALL LETTER O WITH ACUTE
+0xa3	0x00fa	#LATIN SMALL LETTER U WITH ACUTE
+0xa4	0x00f1	#LATIN SMALL LETTER N WITH TILDE
+0xa5	0x00d1	#LATIN CAPITAL LETTER N WITH TILDE
+0xa6	0x00aa	#FEMININE ORDINAL INDICATOR
+0xa7	0x00ba	#MASCULINE ORDINAL INDICATOR
+0xa8	0x00bf	#INVERTED QUESTION MARK
+0xa9	0x00ae	#REGISTERED SIGN
+0xaa	0x00ac	#NOT SIGN
+0xab	0x00bd	#VULGAR FRACTION ONE HALF
+0xac	0x00bc	#VULGAR FRACTION ONE QUARTER
+0xad	0x00a1	#INVERTED EXCLAMATION MARK
+0xae	0x00ab	#LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xaf	0x00bb	#RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xb0	0x2591	#LIGHT SHADE
+0xb1	0x2592	#MEDIUM SHADE
+0xb2	0x2593	#DARK SHADE
+0xb3	0x2502	#BOX DRAWINGS LIGHT VERTICAL
+0xb4	0x2524	#BOX DRAWINGS LIGHT VERTICAL AND LEFT
+0xb5	0x00c1	#LATIN CAPITAL LETTER A WITH ACUTE
+0xb6	0x00c2	#LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+0xb7	0x00c0	#LATIN CAPITAL LETTER A WITH GRAVE
+0xb8	0x00a9	#COPYRIGHT SIGN
+0xb9	0x2563	#BOX DRAWINGS DOUBLE VERTICAL AND LEFT
+0xba	0x2551	#BOX DRAWINGS DOUBLE VERTICAL
+0xbb	0x2557	#BOX DRAWINGS DOUBLE DOWN AND LEFT
+0xbc	0x255d	#BOX DRAWINGS DOUBLE UP AND LEFT
+0xbd	0x00a2	#CENT SIGN
+0xbe	0x00a5	#YEN SIGN
+0xbf	0x2510	#BOX DRAWINGS LIGHT DOWN AND LEFT
+0xc0	0x2514	#BOX DRAWINGS LIGHT UP AND RIGHT
+0xc1	0x2534	#BOX DRAWINGS LIGHT UP AND HORIZONTAL
+0xc2	0x252c	#BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
+0xc3	0x251c	#BOX DRAWINGS LIGHT VERTICAL AND RIGHT
+0xc4	0x2500	#BOX DRAWINGS LIGHT HORIZONTAL
+0xc5	0x253c	#BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
+0xc6	0x00e3	#LATIN SMALL LETTER A WITH TILDE
+0xc7	0x00c3	#LATIN CAPITAL LETTER A WITH TILDE
+0xc8	0x255a	#BOX DRAWINGS DOUBLE UP AND RIGHT
+0xc9	0x2554	#BOX DRAWINGS DOUBLE DOWN AND RIGHT
+0xca	0x2569	#BOX DRAWINGS DOUBLE UP AND HORIZONTAL
+0xcb	0x2566	#BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
+0xcc	0x2560	#BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
+0xcd	0x2550	#BOX DRAWINGS DOUBLE HORIZONTAL
+0xce	0x256c	#BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
+0xcf	0x00a4	#CURRENCY SIGN
+0xd0	0x00f0	#LATIN SMALL LETTER ETH
+0xd1	0x00d0	#LATIN CAPITAL LETTER ETH
+0xd2	0x00ca	#LATIN CAPITAL LETTER E WITH CIRCUMFLEX
+0xd3	0x00cb	#LATIN CAPITAL LETTER E WITH DIAERESIS
+0xd4	0x00c8	#LATIN CAPITAL LETTER E WITH GRAVE
+0xd5	0x0131	#LATIN SMALL LETTER DOTLESS I
+0xd6	0x00cd	#LATIN CAPITAL LETTER I WITH ACUTE
+0xd7	0x00ce	#LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+0xd8	0x00cf	#LATIN CAPITAL LETTER I WITH DIAERESIS
+0xd9	0x2518	#BOX DRAWINGS LIGHT UP AND LEFT
+0xda	0x250c	#BOX DRAWINGS LIGHT DOWN AND RIGHT
+0xdb	0x2588	#FULL BLOCK
+0xdc	0x2584	#LOWER HALF BLOCK
+0xdd	0x00a6	#BROKEN BAR
+0xde	0x00cc	#LATIN CAPITAL LETTER I WITH GRAVE
+0xdf	0x2580	#UPPER HALF BLOCK
+0xe0	0x00d3	#LATIN CAPITAL LETTER O WITH ACUTE
+0xe1	0x00df	#LATIN SMALL LETTER SHARP S
+0xe2	0x00d4	#LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+0xe3	0x00d2	#LATIN CAPITAL LETTER O WITH GRAVE
+0xe4	0x00f5	#LATIN SMALL LETTER O WITH TILDE
+0xe5	0x00d5	#LATIN CAPITAL LETTER O WITH TILDE
+0xe6	0x00b5	#MICRO SIGN
+0xe7	0x00fe	#LATIN SMALL LETTER THORN
+0xe8	0x00de	#LATIN CAPITAL LETTER THORN
+0xe9	0x00da	#LATIN CAPITAL LETTER U WITH ACUTE
+0xea	0x00db	#LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+0xeb	0x00d9	#LATIN CAPITAL LETTER U WITH GRAVE
+0xec	0x00fd	#LATIN SMALL LETTER Y WITH ACUTE
+0xed	0x00dd	#LATIN CAPITAL LETTER Y WITH ACUTE
+0xee	0x00af	#MACRON
+0xef	0x00b4	#ACUTE ACCENT
+0xf0	0x00ad	#SOFT HYPHEN
+0xf1	0x00b1	#PLUS-MINUS SIGN
+0xf2	0x2017	#DOUBLE LOW LINE
+0xf3	0x00be	#VULGAR FRACTION THREE QUARTERS
+0xf4	0x00b6	#PILCROW SIGN
+0xf5	0x00a7	#SECTION SIGN
+0xf6	0x00f7	#DIVISION SIGN
+0xf7	0x00b8	#CEDILLA
+0xf8	0x00b0	#DEGREE SIGN
+0xf9	0x00a8	#DIAERESIS
+0xfa	0x00b7	#MIDDLE DOT
+0xfb	0x00b9	#SUPERSCRIPT ONE
+0xfc	0x00b3	#SUPERSCRIPT THREE
+0xfd	0x00b2	#SUPERSCRIPT TWO
+0xfe	0x25a0	#BLACK SQUARE
+0xff	0x00a0	#NO-BREAK SPACE
diff --git a/lib/ucmaps/cp852.txt b/lib/ucmaps/cp852.txt
new file mode 100644
index 000000000..2f2dabaeb
--- /dev/null
+++ b/lib/ucmaps/cp852.txt
@@ -0,0 +1,273 @@
+#
+#    Name:     cp852_DOSLatin2 to Unicode table
+#    Unicode version: 2.0
+#    Table version: 2.00
+#    Table format:  Format A
+#    Date:          04/24/96
+#    Authors:       Lori Brownell <loribr@microsoft.com>
+#                   K.D. Chang    <a-kchang@microsoft.com>
+#    General notes: none
+#
+#    Format: Three tab-separated columns
+#        Column #1 is the cp852_DOSLatin2 code (in hex)
+#        Column #2 is the Unicode (in hex as 0xXXXX)
+#        Column #3 is the Unicode name (follows a comment sign, '#')
+#
+#    The entries are in cp852_DOSLatin2 order
+#
+0x00	0x0000	#NULL
+0x01	0x0001	#START OF HEADING
+0x02	0x0002	#START OF TEXT
+0x03	0x0003	#END OF TEXT
+0x04	0x0004	#END OF TRANSMISSION
+0x05	0x0005	#ENQUIRY
+0x06	0x0006	#ACKNOWLEDGE
+0x07	0x0007	#BELL
+0x08	0x0008	#BACKSPACE
+0x09	0x0009	#HORIZONTAL TABULATION
+0x0a	0x000a	#LINE FEED
+0x0b	0x000b	#VERTICAL TABULATION
+0x0c	0x000c	#FORM FEED
+0x0d	0x000d	#CARRIAGE RETURN
+0x0e	0x000e	#SHIFT OUT
+0x0f	0x000f	#SHIFT IN
+0x10	0x0010	#DATA LINK ESCAPE
+0x11	0x0011	#DEVICE CONTROL ONE
+0x12	0x0012	#DEVICE CONTROL TWO
+0x13	0x0013	#DEVICE CONTROL THREE
+0x14	0x0014	#DEVICE CONTROL FOUR
+0x15	0x0015	#NEGATIVE ACKNOWLEDGE
+0x16	0x0016	#SYNCHRONOUS IDLE
+0x17	0x0017	#END OF TRANSMISSION BLOCK
+0x18	0x0018	#CANCEL
+0x19	0x0019	#END OF MEDIUM
+0x1a	0x001a	#SUBSTITUTE
+0x1b	0x001b	#ESCAPE
+0x1c	0x001c	#FILE SEPARATOR
+0x1d	0x001d	#GROUP SEPARATOR
+0x1e	0x001e	#RECORD SEPARATOR
+0x1f	0x001f	#UNIT SEPARATOR
+0x20	0x0020	#SPACE
+0x21	0x0021	#EXCLAMATION MARK
+0x22	0x0022	#QUOTATION MARK
+0x23	0x0023	#NUMBER SIGN
+0x24	0x0024	#DOLLAR SIGN
+0x25	0x0025	#PERCENT SIGN
+0x26	0x0026	#AMPERSAND
+0x27	0x0027	#APOSTROPHE
+0x28	0x0028	#LEFT PARENTHESIS
+0x29	0x0029	#RIGHT PARENTHESIS
+0x2a	0x002a	#ASTERISK
+0x2b	0x002b	#PLUS SIGN
+0x2c	0x002c	#COMMA
+0x2d	0x002d	#HYPHEN-MINUS
+0x2e	0x002e	#FULL STOP
+0x2f	0x002f	#SOLIDUS
+0x30	0x0030	#DIGIT ZERO
+0x31	0x0031	#DIGIT ONE
+0x32	0x0032	#DIGIT TWO
+0x33	0x0033	#DIGIT THREE
+0x34	0x0034	#DIGIT FOUR
+0x35	0x0035	#DIGIT FIVE
+0x36	0x0036	#DIGIT SIX
+0x37	0x0037	#DIGIT SEVEN
+0x38	0x0038	#DIGIT EIGHT
+0x39	0x0039	#DIGIT NINE
+0x3a	0x003a	#COLON
+0x3b	0x003b	#SEMICOLON
+0x3c	0x003c	#LESS-THAN SIGN
+0x3d	0x003d	#EQUALS SIGN
+0x3e	0x003e	#GREATER-THAN SIGN
+0x3f	0x003f	#QUESTION MARK
+0x40	0x0040	#COMMERCIAL AT
+0x41	0x0041	#LATIN CAPITAL LETTER A
+0x42	0x0042	#LATIN CAPITAL LETTER B
+0x43	0x0043	#LATIN CAPITAL LETTER C
+0x44	0x0044	#LATIN CAPITAL LETTER D
+0x45	0x0045	#LATIN CAPITAL LETTER E
+0x46	0x0046	#LATIN CAPITAL LETTER F
+0x47	0x0047	#LATIN CAPITAL LETTER G
+0x48	0x0048	#LATIN CAPITAL LETTER H
+0x49	0x0049	#LATIN CAPITAL LETTER I
+0x4a	0x004a	#LATIN CAPITAL LETTER J
+0x4b	0x004b	#LATIN CAPITAL LETTER K
+0x4c	0x004c	#LATIN CAPITAL LETTER L
+0x4d	0x004d	#LATIN CAPITAL LETTER M
+0x4e	0x004e	#LATIN CAPITAL LETTER N
+0x4f	0x004f	#LATIN CAPITAL LETTER O
+0x50	0x0050	#LATIN CAPITAL LETTER P
+0x51	0x0051	#LATIN CAPITAL LETTER Q
+0x52	0x0052	#LATIN CAPITAL LETTER R
+0x53	0x0053	#LATIN CAPITAL LETTER S
+0x54	0x0054	#LATIN CAPITAL LETTER T
+0x55	0x0055	#LATIN CAPITAL LETTER U
+0x56	0x0056	#LATIN CAPITAL LETTER V
+0x57	0x0057	#LATIN CAPITAL LETTER W
+0x58	0x0058	#LATIN CAPITAL LETTER X
+0x59	0x0059	#LATIN CAPITAL LETTER Y
+0x5a	0x005a	#LATIN CAPITAL LETTER Z
+0x5b	0x005b	#LEFT SQUARE BRACKET
+0x5c	0x005c	#REVERSE SOLIDUS
+0x5d	0x005d	#RIGHT SQUARE BRACKET
+0x5e	0x005e	#CIRCUMFLEX ACCENT
+0x5f	0x005f	#LOW LINE
+0x60	0x0060	#GRAVE ACCENT
+0x61	0x0061	#LATIN SMALL LETTER A
+0x62	0x0062	#LATIN SMALL LETTER B
+0x63	0x0063	#LATIN SMALL LETTER C
+0x64	0x0064	#LATIN SMALL LETTER D
+0x65	0x0065	#LATIN SMALL LETTER E
+0x66	0x0066	#LATIN SMALL LETTER F
+0x67	0x0067	#LATIN SMALL LETTER G
+0x68	0x0068	#LATIN SMALL LETTER H
+0x69	0x0069	#LATIN SMALL LETTER I
+0x6a	0x006a	#LATIN SMALL LETTER J
+0x6b	0x006b	#LATIN SMALL LETTER K
+0x6c	0x006c	#LATIN SMALL LETTER L
+0x6d	0x006d	#LATIN SMALL LETTER M
+0x6e	0x006e	#LATIN SMALL LETTER N
+0x6f	0x006f	#LATIN SMALL LETTER O
+0x70	0x0070	#LATIN SMALL LETTER P
+0x71	0x0071	#LATIN SMALL LETTER Q
+0x72	0x0072	#LATIN SMALL LETTER R
+0x73	0x0073	#LATIN SMALL LETTER S
+0x74	0x0074	#LATIN SMALL LETTER T
+0x75	0x0075	#LATIN SMALL LETTER U
+0x76	0x0076	#LATIN SMALL LETTER V
+0x77	0x0077	#LATIN SMALL LETTER W
+0x78	0x0078	#LATIN SMALL LETTER X
+0x79	0x0079	#LATIN SMALL LETTER Y
+0x7a	0x007a	#LATIN SMALL LETTER Z
+0x7b	0x007b	#LEFT CURLY BRACKET
+0x7c	0x007c	#VERTICAL LINE
+0x7d	0x007d	#RIGHT CURLY BRACKET
+0x7e	0x007e	#TILDE
+0x7f	0x007f	#DELETE
+0x80	0x00c7	#LATIN CAPITAL LETTER C WITH CEDILLA
+0x81	0x00fc	#LATIN SMALL LETTER U WITH DIAERESIS
+0x82	0x00e9	#LATIN SMALL LETTER E WITH ACUTE
+0x83	0x00e2	#LATIN SMALL LETTER A WITH CIRCUMFLEX
+0x84	0x00e4	#LATIN SMALL LETTER A WITH DIAERESIS
+0x85	0x016f	#LATIN SMALL LETTER U WITH RING ABOVE
+0x86	0x0107	#LATIN SMALL LETTER C WITH ACUTE
+0x87	0x00e7	#LATIN SMALL LETTER C WITH CEDILLA
+0x88	0x0142	#LATIN SMALL LETTER L WITH STROKE
+0x89	0x00eb	#LATIN SMALL LETTER E WITH DIAERESIS
+0x8a	0x0150	#LATIN CAPITAL LETTER O WITH DOUBLE ACUTE
+0x8b	0x0151	#LATIN SMALL LETTER O WITH DOUBLE ACUTE
+0x8c	0x00ee	#LATIN SMALL LETTER I WITH CIRCUMFLEX
+0x8d	0x0179	#LATIN CAPITAL LETTER Z WITH ACUTE
+0x8e	0x00c4	#LATIN CAPITAL LETTER A WITH DIAERESIS
+0x8f	0x0106	#LATIN CAPITAL LETTER C WITH ACUTE
+0x90	0x00c9	#LATIN CAPITAL LETTER E WITH ACUTE
+0x91	0x0139	#LATIN CAPITAL LETTER L WITH ACUTE
+0x92	0x013a	#LATIN SMALL LETTER L WITH ACUTE
+0x93	0x00f4	#LATIN SMALL LETTER O WITH CIRCUMFLEX
+0x94	0x00f6	#LATIN SMALL LETTER O WITH DIAERESIS
+0x95	0x013d	#LATIN CAPITAL LETTER L WITH CARON
+0x96	0x013e	#LATIN SMALL LETTER L WITH CARON
+0x97	0x015a	#LATIN CAPITAL LETTER S WITH ACUTE
+0x98	0x015b	#LATIN SMALL LETTER S WITH ACUTE
+0x99	0x00d6	#LATIN CAPITAL LETTER O WITH DIAERESIS
+0x9a	0x00dc	#LATIN CAPITAL LETTER U WITH DIAERESIS
+0x9b	0x0164	#LATIN CAPITAL LETTER T WITH CARON
+0x9c	0x0165	#LATIN SMALL LETTER T WITH CARON
+0x9d	0x0141	#LATIN CAPITAL LETTER L WITH STROKE
+0x9e	0x00d7	#MULTIPLICATION SIGN
+0x9f	0x010d	#LATIN SMALL LETTER C WITH CARON
+0xa0	0x00e1	#LATIN SMALL LETTER A WITH ACUTE
+0xa1	0x00ed	#LATIN SMALL LETTER I WITH ACUTE
+0xa2	0x00f3	#LATIN SMALL LETTER O WITH ACUTE
+0xa3	0x00fa	#LATIN SMALL LETTER U WITH ACUTE
+0xa4	0x0104	#LATIN CAPITAL LETTER A WITH OGONEK
+0xa5	0x0105	#LATIN SMALL LETTER A WITH OGONEK
+0xa6	0x017d	#LATIN CAPITAL LETTER Z WITH CARON
+0xa7	0x017e	#LATIN SMALL LETTER Z WITH CARON
+0xa8	0x0118	#LATIN CAPITAL LETTER E WITH OGONEK
+0xa9	0x0119	#LATIN SMALL LETTER E WITH OGONEK
+0xaa	0x00ac	#NOT SIGN
+0xab	0x017a	#LATIN SMALL LETTER Z WITH ACUTE
+0xac	0x010c	#LATIN CAPITAL LETTER C WITH CARON
+0xad	0x015f	#LATIN SMALL LETTER S WITH CEDILLA
+0xae	0x00ab	#LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xaf	0x00bb	#RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xb0	0x2591	#LIGHT SHADE
+0xb1	0x2592	#MEDIUM SHADE
+0xb2	0x2593	#DARK SHADE
+0xb3	0x2502	#BOX DRAWINGS LIGHT VERTICAL
+0xb4	0x2524	#BOX DRAWINGS LIGHT VERTICAL AND LEFT
+0xb5	0x00c1	#LATIN CAPITAL LETTER A WITH ACUTE
+0xb6	0x00c2	#LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+0xb7	0x011a	#LATIN CAPITAL LETTER E WITH CARON
+0xb8	0x015e	#LATIN CAPITAL LETTER S WITH CEDILLA
+0xb9	0x2563	#BOX DRAWINGS DOUBLE VERTICAL AND LEFT
+0xba	0x2551	#BOX DRAWINGS DOUBLE VERTICAL
+0xbb	0x2557	#BOX DRAWINGS DOUBLE DOWN AND LEFT
+0xbc	0x255d	#BOX DRAWINGS DOUBLE UP AND LEFT
+0xbd	0x017b	#LATIN CAPITAL LETTER Z WITH DOT ABOVE
+0xbe	0x017c	#LATIN SMALL LETTER Z WITH DOT ABOVE
+0xbf	0x2510	#BOX DRAWINGS LIGHT DOWN AND LEFT
+0xc0	0x2514	#BOX DRAWINGS LIGHT UP AND RIGHT
+0xc1	0x2534	#BOX DRAWINGS LIGHT UP AND HORIZONTAL
+0xc2	0x252c	#BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
+0xc3	0x251c	#BOX DRAWINGS LIGHT VERTICAL AND RIGHT
+0xc4	0x2500	#BOX DRAWINGS LIGHT HORIZONTAL
+0xc5	0x253c	#BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
+0xc6	0x0102	#LATIN CAPITAL LETTER A WITH BREVE
+0xc7	0x0103	#LATIN SMALL LETTER A WITH BREVE
+0xc8	0x255a	#BOX DRAWINGS DOUBLE UP AND RIGHT
+0xc9	0x2554	#BOX DRAWINGS DOUBLE DOWN AND RIGHT
+0xca	0x2569	#BOX DRAWINGS DOUBLE UP AND HORIZONTAL
+0xcb	0x2566	#BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
+0xcc	0x2560	#BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
+0xcd	0x2550	#BOX DRAWINGS DOUBLE HORIZONTAL
+0xce	0x256c	#BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
+0xcf	0x00a4	#CURRENCY SIGN
+0xd0	0x0111	#LATIN SMALL LETTER D WITH STROKE
+0xd1	0x0110	#LATIN CAPITAL LETTER D WITH STROKE
+0xd2	0x010e	#LATIN CAPITAL LETTER D WITH CARON
+0xd3	0x00cb	#LATIN CAPITAL LETTER E WITH DIAERESIS
+0xd4	0x010f	#LATIN SMALL LETTER D WITH CARON
+0xd5	0x0147	#LATIN CAPITAL LETTER N WITH CARON
+0xd6	0x00cd	#LATIN CAPITAL LETTER I WITH ACUTE
+0xd7	0x00ce	#LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+0xd8	0x011b	#LATIN SMALL LETTER E WITH CARON
+0xd9	0x2518	#BOX DRAWINGS LIGHT UP AND LEFT
+0xda	0x250c	#BOX DRAWINGS LIGHT DOWN AND RIGHT
+0xdb	0x2588	#FULL BLOCK
+0xdc	0x2584	#LOWER HALF BLOCK
+0xdd	0x0162	#LATIN CAPITAL LETTER T WITH CEDILLA
+0xde	0x016e	#LATIN CAPITAL LETTER U WITH RING ABOVE
+0xdf	0x2580	#UPPER HALF BLOCK
+0xe0	0x00d3	#LATIN CAPITAL LETTER O WITH ACUTE
+0xe1	0x00df	#LATIN SMALL LETTER SHARP S
+0xe2	0x00d4	#LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+0xe3	0x0143	#LATIN CAPITAL LETTER N WITH ACUTE
+0xe4	0x0144	#LATIN SMALL LETTER N WITH ACUTE
+0xe5	0x0148	#LATIN SMALL LETTER N WITH CARON
+0xe6	0x0160	#LATIN CAPITAL LETTER S WITH CARON
+0xe7	0x0161	#LATIN SMALL LETTER S WITH CARON
+0xe8	0x0154	#LATIN CAPITAL LETTER R WITH ACUTE
+0xe9	0x00da	#LATIN CAPITAL LETTER U WITH ACUTE
+0xea	0x0155	#LATIN SMALL LETTER R WITH ACUTE
+0xeb	0x0170	#LATIN CAPITAL LETTER U WITH DOUBLE ACUTE
+0xec	0x00fd	#LATIN SMALL LETTER Y WITH ACUTE
+0xed	0x00dd	#LATIN CAPITAL LETTER Y WITH ACUTE
+0xee	0x0163	#LATIN SMALL LETTER T WITH CEDILLA
+0xef	0x00b4	#ACUTE ACCENT
+0xf0	0x00ad	#SOFT HYPHEN
+0xf1	0x02dd	#DOUBLE ACUTE ACCENT
+0xf2	0x02db	#OGONEK
+0xf3	0x02c7	#CARON
+0xf4	0x02d8	#BREVE
+0xf5	0x00a7	#SECTION SIGN
+0xf6	0x00f7	#DIVISION SIGN
+0xf7	0x00b8	#CEDILLA
+0xf8	0x00b0	#DEGREE SIGN
+0xf9	0x00a8	#DIAERESIS
+0xfa	0x02d9	#DOT ABOVE
+0xfb	0x0171	#LATIN SMALL LETTER U WITH DOUBLE ACUTE
+0xfc	0x0158	#LATIN CAPITAL LETTER R WITH CARON
+0xfd	0x0159	#LATIN SMALL LETTER R WITH CARON
+0xfe	0x25a0	#BLACK SQUARE
+0xff	0x00a0	#NO-BREAK SPACE
diff --git a/lib/ucmaps/cp855.txt b/lib/ucmaps/cp855.txt
new file mode 100644
index 000000000..d43daf039
--- /dev/null
+++ b/lib/ucmaps/cp855.txt
@@ -0,0 +1,274 @@
+#
+#    Name:     cp855_DOSCyrillic to Unicode table
+#    Unicode version: 2.0
+#    Table version: 2.00
+#    Table format:  Format A
+#    Date:          04/24/96
+#    Authors:       Lori Brownell <loribr@microsoft.com>
+#                   K.D. Chang    <a-kchang@microsoft.com>
+#    General notes: none
+#
+#    Format: Three tab-separated columns
+#        Column #1 is the cp855_DOSCyrillic code (in hex)
+#        Column #2 is the Unicode (in hex as 0xXXXX)
+#        Column #3 is the Unicode name (follows a comment sign, '#')
+#
+#    The entries are in cp855_DOSCyrillic order
+#
+0x00	0x0000	#NULL
+0x01	0x0001	#START OF HEADING
+0x02	0x0002	#START OF TEXT
+0x03	0x0003	#END OF TEXT
+0x04	0x0004	#END OF TRANSMISSION
+0x05	0x0005	#ENQUIRY
+0x06	0x0006	#ACKNOWLEDGE
+0x07	0x0007	#BELL
+0x08	0x0008	#BACKSPACE
+0x09	0x0009	#HORIZONTAL TABULATION
+0x0a	0x000a	#LINE FEED
+0x0b	0x000b	#VERTICAL TABULATION
+0x0c	0x000c	#FORM FEED
+0x0d	0x000d	#CARRIAGE RETURN
+0x0e	0x000e	#SHIFT OUT
+0x0f	0x000f	#SHIFT IN
+0x10	0x0010	#DATA LINK ESCAPE
+0x11	0x0011	#DEVICE CONTROL ONE
+0x12	0x0012	#DEVICE CONTROL TWO
+0x13	0x0013	#DEVICE CONTROL THREE
+0x14	0x0014	#DEVICE CONTROL FOUR
+0x15	0x0015	#NEGATIVE ACKNOWLEDGE
+0x16	0x0016	#SYNCHRONOUS IDLE
+0x17	0x0017	#END OF TRANSMISSION BLOCK
+0x18	0x0018	#CANCEL
+0x19	0x0019	#END OF MEDIUM
+0x1a	0x001a	#SUBSTITUTE
+0x1b	0x001b	#ESCAPE
+0x1c	0x001c	#FILE SEPARATOR
+0x1d	0x001d	#GROUP SEPARATOR
+0x1e	0x001e	#RECORD SEPARATOR
+0x1f	0x001f	#UNIT SEPARATOR
+0x20	0x0020	#SPACE
+0x21	0x0021	#EXCLAMATION MARK
+0x22	0x0022	#QUOTATION MARK
+0x23	0x0023	#NUMBER SIGN
+0x24	0x0024	#DOLLAR SIGN
+0x25	0x0025	#PERCENT SIGN
+0x26	0x0026	#AMPERSAND
+0x27	0x0027	#APOSTROPHE
+0x28	0x0028	#LEFT PARENTHESIS
+0x29	0x0029	#RIGHT PARENTHESIS
+0x2a	0x002a	#ASTERISK
+0x2b	0x002b	#PLUS SIGN
+0x2c	0x002c	#COMMA
+0x2d	0x002d	#HYPHEN-MINUS
+0x2e	0x002e	#FULL STOP
+0x2f	0x002f	#SOLIDUS
+0x30	0x0030	#DIGIT ZERO
+0x31	0x0031	#DIGIT ONE
+0x32	0x0032	#DIGIT TWO
+0x33	0x0033	#DIGIT THREE
+0x34	0x0034	#DIGIT FOUR
+0x35	0x0035	#DIGIT FIVE
+0x36	0x0036	#DIGIT SIX
+0x37	0x0037	#DIGIT SEVEN
+0x38	0x0038	#DIGIT EIGHT
+0x39	0x0039	#DIGIT NINE
+0x3a	0x003a	#COLON
+0x3b	0x003b	#SEMICOLON
+0x3c	0x003c	#LESS-THAN SIGN
+0x3d	0x003d	#EQUALS SIGN
+0x3e	0x003e	#GREATER-THAN SIGN
+0x3f	0x003f	#QUESTION MARK
+0x40	0x0040	#COMMERCIAL AT
+0x41	0x0041	#LATIN CAPITAL LETTER A
+0x42	0x0042	#LATIN CAPITAL LETTER B
+0x43	0x0043	#LATIN CAPITAL LETTER C
+0x44	0x0044	#LATIN CAPITAL LETTER D
+0x45	0x0045	#LATIN CAPITAL LETTER E
+0x46	0x0046	#LATIN CAPITAL LETTER F
+0x47	0x0047	#LATIN CAPITAL LETTER G
+0x48	0x0048	#LATIN CAPITAL LETTER H
+0x49	0x0049	#LATIN CAPITAL LETTER I
+0x4a	0x004a	#LATIN CAPITAL LETTER J
+0x4b	0x004b	#LATIN CAPITAL LETTER K
+0x4c	0x004c	#LATIN CAPITAL LETTER L
+0x4d	0x004d	#LATIN CAPITAL LETTER M
+0x4e	0x004e	#LATIN CAPITAL LETTER N
+0x4f	0x004f	#LATIN CAPITAL LETTER O
+0x50	0x0050	#LATIN CAPITAL LETTER P
+0x51	0x0051	#LATIN CAPITAL LETTER Q
+0x52	0x0052	#LATIN CAPITAL LETTER R
+0x53	0x0053	#LATIN CAPITAL LETTER S
+0x54	0x0054	#LATIN CAPITAL LETTER T
+0x55	0x0055	#LATIN CAPITAL LETTER U
+0x56	0x0056	#LATIN CAPITAL LETTER V
+0x57	0x0057	#LATIN CAPITAL LETTER W
+0x58	0x0058	#LATIN CAPITAL LETTER X
+0x59	0x0059	#LATIN CAPITAL LETTER Y
+0x5a	0x005a	#LATIN CAPITAL LETTER Z
+0x5b	0x005b	#LEFT SQUARE BRACKET
+0x5c	0x005c	#REVERSE SOLIDUS
+0x5d	0x005d	#RIGHT SQUARE BRACKET
+0x5e	0x005e	#CIRCUMFLEX ACCENT
+0x5f	0x005f	#LOW LINE
+0x60	0x0060	#GRAVE ACCENT
+0x61	0x0061	#LATIN SMALL LETTER A
+0x62	0x0062	#LATIN SMALL LETTER B
+0x63	0x0063	#LATIN SMALL LETTER C
+0x64	0x0064	#LATIN SMALL LETTER D
+0x65	0x0065	#LATIN SMALL LETTER E
+0x66	0x0066	#LATIN SMALL LETTER F
+0x67	0x0067	#LATIN SMALL LETTER G
+0x68	0x0068	#LATIN SMALL LETTER H
+0x69	0x0069	#LATIN SMALL LETTER I
+0x6a	0x006a	#LATIN SMALL LETTER J
+0x6b	0x006b	#LATIN SMALL LETTER K
+0x6c	0x006c	#LATIN SMALL LETTER L
+0x6d	0x006d	#LATIN SMALL LETTER M
+0x6e	0x006e	#LATIN SMALL LETTER N
+0x6f	0x006f	#LATIN SMALL LETTER O
+0x70	0x0070	#LATIN SMALL LETTER P
+0x71	0x0071	#LATIN SMALL LETTER Q
+0x72	0x0072	#LATIN SMALL LETTER R
+0x73	0x0073	#LATIN SMALL LETTER S
+0x74	0x0074	#LATIN SMALL LETTER T
+0x75	0x0075	#LATIN SMALL LETTER U
+0x76	0x0076	#LATIN SMALL LETTER V
+0x77	0x0077	#LATIN SMALL LETTER W
+0x78	0x0078	#LATIN SMALL LETTER X
+0x79	0x0079	#LATIN SMALL LETTER Y
+0x7a	0x007a	#LATIN SMALL LETTER Z
+0x7b	0x007b	#LEFT CURLY BRACKET
+0x7c	0x007c	#VERTICAL LINE
+0x7d	0x007d	#RIGHT CURLY BRACKET
+0x7e	0x007e	#TILDE
+0x7f	0x007f	#DELETE
+0x80	0x0452	#CYRILLIC SMALL LETTER DJE
+0x81	0x0402	#CYRILLIC CAPITAL LETTER DJE
+0x82	0x0453	#CYRILLIC SMALL LETTER GJE
+0x83	0x0403	#CYRILLIC CAPITAL LETTER GJE
+0x84	0x0451	#CYRILLIC SMALL LETTER IO
+0x85	0x0401	#CYRILLIC CAPITAL LETTER IO
+0x86	0x0454	#CYRILLIC SMALL LETTER UKRAINIAN IE
+0x87	0x0404	#CYRILLIC CAPITAL LETTER UKRAINIAN IE
+0x88	0x0455	#CYRILLIC SMALL LETTER DZE
+0x89	0x0405	#CYRILLIC CAPITAL LETTER DZE
+0x8a	0x0456	#CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
+0x8b	0x0406	#CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I
+0x8c	0x0457	#CYRILLIC SMALL LETTER YI
+0x8d	0x0407	#CYRILLIC CAPITAL LETTER YI
+0x8e	0x0458	#CYRILLIC SMALL LETTER JE
+0x8f	0x0408	#CYRILLIC CAPITAL LETTER JE
+0x90	0x0459	#CYRILLIC SMALL LETTER LJE
+0x91	0x0409	#CYRILLIC CAPITAL LETTER LJE
+0x92	0x045a	#CYRILLIC SMALL LETTER NJE
+0x93	0x040a	#CYRILLIC CAPITAL LETTER NJE
+0x94	0x045b	#CYRILLIC SMALL LETTER TSHE
+0x95	0x040b	#CYRILLIC CAPITAL LETTER TSHE
+0x96	0x045c	#CYRILLIC SMALL LETTER KJE
+0x97	0x040c	#CYRILLIC CAPITAL LETTER KJE
+0x98	0x045e	#CYRILLIC SMALL LETTER SHORT U
+0x99	0x040e	#CYRILLIC CAPITAL LETTER SHORT U
+0x9a	0x045f	#CYRILLIC SMALL LETTER DZHE
+0x9b	0x040f	#CYRILLIC CAPITAL LETTER DZHE
+0x9c	0x044e	#CYRILLIC SMALL LETTER YU
+0x9d	0x042e	#CYRILLIC CAPITAL LETTER YU
+0x9e	0x044a	#CYRILLIC SMALL LETTER HARD SIGN
+0x9f	0x042a	#CYRILLIC CAPITAL LETTER HARD SIGN
+0xa0	0x0430	#CYRILLIC SMALL LETTER A
+0xa1	0x0410	#CYRILLIC CAPITAL LETTER A
+0xa2	0x0431	#CYRILLIC SMALL LETTER BE
+0xa3	0x0411	#CYRILLIC CAPITAL LETTER BE
+0xa4	0x0446	#CYRILLIC SMALL LETTER TSE
+0xa5	0x0426	#CYRILLIC CAPITAL LETTER TSE
+0xa6	0x0434	#CYRILLIC SMALL LETTER DE
+0xa7	0x0414	#CYRILLIC CAPITAL LETTER DE
+0xa8	0x0435	#CYRILLIC SMALL LETTER IE
+0xa9	0x0415	#CYRILLIC CAPITAL LETTER IE
+0xaa	0x0444	#CYRILLIC SMALL LETTER EF
+0xab	0x0424	#CYRILLIC CAPITAL LETTER EF
+0xac	0x0433	#CYRILLIC SMALL LETTER GHE
+0xad	0x0413	#CYRILLIC CAPITAL LETTER GHE
+0xae	0x00ab	#LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xaf	0x00bb	#RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xb0	0x2591	#LIGHT SHADE
+0xb1	0x2592	#MEDIUM SHADE
+0xb2	0x2593	#DARK SHADE
+0xb3	0x2502	#BOX DRAWINGS LIGHT VERTICAL
+0xb4	0x2524	#BOX DRAWINGS LIGHT VERTICAL AND LEFT
+0xb5	0x0445	#CYRILLIC SMALL LETTER HA
+0xb6	0x0425	#CYRILLIC CAPITAL LETTER HA
+0xb7	0x0438	#CYRILLIC SMALL LETTER I
+0xb8	0x0418	#CYRILLIC CAPITAL LETTER I
+0xb9	0x2563	#BOX DRAWINGS DOUBLE VERTICAL AND LEFT
+0xba	0x2551	#BOX DRAWINGS DOUBLE VERTICAL
+0xbb	0x2557	#BOX DRAWINGS DOUBLE DOWN AND LEFT
+0xbc	0x255d	#BOX DRAWINGS DOUBLE UP AND LEFT
+0xbd	0x0439	#CYRILLIC SMALL LETTER SHORT I
+0xbe	0x0419	#CYRILLIC CAPITAL LETTER SHORT I
+0xbf	0x2510	#BOX DRAWINGS LIGHT DOWN AND LEFT
+0xc0	0x2514	#BOX DRAWINGS LIGHT UP AND RIGHT
+0xc1	0x2534	#BOX DRAWINGS LIGHT UP AND HORIZONTAL
+0xc2	0x252c	#BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
+0xc3	0x251c	#BOX DRAWINGS LIGHT VERTICAL AND RIGHT
+0xc4	0x2500	#BOX DRAWINGS LIGHT HORIZONTAL
+0xc5	0x253c	#BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
+0xc6	0x043a	#CYRILLIC SMALL LETTER KA
+0xc7	0x041a	#CYRILLIC CAPITAL LETTER KA
+0xc8	0x255a	#BOX DRAWINGS DOUBLE UP AND RIGHT
+0xc9	0x2554	#BOX DRAWINGS DOUBLE DOWN AND RIGHT
+0xca	0x2569	#BOX DRAWINGS DOUBLE UP AND HORIZONTAL
+0xcb	0x2566	#BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
+0xcc	0x2560	#BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
+0xcd	0x2550	#BOX DRAWINGS DOUBLE HORIZONTAL
+0xce	0x256c	#BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
+0xcf	0x00a4	#CURRENCY SIGN
+0xd0	0x043b	#CYRILLIC SMALL LETTER EL
+0xd1	0x041b	#CYRILLIC CAPITAL LETTER EL
+0xd2	0x043c	#CYRILLIC SMALL LETTER EM
+0xd3	0x041c	#CYRILLIC CAPITAL LETTER EM
+0xd4	0x043d	#CYRILLIC SMALL LETTER EN
+0xd5	0x041d	#CYRILLIC CAPITAL LETTER EN
+0xd6	0x043e	#CYRILLIC SMALL LETTER O
+0xd7	0x041e	#CYRILLIC CAPITAL LETTER O
+0xd8	0x043f	#CYRILLIC SMALL LETTER PE
+0xd9	0x2518	#BOX DRAWINGS LIGHT UP AND LEFT
+0xda	0x250c	#BOX DRAWINGS LIGHT DOWN AND RIGHT
+0xdb	0x2588	#FULL BLOCK
+0xdc	0x2584	#LOWER HALF BLOCK
+0xdd	0x041f	#CYRILLIC CAPITAL LETTER PE
+0xde	0x044f	#CYRILLIC SMALL LETTER YA
+0xdf	0x2580	#UPPER HALF BLOCK
+0xe0	0x042f	#CYRILLIC CAPITAL LETTER YA
+0xe1	0x0440	#CYRILLIC SMALL LETTER ER
+0xe2	0x0420	#CYRILLIC CAPITAL LETTER ER
+0xe3	0x0441	#CYRILLIC SMALL LETTER ES
+0xe4	0x0421	#CYRILLIC CAPITAL LETTER ES
+0xe5	0x0442	#CYRILLIC SMALL LETTER TE
+0xe6	0x0422	#CYRILLIC CAPITAL LETTER TE
+0xe7	0x0443	#CYRILLIC SMALL LETTER U
+0xe8	0x0423	#CYRILLIC CAPITAL LETTER U
+0xe9	0x0436	#CYRILLIC SMALL LETTER ZHE
+0xea	0x0416	#CYRILLIC CAPITAL LETTER ZHE
+0xeb	0x0432	#CYRILLIC SMALL LETTER VE
+0xec	0x0412	#CYRILLIC CAPITAL LETTER VE
+0xed	0x044c	#CYRILLIC SMALL LETTER SOFT SIGN
+0xee	0x042c	#CYRILLIC CAPITAL LETTER SOFT SIGN
+0xef	0x2116	#NUMERO SIGN
+0xf0	0x00ad	#SOFT HYPHEN
+0xf1	0x044b	#CYRILLIC SMALL LETTER YERU
+0xf2	0x042b	#CYRILLIC CAPITAL LETTER YERU
+0xf3	0x0437	#CYRILLIC SMALL LETTER ZE
+0xf4	0x0417	#CYRILLIC CAPITAL LETTER ZE
+0xf5	0x0448	#CYRILLIC SMALL LETTER SHA
+0xf6	0x0428	#CYRILLIC CAPITAL LETTER SHA
+0xf7	0x044d	#CYRILLIC SMALL LETTER E
+0xf8	0x042d	#CYRILLIC CAPITAL LETTER E
+0xf9	0x0449	#CYRILLIC SMALL LETTER SHCHA
+0xfa	0x0429	#CYRILLIC CAPITAL LETTER SHCHA
+0xfb	0x0447	#CYRILLIC SMALL LETTER CHE
+0xfc	0x0427	#CYRILLIC CAPITAL LETTER CHE
+0xfd	0x00a7	#SECTION SIGN
+0xfe	0x25a0	#BLACK SQUARE
+0xff	0x00a0	#NO-BREAK SPACE
+
diff --git a/lib/ucmaps/cp856.txt b/lib/ucmaps/cp856.txt
new file mode 100644
index 000000000..3a6000bcb
--- /dev/null
+++ b/lib/ucmaps/cp856.txt
@@ -0,0 +1,303 @@
+#
+#    Name:     cp856_Hebrew_PC to Unicode table
+#    Unicode version: 3.0
+#    Table version: 1.0
+#    Table format:  Format A
+#    Date:          1999 July 27
+#    Authors:       Ken Whistler (kenw@sybase.com)
+#
+#	Copyright (c) 1998 - 1999 Unicode, Inc.  All Rights reserved.
+#
+#	This file is provided as-is by Unicode, Inc. (The Unicode Consortium).
+#	No claims are made as to fitness for any particular purpose.  No
+#	warranties of any kind are expressed or implied.  The recipient
+#	agrees to determine applicability of information provided.  If this
+#	file has been provided on optical media by Unicode, Inc., the sole
+#	remedy for any claim will be exchange of defective media within 90
+#	days of receipt.
+#
+#	Unicode, Inc. hereby grants the right to freely use the information
+#	supplied in this file in the creation of products supporting the
+#	Unicode Standard, and to make copies of this file in any form for
+#	internal or external distribution as long as this notice remains
+#	attached.
+#
+#	General notes:
+#
+#	This table contains the data the Unicode Consortium has on how
+#       CP424 characters map into Unicode.
+#
+#    Format: Three tab-separated columns
+#        Column #1 is the cp856_Hebrew_PC code (in hex)
+#        Column #2 is the Unicode (in hex as 0xXXXX)
+#        Column #3 is the Unicode name (follows a comment sign, '#')
+#
+#    The entries are in cp856_Hebrew_PC order
+#
+#	Version history
+#	1.0 version new.
+#
+#	Updated versions of this file may be found in:
+#		<ftp://ftp.unicode.org/Public/MAPPINGS/>
+#
+#	Any comments or problems, contact <errata@unicode.org>
+#	Please note that <errata@unicode.org> is an archival address;
+#	notices will be checked, but do not expect an immediate response.
+#
+0x00	0x0000	#NULL
+0x01	0x0001	#START OF HEADING
+0x02	0x0002	#START OF TEXT
+0x03	0x0003	#END OF TEXT
+0x04	0x0004	#END OF TRANSMISSION
+0x05	0x0005	#ENQUIRY
+0x06	0x0006	#ACKNOWLEDGE
+0x07	0x0007	#BELL
+0x08	0x0008	#BACKSPACE
+0x09	0x0009	#HORIZONTAL TABULATION
+0x0A	0x000A	#LINE FEED
+0x0B	0x000B	#VERTICAL TABULATION
+0x0C	0x000C	#FORM FEED
+0x0D	0x000D	#CARRIAGE RETURN
+0x0E	0x000E	#SHIFT OUT
+0x0F	0x000F	#SHIFT IN
+0x10	0x0010	#DATA LINK ESCAPE
+0x11	0x0011	#DEVICE CONTROL ONE
+0x12	0x0012	#DEVICE CONTROL TWO
+0x13	0x0013	#DEVICE CONTROL THREE
+0x14	0x0014	#DEVICE CONTROL FOUR
+0x15	0x0015	#NEGATIVE ACKNOWLEDGE
+0x16	0x0016	#SYNCHRONOUS IDLE
+0x17	0x0017	#END OF TRANSMISSION BLOCK
+0x18	0x0018	#CANCEL
+0x19	0x0019	#END OF MEDIUM
+0x1A	0x001A	#SUBSTITUTE
+0x1B	0x001B	#ESCAPE
+0x1C	0x001C	#FILE SEPARATOR
+0x1D	0x001D	#GROUP SEPARATOR
+0x1E	0x001E	#RECORD SEPARATOR
+0x1F	0x001F	#UNIT SEPARATOR
+0x20	0x0020	#SPACE
+0x21	0x0021	#EXCLAMATION MARK
+0x22	0x0022	#QUOTATION MARK
+0x23	0x0023	#NUMBER SIGN
+0x24	0x0024	#DOLLAR SIGN
+0x25	0x0025	#PERCENT SIGN
+0x26	0x0026	#AMPERSAND
+0x27	0x0027	#APOSTROPHE
+0x28	0x0028	#LEFT PARENTHESIS
+0x29	0x0029	#RIGHT PARENTHESIS
+0x2A	0x002A	#ASTERISK
+0x2B	0x002B	#PLUS SIGN
+0x2C	0x002C	#COMMA
+0x2D	0x002D	#HYPHEN-MINUS
+0x2E	0x002E	#FULL STOP
+0x2F	0x002F	#SOLIDUS
+0x30	0x0030	#DIGIT ZERO
+0x31	0x0031	#DIGIT ONE
+0x32	0x0032	#DIGIT TWO
+0x33	0x0033	#DIGIT THREE
+0x34	0x0034	#DIGIT FOUR
+0x35	0x0035	#DIGIT FIVE
+0x36	0x0036	#DIGIT SIX
+0x37	0x0037	#DIGIT SEVEN
+0x38	0x0038	#DIGIT EIGHT
+0x39	0x0039	#DIGIT NINE
+0x3A	0x003A	#COLON
+0x3B	0x003B	#SEMICOLON
+0x3C	0x003C	#LESS-THAN SIGN
+0x3D	0x003D	#EQUALS SIGN
+0x3E	0x003E	#GREATER-THAN SIGN
+0x3F	0x003F	#QUESTION MARK
+0x40	0x0040	#COMMERCIAL AT
+0x41	0x0041	#LATIN CAPITAL LETTER A
+0x42	0x0042	#LATIN CAPITAL LETTER B
+0x43	0x0043	#LATIN CAPITAL LETTER C
+0x44	0x0044	#LATIN CAPITAL LETTER D
+0x45	0x0045	#LATIN CAPITAL LETTER E
+0x46	0x0046	#LATIN CAPITAL LETTER F
+0x47	0x0047	#LATIN CAPITAL LETTER G
+0x48	0x0048	#LATIN CAPITAL LETTER H
+0x49	0x0049	#LATIN CAPITAL LETTER I
+0x4A	0x004A	#LATIN CAPITAL LETTER J
+0x4B	0x004B	#LATIN CAPITAL LETTER K
+0x4C	0x004C	#LATIN CAPITAL LETTER L
+0x4D	0x004D	#LATIN CAPITAL LETTER M
+0x4E	0x004E	#LATIN CAPITAL LETTER N
+0x4F	0x004F	#LATIN CAPITAL LETTER O
+0x50	0x0050	#LATIN CAPITAL LETTER P
+0x51	0x0051	#LATIN CAPITAL LETTER Q
+0x52	0x0052	#LATIN CAPITAL LETTER R
+0x53	0x0053	#LATIN CAPITAL LETTER S
+0x54	0x0054	#LATIN CAPITAL LETTER T
+0x55	0x0055	#LATIN CAPITAL LETTER U
+0x56	0x0056	#LATIN CAPITAL LETTER V
+0x57	0x0057	#LATIN CAPITAL LETTER W
+0x58	0x0058	#LATIN CAPITAL LETTER X
+0x59	0x0059	#LATIN CAPITAL LETTER Y
+0x5A	0x005A	#LATIN CAPITAL LETTER Z
+0x5B	0x005B	#LEFT SQUARE BRACKET
+0x5C	0x005C	#REVERSE SOLIDUS
+0x5D	0x005D	#RIGHT SQUARE BRACKET
+0x5E	0x005E	#CIRCUMFLEX ACCENT
+0x5F	0x005F	#LOW LINE
+0x60	0x0060	#GRAVE ACCENT
+0x61	0x0061	#LATIN SMALL LETTER A
+0x62	0x0062	#LATIN SMALL LETTER B
+0x63	0x0063	#LATIN SMALL LETTER C
+0x64	0x0064	#LATIN SMALL LETTER D
+0x65	0x0065	#LATIN SMALL LETTER E
+0x66	0x0066	#LATIN SMALL LETTER F
+0x67	0x0067	#LATIN SMALL LETTER G
+0x68	0x0068	#LATIN SMALL LETTER H
+0x69	0x0069	#LATIN SMALL LETTER I
+0x6A	0x006A	#LATIN SMALL LETTER J
+0x6B	0x006B	#LATIN SMALL LETTER K
+0x6C	0x006C	#LATIN SMALL LETTER L
+0x6D	0x006D	#LATIN SMALL LETTER M
+0x6E	0x006E	#LATIN SMALL LETTER N
+0x6F	0x006F	#LATIN SMALL LETTER O
+0x70	0x0070	#LATIN SMALL LETTER P
+0x71	0x0071	#LATIN SMALL LETTER Q
+0x72	0x0072	#LATIN SMALL LETTER R
+0x73	0x0073	#LATIN SMALL LETTER S
+0x74	0x0074	#LATIN SMALL LETTER T
+0x75	0x0075	#LATIN SMALL LETTER U
+0x76	0x0076	#LATIN SMALL LETTER V
+0x77	0x0077	#LATIN SMALL LETTER W
+0x78	0x0078	#LATIN SMALL LETTER X
+0x79	0x0079	#LATIN SMALL LETTER Y
+0x7A	0x007A	#LATIN SMALL LETTER Z
+0x7B	0x007B	#LEFT CURLY BRACKET
+0x7C	0x007C	#VERTICAL LINE
+0x7D	0x007D	#RIGHT CURLY BRACKET
+0x7E	0x007E	#TILDE
+0x7F	0x007F	#DELETE
+0x80	0x05D0	#HEBREW LETTER ALEF
+0x81	0x05D1	#HEBREW LETTER BET
+0x82	0x05D2	#HEBREW LETTER GIMEL
+0x83	0x05D3	#HEBREW LETTER DALET
+0x84	0x05D4	#HEBREW LETTER HE
+0x85	0x05D5	#HEBREW LETTER VAV
+0x86	0x05D6	#HEBREW LETTER ZAYIN
+0x87	0x05D7	#HEBREW LETTER HET
+0x88	0x05D8	#HEBREW LETTER TET
+0x89	0x05D9	#HEBREW LETTER YOD
+0x8A	0x05DA	#HEBREW LETTER FINAL KAF
+0x8B	0x05DB	#HEBREW LETTER KAF
+0x8C	0x05DC	#HEBREW LETTER LAMED
+0x8D	0x05DD	#HEBREW LETTER FINAL MEM
+0x8E	0x05DE	#HEBREW LETTER MEM
+0x8F	0x05DF	#HEBREW LETTER FINAL NUN
+0x90	0x05E0	#HEBREW LETTER NUN
+0x91	0x05E1	#HEBREW LETTER SAMEKH
+0x92	0x05E2	#HEBREW LETTER AYIN
+0x93	0x05E3	#HEBREW LETTER FINAL PE
+0x94	0x05E4	#HEBREW LETTER PE
+0x95	0x05E5	#HEBREW LETTER FINAL TSADI
+0x96	0x05E6	#HEBREW LETTER TSADI
+0x97	0x05E7	#HEBREW LETTER QOF
+0x98	0x05E8	#HEBREW LETTER RESH
+0x99	0x05E9	#HEBREW LETTER SHIN
+0x9A	0x05EA	#HEBREW LETTER TAV
+0x9B		#UNDEFINED
+0x9C	0x00A3	#POUND SIGN
+0x9D		#UNDEFINED
+0x9E	0x00D7	#MULTIPLICATION SIGN
+0x9F		#UNDEFINED
+0xA0		#UNDEFINED
+0xA1		#UNDEFINED
+0xA2		#UNDEFINED
+0xA3		#UNDEFINED
+0xA4		#UNDEFINED
+0xA5		#UNDEFINED
+0xA6		#UNDEFINED
+0xA7		#UNDEFINED
+0xA8		#UNDEFINED
+0xA9	0x00AE	#REGISTERED SIGN
+0xAA	0x00AC	#NOT SIGN
+0xAB	0x00BD	#VULGAR FRACTION ONE HALF
+0xAC	0x00BC	#VULGAR FRACTION ONE QUARTER
+0xAD		#UNDEFINED
+0xAE	0x00AB	#LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xAF	0x00BB	#RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xB0	0x2591	#LIGHT SHADE
+0xB1	0x2592	#MEDIUM SHADE
+0xB2	0x2593	#DARK SHADE
+0xB3	0x2502	#BOX DRAWINGS LIGHT VERTICAL
+0xB4	0x2524	#BOX DRAWINGS LIGHT VERTICAL AND LEFT
+0xB5		#UNDEFINED
+0xB6		#UNDEFINED
+0xB7		#UNDEFINED
+0xB8	0x00A9	#COPYRIGHT SIGN
+0xB9	0x2563	#BOX DRAWINGS DOUBLE VERTICAL AND LEFT
+0xBA	0x2551	#BOX DRAWINGS DOUBLE VERTICAL
+0xBB	0x2557	#BOX DRAWINGS DOUBLE DOWN AND LEFT
+0xBC	0x255D	#BOX DRAWINGS DOUBLE UP AND LEFT
+0xBD	0x00A2	#CENT SIGN
+0xBE	0x00A5	#YEN SIGN
+0xBF	0x2510	#BOX DRAWINGS LIGHT DOWN AND LEFT
+0xC0	0x2514	#BOX DRAWINGS LIGHT UP AND RIGHT
+0xC1	0x2534	#BOX DRAWINGS LIGHT UP AND HORIZONTAL
+0xC2	0x252C	#BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
+0xC3	0x251C	#BOX DRAWINGS LIGHT VERTICAL AND RIGHT
+0xC4	0x2500	#BOX DRAWINGS LIGHT HORIZONTAL
+0xC5	0x253C	#BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
+0xC6		#UNDEFINED
+0xC7		#UNDEFINED
+0xC8	0x255A	#BOX DRAWINGS DOUBLE UP AND RIGHT
+0xC9	0x2554	#BOX DRAWINGS DOUBLE DOWN AND RIGHT
+0xCA	0x2569	#BOX DRAWINGS DOUBLE UP AND HORIZONTAL
+0xCB	0x2566	#BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
+0xCC	0x2560	#BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
+0xCD	0x2550	#BOX DRAWINGS DOUBLE HORIZONTAL
+0xCE	0x256C	#BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
+0xCF	0x00A4	#CURRENCY SIGN
+0xD0		#UNDEFINED
+0xD1		#UNDEFINED
+0xD2		#UNDEFINED
+0xD3		#UNDEFINEDS
+0xD4		#UNDEFINED
+0xD5		#UNDEFINED
+0xD6		#UNDEFINEDE
+0xD7		#UNDEFINED
+0xD8		#UNDEFINED
+0xD9	0x2518	#BOX DRAWINGS LIGHT UP AND LEFT
+0xDA	0x250C	#BOX DRAWINGS LIGHT DOWN AND RIGHT
+0xDB	0x2588	#FULL BLOCK
+0xDC	0x2584	#LOWER HALF BLOCK
+0xDD	0x00A6	#BROKEN BAR
+0xDE		#UNDEFINED
+0xDF	0x2580	#UPPER HALF BLOCK
+0xE0		#UNDEFINED
+0xE1		#UNDEFINED
+0xE2		#UNDEFINED
+0xE3		#UNDEFINED
+0xE4		#UNDEFINED
+0xE5		#UNDEFINED
+0xE6	0x00B5	#MICRO SIGN
+0xE7		#UNDEFINED
+0xE8		#UNDEFINED
+0xE9		#UNDEFINED
+0xEA		#UNDEFINED
+0xEB		#UNDEFINED
+0xEC		#UNDEFINED
+0xED		#UNDEFINED
+0xEE	0x00AF	#MACRON
+0xEF	0x00B4	#ACUTE ACCENT
+0xF0	0x00AD	#SOFT HYPHEN
+0xF1	0x00B1	#PLUS-MINUS SIGN
+0xF2	0x2017	#DOUBLE LOW LINE
+0xF3	0x00BE	#VULGAR FRACTION THREE QUARTERS
+0xF4	0x00B6	#PILCROW SIGN
+0xF5	0x00A7	#SECTION SIGN
+0xF6	0x00F7	#DIVISION SIGN
+0xF7	0x00B8	#CEDILLA
+0xF8	0x00B0	#DEGREE SIGN
+0xF9	0x00A8	#DIAERESIS
+0xFA	0x00B7	#MIDDLE DOT
+0xFB	0x00B9	#SUPERSCRIPT ONE
+0xFC	0x00B3	#SUPERSCRIPT THREE
+0xFD	0x00B2	#SUPERSCRIPT TWO
+0xFE	0x25A0	#BLACK SQUARE
+0xFF	0x00A0	#NO-BREAK SPACE
+
diff --git a/lib/ucmaps/cp857.txt b/lib/ucmaps/cp857.txt
new file mode 100644
index 000000000..305938396
--- /dev/null
+++ b/lib/ucmaps/cp857.txt
@@ -0,0 +1,274 @@
+#
+#    Name:     cp857_DOSTurkish to Unicode table
+#    Unicode version: 2.0
+#    Table version: 2.00
+#    Table format:  Format A
+#    Date:          04/24/96
+#    Authors:       Lori Brownell <loribr@microsoft.com>
+#                   K.D. Chang    <a-kchang@microsoft.com>
+#    General notes: none
+#
+#    Format: Three tab-separated columns
+#        Column #1 is the cp857_DOSTurkish code (in hex)
+#        Column #2 is the Unicode (in hex as 0xXXXX)
+#        Column #3 is the Unicode name (follows a comment sign, '#')
+#
+#    The entries are in cp857_DOSTurkish order
+#
+0x00	0x0000	#NULL
+0x01	0x0001	#START OF HEADING
+0x02	0x0002	#START OF TEXT
+0x03	0x0003	#END OF TEXT
+0x04	0x0004	#END OF TRANSMISSION
+0x05	0x0005	#ENQUIRY
+0x06	0x0006	#ACKNOWLEDGE
+0x07	0x0007	#BELL
+0x08	0x0008	#BACKSPACE
+0x09	0x0009	#HORIZONTAL TABULATION
+0x0a	0x000a	#LINE FEED
+0x0b	0x000b	#VERTICAL TABULATION
+0x0c	0x000c	#FORM FEED
+0x0d	0x000d	#CARRIAGE RETURN
+0x0e	0x000e	#SHIFT OUT
+0x0f	0x000f	#SHIFT IN
+0x10	0x0010	#DATA LINK ESCAPE
+0x11	0x0011	#DEVICE CONTROL ONE
+0x12	0x0012	#DEVICE CONTROL TWO
+0x13	0x0013	#DEVICE CONTROL THREE
+0x14	0x0014	#DEVICE CONTROL FOUR
+0x15	0x0015	#NEGATIVE ACKNOWLEDGE
+0x16	0x0016	#SYNCHRONOUS IDLE
+0x17	0x0017	#END OF TRANSMISSION BLOCK
+0x18	0x0018	#CANCEL
+0x19	0x0019	#END OF MEDIUM
+0x1a	0x001a	#SUBSTITUTE
+0x1b	0x001b	#ESCAPE
+0x1c	0x001c	#FILE SEPARATOR
+0x1d	0x001d	#GROUP SEPARATOR
+0x1e	0x001e	#RECORD SEPARATOR
+0x1f	0x001f	#UNIT SEPARATOR
+0x20	0x0020	#SPACE
+0x21	0x0021	#EXCLAMATION MARK
+0x22	0x0022	#QUOTATION MARK
+0x23	0x0023	#NUMBER SIGN
+0x24	0x0024	#DOLLAR SIGN
+0x25	0x0025	#PERCENT SIGN
+0x26	0x0026	#AMPERSAND
+0x27	0x0027	#APOSTROPHE
+0x28	0x0028	#LEFT PARENTHESIS
+0x29	0x0029	#RIGHT PARENTHESIS
+0x2a	0x002a	#ASTERISK
+0x2b	0x002b	#PLUS SIGN
+0x2c	0x002c	#COMMA
+0x2d	0x002d	#HYPHEN-MINUS
+0x2e	0x002e	#FULL STOP
+0x2f	0x002f	#SOLIDUS
+0x30	0x0030	#DIGIT ZERO
+0x31	0x0031	#DIGIT ONE
+0x32	0x0032	#DIGIT TWO
+0x33	0x0033	#DIGIT THREE
+0x34	0x0034	#DIGIT FOUR
+0x35	0x0035	#DIGIT FIVE
+0x36	0x0036	#DIGIT SIX
+0x37	0x0037	#DIGIT SEVEN
+0x38	0x0038	#DIGIT EIGHT
+0x39	0x0039	#DIGIT NINE
+0x3a	0x003a	#COLON
+0x3b	0x003b	#SEMICOLON
+0x3c	0x003c	#LESS-THAN SIGN
+0x3d	0x003d	#EQUALS SIGN
+0x3e	0x003e	#GREATER-THAN SIGN
+0x3f	0x003f	#QUESTION MARK
+0x40	0x0040	#COMMERCIAL AT
+0x41	0x0041	#LATIN CAPITAL LETTER A
+0x42	0x0042	#LATIN CAPITAL LETTER B
+0x43	0x0043	#LATIN CAPITAL LETTER C
+0x44	0x0044	#LATIN CAPITAL LETTER D
+0x45	0x0045	#LATIN CAPITAL LETTER E
+0x46	0x0046	#LATIN CAPITAL LETTER F
+0x47	0x0047	#LATIN CAPITAL LETTER G
+0x48	0x0048	#LATIN CAPITAL LETTER H
+0x49	0x0049	#LATIN CAPITAL LETTER I
+0x4a	0x004a	#LATIN CAPITAL LETTER J
+0x4b	0x004b	#LATIN CAPITAL LETTER K
+0x4c	0x004c	#LATIN CAPITAL LETTER L
+0x4d	0x004d	#LATIN CAPITAL LETTER M
+0x4e	0x004e	#LATIN CAPITAL LETTER N
+0x4f	0x004f	#LATIN CAPITAL LETTER O
+0x50	0x0050	#LATIN CAPITAL LETTER P
+0x51	0x0051	#LATIN CAPITAL LETTER Q
+0x52	0x0052	#LATIN CAPITAL LETTER R
+0x53	0x0053	#LATIN CAPITAL LETTER S
+0x54	0x0054	#LATIN CAPITAL LETTER T
+0x55	0x0055	#LATIN CAPITAL LETTER U
+0x56	0x0056	#LATIN CAPITAL LETTER V
+0x57	0x0057	#LATIN CAPITAL LETTER W
+0x58	0x0058	#LATIN CAPITAL LETTER X
+0x59	0x0059	#LATIN CAPITAL LETTER Y
+0x5a	0x005a	#LATIN CAPITAL LETTER Z
+0x5b	0x005b	#LEFT SQUARE BRACKET
+0x5c	0x005c	#REVERSE SOLIDUS
+0x5d	0x005d	#RIGHT SQUARE BRACKET
+0x5e	0x005e	#CIRCUMFLEX ACCENT
+0x5f	0x005f	#LOW LINE
+0x60	0x0060	#GRAVE ACCENT
+0x61	0x0061	#LATIN SMALL LETTER A
+0x62	0x0062	#LATIN SMALL LETTER B
+0x63	0x0063	#LATIN SMALL LETTER C
+0x64	0x0064	#LATIN SMALL LETTER D
+0x65	0x0065	#LATIN SMALL LETTER E
+0x66	0x0066	#LATIN SMALL LETTER F
+0x67	0x0067	#LATIN SMALL LETTER G
+0x68	0x0068	#LATIN SMALL LETTER H
+0x69	0x0069	#LATIN SMALL LETTER I
+0x6a	0x006a	#LATIN SMALL LETTER J
+0x6b	0x006b	#LATIN SMALL LETTER K
+0x6c	0x006c	#LATIN SMALL LETTER L
+0x6d	0x006d	#LATIN SMALL LETTER M
+0x6e	0x006e	#LATIN SMALL LETTER N
+0x6f	0x006f	#LATIN SMALL LETTER O
+0x70	0x0070	#LATIN SMALL LETTER P
+0x71	0x0071	#LATIN SMALL LETTER Q
+0x72	0x0072	#LATIN SMALL LETTER R
+0x73	0x0073	#LATIN SMALL LETTER S
+0x74	0x0074	#LATIN SMALL LETTER T
+0x75	0x0075	#LATIN SMALL LETTER U
+0x76	0x0076	#LATIN SMALL LETTER V
+0x77	0x0077	#LATIN SMALL LETTER W
+0x78	0x0078	#LATIN SMALL LETTER X
+0x79	0x0079	#LATIN SMALL LETTER Y
+0x7a	0x007a	#LATIN SMALL LETTER Z
+0x7b	0x007b	#LEFT CURLY BRACKET
+0x7c	0x007c	#VERTICAL LINE
+0x7d	0x007d	#RIGHT CURLY BRACKET
+0x7e	0x007e	#TILDE
+0x7f	0x007f	#DELETE
+0x80	0x00c7	#LATIN CAPITAL LETTER C WITH CEDILLA
+0x81	0x00fc	#LATIN SMALL LETTER U WITH DIAERESIS
+0x82	0x00e9	#LATIN SMALL LETTER E WITH ACUTE
+0x83	0x00e2	#LATIN SMALL LETTER A WITH CIRCUMFLEX
+0x84	0x00e4	#LATIN SMALL LETTER A WITH DIAERESIS
+0x85	0x00e0	#LATIN SMALL LETTER A WITH GRAVE
+0x86	0x00e5	#LATIN SMALL LETTER A WITH RING ABOVE
+0x87	0x00e7	#LATIN SMALL LETTER C WITH CEDILLA
+0x88	0x00ea	#LATIN SMALL LETTER E WITH CIRCUMFLEX
+0x89	0x00eb	#LATIN SMALL LETTER E WITH DIAERESIS
+0x8a	0x00e8	#LATIN SMALL LETTER E WITH GRAVE
+0x8b	0x00ef	#LATIN SMALL LETTER I WITH DIAERESIS
+0x8c	0x00ee	#LATIN SMALL LETTER I WITH CIRCUMFLEX
+0x8d	0x0131	#LATIN SMALL LETTER DOTLESS I
+0x8e	0x00c4	#LATIN CAPITAL LETTER A WITH DIAERESIS
+0x8f	0x00c5	#LATIN CAPITAL LETTER A WITH RING ABOVE
+0x90	0x00c9	#LATIN CAPITAL LETTER E WITH ACUTE
+0x91	0x00e6	#LATIN SMALL LIGATURE AE
+0x92	0x00c6	#LATIN CAPITAL LIGATURE AE
+0x93	0x00f4	#LATIN SMALL LETTER O WITH CIRCUMFLEX
+0x94	0x00f6	#LATIN SMALL LETTER O WITH DIAERESIS
+0x95	0x00f2	#LATIN SMALL LETTER O WITH GRAVE
+0x96	0x00fb	#LATIN SMALL LETTER U WITH CIRCUMFLEX
+0x97	0x00f9	#LATIN SMALL LETTER U WITH GRAVE
+0x98	0x0130	#LATIN CAPITAL LETTER I WITH DOT ABOVE
+0x99	0x00d6	#LATIN CAPITAL LETTER O WITH DIAERESIS
+0x9a	0x00dc	#LATIN CAPITAL LETTER U WITH DIAERESIS
+0x9b	0x00f8	#LATIN SMALL LETTER O WITH STROKE
+0x9c	0x00a3	#POUND SIGN
+0x9d	0x00d8	#LATIN CAPITAL LETTER O WITH STROKE
+0x9e	0x015e	#LATIN CAPITAL LETTER S WITH CEDILLA
+0x9f	0x015f	#LATIN SMALL LETTER S WITH CEDILLA
+0xa0	0x00e1	#LATIN SMALL LETTER A WITH ACUTE
+0xa1	0x00ed	#LATIN SMALL LETTER I WITH ACUTE
+0xa2	0x00f3	#LATIN SMALL LETTER O WITH ACUTE
+0xa3	0x00fa	#LATIN SMALL LETTER U WITH ACUTE
+0xa4	0x00f1	#LATIN SMALL LETTER N WITH TILDE
+0xa5	0x00d1	#LATIN CAPITAL LETTER N WITH TILDE
+0xa6	0x011e	#LATIN CAPITAL LETTER G WITH BREVE
+0xa7	0x011f	#LATIN SMALL LETTER G WITH BREVE
+0xa8	0x00bf	#INVERTED QUESTION MARK
+0xa9	0x00ae	#REGISTERED SIGN
+0xaa	0x00ac	#NOT SIGN
+0xab	0x00bd	#VULGAR FRACTION ONE HALF
+0xac	0x00bc	#VULGAR FRACTION ONE QUARTER
+0xad	0x00a1	#INVERTED EXCLAMATION MARK
+0xae	0x00ab	#LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xaf	0x00bb	#RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xb0	0x2591	#LIGHT SHADE
+0xb1	0x2592	#MEDIUM SHADE
+0xb2	0x2593	#DARK SHADE
+0xb3	0x2502	#BOX DRAWINGS LIGHT VERTICAL
+0xb4	0x2524	#BOX DRAWINGS LIGHT VERTICAL AND LEFT
+0xb5	0x00c1	#LATIN CAPITAL LETTER A WITH ACUTE
+0xb6	0x00c2	#LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+0xb7	0x00c0	#LATIN CAPITAL LETTER A WITH GRAVE
+0xb8	0x00a9	#COPYRIGHT SIGN
+0xb9	0x2563	#BOX DRAWINGS DOUBLE VERTICAL AND LEFT
+0xba	0x2551	#BOX DRAWINGS DOUBLE VERTICAL
+0xbb	0x2557	#BOX DRAWINGS DOUBLE DOWN AND LEFT
+0xbc	0x255d	#BOX DRAWINGS DOUBLE UP AND LEFT
+0xbd	0x00a2	#CENT SIGN
+0xbe	0x00a5	#YEN SIGN
+0xbf	0x2510	#BOX DRAWINGS LIGHT DOWN AND LEFT
+0xc0	0x2514	#BOX DRAWINGS LIGHT UP AND RIGHT
+0xc1	0x2534	#BOX DRAWINGS LIGHT UP AND HORIZONTAL
+0xc2	0x252c	#BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
+0xc3	0x251c	#BOX DRAWINGS LIGHT VERTICAL AND RIGHT
+0xc4	0x2500	#BOX DRAWINGS LIGHT HORIZONTAL
+0xc5	0x253c	#BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
+0xc6	0x00e3	#LATIN SMALL LETTER A WITH TILDE
+0xc7	0x00c3	#LATIN CAPITAL LETTER A WITH TILDE
+0xc8	0x255a	#BOX DRAWINGS DOUBLE UP AND RIGHT
+0xc9	0x2554	#BOX DRAWINGS DOUBLE DOWN AND RIGHT
+0xca	0x2569	#BOX DRAWINGS DOUBLE UP AND HORIZONTAL
+0xcb	0x2566	#BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
+0xcc	0x2560	#BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
+0xcd	0x2550	#BOX DRAWINGS DOUBLE HORIZONTAL
+0xce	0x256c	#BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
+0xcf	0x00a4	#CURRENCY SIGN
+0xd0	0x00ba	#MASCULINE ORDINAL INDICATOR
+0xd1	0x00aa	#FEMININE ORDINAL INDICATOR
+0xd2	0x00ca	#LATIN CAPITAL LETTER E WITH CIRCUMFLEX
+0xd3	0x00cb	#LATIN CAPITAL LETTER E WITH DIAERESIS
+0xd4	0x00c8	#LATIN CAPITAL LETTER E WITH GRAVE
+0xd5		#UNDEFINED
+0xd6	0x00cd	#LATIN CAPITAL LETTER I WITH ACUTE
+0xd7	0x00ce	#LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+0xd8	0x00cf	#LATIN CAPITAL LETTER I WITH DIAERESIS
+0xd9	0x2518	#BOX DRAWINGS LIGHT UP AND LEFT
+0xda	0x250c	#BOX DRAWINGS LIGHT DOWN AND RIGHT
+0xdb	0x2588	#FULL BLOCK
+0xdc	0x2584	#LOWER HALF BLOCK
+0xdd	0x00a6	#BROKEN BAR
+0xde	0x00cc	#LATIN CAPITAL LETTER I WITH GRAVE
+0xdf	0x2580	#UPPER HALF BLOCK
+0xe0	0x00d3	#LATIN CAPITAL LETTER O WITH ACUTE
+0xe1	0x00df	#LATIN SMALL LETTER SHARP S
+0xe2	0x00d4	#LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+0xe3	0x00d2	#LATIN CAPITAL LETTER O WITH GRAVE
+0xe4	0x00f5	#LATIN SMALL LETTER O WITH TILDE
+0xe5	0x00d5	#LATIN CAPITAL LETTER O WITH TILDE
+0xe6	0x00b5	#MICRO SIGN
+0xe7		#UNDEFINED
+0xe8	0x00d7	#MULTIPLICATION SIGN
+0xe9	0x00da	#LATIN CAPITAL LETTER U WITH ACUTE
+0xea	0x00db	#LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+0xeb	0x00d9	#LATIN CAPITAL LETTER U WITH GRAVE
+0xec	0x00ec	#LATIN SMALL LETTER I WITH GRAVE
+0xed	0x00ff	#LATIN SMALL LETTER Y WITH DIAERESIS
+0xee	0x00af	#MACRON
+0xef	0x00b4	#ACUTE ACCENT
+0xf0	0x00ad	#SOFT HYPHEN
+0xf1	0x00b1	#PLUS-MINUS SIGN
+0xf2		#UNDEFINED
+0xf3	0x00be	#VULGAR FRACTION THREE QUARTERS
+0xf4	0x00b6	#PILCROW SIGN
+0xf5	0x00a7	#SECTION SIGN
+0xf6	0x00f7	#DIVISION SIGN
+0xf7	0x00b8	#CEDILLA
+0xf8	0x00b0	#DEGREE SIGN
+0xf9	0x00a8	#DIAERESIS
+0xfa	0x00b7	#MIDDLE DOT
+0xfb	0x00b9	#SUPERSCRIPT ONE
+0xfc	0x00b3	#SUPERSCRIPT THREE
+0xfd	0x00b2	#SUPERSCRIPT TWO
+0xfe	0x25a0	#BLACK SQUARE
+0xff	0x00a0	#NO-BREAK SPACE
+
diff --git a/lib/ucmaps/cp860.txt b/lib/ucmaps/cp860.txt
new file mode 100644
index 000000000..d7f2cb737
--- /dev/null
+++ b/lib/ucmaps/cp860.txt
@@ -0,0 +1,274 @@
+#
+#    Name:     cp860_DOSPortuguese to Unicode table
+#    Unicode version: 2.0
+#    Table version: 2.00
+#    Table format:  Format A
+#    Date:          04/24/96
+#    Authors:       Lori Brownell <loribr@microsoft.com>
+#                   K.D. Chang    <a-kchang@microsoft.com>
+#    General notes: none
+#
+#    Format: Three tab-separated columns
+#        Column #1 is the cp860_DOSPortuguese code (in hex)
+#        Column #2 is the Unicode (in hex as 0xXXXX)
+#        Column #3 is the Unicode name (follows a comment sign, '#')
+#
+#    The entries are in cp860_DOSPortuguese order
+#
+0x00	0x0000	#NULL
+0x01	0x0001	#START OF HEADING
+0x02	0x0002	#START OF TEXT
+0x03	0x0003	#END OF TEXT
+0x04	0x0004	#END OF TRANSMISSION
+0x05	0x0005	#ENQUIRY
+0x06	0x0006	#ACKNOWLEDGE
+0x07	0x0007	#BELL
+0x08	0x0008	#BACKSPACE
+0x09	0x0009	#HORIZONTAL TABULATION
+0x0a	0x000a	#LINE FEED
+0x0b	0x000b	#VERTICAL TABULATION
+0x0c	0x000c	#FORM FEED
+0x0d	0x000d	#CARRIAGE RETURN
+0x0e	0x000e	#SHIFT OUT
+0x0f	0x000f	#SHIFT IN
+0x10	0x0010	#DATA LINK ESCAPE
+0x11	0x0011	#DEVICE CONTROL ONE
+0x12	0x0012	#DEVICE CONTROL TWO
+0x13	0x0013	#DEVICE CONTROL THREE
+0x14	0x0014	#DEVICE CONTROL FOUR
+0x15	0x0015	#NEGATIVE ACKNOWLEDGE
+0x16	0x0016	#SYNCHRONOUS IDLE
+0x17	0x0017	#END OF TRANSMISSION BLOCK
+0x18	0x0018	#CANCEL
+0x19	0x0019	#END OF MEDIUM
+0x1a	0x001a	#SUBSTITUTE
+0x1b	0x001b	#ESCAPE
+0x1c	0x001c	#FILE SEPARATOR
+0x1d	0x001d	#GROUP SEPARATOR
+0x1e	0x001e	#RECORD SEPARATOR
+0x1f	0x001f	#UNIT SEPARATOR
+0x20	0x0020	#SPACE
+0x21	0x0021	#EXCLAMATION MARK
+0x22	0x0022	#QUOTATION MARK
+0x23	0x0023	#NUMBER SIGN
+0x24	0x0024	#DOLLAR SIGN
+0x25	0x0025	#PERCENT SIGN
+0x26	0x0026	#AMPERSAND
+0x27	0x0027	#APOSTROPHE
+0x28	0x0028	#LEFT PARENTHESIS
+0x29	0x0029	#RIGHT PARENTHESIS
+0x2a	0x002a	#ASTERISK
+0x2b	0x002b	#PLUS SIGN
+0x2c	0x002c	#COMMA
+0x2d	0x002d	#HYPHEN-MINUS
+0x2e	0x002e	#FULL STOP
+0x2f	0x002f	#SOLIDUS
+0x30	0x0030	#DIGIT ZERO
+0x31	0x0031	#DIGIT ONE
+0x32	0x0032	#DIGIT TWO
+0x33	0x0033	#DIGIT THREE
+0x34	0x0034	#DIGIT FOUR
+0x35	0x0035	#DIGIT FIVE
+0x36	0x0036	#DIGIT SIX
+0x37	0x0037	#DIGIT SEVEN
+0x38	0x0038	#DIGIT EIGHT
+0x39	0x0039	#DIGIT NINE
+0x3a	0x003a	#COLON
+0x3b	0x003b	#SEMICOLON
+0x3c	0x003c	#LESS-THAN SIGN
+0x3d	0x003d	#EQUALS SIGN
+0x3e	0x003e	#GREATER-THAN SIGN
+0x3f	0x003f	#QUESTION MARK
+0x40	0x0040	#COMMERCIAL AT
+0x41	0x0041	#LATIN CAPITAL LETTER A
+0x42	0x0042	#LATIN CAPITAL LETTER B
+0x43	0x0043	#LATIN CAPITAL LETTER C
+0x44	0x0044	#LATIN CAPITAL LETTER D
+0x45	0x0045	#LATIN CAPITAL LETTER E
+0x46	0x0046	#LATIN CAPITAL LETTER F
+0x47	0x0047	#LATIN CAPITAL LETTER G
+0x48	0x0048	#LATIN CAPITAL LETTER H
+0x49	0x0049	#LATIN CAPITAL LETTER I
+0x4a	0x004a	#LATIN CAPITAL LETTER J
+0x4b	0x004b	#LATIN CAPITAL LETTER K
+0x4c	0x004c	#LATIN CAPITAL LETTER L
+0x4d	0x004d	#LATIN CAPITAL LETTER M
+0x4e	0x004e	#LATIN CAPITAL LETTER N
+0x4f	0x004f	#LATIN CAPITAL LETTER O
+0x50	0x0050	#LATIN CAPITAL LETTER P
+0x51	0x0051	#LATIN CAPITAL LETTER Q
+0x52	0x0052	#LATIN CAPITAL LETTER R
+0x53	0x0053	#LATIN CAPITAL LETTER S
+0x54	0x0054	#LATIN CAPITAL LETTER T
+0x55	0x0055	#LATIN CAPITAL LETTER U
+0x56	0x0056	#LATIN CAPITAL LETTER V
+0x57	0x0057	#LATIN CAPITAL LETTER W
+0x58	0x0058	#LATIN CAPITAL LETTER X
+0x59	0x0059	#LATIN CAPITAL LETTER Y
+0x5a	0x005a	#LATIN CAPITAL LETTER Z
+0x5b	0x005b	#LEFT SQUARE BRACKET
+0x5c	0x005c	#REVERSE SOLIDUS
+0x5d	0x005d	#RIGHT SQUARE BRACKET
+0x5e	0x005e	#CIRCUMFLEX ACCENT
+0x5f	0x005f	#LOW LINE
+0x60	0x0060	#GRAVE ACCENT
+0x61	0x0061	#LATIN SMALL LETTER A
+0x62	0x0062	#LATIN SMALL LETTER B
+0x63	0x0063	#LATIN SMALL LETTER C
+0x64	0x0064	#LATIN SMALL LETTER D
+0x65	0x0065	#LATIN SMALL LETTER E
+0x66	0x0066	#LATIN SMALL LETTER F
+0x67	0x0067	#LATIN SMALL LETTER G
+0x68	0x0068	#LATIN SMALL LETTER H
+0x69	0x0069	#LATIN SMALL LETTER I
+0x6a	0x006a	#LATIN SMALL LETTER J
+0x6b	0x006b	#LATIN SMALL LETTER K
+0x6c	0x006c	#LATIN SMALL LETTER L
+0x6d	0x006d	#LATIN SMALL LETTER M
+0x6e	0x006e	#LATIN SMALL LETTER N
+0x6f	0x006f	#LATIN SMALL LETTER O
+0x70	0x0070	#LATIN SMALL LETTER P
+0x71	0x0071	#LATIN SMALL LETTER Q
+0x72	0x0072	#LATIN SMALL LETTER R
+0x73	0x0073	#LATIN SMALL LETTER S
+0x74	0x0074	#LATIN SMALL LETTER T
+0x75	0x0075	#LATIN SMALL LETTER U
+0x76	0x0076	#LATIN SMALL LETTER V
+0x77	0x0077	#LATIN SMALL LETTER W
+0x78	0x0078	#LATIN SMALL LETTER X
+0x79	0x0079	#LATIN SMALL LETTER Y
+0x7a	0x007a	#LATIN SMALL LETTER Z
+0x7b	0x007b	#LEFT CURLY BRACKET
+0x7c	0x007c	#VERTICAL LINE
+0x7d	0x007d	#RIGHT CURLY BRACKET
+0x7e	0x007e	#TILDE
+0x7f	0x007f	#DELETE
+0x80	0x00c7	#LATIN CAPITAL LETTER C WITH CEDILLA
+0x81	0x00fc	#LATIN SMALL LETTER U WITH DIAERESIS
+0x82	0x00e9	#LATIN SMALL LETTER E WITH ACUTE
+0x83	0x00e2	#LATIN SMALL LETTER A WITH CIRCUMFLEX
+0x84	0x00e3	#LATIN SMALL LETTER A WITH TILDE
+0x85	0x00e0	#LATIN SMALL LETTER A WITH GRAVE
+0x86	0x00c1	#LATIN CAPITAL LETTER A WITH ACUTE
+0x87	0x00e7	#LATIN SMALL LETTER C WITH CEDILLA
+0x88	0x00ea	#LATIN SMALL LETTER E WITH CIRCUMFLEX
+0x89	0x00ca	#LATIN CAPITAL LETTER E WITH CIRCUMFLEX
+0x8a	0x00e8	#LATIN SMALL LETTER E WITH GRAVE
+0x8b	0x00cd	#LATIN CAPITAL LETTER I WITH ACUTE
+0x8c	0x00d4	#LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+0x8d	0x00ec	#LATIN SMALL LETTER I WITH GRAVE
+0x8e	0x00c3	#LATIN CAPITAL LETTER A WITH TILDE
+0x8f	0x00c2	#LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+0x90	0x00c9	#LATIN CAPITAL LETTER E WITH ACUTE
+0x91	0x00c0	#LATIN CAPITAL LETTER A WITH GRAVE
+0x92	0x00c8	#LATIN CAPITAL LETTER E WITH GRAVE
+0x93	0x00f4	#LATIN SMALL LETTER O WITH CIRCUMFLEX
+0x94	0x00f5	#LATIN SMALL LETTER O WITH TILDE
+0x95	0x00f2	#LATIN SMALL LETTER O WITH GRAVE
+0x96	0x00da	#LATIN CAPITAL LETTER U WITH ACUTE
+0x97	0x00f9	#LATIN SMALL LETTER U WITH GRAVE
+0x98	0x00cc	#LATIN CAPITAL LETTER I WITH GRAVE
+0x99	0x00d5	#LATIN CAPITAL LETTER O WITH TILDE
+0x9a	0x00dc	#LATIN CAPITAL LETTER U WITH DIAERESIS
+0x9b	0x00a2	#CENT SIGN
+0x9c	0x00a3	#POUND SIGN
+0x9d	0x00d9	#LATIN CAPITAL LETTER U WITH GRAVE
+0x9e	0x20a7	#PESETA SIGN
+0x9f	0x00d3	#LATIN CAPITAL LETTER O WITH ACUTE
+0xa0	0x00e1	#LATIN SMALL LETTER A WITH ACUTE
+0xa1	0x00ed	#LATIN SMALL LETTER I WITH ACUTE
+0xa2	0x00f3	#LATIN SMALL LETTER O WITH ACUTE
+0xa3	0x00fa	#LATIN SMALL LETTER U WITH ACUTE
+0xa4	0x00f1	#LATIN SMALL LETTER N WITH TILDE
+0xa5	0x00d1	#LATIN CAPITAL LETTER N WITH TILDE
+0xa6	0x00aa	#FEMININE ORDINAL INDICATOR
+0xa7	0x00ba	#MASCULINE ORDINAL INDICATOR
+0xa8	0x00bf	#INVERTED QUESTION MARK
+0xa9	0x00d2	#LATIN CAPITAL LETTER O WITH GRAVE
+0xaa	0x00ac	#NOT SIGN
+0xab	0x00bd	#VULGAR FRACTION ONE HALF
+0xac	0x00bc	#VULGAR FRACTION ONE QUARTER
+0xad	0x00a1	#INVERTED EXCLAMATION MARK
+0xae	0x00ab	#LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xaf	0x00bb	#RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xb0	0x2591	#LIGHT SHADE
+0xb1	0x2592	#MEDIUM SHADE
+0xb2	0x2593	#DARK SHADE
+0xb3	0x2502	#BOX DRAWINGS LIGHT VERTICAL
+0xb4	0x2524	#BOX DRAWINGS LIGHT VERTICAL AND LEFT
+0xb5	0x2561	#BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE
+0xb6	0x2562	#BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE
+0xb7	0x2556	#BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE
+0xb8	0x2555	#BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE
+0xb9	0x2563	#BOX DRAWINGS DOUBLE VERTICAL AND LEFT
+0xba	0x2551	#BOX DRAWINGS DOUBLE VERTICAL
+0xbb	0x2557	#BOX DRAWINGS DOUBLE DOWN AND LEFT
+0xbc	0x255d	#BOX DRAWINGS DOUBLE UP AND LEFT
+0xbd	0x255c	#BOX DRAWINGS UP DOUBLE AND LEFT SINGLE
+0xbe	0x255b	#BOX DRAWINGS UP SINGLE AND LEFT DOUBLE
+0xbf	0x2510	#BOX DRAWINGS LIGHT DOWN AND LEFT
+0xc0	0x2514	#BOX DRAWINGS LIGHT UP AND RIGHT
+0xc1	0x2534	#BOX DRAWINGS LIGHT UP AND HORIZONTAL
+0xc2	0x252c	#BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
+0xc3	0x251c	#BOX DRAWINGS LIGHT VERTICAL AND RIGHT
+0xc4	0x2500	#BOX DRAWINGS LIGHT HORIZONTAL
+0xc5	0x253c	#BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
+0xc6	0x255e	#BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE
+0xc7	0x255f	#BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE
+0xc8	0x255a	#BOX DRAWINGS DOUBLE UP AND RIGHT
+0xc9	0x2554	#BOX DRAWINGS DOUBLE DOWN AND RIGHT
+0xca	0x2569	#BOX DRAWINGS DOUBLE UP AND HORIZONTAL
+0xcb	0x2566	#BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
+0xcc	0x2560	#BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
+0xcd	0x2550	#BOX DRAWINGS DOUBLE HORIZONTAL
+0xce	0x256c	#BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
+0xcf	0x2567	#BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE
+0xd0	0x2568	#BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE
+0xd1	0x2564	#BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE
+0xd2	0x2565	#BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE
+0xd3	0x2559	#BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE
+0xd4	0x2558	#BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE
+0xd5	0x2552	#BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE
+0xd6	0x2553	#BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE
+0xd7	0x256b	#BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE
+0xd8	0x256a	#BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE
+0xd9	0x2518	#BOX DRAWINGS LIGHT UP AND LEFT
+0xda	0x250c	#BOX DRAWINGS LIGHT DOWN AND RIGHT
+0xdb	0x2588	#FULL BLOCK
+0xdc	0x2584	#LOWER HALF BLOCK
+0xdd	0x258c	#LEFT HALF BLOCK
+0xde	0x2590	#RIGHT HALF BLOCK
+0xdf	0x2580	#UPPER HALF BLOCK
+0xe0	0x03b1	#GREEK SMALL LETTER ALPHA
+0xe1	0x00df	#LATIN SMALL LETTER SHARP S
+0xe2	0x0393	#GREEK CAPITAL LETTER GAMMA
+0xe3	0x03c0	#GREEK SMALL LETTER PI
+0xe4	0x03a3	#GREEK CAPITAL LETTER SIGMA
+0xe5	0x03c3	#GREEK SMALL LETTER SIGMA
+0xe6	0x00b5	#MICRO SIGN
+0xe7	0x03c4	#GREEK SMALL LETTER TAU
+0xe8	0x03a6	#GREEK CAPITAL LETTER PHI
+0xe9	0x0398	#GREEK CAPITAL LETTER THETA
+0xea	0x03a9	#GREEK CAPITAL LETTER OMEGA
+0xeb	0x03b4	#GREEK SMALL LETTER DELTA
+0xec	0x221e	#INFINITY
+0xed	0x03c6	#GREEK SMALL LETTER PHI
+0xee	0x03b5	#GREEK SMALL LETTER EPSILON
+0xef	0x2229	#INTERSECTION
+0xf0	0x2261	#IDENTICAL TO
+0xf1	0x00b1	#PLUS-MINUS SIGN
+0xf2	0x2265	#GREATER-THAN OR EQUAL TO
+0xf3	0x2264	#LESS-THAN OR EQUAL TO
+0xf4	0x2320	#TOP HALF INTEGRAL
+0xf5	0x2321	#BOTTOM HALF INTEGRAL
+0xf6	0x00f7	#DIVISION SIGN
+0xf7	0x2248	#ALMOST EQUAL TO
+0xf8	0x00b0	#DEGREE SIGN
+0xf9	0x2219	#BULLET OPERATOR
+0xfa	0x00b7	#MIDDLE DOT
+0xfb	0x221a	#SQUARE ROOT
+0xfc	0x207f	#SUPERSCRIPT LATIN SMALL LETTER N
+0xfd	0x00b2	#SUPERSCRIPT TWO
+0xfe	0x25a0	#BLACK SQUARE
+0xff	0x00a0	#NO-BREAK SPACE
+
diff --git a/lib/ucmaps/cp861.txt b/lib/ucmaps/cp861.txt
new file mode 100644
index 000000000..fe0f02bb5
--- /dev/null
+++ b/lib/ucmaps/cp861.txt
@@ -0,0 +1,274 @@
+#
+#    Name:     cp861_DOSIcelandic to Unicode table
+#    Unicode version: 2.0
+#    Table version: 2.00
+#    Table format:  Format A
+#    Date:          04/24/96
+#    Authors:       Lori Brownell <loribr@microsoft.com>
+#                   K.D. Chang    <a-kchang@microsoft.com>
+#    General notes: none
+#
+#    Format: Three tab-separated columns
+#        Column #1 is the cp861_DOSIcelandic code (in hex)
+#        Column #2 is the Unicode (in hex as 0xXXXX)
+#        Column #3 is the Unicode name (follows a comment sign, '#')
+#
+#    The entries are in cp861_DOSIcelandic order
+#
+0x00	0x0000	#NULL
+0x01	0x0001	#START OF HEADING
+0x02	0x0002	#START OF TEXT
+0x03	0x0003	#END OF TEXT
+0x04	0x0004	#END OF TRANSMISSION
+0x05	0x0005	#ENQUIRY
+0x06	0x0006	#ACKNOWLEDGE
+0x07	0x0007	#BELL
+0x08	0x0008	#BACKSPACE
+0x09	0x0009	#HORIZONTAL TABULATION
+0x0a	0x000a	#LINE FEED
+0x0b	0x000b	#VERTICAL TABULATION
+0x0c	0x000c	#FORM FEED
+0x0d	0x000d	#CARRIAGE RETURN
+0x0e	0x000e	#SHIFT OUT
+0x0f	0x000f	#SHIFT IN
+0x10	0x0010	#DATA LINK ESCAPE
+0x11	0x0011	#DEVICE CONTROL ONE
+0x12	0x0012	#DEVICE CONTROL TWO
+0x13	0x0013	#DEVICE CONTROL THREE
+0x14	0x0014	#DEVICE CONTROL FOUR
+0x15	0x0015	#NEGATIVE ACKNOWLEDGE
+0x16	0x0016	#SYNCHRONOUS IDLE
+0x17	0x0017	#END OF TRANSMISSION BLOCK
+0x18	0x0018	#CANCEL
+0x19	0x0019	#END OF MEDIUM
+0x1a	0x001a	#SUBSTITUTE
+0x1b	0x001b	#ESCAPE
+0x1c	0x001c	#FILE SEPARATOR
+0x1d	0x001d	#GROUP SEPARATOR
+0x1e	0x001e	#RECORD SEPARATOR
+0x1f	0x001f	#UNIT SEPARATOR
+0x20	0x0020	#SPACE
+0x21	0x0021	#EXCLAMATION MARK
+0x22	0x0022	#QUOTATION MARK
+0x23	0x0023	#NUMBER SIGN
+0x24	0x0024	#DOLLAR SIGN
+0x25	0x0025	#PERCENT SIGN
+0x26	0x0026	#AMPERSAND
+0x27	0x0027	#APOSTROPHE
+0x28	0x0028	#LEFT PARENTHESIS
+0x29	0x0029	#RIGHT PARENTHESIS
+0x2a	0x002a	#ASTERISK
+0x2b	0x002b	#PLUS SIGN
+0x2c	0x002c	#COMMA
+0x2d	0x002d	#HYPHEN-MINUS
+0x2e	0x002e	#FULL STOP
+0x2f	0x002f	#SOLIDUS
+0x30	0x0030	#DIGIT ZERO
+0x31	0x0031	#DIGIT ONE
+0x32	0x0032	#DIGIT TWO
+0x33	0x0033	#DIGIT THREE
+0x34	0x0034	#DIGIT FOUR
+0x35	0x0035	#DIGIT FIVE
+0x36	0x0036	#DIGIT SIX
+0x37	0x0037	#DIGIT SEVEN
+0x38	0x0038	#DIGIT EIGHT
+0x39	0x0039	#DIGIT NINE
+0x3a	0x003a	#COLON
+0x3b	0x003b	#SEMICOLON
+0x3c	0x003c	#LESS-THAN SIGN
+0x3d	0x003d	#EQUALS SIGN
+0x3e	0x003e	#GREATER-THAN SIGN
+0x3f	0x003f	#QUESTION MARK
+0x40	0x0040	#COMMERCIAL AT
+0x41	0x0041	#LATIN CAPITAL LETTER A
+0x42	0x0042	#LATIN CAPITAL LETTER B
+0x43	0x0043	#LATIN CAPITAL LETTER C
+0x44	0x0044	#LATIN CAPITAL LETTER D
+0x45	0x0045	#LATIN CAPITAL LETTER E
+0x46	0x0046	#LATIN CAPITAL LETTER F
+0x47	0x0047	#LATIN CAPITAL LETTER G
+0x48	0x0048	#LATIN CAPITAL LETTER H
+0x49	0x0049	#LATIN CAPITAL LETTER I
+0x4a	0x004a	#LATIN CAPITAL LETTER J
+0x4b	0x004b	#LATIN CAPITAL LETTER K
+0x4c	0x004c	#LATIN CAPITAL LETTER L
+0x4d	0x004d	#LATIN CAPITAL LETTER M
+0x4e	0x004e	#LATIN CAPITAL LETTER N
+0x4f	0x004f	#LATIN CAPITAL LETTER O
+0x50	0x0050	#LATIN CAPITAL LETTER P
+0x51	0x0051	#LATIN CAPITAL LETTER Q
+0x52	0x0052	#LATIN CAPITAL LETTER R
+0x53	0x0053	#LATIN CAPITAL LETTER S
+0x54	0x0054	#LATIN CAPITAL LETTER T
+0x55	0x0055	#LATIN CAPITAL LETTER U
+0x56	0x0056	#LATIN CAPITAL LETTER V
+0x57	0x0057	#LATIN CAPITAL LETTER W
+0x58	0x0058	#LATIN CAPITAL LETTER X
+0x59	0x0059	#LATIN CAPITAL LETTER Y
+0x5a	0x005a	#LATIN CAPITAL LETTER Z
+0x5b	0x005b	#LEFT SQUARE BRACKET
+0x5c	0x005c	#REVERSE SOLIDUS
+0x5d	0x005d	#RIGHT SQUARE BRACKET
+0x5e	0x005e	#CIRCUMFLEX ACCENT
+0x5f	0x005f	#LOW LINE
+0x60	0x0060	#GRAVE ACCENT
+0x61	0x0061	#LATIN SMALL LETTER A
+0x62	0x0062	#LATIN SMALL LETTER B
+0x63	0x0063	#LATIN SMALL LETTER C
+0x64	0x0064	#LATIN SMALL LETTER D
+0x65	0x0065	#LATIN SMALL LETTER E
+0x66	0x0066	#LATIN SMALL LETTER F
+0x67	0x0067	#LATIN SMALL LETTER G
+0x68	0x0068	#LATIN SMALL LETTER H
+0x69	0x0069	#LATIN SMALL LETTER I
+0x6a	0x006a	#LATIN SMALL LETTER J
+0x6b	0x006b	#LATIN SMALL LETTER K
+0x6c	0x006c	#LATIN SMALL LETTER L
+0x6d	0x006d	#LATIN SMALL LETTER M
+0x6e	0x006e	#LATIN SMALL LETTER N
+0x6f	0x006f	#LATIN SMALL LETTER O
+0x70	0x0070	#LATIN SMALL LETTER P
+0x71	0x0071	#LATIN SMALL LETTER Q
+0x72	0x0072	#LATIN SMALL LETTER R
+0x73	0x0073	#LATIN SMALL LETTER S
+0x74	0x0074	#LATIN SMALL LETTER T
+0x75	0x0075	#LATIN SMALL LETTER U
+0x76	0x0076	#LATIN SMALL LETTER V
+0x77	0x0077	#LATIN SMALL LETTER W
+0x78	0x0078	#LATIN SMALL LETTER X
+0x79	0x0079	#LATIN SMALL LETTER Y
+0x7a	0x007a	#LATIN SMALL LETTER Z
+0x7b	0x007b	#LEFT CURLY BRACKET
+0x7c	0x007c	#VERTICAL LINE
+0x7d	0x007d	#RIGHT CURLY BRACKET
+0x7e	0x007e	#TILDE
+0x7f	0x007f	#DELETE
+0x80	0x00c7	#LATIN CAPITAL LETTER C WITH CEDILLA
+0x81	0x00fc	#LATIN SMALL LETTER U WITH DIAERESIS
+0x82	0x00e9	#LATIN SMALL LETTER E WITH ACUTE
+0x83	0x00e2	#LATIN SMALL LETTER A WITH CIRCUMFLEX
+0x84	0x00e4	#LATIN SMALL LETTER A WITH DIAERESIS
+0x85	0x00e0	#LATIN SMALL LETTER A WITH GRAVE
+0x86	0x00e5	#LATIN SMALL LETTER A WITH RING ABOVE
+0x87	0x00e7	#LATIN SMALL LETTER C WITH CEDILLA
+0x88	0x00ea	#LATIN SMALL LETTER E WITH CIRCUMFLEX
+0x89	0x00eb	#LATIN SMALL LETTER E WITH DIAERESIS
+0x8a	0x00e8	#LATIN SMALL LETTER E WITH GRAVE
+0x8b	0x00d0	#LATIN CAPITAL LETTER ETH
+0x8c	0x00f0	#LATIN SMALL LETTER ETH
+0x8d	0x00de	#LATIN CAPITAL LETTER THORN
+0x8e	0x00c4	#LATIN CAPITAL LETTER A WITH DIAERESIS
+0x8f	0x00c5	#LATIN CAPITAL LETTER A WITH RING ABOVE
+0x90	0x00c9	#LATIN CAPITAL LETTER E WITH ACUTE
+0x91	0x00e6	#LATIN SMALL LIGATURE AE
+0x92	0x00c6	#LATIN CAPITAL LIGATURE AE
+0x93	0x00f4	#LATIN SMALL LETTER O WITH CIRCUMFLEX
+0x94	0x00f6	#LATIN SMALL LETTER O WITH DIAERESIS
+0x95	0x00fe	#LATIN SMALL LETTER THORN
+0x96	0x00fb	#LATIN SMALL LETTER U WITH CIRCUMFLEX
+0x97	0x00dd	#LATIN CAPITAL LETTER Y WITH ACUTE
+0x98	0x00fd	#LATIN SMALL LETTER Y WITH ACUTE
+0x99	0x00d6	#LATIN CAPITAL LETTER O WITH DIAERESIS
+0x9a	0x00dc	#LATIN CAPITAL LETTER U WITH DIAERESIS
+0x9b	0x00f8	#LATIN SMALL LETTER O WITH STROKE
+0x9c	0x00a3	#POUND SIGN
+0x9d	0x00d8	#LATIN CAPITAL LETTER O WITH STROKE
+0x9e	0x20a7	#PESETA SIGN
+0x9f	0x0192	#LATIN SMALL LETTER F WITH HOOK
+0xa0	0x00e1	#LATIN SMALL LETTER A WITH ACUTE
+0xa1	0x00ed	#LATIN SMALL LETTER I WITH ACUTE
+0xa2	0x00f3	#LATIN SMALL LETTER O WITH ACUTE
+0xa3	0x00fa	#LATIN SMALL LETTER U WITH ACUTE
+0xa4	0x00c1	#LATIN CAPITAL LETTER A WITH ACUTE
+0xa5	0x00cd	#LATIN CAPITAL LETTER I WITH ACUTE
+0xa6	0x00d3	#LATIN CAPITAL LETTER O WITH ACUTE
+0xa7	0x00da	#LATIN CAPITAL LETTER U WITH ACUTE
+0xa8	0x00bf	#INVERTED QUESTION MARK
+0xa9	0x2310	#REVERSED NOT SIGN
+0xaa	0x00ac	#NOT SIGN
+0xab	0x00bd	#VULGAR FRACTION ONE HALF
+0xac	0x00bc	#VULGAR FRACTION ONE QUARTER
+0xad	0x00a1	#INVERTED EXCLAMATION MARK
+0xae	0x00ab	#LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xaf	0x00bb	#RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xb0	0x2591	#LIGHT SHADE
+0xb1	0x2592	#MEDIUM SHADE
+0xb2	0x2593	#DARK SHADE
+0xb3	0x2502	#BOX DRAWINGS LIGHT VERTICAL
+0xb4	0x2524	#BOX DRAWINGS LIGHT VERTICAL AND LEFT
+0xb5	0x2561	#BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE
+0xb6	0x2562	#BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE
+0xb7	0x2556	#BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE
+0xb8	0x2555	#BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE
+0xb9	0x2563	#BOX DRAWINGS DOUBLE VERTICAL AND LEFT
+0xba	0x2551	#BOX DRAWINGS DOUBLE VERTICAL
+0xbb	0x2557	#BOX DRAWINGS DOUBLE DOWN AND LEFT
+0xbc	0x255d	#BOX DRAWINGS DOUBLE UP AND LEFT
+0xbd	0x255c	#BOX DRAWINGS UP DOUBLE AND LEFT SINGLE
+0xbe	0x255b	#BOX DRAWINGS UP SINGLE AND LEFT DOUBLE
+0xbf	0x2510	#BOX DRAWINGS LIGHT DOWN AND LEFT
+0xc0	0x2514	#BOX DRAWINGS LIGHT UP AND RIGHT
+0xc1	0x2534	#BOX DRAWINGS LIGHT UP AND HORIZONTAL
+0xc2	0x252c	#BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
+0xc3	0x251c	#BOX DRAWINGS LIGHT VERTICAL AND RIGHT
+0xc4	0x2500	#BOX DRAWINGS LIGHT HORIZONTAL
+0xc5	0x253c	#BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
+0xc6	0x255e	#BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE
+0xc7	0x255f	#BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE
+0xc8	0x255a	#BOX DRAWINGS DOUBLE UP AND RIGHT
+0xc9	0x2554	#BOX DRAWINGS DOUBLE DOWN AND RIGHT
+0xca	0x2569	#BOX DRAWINGS DOUBLE UP AND HORIZONTAL
+0xcb	0x2566	#BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
+0xcc	0x2560	#BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
+0xcd	0x2550	#BOX DRAWINGS DOUBLE HORIZONTAL
+0xce	0x256c	#BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
+0xcf	0x2567	#BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE
+0xd0	0x2568	#BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE
+0xd1	0x2564	#BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE
+0xd2	0x2565	#BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE
+0xd3	0x2559	#BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE
+0xd4	0x2558	#BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE
+0xd5	0x2552	#BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE
+0xd6	0x2553	#BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE
+0xd7	0x256b	#BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE
+0xd8	0x256a	#BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE
+0xd9	0x2518	#BOX DRAWINGS LIGHT UP AND LEFT
+0xda	0x250c	#BOX DRAWINGS LIGHT DOWN AND RIGHT
+0xdb	0x2588	#FULL BLOCK
+0xdc	0x2584	#LOWER HALF BLOCK
+0xdd	0x258c	#LEFT HALF BLOCK
+0xde	0x2590	#RIGHT HALF BLOCK
+0xdf	0x2580	#UPPER HALF BLOCK
+0xe0	0x03b1	#GREEK SMALL LETTER ALPHA
+0xe1	0x00df	#LATIN SMALL LETTER SHARP S
+0xe2	0x0393	#GREEK CAPITAL LETTER GAMMA
+0xe3	0x03c0	#GREEK SMALL LETTER PI
+0xe4	0x03a3	#GREEK CAPITAL LETTER SIGMA
+0xe5	0x03c3	#GREEK SMALL LETTER SIGMA
+0xe6	0x00b5	#MICRO SIGN
+0xe7	0x03c4	#GREEK SMALL LETTER TAU
+0xe8	0x03a6	#GREEK CAPITAL LETTER PHI
+0xe9	0x0398	#GREEK CAPITAL LETTER THETA
+0xea	0x03a9	#GREEK CAPITAL LETTER OMEGA
+0xeb	0x03b4	#GREEK SMALL LETTER DELTA
+0xec	0x221e	#INFINITY
+0xed	0x03c6	#GREEK SMALL LETTER PHI
+0xee	0x03b5	#GREEK SMALL LETTER EPSILON
+0xef	0x2229	#INTERSECTION
+0xf0	0x2261	#IDENTICAL TO
+0xf1	0x00b1	#PLUS-MINUS SIGN
+0xf2	0x2265	#GREATER-THAN OR EQUAL TO
+0xf3	0x2264	#LESS-THAN OR EQUAL TO
+0xf4	0x2320	#TOP HALF INTEGRAL
+0xf5	0x2321	#BOTTOM HALF INTEGRAL
+0xf6	0x00f7	#DIVISION SIGN
+0xf7	0x2248	#ALMOST EQUAL TO
+0xf8	0x00b0	#DEGREE SIGN
+0xf9	0x2219	#BULLET OPERATOR
+0xfa	0x00b7	#MIDDLE DOT
+0xfb	0x221a	#SQUARE ROOT
+0xfc	0x207f	#SUPERSCRIPT LATIN SMALL LETTER N
+0xfd	0x00b2	#SUPERSCRIPT TWO
+0xfe	0x25a0	#BLACK SQUARE
+0xff	0x00a0	#NO-BREAK SPACE
+
diff --git a/lib/ucmaps/cp862.txt b/lib/ucmaps/cp862.txt
new file mode 100644
index 000000000..963110518
--- /dev/null
+++ b/lib/ucmaps/cp862.txt
@@ -0,0 +1,274 @@
+#
+#    Name:     cp862_DOSHebrew to Unicode table
+#    Unicode version: 2.0
+#    Table version: 2.00
+#    Table format:  Format A
+#    Date:          04/24/96
+#    Authors:       Lori Brownell <loribr@microsoft.com>
+#                   K.D. Chang    <a-kchang@microsoft.com>
+#    General notes: none
+#
+#    Format: Three tab-separated columns
+#        Column #1 is the cp862_DOSHebrew code (in hex)
+#        Column #2 is the Unicode (in hex as 0xXXXX)
+#        Column #3 is the Unicode name (follows a comment sign, '#')
+#
+#    The entries are in cp862_DOSHebrew order
+#
+0x00	0x0000	#NULL
+0x01	0x0001	#START OF HEADING
+0x02	0x0002	#START OF TEXT
+0x03	0x0003	#END OF TEXT
+0x04	0x0004	#END OF TRANSMISSION
+0x05	0x0005	#ENQUIRY
+0x06	0x0006	#ACKNOWLEDGE
+0x07	0x0007	#BELL
+0x08	0x0008	#BACKSPACE
+0x09	0x0009	#HORIZONTAL TABULATION
+0x0a	0x000a	#LINE FEED
+0x0b	0x000b	#VERTICAL TABULATION
+0x0c	0x000c	#FORM FEED
+0x0d	0x000d	#CARRIAGE RETURN
+0x0e	0x000e	#SHIFT OUT
+0x0f	0x000f	#SHIFT IN
+0x10	0x0010	#DATA LINK ESCAPE
+0x11	0x0011	#DEVICE CONTROL ONE
+0x12	0x0012	#DEVICE CONTROL TWO
+0x13	0x0013	#DEVICE CONTROL THREE
+0x14	0x0014	#DEVICE CONTROL FOUR
+0x15	0x0015	#NEGATIVE ACKNOWLEDGE
+0x16	0x0016	#SYNCHRONOUS IDLE
+0x17	0x0017	#END OF TRANSMISSION BLOCK
+0x18	0x0018	#CANCEL
+0x19	0x0019	#END OF MEDIUM
+0x1a	0x001a	#SUBSTITUTE
+0x1b	0x001b	#ESCAPE
+0x1c	0x001c	#FILE SEPARATOR
+0x1d	0x001d	#GROUP SEPARATOR
+0x1e	0x001e	#RECORD SEPARATOR
+0x1f	0x001f	#UNIT SEPARATOR
+0x20	0x0020	#SPACE
+0x21	0x0021	#EXCLAMATION MARK
+0x22	0x0022	#QUOTATION MARK
+0x23	0x0023	#NUMBER SIGN
+0x24	0x0024	#DOLLAR SIGN
+0x25	0x0025	#PERCENT SIGN
+0x26	0x0026	#AMPERSAND
+0x27	0x0027	#APOSTROPHE
+0x28	0x0028	#LEFT PARENTHESIS
+0x29	0x0029	#RIGHT PARENTHESIS
+0x2a	0x002a	#ASTERISK
+0x2b	0x002b	#PLUS SIGN
+0x2c	0x002c	#COMMA
+0x2d	0x002d	#HYPHEN-MINUS
+0x2e	0x002e	#FULL STOP
+0x2f	0x002f	#SOLIDUS
+0x30	0x0030	#DIGIT ZERO
+0x31	0x0031	#DIGIT ONE
+0x32	0x0032	#DIGIT TWO
+0x33	0x0033	#DIGIT THREE
+0x34	0x0034	#DIGIT FOUR
+0x35	0x0035	#DIGIT FIVE
+0x36	0x0036	#DIGIT SIX
+0x37	0x0037	#DIGIT SEVEN
+0x38	0x0038	#DIGIT EIGHT
+0x39	0x0039	#DIGIT NINE
+0x3a	0x003a	#COLON
+0x3b	0x003b	#SEMICOLON
+0x3c	0x003c	#LESS-THAN SIGN
+0x3d	0x003d	#EQUALS SIGN
+0x3e	0x003e	#GREATER-THAN SIGN
+0x3f	0x003f	#QUESTION MARK
+0x40	0x0040	#COMMERCIAL AT
+0x41	0x0041	#LATIN CAPITAL LETTER A
+0x42	0x0042	#LATIN CAPITAL LETTER B
+0x43	0x0043	#LATIN CAPITAL LETTER C
+0x44	0x0044	#LATIN CAPITAL LETTER D
+0x45	0x0045	#LATIN CAPITAL LETTER E
+0x46	0x0046	#LATIN CAPITAL LETTER F
+0x47	0x0047	#LATIN CAPITAL LETTER G
+0x48	0x0048	#LATIN CAPITAL LETTER H
+0x49	0x0049	#LATIN CAPITAL LETTER I
+0x4a	0x004a	#LATIN CAPITAL LETTER J
+0x4b	0x004b	#LATIN CAPITAL LETTER K
+0x4c	0x004c	#LATIN CAPITAL LETTER L
+0x4d	0x004d	#LATIN CAPITAL LETTER M
+0x4e	0x004e	#LATIN CAPITAL LETTER N
+0x4f	0x004f	#LATIN CAPITAL LETTER O
+0x50	0x0050	#LATIN CAPITAL LETTER P
+0x51	0x0051	#LATIN CAPITAL LETTER Q
+0x52	0x0052	#LATIN CAPITAL LETTER R
+0x53	0x0053	#LATIN CAPITAL LETTER S
+0x54	0x0054	#LATIN CAPITAL LETTER T
+0x55	0x0055	#LATIN CAPITAL LETTER U
+0x56	0x0056	#LATIN CAPITAL LETTER V
+0x57	0x0057	#LATIN CAPITAL LETTER W
+0x58	0x0058	#LATIN CAPITAL LETTER X
+0x59	0x0059	#LATIN CAPITAL LETTER Y
+0x5a	0x005a	#LATIN CAPITAL LETTER Z
+0x5b	0x005b	#LEFT SQUARE BRACKET
+0x5c	0x005c	#REVERSE SOLIDUS
+0x5d	0x005d	#RIGHT SQUARE BRACKET
+0x5e	0x005e	#CIRCUMFLEX ACCENT
+0x5f	0x005f	#LOW LINE
+0x60	0x0060	#GRAVE ACCENT
+0x61	0x0061	#LATIN SMALL LETTER A
+0x62	0x0062	#LATIN SMALL LETTER B
+0x63	0x0063	#LATIN SMALL LETTER C
+0x64	0x0064	#LATIN SMALL LETTER D
+0x65	0x0065	#LATIN SMALL LETTER E
+0x66	0x0066	#LATIN SMALL LETTER F
+0x67	0x0067	#LATIN SMALL LETTER G
+0x68	0x0068	#LATIN SMALL LETTER H
+0x69	0x0069	#LATIN SMALL LETTER I
+0x6a	0x006a	#LATIN SMALL LETTER J
+0x6b	0x006b	#LATIN SMALL LETTER K
+0x6c	0x006c	#LATIN SMALL LETTER L
+0x6d	0x006d	#LATIN SMALL LETTER M
+0x6e	0x006e	#LATIN SMALL LETTER N
+0x6f	0x006f	#LATIN SMALL LETTER O
+0x70	0x0070	#LATIN SMALL LETTER P
+0x71	0x0071	#LATIN SMALL LETTER Q
+0x72	0x0072	#LATIN SMALL LETTER R
+0x73	0x0073	#LATIN SMALL LETTER S
+0x74	0x0074	#LATIN SMALL LETTER T
+0x75	0x0075	#LATIN SMALL LETTER U
+0x76	0x0076	#LATIN SMALL LETTER V
+0x77	0x0077	#LATIN SMALL LETTER W
+0x78	0x0078	#LATIN SMALL LETTER X
+0x79	0x0079	#LATIN SMALL LETTER Y
+0x7a	0x007a	#LATIN SMALL LETTER Z
+0x7b	0x007b	#LEFT CURLY BRACKET
+0x7c	0x007c	#VERTICAL LINE
+0x7d	0x007d	#RIGHT CURLY BRACKET
+0x7e	0x007e	#TILDE
+0x7f	0x007f	#DELETE
+0x80	0x05d0	#HEBREW LETTER ALEF
+0x81	0x05d1	#HEBREW LETTER BET
+0x82	0x05d2	#HEBREW LETTER GIMEL
+0x83	0x05d3	#HEBREW LETTER DALET
+0x84	0x05d4	#HEBREW LETTER HE
+0x85	0x05d5	#HEBREW LETTER VAV
+0x86	0x05d6	#HEBREW LETTER ZAYIN
+0x87	0x05d7	#HEBREW LETTER HET
+0x88	0x05d8	#HEBREW LETTER TET
+0x89	0x05d9	#HEBREW LETTER YOD
+0x8a	0x05da	#HEBREW LETTER FINAL KAF
+0x8b	0x05db	#HEBREW LETTER KAF
+0x8c	0x05dc	#HEBREW LETTER LAMED
+0x8d	0x05dd	#HEBREW LETTER FINAL MEM
+0x8e	0x05de	#HEBREW LETTER MEM
+0x8f	0x05df	#HEBREW LETTER FINAL NUN
+0x90	0x05e0	#HEBREW LETTER NUN
+0x91	0x05e1	#HEBREW LETTER SAMEKH
+0x92	0x05e2	#HEBREW LETTER AYIN
+0x93	0x05e3	#HEBREW LETTER FINAL PE
+0x94	0x05e4	#HEBREW LETTER PE
+0x95	0x05e5	#HEBREW LETTER FINAL TSADI
+0x96	0x05e6	#HEBREW LETTER TSADI
+0x97	0x05e7	#HEBREW LETTER QOF
+0x98	0x05e8	#HEBREW LETTER RESH
+0x99	0x05e9	#HEBREW LETTER SHIN
+0x9a	0x05ea	#HEBREW LETTER TAV
+0x9b	0x00a2	#CENT SIGN
+0x9c	0x00a3	#POUND SIGN
+0x9d	0x00a5	#YEN SIGN
+0x9e	0x20a7	#PESETA SIGN
+0x9f	0x0192	#LATIN SMALL LETTER F WITH HOOK
+0xa0	0x00e1	#LATIN SMALL LETTER A WITH ACUTE
+0xa1	0x00ed	#LATIN SMALL LETTER I WITH ACUTE
+0xa2	0x00f3	#LATIN SMALL LETTER O WITH ACUTE
+0xa3	0x00fa	#LATIN SMALL LETTER U WITH ACUTE
+0xa4	0x00f1	#LATIN SMALL LETTER N WITH TILDE
+0xa5	0x00d1	#LATIN CAPITAL LETTER N WITH TILDE
+0xa6	0x00aa	#FEMININE ORDINAL INDICATOR
+0xa7	0x00ba	#MASCULINE ORDINAL INDICATOR
+0xa8	0x00bf	#INVERTED QUESTION MARK
+0xa9	0x2310	#REVERSED NOT SIGN
+0xaa	0x00ac	#NOT SIGN
+0xab	0x00bd	#VULGAR FRACTION ONE HALF
+0xac	0x00bc	#VULGAR FRACTION ONE QUARTER
+0xad	0x00a1	#INVERTED EXCLAMATION MARK
+0xae	0x00ab	#LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xaf	0x00bb	#RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xb0	0x2591	#LIGHT SHADE
+0xb1	0x2592	#MEDIUM SHADE
+0xb2	0x2593	#DARK SHADE
+0xb3	0x2502	#BOX DRAWINGS LIGHT VERTICAL
+0xb4	0x2524	#BOX DRAWINGS LIGHT VERTICAL AND LEFT
+0xb5	0x2561	#BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE
+0xb6	0x2562	#BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE
+0xb7	0x2556	#BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE
+0xb8	0x2555	#BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE
+0xb9	0x2563	#BOX DRAWINGS DOUBLE VERTICAL AND LEFT
+0xba	0x2551	#BOX DRAWINGS DOUBLE VERTICAL
+0xbb	0x2557	#BOX DRAWINGS DOUBLE DOWN AND LEFT
+0xbc	0x255d	#BOX DRAWINGS DOUBLE UP AND LEFT
+0xbd	0x255c	#BOX DRAWINGS UP DOUBLE AND LEFT SINGLE
+0xbe	0x255b	#BOX DRAWINGS UP SINGLE AND LEFT DOUBLE
+0xbf	0x2510	#BOX DRAWINGS LIGHT DOWN AND LEFT
+0xc0	0x2514	#BOX DRAWINGS LIGHT UP AND RIGHT
+0xc1	0x2534	#BOX DRAWINGS LIGHT UP AND HORIZONTAL
+0xc2	0x252c	#BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
+0xc3	0x251c	#BOX DRAWINGS LIGHT VERTICAL AND RIGHT
+0xc4	0x2500	#BOX DRAWINGS LIGHT HORIZONTAL
+0xc5	0x253c	#BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
+0xc6	0x255e	#BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE
+0xc7	0x255f	#BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE
+0xc8	0x255a	#BOX DRAWINGS DOUBLE UP AND RIGHT
+0xc9	0x2554	#BOX DRAWINGS DOUBLE DOWN AND RIGHT
+0xca	0x2569	#BOX DRAWINGS DOUBLE UP AND HORIZONTAL
+0xcb	0x2566	#BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
+0xcc	0x2560	#BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
+0xcd	0x2550	#BOX DRAWINGS DOUBLE HORIZONTAL
+0xce	0x256c	#BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
+0xcf	0x2567	#BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE
+0xd0	0x2568	#BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE
+0xd1	0x2564	#BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE
+0xd2	0x2565	#BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE
+0xd3	0x2559	#BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE
+0xd4	0x2558	#BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE
+0xd5	0x2552	#BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE
+0xd6	0x2553	#BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE
+0xd7	0x256b	#BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE
+0xd8	0x256a	#BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE
+0xd9	0x2518	#BOX DRAWINGS LIGHT UP AND LEFT
+0xda	0x250c	#BOX DRAWINGS LIGHT DOWN AND RIGHT
+0xdb	0x2588	#FULL BLOCK
+0xdc	0x2584	#LOWER HALF BLOCK
+0xdd	0x258c	#LEFT HALF BLOCK
+0xde	0x2590	#RIGHT HALF BLOCK
+0xdf	0x2580	#UPPER HALF BLOCK
+0xe0	0x03b1	#GREEK SMALL LETTER ALPHA
+0xe1	0x00df	#LATIN SMALL LETTER SHARP S (GERMAN)
+0xe2	0x0393	#GREEK CAPITAL LETTER GAMMA
+0xe3	0x03c0	#GREEK SMALL LETTER PI
+0xe4	0x03a3	#GREEK CAPITAL LETTER SIGMA
+0xe5	0x03c3	#GREEK SMALL LETTER SIGMA
+0xe6	0x00b5	#MICRO SIGN
+0xe7	0x03c4	#GREEK SMALL LETTER TAU
+0xe8	0x03a6	#GREEK CAPITAL LETTER PHI
+0xe9	0x0398	#GREEK CAPITAL LETTER THETA
+0xea	0x03a9	#GREEK CAPITAL LETTER OMEGA
+0xeb	0x03b4	#GREEK SMALL LETTER DELTA
+0xec	0x221e	#INFINITY
+0xed	0x03c6	#GREEK SMALL LETTER PHI
+0xee	0x03b5	#GREEK SMALL LETTER EPSILON
+0xef	0x2229	#INTERSECTION
+0xf0	0x2261	#IDENTICAL TO
+0xf1	0x00b1	#PLUS-MINUS SIGN
+0xf2	0x2265	#GREATER-THAN OR EQUAL TO
+0xf3	0x2264	#LESS-THAN OR EQUAL TO
+0xf4	0x2320	#TOP HALF INTEGRAL
+0xf5	0x2321	#BOTTOM HALF INTEGRAL
+0xf6	0x00f7	#DIVISION SIGN
+0xf7	0x2248	#ALMOST EQUAL TO
+0xf8	0x00b0	#DEGREE SIGN
+0xf9	0x2219	#BULLET OPERATOR
+0xfa	0x00b7	#MIDDLE DOT
+0xfb	0x221a	#SQUARE ROOT
+0xfc	0x207f	#SUPERSCRIPT LATIN SMALL LETTER N
+0xfd	0x00b2	#SUPERSCRIPT TWO
+0xfe	0x25a0	#BLACK SQUARE
+0xff	0x00a0	#NO-BREAK SPACE
+
diff --git a/lib/ucmaps/cp863.txt b/lib/ucmaps/cp863.txt
new file mode 100644
index 000000000..cc4eae186
--- /dev/null
+++ b/lib/ucmaps/cp863.txt
@@ -0,0 +1,274 @@
+#
+#    Name:     cp863_DOSCanadaF to Unicode table
+#    Unicode version: 2.0
+#    Table version: 2.00
+#    Table format:  Format A
+#    Date:          04/24/96
+#    Authors:       Lori Brownell <loribr@microsoft.com>
+#                   K.D. Chang    <a-kchang@microsoft.com>
+#    General notes: none
+#
+#    Format: Three tab-separated columns
+#        Column #1 is the cp863_DOSCanadaF code (in hex)
+#        Column #2 is the Unicode (in hex as 0xXXXX)
+#        Column #3 is the Unicode name (follows a comment sign, '#')
+#
+#    The entries are in cp863_DOSCanadaF order
+#
+0x00	0x0000	#NULL
+0x01	0x0001	#START OF HEADING
+0x02	0x0002	#START OF TEXT
+0x03	0x0003	#END OF TEXT
+0x04	0x0004	#END OF TRANSMISSION
+0x05	0x0005	#ENQUIRY
+0x06	0x0006	#ACKNOWLEDGE
+0x07	0x0007	#BELL
+0x08	0x0008	#BACKSPACE
+0x09	0x0009	#HORIZONTAL TABULATION
+0x0a	0x000a	#LINE FEED
+0x0b	0x000b	#VERTICAL TABULATION
+0x0c	0x000c	#FORM FEED
+0x0d	0x000d	#CARRIAGE RETURN
+0x0e	0x000e	#SHIFT OUT
+0x0f	0x000f	#SHIFT IN
+0x10	0x0010	#DATA LINK ESCAPE
+0x11	0x0011	#DEVICE CONTROL ONE
+0x12	0x0012	#DEVICE CONTROL TWO
+0x13	0x0013	#DEVICE CONTROL THREE
+0x14	0x0014	#DEVICE CONTROL FOUR
+0x15	0x0015	#NEGATIVE ACKNOWLEDGE
+0x16	0x0016	#SYNCHRONOUS IDLE
+0x17	0x0017	#END OF TRANSMISSION BLOCK
+0x18	0x0018	#CANCEL
+0x19	0x0019	#END OF MEDIUM
+0x1a	0x001a	#SUBSTITUTE
+0x1b	0x001b	#ESCAPE
+0x1c	0x001c	#FILE SEPARATOR
+0x1d	0x001d	#GROUP SEPARATOR
+0x1e	0x001e	#RECORD SEPARATOR
+0x1f	0x001f	#UNIT SEPARATOR
+0x20	0x0020	#SPACE
+0x21	0x0021	#EXCLAMATION MARK
+0x22	0x0022	#QUOTATION MARK
+0x23	0x0023	#NUMBER SIGN
+0x24	0x0024	#DOLLAR SIGN
+0x25	0x0025	#PERCENT SIGN
+0x26	0x0026	#AMPERSAND
+0x27	0x0027	#APOSTROPHE
+0x28	0x0028	#LEFT PARENTHESIS
+0x29	0x0029	#RIGHT PARENTHESIS
+0x2a	0x002a	#ASTERISK
+0x2b	0x002b	#PLUS SIGN
+0x2c	0x002c	#COMMA
+0x2d	0x002d	#HYPHEN-MINUS
+0x2e	0x002e	#FULL STOP
+0x2f	0x002f	#SOLIDUS
+0x30	0x0030	#DIGIT ZERO
+0x31	0x0031	#DIGIT ONE
+0x32	0x0032	#DIGIT TWO
+0x33	0x0033	#DIGIT THREE
+0x34	0x0034	#DIGIT FOUR
+0x35	0x0035	#DIGIT FIVE
+0x36	0x0036	#DIGIT SIX
+0x37	0x0037	#DIGIT SEVEN
+0x38	0x0038	#DIGIT EIGHT
+0x39	0x0039	#DIGIT NINE
+0x3a	0x003a	#COLON
+0x3b	0x003b	#SEMICOLON
+0x3c	0x003c	#LESS-THAN SIGN
+0x3d	0x003d	#EQUALS SIGN
+0x3e	0x003e	#GREATER-THAN SIGN
+0x3f	0x003f	#QUESTION MARK
+0x40	0x0040	#COMMERCIAL AT
+0x41	0x0041	#LATIN CAPITAL LETTER A
+0x42	0x0042	#LATIN CAPITAL LETTER B
+0x43	0x0043	#LATIN CAPITAL LETTER C
+0x44	0x0044	#LATIN CAPITAL LETTER D
+0x45	0x0045	#LATIN CAPITAL LETTER E
+0x46	0x0046	#LATIN CAPITAL LETTER F
+0x47	0x0047	#LATIN CAPITAL LETTER G
+0x48	0x0048	#LATIN CAPITAL LETTER H
+0x49	0x0049	#LATIN CAPITAL LETTER I
+0x4a	0x004a	#LATIN CAPITAL LETTER J
+0x4b	0x004b	#LATIN CAPITAL LETTER K
+0x4c	0x004c	#LATIN CAPITAL LETTER L
+0x4d	0x004d	#LATIN CAPITAL LETTER M
+0x4e	0x004e	#LATIN CAPITAL LETTER N
+0x4f	0x004f	#LATIN CAPITAL LETTER O
+0x50	0x0050	#LATIN CAPITAL LETTER P
+0x51	0x0051	#LATIN CAPITAL LETTER Q
+0x52	0x0052	#LATIN CAPITAL LETTER R
+0x53	0x0053	#LATIN CAPITAL LETTER S
+0x54	0x0054	#LATIN CAPITAL LETTER T
+0x55	0x0055	#LATIN CAPITAL LETTER U
+0x56	0x0056	#LATIN CAPITAL LETTER V
+0x57	0x0057	#LATIN CAPITAL LETTER W
+0x58	0x0058	#LATIN CAPITAL LETTER X
+0x59	0x0059	#LATIN CAPITAL LETTER Y
+0x5a	0x005a	#LATIN CAPITAL LETTER Z
+0x5b	0x005b	#LEFT SQUARE BRACKET
+0x5c	0x005c	#REVERSE SOLIDUS
+0x5d	0x005d	#RIGHT SQUARE BRACKET
+0x5e	0x005e	#CIRCUMFLEX ACCENT
+0x5f	0x005f	#LOW LINE
+0x60	0x0060	#GRAVE ACCENT
+0x61	0x0061	#LATIN SMALL LETTER A
+0x62	0x0062	#LATIN SMALL LETTER B
+0x63	0x0063	#LATIN SMALL LETTER C
+0x64	0x0064	#LATIN SMALL LETTER D
+0x65	0x0065	#LATIN SMALL LETTER E
+0x66	0x0066	#LATIN SMALL LETTER F
+0x67	0x0067	#LATIN SMALL LETTER G
+0x68	0x0068	#LATIN SMALL LETTER H
+0x69	0x0069	#LATIN SMALL LETTER I
+0x6a	0x006a	#LATIN SMALL LETTER J
+0x6b	0x006b	#LATIN SMALL LETTER K
+0x6c	0x006c	#LATIN SMALL LETTER L
+0x6d	0x006d	#LATIN SMALL LETTER M
+0x6e	0x006e	#LATIN SMALL LETTER N
+0x6f	0x006f	#LATIN SMALL LETTER O
+0x70	0x0070	#LATIN SMALL LETTER P
+0x71	0x0071	#LATIN SMALL LETTER Q
+0x72	0x0072	#LATIN SMALL LETTER R
+0x73	0x0073	#LATIN SMALL LETTER S
+0x74	0x0074	#LATIN SMALL LETTER T
+0x75	0x0075	#LATIN SMALL LETTER U
+0x76	0x0076	#LATIN SMALL LETTER V
+0x77	0x0077	#LATIN SMALL LETTER W
+0x78	0x0078	#LATIN SMALL LETTER X
+0x79	0x0079	#LATIN SMALL LETTER Y
+0x7a	0x007a	#LATIN SMALL LETTER Z
+0x7b	0x007b	#LEFT CURLY BRACKET
+0x7c	0x007c	#VERTICAL LINE
+0x7d	0x007d	#RIGHT CURLY BRACKET
+0x7e	0x007e	#TILDE
+0x7f	0x007f	#DELETE
+0x80	0x00c7	#LATIN CAPITAL LETTER C WITH CEDILLA
+0x81	0x00fc	#LATIN SMALL LETTER U WITH DIAERESIS
+0x82	0x00e9	#LATIN SMALL LETTER E WITH ACUTE
+0x83	0x00e2	#LATIN SMALL LETTER A WITH CIRCUMFLEX
+0x84	0x00c2	#LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+0x85	0x00e0	#LATIN SMALL LETTER A WITH GRAVE
+0x86	0x00b6	#PILCROW SIGN
+0x87	0x00e7	#LATIN SMALL LETTER C WITH CEDILLA
+0x88	0x00ea	#LATIN SMALL LETTER E WITH CIRCUMFLEX
+0x89	0x00eb	#LATIN SMALL LETTER E WITH DIAERESIS
+0x8a	0x00e8	#LATIN SMALL LETTER E WITH GRAVE
+0x8b	0x00ef	#LATIN SMALL LETTER I WITH DIAERESIS
+0x8c	0x00ee	#LATIN SMALL LETTER I WITH CIRCUMFLEX
+0x8d	0x2017	#DOUBLE LOW LINE
+0x8e	0x00c0	#LATIN CAPITAL LETTER A WITH GRAVE
+0x8f	0x00a7	#SECTION SIGN
+0x90	0x00c9	#LATIN CAPITAL LETTER E WITH ACUTE
+0x91	0x00c8	#LATIN CAPITAL LETTER E WITH GRAVE
+0x92	0x00ca	#LATIN CAPITAL LETTER E WITH CIRCUMFLEX
+0x93	0x00f4	#LATIN SMALL LETTER O WITH CIRCUMFLEX
+0x94	0x00cb	#LATIN CAPITAL LETTER E WITH DIAERESIS
+0x95	0x00cf	#LATIN CAPITAL LETTER I WITH DIAERESIS
+0x96	0x00fb	#LATIN SMALL LETTER U WITH CIRCUMFLEX
+0x97	0x00f9	#LATIN SMALL LETTER U WITH GRAVE
+0x98	0x00a4	#CURRENCY SIGN
+0x99	0x00d4	#LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+0x9a	0x00dc	#LATIN CAPITAL LETTER U WITH DIAERESIS
+0x9b	0x00a2	#CENT SIGN
+0x9c	0x00a3	#POUND SIGN
+0x9d	0x00d9	#LATIN CAPITAL LETTER U WITH GRAVE
+0x9e	0x00db	#LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+0x9f	0x0192	#LATIN SMALL LETTER F WITH HOOK
+0xa0	0x00a6	#BROKEN BAR
+0xa1	0x00b4	#ACUTE ACCENT
+0xa2	0x00f3	#LATIN SMALL LETTER O WITH ACUTE
+0xa3	0x00fa	#LATIN SMALL LETTER U WITH ACUTE
+0xa4	0x00a8	#DIAERESIS
+0xa5	0x00b8	#CEDILLA
+0xa6	0x00b3	#SUPERSCRIPT THREE
+0xa7	0x00af	#MACRON
+0xa8	0x00ce	#LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+0xa9	0x2310	#REVERSED NOT SIGN
+0xaa	0x00ac	#NOT SIGN
+0xab	0x00bd	#VULGAR FRACTION ONE HALF
+0xac	0x00bc	#VULGAR FRACTION ONE QUARTER
+0xad	0x00be	#VULGAR FRACTION THREE QUARTERS
+0xae	0x00ab	#LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xaf	0x00bb	#RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xb0	0x2591	#LIGHT SHADE
+0xb1	0x2592	#MEDIUM SHADE
+0xb2	0x2593	#DARK SHADE
+0xb3	0x2502	#BOX DRAWINGS LIGHT VERTICAL
+0xb4	0x2524	#BOX DRAWINGS LIGHT VERTICAL AND LEFT
+0xb5	0x2561	#BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE
+0xb6	0x2562	#BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE
+0xb7	0x2556	#BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE
+0xb8	0x2555	#BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE
+0xb9	0x2563	#BOX DRAWINGS DOUBLE VERTICAL AND LEFT
+0xba	0x2551	#BOX DRAWINGS DOUBLE VERTICAL
+0xbb	0x2557	#BOX DRAWINGS DOUBLE DOWN AND LEFT
+0xbc	0x255d	#BOX DRAWINGS DOUBLE UP AND LEFT
+0xbd	0x255c	#BOX DRAWINGS UP DOUBLE AND LEFT SINGLE
+0xbe	0x255b	#BOX DRAWINGS UP SINGLE AND LEFT DOUBLE
+0xbf	0x2510	#BOX DRAWINGS LIGHT DOWN AND LEFT
+0xc0	0x2514	#BOX DRAWINGS LIGHT UP AND RIGHT
+0xc1	0x2534	#BOX DRAWINGS LIGHT UP AND HORIZONTAL
+0xc2	0x252c	#BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
+0xc3	0x251c	#BOX DRAWINGS LIGHT VERTICAL AND RIGHT
+0xc4	0x2500	#BOX DRAWINGS LIGHT HORIZONTAL
+0xc5	0x253c	#BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
+0xc6	0x255e	#BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE
+0xc7	0x255f	#BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE
+0xc8	0x255a	#BOX DRAWINGS DOUBLE UP AND RIGHT
+0xc9	0x2554	#BOX DRAWINGS DOUBLE DOWN AND RIGHT
+0xca	0x2569	#BOX DRAWINGS DOUBLE UP AND HORIZONTAL
+0xcb	0x2566	#BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
+0xcc	0x2560	#BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
+0xcd	0x2550	#BOX DRAWINGS DOUBLE HORIZONTAL
+0xce	0x256c	#BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
+0xcf	0x2567	#BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE
+0xd0	0x2568	#BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE
+0xd1	0x2564	#BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE
+0xd2	0x2565	#BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE
+0xd3	0x2559	#BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE
+0xd4	0x2558	#BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE
+0xd5	0x2552	#BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE
+0xd6	0x2553	#BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE
+0xd7	0x256b	#BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE
+0xd8	0x256a	#BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE
+0xd9	0x2518	#BOX DRAWINGS LIGHT UP AND LEFT
+0xda	0x250c	#BOX DRAWINGS LIGHT DOWN AND RIGHT
+0xdb	0x2588	#FULL BLOCK
+0xdc	0x2584	#LOWER HALF BLOCK
+0xdd	0x258c	#LEFT HALF BLOCK
+0xde	0x2590	#RIGHT HALF BLOCK
+0xdf	0x2580	#UPPER HALF BLOCK
+0xe0	0x03b1	#GREEK SMALL LETTER ALPHA
+0xe1	0x00df	#LATIN SMALL LETTER SHARP S
+0xe2	0x0393	#GREEK CAPITAL LETTER GAMMA
+0xe3	0x03c0	#GREEK SMALL LETTER PI
+0xe4	0x03a3	#GREEK CAPITAL LETTER SIGMA
+0xe5	0x03c3	#GREEK SMALL LETTER SIGMA
+0xe6	0x00b5	#MICRO SIGN
+0xe7	0x03c4	#GREEK SMALL LETTER TAU
+0xe8	0x03a6	#GREEK CAPITAL LETTER PHI
+0xe9	0x0398	#GREEK CAPITAL LETTER THETA
+0xea	0x03a9	#GREEK CAPITAL LETTER OMEGA
+0xeb	0x03b4	#GREEK SMALL LETTER DELTA
+0xec	0x221e	#INFINITY
+0xed	0x03c6	#GREEK SMALL LETTER PHI
+0xee	0x03b5	#GREEK SMALL LETTER EPSILON
+0xef	0x2229	#INTERSECTION
+0xf0	0x2261	#IDENTICAL TO
+0xf1	0x00b1	#PLUS-MINUS SIGN
+0xf2	0x2265	#GREATER-THAN OR EQUAL TO
+0xf3	0x2264	#LESS-THAN OR EQUAL TO
+0xf4	0x2320	#TOP HALF INTEGRAL
+0xf5	0x2321	#BOTTOM HALF INTEGRAL
+0xf6	0x00f7	#DIVISION SIGN
+0xf7	0x2248	#ALMOST EQUAL TO
+0xf8	0x00b0	#DEGREE SIGN
+0xf9	0x2219	#BULLET OPERATOR
+0xfa	0x00b7	#MIDDLE DOT
+0xfb	0x221a	#SQUARE ROOT
+0xfc	0x207f	#SUPERSCRIPT LATIN SMALL LETTER N
+0xfd	0x00b2	#SUPERSCRIPT TWO
+0xfe	0x25a0	#BLACK SQUARE
+0xff	0x00a0	#NO-BREAK SPACE
+
diff --git a/lib/ucmaps/cp864.txt b/lib/ucmaps/cp864.txt
new file mode 100644
index 000000000..7aa055fba
--- /dev/null
+++ b/lib/ucmaps/cp864.txt
@@ -0,0 +1,274 @@
+#
+#    Name:     cp864_DOSArabic to Unicode table
+#    Unicode version: 2.0
+#    Table version: 2.00
+#    Table format:  Format A
+#    Date:          04/24/96
+#    Authors:       Lori Brownell <loribr@microsoft.com>
+#                   K.D. Chang    <a-kchang@microsoft.com>
+#    General notes: none
+#
+#    Format: Three tab-separated columns
+#        Column #1 is the cp864_DOSArabic code (in hex)
+#        Column #2 is the Unicode (in hex as 0xXXXX)
+#        Column #3 is the Unicode name (follows a comment sign, '#')
+#
+#    The entries are in cp864_DOSArabic order
+#
+0x00	0x0000	#NULL
+0x01	0x0001	#START OF HEADING
+0x02	0x0002	#START OF TEXT
+0x03	0x0003	#END OF TEXT
+0x04	0x0004	#END OF TRANSMISSION
+0x05	0x0005	#ENQUIRY
+0x06	0x0006	#ACKNOWLEDGE
+0x07	0x0007	#BELL
+0x08	0x0008	#BACKSPACE
+0x09	0x0009	#HORIZONTAL TABULATION
+0x0a	0x000a	#LINE FEED
+0x0b	0x000b	#VERTICAL TABULATION
+0x0c	0x000c	#FORM FEED
+0x0d	0x000d	#CARRIAGE RETURN
+0x0e	0x000e	#SHIFT OUT
+0x0f	0x000f	#SHIFT IN
+0x10	0x0010	#DATA LINK ESCAPE
+0x11	0x0011	#DEVICE CONTROL ONE
+0x12	0x0012	#DEVICE CONTROL TWO
+0x13	0x0013	#DEVICE CONTROL THREE
+0x14	0x0014	#DEVICE CONTROL FOUR
+0x15	0x0015	#NEGATIVE ACKNOWLEDGE
+0x16	0x0016	#SYNCHRONOUS IDLE
+0x17	0x0017	#END OF TRANSMISSION BLOCK
+0x18	0x0018	#CANCEL
+0x19	0x0019	#END OF MEDIUM
+0x1a	0x001a	#SUBSTITUTE
+0x1b	0x001b	#ESCAPE
+0x1c	0x001c	#FILE SEPARATOR
+0x1d	0x001d	#GROUP SEPARATOR
+0x1e	0x001e	#RECORD SEPARATOR
+0x1f	0x001f	#UNIT SEPARATOR
+0x20	0x0020	#SPACE
+0x21	0x0021	#EXCLAMATION MARK
+0x22	0x0022	#QUOTATION MARK
+0x23	0x0023	#NUMBER SIGN
+0x24	0x0024	#DOLLAR SIGN
+0x25	0x066a	#ARABIC PERCENT SIGN
+0x26	0x0026	#AMPERSAND
+0x27	0x0027	#APOSTROPHE
+0x28	0x0028	#LEFT PARENTHESIS
+0x29	0x0029	#RIGHT PARENTHESIS
+0x2a	0x002a	#ASTERISK
+0x2b	0x002b	#PLUS SIGN
+0x2c	0x002c	#COMMA
+0x2d	0x002d	#HYPHEN-MINUS
+0x2e	0x002e	#FULL STOP
+0x2f	0x002f	#SOLIDUS
+0x30	0x0030	#DIGIT ZERO
+0x31	0x0031	#DIGIT ONE
+0x32	0x0032	#DIGIT TWO
+0x33	0x0033	#DIGIT THREE
+0x34	0x0034	#DIGIT FOUR
+0x35	0x0035	#DIGIT FIVE
+0x36	0x0036	#DIGIT SIX
+0x37	0x0037	#DIGIT SEVEN
+0x38	0x0038	#DIGIT EIGHT
+0x39	0x0039	#DIGIT NINE
+0x3a	0x003a	#COLON
+0x3b	0x003b	#SEMICOLON
+0x3c	0x003c	#LESS-THAN SIGN
+0x3d	0x003d	#EQUALS SIGN
+0x3e	0x003e	#GREATER-THAN SIGN
+0x3f	0x003f	#QUESTION MARK
+0x40	0x0040	#COMMERCIAL AT
+0x41	0x0041	#LATIN CAPITAL LETTER A
+0x42	0x0042	#LATIN CAPITAL LETTER B
+0x43	0x0043	#LATIN CAPITAL LETTER C
+0x44	0x0044	#LATIN CAPITAL LETTER D
+0x45	0x0045	#LATIN CAPITAL LETTER E
+0x46	0x0046	#LATIN CAPITAL LETTER F
+0x47	0x0047	#LATIN CAPITAL LETTER G
+0x48	0x0048	#LATIN CAPITAL LETTER H
+0x49	0x0049	#LATIN CAPITAL LETTER I
+0x4a	0x004a	#LATIN CAPITAL LETTER J
+0x4b	0x004b	#LATIN CAPITAL LETTER K
+0x4c	0x004c	#LATIN CAPITAL LETTER L
+0x4d	0x004d	#LATIN CAPITAL LETTER M
+0x4e	0x004e	#LATIN CAPITAL LETTER N
+0x4f	0x004f	#LATIN CAPITAL LETTER O
+0x50	0x0050	#LATIN CAPITAL LETTER P
+0x51	0x0051	#LATIN CAPITAL LETTER Q
+0x52	0x0052	#LATIN CAPITAL LETTER R
+0x53	0x0053	#LATIN CAPITAL LETTER S
+0x54	0x0054	#LATIN CAPITAL LETTER T
+0x55	0x0055	#LATIN CAPITAL LETTER U
+0x56	0x0056	#LATIN CAPITAL LETTER V
+0x57	0x0057	#LATIN CAPITAL LETTER W
+0x58	0x0058	#LATIN CAPITAL LETTER X
+0x59	0x0059	#LATIN CAPITAL LETTER Y
+0x5a	0x005a	#LATIN CAPITAL LETTER Z
+0x5b	0x005b	#LEFT SQUARE BRACKET
+0x5c	0x005c	#REVERSE SOLIDUS
+0x5d	0x005d	#RIGHT SQUARE BRACKET
+0x5e	0x005e	#CIRCUMFLEX ACCENT
+0x5f	0x005f	#LOW LINE
+0x60	0x0060	#GRAVE ACCENT
+0x61	0x0061	#LATIN SMALL LETTER A
+0x62	0x0062	#LATIN SMALL LETTER B
+0x63	0x0063	#LATIN SMALL LETTER C
+0x64	0x0064	#LATIN SMALL LETTER D
+0x65	0x0065	#LATIN SMALL LETTER E
+0x66	0x0066	#LATIN SMALL LETTER F
+0x67	0x0067	#LATIN SMALL LETTER G
+0x68	0x0068	#LATIN SMALL LETTER H
+0x69	0x0069	#LATIN SMALL LETTER I
+0x6a	0x006a	#LATIN SMALL LETTER J
+0x6b	0x006b	#LATIN SMALL LETTER K
+0x6c	0x006c	#LATIN SMALL LETTER L
+0x6d	0x006d	#LATIN SMALL LETTER M
+0x6e	0x006e	#LATIN SMALL LETTER N
+0x6f	0x006f	#LATIN SMALL LETTER O
+0x70	0x0070	#LATIN SMALL LETTER P
+0x71	0x0071	#LATIN SMALL LETTER Q
+0x72	0x0072	#LATIN SMALL LETTER R
+0x73	0x0073	#LATIN SMALL LETTER S
+0x74	0x0074	#LATIN SMALL LETTER T
+0x75	0x0075	#LATIN SMALL LETTER U
+0x76	0x0076	#LATIN SMALL LETTER V
+0x77	0x0077	#LATIN SMALL LETTER W
+0x78	0x0078	#LATIN SMALL LETTER X
+0x79	0x0079	#LATIN SMALL LETTER Y
+0x7a	0x007a	#LATIN SMALL LETTER Z
+0x7b	0x007b	#LEFT CURLY BRACKET
+0x7c	0x007c	#VERTICAL LINE
+0x7d	0x007d	#RIGHT CURLY BRACKET
+0x7e	0x007e	#TILDE
+0x7f	0x007f	#DELETE
+0x80	0x00b0	#DEGREE SIGN
+0x81	0x00b7	#MIDDLE DOT
+0x82	0x2219	#BULLET OPERATOR
+0x83	0x221a	#SQUARE ROOT
+0x84	0x2592	#MEDIUM SHADE
+0x85	0x2500	#FORMS LIGHT HORIZONTAL
+0x86	0x2502	#FORMS LIGHT VERTICAL
+0x87	0x253c	#FORMS LIGHT VERTICAL AND HORIZONTAL
+0x88	0x2524	#FORMS LIGHT VERTICAL AND LEFT
+0x89	0x252c	#FORMS LIGHT DOWN AND HORIZONTAL
+0x8a	0x251c	#FORMS LIGHT VERTICAL AND RIGHT
+0x8b	0x2534	#FORMS LIGHT UP AND HORIZONTAL
+0x8c	0x2510	#FORMS LIGHT DOWN AND LEFT
+0x8d	0x250c	#FORMS LIGHT DOWN AND RIGHT
+0x8e	0x2514	#FORMS LIGHT UP AND RIGHT
+0x8f	0x2518	#FORMS LIGHT UP AND LEFT
+0x90	0x03b2	#GREEK SMALL BETA
+0x91	0x221e	#INFINITY
+0x92	0x03c6	#GREEK SMALL PHI
+0x93	0x00b1	#PLUS-OR-MINUS SIGN
+0x94	0x00bd	#FRACTION 1/2
+0x95	0x00bc	#FRACTION 1/4
+0x96	0x2248	#ALMOST EQUAL TO
+0x97	0x00ab	#LEFT POINTING GUILLEMET
+0x98	0x00bb	#RIGHT POINTING GUILLEMET
+0x99	0xfef7	#ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE ISOLATED FORM
+0x9a	0xfef8	#ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE FINAL FORM
+0x9b		#UNDEFINED
+0x9c		#UNDEFINED
+0x9d	0xfefb	#ARABIC LIGATURE LAM WITH ALEF ISOLATED FORM
+0x9e	0xfefc	#ARABIC LIGATURE LAM WITH ALEF FINAL FORM
+0x9f		#UNDEFINED
+0xa0	0x00a0	#NON-BREAKING SPACE
+0xa1	0x00ad	#SOFT HYPHEN
+0xa2	0xfe82	#ARABIC LETTER ALEF WITH MADDA ABOVE FINAL FORM
+0xa3	0x00a3	#POUND SIGN
+0xa4	0x00a4	#CURRENCY SIGN
+0xa5	0xfe84	#ARABIC LETTER ALEF WITH HAMZA ABOVE FINAL FORM
+0xa6		#UNDEFINED
+0xa7		#UNDEFINED
+0xa8	0xfe8e	#ARABIC LETTER ALEF FINAL FORM
+0xa9	0xfe8f	#ARABIC LETTER BEH ISOLATED FORM
+0xaa	0xfe95	#ARABIC LETTER TEH ISOLATED FORM
+0xab	0xfe99	#ARABIC LETTER THEH ISOLATED FORM
+0xac	0x060c	#ARABIC COMMA
+0xad	0xfe9d	#ARABIC LETTER JEEM ISOLATED FORM
+0xae	0xfea1	#ARABIC LETTER HAH ISOLATED FORM
+0xaf	0xfea5	#ARABIC LETTER KHAH ISOLATED FORM
+0xb0	0x0660	#ARABIC-INDIC DIGIT ZERO
+0xb1	0x0661	#ARABIC-INDIC DIGIT ONE
+0xb2	0x0662	#ARABIC-INDIC DIGIT TWO
+0xb3	0x0663	#ARABIC-INDIC DIGIT THREE
+0xb4	0x0664	#ARABIC-INDIC DIGIT FOUR
+0xb5	0x0665	#ARABIC-INDIC DIGIT FIVE
+0xb6	0x0666	#ARABIC-INDIC DIGIT SIX
+0xb7	0x0667	#ARABIC-INDIC DIGIT SEVEN
+0xb8	0x0668	#ARABIC-INDIC DIGIT EIGHT
+0xb9	0x0669	#ARABIC-INDIC DIGIT NINE
+0xba	0xfed1	#ARABIC LETTER FEH ISOLATED FORM
+0xbb	0x061b	#ARABIC SEMICOLON
+0xbc	0xfeb1	#ARABIC LETTER SEEN ISOLATED FORM
+0xbd	0xfeb5	#ARABIC LETTER SHEEN ISOLATED FORM
+0xbe	0xfeb9	#ARABIC LETTER SAD ISOLATED FORM
+0xbf	0x061f	#ARABIC QUESTION MARK
+0xc0	0x00a2	#CENT SIGN
+0xc1	0xfe80	#ARABIC LETTER HAMZA ISOLATED FORM
+0xc2	0xfe81	#ARABIC LETTER ALEF WITH MADDA ABOVE ISOLATED FORM
+0xc3	0xfe83	#ARABIC LETTER ALEF WITH HAMZA ABOVE ISOLATED FORM
+0xc4	0xfe85	#ARABIC LETTER WAW WITH HAMZA ABOVE ISOLATED FORM
+0xc5	0xfeca	#ARABIC LETTER AIN FINAL FORM
+0xc6	0xfe8b	#ARABIC LETTER YEH WITH HAMZA ABOVE INITIAL FORM
+0xc7	0xfe8d	#ARABIC LETTER ALEF ISOLATED FORM
+0xc8	0xfe91	#ARABIC LETTER BEH INITIAL FORM
+0xc9	0xfe93	#ARABIC LETTER TEH MARBUTA ISOLATED FORM
+0xca	0xfe97	#ARABIC LETTER TEH INITIAL FORM
+0xcb	0xfe9b	#ARABIC LETTER THEH INITIAL FORM
+0xcc	0xfe9f	#ARABIC LETTER JEEM INITIAL FORM
+0xcd	0xfea3	#ARABIC LETTER HAH INITIAL FORM
+0xce	0xfea7	#ARABIC LETTER KHAH INITIAL FORM
+0xcf	0xfea9	#ARABIC LETTER DAL ISOLATED FORM
+0xd0	0xfeab	#ARABIC LETTER THAL ISOLATED FORM
+0xd1	0xfead	#ARABIC LETTER REH ISOLATED FORM
+0xd2	0xfeaf	#ARABIC LETTER ZAIN ISOLATED FORM
+0xd3	0xfeb3	#ARABIC LETTER SEEN INITIAL FORM
+0xd4	0xfeb7	#ARABIC LETTER SHEEN INITIAL FORM
+0xd5	0xfebb	#ARABIC LETTER SAD INITIAL FORM
+0xd6	0xfebf	#ARABIC LETTER DAD INITIAL FORM
+0xd7	0xfec1	#ARABIC LETTER TAH ISOLATED FORM
+0xd8	0xfec5	#ARABIC LETTER ZAH ISOLATED FORM
+0xd9	0xfecb	#ARABIC LETTER AIN INITIAL FORM
+0xda	0xfecf	#ARABIC LETTER GHAIN INITIAL FORM
+0xdb	0x00a6	#BROKEN VERTICAL BAR
+0xdc	0x00ac	#NOT SIGN
+0xdd	0x00f7	#DIVISION SIGN
+0xde	0x00d7	#MULTIPLICATION SIGN
+0xdf	0xfec9	#ARABIC LETTER AIN ISOLATED FORM
+0xe0	0x0640	#ARABIC TATWEEL
+0xe1	0xfed3	#ARABIC LETTER FEH INITIAL FORM
+0xe2	0xfed7	#ARABIC LETTER QAF INITIAL FORM
+0xe3	0xfedb	#ARABIC LETTER KAF INITIAL FORM
+0xe4	0xfedf	#ARABIC LETTER LAM INITIAL FORM
+0xe5	0xfee3	#ARABIC LETTER MEEM INITIAL FORM
+0xe6	0xfee7	#ARABIC LETTER NOON INITIAL FORM
+0xe7	0xfeeb	#ARABIC LETTER HEH INITIAL FORM
+0xe8	0xfeed	#ARABIC LETTER WAW ISOLATED FORM
+0xe9	0xfeef	#ARABIC LETTER ALEF MAKSURA ISOLATED FORM
+0xea	0xfef3	#ARABIC LETTER YEH INITIAL FORM
+0xeb	0xfebd	#ARABIC LETTER DAD ISOLATED FORM
+0xec	0xfecc	#ARABIC LETTER AIN MEDIAL FORM
+0xed	0xfece	#ARABIC LETTER GHAIN FINAL FORM
+0xee	0xfecd	#ARABIC LETTER GHAIN ISOLATED FORM
+0xef	0xfee1	#ARABIC LETTER MEEM ISOLATED FORM
+0xf0	0xfe7d	#ARABIC SHADDA MEDIAL FORM
+0xf1	0x0651	#ARABIC SHADDAH
+0xf2	0xfee5	#ARABIC LETTER NOON ISOLATED FORM
+0xf3	0xfee9	#ARABIC LETTER HEH ISOLATED FORM
+0xf4	0xfeec	#ARABIC LETTER HEH MEDIAL FORM
+0xf5	0xfef0	#ARABIC LETTER ALEF MAKSURA FINAL FORM
+0xf6	0xfef2	#ARABIC LETTER YEH FINAL FORM
+0xf7	0xfed0	#ARABIC LETTER GHAIN MEDIAL FORM
+0xf8	0xfed5	#ARABIC LETTER QAF ISOLATED FORM
+0xf9	0xfef5	#ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE ISOLATED FORM
+0xfa	0xfef6	#ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE FINAL FORM
+0xfb	0xfedd	#ARABIC LETTER LAM ISOLATED FORM
+0xfc	0xfed9	#ARABIC LETTER KAF ISOLATED FORM
+0xfd	0xfef1	#ARABIC LETTER YEH ISOLATED FORM
+0xfe	0x25a0	#BLACK SQUARE
+0xff		#UNDEFINED
+
diff --git a/lib/ucmaps/cp865.txt b/lib/ucmaps/cp865.txt
new file mode 100644
index 000000000..67705f46a
--- /dev/null
+++ b/lib/ucmaps/cp865.txt
@@ -0,0 +1,274 @@
+#
+#    Name:     cp865_DOSNordic to Unicode table
+#    Unicode version: 2.0
+#    Table version: 2.00
+#    Table format:  Format A
+#    Date:          04/24/96
+#    Authors:       Lori Brownell <loribr@microsoft.com>
+#                   K.D. Chang    <a-kchang@microsoft.com>
+#    General notes: none
+#
+#    Format: Three tab-separated columns
+#        Column #1 is the cp865_DOSNordic code (in hex)
+#        Column #2 is the Unicode (in hex as 0xXXXX)
+#        Column #3 is the Unicode name (follows a comment sign, '#')
+#
+#    The entries are in cp865_DOSNordic order
+#
+0x00	0x0000	#NULL
+0x01	0x0001	#START OF HEADING
+0x02	0x0002	#START OF TEXT
+0x03	0x0003	#END OF TEXT
+0x04	0x0004	#END OF TRANSMISSION
+0x05	0x0005	#ENQUIRY
+0x06	0x0006	#ACKNOWLEDGE
+0x07	0x0007	#BELL
+0x08	0x0008	#BACKSPACE
+0x09	0x0009	#HORIZONTAL TABULATION
+0x0a	0x000a	#LINE FEED
+0x0b	0x000b	#VERTICAL TABULATION
+0x0c	0x000c	#FORM FEED
+0x0d	0x000d	#CARRIAGE RETURN
+0x0e	0x000e	#SHIFT OUT
+0x0f	0x000f	#SHIFT IN
+0x10	0x0010	#DATA LINK ESCAPE
+0x11	0x0011	#DEVICE CONTROL ONE
+0x12	0x0012	#DEVICE CONTROL TWO
+0x13	0x0013	#DEVICE CONTROL THREE
+0x14	0x0014	#DEVICE CONTROL FOUR
+0x15	0x0015	#NEGATIVE ACKNOWLEDGE
+0x16	0x0016	#SYNCHRONOUS IDLE
+0x17	0x0017	#END OF TRANSMISSION BLOCK
+0x18	0x0018	#CANCEL
+0x19	0x0019	#END OF MEDIUM
+0x1a	0x001a	#SUBSTITUTE
+0x1b	0x001b	#ESCAPE
+0x1c	0x001c	#FILE SEPARATOR
+0x1d	0x001d	#GROUP SEPARATOR
+0x1e	0x001e	#RECORD SEPARATOR
+0x1f	0x001f	#UNIT SEPARATOR
+0x20	0x0020	#SPACE
+0x21	0x0021	#EXCLAMATION MARK
+0x22	0x0022	#QUOTATION MARK
+0x23	0x0023	#NUMBER SIGN
+0x24	0x0024	#DOLLAR SIGN
+0x25	0x0025	#PERCENT SIGN
+0x26	0x0026	#AMPERSAND
+0x27	0x0027	#APOSTROPHE
+0x28	0x0028	#LEFT PARENTHESIS
+0x29	0x0029	#RIGHT PARENTHESIS
+0x2a	0x002a	#ASTERISK
+0x2b	0x002b	#PLUS SIGN
+0x2c	0x002c	#COMMA
+0x2d	0x002d	#HYPHEN-MINUS
+0x2e	0x002e	#FULL STOP
+0x2f	0x002f	#SOLIDUS
+0x30	0x0030	#DIGIT ZERO
+0x31	0x0031	#DIGIT ONE
+0x32	0x0032	#DIGIT TWO
+0x33	0x0033	#DIGIT THREE
+0x34	0x0034	#DIGIT FOUR
+0x35	0x0035	#DIGIT FIVE
+0x36	0x0036	#DIGIT SIX
+0x37	0x0037	#DIGIT SEVEN
+0x38	0x0038	#DIGIT EIGHT
+0x39	0x0039	#DIGIT NINE
+0x3a	0x003a	#COLON
+0x3b	0x003b	#SEMICOLON
+0x3c	0x003c	#LESS-THAN SIGN
+0x3d	0x003d	#EQUALS SIGN
+0x3e	0x003e	#GREATER-THAN SIGN
+0x3f	0x003f	#QUESTION MARK
+0x40	0x0040	#COMMERCIAL AT
+0x41	0x0041	#LATIN CAPITAL LETTER A
+0x42	0x0042	#LATIN CAPITAL LETTER B
+0x43	0x0043	#LATIN CAPITAL LETTER C
+0x44	0x0044	#LATIN CAPITAL LETTER D
+0x45	0x0045	#LATIN CAPITAL LETTER E
+0x46	0x0046	#LATIN CAPITAL LETTER F
+0x47	0x0047	#LATIN CAPITAL LETTER G
+0x48	0x0048	#LATIN CAPITAL LETTER H
+0x49	0x0049	#LATIN CAPITAL LETTER I
+0x4a	0x004a	#LATIN CAPITAL LETTER J
+0x4b	0x004b	#LATIN CAPITAL LETTER K
+0x4c	0x004c	#LATIN CAPITAL LETTER L
+0x4d	0x004d	#LATIN CAPITAL LETTER M
+0x4e	0x004e	#LATIN CAPITAL LETTER N
+0x4f	0x004f	#LATIN CAPITAL LETTER O
+0x50	0x0050	#LATIN CAPITAL LETTER P
+0x51	0x0051	#LATIN CAPITAL LETTER Q
+0x52	0x0052	#LATIN CAPITAL LETTER R
+0x53	0x0053	#LATIN CAPITAL LETTER S
+0x54	0x0054	#LATIN CAPITAL LETTER T
+0x55	0x0055	#LATIN CAPITAL LETTER U
+0x56	0x0056	#LATIN CAPITAL LETTER V
+0x57	0x0057	#LATIN CAPITAL LETTER W
+0x58	0x0058	#LATIN CAPITAL LETTER X
+0x59	0x0059	#LATIN CAPITAL LETTER Y
+0x5a	0x005a	#LATIN CAPITAL LETTER Z
+0x5b	0x005b	#LEFT SQUARE BRACKET
+0x5c	0x005c	#REVERSE SOLIDUS
+0x5d	0x005d	#RIGHT SQUARE BRACKET
+0x5e	0x005e	#CIRCUMFLEX ACCENT
+0x5f	0x005f	#LOW LINE
+0x60	0x0060	#GRAVE ACCENT
+0x61	0x0061	#LATIN SMALL LETTER A
+0x62	0x0062	#LATIN SMALL LETTER B
+0x63	0x0063	#LATIN SMALL LETTER C
+0x64	0x0064	#LATIN SMALL LETTER D
+0x65	0x0065	#LATIN SMALL LETTER E
+0x66	0x0066	#LATIN SMALL LETTER F
+0x67	0x0067	#LATIN SMALL LETTER G
+0x68	0x0068	#LATIN SMALL LETTER H
+0x69	0x0069	#LATIN SMALL LETTER I
+0x6a	0x006a	#LATIN SMALL LETTER J
+0x6b	0x006b	#LATIN SMALL LETTER K
+0x6c	0x006c	#LATIN SMALL LETTER L
+0x6d	0x006d	#LATIN SMALL LETTER M
+0x6e	0x006e	#LATIN SMALL LETTER N
+0x6f	0x006f	#LATIN SMALL LETTER O
+0x70	0x0070	#LATIN SMALL LETTER P
+0x71	0x0071	#LATIN SMALL LETTER Q
+0x72	0x0072	#LATIN SMALL LETTER R
+0x73	0x0073	#LATIN SMALL LETTER S
+0x74	0x0074	#LATIN SMALL LETTER T
+0x75	0x0075	#LATIN SMALL LETTER U
+0x76	0x0076	#LATIN SMALL LETTER V
+0x77	0x0077	#LATIN SMALL LETTER W
+0x78	0x0078	#LATIN SMALL LETTER X
+0x79	0x0079	#LATIN SMALL LETTER Y
+0x7a	0x007a	#LATIN SMALL LETTER Z
+0x7b	0x007b	#LEFT CURLY BRACKET
+0x7c	0x007c	#VERTICAL LINE
+0x7d	0x007d	#RIGHT CURLY BRACKET
+0x7e	0x007e	#TILDE
+0x7f	0x007f	#DELETE
+0x80	0x00c7	#LATIN CAPITAL LETTER C WITH CEDILLA
+0x81	0x00fc	#LATIN SMALL LETTER U WITH DIAERESIS
+0x82	0x00e9	#LATIN SMALL LETTER E WITH ACUTE
+0x83	0x00e2	#LATIN SMALL LETTER A WITH CIRCUMFLEX
+0x84	0x00e4	#LATIN SMALL LETTER A WITH DIAERESIS
+0x85	0x00e0	#LATIN SMALL LETTER A WITH GRAVE
+0x86	0x00e5	#LATIN SMALL LETTER A WITH RING ABOVE
+0x87	0x00e7	#LATIN SMALL LETTER C WITH CEDILLA
+0x88	0x00ea	#LATIN SMALL LETTER E WITH CIRCUMFLEX
+0x89	0x00eb	#LATIN SMALL LETTER E WITH DIAERESIS
+0x8a	0x00e8	#LATIN SMALL LETTER E WITH GRAVE
+0x8b	0x00ef	#LATIN SMALL LETTER I WITH DIAERESIS
+0x8c	0x00ee	#LATIN SMALL LETTER I WITH CIRCUMFLEX
+0x8d	0x00ec	#LATIN SMALL LETTER I WITH GRAVE
+0x8e	0x00c4	#LATIN CAPITAL LETTER A WITH DIAERESIS
+0x8f	0x00c5	#LATIN CAPITAL LETTER A WITH RING ABOVE
+0x90	0x00c9	#LATIN CAPITAL LETTER E WITH ACUTE
+0x91	0x00e6	#LATIN SMALL LIGATURE AE
+0x92	0x00c6	#LATIN CAPITAL LIGATURE AE
+0x93	0x00f4	#LATIN SMALL LETTER O WITH CIRCUMFLEX
+0x94	0x00f6	#LATIN SMALL LETTER O WITH DIAERESIS
+0x95	0x00f2	#LATIN SMALL LETTER O WITH GRAVE
+0x96	0x00fb	#LATIN SMALL LETTER U WITH CIRCUMFLEX
+0x97	0x00f9	#LATIN SMALL LETTER U WITH GRAVE
+0x98	0x00ff	#LATIN SMALL LETTER Y WITH DIAERESIS
+0x99	0x00d6	#LATIN CAPITAL LETTER O WITH DIAERESIS
+0x9a	0x00dc	#LATIN CAPITAL LETTER U WITH DIAERESIS
+0x9b	0x00f8	#LATIN SMALL LETTER O WITH STROKE
+0x9c	0x00a3	#POUND SIGN
+0x9d	0x00d8	#LATIN CAPITAL LETTER O WITH STROKE
+0x9e	0x20a7	#PESETA SIGN
+0x9f	0x0192	#LATIN SMALL LETTER F WITH HOOK
+0xa0	0x00e1	#LATIN SMALL LETTER A WITH ACUTE
+0xa1	0x00ed	#LATIN SMALL LETTER I WITH ACUTE
+0xa2	0x00f3	#LATIN SMALL LETTER O WITH ACUTE
+0xa3	0x00fa	#LATIN SMALL LETTER U WITH ACUTE
+0xa4	0x00f1	#LATIN SMALL LETTER N WITH TILDE
+0xa5	0x00d1	#LATIN CAPITAL LETTER N WITH TILDE
+0xa6	0x00aa	#FEMININE ORDINAL INDICATOR
+0xa7	0x00ba	#MASCULINE ORDINAL INDICATOR
+0xa8	0x00bf	#INVERTED QUESTION MARK
+0xa9	0x2310	#REVERSED NOT SIGN
+0xaa	0x00ac	#NOT SIGN
+0xab	0x00bd	#VULGAR FRACTION ONE HALF
+0xac	0x00bc	#VULGAR FRACTION ONE QUARTER
+0xad	0x00a1	#INVERTED EXCLAMATION MARK
+0xae	0x00ab	#LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xaf	0x00a4	#CURRENCY SIGN
+0xb0	0x2591	#LIGHT SHADE
+0xb1	0x2592	#MEDIUM SHADE
+0xb2	0x2593	#DARK SHADE
+0xb3	0x2502	#BOX DRAWINGS LIGHT VERTICAL
+0xb4	0x2524	#BOX DRAWINGS LIGHT VERTICAL AND LEFT
+0xb5	0x2561	#BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE
+0xb6	0x2562	#BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE
+0xb7	0x2556	#BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE
+0xb8	0x2555	#BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE
+0xb9	0x2563	#BOX DRAWINGS DOUBLE VERTICAL AND LEFT
+0xba	0x2551	#BOX DRAWINGS DOUBLE VERTICAL
+0xbb	0x2557	#BOX DRAWINGS DOUBLE DOWN AND LEFT
+0xbc	0x255d	#BOX DRAWINGS DOUBLE UP AND LEFT
+0xbd	0x255c	#BOX DRAWINGS UP DOUBLE AND LEFT SINGLE
+0xbe	0x255b	#BOX DRAWINGS UP SINGLE AND LEFT DOUBLE
+0xbf	0x2510	#BOX DRAWINGS LIGHT DOWN AND LEFT
+0xc0	0x2514	#BOX DRAWINGS LIGHT UP AND RIGHT
+0xc1	0x2534	#BOX DRAWINGS LIGHT UP AND HORIZONTAL
+0xc2	0x252c	#BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
+0xc3	0x251c	#BOX DRAWINGS LIGHT VERTICAL AND RIGHT
+0xc4	0x2500	#BOX DRAWINGS LIGHT HORIZONTAL
+0xc5	0x253c	#BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
+0xc6	0x255e	#BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE
+0xc7	0x255f	#BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE
+0xc8	0x255a	#BOX DRAWINGS DOUBLE UP AND RIGHT
+0xc9	0x2554	#BOX DRAWINGS DOUBLE DOWN AND RIGHT
+0xca	0x2569	#BOX DRAWINGS DOUBLE UP AND HORIZONTAL
+0xcb	0x2566	#BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
+0xcc	0x2560	#BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
+0xcd	0x2550	#BOX DRAWINGS DOUBLE HORIZONTAL
+0xce	0x256c	#BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
+0xcf	0x2567	#BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE
+0xd0	0x2568	#BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE
+0xd1	0x2564	#BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE
+0xd2	0x2565	#BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE
+0xd3	0x2559	#BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE
+0xd4	0x2558	#BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE
+0xd5	0x2552	#BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE
+0xd6	0x2553	#BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE
+0xd7	0x256b	#BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE
+0xd8	0x256a	#BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE
+0xd9	0x2518	#BOX DRAWINGS LIGHT UP AND LEFT
+0xda	0x250c	#BOX DRAWINGS LIGHT DOWN AND RIGHT
+0xdb	0x2588	#FULL BLOCK
+0xdc	0x2584	#LOWER HALF BLOCK
+0xdd	0x258c	#LEFT HALF BLOCK
+0xde	0x2590	#RIGHT HALF BLOCK
+0xdf	0x2580	#UPPER HALF BLOCK
+0xe0	0x03b1	#GREEK SMALL LETTER ALPHA
+0xe1	0x00df	#LATIN SMALL LETTER SHARP S
+0xe2	0x0393	#GREEK CAPITAL LETTER GAMMA
+0xe3	0x03c0	#GREEK SMALL LETTER PI
+0xe4	0x03a3	#GREEK CAPITAL LETTER SIGMA
+0xe5	0x03c3	#GREEK SMALL LETTER SIGMA
+0xe6	0x00b5	#MICRO SIGN
+0xe7	0x03c4	#GREEK SMALL LETTER TAU
+0xe8	0x03a6	#GREEK CAPITAL LETTER PHI
+0xe9	0x0398	#GREEK CAPITAL LETTER THETA
+0xea	0x03a9	#GREEK CAPITAL LETTER OMEGA
+0xeb	0x03b4	#GREEK SMALL LETTER DELTA
+0xec	0x221e	#INFINITY
+0xed	0x03c6	#GREEK SMALL LETTER PHI
+0xee	0x03b5	#GREEK SMALL LETTER EPSILON
+0xef	0x2229	#INTERSECTION
+0xf0	0x2261	#IDENTICAL TO
+0xf1	0x00b1	#PLUS-MINUS SIGN
+0xf2	0x2265	#GREATER-THAN OR EQUAL TO
+0xf3	0x2264	#LESS-THAN OR EQUAL TO
+0xf4	0x2320	#TOP HALF INTEGRAL
+0xf5	0x2321	#BOTTOM HALF INTEGRAL
+0xf6	0x00f7	#DIVISION SIGN
+0xf7	0x2248	#ALMOST EQUAL TO
+0xf8	0x00b0	#DEGREE SIGN
+0xf9	0x2219	#BULLET OPERATOR
+0xfa	0x00b7	#MIDDLE DOT
+0xfb	0x221a	#SQUARE ROOT
+0xfc	0x207f	#SUPERSCRIPT LATIN SMALL LETTER N
+0xfd	0x00b2	#SUPERSCRIPT TWO
+0xfe	0x25a0	#BLACK SQUARE
+0xff	0x00a0	#NO-BREAK SPACE
+
diff --git a/lib/ucmaps/cp866.txt b/lib/ucmaps/cp866.txt
new file mode 100644
index 000000000..880fb70e3
--- /dev/null
+++ b/lib/ucmaps/cp866.txt
@@ -0,0 +1,274 @@
+#
+#    Name:     cp866_DOSCyrillicRussian to Unicode table
+#    Unicode version: 2.0
+#    Table version: 2.00
+#    Table format:  Format A
+#    Date:          04/24/96
+#    Authors:       Lori Brownell <loribr@microsoft.com>
+#                   K.D. Chang    <a-kchang@microsoft.com>
+#    General notes: none
+#
+#    Format: Three tab-separated columns
+#        Column #1 is the cp866_DOSCyrillicRussian code (in hex)
+#        Column #2 is the Unicode (in hex as 0xXXXX)
+#        Column #3 is the Unicode name (follows a comment sign, '#')
+#
+#    The entries are in cp866_DOSCyrillicRussian order
+#
+0x00	0x0000	#NULL
+0x01	0x0001	#START OF HEADING
+0x02	0x0002	#START OF TEXT
+0x03	0x0003	#END OF TEXT
+0x04	0x0004	#END OF TRANSMISSION
+0x05	0x0005	#ENQUIRY
+0x06	0x0006	#ACKNOWLEDGE
+0x07	0x0007	#BELL
+0x08	0x0008	#BACKSPACE
+0x09	0x0009	#HORIZONTAL TABULATION
+0x0a	0x000a	#LINE FEED
+0x0b	0x000b	#VERTICAL TABULATION
+0x0c	0x000c	#FORM FEED
+0x0d	0x000d	#CARRIAGE RETURN
+0x0e	0x000e	#SHIFT OUT
+0x0f	0x000f	#SHIFT IN
+0x10	0x0010	#DATA LINK ESCAPE
+0x11	0x0011	#DEVICE CONTROL ONE
+0x12	0x0012	#DEVICE CONTROL TWO
+0x13	0x0013	#DEVICE CONTROL THREE
+0x14	0x0014	#DEVICE CONTROL FOUR
+0x15	0x0015	#NEGATIVE ACKNOWLEDGE
+0x16	0x0016	#SYNCHRONOUS IDLE
+0x17	0x0017	#END OF TRANSMISSION BLOCK
+0x18	0x0018	#CANCEL
+0x19	0x0019	#END OF MEDIUM
+0x1a	0x001a	#SUBSTITUTE
+0x1b	0x001b	#ESCAPE
+0x1c	0x001c	#FILE SEPARATOR
+0x1d	0x001d	#GROUP SEPARATOR
+0x1e	0x001e	#RECORD SEPARATOR
+0x1f	0x001f	#UNIT SEPARATOR
+0x20	0x0020	#SPACE
+0x21	0x0021	#EXCLAMATION MARK
+0x22	0x0022	#QUOTATION MARK
+0x23	0x0023	#NUMBER SIGN
+0x24	0x0024	#DOLLAR SIGN
+0x25	0x0025	#PERCENT SIGN
+0x26	0x0026	#AMPERSAND
+0x27	0x0027	#APOSTROPHE
+0x28	0x0028	#LEFT PARENTHESIS
+0x29	0x0029	#RIGHT PARENTHESIS
+0x2a	0x002a	#ASTERISK
+0x2b	0x002b	#PLUS SIGN
+0x2c	0x002c	#COMMA
+0x2d	0x002d	#HYPHEN-MINUS
+0x2e	0x002e	#FULL STOP
+0x2f	0x002f	#SOLIDUS
+0x30	0x0030	#DIGIT ZERO
+0x31	0x0031	#DIGIT ONE
+0x32	0x0032	#DIGIT TWO
+0x33	0x0033	#DIGIT THREE
+0x34	0x0034	#DIGIT FOUR
+0x35	0x0035	#DIGIT FIVE
+0x36	0x0036	#DIGIT SIX
+0x37	0x0037	#DIGIT SEVEN
+0x38	0x0038	#DIGIT EIGHT
+0x39	0x0039	#DIGIT NINE
+0x3a	0x003a	#COLON
+0x3b	0x003b	#SEMICOLON
+0x3c	0x003c	#LESS-THAN SIGN
+0x3d	0x003d	#EQUALS SIGN
+0x3e	0x003e	#GREATER-THAN SIGN
+0x3f	0x003f	#QUESTION MARK
+0x40	0x0040	#COMMERCIAL AT
+0x41	0x0041	#LATIN CAPITAL LETTER A
+0x42	0x0042	#LATIN CAPITAL LETTER B
+0x43	0x0043	#LATIN CAPITAL LETTER C
+0x44	0x0044	#LATIN CAPITAL LETTER D
+0x45	0x0045	#LATIN CAPITAL LETTER E
+0x46	0x0046	#LATIN CAPITAL LETTER F
+0x47	0x0047	#LATIN CAPITAL LETTER G
+0x48	0x0048	#LATIN CAPITAL LETTER H
+0x49	0x0049	#LATIN CAPITAL LETTER I
+0x4a	0x004a	#LATIN CAPITAL LETTER J
+0x4b	0x004b	#LATIN CAPITAL LETTER K
+0x4c	0x004c	#LATIN CAPITAL LETTER L
+0x4d	0x004d	#LATIN CAPITAL LETTER M
+0x4e	0x004e	#LATIN CAPITAL LETTER N
+0x4f	0x004f	#LATIN CAPITAL LETTER O
+0x50	0x0050	#LATIN CAPITAL LETTER P
+0x51	0x0051	#LATIN CAPITAL LETTER Q
+0x52	0x0052	#LATIN CAPITAL LETTER R
+0x53	0x0053	#LATIN CAPITAL LETTER S
+0x54	0x0054	#LATIN CAPITAL LETTER T
+0x55	0x0055	#LATIN CAPITAL LETTER U
+0x56	0x0056	#LATIN CAPITAL LETTER V
+0x57	0x0057	#LATIN CAPITAL LETTER W
+0x58	0x0058	#LATIN CAPITAL LETTER X
+0x59	0x0059	#LATIN CAPITAL LETTER Y
+0x5a	0x005a	#LATIN CAPITAL LETTER Z
+0x5b	0x005b	#LEFT SQUARE BRACKET
+0x5c	0x005c	#REVERSE SOLIDUS
+0x5d	0x005d	#RIGHT SQUARE BRACKET
+0x5e	0x005e	#CIRCUMFLEX ACCENT
+0x5f	0x005f	#LOW LINE
+0x60	0x0060	#GRAVE ACCENT
+0x61	0x0061	#LATIN SMALL LETTER A
+0x62	0x0062	#LATIN SMALL LETTER B
+0x63	0x0063	#LATIN SMALL LETTER C
+0x64	0x0064	#LATIN SMALL LETTER D
+0x65	0x0065	#LATIN SMALL LETTER E
+0x66	0x0066	#LATIN SMALL LETTER F
+0x67	0x0067	#LATIN SMALL LETTER G
+0x68	0x0068	#LATIN SMALL LETTER H
+0x69	0x0069	#LATIN SMALL LETTER I
+0x6a	0x006a	#LATIN SMALL LETTER J
+0x6b	0x006b	#LATIN SMALL LETTER K
+0x6c	0x006c	#LATIN SMALL LETTER L
+0x6d	0x006d	#LATIN SMALL LETTER M
+0x6e	0x006e	#LATIN SMALL LETTER N
+0x6f	0x006f	#LATIN SMALL LETTER O
+0x70	0x0070	#LATIN SMALL LETTER P
+0x71	0x0071	#LATIN SMALL LETTER Q
+0x72	0x0072	#LATIN SMALL LETTER R
+0x73	0x0073	#LATIN SMALL LETTER S
+0x74	0x0074	#LATIN SMALL LETTER T
+0x75	0x0075	#LATIN SMALL LETTER U
+0x76	0x0076	#LATIN SMALL LETTER V
+0x77	0x0077	#LATIN SMALL LETTER W
+0x78	0x0078	#LATIN SMALL LETTER X
+0x79	0x0079	#LATIN SMALL LETTER Y
+0x7a	0x007a	#LATIN SMALL LETTER Z
+0x7b	0x007b	#LEFT CURLY BRACKET
+0x7c	0x007c	#VERTICAL LINE
+0x7d	0x007d	#RIGHT CURLY BRACKET
+0x7e	0x007e	#TILDE
+0x7f	0x007f	#DELETE
+0x80	0x0410	#CYRILLIC CAPITAL LETTER A
+0x81	0x0411	#CYRILLIC CAPITAL LETTER BE
+0x82	0x0412	#CYRILLIC CAPITAL LETTER VE
+0x83	0x0413	#CYRILLIC CAPITAL LETTER GHE
+0x84	0x0414	#CYRILLIC CAPITAL LETTER DE
+0x85	0x0415	#CYRILLIC CAPITAL LETTER IE
+0x86	0x0416	#CYRILLIC CAPITAL LETTER ZHE
+0x87	0x0417	#CYRILLIC CAPITAL LETTER ZE
+0x88	0x0418	#CYRILLIC CAPITAL LETTER I
+0x89	0x0419	#CYRILLIC CAPITAL LETTER SHORT I
+0x8a	0x041a	#CYRILLIC CAPITAL LETTER KA
+0x8b	0x041b	#CYRILLIC CAPITAL LETTER EL
+0x8c	0x041c	#CYRILLIC CAPITAL LETTER EM
+0x8d	0x041d	#CYRILLIC CAPITAL LETTER EN
+0x8e	0x041e	#CYRILLIC CAPITAL LETTER O
+0x8f	0x041f	#CYRILLIC CAPITAL LETTER PE
+0x90	0x0420	#CYRILLIC CAPITAL LETTER ER
+0x91	0x0421	#CYRILLIC CAPITAL LETTER ES
+0x92	0x0422	#CYRILLIC CAPITAL LETTER TE
+0x93	0x0423	#CYRILLIC CAPITAL LETTER U
+0x94	0x0424	#CYRILLIC CAPITAL LETTER EF
+0x95	0x0425	#CYRILLIC CAPITAL LETTER HA
+0x96	0x0426	#CYRILLIC CAPITAL LETTER TSE
+0x97	0x0427	#CYRILLIC CAPITAL LETTER CHE
+0x98	0x0428	#CYRILLIC CAPITAL LETTER SHA
+0x99	0x0429	#CYRILLIC CAPITAL LETTER SHCHA
+0x9a	0x042a	#CYRILLIC CAPITAL LETTER HARD SIGN
+0x9b	0x042b	#CYRILLIC CAPITAL LETTER YERU
+0x9c	0x042c	#CYRILLIC CAPITAL LETTER SOFT SIGN
+0x9d	0x042d	#CYRILLIC CAPITAL LETTER E
+0x9e	0x042e	#CYRILLIC CAPITAL LETTER YU
+0x9f	0x042f	#CYRILLIC CAPITAL LETTER YA
+0xa0	0x0430	#CYRILLIC SMALL LETTER A
+0xa1	0x0431	#CYRILLIC SMALL LETTER BE
+0xa2	0x0432	#CYRILLIC SMALL LETTER VE
+0xa3	0x0433	#CYRILLIC SMALL LETTER GHE
+0xa4	0x0434	#CYRILLIC SMALL LETTER DE
+0xa5	0x0435	#CYRILLIC SMALL LETTER IE
+0xa6	0x0436	#CYRILLIC SMALL LETTER ZHE
+0xa7	0x0437	#CYRILLIC SMALL LETTER ZE
+0xa8	0x0438	#CYRILLIC SMALL LETTER I
+0xa9	0x0439	#CYRILLIC SMALL LETTER SHORT I
+0xaa	0x043a	#CYRILLIC SMALL LETTER KA
+0xab	0x043b	#CYRILLIC SMALL LETTER EL
+0xac	0x043c	#CYRILLIC SMALL LETTER EM
+0xad	0x043d	#CYRILLIC SMALL LETTER EN
+0xae	0x043e	#CYRILLIC SMALL LETTER O
+0xaf	0x043f	#CYRILLIC SMALL LETTER PE
+0xb0	0x2591	#LIGHT SHADE
+0xb1	0x2592	#MEDIUM SHADE
+0xb2	0x2593	#DARK SHADE
+0xb3	0x2502	#BOX DRAWINGS LIGHT VERTICAL
+0xb4	0x2524	#BOX DRAWINGS LIGHT VERTICAL AND LEFT
+0xb5	0x2561	#BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE
+0xb6	0x2562	#BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE
+0xb7	0x2556	#BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE
+0xb8	0x2555	#BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE
+0xb9	0x2563	#BOX DRAWINGS DOUBLE VERTICAL AND LEFT
+0xba	0x2551	#BOX DRAWINGS DOUBLE VERTICAL
+0xbb	0x2557	#BOX DRAWINGS DOUBLE DOWN AND LEFT
+0xbc	0x255d	#BOX DRAWINGS DOUBLE UP AND LEFT
+0xbd	0x255c	#BOX DRAWINGS UP DOUBLE AND LEFT SINGLE
+0xbe	0x255b	#BOX DRAWINGS UP SINGLE AND LEFT DOUBLE
+0xbf	0x2510	#BOX DRAWINGS LIGHT DOWN AND LEFT
+0xc0	0x2514	#BOX DRAWINGS LIGHT UP AND RIGHT
+0xc1	0x2534	#BOX DRAWINGS LIGHT UP AND HORIZONTAL
+0xc2	0x252c	#BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
+0xc3	0x251c	#BOX DRAWINGS LIGHT VERTICAL AND RIGHT
+0xc4	0x2500	#BOX DRAWINGS LIGHT HORIZONTAL
+0xc5	0x253c	#BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
+0xc6	0x255e	#BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE
+0xc7	0x255f	#BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE
+0xc8	0x255a	#BOX DRAWINGS DOUBLE UP AND RIGHT
+0xc9	0x2554	#BOX DRAWINGS DOUBLE DOWN AND RIGHT
+0xca	0x2569	#BOX DRAWINGS DOUBLE UP AND HORIZONTAL
+0xcb	0x2566	#BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
+0xcc	0x2560	#BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
+0xcd	0x2550	#BOX DRAWINGS DOUBLE HORIZONTAL
+0xce	0x256c	#BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
+0xcf	0x2567	#BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE
+0xd0	0x2568	#BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE
+0xd1	0x2564	#BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE
+0xd2	0x2565	#BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE
+0xd3	0x2559	#BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE
+0xd4	0x2558	#BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE
+0xd5	0x2552	#BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE
+0xd6	0x2553	#BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE
+0xd7	0x256b	#BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE
+0xd8	0x256a	#BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE
+0xd9	0x2518	#BOX DRAWINGS LIGHT UP AND LEFT
+0xda	0x250c	#BOX DRAWINGS LIGHT DOWN AND RIGHT
+0xdb	0x2588	#FULL BLOCK
+0xdc	0x2584	#LOWER HALF BLOCK
+0xdd	0x258c	#LEFT HALF BLOCK
+0xde	0x2590	#RIGHT HALF BLOCK
+0xdf	0x2580	#UPPER HALF BLOCK
+0xe0	0x0440	#CYRILLIC SMALL LETTER ER
+0xe1	0x0441	#CYRILLIC SMALL LETTER ES
+0xe2	0x0442	#CYRILLIC SMALL LETTER TE
+0xe3	0x0443	#CYRILLIC SMALL LETTER U
+0xe4	0x0444	#CYRILLIC SMALL LETTER EF
+0xe5	0x0445	#CYRILLIC SMALL LETTER HA
+0xe6	0x0446	#CYRILLIC SMALL LETTER TSE
+0xe7	0x0447	#CYRILLIC SMALL LETTER CHE
+0xe8	0x0448	#CYRILLIC SMALL LETTER SHA
+0xe9	0x0449	#CYRILLIC SMALL LETTER SHCHA
+0xea	0x044a	#CYRILLIC SMALL LETTER HARD SIGN
+0xeb	0x044b	#CYRILLIC SMALL LETTER YERU
+0xec	0x044c	#CYRILLIC SMALL LETTER SOFT SIGN
+0xed	0x044d	#CYRILLIC SMALL LETTER E
+0xee	0x044e	#CYRILLIC SMALL LETTER YU
+0xef	0x044f	#CYRILLIC SMALL LETTER YA
+0xf0	0x0401	#CYRILLIC CAPITAL LETTER IO
+0xf1	0x0451	#CYRILLIC SMALL LETTER IO
+0xf2	0x0404	#CYRILLIC CAPITAL LETTER UKRAINIAN IE
+0xf3	0x0454	#CYRILLIC SMALL LETTER UKRAINIAN IE
+0xf4	0x0407	#CYRILLIC CAPITAL LETTER YI
+0xf5	0x0457	#CYRILLIC SMALL LETTER YI
+0xf6	0x040e	#CYRILLIC CAPITAL LETTER SHORT U
+0xf7	0x045e	#CYRILLIC SMALL LETTER SHORT U
+0xf8	0x00b0	#DEGREE SIGN
+0xf9	0x2219	#BULLET OPERATOR
+0xfa	0x00b7	#MIDDLE DOT
+0xfb	0x221a	#SQUARE ROOT
+0xfc	0x2116	#NUMERO SIGN
+0xfd	0x00a4	#CURRENCY SIGN
+0xfe	0x25a0	#BLACK SQUARE
+0xff	0x00a0	#NO-BREAK SPACE
+
diff --git a/lib/ucmaps/cp869.txt b/lib/ucmaps/cp869.txt
new file mode 100644
index 000000000..4c77ffd6c
--- /dev/null
+++ b/lib/ucmaps/cp869.txt
@@ -0,0 +1,274 @@
+#
+#    Name:     cp869_DOSGreek2 to Unicode table
+#    Unicode version: 2.0
+#    Table version: 2.00
+#    Table format:  Format A
+#    Date:          04/24/96
+#    Authors:       Lori Brownell <loribr@microsoft.com>
+#                   K.D. Chang    <a-kchang@microsoft.com>
+#    General notes: none
+#
+#    Format: Three tab-separated columns
+#        Column #1 is the cp869_DOSGreek2 code (in hex)
+#        Column #2 is the Unicode (in hex as 0xXXXX)
+#        Column #3 is the Unicode name (follows a comment sign, '#')
+#
+#    The entries are in cp869_DOSGreek2 order
+#
+0x00	0x0000	#NULL
+0x01	0x0001	#START OF HEADING
+0x02	0x0002	#START OF TEXT
+0x03	0x0003	#END OF TEXT
+0x04	0x0004	#END OF TRANSMISSION
+0x05	0x0005	#ENQUIRY
+0x06	0x0006	#ACKNOWLEDGE
+0x07	0x0007	#BELL
+0x08	0x0008	#BACKSPACE
+0x09	0x0009	#HORIZONTAL TABULATION
+0x0a	0x000a	#LINE FEED
+0x0b	0x000b	#VERTICAL TABULATION
+0x0c	0x000c	#FORM FEED
+0x0d	0x000d	#CARRIAGE RETURN
+0x0e	0x000e	#SHIFT OUT
+0x0f	0x000f	#SHIFT IN
+0x10	0x0010	#DATA LINK ESCAPE
+0x11	0x0011	#DEVICE CONTROL ONE
+0x12	0x0012	#DEVICE CONTROL TWO
+0x13	0x0013	#DEVICE CONTROL THREE
+0x14	0x0014	#DEVICE CONTROL FOUR
+0x15	0x0015	#NEGATIVE ACKNOWLEDGE
+0x16	0x0016	#SYNCHRONOUS IDLE
+0x17	0x0017	#END OF TRANSMISSION BLOCK
+0x18	0x0018	#CANCEL
+0x19	0x0019	#END OF MEDIUM
+0x1a	0x001a	#SUBSTITUTE
+0x1b	0x001b	#ESCAPE
+0x1c	0x001c	#FILE SEPARATOR
+0x1d	0x001d	#GROUP SEPARATOR
+0x1e	0x001e	#RECORD SEPARATOR
+0x1f	0x001f	#UNIT SEPARATOR
+0x20	0x0020	#SPACE
+0x21	0x0021	#EXCLAMATION MARK
+0x22	0x0022	#QUOTATION MARK
+0x23	0x0023	#NUMBER SIGN
+0x24	0x0024	#DOLLAR SIGN
+0x25	0x0025	#PERCENT SIGN
+0x26	0x0026	#AMPERSAND
+0x27	0x0027	#APOSTROPHE
+0x28	0x0028	#LEFT PARENTHESIS
+0x29	0x0029	#RIGHT PARENTHESIS
+0x2a	0x002a	#ASTERISK
+0x2b	0x002b	#PLUS SIGN
+0x2c	0x002c	#COMMA
+0x2d	0x002d	#HYPHEN-MINUS
+0x2e	0x002e	#FULL STOP
+0x2f	0x002f	#SOLIDUS
+0x30	0x0030	#DIGIT ZERO
+0x31	0x0031	#DIGIT ONE
+0x32	0x0032	#DIGIT TWO
+0x33	0x0033	#DIGIT THREE
+0x34	0x0034	#DIGIT FOUR
+0x35	0x0035	#DIGIT FIVE
+0x36	0x0036	#DIGIT SIX
+0x37	0x0037	#DIGIT SEVEN
+0x38	0x0038	#DIGIT EIGHT
+0x39	0x0039	#DIGIT NINE
+0x3a	0x003a	#COLON
+0x3b	0x003b	#SEMICOLON
+0x3c	0x003c	#LESS-THAN SIGN
+0x3d	0x003d	#EQUALS SIGN
+0x3e	0x003e	#GREATER-THAN SIGN
+0x3f	0x003f	#QUESTION MARK
+0x40	0x0040	#COMMERCIAL AT
+0x41	0x0041	#LATIN CAPITAL LETTER A
+0x42	0x0042	#LATIN CAPITAL LETTER B
+0x43	0x0043	#LATIN CAPITAL LETTER C
+0x44	0x0044	#LATIN CAPITAL LETTER D
+0x45	0x0045	#LATIN CAPITAL LETTER E
+0x46	0x0046	#LATIN CAPITAL LETTER F
+0x47	0x0047	#LATIN CAPITAL LETTER G
+0x48	0x0048	#LATIN CAPITAL LETTER H
+0x49	0x0049	#LATIN CAPITAL LETTER I
+0x4a	0x004a	#LATIN CAPITAL LETTER J
+0x4b	0x004b	#LATIN CAPITAL LETTER K
+0x4c	0x004c	#LATIN CAPITAL LETTER L
+0x4d	0x004d	#LATIN CAPITAL LETTER M
+0x4e	0x004e	#LATIN CAPITAL LETTER N
+0x4f	0x004f	#LATIN CAPITAL LETTER O
+0x50	0x0050	#LATIN CAPITAL LETTER P
+0x51	0x0051	#LATIN CAPITAL LETTER Q
+0x52	0x0052	#LATIN CAPITAL LETTER R
+0x53	0x0053	#LATIN CAPITAL LETTER S
+0x54	0x0054	#LATIN CAPITAL LETTER T
+0x55	0x0055	#LATIN CAPITAL LETTER U
+0x56	0x0056	#LATIN CAPITAL LETTER V
+0x57	0x0057	#LATIN CAPITAL LETTER W
+0x58	0x0058	#LATIN CAPITAL LETTER X
+0x59	0x0059	#LATIN CAPITAL LETTER Y
+0x5a	0x005a	#LATIN CAPITAL LETTER Z
+0x5b	0x005b	#LEFT SQUARE BRACKET
+0x5c	0x005c	#REVERSE SOLIDUS
+0x5d	0x005d	#RIGHT SQUARE BRACKET
+0x5e	0x005e	#CIRCUMFLEX ACCENT
+0x5f	0x005f	#LOW LINE
+0x60	0x0060	#GRAVE ACCENT
+0x61	0x0061	#LATIN SMALL LETTER A
+0x62	0x0062	#LATIN SMALL LETTER B
+0x63	0x0063	#LATIN SMALL LETTER C
+0x64	0x0064	#LATIN SMALL LETTER D
+0x65	0x0065	#LATIN SMALL LETTER E
+0x66	0x0066	#LATIN SMALL LETTER F
+0x67	0x0067	#LATIN SMALL LETTER G
+0x68	0x0068	#LATIN SMALL LETTER H
+0x69	0x0069	#LATIN SMALL LETTER I
+0x6a	0x006a	#LATIN SMALL LETTER J
+0x6b	0x006b	#LATIN SMALL LETTER K
+0x6c	0x006c	#LATIN SMALL LETTER L
+0x6d	0x006d	#LATIN SMALL LETTER M
+0x6e	0x006e	#LATIN SMALL LETTER N
+0x6f	0x006f	#LATIN SMALL LETTER O
+0x70	0x0070	#LATIN SMALL LETTER P
+0x71	0x0071	#LATIN SMALL LETTER Q
+0x72	0x0072	#LATIN SMALL LETTER R
+0x73	0x0073	#LATIN SMALL LETTER S
+0x74	0x0074	#LATIN SMALL LETTER T
+0x75	0x0075	#LATIN SMALL LETTER U
+0x76	0x0076	#LATIN SMALL LETTER V
+0x77	0x0077	#LATIN SMALL LETTER W
+0x78	0x0078	#LATIN SMALL LETTER X
+0x79	0x0079	#LATIN SMALL LETTER Y
+0x7a	0x007a	#LATIN SMALL LETTER Z
+0x7b	0x007b	#LEFT CURLY BRACKET
+0x7c	0x007c	#VERTICAL LINE
+0x7d	0x007d	#RIGHT CURLY BRACKET
+0x7e	0x007e	#TILDE
+0x7f	0x007f	#DELETE
+0x80		#UNDEFINED
+0x81		#UNDEFINED
+0x82		#UNDEFINED
+0x83		#UNDEFINED
+0x84		#UNDEFINED
+0x85		#UNDEFINED
+0x86	0x0386	#GREEK CAPITAL LETTER ALPHA WITH TONOS
+0x87		#UNDEFINED
+0x88	0x00b7	#MIDDLE DOT
+0x89	0x00ac	#NOT SIGN
+0x8a	0x00a6	#BROKEN BAR
+0x8b	0x2018	#LEFT SINGLE QUOTATION MARK
+0x8c	0x2019	#RIGHT SINGLE QUOTATION MARK
+0x8d	0x0388	#GREEK CAPITAL LETTER EPSILON WITH TONOS
+0x8e	0x2015	#HORIZONTAL BAR
+0x8f	0x0389	#GREEK CAPITAL LETTER ETA WITH TONOS
+0x90	0x038a	#GREEK CAPITAL LETTER IOTA WITH TONOS
+0x91	0x03aa	#GREEK CAPITAL LETTER IOTA WITH DIALYTIKA
+0x92	0x038c	#GREEK CAPITAL LETTER OMICRON WITH TONOS
+0x93		#UNDEFINED
+0x94		#UNDEFINED
+0x95	0x038e	#GREEK CAPITAL LETTER UPSILON WITH TONOS
+0x96	0x03ab	#GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA
+0x97	0x00a9	#COPYRIGHT SIGN
+0x98	0x038f	#GREEK CAPITAL LETTER OMEGA WITH TONOS
+0x99	0x00b2	#SUPERSCRIPT TWO
+0x9a	0x00b3	#SUPERSCRIPT THREE
+0x9b	0x03ac	#GREEK SMALL LETTER ALPHA WITH TONOS
+0x9c	0x00a3	#POUND SIGN
+0x9d	0x03ad	#GREEK SMALL LETTER EPSILON WITH TONOS
+0x9e	0x03ae	#GREEK SMALL LETTER ETA WITH TONOS
+0x9f	0x03af	#GREEK SMALL LETTER IOTA WITH TONOS
+0xa0	0x03ca	#GREEK SMALL LETTER IOTA WITH DIALYTIKA
+0xa1	0x0390	#GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS
+0xa2	0x03cc	#GREEK SMALL LETTER OMICRON WITH TONOS
+0xa3	0x03cd	#GREEK SMALL LETTER UPSILON WITH TONOS
+0xa4	0x0391	#GREEK CAPITAL LETTER ALPHA
+0xa5	0x0392	#GREEK CAPITAL LETTER BETA
+0xa6	0x0393	#GREEK CAPITAL LETTER GAMMA
+0xa7	0x0394	#GREEK CAPITAL LETTER DELTA
+0xa8	0x0395	#GREEK CAPITAL LETTER EPSILON
+0xa9	0x0396	#GREEK CAPITAL LETTER ZETA
+0xaa	0x0397	#GREEK CAPITAL LETTER ETA
+0xab	0x00bd	#VULGAR FRACTION ONE HALF
+0xac	0x0398	#GREEK CAPITAL LETTER THETA
+0xad	0x0399	#GREEK CAPITAL LETTER IOTA
+0xae	0x00ab	#LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xaf	0x00bb	#RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xb0	0x2591	#LIGHT SHADE
+0xb1	0x2592	#MEDIUM SHADE
+0xb2	0x2593	#DARK SHADE
+0xb3	0x2502	#BOX DRAWINGS LIGHT VERTICAL
+0xb4	0x2524	#BOX DRAWINGS LIGHT VERTICAL AND LEFT
+0xb5	0x039a	#GREEK CAPITAL LETTER KAPPA
+0xb6	0x039b	#GREEK CAPITAL LETTER LAMDA
+0xb7	0x039c	#GREEK CAPITAL LETTER MU
+0xb8	0x039d	#GREEK CAPITAL LETTER NU
+0xb9	0x2563	#BOX DRAWINGS DOUBLE VERTICAL AND LEFT
+0xba	0x2551	#BOX DRAWINGS DOUBLE VERTICAL
+0xbb	0x2557	#BOX DRAWINGS DOUBLE DOWN AND LEFT
+0xbc	0x255d	#BOX DRAWINGS DOUBLE UP AND LEFT
+0xbd	0x039e	#GREEK CAPITAL LETTER XI
+0xbe	0x039f	#GREEK CAPITAL LETTER OMICRON
+0xbf	0x2510	#BOX DRAWINGS LIGHT DOWN AND LEFT
+0xc0	0x2514	#BOX DRAWINGS LIGHT UP AND RIGHT
+0xc1	0x2534	#BOX DRAWINGS LIGHT UP AND HORIZONTAL
+0xc2	0x252c	#BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
+0xc3	0x251c	#BOX DRAWINGS LIGHT VERTICAL AND RIGHT
+0xc4	0x2500	#BOX DRAWINGS LIGHT HORIZONTAL
+0xc5	0x253c	#BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
+0xc6	0x03a0	#GREEK CAPITAL LETTER PI
+0xc7	0x03a1	#GREEK CAPITAL LETTER RHO
+0xc8	0x255a	#BOX DRAWINGS DOUBLE UP AND RIGHT
+0xc9	0x2554	#BOX DRAWINGS DOUBLE DOWN AND RIGHT
+0xca	0x2569	#BOX DRAWINGS DOUBLE UP AND HORIZONTAL
+0xcb	0x2566	#BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
+0xcc	0x2560	#BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
+0xcd	0x2550	#BOX DRAWINGS DOUBLE HORIZONTAL
+0xce	0x256c	#BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
+0xcf	0x03a3	#GREEK CAPITAL LETTER SIGMA
+0xd0	0x03a4	#GREEK CAPITAL LETTER TAU
+0xd1	0x03a5	#GREEK CAPITAL LETTER UPSILON
+0xd2	0x03a6	#GREEK CAPITAL LETTER PHI
+0xd3	0x03a7	#GREEK CAPITAL LETTER CHI
+0xd4	0x03a8	#GREEK CAPITAL LETTER PSI
+0xd5	0x03a9	#GREEK CAPITAL LETTER OMEGA
+0xd6	0x03b1	#GREEK SMALL LETTER ALPHA
+0xd7	0x03b2	#GREEK SMALL LETTER BETA
+0xd8	0x03b3	#GREEK SMALL LETTER GAMMA
+0xd9	0x2518	#BOX DRAWINGS LIGHT UP AND LEFT
+0xda	0x250c	#BOX DRAWINGS LIGHT DOWN AND RIGHT
+0xdb	0x2588	#FULL BLOCK
+0xdc	0x2584	#LOWER HALF BLOCK
+0xdd	0x03b4	#GREEK SMALL LETTER DELTA
+0xde	0x03b5	#GREEK SMALL LETTER EPSILON
+0xdf	0x2580	#UPPER HALF BLOCK
+0xe0	0x03b6	#GREEK SMALL LETTER ZETA
+0xe1	0x03b7	#GREEK SMALL LETTER ETA
+0xe2	0x03b8	#GREEK SMALL LETTER THETA
+0xe3	0x03b9	#GREEK SMALL LETTER IOTA
+0xe4	0x03ba	#GREEK SMALL LETTER KAPPA
+0xe5	0x03bb	#GREEK SMALL LETTER LAMDA
+0xe6	0x03bc	#GREEK SMALL LETTER MU
+0xe7	0x03bd	#GREEK SMALL LETTER NU
+0xe8	0x03be	#GREEK SMALL LETTER XI
+0xe9	0x03bf	#GREEK SMALL LETTER OMICRON
+0xea	0x03c0	#GREEK SMALL LETTER PI
+0xeb	0x03c1	#GREEK SMALL LETTER RHO
+0xec	0x03c3	#GREEK SMALL LETTER SIGMA
+0xed	0x03c2	#GREEK SMALL LETTER FINAL SIGMA
+0xee	0x03c4	#GREEK SMALL LETTER TAU
+0xef	0x0384	#GREEK TONOS
+0xf0	0x00ad	#SOFT HYPHEN
+0xf1	0x00b1	#PLUS-MINUS SIGN
+0xf2	0x03c5	#GREEK SMALL LETTER UPSILON
+0xf3	0x03c6	#GREEK SMALL LETTER PHI
+0xf4	0x03c7	#GREEK SMALL LETTER CHI
+0xf5	0x00a7	#SECTION SIGN
+0xf6	0x03c8	#GREEK SMALL LETTER PSI
+0xf7	0x0385	#GREEK DIALYTIKA TONOS
+0xf8	0x00b0	#DEGREE SIGN
+0xf9	0x00a8	#DIAERESIS
+0xfa	0x03c9	#GREEK SMALL LETTER OMEGA
+0xfb	0x03cb	#GREEK SMALL LETTER UPSILON WITH DIALYTIKA
+0xfc	0x03b0	#GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS
+0xfd	0x03ce	#GREEK SMALL LETTER OMEGA WITH TONOS
+0xfe	0x25a0	#BLACK SQUARE
+0xff	0x00a0	#NO-BREAK SPACE
+
diff --git a/lib/ucmaps/cp874.txt b/lib/ucmaps/cp874.txt
new file mode 100644
index 000000000..1eb71dfe1
--- /dev/null
+++ b/lib/ucmaps/cp874.txt
@@ -0,0 +1,274 @@
+#
+#    Name:     cp874 to Unicode table
+#    Unicode version: 2.0
+#    Table version: 2.01
+#    Table format:  Format A
+#    Date:          02/28/98
+#
+#    Contact:       cpxlate@microsoft.com
+#
+#    General notes: none
+#
+#    Format: Three tab-separated columns
+#        Column #1 is the cp874 code (in hex)
+#        Column #2 is the Unicode (in hex as 0xXXXX)
+#        Column #3 is the Unicode name (follows a comment sign, '#')
+#
+#    The entries are in cp874 order
+#
+0x00	0x0000	#NULL
+0x01	0x0001	#START OF HEADING
+0x02	0x0002	#START OF TEXT
+0x03	0x0003	#END OF TEXT
+0x04	0x0004	#END OF TRANSMISSION
+0x05	0x0005	#ENQUIRY
+0x06	0x0006	#ACKNOWLEDGE
+0x07	0x0007	#BELL
+0x08	0x0008	#BACKSPACE
+0x09	0x0009	#HORIZONTAL TABULATION
+0x0A	0x000A	#LINE FEED
+0x0B	0x000B	#VERTICAL TABULATION
+0x0C	0x000C	#FORM FEED
+0x0D	0x000D	#CARRIAGE RETURN
+0x0E	0x000E	#SHIFT OUT
+0x0F	0x000F	#SHIFT IN
+0x10	0x0010	#DATA LINK ESCAPE
+0x11	0x0011	#DEVICE CONTROL ONE
+0x12	0x0012	#DEVICE CONTROL TWO
+0x13	0x0013	#DEVICE CONTROL THREE
+0x14	0x0014	#DEVICE CONTROL FOUR
+0x15	0x0015	#NEGATIVE ACKNOWLEDGE
+0x16	0x0016	#SYNCHRONOUS IDLE
+0x17	0x0017	#END OF TRANSMISSION BLOCK
+0x18	0x0018	#CANCEL
+0x19	0x0019	#END OF MEDIUM
+0x1A	0x001A	#SUBSTITUTE
+0x1B	0x001B	#ESCAPE
+0x1C	0x001C	#FILE SEPARATOR
+0x1D	0x001D	#GROUP SEPARATOR
+0x1E	0x001E	#RECORD SEPARATOR
+0x1F	0x001F	#UNIT SEPARATOR
+0x20	0x0020	#SPACE
+0x21	0x0021	#EXCLAMATION MARK
+0x22	0x0022	#QUOTATION MARK
+0x23	0x0023	#NUMBER SIGN
+0x24	0x0024	#DOLLAR SIGN
+0x25	0x0025	#PERCENT SIGN
+0x26	0x0026	#AMPERSAND
+0x27	0x0027	#APOSTROPHE
+0x28	0x0028	#LEFT PARENTHESIS
+0x29	0x0029	#RIGHT PARENTHESIS
+0x2A	0x002A	#ASTERISK
+0x2B	0x002B	#PLUS SIGN
+0x2C	0x002C	#COMMA
+0x2D	0x002D	#HYPHEN-MINUS
+0x2E	0x002E	#FULL STOP
+0x2F	0x002F	#SOLIDUS
+0x30	0x0030	#DIGIT ZERO
+0x31	0x0031	#DIGIT ONE
+0x32	0x0032	#DIGIT TWO
+0x33	0x0033	#DIGIT THREE
+0x34	0x0034	#DIGIT FOUR
+0x35	0x0035	#DIGIT FIVE
+0x36	0x0036	#DIGIT SIX
+0x37	0x0037	#DIGIT SEVEN
+0x38	0x0038	#DIGIT EIGHT
+0x39	0x0039	#DIGIT NINE
+0x3A	0x003A	#COLON
+0x3B	0x003B	#SEMICOLON
+0x3C	0x003C	#LESS-THAN SIGN
+0x3D	0x003D	#EQUALS SIGN
+0x3E	0x003E	#GREATER-THAN SIGN
+0x3F	0x003F	#QUESTION MARK
+0x40	0x0040	#COMMERCIAL AT
+0x41	0x0041	#LATIN CAPITAL LETTER A
+0x42	0x0042	#LATIN CAPITAL LETTER B
+0x43	0x0043	#LATIN CAPITAL LETTER C
+0x44	0x0044	#LATIN CAPITAL LETTER D
+0x45	0x0045	#LATIN CAPITAL LETTER E
+0x46	0x0046	#LATIN CAPITAL LETTER F
+0x47	0x0047	#LATIN CAPITAL LETTER G
+0x48	0x0048	#LATIN CAPITAL LETTER H
+0x49	0x0049	#LATIN CAPITAL LETTER I
+0x4A	0x004A	#LATIN CAPITAL LETTER J
+0x4B	0x004B	#LATIN CAPITAL LETTER K
+0x4C	0x004C	#LATIN CAPITAL LETTER L
+0x4D	0x004D	#LATIN CAPITAL LETTER M
+0x4E	0x004E	#LATIN CAPITAL LETTER N
+0x4F	0x004F	#LATIN CAPITAL LETTER O
+0x50	0x0050	#LATIN CAPITAL LETTER P
+0x51	0x0051	#LATIN CAPITAL LETTER Q
+0x52	0x0052	#LATIN CAPITAL LETTER R
+0x53	0x0053	#LATIN CAPITAL LETTER S
+0x54	0x0054	#LATIN CAPITAL LETTER T
+0x55	0x0055	#LATIN CAPITAL LETTER U
+0x56	0x0056	#LATIN CAPITAL LETTER V
+0x57	0x0057	#LATIN CAPITAL LETTER W
+0x58	0x0058	#LATIN CAPITAL LETTER X
+0x59	0x0059	#LATIN CAPITAL LETTER Y
+0x5A	0x005A	#LATIN CAPITAL LETTER Z
+0x5B	0x005B	#LEFT SQUARE BRACKET
+0x5C	0x005C	#REVERSE SOLIDUS
+0x5D	0x005D	#RIGHT SQUARE BRACKET
+0x5E	0x005E	#CIRCUMFLEX ACCENT
+0x5F	0x005F	#LOW LINE
+0x60	0x0060	#GRAVE ACCENT
+0x61	0x0061	#LATIN SMALL LETTER A
+0x62	0x0062	#LATIN SMALL LETTER B
+0x63	0x0063	#LATIN SMALL LETTER C
+0x64	0x0064	#LATIN SMALL LETTER D
+0x65	0x0065	#LATIN SMALL LETTER E
+0x66	0x0066	#LATIN SMALL LETTER F
+0x67	0x0067	#LATIN SMALL LETTER G
+0x68	0x0068	#LATIN SMALL LETTER H
+0x69	0x0069	#LATIN SMALL LETTER I
+0x6A	0x006A	#LATIN SMALL LETTER J
+0x6B	0x006B	#LATIN SMALL LETTER K
+0x6C	0x006C	#LATIN SMALL LETTER L
+0x6D	0x006D	#LATIN SMALL LETTER M
+0x6E	0x006E	#LATIN SMALL LETTER N
+0x6F	0x006F	#LATIN SMALL LETTER O
+0x70	0x0070	#LATIN SMALL LETTER P
+0x71	0x0071	#LATIN SMALL LETTER Q
+0x72	0x0072	#LATIN SMALL LETTER R
+0x73	0x0073	#LATIN SMALL LETTER S
+0x74	0x0074	#LATIN SMALL LETTER T
+0x75	0x0075	#LATIN SMALL LETTER U
+0x76	0x0076	#LATIN SMALL LETTER V
+0x77	0x0077	#LATIN SMALL LETTER W
+0x78	0x0078	#LATIN SMALL LETTER X
+0x79	0x0079	#LATIN SMALL LETTER Y
+0x7A	0x007A	#LATIN SMALL LETTER Z
+0x7B	0x007B	#LEFT CURLY BRACKET
+0x7C	0x007C	#VERTICAL LINE
+0x7D	0x007D	#RIGHT CURLY BRACKET
+0x7E	0x007E	#TILDE
+0x7F	0x007F	#DELETE
+0x80	0x20AC	#EURO SIGN
+0x81	      	#UNDEFINED
+0x82	      	#UNDEFINED
+0x83	      	#UNDEFINED
+0x84	      	#UNDEFINED
+0x85	0x2026	#HORIZONTAL ELLIPSIS
+0x86	      	#UNDEFINED
+0x87	      	#UNDEFINED
+0x88	      	#UNDEFINED
+0x89	      	#UNDEFINED
+0x8A	      	#UNDEFINED
+0x8B	      	#UNDEFINED
+0x8C	      	#UNDEFINED
+0x8D	      	#UNDEFINED
+0x8E	      	#UNDEFINED
+0x8F	      	#UNDEFINED
+0x90	      	#UNDEFINED
+0x91	0x2018	#LEFT SINGLE QUOTATION MARK
+0x92	0x2019	#RIGHT SINGLE QUOTATION MARK
+0x93	0x201C	#LEFT DOUBLE QUOTATION MARK
+0x94	0x201D	#RIGHT DOUBLE QUOTATION MARK
+0x95	0x2022	#BULLET
+0x96	0x2013	#EN DASH
+0x97	0x2014	#EM DASH
+0x98	      	#UNDEFINED
+0x99	      	#UNDEFINED
+0x9A	      	#UNDEFINED
+0x9B	      	#UNDEFINED
+0x9C	      	#UNDEFINED
+0x9D	      	#UNDEFINED
+0x9E	      	#UNDEFINED
+0x9F	      	#UNDEFINED
+0xA0	0x00A0	#NO-BREAK SPACE
+0xA1	0x0E01	#THAI CHARACTER KO KAI
+0xA2	0x0E02	#THAI CHARACTER KHO KHAI
+0xA3	0x0E03	#THAI CHARACTER KHO KHUAT
+0xA4	0x0E04	#THAI CHARACTER KHO KHWAI
+0xA5	0x0E05	#THAI CHARACTER KHO KHON
+0xA6	0x0E06	#THAI CHARACTER KHO RAKHANG
+0xA7	0x0E07	#THAI CHARACTER NGO NGU
+0xA8	0x0E08	#THAI CHARACTER CHO CHAN
+0xA9	0x0E09	#THAI CHARACTER CHO CHING
+0xAA	0x0E0A	#THAI CHARACTER CHO CHANG
+0xAB	0x0E0B	#THAI CHARACTER SO SO
+0xAC	0x0E0C	#THAI CHARACTER CHO CHOE
+0xAD	0x0E0D	#THAI CHARACTER YO YING
+0xAE	0x0E0E	#THAI CHARACTER DO CHADA
+0xAF	0x0E0F	#THAI CHARACTER TO PATAK
+0xB0	0x0E10	#THAI CHARACTER THO THAN
+0xB1	0x0E11	#THAI CHARACTER THO NANGMONTHO
+0xB2	0x0E12	#THAI CHARACTER THO PHUTHAO
+0xB3	0x0E13	#THAI CHARACTER NO NEN
+0xB4	0x0E14	#THAI CHARACTER DO DEK
+0xB5	0x0E15	#THAI CHARACTER TO TAO
+0xB6	0x0E16	#THAI CHARACTER THO THUNG
+0xB7	0x0E17	#THAI CHARACTER THO THAHAN
+0xB8	0x0E18	#THAI CHARACTER THO THONG
+0xB9	0x0E19	#THAI CHARACTER NO NU
+0xBA	0x0E1A	#THAI CHARACTER BO BAIMAI
+0xBB	0x0E1B	#THAI CHARACTER PO PLA
+0xBC	0x0E1C	#THAI CHARACTER PHO PHUNG
+0xBD	0x0E1D	#THAI CHARACTER FO FA
+0xBE	0x0E1E	#THAI CHARACTER PHO PHAN
+0xBF	0x0E1F	#THAI CHARACTER FO FAN
+0xC0	0x0E20	#THAI CHARACTER PHO SAMPHAO
+0xC1	0x0E21	#THAI CHARACTER MO MA
+0xC2	0x0E22	#THAI CHARACTER YO YAK
+0xC3	0x0E23	#THAI CHARACTER RO RUA
+0xC4	0x0E24	#THAI CHARACTER RU
+0xC5	0x0E25	#THAI CHARACTER LO LING
+0xC6	0x0E26	#THAI CHARACTER LU
+0xC7	0x0E27	#THAI CHARACTER WO WAEN
+0xC8	0x0E28	#THAI CHARACTER SO SALA
+0xC9	0x0E29	#THAI CHARACTER SO RUSI
+0xCA	0x0E2A	#THAI CHARACTER SO SUA
+0xCB	0x0E2B	#THAI CHARACTER HO HIP
+0xCC	0x0E2C	#THAI CHARACTER LO CHULA
+0xCD	0x0E2D	#THAI CHARACTER O ANG
+0xCE	0x0E2E	#THAI CHARACTER HO NOKHUK
+0xCF	0x0E2F	#THAI CHARACTER PAIYANNOI
+0xD0	0x0E30	#THAI CHARACTER SARA A
+0xD1	0x0E31	#THAI CHARACTER MAI HAN-AKAT
+0xD2	0x0E32	#THAI CHARACTER SARA AA
+0xD3	0x0E33	#THAI CHARACTER SARA AM
+0xD4	0x0E34	#THAI CHARACTER SARA I
+0xD5	0x0E35	#THAI CHARACTER SARA II
+0xD6	0x0E36	#THAI CHARACTER SARA UE
+0xD7	0x0E37	#THAI CHARACTER SARA UEE
+0xD8	0x0E38	#THAI CHARACTER SARA U
+0xD9	0x0E39	#THAI CHARACTER SARA UU
+0xDA	0x0E3A	#THAI CHARACTER PHINTHU
+0xDB	      	#UNDEFINED
+0xDC	      	#UNDEFINED
+0xDD	      	#UNDEFINED
+0xDE	      	#UNDEFINED
+0xDF	0x0E3F	#THAI CURRENCY SYMBOL BAHT
+0xE0	0x0E40	#THAI CHARACTER SARA E
+0xE1	0x0E41	#THAI CHARACTER SARA AE
+0xE2	0x0E42	#THAI CHARACTER SARA O
+0xE3	0x0E43	#THAI CHARACTER SARA AI MAIMUAN
+0xE4	0x0E44	#THAI CHARACTER SARA AI MAIMALAI
+0xE5	0x0E45	#THAI CHARACTER LAKKHANGYAO
+0xE6	0x0E46	#THAI CHARACTER MAIYAMOK
+0xE7	0x0E47	#THAI CHARACTER MAITAIKHU
+0xE8	0x0E48	#THAI CHARACTER MAI EK
+0xE9	0x0E49	#THAI CHARACTER MAI THO
+0xEA	0x0E4A	#THAI CHARACTER MAI TRI
+0xEB	0x0E4B	#THAI CHARACTER MAI CHATTAWA
+0xEC	0x0E4C	#THAI CHARACTER THANTHAKHAT
+0xED	0x0E4D	#THAI CHARACTER NIKHAHIT
+0xEE	0x0E4E	#THAI CHARACTER YAMAKKAN
+0xEF	0x0E4F	#THAI CHARACTER FONGMAN
+0xF0	0x0E50	#THAI DIGIT ZERO
+0xF1	0x0E51	#THAI DIGIT ONE
+0xF2	0x0E52	#THAI DIGIT TWO
+0xF3	0x0E53	#THAI DIGIT THREE
+0xF4	0x0E54	#THAI DIGIT FOUR
+0xF5	0x0E55	#THAI DIGIT FIVE
+0xF6	0x0E56	#THAI DIGIT SIX
+0xF7	0x0E57	#THAI DIGIT SEVEN
+0xF8	0x0E58	#THAI DIGIT EIGHT
+0xF9	0x0E59	#THAI DIGIT NINE
+0xFA	0x0E5A	#THAI CHARACTER ANGKHANKHU
+0xFB	0x0E5B	#THAI CHARACTER KHOMUT
+0xFC	      	#UNDEFINED
+0xFD	      	#UNDEFINED
+0xFE	      	#UNDEFINED
+0xFF	      	#UNDEFINED
diff --git a/lib/ucmaps/cp932.txt b/lib/ucmaps/cp932.txt
new file mode 100644
index 000000000..36bfdbfab
--- /dev/null
+++ b/lib/ucmaps/cp932.txt
@@ -0,0 +1,7998 @@
+#
+#    Name:     cp932 to Unicode table
+#    Unicode version: 2.0
+#    Table version: 2.01
+#    Table format:  Format A
+#    Date:          04/15/98
+#
+#    Contact:       cpxlate@microsoft.com
+#
+#    General notes: none
+#
+#    Format: Three tab-separated columns
+#        Column #1 is the cp932 code (in hex)
+#        Column #2 is the Unicode (in hex as 0xXXXX)
+#        Column #3 is the Unicode name (follows a comment sign, '#')
+#
+#    The entries are in cp932 order
+#
+0x00	0x0000	#NULL
+0x01	0x0001	#START OF HEADING
+0x02	0x0002	#START OF TEXT
+0x03	0x0003	#END OF TEXT
+0x04	0x0004	#END OF TRANSMISSION
+0x05	0x0005	#ENQUIRY
+0x06	0x0006	#ACKNOWLEDGE
+0x07	0x0007	#BELL
+0x08	0x0008	#BACKSPACE
+0x09	0x0009	#HORIZONTAL TABULATION
+0x0A	0x000A	#LINE FEED
+0x0B	0x000B	#VERTICAL TABULATION
+0x0C	0x000C	#FORM FEED
+0x0D	0x000D	#CARRIAGE RETURN
+0x0E	0x000E	#SHIFT OUT
+0x0F	0x000F	#SHIFT IN
+0x10	0x0010	#DATA LINK ESCAPE
+0x11	0x0011	#DEVICE CONTROL ONE
+0x12	0x0012	#DEVICE CONTROL TWO
+0x13	0x0013	#DEVICE CONTROL THREE
+0x14	0x0014	#DEVICE CONTROL FOUR
+0x15	0x0015	#NEGATIVE ACKNOWLEDGE
+0x16	0x0016	#SYNCHRONOUS IDLE
+0x17	0x0017	#END OF TRANSMISSION BLOCK
+0x18	0x0018	#CANCEL
+0x19	0x0019	#END OF MEDIUM
+0x1A	0x001A	#SUBSTITUTE
+0x1B	0x001B	#ESCAPE
+0x1C	0x001C	#FILE SEPARATOR
+0x1D	0x001D	#GROUP SEPARATOR
+0x1E	0x001E	#RECORD SEPARATOR
+0x1F	0x001F	#UNIT SEPARATOR
+0x20	0x0020	#SPACE
+0x21	0x0021	#EXCLAMATION MARK
+0x22	0x0022	#QUOTATION MARK
+0x23	0x0023	#NUMBER SIGN
+0x24	0x0024	#DOLLAR SIGN
+0x25	0x0025	#PERCENT SIGN
+0x26	0x0026	#AMPERSAND
+0x27	0x0027	#APOSTROPHE
+0x28	0x0028	#LEFT PARENTHESIS
+0x29	0x0029	#RIGHT PARENTHESIS
+0x2A	0x002A	#ASTERISK
+0x2B	0x002B	#PLUS SIGN
+0x2C	0x002C	#COMMA
+0x2D	0x002D	#HYPHEN-MINUS
+0x2E	0x002E	#FULL STOP
+0x2F	0x002F	#SOLIDUS
+0x30	0x0030	#DIGIT ZERO
+0x31	0x0031	#DIGIT ONE
+0x32	0x0032	#DIGIT TWO
+0x33	0x0033	#DIGIT THREE
+0x34	0x0034	#DIGIT FOUR
+0x35	0x0035	#DIGIT FIVE
+0x36	0x0036	#DIGIT SIX
+0x37	0x0037	#DIGIT SEVEN
+0x38	0x0038	#DIGIT EIGHT
+0x39	0x0039	#DIGIT NINE
+0x3A	0x003A	#COLON
+0x3B	0x003B	#SEMICOLON
+0x3C	0x003C	#LESS-THAN SIGN
+0x3D	0x003D	#EQUALS SIGN
+0x3E	0x003E	#GREATER-THAN SIGN
+0x3F	0x003F	#QUESTION MARK
+0x40	0x0040	#COMMERCIAL AT
+0x41	0x0041	#LATIN CAPITAL LETTER A
+0x42	0x0042	#LATIN CAPITAL LETTER B
+0x43	0x0043	#LATIN CAPITAL LETTER C
+0x44	0x0044	#LATIN CAPITAL LETTER D
+0x45	0x0045	#LATIN CAPITAL LETTER E
+0x46	0x0046	#LATIN CAPITAL LETTER F
+0x47	0x0047	#LATIN CAPITAL LETTER G
+0x48	0x0048	#LATIN CAPITAL LETTER H
+0x49	0x0049	#LATIN CAPITAL LETTER I
+0x4A	0x004A	#LATIN CAPITAL LETTER J
+0x4B	0x004B	#LATIN CAPITAL LETTER K
+0x4C	0x004C	#LATIN CAPITAL LETTER L
+0x4D	0x004D	#LATIN CAPITAL LETTER M
+0x4E	0x004E	#LATIN CAPITAL LETTER N
+0x4F	0x004F	#LATIN CAPITAL LETTER O
+0x50	0x0050	#LATIN CAPITAL LETTER P
+0x51	0x0051	#LATIN CAPITAL LETTER Q
+0x52	0x0052	#LATIN CAPITAL LETTER R
+0x53	0x0053	#LATIN CAPITAL LETTER S
+0x54	0x0054	#LATIN CAPITAL LETTER T
+0x55	0x0055	#LATIN CAPITAL LETTER U
+0x56	0x0056	#LATIN CAPITAL LETTER V
+0x57	0x0057	#LATIN CAPITAL LETTER W
+0x58	0x0058	#LATIN CAPITAL LETTER X
+0x59	0x0059	#LATIN CAPITAL LETTER Y
+0x5A	0x005A	#LATIN CAPITAL LETTER Z
+0x5B	0x005B	#LEFT SQUARE BRACKET
+0x5C	0x005C	#REVERSE SOLIDUS
+0x5D	0x005D	#RIGHT SQUARE BRACKET
+0x5E	0x005E	#CIRCUMFLEX ACCENT
+0x5F	0x005F	#LOW LINE
+0x60	0x0060	#GRAVE ACCENT
+0x61	0x0061	#LATIN SMALL LETTER A
+0x62	0x0062	#LATIN SMALL LETTER B
+0x63	0x0063	#LATIN SMALL LETTER C
+0x64	0x0064	#LATIN SMALL LETTER D
+0x65	0x0065	#LATIN SMALL LETTER E
+0x66	0x0066	#LATIN SMALL LETTER F
+0x67	0x0067	#LATIN SMALL LETTER G
+0x68	0x0068	#LATIN SMALL LETTER H
+0x69	0x0069	#LATIN SMALL LETTER I
+0x6A	0x006A	#LATIN SMALL LETTER J
+0x6B	0x006B	#LATIN SMALL LETTER K
+0x6C	0x006C	#LATIN SMALL LETTER L
+0x6D	0x006D	#LATIN SMALL LETTER M
+0x6E	0x006E	#LATIN SMALL LETTER N
+0x6F	0x006F	#LATIN SMALL LETTER O
+0x70	0x0070	#LATIN SMALL LETTER P
+0x71	0x0071	#LATIN SMALL LETTER Q
+0x72	0x0072	#LATIN SMALL LETTER R
+0x73	0x0073	#LATIN SMALL LETTER S
+0x74	0x0074	#LATIN SMALL LETTER T
+0x75	0x0075	#LATIN SMALL LETTER U
+0x76	0x0076	#LATIN SMALL LETTER V
+0x77	0x0077	#LATIN SMALL LETTER W
+0x78	0x0078	#LATIN SMALL LETTER X
+0x79	0x0079	#LATIN SMALL LETTER Y
+0x7A	0x007A	#LATIN SMALL LETTER Z
+0x7B	0x007B	#LEFT CURLY BRACKET
+0x7C	0x007C	#VERTICAL LINE
+0x7D	0x007D	#RIGHT CURLY BRACKET
+0x7E	0x007E	#TILDE
+0x7F	0x007F	#DELETE
+0x80	      	#UNDEFINED
+0x81	      	#DBCS LEAD BYTE
+0x82	      	#DBCS LEAD BYTE
+0x83	      	#DBCS LEAD BYTE
+0x84	      	#DBCS LEAD BYTE
+0x85	      	#DBCS LEAD BYTE
+0x86	      	#DBCS LEAD BYTE
+0x87	      	#DBCS LEAD BYTE
+0x88	      	#DBCS LEAD BYTE
+0x89	      	#DBCS LEAD BYTE
+0x8A	      	#DBCS LEAD BYTE
+0x8B	      	#DBCS LEAD BYTE
+0x8C	      	#DBCS LEAD BYTE
+0x8D	      	#DBCS LEAD BYTE
+0x8E	      	#DBCS LEAD BYTE
+0x8F	      	#DBCS LEAD BYTE
+0x90	      	#DBCS LEAD BYTE
+0x91	      	#DBCS LEAD BYTE
+0x92	      	#DBCS LEAD BYTE
+0x93	      	#DBCS LEAD BYTE
+0x94	      	#DBCS LEAD BYTE
+0x95	      	#DBCS LEAD BYTE
+0x96	      	#DBCS LEAD BYTE
+0x97	      	#DBCS LEAD BYTE
+0x98	      	#DBCS LEAD BYTE
+0x99	      	#DBCS LEAD BYTE
+0x9A	      	#DBCS LEAD BYTE
+0x9B	      	#DBCS LEAD BYTE
+0x9C	      	#DBCS LEAD BYTE
+0x9D	      	#DBCS LEAD BYTE
+0x9E	      	#DBCS LEAD BYTE
+0x9F	      	#DBCS LEAD BYTE
+0xA0	      	#UNDEFINED
+0xA1	0xFF61	#HALFWIDTH IDEOGRAPHIC FULL STOP
+0xA2	0xFF62	#HALFWIDTH LEFT CORNER BRACKET
+0xA3	0xFF63	#HALFWIDTH RIGHT CORNER BRACKET
+0xA4	0xFF64	#HALFWIDTH IDEOGRAPHIC COMMA
+0xA5	0xFF65	#HALFWIDTH KATAKANA MIDDLE DOT
+0xA6	0xFF66	#HALFWIDTH KATAKANA LETTER WO
+0xA7	0xFF67	#HALFWIDTH KATAKANA LETTER SMALL A
+0xA8	0xFF68	#HALFWIDTH KATAKANA LETTER SMALL I
+0xA9	0xFF69	#HALFWIDTH KATAKANA LETTER SMALL U
+0xAA	0xFF6A	#HALFWIDTH KATAKANA LETTER SMALL E
+0xAB	0xFF6B	#HALFWIDTH KATAKANA LETTER SMALL O
+0xAC	0xFF6C	#HALFWIDTH KATAKANA LETTER SMALL YA
+0xAD	0xFF6D	#HALFWIDTH KATAKANA LETTER SMALL YU
+0xAE	0xFF6E	#HALFWIDTH KATAKANA LETTER SMALL YO
+0xAF	0xFF6F	#HALFWIDTH KATAKANA LETTER SMALL TU
+0xB0	0xFF70	#HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK
+0xB1	0xFF71	#HALFWIDTH KATAKANA LETTER A
+0xB2	0xFF72	#HALFWIDTH KATAKANA LETTER I
+0xB3	0xFF73	#HALFWIDTH KATAKANA LETTER U
+0xB4	0xFF74	#HALFWIDTH KATAKANA LETTER E
+0xB5	0xFF75	#HALFWIDTH KATAKANA LETTER O
+0xB6	0xFF76	#HALFWIDTH KATAKANA LETTER KA
+0xB7	0xFF77	#HALFWIDTH KATAKANA LETTER KI
+0xB8	0xFF78	#HALFWIDTH KATAKANA LETTER KU
+0xB9	0xFF79	#HALFWIDTH KATAKANA LETTER KE
+0xBA	0xFF7A	#HALFWIDTH KATAKANA LETTER KO
+0xBB	0xFF7B	#HALFWIDTH KATAKANA LETTER SA
+0xBC	0xFF7C	#HALFWIDTH KATAKANA LETTER SI
+0xBD	0xFF7D	#HALFWIDTH KATAKANA LETTER SU
+0xBE	0xFF7E	#HALFWIDTH KATAKANA LETTER SE
+0xBF	0xFF7F	#HALFWIDTH KATAKANA LETTER SO
+0xC0	0xFF80	#HALFWIDTH KATAKANA LETTER TA
+0xC1	0xFF81	#HALFWIDTH KATAKANA LETTER TI
+0xC2	0xFF82	#HALFWIDTH KATAKANA LETTER TU
+0xC3	0xFF83	#HALFWIDTH KATAKANA LETTER TE
+0xC4	0xFF84	#HALFWIDTH KATAKANA LETTER TO
+0xC5	0xFF85	#HALFWIDTH KATAKANA LETTER NA
+0xC6	0xFF86	#HALFWIDTH KATAKANA LETTER NI
+0xC7	0xFF87	#HALFWIDTH KATAKANA LETTER NU
+0xC8	0xFF88	#HALFWIDTH KATAKANA LETTER NE
+0xC9	0xFF89	#HALFWIDTH KATAKANA LETTER NO
+0xCA	0xFF8A	#HALFWIDTH KATAKANA LETTER HA
+0xCB	0xFF8B	#HALFWIDTH KATAKANA LETTER HI
+0xCC	0xFF8C	#HALFWIDTH KATAKANA LETTER HU
+0xCD	0xFF8D	#HALFWIDTH KATAKANA LETTER HE
+0xCE	0xFF8E	#HALFWIDTH KATAKANA LETTER HO
+0xCF	0xFF8F	#HALFWIDTH KATAKANA LETTER MA
+0xD0	0xFF90	#HALFWIDTH KATAKANA LETTER MI
+0xD1	0xFF91	#HALFWIDTH KATAKANA LETTER MU
+0xD2	0xFF92	#HALFWIDTH KATAKANA LETTER ME
+0xD3	0xFF93	#HALFWIDTH KATAKANA LETTER MO
+0xD4	0xFF94	#HALFWIDTH KATAKANA LETTER YA
+0xD5	0xFF95	#HALFWIDTH KATAKANA LETTER YU
+0xD6	0xFF96	#HALFWIDTH KATAKANA LETTER YO
+0xD7	0xFF97	#HALFWIDTH KATAKANA LETTER RA
+0xD8	0xFF98	#HALFWIDTH KATAKANA LETTER RI
+0xD9	0xFF99	#HALFWIDTH KATAKANA LETTER RU
+0xDA	0xFF9A	#HALFWIDTH KATAKANA LETTER RE
+0xDB	0xFF9B	#HALFWIDTH KATAKANA LETTER RO
+0xDC	0xFF9C	#HALFWIDTH KATAKANA LETTER WA
+0xDD	0xFF9D	#HALFWIDTH KATAKANA LETTER N
+0xDE	0xFF9E	#HALFWIDTH KATAKANA VOICED SOUND MARK
+0xDF	0xFF9F	#HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK
+0xE0	      	#DBCS LEAD BYTE
+0xE1	      	#DBCS LEAD BYTE
+0xE2	      	#DBCS LEAD BYTE
+0xE3	      	#DBCS LEAD BYTE
+0xE4	      	#DBCS LEAD BYTE
+0xE5	      	#DBCS LEAD BYTE
+0xE6	      	#DBCS LEAD BYTE
+0xE7	      	#DBCS LEAD BYTE
+0xE8	      	#DBCS LEAD BYTE
+0xE9	      	#DBCS LEAD BYTE
+0xEA	      	#DBCS LEAD BYTE
+0xEB	      	#DBCS LEAD BYTE
+0xEC	      	#DBCS LEAD BYTE
+0xED	      	#DBCS LEAD BYTE
+0xEE	      	#DBCS LEAD BYTE
+0xEF	      	#DBCS LEAD BYTE
+0xF0	      	#DBCS LEAD BYTE
+0xF1	      	#DBCS LEAD BYTE
+0xF2	      	#DBCS LEAD BYTE
+0xF3	      	#DBCS LEAD BYTE
+0xF4	      	#DBCS LEAD BYTE
+0xF5	      	#DBCS LEAD BYTE
+0xF6	      	#DBCS LEAD BYTE
+0xF7	      	#DBCS LEAD BYTE
+0xF8	      	#DBCS LEAD BYTE
+0xF9	      	#DBCS LEAD BYTE
+0xFA	      	#DBCS LEAD BYTE
+0xFB	      	#DBCS LEAD BYTE
+0xFC	      	#DBCS LEAD BYTE
+0xFD	      	#UNDEFINED
+0xFE	      	#UNDEFINED
+0xFF	      	#UNDEFINED
+0x8140	0x3000	#IDEOGRAPHIC SPACE
+0x8141	0x3001	#IDEOGRAPHIC COMMA
+0x8142	0x3002	#IDEOGRAPHIC FULL STOP
+0x8143	0xFF0C	#FULLWIDTH COMMA
+0x8144	0xFF0E	#FULLWIDTH FULL STOP
+0x8145	0x30FB	#KATAKANA MIDDLE DOT
+0x8146	0xFF1A	#FULLWIDTH COLON
+0x8147	0xFF1B	#FULLWIDTH SEMICOLON
+0x8148	0xFF1F	#FULLWIDTH QUESTION MARK
+0x8149	0xFF01	#FULLWIDTH EXCLAMATION MARK
+0x814A	0x309B	#KATAKANA-HIRAGANA VOICED SOUND MARK
+0x814B	0x309C	#KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
+0x814C	0x00B4	#ACUTE ACCENT
+0x814D	0xFF40	#FULLWIDTH GRAVE ACCENT
+0x814E	0x00A8	#DIAERESIS
+0x814F	0xFF3E	#FULLWIDTH CIRCUMFLEX ACCENT
+0x8150	0xFFE3	#FULLWIDTH MACRON
+0x8151	0xFF3F	#FULLWIDTH LOW LINE
+0x8152	0x30FD	#KATAKANA ITERATION MARK
+0x8153	0x30FE	#KATAKANA VOICED ITERATION MARK
+0x8154	0x309D	#HIRAGANA ITERATION MARK
+0x8155	0x309E	#HIRAGANA VOICED ITERATION MARK
+0x8156	0x3003	#DITTO MARK
+0x8157	0x4EDD	#CJK UNIFIED IDEOGRAPH
+0x8158	0x3005	#IDEOGRAPHIC ITERATION MARK
+0x8159	0x3006	#IDEOGRAPHIC CLOSING MARK
+0x815A	0x3007	#IDEOGRAPHIC NUMBER ZERO
+0x815B	0x30FC	#KATAKANA-HIRAGANA PROLONGED SOUND MARK
+0x815C	0x2015	#HORIZONTAL BAR
+0x815D	0x2010	#HYPHEN
+0x815E	0xFF0F	#FULLWIDTH SOLIDUS
+0x815F	0xFF3C	#FULLWIDTH REVERSE SOLIDUS
+0x8160	0xFF5E	#FULLWIDTH TILDE
+0x8161	0x2225	#PARALLEL TO
+0x8162	0xFF5C	#FULLWIDTH VERTICAL LINE
+0x8163	0x2026	#HORIZONTAL ELLIPSIS
+0x8164	0x2025	#TWO DOT LEADER
+0x8165	0x2018	#LEFT SINGLE QUOTATION MARK
+0x8166	0x2019	#RIGHT SINGLE QUOTATION MARK
+0x8167	0x201C	#LEFT DOUBLE QUOTATION MARK
+0x8168	0x201D	#RIGHT DOUBLE QUOTATION MARK
+0x8169	0xFF08	#FULLWIDTH LEFT PARENTHESIS
+0x816A	0xFF09	#FULLWIDTH RIGHT PARENTHESIS
+0x816B	0x3014	#LEFT TORTOISE SHELL BRACKET
+0x816C	0x3015	#RIGHT TORTOISE SHELL BRACKET
+0x816D	0xFF3B	#FULLWIDTH LEFT SQUARE BRACKET
+0x816E	0xFF3D	#FULLWIDTH RIGHT SQUARE BRACKET
+0x816F	0xFF5B	#FULLWIDTH LEFT CURLY BRACKET
+0x8170	0xFF5D	#FULLWIDTH RIGHT CURLY BRACKET
+0x8171	0x3008	#LEFT ANGLE BRACKET
+0x8172	0x3009	#RIGHT ANGLE BRACKET
+0x8173	0x300A	#LEFT DOUBLE ANGLE BRACKET
+0x8174	0x300B	#RIGHT DOUBLE ANGLE BRACKET
+0x8175	0x300C	#LEFT CORNER BRACKET
+0x8176	0x300D	#RIGHT CORNER BRACKET
+0x8177	0x300E	#LEFT WHITE CORNER BRACKET
+0x8178	0x300F	#RIGHT WHITE CORNER BRACKET
+0x8179	0x3010	#LEFT BLACK LENTICULAR BRACKET
+0x817A	0x3011	#RIGHT BLACK LENTICULAR BRACKET
+0x817B	0xFF0B	#FULLWIDTH PLUS SIGN
+0x817C	0xFF0D	#FULLWIDTH HYPHEN-MINUS
+0x817D	0x00B1	#PLUS-MINUS SIGN
+0x817E	0x00D7	#MULTIPLICATION SIGN
+0x8180	0x00F7	#DIVISION SIGN
+0x8181	0xFF1D	#FULLWIDTH EQUALS SIGN
+0x8182	0x2260	#NOT EQUAL TO
+0x8183	0xFF1C	#FULLWIDTH LESS-THAN SIGN
+0x8184	0xFF1E	#FULLWIDTH GREATER-THAN SIGN
+0x8185	0x2266	#LESS-THAN OVER EQUAL TO
+0x8186	0x2267	#GREATER-THAN OVER EQUAL TO
+0x8187	0x221E	#INFINITY
+0x8188	0x2234	#THEREFORE
+0x8189	0x2642	#MALE SIGN
+0x818A	0x2640	#FEMALE SIGN
+0x818B	0x00B0	#DEGREE SIGN
+0x818C	0x2032	#PRIME
+0x818D	0x2033	#DOUBLE PRIME
+0x818E	0x2103	#DEGREE CELSIUS
+0x818F	0xFFE5	#FULLWIDTH YEN SIGN
+0x8190	0xFF04	#FULLWIDTH DOLLAR SIGN
+0x8191	0xFFE0	#FULLWIDTH CENT SIGN
+0x8192	0xFFE1	#FULLWIDTH POUND SIGN
+0x8193	0xFF05	#FULLWIDTH PERCENT SIGN
+0x8194	0xFF03	#FULLWIDTH NUMBER SIGN
+0x8195	0xFF06	#FULLWIDTH AMPERSAND
+0x8196	0xFF0A	#FULLWIDTH ASTERISK
+0x8197	0xFF20	#FULLWIDTH COMMERCIAL AT
+0x8198	0x00A7	#SECTION SIGN
+0x8199	0x2606	#WHITE STAR
+0x819A	0x2605	#BLACK STAR
+0x819B	0x25CB	#WHITE CIRCLE
+0x819C	0x25CF	#BLACK CIRCLE
+0x819D	0x25CE	#BULLSEYE
+0x819E	0x25C7	#WHITE DIAMOND
+0x819F	0x25C6	#BLACK DIAMOND
+0x81A0	0x25A1	#WHITE SQUARE
+0x81A1	0x25A0	#BLACK SQUARE
+0x81A2	0x25B3	#WHITE UP-POINTING TRIANGLE
+0x81A3	0x25B2	#BLACK UP-POINTING TRIANGLE
+0x81A4	0x25BD	#WHITE DOWN-POINTING TRIANGLE
+0x81A5	0x25BC	#BLACK DOWN-POINTING TRIANGLE
+0x81A6	0x203B	#REFERENCE MARK
+0x81A7	0x3012	#POSTAL MARK
+0x81A8	0x2192	#RIGHTWARDS ARROW
+0x81A9	0x2190	#LEFTWARDS ARROW
+0x81AA	0x2191	#UPWARDS ARROW
+0x81AB	0x2193	#DOWNWARDS ARROW
+0x81AC	0x3013	#GETA MARK
+0x81B8	0x2208	#ELEMENT OF
+0x81B9	0x220B	#CONTAINS AS MEMBER
+0x81BA	0x2286	#SUBSET OF OR EQUAL TO
+0x81BB	0x2287	#SUPERSET OF OR EQUAL TO
+0x81BC	0x2282	#SUBSET OF
+0x81BD	0x2283	#SUPERSET OF
+0x81BE	0x222A	#UNION
+0x81BF	0x2229	#INTERSECTION
+0x81C8	0x2227	#LOGICAL AND
+0x81C9	0x2228	#LOGICAL OR
+0x81CA	0xFFE2	#FULLWIDTH NOT SIGN
+0x81CB	0x21D2	#RIGHTWARDS DOUBLE ARROW
+0x81CC	0x21D4	#LEFT RIGHT DOUBLE ARROW
+0x81CD	0x2200	#FOR ALL
+0x81CE	0x2203	#THERE EXISTS
+0x81DA	0x2220	#ANGLE
+0x81DB	0x22A5	#UP TACK
+0x81DC	0x2312	#ARC
+0x81DD	0x2202	#PARTIAL DIFFERENTIAL
+0x81DE	0x2207	#NABLA
+0x81DF	0x2261	#IDENTICAL TO
+0x81E0	0x2252	#APPROXIMATELY EQUAL TO OR THE IMAGE OF
+0x81E1	0x226A	#MUCH LESS-THAN
+0x81E2	0x226B	#MUCH GREATER-THAN
+0x81E3	0x221A	#SQUARE ROOT
+0x81E4	0x223D	#REVERSED TILDE
+0x81E5	0x221D	#PROPORTIONAL TO
+0x81E6	0x2235	#BECAUSE
+0x81E7	0x222B	#INTEGRAL
+0x81E8	0x222C	#DOUBLE INTEGRAL
+0x81F0	0x212B	#ANGSTROM SIGN
+0x81F1	0x2030	#PER MILLE SIGN
+0x81F2	0x266F	#MUSIC SHARP SIGN
+0x81F3	0x266D	#MUSIC FLAT SIGN
+0x81F4	0x266A	#EIGHTH NOTE
+0x81F5	0x2020	#DAGGER
+0x81F6	0x2021	#DOUBLE DAGGER
+0x81F7	0x00B6	#PILCROW SIGN
+0x81FC	0x25EF	#LARGE CIRCLE
+0x824F	0xFF10	#FULLWIDTH DIGIT ZERO
+0x8250	0xFF11	#FULLWIDTH DIGIT ONE
+0x8251	0xFF12	#FULLWIDTH DIGIT TWO
+0x8252	0xFF13	#FULLWIDTH DIGIT THREE
+0x8253	0xFF14	#FULLWIDTH DIGIT FOUR
+0x8254	0xFF15	#FULLWIDTH DIGIT FIVE
+0x8255	0xFF16	#FULLWIDTH DIGIT SIX
+0x8256	0xFF17	#FULLWIDTH DIGIT SEVEN
+0x8257	0xFF18	#FULLWIDTH DIGIT EIGHT
+0x8258	0xFF19	#FULLWIDTH DIGIT NINE
+0x8260	0xFF21	#FULLWIDTH LATIN CAPITAL LETTER A
+0x8261	0xFF22	#FULLWIDTH LATIN CAPITAL LETTER B
+0x8262	0xFF23	#FULLWIDTH LATIN CAPITAL LETTER C
+0x8263	0xFF24	#FULLWIDTH LATIN CAPITAL LETTER D
+0x8264	0xFF25	#FULLWIDTH LATIN CAPITAL LETTER E
+0x8265	0xFF26	#FULLWIDTH LATIN CAPITAL LETTER F
+0x8266	0xFF27	#FULLWIDTH LATIN CAPITAL LETTER G
+0x8267	0xFF28	#FULLWIDTH LATIN CAPITAL LETTER H
+0x8268	0xFF29	#FULLWIDTH LATIN CAPITAL LETTER I
+0x8269	0xFF2A	#FULLWIDTH LATIN CAPITAL LETTER J
+0x826A	0xFF2B	#FULLWIDTH LATIN CAPITAL LETTER K
+0x826B	0xFF2C	#FULLWIDTH LATIN CAPITAL LETTER L
+0x826C	0xFF2D	#FULLWIDTH LATIN CAPITAL LETTER M
+0x826D	0xFF2E	#FULLWIDTH LATIN CAPITAL LETTER N
+0x826E	0xFF2F	#FULLWIDTH LATIN CAPITAL LETTER O
+0x826F	0xFF30	#FULLWIDTH LATIN CAPITAL LETTER P
+0x8270	0xFF31	#FULLWIDTH LATIN CAPITAL LETTER Q
+0x8271	0xFF32	#FULLWIDTH LATIN CAPITAL LETTER R
+0x8272	0xFF33	#FULLWIDTH LATIN CAPITAL LETTER S
+0x8273	0xFF34	#FULLWIDTH LATIN CAPITAL LETTER T
+0x8274	0xFF35	#FULLWIDTH LATIN CAPITAL LETTER U
+0x8275	0xFF36	#FULLWIDTH LATIN CAPITAL LETTER V
+0x8276	0xFF37	#FULLWIDTH LATIN CAPITAL LETTER W
+0x8277	0xFF38	#FULLWIDTH LATIN CAPITAL LETTER X
+0x8278	0xFF39	#FULLWIDTH LATIN CAPITAL LETTER Y
+0x8279	0xFF3A	#FULLWIDTH LATIN CAPITAL LETTER Z
+0x8281	0xFF41	#FULLWIDTH LATIN SMALL LETTER A
+0x8282	0xFF42	#FULLWIDTH LATIN SMALL LETTER B
+0x8283	0xFF43	#FULLWIDTH LATIN SMALL LETTER C
+0x8284	0xFF44	#FULLWIDTH LATIN SMALL LETTER D
+0x8285	0xFF45	#FULLWIDTH LATIN SMALL LETTER E
+0x8286	0xFF46	#FULLWIDTH LATIN SMALL LETTER F
+0x8287	0xFF47	#FULLWIDTH LATIN SMALL LETTER G
+0x8288	0xFF48	#FULLWIDTH LATIN SMALL LETTER H
+0x8289	0xFF49	#FULLWIDTH LATIN SMALL LETTER I
+0x828A	0xFF4A	#FULLWIDTH LATIN SMALL LETTER J
+0x828B	0xFF4B	#FULLWIDTH LATIN SMALL LETTER K
+0x828C	0xFF4C	#FULLWIDTH LATIN SMALL LETTER L
+0x828D	0xFF4D	#FULLWIDTH LATIN SMALL LETTER M
+0x828E	0xFF4E	#FULLWIDTH LATIN SMALL LETTER N
+0x828F	0xFF4F	#FULLWIDTH LATIN SMALL LETTER O
+0x8290	0xFF50	#FULLWIDTH LATIN SMALL LETTER P
+0x8291	0xFF51	#FULLWIDTH LATIN SMALL LETTER Q
+0x8292	0xFF52	#FULLWIDTH LATIN SMALL LETTER R
+0x8293	0xFF53	#FULLWIDTH LATIN SMALL LETTER S
+0x8294	0xFF54	#FULLWIDTH LATIN SMALL LETTER T
+0x8295	0xFF55	#FULLWIDTH LATIN SMALL LETTER U
+0x8296	0xFF56	#FULLWIDTH LATIN SMALL LETTER V
+0x8297	0xFF57	#FULLWIDTH LATIN SMALL LETTER W
+0x8298	0xFF58	#FULLWIDTH LATIN SMALL LETTER X
+0x8299	0xFF59	#FULLWIDTH LATIN SMALL LETTER Y
+0x829A	0xFF5A	#FULLWIDTH LATIN SMALL LETTER Z
+0x829F	0x3041	#HIRAGANA LETTER SMALL A
+0x82A0	0x3042	#HIRAGANA LETTER A
+0x82A1	0x3043	#HIRAGANA LETTER SMALL I
+0x82A2	0x3044	#HIRAGANA LETTER I
+0x82A3	0x3045	#HIRAGANA LETTER SMALL U
+0x82A4	0x3046	#HIRAGANA LETTER U
+0x82A5	0x3047	#HIRAGANA LETTER SMALL E
+0x82A6	0x3048	#HIRAGANA LETTER E
+0x82A7	0x3049	#HIRAGANA LETTER SMALL O
+0x82A8	0x304A	#HIRAGANA LETTER O
+0x82A9	0x304B	#HIRAGANA LETTER KA
+0x82AA	0x304C	#HIRAGANA LETTER GA
+0x82AB	0x304D	#HIRAGANA LETTER KI
+0x82AC	0x304E	#HIRAGANA LETTER GI
+0x82AD	0x304F	#HIRAGANA LETTER KU
+0x82AE	0x3050	#HIRAGANA LETTER GU
+0x82AF	0x3051	#HIRAGANA LETTER KE
+0x82B0	0x3052	#HIRAGANA LETTER GE
+0x82B1	0x3053	#HIRAGANA LETTER KO
+0x82B2	0x3054	#HIRAGANA LETTER GO
+0x82B3	0x3055	#HIRAGANA LETTER SA
+0x82B4	0x3056	#HIRAGANA LETTER ZA
+0x82B5	0x3057	#HIRAGANA LETTER SI
+0x82B6	0x3058	#HIRAGANA LETTER ZI
+0x82B7	0x3059	#HIRAGANA LETTER SU
+0x82B8	0x305A	#HIRAGANA LETTER ZU
+0x82B9	0x305B	#HIRAGANA LETTER SE
+0x82BA	0x305C	#HIRAGANA LETTER ZE
+0x82BB	0x305D	#HIRAGANA LETTER SO
+0x82BC	0x305E	#HIRAGANA LETTER ZO
+0x82BD	0x305F	#HIRAGANA LETTER TA
+0x82BE	0x3060	#HIRAGANA LETTER DA
+0x82BF	0x3061	#HIRAGANA LETTER TI
+0x82C0	0x3062	#HIRAGANA LETTER DI
+0x82C1	0x3063	#HIRAGANA LETTER SMALL TU
+0x82C2	0x3064	#HIRAGANA LETTER TU
+0x82C3	0x3065	#HIRAGANA LETTER DU
+0x82C4	0x3066	#HIRAGANA LETTER TE
+0x82C5	0x3067	#HIRAGANA LETTER DE
+0x82C6	0x3068	#HIRAGANA LETTER TO
+0x82C7	0x3069	#HIRAGANA LETTER DO
+0x82C8	0x306A	#HIRAGANA LETTER NA
+0x82C9	0x306B	#HIRAGANA LETTER NI
+0x82CA	0x306C	#HIRAGANA LETTER NU
+0x82CB	0x306D	#HIRAGANA LETTER NE
+0x82CC	0x306E	#HIRAGANA LETTER NO
+0x82CD	0x306F	#HIRAGANA LETTER HA
+0x82CE	0x3070	#HIRAGANA LETTER BA
+0x82CF	0x3071	#HIRAGANA LETTER PA
+0x82D0	0x3072	#HIRAGANA LETTER HI
+0x82D1	0x3073	#HIRAGANA LETTER BI
+0x82D2	0x3074	#HIRAGANA LETTER PI
+0x82D3	0x3075	#HIRAGANA LETTER HU
+0x82D4	0x3076	#HIRAGANA LETTER BU
+0x82D5	0x3077	#HIRAGANA LETTER PU
+0x82D6	0x3078	#HIRAGANA LETTER HE
+0x82D7	0x3079	#HIRAGANA LETTER BE
+0x82D8	0x307A	#HIRAGANA LETTER PE
+0x82D9	0x307B	#HIRAGANA LETTER HO
+0x82DA	0x307C	#HIRAGANA LETTER BO
+0x82DB	0x307D	#HIRAGANA LETTER PO
+0x82DC	0x307E	#HIRAGANA LETTER MA
+0x82DD	0x307F	#HIRAGANA LETTER MI
+0x82DE	0x3080	#HIRAGANA LETTER MU
+0x82DF	0x3081	#HIRAGANA LETTER ME
+0x82E0	0x3082	#HIRAGANA LETTER MO
+0x82E1	0x3083	#HIRAGANA LETTER SMALL YA
+0x82E2	0x3084	#HIRAGANA LETTER YA
+0x82E3	0x3085	#HIRAGANA LETTER SMALL YU
+0x82E4	0x3086	#HIRAGANA LETTER YU
+0x82E5	0x3087	#HIRAGANA LETTER SMALL YO
+0x82E6	0x3088	#HIRAGANA LETTER YO
+0x82E7	0x3089	#HIRAGANA LETTER RA
+0x82E8	0x308A	#HIRAGANA LETTER RI
+0x82E9	0x308B	#HIRAGANA LETTER RU
+0x82EA	0x308C	#HIRAGANA LETTER RE
+0x82EB	0x308D	#HIRAGANA LETTER RO
+0x82EC	0x308E	#HIRAGANA LETTER SMALL WA
+0x82ED	0x308F	#HIRAGANA LETTER WA
+0x82EE	0x3090	#HIRAGANA LETTER WI
+0x82EF	0x3091	#HIRAGANA LETTER WE
+0x82F0	0x3092	#HIRAGANA LETTER WO
+0x82F1	0x3093	#HIRAGANA LETTER N
+0x8340	0x30A1	#KATAKANA LETTER SMALL A
+0x8341	0x30A2	#KATAKANA LETTER A
+0x8342	0x30A3	#KATAKANA LETTER SMALL I
+0x8343	0x30A4	#KATAKANA LETTER I
+0x8344	0x30A5	#KATAKANA LETTER SMALL U
+0x8345	0x30A6	#KATAKANA LETTER U
+0x8346	0x30A7	#KATAKANA LETTER SMALL E
+0x8347	0x30A8	#KATAKANA LETTER E
+0x8348	0x30A9	#KATAKANA LETTER SMALL O
+0x8349	0x30AA	#KATAKANA LETTER O
+0x834A	0x30AB	#KATAKANA LETTER KA
+0x834B	0x30AC	#KATAKANA LETTER GA
+0x834C	0x30AD	#KATAKANA LETTER KI
+0x834D	0x30AE	#KATAKANA LETTER GI
+0x834E	0x30AF	#KATAKANA LETTER KU
+0x834F	0x30B0	#KATAKANA LETTER GU
+0x8350	0x30B1	#KATAKANA LETTER KE
+0x8351	0x30B2	#KATAKANA LETTER GE
+0x8352	0x30B3	#KATAKANA LETTER KO
+0x8353	0x30B4	#KATAKANA LETTER GO
+0x8354	0x30B5	#KATAKANA LETTER SA
+0x8355	0x30B6	#KATAKANA LETTER ZA
+0x8356	0x30B7	#KATAKANA LETTER SI
+0x8357	0x30B8	#KATAKANA LETTER ZI
+0x8358	0x30B9	#KATAKANA LETTER SU
+0x8359	0x30BA	#KATAKANA LETTER ZU
+0x835A	0x30BB	#KATAKANA LETTER SE
+0x835B	0x30BC	#KATAKANA LETTER ZE
+0x835C	0x30BD	#KATAKANA LETTER SO
+0x835D	0x30BE	#KATAKANA LETTER ZO
+0x835E	0x30BF	#KATAKANA LETTER TA
+0x835F	0x30C0	#KATAKANA LETTER DA
+0x8360	0x30C1	#KATAKANA LETTER TI
+0x8361	0x30C2	#KATAKANA LETTER DI
+0x8362	0x30C3	#KATAKANA LETTER SMALL TU
+0x8363	0x30C4	#KATAKANA LETTER TU
+0x8364	0x30C5	#KATAKANA LETTER DU
+0x8365	0x30C6	#KATAKANA LETTER TE
+0x8366	0x30C7	#KATAKANA LETTER DE
+0x8367	0x30C8	#KATAKANA LETTER TO
+0x8368	0x30C9	#KATAKANA LETTER DO
+0x8369	0x30CA	#KATAKANA LETTER NA
+0x836A	0x30CB	#KATAKANA LETTER NI
+0x836B	0x30CC	#KATAKANA LETTER NU
+0x836C	0x30CD	#KATAKANA LETTER NE
+0x836D	0x30CE	#KATAKANA LETTER NO
+0x836E	0x30CF	#KATAKANA LETTER HA
+0x836F	0x30D0	#KATAKANA LETTER BA
+0x8370	0x30D1	#KATAKANA LETTER PA
+0x8371	0x30D2	#KATAKANA LETTER HI
+0x8372	0x30D3	#KATAKANA LETTER BI
+0x8373	0x30D4	#KATAKANA LETTER PI
+0x8374	0x30D5	#KATAKANA LETTER HU
+0x8375	0x30D6	#KATAKANA LETTER BU
+0x8376	0x30D7	#KATAKANA LETTER PU
+0x8377	0x30D8	#KATAKANA LETTER HE
+0x8378	0x30D9	#KATAKANA LETTER BE
+0x8379	0x30DA	#KATAKANA LETTER PE
+0x837A	0x30DB	#KATAKANA LETTER HO
+0x837B	0x30DC	#KATAKANA LETTER BO
+0x837C	0x30DD	#KATAKANA LETTER PO
+0x837D	0x30DE	#KATAKANA LETTER MA
+0x837E	0x30DF	#KATAKANA LETTER MI
+0x8380	0x30E0	#KATAKANA LETTER MU
+0x8381	0x30E1	#KATAKANA LETTER ME
+0x8382	0x30E2	#KATAKANA LETTER MO
+0x8383	0x30E3	#KATAKANA LETTER SMALL YA
+0x8384	0x30E4	#KATAKANA LETTER YA
+0x8385	0x30E5	#KATAKANA LETTER SMALL YU
+0x8386	0x30E6	#KATAKANA LETTER YU
+0x8387	0x30E7	#KATAKANA LETTER SMALL YO
+0x8388	0x30E8	#KATAKANA LETTER YO
+0x8389	0x30E9	#KATAKANA LETTER RA
+0x838A	0x30EA	#KATAKANA LETTER RI
+0x838B	0x30EB	#KATAKANA LETTER RU
+0x838C	0x30EC	#KATAKANA LETTER RE
+0x838D	0x30ED	#KATAKANA LETTER RO
+0x838E	0x30EE	#KATAKANA LETTER SMALL WA
+0x838F	0x30EF	#KATAKANA LETTER WA
+0x8390	0x30F0	#KATAKANA LETTER WI
+0x8391	0x30F1	#KATAKANA LETTER WE
+0x8392	0x30F2	#KATAKANA LETTER WO
+0x8393	0x30F3	#KATAKANA LETTER N
+0x8394	0x30F4	#KATAKANA LETTER VU
+0x8395	0x30F5	#KATAKANA LETTER SMALL KA
+0x8396	0x30F6	#KATAKANA LETTER SMALL KE
+0x839F	0x0391	#GREEK CAPITAL LETTER ALPHA
+0x83A0	0x0392	#GREEK CAPITAL LETTER BETA
+0x83A1	0x0393	#GREEK CAPITAL LETTER GAMMA
+0x83A2	0x0394	#GREEK CAPITAL LETTER DELTA
+0x83A3	0x0395	#GREEK CAPITAL LETTER EPSILON
+0x83A4	0x0396	#GREEK CAPITAL LETTER ZETA
+0x83A5	0x0397	#GREEK CAPITAL LETTER ETA
+0x83A6	0x0398	#GREEK CAPITAL LETTER THETA
+0x83A7	0x0399	#GREEK CAPITAL LETTER IOTA
+0x83A8	0x039A	#GREEK CAPITAL LETTER KAPPA
+0x83A9	0x039B	#GREEK CAPITAL LETTER LAMDA
+0x83AA	0x039C	#GREEK CAPITAL LETTER MU
+0x83AB	0x039D	#GREEK CAPITAL LETTER NU
+0x83AC	0x039E	#GREEK CAPITAL LETTER XI
+0x83AD	0x039F	#GREEK CAPITAL LETTER OMICRON
+0x83AE	0x03A0	#GREEK CAPITAL LETTER PI
+0x83AF	0x03A1	#GREEK CAPITAL LETTER RHO
+0x83B0	0x03A3	#GREEK CAPITAL LETTER SIGMA
+0x83B1	0x03A4	#GREEK CAPITAL LETTER TAU
+0x83B2	0x03A5	#GREEK CAPITAL LETTER UPSILON
+0x83B3	0x03A6	#GREEK CAPITAL LETTER PHI
+0x83B4	0x03A7	#GREEK CAPITAL LETTER CHI
+0x83B5	0x03A8	#GREEK CAPITAL LETTER PSI
+0x83B6	0x03A9	#GREEK CAPITAL LETTER OMEGA
+0x83BF	0x03B1	#GREEK SMALL LETTER ALPHA
+0x83C0	0x03B2	#GREEK SMALL LETTER BETA
+0x83C1	0x03B3	#GREEK SMALL LETTER GAMMA
+0x83C2	0x03B4	#GREEK SMALL LETTER DELTA
+0x83C3	0x03B5	#GREEK SMALL LETTER EPSILON
+0x83C4	0x03B6	#GREEK SMALL LETTER ZETA
+0x83C5	0x03B7	#GREEK SMALL LETTER ETA
+0x83C6	0x03B8	#GREEK SMALL LETTER THETA
+0x83C7	0x03B9	#GREEK SMALL LETTER IOTA
+0x83C8	0x03BA	#GREEK SMALL LETTER KAPPA
+0x83C9	0x03BB	#GREEK SMALL LETTER LAMDA
+0x83CA	0x03BC	#GREEK SMALL LETTER MU
+0x83CB	0x03BD	#GREEK SMALL LETTER NU
+0x83CC	0x03BE	#GREEK SMALL LETTER XI
+0x83CD	0x03BF	#GREEK SMALL LETTER OMICRON
+0x83CE	0x03C0	#GREEK SMALL LETTER PI
+0x83CF	0x03C1	#GREEK SMALL LETTER RHO
+0x83D0	0x03C3	#GREEK SMALL LETTER SIGMA
+0x83D1	0x03C4	#GREEK SMALL LETTER TAU
+0x83D2	0x03C5	#GREEK SMALL LETTER UPSILON
+0x83D3	0x03C6	#GREEK SMALL LETTER PHI
+0x83D4	0x03C7	#GREEK SMALL LETTER CHI
+0x83D5	0x03C8	#GREEK SMALL LETTER PSI
+0x83D6	0x03C9	#GREEK SMALL LETTER OMEGA
+0x8440	0x0410	#CYRILLIC CAPITAL LETTER A
+0x8441	0x0411	#CYRILLIC CAPITAL LETTER BE
+0x8442	0x0412	#CYRILLIC CAPITAL LETTER VE
+0x8443	0x0413	#CYRILLIC CAPITAL LETTER GHE
+0x8444	0x0414	#CYRILLIC CAPITAL LETTER DE
+0x8445	0x0415	#CYRILLIC CAPITAL LETTER IE
+0x8446	0x0401	#CYRILLIC CAPITAL LETTER IO
+0x8447	0x0416	#CYRILLIC CAPITAL LETTER ZHE
+0x8448	0x0417	#CYRILLIC CAPITAL LETTER ZE
+0x8449	0x0418	#CYRILLIC CAPITAL LETTER I
+0x844A	0x0419	#CYRILLIC CAPITAL LETTER SHORT I
+0x844B	0x041A	#CYRILLIC CAPITAL LETTER KA
+0x844C	0x041B	#CYRILLIC CAPITAL LETTER EL
+0x844D	0x041C	#CYRILLIC CAPITAL LETTER EM
+0x844E	0x041D	#CYRILLIC CAPITAL LETTER EN
+0x844F	0x041E	#CYRILLIC CAPITAL LETTER O
+0x8450	0x041F	#CYRILLIC CAPITAL LETTER PE
+0x8451	0x0420	#CYRILLIC CAPITAL LETTER ER
+0x8452	0x0421	#CYRILLIC CAPITAL LETTER ES
+0x8453	0x0422	#CYRILLIC CAPITAL LETTER TE
+0x8454	0x0423	#CYRILLIC CAPITAL LETTER U
+0x8455	0x0424	#CYRILLIC CAPITAL LETTER EF
+0x8456	0x0425	#CYRILLIC CAPITAL LETTER HA
+0x8457	0x0426	#CYRILLIC CAPITAL LETTER TSE
+0x8458	0x0427	#CYRILLIC CAPITAL LETTER CHE
+0x8459	0x0428	#CYRILLIC CAPITAL LETTER SHA
+0x845A	0x0429	#CYRILLIC CAPITAL LETTER SHCHA
+0x845B	0x042A	#CYRILLIC CAPITAL LETTER HARD SIGN
+0x845C	0x042B	#CYRILLIC CAPITAL LETTER YERU
+0x845D	0x042C	#CYRILLIC CAPITAL LETTER SOFT SIGN
+0x845E	0x042D	#CYRILLIC CAPITAL LETTER E
+0x845F	0x042E	#CYRILLIC CAPITAL LETTER YU
+0x8460	0x042F	#CYRILLIC CAPITAL LETTER YA
+0x8470	0x0430	#CYRILLIC SMALL LETTER A
+0x8471	0x0431	#CYRILLIC SMALL LETTER BE
+0x8472	0x0432	#CYRILLIC SMALL LETTER VE
+0x8473	0x0433	#CYRILLIC SMALL LETTER GHE
+0x8474	0x0434	#CYRILLIC SMALL LETTER DE
+0x8475	0x0435	#CYRILLIC SMALL LETTER IE
+0x8476	0x0451	#CYRILLIC SMALL LETTER IO
+0x8477	0x0436	#CYRILLIC SMALL LETTER ZHE
+0x8478	0x0437	#CYRILLIC SMALL LETTER ZE
+0x8479	0x0438	#CYRILLIC SMALL LETTER I
+0x847A	0x0439	#CYRILLIC SMALL LETTER SHORT I
+0x847B	0x043A	#CYRILLIC SMALL LETTER KA
+0x847C	0x043B	#CYRILLIC SMALL LETTER EL
+0x847D	0x043C	#CYRILLIC SMALL LETTER EM
+0x847E	0x043D	#CYRILLIC SMALL LETTER EN
+0x8480	0x043E	#CYRILLIC SMALL LETTER O
+0x8481	0x043F	#CYRILLIC SMALL LETTER PE
+0x8482	0x0440	#CYRILLIC SMALL LETTER ER
+0x8483	0x0441	#CYRILLIC SMALL LETTER ES
+0x8484	0x0442	#CYRILLIC SMALL LETTER TE
+0x8485	0x0443	#CYRILLIC SMALL LETTER U
+0x8486	0x0444	#CYRILLIC SMALL LETTER EF
+0x8487	0x0445	#CYRILLIC SMALL LETTER HA
+0x8488	0x0446	#CYRILLIC SMALL LETTER TSE
+0x8489	0x0447	#CYRILLIC SMALL LETTER CHE
+0x848A	0x0448	#CYRILLIC SMALL LETTER SHA
+0x848B	0x0449	#CYRILLIC SMALL LETTER SHCHA
+0x848C	0x044A	#CYRILLIC SMALL LETTER HARD SIGN
+0x848D	0x044B	#CYRILLIC SMALL LETTER YERU
+0x848E	0x044C	#CYRILLIC SMALL LETTER SOFT SIGN
+0x848F	0x044D	#CYRILLIC SMALL LETTER E
+0x8490	0x044E	#CYRILLIC SMALL LETTER YU
+0x8491	0x044F	#CYRILLIC SMALL LETTER YA
+0x849F	0x2500	#BOX DRAWINGS LIGHT HORIZONTAL
+0x84A0	0x2502	#BOX DRAWINGS LIGHT VERTICAL
+0x84A1	0x250C	#BOX DRAWINGS LIGHT DOWN AND RIGHT
+0x84A2	0x2510	#BOX DRAWINGS LIGHT DOWN AND LEFT
+0x84A3	0x2518	#BOX DRAWINGS LIGHT UP AND LEFT
+0x84A4	0x2514	#BOX DRAWINGS LIGHT UP AND RIGHT
+0x84A5	0x251C	#BOX DRAWINGS LIGHT VERTICAL AND RIGHT
+0x84A6	0x252C	#BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
+0x84A7	0x2524	#BOX DRAWINGS LIGHT VERTICAL AND LEFT
+0x84A8	0x2534	#BOX DRAWINGS LIGHT UP AND HORIZONTAL
+0x84A9	0x253C	#BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
+0x84AA	0x2501	#BOX DRAWINGS HEAVY HORIZONTAL
+0x84AB	0x2503	#BOX DRAWINGS HEAVY VERTICAL
+0x84AC	0x250F	#BOX DRAWINGS HEAVY DOWN AND RIGHT
+0x84AD	0x2513	#BOX DRAWINGS HEAVY DOWN AND LEFT
+0x84AE	0x251B	#BOX DRAWINGS HEAVY UP AND LEFT
+0x84AF	0x2517	#BOX DRAWINGS HEAVY UP AND RIGHT
+0x84B0	0x2523	#BOX DRAWINGS HEAVY VERTICAL AND RIGHT
+0x84B1	0x2533	#BOX DRAWINGS HEAVY DOWN AND HORIZONTAL
+0x84B2	0x252B	#BOX DRAWINGS HEAVY VERTICAL AND LEFT
+0x84B3	0x253B	#BOX DRAWINGS HEAVY UP AND HORIZONTAL
+0x84B4	0x254B	#BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL
+0x84B5	0x2520	#BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT
+0x84B6	0x252F	#BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY
+0x84B7	0x2528	#BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT
+0x84B8	0x2537	#BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY
+0x84B9	0x253F	#BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY
+0x84BA	0x251D	#BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY
+0x84BB	0x2530	#BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT
+0x84BC	0x2525	#BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY
+0x84BD	0x2538	#BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT
+0x84BE	0x2542	#BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT
+0x8740	0x2460	#CIRCLED DIGIT ONE
+0x8741	0x2461	#CIRCLED DIGIT TWO
+0x8742	0x2462	#CIRCLED DIGIT THREE
+0x8743	0x2463	#CIRCLED DIGIT FOUR
+0x8744	0x2464	#CIRCLED DIGIT FIVE
+0x8745	0x2465	#CIRCLED DIGIT SIX
+0x8746	0x2466	#CIRCLED DIGIT SEVEN
+0x8747	0x2467	#CIRCLED DIGIT EIGHT
+0x8748	0x2468	#CIRCLED DIGIT NINE
+0x8749	0x2469	#CIRCLED NUMBER TEN
+0x874A	0x246A	#CIRCLED NUMBER ELEVEN
+0x874B	0x246B	#CIRCLED NUMBER TWELVE
+0x874C	0x246C	#CIRCLED NUMBER THIRTEEN
+0x874D	0x246D	#CIRCLED NUMBER FOURTEEN
+0x874E	0x246E	#CIRCLED NUMBER FIFTEEN
+0x874F	0x246F	#CIRCLED NUMBER SIXTEEN
+0x8750	0x2470	#CIRCLED NUMBER SEVENTEEN
+0x8751	0x2471	#CIRCLED NUMBER EIGHTEEN
+0x8752	0x2472	#CIRCLED NUMBER NINETEEN
+0x8753	0x2473	#CIRCLED NUMBER TWENTY
+0x8754	0x2160	#ROMAN NUMERAL ONE
+0x8755	0x2161	#ROMAN NUMERAL TWO
+0x8756	0x2162	#ROMAN NUMERAL THREE
+0x8757	0x2163	#ROMAN NUMERAL FOUR
+0x8758	0x2164	#ROMAN NUMERAL FIVE
+0x8759	0x2165	#ROMAN NUMERAL SIX
+0x875A	0x2166	#ROMAN NUMERAL SEVEN
+0x875B	0x2167	#ROMAN NUMERAL EIGHT
+0x875C	0x2168	#ROMAN NUMERAL NINE
+0x875D	0x2169	#ROMAN NUMERAL TEN
+0x875F	0x3349	#SQUARE MIRI
+0x8760	0x3314	#SQUARE KIRO
+0x8761	0x3322	#SQUARE SENTI
+0x8762	0x334D	#SQUARE MEETORU
+0x8763	0x3318	#SQUARE GURAMU
+0x8764	0x3327	#SQUARE TON
+0x8765	0x3303	#SQUARE AARU
+0x8766	0x3336	#SQUARE HEKUTAARU
+0x8767	0x3351	#SQUARE RITTORU
+0x8768	0x3357	#SQUARE WATTO
+0x8769	0x330D	#SQUARE KARORII
+0x876A	0x3326	#SQUARE DORU
+0x876B	0x3323	#SQUARE SENTO
+0x876C	0x332B	#SQUARE PAASENTO
+0x876D	0x334A	#SQUARE MIRIBAARU
+0x876E	0x333B	#SQUARE PEEZI
+0x876F	0x339C	#SQUARE MM
+0x8770	0x339D	#SQUARE CM
+0x8771	0x339E	#SQUARE KM
+0x8772	0x338E	#SQUARE MG
+0x8773	0x338F	#SQUARE KG
+0x8774	0x33C4	#SQUARE CC
+0x8775	0x33A1	#SQUARE M SQUARED
+0x877E	0x337B	#SQUARE ERA NAME HEISEI
+0x8780	0x301D	#REVERSED DOUBLE PRIME QUOTATION MARK
+0x8781	0x301F	#LOW DOUBLE PRIME QUOTATION MARK
+0x8782	0x2116	#NUMERO SIGN
+0x8783	0x33CD	#SQUARE KK
+0x8784	0x2121	#TELEPHONE SIGN
+0x8785	0x32A4	#CIRCLED IDEOGRAPH HIGH
+0x8786	0x32A5	#CIRCLED IDEOGRAPH CENTRE
+0x8787	0x32A6	#CIRCLED IDEOGRAPH LOW
+0x8788	0x32A7	#CIRCLED IDEOGRAPH LEFT
+0x8789	0x32A8	#CIRCLED IDEOGRAPH RIGHT
+0x878A	0x3231	#PARENTHESIZED IDEOGRAPH STOCK
+0x878B	0x3232	#PARENTHESIZED IDEOGRAPH HAVE
+0x878C	0x3239	#PARENTHESIZED IDEOGRAPH REPRESENT
+0x878D	0x337E	#SQUARE ERA NAME MEIZI
+0x878E	0x337D	#SQUARE ERA NAME TAISYOU
+0x878F	0x337C	#SQUARE ERA NAME SYOUWA
+0x8790	0x2252	#APPROXIMATELY EQUAL TO OR THE IMAGE OF
+0x8791	0x2261	#IDENTICAL TO
+0x8792	0x222B	#INTEGRAL
+0x8793	0x222E	#CONTOUR INTEGRAL
+0x8794	0x2211	#N-ARY SUMMATION
+0x8795	0x221A	#SQUARE ROOT
+0x8796	0x22A5	#UP TACK
+0x8797	0x2220	#ANGLE
+0x8798	0x221F	#RIGHT ANGLE
+0x8799	0x22BF	#RIGHT TRIANGLE
+0x879A	0x2235	#BECAUSE
+0x879B	0x2229	#INTERSECTION
+0x879C	0x222A	#UNION
+0x889F	0x4E9C	#CJK UNIFIED IDEOGRAPH
+0x88A0	0x5516	#CJK UNIFIED IDEOGRAPH
+0x88A1	0x5A03	#CJK UNIFIED IDEOGRAPH
+0x88A2	0x963F	#CJK UNIFIED IDEOGRAPH
+0x88A3	0x54C0	#CJK UNIFIED IDEOGRAPH
+0x88A4	0x611B	#CJK UNIFIED IDEOGRAPH
+0x88A5	0x6328	#CJK UNIFIED IDEOGRAPH
+0x88A6	0x59F6	#CJK UNIFIED IDEOGRAPH
+0x88A7	0x9022	#CJK UNIFIED IDEOGRAPH
+0x88A8	0x8475	#CJK UNIFIED IDEOGRAPH
+0x88A9	0x831C	#CJK UNIFIED IDEOGRAPH
+0x88AA	0x7A50	#CJK UNIFIED IDEOGRAPH
+0x88AB	0x60AA	#CJK UNIFIED IDEOGRAPH
+0x88AC	0x63E1	#CJK UNIFIED IDEOGRAPH
+0x88AD	0x6E25	#CJK UNIFIED IDEOGRAPH
+0x88AE	0x65ED	#CJK UNIFIED IDEOGRAPH
+0x88AF	0x8466	#CJK UNIFIED IDEOGRAPH
+0x88B0	0x82A6	#CJK UNIFIED IDEOGRAPH
+0x88B1	0x9BF5	#CJK UNIFIED IDEOGRAPH
+0x88B2	0x6893	#CJK UNIFIED IDEOGRAPH
+0x88B3	0x5727	#CJK UNIFIED IDEOGRAPH
+0x88B4	0x65A1	#CJK UNIFIED IDEOGRAPH
+0x88B5	0x6271	#CJK UNIFIED IDEOGRAPH
+0x88B6	0x5B9B	#CJK UNIFIED IDEOGRAPH
+0x88B7	0x59D0	#CJK UNIFIED IDEOGRAPH
+0x88B8	0x867B	#CJK UNIFIED IDEOGRAPH
+0x88B9	0x98F4	#CJK UNIFIED IDEOGRAPH
+0x88BA	0x7D62	#CJK UNIFIED IDEOGRAPH
+0x88BB	0x7DBE	#CJK UNIFIED IDEOGRAPH
+0x88BC	0x9B8E	#CJK UNIFIED IDEOGRAPH
+0x88BD	0x6216	#CJK UNIFIED IDEOGRAPH
+0x88BE	0x7C9F	#CJK UNIFIED IDEOGRAPH
+0x88BF	0x88B7	#CJK UNIFIED IDEOGRAPH
+0x88C0	0x5B89	#CJK UNIFIED IDEOGRAPH
+0x88C1	0x5EB5	#CJK UNIFIED IDEOGRAPH
+0x88C2	0x6309	#CJK UNIFIED IDEOGRAPH
+0x88C3	0x6697	#CJK UNIFIED IDEOGRAPH
+0x88C4	0x6848	#CJK UNIFIED IDEOGRAPH
+0x88C5	0x95C7	#CJK UNIFIED IDEOGRAPH
+0x88C6	0x978D	#CJK UNIFIED IDEOGRAPH
+0x88C7	0x674F	#CJK UNIFIED IDEOGRAPH
+0x88C8	0x4EE5	#CJK UNIFIED IDEOGRAPH
+0x88C9	0x4F0A	#CJK UNIFIED IDEOGRAPH
+0x88CA	0x4F4D	#CJK UNIFIED IDEOGRAPH
+0x88CB	0x4F9D	#CJK UNIFIED IDEOGRAPH
+0x88CC	0x5049	#CJK UNIFIED IDEOGRAPH
+0x88CD	0x56F2	#CJK UNIFIED IDEOGRAPH
+0x88CE	0x5937	#CJK UNIFIED IDEOGRAPH
+0x88CF	0x59D4	#CJK UNIFIED IDEOGRAPH
+0x88D0	0x5A01	#CJK UNIFIED IDEOGRAPH
+0x88D1	0x5C09	#CJK UNIFIED IDEOGRAPH
+0x88D2	0x60DF	#CJK UNIFIED IDEOGRAPH
+0x88D3	0x610F	#CJK UNIFIED IDEOGRAPH
+0x88D4	0x6170	#CJK UNIFIED IDEOGRAPH
+0x88D5	0x6613	#CJK UNIFIED IDEOGRAPH
+0x88D6	0x6905	#CJK UNIFIED IDEOGRAPH
+0x88D7	0x70BA	#CJK UNIFIED IDEOGRAPH
+0x88D8	0x754F	#CJK UNIFIED IDEOGRAPH
+0x88D9	0x7570	#CJK UNIFIED IDEOGRAPH
+0x88DA	0x79FB	#CJK UNIFIED IDEOGRAPH
+0x88DB	0x7DAD	#CJK UNIFIED IDEOGRAPH
+0x88DC	0x7DEF	#CJK UNIFIED IDEOGRAPH
+0x88DD	0x80C3	#CJK UNIFIED IDEOGRAPH
+0x88DE	0x840E	#CJK UNIFIED IDEOGRAPH
+0x88DF	0x8863	#CJK UNIFIED IDEOGRAPH
+0x88E0	0x8B02	#CJK UNIFIED IDEOGRAPH
+0x88E1	0x9055	#CJK UNIFIED IDEOGRAPH
+0x88E2	0x907A	#CJK UNIFIED IDEOGRAPH
+0x88E3	0x533B	#CJK UNIFIED IDEOGRAPH
+0x88E4	0x4E95	#CJK UNIFIED IDEOGRAPH
+0x88E5	0x4EA5	#CJK UNIFIED IDEOGRAPH
+0x88E6	0x57DF	#CJK UNIFIED IDEOGRAPH
+0x88E7	0x80B2	#CJK UNIFIED IDEOGRAPH
+0x88E8	0x90C1	#CJK UNIFIED IDEOGRAPH
+0x88E9	0x78EF	#CJK UNIFIED IDEOGRAPH
+0x88EA	0x4E00	#CJK UNIFIED IDEOGRAPH
+0x88EB	0x58F1	#CJK UNIFIED IDEOGRAPH
+0x88EC	0x6EA2	#CJK UNIFIED IDEOGRAPH
+0x88ED	0x9038	#CJK UNIFIED IDEOGRAPH
+0x88EE	0x7A32	#CJK UNIFIED IDEOGRAPH
+0x88EF	0x8328	#CJK UNIFIED IDEOGRAPH
+0x88F0	0x828B	#CJK UNIFIED IDEOGRAPH
+0x88F1	0x9C2F	#CJK UNIFIED IDEOGRAPH
+0x88F2	0x5141	#CJK UNIFIED IDEOGRAPH
+0x88F3	0x5370	#CJK UNIFIED IDEOGRAPH
+0x88F4	0x54BD	#CJK UNIFIED IDEOGRAPH
+0x88F5	0x54E1	#CJK UNIFIED IDEOGRAPH
+0x88F6	0x56E0	#CJK UNIFIED IDEOGRAPH
+0x88F7	0x59FB	#CJK UNIFIED IDEOGRAPH
+0x88F8	0x5F15	#CJK UNIFIED IDEOGRAPH
+0x88F9	0x98F2	#CJK UNIFIED IDEOGRAPH
+0x88FA	0x6DEB	#CJK UNIFIED IDEOGRAPH
+0x88FB	0x80E4	#CJK UNIFIED IDEOGRAPH
+0x88FC	0x852D	#CJK UNIFIED IDEOGRAPH
+0x8940	0x9662	#CJK UNIFIED IDEOGRAPH
+0x8941	0x9670	#CJK UNIFIED IDEOGRAPH
+0x8942	0x96A0	#CJK UNIFIED IDEOGRAPH
+0x8943	0x97FB	#CJK UNIFIED IDEOGRAPH
+0x8944	0x540B	#CJK UNIFIED IDEOGRAPH
+0x8945	0x53F3	#CJK UNIFIED IDEOGRAPH
+0x8946	0x5B87	#CJK UNIFIED IDEOGRAPH
+0x8947	0x70CF	#CJK UNIFIED IDEOGRAPH
+0x8948	0x7FBD	#CJK UNIFIED IDEOGRAPH
+0x8949	0x8FC2	#CJK UNIFIED IDEOGRAPH
+0x894A	0x96E8	#CJK UNIFIED IDEOGRAPH
+0x894B	0x536F	#CJK UNIFIED IDEOGRAPH
+0x894C	0x9D5C	#CJK UNIFIED IDEOGRAPH
+0x894D	0x7ABA	#CJK UNIFIED IDEOGRAPH
+0x894E	0x4E11	#CJK UNIFIED IDEOGRAPH
+0x894F	0x7893	#CJK UNIFIED IDEOGRAPH
+0x8950	0x81FC	#CJK UNIFIED IDEOGRAPH
+0x8951	0x6E26	#CJK UNIFIED IDEOGRAPH
+0x8952	0x5618	#CJK UNIFIED IDEOGRAPH
+0x8953	0x5504	#CJK UNIFIED IDEOGRAPH
+0x8954	0x6B1D	#CJK UNIFIED IDEOGRAPH
+0x8955	0x851A	#CJK UNIFIED IDEOGRAPH
+0x8956	0x9C3B	#CJK UNIFIED IDEOGRAPH
+0x8957	0x59E5	#CJK UNIFIED IDEOGRAPH
+0x8958	0x53A9	#CJK UNIFIED IDEOGRAPH
+0x8959	0x6D66	#CJK UNIFIED IDEOGRAPH
+0x895A	0x74DC	#CJK UNIFIED IDEOGRAPH
+0x895B	0x958F	#CJK UNIFIED IDEOGRAPH
+0x895C	0x5642	#CJK UNIFIED IDEOGRAPH
+0x895D	0x4E91	#CJK UNIFIED IDEOGRAPH
+0x895E	0x904B	#CJK UNIFIED IDEOGRAPH
+0x895F	0x96F2	#CJK UNIFIED IDEOGRAPH
+0x8960	0x834F	#CJK UNIFIED IDEOGRAPH
+0x8961	0x990C	#CJK UNIFIED IDEOGRAPH
+0x8962	0x53E1	#CJK UNIFIED IDEOGRAPH
+0x8963	0x55B6	#CJK UNIFIED IDEOGRAPH
+0x8964	0x5B30	#CJK UNIFIED IDEOGRAPH
+0x8965	0x5F71	#CJK UNIFIED IDEOGRAPH
+0x8966	0x6620	#CJK UNIFIED IDEOGRAPH
+0x8967	0x66F3	#CJK UNIFIED IDEOGRAPH
+0x8968	0x6804	#CJK UNIFIED IDEOGRAPH
+0x8969	0x6C38	#CJK UNIFIED IDEOGRAPH
+0x896A	0x6CF3	#CJK UNIFIED IDEOGRAPH
+0x896B	0x6D29	#CJK UNIFIED IDEOGRAPH
+0x896C	0x745B	#CJK UNIFIED IDEOGRAPH
+0x896D	0x76C8	#CJK UNIFIED IDEOGRAPH
+0x896E	0x7A4E	#CJK UNIFIED IDEOGRAPH
+0x896F	0x9834	#CJK UNIFIED IDEOGRAPH
+0x8970	0x82F1	#CJK UNIFIED IDEOGRAPH
+0x8971	0x885B	#CJK UNIFIED IDEOGRAPH
+0x8972	0x8A60	#CJK UNIFIED IDEOGRAPH
+0x8973	0x92ED	#CJK UNIFIED IDEOGRAPH
+0x8974	0x6DB2	#CJK UNIFIED IDEOGRAPH
+0x8975	0x75AB	#CJK UNIFIED IDEOGRAPH
+0x8976	0x76CA	#CJK UNIFIED IDEOGRAPH
+0x8977	0x99C5	#CJK UNIFIED IDEOGRAPH
+0x8978	0x60A6	#CJK UNIFIED IDEOGRAPH
+0x8979	0x8B01	#CJK UNIFIED IDEOGRAPH
+0x897A	0x8D8A	#CJK UNIFIED IDEOGRAPH
+0x897B	0x95B2	#CJK UNIFIED IDEOGRAPH
+0x897C	0x698E	#CJK UNIFIED IDEOGRAPH
+0x897D	0x53AD	#CJK UNIFIED IDEOGRAPH
+0x897E	0x5186	#CJK UNIFIED IDEOGRAPH
+0x8980	0x5712	#CJK UNIFIED IDEOGRAPH
+0x8981	0x5830	#CJK UNIFIED IDEOGRAPH
+0x8982	0x5944	#CJK UNIFIED IDEOGRAPH
+0x8983	0x5BB4	#CJK UNIFIED IDEOGRAPH
+0x8984	0x5EF6	#CJK UNIFIED IDEOGRAPH
+0x8985	0x6028	#CJK UNIFIED IDEOGRAPH
+0x8986	0x63A9	#CJK UNIFIED IDEOGRAPH
+0x8987	0x63F4	#CJK UNIFIED IDEOGRAPH
+0x8988	0x6CBF	#CJK UNIFIED IDEOGRAPH
+0x8989	0x6F14	#CJK UNIFIED IDEOGRAPH
+0x898A	0x708E	#CJK UNIFIED IDEOGRAPH
+0x898B	0x7114	#CJK UNIFIED IDEOGRAPH
+0x898C	0x7159	#CJK UNIFIED IDEOGRAPH
+0x898D	0x71D5	#CJK UNIFIED IDEOGRAPH
+0x898E	0x733F	#CJK UNIFIED IDEOGRAPH
+0x898F	0x7E01	#CJK UNIFIED IDEOGRAPH
+0x8990	0x8276	#CJK UNIFIED IDEOGRAPH
+0x8991	0x82D1	#CJK UNIFIED IDEOGRAPH
+0x8992	0x8597	#CJK UNIFIED IDEOGRAPH
+0x8993	0x9060	#CJK UNIFIED IDEOGRAPH
+0x8994	0x925B	#CJK UNIFIED IDEOGRAPH
+0x8995	0x9D1B	#CJK UNIFIED IDEOGRAPH
+0x8996	0x5869	#CJK UNIFIED IDEOGRAPH
+0x8997	0x65BC	#CJK UNIFIED IDEOGRAPH
+0x8998	0x6C5A	#CJK UNIFIED IDEOGRAPH
+0x8999	0x7525	#CJK UNIFIED IDEOGRAPH
+0x899A	0x51F9	#CJK UNIFIED IDEOGRAPH
+0x899B	0x592E	#CJK UNIFIED IDEOGRAPH
+0x899C	0x5965	#CJK UNIFIED IDEOGRAPH
+0x899D	0x5F80	#CJK UNIFIED IDEOGRAPH
+0x899E	0x5FDC	#CJK UNIFIED IDEOGRAPH
+0x899F	0x62BC	#CJK UNIFIED IDEOGRAPH
+0x89A0	0x65FA	#CJK UNIFIED IDEOGRAPH
+0x89A1	0x6A2A	#CJK UNIFIED IDEOGRAPH
+0x89A2	0x6B27	#CJK UNIFIED IDEOGRAPH
+0x89A3	0x6BB4	#CJK UNIFIED IDEOGRAPH
+0x89A4	0x738B	#CJK UNIFIED IDEOGRAPH
+0x89A5	0x7FC1	#CJK UNIFIED IDEOGRAPH
+0x89A6	0x8956	#CJK UNIFIED IDEOGRAPH
+0x89A7	0x9D2C	#CJK UNIFIED IDEOGRAPH
+0x89A8	0x9D0E	#CJK UNIFIED IDEOGRAPH
+0x89A9	0x9EC4	#CJK UNIFIED IDEOGRAPH
+0x89AA	0x5CA1	#CJK UNIFIED IDEOGRAPH
+0x89AB	0x6C96	#CJK UNIFIED IDEOGRAPH
+0x89AC	0x837B	#CJK UNIFIED IDEOGRAPH
+0x89AD	0x5104	#CJK UNIFIED IDEOGRAPH
+0x89AE	0x5C4B	#CJK UNIFIED IDEOGRAPH
+0x89AF	0x61B6	#CJK UNIFIED IDEOGRAPH
+0x89B0	0x81C6	#CJK UNIFIED IDEOGRAPH
+0x89B1	0x6876	#CJK UNIFIED IDEOGRAPH
+0x89B2	0x7261	#CJK UNIFIED IDEOGRAPH
+0x89B3	0x4E59	#CJK UNIFIED IDEOGRAPH
+0x89B4	0x4FFA	#CJK UNIFIED IDEOGRAPH
+0x89B5	0x5378	#CJK UNIFIED IDEOGRAPH
+0x89B6	0x6069	#CJK UNIFIED IDEOGRAPH
+0x89B7	0x6E29	#CJK UNIFIED IDEOGRAPH
+0x89B8	0x7A4F	#CJK UNIFIED IDEOGRAPH
+0x89B9	0x97F3	#CJK UNIFIED IDEOGRAPH
+0x89BA	0x4E0B	#CJK UNIFIED IDEOGRAPH
+0x89BB	0x5316	#CJK UNIFIED IDEOGRAPH
+0x89BC	0x4EEE	#CJK UNIFIED IDEOGRAPH
+0x89BD	0x4F55	#CJK UNIFIED IDEOGRAPH
+0x89BE	0x4F3D	#CJK UNIFIED IDEOGRAPH
+0x89BF	0x4FA1	#CJK UNIFIED IDEOGRAPH
+0x89C0	0x4F73	#CJK UNIFIED IDEOGRAPH
+0x89C1	0x52A0	#CJK UNIFIED IDEOGRAPH
+0x89C2	0x53EF	#CJK UNIFIED IDEOGRAPH
+0x89C3	0x5609	#CJK UNIFIED IDEOGRAPH
+0x89C4	0x590F	#CJK UNIFIED IDEOGRAPH
+0x89C5	0x5AC1	#CJK UNIFIED IDEOGRAPH
+0x89C6	0x5BB6	#CJK UNIFIED IDEOGRAPH
+0x89C7	0x5BE1	#CJK UNIFIED IDEOGRAPH
+0x89C8	0x79D1	#CJK UNIFIED IDEOGRAPH
+0x89C9	0x6687	#CJK UNIFIED IDEOGRAPH
+0x89CA	0x679C	#CJK UNIFIED IDEOGRAPH
+0x89CB	0x67B6	#CJK UNIFIED IDEOGRAPH
+0x89CC	0x6B4C	#CJK UNIFIED IDEOGRAPH
+0x89CD	0x6CB3	#CJK UNIFIED IDEOGRAPH
+0x89CE	0x706B	#CJK UNIFIED IDEOGRAPH
+0x89CF	0x73C2	#CJK UNIFIED IDEOGRAPH
+0x89D0	0x798D	#CJK UNIFIED IDEOGRAPH
+0x89D1	0x79BE	#CJK UNIFIED IDEOGRAPH
+0x89D2	0x7A3C	#CJK UNIFIED IDEOGRAPH
+0x89D3	0x7B87	#CJK UNIFIED IDEOGRAPH
+0x89D4	0x82B1	#CJK UNIFIED IDEOGRAPH
+0x89D5	0x82DB	#CJK UNIFIED IDEOGRAPH
+0x89D6	0x8304	#CJK UNIFIED IDEOGRAPH
+0x89D7	0x8377	#CJK UNIFIED IDEOGRAPH
+0x89D8	0x83EF	#CJK UNIFIED IDEOGRAPH
+0x89D9	0x83D3	#CJK UNIFIED IDEOGRAPH
+0x89DA	0x8766	#CJK UNIFIED IDEOGRAPH
+0x89DB	0x8AB2	#CJK UNIFIED IDEOGRAPH
+0x89DC	0x5629	#CJK UNIFIED IDEOGRAPH
+0x89DD	0x8CA8	#CJK UNIFIED IDEOGRAPH
+0x89DE	0x8FE6	#CJK UNIFIED IDEOGRAPH
+0x89DF	0x904E	#CJK UNIFIED IDEOGRAPH
+0x89E0	0x971E	#CJK UNIFIED IDEOGRAPH
+0x89E1	0x868A	#CJK UNIFIED IDEOGRAPH
+0x89E2	0x4FC4	#CJK UNIFIED IDEOGRAPH
+0x89E3	0x5CE8	#CJK UNIFIED IDEOGRAPH
+0x89E4	0x6211	#CJK UNIFIED IDEOGRAPH
+0x89E5	0x7259	#CJK UNIFIED IDEOGRAPH
+0x89E6	0x753B	#CJK UNIFIED IDEOGRAPH
+0x89E7	0x81E5	#CJK UNIFIED IDEOGRAPH
+0x89E8	0x82BD	#CJK UNIFIED IDEOGRAPH
+0x89E9	0x86FE	#CJK UNIFIED IDEOGRAPH
+0x89EA	0x8CC0	#CJK UNIFIED IDEOGRAPH
+0x89EB	0x96C5	#CJK UNIFIED IDEOGRAPH
+0x89EC	0x9913	#CJK UNIFIED IDEOGRAPH
+0x89ED	0x99D5	#CJK UNIFIED IDEOGRAPH
+0x89EE	0x4ECB	#CJK UNIFIED IDEOGRAPH
+0x89EF	0x4F1A	#CJK UNIFIED IDEOGRAPH
+0x89F0	0x89E3	#CJK UNIFIED IDEOGRAPH
+0x89F1	0x56DE	#CJK UNIFIED IDEOGRAPH
+0x89F2	0x584A	#CJK UNIFIED IDEOGRAPH
+0x89F3	0x58CA	#CJK UNIFIED IDEOGRAPH
+0x89F4	0x5EFB	#CJK UNIFIED IDEOGRAPH
+0x89F5	0x5FEB	#CJK UNIFIED IDEOGRAPH
+0x89F6	0x602A	#CJK UNIFIED IDEOGRAPH
+0x89F7	0x6094	#CJK UNIFIED IDEOGRAPH
+0x89F8	0x6062	#CJK UNIFIED IDEOGRAPH
+0x89F9	0x61D0	#CJK UNIFIED IDEOGRAPH
+0x89FA	0x6212	#CJK UNIFIED IDEOGRAPH
+0x89FB	0x62D0	#CJK UNIFIED IDEOGRAPH
+0x89FC	0x6539	#CJK UNIFIED IDEOGRAPH
+0x8A40	0x9B41	#CJK UNIFIED IDEOGRAPH
+0x8A41	0x6666	#CJK UNIFIED IDEOGRAPH
+0x8A42	0x68B0	#CJK UNIFIED IDEOGRAPH
+0x8A43	0x6D77	#CJK UNIFIED IDEOGRAPH
+0x8A44	0x7070	#CJK UNIFIED IDEOGRAPH
+0x8A45	0x754C	#CJK UNIFIED IDEOGRAPH
+0x8A46	0x7686	#CJK UNIFIED IDEOGRAPH
+0x8A47	0x7D75	#CJK UNIFIED IDEOGRAPH
+0x8A48	0x82A5	#CJK UNIFIED IDEOGRAPH
+0x8A49	0x87F9	#CJK UNIFIED IDEOGRAPH
+0x8A4A	0x958B	#CJK UNIFIED IDEOGRAPH
+0x8A4B	0x968E	#CJK UNIFIED IDEOGRAPH
+0x8A4C	0x8C9D	#CJK UNIFIED IDEOGRAPH
+0x8A4D	0x51F1	#CJK UNIFIED IDEOGRAPH
+0x8A4E	0x52BE	#CJK UNIFIED IDEOGRAPH
+0x8A4F	0x5916	#CJK UNIFIED IDEOGRAPH
+0x8A50	0x54B3	#CJK UNIFIED IDEOGRAPH
+0x8A51	0x5BB3	#CJK UNIFIED IDEOGRAPH
+0x8A52	0x5D16	#CJK UNIFIED IDEOGRAPH
+0x8A53	0x6168	#CJK UNIFIED IDEOGRAPH
+0x8A54	0x6982	#CJK UNIFIED IDEOGRAPH
+0x8A55	0x6DAF	#CJK UNIFIED IDEOGRAPH
+0x8A56	0x788D	#CJK UNIFIED IDEOGRAPH
+0x8A57	0x84CB	#CJK UNIFIED IDEOGRAPH
+0x8A58	0x8857	#CJK UNIFIED IDEOGRAPH
+0x8A59	0x8A72	#CJK UNIFIED IDEOGRAPH
+0x8A5A	0x93A7	#CJK UNIFIED IDEOGRAPH
+0x8A5B	0x9AB8	#CJK UNIFIED IDEOGRAPH
+0x8A5C	0x6D6C	#CJK UNIFIED IDEOGRAPH
+0x8A5D	0x99A8	#CJK UNIFIED IDEOGRAPH
+0x8A5E	0x86D9	#CJK UNIFIED IDEOGRAPH
+0x8A5F	0x57A3	#CJK UNIFIED IDEOGRAPH
+0x8A60	0x67FF	#CJK UNIFIED IDEOGRAPH
+0x8A61	0x86CE	#CJK UNIFIED IDEOGRAPH
+0x8A62	0x920E	#CJK UNIFIED IDEOGRAPH
+0x8A63	0x5283	#CJK UNIFIED IDEOGRAPH
+0x8A64	0x5687	#CJK UNIFIED IDEOGRAPH
+0x8A65	0x5404	#CJK UNIFIED IDEOGRAPH
+0x8A66	0x5ED3	#CJK UNIFIED IDEOGRAPH
+0x8A67	0x62E1	#CJK UNIFIED IDEOGRAPH
+0x8A68	0x64B9	#CJK UNIFIED IDEOGRAPH
+0x8A69	0x683C	#CJK UNIFIED IDEOGRAPH
+0x8A6A	0x6838	#CJK UNIFIED IDEOGRAPH
+0x8A6B	0x6BBB	#CJK UNIFIED IDEOGRAPH
+0x8A6C	0x7372	#CJK UNIFIED IDEOGRAPH
+0x8A6D	0x78BA	#CJK UNIFIED IDEOGRAPH
+0x8A6E	0x7A6B	#CJK UNIFIED IDEOGRAPH
+0x8A6F	0x899A	#CJK UNIFIED IDEOGRAPH
+0x8A70	0x89D2	#CJK UNIFIED IDEOGRAPH
+0x8A71	0x8D6B	#CJK UNIFIED IDEOGRAPH
+0x8A72	0x8F03	#CJK UNIFIED IDEOGRAPH
+0x8A73	0x90ED	#CJK UNIFIED IDEOGRAPH
+0x8A74	0x95A3	#CJK UNIFIED IDEOGRAPH
+0x8A75	0x9694	#CJK UNIFIED IDEOGRAPH
+0x8A76	0x9769	#CJK UNIFIED IDEOGRAPH
+0x8A77	0x5B66	#CJK UNIFIED IDEOGRAPH
+0x8A78	0x5CB3	#CJK UNIFIED IDEOGRAPH
+0x8A79	0x697D	#CJK UNIFIED IDEOGRAPH
+0x8A7A	0x984D	#CJK UNIFIED IDEOGRAPH
+0x8A7B	0x984E	#CJK UNIFIED IDEOGRAPH
+0x8A7C	0x639B	#CJK UNIFIED IDEOGRAPH
+0x8A7D	0x7B20	#CJK UNIFIED IDEOGRAPH
+0x8A7E	0x6A2B	#CJK UNIFIED IDEOGRAPH
+0x8A80	0x6A7F	#CJK UNIFIED IDEOGRAPH
+0x8A81	0x68B6	#CJK UNIFIED IDEOGRAPH
+0x8A82	0x9C0D	#CJK UNIFIED IDEOGRAPH
+0x8A83	0x6F5F	#CJK UNIFIED IDEOGRAPH
+0x8A84	0x5272	#CJK UNIFIED IDEOGRAPH
+0x8A85	0x559D	#CJK UNIFIED IDEOGRAPH
+0x8A86	0x6070	#CJK UNIFIED IDEOGRAPH
+0x8A87	0x62EC	#CJK UNIFIED IDEOGRAPH
+0x8A88	0x6D3B	#CJK UNIFIED IDEOGRAPH
+0x8A89	0x6E07	#CJK UNIFIED IDEOGRAPH
+0x8A8A	0x6ED1	#CJK UNIFIED IDEOGRAPH
+0x8A8B	0x845B	#CJK UNIFIED IDEOGRAPH
+0x8A8C	0x8910	#CJK UNIFIED IDEOGRAPH
+0x8A8D	0x8F44	#CJK UNIFIED IDEOGRAPH
+0x8A8E	0x4E14	#CJK UNIFIED IDEOGRAPH
+0x8A8F	0x9C39	#CJK UNIFIED IDEOGRAPH
+0x8A90	0x53F6	#CJK UNIFIED IDEOGRAPH
+0x8A91	0x691B	#CJK UNIFIED IDEOGRAPH
+0x8A92	0x6A3A	#CJK UNIFIED IDEOGRAPH
+0x8A93	0x9784	#CJK UNIFIED IDEOGRAPH
+0x8A94	0x682A	#CJK UNIFIED IDEOGRAPH
+0x8A95	0x515C	#CJK UNIFIED IDEOGRAPH
+0x8A96	0x7AC3	#CJK UNIFIED IDEOGRAPH
+0x8A97	0x84B2	#CJK UNIFIED IDEOGRAPH
+0x8A98	0x91DC	#CJK UNIFIED IDEOGRAPH
+0x8A99	0x938C	#CJK UNIFIED IDEOGRAPH
+0x8A9A	0x565B	#CJK UNIFIED IDEOGRAPH
+0x8A9B	0x9D28	#CJK UNIFIED IDEOGRAPH
+0x8A9C	0x6822	#CJK UNIFIED IDEOGRAPH
+0x8A9D	0x8305	#CJK UNIFIED IDEOGRAPH
+0x8A9E	0x8431	#CJK UNIFIED IDEOGRAPH
+0x8A9F	0x7CA5	#CJK UNIFIED IDEOGRAPH
+0x8AA0	0x5208	#CJK UNIFIED IDEOGRAPH
+0x8AA1	0x82C5	#CJK UNIFIED IDEOGRAPH
+0x8AA2	0x74E6	#CJK UNIFIED IDEOGRAPH
+0x8AA3	0x4E7E	#CJK UNIFIED IDEOGRAPH
+0x8AA4	0x4F83	#CJK UNIFIED IDEOGRAPH
+0x8AA5	0x51A0	#CJK UNIFIED IDEOGRAPH
+0x8AA6	0x5BD2	#CJK UNIFIED IDEOGRAPH
+0x8AA7	0x520A	#CJK UNIFIED IDEOGRAPH
+0x8AA8	0x52D8	#CJK UNIFIED IDEOGRAPH
+0x8AA9	0x52E7	#CJK UNIFIED IDEOGRAPH
+0x8AAA	0x5DFB	#CJK UNIFIED IDEOGRAPH
+0x8AAB	0x559A	#CJK UNIFIED IDEOGRAPH
+0x8AAC	0x582A	#CJK UNIFIED IDEOGRAPH
+0x8AAD	0x59E6	#CJK UNIFIED IDEOGRAPH
+0x8AAE	0x5B8C	#CJK UNIFIED IDEOGRAPH
+0x8AAF	0x5B98	#CJK UNIFIED IDEOGRAPH
+0x8AB0	0x5BDB	#CJK UNIFIED IDEOGRAPH
+0x8AB1	0x5E72	#CJK UNIFIED IDEOGRAPH
+0x8AB2	0x5E79	#CJK UNIFIED IDEOGRAPH
+0x8AB3	0x60A3	#CJK UNIFIED IDEOGRAPH
+0x8AB4	0x611F	#CJK UNIFIED IDEOGRAPH
+0x8AB5	0x6163	#CJK UNIFIED IDEOGRAPH
+0x8AB6	0x61BE	#CJK UNIFIED IDEOGRAPH
+0x8AB7	0x63DB	#CJK UNIFIED IDEOGRAPH
+0x8AB8	0x6562	#CJK UNIFIED IDEOGRAPH
+0x8AB9	0x67D1	#CJK UNIFIED IDEOGRAPH
+0x8ABA	0x6853	#CJK UNIFIED IDEOGRAPH
+0x8ABB	0x68FA	#CJK UNIFIED IDEOGRAPH
+0x8ABC	0x6B3E	#CJK UNIFIED IDEOGRAPH
+0x8ABD	0x6B53	#CJK UNIFIED IDEOGRAPH
+0x8ABE	0x6C57	#CJK UNIFIED IDEOGRAPH
+0x8ABF	0x6F22	#CJK UNIFIED IDEOGRAPH
+0x8AC0	0x6F97	#CJK UNIFIED IDEOGRAPH
+0x8AC1	0x6F45	#CJK UNIFIED IDEOGRAPH
+0x8AC2	0x74B0	#CJK UNIFIED IDEOGRAPH
+0x8AC3	0x7518	#CJK UNIFIED IDEOGRAPH
+0x8AC4	0x76E3	#CJK UNIFIED IDEOGRAPH
+0x8AC5	0x770B	#CJK UNIFIED IDEOGRAPH
+0x8AC6	0x7AFF	#CJK UNIFIED IDEOGRAPH
+0x8AC7	0x7BA1	#CJK UNIFIED IDEOGRAPH
+0x8AC8	0x7C21	#CJK UNIFIED IDEOGRAPH
+0x8AC9	0x7DE9	#CJK UNIFIED IDEOGRAPH
+0x8ACA	0x7F36	#CJK UNIFIED IDEOGRAPH
+0x8ACB	0x7FF0	#CJK UNIFIED IDEOGRAPH
+0x8ACC	0x809D	#CJK UNIFIED IDEOGRAPH
+0x8ACD	0x8266	#CJK UNIFIED IDEOGRAPH
+0x8ACE	0x839E	#CJK UNIFIED IDEOGRAPH
+0x8ACF	0x89B3	#CJK UNIFIED IDEOGRAPH
+0x8AD0	0x8ACC	#CJK UNIFIED IDEOGRAPH
+0x8AD1	0x8CAB	#CJK UNIFIED IDEOGRAPH
+0x8AD2	0x9084	#CJK UNIFIED IDEOGRAPH
+0x8AD3	0x9451	#CJK UNIFIED IDEOGRAPH
+0x8AD4	0x9593	#CJK UNIFIED IDEOGRAPH
+0x8AD5	0x9591	#CJK UNIFIED IDEOGRAPH
+0x8AD6	0x95A2	#CJK UNIFIED IDEOGRAPH
+0x8AD7	0x9665	#CJK UNIFIED IDEOGRAPH
+0x8AD8	0x97D3	#CJK UNIFIED IDEOGRAPH
+0x8AD9	0x9928	#CJK UNIFIED IDEOGRAPH
+0x8ADA	0x8218	#CJK UNIFIED IDEOGRAPH
+0x8ADB	0x4E38	#CJK UNIFIED IDEOGRAPH
+0x8ADC	0x542B	#CJK UNIFIED IDEOGRAPH
+0x8ADD	0x5CB8	#CJK UNIFIED IDEOGRAPH
+0x8ADE	0x5DCC	#CJK UNIFIED IDEOGRAPH
+0x8ADF	0x73A9	#CJK UNIFIED IDEOGRAPH
+0x8AE0	0x764C	#CJK UNIFIED IDEOGRAPH
+0x8AE1	0x773C	#CJK UNIFIED IDEOGRAPH
+0x8AE2	0x5CA9	#CJK UNIFIED IDEOGRAPH
+0x8AE3	0x7FEB	#CJK UNIFIED IDEOGRAPH
+0x8AE4	0x8D0B	#CJK UNIFIED IDEOGRAPH
+0x8AE5	0x96C1	#CJK UNIFIED IDEOGRAPH
+0x8AE6	0x9811	#CJK UNIFIED IDEOGRAPH
+0x8AE7	0x9854	#CJK UNIFIED IDEOGRAPH
+0x8AE8	0x9858	#CJK UNIFIED IDEOGRAPH
+0x8AE9	0x4F01	#CJK UNIFIED IDEOGRAPH
+0x8AEA	0x4F0E	#CJK UNIFIED IDEOGRAPH
+0x8AEB	0x5371	#CJK UNIFIED IDEOGRAPH
+0x8AEC	0x559C	#CJK UNIFIED IDEOGRAPH
+0x8AED	0x5668	#CJK UNIFIED IDEOGRAPH
+0x8AEE	0x57FA	#CJK UNIFIED IDEOGRAPH
+0x8AEF	0x5947	#CJK UNIFIED IDEOGRAPH
+0x8AF0	0x5B09	#CJK UNIFIED IDEOGRAPH
+0x8AF1	0x5BC4	#CJK UNIFIED IDEOGRAPH
+0x8AF2	0x5C90	#CJK UNIFIED IDEOGRAPH
+0x8AF3	0x5E0C	#CJK UNIFIED IDEOGRAPH
+0x8AF4	0x5E7E	#CJK UNIFIED IDEOGRAPH
+0x8AF5	0x5FCC	#CJK UNIFIED IDEOGRAPH
+0x8AF6	0x63EE	#CJK UNIFIED IDEOGRAPH
+0x8AF7	0x673A	#CJK UNIFIED IDEOGRAPH
+0x8AF8	0x65D7	#CJK UNIFIED IDEOGRAPH
+0x8AF9	0x65E2	#CJK UNIFIED IDEOGRAPH
+0x8AFA	0x671F	#CJK UNIFIED IDEOGRAPH
+0x8AFB	0x68CB	#CJK UNIFIED IDEOGRAPH
+0x8AFC	0x68C4	#CJK UNIFIED IDEOGRAPH
+0x8B40	0x6A5F	#CJK UNIFIED IDEOGRAPH
+0x8B41	0x5E30	#CJK UNIFIED IDEOGRAPH
+0x8B42	0x6BC5	#CJK UNIFIED IDEOGRAPH
+0x8B43	0x6C17	#CJK UNIFIED IDEOGRAPH
+0x8B44	0x6C7D	#CJK UNIFIED IDEOGRAPH
+0x8B45	0x757F	#CJK UNIFIED IDEOGRAPH
+0x8B46	0x7948	#CJK UNIFIED IDEOGRAPH
+0x8B47	0x5B63	#CJK UNIFIED IDEOGRAPH
+0x8B48	0x7A00	#CJK UNIFIED IDEOGRAPH
+0x8B49	0x7D00	#CJK UNIFIED IDEOGRAPH
+0x8B4A	0x5FBD	#CJK UNIFIED IDEOGRAPH
+0x8B4B	0x898F	#CJK UNIFIED IDEOGRAPH
+0x8B4C	0x8A18	#CJK UNIFIED IDEOGRAPH
+0x8B4D	0x8CB4	#CJK UNIFIED IDEOGRAPH
+0x8B4E	0x8D77	#CJK UNIFIED IDEOGRAPH
+0x8B4F	0x8ECC	#CJK UNIFIED IDEOGRAPH
+0x8B50	0x8F1D	#CJK UNIFIED IDEOGRAPH
+0x8B51	0x98E2	#CJK UNIFIED IDEOGRAPH
+0x8B52	0x9A0E	#CJK UNIFIED IDEOGRAPH
+0x8B53	0x9B3C	#CJK UNIFIED IDEOGRAPH
+0x8B54	0x4E80	#CJK UNIFIED IDEOGRAPH
+0x8B55	0x507D	#CJK UNIFIED IDEOGRAPH
+0x8B56	0x5100	#CJK UNIFIED IDEOGRAPH
+0x8B57	0x5993	#CJK UNIFIED IDEOGRAPH
+0x8B58	0x5B9C	#CJK UNIFIED IDEOGRAPH
+0x8B59	0x622F	#CJK UNIFIED IDEOGRAPH
+0x8B5A	0x6280	#CJK UNIFIED IDEOGRAPH
+0x8B5B	0x64EC	#CJK UNIFIED IDEOGRAPH
+0x8B5C	0x6B3A	#CJK UNIFIED IDEOGRAPH
+0x8B5D	0x72A0	#CJK UNIFIED IDEOGRAPH
+0x8B5E	0x7591	#CJK UNIFIED IDEOGRAPH
+0x8B5F	0x7947	#CJK UNIFIED IDEOGRAPH
+0x8B60	0x7FA9	#CJK UNIFIED IDEOGRAPH
+0x8B61	0x87FB	#CJK UNIFIED IDEOGRAPH
+0x8B62	0x8ABC	#CJK UNIFIED IDEOGRAPH
+0x8B63	0x8B70	#CJK UNIFIED IDEOGRAPH
+0x8B64	0x63AC	#CJK UNIFIED IDEOGRAPH
+0x8B65	0x83CA	#CJK UNIFIED IDEOGRAPH
+0x8B66	0x97A0	#CJK UNIFIED IDEOGRAPH
+0x8B67	0x5409	#CJK UNIFIED IDEOGRAPH
+0x8B68	0x5403	#CJK UNIFIED IDEOGRAPH
+0x8B69	0x55AB	#CJK UNIFIED IDEOGRAPH
+0x8B6A	0x6854	#CJK UNIFIED IDEOGRAPH
+0x8B6B	0x6A58	#CJK UNIFIED IDEOGRAPH
+0x8B6C	0x8A70	#CJK UNIFIED IDEOGRAPH
+0x8B6D	0x7827	#CJK UNIFIED IDEOGRAPH
+0x8B6E	0x6775	#CJK UNIFIED IDEOGRAPH
+0x8B6F	0x9ECD	#CJK UNIFIED IDEOGRAPH
+0x8B70	0x5374	#CJK UNIFIED IDEOGRAPH
+0x8B71	0x5BA2	#CJK UNIFIED IDEOGRAPH
+0x8B72	0x811A	#CJK UNIFIED IDEOGRAPH
+0x8B73	0x8650	#CJK UNIFIED IDEOGRAPH
+0x8B74	0x9006	#CJK UNIFIED IDEOGRAPH
+0x8B75	0x4E18	#CJK UNIFIED IDEOGRAPH
+0x8B76	0x4E45	#CJK UNIFIED IDEOGRAPH
+0x8B77	0x4EC7	#CJK UNIFIED IDEOGRAPH
+0x8B78	0x4F11	#CJK UNIFIED IDEOGRAPH
+0x8B79	0x53CA	#CJK UNIFIED IDEOGRAPH
+0x8B7A	0x5438	#CJK UNIFIED IDEOGRAPH
+0x8B7B	0x5BAE	#CJK UNIFIED IDEOGRAPH
+0x8B7C	0x5F13	#CJK UNIFIED IDEOGRAPH
+0x8B7D	0x6025	#CJK UNIFIED IDEOGRAPH
+0x8B7E	0x6551	#CJK UNIFIED IDEOGRAPH
+0x8B80	0x673D	#CJK UNIFIED IDEOGRAPH
+0x8B81	0x6C42	#CJK UNIFIED IDEOGRAPH
+0x8B82	0x6C72	#CJK UNIFIED IDEOGRAPH
+0x8B83	0x6CE3	#CJK UNIFIED IDEOGRAPH
+0x8B84	0x7078	#CJK UNIFIED IDEOGRAPH
+0x8B85	0x7403	#CJK UNIFIED IDEOGRAPH
+0x8B86	0x7A76	#CJK UNIFIED IDEOGRAPH
+0x8B87	0x7AAE	#CJK UNIFIED IDEOGRAPH
+0x8B88	0x7B08	#CJK UNIFIED IDEOGRAPH
+0x8B89	0x7D1A	#CJK UNIFIED IDEOGRAPH
+0x8B8A	0x7CFE	#CJK UNIFIED IDEOGRAPH
+0x8B8B	0x7D66	#CJK UNIFIED IDEOGRAPH
+0x8B8C	0x65E7	#CJK UNIFIED IDEOGRAPH
+0x8B8D	0x725B	#CJK UNIFIED IDEOGRAPH
+0x8B8E	0x53BB	#CJK UNIFIED IDEOGRAPH
+0x8B8F	0x5C45	#CJK UNIFIED IDEOGRAPH
+0x8B90	0x5DE8	#CJK UNIFIED IDEOGRAPH
+0x8B91	0x62D2	#CJK UNIFIED IDEOGRAPH
+0x8B92	0x62E0	#CJK UNIFIED IDEOGRAPH
+0x8B93	0x6319	#CJK UNIFIED IDEOGRAPH
+0x8B94	0x6E20	#CJK UNIFIED IDEOGRAPH
+0x8B95	0x865A	#CJK UNIFIED IDEOGRAPH
+0x8B96	0x8A31	#CJK UNIFIED IDEOGRAPH
+0x8B97	0x8DDD	#CJK UNIFIED IDEOGRAPH
+0x8B98	0x92F8	#CJK UNIFIED IDEOGRAPH
+0x8B99	0x6F01	#CJK UNIFIED IDEOGRAPH
+0x8B9A	0x79A6	#CJK UNIFIED IDEOGRAPH
+0x8B9B	0x9B5A	#CJK UNIFIED IDEOGRAPH
+0x8B9C	0x4EA8	#CJK UNIFIED IDEOGRAPH
+0x8B9D	0x4EAB	#CJK UNIFIED IDEOGRAPH
+0x8B9E	0x4EAC	#CJK UNIFIED IDEOGRAPH
+0x8B9F	0x4F9B	#CJK UNIFIED IDEOGRAPH
+0x8BA0	0x4FA0	#CJK UNIFIED IDEOGRAPH
+0x8BA1	0x50D1	#CJK UNIFIED IDEOGRAPH
+0x8BA2	0x5147	#CJK UNIFIED IDEOGRAPH
+0x8BA3	0x7AF6	#CJK UNIFIED IDEOGRAPH
+0x8BA4	0x5171	#CJK UNIFIED IDEOGRAPH
+0x8BA5	0x51F6	#CJK UNIFIED IDEOGRAPH
+0x8BA6	0x5354	#CJK UNIFIED IDEOGRAPH
+0x8BA7	0x5321	#CJK UNIFIED IDEOGRAPH
+0x8BA8	0x537F	#CJK UNIFIED IDEOGRAPH
+0x8BA9	0x53EB	#CJK UNIFIED IDEOGRAPH
+0x8BAA	0x55AC	#CJK UNIFIED IDEOGRAPH
+0x8BAB	0x5883	#CJK UNIFIED IDEOGRAPH
+0x8BAC	0x5CE1	#CJK UNIFIED IDEOGRAPH
+0x8BAD	0x5F37	#CJK UNIFIED IDEOGRAPH
+0x8BAE	0x5F4A	#CJK UNIFIED IDEOGRAPH
+0x8BAF	0x602F	#CJK UNIFIED IDEOGRAPH
+0x8BB0	0x6050	#CJK UNIFIED IDEOGRAPH
+0x8BB1	0x606D	#CJK UNIFIED IDEOGRAPH
+0x8BB2	0x631F	#CJK UNIFIED IDEOGRAPH
+0x8BB3	0x6559	#CJK UNIFIED IDEOGRAPH
+0x8BB4	0x6A4B	#CJK UNIFIED IDEOGRAPH
+0x8BB5	0x6CC1	#CJK UNIFIED IDEOGRAPH
+0x8BB6	0x72C2	#CJK UNIFIED IDEOGRAPH
+0x8BB7	0x72ED	#CJK UNIFIED IDEOGRAPH
+0x8BB8	0x77EF	#CJK UNIFIED IDEOGRAPH
+0x8BB9	0x80F8	#CJK UNIFIED IDEOGRAPH
+0x8BBA	0x8105	#CJK UNIFIED IDEOGRAPH
+0x8BBB	0x8208	#CJK UNIFIED IDEOGRAPH
+0x8BBC	0x854E	#CJK UNIFIED IDEOGRAPH
+0x8BBD	0x90F7	#CJK UNIFIED IDEOGRAPH
+0x8BBE	0x93E1	#CJK UNIFIED IDEOGRAPH
+0x8BBF	0x97FF	#CJK UNIFIED IDEOGRAPH
+0x8BC0	0x9957	#CJK UNIFIED IDEOGRAPH
+0x8BC1	0x9A5A	#CJK UNIFIED IDEOGRAPH
+0x8BC2	0x4EF0	#CJK UNIFIED IDEOGRAPH
+0x8BC3	0x51DD	#CJK UNIFIED IDEOGRAPH
+0x8BC4	0x5C2D	#CJK UNIFIED IDEOGRAPH
+0x8BC5	0x6681	#CJK UNIFIED IDEOGRAPH
+0x8BC6	0x696D	#CJK UNIFIED IDEOGRAPH
+0x8BC7	0x5C40	#CJK UNIFIED IDEOGRAPH
+0x8BC8	0x66F2	#CJK UNIFIED IDEOGRAPH
+0x8BC9	0x6975	#CJK UNIFIED IDEOGRAPH
+0x8BCA	0x7389	#CJK UNIFIED IDEOGRAPH
+0x8BCB	0x6850	#CJK UNIFIED IDEOGRAPH
+0x8BCC	0x7C81	#CJK UNIFIED IDEOGRAPH
+0x8BCD	0x50C5	#CJK UNIFIED IDEOGRAPH
+0x8BCE	0x52E4	#CJK UNIFIED IDEOGRAPH
+0x8BCF	0x5747	#CJK UNIFIED IDEOGRAPH
+0x8BD0	0x5DFE	#CJK UNIFIED IDEOGRAPH
+0x8BD1	0x9326	#CJK UNIFIED IDEOGRAPH
+0x8BD2	0x65A4	#CJK UNIFIED IDEOGRAPH
+0x8BD3	0x6B23	#CJK UNIFIED IDEOGRAPH
+0x8BD4	0x6B3D	#CJK UNIFIED IDEOGRAPH
+0x8BD5	0x7434	#CJK UNIFIED IDEOGRAPH
+0x8BD6	0x7981	#CJK UNIFIED IDEOGRAPH
+0x8BD7	0x79BD	#CJK UNIFIED IDEOGRAPH
+0x8BD8	0x7B4B	#CJK UNIFIED IDEOGRAPH
+0x8BD9	0x7DCA	#CJK UNIFIED IDEOGRAPH
+0x8BDA	0x82B9	#CJK UNIFIED IDEOGRAPH
+0x8BDB	0x83CC	#CJK UNIFIED IDEOGRAPH
+0x8BDC	0x887F	#CJK UNIFIED IDEOGRAPH
+0x8BDD	0x895F	#CJK UNIFIED IDEOGRAPH
+0x8BDE	0x8B39	#CJK UNIFIED IDEOGRAPH
+0x8BDF	0x8FD1	#CJK UNIFIED IDEOGRAPH
+0x8BE0	0x91D1	#CJK UNIFIED IDEOGRAPH
+0x8BE1	0x541F	#CJK UNIFIED IDEOGRAPH
+0x8BE2	0x9280	#CJK UNIFIED IDEOGRAPH
+0x8BE3	0x4E5D	#CJK UNIFIED IDEOGRAPH
+0x8BE4	0x5036	#CJK UNIFIED IDEOGRAPH
+0x8BE5	0x53E5	#CJK UNIFIED IDEOGRAPH
+0x8BE6	0x533A	#CJK UNIFIED IDEOGRAPH
+0x8BE7	0x72D7	#CJK UNIFIED IDEOGRAPH
+0x8BE8	0x7396	#CJK UNIFIED IDEOGRAPH
+0x8BE9	0x77E9	#CJK UNIFIED IDEOGRAPH
+0x8BEA	0x82E6	#CJK UNIFIED IDEOGRAPH
+0x8BEB	0x8EAF	#CJK UNIFIED IDEOGRAPH
+0x8BEC	0x99C6	#CJK UNIFIED IDEOGRAPH
+0x8BED	0x99C8	#CJK UNIFIED IDEOGRAPH
+0x8BEE	0x99D2	#CJK UNIFIED IDEOGRAPH
+0x8BEF	0x5177	#CJK UNIFIED IDEOGRAPH
+0x8BF0	0x611A	#CJK UNIFIED IDEOGRAPH
+0x8BF1	0x865E	#CJK UNIFIED IDEOGRAPH
+0x8BF2	0x55B0	#CJK UNIFIED IDEOGRAPH
+0x8BF3	0x7A7A	#CJK UNIFIED IDEOGRAPH
+0x8BF4	0x5076	#CJK UNIFIED IDEOGRAPH
+0x8BF5	0x5BD3	#CJK UNIFIED IDEOGRAPH
+0x8BF6	0x9047	#CJK UNIFIED IDEOGRAPH
+0x8BF7	0x9685	#CJK UNIFIED IDEOGRAPH
+0x8BF8	0x4E32	#CJK UNIFIED IDEOGRAPH
+0x8BF9	0x6ADB	#CJK UNIFIED IDEOGRAPH
+0x8BFA	0x91E7	#CJK UNIFIED IDEOGRAPH
+0x8BFB	0x5C51	#CJK UNIFIED IDEOGRAPH
+0x8BFC	0x5C48	#CJK UNIFIED IDEOGRAPH
+0x8C40	0x6398	#CJK UNIFIED IDEOGRAPH
+0x8C41	0x7A9F	#CJK UNIFIED IDEOGRAPH
+0x8C42	0x6C93	#CJK UNIFIED IDEOGRAPH
+0x8C43	0x9774	#CJK UNIFIED IDEOGRAPH
+0x8C44	0x8F61	#CJK UNIFIED IDEOGRAPH
+0x8C45	0x7AAA	#CJK UNIFIED IDEOGRAPH
+0x8C46	0x718A	#CJK UNIFIED IDEOGRAPH
+0x8C47	0x9688	#CJK UNIFIED IDEOGRAPH
+0x8C48	0x7C82	#CJK UNIFIED IDEOGRAPH
+0x8C49	0x6817	#CJK UNIFIED IDEOGRAPH
+0x8C4A	0x7E70	#CJK UNIFIED IDEOGRAPH
+0x8C4B	0x6851	#CJK UNIFIED IDEOGRAPH
+0x8C4C	0x936C	#CJK UNIFIED IDEOGRAPH
+0x8C4D	0x52F2	#CJK UNIFIED IDEOGRAPH
+0x8C4E	0x541B	#CJK UNIFIED IDEOGRAPH
+0x8C4F	0x85AB	#CJK UNIFIED IDEOGRAPH
+0x8C50	0x8A13	#CJK UNIFIED IDEOGRAPH
+0x8C51	0x7FA4	#CJK UNIFIED IDEOGRAPH
+0x8C52	0x8ECD	#CJK UNIFIED IDEOGRAPH
+0x8C53	0x90E1	#CJK UNIFIED IDEOGRAPH
+0x8C54	0x5366	#CJK UNIFIED IDEOGRAPH
+0x8C55	0x8888	#CJK UNIFIED IDEOGRAPH
+0x8C56	0x7941	#CJK UNIFIED IDEOGRAPH
+0x8C57	0x4FC2	#CJK UNIFIED IDEOGRAPH
+0x8C58	0x50BE	#CJK UNIFIED IDEOGRAPH
+0x8C59	0x5211	#CJK UNIFIED IDEOGRAPH
+0x8C5A	0x5144	#CJK UNIFIED IDEOGRAPH
+0x8C5B	0x5553	#CJK UNIFIED IDEOGRAPH
+0x8C5C	0x572D	#CJK UNIFIED IDEOGRAPH
+0x8C5D	0x73EA	#CJK UNIFIED IDEOGRAPH
+0x8C5E	0x578B	#CJK UNIFIED IDEOGRAPH
+0x8C5F	0x5951	#CJK UNIFIED IDEOGRAPH
+0x8C60	0x5F62	#CJK UNIFIED IDEOGRAPH
+0x8C61	0x5F84	#CJK UNIFIED IDEOGRAPH
+0x8C62	0x6075	#CJK UNIFIED IDEOGRAPH
+0x8C63	0x6176	#CJK UNIFIED IDEOGRAPH
+0x8C64	0x6167	#CJK UNIFIED IDEOGRAPH
+0x8C65	0x61A9	#CJK UNIFIED IDEOGRAPH
+0x8C66	0x63B2	#CJK UNIFIED IDEOGRAPH
+0x8C67	0x643A	#CJK UNIFIED IDEOGRAPH
+0x8C68	0x656C	#CJK UNIFIED IDEOGRAPH
+0x8C69	0x666F	#CJK UNIFIED IDEOGRAPH
+0x8C6A	0x6842	#CJK UNIFIED IDEOGRAPH
+0x8C6B	0x6E13	#CJK UNIFIED IDEOGRAPH
+0x8C6C	0x7566	#CJK UNIFIED IDEOGRAPH
+0x8C6D	0x7A3D	#CJK UNIFIED IDEOGRAPH
+0x8C6E	0x7CFB	#CJK UNIFIED IDEOGRAPH
+0x8C6F	0x7D4C	#CJK UNIFIED IDEOGRAPH
+0x8C70	0x7D99	#CJK UNIFIED IDEOGRAPH
+0x8C71	0x7E4B	#CJK UNIFIED IDEOGRAPH
+0x8C72	0x7F6B	#CJK UNIFIED IDEOGRAPH
+0x8C73	0x830E	#CJK UNIFIED IDEOGRAPH
+0x8C74	0x834A	#CJK UNIFIED IDEOGRAPH
+0x8C75	0x86CD	#CJK UNIFIED IDEOGRAPH
+0x8C76	0x8A08	#CJK UNIFIED IDEOGRAPH
+0x8C77	0x8A63	#CJK UNIFIED IDEOGRAPH
+0x8C78	0x8B66	#CJK UNIFIED IDEOGRAPH
+0x8C79	0x8EFD	#CJK UNIFIED IDEOGRAPH
+0x8C7A	0x981A	#CJK UNIFIED IDEOGRAPH
+0x8C7B	0x9D8F	#CJK UNIFIED IDEOGRAPH
+0x8C7C	0x82B8	#CJK UNIFIED IDEOGRAPH
+0x8C7D	0x8FCE	#CJK UNIFIED IDEOGRAPH
+0x8C7E	0x9BE8	#CJK UNIFIED IDEOGRAPH
+0x8C80	0x5287	#CJK UNIFIED IDEOGRAPH
+0x8C81	0x621F	#CJK UNIFIED IDEOGRAPH
+0x8C82	0x6483	#CJK UNIFIED IDEOGRAPH
+0x8C83	0x6FC0	#CJK UNIFIED IDEOGRAPH
+0x8C84	0x9699	#CJK UNIFIED IDEOGRAPH
+0x8C85	0x6841	#CJK UNIFIED IDEOGRAPH
+0x8C86	0x5091	#CJK UNIFIED IDEOGRAPH
+0x8C87	0x6B20	#CJK UNIFIED IDEOGRAPH
+0x8C88	0x6C7A	#CJK UNIFIED IDEOGRAPH
+0x8C89	0x6F54	#CJK UNIFIED IDEOGRAPH
+0x8C8A	0x7A74	#CJK UNIFIED IDEOGRAPH
+0x8C8B	0x7D50	#CJK UNIFIED IDEOGRAPH
+0x8C8C	0x8840	#CJK UNIFIED IDEOGRAPH
+0x8C8D	0x8A23	#CJK UNIFIED IDEOGRAPH
+0x8C8E	0x6708	#CJK UNIFIED IDEOGRAPH
+0x8C8F	0x4EF6	#CJK UNIFIED IDEOGRAPH
+0x8C90	0x5039	#CJK UNIFIED IDEOGRAPH
+0x8C91	0x5026	#CJK UNIFIED IDEOGRAPH
+0x8C92	0x5065	#CJK UNIFIED IDEOGRAPH
+0x8C93	0x517C	#CJK UNIFIED IDEOGRAPH
+0x8C94	0x5238	#CJK UNIFIED IDEOGRAPH
+0x8C95	0x5263	#CJK UNIFIED IDEOGRAPH
+0x8C96	0x55A7	#CJK UNIFIED IDEOGRAPH
+0x8C97	0x570F	#CJK UNIFIED IDEOGRAPH
+0x8C98	0x5805	#CJK UNIFIED IDEOGRAPH
+0x8C99	0x5ACC	#CJK UNIFIED IDEOGRAPH
+0x8C9A	0x5EFA	#CJK UNIFIED IDEOGRAPH
+0x8C9B	0x61B2	#CJK UNIFIED IDEOGRAPH
+0x8C9C	0x61F8	#CJK UNIFIED IDEOGRAPH
+0x8C9D	0x62F3	#CJK UNIFIED IDEOGRAPH
+0x8C9E	0x6372	#CJK UNIFIED IDEOGRAPH
+0x8C9F	0x691C	#CJK UNIFIED IDEOGRAPH
+0x8CA0	0x6A29	#CJK UNIFIED IDEOGRAPH
+0x8CA1	0x727D	#CJK UNIFIED IDEOGRAPH
+0x8CA2	0x72AC	#CJK UNIFIED IDEOGRAPH
+0x8CA3	0x732E	#CJK UNIFIED IDEOGRAPH
+0x8CA4	0x7814	#CJK UNIFIED IDEOGRAPH
+0x8CA5	0x786F	#CJK UNIFIED IDEOGRAPH
+0x8CA6	0x7D79	#CJK UNIFIED IDEOGRAPH
+0x8CA7	0x770C	#CJK UNIFIED IDEOGRAPH
+0x8CA8	0x80A9	#CJK UNIFIED IDEOGRAPH
+0x8CA9	0x898B	#CJK UNIFIED IDEOGRAPH
+0x8CAA	0x8B19	#CJK UNIFIED IDEOGRAPH
+0x8CAB	0x8CE2	#CJK UNIFIED IDEOGRAPH
+0x8CAC	0x8ED2	#CJK UNIFIED IDEOGRAPH
+0x8CAD	0x9063	#CJK UNIFIED IDEOGRAPH
+0x8CAE	0x9375	#CJK UNIFIED IDEOGRAPH
+0x8CAF	0x967A	#CJK UNIFIED IDEOGRAPH
+0x8CB0	0x9855	#CJK UNIFIED IDEOGRAPH
+0x8CB1	0x9A13	#CJK UNIFIED IDEOGRAPH
+0x8CB2	0x9E78	#CJK UNIFIED IDEOGRAPH
+0x8CB3	0x5143	#CJK UNIFIED IDEOGRAPH
+0x8CB4	0x539F	#CJK UNIFIED IDEOGRAPH
+0x8CB5	0x53B3	#CJK UNIFIED IDEOGRAPH
+0x8CB6	0x5E7B	#CJK UNIFIED IDEOGRAPH
+0x8CB7	0x5F26	#CJK UNIFIED IDEOGRAPH
+0x8CB8	0x6E1B	#CJK UNIFIED IDEOGRAPH
+0x8CB9	0x6E90	#CJK UNIFIED IDEOGRAPH
+0x8CBA	0x7384	#CJK UNIFIED IDEOGRAPH
+0x8CBB	0x73FE	#CJK UNIFIED IDEOGRAPH
+0x8CBC	0x7D43	#CJK UNIFIED IDEOGRAPH
+0x8CBD	0x8237	#CJK UNIFIED IDEOGRAPH
+0x8CBE	0x8A00	#CJK UNIFIED IDEOGRAPH
+0x8CBF	0x8AFA	#CJK UNIFIED IDEOGRAPH
+0x8CC0	0x9650	#CJK UNIFIED IDEOGRAPH
+0x8CC1	0x4E4E	#CJK UNIFIED IDEOGRAPH
+0x8CC2	0x500B	#CJK UNIFIED IDEOGRAPH
+0x8CC3	0x53E4	#CJK UNIFIED IDEOGRAPH
+0x8CC4	0x547C	#CJK UNIFIED IDEOGRAPH
+0x8CC5	0x56FA	#CJK UNIFIED IDEOGRAPH
+0x8CC6	0x59D1	#CJK UNIFIED IDEOGRAPH
+0x8CC7	0x5B64	#CJK UNIFIED IDEOGRAPH
+0x8CC8	0x5DF1	#CJK UNIFIED IDEOGRAPH
+0x8CC9	0x5EAB	#CJK UNIFIED IDEOGRAPH
+0x8CCA	0x5F27	#CJK UNIFIED IDEOGRAPH
+0x8CCB	0x6238	#CJK UNIFIED IDEOGRAPH
+0x8CCC	0x6545	#CJK UNIFIED IDEOGRAPH
+0x8CCD	0x67AF	#CJK UNIFIED IDEOGRAPH
+0x8CCE	0x6E56	#CJK UNIFIED IDEOGRAPH
+0x8CCF	0x72D0	#CJK UNIFIED IDEOGRAPH
+0x8CD0	0x7CCA	#CJK UNIFIED IDEOGRAPH
+0x8CD1	0x88B4	#CJK UNIFIED IDEOGRAPH
+0x8CD2	0x80A1	#CJK UNIFIED IDEOGRAPH
+0x8CD3	0x80E1	#CJK UNIFIED IDEOGRAPH
+0x8CD4	0x83F0	#CJK UNIFIED IDEOGRAPH
+0x8CD5	0x864E	#CJK UNIFIED IDEOGRAPH
+0x8CD6	0x8A87	#CJK UNIFIED IDEOGRAPH
+0x8CD7	0x8DE8	#CJK UNIFIED IDEOGRAPH
+0x8CD8	0x9237	#CJK UNIFIED IDEOGRAPH
+0x8CD9	0x96C7	#CJK UNIFIED IDEOGRAPH
+0x8CDA	0x9867	#CJK UNIFIED IDEOGRAPH
+0x8CDB	0x9F13	#CJK UNIFIED IDEOGRAPH
+0x8CDC	0x4E94	#CJK UNIFIED IDEOGRAPH
+0x8CDD	0x4E92	#CJK UNIFIED IDEOGRAPH
+0x8CDE	0x4F0D	#CJK UNIFIED IDEOGRAPH
+0x8CDF	0x5348	#CJK UNIFIED IDEOGRAPH
+0x8CE0	0x5449	#CJK UNIFIED IDEOGRAPH
+0x8CE1	0x543E	#CJK UNIFIED IDEOGRAPH
+0x8CE2	0x5A2F	#CJK UNIFIED IDEOGRAPH
+0x8CE3	0x5F8C	#CJK UNIFIED IDEOGRAPH
+0x8CE4	0x5FA1	#CJK UNIFIED IDEOGRAPH
+0x8CE5	0x609F	#CJK UNIFIED IDEOGRAPH
+0x8CE6	0x68A7	#CJK UNIFIED IDEOGRAPH
+0x8CE7	0x6A8E	#CJK UNIFIED IDEOGRAPH
+0x8CE8	0x745A	#CJK UNIFIED IDEOGRAPH
+0x8CE9	0x7881	#CJK UNIFIED IDEOGRAPH
+0x8CEA	0x8A9E	#CJK UNIFIED IDEOGRAPH
+0x8CEB	0x8AA4	#CJK UNIFIED IDEOGRAPH
+0x8CEC	0x8B77	#CJK UNIFIED IDEOGRAPH
+0x8CED	0x9190	#CJK UNIFIED IDEOGRAPH
+0x8CEE	0x4E5E	#CJK UNIFIED IDEOGRAPH
+0x8CEF	0x9BC9	#CJK UNIFIED IDEOGRAPH
+0x8CF0	0x4EA4	#CJK UNIFIED IDEOGRAPH
+0x8CF1	0x4F7C	#CJK UNIFIED IDEOGRAPH
+0x8CF2	0x4FAF	#CJK UNIFIED IDEOGRAPH
+0x8CF3	0x5019	#CJK UNIFIED IDEOGRAPH
+0x8CF4	0x5016	#CJK UNIFIED IDEOGRAPH
+0x8CF5	0x5149	#CJK UNIFIED IDEOGRAPH
+0x8CF6	0x516C	#CJK UNIFIED IDEOGRAPH
+0x8CF7	0x529F	#CJK UNIFIED IDEOGRAPH
+0x8CF8	0x52B9	#CJK UNIFIED IDEOGRAPH
+0x8CF9	0x52FE	#CJK UNIFIED IDEOGRAPH
+0x8CFA	0x539A	#CJK UNIFIED IDEOGRAPH
+0x8CFB	0x53E3	#CJK UNIFIED IDEOGRAPH
+0x8CFC	0x5411	#CJK UNIFIED IDEOGRAPH
+0x8D40	0x540E	#CJK UNIFIED IDEOGRAPH
+0x8D41	0x5589	#CJK UNIFIED IDEOGRAPH
+0x8D42	0x5751	#CJK UNIFIED IDEOGRAPH
+0x8D43	0x57A2	#CJK UNIFIED IDEOGRAPH
+0x8D44	0x597D	#CJK UNIFIED IDEOGRAPH
+0x8D45	0x5B54	#CJK UNIFIED IDEOGRAPH
+0x8D46	0x5B5D	#CJK UNIFIED IDEOGRAPH
+0x8D47	0x5B8F	#CJK UNIFIED IDEOGRAPH
+0x8D48	0x5DE5	#CJK UNIFIED IDEOGRAPH
+0x8D49	0x5DE7	#CJK UNIFIED IDEOGRAPH
+0x8D4A	0x5DF7	#CJK UNIFIED IDEOGRAPH
+0x8D4B	0x5E78	#CJK UNIFIED IDEOGRAPH
+0x8D4C	0x5E83	#CJK UNIFIED IDEOGRAPH
+0x8D4D	0x5E9A	#CJK UNIFIED IDEOGRAPH
+0x8D4E	0x5EB7	#CJK UNIFIED IDEOGRAPH
+0x8D4F	0x5F18	#CJK UNIFIED IDEOGRAPH
+0x8D50	0x6052	#CJK UNIFIED IDEOGRAPH
+0x8D51	0x614C	#CJK UNIFIED IDEOGRAPH
+0x8D52	0x6297	#CJK UNIFIED IDEOGRAPH
+0x8D53	0x62D8	#CJK UNIFIED IDEOGRAPH
+0x8D54	0x63A7	#CJK UNIFIED IDEOGRAPH
+0x8D55	0x653B	#CJK UNIFIED IDEOGRAPH
+0x8D56	0x6602	#CJK UNIFIED IDEOGRAPH
+0x8D57	0x6643	#CJK UNIFIED IDEOGRAPH
+0x8D58	0x66F4	#CJK UNIFIED IDEOGRAPH
+0x8D59	0x676D	#CJK UNIFIED IDEOGRAPH
+0x8D5A	0x6821	#CJK UNIFIED IDEOGRAPH
+0x8D5B	0x6897	#CJK UNIFIED IDEOGRAPH
+0x8D5C	0x69CB	#CJK UNIFIED IDEOGRAPH
+0x8D5D	0x6C5F	#CJK UNIFIED IDEOGRAPH
+0x8D5E	0x6D2A	#CJK UNIFIED IDEOGRAPH
+0x8D5F	0x6D69	#CJK UNIFIED IDEOGRAPH
+0x8D60	0x6E2F	#CJK UNIFIED IDEOGRAPH
+0x8D61	0x6E9D	#CJK UNIFIED IDEOGRAPH
+0x8D62	0x7532	#CJK UNIFIED IDEOGRAPH
+0x8D63	0x7687	#CJK UNIFIED IDEOGRAPH
+0x8D64	0x786C	#CJK UNIFIED IDEOGRAPH
+0x8D65	0x7A3F	#CJK UNIFIED IDEOGRAPH
+0x8D66	0x7CE0	#CJK UNIFIED IDEOGRAPH
+0x8D67	0x7D05	#CJK UNIFIED IDEOGRAPH
+0x8D68	0x7D18	#CJK UNIFIED IDEOGRAPH
+0x8D69	0x7D5E	#CJK UNIFIED IDEOGRAPH
+0x8D6A	0x7DB1	#CJK UNIFIED IDEOGRAPH
+0x8D6B	0x8015	#CJK UNIFIED IDEOGRAPH
+0x8D6C	0x8003	#CJK UNIFIED IDEOGRAPH
+0x8D6D	0x80AF	#CJK UNIFIED IDEOGRAPH
+0x8D6E	0x80B1	#CJK UNIFIED IDEOGRAPH
+0x8D6F	0x8154	#CJK UNIFIED IDEOGRAPH
+0x8D70	0x818F	#CJK UNIFIED IDEOGRAPH
+0x8D71	0x822A	#CJK UNIFIED IDEOGRAPH
+0x8D72	0x8352	#CJK UNIFIED IDEOGRAPH
+0x8D73	0x884C	#CJK UNIFIED IDEOGRAPH
+0x8D74	0x8861	#CJK UNIFIED IDEOGRAPH
+0x8D75	0x8B1B	#CJK UNIFIED IDEOGRAPH
+0x8D76	0x8CA2	#CJK UNIFIED IDEOGRAPH
+0x8D77	0x8CFC	#CJK UNIFIED IDEOGRAPH
+0x8D78	0x90CA	#CJK UNIFIED IDEOGRAPH
+0x8D79	0x9175	#CJK UNIFIED IDEOGRAPH
+0x8D7A	0x9271	#CJK UNIFIED IDEOGRAPH
+0x8D7B	0x783F	#CJK UNIFIED IDEOGRAPH
+0x8D7C	0x92FC	#CJK UNIFIED IDEOGRAPH
+0x8D7D	0x95A4	#CJK UNIFIED IDEOGRAPH
+0x8D7E	0x964D	#CJK UNIFIED IDEOGRAPH
+0x8D80	0x9805	#CJK UNIFIED IDEOGRAPH
+0x8D81	0x9999	#CJK UNIFIED IDEOGRAPH
+0x8D82	0x9AD8	#CJK UNIFIED IDEOGRAPH
+0x8D83	0x9D3B	#CJK UNIFIED IDEOGRAPH
+0x8D84	0x525B	#CJK UNIFIED IDEOGRAPH
+0x8D85	0x52AB	#CJK UNIFIED IDEOGRAPH
+0x8D86	0x53F7	#CJK UNIFIED IDEOGRAPH
+0x8D87	0x5408	#CJK UNIFIED IDEOGRAPH
+0x8D88	0x58D5	#CJK UNIFIED IDEOGRAPH
+0x8D89	0x62F7	#CJK UNIFIED IDEOGRAPH
+0x8D8A	0x6FE0	#CJK UNIFIED IDEOGRAPH
+0x8D8B	0x8C6A	#CJK UNIFIED IDEOGRAPH
+0x8D8C	0x8F5F	#CJK UNIFIED IDEOGRAPH
+0x8D8D	0x9EB9	#CJK UNIFIED IDEOGRAPH
+0x8D8E	0x514B	#CJK UNIFIED IDEOGRAPH
+0x8D8F	0x523B	#CJK UNIFIED IDEOGRAPH
+0x8D90	0x544A	#CJK UNIFIED IDEOGRAPH
+0x8D91	0x56FD	#CJK UNIFIED IDEOGRAPH
+0x8D92	0x7A40	#CJK UNIFIED IDEOGRAPH
+0x8D93	0x9177	#CJK UNIFIED IDEOGRAPH
+0x8D94	0x9D60	#CJK UNIFIED IDEOGRAPH
+0x8D95	0x9ED2	#CJK UNIFIED IDEOGRAPH
+0x8D96	0x7344	#CJK UNIFIED IDEOGRAPH
+0x8D97	0x6F09	#CJK UNIFIED IDEOGRAPH
+0x8D98	0x8170	#CJK UNIFIED IDEOGRAPH
+0x8D99	0x7511	#CJK UNIFIED IDEOGRAPH
+0x8D9A	0x5FFD	#CJK UNIFIED IDEOGRAPH
+0x8D9B	0x60DA	#CJK UNIFIED IDEOGRAPH
+0x8D9C	0x9AA8	#CJK UNIFIED IDEOGRAPH
+0x8D9D	0x72DB	#CJK UNIFIED IDEOGRAPH
+0x8D9E	0x8FBC	#CJK UNIFIED IDEOGRAPH
+0x8D9F	0x6B64	#CJK UNIFIED IDEOGRAPH
+0x8DA0	0x9803	#CJK UNIFIED IDEOGRAPH
+0x8DA1	0x4ECA	#CJK UNIFIED IDEOGRAPH
+0x8DA2	0x56F0	#CJK UNIFIED IDEOGRAPH
+0x8DA3	0x5764	#CJK UNIFIED IDEOGRAPH
+0x8DA4	0x58BE	#CJK UNIFIED IDEOGRAPH
+0x8DA5	0x5A5A	#CJK UNIFIED IDEOGRAPH
+0x8DA6	0x6068	#CJK UNIFIED IDEOGRAPH
+0x8DA7	0x61C7	#CJK UNIFIED IDEOGRAPH
+0x8DA8	0x660F	#CJK UNIFIED IDEOGRAPH
+0x8DA9	0x6606	#CJK UNIFIED IDEOGRAPH
+0x8DAA	0x6839	#CJK UNIFIED IDEOGRAPH
+0x8DAB	0x68B1	#CJK UNIFIED IDEOGRAPH
+0x8DAC	0x6DF7	#CJK UNIFIED IDEOGRAPH
+0x8DAD	0x75D5	#CJK UNIFIED IDEOGRAPH
+0x8DAE	0x7D3A	#CJK UNIFIED IDEOGRAPH
+0x8DAF	0x826E	#CJK UNIFIED IDEOGRAPH
+0x8DB0	0x9B42	#CJK UNIFIED IDEOGRAPH
+0x8DB1	0x4E9B	#CJK UNIFIED IDEOGRAPH
+0x8DB2	0x4F50	#CJK UNIFIED IDEOGRAPH
+0x8DB3	0x53C9	#CJK UNIFIED IDEOGRAPH
+0x8DB4	0x5506	#CJK UNIFIED IDEOGRAPH
+0x8DB5	0x5D6F	#CJK UNIFIED IDEOGRAPH
+0x8DB6	0x5DE6	#CJK UNIFIED IDEOGRAPH
+0x8DB7	0x5DEE	#CJK UNIFIED IDEOGRAPH
+0x8DB8	0x67FB	#CJK UNIFIED IDEOGRAPH
+0x8DB9	0x6C99	#CJK UNIFIED IDEOGRAPH
+0x8DBA	0x7473	#CJK UNIFIED IDEOGRAPH
+0x8DBB	0x7802	#CJK UNIFIED IDEOGRAPH
+0x8DBC	0x8A50	#CJK UNIFIED IDEOGRAPH
+0x8DBD	0x9396	#CJK UNIFIED IDEOGRAPH
+0x8DBE	0x88DF	#CJK UNIFIED IDEOGRAPH
+0x8DBF	0x5750	#CJK UNIFIED IDEOGRAPH
+0x8DC0	0x5EA7	#CJK UNIFIED IDEOGRAPH
+0x8DC1	0x632B	#CJK UNIFIED IDEOGRAPH
+0x8DC2	0x50B5	#CJK UNIFIED IDEOGRAPH
+0x8DC3	0x50AC	#CJK UNIFIED IDEOGRAPH
+0x8DC4	0x518D	#CJK UNIFIED IDEOGRAPH
+0x8DC5	0x6700	#CJK UNIFIED IDEOGRAPH
+0x8DC6	0x54C9	#CJK UNIFIED IDEOGRAPH
+0x8DC7	0x585E	#CJK UNIFIED IDEOGRAPH
+0x8DC8	0x59BB	#CJK UNIFIED IDEOGRAPH
+0x8DC9	0x5BB0	#CJK UNIFIED IDEOGRAPH
+0x8DCA	0x5F69	#CJK UNIFIED IDEOGRAPH
+0x8DCB	0x624D	#CJK UNIFIED IDEOGRAPH
+0x8DCC	0x63A1	#CJK UNIFIED IDEOGRAPH
+0x8DCD	0x683D	#CJK UNIFIED IDEOGRAPH
+0x8DCE	0x6B73	#CJK UNIFIED IDEOGRAPH
+0x8DCF	0x6E08	#CJK UNIFIED IDEOGRAPH
+0x8DD0	0x707D	#CJK UNIFIED IDEOGRAPH
+0x8DD1	0x91C7	#CJK UNIFIED IDEOGRAPH
+0x8DD2	0x7280	#CJK UNIFIED IDEOGRAPH
+0x8DD3	0x7815	#CJK UNIFIED IDEOGRAPH
+0x8DD4	0x7826	#CJK UNIFIED IDEOGRAPH
+0x8DD5	0x796D	#CJK UNIFIED IDEOGRAPH
+0x8DD6	0x658E	#CJK UNIFIED IDEOGRAPH
+0x8DD7	0x7D30	#CJK UNIFIED IDEOGRAPH
+0x8DD8	0x83DC	#CJK UNIFIED IDEOGRAPH
+0x8DD9	0x88C1	#CJK UNIFIED IDEOGRAPH
+0x8DDA	0x8F09	#CJK UNIFIED IDEOGRAPH
+0x8DDB	0x969B	#CJK UNIFIED IDEOGRAPH
+0x8DDC	0x5264	#CJK UNIFIED IDEOGRAPH
+0x8DDD	0x5728	#CJK UNIFIED IDEOGRAPH
+0x8DDE	0x6750	#CJK UNIFIED IDEOGRAPH
+0x8DDF	0x7F6A	#CJK UNIFIED IDEOGRAPH
+0x8DE0	0x8CA1	#CJK UNIFIED IDEOGRAPH
+0x8DE1	0x51B4	#CJK UNIFIED IDEOGRAPH
+0x8DE2	0x5742	#CJK UNIFIED IDEOGRAPH
+0x8DE3	0x962A	#CJK UNIFIED IDEOGRAPH
+0x8DE4	0x583A	#CJK UNIFIED IDEOGRAPH
+0x8DE5	0x698A	#CJK UNIFIED IDEOGRAPH
+0x8DE6	0x80B4	#CJK UNIFIED IDEOGRAPH
+0x8DE7	0x54B2	#CJK UNIFIED IDEOGRAPH
+0x8DE8	0x5D0E	#CJK UNIFIED IDEOGRAPH
+0x8DE9	0x57FC	#CJK UNIFIED IDEOGRAPH
+0x8DEA	0x7895	#CJK UNIFIED IDEOGRAPH
+0x8DEB	0x9DFA	#CJK UNIFIED IDEOGRAPH
+0x8DEC	0x4F5C	#CJK UNIFIED IDEOGRAPH
+0x8DED	0x524A	#CJK UNIFIED IDEOGRAPH
+0x8DEE	0x548B	#CJK UNIFIED IDEOGRAPH
+0x8DEF	0x643E	#CJK UNIFIED IDEOGRAPH
+0x8DF0	0x6628	#CJK UNIFIED IDEOGRAPH
+0x8DF1	0x6714	#CJK UNIFIED IDEOGRAPH
+0x8DF2	0x67F5	#CJK UNIFIED IDEOGRAPH
+0x8DF3	0x7A84	#CJK UNIFIED IDEOGRAPH
+0x8DF4	0x7B56	#CJK UNIFIED IDEOGRAPH
+0x8DF5	0x7D22	#CJK UNIFIED IDEOGRAPH
+0x8DF6	0x932F	#CJK UNIFIED IDEOGRAPH
+0x8DF7	0x685C	#CJK UNIFIED IDEOGRAPH
+0x8DF8	0x9BAD	#CJK UNIFIED IDEOGRAPH
+0x8DF9	0x7B39	#CJK UNIFIED IDEOGRAPH
+0x8DFA	0x5319	#CJK UNIFIED IDEOGRAPH
+0x8DFB	0x518A	#CJK UNIFIED IDEOGRAPH
+0x8DFC	0x5237	#CJK UNIFIED IDEOGRAPH
+0x8E40	0x5BDF	#CJK UNIFIED IDEOGRAPH
+0x8E41	0x62F6	#CJK UNIFIED IDEOGRAPH
+0x8E42	0x64AE	#CJK UNIFIED IDEOGRAPH
+0x8E43	0x64E6	#CJK UNIFIED IDEOGRAPH
+0x8E44	0x672D	#CJK UNIFIED IDEOGRAPH
+0x8E45	0x6BBA	#CJK UNIFIED IDEOGRAPH
+0x8E46	0x85A9	#CJK UNIFIED IDEOGRAPH
+0x8E47	0x96D1	#CJK UNIFIED IDEOGRAPH
+0x8E48	0x7690	#CJK UNIFIED IDEOGRAPH
+0x8E49	0x9BD6	#CJK UNIFIED IDEOGRAPH
+0x8E4A	0x634C	#CJK UNIFIED IDEOGRAPH
+0x8E4B	0x9306	#CJK UNIFIED IDEOGRAPH
+0x8E4C	0x9BAB	#CJK UNIFIED IDEOGRAPH
+0x8E4D	0x76BF	#CJK UNIFIED IDEOGRAPH
+0x8E4E	0x6652	#CJK UNIFIED IDEOGRAPH
+0x8E4F	0x4E09	#CJK UNIFIED IDEOGRAPH
+0x8E50	0x5098	#CJK UNIFIED IDEOGRAPH
+0x8E51	0x53C2	#CJK UNIFIED IDEOGRAPH
+0x8E52	0x5C71	#CJK UNIFIED IDEOGRAPH
+0x8E53	0x60E8	#CJK UNIFIED IDEOGRAPH
+0x8E54	0x6492	#CJK UNIFIED IDEOGRAPH
+0x8E55	0x6563	#CJK UNIFIED IDEOGRAPH
+0x8E56	0x685F	#CJK UNIFIED IDEOGRAPH
+0x8E57	0x71E6	#CJK UNIFIED IDEOGRAPH
+0x8E58	0x73CA	#CJK UNIFIED IDEOGRAPH
+0x8E59	0x7523	#CJK UNIFIED IDEOGRAPH
+0x8E5A	0x7B97	#CJK UNIFIED IDEOGRAPH
+0x8E5B	0x7E82	#CJK UNIFIED IDEOGRAPH
+0x8E5C	0x8695	#CJK UNIFIED IDEOGRAPH
+0x8E5D	0x8B83	#CJK UNIFIED IDEOGRAPH
+0x8E5E	0x8CDB	#CJK UNIFIED IDEOGRAPH
+0x8E5F	0x9178	#CJK UNIFIED IDEOGRAPH
+0x8E60	0x9910	#CJK UNIFIED IDEOGRAPH
+0x8E61	0x65AC	#CJK UNIFIED IDEOGRAPH
+0x8E62	0x66AB	#CJK UNIFIED IDEOGRAPH
+0x8E63	0x6B8B	#CJK UNIFIED IDEOGRAPH
+0x8E64	0x4ED5	#CJK UNIFIED IDEOGRAPH
+0x8E65	0x4ED4	#CJK UNIFIED IDEOGRAPH
+0x8E66	0x4F3A	#CJK UNIFIED IDEOGRAPH
+0x8E67	0x4F7F	#CJK UNIFIED IDEOGRAPH
+0x8E68	0x523A	#CJK UNIFIED IDEOGRAPH
+0x8E69	0x53F8	#CJK UNIFIED IDEOGRAPH
+0x8E6A	0x53F2	#CJK UNIFIED IDEOGRAPH
+0x8E6B	0x55E3	#CJK UNIFIED IDEOGRAPH
+0x8E6C	0x56DB	#CJK UNIFIED IDEOGRAPH
+0x8E6D	0x58EB	#CJK UNIFIED IDEOGRAPH
+0x8E6E	0x59CB	#CJK UNIFIED IDEOGRAPH
+0x8E6F	0x59C9	#CJK UNIFIED IDEOGRAPH
+0x8E70	0x59FF	#CJK UNIFIED IDEOGRAPH
+0x8E71	0x5B50	#CJK UNIFIED IDEOGRAPH
+0x8E72	0x5C4D	#CJK UNIFIED IDEOGRAPH
+0x8E73	0x5E02	#CJK UNIFIED IDEOGRAPH
+0x8E74	0x5E2B	#CJK UNIFIED IDEOGRAPH
+0x8E75	0x5FD7	#CJK UNIFIED IDEOGRAPH
+0x8E76	0x601D	#CJK UNIFIED IDEOGRAPH
+0x8E77	0x6307	#CJK UNIFIED IDEOGRAPH
+0x8E78	0x652F	#CJK UNIFIED IDEOGRAPH
+0x8E79	0x5B5C	#CJK UNIFIED IDEOGRAPH
+0x8E7A	0x65AF	#CJK UNIFIED IDEOGRAPH
+0x8E7B	0x65BD	#CJK UNIFIED IDEOGRAPH
+0x8E7C	0x65E8	#CJK UNIFIED IDEOGRAPH
+0x8E7D	0x679D	#CJK UNIFIED IDEOGRAPH
+0x8E7E	0x6B62	#CJK UNIFIED IDEOGRAPH
+0x8E80	0x6B7B	#CJK UNIFIED IDEOGRAPH
+0x8E81	0x6C0F	#CJK UNIFIED IDEOGRAPH
+0x8E82	0x7345	#CJK UNIFIED IDEOGRAPH
+0x8E83	0x7949	#CJK UNIFIED IDEOGRAPH
+0x8E84	0x79C1	#CJK UNIFIED IDEOGRAPH
+0x8E85	0x7CF8	#CJK UNIFIED IDEOGRAPH
+0x8E86	0x7D19	#CJK UNIFIED IDEOGRAPH
+0x8E87	0x7D2B	#CJK UNIFIED IDEOGRAPH
+0x8E88	0x80A2	#CJK UNIFIED IDEOGRAPH
+0x8E89	0x8102	#CJK UNIFIED IDEOGRAPH
+0x8E8A	0x81F3	#CJK UNIFIED IDEOGRAPH
+0x8E8B	0x8996	#CJK UNIFIED IDEOGRAPH
+0x8E8C	0x8A5E	#CJK UNIFIED IDEOGRAPH
+0x8E8D	0x8A69	#CJK UNIFIED IDEOGRAPH
+0x8E8E	0x8A66	#CJK UNIFIED IDEOGRAPH
+0x8E8F	0x8A8C	#CJK UNIFIED IDEOGRAPH
+0x8E90	0x8AEE	#CJK UNIFIED IDEOGRAPH
+0x8E91	0x8CC7	#CJK UNIFIED IDEOGRAPH
+0x8E92	0x8CDC	#CJK UNIFIED IDEOGRAPH
+0x8E93	0x96CC	#CJK UNIFIED IDEOGRAPH
+0x8E94	0x98FC	#CJK UNIFIED IDEOGRAPH
+0x8E95	0x6B6F	#CJK UNIFIED IDEOGRAPH
+0x8E96	0x4E8B	#CJK UNIFIED IDEOGRAPH
+0x8E97	0x4F3C	#CJK UNIFIED IDEOGRAPH
+0x8E98	0x4F8D	#CJK UNIFIED IDEOGRAPH
+0x8E99	0x5150	#CJK UNIFIED IDEOGRAPH
+0x8E9A	0x5B57	#CJK UNIFIED IDEOGRAPH
+0x8E9B	0x5BFA	#CJK UNIFIED IDEOGRAPH
+0x8E9C	0x6148	#CJK UNIFIED IDEOGRAPH
+0x8E9D	0x6301	#CJK UNIFIED IDEOGRAPH
+0x8E9E	0x6642	#CJK UNIFIED IDEOGRAPH
+0x8E9F	0x6B21	#CJK UNIFIED IDEOGRAPH
+0x8EA0	0x6ECB	#CJK UNIFIED IDEOGRAPH
+0x8EA1	0x6CBB	#CJK UNIFIED IDEOGRAPH
+0x8EA2	0x723E	#CJK UNIFIED IDEOGRAPH
+0x8EA3	0x74BD	#CJK UNIFIED IDEOGRAPH
+0x8EA4	0x75D4	#CJK UNIFIED IDEOGRAPH
+0x8EA5	0x78C1	#CJK UNIFIED IDEOGRAPH
+0x8EA6	0x793A	#CJK UNIFIED IDEOGRAPH
+0x8EA7	0x800C	#CJK UNIFIED IDEOGRAPH
+0x8EA8	0x8033	#CJK UNIFIED IDEOGRAPH
+0x8EA9	0x81EA	#CJK UNIFIED IDEOGRAPH
+0x8EAA	0x8494	#CJK UNIFIED IDEOGRAPH
+0x8EAB	0x8F9E	#CJK UNIFIED IDEOGRAPH
+0x8EAC	0x6C50	#CJK UNIFIED IDEOGRAPH
+0x8EAD	0x9E7F	#CJK UNIFIED IDEOGRAPH
+0x8EAE	0x5F0F	#CJK UNIFIED IDEOGRAPH
+0x8EAF	0x8B58	#CJK UNIFIED IDEOGRAPH
+0x8EB0	0x9D2B	#CJK UNIFIED IDEOGRAPH
+0x8EB1	0x7AFA	#CJK UNIFIED IDEOGRAPH
+0x8EB2	0x8EF8	#CJK UNIFIED IDEOGRAPH
+0x8EB3	0x5B8D	#CJK UNIFIED IDEOGRAPH
+0x8EB4	0x96EB	#CJK UNIFIED IDEOGRAPH
+0x8EB5	0x4E03	#CJK UNIFIED IDEOGRAPH
+0x8EB6	0x53F1	#CJK UNIFIED IDEOGRAPH
+0x8EB7	0x57F7	#CJK UNIFIED IDEOGRAPH
+0x8EB8	0x5931	#CJK UNIFIED IDEOGRAPH
+0x8EB9	0x5AC9	#CJK UNIFIED IDEOGRAPH
+0x8EBA	0x5BA4	#CJK UNIFIED IDEOGRAPH
+0x8EBB	0x6089	#CJK UNIFIED IDEOGRAPH
+0x8EBC	0x6E7F	#CJK UNIFIED IDEOGRAPH
+0x8EBD	0x6F06	#CJK UNIFIED IDEOGRAPH
+0x8EBE	0x75BE	#CJK UNIFIED IDEOGRAPH
+0x8EBF	0x8CEA	#CJK UNIFIED IDEOGRAPH
+0x8EC0	0x5B9F	#CJK UNIFIED IDEOGRAPH
+0x8EC1	0x8500	#CJK UNIFIED IDEOGRAPH
+0x8EC2	0x7BE0	#CJK UNIFIED IDEOGRAPH
+0x8EC3	0x5072	#CJK UNIFIED IDEOGRAPH
+0x8EC4	0x67F4	#CJK UNIFIED IDEOGRAPH
+0x8EC5	0x829D	#CJK UNIFIED IDEOGRAPH
+0x8EC6	0x5C61	#CJK UNIFIED IDEOGRAPH
+0x8EC7	0x854A	#CJK UNIFIED IDEOGRAPH
+0x8EC8	0x7E1E	#CJK UNIFIED IDEOGRAPH
+0x8EC9	0x820E	#CJK UNIFIED IDEOGRAPH
+0x8ECA	0x5199	#CJK UNIFIED IDEOGRAPH
+0x8ECB	0x5C04	#CJK UNIFIED IDEOGRAPH
+0x8ECC	0x6368	#CJK UNIFIED IDEOGRAPH
+0x8ECD	0x8D66	#CJK UNIFIED IDEOGRAPH
+0x8ECE	0x659C	#CJK UNIFIED IDEOGRAPH
+0x8ECF	0x716E	#CJK UNIFIED IDEOGRAPH
+0x8ED0	0x793E	#CJK UNIFIED IDEOGRAPH
+0x8ED1	0x7D17	#CJK UNIFIED IDEOGRAPH
+0x8ED2	0x8005	#CJK UNIFIED IDEOGRAPH
+0x8ED3	0x8B1D	#CJK UNIFIED IDEOGRAPH
+0x8ED4	0x8ECA	#CJK UNIFIED IDEOGRAPH
+0x8ED5	0x906E	#CJK UNIFIED IDEOGRAPH
+0x8ED6	0x86C7	#CJK UNIFIED IDEOGRAPH
+0x8ED7	0x90AA	#CJK UNIFIED IDEOGRAPH
+0x8ED8	0x501F	#CJK UNIFIED IDEOGRAPH
+0x8ED9	0x52FA	#CJK UNIFIED IDEOGRAPH
+0x8EDA	0x5C3A	#CJK UNIFIED IDEOGRAPH
+0x8EDB	0x6753	#CJK UNIFIED IDEOGRAPH
+0x8EDC	0x707C	#CJK UNIFIED IDEOGRAPH
+0x8EDD	0x7235	#CJK UNIFIED IDEOGRAPH
+0x8EDE	0x914C	#CJK UNIFIED IDEOGRAPH
+0x8EDF	0x91C8	#CJK UNIFIED IDEOGRAPH
+0x8EE0	0x932B	#CJK UNIFIED IDEOGRAPH
+0x8EE1	0x82E5	#CJK UNIFIED IDEOGRAPH
+0x8EE2	0x5BC2	#CJK UNIFIED IDEOGRAPH
+0x8EE3	0x5F31	#CJK UNIFIED IDEOGRAPH
+0x8EE4	0x60F9	#CJK UNIFIED IDEOGRAPH
+0x8EE5	0x4E3B	#CJK UNIFIED IDEOGRAPH
+0x8EE6	0x53D6	#CJK UNIFIED IDEOGRAPH
+0x8EE7	0x5B88	#CJK UNIFIED IDEOGRAPH
+0x8EE8	0x624B	#CJK UNIFIED IDEOGRAPH
+0x8EE9	0x6731	#CJK UNIFIED IDEOGRAPH
+0x8EEA	0x6B8A	#CJK UNIFIED IDEOGRAPH
+0x8EEB	0x72E9	#CJK UNIFIED IDEOGRAPH
+0x8EEC	0x73E0	#CJK UNIFIED IDEOGRAPH
+0x8EED	0x7A2E	#CJK UNIFIED IDEOGRAPH
+0x8EEE	0x816B	#CJK UNIFIED IDEOGRAPH
+0x8EEF	0x8DA3	#CJK UNIFIED IDEOGRAPH
+0x8EF0	0x9152	#CJK UNIFIED IDEOGRAPH
+0x8EF1	0x9996	#CJK UNIFIED IDEOGRAPH
+0x8EF2	0x5112	#CJK UNIFIED IDEOGRAPH
+0x8EF3	0x53D7	#CJK UNIFIED IDEOGRAPH
+0x8EF4	0x546A	#CJK UNIFIED IDEOGRAPH
+0x8EF5	0x5BFF	#CJK UNIFIED IDEOGRAPH
+0x8EF6	0x6388	#CJK UNIFIED IDEOGRAPH
+0x8EF7	0x6A39	#CJK UNIFIED IDEOGRAPH
+0x8EF8	0x7DAC	#CJK UNIFIED IDEOGRAPH
+0x8EF9	0x9700	#CJK UNIFIED IDEOGRAPH
+0x8EFA	0x56DA	#CJK UNIFIED IDEOGRAPH
+0x8EFB	0x53CE	#CJK UNIFIED IDEOGRAPH
+0x8EFC	0x5468	#CJK UNIFIED IDEOGRAPH
+0x8F40	0x5B97	#CJK UNIFIED IDEOGRAPH
+0x8F41	0x5C31	#CJK UNIFIED IDEOGRAPH
+0x8F42	0x5DDE	#CJK UNIFIED IDEOGRAPH
+0x8F43	0x4FEE	#CJK UNIFIED IDEOGRAPH
+0x8F44	0x6101	#CJK UNIFIED IDEOGRAPH
+0x8F45	0x62FE	#CJK UNIFIED IDEOGRAPH
+0x8F46	0x6D32	#CJK UNIFIED IDEOGRAPH
+0x8F47	0x79C0	#CJK UNIFIED IDEOGRAPH
+0x8F48	0x79CB	#CJK UNIFIED IDEOGRAPH
+0x8F49	0x7D42	#CJK UNIFIED IDEOGRAPH
+0x8F4A	0x7E4D	#CJK UNIFIED IDEOGRAPH
+0x8F4B	0x7FD2	#CJK UNIFIED IDEOGRAPH
+0x8F4C	0x81ED	#CJK UNIFIED IDEOGRAPH
+0x8F4D	0x821F	#CJK UNIFIED IDEOGRAPH
+0x8F4E	0x8490	#CJK UNIFIED IDEOGRAPH
+0x8F4F	0x8846	#CJK UNIFIED IDEOGRAPH
+0x8F50	0x8972	#CJK UNIFIED IDEOGRAPH
+0x8F51	0x8B90	#CJK UNIFIED IDEOGRAPH
+0x8F52	0x8E74	#CJK UNIFIED IDEOGRAPH
+0x8F53	0x8F2F	#CJK UNIFIED IDEOGRAPH
+0x8F54	0x9031	#CJK UNIFIED IDEOGRAPH
+0x8F55	0x914B	#CJK UNIFIED IDEOGRAPH
+0x8F56	0x916C	#CJK UNIFIED IDEOGRAPH
+0x8F57	0x96C6	#CJK UNIFIED IDEOGRAPH
+0x8F58	0x919C	#CJK UNIFIED IDEOGRAPH
+0x8F59	0x4EC0	#CJK UNIFIED IDEOGRAPH
+0x8F5A	0x4F4F	#CJK UNIFIED IDEOGRAPH
+0x8F5B	0x5145	#CJK UNIFIED IDEOGRAPH
+0x8F5C	0x5341	#CJK UNIFIED IDEOGRAPH
+0x8F5D	0x5F93	#CJK UNIFIED IDEOGRAPH
+0x8F5E	0x620E	#CJK UNIFIED IDEOGRAPH
+0x8F5F	0x67D4	#CJK UNIFIED IDEOGRAPH
+0x8F60	0x6C41	#CJK UNIFIED IDEOGRAPH
+0x8F61	0x6E0B	#CJK UNIFIED IDEOGRAPH
+0x8F62	0x7363	#CJK UNIFIED IDEOGRAPH
+0x8F63	0x7E26	#CJK UNIFIED IDEOGRAPH
+0x8F64	0x91CD	#CJK UNIFIED IDEOGRAPH
+0x8F65	0x9283	#CJK UNIFIED IDEOGRAPH
+0x8F66	0x53D4	#CJK UNIFIED IDEOGRAPH
+0x8F67	0x5919	#CJK UNIFIED IDEOGRAPH
+0x8F68	0x5BBF	#CJK UNIFIED IDEOGRAPH
+0x8F69	0x6DD1	#CJK UNIFIED IDEOGRAPH
+0x8F6A	0x795D	#CJK UNIFIED IDEOGRAPH
+0x8F6B	0x7E2E	#CJK UNIFIED IDEOGRAPH
+0x8F6C	0x7C9B	#CJK UNIFIED IDEOGRAPH
+0x8F6D	0x587E	#CJK UNIFIED IDEOGRAPH
+0x8F6E	0x719F	#CJK UNIFIED IDEOGRAPH
+0x8F6F	0x51FA	#CJK UNIFIED IDEOGRAPH
+0x8F70	0x8853	#CJK UNIFIED IDEOGRAPH
+0x8F71	0x8FF0	#CJK UNIFIED IDEOGRAPH
+0x8F72	0x4FCA	#CJK UNIFIED IDEOGRAPH
+0x8F73	0x5CFB	#CJK UNIFIED IDEOGRAPH
+0x8F74	0x6625	#CJK UNIFIED IDEOGRAPH
+0x8F75	0x77AC	#CJK UNIFIED IDEOGRAPH
+0x8F76	0x7AE3	#CJK UNIFIED IDEOGRAPH
+0x8F77	0x821C	#CJK UNIFIED IDEOGRAPH
+0x8F78	0x99FF	#CJK UNIFIED IDEOGRAPH
+0x8F79	0x51C6	#CJK UNIFIED IDEOGRAPH
+0x8F7A	0x5FAA	#CJK UNIFIED IDEOGRAPH
+0x8F7B	0x65EC	#CJK UNIFIED IDEOGRAPH
+0x8F7C	0x696F	#CJK UNIFIED IDEOGRAPH
+0x8F7D	0x6B89	#CJK UNIFIED IDEOGRAPH
+0x8F7E	0x6DF3	#CJK UNIFIED IDEOGRAPH
+0x8F80	0x6E96	#CJK UNIFIED IDEOGRAPH
+0x8F81	0x6F64	#CJK UNIFIED IDEOGRAPH
+0x8F82	0x76FE	#CJK UNIFIED IDEOGRAPH
+0x8F83	0x7D14	#CJK UNIFIED IDEOGRAPH
+0x8F84	0x5DE1	#CJK UNIFIED IDEOGRAPH
+0x8F85	0x9075	#CJK UNIFIED IDEOGRAPH
+0x8F86	0x9187	#CJK UNIFIED IDEOGRAPH
+0x8F87	0x9806	#CJK UNIFIED IDEOGRAPH
+0x8F88	0x51E6	#CJK UNIFIED IDEOGRAPH
+0x8F89	0x521D	#CJK UNIFIED IDEOGRAPH
+0x8F8A	0x6240	#CJK UNIFIED IDEOGRAPH
+0x8F8B	0x6691	#CJK UNIFIED IDEOGRAPH
+0x8F8C	0x66D9	#CJK UNIFIED IDEOGRAPH
+0x8F8D	0x6E1A	#CJK UNIFIED IDEOGRAPH
+0x8F8E	0x5EB6	#CJK UNIFIED IDEOGRAPH
+0x8F8F	0x7DD2	#CJK UNIFIED IDEOGRAPH
+0x8F90	0x7F72	#CJK UNIFIED IDEOGRAPH
+0x8F91	0x66F8	#CJK UNIFIED IDEOGRAPH
+0x8F92	0x85AF	#CJK UNIFIED IDEOGRAPH
+0x8F93	0x85F7	#CJK UNIFIED IDEOGRAPH
+0x8F94	0x8AF8	#CJK UNIFIED IDEOGRAPH
+0x8F95	0x52A9	#CJK UNIFIED IDEOGRAPH
+0x8F96	0x53D9	#CJK UNIFIED IDEOGRAPH
+0x8F97	0x5973	#CJK UNIFIED IDEOGRAPH
+0x8F98	0x5E8F	#CJK UNIFIED IDEOGRAPH
+0x8F99	0x5F90	#CJK UNIFIED IDEOGRAPH
+0x8F9A	0x6055	#CJK UNIFIED IDEOGRAPH
+0x8F9B	0x92E4	#CJK UNIFIED IDEOGRAPH
+0x8F9C	0x9664	#CJK UNIFIED IDEOGRAPH
+0x8F9D	0x50B7	#CJK UNIFIED IDEOGRAPH
+0x8F9E	0x511F	#CJK UNIFIED IDEOGRAPH
+0x8F9F	0x52DD	#CJK UNIFIED IDEOGRAPH
+0x8FA0	0x5320	#CJK UNIFIED IDEOGRAPH
+0x8FA1	0x5347	#CJK UNIFIED IDEOGRAPH
+0x8FA2	0x53EC	#CJK UNIFIED IDEOGRAPH
+0x8FA3	0x54E8	#CJK UNIFIED IDEOGRAPH
+0x8FA4	0x5546	#CJK UNIFIED IDEOGRAPH
+0x8FA5	0x5531	#CJK UNIFIED IDEOGRAPH
+0x8FA6	0x5617	#CJK UNIFIED IDEOGRAPH
+0x8FA7	0x5968	#CJK UNIFIED IDEOGRAPH
+0x8FA8	0x59BE	#CJK UNIFIED IDEOGRAPH
+0x8FA9	0x5A3C	#CJK UNIFIED IDEOGRAPH
+0x8FAA	0x5BB5	#CJK UNIFIED IDEOGRAPH
+0x8FAB	0x5C06	#CJK UNIFIED IDEOGRAPH
+0x8FAC	0x5C0F	#CJK UNIFIED IDEOGRAPH
+0x8FAD	0x5C11	#CJK UNIFIED IDEOGRAPH
+0x8FAE	0x5C1A	#CJK UNIFIED IDEOGRAPH
+0x8FAF	0x5E84	#CJK UNIFIED IDEOGRAPH
+0x8FB0	0x5E8A	#CJK UNIFIED IDEOGRAPH
+0x8FB1	0x5EE0	#CJK UNIFIED IDEOGRAPH
+0x8FB2	0x5F70	#CJK UNIFIED IDEOGRAPH
+0x8FB3	0x627F	#CJK UNIFIED IDEOGRAPH
+0x8FB4	0x6284	#CJK UNIFIED IDEOGRAPH
+0x8FB5	0x62DB	#CJK UNIFIED IDEOGRAPH
+0x8FB6	0x638C	#CJK UNIFIED IDEOGRAPH
+0x8FB7	0x6377	#CJK UNIFIED IDEOGRAPH
+0x8FB8	0x6607	#CJK UNIFIED IDEOGRAPH
+0x8FB9	0x660C	#CJK UNIFIED IDEOGRAPH
+0x8FBA	0x662D	#CJK UNIFIED IDEOGRAPH
+0x8FBB	0x6676	#CJK UNIFIED IDEOGRAPH
+0x8FBC	0x677E	#CJK UNIFIED IDEOGRAPH
+0x8FBD	0x68A2	#CJK UNIFIED IDEOGRAPH
+0x8FBE	0x6A1F	#CJK UNIFIED IDEOGRAPH
+0x8FBF	0x6A35	#CJK UNIFIED IDEOGRAPH
+0x8FC0	0x6CBC	#CJK UNIFIED IDEOGRAPH
+0x8FC1	0x6D88	#CJK UNIFIED IDEOGRAPH
+0x8FC2	0x6E09	#CJK UNIFIED IDEOGRAPH
+0x8FC3	0x6E58	#CJK UNIFIED IDEOGRAPH
+0x8FC4	0x713C	#CJK UNIFIED IDEOGRAPH
+0x8FC5	0x7126	#CJK UNIFIED IDEOGRAPH
+0x8FC6	0x7167	#CJK UNIFIED IDEOGRAPH
+0x8FC7	0x75C7	#CJK UNIFIED IDEOGRAPH
+0x8FC8	0x7701	#CJK UNIFIED IDEOGRAPH
+0x8FC9	0x785D	#CJK UNIFIED IDEOGRAPH
+0x8FCA	0x7901	#CJK UNIFIED IDEOGRAPH
+0x8FCB	0x7965	#CJK UNIFIED IDEOGRAPH
+0x8FCC	0x79F0	#CJK UNIFIED IDEOGRAPH
+0x8FCD	0x7AE0	#CJK UNIFIED IDEOGRAPH
+0x8FCE	0x7B11	#CJK UNIFIED IDEOGRAPH
+0x8FCF	0x7CA7	#CJK UNIFIED IDEOGRAPH
+0x8FD0	0x7D39	#CJK UNIFIED IDEOGRAPH
+0x8FD1	0x8096	#CJK UNIFIED IDEOGRAPH
+0x8FD2	0x83D6	#CJK UNIFIED IDEOGRAPH
+0x8FD3	0x848B	#CJK UNIFIED IDEOGRAPH
+0x8FD4	0x8549	#CJK UNIFIED IDEOGRAPH
+0x8FD5	0x885D	#CJK UNIFIED IDEOGRAPH
+0x8FD6	0x88F3	#CJK UNIFIED IDEOGRAPH
+0x8FD7	0x8A1F	#CJK UNIFIED IDEOGRAPH
+0x8FD8	0x8A3C	#CJK UNIFIED IDEOGRAPH
+0x8FD9	0x8A54	#CJK UNIFIED IDEOGRAPH
+0x8FDA	0x8A73	#CJK UNIFIED IDEOGRAPH
+0x8FDB	0x8C61	#CJK UNIFIED IDEOGRAPH
+0x8FDC	0x8CDE	#CJK UNIFIED IDEOGRAPH
+0x8FDD	0x91A4	#CJK UNIFIED IDEOGRAPH
+0x8FDE	0x9266	#CJK UNIFIED IDEOGRAPH
+0x8FDF	0x937E	#CJK UNIFIED IDEOGRAPH
+0x8FE0	0x9418	#CJK UNIFIED IDEOGRAPH
+0x8FE1	0x969C	#CJK UNIFIED IDEOGRAPH
+0x8FE2	0x9798	#CJK UNIFIED IDEOGRAPH
+0x8FE3	0x4E0A	#CJK UNIFIED IDEOGRAPH
+0x8FE4	0x4E08	#CJK UNIFIED IDEOGRAPH
+0x8FE5	0x4E1E	#CJK UNIFIED IDEOGRAPH
+0x8FE6	0x4E57	#CJK UNIFIED IDEOGRAPH
+0x8FE7	0x5197	#CJK UNIFIED IDEOGRAPH
+0x8FE8	0x5270	#CJK UNIFIED IDEOGRAPH
+0x8FE9	0x57CE	#CJK UNIFIED IDEOGRAPH
+0x8FEA	0x5834	#CJK UNIFIED IDEOGRAPH
+0x8FEB	0x58CC	#CJK UNIFIED IDEOGRAPH
+0x8FEC	0x5B22	#CJK UNIFIED IDEOGRAPH
+0x8FED	0x5E38	#CJK UNIFIED IDEOGRAPH
+0x8FEE	0x60C5	#CJK UNIFIED IDEOGRAPH
+0x8FEF	0x64FE	#CJK UNIFIED IDEOGRAPH
+0x8FF0	0x6761	#CJK UNIFIED IDEOGRAPH
+0x8FF1	0x6756	#CJK UNIFIED IDEOGRAPH
+0x8FF2	0x6D44	#CJK UNIFIED IDEOGRAPH
+0x8FF3	0x72B6	#CJK UNIFIED IDEOGRAPH
+0x8FF4	0x7573	#CJK UNIFIED IDEOGRAPH
+0x8FF5	0x7A63	#CJK UNIFIED IDEOGRAPH
+0x8FF6	0x84B8	#CJK UNIFIED IDEOGRAPH
+0x8FF7	0x8B72	#CJK UNIFIED IDEOGRAPH
+0x8FF8	0x91B8	#CJK UNIFIED IDEOGRAPH
+0x8FF9	0x9320	#CJK UNIFIED IDEOGRAPH
+0x8FFA	0x5631	#CJK UNIFIED IDEOGRAPH
+0x8FFB	0x57F4	#CJK UNIFIED IDEOGRAPH
+0x8FFC	0x98FE	#CJK UNIFIED IDEOGRAPH
+0x9040	0x62ED	#CJK UNIFIED IDEOGRAPH
+0x9041	0x690D	#CJK UNIFIED IDEOGRAPH
+0x9042	0x6B96	#CJK UNIFIED IDEOGRAPH
+0x9043	0x71ED	#CJK UNIFIED IDEOGRAPH
+0x9044	0x7E54	#CJK UNIFIED IDEOGRAPH
+0x9045	0x8077	#CJK UNIFIED IDEOGRAPH
+0x9046	0x8272	#CJK UNIFIED IDEOGRAPH
+0x9047	0x89E6	#CJK UNIFIED IDEOGRAPH
+0x9048	0x98DF	#CJK UNIFIED IDEOGRAPH
+0x9049	0x8755	#CJK UNIFIED IDEOGRAPH
+0x904A	0x8FB1	#CJK UNIFIED IDEOGRAPH
+0x904B	0x5C3B	#CJK UNIFIED IDEOGRAPH
+0x904C	0x4F38	#CJK UNIFIED IDEOGRAPH
+0x904D	0x4FE1	#CJK UNIFIED IDEOGRAPH
+0x904E	0x4FB5	#CJK UNIFIED IDEOGRAPH
+0x904F	0x5507	#CJK UNIFIED IDEOGRAPH
+0x9050	0x5A20	#CJK UNIFIED IDEOGRAPH
+0x9051	0x5BDD	#CJK UNIFIED IDEOGRAPH
+0x9052	0x5BE9	#CJK UNIFIED IDEOGRAPH
+0x9053	0x5FC3	#CJK UNIFIED IDEOGRAPH
+0x9054	0x614E	#CJK UNIFIED IDEOGRAPH
+0x9055	0x632F	#CJK UNIFIED IDEOGRAPH
+0x9056	0x65B0	#CJK UNIFIED IDEOGRAPH
+0x9057	0x664B	#CJK UNIFIED IDEOGRAPH
+0x9058	0x68EE	#CJK UNIFIED IDEOGRAPH
+0x9059	0x699B	#CJK UNIFIED IDEOGRAPH
+0x905A	0x6D78	#CJK UNIFIED IDEOGRAPH
+0x905B	0x6DF1	#CJK UNIFIED IDEOGRAPH
+0x905C	0x7533	#CJK UNIFIED IDEOGRAPH
+0x905D	0x75B9	#CJK UNIFIED IDEOGRAPH
+0x905E	0x771F	#CJK UNIFIED IDEOGRAPH
+0x905F	0x795E	#CJK UNIFIED IDEOGRAPH
+0x9060	0x79E6	#CJK UNIFIED IDEOGRAPH
+0x9061	0x7D33	#CJK UNIFIED IDEOGRAPH
+0x9062	0x81E3	#CJK UNIFIED IDEOGRAPH
+0x9063	0x82AF	#CJK UNIFIED IDEOGRAPH
+0x9064	0x85AA	#CJK UNIFIED IDEOGRAPH
+0x9065	0x89AA	#CJK UNIFIED IDEOGRAPH
+0x9066	0x8A3A	#CJK UNIFIED IDEOGRAPH
+0x9067	0x8EAB	#CJK UNIFIED IDEOGRAPH
+0x9068	0x8F9B	#CJK UNIFIED IDEOGRAPH
+0x9069	0x9032	#CJK UNIFIED IDEOGRAPH
+0x906A	0x91DD	#CJK UNIFIED IDEOGRAPH
+0x906B	0x9707	#CJK UNIFIED IDEOGRAPH
+0x906C	0x4EBA	#CJK UNIFIED IDEOGRAPH
+0x906D	0x4EC1	#CJK UNIFIED IDEOGRAPH
+0x906E	0x5203	#CJK UNIFIED IDEOGRAPH
+0x906F	0x5875	#CJK UNIFIED IDEOGRAPH
+0x9070	0x58EC	#CJK UNIFIED IDEOGRAPH
+0x9071	0x5C0B	#CJK UNIFIED IDEOGRAPH
+0x9072	0x751A	#CJK UNIFIED IDEOGRAPH
+0x9073	0x5C3D	#CJK UNIFIED IDEOGRAPH
+0x9074	0x814E	#CJK UNIFIED IDEOGRAPH
+0x9075	0x8A0A	#CJK UNIFIED IDEOGRAPH
+0x9076	0x8FC5	#CJK UNIFIED IDEOGRAPH
+0x9077	0x9663	#CJK UNIFIED IDEOGRAPH
+0x9078	0x976D	#CJK UNIFIED IDEOGRAPH
+0x9079	0x7B25	#CJK UNIFIED IDEOGRAPH
+0x907A	0x8ACF	#CJK UNIFIED IDEOGRAPH
+0x907B	0x9808	#CJK UNIFIED IDEOGRAPH
+0x907C	0x9162	#CJK UNIFIED IDEOGRAPH
+0x907D	0x56F3	#CJK UNIFIED IDEOGRAPH
+0x907E	0x53A8	#CJK UNIFIED IDEOGRAPH
+0x9080	0x9017	#CJK UNIFIED IDEOGRAPH
+0x9081	0x5439	#CJK UNIFIED IDEOGRAPH
+0x9082	0x5782	#CJK UNIFIED IDEOGRAPH
+0x9083	0x5E25	#CJK UNIFIED IDEOGRAPH
+0x9084	0x63A8	#CJK UNIFIED IDEOGRAPH
+0x9085	0x6C34	#CJK UNIFIED IDEOGRAPH
+0x9086	0x708A	#CJK UNIFIED IDEOGRAPH
+0x9087	0x7761	#CJK UNIFIED IDEOGRAPH
+0x9088	0x7C8B	#CJK UNIFIED IDEOGRAPH
+0x9089	0x7FE0	#CJK UNIFIED IDEOGRAPH
+0x908A	0x8870	#CJK UNIFIED IDEOGRAPH
+0x908B	0x9042	#CJK UNIFIED IDEOGRAPH
+0x908C	0x9154	#CJK UNIFIED IDEOGRAPH
+0x908D	0x9310	#CJK UNIFIED IDEOGRAPH
+0x908E	0x9318	#CJK UNIFIED IDEOGRAPH
+0x908F	0x968F	#CJK UNIFIED IDEOGRAPH
+0x9090	0x745E	#CJK UNIFIED IDEOGRAPH
+0x9091	0x9AC4	#CJK UNIFIED IDEOGRAPH
+0x9092	0x5D07	#CJK UNIFIED IDEOGRAPH
+0x9093	0x5D69	#CJK UNIFIED IDEOGRAPH
+0x9094	0x6570	#CJK UNIFIED IDEOGRAPH
+0x9095	0x67A2	#CJK UNIFIED IDEOGRAPH
+0x9096	0x8DA8	#CJK UNIFIED IDEOGRAPH
+0x9097	0x96DB	#CJK UNIFIED IDEOGRAPH
+0x9098	0x636E	#CJK UNIFIED IDEOGRAPH
+0x9099	0x6749	#CJK UNIFIED IDEOGRAPH
+0x909A	0x6919	#CJK UNIFIED IDEOGRAPH
+0x909B	0x83C5	#CJK UNIFIED IDEOGRAPH
+0x909C	0x9817	#CJK UNIFIED IDEOGRAPH
+0x909D	0x96C0	#CJK UNIFIED IDEOGRAPH
+0x909E	0x88FE	#CJK UNIFIED IDEOGRAPH
+0x909F	0x6F84	#CJK UNIFIED IDEOGRAPH
+0x90A0	0x647A	#CJK UNIFIED IDEOGRAPH
+0x90A1	0x5BF8	#CJK UNIFIED IDEOGRAPH
+0x90A2	0x4E16	#CJK UNIFIED IDEOGRAPH
+0x90A3	0x702C	#CJK UNIFIED IDEOGRAPH
+0x90A4	0x755D	#CJK UNIFIED IDEOGRAPH
+0x90A5	0x662F	#CJK UNIFIED IDEOGRAPH
+0x90A6	0x51C4	#CJK UNIFIED IDEOGRAPH
+0x90A7	0x5236	#CJK UNIFIED IDEOGRAPH
+0x90A8	0x52E2	#CJK UNIFIED IDEOGRAPH
+0x90A9	0x59D3	#CJK UNIFIED IDEOGRAPH
+0x90AA	0x5F81	#CJK UNIFIED IDEOGRAPH
+0x90AB	0x6027	#CJK UNIFIED IDEOGRAPH
+0x90AC	0x6210	#CJK UNIFIED IDEOGRAPH
+0x90AD	0x653F	#CJK UNIFIED IDEOGRAPH
+0x90AE	0x6574	#CJK UNIFIED IDEOGRAPH
+0x90AF	0x661F	#CJK UNIFIED IDEOGRAPH
+0x90B0	0x6674	#CJK UNIFIED IDEOGRAPH
+0x90B1	0x68F2	#CJK UNIFIED IDEOGRAPH
+0x90B2	0x6816	#CJK UNIFIED IDEOGRAPH
+0x90B3	0x6B63	#CJK UNIFIED IDEOGRAPH
+0x90B4	0x6E05	#CJK UNIFIED IDEOGRAPH
+0x90B5	0x7272	#CJK UNIFIED IDEOGRAPH
+0x90B6	0x751F	#CJK UNIFIED IDEOGRAPH
+0x90B7	0x76DB	#CJK UNIFIED IDEOGRAPH
+0x90B8	0x7CBE	#CJK UNIFIED IDEOGRAPH
+0x90B9	0x8056	#CJK UNIFIED IDEOGRAPH
+0x90BA	0x58F0	#CJK UNIFIED IDEOGRAPH
+0x90BB	0x88FD	#CJK UNIFIED IDEOGRAPH
+0x90BC	0x897F	#CJK UNIFIED IDEOGRAPH
+0x90BD	0x8AA0	#CJK UNIFIED IDEOGRAPH
+0x90BE	0x8A93	#CJK UNIFIED IDEOGRAPH
+0x90BF	0x8ACB	#CJK UNIFIED IDEOGRAPH
+0x90C0	0x901D	#CJK UNIFIED IDEOGRAPH
+0x90C1	0x9192	#CJK UNIFIED IDEOGRAPH
+0x90C2	0x9752	#CJK UNIFIED IDEOGRAPH
+0x90C3	0x9759	#CJK UNIFIED IDEOGRAPH
+0x90C4	0x6589	#CJK UNIFIED IDEOGRAPH
+0x90C5	0x7A0E	#CJK UNIFIED IDEOGRAPH
+0x90C6	0x8106	#CJK UNIFIED IDEOGRAPH
+0x90C7	0x96BB	#CJK UNIFIED IDEOGRAPH
+0x90C8	0x5E2D	#CJK UNIFIED IDEOGRAPH
+0x90C9	0x60DC	#CJK UNIFIED IDEOGRAPH
+0x90CA	0x621A	#CJK UNIFIED IDEOGRAPH
+0x90CB	0x65A5	#CJK UNIFIED IDEOGRAPH
+0x90CC	0x6614	#CJK UNIFIED IDEOGRAPH
+0x90CD	0x6790	#CJK UNIFIED IDEOGRAPH
+0x90CE	0x77F3	#CJK UNIFIED IDEOGRAPH
+0x90CF	0x7A4D	#CJK UNIFIED IDEOGRAPH
+0x90D0	0x7C4D	#CJK UNIFIED IDEOGRAPH
+0x90D1	0x7E3E	#CJK UNIFIED IDEOGRAPH
+0x90D2	0x810A	#CJK UNIFIED IDEOGRAPH
+0x90D3	0x8CAC	#CJK UNIFIED IDEOGRAPH
+0x90D4	0x8D64	#CJK UNIFIED IDEOGRAPH
+0x90D5	0x8DE1	#CJK UNIFIED IDEOGRAPH
+0x90D6	0x8E5F	#CJK UNIFIED IDEOGRAPH
+0x90D7	0x78A9	#CJK UNIFIED IDEOGRAPH
+0x90D8	0x5207	#CJK UNIFIED IDEOGRAPH
+0x90D9	0x62D9	#CJK UNIFIED IDEOGRAPH
+0x90DA	0x63A5	#CJK UNIFIED IDEOGRAPH
+0x90DB	0x6442	#CJK UNIFIED IDEOGRAPH
+0x90DC	0x6298	#CJK UNIFIED IDEOGRAPH
+0x90DD	0x8A2D	#CJK UNIFIED IDEOGRAPH
+0x90DE	0x7A83	#CJK UNIFIED IDEOGRAPH
+0x90DF	0x7BC0	#CJK UNIFIED IDEOGRAPH
+0x90E0	0x8AAC	#CJK UNIFIED IDEOGRAPH
+0x90E1	0x96EA	#CJK UNIFIED IDEOGRAPH
+0x90E2	0x7D76	#CJK UNIFIED IDEOGRAPH
+0x90E3	0x820C	#CJK UNIFIED IDEOGRAPH
+0x90E4	0x8749	#CJK UNIFIED IDEOGRAPH
+0x90E5	0x4ED9	#CJK UNIFIED IDEOGRAPH
+0x90E6	0x5148	#CJK UNIFIED IDEOGRAPH
+0x90E7	0x5343	#CJK UNIFIED IDEOGRAPH
+0x90E8	0x5360	#CJK UNIFIED IDEOGRAPH
+0x90E9	0x5BA3	#CJK UNIFIED IDEOGRAPH
+0x90EA	0x5C02	#CJK UNIFIED IDEOGRAPH
+0x90EB	0x5C16	#CJK UNIFIED IDEOGRAPH
+0x90EC	0x5DDD	#CJK UNIFIED IDEOGRAPH
+0x90ED	0x6226	#CJK UNIFIED IDEOGRAPH
+0x90EE	0x6247	#CJK UNIFIED IDEOGRAPH
+0x90EF	0x64B0	#CJK UNIFIED IDEOGRAPH
+0x90F0	0x6813	#CJK UNIFIED IDEOGRAPH
+0x90F1	0x6834	#CJK UNIFIED IDEOGRAPH
+0x90F2	0x6CC9	#CJK UNIFIED IDEOGRAPH
+0x90F3	0x6D45	#CJK UNIFIED IDEOGRAPH
+0x90F4	0x6D17	#CJK UNIFIED IDEOGRAPH
+0x90F5	0x67D3	#CJK UNIFIED IDEOGRAPH
+0x90F6	0x6F5C	#CJK UNIFIED IDEOGRAPH
+0x90F7	0x714E	#CJK UNIFIED IDEOGRAPH
+0x90F8	0x717D	#CJK UNIFIED IDEOGRAPH
+0x90F9	0x65CB	#CJK UNIFIED IDEOGRAPH
+0x90FA	0x7A7F	#CJK UNIFIED IDEOGRAPH
+0x90FB	0x7BAD	#CJK UNIFIED IDEOGRAPH
+0x90FC	0x7DDA	#CJK UNIFIED IDEOGRAPH
+0x9140	0x7E4A	#CJK UNIFIED IDEOGRAPH
+0x9141	0x7FA8	#CJK UNIFIED IDEOGRAPH
+0x9142	0x817A	#CJK UNIFIED IDEOGRAPH
+0x9143	0x821B	#CJK UNIFIED IDEOGRAPH
+0x9144	0x8239	#CJK UNIFIED IDEOGRAPH
+0x9145	0x85A6	#CJK UNIFIED IDEOGRAPH
+0x9146	0x8A6E	#CJK UNIFIED IDEOGRAPH
+0x9147	0x8CCE	#CJK UNIFIED IDEOGRAPH
+0x9148	0x8DF5	#CJK UNIFIED IDEOGRAPH
+0x9149	0x9078	#CJK UNIFIED IDEOGRAPH
+0x914A	0x9077	#CJK UNIFIED IDEOGRAPH
+0x914B	0x92AD	#CJK UNIFIED IDEOGRAPH
+0x914C	0x9291	#CJK UNIFIED IDEOGRAPH
+0x914D	0x9583	#CJK UNIFIED IDEOGRAPH
+0x914E	0x9BAE	#CJK UNIFIED IDEOGRAPH
+0x914F	0x524D	#CJK UNIFIED IDEOGRAPH
+0x9150	0x5584	#CJK UNIFIED IDEOGRAPH
+0x9151	0x6F38	#CJK UNIFIED IDEOGRAPH
+0x9152	0x7136	#CJK UNIFIED IDEOGRAPH
+0x9153	0x5168	#CJK UNIFIED IDEOGRAPH
+0x9154	0x7985	#CJK UNIFIED IDEOGRAPH
+0x9155	0x7E55	#CJK UNIFIED IDEOGRAPH
+0x9156	0x81B3	#CJK UNIFIED IDEOGRAPH
+0x9157	0x7CCE	#CJK UNIFIED IDEOGRAPH
+0x9158	0x564C	#CJK UNIFIED IDEOGRAPH
+0x9159	0x5851	#CJK UNIFIED IDEOGRAPH
+0x915A	0x5CA8	#CJK UNIFIED IDEOGRAPH
+0x915B	0x63AA	#CJK UNIFIED IDEOGRAPH
+0x915C	0x66FE	#CJK UNIFIED IDEOGRAPH
+0x915D	0x66FD	#CJK UNIFIED IDEOGRAPH
+0x915E	0x695A	#CJK UNIFIED IDEOGRAPH
+0x915F	0x72D9	#CJK UNIFIED IDEOGRAPH
+0x9160	0x758F	#CJK UNIFIED IDEOGRAPH
+0x9161	0x758E	#CJK UNIFIED IDEOGRAPH
+0x9162	0x790E	#CJK UNIFIED IDEOGRAPH
+0x9163	0x7956	#CJK UNIFIED IDEOGRAPH
+0x9164	0x79DF	#CJK UNIFIED IDEOGRAPH
+0x9165	0x7C97	#CJK UNIFIED IDEOGRAPH
+0x9166	0x7D20	#CJK UNIFIED IDEOGRAPH
+0x9167	0x7D44	#CJK UNIFIED IDEOGRAPH
+0x9168	0x8607	#CJK UNIFIED IDEOGRAPH
+0x9169	0x8A34	#CJK UNIFIED IDEOGRAPH
+0x916A	0x963B	#CJK UNIFIED IDEOGRAPH
+0x916B	0x9061	#CJK UNIFIED IDEOGRAPH
+0x916C	0x9F20	#CJK UNIFIED IDEOGRAPH
+0x916D	0x50E7	#CJK UNIFIED IDEOGRAPH
+0x916E	0x5275	#CJK UNIFIED IDEOGRAPH
+0x916F	0x53CC	#CJK UNIFIED IDEOGRAPH
+0x9170	0x53E2	#CJK UNIFIED IDEOGRAPH
+0x9171	0x5009	#CJK UNIFIED IDEOGRAPH
+0x9172	0x55AA	#CJK UNIFIED IDEOGRAPH
+0x9173	0x58EE	#CJK UNIFIED IDEOGRAPH
+0x9174	0x594F	#CJK UNIFIED IDEOGRAPH
+0x9175	0x723D	#CJK UNIFIED IDEOGRAPH
+0x9176	0x5B8B	#CJK UNIFIED IDEOGRAPH
+0x9177	0x5C64	#CJK UNIFIED IDEOGRAPH
+0x9178	0x531D	#CJK UNIFIED IDEOGRAPH
+0x9179	0x60E3	#CJK UNIFIED IDEOGRAPH
+0x917A	0x60F3	#CJK UNIFIED IDEOGRAPH
+0x917B	0x635C	#CJK UNIFIED IDEOGRAPH
+0x917C	0x6383	#CJK UNIFIED IDEOGRAPH
+0x917D	0x633F	#CJK UNIFIED IDEOGRAPH
+0x917E	0x63BB	#CJK UNIFIED IDEOGRAPH
+0x9180	0x64CD	#CJK UNIFIED IDEOGRAPH
+0x9181	0x65E9	#CJK UNIFIED IDEOGRAPH
+0x9182	0x66F9	#CJK UNIFIED IDEOGRAPH
+0x9183	0x5DE3	#CJK UNIFIED IDEOGRAPH
+0x9184	0x69CD	#CJK UNIFIED IDEOGRAPH
+0x9185	0x69FD	#CJK UNIFIED IDEOGRAPH
+0x9186	0x6F15	#CJK UNIFIED IDEOGRAPH
+0x9187	0x71E5	#CJK UNIFIED IDEOGRAPH
+0x9188	0x4E89	#CJK UNIFIED IDEOGRAPH
+0x9189	0x75E9	#CJK UNIFIED IDEOGRAPH
+0x918A	0x76F8	#CJK UNIFIED IDEOGRAPH
+0x918B	0x7A93	#CJK UNIFIED IDEOGRAPH
+0x918C	0x7CDF	#CJK UNIFIED IDEOGRAPH
+0x918D	0x7DCF	#CJK UNIFIED IDEOGRAPH
+0x918E	0x7D9C	#CJK UNIFIED IDEOGRAPH
+0x918F	0x8061	#CJK UNIFIED IDEOGRAPH
+0x9190	0x8349	#CJK UNIFIED IDEOGRAPH
+0x9191	0x8358	#CJK UNIFIED IDEOGRAPH
+0x9192	0x846C	#CJK UNIFIED IDEOGRAPH
+0x9193	0x84BC	#CJK UNIFIED IDEOGRAPH
+0x9194	0x85FB	#CJK UNIFIED IDEOGRAPH
+0x9195	0x88C5	#CJK UNIFIED IDEOGRAPH
+0x9196	0x8D70	#CJK UNIFIED IDEOGRAPH
+0x9197	0x9001	#CJK UNIFIED IDEOGRAPH
+0x9198	0x906D	#CJK UNIFIED IDEOGRAPH
+0x9199	0x9397	#CJK UNIFIED IDEOGRAPH
+0x919A	0x971C	#CJK UNIFIED IDEOGRAPH
+0x919B	0x9A12	#CJK UNIFIED IDEOGRAPH
+0x919C	0x50CF	#CJK UNIFIED IDEOGRAPH
+0x919D	0x5897	#CJK UNIFIED IDEOGRAPH
+0x919E	0x618E	#CJK UNIFIED IDEOGRAPH
+0x919F	0x81D3	#CJK UNIFIED IDEOGRAPH
+0x91A0	0x8535	#CJK UNIFIED IDEOGRAPH
+0x91A1	0x8D08	#CJK UNIFIED IDEOGRAPH
+0x91A2	0x9020	#CJK UNIFIED IDEOGRAPH
+0x91A3	0x4FC3	#CJK UNIFIED IDEOGRAPH
+0x91A4	0x5074	#CJK UNIFIED IDEOGRAPH
+0x91A5	0x5247	#CJK UNIFIED IDEOGRAPH
+0x91A6	0x5373	#CJK UNIFIED IDEOGRAPH
+0x91A7	0x606F	#CJK UNIFIED IDEOGRAPH
+0x91A8	0x6349	#CJK UNIFIED IDEOGRAPH
+0x91A9	0x675F	#CJK UNIFIED IDEOGRAPH
+0x91AA	0x6E2C	#CJK UNIFIED IDEOGRAPH
+0x91AB	0x8DB3	#CJK UNIFIED IDEOGRAPH
+0x91AC	0x901F	#CJK UNIFIED IDEOGRAPH
+0x91AD	0x4FD7	#CJK UNIFIED IDEOGRAPH
+0x91AE	0x5C5E	#CJK UNIFIED IDEOGRAPH
+0x91AF	0x8CCA	#CJK UNIFIED IDEOGRAPH
+0x91B0	0x65CF	#CJK UNIFIED IDEOGRAPH
+0x91B1	0x7D9A	#CJK UNIFIED IDEOGRAPH
+0x91B2	0x5352	#CJK UNIFIED IDEOGRAPH
+0x91B3	0x8896	#CJK UNIFIED IDEOGRAPH
+0x91B4	0x5176	#CJK UNIFIED IDEOGRAPH
+0x91B5	0x63C3	#CJK UNIFIED IDEOGRAPH
+0x91B6	0x5B58	#CJK UNIFIED IDEOGRAPH
+0x91B7	0x5B6B	#CJK UNIFIED IDEOGRAPH
+0x91B8	0x5C0A	#CJK UNIFIED IDEOGRAPH
+0x91B9	0x640D	#CJK UNIFIED IDEOGRAPH
+0x91BA	0x6751	#CJK UNIFIED IDEOGRAPH
+0x91BB	0x905C	#CJK UNIFIED IDEOGRAPH
+0x91BC	0x4ED6	#CJK UNIFIED IDEOGRAPH
+0x91BD	0x591A	#CJK UNIFIED IDEOGRAPH
+0x91BE	0x592A	#CJK UNIFIED IDEOGRAPH
+0x91BF	0x6C70	#CJK UNIFIED IDEOGRAPH
+0x91C0	0x8A51	#CJK UNIFIED IDEOGRAPH
+0x91C1	0x553E	#CJK UNIFIED IDEOGRAPH
+0x91C2	0x5815	#CJK UNIFIED IDEOGRAPH
+0x91C3	0x59A5	#CJK UNIFIED IDEOGRAPH
+0x91C4	0x60F0	#CJK UNIFIED IDEOGRAPH
+0x91C5	0x6253	#CJK UNIFIED IDEOGRAPH
+0x91C6	0x67C1	#CJK UNIFIED IDEOGRAPH
+0x91C7	0x8235	#CJK UNIFIED IDEOGRAPH
+0x91C8	0x6955	#CJK UNIFIED IDEOGRAPH
+0x91C9	0x9640	#CJK UNIFIED IDEOGRAPH
+0x91CA	0x99C4	#CJK UNIFIED IDEOGRAPH
+0x91CB	0x9A28	#CJK UNIFIED IDEOGRAPH
+0x91CC	0x4F53	#CJK UNIFIED IDEOGRAPH
+0x91CD	0x5806	#CJK UNIFIED IDEOGRAPH
+0x91CE	0x5BFE	#CJK UNIFIED IDEOGRAPH
+0x91CF	0x8010	#CJK UNIFIED IDEOGRAPH
+0x91D0	0x5CB1	#CJK UNIFIED IDEOGRAPH
+0x91D1	0x5E2F	#CJK UNIFIED IDEOGRAPH
+0x91D2	0x5F85	#CJK UNIFIED IDEOGRAPH
+0x91D3	0x6020	#CJK UNIFIED IDEOGRAPH
+0x91D4	0x614B	#CJK UNIFIED IDEOGRAPH
+0x91D5	0x6234	#CJK UNIFIED IDEOGRAPH
+0x91D6	0x66FF	#CJK UNIFIED IDEOGRAPH
+0x91D7	0x6CF0	#CJK UNIFIED IDEOGRAPH
+0x91D8	0x6EDE	#CJK UNIFIED IDEOGRAPH
+0x91D9	0x80CE	#CJK UNIFIED IDEOGRAPH
+0x91DA	0x817F	#CJK UNIFIED IDEOGRAPH
+0x91DB	0x82D4	#CJK UNIFIED IDEOGRAPH
+0x91DC	0x888B	#CJK UNIFIED IDEOGRAPH
+0x91DD	0x8CB8	#CJK UNIFIED IDEOGRAPH
+0x91DE	0x9000	#CJK UNIFIED IDEOGRAPH
+0x91DF	0x902E	#CJK UNIFIED IDEOGRAPH
+0x91E0	0x968A	#CJK UNIFIED IDEOGRAPH
+0x91E1	0x9EDB	#CJK UNIFIED IDEOGRAPH
+0x91E2	0x9BDB	#CJK UNIFIED IDEOGRAPH
+0x91E3	0x4EE3	#CJK UNIFIED IDEOGRAPH
+0x91E4	0x53F0	#CJK UNIFIED IDEOGRAPH
+0x91E5	0x5927	#CJK UNIFIED IDEOGRAPH
+0x91E6	0x7B2C	#CJK UNIFIED IDEOGRAPH
+0x91E7	0x918D	#CJK UNIFIED IDEOGRAPH
+0x91E8	0x984C	#CJK UNIFIED IDEOGRAPH
+0x91E9	0x9DF9	#CJK UNIFIED IDEOGRAPH
+0x91EA	0x6EDD	#CJK UNIFIED IDEOGRAPH
+0x91EB	0x7027	#CJK UNIFIED IDEOGRAPH
+0x91EC	0x5353	#CJK UNIFIED IDEOGRAPH
+0x91ED	0x5544	#CJK UNIFIED IDEOGRAPH
+0x91EE	0x5B85	#CJK UNIFIED IDEOGRAPH
+0x91EF	0x6258	#CJK UNIFIED IDEOGRAPH
+0x91F0	0x629E	#CJK UNIFIED IDEOGRAPH
+0x91F1	0x62D3	#CJK UNIFIED IDEOGRAPH
+0x91F2	0x6CA2	#CJK UNIFIED IDEOGRAPH
+0x91F3	0x6FEF	#CJK UNIFIED IDEOGRAPH
+0x91F4	0x7422	#CJK UNIFIED IDEOGRAPH
+0x91F5	0x8A17	#CJK UNIFIED IDEOGRAPH
+0x91F6	0x9438	#CJK UNIFIED IDEOGRAPH
+0x91F7	0x6FC1	#CJK UNIFIED IDEOGRAPH
+0x91F8	0x8AFE	#CJK UNIFIED IDEOGRAPH
+0x91F9	0x8338	#CJK UNIFIED IDEOGRAPH
+0x91FA	0x51E7	#CJK UNIFIED IDEOGRAPH
+0x91FB	0x86F8	#CJK UNIFIED IDEOGRAPH
+0x91FC	0x53EA	#CJK UNIFIED IDEOGRAPH
+0x9240	0x53E9	#CJK UNIFIED IDEOGRAPH
+0x9241	0x4F46	#CJK UNIFIED IDEOGRAPH
+0x9242	0x9054	#CJK UNIFIED IDEOGRAPH
+0x9243	0x8FB0	#CJK UNIFIED IDEOGRAPH
+0x9244	0x596A	#CJK UNIFIED IDEOGRAPH
+0x9245	0x8131	#CJK UNIFIED IDEOGRAPH
+0x9246	0x5DFD	#CJK UNIFIED IDEOGRAPH
+0x9247	0x7AEA	#CJK UNIFIED IDEOGRAPH
+0x9248	0x8FBF	#CJK UNIFIED IDEOGRAPH
+0x9249	0x68DA	#CJK UNIFIED IDEOGRAPH
+0x924A	0x8C37	#CJK UNIFIED IDEOGRAPH
+0x924B	0x72F8	#CJK UNIFIED IDEOGRAPH
+0x924C	0x9C48	#CJK UNIFIED IDEOGRAPH
+0x924D	0x6A3D	#CJK UNIFIED IDEOGRAPH
+0x924E	0x8AB0	#CJK UNIFIED IDEOGRAPH
+0x924F	0x4E39	#CJK UNIFIED IDEOGRAPH
+0x9250	0x5358	#CJK UNIFIED IDEOGRAPH
+0x9251	0x5606	#CJK UNIFIED IDEOGRAPH
+0x9252	0x5766	#CJK UNIFIED IDEOGRAPH
+0x9253	0x62C5	#CJK UNIFIED IDEOGRAPH
+0x9254	0x63A2	#CJK UNIFIED IDEOGRAPH
+0x9255	0x65E6	#CJK UNIFIED IDEOGRAPH
+0x9256	0x6B4E	#CJK UNIFIED IDEOGRAPH
+0x9257	0x6DE1	#CJK UNIFIED IDEOGRAPH
+0x9258	0x6E5B	#CJK UNIFIED IDEOGRAPH
+0x9259	0x70AD	#CJK UNIFIED IDEOGRAPH
+0x925A	0x77ED	#CJK UNIFIED IDEOGRAPH
+0x925B	0x7AEF	#CJK UNIFIED IDEOGRAPH
+0x925C	0x7BAA	#CJK UNIFIED IDEOGRAPH
+0x925D	0x7DBB	#CJK UNIFIED IDEOGRAPH
+0x925E	0x803D	#CJK UNIFIED IDEOGRAPH
+0x925F	0x80C6	#CJK UNIFIED IDEOGRAPH
+0x9260	0x86CB	#CJK UNIFIED IDEOGRAPH
+0x9261	0x8A95	#CJK UNIFIED IDEOGRAPH
+0x9262	0x935B	#CJK UNIFIED IDEOGRAPH
+0x9263	0x56E3	#CJK UNIFIED IDEOGRAPH
+0x9264	0x58C7	#CJK UNIFIED IDEOGRAPH
+0x9265	0x5F3E	#CJK UNIFIED IDEOGRAPH
+0x9266	0x65AD	#CJK UNIFIED IDEOGRAPH
+0x9267	0x6696	#CJK UNIFIED IDEOGRAPH
+0x9268	0x6A80	#CJK UNIFIED IDEOGRAPH
+0x9269	0x6BB5	#CJK UNIFIED IDEOGRAPH
+0x926A	0x7537	#CJK UNIFIED IDEOGRAPH
+0x926B	0x8AC7	#CJK UNIFIED IDEOGRAPH
+0x926C	0x5024	#CJK UNIFIED IDEOGRAPH
+0x926D	0x77E5	#CJK UNIFIED IDEOGRAPH
+0x926E	0x5730	#CJK UNIFIED IDEOGRAPH
+0x926F	0x5F1B	#CJK UNIFIED IDEOGRAPH
+0x9270	0x6065	#CJK UNIFIED IDEOGRAPH
+0x9271	0x667A	#CJK UNIFIED IDEOGRAPH
+0x9272	0x6C60	#CJK UNIFIED IDEOGRAPH
+0x9273	0x75F4	#CJK UNIFIED IDEOGRAPH
+0x9274	0x7A1A	#CJK UNIFIED IDEOGRAPH
+0x9275	0x7F6E	#CJK UNIFIED IDEOGRAPH
+0x9276	0x81F4	#CJK UNIFIED IDEOGRAPH
+0x9277	0x8718	#CJK UNIFIED IDEOGRAPH
+0x9278	0x9045	#CJK UNIFIED IDEOGRAPH
+0x9279	0x99B3	#CJK UNIFIED IDEOGRAPH
+0x927A	0x7BC9	#CJK UNIFIED IDEOGRAPH
+0x927B	0x755C	#CJK UNIFIED IDEOGRAPH
+0x927C	0x7AF9	#CJK UNIFIED IDEOGRAPH
+0x927D	0x7B51	#CJK UNIFIED IDEOGRAPH
+0x927E	0x84C4	#CJK UNIFIED IDEOGRAPH
+0x9280	0x9010	#CJK UNIFIED IDEOGRAPH
+0x9281	0x79E9	#CJK UNIFIED IDEOGRAPH
+0x9282	0x7A92	#CJK UNIFIED IDEOGRAPH
+0x9283	0x8336	#CJK UNIFIED IDEOGRAPH
+0x9284	0x5AE1	#CJK UNIFIED IDEOGRAPH
+0x9285	0x7740	#CJK UNIFIED IDEOGRAPH
+0x9286	0x4E2D	#CJK UNIFIED IDEOGRAPH
+0x9287	0x4EF2	#CJK UNIFIED IDEOGRAPH
+0x9288	0x5B99	#CJK UNIFIED IDEOGRAPH
+0x9289	0x5FE0	#CJK UNIFIED IDEOGRAPH
+0x928A	0x62BD	#CJK UNIFIED IDEOGRAPH
+0x928B	0x663C	#CJK UNIFIED IDEOGRAPH
+0x928C	0x67F1	#CJK UNIFIED IDEOGRAPH
+0x928D	0x6CE8	#CJK UNIFIED IDEOGRAPH
+0x928E	0x866B	#CJK UNIFIED IDEOGRAPH
+0x928F	0x8877	#CJK UNIFIED IDEOGRAPH
+0x9290	0x8A3B	#CJK UNIFIED IDEOGRAPH
+0x9291	0x914E	#CJK UNIFIED IDEOGRAPH
+0x9292	0x92F3	#CJK UNIFIED IDEOGRAPH
+0x9293	0x99D0	#CJK UNIFIED IDEOGRAPH
+0x9294	0x6A17	#CJK UNIFIED IDEOGRAPH
+0x9295	0x7026	#CJK UNIFIED IDEOGRAPH
+0x9296	0x732A	#CJK UNIFIED IDEOGRAPH
+0x9297	0x82E7	#CJK UNIFIED IDEOGRAPH
+0x9298	0x8457	#CJK UNIFIED IDEOGRAPH
+0x9299	0x8CAF	#CJK UNIFIED IDEOGRAPH
+0x929A	0x4E01	#CJK UNIFIED IDEOGRAPH
+0x929B	0x5146	#CJK UNIFIED IDEOGRAPH
+0x929C	0x51CB	#CJK UNIFIED IDEOGRAPH
+0x929D	0x558B	#CJK UNIFIED IDEOGRAPH
+0x929E	0x5BF5	#CJK UNIFIED IDEOGRAPH
+0x929F	0x5E16	#CJK UNIFIED IDEOGRAPH
+0x92A0	0x5E33	#CJK UNIFIED IDEOGRAPH
+0x92A1	0x5E81	#CJK UNIFIED IDEOGRAPH
+0x92A2	0x5F14	#CJK UNIFIED IDEOGRAPH
+0x92A3	0x5F35	#CJK UNIFIED IDEOGRAPH
+0x92A4	0x5F6B	#CJK UNIFIED IDEOGRAPH
+0x92A5	0x5FB4	#CJK UNIFIED IDEOGRAPH
+0x92A6	0x61F2	#CJK UNIFIED IDEOGRAPH
+0x92A7	0x6311	#CJK UNIFIED IDEOGRAPH
+0x92A8	0x66A2	#CJK UNIFIED IDEOGRAPH
+0x92A9	0x671D	#CJK UNIFIED IDEOGRAPH
+0x92AA	0x6F6E	#CJK UNIFIED IDEOGRAPH
+0x92AB	0x7252	#CJK UNIFIED IDEOGRAPH
+0x92AC	0x753A	#CJK UNIFIED IDEOGRAPH
+0x92AD	0x773A	#CJK UNIFIED IDEOGRAPH
+0x92AE	0x8074	#CJK UNIFIED IDEOGRAPH
+0x92AF	0x8139	#CJK UNIFIED IDEOGRAPH
+0x92B0	0x8178	#CJK UNIFIED IDEOGRAPH
+0x92B1	0x8776	#CJK UNIFIED IDEOGRAPH
+0x92B2	0x8ABF	#CJK UNIFIED IDEOGRAPH
+0x92B3	0x8ADC	#CJK UNIFIED IDEOGRAPH
+0x92B4	0x8D85	#CJK UNIFIED IDEOGRAPH
+0x92B5	0x8DF3	#CJK UNIFIED IDEOGRAPH
+0x92B6	0x929A	#CJK UNIFIED IDEOGRAPH
+0x92B7	0x9577	#CJK UNIFIED IDEOGRAPH
+0x92B8	0x9802	#CJK UNIFIED IDEOGRAPH
+0x92B9	0x9CE5	#CJK UNIFIED IDEOGRAPH
+0x92BA	0x52C5	#CJK UNIFIED IDEOGRAPH
+0x92BB	0x6357	#CJK UNIFIED IDEOGRAPH
+0x92BC	0x76F4	#CJK UNIFIED IDEOGRAPH
+0x92BD	0x6715	#CJK UNIFIED IDEOGRAPH
+0x92BE	0x6C88	#CJK UNIFIED IDEOGRAPH
+0x92BF	0x73CD	#CJK UNIFIED IDEOGRAPH
+0x92C0	0x8CC3	#CJK UNIFIED IDEOGRAPH
+0x92C1	0x93AE	#CJK UNIFIED IDEOGRAPH
+0x92C2	0x9673	#CJK UNIFIED IDEOGRAPH
+0x92C3	0x6D25	#CJK UNIFIED IDEOGRAPH
+0x92C4	0x589C	#CJK UNIFIED IDEOGRAPH
+0x92C5	0x690E	#CJK UNIFIED IDEOGRAPH
+0x92C6	0x69CC	#CJK UNIFIED IDEOGRAPH
+0x92C7	0x8FFD	#CJK UNIFIED IDEOGRAPH
+0x92C8	0x939A	#CJK UNIFIED IDEOGRAPH
+0x92C9	0x75DB	#CJK UNIFIED IDEOGRAPH
+0x92CA	0x901A	#CJK UNIFIED IDEOGRAPH
+0x92CB	0x585A	#CJK UNIFIED IDEOGRAPH
+0x92CC	0x6802	#CJK UNIFIED IDEOGRAPH
+0x92CD	0x63B4	#CJK UNIFIED IDEOGRAPH
+0x92CE	0x69FB	#CJK UNIFIED IDEOGRAPH
+0x92CF	0x4F43	#CJK UNIFIED IDEOGRAPH
+0x92D0	0x6F2C	#CJK UNIFIED IDEOGRAPH
+0x92D1	0x67D8	#CJK UNIFIED IDEOGRAPH
+0x92D2	0x8FBB	#CJK UNIFIED IDEOGRAPH
+0x92D3	0x8526	#CJK UNIFIED IDEOGRAPH
+0x92D4	0x7DB4	#CJK UNIFIED IDEOGRAPH
+0x92D5	0x9354	#CJK UNIFIED IDEOGRAPH
+0x92D6	0x693F	#CJK UNIFIED IDEOGRAPH
+0x92D7	0x6F70	#CJK UNIFIED IDEOGRAPH
+0x92D8	0x576A	#CJK UNIFIED IDEOGRAPH
+0x92D9	0x58F7	#CJK UNIFIED IDEOGRAPH
+0x92DA	0x5B2C	#CJK UNIFIED IDEOGRAPH
+0x92DB	0x7D2C	#CJK UNIFIED IDEOGRAPH
+0x92DC	0x722A	#CJK UNIFIED IDEOGRAPH
+0x92DD	0x540A	#CJK UNIFIED IDEOGRAPH
+0x92DE	0x91E3	#CJK UNIFIED IDEOGRAPH
+0x92DF	0x9DB4	#CJK UNIFIED IDEOGRAPH
+0x92E0	0x4EAD	#CJK UNIFIED IDEOGRAPH
+0x92E1	0x4F4E	#CJK UNIFIED IDEOGRAPH
+0x92E2	0x505C	#CJK UNIFIED IDEOGRAPH
+0x92E3	0x5075	#CJK UNIFIED IDEOGRAPH
+0x92E4	0x5243	#CJK UNIFIED IDEOGRAPH
+0x92E5	0x8C9E	#CJK UNIFIED IDEOGRAPH
+0x92E6	0x5448	#CJK UNIFIED IDEOGRAPH
+0x92E7	0x5824	#CJK UNIFIED IDEOGRAPH
+0x92E8	0x5B9A	#CJK UNIFIED IDEOGRAPH
+0x92E9	0x5E1D	#CJK UNIFIED IDEOGRAPH
+0x92EA	0x5E95	#CJK UNIFIED IDEOGRAPH
+0x92EB	0x5EAD	#CJK UNIFIED IDEOGRAPH
+0x92EC	0x5EF7	#CJK UNIFIED IDEOGRAPH
+0x92ED	0x5F1F	#CJK UNIFIED IDEOGRAPH
+0x92EE	0x608C	#CJK UNIFIED IDEOGRAPH
+0x92EF	0x62B5	#CJK UNIFIED IDEOGRAPH
+0x92F0	0x633A	#CJK UNIFIED IDEOGRAPH
+0x92F1	0x63D0	#CJK UNIFIED IDEOGRAPH
+0x92F2	0x68AF	#CJK UNIFIED IDEOGRAPH
+0x92F3	0x6C40	#CJK UNIFIED IDEOGRAPH
+0x92F4	0x7887	#CJK UNIFIED IDEOGRAPH
+0x92F5	0x798E	#CJK UNIFIED IDEOGRAPH
+0x92F6	0x7A0B	#CJK UNIFIED IDEOGRAPH
+0x92F7	0x7DE0	#CJK UNIFIED IDEOGRAPH
+0x92F8	0x8247	#CJK UNIFIED IDEOGRAPH
+0x92F9	0x8A02	#CJK UNIFIED IDEOGRAPH
+0x92FA	0x8AE6	#CJK UNIFIED IDEOGRAPH
+0x92FB	0x8E44	#CJK UNIFIED IDEOGRAPH
+0x92FC	0x9013	#CJK UNIFIED IDEOGRAPH
+0x9340	0x90B8	#CJK UNIFIED IDEOGRAPH
+0x9341	0x912D	#CJK UNIFIED IDEOGRAPH
+0x9342	0x91D8	#CJK UNIFIED IDEOGRAPH
+0x9343	0x9F0E	#CJK UNIFIED IDEOGRAPH
+0x9344	0x6CE5	#CJK UNIFIED IDEOGRAPH
+0x9345	0x6458	#CJK UNIFIED IDEOGRAPH
+0x9346	0x64E2	#CJK UNIFIED IDEOGRAPH
+0x9347	0x6575	#CJK UNIFIED IDEOGRAPH
+0x9348	0x6EF4	#CJK UNIFIED IDEOGRAPH
+0x9349	0x7684	#CJK UNIFIED IDEOGRAPH
+0x934A	0x7B1B	#CJK UNIFIED IDEOGRAPH
+0x934B	0x9069	#CJK UNIFIED IDEOGRAPH
+0x934C	0x93D1	#CJK UNIFIED IDEOGRAPH
+0x934D	0x6EBA	#CJK UNIFIED IDEOGRAPH
+0x934E	0x54F2	#CJK UNIFIED IDEOGRAPH
+0x934F	0x5FB9	#CJK UNIFIED IDEOGRAPH
+0x9350	0x64A4	#CJK UNIFIED IDEOGRAPH
+0x9351	0x8F4D	#CJK UNIFIED IDEOGRAPH
+0x9352	0x8FED	#CJK UNIFIED IDEOGRAPH
+0x9353	0x9244	#CJK UNIFIED IDEOGRAPH
+0x9354	0x5178	#CJK UNIFIED IDEOGRAPH
+0x9355	0x586B	#CJK UNIFIED IDEOGRAPH
+0x9356	0x5929	#CJK UNIFIED IDEOGRAPH
+0x9357	0x5C55	#CJK UNIFIED IDEOGRAPH
+0x9358	0x5E97	#CJK UNIFIED IDEOGRAPH
+0x9359	0x6DFB	#CJK UNIFIED IDEOGRAPH
+0x935A	0x7E8F	#CJK UNIFIED IDEOGRAPH
+0x935B	0x751C	#CJK UNIFIED IDEOGRAPH
+0x935C	0x8CBC	#CJK UNIFIED IDEOGRAPH
+0x935D	0x8EE2	#CJK UNIFIED IDEOGRAPH
+0x935E	0x985B	#CJK UNIFIED IDEOGRAPH
+0x935F	0x70B9	#CJK UNIFIED IDEOGRAPH
+0x9360	0x4F1D	#CJK UNIFIED IDEOGRAPH
+0x9361	0x6BBF	#CJK UNIFIED IDEOGRAPH
+0x9362	0x6FB1	#CJK UNIFIED IDEOGRAPH
+0x9363	0x7530	#CJK UNIFIED IDEOGRAPH
+0x9364	0x96FB	#CJK UNIFIED IDEOGRAPH
+0x9365	0x514E	#CJK UNIFIED IDEOGRAPH
+0x9366	0x5410	#CJK UNIFIED IDEOGRAPH
+0x9367	0x5835	#CJK UNIFIED IDEOGRAPH
+0x9368	0x5857	#CJK UNIFIED IDEOGRAPH
+0x9369	0x59AC	#CJK UNIFIED IDEOGRAPH
+0x936A	0x5C60	#CJK UNIFIED IDEOGRAPH
+0x936B	0x5F92	#CJK UNIFIED IDEOGRAPH
+0x936C	0x6597	#CJK UNIFIED IDEOGRAPH
+0x936D	0x675C	#CJK UNIFIED IDEOGRAPH
+0x936E	0x6E21	#CJK UNIFIED IDEOGRAPH
+0x936F	0x767B	#CJK UNIFIED IDEOGRAPH
+0x9370	0x83DF	#CJK UNIFIED IDEOGRAPH
+0x9371	0x8CED	#CJK UNIFIED IDEOGRAPH
+0x9372	0x9014	#CJK UNIFIED IDEOGRAPH
+0x9373	0x90FD	#CJK UNIFIED IDEOGRAPH
+0x9374	0x934D	#CJK UNIFIED IDEOGRAPH
+0x9375	0x7825	#CJK UNIFIED IDEOGRAPH
+0x9376	0x783A	#CJK UNIFIED IDEOGRAPH
+0x9377	0x52AA	#CJK UNIFIED IDEOGRAPH
+0x9378	0x5EA6	#CJK UNIFIED IDEOGRAPH
+0x9379	0x571F	#CJK UNIFIED IDEOGRAPH
+0x937A	0x5974	#CJK UNIFIED IDEOGRAPH
+0x937B	0x6012	#CJK UNIFIED IDEOGRAPH
+0x937C	0x5012	#CJK UNIFIED IDEOGRAPH
+0x937D	0x515A	#CJK UNIFIED IDEOGRAPH
+0x937E	0x51AC	#CJK UNIFIED IDEOGRAPH
+0x9380	0x51CD	#CJK UNIFIED IDEOGRAPH
+0x9381	0x5200	#CJK UNIFIED IDEOGRAPH
+0x9382	0x5510	#CJK UNIFIED IDEOGRAPH
+0x9383	0x5854	#CJK UNIFIED IDEOGRAPH
+0x9384	0x5858	#CJK UNIFIED IDEOGRAPH
+0x9385	0x5957	#CJK UNIFIED IDEOGRAPH
+0x9386	0x5B95	#CJK UNIFIED IDEOGRAPH
+0x9387	0x5CF6	#CJK UNIFIED IDEOGRAPH
+0x9388	0x5D8B	#CJK UNIFIED IDEOGRAPH
+0x9389	0x60BC	#CJK UNIFIED IDEOGRAPH
+0x938A	0x6295	#CJK UNIFIED IDEOGRAPH
+0x938B	0x642D	#CJK UNIFIED IDEOGRAPH
+0x938C	0x6771	#CJK UNIFIED IDEOGRAPH
+0x938D	0x6843	#CJK UNIFIED IDEOGRAPH
+0x938E	0x68BC	#CJK UNIFIED IDEOGRAPH
+0x938F	0x68DF	#CJK UNIFIED IDEOGRAPH
+0x9390	0x76D7	#CJK UNIFIED IDEOGRAPH
+0x9391	0x6DD8	#CJK UNIFIED IDEOGRAPH
+0x9392	0x6E6F	#CJK UNIFIED IDEOGRAPH
+0x9393	0x6D9B	#CJK UNIFIED IDEOGRAPH
+0x9394	0x706F	#CJK UNIFIED IDEOGRAPH
+0x9395	0x71C8	#CJK UNIFIED IDEOGRAPH
+0x9396	0x5F53	#CJK UNIFIED IDEOGRAPH
+0x9397	0x75D8	#CJK UNIFIED IDEOGRAPH
+0x9398	0x7977	#CJK UNIFIED IDEOGRAPH
+0x9399	0x7B49	#CJK UNIFIED IDEOGRAPH
+0x939A	0x7B54	#CJK UNIFIED IDEOGRAPH
+0x939B	0x7B52	#CJK UNIFIED IDEOGRAPH
+0x939C	0x7CD6	#CJK UNIFIED IDEOGRAPH
+0x939D	0x7D71	#CJK UNIFIED IDEOGRAPH
+0x939E	0x5230	#CJK UNIFIED IDEOGRAPH
+0x939F	0x8463	#CJK UNIFIED IDEOGRAPH
+0x93A0	0x8569	#CJK UNIFIED IDEOGRAPH
+0x93A1	0x85E4	#CJK UNIFIED IDEOGRAPH
+0x93A2	0x8A0E	#CJK UNIFIED IDEOGRAPH
+0x93A3	0x8B04	#CJK UNIFIED IDEOGRAPH
+0x93A4	0x8C46	#CJK UNIFIED IDEOGRAPH
+0x93A5	0x8E0F	#CJK UNIFIED IDEOGRAPH
+0x93A6	0x9003	#CJK UNIFIED IDEOGRAPH
+0x93A7	0x900F	#CJK UNIFIED IDEOGRAPH
+0x93A8	0x9419	#CJK UNIFIED IDEOGRAPH
+0x93A9	0x9676	#CJK UNIFIED IDEOGRAPH
+0x93AA	0x982D	#CJK UNIFIED IDEOGRAPH
+0x93AB	0x9A30	#CJK UNIFIED IDEOGRAPH
+0x93AC	0x95D8	#CJK UNIFIED IDEOGRAPH
+0x93AD	0x50CD	#CJK UNIFIED IDEOGRAPH
+0x93AE	0x52D5	#CJK UNIFIED IDEOGRAPH
+0x93AF	0x540C	#CJK UNIFIED IDEOGRAPH
+0x93B0	0x5802	#CJK UNIFIED IDEOGRAPH
+0x93B1	0x5C0E	#CJK UNIFIED IDEOGRAPH
+0x93B2	0x61A7	#CJK UNIFIED IDEOGRAPH
+0x93B3	0x649E	#CJK UNIFIED IDEOGRAPH
+0x93B4	0x6D1E	#CJK UNIFIED IDEOGRAPH
+0x93B5	0x77B3	#CJK UNIFIED IDEOGRAPH
+0x93B6	0x7AE5	#CJK UNIFIED IDEOGRAPH
+0x93B7	0x80F4	#CJK UNIFIED IDEOGRAPH
+0x93B8	0x8404	#CJK UNIFIED IDEOGRAPH
+0x93B9	0x9053	#CJK UNIFIED IDEOGRAPH
+0x93BA	0x9285	#CJK UNIFIED IDEOGRAPH
+0x93BB	0x5CE0	#CJK UNIFIED IDEOGRAPH
+0x93BC	0x9D07	#CJK UNIFIED IDEOGRAPH
+0x93BD	0x533F	#CJK UNIFIED IDEOGRAPH
+0x93BE	0x5F97	#CJK UNIFIED IDEOGRAPH
+0x93BF	0x5FB3	#CJK UNIFIED IDEOGRAPH
+0x93C0	0x6D9C	#CJK UNIFIED IDEOGRAPH
+0x93C1	0x7279	#CJK UNIFIED IDEOGRAPH
+0x93C2	0x7763	#CJK UNIFIED IDEOGRAPH
+0x93C3	0x79BF	#CJK UNIFIED IDEOGRAPH
+0x93C4	0x7BE4	#CJK UNIFIED IDEOGRAPH
+0x93C5	0x6BD2	#CJK UNIFIED IDEOGRAPH
+0x93C6	0x72EC	#CJK UNIFIED IDEOGRAPH
+0x93C7	0x8AAD	#CJK UNIFIED IDEOGRAPH
+0x93C8	0x6803	#CJK UNIFIED IDEOGRAPH
+0x93C9	0x6A61	#CJK UNIFIED IDEOGRAPH
+0x93CA	0x51F8	#CJK UNIFIED IDEOGRAPH
+0x93CB	0x7A81	#CJK UNIFIED IDEOGRAPH
+0x93CC	0x6934	#CJK UNIFIED IDEOGRAPH
+0x93CD	0x5C4A	#CJK UNIFIED IDEOGRAPH
+0x93CE	0x9CF6	#CJK UNIFIED IDEOGRAPH
+0x93CF	0x82EB	#CJK UNIFIED IDEOGRAPH
+0x93D0	0x5BC5	#CJK UNIFIED IDEOGRAPH
+0x93D1	0x9149	#CJK UNIFIED IDEOGRAPH
+0x93D2	0x701E	#CJK UNIFIED IDEOGRAPH
+0x93D3	0x5678	#CJK UNIFIED IDEOGRAPH
+0x93D4	0x5C6F	#CJK UNIFIED IDEOGRAPH
+0x93D5	0x60C7	#CJK UNIFIED IDEOGRAPH
+0x93D6	0x6566	#CJK UNIFIED IDEOGRAPH
+0x93D7	0x6C8C	#CJK UNIFIED IDEOGRAPH
+0x93D8	0x8C5A	#CJK UNIFIED IDEOGRAPH
+0x93D9	0x9041	#CJK UNIFIED IDEOGRAPH
+0x93DA	0x9813	#CJK UNIFIED IDEOGRAPH
+0x93DB	0x5451	#CJK UNIFIED IDEOGRAPH
+0x93DC	0x66C7	#CJK UNIFIED IDEOGRAPH
+0x93DD	0x920D	#CJK UNIFIED IDEOGRAPH
+0x93DE	0x5948	#CJK UNIFIED IDEOGRAPH
+0x93DF	0x90A3	#CJK UNIFIED IDEOGRAPH
+0x93E0	0x5185	#CJK UNIFIED IDEOGRAPH
+0x93E1	0x4E4D	#CJK UNIFIED IDEOGRAPH
+0x93E2	0x51EA	#CJK UNIFIED IDEOGRAPH
+0x93E3	0x8599	#CJK UNIFIED IDEOGRAPH
+0x93E4	0x8B0E	#CJK UNIFIED IDEOGRAPH
+0x93E5	0x7058	#CJK UNIFIED IDEOGRAPH
+0x93E6	0x637A	#CJK UNIFIED IDEOGRAPH
+0x93E7	0x934B	#CJK UNIFIED IDEOGRAPH
+0x93E8	0x6962	#CJK UNIFIED IDEOGRAPH
+0x93E9	0x99B4	#CJK UNIFIED IDEOGRAPH
+0x93EA	0x7E04	#CJK UNIFIED IDEOGRAPH
+0x93EB	0x7577	#CJK UNIFIED IDEOGRAPH
+0x93EC	0x5357	#CJK UNIFIED IDEOGRAPH
+0x93ED	0x6960	#CJK UNIFIED IDEOGRAPH
+0x93EE	0x8EDF	#CJK UNIFIED IDEOGRAPH
+0x93EF	0x96E3	#CJK UNIFIED IDEOGRAPH
+0x93F0	0x6C5D	#CJK UNIFIED IDEOGRAPH
+0x93F1	0x4E8C	#CJK UNIFIED IDEOGRAPH
+0x93F2	0x5C3C	#CJK UNIFIED IDEOGRAPH
+0x93F3	0x5F10	#CJK UNIFIED IDEOGRAPH
+0x93F4	0x8FE9	#CJK UNIFIED IDEOGRAPH
+0x93F5	0x5302	#CJK UNIFIED IDEOGRAPH
+0x93F6	0x8CD1	#CJK UNIFIED IDEOGRAPH
+0x93F7	0x8089	#CJK UNIFIED IDEOGRAPH
+0x93F8	0x8679	#CJK UNIFIED IDEOGRAPH
+0x93F9	0x5EFF	#CJK UNIFIED IDEOGRAPH
+0x93FA	0x65E5	#CJK UNIFIED IDEOGRAPH
+0x93FB	0x4E73	#CJK UNIFIED IDEOGRAPH
+0x93FC	0x5165	#CJK UNIFIED IDEOGRAPH
+0x9440	0x5982	#CJK UNIFIED IDEOGRAPH
+0x9441	0x5C3F	#CJK UNIFIED IDEOGRAPH
+0x9442	0x97EE	#CJK UNIFIED IDEOGRAPH
+0x9443	0x4EFB	#CJK UNIFIED IDEOGRAPH
+0x9444	0x598A	#CJK UNIFIED IDEOGRAPH
+0x9445	0x5FCD	#CJK UNIFIED IDEOGRAPH
+0x9446	0x8A8D	#CJK UNIFIED IDEOGRAPH
+0x9447	0x6FE1	#CJK UNIFIED IDEOGRAPH
+0x9448	0x79B0	#CJK UNIFIED IDEOGRAPH
+0x9449	0x7962	#CJK UNIFIED IDEOGRAPH
+0x944A	0x5BE7	#CJK UNIFIED IDEOGRAPH
+0x944B	0x8471	#CJK UNIFIED IDEOGRAPH
+0x944C	0x732B	#CJK UNIFIED IDEOGRAPH
+0x944D	0x71B1	#CJK UNIFIED IDEOGRAPH
+0x944E	0x5E74	#CJK UNIFIED IDEOGRAPH
+0x944F	0x5FF5	#CJK UNIFIED IDEOGRAPH
+0x9450	0x637B	#CJK UNIFIED IDEOGRAPH
+0x9451	0x649A	#CJK UNIFIED IDEOGRAPH
+0x9452	0x71C3	#CJK UNIFIED IDEOGRAPH
+0x9453	0x7C98	#CJK UNIFIED IDEOGRAPH
+0x9454	0x4E43	#CJK UNIFIED IDEOGRAPH
+0x9455	0x5EFC	#CJK UNIFIED IDEOGRAPH
+0x9456	0x4E4B	#CJK UNIFIED IDEOGRAPH
+0x9457	0x57DC	#CJK UNIFIED IDEOGRAPH
+0x9458	0x56A2	#CJK UNIFIED IDEOGRAPH
+0x9459	0x60A9	#CJK UNIFIED IDEOGRAPH
+0x945A	0x6FC3	#CJK UNIFIED IDEOGRAPH
+0x945B	0x7D0D	#CJK UNIFIED IDEOGRAPH
+0x945C	0x80FD	#CJK UNIFIED IDEOGRAPH
+0x945D	0x8133	#CJK UNIFIED IDEOGRAPH
+0x945E	0x81BF	#CJK UNIFIED IDEOGRAPH
+0x945F	0x8FB2	#CJK UNIFIED IDEOGRAPH
+0x9460	0x8997	#CJK UNIFIED IDEOGRAPH
+0x9461	0x86A4	#CJK UNIFIED IDEOGRAPH
+0x9462	0x5DF4	#CJK UNIFIED IDEOGRAPH
+0x9463	0x628A	#CJK UNIFIED IDEOGRAPH
+0x9464	0x64AD	#CJK UNIFIED IDEOGRAPH
+0x9465	0x8987	#CJK UNIFIED IDEOGRAPH
+0x9466	0x6777	#CJK UNIFIED IDEOGRAPH
+0x9467	0x6CE2	#CJK UNIFIED IDEOGRAPH
+0x9468	0x6D3E	#CJK UNIFIED IDEOGRAPH
+0x9469	0x7436	#CJK UNIFIED IDEOGRAPH
+0x946A	0x7834	#CJK UNIFIED IDEOGRAPH
+0x946B	0x5A46	#CJK UNIFIED IDEOGRAPH
+0x946C	0x7F75	#CJK UNIFIED IDEOGRAPH
+0x946D	0x82AD	#CJK UNIFIED IDEOGRAPH
+0x946E	0x99AC	#CJK UNIFIED IDEOGRAPH
+0x946F	0x4FF3	#CJK UNIFIED IDEOGRAPH
+0x9470	0x5EC3	#CJK UNIFIED IDEOGRAPH
+0x9471	0x62DD	#CJK UNIFIED IDEOGRAPH
+0x9472	0x6392	#CJK UNIFIED IDEOGRAPH
+0x9473	0x6557	#CJK UNIFIED IDEOGRAPH
+0x9474	0x676F	#CJK UNIFIED IDEOGRAPH
+0x9475	0x76C3	#CJK UNIFIED IDEOGRAPH
+0x9476	0x724C	#CJK UNIFIED IDEOGRAPH
+0x9477	0x80CC	#CJK UNIFIED IDEOGRAPH
+0x9478	0x80BA	#CJK UNIFIED IDEOGRAPH
+0x9479	0x8F29	#CJK UNIFIED IDEOGRAPH
+0x947A	0x914D	#CJK UNIFIED IDEOGRAPH
+0x947B	0x500D	#CJK UNIFIED IDEOGRAPH
+0x947C	0x57F9	#CJK UNIFIED IDEOGRAPH
+0x947D	0x5A92	#CJK UNIFIED IDEOGRAPH
+0x947E	0x6885	#CJK UNIFIED IDEOGRAPH
+0x9480	0x6973	#CJK UNIFIED IDEOGRAPH
+0x9481	0x7164	#CJK UNIFIED IDEOGRAPH
+0x9482	0x72FD	#CJK UNIFIED IDEOGRAPH
+0x9483	0x8CB7	#CJK UNIFIED IDEOGRAPH
+0x9484	0x58F2	#CJK UNIFIED IDEOGRAPH
+0x9485	0x8CE0	#CJK UNIFIED IDEOGRAPH
+0x9486	0x966A	#CJK UNIFIED IDEOGRAPH
+0x9487	0x9019	#CJK UNIFIED IDEOGRAPH
+0x9488	0x877F	#CJK UNIFIED IDEOGRAPH
+0x9489	0x79E4	#CJK UNIFIED IDEOGRAPH
+0x948A	0x77E7	#CJK UNIFIED IDEOGRAPH
+0x948B	0x8429	#CJK UNIFIED IDEOGRAPH
+0x948C	0x4F2F	#CJK UNIFIED IDEOGRAPH
+0x948D	0x5265	#CJK UNIFIED IDEOGRAPH
+0x948E	0x535A	#CJK UNIFIED IDEOGRAPH
+0x948F	0x62CD	#CJK UNIFIED IDEOGRAPH
+0x9490	0x67CF	#CJK UNIFIED IDEOGRAPH
+0x9491	0x6CCA	#CJK UNIFIED IDEOGRAPH
+0x9492	0x767D	#CJK UNIFIED IDEOGRAPH
+0x9493	0x7B94	#CJK UNIFIED IDEOGRAPH
+0x9494	0x7C95	#CJK UNIFIED IDEOGRAPH
+0x9495	0x8236	#CJK UNIFIED IDEOGRAPH
+0x9496	0x8584	#CJK UNIFIED IDEOGRAPH
+0x9497	0x8FEB	#CJK UNIFIED IDEOGRAPH
+0x9498	0x66DD	#CJK UNIFIED IDEOGRAPH
+0x9499	0x6F20	#CJK UNIFIED IDEOGRAPH
+0x949A	0x7206	#CJK UNIFIED IDEOGRAPH
+0x949B	0x7E1B	#CJK UNIFIED IDEOGRAPH
+0x949C	0x83AB	#CJK UNIFIED IDEOGRAPH
+0x949D	0x99C1	#CJK UNIFIED IDEOGRAPH
+0x949E	0x9EA6	#CJK UNIFIED IDEOGRAPH
+0x949F	0x51FD	#CJK UNIFIED IDEOGRAPH
+0x94A0	0x7BB1	#CJK UNIFIED IDEOGRAPH
+0x94A1	0x7872	#CJK UNIFIED IDEOGRAPH
+0x94A2	0x7BB8	#CJK UNIFIED IDEOGRAPH
+0x94A3	0x8087	#CJK UNIFIED IDEOGRAPH
+0x94A4	0x7B48	#CJK UNIFIED IDEOGRAPH
+0x94A5	0x6AE8	#CJK UNIFIED IDEOGRAPH
+0x94A6	0x5E61	#CJK UNIFIED IDEOGRAPH
+0x94A7	0x808C	#CJK UNIFIED IDEOGRAPH
+0x94A8	0x7551	#CJK UNIFIED IDEOGRAPH
+0x94A9	0x7560	#CJK UNIFIED IDEOGRAPH
+0x94AA	0x516B	#CJK UNIFIED IDEOGRAPH
+0x94AB	0x9262	#CJK UNIFIED IDEOGRAPH
+0x94AC	0x6E8C	#CJK UNIFIED IDEOGRAPH
+0x94AD	0x767A	#CJK UNIFIED IDEOGRAPH
+0x94AE	0x9197	#CJK UNIFIED IDEOGRAPH
+0x94AF	0x9AEA	#CJK UNIFIED IDEOGRAPH
+0x94B0	0x4F10	#CJK UNIFIED IDEOGRAPH
+0x94B1	0x7F70	#CJK UNIFIED IDEOGRAPH
+0x94B2	0x629C	#CJK UNIFIED IDEOGRAPH
+0x94B3	0x7B4F	#CJK UNIFIED IDEOGRAPH
+0x94B4	0x95A5	#CJK UNIFIED IDEOGRAPH
+0x94B5	0x9CE9	#CJK UNIFIED IDEOGRAPH
+0x94B6	0x567A	#CJK UNIFIED IDEOGRAPH
+0x94B7	0x5859	#CJK UNIFIED IDEOGRAPH
+0x94B8	0x86E4	#CJK UNIFIED IDEOGRAPH
+0x94B9	0x96BC	#CJK UNIFIED IDEOGRAPH
+0x94BA	0x4F34	#CJK UNIFIED IDEOGRAPH
+0x94BB	0x5224	#CJK UNIFIED IDEOGRAPH
+0x94BC	0x534A	#CJK UNIFIED IDEOGRAPH
+0x94BD	0x53CD	#CJK UNIFIED IDEOGRAPH
+0x94BE	0x53DB	#CJK UNIFIED IDEOGRAPH
+0x94BF	0x5E06	#CJK UNIFIED IDEOGRAPH
+0x94C0	0x642C	#CJK UNIFIED IDEOGRAPH
+0x94C1	0x6591	#CJK UNIFIED IDEOGRAPH
+0x94C2	0x677F	#CJK UNIFIED IDEOGRAPH
+0x94C3	0x6C3E	#CJK UNIFIED IDEOGRAPH
+0x94C4	0x6C4E	#CJK UNIFIED IDEOGRAPH
+0x94C5	0x7248	#CJK UNIFIED IDEOGRAPH
+0x94C6	0x72AF	#CJK UNIFIED IDEOGRAPH
+0x94C7	0x73ED	#CJK UNIFIED IDEOGRAPH
+0x94C8	0x7554	#CJK UNIFIED IDEOGRAPH
+0x94C9	0x7E41	#CJK UNIFIED IDEOGRAPH
+0x94CA	0x822C	#CJK UNIFIED IDEOGRAPH
+0x94CB	0x85E9	#CJK UNIFIED IDEOGRAPH
+0x94CC	0x8CA9	#CJK UNIFIED IDEOGRAPH
+0x94CD	0x7BC4	#CJK UNIFIED IDEOGRAPH
+0x94CE	0x91C6	#CJK UNIFIED IDEOGRAPH
+0x94CF	0x7169	#CJK UNIFIED IDEOGRAPH
+0x94D0	0x9812	#CJK UNIFIED IDEOGRAPH
+0x94D1	0x98EF	#CJK UNIFIED IDEOGRAPH
+0x94D2	0x633D	#CJK UNIFIED IDEOGRAPH
+0x94D3	0x6669	#CJK UNIFIED IDEOGRAPH
+0x94D4	0x756A	#CJK UNIFIED IDEOGRAPH
+0x94D5	0x76E4	#CJK UNIFIED IDEOGRAPH
+0x94D6	0x78D0	#CJK UNIFIED IDEOGRAPH
+0x94D7	0x8543	#CJK UNIFIED IDEOGRAPH
+0x94D8	0x86EE	#CJK UNIFIED IDEOGRAPH
+0x94D9	0x532A	#CJK UNIFIED IDEOGRAPH
+0x94DA	0x5351	#CJK UNIFIED IDEOGRAPH
+0x94DB	0x5426	#CJK UNIFIED IDEOGRAPH
+0x94DC	0x5983	#CJK UNIFIED IDEOGRAPH
+0x94DD	0x5E87	#CJK UNIFIED IDEOGRAPH
+0x94DE	0x5F7C	#CJK UNIFIED IDEOGRAPH
+0x94DF	0x60B2	#CJK UNIFIED IDEOGRAPH
+0x94E0	0x6249	#CJK UNIFIED IDEOGRAPH
+0x94E1	0x6279	#CJK UNIFIED IDEOGRAPH
+0x94E2	0x62AB	#CJK UNIFIED IDEOGRAPH
+0x94E3	0x6590	#CJK UNIFIED IDEOGRAPH
+0x94E4	0x6BD4	#CJK UNIFIED IDEOGRAPH
+0x94E5	0x6CCC	#CJK UNIFIED IDEOGRAPH
+0x94E6	0x75B2	#CJK UNIFIED IDEOGRAPH
+0x94E7	0x76AE	#CJK UNIFIED IDEOGRAPH
+0x94E8	0x7891	#CJK UNIFIED IDEOGRAPH
+0x94E9	0x79D8	#CJK UNIFIED IDEOGRAPH
+0x94EA	0x7DCB	#CJK UNIFIED IDEOGRAPH
+0x94EB	0x7F77	#CJK UNIFIED IDEOGRAPH
+0x94EC	0x80A5	#CJK UNIFIED IDEOGRAPH
+0x94ED	0x88AB	#CJK UNIFIED IDEOGRAPH
+0x94EE	0x8AB9	#CJK UNIFIED IDEOGRAPH
+0x94EF	0x8CBB	#CJK UNIFIED IDEOGRAPH
+0x94F0	0x907F	#CJK UNIFIED IDEOGRAPH
+0x94F1	0x975E	#CJK UNIFIED IDEOGRAPH
+0x94F2	0x98DB	#CJK UNIFIED IDEOGRAPH
+0x94F3	0x6A0B	#CJK UNIFIED IDEOGRAPH
+0x94F4	0x7C38	#CJK UNIFIED IDEOGRAPH
+0x94F5	0x5099	#CJK UNIFIED IDEOGRAPH
+0x94F6	0x5C3E	#CJK UNIFIED IDEOGRAPH
+0x94F7	0x5FAE	#CJK UNIFIED IDEOGRAPH
+0x94F8	0x6787	#CJK UNIFIED IDEOGRAPH
+0x94F9	0x6BD8	#CJK UNIFIED IDEOGRAPH
+0x94FA	0x7435	#CJK UNIFIED IDEOGRAPH
+0x94FB	0x7709	#CJK UNIFIED IDEOGRAPH
+0x94FC	0x7F8E	#CJK UNIFIED IDEOGRAPH
+0x9540	0x9F3B	#CJK UNIFIED IDEOGRAPH
+0x9541	0x67CA	#CJK UNIFIED IDEOGRAPH
+0x9542	0x7A17	#CJK UNIFIED IDEOGRAPH
+0x9543	0x5339	#CJK UNIFIED IDEOGRAPH
+0x9544	0x758B	#CJK UNIFIED IDEOGRAPH
+0x9545	0x9AED	#CJK UNIFIED IDEOGRAPH
+0x9546	0x5F66	#CJK UNIFIED IDEOGRAPH
+0x9547	0x819D	#CJK UNIFIED IDEOGRAPH
+0x9548	0x83F1	#CJK UNIFIED IDEOGRAPH
+0x9549	0x8098	#CJK UNIFIED IDEOGRAPH
+0x954A	0x5F3C	#CJK UNIFIED IDEOGRAPH
+0x954B	0x5FC5	#CJK UNIFIED IDEOGRAPH
+0x954C	0x7562	#CJK UNIFIED IDEOGRAPH
+0x954D	0x7B46	#CJK UNIFIED IDEOGRAPH
+0x954E	0x903C	#CJK UNIFIED IDEOGRAPH
+0x954F	0x6867	#CJK UNIFIED IDEOGRAPH
+0x9550	0x59EB	#CJK UNIFIED IDEOGRAPH
+0x9551	0x5A9B	#CJK UNIFIED IDEOGRAPH
+0x9552	0x7D10	#CJK UNIFIED IDEOGRAPH
+0x9553	0x767E	#CJK UNIFIED IDEOGRAPH
+0x9554	0x8B2C	#CJK UNIFIED IDEOGRAPH
+0x9555	0x4FF5	#CJK UNIFIED IDEOGRAPH
+0x9556	0x5F6A	#CJK UNIFIED IDEOGRAPH
+0x9557	0x6A19	#CJK UNIFIED IDEOGRAPH
+0x9558	0x6C37	#CJK UNIFIED IDEOGRAPH
+0x9559	0x6F02	#CJK UNIFIED IDEOGRAPH
+0x955A	0x74E2	#CJK UNIFIED IDEOGRAPH
+0x955B	0x7968	#CJK UNIFIED IDEOGRAPH
+0x955C	0x8868	#CJK UNIFIED IDEOGRAPH
+0x955D	0x8A55	#CJK UNIFIED IDEOGRAPH
+0x955E	0x8C79	#CJK UNIFIED IDEOGRAPH
+0x955F	0x5EDF	#CJK UNIFIED IDEOGRAPH
+0x9560	0x63CF	#CJK UNIFIED IDEOGRAPH
+0x9561	0x75C5	#CJK UNIFIED IDEOGRAPH
+0x9562	0x79D2	#CJK UNIFIED IDEOGRAPH
+0x9563	0x82D7	#CJK UNIFIED IDEOGRAPH
+0x9564	0x9328	#CJK UNIFIED IDEOGRAPH
+0x9565	0x92F2	#CJK UNIFIED IDEOGRAPH
+0x9566	0x849C	#CJK UNIFIED IDEOGRAPH
+0x9567	0x86ED	#CJK UNIFIED IDEOGRAPH
+0x9568	0x9C2D	#CJK UNIFIED IDEOGRAPH
+0x9569	0x54C1	#CJK UNIFIED IDEOGRAPH
+0x956A	0x5F6C	#CJK UNIFIED IDEOGRAPH
+0x956B	0x658C	#CJK UNIFIED IDEOGRAPH
+0x956C	0x6D5C	#CJK UNIFIED IDEOGRAPH
+0x956D	0x7015	#CJK UNIFIED IDEOGRAPH
+0x956E	0x8CA7	#CJK UNIFIED IDEOGRAPH
+0x956F	0x8CD3	#CJK UNIFIED IDEOGRAPH
+0x9570	0x983B	#CJK UNIFIED IDEOGRAPH
+0x9571	0x654F	#CJK UNIFIED IDEOGRAPH
+0x9572	0x74F6	#CJK UNIFIED IDEOGRAPH
+0x9573	0x4E0D	#CJK UNIFIED IDEOGRAPH
+0x9574	0x4ED8	#CJK UNIFIED IDEOGRAPH
+0x9575	0x57E0	#CJK UNIFIED IDEOGRAPH
+0x9576	0x592B	#CJK UNIFIED IDEOGRAPH
+0x9577	0x5A66	#CJK UNIFIED IDEOGRAPH
+0x9578	0x5BCC	#CJK UNIFIED IDEOGRAPH
+0x9579	0x51A8	#CJK UNIFIED IDEOGRAPH
+0x957A	0x5E03	#CJK UNIFIED IDEOGRAPH
+0x957B	0x5E9C	#CJK UNIFIED IDEOGRAPH
+0x957C	0x6016	#CJK UNIFIED IDEOGRAPH
+0x957D	0x6276	#CJK UNIFIED IDEOGRAPH
+0x957E	0x6577	#CJK UNIFIED IDEOGRAPH
+0x9580	0x65A7	#CJK UNIFIED IDEOGRAPH
+0x9581	0x666E	#CJK UNIFIED IDEOGRAPH
+0x9582	0x6D6E	#CJK UNIFIED IDEOGRAPH
+0x9583	0x7236	#CJK UNIFIED IDEOGRAPH
+0x9584	0x7B26	#CJK UNIFIED IDEOGRAPH
+0x9585	0x8150	#CJK UNIFIED IDEOGRAPH
+0x9586	0x819A	#CJK UNIFIED IDEOGRAPH
+0x9587	0x8299	#CJK UNIFIED IDEOGRAPH
+0x9588	0x8B5C	#CJK UNIFIED IDEOGRAPH
+0x9589	0x8CA0	#CJK UNIFIED IDEOGRAPH
+0x958A	0x8CE6	#CJK UNIFIED IDEOGRAPH
+0x958B	0x8D74	#CJK UNIFIED IDEOGRAPH
+0x958C	0x961C	#CJK UNIFIED IDEOGRAPH
+0x958D	0x9644	#CJK UNIFIED IDEOGRAPH
+0x958E	0x4FAE	#CJK UNIFIED IDEOGRAPH
+0x958F	0x64AB	#CJK UNIFIED IDEOGRAPH
+0x9590	0x6B66	#CJK UNIFIED IDEOGRAPH
+0x9591	0x821E	#CJK UNIFIED IDEOGRAPH
+0x9592	0x8461	#CJK UNIFIED IDEOGRAPH
+0x9593	0x856A	#CJK UNIFIED IDEOGRAPH
+0x9594	0x90E8	#CJK UNIFIED IDEOGRAPH
+0x9595	0x5C01	#CJK UNIFIED IDEOGRAPH
+0x9596	0x6953	#CJK UNIFIED IDEOGRAPH
+0x9597	0x98A8	#CJK UNIFIED IDEOGRAPH
+0x9598	0x847A	#CJK UNIFIED IDEOGRAPH
+0x9599	0x8557	#CJK UNIFIED IDEOGRAPH
+0x959A	0x4F0F	#CJK UNIFIED IDEOGRAPH
+0x959B	0x526F	#CJK UNIFIED IDEOGRAPH
+0x959C	0x5FA9	#CJK UNIFIED IDEOGRAPH
+0x959D	0x5E45	#CJK UNIFIED IDEOGRAPH
+0x959E	0x670D	#CJK UNIFIED IDEOGRAPH
+0x959F	0x798F	#CJK UNIFIED IDEOGRAPH
+0x95A0	0x8179	#CJK UNIFIED IDEOGRAPH
+0x95A1	0x8907	#CJK UNIFIED IDEOGRAPH
+0x95A2	0x8986	#CJK UNIFIED IDEOGRAPH
+0x95A3	0x6DF5	#CJK UNIFIED IDEOGRAPH
+0x95A4	0x5F17	#CJK UNIFIED IDEOGRAPH
+0x95A5	0x6255	#CJK UNIFIED IDEOGRAPH
+0x95A6	0x6CB8	#CJK UNIFIED IDEOGRAPH
+0x95A7	0x4ECF	#CJK UNIFIED IDEOGRAPH
+0x95A8	0x7269	#CJK UNIFIED IDEOGRAPH
+0x95A9	0x9B92	#CJK UNIFIED IDEOGRAPH
+0x95AA	0x5206	#CJK UNIFIED IDEOGRAPH
+0x95AB	0x543B	#CJK UNIFIED IDEOGRAPH
+0x95AC	0x5674	#CJK UNIFIED IDEOGRAPH
+0x95AD	0x58B3	#CJK UNIFIED IDEOGRAPH
+0x95AE	0x61A4	#CJK UNIFIED IDEOGRAPH
+0x95AF	0x626E	#CJK UNIFIED IDEOGRAPH
+0x95B0	0x711A	#CJK UNIFIED IDEOGRAPH
+0x95B1	0x596E	#CJK UNIFIED IDEOGRAPH
+0x95B2	0x7C89	#CJK UNIFIED IDEOGRAPH
+0x95B3	0x7CDE	#CJK UNIFIED IDEOGRAPH
+0x95B4	0x7D1B	#CJK UNIFIED IDEOGRAPH
+0x95B5	0x96F0	#CJK UNIFIED IDEOGRAPH
+0x95B6	0x6587	#CJK UNIFIED IDEOGRAPH
+0x95B7	0x805E	#CJK UNIFIED IDEOGRAPH
+0x95B8	0x4E19	#CJK UNIFIED IDEOGRAPH
+0x95B9	0x4F75	#CJK UNIFIED IDEOGRAPH
+0x95BA	0x5175	#CJK UNIFIED IDEOGRAPH
+0x95BB	0x5840	#CJK UNIFIED IDEOGRAPH
+0x95BC	0x5E63	#CJK UNIFIED IDEOGRAPH
+0x95BD	0x5E73	#CJK UNIFIED IDEOGRAPH
+0x95BE	0x5F0A	#CJK UNIFIED IDEOGRAPH
+0x95BF	0x67C4	#CJK UNIFIED IDEOGRAPH
+0x95C0	0x4E26	#CJK UNIFIED IDEOGRAPH
+0x95C1	0x853D	#CJK UNIFIED IDEOGRAPH
+0x95C2	0x9589	#CJK UNIFIED IDEOGRAPH
+0x95C3	0x965B	#CJK UNIFIED IDEOGRAPH
+0x95C4	0x7C73	#CJK UNIFIED IDEOGRAPH
+0x95C5	0x9801	#CJK UNIFIED IDEOGRAPH
+0x95C6	0x50FB	#CJK UNIFIED IDEOGRAPH
+0x95C7	0x58C1	#CJK UNIFIED IDEOGRAPH
+0x95C8	0x7656	#CJK UNIFIED IDEOGRAPH
+0x95C9	0x78A7	#CJK UNIFIED IDEOGRAPH
+0x95CA	0x5225	#CJK UNIFIED IDEOGRAPH
+0x95CB	0x77A5	#CJK UNIFIED IDEOGRAPH
+0x95CC	0x8511	#CJK UNIFIED IDEOGRAPH
+0x95CD	0x7B86	#CJK UNIFIED IDEOGRAPH
+0x95CE	0x504F	#CJK UNIFIED IDEOGRAPH
+0x95CF	0x5909	#CJK UNIFIED IDEOGRAPH
+0x95D0	0x7247	#CJK UNIFIED IDEOGRAPH
+0x95D1	0x7BC7	#CJK UNIFIED IDEOGRAPH
+0x95D2	0x7DE8	#CJK UNIFIED IDEOGRAPH
+0x95D3	0x8FBA	#CJK UNIFIED IDEOGRAPH
+0x95D4	0x8FD4	#CJK UNIFIED IDEOGRAPH
+0x95D5	0x904D	#CJK UNIFIED IDEOGRAPH
+0x95D6	0x4FBF	#CJK UNIFIED IDEOGRAPH
+0x95D7	0x52C9	#CJK UNIFIED IDEOGRAPH
+0x95D8	0x5A29	#CJK UNIFIED IDEOGRAPH
+0x95D9	0x5F01	#CJK UNIFIED IDEOGRAPH
+0x95DA	0x97AD	#CJK UNIFIED IDEOGRAPH
+0x95DB	0x4FDD	#CJK UNIFIED IDEOGRAPH
+0x95DC	0x8217	#CJK UNIFIED IDEOGRAPH
+0x95DD	0x92EA	#CJK UNIFIED IDEOGRAPH
+0x95DE	0x5703	#CJK UNIFIED IDEOGRAPH
+0x95DF	0x6355	#CJK UNIFIED IDEOGRAPH
+0x95E0	0x6B69	#CJK UNIFIED IDEOGRAPH
+0x95E1	0x752B	#CJK UNIFIED IDEOGRAPH
+0x95E2	0x88DC	#CJK UNIFIED IDEOGRAPH
+0x95E3	0x8F14	#CJK UNIFIED IDEOGRAPH
+0x95E4	0x7A42	#CJK UNIFIED IDEOGRAPH
+0x95E5	0x52DF	#CJK UNIFIED IDEOGRAPH
+0x95E6	0x5893	#CJK UNIFIED IDEOGRAPH
+0x95E7	0x6155	#CJK UNIFIED IDEOGRAPH
+0x95E8	0x620A	#CJK UNIFIED IDEOGRAPH
+0x95E9	0x66AE	#CJK UNIFIED IDEOGRAPH
+0x95EA	0x6BCD	#CJK UNIFIED IDEOGRAPH
+0x95EB	0x7C3F	#CJK UNIFIED IDEOGRAPH
+0x95EC	0x83E9	#CJK UNIFIED IDEOGRAPH
+0x95ED	0x5023	#CJK UNIFIED IDEOGRAPH
+0x95EE	0x4FF8	#CJK UNIFIED IDEOGRAPH
+0x95EF	0x5305	#CJK UNIFIED IDEOGRAPH
+0x95F0	0x5446	#CJK UNIFIED IDEOGRAPH
+0x95F1	0x5831	#CJK UNIFIED IDEOGRAPH
+0x95F2	0x5949	#CJK UNIFIED IDEOGRAPH
+0x95F3	0x5B9D	#CJK UNIFIED IDEOGRAPH
+0x95F4	0x5CF0	#CJK UNIFIED IDEOGRAPH
+0x95F5	0x5CEF	#CJK UNIFIED IDEOGRAPH
+0x95F6	0x5D29	#CJK UNIFIED IDEOGRAPH
+0x95F7	0x5E96	#CJK UNIFIED IDEOGRAPH
+0x95F8	0x62B1	#CJK UNIFIED IDEOGRAPH
+0x95F9	0x6367	#CJK UNIFIED IDEOGRAPH
+0x95FA	0x653E	#CJK UNIFIED IDEOGRAPH
+0x95FB	0x65B9	#CJK UNIFIED IDEOGRAPH
+0x95FC	0x670B	#CJK UNIFIED IDEOGRAPH
+0x9640	0x6CD5	#CJK UNIFIED IDEOGRAPH
+0x9641	0x6CE1	#CJK UNIFIED IDEOGRAPH
+0x9642	0x70F9	#CJK UNIFIED IDEOGRAPH
+0x9643	0x7832	#CJK UNIFIED IDEOGRAPH
+0x9644	0x7E2B	#CJK UNIFIED IDEOGRAPH
+0x9645	0x80DE	#CJK UNIFIED IDEOGRAPH
+0x9646	0x82B3	#CJK UNIFIED IDEOGRAPH
+0x9647	0x840C	#CJK UNIFIED IDEOGRAPH
+0x9648	0x84EC	#CJK UNIFIED IDEOGRAPH
+0x9649	0x8702	#CJK UNIFIED IDEOGRAPH
+0x964A	0x8912	#CJK UNIFIED IDEOGRAPH
+0x964B	0x8A2A	#CJK UNIFIED IDEOGRAPH
+0x964C	0x8C4A	#CJK UNIFIED IDEOGRAPH
+0x964D	0x90A6	#CJK UNIFIED IDEOGRAPH
+0x964E	0x92D2	#CJK UNIFIED IDEOGRAPH
+0x964F	0x98FD	#CJK UNIFIED IDEOGRAPH
+0x9650	0x9CF3	#CJK UNIFIED IDEOGRAPH
+0x9651	0x9D6C	#CJK UNIFIED IDEOGRAPH
+0x9652	0x4E4F	#CJK UNIFIED IDEOGRAPH
+0x9653	0x4EA1	#CJK UNIFIED IDEOGRAPH
+0x9654	0x508D	#CJK UNIFIED IDEOGRAPH
+0x9655	0x5256	#CJK UNIFIED IDEOGRAPH
+0x9656	0x574A	#CJK UNIFIED IDEOGRAPH
+0x9657	0x59A8	#CJK UNIFIED IDEOGRAPH
+0x9658	0x5E3D	#CJK UNIFIED IDEOGRAPH
+0x9659	0x5FD8	#CJK UNIFIED IDEOGRAPH
+0x965A	0x5FD9	#CJK UNIFIED IDEOGRAPH
+0x965B	0x623F	#CJK UNIFIED IDEOGRAPH
+0x965C	0x66B4	#CJK UNIFIED IDEOGRAPH
+0x965D	0x671B	#CJK UNIFIED IDEOGRAPH
+0x965E	0x67D0	#CJK UNIFIED IDEOGRAPH
+0x965F	0x68D2	#CJK UNIFIED IDEOGRAPH
+0x9660	0x5192	#CJK UNIFIED IDEOGRAPH
+0x9661	0x7D21	#CJK UNIFIED IDEOGRAPH
+0x9662	0x80AA	#CJK UNIFIED IDEOGRAPH
+0x9663	0x81A8	#CJK UNIFIED IDEOGRAPH
+0x9664	0x8B00	#CJK UNIFIED IDEOGRAPH
+0x9665	0x8C8C	#CJK UNIFIED IDEOGRAPH
+0x9666	0x8CBF	#CJK UNIFIED IDEOGRAPH
+0x9667	0x927E	#CJK UNIFIED IDEOGRAPH
+0x9668	0x9632	#CJK UNIFIED IDEOGRAPH
+0x9669	0x5420	#CJK UNIFIED IDEOGRAPH
+0x966A	0x982C	#CJK UNIFIED IDEOGRAPH
+0x966B	0x5317	#CJK UNIFIED IDEOGRAPH
+0x966C	0x50D5	#CJK UNIFIED IDEOGRAPH
+0x966D	0x535C	#CJK UNIFIED IDEOGRAPH
+0x966E	0x58A8	#CJK UNIFIED IDEOGRAPH
+0x966F	0x64B2	#CJK UNIFIED IDEOGRAPH
+0x9670	0x6734	#CJK UNIFIED IDEOGRAPH
+0x9671	0x7267	#CJK UNIFIED IDEOGRAPH
+0x9672	0x7766	#CJK UNIFIED IDEOGRAPH
+0x9673	0x7A46	#CJK UNIFIED IDEOGRAPH
+0x9674	0x91E6	#CJK UNIFIED IDEOGRAPH
+0x9675	0x52C3	#CJK UNIFIED IDEOGRAPH
+0x9676	0x6CA1	#CJK UNIFIED IDEOGRAPH
+0x9677	0x6B86	#CJK UNIFIED IDEOGRAPH
+0x9678	0x5800	#CJK UNIFIED IDEOGRAPH
+0x9679	0x5E4C	#CJK UNIFIED IDEOGRAPH
+0x967A	0x5954	#CJK UNIFIED IDEOGRAPH
+0x967B	0x672C	#CJK UNIFIED IDEOGRAPH
+0x967C	0x7FFB	#CJK UNIFIED IDEOGRAPH
+0x967D	0x51E1	#CJK UNIFIED IDEOGRAPH
+0x967E	0x76C6	#CJK UNIFIED IDEOGRAPH
+0x9680	0x6469	#CJK UNIFIED IDEOGRAPH
+0x9681	0x78E8	#CJK UNIFIED IDEOGRAPH
+0x9682	0x9B54	#CJK UNIFIED IDEOGRAPH
+0x9683	0x9EBB	#CJK UNIFIED IDEOGRAPH
+0x9684	0x57CB	#CJK UNIFIED IDEOGRAPH
+0x9685	0x59B9	#CJK UNIFIED IDEOGRAPH
+0x9686	0x6627	#CJK UNIFIED IDEOGRAPH
+0x9687	0x679A	#CJK UNIFIED IDEOGRAPH
+0x9688	0x6BCE	#CJK UNIFIED IDEOGRAPH
+0x9689	0x54E9	#CJK UNIFIED IDEOGRAPH
+0x968A	0x69D9	#CJK UNIFIED IDEOGRAPH
+0x968B	0x5E55	#CJK UNIFIED IDEOGRAPH
+0x968C	0x819C	#CJK UNIFIED IDEOGRAPH
+0x968D	0x6795	#CJK UNIFIED IDEOGRAPH
+0x968E	0x9BAA	#CJK UNIFIED IDEOGRAPH
+0x968F	0x67FE	#CJK UNIFIED IDEOGRAPH
+0x9690	0x9C52	#CJK UNIFIED IDEOGRAPH
+0x9691	0x685D	#CJK UNIFIED IDEOGRAPH
+0x9692	0x4EA6	#CJK UNIFIED IDEOGRAPH
+0x9693	0x4FE3	#CJK UNIFIED IDEOGRAPH
+0x9694	0x53C8	#CJK UNIFIED IDEOGRAPH
+0x9695	0x62B9	#CJK UNIFIED IDEOGRAPH
+0x9696	0x672B	#CJK UNIFIED IDEOGRAPH
+0x9697	0x6CAB	#CJK UNIFIED IDEOGRAPH
+0x9698	0x8FC4	#CJK UNIFIED IDEOGRAPH
+0x9699	0x4FAD	#CJK UNIFIED IDEOGRAPH
+0x969A	0x7E6D	#CJK UNIFIED IDEOGRAPH
+0x969B	0x9EBF	#CJK UNIFIED IDEOGRAPH
+0x969C	0x4E07	#CJK UNIFIED IDEOGRAPH
+0x969D	0x6162	#CJK UNIFIED IDEOGRAPH
+0x969E	0x6E80	#CJK UNIFIED IDEOGRAPH
+0x969F	0x6F2B	#CJK UNIFIED IDEOGRAPH
+0x96A0	0x8513	#CJK UNIFIED IDEOGRAPH
+0x96A1	0x5473	#CJK UNIFIED IDEOGRAPH
+0x96A2	0x672A	#CJK UNIFIED IDEOGRAPH
+0x96A3	0x9B45	#CJK UNIFIED IDEOGRAPH
+0x96A4	0x5DF3	#CJK UNIFIED IDEOGRAPH
+0x96A5	0x7B95	#CJK UNIFIED IDEOGRAPH
+0x96A6	0x5CAC	#CJK UNIFIED IDEOGRAPH
+0x96A7	0x5BC6	#CJK UNIFIED IDEOGRAPH
+0x96A8	0x871C	#CJK UNIFIED IDEOGRAPH
+0x96A9	0x6E4A	#CJK UNIFIED IDEOGRAPH
+0x96AA	0x84D1	#CJK UNIFIED IDEOGRAPH
+0x96AB	0x7A14	#CJK UNIFIED IDEOGRAPH
+0x96AC	0x8108	#CJK UNIFIED IDEOGRAPH
+0x96AD	0x5999	#CJK UNIFIED IDEOGRAPH
+0x96AE	0x7C8D	#CJK UNIFIED IDEOGRAPH
+0x96AF	0x6C11	#CJK UNIFIED IDEOGRAPH
+0x96B0	0x7720	#CJK UNIFIED IDEOGRAPH
+0x96B1	0x52D9	#CJK UNIFIED IDEOGRAPH
+0x96B2	0x5922	#CJK UNIFIED IDEOGRAPH
+0x96B3	0x7121	#CJK UNIFIED IDEOGRAPH
+0x96B4	0x725F	#CJK UNIFIED IDEOGRAPH
+0x96B5	0x77DB	#CJK UNIFIED IDEOGRAPH
+0x96B6	0x9727	#CJK UNIFIED IDEOGRAPH
+0x96B7	0x9D61	#CJK UNIFIED IDEOGRAPH
+0x96B8	0x690B	#CJK UNIFIED IDEOGRAPH
+0x96B9	0x5A7F	#CJK UNIFIED IDEOGRAPH
+0x96BA	0x5A18	#CJK UNIFIED IDEOGRAPH
+0x96BB	0x51A5	#CJK UNIFIED IDEOGRAPH
+0x96BC	0x540D	#CJK UNIFIED IDEOGRAPH
+0x96BD	0x547D	#CJK UNIFIED IDEOGRAPH
+0x96BE	0x660E	#CJK UNIFIED IDEOGRAPH
+0x96BF	0x76DF	#CJK UNIFIED IDEOGRAPH
+0x96C0	0x8FF7	#CJK UNIFIED IDEOGRAPH
+0x96C1	0x9298	#CJK UNIFIED IDEOGRAPH
+0x96C2	0x9CF4	#CJK UNIFIED IDEOGRAPH
+0x96C3	0x59EA	#CJK UNIFIED IDEOGRAPH
+0x96C4	0x725D	#CJK UNIFIED IDEOGRAPH
+0x96C5	0x6EC5	#CJK UNIFIED IDEOGRAPH
+0x96C6	0x514D	#CJK UNIFIED IDEOGRAPH
+0x96C7	0x68C9	#CJK UNIFIED IDEOGRAPH
+0x96C8	0x7DBF	#CJK UNIFIED IDEOGRAPH
+0x96C9	0x7DEC	#CJK UNIFIED IDEOGRAPH
+0x96CA	0x9762	#CJK UNIFIED IDEOGRAPH
+0x96CB	0x9EBA	#CJK UNIFIED IDEOGRAPH
+0x96CC	0x6478	#CJK UNIFIED IDEOGRAPH
+0x96CD	0x6A21	#CJK UNIFIED IDEOGRAPH
+0x96CE	0x8302	#CJK UNIFIED IDEOGRAPH
+0x96CF	0x5984	#CJK UNIFIED IDEOGRAPH
+0x96D0	0x5B5F	#CJK UNIFIED IDEOGRAPH
+0x96D1	0x6BDB	#CJK UNIFIED IDEOGRAPH
+0x96D2	0x731B	#CJK UNIFIED IDEOGRAPH
+0x96D3	0x76F2	#CJK UNIFIED IDEOGRAPH
+0x96D4	0x7DB2	#CJK UNIFIED IDEOGRAPH
+0x96D5	0x8017	#CJK UNIFIED IDEOGRAPH
+0x96D6	0x8499	#CJK UNIFIED IDEOGRAPH
+0x96D7	0x5132	#CJK UNIFIED IDEOGRAPH
+0x96D8	0x6728	#CJK UNIFIED IDEOGRAPH
+0x96D9	0x9ED9	#CJK UNIFIED IDEOGRAPH
+0x96DA	0x76EE	#CJK UNIFIED IDEOGRAPH
+0x96DB	0x6762	#CJK UNIFIED IDEOGRAPH
+0x96DC	0x52FF	#CJK UNIFIED IDEOGRAPH
+0x96DD	0x9905	#CJK UNIFIED IDEOGRAPH
+0x96DE	0x5C24	#CJK UNIFIED IDEOGRAPH
+0x96DF	0x623B	#CJK UNIFIED IDEOGRAPH
+0x96E0	0x7C7E	#CJK UNIFIED IDEOGRAPH
+0x96E1	0x8CB0	#CJK UNIFIED IDEOGRAPH
+0x96E2	0x554F	#CJK UNIFIED IDEOGRAPH
+0x96E3	0x60B6	#CJK UNIFIED IDEOGRAPH
+0x96E4	0x7D0B	#CJK UNIFIED IDEOGRAPH
+0x96E5	0x9580	#CJK UNIFIED IDEOGRAPH
+0x96E6	0x5301	#CJK UNIFIED IDEOGRAPH
+0x96E7	0x4E5F	#CJK UNIFIED IDEOGRAPH
+0x96E8	0x51B6	#CJK UNIFIED IDEOGRAPH
+0x96E9	0x591C	#CJK UNIFIED IDEOGRAPH
+0x96EA	0x723A	#CJK UNIFIED IDEOGRAPH
+0x96EB	0x8036	#CJK UNIFIED IDEOGRAPH
+0x96EC	0x91CE	#CJK UNIFIED IDEOGRAPH
+0x96ED	0x5F25	#CJK UNIFIED IDEOGRAPH
+0x96EE	0x77E2	#CJK UNIFIED IDEOGRAPH
+0x96EF	0x5384	#CJK UNIFIED IDEOGRAPH
+0x96F0	0x5F79	#CJK UNIFIED IDEOGRAPH
+0x96F1	0x7D04	#CJK UNIFIED IDEOGRAPH
+0x96F2	0x85AC	#CJK UNIFIED IDEOGRAPH
+0x96F3	0x8A33	#CJK UNIFIED IDEOGRAPH
+0x96F4	0x8E8D	#CJK UNIFIED IDEOGRAPH
+0x96F5	0x9756	#CJK UNIFIED IDEOGRAPH
+0x96F6	0x67F3	#CJK UNIFIED IDEOGRAPH
+0x96F7	0x85AE	#CJK UNIFIED IDEOGRAPH
+0x96F8	0x9453	#CJK UNIFIED IDEOGRAPH
+0x96F9	0x6109	#CJK UNIFIED IDEOGRAPH
+0x96FA	0x6108	#CJK UNIFIED IDEOGRAPH
+0x96FB	0x6CB9	#CJK UNIFIED IDEOGRAPH
+0x96FC	0x7652	#CJK UNIFIED IDEOGRAPH
+0x9740	0x8AED	#CJK UNIFIED IDEOGRAPH
+0x9741	0x8F38	#CJK UNIFIED IDEOGRAPH
+0x9742	0x552F	#CJK UNIFIED IDEOGRAPH
+0x9743	0x4F51	#CJK UNIFIED IDEOGRAPH
+0x9744	0x512A	#CJK UNIFIED IDEOGRAPH
+0x9745	0x52C7	#CJK UNIFIED IDEOGRAPH
+0x9746	0x53CB	#CJK UNIFIED IDEOGRAPH
+0x9747	0x5BA5	#CJK UNIFIED IDEOGRAPH
+0x9748	0x5E7D	#CJK UNIFIED IDEOGRAPH
+0x9749	0x60A0	#CJK UNIFIED IDEOGRAPH
+0x974A	0x6182	#CJK UNIFIED IDEOGRAPH
+0x974B	0x63D6	#CJK UNIFIED IDEOGRAPH
+0x974C	0x6709	#CJK UNIFIED IDEOGRAPH
+0x974D	0x67DA	#CJK UNIFIED IDEOGRAPH
+0x974E	0x6E67	#CJK UNIFIED IDEOGRAPH
+0x974F	0x6D8C	#CJK UNIFIED IDEOGRAPH
+0x9750	0x7336	#CJK UNIFIED IDEOGRAPH
+0x9751	0x7337	#CJK UNIFIED IDEOGRAPH
+0x9752	0x7531	#CJK UNIFIED IDEOGRAPH
+0x9753	0x7950	#CJK UNIFIED IDEOGRAPH
+0x9754	0x88D5	#CJK UNIFIED IDEOGRAPH
+0x9755	0x8A98	#CJK UNIFIED IDEOGRAPH
+0x9756	0x904A	#CJK UNIFIED IDEOGRAPH
+0x9757	0x9091	#CJK UNIFIED IDEOGRAPH
+0x9758	0x90F5	#CJK UNIFIED IDEOGRAPH
+0x9759	0x96C4	#CJK UNIFIED IDEOGRAPH
+0x975A	0x878D	#CJK UNIFIED IDEOGRAPH
+0x975B	0x5915	#CJK UNIFIED IDEOGRAPH
+0x975C	0x4E88	#CJK UNIFIED IDEOGRAPH
+0x975D	0x4F59	#CJK UNIFIED IDEOGRAPH
+0x975E	0x4E0E	#CJK UNIFIED IDEOGRAPH
+0x975F	0x8A89	#CJK UNIFIED IDEOGRAPH
+0x9760	0x8F3F	#CJK UNIFIED IDEOGRAPH
+0x9761	0x9810	#CJK UNIFIED IDEOGRAPH
+0x9762	0x50AD	#CJK UNIFIED IDEOGRAPH
+0x9763	0x5E7C	#CJK UNIFIED IDEOGRAPH
+0x9764	0x5996	#CJK UNIFIED IDEOGRAPH
+0x9765	0x5BB9	#CJK UNIFIED IDEOGRAPH
+0x9766	0x5EB8	#CJK UNIFIED IDEOGRAPH
+0x9767	0x63DA	#CJK UNIFIED IDEOGRAPH
+0x9768	0x63FA	#CJK UNIFIED IDEOGRAPH
+0x9769	0x64C1	#CJK UNIFIED IDEOGRAPH
+0x976A	0x66DC	#CJK UNIFIED IDEOGRAPH
+0x976B	0x694A	#CJK UNIFIED IDEOGRAPH
+0x976C	0x69D8	#CJK UNIFIED IDEOGRAPH
+0x976D	0x6D0B	#CJK UNIFIED IDEOGRAPH
+0x976E	0x6EB6	#CJK UNIFIED IDEOGRAPH
+0x976F	0x7194	#CJK UNIFIED IDEOGRAPH
+0x9770	0x7528	#CJK UNIFIED IDEOGRAPH
+0x9771	0x7AAF	#CJK UNIFIED IDEOGRAPH
+0x9772	0x7F8A	#CJK UNIFIED IDEOGRAPH
+0x9773	0x8000	#CJK UNIFIED IDEOGRAPH
+0x9774	0x8449	#CJK UNIFIED IDEOGRAPH
+0x9775	0x84C9	#CJK UNIFIED IDEOGRAPH
+0x9776	0x8981	#CJK UNIFIED IDEOGRAPH
+0x9777	0x8B21	#CJK UNIFIED IDEOGRAPH
+0x9778	0x8E0A	#CJK UNIFIED IDEOGRAPH
+0x9779	0x9065	#CJK UNIFIED IDEOGRAPH
+0x977A	0x967D	#CJK UNIFIED IDEOGRAPH
+0x977B	0x990A	#CJK UNIFIED IDEOGRAPH
+0x977C	0x617E	#CJK UNIFIED IDEOGRAPH
+0x977D	0x6291	#CJK UNIFIED IDEOGRAPH
+0x977E	0x6B32	#CJK UNIFIED IDEOGRAPH
+0x9780	0x6C83	#CJK UNIFIED IDEOGRAPH
+0x9781	0x6D74	#CJK UNIFIED IDEOGRAPH
+0x9782	0x7FCC	#CJK UNIFIED IDEOGRAPH
+0x9783	0x7FFC	#CJK UNIFIED IDEOGRAPH
+0x9784	0x6DC0	#CJK UNIFIED IDEOGRAPH
+0x9785	0x7F85	#CJK UNIFIED IDEOGRAPH
+0x9786	0x87BA	#CJK UNIFIED IDEOGRAPH
+0x9787	0x88F8	#CJK UNIFIED IDEOGRAPH
+0x9788	0x6765	#CJK UNIFIED IDEOGRAPH
+0x9789	0x83B1	#CJK UNIFIED IDEOGRAPH
+0x978A	0x983C	#CJK UNIFIED IDEOGRAPH
+0x978B	0x96F7	#CJK UNIFIED IDEOGRAPH
+0x978C	0x6D1B	#CJK UNIFIED IDEOGRAPH
+0x978D	0x7D61	#CJK UNIFIED IDEOGRAPH
+0x978E	0x843D	#CJK UNIFIED IDEOGRAPH
+0x978F	0x916A	#CJK UNIFIED IDEOGRAPH
+0x9790	0x4E71	#CJK UNIFIED IDEOGRAPH
+0x9791	0x5375	#CJK UNIFIED IDEOGRAPH
+0x9792	0x5D50	#CJK UNIFIED IDEOGRAPH
+0x9793	0x6B04	#CJK UNIFIED IDEOGRAPH
+0x9794	0x6FEB	#CJK UNIFIED IDEOGRAPH
+0x9795	0x85CD	#CJK UNIFIED IDEOGRAPH
+0x9796	0x862D	#CJK UNIFIED IDEOGRAPH
+0x9797	0x89A7	#CJK UNIFIED IDEOGRAPH
+0x9798	0x5229	#CJK UNIFIED IDEOGRAPH
+0x9799	0x540F	#CJK UNIFIED IDEOGRAPH
+0x979A	0x5C65	#CJK UNIFIED IDEOGRAPH
+0x979B	0x674E	#CJK UNIFIED IDEOGRAPH
+0x979C	0x68A8	#CJK UNIFIED IDEOGRAPH
+0x979D	0x7406	#CJK UNIFIED IDEOGRAPH
+0x979E	0x7483	#CJK UNIFIED IDEOGRAPH
+0x979F	0x75E2	#CJK UNIFIED IDEOGRAPH
+0x97A0	0x88CF	#CJK UNIFIED IDEOGRAPH
+0x97A1	0x88E1	#CJK UNIFIED IDEOGRAPH
+0x97A2	0x91CC	#CJK UNIFIED IDEOGRAPH
+0x97A3	0x96E2	#CJK UNIFIED IDEOGRAPH
+0x97A4	0x9678	#CJK UNIFIED IDEOGRAPH
+0x97A5	0x5F8B	#CJK UNIFIED IDEOGRAPH
+0x97A6	0x7387	#CJK UNIFIED IDEOGRAPH
+0x97A7	0x7ACB	#CJK UNIFIED IDEOGRAPH
+0x97A8	0x844E	#CJK UNIFIED IDEOGRAPH
+0x97A9	0x63A0	#CJK UNIFIED IDEOGRAPH
+0x97AA	0x7565	#CJK UNIFIED IDEOGRAPH
+0x97AB	0x5289	#CJK UNIFIED IDEOGRAPH
+0x97AC	0x6D41	#CJK UNIFIED IDEOGRAPH
+0x97AD	0x6E9C	#CJK UNIFIED IDEOGRAPH
+0x97AE	0x7409	#CJK UNIFIED IDEOGRAPH
+0x97AF	0x7559	#CJK UNIFIED IDEOGRAPH
+0x97B0	0x786B	#CJK UNIFIED IDEOGRAPH
+0x97B1	0x7C92	#CJK UNIFIED IDEOGRAPH
+0x97B2	0x9686	#CJK UNIFIED IDEOGRAPH
+0x97B3	0x7ADC	#CJK UNIFIED IDEOGRAPH
+0x97B4	0x9F8D	#CJK UNIFIED IDEOGRAPH
+0x97B5	0x4FB6	#CJK UNIFIED IDEOGRAPH
+0x97B6	0x616E	#CJK UNIFIED IDEOGRAPH
+0x97B7	0x65C5	#CJK UNIFIED IDEOGRAPH
+0x97B8	0x865C	#CJK UNIFIED IDEOGRAPH
+0x97B9	0x4E86	#CJK UNIFIED IDEOGRAPH
+0x97BA	0x4EAE	#CJK UNIFIED IDEOGRAPH
+0x97BB	0x50DA	#CJK UNIFIED IDEOGRAPH
+0x97BC	0x4E21	#CJK UNIFIED IDEOGRAPH
+0x97BD	0x51CC	#CJK UNIFIED IDEOGRAPH
+0x97BE	0x5BEE	#CJK UNIFIED IDEOGRAPH
+0x97BF	0x6599	#CJK UNIFIED IDEOGRAPH
+0x97C0	0x6881	#CJK UNIFIED IDEOGRAPH
+0x97C1	0x6DBC	#CJK UNIFIED IDEOGRAPH
+0x97C2	0x731F	#CJK UNIFIED IDEOGRAPH
+0x97C3	0x7642	#CJK UNIFIED IDEOGRAPH
+0x97C4	0x77AD	#CJK UNIFIED IDEOGRAPH
+0x97C5	0x7A1C	#CJK UNIFIED IDEOGRAPH
+0x97C6	0x7CE7	#CJK UNIFIED IDEOGRAPH
+0x97C7	0x826F	#CJK UNIFIED IDEOGRAPH
+0x97C8	0x8AD2	#CJK UNIFIED IDEOGRAPH
+0x97C9	0x907C	#CJK UNIFIED IDEOGRAPH
+0x97CA	0x91CF	#CJK UNIFIED IDEOGRAPH
+0x97CB	0x9675	#CJK UNIFIED IDEOGRAPH
+0x97CC	0x9818	#CJK UNIFIED IDEOGRAPH
+0x97CD	0x529B	#CJK UNIFIED IDEOGRAPH
+0x97CE	0x7DD1	#CJK UNIFIED IDEOGRAPH
+0x97CF	0x502B	#CJK UNIFIED IDEOGRAPH
+0x97D0	0x5398	#CJK UNIFIED IDEOGRAPH
+0x97D1	0x6797	#CJK UNIFIED IDEOGRAPH
+0x97D2	0x6DCB	#CJK UNIFIED IDEOGRAPH
+0x97D3	0x71D0	#CJK UNIFIED IDEOGRAPH
+0x97D4	0x7433	#CJK UNIFIED IDEOGRAPH
+0x97D5	0x81E8	#CJK UNIFIED IDEOGRAPH
+0x97D6	0x8F2A	#CJK UNIFIED IDEOGRAPH
+0x97D7	0x96A3	#CJK UNIFIED IDEOGRAPH
+0x97D8	0x9C57	#CJK UNIFIED IDEOGRAPH
+0x97D9	0x9E9F	#CJK UNIFIED IDEOGRAPH
+0x97DA	0x7460	#CJK UNIFIED IDEOGRAPH
+0x97DB	0x5841	#CJK UNIFIED IDEOGRAPH
+0x97DC	0x6D99	#CJK UNIFIED IDEOGRAPH
+0x97DD	0x7D2F	#CJK UNIFIED IDEOGRAPH
+0x97DE	0x985E	#CJK UNIFIED IDEOGRAPH
+0x97DF	0x4EE4	#CJK UNIFIED IDEOGRAPH
+0x97E0	0x4F36	#CJK UNIFIED IDEOGRAPH
+0x97E1	0x4F8B	#CJK UNIFIED IDEOGRAPH
+0x97E2	0x51B7	#CJK UNIFIED IDEOGRAPH
+0x97E3	0x52B1	#CJK UNIFIED IDEOGRAPH
+0x97E4	0x5DBA	#CJK UNIFIED IDEOGRAPH
+0x97E5	0x601C	#CJK UNIFIED IDEOGRAPH
+0x97E6	0x73B2	#CJK UNIFIED IDEOGRAPH
+0x97E7	0x793C	#CJK UNIFIED IDEOGRAPH
+0x97E8	0x82D3	#CJK UNIFIED IDEOGRAPH
+0x97E9	0x9234	#CJK UNIFIED IDEOGRAPH
+0x97EA	0x96B7	#CJK UNIFIED IDEOGRAPH
+0x97EB	0x96F6	#CJK UNIFIED IDEOGRAPH
+0x97EC	0x970A	#CJK UNIFIED IDEOGRAPH
+0x97ED	0x9E97	#CJK UNIFIED IDEOGRAPH
+0x97EE	0x9F62	#CJK UNIFIED IDEOGRAPH
+0x97EF	0x66A6	#CJK UNIFIED IDEOGRAPH
+0x97F0	0x6B74	#CJK UNIFIED IDEOGRAPH
+0x97F1	0x5217	#CJK UNIFIED IDEOGRAPH
+0x97F2	0x52A3	#CJK UNIFIED IDEOGRAPH
+0x97F3	0x70C8	#CJK UNIFIED IDEOGRAPH
+0x97F4	0x88C2	#CJK UNIFIED IDEOGRAPH
+0x97F5	0x5EC9	#CJK UNIFIED IDEOGRAPH
+0x97F6	0x604B	#CJK UNIFIED IDEOGRAPH
+0x97F7	0x6190	#CJK UNIFIED IDEOGRAPH
+0x97F8	0x6F23	#CJK UNIFIED IDEOGRAPH
+0x97F9	0x7149	#CJK UNIFIED IDEOGRAPH
+0x97FA	0x7C3E	#CJK UNIFIED IDEOGRAPH
+0x97FB	0x7DF4	#CJK UNIFIED IDEOGRAPH
+0x97FC	0x806F	#CJK UNIFIED IDEOGRAPH
+0x9840	0x84EE	#CJK UNIFIED IDEOGRAPH
+0x9841	0x9023	#CJK UNIFIED IDEOGRAPH
+0x9842	0x932C	#CJK UNIFIED IDEOGRAPH
+0x9843	0x5442	#CJK UNIFIED IDEOGRAPH
+0x9844	0x9B6F	#CJK UNIFIED IDEOGRAPH
+0x9845	0x6AD3	#CJK UNIFIED IDEOGRAPH
+0x9846	0x7089	#CJK UNIFIED IDEOGRAPH
+0x9847	0x8CC2	#CJK UNIFIED IDEOGRAPH
+0x9848	0x8DEF	#CJK UNIFIED IDEOGRAPH
+0x9849	0x9732	#CJK UNIFIED IDEOGRAPH
+0x984A	0x52B4	#CJK UNIFIED IDEOGRAPH
+0x984B	0x5A41	#CJK UNIFIED IDEOGRAPH
+0x984C	0x5ECA	#CJK UNIFIED IDEOGRAPH
+0x984D	0x5F04	#CJK UNIFIED IDEOGRAPH
+0x984E	0x6717	#CJK UNIFIED IDEOGRAPH
+0x984F	0x697C	#CJK UNIFIED IDEOGRAPH
+0x9850	0x6994	#CJK UNIFIED IDEOGRAPH
+0x9851	0x6D6A	#CJK UNIFIED IDEOGRAPH
+0x9852	0x6F0F	#CJK UNIFIED IDEOGRAPH
+0x9853	0x7262	#CJK UNIFIED IDEOGRAPH
+0x9854	0x72FC	#CJK UNIFIED IDEOGRAPH
+0x9855	0x7BED	#CJK UNIFIED IDEOGRAPH
+0x9856	0x8001	#CJK UNIFIED IDEOGRAPH
+0x9857	0x807E	#CJK UNIFIED IDEOGRAPH
+0x9858	0x874B	#CJK UNIFIED IDEOGRAPH
+0x9859	0x90CE	#CJK UNIFIED IDEOGRAPH
+0x985A	0x516D	#CJK UNIFIED IDEOGRAPH
+0x985B	0x9E93	#CJK UNIFIED IDEOGRAPH
+0x985C	0x7984	#CJK UNIFIED IDEOGRAPH
+0x985D	0x808B	#CJK UNIFIED IDEOGRAPH
+0x985E	0x9332	#CJK UNIFIED IDEOGRAPH
+0x985F	0x8AD6	#CJK UNIFIED IDEOGRAPH
+0x9860	0x502D	#CJK UNIFIED IDEOGRAPH
+0x9861	0x548C	#CJK UNIFIED IDEOGRAPH
+0x9862	0x8A71	#CJK UNIFIED IDEOGRAPH
+0x9863	0x6B6A	#CJK UNIFIED IDEOGRAPH
+0x9864	0x8CC4	#CJK UNIFIED IDEOGRAPH
+0x9865	0x8107	#CJK UNIFIED IDEOGRAPH
+0x9866	0x60D1	#CJK UNIFIED IDEOGRAPH
+0x9867	0x67A0	#CJK UNIFIED IDEOGRAPH
+0x9868	0x9DF2	#CJK UNIFIED IDEOGRAPH
+0x9869	0x4E99	#CJK UNIFIED IDEOGRAPH
+0x986A	0x4E98	#CJK UNIFIED IDEOGRAPH
+0x986B	0x9C10	#CJK UNIFIED IDEOGRAPH
+0x986C	0x8A6B	#CJK UNIFIED IDEOGRAPH
+0x986D	0x85C1	#CJK UNIFIED IDEOGRAPH
+0x986E	0x8568	#CJK UNIFIED IDEOGRAPH
+0x986F	0x6900	#CJK UNIFIED IDEOGRAPH
+0x9870	0x6E7E	#CJK UNIFIED IDEOGRAPH
+0x9871	0x7897	#CJK UNIFIED IDEOGRAPH
+0x9872	0x8155	#CJK UNIFIED IDEOGRAPH
+0x989F	0x5F0C	#CJK UNIFIED IDEOGRAPH
+0x98A0	0x4E10	#CJK UNIFIED IDEOGRAPH
+0x98A1	0x4E15	#CJK UNIFIED IDEOGRAPH
+0x98A2	0x4E2A	#CJK UNIFIED IDEOGRAPH
+0x98A3	0x4E31	#CJK UNIFIED IDEOGRAPH
+0x98A4	0x4E36	#CJK UNIFIED IDEOGRAPH
+0x98A5	0x4E3C	#CJK UNIFIED IDEOGRAPH
+0x98A6	0x4E3F	#CJK UNIFIED IDEOGRAPH
+0x98A7	0x4E42	#CJK UNIFIED IDEOGRAPH
+0x98A8	0x4E56	#CJK UNIFIED IDEOGRAPH
+0x98A9	0x4E58	#CJK UNIFIED IDEOGRAPH
+0x98AA	0x4E82	#CJK UNIFIED IDEOGRAPH
+0x98AB	0x4E85	#CJK UNIFIED IDEOGRAPH
+0x98AC	0x8C6B	#CJK UNIFIED IDEOGRAPH
+0x98AD	0x4E8A	#CJK UNIFIED IDEOGRAPH
+0x98AE	0x8212	#CJK UNIFIED IDEOGRAPH
+0x98AF	0x5F0D	#CJK UNIFIED IDEOGRAPH
+0x98B0	0x4E8E	#CJK UNIFIED IDEOGRAPH
+0x98B1	0x4E9E	#CJK UNIFIED IDEOGRAPH
+0x98B2	0x4E9F	#CJK UNIFIED IDEOGRAPH
+0x98B3	0x4EA0	#CJK UNIFIED IDEOGRAPH
+0x98B4	0x4EA2	#CJK UNIFIED IDEOGRAPH
+0x98B5	0x4EB0	#CJK UNIFIED IDEOGRAPH
+0x98B6	0x4EB3	#CJK UNIFIED IDEOGRAPH
+0x98B7	0x4EB6	#CJK UNIFIED IDEOGRAPH
+0x98B8	0x4ECE	#CJK UNIFIED IDEOGRAPH
+0x98B9	0x4ECD	#CJK UNIFIED IDEOGRAPH
+0x98BA	0x4EC4	#CJK UNIFIED IDEOGRAPH
+0x98BB	0x4EC6	#CJK UNIFIED IDEOGRAPH
+0x98BC	0x4EC2	#CJK UNIFIED IDEOGRAPH
+0x98BD	0x4ED7	#CJK UNIFIED IDEOGRAPH
+0x98BE	0x4EDE	#CJK UNIFIED IDEOGRAPH
+0x98BF	0x4EED	#CJK UNIFIED IDEOGRAPH
+0x98C0	0x4EDF	#CJK UNIFIED IDEOGRAPH
+0x98C1	0x4EF7	#CJK UNIFIED IDEOGRAPH
+0x98C2	0x4F09	#CJK UNIFIED IDEOGRAPH
+0x98C3	0x4F5A	#CJK UNIFIED IDEOGRAPH
+0x98C4	0x4F30	#CJK UNIFIED IDEOGRAPH
+0x98C5	0x4F5B	#CJK UNIFIED IDEOGRAPH
+0x98C6	0x4F5D	#CJK UNIFIED IDEOGRAPH
+0x98C7	0x4F57	#CJK UNIFIED IDEOGRAPH
+0x98C8	0x4F47	#CJK UNIFIED IDEOGRAPH
+0x98C9	0x4F76	#CJK UNIFIED IDEOGRAPH
+0x98CA	0x4F88	#CJK UNIFIED IDEOGRAPH
+0x98CB	0x4F8F	#CJK UNIFIED IDEOGRAPH
+0x98CC	0x4F98	#CJK UNIFIED IDEOGRAPH
+0x98CD	0x4F7B	#CJK UNIFIED IDEOGRAPH
+0x98CE	0x4F69	#CJK UNIFIED IDEOGRAPH
+0x98CF	0x4F70	#CJK UNIFIED IDEOGRAPH
+0x98D0	0x4F91	#CJK UNIFIED IDEOGRAPH
+0x98D1	0x4F6F	#CJK UNIFIED IDEOGRAPH
+0x98D2	0x4F86	#CJK UNIFIED IDEOGRAPH
+0x98D3	0x4F96	#CJK UNIFIED IDEOGRAPH
+0x98D4	0x5118	#CJK UNIFIED IDEOGRAPH
+0x98D5	0x4FD4	#CJK UNIFIED IDEOGRAPH
+0x98D6	0x4FDF	#CJK UNIFIED IDEOGRAPH
+0x98D7	0x4FCE	#CJK UNIFIED IDEOGRAPH
+0x98D8	0x4FD8	#CJK UNIFIED IDEOGRAPH
+0x98D9	0x4FDB	#CJK UNIFIED IDEOGRAPH
+0x98DA	0x4FD1	#CJK UNIFIED IDEOGRAPH
+0x98DB	0x4FDA	#CJK UNIFIED IDEOGRAPH
+0x98DC	0x4FD0	#CJK UNIFIED IDEOGRAPH
+0x98DD	0x4FE4	#CJK UNIFIED IDEOGRAPH
+0x98DE	0x4FE5	#CJK UNIFIED IDEOGRAPH
+0x98DF	0x501A	#CJK UNIFIED IDEOGRAPH
+0x98E0	0x5028	#CJK UNIFIED IDEOGRAPH
+0x98E1	0x5014	#CJK UNIFIED IDEOGRAPH
+0x98E2	0x502A	#CJK UNIFIED IDEOGRAPH
+0x98E3	0x5025	#CJK UNIFIED IDEOGRAPH
+0x98E4	0x5005	#CJK UNIFIED IDEOGRAPH
+0x98E5	0x4F1C	#CJK UNIFIED IDEOGRAPH
+0x98E6	0x4FF6	#CJK UNIFIED IDEOGRAPH
+0x98E7	0x5021	#CJK UNIFIED IDEOGRAPH
+0x98E8	0x5029	#CJK UNIFIED IDEOGRAPH
+0x98E9	0x502C	#CJK UNIFIED IDEOGRAPH
+0x98EA	0x4FFE	#CJK UNIFIED IDEOGRAPH
+0x98EB	0x4FEF	#CJK UNIFIED IDEOGRAPH
+0x98EC	0x5011	#CJK UNIFIED IDEOGRAPH
+0x98ED	0x5006	#CJK UNIFIED IDEOGRAPH
+0x98EE	0x5043	#CJK UNIFIED IDEOGRAPH
+0x98EF	0x5047	#CJK UNIFIED IDEOGRAPH
+0x98F0	0x6703	#CJK UNIFIED IDEOGRAPH
+0x98F1	0x5055	#CJK UNIFIED IDEOGRAPH
+0x98F2	0x5050	#CJK UNIFIED IDEOGRAPH
+0x98F3	0x5048	#CJK UNIFIED IDEOGRAPH
+0x98F4	0x505A	#CJK UNIFIED IDEOGRAPH
+0x98F5	0x5056	#CJK UNIFIED IDEOGRAPH
+0x98F6	0x506C	#CJK UNIFIED IDEOGRAPH
+0x98F7	0x5078	#CJK UNIFIED IDEOGRAPH
+0x98F8	0x5080	#CJK UNIFIED IDEOGRAPH
+0x98F9	0x509A	#CJK UNIFIED IDEOGRAPH
+0x98FA	0x5085	#CJK UNIFIED IDEOGRAPH
+0x98FB	0x50B4	#CJK UNIFIED IDEOGRAPH
+0x98FC	0x50B2	#CJK UNIFIED IDEOGRAPH
+0x9940	0x50C9	#CJK UNIFIED IDEOGRAPH
+0x9941	0x50CA	#CJK UNIFIED IDEOGRAPH
+0x9942	0x50B3	#CJK UNIFIED IDEOGRAPH
+0x9943	0x50C2	#CJK UNIFIED IDEOGRAPH
+0x9944	0x50D6	#CJK UNIFIED IDEOGRAPH
+0x9945	0x50DE	#CJK UNIFIED IDEOGRAPH
+0x9946	0x50E5	#CJK UNIFIED IDEOGRAPH
+0x9947	0x50ED	#CJK UNIFIED IDEOGRAPH
+0x9948	0x50E3	#CJK UNIFIED IDEOGRAPH
+0x9949	0x50EE	#CJK UNIFIED IDEOGRAPH
+0x994A	0x50F9	#CJK UNIFIED IDEOGRAPH
+0x994B	0x50F5	#CJK UNIFIED IDEOGRAPH
+0x994C	0x5109	#CJK UNIFIED IDEOGRAPH
+0x994D	0x5101	#CJK UNIFIED IDEOGRAPH
+0x994E	0x5102	#CJK UNIFIED IDEOGRAPH
+0x994F	0x5116	#CJK UNIFIED IDEOGRAPH
+0x9950	0x5115	#CJK UNIFIED IDEOGRAPH
+0x9951	0x5114	#CJK UNIFIED IDEOGRAPH
+0x9952	0x511A	#CJK UNIFIED IDEOGRAPH
+0x9953	0x5121	#CJK UNIFIED IDEOGRAPH
+0x9954	0x513A	#CJK UNIFIED IDEOGRAPH
+0x9955	0x5137	#CJK UNIFIED IDEOGRAPH
+0x9956	0x513C	#CJK UNIFIED IDEOGRAPH
+0x9957	0x513B	#CJK UNIFIED IDEOGRAPH
+0x9958	0x513F	#CJK UNIFIED IDEOGRAPH
+0x9959	0x5140	#CJK UNIFIED IDEOGRAPH
+0x995A	0x5152	#CJK UNIFIED IDEOGRAPH
+0x995B	0x514C	#CJK UNIFIED IDEOGRAPH
+0x995C	0x5154	#CJK UNIFIED IDEOGRAPH
+0x995D	0x5162	#CJK UNIFIED IDEOGRAPH
+0x995E	0x7AF8	#CJK UNIFIED IDEOGRAPH
+0x995F	0x5169	#CJK UNIFIED IDEOGRAPH
+0x9960	0x516A	#CJK UNIFIED IDEOGRAPH
+0x9961	0x516E	#CJK UNIFIED IDEOGRAPH
+0x9962	0x5180	#CJK UNIFIED IDEOGRAPH
+0x9963	0x5182	#CJK UNIFIED IDEOGRAPH
+0x9964	0x56D8	#CJK UNIFIED IDEOGRAPH
+0x9965	0x518C	#CJK UNIFIED IDEOGRAPH
+0x9966	0x5189	#CJK UNIFIED IDEOGRAPH
+0x9967	0x518F	#CJK UNIFIED IDEOGRAPH
+0x9968	0x5191	#CJK UNIFIED IDEOGRAPH
+0x9969	0x5193	#CJK UNIFIED IDEOGRAPH
+0x996A	0x5195	#CJK UNIFIED IDEOGRAPH
+0x996B	0x5196	#CJK UNIFIED IDEOGRAPH
+0x996C	0x51A4	#CJK UNIFIED IDEOGRAPH
+0x996D	0x51A6	#CJK UNIFIED IDEOGRAPH
+0x996E	0x51A2	#CJK UNIFIED IDEOGRAPH
+0x996F	0x51A9	#CJK UNIFIED IDEOGRAPH
+0x9970	0x51AA	#CJK UNIFIED IDEOGRAPH
+0x9971	0x51AB	#CJK UNIFIED IDEOGRAPH
+0x9972	0x51B3	#CJK UNIFIED IDEOGRAPH
+0x9973	0x51B1	#CJK UNIFIED IDEOGRAPH
+0x9974	0x51B2	#CJK UNIFIED IDEOGRAPH
+0x9975	0x51B0	#CJK UNIFIED IDEOGRAPH
+0x9976	0x51B5	#CJK UNIFIED IDEOGRAPH
+0x9977	0x51BD	#CJK UNIFIED IDEOGRAPH
+0x9978	0x51C5	#CJK UNIFIED IDEOGRAPH
+0x9979	0x51C9	#CJK UNIFIED IDEOGRAPH
+0x997A	0x51DB	#CJK UNIFIED IDEOGRAPH
+0x997B	0x51E0	#CJK UNIFIED IDEOGRAPH
+0x997C	0x8655	#CJK UNIFIED IDEOGRAPH
+0x997D	0x51E9	#CJK UNIFIED IDEOGRAPH
+0x997E	0x51ED	#CJK UNIFIED IDEOGRAPH
+0x9980	0x51F0	#CJK UNIFIED IDEOGRAPH
+0x9981	0x51F5	#CJK UNIFIED IDEOGRAPH
+0x9982	0x51FE	#CJK UNIFIED IDEOGRAPH
+0x9983	0x5204	#CJK UNIFIED IDEOGRAPH
+0x9984	0x520B	#CJK UNIFIED IDEOGRAPH
+0x9985	0x5214	#CJK UNIFIED IDEOGRAPH
+0x9986	0x520E	#CJK UNIFIED IDEOGRAPH
+0x9987	0x5227	#CJK UNIFIED IDEOGRAPH
+0x9988	0x522A	#CJK UNIFIED IDEOGRAPH
+0x9989	0x522E	#CJK UNIFIED IDEOGRAPH
+0x998A	0x5233	#CJK UNIFIED IDEOGRAPH
+0x998B	0x5239	#CJK UNIFIED IDEOGRAPH
+0x998C	0x524F	#CJK UNIFIED IDEOGRAPH
+0x998D	0x5244	#CJK UNIFIED IDEOGRAPH
+0x998E	0x524B	#CJK UNIFIED IDEOGRAPH
+0x998F	0x524C	#CJK UNIFIED IDEOGRAPH
+0x9990	0x525E	#CJK UNIFIED IDEOGRAPH
+0x9991	0x5254	#CJK UNIFIED IDEOGRAPH
+0x9992	0x526A	#CJK UNIFIED IDEOGRAPH
+0x9993	0x5274	#CJK UNIFIED IDEOGRAPH
+0x9994	0x5269	#CJK UNIFIED IDEOGRAPH
+0x9995	0x5273	#CJK UNIFIED IDEOGRAPH
+0x9996	0x527F	#CJK UNIFIED IDEOGRAPH
+0x9997	0x527D	#CJK UNIFIED IDEOGRAPH
+0x9998	0x528D	#CJK UNIFIED IDEOGRAPH
+0x9999	0x5294	#CJK UNIFIED IDEOGRAPH
+0x999A	0x5292	#CJK UNIFIED IDEOGRAPH
+0x999B	0x5271	#CJK UNIFIED IDEOGRAPH
+0x999C	0x5288	#CJK UNIFIED IDEOGRAPH
+0x999D	0x5291	#CJK UNIFIED IDEOGRAPH
+0x999E	0x8FA8	#CJK UNIFIED IDEOGRAPH
+0x999F	0x8FA7	#CJK UNIFIED IDEOGRAPH
+0x99A0	0x52AC	#CJK UNIFIED IDEOGRAPH
+0x99A1	0x52AD	#CJK UNIFIED IDEOGRAPH
+0x99A2	0x52BC	#CJK UNIFIED IDEOGRAPH
+0x99A3	0x52B5	#CJK UNIFIED IDEOGRAPH
+0x99A4	0x52C1	#CJK UNIFIED IDEOGRAPH
+0x99A5	0x52CD	#CJK UNIFIED IDEOGRAPH
+0x99A6	0x52D7	#CJK UNIFIED IDEOGRAPH
+0x99A7	0x52DE	#CJK UNIFIED IDEOGRAPH
+0x99A8	0x52E3	#CJK UNIFIED IDEOGRAPH
+0x99A9	0x52E6	#CJK UNIFIED IDEOGRAPH
+0x99AA	0x98ED	#CJK UNIFIED IDEOGRAPH
+0x99AB	0x52E0	#CJK UNIFIED IDEOGRAPH
+0x99AC	0x52F3	#CJK UNIFIED IDEOGRAPH
+0x99AD	0x52F5	#CJK UNIFIED IDEOGRAPH
+0x99AE	0x52F8	#CJK UNIFIED IDEOGRAPH
+0x99AF	0x52F9	#CJK UNIFIED IDEOGRAPH
+0x99B0	0x5306	#CJK UNIFIED IDEOGRAPH
+0x99B1	0x5308	#CJK UNIFIED IDEOGRAPH
+0x99B2	0x7538	#CJK UNIFIED IDEOGRAPH
+0x99B3	0x530D	#CJK UNIFIED IDEOGRAPH
+0x99B4	0x5310	#CJK UNIFIED IDEOGRAPH
+0x99B5	0x530F	#CJK UNIFIED IDEOGRAPH
+0x99B6	0x5315	#CJK UNIFIED IDEOGRAPH
+0x99B7	0x531A	#CJK UNIFIED IDEOGRAPH
+0x99B8	0x5323	#CJK UNIFIED IDEOGRAPH
+0x99B9	0x532F	#CJK UNIFIED IDEOGRAPH
+0x99BA	0x5331	#CJK UNIFIED IDEOGRAPH
+0x99BB	0x5333	#CJK UNIFIED IDEOGRAPH
+0x99BC	0x5338	#CJK UNIFIED IDEOGRAPH
+0x99BD	0x5340	#CJK UNIFIED IDEOGRAPH
+0x99BE	0x5346	#CJK UNIFIED IDEOGRAPH
+0x99BF	0x5345	#CJK UNIFIED IDEOGRAPH
+0x99C0	0x4E17	#CJK UNIFIED IDEOGRAPH
+0x99C1	0x5349	#CJK UNIFIED IDEOGRAPH
+0x99C2	0x534D	#CJK UNIFIED IDEOGRAPH
+0x99C3	0x51D6	#CJK UNIFIED IDEOGRAPH
+0x99C4	0x535E	#CJK UNIFIED IDEOGRAPH
+0x99C5	0x5369	#CJK UNIFIED IDEOGRAPH
+0x99C6	0x536E	#CJK UNIFIED IDEOGRAPH
+0x99C7	0x5918	#CJK UNIFIED IDEOGRAPH
+0x99C8	0x537B	#CJK UNIFIED IDEOGRAPH
+0x99C9	0x5377	#CJK UNIFIED IDEOGRAPH
+0x99CA	0x5382	#CJK UNIFIED IDEOGRAPH
+0x99CB	0x5396	#CJK UNIFIED IDEOGRAPH
+0x99CC	0x53A0	#CJK UNIFIED IDEOGRAPH
+0x99CD	0x53A6	#CJK UNIFIED IDEOGRAPH
+0x99CE	0x53A5	#CJK UNIFIED IDEOGRAPH
+0x99CF	0x53AE	#CJK UNIFIED IDEOGRAPH
+0x99D0	0x53B0	#CJK UNIFIED IDEOGRAPH
+0x99D1	0x53B6	#CJK UNIFIED IDEOGRAPH
+0x99D2	0x53C3	#CJK UNIFIED IDEOGRAPH
+0x99D3	0x7C12	#CJK UNIFIED IDEOGRAPH
+0x99D4	0x96D9	#CJK UNIFIED IDEOGRAPH
+0x99D5	0x53DF	#CJK UNIFIED IDEOGRAPH
+0x99D6	0x66FC	#CJK UNIFIED IDEOGRAPH
+0x99D7	0x71EE	#CJK UNIFIED IDEOGRAPH
+0x99D8	0x53EE	#CJK UNIFIED IDEOGRAPH
+0x99D9	0x53E8	#CJK UNIFIED IDEOGRAPH
+0x99DA	0x53ED	#CJK UNIFIED IDEOGRAPH
+0x99DB	0x53FA	#CJK UNIFIED IDEOGRAPH
+0x99DC	0x5401	#CJK UNIFIED IDEOGRAPH
+0x99DD	0x543D	#CJK UNIFIED IDEOGRAPH
+0x99DE	0x5440	#CJK UNIFIED IDEOGRAPH
+0x99DF	0x542C	#CJK UNIFIED IDEOGRAPH
+0x99E0	0x542D	#CJK UNIFIED IDEOGRAPH
+0x99E1	0x543C	#CJK UNIFIED IDEOGRAPH
+0x99E2	0x542E	#CJK UNIFIED IDEOGRAPH
+0x99E3	0x5436	#CJK UNIFIED IDEOGRAPH
+0x99E4	0x5429	#CJK UNIFIED IDEOGRAPH
+0x99E5	0x541D	#CJK UNIFIED IDEOGRAPH
+0x99E6	0x544E	#CJK UNIFIED IDEOGRAPH
+0x99E7	0x548F	#CJK UNIFIED IDEOGRAPH
+0x99E8	0x5475	#CJK UNIFIED IDEOGRAPH
+0x99E9	0x548E	#CJK UNIFIED IDEOGRAPH
+0x99EA	0x545F	#CJK UNIFIED IDEOGRAPH
+0x99EB	0x5471	#CJK UNIFIED IDEOGRAPH
+0x99EC	0x5477	#CJK UNIFIED IDEOGRAPH
+0x99ED	0x5470	#CJK UNIFIED IDEOGRAPH
+0x99EE	0x5492	#CJK UNIFIED IDEOGRAPH
+0x99EF	0x547B	#CJK UNIFIED IDEOGRAPH
+0x99F0	0x5480	#CJK UNIFIED IDEOGRAPH
+0x99F1	0x5476	#CJK UNIFIED IDEOGRAPH
+0x99F2	0x5484	#CJK UNIFIED IDEOGRAPH
+0x99F3	0x5490	#CJK UNIFIED IDEOGRAPH
+0x99F4	0x5486	#CJK UNIFIED IDEOGRAPH
+0x99F5	0x54C7	#CJK UNIFIED IDEOGRAPH
+0x99F6	0x54A2	#CJK UNIFIED IDEOGRAPH
+0x99F7	0x54B8	#CJK UNIFIED IDEOGRAPH
+0x99F8	0x54A5	#CJK UNIFIED IDEOGRAPH
+0x99F9	0x54AC	#CJK UNIFIED IDEOGRAPH
+0x99FA	0x54C4	#CJK UNIFIED IDEOGRAPH
+0x99FB	0x54C8	#CJK UNIFIED IDEOGRAPH
+0x99FC	0x54A8	#CJK UNIFIED IDEOGRAPH
+0x9A40	0x54AB	#CJK UNIFIED IDEOGRAPH
+0x9A41	0x54C2	#CJK UNIFIED IDEOGRAPH
+0x9A42	0x54A4	#CJK UNIFIED IDEOGRAPH
+0x9A43	0x54BE	#CJK UNIFIED IDEOGRAPH
+0x9A44	0x54BC	#CJK UNIFIED IDEOGRAPH
+0x9A45	0x54D8	#CJK UNIFIED IDEOGRAPH
+0x9A46	0x54E5	#CJK UNIFIED IDEOGRAPH
+0x9A47	0x54E6	#CJK UNIFIED IDEOGRAPH
+0x9A48	0x550F	#CJK UNIFIED IDEOGRAPH
+0x9A49	0x5514	#CJK UNIFIED IDEOGRAPH
+0x9A4A	0x54FD	#CJK UNIFIED IDEOGRAPH
+0x9A4B	0x54EE	#CJK UNIFIED IDEOGRAPH
+0x9A4C	0x54ED	#CJK UNIFIED IDEOGRAPH
+0x9A4D	0x54FA	#CJK UNIFIED IDEOGRAPH
+0x9A4E	0x54E2	#CJK UNIFIED IDEOGRAPH
+0x9A4F	0x5539	#CJK UNIFIED IDEOGRAPH
+0x9A50	0x5540	#CJK UNIFIED IDEOGRAPH
+0x9A51	0x5563	#CJK UNIFIED IDEOGRAPH
+0x9A52	0x554C	#CJK UNIFIED IDEOGRAPH
+0x9A53	0x552E	#CJK UNIFIED IDEOGRAPH
+0x9A54	0x555C	#CJK UNIFIED IDEOGRAPH
+0x9A55	0x5545	#CJK UNIFIED IDEOGRAPH
+0x9A56	0x5556	#CJK UNIFIED IDEOGRAPH
+0x9A57	0x5557	#CJK UNIFIED IDEOGRAPH
+0x9A58	0x5538	#CJK UNIFIED IDEOGRAPH
+0x9A59	0x5533	#CJK UNIFIED IDEOGRAPH
+0x9A5A	0x555D	#CJK UNIFIED IDEOGRAPH
+0x9A5B	0x5599	#CJK UNIFIED IDEOGRAPH
+0x9A5C	0x5580	#CJK UNIFIED IDEOGRAPH
+0x9A5D	0x54AF	#CJK UNIFIED IDEOGRAPH
+0x9A5E	0x558A	#CJK UNIFIED IDEOGRAPH
+0x9A5F	0x559F	#CJK UNIFIED IDEOGRAPH
+0x9A60	0x557B	#CJK UNIFIED IDEOGRAPH
+0x9A61	0x557E	#CJK UNIFIED IDEOGRAPH
+0x9A62	0x5598	#CJK UNIFIED IDEOGRAPH
+0x9A63	0x559E	#CJK UNIFIED IDEOGRAPH
+0x9A64	0x55AE	#CJK UNIFIED IDEOGRAPH
+0x9A65	0x557C	#CJK UNIFIED IDEOGRAPH
+0x9A66	0x5583	#CJK UNIFIED IDEOGRAPH
+0x9A67	0x55A9	#CJK UNIFIED IDEOGRAPH
+0x9A68	0x5587	#CJK UNIFIED IDEOGRAPH
+0x9A69	0x55A8	#CJK UNIFIED IDEOGRAPH
+0x9A6A	0x55DA	#CJK UNIFIED IDEOGRAPH
+0x9A6B	0x55C5	#CJK UNIFIED IDEOGRAPH
+0x9A6C	0x55DF	#CJK UNIFIED IDEOGRAPH
+0x9A6D	0x55C4	#CJK UNIFIED IDEOGRAPH
+0x9A6E	0x55DC	#CJK UNIFIED IDEOGRAPH
+0x9A6F	0x55E4	#CJK UNIFIED IDEOGRAPH
+0x9A70	0x55D4	#CJK UNIFIED IDEOGRAPH
+0x9A71	0x5614	#CJK UNIFIED IDEOGRAPH
+0x9A72	0x55F7	#CJK UNIFIED IDEOGRAPH
+0x9A73	0x5616	#CJK UNIFIED IDEOGRAPH
+0x9A74	0x55FE	#CJK UNIFIED IDEOGRAPH
+0x9A75	0x55FD	#CJK UNIFIED IDEOGRAPH
+0x9A76	0x561B	#CJK UNIFIED IDEOGRAPH
+0x9A77	0x55F9	#CJK UNIFIED IDEOGRAPH
+0x9A78	0x564E	#CJK UNIFIED IDEOGRAPH
+0x9A79	0x5650	#CJK UNIFIED IDEOGRAPH
+0x9A7A	0x71DF	#CJK UNIFIED IDEOGRAPH
+0x9A7B	0x5634	#CJK UNIFIED IDEOGRAPH
+0x9A7C	0x5636	#CJK UNIFIED IDEOGRAPH
+0x9A7D	0x5632	#CJK UNIFIED IDEOGRAPH
+0x9A7E	0x5638	#CJK UNIFIED IDEOGRAPH
+0x9A80	0x566B	#CJK UNIFIED IDEOGRAPH
+0x9A81	0x5664	#CJK UNIFIED IDEOGRAPH
+0x9A82	0x562F	#CJK UNIFIED IDEOGRAPH
+0x9A83	0x566C	#CJK UNIFIED IDEOGRAPH
+0x9A84	0x566A	#CJK UNIFIED IDEOGRAPH
+0x9A85	0x5686	#CJK UNIFIED IDEOGRAPH
+0x9A86	0x5680	#CJK UNIFIED IDEOGRAPH
+0x9A87	0x568A	#CJK UNIFIED IDEOGRAPH
+0x9A88	0x56A0	#CJK UNIFIED IDEOGRAPH
+0x9A89	0x5694	#CJK UNIFIED IDEOGRAPH
+0x9A8A	0x568F	#CJK UNIFIED IDEOGRAPH
+0x9A8B	0x56A5	#CJK UNIFIED IDEOGRAPH
+0x9A8C	0x56AE	#CJK UNIFIED IDEOGRAPH
+0x9A8D	0x56B6	#CJK UNIFIED IDEOGRAPH
+0x9A8E	0x56B4	#CJK UNIFIED IDEOGRAPH
+0x9A8F	0x56C2	#CJK UNIFIED IDEOGRAPH
+0x9A90	0x56BC	#CJK UNIFIED IDEOGRAPH
+0x9A91	0x56C1	#CJK UNIFIED IDEOGRAPH
+0x9A92	0x56C3	#CJK UNIFIED IDEOGRAPH
+0x9A93	0x56C0	#CJK UNIFIED IDEOGRAPH
+0x9A94	0x56C8	#CJK UNIFIED IDEOGRAPH
+0x9A95	0x56CE	#CJK UNIFIED IDEOGRAPH
+0x9A96	0x56D1	#CJK UNIFIED IDEOGRAPH
+0x9A97	0x56D3	#CJK UNIFIED IDEOGRAPH
+0x9A98	0x56D7	#CJK UNIFIED IDEOGRAPH
+0x9A99	0x56EE	#CJK UNIFIED IDEOGRAPH
+0x9A9A	0x56F9	#CJK UNIFIED IDEOGRAPH
+0x9A9B	0x5700	#CJK UNIFIED IDEOGRAPH
+0x9A9C	0x56FF	#CJK UNIFIED IDEOGRAPH
+0x9A9D	0x5704	#CJK UNIFIED IDEOGRAPH
+0x9A9E	0x5709	#CJK UNIFIED IDEOGRAPH
+0x9A9F	0x5708	#CJK UNIFIED IDEOGRAPH
+0x9AA0	0x570B	#CJK UNIFIED IDEOGRAPH
+0x9AA1	0x570D	#CJK UNIFIED IDEOGRAPH
+0x9AA2	0x5713	#CJK UNIFIED IDEOGRAPH
+0x9AA3	0x5718	#CJK UNIFIED IDEOGRAPH
+0x9AA4	0x5716	#CJK UNIFIED IDEOGRAPH
+0x9AA5	0x55C7	#CJK UNIFIED IDEOGRAPH
+0x9AA6	0x571C	#CJK UNIFIED IDEOGRAPH
+0x9AA7	0x5726	#CJK UNIFIED IDEOGRAPH
+0x9AA8	0x5737	#CJK UNIFIED IDEOGRAPH
+0x9AA9	0x5738	#CJK UNIFIED IDEOGRAPH
+0x9AAA	0x574E	#CJK UNIFIED IDEOGRAPH
+0x9AAB	0x573B	#CJK UNIFIED IDEOGRAPH
+0x9AAC	0x5740	#CJK UNIFIED IDEOGRAPH
+0x9AAD	0x574F	#CJK UNIFIED IDEOGRAPH
+0x9AAE	0x5769	#CJK UNIFIED IDEOGRAPH
+0x9AAF	0x57C0	#CJK UNIFIED IDEOGRAPH
+0x9AB0	0x5788	#CJK UNIFIED IDEOGRAPH
+0x9AB1	0x5761	#CJK UNIFIED IDEOGRAPH
+0x9AB2	0x577F	#CJK UNIFIED IDEOGRAPH
+0x9AB3	0x5789	#CJK UNIFIED IDEOGRAPH
+0x9AB4	0x5793	#CJK UNIFIED IDEOGRAPH
+0x9AB5	0x57A0	#CJK UNIFIED IDEOGRAPH
+0x9AB6	0x57B3	#CJK UNIFIED IDEOGRAPH
+0x9AB7	0x57A4	#CJK UNIFIED IDEOGRAPH
+0x9AB8	0x57AA	#CJK UNIFIED IDEOGRAPH
+0x9AB9	0x57B0	#CJK UNIFIED IDEOGRAPH
+0x9ABA	0x57C3	#CJK UNIFIED IDEOGRAPH
+0x9ABB	0x57C6	#CJK UNIFIED IDEOGRAPH
+0x9ABC	0x57D4	#CJK UNIFIED IDEOGRAPH
+0x9ABD	0x57D2	#CJK UNIFIED IDEOGRAPH
+0x9ABE	0x57D3	#CJK UNIFIED IDEOGRAPH
+0x9ABF	0x580A	#CJK UNIFIED IDEOGRAPH
+0x9AC0	0x57D6	#CJK UNIFIED IDEOGRAPH
+0x9AC1	0x57E3	#CJK UNIFIED IDEOGRAPH
+0x9AC2	0x580B	#CJK UNIFIED IDEOGRAPH
+0x9AC3	0x5819	#CJK UNIFIED IDEOGRAPH
+0x9AC4	0x581D	#CJK UNIFIED IDEOGRAPH
+0x9AC5	0x5872	#CJK UNIFIED IDEOGRAPH
+0x9AC6	0x5821	#CJK UNIFIED IDEOGRAPH
+0x9AC7	0x5862	#CJK UNIFIED IDEOGRAPH
+0x9AC8	0x584B	#CJK UNIFIED IDEOGRAPH
+0x9AC9	0x5870	#CJK UNIFIED IDEOGRAPH
+0x9ACA	0x6BC0	#CJK UNIFIED IDEOGRAPH
+0x9ACB	0x5852	#CJK UNIFIED IDEOGRAPH
+0x9ACC	0x583D	#CJK UNIFIED IDEOGRAPH
+0x9ACD	0x5879	#CJK UNIFIED IDEOGRAPH
+0x9ACE	0x5885	#CJK UNIFIED IDEOGRAPH
+0x9ACF	0x58B9	#CJK UNIFIED IDEOGRAPH
+0x9AD0	0x589F	#CJK UNIFIED IDEOGRAPH
+0x9AD1	0x58AB	#CJK UNIFIED IDEOGRAPH
+0x9AD2	0x58BA	#CJK UNIFIED IDEOGRAPH
+0x9AD3	0x58DE	#CJK UNIFIED IDEOGRAPH
+0x9AD4	0x58BB	#CJK UNIFIED IDEOGRAPH
+0x9AD5	0x58B8	#CJK UNIFIED IDEOGRAPH
+0x9AD6	0x58AE	#CJK UNIFIED IDEOGRAPH
+0x9AD7	0x58C5	#CJK UNIFIED IDEOGRAPH
+0x9AD8	0x58D3	#CJK UNIFIED IDEOGRAPH
+0x9AD9	0x58D1	#CJK UNIFIED IDEOGRAPH
+0x9ADA	0x58D7	#CJK UNIFIED IDEOGRAPH
+0x9ADB	0x58D9	#CJK UNIFIED IDEOGRAPH
+0x9ADC	0x58D8	#CJK UNIFIED IDEOGRAPH
+0x9ADD	0x58E5	#CJK UNIFIED IDEOGRAPH
+0x9ADE	0x58DC	#CJK UNIFIED IDEOGRAPH
+0x9ADF	0x58E4	#CJK UNIFIED IDEOGRAPH
+0x9AE0	0x58DF	#CJK UNIFIED IDEOGRAPH
+0x9AE1	0x58EF	#CJK UNIFIED IDEOGRAPH
+0x9AE2	0x58FA	#CJK UNIFIED IDEOGRAPH
+0x9AE3	0x58F9	#CJK UNIFIED IDEOGRAPH
+0x9AE4	0x58FB	#CJK UNIFIED IDEOGRAPH
+0x9AE5	0x58FC	#CJK UNIFIED IDEOGRAPH
+0x9AE6	0x58FD	#CJK UNIFIED IDEOGRAPH
+0x9AE7	0x5902	#CJK UNIFIED IDEOGRAPH
+0x9AE8	0x590A	#CJK UNIFIED IDEOGRAPH
+0x9AE9	0x5910	#CJK UNIFIED IDEOGRAPH
+0x9AEA	0x591B	#CJK UNIFIED IDEOGRAPH
+0x9AEB	0x68A6	#CJK UNIFIED IDEOGRAPH
+0x9AEC	0x5925	#CJK UNIFIED IDEOGRAPH
+0x9AED	0x592C	#CJK UNIFIED IDEOGRAPH
+0x9AEE	0x592D	#CJK UNIFIED IDEOGRAPH
+0x9AEF	0x5932	#CJK UNIFIED IDEOGRAPH
+0x9AF0	0x5938	#CJK UNIFIED IDEOGRAPH
+0x9AF1	0x593E	#CJK UNIFIED IDEOGRAPH
+0x9AF2	0x7AD2	#CJK UNIFIED IDEOGRAPH
+0x9AF3	0x5955	#CJK UNIFIED IDEOGRAPH
+0x9AF4	0x5950	#CJK UNIFIED IDEOGRAPH
+0x9AF5	0x594E	#CJK UNIFIED IDEOGRAPH
+0x9AF6	0x595A	#CJK UNIFIED IDEOGRAPH
+0x9AF7	0x5958	#CJK UNIFIED IDEOGRAPH
+0x9AF8	0x5962	#CJK UNIFIED IDEOGRAPH
+0x9AF9	0x5960	#CJK UNIFIED IDEOGRAPH
+0x9AFA	0x5967	#CJK UNIFIED IDEOGRAPH
+0x9AFB	0x596C	#CJK UNIFIED IDEOGRAPH
+0x9AFC	0x5969	#CJK UNIFIED IDEOGRAPH
+0x9B40	0x5978	#CJK UNIFIED IDEOGRAPH
+0x9B41	0x5981	#CJK UNIFIED IDEOGRAPH
+0x9B42	0x599D	#CJK UNIFIED IDEOGRAPH
+0x9B43	0x4F5E	#CJK UNIFIED IDEOGRAPH
+0x9B44	0x4FAB	#CJK UNIFIED IDEOGRAPH
+0x9B45	0x59A3	#CJK UNIFIED IDEOGRAPH
+0x9B46	0x59B2	#CJK UNIFIED IDEOGRAPH
+0x9B47	0x59C6	#CJK UNIFIED IDEOGRAPH
+0x9B48	0x59E8	#CJK UNIFIED IDEOGRAPH
+0x9B49	0x59DC	#CJK UNIFIED IDEOGRAPH
+0x9B4A	0x598D	#CJK UNIFIED IDEOGRAPH
+0x9B4B	0x59D9	#CJK UNIFIED IDEOGRAPH
+0x9B4C	0x59DA	#CJK UNIFIED IDEOGRAPH
+0x9B4D	0x5A25	#CJK UNIFIED IDEOGRAPH
+0x9B4E	0x5A1F	#CJK UNIFIED IDEOGRAPH
+0x9B4F	0x5A11	#CJK UNIFIED IDEOGRAPH
+0x9B50	0x5A1C	#CJK UNIFIED IDEOGRAPH
+0x9B51	0x5A09	#CJK UNIFIED IDEOGRAPH
+0x9B52	0x5A1A	#CJK UNIFIED IDEOGRAPH
+0x9B53	0x5A40	#CJK UNIFIED IDEOGRAPH
+0x9B54	0x5A6C	#CJK UNIFIED IDEOGRAPH
+0x9B55	0x5A49	#CJK UNIFIED IDEOGRAPH
+0x9B56	0x5A35	#CJK UNIFIED IDEOGRAPH
+0x9B57	0x5A36	#CJK UNIFIED IDEOGRAPH
+0x9B58	0x5A62	#CJK UNIFIED IDEOGRAPH
+0x9B59	0x5A6A	#CJK UNIFIED IDEOGRAPH
+0x9B5A	0x5A9A	#CJK UNIFIED IDEOGRAPH
+0x9B5B	0x5ABC	#CJK UNIFIED IDEOGRAPH
+0x9B5C	0x5ABE	#CJK UNIFIED IDEOGRAPH
+0x9B5D	0x5ACB	#CJK UNIFIED IDEOGRAPH
+0x9B5E	0x5AC2	#CJK UNIFIED IDEOGRAPH
+0x9B5F	0x5ABD	#CJK UNIFIED IDEOGRAPH
+0x9B60	0x5AE3	#CJK UNIFIED IDEOGRAPH
+0x9B61	0x5AD7	#CJK UNIFIED IDEOGRAPH
+0x9B62	0x5AE6	#CJK UNIFIED IDEOGRAPH
+0x9B63	0x5AE9	#CJK UNIFIED IDEOGRAPH
+0x9B64	0x5AD6	#CJK UNIFIED IDEOGRAPH
+0x9B65	0x5AFA	#CJK UNIFIED IDEOGRAPH
+0x9B66	0x5AFB	#CJK UNIFIED IDEOGRAPH
+0x9B67	0x5B0C	#CJK UNIFIED IDEOGRAPH
+0x9B68	0x5B0B	#CJK UNIFIED IDEOGRAPH
+0x9B69	0x5B16	#CJK UNIFIED IDEOGRAPH
+0x9B6A	0x5B32	#CJK UNIFIED IDEOGRAPH
+0x9B6B	0x5AD0	#CJK UNIFIED IDEOGRAPH
+0x9B6C	0x5B2A	#CJK UNIFIED IDEOGRAPH
+0x9B6D	0x5B36	#CJK UNIFIED IDEOGRAPH
+0x9B6E	0x5B3E	#CJK UNIFIED IDEOGRAPH
+0x9B6F	0x5B43	#CJK UNIFIED IDEOGRAPH
+0x9B70	0x5B45	#CJK UNIFIED IDEOGRAPH
+0x9B71	0x5B40	#CJK UNIFIED IDEOGRAPH
+0x9B72	0x5B51	#CJK UNIFIED IDEOGRAPH
+0x9B73	0x5B55	#CJK UNIFIED IDEOGRAPH
+0x9B74	0x5B5A	#CJK UNIFIED IDEOGRAPH
+0x9B75	0x5B5B	#CJK UNIFIED IDEOGRAPH
+0x9B76	0x5B65	#CJK UNIFIED IDEOGRAPH
+0x9B77	0x5B69	#CJK UNIFIED IDEOGRAPH
+0x9B78	0x5B70	#CJK UNIFIED IDEOGRAPH
+0x9B79	0x5B73	#CJK UNIFIED IDEOGRAPH
+0x9B7A	0x5B75	#CJK UNIFIED IDEOGRAPH
+0x9B7B	0x5B78	#CJK UNIFIED IDEOGRAPH
+0x9B7C	0x6588	#CJK UNIFIED IDEOGRAPH
+0x9B7D	0x5B7A	#CJK UNIFIED IDEOGRAPH
+0x9B7E	0x5B80	#CJK UNIFIED IDEOGRAPH
+0x9B80	0x5B83	#CJK UNIFIED IDEOGRAPH
+0x9B81	0x5BA6	#CJK UNIFIED IDEOGRAPH
+0x9B82	0x5BB8	#CJK UNIFIED IDEOGRAPH
+0x9B83	0x5BC3	#CJK UNIFIED IDEOGRAPH
+0x9B84	0x5BC7	#CJK UNIFIED IDEOGRAPH
+0x9B85	0x5BC9	#CJK UNIFIED IDEOGRAPH
+0x9B86	0x5BD4	#CJK UNIFIED IDEOGRAPH
+0x9B87	0x5BD0	#CJK UNIFIED IDEOGRAPH
+0x9B88	0x5BE4	#CJK UNIFIED IDEOGRAPH
+0x9B89	0x5BE6	#CJK UNIFIED IDEOGRAPH
+0x9B8A	0x5BE2	#CJK UNIFIED IDEOGRAPH
+0x9B8B	0x5BDE	#CJK UNIFIED IDEOGRAPH
+0x9B8C	0x5BE5	#CJK UNIFIED IDEOGRAPH
+0x9B8D	0x5BEB	#CJK UNIFIED IDEOGRAPH
+0x9B8E	0x5BF0	#CJK UNIFIED IDEOGRAPH
+0x9B8F	0x5BF6	#CJK UNIFIED IDEOGRAPH
+0x9B90	0x5BF3	#CJK UNIFIED IDEOGRAPH
+0x9B91	0x5C05	#CJK UNIFIED IDEOGRAPH
+0x9B92	0x5C07	#CJK UNIFIED IDEOGRAPH
+0x9B93	0x5C08	#CJK UNIFIED IDEOGRAPH
+0x9B94	0x5C0D	#CJK UNIFIED IDEOGRAPH
+0x9B95	0x5C13	#CJK UNIFIED IDEOGRAPH
+0x9B96	0x5C20	#CJK UNIFIED IDEOGRAPH
+0x9B97	0x5C22	#CJK UNIFIED IDEOGRAPH
+0x9B98	0x5C28	#CJK UNIFIED IDEOGRAPH
+0x9B99	0x5C38	#CJK UNIFIED IDEOGRAPH
+0x9B9A	0x5C39	#CJK UNIFIED IDEOGRAPH
+0x9B9B	0x5C41	#CJK UNIFIED IDEOGRAPH
+0x9B9C	0x5C46	#CJK UNIFIED IDEOGRAPH
+0x9B9D	0x5C4E	#CJK UNIFIED IDEOGRAPH
+0x9B9E	0x5C53	#CJK UNIFIED IDEOGRAPH
+0x9B9F	0x5C50	#CJK UNIFIED IDEOGRAPH
+0x9BA0	0x5C4F	#CJK UNIFIED IDEOGRAPH
+0x9BA1	0x5B71	#CJK UNIFIED IDEOGRAPH
+0x9BA2	0x5C6C	#CJK UNIFIED IDEOGRAPH
+0x9BA3	0x5C6E	#CJK UNIFIED IDEOGRAPH
+0x9BA4	0x4E62	#CJK UNIFIED IDEOGRAPH
+0x9BA5	0x5C76	#CJK UNIFIED IDEOGRAPH
+0x9BA6	0x5C79	#CJK UNIFIED IDEOGRAPH
+0x9BA7	0x5C8C	#CJK UNIFIED IDEOGRAPH
+0x9BA8	0x5C91	#CJK UNIFIED IDEOGRAPH
+0x9BA9	0x5C94	#CJK UNIFIED IDEOGRAPH
+0x9BAA	0x599B	#CJK UNIFIED IDEOGRAPH
+0x9BAB	0x5CAB	#CJK UNIFIED IDEOGRAPH
+0x9BAC	0x5CBB	#CJK UNIFIED IDEOGRAPH
+0x9BAD	0x5CB6	#CJK UNIFIED IDEOGRAPH
+0x9BAE	0x5CBC	#CJK UNIFIED IDEOGRAPH
+0x9BAF	0x5CB7	#CJK UNIFIED IDEOGRAPH
+0x9BB0	0x5CC5	#CJK UNIFIED IDEOGRAPH
+0x9BB1	0x5CBE	#CJK UNIFIED IDEOGRAPH
+0x9BB2	0x5CC7	#CJK UNIFIED IDEOGRAPH
+0x9BB3	0x5CD9	#CJK UNIFIED IDEOGRAPH
+0x9BB4	0x5CE9	#CJK UNIFIED IDEOGRAPH
+0x9BB5	0x5CFD	#CJK UNIFIED IDEOGRAPH
+0x9BB6	0x5CFA	#CJK UNIFIED IDEOGRAPH
+0x9BB7	0x5CED	#CJK UNIFIED IDEOGRAPH
+0x9BB8	0x5D8C	#CJK UNIFIED IDEOGRAPH
+0x9BB9	0x5CEA	#CJK UNIFIED IDEOGRAPH
+0x9BBA	0x5D0B	#CJK UNIFIED IDEOGRAPH
+0x9BBB	0x5D15	#CJK UNIFIED IDEOGRAPH
+0x9BBC	0x5D17	#CJK UNIFIED IDEOGRAPH
+0x9BBD	0x5D5C	#CJK UNIFIED IDEOGRAPH
+0x9BBE	0x5D1F	#CJK UNIFIED IDEOGRAPH
+0x9BBF	0x5D1B	#CJK UNIFIED IDEOGRAPH
+0x9BC0	0x5D11	#CJK UNIFIED IDEOGRAPH
+0x9BC1	0x5D14	#CJK UNIFIED IDEOGRAPH
+0x9BC2	0x5D22	#CJK UNIFIED IDEOGRAPH
+0x9BC3	0x5D1A	#CJK UNIFIED IDEOGRAPH
+0x9BC4	0x5D19	#CJK UNIFIED IDEOGRAPH
+0x9BC5	0x5D18	#CJK UNIFIED IDEOGRAPH
+0x9BC6	0x5D4C	#CJK UNIFIED IDEOGRAPH
+0x9BC7	0x5D52	#CJK UNIFIED IDEOGRAPH
+0x9BC8	0x5D4E	#CJK UNIFIED IDEOGRAPH
+0x9BC9	0x5D4B	#CJK UNIFIED IDEOGRAPH
+0x9BCA	0x5D6C	#CJK UNIFIED IDEOGRAPH
+0x9BCB	0x5D73	#CJK UNIFIED IDEOGRAPH
+0x9BCC	0x5D76	#CJK UNIFIED IDEOGRAPH
+0x9BCD	0x5D87	#CJK UNIFIED IDEOGRAPH
+0x9BCE	0x5D84	#CJK UNIFIED IDEOGRAPH
+0x9BCF	0x5D82	#CJK UNIFIED IDEOGRAPH
+0x9BD0	0x5DA2	#CJK UNIFIED IDEOGRAPH
+0x9BD1	0x5D9D	#CJK UNIFIED IDEOGRAPH
+0x9BD2	0x5DAC	#CJK UNIFIED IDEOGRAPH
+0x9BD3	0x5DAE	#CJK UNIFIED IDEOGRAPH
+0x9BD4	0x5DBD	#CJK UNIFIED IDEOGRAPH
+0x9BD5	0x5D90	#CJK UNIFIED IDEOGRAPH
+0x9BD6	0x5DB7	#CJK UNIFIED IDEOGRAPH
+0x9BD7	0x5DBC	#CJK UNIFIED IDEOGRAPH
+0x9BD8	0x5DC9	#CJK UNIFIED IDEOGRAPH
+0x9BD9	0x5DCD	#CJK UNIFIED IDEOGRAPH
+0x9BDA	0x5DD3	#CJK UNIFIED IDEOGRAPH
+0x9BDB	0x5DD2	#CJK UNIFIED IDEOGRAPH
+0x9BDC	0x5DD6	#CJK UNIFIED IDEOGRAPH
+0x9BDD	0x5DDB	#CJK UNIFIED IDEOGRAPH
+0x9BDE	0x5DEB	#CJK UNIFIED IDEOGRAPH
+0x9BDF	0x5DF2	#CJK UNIFIED IDEOGRAPH
+0x9BE0	0x5DF5	#CJK UNIFIED IDEOGRAPH
+0x9BE1	0x5E0B	#CJK UNIFIED IDEOGRAPH
+0x9BE2	0x5E1A	#CJK UNIFIED IDEOGRAPH
+0x9BE3	0x5E19	#CJK UNIFIED IDEOGRAPH
+0x9BE4	0x5E11	#CJK UNIFIED IDEOGRAPH
+0x9BE5	0x5E1B	#CJK UNIFIED IDEOGRAPH
+0x9BE6	0x5E36	#CJK UNIFIED IDEOGRAPH
+0x9BE7	0x5E37	#CJK UNIFIED IDEOGRAPH
+0x9BE8	0x5E44	#CJK UNIFIED IDEOGRAPH
+0x9BE9	0x5E43	#CJK UNIFIED IDEOGRAPH
+0x9BEA	0x5E40	#CJK UNIFIED IDEOGRAPH
+0x9BEB	0x5E4E	#CJK UNIFIED IDEOGRAPH
+0x9BEC	0x5E57	#CJK UNIFIED IDEOGRAPH
+0x9BED	0x5E54	#CJK UNIFIED IDEOGRAPH
+0x9BEE	0x5E5F	#CJK UNIFIED IDEOGRAPH
+0x9BEF	0x5E62	#CJK UNIFIED IDEOGRAPH
+0x9BF0	0x5E64	#CJK UNIFIED IDEOGRAPH
+0x9BF1	0x5E47	#CJK UNIFIED IDEOGRAPH
+0x9BF2	0x5E75	#CJK UNIFIED IDEOGRAPH
+0x9BF3	0x5E76	#CJK UNIFIED IDEOGRAPH
+0x9BF4	0x5E7A	#CJK UNIFIED IDEOGRAPH
+0x9BF5	0x9EBC	#CJK UNIFIED IDEOGRAPH
+0x9BF6	0x5E7F	#CJK UNIFIED IDEOGRAPH
+0x9BF7	0x5EA0	#CJK UNIFIED IDEOGRAPH
+0x9BF8	0x5EC1	#CJK UNIFIED IDEOGRAPH
+0x9BF9	0x5EC2	#CJK UNIFIED IDEOGRAPH
+0x9BFA	0x5EC8	#CJK UNIFIED IDEOGRAPH
+0x9BFB	0x5ED0	#CJK UNIFIED IDEOGRAPH
+0x9BFC	0x5ECF	#CJK UNIFIED IDEOGRAPH
+0x9C40	0x5ED6	#CJK UNIFIED IDEOGRAPH
+0x9C41	0x5EE3	#CJK UNIFIED IDEOGRAPH
+0x9C42	0x5EDD	#CJK UNIFIED IDEOGRAPH
+0x9C43	0x5EDA	#CJK UNIFIED IDEOGRAPH
+0x9C44	0x5EDB	#CJK UNIFIED IDEOGRAPH
+0x9C45	0x5EE2	#CJK UNIFIED IDEOGRAPH
+0x9C46	0x5EE1	#CJK UNIFIED IDEOGRAPH
+0x9C47	0x5EE8	#CJK UNIFIED IDEOGRAPH
+0x9C48	0x5EE9	#CJK UNIFIED IDEOGRAPH
+0x9C49	0x5EEC	#CJK UNIFIED IDEOGRAPH
+0x9C4A	0x5EF1	#CJK UNIFIED IDEOGRAPH
+0x9C4B	0x5EF3	#CJK UNIFIED IDEOGRAPH
+0x9C4C	0x5EF0	#CJK UNIFIED IDEOGRAPH
+0x9C4D	0x5EF4	#CJK UNIFIED IDEOGRAPH
+0x9C4E	0x5EF8	#CJK UNIFIED IDEOGRAPH
+0x9C4F	0x5EFE	#CJK UNIFIED IDEOGRAPH
+0x9C50	0x5F03	#CJK UNIFIED IDEOGRAPH
+0x9C51	0x5F09	#CJK UNIFIED IDEOGRAPH
+0x9C52	0x5F5D	#CJK UNIFIED IDEOGRAPH
+0x9C53	0x5F5C	#CJK UNIFIED IDEOGRAPH
+0x9C54	0x5F0B	#CJK UNIFIED IDEOGRAPH
+0x9C55	0x5F11	#CJK UNIFIED IDEOGRAPH
+0x9C56	0x5F16	#CJK UNIFIED IDEOGRAPH
+0x9C57	0x5F29	#CJK UNIFIED IDEOGRAPH
+0x9C58	0x5F2D	#CJK UNIFIED IDEOGRAPH
+0x9C59	0x5F38	#CJK UNIFIED IDEOGRAPH
+0x9C5A	0x5F41	#CJK UNIFIED IDEOGRAPH
+0x9C5B	0x5F48	#CJK UNIFIED IDEOGRAPH
+0x9C5C	0x5F4C	#CJK UNIFIED IDEOGRAPH
+0x9C5D	0x5F4E	#CJK UNIFIED IDEOGRAPH
+0x9C5E	0x5F2F	#CJK UNIFIED IDEOGRAPH
+0x9C5F	0x5F51	#CJK UNIFIED IDEOGRAPH
+0x9C60	0x5F56	#CJK UNIFIED IDEOGRAPH
+0x9C61	0x5F57	#CJK UNIFIED IDEOGRAPH
+0x9C62	0x5F59	#CJK UNIFIED IDEOGRAPH
+0x9C63	0x5F61	#CJK UNIFIED IDEOGRAPH
+0x9C64	0x5F6D	#CJK UNIFIED IDEOGRAPH
+0x9C65	0x5F73	#CJK UNIFIED IDEOGRAPH
+0x9C66	0x5F77	#CJK UNIFIED IDEOGRAPH
+0x9C67	0x5F83	#CJK UNIFIED IDEOGRAPH
+0x9C68	0x5F82	#CJK UNIFIED IDEOGRAPH
+0x9C69	0x5F7F	#CJK UNIFIED IDEOGRAPH
+0x9C6A	0x5F8A	#CJK UNIFIED IDEOGRAPH
+0x9C6B	0x5F88	#CJK UNIFIED IDEOGRAPH
+0x9C6C	0x5F91	#CJK UNIFIED IDEOGRAPH
+0x9C6D	0x5F87	#CJK UNIFIED IDEOGRAPH
+0x9C6E	0x5F9E	#CJK UNIFIED IDEOGRAPH
+0x9C6F	0x5F99	#CJK UNIFIED IDEOGRAPH
+0x9C70	0x5F98	#CJK UNIFIED IDEOGRAPH
+0x9C71	0x5FA0	#CJK UNIFIED IDEOGRAPH
+0x9C72	0x5FA8	#CJK UNIFIED IDEOGRAPH
+0x9C73	0x5FAD	#CJK UNIFIED IDEOGRAPH
+0x9C74	0x5FBC	#CJK UNIFIED IDEOGRAPH
+0x9C75	0x5FD6	#CJK UNIFIED IDEOGRAPH
+0x9C76	0x5FFB	#CJK UNIFIED IDEOGRAPH
+0x9C77	0x5FE4	#CJK UNIFIED IDEOGRAPH
+0x9C78	0x5FF8	#CJK UNIFIED IDEOGRAPH
+0x9C79	0x5FF1	#CJK UNIFIED IDEOGRAPH
+0x9C7A	0x5FDD	#CJK UNIFIED IDEOGRAPH
+0x9C7B	0x60B3	#CJK UNIFIED IDEOGRAPH
+0x9C7C	0x5FFF	#CJK UNIFIED IDEOGRAPH
+0x9C7D	0x6021	#CJK UNIFIED IDEOGRAPH
+0x9C7E	0x6060	#CJK UNIFIED IDEOGRAPH
+0x9C80	0x6019	#CJK UNIFIED IDEOGRAPH
+0x9C81	0x6010	#CJK UNIFIED IDEOGRAPH
+0x9C82	0x6029	#CJK UNIFIED IDEOGRAPH
+0x9C83	0x600E	#CJK UNIFIED IDEOGRAPH
+0x9C84	0x6031	#CJK UNIFIED IDEOGRAPH
+0x9C85	0x601B	#CJK UNIFIED IDEOGRAPH
+0x9C86	0x6015	#CJK UNIFIED IDEOGRAPH
+0x9C87	0x602B	#CJK UNIFIED IDEOGRAPH
+0x9C88	0x6026	#CJK UNIFIED IDEOGRAPH
+0x9C89	0x600F	#CJK UNIFIED IDEOGRAPH
+0x9C8A	0x603A	#CJK UNIFIED IDEOGRAPH
+0x9C8B	0x605A	#CJK UNIFIED IDEOGRAPH
+0x9C8C	0x6041	#CJK UNIFIED IDEOGRAPH
+0x9C8D	0x606A	#CJK UNIFIED IDEOGRAPH
+0x9C8E	0x6077	#CJK UNIFIED IDEOGRAPH
+0x9C8F	0x605F	#CJK UNIFIED IDEOGRAPH
+0x9C90	0x604A	#CJK UNIFIED IDEOGRAPH
+0x9C91	0x6046	#CJK UNIFIED IDEOGRAPH
+0x9C92	0x604D	#CJK UNIFIED IDEOGRAPH
+0x9C93	0x6063	#CJK UNIFIED IDEOGRAPH
+0x9C94	0x6043	#CJK UNIFIED IDEOGRAPH
+0x9C95	0x6064	#CJK UNIFIED IDEOGRAPH
+0x9C96	0x6042	#CJK UNIFIED IDEOGRAPH
+0x9C97	0x606C	#CJK UNIFIED IDEOGRAPH
+0x9C98	0x606B	#CJK UNIFIED IDEOGRAPH
+0x9C99	0x6059	#CJK UNIFIED IDEOGRAPH
+0x9C9A	0x6081	#CJK UNIFIED IDEOGRAPH
+0x9C9B	0x608D	#CJK UNIFIED IDEOGRAPH
+0x9C9C	0x60E7	#CJK UNIFIED IDEOGRAPH
+0x9C9D	0x6083	#CJK UNIFIED IDEOGRAPH
+0x9C9E	0x609A	#CJK UNIFIED IDEOGRAPH
+0x9C9F	0x6084	#CJK UNIFIED IDEOGRAPH
+0x9CA0	0x609B	#CJK UNIFIED IDEOGRAPH
+0x9CA1	0x6096	#CJK UNIFIED IDEOGRAPH
+0x9CA2	0x6097	#CJK UNIFIED IDEOGRAPH
+0x9CA3	0x6092	#CJK UNIFIED IDEOGRAPH
+0x9CA4	0x60A7	#CJK UNIFIED IDEOGRAPH
+0x9CA5	0x608B	#CJK UNIFIED IDEOGRAPH
+0x9CA6	0x60E1	#CJK UNIFIED IDEOGRAPH
+0x9CA7	0x60B8	#CJK UNIFIED IDEOGRAPH
+0x9CA8	0x60E0	#CJK UNIFIED IDEOGRAPH
+0x9CA9	0x60D3	#CJK UNIFIED IDEOGRAPH
+0x9CAA	0x60B4	#CJK UNIFIED IDEOGRAPH
+0x9CAB	0x5FF0	#CJK UNIFIED IDEOGRAPH
+0x9CAC	0x60BD	#CJK UNIFIED IDEOGRAPH
+0x9CAD	0x60C6	#CJK UNIFIED IDEOGRAPH
+0x9CAE	0x60B5	#CJK UNIFIED IDEOGRAPH
+0x9CAF	0x60D8	#CJK UNIFIED IDEOGRAPH
+0x9CB0	0x614D	#CJK UNIFIED IDEOGRAPH
+0x9CB1	0x6115	#CJK UNIFIED IDEOGRAPH
+0x9CB2	0x6106	#CJK UNIFIED IDEOGRAPH
+0x9CB3	0x60F6	#CJK UNIFIED IDEOGRAPH
+0x9CB4	0x60F7	#CJK UNIFIED IDEOGRAPH
+0x9CB5	0x6100	#CJK UNIFIED IDEOGRAPH
+0x9CB6	0x60F4	#CJK UNIFIED IDEOGRAPH
+0x9CB7	0x60FA	#CJK UNIFIED IDEOGRAPH
+0x9CB8	0x6103	#CJK UNIFIED IDEOGRAPH
+0x9CB9	0x6121	#CJK UNIFIED IDEOGRAPH
+0x9CBA	0x60FB	#CJK UNIFIED IDEOGRAPH
+0x9CBB	0x60F1	#CJK UNIFIED IDEOGRAPH
+0x9CBC	0x610D	#CJK UNIFIED IDEOGRAPH
+0x9CBD	0x610E	#CJK UNIFIED IDEOGRAPH
+0x9CBE	0x6147	#CJK UNIFIED IDEOGRAPH
+0x9CBF	0x613E	#CJK UNIFIED IDEOGRAPH
+0x9CC0	0x6128	#CJK UNIFIED IDEOGRAPH
+0x9CC1	0x6127	#CJK UNIFIED IDEOGRAPH
+0x9CC2	0x614A	#CJK UNIFIED IDEOGRAPH
+0x9CC3	0x613F	#CJK UNIFIED IDEOGRAPH
+0x9CC4	0x613C	#CJK UNIFIED IDEOGRAPH
+0x9CC5	0x612C	#CJK UNIFIED IDEOGRAPH
+0x9CC6	0x6134	#CJK UNIFIED IDEOGRAPH
+0x9CC7	0x613D	#CJK UNIFIED IDEOGRAPH
+0x9CC8	0x6142	#CJK UNIFIED IDEOGRAPH
+0x9CC9	0x6144	#CJK UNIFIED IDEOGRAPH
+0x9CCA	0x6173	#CJK UNIFIED IDEOGRAPH
+0x9CCB	0x6177	#CJK UNIFIED IDEOGRAPH
+0x9CCC	0x6158	#CJK UNIFIED IDEOGRAPH
+0x9CCD	0x6159	#CJK UNIFIED IDEOGRAPH
+0x9CCE	0x615A	#CJK UNIFIED IDEOGRAPH
+0x9CCF	0x616B	#CJK UNIFIED IDEOGRAPH
+0x9CD0	0x6174	#CJK UNIFIED IDEOGRAPH
+0x9CD1	0x616F	#CJK UNIFIED IDEOGRAPH
+0x9CD2	0x6165	#CJK UNIFIED IDEOGRAPH
+0x9CD3	0x6171	#CJK UNIFIED IDEOGRAPH
+0x9CD4	0x615F	#CJK UNIFIED IDEOGRAPH
+0x9CD5	0x615D	#CJK UNIFIED IDEOGRAPH
+0x9CD6	0x6153	#CJK UNIFIED IDEOGRAPH
+0x9CD7	0x6175	#CJK UNIFIED IDEOGRAPH
+0x9CD8	0x6199	#CJK UNIFIED IDEOGRAPH
+0x9CD9	0x6196	#CJK UNIFIED IDEOGRAPH
+0x9CDA	0x6187	#CJK UNIFIED IDEOGRAPH
+0x9CDB	0x61AC	#CJK UNIFIED IDEOGRAPH
+0x9CDC	0x6194	#CJK UNIFIED IDEOGRAPH
+0x9CDD	0x619A	#CJK UNIFIED IDEOGRAPH
+0x9CDE	0x618A	#CJK UNIFIED IDEOGRAPH
+0x9CDF	0x6191	#CJK UNIFIED IDEOGRAPH
+0x9CE0	0x61AB	#CJK UNIFIED IDEOGRAPH
+0x9CE1	0x61AE	#CJK UNIFIED IDEOGRAPH
+0x9CE2	0x61CC	#CJK UNIFIED IDEOGRAPH
+0x9CE3	0x61CA	#CJK UNIFIED IDEOGRAPH
+0x9CE4	0x61C9	#CJK UNIFIED IDEOGRAPH
+0x9CE5	0x61F7	#CJK UNIFIED IDEOGRAPH
+0x9CE6	0x61C8	#CJK UNIFIED IDEOGRAPH
+0x9CE7	0x61C3	#CJK UNIFIED IDEOGRAPH
+0x9CE8	0x61C6	#CJK UNIFIED IDEOGRAPH
+0x9CE9	0x61BA	#CJK UNIFIED IDEOGRAPH
+0x9CEA	0x61CB	#CJK UNIFIED IDEOGRAPH
+0x9CEB	0x7F79	#CJK UNIFIED IDEOGRAPH
+0x9CEC	0x61CD	#CJK UNIFIED IDEOGRAPH
+0x9CED	0x61E6	#CJK UNIFIED IDEOGRAPH
+0x9CEE	0x61E3	#CJK UNIFIED IDEOGRAPH
+0x9CEF	0x61F6	#CJK UNIFIED IDEOGRAPH
+0x9CF0	0x61FA	#CJK UNIFIED IDEOGRAPH
+0x9CF1	0x61F4	#CJK UNIFIED IDEOGRAPH
+0x9CF2	0x61FF	#CJK UNIFIED IDEOGRAPH
+0x9CF3	0x61FD	#CJK UNIFIED IDEOGRAPH
+0x9CF4	0x61FC	#CJK UNIFIED IDEOGRAPH
+0x9CF5	0x61FE	#CJK UNIFIED IDEOGRAPH
+0x9CF6	0x6200	#CJK UNIFIED IDEOGRAPH
+0x9CF7	0x6208	#CJK UNIFIED IDEOGRAPH
+0x9CF8	0x6209	#CJK UNIFIED IDEOGRAPH
+0x9CF9	0x620D	#CJK UNIFIED IDEOGRAPH
+0x9CFA	0x620C	#CJK UNIFIED IDEOGRAPH
+0x9CFB	0x6214	#CJK UNIFIED IDEOGRAPH
+0x9CFC	0x621B	#CJK UNIFIED IDEOGRAPH
+0x9D40	0x621E	#CJK UNIFIED IDEOGRAPH
+0x9D41	0x6221	#CJK UNIFIED IDEOGRAPH
+0x9D42	0x622A	#CJK UNIFIED IDEOGRAPH
+0x9D43	0x622E	#CJK UNIFIED IDEOGRAPH
+0x9D44	0x6230	#CJK UNIFIED IDEOGRAPH
+0x9D45	0x6232	#CJK UNIFIED IDEOGRAPH
+0x9D46	0x6233	#CJK UNIFIED IDEOGRAPH
+0x9D47	0x6241	#CJK UNIFIED IDEOGRAPH
+0x9D48	0x624E	#CJK UNIFIED IDEOGRAPH
+0x9D49	0x625E	#CJK UNIFIED IDEOGRAPH
+0x9D4A	0x6263	#CJK UNIFIED IDEOGRAPH
+0x9D4B	0x625B	#CJK UNIFIED IDEOGRAPH
+0x9D4C	0x6260	#CJK UNIFIED IDEOGRAPH
+0x9D4D	0x6268	#CJK UNIFIED IDEOGRAPH
+0x9D4E	0x627C	#CJK UNIFIED IDEOGRAPH
+0x9D4F	0x6282	#CJK UNIFIED IDEOGRAPH
+0x9D50	0x6289	#CJK UNIFIED IDEOGRAPH
+0x9D51	0x627E	#CJK UNIFIED IDEOGRAPH
+0x9D52	0x6292	#CJK UNIFIED IDEOGRAPH
+0x9D53	0x6293	#CJK UNIFIED IDEOGRAPH
+0x9D54	0x6296	#CJK UNIFIED IDEOGRAPH
+0x9D55	0x62D4	#CJK UNIFIED IDEOGRAPH
+0x9D56	0x6283	#CJK UNIFIED IDEOGRAPH
+0x9D57	0x6294	#CJK UNIFIED IDEOGRAPH
+0x9D58	0x62D7	#CJK UNIFIED IDEOGRAPH
+0x9D59	0x62D1	#CJK UNIFIED IDEOGRAPH
+0x9D5A	0x62BB	#CJK UNIFIED IDEOGRAPH
+0x9D5B	0x62CF	#CJK UNIFIED IDEOGRAPH
+0x9D5C	0x62FF	#CJK UNIFIED IDEOGRAPH
+0x9D5D	0x62C6	#CJK UNIFIED IDEOGRAPH
+0x9D5E	0x64D4	#CJK UNIFIED IDEOGRAPH
+0x9D5F	0x62C8	#CJK UNIFIED IDEOGRAPH
+0x9D60	0x62DC	#CJK UNIFIED IDEOGRAPH
+0x9D61	0x62CC	#CJK UNIFIED IDEOGRAPH
+0x9D62	0x62CA	#CJK UNIFIED IDEOGRAPH
+0x9D63	0x62C2	#CJK UNIFIED IDEOGRAPH
+0x9D64	0x62C7	#CJK UNIFIED IDEOGRAPH
+0x9D65	0x629B	#CJK UNIFIED IDEOGRAPH
+0x9D66	0x62C9	#CJK UNIFIED IDEOGRAPH
+0x9D67	0x630C	#CJK UNIFIED IDEOGRAPH
+0x9D68	0x62EE	#CJK UNIFIED IDEOGRAPH
+0x9D69	0x62F1	#CJK UNIFIED IDEOGRAPH
+0x9D6A	0x6327	#CJK UNIFIED IDEOGRAPH
+0x9D6B	0x6302	#CJK UNIFIED IDEOGRAPH
+0x9D6C	0x6308	#CJK UNIFIED IDEOGRAPH
+0x9D6D	0x62EF	#CJK UNIFIED IDEOGRAPH
+0x9D6E	0x62F5	#CJK UNIFIED IDEOGRAPH
+0x9D6F	0x6350	#CJK UNIFIED IDEOGRAPH
+0x9D70	0x633E	#CJK UNIFIED IDEOGRAPH
+0x9D71	0x634D	#CJK UNIFIED IDEOGRAPH
+0x9D72	0x641C	#CJK UNIFIED IDEOGRAPH
+0x9D73	0x634F	#CJK UNIFIED IDEOGRAPH
+0x9D74	0x6396	#CJK UNIFIED IDEOGRAPH
+0x9D75	0x638E	#CJK UNIFIED IDEOGRAPH
+0x9D76	0x6380	#CJK UNIFIED IDEOGRAPH
+0x9D77	0x63AB	#CJK UNIFIED IDEOGRAPH
+0x9D78	0x6376	#CJK UNIFIED IDEOGRAPH
+0x9D79	0x63A3	#CJK UNIFIED IDEOGRAPH
+0x9D7A	0x638F	#CJK UNIFIED IDEOGRAPH
+0x9D7B	0x6389	#CJK UNIFIED IDEOGRAPH
+0x9D7C	0x639F	#CJK UNIFIED IDEOGRAPH
+0x9D7D	0x63B5	#CJK UNIFIED IDEOGRAPH
+0x9D7E	0x636B	#CJK UNIFIED IDEOGRAPH
+0x9D80	0x6369	#CJK UNIFIED IDEOGRAPH
+0x9D81	0x63BE	#CJK UNIFIED IDEOGRAPH
+0x9D82	0x63E9	#CJK UNIFIED IDEOGRAPH
+0x9D83	0x63C0	#CJK UNIFIED IDEOGRAPH
+0x9D84	0x63C6	#CJK UNIFIED IDEOGRAPH
+0x9D85	0x63E3	#CJK UNIFIED IDEOGRAPH
+0x9D86	0x63C9	#CJK UNIFIED IDEOGRAPH
+0x9D87	0x63D2	#CJK UNIFIED IDEOGRAPH
+0x9D88	0x63F6	#CJK UNIFIED IDEOGRAPH
+0x9D89	0x63C4	#CJK UNIFIED IDEOGRAPH
+0x9D8A	0x6416	#CJK UNIFIED IDEOGRAPH
+0x9D8B	0x6434	#CJK UNIFIED IDEOGRAPH
+0x9D8C	0x6406	#CJK UNIFIED IDEOGRAPH
+0x9D8D	0x6413	#CJK UNIFIED IDEOGRAPH
+0x9D8E	0x6426	#CJK UNIFIED IDEOGRAPH
+0x9D8F	0x6436	#CJK UNIFIED IDEOGRAPH
+0x9D90	0x651D	#CJK UNIFIED IDEOGRAPH
+0x9D91	0x6417	#CJK UNIFIED IDEOGRAPH
+0x9D92	0x6428	#CJK UNIFIED IDEOGRAPH
+0x9D93	0x640F	#CJK UNIFIED IDEOGRAPH
+0x9D94	0x6467	#CJK UNIFIED IDEOGRAPH
+0x9D95	0x646F	#CJK UNIFIED IDEOGRAPH
+0x9D96	0x6476	#CJK UNIFIED IDEOGRAPH
+0x9D97	0x644E	#CJK UNIFIED IDEOGRAPH
+0x9D98	0x652A	#CJK UNIFIED IDEOGRAPH
+0x9D99	0x6495	#CJK UNIFIED IDEOGRAPH
+0x9D9A	0x6493	#CJK UNIFIED IDEOGRAPH
+0x9D9B	0x64A5	#CJK UNIFIED IDEOGRAPH
+0x9D9C	0x64A9	#CJK UNIFIED IDEOGRAPH
+0x9D9D	0x6488	#CJK UNIFIED IDEOGRAPH
+0x9D9E	0x64BC	#CJK UNIFIED IDEOGRAPH
+0x9D9F	0x64DA	#CJK UNIFIED IDEOGRAPH
+0x9DA0	0x64D2	#CJK UNIFIED IDEOGRAPH
+0x9DA1	0x64C5	#CJK UNIFIED IDEOGRAPH
+0x9DA2	0x64C7	#CJK UNIFIED IDEOGRAPH
+0x9DA3	0x64BB	#CJK UNIFIED IDEOGRAPH
+0x9DA4	0x64D8	#CJK UNIFIED IDEOGRAPH
+0x9DA5	0x64C2	#CJK UNIFIED IDEOGRAPH
+0x9DA6	0x64F1	#CJK UNIFIED IDEOGRAPH
+0x9DA7	0x64E7	#CJK UNIFIED IDEOGRAPH
+0x9DA8	0x8209	#CJK UNIFIED IDEOGRAPH
+0x9DA9	0x64E0	#CJK UNIFIED IDEOGRAPH
+0x9DAA	0x64E1	#CJK UNIFIED IDEOGRAPH
+0x9DAB	0x62AC	#CJK UNIFIED IDEOGRAPH
+0x9DAC	0x64E3	#CJK UNIFIED IDEOGRAPH
+0x9DAD	0x64EF	#CJK UNIFIED IDEOGRAPH
+0x9DAE	0x652C	#CJK UNIFIED IDEOGRAPH
+0x9DAF	0x64F6	#CJK UNIFIED IDEOGRAPH
+0x9DB0	0x64F4	#CJK UNIFIED IDEOGRAPH
+0x9DB1	0x64F2	#CJK UNIFIED IDEOGRAPH
+0x9DB2	0x64FA	#CJK UNIFIED IDEOGRAPH
+0x9DB3	0x6500	#CJK UNIFIED IDEOGRAPH
+0x9DB4	0x64FD	#CJK UNIFIED IDEOGRAPH
+0x9DB5	0x6518	#CJK UNIFIED IDEOGRAPH
+0x9DB6	0x651C	#CJK UNIFIED IDEOGRAPH
+0x9DB7	0x6505	#CJK UNIFIED IDEOGRAPH
+0x9DB8	0x6524	#CJK UNIFIED IDEOGRAPH
+0x9DB9	0x6523	#CJK UNIFIED IDEOGRAPH
+0x9DBA	0x652B	#CJK UNIFIED IDEOGRAPH
+0x9DBB	0x6534	#CJK UNIFIED IDEOGRAPH
+0x9DBC	0x6535	#CJK UNIFIED IDEOGRAPH
+0x9DBD	0x6537	#CJK UNIFIED IDEOGRAPH
+0x9DBE	0x6536	#CJK UNIFIED IDEOGRAPH
+0x9DBF	0x6538	#CJK UNIFIED IDEOGRAPH
+0x9DC0	0x754B	#CJK UNIFIED IDEOGRAPH
+0x9DC1	0x6548	#CJK UNIFIED IDEOGRAPH
+0x9DC2	0x6556	#CJK UNIFIED IDEOGRAPH
+0x9DC3	0x6555	#CJK UNIFIED IDEOGRAPH
+0x9DC4	0x654D	#CJK UNIFIED IDEOGRAPH
+0x9DC5	0x6558	#CJK UNIFIED IDEOGRAPH
+0x9DC6	0x655E	#CJK UNIFIED IDEOGRAPH
+0x9DC7	0x655D	#CJK UNIFIED IDEOGRAPH
+0x9DC8	0x6572	#CJK UNIFIED IDEOGRAPH
+0x9DC9	0x6578	#CJK UNIFIED IDEOGRAPH
+0x9DCA	0x6582	#CJK UNIFIED IDEOGRAPH
+0x9DCB	0x6583	#CJK UNIFIED IDEOGRAPH
+0x9DCC	0x8B8A	#CJK UNIFIED IDEOGRAPH
+0x9DCD	0x659B	#CJK UNIFIED IDEOGRAPH
+0x9DCE	0x659F	#CJK UNIFIED IDEOGRAPH
+0x9DCF	0x65AB	#CJK UNIFIED IDEOGRAPH
+0x9DD0	0x65B7	#CJK UNIFIED IDEOGRAPH
+0x9DD1	0x65C3	#CJK UNIFIED IDEOGRAPH
+0x9DD2	0x65C6	#CJK UNIFIED IDEOGRAPH
+0x9DD3	0x65C1	#CJK UNIFIED IDEOGRAPH
+0x9DD4	0x65C4	#CJK UNIFIED IDEOGRAPH
+0x9DD5	0x65CC	#CJK UNIFIED IDEOGRAPH
+0x9DD6	0x65D2	#CJK UNIFIED IDEOGRAPH
+0x9DD7	0x65DB	#CJK UNIFIED IDEOGRAPH
+0x9DD8	0x65D9	#CJK UNIFIED IDEOGRAPH
+0x9DD9	0x65E0	#CJK UNIFIED IDEOGRAPH
+0x9DDA	0x65E1	#CJK UNIFIED IDEOGRAPH
+0x9DDB	0x65F1	#CJK UNIFIED IDEOGRAPH
+0x9DDC	0x6772	#CJK UNIFIED IDEOGRAPH
+0x9DDD	0x660A	#CJK UNIFIED IDEOGRAPH
+0x9DDE	0x6603	#CJK UNIFIED IDEOGRAPH
+0x9DDF	0x65FB	#CJK UNIFIED IDEOGRAPH
+0x9DE0	0x6773	#CJK UNIFIED IDEOGRAPH
+0x9DE1	0x6635	#CJK UNIFIED IDEOGRAPH
+0x9DE2	0x6636	#CJK UNIFIED IDEOGRAPH
+0x9DE3	0x6634	#CJK UNIFIED IDEOGRAPH
+0x9DE4	0x661C	#CJK UNIFIED IDEOGRAPH
+0x9DE5	0x664F	#CJK UNIFIED IDEOGRAPH
+0x9DE6	0x6644	#CJK UNIFIED IDEOGRAPH
+0x9DE7	0x6649	#CJK UNIFIED IDEOGRAPH
+0x9DE8	0x6641	#CJK UNIFIED IDEOGRAPH
+0x9DE9	0x665E	#CJK UNIFIED IDEOGRAPH
+0x9DEA	0x665D	#CJK UNIFIED IDEOGRAPH
+0x9DEB	0x6664	#CJK UNIFIED IDEOGRAPH
+0x9DEC	0x6667	#CJK UNIFIED IDEOGRAPH
+0x9DED	0x6668	#CJK UNIFIED IDEOGRAPH
+0x9DEE	0x665F	#CJK UNIFIED IDEOGRAPH
+0x9DEF	0x6662	#CJK UNIFIED IDEOGRAPH
+0x9DF0	0x6670	#CJK UNIFIED IDEOGRAPH
+0x9DF1	0x6683	#CJK UNIFIED IDEOGRAPH
+0x9DF2	0x6688	#CJK UNIFIED IDEOGRAPH
+0x9DF3	0x668E	#CJK UNIFIED IDEOGRAPH
+0x9DF4	0x6689	#CJK UNIFIED IDEOGRAPH
+0x9DF5	0x6684	#CJK UNIFIED IDEOGRAPH
+0x9DF6	0x6698	#CJK UNIFIED IDEOGRAPH
+0x9DF7	0x669D	#CJK UNIFIED IDEOGRAPH
+0x9DF8	0x66C1	#CJK UNIFIED IDEOGRAPH
+0x9DF9	0x66B9	#CJK UNIFIED IDEOGRAPH
+0x9DFA	0x66C9	#CJK UNIFIED IDEOGRAPH
+0x9DFB	0x66BE	#CJK UNIFIED IDEOGRAPH
+0x9DFC	0x66BC	#CJK UNIFIED IDEOGRAPH
+0x9E40	0x66C4	#CJK UNIFIED IDEOGRAPH
+0x9E41	0x66B8	#CJK UNIFIED IDEOGRAPH
+0x9E42	0x66D6	#CJK UNIFIED IDEOGRAPH
+0x9E43	0x66DA	#CJK UNIFIED IDEOGRAPH
+0x9E44	0x66E0	#CJK UNIFIED IDEOGRAPH
+0x9E45	0x663F	#CJK UNIFIED IDEOGRAPH
+0x9E46	0x66E6	#CJK UNIFIED IDEOGRAPH
+0x9E47	0x66E9	#CJK UNIFIED IDEOGRAPH
+0x9E48	0x66F0	#CJK UNIFIED IDEOGRAPH
+0x9E49	0x66F5	#CJK UNIFIED IDEOGRAPH
+0x9E4A	0x66F7	#CJK UNIFIED IDEOGRAPH
+0x9E4B	0x670F	#CJK UNIFIED IDEOGRAPH
+0x9E4C	0x6716	#CJK UNIFIED IDEOGRAPH
+0x9E4D	0x671E	#CJK UNIFIED IDEOGRAPH
+0x9E4E	0x6726	#CJK UNIFIED IDEOGRAPH
+0x9E4F	0x6727	#CJK UNIFIED IDEOGRAPH
+0x9E50	0x9738	#CJK UNIFIED IDEOGRAPH
+0x9E51	0x672E	#CJK UNIFIED IDEOGRAPH
+0x9E52	0x673F	#CJK UNIFIED IDEOGRAPH
+0x9E53	0x6736	#CJK UNIFIED IDEOGRAPH
+0x9E54	0x6741	#CJK UNIFIED IDEOGRAPH
+0x9E55	0x6738	#CJK UNIFIED IDEOGRAPH
+0x9E56	0x6737	#CJK UNIFIED IDEOGRAPH
+0x9E57	0x6746	#CJK UNIFIED IDEOGRAPH
+0x9E58	0x675E	#CJK UNIFIED IDEOGRAPH
+0x9E59	0x6760	#CJK UNIFIED IDEOGRAPH
+0x9E5A	0x6759	#CJK UNIFIED IDEOGRAPH
+0x9E5B	0x6763	#CJK UNIFIED IDEOGRAPH
+0x9E5C	0x6764	#CJK UNIFIED IDEOGRAPH
+0x9E5D	0x6789	#CJK UNIFIED IDEOGRAPH
+0x9E5E	0x6770	#CJK UNIFIED IDEOGRAPH
+0x9E5F	0x67A9	#CJK UNIFIED IDEOGRAPH
+0x9E60	0x677C	#CJK UNIFIED IDEOGRAPH
+0x9E61	0x676A	#CJK UNIFIED IDEOGRAPH
+0x9E62	0x678C	#CJK UNIFIED IDEOGRAPH
+0x9E63	0x678B	#CJK UNIFIED IDEOGRAPH
+0x9E64	0x67A6	#CJK UNIFIED IDEOGRAPH
+0x9E65	0x67A1	#CJK UNIFIED IDEOGRAPH
+0x9E66	0x6785	#CJK UNIFIED IDEOGRAPH
+0x9E67	0x67B7	#CJK UNIFIED IDEOGRAPH
+0x9E68	0x67EF	#CJK UNIFIED IDEOGRAPH
+0x9E69	0x67B4	#CJK UNIFIED IDEOGRAPH
+0x9E6A	0x67EC	#CJK UNIFIED IDEOGRAPH
+0x9E6B	0x67B3	#CJK UNIFIED IDEOGRAPH
+0x9E6C	0x67E9	#CJK UNIFIED IDEOGRAPH
+0x9E6D	0x67B8	#CJK UNIFIED IDEOGRAPH
+0x9E6E	0x67E4	#CJK UNIFIED IDEOGRAPH
+0x9E6F	0x67DE	#CJK UNIFIED IDEOGRAPH
+0x9E70	0x67DD	#CJK UNIFIED IDEOGRAPH
+0x9E71	0x67E2	#CJK UNIFIED IDEOGRAPH
+0x9E72	0x67EE	#CJK UNIFIED IDEOGRAPH
+0x9E73	0x67B9	#CJK UNIFIED IDEOGRAPH
+0x9E74	0x67CE	#CJK UNIFIED IDEOGRAPH
+0x9E75	0x67C6	#CJK UNIFIED IDEOGRAPH
+0x9E76	0x67E7	#CJK UNIFIED IDEOGRAPH
+0x9E77	0x6A9C	#CJK UNIFIED IDEOGRAPH
+0x9E78	0x681E	#CJK UNIFIED IDEOGRAPH
+0x9E79	0x6846	#CJK UNIFIED IDEOGRAPH
+0x9E7A	0x6829	#CJK UNIFIED IDEOGRAPH
+0x9E7B	0x6840	#CJK UNIFIED IDEOGRAPH
+0x9E7C	0x684D	#CJK UNIFIED IDEOGRAPH
+0x9E7D	0x6832	#CJK UNIFIED IDEOGRAPH
+0x9E7E	0x684E	#CJK UNIFIED IDEOGRAPH
+0x9E80	0x68B3	#CJK UNIFIED IDEOGRAPH
+0x9E81	0x682B	#CJK UNIFIED IDEOGRAPH
+0x9E82	0x6859	#CJK UNIFIED IDEOGRAPH
+0x9E83	0x6863	#CJK UNIFIED IDEOGRAPH
+0x9E84	0x6877	#CJK UNIFIED IDEOGRAPH
+0x9E85	0x687F	#CJK UNIFIED IDEOGRAPH
+0x9E86	0x689F	#CJK UNIFIED IDEOGRAPH
+0x9E87	0x688F	#CJK UNIFIED IDEOGRAPH
+0x9E88	0x68AD	#CJK UNIFIED IDEOGRAPH
+0x9E89	0x6894	#CJK UNIFIED IDEOGRAPH
+0x9E8A	0x689D	#CJK UNIFIED IDEOGRAPH
+0x9E8B	0x689B	#CJK UNIFIED IDEOGRAPH
+0x9E8C	0x6883	#CJK UNIFIED IDEOGRAPH
+0x9E8D	0x6AAE	#CJK UNIFIED IDEOGRAPH
+0x9E8E	0x68B9	#CJK UNIFIED IDEOGRAPH
+0x9E8F	0x6874	#CJK UNIFIED IDEOGRAPH
+0x9E90	0x68B5	#CJK UNIFIED IDEOGRAPH
+0x9E91	0x68A0	#CJK UNIFIED IDEOGRAPH
+0x9E92	0x68BA	#CJK UNIFIED IDEOGRAPH
+0x9E93	0x690F	#CJK UNIFIED IDEOGRAPH
+0x9E94	0x688D	#CJK UNIFIED IDEOGRAPH
+0x9E95	0x687E	#CJK UNIFIED IDEOGRAPH
+0x9E96	0x6901	#CJK UNIFIED IDEOGRAPH
+0x9E97	0x68CA	#CJK UNIFIED IDEOGRAPH
+0x9E98	0x6908	#CJK UNIFIED IDEOGRAPH
+0x9E99	0x68D8	#CJK UNIFIED IDEOGRAPH
+0x9E9A	0x6922	#CJK UNIFIED IDEOGRAPH
+0x9E9B	0x6926	#CJK UNIFIED IDEOGRAPH
+0x9E9C	0x68E1	#CJK UNIFIED IDEOGRAPH
+0x9E9D	0x690C	#CJK UNIFIED IDEOGRAPH
+0x9E9E	0x68CD	#CJK UNIFIED IDEOGRAPH
+0x9E9F	0x68D4	#CJK UNIFIED IDEOGRAPH
+0x9EA0	0x68E7	#CJK UNIFIED IDEOGRAPH
+0x9EA1	0x68D5	#CJK UNIFIED IDEOGRAPH
+0x9EA2	0x6936	#CJK UNIFIED IDEOGRAPH
+0x9EA3	0x6912	#CJK UNIFIED IDEOGRAPH
+0x9EA4	0x6904	#CJK UNIFIED IDEOGRAPH
+0x9EA5	0x68D7	#CJK UNIFIED IDEOGRAPH
+0x9EA6	0x68E3	#CJK UNIFIED IDEOGRAPH
+0x9EA7	0x6925	#CJK UNIFIED IDEOGRAPH
+0x9EA8	0x68F9	#CJK UNIFIED IDEOGRAPH
+0x9EA9	0x68E0	#CJK UNIFIED IDEOGRAPH
+0x9EAA	0x68EF	#CJK UNIFIED IDEOGRAPH
+0x9EAB	0x6928	#CJK UNIFIED IDEOGRAPH
+0x9EAC	0x692A	#CJK UNIFIED IDEOGRAPH
+0x9EAD	0x691A	#CJK UNIFIED IDEOGRAPH
+0x9EAE	0x6923	#CJK UNIFIED IDEOGRAPH
+0x9EAF	0x6921	#CJK UNIFIED IDEOGRAPH
+0x9EB0	0x68C6	#CJK UNIFIED IDEOGRAPH
+0x9EB1	0x6979	#CJK UNIFIED IDEOGRAPH
+0x9EB2	0x6977	#CJK UNIFIED IDEOGRAPH
+0x9EB3	0x695C	#CJK UNIFIED IDEOGRAPH
+0x9EB4	0x6978	#CJK UNIFIED IDEOGRAPH
+0x9EB5	0x696B	#CJK UNIFIED IDEOGRAPH
+0x9EB6	0x6954	#CJK UNIFIED IDEOGRAPH
+0x9EB7	0x697E	#CJK UNIFIED IDEOGRAPH
+0x9EB8	0x696E	#CJK UNIFIED IDEOGRAPH
+0x9EB9	0x6939	#CJK UNIFIED IDEOGRAPH
+0x9EBA	0x6974	#CJK UNIFIED IDEOGRAPH
+0x9EBB	0x693D	#CJK UNIFIED IDEOGRAPH
+0x9EBC	0x6959	#CJK UNIFIED IDEOGRAPH
+0x9EBD	0x6930	#CJK UNIFIED IDEOGRAPH
+0x9EBE	0x6961	#CJK UNIFIED IDEOGRAPH
+0x9EBF	0x695E	#CJK UNIFIED IDEOGRAPH
+0x9EC0	0x695D	#CJK UNIFIED IDEOGRAPH
+0x9EC1	0x6981	#CJK UNIFIED IDEOGRAPH
+0x9EC2	0x696A	#CJK UNIFIED IDEOGRAPH
+0x9EC3	0x69B2	#CJK UNIFIED IDEOGRAPH
+0x9EC4	0x69AE	#CJK UNIFIED IDEOGRAPH
+0x9EC5	0x69D0	#CJK UNIFIED IDEOGRAPH
+0x9EC6	0x69BF	#CJK UNIFIED IDEOGRAPH
+0x9EC7	0x69C1	#CJK UNIFIED IDEOGRAPH
+0x9EC8	0x69D3	#CJK UNIFIED IDEOGRAPH
+0x9EC9	0x69BE	#CJK UNIFIED IDEOGRAPH
+0x9ECA	0x69CE	#CJK UNIFIED IDEOGRAPH
+0x9ECB	0x5BE8	#CJK UNIFIED IDEOGRAPH
+0x9ECC	0x69CA	#CJK UNIFIED IDEOGRAPH
+0x9ECD	0x69DD	#CJK UNIFIED IDEOGRAPH
+0x9ECE	0x69BB	#CJK UNIFIED IDEOGRAPH
+0x9ECF	0x69C3	#CJK UNIFIED IDEOGRAPH
+0x9ED0	0x69A7	#CJK UNIFIED IDEOGRAPH
+0x9ED1	0x6A2E	#CJK UNIFIED IDEOGRAPH
+0x9ED2	0x6991	#CJK UNIFIED IDEOGRAPH
+0x9ED3	0x69A0	#CJK UNIFIED IDEOGRAPH
+0x9ED4	0x699C	#CJK UNIFIED IDEOGRAPH
+0x9ED5	0x6995	#CJK UNIFIED IDEOGRAPH
+0x9ED6	0x69B4	#CJK UNIFIED IDEOGRAPH
+0x9ED7	0x69DE	#CJK UNIFIED IDEOGRAPH
+0x9ED8	0x69E8	#CJK UNIFIED IDEOGRAPH
+0x9ED9	0x6A02	#CJK UNIFIED IDEOGRAPH
+0x9EDA	0x6A1B	#CJK UNIFIED IDEOGRAPH
+0x9EDB	0x69FF	#CJK UNIFIED IDEOGRAPH
+0x9EDC	0x6B0A	#CJK UNIFIED IDEOGRAPH
+0x9EDD	0x69F9	#CJK UNIFIED IDEOGRAPH
+0x9EDE	0x69F2	#CJK UNIFIED IDEOGRAPH
+0x9EDF	0x69E7	#CJK UNIFIED IDEOGRAPH
+0x9EE0	0x6A05	#CJK UNIFIED IDEOGRAPH
+0x9EE1	0x69B1	#CJK UNIFIED IDEOGRAPH
+0x9EE2	0x6A1E	#CJK UNIFIED IDEOGRAPH
+0x9EE3	0x69ED	#CJK UNIFIED IDEOGRAPH
+0x9EE4	0x6A14	#CJK UNIFIED IDEOGRAPH
+0x9EE5	0x69EB	#CJK UNIFIED IDEOGRAPH
+0x9EE6	0x6A0A	#CJK UNIFIED IDEOGRAPH
+0x9EE7	0x6A12	#CJK UNIFIED IDEOGRAPH
+0x9EE8	0x6AC1	#CJK UNIFIED IDEOGRAPH
+0x9EE9	0x6A23	#CJK UNIFIED IDEOGRAPH
+0x9EEA	0x6A13	#CJK UNIFIED IDEOGRAPH
+0x9EEB	0x6A44	#CJK UNIFIED IDEOGRAPH
+0x9EEC	0x6A0C	#CJK UNIFIED IDEOGRAPH
+0x9EED	0x6A72	#CJK UNIFIED IDEOGRAPH
+0x9EEE	0x6A36	#CJK UNIFIED IDEOGRAPH
+0x9EEF	0x6A78	#CJK UNIFIED IDEOGRAPH
+0x9EF0	0x6A47	#CJK UNIFIED IDEOGRAPH
+0x9EF1	0x6A62	#CJK UNIFIED IDEOGRAPH
+0x9EF2	0x6A59	#CJK UNIFIED IDEOGRAPH
+0x9EF3	0x6A66	#CJK UNIFIED IDEOGRAPH
+0x9EF4	0x6A48	#CJK UNIFIED IDEOGRAPH
+0x9EF5	0x6A38	#CJK UNIFIED IDEOGRAPH
+0x9EF6	0x6A22	#CJK UNIFIED IDEOGRAPH
+0x9EF7	0x6A90	#CJK UNIFIED IDEOGRAPH
+0x9EF8	0x6A8D	#CJK UNIFIED IDEOGRAPH
+0x9EF9	0x6AA0	#CJK UNIFIED IDEOGRAPH
+0x9EFA	0x6A84	#CJK UNIFIED IDEOGRAPH
+0x9EFB	0x6AA2	#CJK UNIFIED IDEOGRAPH
+0x9EFC	0x6AA3	#CJK UNIFIED IDEOGRAPH
+0x9F40	0x6A97	#CJK UNIFIED IDEOGRAPH
+0x9F41	0x8617	#CJK UNIFIED IDEOGRAPH
+0x9F42	0x6ABB	#CJK UNIFIED IDEOGRAPH
+0x9F43	0x6AC3	#CJK UNIFIED IDEOGRAPH
+0x9F44	0x6AC2	#CJK UNIFIED IDEOGRAPH
+0x9F45	0x6AB8	#CJK UNIFIED IDEOGRAPH
+0x9F46	0x6AB3	#CJK UNIFIED IDEOGRAPH
+0x9F47	0x6AAC	#CJK UNIFIED IDEOGRAPH
+0x9F48	0x6ADE	#CJK UNIFIED IDEOGRAPH
+0x9F49	0x6AD1	#CJK UNIFIED IDEOGRAPH
+0x9F4A	0x6ADF	#CJK UNIFIED IDEOGRAPH
+0x9F4B	0x6AAA	#CJK UNIFIED IDEOGRAPH
+0x9F4C	0x6ADA	#CJK UNIFIED IDEOGRAPH
+0x9F4D	0x6AEA	#CJK UNIFIED IDEOGRAPH
+0x9F4E	0x6AFB	#CJK UNIFIED IDEOGRAPH
+0x9F4F	0x6B05	#CJK UNIFIED IDEOGRAPH
+0x9F50	0x8616	#CJK UNIFIED IDEOGRAPH
+0x9F51	0x6AFA	#CJK UNIFIED IDEOGRAPH
+0x9F52	0x6B12	#CJK UNIFIED IDEOGRAPH
+0x9F53	0x6B16	#CJK UNIFIED IDEOGRAPH
+0x9F54	0x9B31	#CJK UNIFIED IDEOGRAPH
+0x9F55	0x6B1F	#CJK UNIFIED IDEOGRAPH
+0x9F56	0x6B38	#CJK UNIFIED IDEOGRAPH
+0x9F57	0x6B37	#CJK UNIFIED IDEOGRAPH
+0x9F58	0x76DC	#CJK UNIFIED IDEOGRAPH
+0x9F59	0x6B39	#CJK UNIFIED IDEOGRAPH
+0x9F5A	0x98EE	#CJK UNIFIED IDEOGRAPH
+0x9F5B	0x6B47	#CJK UNIFIED IDEOGRAPH
+0x9F5C	0x6B43	#CJK UNIFIED IDEOGRAPH
+0x9F5D	0x6B49	#CJK UNIFIED IDEOGRAPH
+0x9F5E	0x6B50	#CJK UNIFIED IDEOGRAPH
+0x9F5F	0x6B59	#CJK UNIFIED IDEOGRAPH
+0x9F60	0x6B54	#CJK UNIFIED IDEOGRAPH
+0x9F61	0x6B5B	#CJK UNIFIED IDEOGRAPH
+0x9F62	0x6B5F	#CJK UNIFIED IDEOGRAPH
+0x9F63	0x6B61	#CJK UNIFIED IDEOGRAPH
+0x9F64	0x6B78	#CJK UNIFIED IDEOGRAPH
+0x9F65	0x6B79	#CJK UNIFIED IDEOGRAPH
+0x9F66	0x6B7F	#CJK UNIFIED IDEOGRAPH
+0x9F67	0x6B80	#CJK UNIFIED IDEOGRAPH
+0x9F68	0x6B84	#CJK UNIFIED IDEOGRAPH
+0x9F69	0x6B83	#CJK UNIFIED IDEOGRAPH
+0x9F6A	0x6B8D	#CJK UNIFIED IDEOGRAPH
+0x9F6B	0x6B98	#CJK UNIFIED IDEOGRAPH
+0x9F6C	0x6B95	#CJK UNIFIED IDEOGRAPH
+0x9F6D	0x6B9E	#CJK UNIFIED IDEOGRAPH
+0x9F6E	0x6BA4	#CJK UNIFIED IDEOGRAPH
+0x9F6F	0x6BAA	#CJK UNIFIED IDEOGRAPH
+0x9F70	0x6BAB	#CJK UNIFIED IDEOGRAPH
+0x9F71	0x6BAF	#CJK UNIFIED IDEOGRAPH
+0x9F72	0x6BB2	#CJK UNIFIED IDEOGRAPH
+0x9F73	0x6BB1	#CJK UNIFIED IDEOGRAPH
+0x9F74	0x6BB3	#CJK UNIFIED IDEOGRAPH
+0x9F75	0x6BB7	#CJK UNIFIED IDEOGRAPH
+0x9F76	0x6BBC	#CJK UNIFIED IDEOGRAPH
+0x9F77	0x6BC6	#CJK UNIFIED IDEOGRAPH
+0x9F78	0x6BCB	#CJK UNIFIED IDEOGRAPH
+0x9F79	0x6BD3	#CJK UNIFIED IDEOGRAPH
+0x9F7A	0x6BDF	#CJK UNIFIED IDEOGRAPH
+0x9F7B	0x6BEC	#CJK UNIFIED IDEOGRAPH
+0x9F7C	0x6BEB	#CJK UNIFIED IDEOGRAPH
+0x9F7D	0x6BF3	#CJK UNIFIED IDEOGRAPH
+0x9F7E	0x6BEF	#CJK UNIFIED IDEOGRAPH
+0x9F80	0x9EBE	#CJK UNIFIED IDEOGRAPH
+0x9F81	0x6C08	#CJK UNIFIED IDEOGRAPH
+0x9F82	0x6C13	#CJK UNIFIED IDEOGRAPH
+0x9F83	0x6C14	#CJK UNIFIED IDEOGRAPH
+0x9F84	0x6C1B	#CJK UNIFIED IDEOGRAPH
+0x9F85	0x6C24	#CJK UNIFIED IDEOGRAPH
+0x9F86	0x6C23	#CJK UNIFIED IDEOGRAPH
+0x9F87	0x6C5E	#CJK UNIFIED IDEOGRAPH
+0x9F88	0x6C55	#CJK UNIFIED IDEOGRAPH
+0x9F89	0x6C62	#CJK UNIFIED IDEOGRAPH
+0x9F8A	0x6C6A	#CJK UNIFIED IDEOGRAPH
+0x9F8B	0x6C82	#CJK UNIFIED IDEOGRAPH
+0x9F8C	0x6C8D	#CJK UNIFIED IDEOGRAPH
+0x9F8D	0x6C9A	#CJK UNIFIED IDEOGRAPH
+0x9F8E	0x6C81	#CJK UNIFIED IDEOGRAPH
+0x9F8F	0x6C9B	#CJK UNIFIED IDEOGRAPH
+0x9F90	0x6C7E	#CJK UNIFIED IDEOGRAPH
+0x9F91	0x6C68	#CJK UNIFIED IDEOGRAPH
+0x9F92	0x6C73	#CJK UNIFIED IDEOGRAPH
+0x9F93	0x6C92	#CJK UNIFIED IDEOGRAPH
+0x9F94	0x6C90	#CJK UNIFIED IDEOGRAPH
+0x9F95	0x6CC4	#CJK UNIFIED IDEOGRAPH
+0x9F96	0x6CF1	#CJK UNIFIED IDEOGRAPH
+0x9F97	0x6CD3	#CJK UNIFIED IDEOGRAPH
+0x9F98	0x6CBD	#CJK UNIFIED IDEOGRAPH
+0x9F99	0x6CD7	#CJK UNIFIED IDEOGRAPH
+0x9F9A	0x6CC5	#CJK UNIFIED IDEOGRAPH
+0x9F9B	0x6CDD	#CJK UNIFIED IDEOGRAPH
+0x9F9C	0x6CAE	#CJK UNIFIED IDEOGRAPH
+0x9F9D	0x6CB1	#CJK UNIFIED IDEOGRAPH
+0x9F9E	0x6CBE	#CJK UNIFIED IDEOGRAPH
+0x9F9F	0x6CBA	#CJK UNIFIED IDEOGRAPH
+0x9FA0	0x6CDB	#CJK UNIFIED IDEOGRAPH
+0x9FA1	0x6CEF	#CJK UNIFIED IDEOGRAPH
+0x9FA2	0x6CD9	#CJK UNIFIED IDEOGRAPH
+0x9FA3	0x6CEA	#CJK UNIFIED IDEOGRAPH
+0x9FA4	0x6D1F	#CJK UNIFIED IDEOGRAPH
+0x9FA5	0x884D	#CJK UNIFIED IDEOGRAPH
+0x9FA6	0x6D36	#CJK UNIFIED IDEOGRAPH
+0x9FA7	0x6D2B	#CJK UNIFIED IDEOGRAPH
+0x9FA8	0x6D3D	#CJK UNIFIED IDEOGRAPH
+0x9FA9	0x6D38	#CJK UNIFIED IDEOGRAPH
+0x9FAA	0x6D19	#CJK UNIFIED IDEOGRAPH
+0x9FAB	0x6D35	#CJK UNIFIED IDEOGRAPH
+0x9FAC	0x6D33	#CJK UNIFIED IDEOGRAPH
+0x9FAD	0x6D12	#CJK UNIFIED IDEOGRAPH
+0x9FAE	0x6D0C	#CJK UNIFIED IDEOGRAPH
+0x9FAF	0x6D63	#CJK UNIFIED IDEOGRAPH
+0x9FB0	0x6D93	#CJK UNIFIED IDEOGRAPH
+0x9FB1	0x6D64	#CJK UNIFIED IDEOGRAPH
+0x9FB2	0x6D5A	#CJK UNIFIED IDEOGRAPH
+0x9FB3	0x6D79	#CJK UNIFIED IDEOGRAPH
+0x9FB4	0x6D59	#CJK UNIFIED IDEOGRAPH
+0x9FB5	0x6D8E	#CJK UNIFIED IDEOGRAPH
+0x9FB6	0x6D95	#CJK UNIFIED IDEOGRAPH
+0x9FB7	0x6FE4	#CJK UNIFIED IDEOGRAPH
+0x9FB8	0x6D85	#CJK UNIFIED IDEOGRAPH
+0x9FB9	0x6DF9	#CJK UNIFIED IDEOGRAPH
+0x9FBA	0x6E15	#CJK UNIFIED IDEOGRAPH
+0x9FBB	0x6E0A	#CJK UNIFIED IDEOGRAPH
+0x9FBC	0x6DB5	#CJK UNIFIED IDEOGRAPH
+0x9FBD	0x6DC7	#CJK UNIFIED IDEOGRAPH
+0x9FBE	0x6DE6	#CJK UNIFIED IDEOGRAPH
+0x9FBF	0x6DB8	#CJK UNIFIED IDEOGRAPH
+0x9FC0	0x6DC6	#CJK UNIFIED IDEOGRAPH
+0x9FC1	0x6DEC	#CJK UNIFIED IDEOGRAPH
+0x9FC2	0x6DDE	#CJK UNIFIED IDEOGRAPH
+0x9FC3	0x6DCC	#CJK UNIFIED IDEOGRAPH
+0x9FC4	0x6DE8	#CJK UNIFIED IDEOGRAPH
+0x9FC5	0x6DD2	#CJK UNIFIED IDEOGRAPH
+0x9FC6	0x6DC5	#CJK UNIFIED IDEOGRAPH
+0x9FC7	0x6DFA	#CJK UNIFIED IDEOGRAPH
+0x9FC8	0x6DD9	#CJK UNIFIED IDEOGRAPH
+0x9FC9	0x6DE4	#CJK UNIFIED IDEOGRAPH
+0x9FCA	0x6DD5	#CJK UNIFIED IDEOGRAPH
+0x9FCB	0x6DEA	#CJK UNIFIED IDEOGRAPH
+0x9FCC	0x6DEE	#CJK UNIFIED IDEOGRAPH
+0x9FCD	0x6E2D	#CJK UNIFIED IDEOGRAPH
+0x9FCE	0x6E6E	#CJK UNIFIED IDEOGRAPH
+0x9FCF	0x6E2E	#CJK UNIFIED IDEOGRAPH
+0x9FD0	0x6E19	#CJK UNIFIED IDEOGRAPH
+0x9FD1	0x6E72	#CJK UNIFIED IDEOGRAPH
+0x9FD2	0x6E5F	#CJK UNIFIED IDEOGRAPH
+0x9FD3	0x6E3E	#CJK UNIFIED IDEOGRAPH
+0x9FD4	0x6E23	#CJK UNIFIED IDEOGRAPH
+0x9FD5	0x6E6B	#CJK UNIFIED IDEOGRAPH
+0x9FD6	0x6E2B	#CJK UNIFIED IDEOGRAPH
+0x9FD7	0x6E76	#CJK UNIFIED IDEOGRAPH
+0x9FD8	0x6E4D	#CJK UNIFIED IDEOGRAPH
+0x9FD9	0x6E1F	#CJK UNIFIED IDEOGRAPH
+0x9FDA	0x6E43	#CJK UNIFIED IDEOGRAPH
+0x9FDB	0x6E3A	#CJK UNIFIED IDEOGRAPH
+0x9FDC	0x6E4E	#CJK UNIFIED IDEOGRAPH
+0x9FDD	0x6E24	#CJK UNIFIED IDEOGRAPH
+0x9FDE	0x6EFF	#CJK UNIFIED IDEOGRAPH
+0x9FDF	0x6E1D	#CJK UNIFIED IDEOGRAPH
+0x9FE0	0x6E38	#CJK UNIFIED IDEOGRAPH
+0x9FE1	0x6E82	#CJK UNIFIED IDEOGRAPH
+0x9FE2	0x6EAA	#CJK UNIFIED IDEOGRAPH
+0x9FE3	0x6E98	#CJK UNIFIED IDEOGRAPH
+0x9FE4	0x6EC9	#CJK UNIFIED IDEOGRAPH
+0x9FE5	0x6EB7	#CJK UNIFIED IDEOGRAPH
+0x9FE6	0x6ED3	#CJK UNIFIED IDEOGRAPH
+0x9FE7	0x6EBD	#CJK UNIFIED IDEOGRAPH
+0x9FE8	0x6EAF	#CJK UNIFIED IDEOGRAPH
+0x9FE9	0x6EC4	#CJK UNIFIED IDEOGRAPH
+0x9FEA	0x6EB2	#CJK UNIFIED IDEOGRAPH
+0x9FEB	0x6ED4	#CJK UNIFIED IDEOGRAPH
+0x9FEC	0x6ED5	#CJK UNIFIED IDEOGRAPH
+0x9FED	0x6E8F	#CJK UNIFIED IDEOGRAPH
+0x9FEE	0x6EA5	#CJK UNIFIED IDEOGRAPH
+0x9FEF	0x6EC2	#CJK UNIFIED IDEOGRAPH
+0x9FF0	0x6E9F	#CJK UNIFIED IDEOGRAPH
+0x9FF1	0x6F41	#CJK UNIFIED IDEOGRAPH
+0x9FF2	0x6F11	#CJK UNIFIED IDEOGRAPH
+0x9FF3	0x704C	#CJK UNIFIED IDEOGRAPH
+0x9FF4	0x6EEC	#CJK UNIFIED IDEOGRAPH
+0x9FF5	0x6EF8	#CJK UNIFIED IDEOGRAPH
+0x9FF6	0x6EFE	#CJK UNIFIED IDEOGRAPH
+0x9FF7	0x6F3F	#CJK UNIFIED IDEOGRAPH
+0x9FF8	0x6EF2	#CJK UNIFIED IDEOGRAPH
+0x9FF9	0x6F31	#CJK UNIFIED IDEOGRAPH
+0x9FFA	0x6EEF	#CJK UNIFIED IDEOGRAPH
+0x9FFB	0x6F32	#CJK UNIFIED IDEOGRAPH
+0x9FFC	0x6ECC	#CJK UNIFIED IDEOGRAPH
+0xE040	0x6F3E	#CJK UNIFIED IDEOGRAPH
+0xE041	0x6F13	#CJK UNIFIED IDEOGRAPH
+0xE042	0x6EF7	#CJK UNIFIED IDEOGRAPH
+0xE043	0x6F86	#CJK UNIFIED IDEOGRAPH
+0xE044	0x6F7A	#CJK UNIFIED IDEOGRAPH
+0xE045	0x6F78	#CJK UNIFIED IDEOGRAPH
+0xE046	0x6F81	#CJK UNIFIED IDEOGRAPH
+0xE047	0x6F80	#CJK UNIFIED IDEOGRAPH
+0xE048	0x6F6F	#CJK UNIFIED IDEOGRAPH
+0xE049	0x6F5B	#CJK UNIFIED IDEOGRAPH
+0xE04A	0x6FF3	#CJK UNIFIED IDEOGRAPH
+0xE04B	0x6F6D	#CJK UNIFIED IDEOGRAPH
+0xE04C	0x6F82	#CJK UNIFIED IDEOGRAPH
+0xE04D	0x6F7C	#CJK UNIFIED IDEOGRAPH
+0xE04E	0x6F58	#CJK UNIFIED IDEOGRAPH
+0xE04F	0x6F8E	#CJK UNIFIED IDEOGRAPH
+0xE050	0x6F91	#CJK UNIFIED IDEOGRAPH
+0xE051	0x6FC2	#CJK UNIFIED IDEOGRAPH
+0xE052	0x6F66	#CJK UNIFIED IDEOGRAPH
+0xE053	0x6FB3	#CJK UNIFIED IDEOGRAPH
+0xE054	0x6FA3	#CJK UNIFIED IDEOGRAPH
+0xE055	0x6FA1	#CJK UNIFIED IDEOGRAPH
+0xE056	0x6FA4	#CJK UNIFIED IDEOGRAPH
+0xE057	0x6FB9	#CJK UNIFIED IDEOGRAPH
+0xE058	0x6FC6	#CJK UNIFIED IDEOGRAPH
+0xE059	0x6FAA	#CJK UNIFIED IDEOGRAPH
+0xE05A	0x6FDF	#CJK UNIFIED IDEOGRAPH
+0xE05B	0x6FD5	#CJK UNIFIED IDEOGRAPH
+0xE05C	0x6FEC	#CJK UNIFIED IDEOGRAPH
+0xE05D	0x6FD4	#CJK UNIFIED IDEOGRAPH
+0xE05E	0x6FD8	#CJK UNIFIED IDEOGRAPH
+0xE05F	0x6FF1	#CJK UNIFIED IDEOGRAPH
+0xE060	0x6FEE	#CJK UNIFIED IDEOGRAPH
+0xE061	0x6FDB	#CJK UNIFIED IDEOGRAPH
+0xE062	0x7009	#CJK UNIFIED IDEOGRAPH
+0xE063	0x700B	#CJK UNIFIED IDEOGRAPH
+0xE064	0x6FFA	#CJK UNIFIED IDEOGRAPH
+0xE065	0x7011	#CJK UNIFIED IDEOGRAPH
+0xE066	0x7001	#CJK UNIFIED IDEOGRAPH
+0xE067	0x700F	#CJK UNIFIED IDEOGRAPH
+0xE068	0x6FFE	#CJK UNIFIED IDEOGRAPH
+0xE069	0x701B	#CJK UNIFIED IDEOGRAPH
+0xE06A	0x701A	#CJK UNIFIED IDEOGRAPH
+0xE06B	0x6F74	#CJK UNIFIED IDEOGRAPH
+0xE06C	0x701D	#CJK UNIFIED IDEOGRAPH
+0xE06D	0x7018	#CJK UNIFIED IDEOGRAPH
+0xE06E	0x701F	#CJK UNIFIED IDEOGRAPH
+0xE06F	0x7030	#CJK UNIFIED IDEOGRAPH
+0xE070	0x703E	#CJK UNIFIED IDEOGRAPH
+0xE071	0x7032	#CJK UNIFIED IDEOGRAPH
+0xE072	0x7051	#CJK UNIFIED IDEOGRAPH
+0xE073	0x7063	#CJK UNIFIED IDEOGRAPH
+0xE074	0x7099	#CJK UNIFIED IDEOGRAPH
+0xE075	0x7092	#CJK UNIFIED IDEOGRAPH
+0xE076	0x70AF	#CJK UNIFIED IDEOGRAPH
+0xE077	0x70F1	#CJK UNIFIED IDEOGRAPH
+0xE078	0x70AC	#CJK UNIFIED IDEOGRAPH
+0xE079	0x70B8	#CJK UNIFIED IDEOGRAPH
+0xE07A	0x70B3	#CJK UNIFIED IDEOGRAPH
+0xE07B	0x70AE	#CJK UNIFIED IDEOGRAPH
+0xE07C	0x70DF	#CJK UNIFIED IDEOGRAPH
+0xE07D	0x70CB	#CJK UNIFIED IDEOGRAPH
+0xE07E	0x70DD	#CJK UNIFIED IDEOGRAPH
+0xE080	0x70D9	#CJK UNIFIED IDEOGRAPH
+0xE081	0x7109	#CJK UNIFIED IDEOGRAPH
+0xE082	0x70FD	#CJK UNIFIED IDEOGRAPH
+0xE083	0x711C	#CJK UNIFIED IDEOGRAPH
+0xE084	0x7119	#CJK UNIFIED IDEOGRAPH
+0xE085	0x7165	#CJK UNIFIED IDEOGRAPH
+0xE086	0x7155	#CJK UNIFIED IDEOGRAPH
+0xE087	0x7188	#CJK UNIFIED IDEOGRAPH
+0xE088	0x7166	#CJK UNIFIED IDEOGRAPH
+0xE089	0x7162	#CJK UNIFIED IDEOGRAPH
+0xE08A	0x714C	#CJK UNIFIED IDEOGRAPH
+0xE08B	0x7156	#CJK UNIFIED IDEOGRAPH
+0xE08C	0x716C	#CJK UNIFIED IDEOGRAPH
+0xE08D	0x718F	#CJK UNIFIED IDEOGRAPH
+0xE08E	0x71FB	#CJK UNIFIED IDEOGRAPH
+0xE08F	0x7184	#CJK UNIFIED IDEOGRAPH
+0xE090	0x7195	#CJK UNIFIED IDEOGRAPH
+0xE091	0x71A8	#CJK UNIFIED IDEOGRAPH
+0xE092	0x71AC	#CJK UNIFIED IDEOGRAPH
+0xE093	0x71D7	#CJK UNIFIED IDEOGRAPH
+0xE094	0x71B9	#CJK UNIFIED IDEOGRAPH
+0xE095	0x71BE	#CJK UNIFIED IDEOGRAPH
+0xE096	0x71D2	#CJK UNIFIED IDEOGRAPH
+0xE097	0x71C9	#CJK UNIFIED IDEOGRAPH
+0xE098	0x71D4	#CJK UNIFIED IDEOGRAPH
+0xE099	0x71CE	#CJK UNIFIED IDEOGRAPH
+0xE09A	0x71E0	#CJK UNIFIED IDEOGRAPH
+0xE09B	0x71EC	#CJK UNIFIED IDEOGRAPH
+0xE09C	0x71E7	#CJK UNIFIED IDEOGRAPH
+0xE09D	0x71F5	#CJK UNIFIED IDEOGRAPH
+0xE09E	0x71FC	#CJK UNIFIED IDEOGRAPH
+0xE09F	0x71F9	#CJK UNIFIED IDEOGRAPH
+0xE0A0	0x71FF	#CJK UNIFIED IDEOGRAPH
+0xE0A1	0x720D	#CJK UNIFIED IDEOGRAPH
+0xE0A2	0x7210	#CJK UNIFIED IDEOGRAPH
+0xE0A3	0x721B	#CJK UNIFIED IDEOGRAPH
+0xE0A4	0x7228	#CJK UNIFIED IDEOGRAPH
+0xE0A5	0x722D	#CJK UNIFIED IDEOGRAPH
+0xE0A6	0x722C	#CJK UNIFIED IDEOGRAPH
+0xE0A7	0x7230	#CJK UNIFIED IDEOGRAPH
+0xE0A8	0x7232	#CJK UNIFIED IDEOGRAPH
+0xE0A9	0x723B	#CJK UNIFIED IDEOGRAPH
+0xE0AA	0x723C	#CJK UNIFIED IDEOGRAPH
+0xE0AB	0x723F	#CJK UNIFIED IDEOGRAPH
+0xE0AC	0x7240	#CJK UNIFIED IDEOGRAPH
+0xE0AD	0x7246	#CJK UNIFIED IDEOGRAPH
+0xE0AE	0x724B	#CJK UNIFIED IDEOGRAPH
+0xE0AF	0x7258	#CJK UNIFIED IDEOGRAPH
+0xE0B0	0x7274	#CJK UNIFIED IDEOGRAPH
+0xE0B1	0x727E	#CJK UNIFIED IDEOGRAPH
+0xE0B2	0x7282	#CJK UNIFIED IDEOGRAPH
+0xE0B3	0x7281	#CJK UNIFIED IDEOGRAPH
+0xE0B4	0x7287	#CJK UNIFIED IDEOGRAPH
+0xE0B5	0x7292	#CJK UNIFIED IDEOGRAPH
+0xE0B6	0x7296	#CJK UNIFIED IDEOGRAPH
+0xE0B7	0x72A2	#CJK UNIFIED IDEOGRAPH
+0xE0B8	0x72A7	#CJK UNIFIED IDEOGRAPH
+0xE0B9	0x72B9	#CJK UNIFIED IDEOGRAPH
+0xE0BA	0x72B2	#CJK UNIFIED IDEOGRAPH
+0xE0BB	0x72C3	#CJK UNIFIED IDEOGRAPH
+0xE0BC	0x72C6	#CJK UNIFIED IDEOGRAPH
+0xE0BD	0x72C4	#CJK UNIFIED IDEOGRAPH
+0xE0BE	0x72CE	#CJK UNIFIED IDEOGRAPH
+0xE0BF	0x72D2	#CJK UNIFIED IDEOGRAPH
+0xE0C0	0x72E2	#CJK UNIFIED IDEOGRAPH
+0xE0C1	0x72E0	#CJK UNIFIED IDEOGRAPH
+0xE0C2	0x72E1	#CJK UNIFIED IDEOGRAPH
+0xE0C3	0x72F9	#CJK UNIFIED IDEOGRAPH
+0xE0C4	0x72F7	#CJK UNIFIED IDEOGRAPH
+0xE0C5	0x500F	#CJK UNIFIED IDEOGRAPH
+0xE0C6	0x7317	#CJK UNIFIED IDEOGRAPH
+0xE0C7	0x730A	#CJK UNIFIED IDEOGRAPH
+0xE0C8	0x731C	#CJK UNIFIED IDEOGRAPH
+0xE0C9	0x7316	#CJK UNIFIED IDEOGRAPH
+0xE0CA	0x731D	#CJK UNIFIED IDEOGRAPH
+0xE0CB	0x7334	#CJK UNIFIED IDEOGRAPH
+0xE0CC	0x732F	#CJK UNIFIED IDEOGRAPH
+0xE0CD	0x7329	#CJK UNIFIED IDEOGRAPH
+0xE0CE	0x7325	#CJK UNIFIED IDEOGRAPH
+0xE0CF	0x733E	#CJK UNIFIED IDEOGRAPH
+0xE0D0	0x734E	#CJK UNIFIED IDEOGRAPH
+0xE0D1	0x734F	#CJK UNIFIED IDEOGRAPH
+0xE0D2	0x9ED8	#CJK UNIFIED IDEOGRAPH
+0xE0D3	0x7357	#CJK UNIFIED IDEOGRAPH
+0xE0D4	0x736A	#CJK UNIFIED IDEOGRAPH
+0xE0D5	0x7368	#CJK UNIFIED IDEOGRAPH
+0xE0D6	0x7370	#CJK UNIFIED IDEOGRAPH
+0xE0D7	0x7378	#CJK UNIFIED IDEOGRAPH
+0xE0D8	0x7375	#CJK UNIFIED IDEOGRAPH
+0xE0D9	0x737B	#CJK UNIFIED IDEOGRAPH
+0xE0DA	0x737A	#CJK UNIFIED IDEOGRAPH
+0xE0DB	0x73C8	#CJK UNIFIED IDEOGRAPH
+0xE0DC	0x73B3	#CJK UNIFIED IDEOGRAPH
+0xE0DD	0x73CE	#CJK UNIFIED IDEOGRAPH
+0xE0DE	0x73BB	#CJK UNIFIED IDEOGRAPH
+0xE0DF	0x73C0	#CJK UNIFIED IDEOGRAPH
+0xE0E0	0x73E5	#CJK UNIFIED IDEOGRAPH
+0xE0E1	0x73EE	#CJK UNIFIED IDEOGRAPH
+0xE0E2	0x73DE	#CJK UNIFIED IDEOGRAPH
+0xE0E3	0x74A2	#CJK UNIFIED IDEOGRAPH
+0xE0E4	0x7405	#CJK UNIFIED IDEOGRAPH
+0xE0E5	0x746F	#CJK UNIFIED IDEOGRAPH
+0xE0E6	0x7425	#CJK UNIFIED IDEOGRAPH
+0xE0E7	0x73F8	#CJK UNIFIED IDEOGRAPH
+0xE0E8	0x7432	#CJK UNIFIED IDEOGRAPH
+0xE0E9	0x743A	#CJK UNIFIED IDEOGRAPH
+0xE0EA	0x7455	#CJK UNIFIED IDEOGRAPH
+0xE0EB	0x743F	#CJK UNIFIED IDEOGRAPH
+0xE0EC	0x745F	#CJK UNIFIED IDEOGRAPH
+0xE0ED	0x7459	#CJK UNIFIED IDEOGRAPH
+0xE0EE	0x7441	#CJK UNIFIED IDEOGRAPH
+0xE0EF	0x745C	#CJK UNIFIED IDEOGRAPH
+0xE0F0	0x7469	#CJK UNIFIED IDEOGRAPH
+0xE0F1	0x7470	#CJK UNIFIED IDEOGRAPH
+0xE0F2	0x7463	#CJK UNIFIED IDEOGRAPH
+0xE0F3	0x746A	#CJK UNIFIED IDEOGRAPH
+0xE0F4	0x7476	#CJK UNIFIED IDEOGRAPH
+0xE0F5	0x747E	#CJK UNIFIED IDEOGRAPH
+0xE0F6	0x748B	#CJK UNIFIED IDEOGRAPH
+0xE0F7	0x749E	#CJK UNIFIED IDEOGRAPH
+0xE0F8	0x74A7	#CJK UNIFIED IDEOGRAPH
+0xE0F9	0x74CA	#CJK UNIFIED IDEOGRAPH
+0xE0FA	0x74CF	#CJK UNIFIED IDEOGRAPH
+0xE0FB	0x74D4	#CJK UNIFIED IDEOGRAPH
+0xE0FC	0x73F1	#CJK UNIFIED IDEOGRAPH
+0xE140	0x74E0	#CJK UNIFIED IDEOGRAPH
+0xE141	0x74E3	#CJK UNIFIED IDEOGRAPH
+0xE142	0x74E7	#CJK UNIFIED IDEOGRAPH
+0xE143	0x74E9	#CJK UNIFIED IDEOGRAPH
+0xE144	0x74EE	#CJK UNIFIED IDEOGRAPH
+0xE145	0x74F2	#CJK UNIFIED IDEOGRAPH
+0xE146	0x74F0	#CJK UNIFIED IDEOGRAPH
+0xE147	0x74F1	#CJK UNIFIED IDEOGRAPH
+0xE148	0x74F8	#CJK UNIFIED IDEOGRAPH
+0xE149	0x74F7	#CJK UNIFIED IDEOGRAPH
+0xE14A	0x7504	#CJK UNIFIED IDEOGRAPH
+0xE14B	0x7503	#CJK UNIFIED IDEOGRAPH
+0xE14C	0x7505	#CJK UNIFIED IDEOGRAPH
+0xE14D	0x750C	#CJK UNIFIED IDEOGRAPH
+0xE14E	0x750E	#CJK UNIFIED IDEOGRAPH
+0xE14F	0x750D	#CJK UNIFIED IDEOGRAPH
+0xE150	0x7515	#CJK UNIFIED IDEOGRAPH
+0xE151	0x7513	#CJK UNIFIED IDEOGRAPH
+0xE152	0x751E	#CJK UNIFIED IDEOGRAPH
+0xE153	0x7526	#CJK UNIFIED IDEOGRAPH
+0xE154	0x752C	#CJK UNIFIED IDEOGRAPH
+0xE155	0x753C	#CJK UNIFIED IDEOGRAPH
+0xE156	0x7544	#CJK UNIFIED IDEOGRAPH
+0xE157	0x754D	#CJK UNIFIED IDEOGRAPH
+0xE158	0x754A	#CJK UNIFIED IDEOGRAPH
+0xE159	0x7549	#CJK UNIFIED IDEOGRAPH
+0xE15A	0x755B	#CJK UNIFIED IDEOGRAPH
+0xE15B	0x7546	#CJK UNIFIED IDEOGRAPH
+0xE15C	0x755A	#CJK UNIFIED IDEOGRAPH
+0xE15D	0x7569	#CJK UNIFIED IDEOGRAPH
+0xE15E	0x7564	#CJK UNIFIED IDEOGRAPH
+0xE15F	0x7567	#CJK UNIFIED IDEOGRAPH
+0xE160	0x756B	#CJK UNIFIED IDEOGRAPH
+0xE161	0x756D	#CJK UNIFIED IDEOGRAPH
+0xE162	0x7578	#CJK UNIFIED IDEOGRAPH
+0xE163	0x7576	#CJK UNIFIED IDEOGRAPH
+0xE164	0x7586	#CJK UNIFIED IDEOGRAPH
+0xE165	0x7587	#CJK UNIFIED IDEOGRAPH
+0xE166	0x7574	#CJK UNIFIED IDEOGRAPH
+0xE167	0x758A	#CJK UNIFIED IDEOGRAPH
+0xE168	0x7589	#CJK UNIFIED IDEOGRAPH
+0xE169	0x7582	#CJK UNIFIED IDEOGRAPH
+0xE16A	0x7594	#CJK UNIFIED IDEOGRAPH
+0xE16B	0x759A	#CJK UNIFIED IDEOGRAPH
+0xE16C	0x759D	#CJK UNIFIED IDEOGRAPH
+0xE16D	0x75A5	#CJK UNIFIED IDEOGRAPH
+0xE16E	0x75A3	#CJK UNIFIED IDEOGRAPH
+0xE16F	0x75C2	#CJK UNIFIED IDEOGRAPH
+0xE170	0x75B3	#CJK UNIFIED IDEOGRAPH
+0xE171	0x75C3	#CJK UNIFIED IDEOGRAPH
+0xE172	0x75B5	#CJK UNIFIED IDEOGRAPH
+0xE173	0x75BD	#CJK UNIFIED IDEOGRAPH
+0xE174	0x75B8	#CJK UNIFIED IDEOGRAPH
+0xE175	0x75BC	#CJK UNIFIED IDEOGRAPH
+0xE176	0x75B1	#CJK UNIFIED IDEOGRAPH
+0xE177	0x75CD	#CJK UNIFIED IDEOGRAPH
+0xE178	0x75CA	#CJK UNIFIED IDEOGRAPH
+0xE179	0x75D2	#CJK UNIFIED IDEOGRAPH
+0xE17A	0x75D9	#CJK UNIFIED IDEOGRAPH
+0xE17B	0x75E3	#CJK UNIFIED IDEOGRAPH
+0xE17C	0x75DE	#CJK UNIFIED IDEOGRAPH
+0xE17D	0x75FE	#CJK UNIFIED IDEOGRAPH
+0xE17E	0x75FF	#CJK UNIFIED IDEOGRAPH
+0xE180	0x75FC	#CJK UNIFIED IDEOGRAPH
+0xE181	0x7601	#CJK UNIFIED IDEOGRAPH
+0xE182	0x75F0	#CJK UNIFIED IDEOGRAPH
+0xE183	0x75FA	#CJK UNIFIED IDEOGRAPH
+0xE184	0x75F2	#CJK UNIFIED IDEOGRAPH
+0xE185	0x75F3	#CJK UNIFIED IDEOGRAPH
+0xE186	0x760B	#CJK UNIFIED IDEOGRAPH
+0xE187	0x760D	#CJK UNIFIED IDEOGRAPH
+0xE188	0x7609	#CJK UNIFIED IDEOGRAPH
+0xE189	0x761F	#CJK UNIFIED IDEOGRAPH
+0xE18A	0x7627	#CJK UNIFIED IDEOGRAPH
+0xE18B	0x7620	#CJK UNIFIED IDEOGRAPH
+0xE18C	0x7621	#CJK UNIFIED IDEOGRAPH
+0xE18D	0x7622	#CJK UNIFIED IDEOGRAPH
+0xE18E	0x7624	#CJK UNIFIED IDEOGRAPH
+0xE18F	0x7634	#CJK UNIFIED IDEOGRAPH
+0xE190	0x7630	#CJK UNIFIED IDEOGRAPH
+0xE191	0x763B	#CJK UNIFIED IDEOGRAPH
+0xE192	0x7647	#CJK UNIFIED IDEOGRAPH
+0xE193	0x7648	#CJK UNIFIED IDEOGRAPH
+0xE194	0x7646	#CJK UNIFIED IDEOGRAPH
+0xE195	0x765C	#CJK UNIFIED IDEOGRAPH
+0xE196	0x7658	#CJK UNIFIED IDEOGRAPH
+0xE197	0x7661	#CJK UNIFIED IDEOGRAPH
+0xE198	0x7662	#CJK UNIFIED IDEOGRAPH
+0xE199	0x7668	#CJK UNIFIED IDEOGRAPH
+0xE19A	0x7669	#CJK UNIFIED IDEOGRAPH
+0xE19B	0x766A	#CJK UNIFIED IDEOGRAPH
+0xE19C	0x7667	#CJK UNIFIED IDEOGRAPH
+0xE19D	0x766C	#CJK UNIFIED IDEOGRAPH
+0xE19E	0x7670	#CJK UNIFIED IDEOGRAPH
+0xE19F	0x7672	#CJK UNIFIED IDEOGRAPH
+0xE1A0	0x7676	#CJK UNIFIED IDEOGRAPH
+0xE1A1	0x7678	#CJK UNIFIED IDEOGRAPH
+0xE1A2	0x767C	#CJK UNIFIED IDEOGRAPH
+0xE1A3	0x7680	#CJK UNIFIED IDEOGRAPH
+0xE1A4	0x7683	#CJK UNIFIED IDEOGRAPH
+0xE1A5	0x7688	#CJK UNIFIED IDEOGRAPH
+0xE1A6	0x768B	#CJK UNIFIED IDEOGRAPH
+0xE1A7	0x768E	#CJK UNIFIED IDEOGRAPH
+0xE1A8	0x7696	#CJK UNIFIED IDEOGRAPH
+0xE1A9	0x7693	#CJK UNIFIED IDEOGRAPH
+0xE1AA	0x7699	#CJK UNIFIED IDEOGRAPH
+0xE1AB	0x769A	#CJK UNIFIED IDEOGRAPH
+0xE1AC	0x76B0	#CJK UNIFIED IDEOGRAPH
+0xE1AD	0x76B4	#CJK UNIFIED IDEOGRAPH
+0xE1AE	0x76B8	#CJK UNIFIED IDEOGRAPH
+0xE1AF	0x76B9	#CJK UNIFIED IDEOGRAPH
+0xE1B0	0x76BA	#CJK UNIFIED IDEOGRAPH
+0xE1B1	0x76C2	#CJK UNIFIED IDEOGRAPH
+0xE1B2	0x76CD	#CJK UNIFIED IDEOGRAPH
+0xE1B3	0x76D6	#CJK UNIFIED IDEOGRAPH
+0xE1B4	0x76D2	#CJK UNIFIED IDEOGRAPH
+0xE1B5	0x76DE	#CJK UNIFIED IDEOGRAPH
+0xE1B6	0x76E1	#CJK UNIFIED IDEOGRAPH
+0xE1B7	0x76E5	#CJK UNIFIED IDEOGRAPH
+0xE1B8	0x76E7	#CJK UNIFIED IDEOGRAPH
+0xE1B9	0x76EA	#CJK UNIFIED IDEOGRAPH
+0xE1BA	0x862F	#CJK UNIFIED IDEOGRAPH
+0xE1BB	0x76FB	#CJK UNIFIED IDEOGRAPH
+0xE1BC	0x7708	#CJK UNIFIED IDEOGRAPH
+0xE1BD	0x7707	#CJK UNIFIED IDEOGRAPH
+0xE1BE	0x7704	#CJK UNIFIED IDEOGRAPH
+0xE1BF	0x7729	#CJK UNIFIED IDEOGRAPH
+0xE1C0	0x7724	#CJK UNIFIED IDEOGRAPH
+0xE1C1	0x771E	#CJK UNIFIED IDEOGRAPH
+0xE1C2	0x7725	#CJK UNIFIED IDEOGRAPH
+0xE1C3	0x7726	#CJK UNIFIED IDEOGRAPH
+0xE1C4	0x771B	#CJK UNIFIED IDEOGRAPH
+0xE1C5	0x7737	#CJK UNIFIED IDEOGRAPH
+0xE1C6	0x7738	#CJK UNIFIED IDEOGRAPH
+0xE1C7	0x7747	#CJK UNIFIED IDEOGRAPH
+0xE1C8	0x775A	#CJK UNIFIED IDEOGRAPH
+0xE1C9	0x7768	#CJK UNIFIED IDEOGRAPH
+0xE1CA	0x776B	#CJK UNIFIED IDEOGRAPH
+0xE1CB	0x775B	#CJK UNIFIED IDEOGRAPH
+0xE1CC	0x7765	#CJK UNIFIED IDEOGRAPH
+0xE1CD	0x777F	#CJK UNIFIED IDEOGRAPH
+0xE1CE	0x777E	#CJK UNIFIED IDEOGRAPH
+0xE1CF	0x7779	#CJK UNIFIED IDEOGRAPH
+0xE1D0	0x778E	#CJK UNIFIED IDEOGRAPH
+0xE1D1	0x778B	#CJK UNIFIED IDEOGRAPH
+0xE1D2	0x7791	#CJK UNIFIED IDEOGRAPH
+0xE1D3	0x77A0	#CJK UNIFIED IDEOGRAPH
+0xE1D4	0x779E	#CJK UNIFIED IDEOGRAPH
+0xE1D5	0x77B0	#CJK UNIFIED IDEOGRAPH
+0xE1D6	0x77B6	#CJK UNIFIED IDEOGRAPH
+0xE1D7	0x77B9	#CJK UNIFIED IDEOGRAPH
+0xE1D8	0x77BF	#CJK UNIFIED IDEOGRAPH
+0xE1D9	0x77BC	#CJK UNIFIED IDEOGRAPH
+0xE1DA	0x77BD	#CJK UNIFIED IDEOGRAPH
+0xE1DB	0x77BB	#CJK UNIFIED IDEOGRAPH
+0xE1DC	0x77C7	#CJK UNIFIED IDEOGRAPH
+0xE1DD	0x77CD	#CJK UNIFIED IDEOGRAPH
+0xE1DE	0x77D7	#CJK UNIFIED IDEOGRAPH
+0xE1DF	0x77DA	#CJK UNIFIED IDEOGRAPH
+0xE1E0	0x77DC	#CJK UNIFIED IDEOGRAPH
+0xE1E1	0x77E3	#CJK UNIFIED IDEOGRAPH
+0xE1E2	0x77EE	#CJK UNIFIED IDEOGRAPH
+0xE1E3	0x77FC	#CJK UNIFIED IDEOGRAPH
+0xE1E4	0x780C	#CJK UNIFIED IDEOGRAPH
+0xE1E5	0x7812	#CJK UNIFIED IDEOGRAPH
+0xE1E6	0x7926	#CJK UNIFIED IDEOGRAPH
+0xE1E7	0x7820	#CJK UNIFIED IDEOGRAPH
+0xE1E8	0x792A	#CJK UNIFIED IDEOGRAPH
+0xE1E9	0x7845	#CJK UNIFIED IDEOGRAPH
+0xE1EA	0x788E	#CJK UNIFIED IDEOGRAPH
+0xE1EB	0x7874	#CJK UNIFIED IDEOGRAPH
+0xE1EC	0x7886	#CJK UNIFIED IDEOGRAPH
+0xE1ED	0x787C	#CJK UNIFIED IDEOGRAPH
+0xE1EE	0x789A	#CJK UNIFIED IDEOGRAPH
+0xE1EF	0x788C	#CJK UNIFIED IDEOGRAPH
+0xE1F0	0x78A3	#CJK UNIFIED IDEOGRAPH
+0xE1F1	0x78B5	#CJK UNIFIED IDEOGRAPH
+0xE1F2	0x78AA	#CJK UNIFIED IDEOGRAPH
+0xE1F3	0x78AF	#CJK UNIFIED IDEOGRAPH
+0xE1F4	0x78D1	#CJK UNIFIED IDEOGRAPH
+0xE1F5	0x78C6	#CJK UNIFIED IDEOGRAPH
+0xE1F6	0x78CB	#CJK UNIFIED IDEOGRAPH
+0xE1F7	0x78D4	#CJK UNIFIED IDEOGRAPH
+0xE1F8	0x78BE	#CJK UNIFIED IDEOGRAPH
+0xE1F9	0x78BC	#CJK UNIFIED IDEOGRAPH
+0xE1FA	0x78C5	#CJK UNIFIED IDEOGRAPH
+0xE1FB	0x78CA	#CJK UNIFIED IDEOGRAPH
+0xE1FC	0x78EC	#CJK UNIFIED IDEOGRAPH
+0xE240	0x78E7	#CJK UNIFIED IDEOGRAPH
+0xE241	0x78DA	#CJK UNIFIED IDEOGRAPH
+0xE242	0x78FD	#CJK UNIFIED IDEOGRAPH
+0xE243	0x78F4	#CJK UNIFIED IDEOGRAPH
+0xE244	0x7907	#CJK UNIFIED IDEOGRAPH
+0xE245	0x7912	#CJK UNIFIED IDEOGRAPH
+0xE246	0x7911	#CJK UNIFIED IDEOGRAPH
+0xE247	0x7919	#CJK UNIFIED IDEOGRAPH
+0xE248	0x792C	#CJK UNIFIED IDEOGRAPH
+0xE249	0x792B	#CJK UNIFIED IDEOGRAPH
+0xE24A	0x7940	#CJK UNIFIED IDEOGRAPH
+0xE24B	0x7960	#CJK UNIFIED IDEOGRAPH
+0xE24C	0x7957	#CJK UNIFIED IDEOGRAPH
+0xE24D	0x795F	#CJK UNIFIED IDEOGRAPH
+0xE24E	0x795A	#CJK UNIFIED IDEOGRAPH
+0xE24F	0x7955	#CJK UNIFIED IDEOGRAPH
+0xE250	0x7953	#CJK UNIFIED IDEOGRAPH
+0xE251	0x797A	#CJK UNIFIED IDEOGRAPH
+0xE252	0x797F	#CJK UNIFIED IDEOGRAPH
+0xE253	0x798A	#CJK UNIFIED IDEOGRAPH
+0xE254	0x799D	#CJK UNIFIED IDEOGRAPH
+0xE255	0x79A7	#CJK UNIFIED IDEOGRAPH
+0xE256	0x9F4B	#CJK UNIFIED IDEOGRAPH
+0xE257	0x79AA	#CJK UNIFIED IDEOGRAPH
+0xE258	0x79AE	#CJK UNIFIED IDEOGRAPH
+0xE259	0x79B3	#CJK UNIFIED IDEOGRAPH
+0xE25A	0x79B9	#CJK UNIFIED IDEOGRAPH
+0xE25B	0x79BA	#CJK UNIFIED IDEOGRAPH
+0xE25C	0x79C9	#CJK UNIFIED IDEOGRAPH
+0xE25D	0x79D5	#CJK UNIFIED IDEOGRAPH
+0xE25E	0x79E7	#CJK UNIFIED IDEOGRAPH
+0xE25F	0x79EC	#CJK UNIFIED IDEOGRAPH
+0xE260	0x79E1	#CJK UNIFIED IDEOGRAPH
+0xE261	0x79E3	#CJK UNIFIED IDEOGRAPH
+0xE262	0x7A08	#CJK UNIFIED IDEOGRAPH
+0xE263	0x7A0D	#CJK UNIFIED IDEOGRAPH
+0xE264	0x7A18	#CJK UNIFIED IDEOGRAPH
+0xE265	0x7A19	#CJK UNIFIED IDEOGRAPH
+0xE266	0x7A20	#CJK UNIFIED IDEOGRAPH
+0xE267	0x7A1F	#CJK UNIFIED IDEOGRAPH
+0xE268	0x7980	#CJK UNIFIED IDEOGRAPH
+0xE269	0x7A31	#CJK UNIFIED IDEOGRAPH
+0xE26A	0x7A3B	#CJK UNIFIED IDEOGRAPH
+0xE26B	0x7A3E	#CJK UNIFIED IDEOGRAPH
+0xE26C	0x7A37	#CJK UNIFIED IDEOGRAPH
+0xE26D	0x7A43	#CJK UNIFIED IDEOGRAPH
+0xE26E	0x7A57	#CJK UNIFIED IDEOGRAPH
+0xE26F	0x7A49	#CJK UNIFIED IDEOGRAPH
+0xE270	0x7A61	#CJK UNIFIED IDEOGRAPH
+0xE271	0x7A62	#CJK UNIFIED IDEOGRAPH
+0xE272	0x7A69	#CJK UNIFIED IDEOGRAPH
+0xE273	0x9F9D	#CJK UNIFIED IDEOGRAPH
+0xE274	0x7A70	#CJK UNIFIED IDEOGRAPH
+0xE275	0x7A79	#CJK UNIFIED IDEOGRAPH
+0xE276	0x7A7D	#CJK UNIFIED IDEOGRAPH
+0xE277	0x7A88	#CJK UNIFIED IDEOGRAPH
+0xE278	0x7A97	#CJK UNIFIED IDEOGRAPH
+0xE279	0x7A95	#CJK UNIFIED IDEOGRAPH
+0xE27A	0x7A98	#CJK UNIFIED IDEOGRAPH
+0xE27B	0x7A96	#CJK UNIFIED IDEOGRAPH
+0xE27C	0x7AA9	#CJK UNIFIED IDEOGRAPH
+0xE27D	0x7AC8	#CJK UNIFIED IDEOGRAPH
+0xE27E	0x7AB0	#CJK UNIFIED IDEOGRAPH
+0xE280	0x7AB6	#CJK UNIFIED IDEOGRAPH
+0xE281	0x7AC5	#CJK UNIFIED IDEOGRAPH
+0xE282	0x7AC4	#CJK UNIFIED IDEOGRAPH
+0xE283	0x7ABF	#CJK UNIFIED IDEOGRAPH
+0xE284	0x9083	#CJK UNIFIED IDEOGRAPH
+0xE285	0x7AC7	#CJK UNIFIED IDEOGRAPH
+0xE286	0x7ACA	#CJK UNIFIED IDEOGRAPH
+0xE287	0x7ACD	#CJK UNIFIED IDEOGRAPH
+0xE288	0x7ACF	#CJK UNIFIED IDEOGRAPH
+0xE289	0x7AD5	#CJK UNIFIED IDEOGRAPH
+0xE28A	0x7AD3	#CJK UNIFIED IDEOGRAPH
+0xE28B	0x7AD9	#CJK UNIFIED IDEOGRAPH
+0xE28C	0x7ADA	#CJK UNIFIED IDEOGRAPH
+0xE28D	0x7ADD	#CJK UNIFIED IDEOGRAPH
+0xE28E	0x7AE1	#CJK UNIFIED IDEOGRAPH
+0xE28F	0x7AE2	#CJK UNIFIED IDEOGRAPH
+0xE290	0x7AE6	#CJK UNIFIED IDEOGRAPH
+0xE291	0x7AED	#CJK UNIFIED IDEOGRAPH
+0xE292	0x7AF0	#CJK UNIFIED IDEOGRAPH
+0xE293	0x7B02	#CJK UNIFIED IDEOGRAPH
+0xE294	0x7B0F	#CJK UNIFIED IDEOGRAPH
+0xE295	0x7B0A	#CJK UNIFIED IDEOGRAPH
+0xE296	0x7B06	#CJK UNIFIED IDEOGRAPH
+0xE297	0x7B33	#CJK UNIFIED IDEOGRAPH
+0xE298	0x7B18	#CJK UNIFIED IDEOGRAPH
+0xE299	0x7B19	#CJK UNIFIED IDEOGRAPH
+0xE29A	0x7B1E	#CJK UNIFIED IDEOGRAPH
+0xE29B	0x7B35	#CJK UNIFIED IDEOGRAPH
+0xE29C	0x7B28	#CJK UNIFIED IDEOGRAPH
+0xE29D	0x7B36	#CJK UNIFIED IDEOGRAPH
+0xE29E	0x7B50	#CJK UNIFIED IDEOGRAPH
+0xE29F	0x7B7A	#CJK UNIFIED IDEOGRAPH
+0xE2A0	0x7B04	#CJK UNIFIED IDEOGRAPH
+0xE2A1	0x7B4D	#CJK UNIFIED IDEOGRAPH
+0xE2A2	0x7B0B	#CJK UNIFIED IDEOGRAPH
+0xE2A3	0x7B4C	#CJK UNIFIED IDEOGRAPH
+0xE2A4	0x7B45	#CJK UNIFIED IDEOGRAPH
+0xE2A5	0x7B75	#CJK UNIFIED IDEOGRAPH
+0xE2A6	0x7B65	#CJK UNIFIED IDEOGRAPH
+0xE2A7	0x7B74	#CJK UNIFIED IDEOGRAPH
+0xE2A8	0x7B67	#CJK UNIFIED IDEOGRAPH
+0xE2A9	0x7B70	#CJK UNIFIED IDEOGRAPH
+0xE2AA	0x7B71	#CJK UNIFIED IDEOGRAPH
+0xE2AB	0x7B6C	#CJK UNIFIED IDEOGRAPH
+0xE2AC	0x7B6E	#CJK UNIFIED IDEOGRAPH
+0xE2AD	0x7B9D	#CJK UNIFIED IDEOGRAPH
+0xE2AE	0x7B98	#CJK UNIFIED IDEOGRAPH
+0xE2AF	0x7B9F	#CJK UNIFIED IDEOGRAPH
+0xE2B0	0x7B8D	#CJK UNIFIED IDEOGRAPH
+0xE2B1	0x7B9C	#CJK UNIFIED IDEOGRAPH
+0xE2B2	0x7B9A	#CJK UNIFIED IDEOGRAPH
+0xE2B3	0x7B8B	#CJK UNIFIED IDEOGRAPH
+0xE2B4	0x7B92	#CJK UNIFIED IDEOGRAPH
+0xE2B5	0x7B8F	#CJK UNIFIED IDEOGRAPH
+0xE2B6	0x7B5D	#CJK UNIFIED IDEOGRAPH
+0xE2B7	0x7B99	#CJK UNIFIED IDEOGRAPH
+0xE2B8	0x7BCB	#CJK UNIFIED IDEOGRAPH
+0xE2B9	0x7BC1	#CJK UNIFIED IDEOGRAPH
+0xE2BA	0x7BCC	#CJK UNIFIED IDEOGRAPH
+0xE2BB	0x7BCF	#CJK UNIFIED IDEOGRAPH
+0xE2BC	0x7BB4	#CJK UNIFIED IDEOGRAPH
+0xE2BD	0x7BC6	#CJK UNIFIED IDEOGRAPH
+0xE2BE	0x7BDD	#CJK UNIFIED IDEOGRAPH
+0xE2BF	0x7BE9	#CJK UNIFIED IDEOGRAPH
+0xE2C0	0x7C11	#CJK UNIFIED IDEOGRAPH
+0xE2C1	0x7C14	#CJK UNIFIED IDEOGRAPH
+0xE2C2	0x7BE6	#CJK UNIFIED IDEOGRAPH
+0xE2C3	0x7BE5	#CJK UNIFIED IDEOGRAPH
+0xE2C4	0x7C60	#CJK UNIFIED IDEOGRAPH
+0xE2C5	0x7C00	#CJK UNIFIED IDEOGRAPH
+0xE2C6	0x7C07	#CJK UNIFIED IDEOGRAPH
+0xE2C7	0x7C13	#CJK UNIFIED IDEOGRAPH
+0xE2C8	0x7BF3	#CJK UNIFIED IDEOGRAPH
+0xE2C9	0x7BF7	#CJK UNIFIED IDEOGRAPH
+0xE2CA	0x7C17	#CJK UNIFIED IDEOGRAPH
+0xE2CB	0x7C0D	#CJK UNIFIED IDEOGRAPH
+0xE2CC	0x7BF6	#CJK UNIFIED IDEOGRAPH
+0xE2CD	0x7C23	#CJK UNIFIED IDEOGRAPH
+0xE2CE	0x7C27	#CJK UNIFIED IDEOGRAPH
+0xE2CF	0x7C2A	#CJK UNIFIED IDEOGRAPH
+0xE2D0	0x7C1F	#CJK UNIFIED IDEOGRAPH
+0xE2D1	0x7C37	#CJK UNIFIED IDEOGRAPH
+0xE2D2	0x7C2B	#CJK UNIFIED IDEOGRAPH
+0xE2D3	0x7C3D	#CJK UNIFIED IDEOGRAPH
+0xE2D4	0x7C4C	#CJK UNIFIED IDEOGRAPH
+0xE2D5	0x7C43	#CJK UNIFIED IDEOGRAPH
+0xE2D6	0x7C54	#CJK UNIFIED IDEOGRAPH
+0xE2D7	0x7C4F	#CJK UNIFIED IDEOGRAPH
+0xE2D8	0x7C40	#CJK UNIFIED IDEOGRAPH
+0xE2D9	0x7C50	#CJK UNIFIED IDEOGRAPH
+0xE2DA	0x7C58	#CJK UNIFIED IDEOGRAPH
+0xE2DB	0x7C5F	#CJK UNIFIED IDEOGRAPH
+0xE2DC	0x7C64	#CJK UNIFIED IDEOGRAPH
+0xE2DD	0x7C56	#CJK UNIFIED IDEOGRAPH
+0xE2DE	0x7C65	#CJK UNIFIED IDEOGRAPH
+0xE2DF	0x7C6C	#CJK UNIFIED IDEOGRAPH
+0xE2E0	0x7C75	#CJK UNIFIED IDEOGRAPH
+0xE2E1	0x7C83	#CJK UNIFIED IDEOGRAPH
+0xE2E2	0x7C90	#CJK UNIFIED IDEOGRAPH
+0xE2E3	0x7CA4	#CJK UNIFIED IDEOGRAPH
+0xE2E4	0x7CAD	#CJK UNIFIED IDEOGRAPH
+0xE2E5	0x7CA2	#CJK UNIFIED IDEOGRAPH
+0xE2E6	0x7CAB	#CJK UNIFIED IDEOGRAPH
+0xE2E7	0x7CA1	#CJK UNIFIED IDEOGRAPH
+0xE2E8	0x7CA8	#CJK UNIFIED IDEOGRAPH
+0xE2E9	0x7CB3	#CJK UNIFIED IDEOGRAPH
+0xE2EA	0x7CB2	#CJK UNIFIED IDEOGRAPH
+0xE2EB	0x7CB1	#CJK UNIFIED IDEOGRAPH
+0xE2EC	0x7CAE	#CJK UNIFIED IDEOGRAPH
+0xE2ED	0x7CB9	#CJK UNIFIED IDEOGRAPH
+0xE2EE	0x7CBD	#CJK UNIFIED IDEOGRAPH
+0xE2EF	0x7CC0	#CJK UNIFIED IDEOGRAPH
+0xE2F0	0x7CC5	#CJK UNIFIED IDEOGRAPH
+0xE2F1	0x7CC2	#CJK UNIFIED IDEOGRAPH
+0xE2F2	0x7CD8	#CJK UNIFIED IDEOGRAPH
+0xE2F3	0x7CD2	#CJK UNIFIED IDEOGRAPH
+0xE2F4	0x7CDC	#CJK UNIFIED IDEOGRAPH
+0xE2F5	0x7CE2	#CJK UNIFIED IDEOGRAPH
+0xE2F6	0x9B3B	#CJK UNIFIED IDEOGRAPH
+0xE2F7	0x7CEF	#CJK UNIFIED IDEOGRAPH
+0xE2F8	0x7CF2	#CJK UNIFIED IDEOGRAPH
+0xE2F9	0x7CF4	#CJK UNIFIED IDEOGRAPH
+0xE2FA	0x7CF6	#CJK UNIFIED IDEOGRAPH
+0xE2FB	0x7CFA	#CJK UNIFIED IDEOGRAPH
+0xE2FC	0x7D06	#CJK UNIFIED IDEOGRAPH
+0xE340	0x7D02	#CJK UNIFIED IDEOGRAPH
+0xE341	0x7D1C	#CJK UNIFIED IDEOGRAPH
+0xE342	0x7D15	#CJK UNIFIED IDEOGRAPH
+0xE343	0x7D0A	#CJK UNIFIED IDEOGRAPH
+0xE344	0x7D45	#CJK UNIFIED IDEOGRAPH
+0xE345	0x7D4B	#CJK UNIFIED IDEOGRAPH
+0xE346	0x7D2E	#CJK UNIFIED IDEOGRAPH
+0xE347	0x7D32	#CJK UNIFIED IDEOGRAPH
+0xE348	0x7D3F	#CJK UNIFIED IDEOGRAPH
+0xE349	0x7D35	#CJK UNIFIED IDEOGRAPH
+0xE34A	0x7D46	#CJK UNIFIED IDEOGRAPH
+0xE34B	0x7D73	#CJK UNIFIED IDEOGRAPH
+0xE34C	0x7D56	#CJK UNIFIED IDEOGRAPH
+0xE34D	0x7D4E	#CJK UNIFIED IDEOGRAPH
+0xE34E	0x7D72	#CJK UNIFIED IDEOGRAPH
+0xE34F	0x7D68	#CJK UNIFIED IDEOGRAPH
+0xE350	0x7D6E	#CJK UNIFIED IDEOGRAPH
+0xE351	0x7D4F	#CJK UNIFIED IDEOGRAPH
+0xE352	0x7D63	#CJK UNIFIED IDEOGRAPH
+0xE353	0x7D93	#CJK UNIFIED IDEOGRAPH
+0xE354	0x7D89	#CJK UNIFIED IDEOGRAPH
+0xE355	0x7D5B	#CJK UNIFIED IDEOGRAPH
+0xE356	0x7D8F	#CJK UNIFIED IDEOGRAPH
+0xE357	0x7D7D	#CJK UNIFIED IDEOGRAPH
+0xE358	0x7D9B	#CJK UNIFIED IDEOGRAPH
+0xE359	0x7DBA	#CJK UNIFIED IDEOGRAPH
+0xE35A	0x7DAE	#CJK UNIFIED IDEOGRAPH
+0xE35B	0x7DA3	#CJK UNIFIED IDEOGRAPH
+0xE35C	0x7DB5	#CJK UNIFIED IDEOGRAPH
+0xE35D	0x7DC7	#CJK UNIFIED IDEOGRAPH
+0xE35E	0x7DBD	#CJK UNIFIED IDEOGRAPH
+0xE35F	0x7DAB	#CJK UNIFIED IDEOGRAPH
+0xE360	0x7E3D	#CJK UNIFIED IDEOGRAPH
+0xE361	0x7DA2	#CJK UNIFIED IDEOGRAPH
+0xE362	0x7DAF	#CJK UNIFIED IDEOGRAPH
+0xE363	0x7DDC	#CJK UNIFIED IDEOGRAPH
+0xE364	0x7DB8	#CJK UNIFIED IDEOGRAPH
+0xE365	0x7D9F	#CJK UNIFIED IDEOGRAPH
+0xE366	0x7DB0	#CJK UNIFIED IDEOGRAPH
+0xE367	0x7DD8	#CJK UNIFIED IDEOGRAPH
+0xE368	0x7DDD	#CJK UNIFIED IDEOGRAPH
+0xE369	0x7DE4	#CJK UNIFIED IDEOGRAPH
+0xE36A	0x7DDE	#CJK UNIFIED IDEOGRAPH
+0xE36B	0x7DFB	#CJK UNIFIED IDEOGRAPH
+0xE36C	0x7DF2	#CJK UNIFIED IDEOGRAPH
+0xE36D	0x7DE1	#CJK UNIFIED IDEOGRAPH
+0xE36E	0x7E05	#CJK UNIFIED IDEOGRAPH
+0xE36F	0x7E0A	#CJK UNIFIED IDEOGRAPH
+0xE370	0x7E23	#CJK UNIFIED IDEOGRAPH
+0xE371	0x7E21	#CJK UNIFIED IDEOGRAPH
+0xE372	0x7E12	#CJK UNIFIED IDEOGRAPH
+0xE373	0x7E31	#CJK UNIFIED IDEOGRAPH
+0xE374	0x7E1F	#CJK UNIFIED IDEOGRAPH
+0xE375	0x7E09	#CJK UNIFIED IDEOGRAPH
+0xE376	0x7E0B	#CJK UNIFIED IDEOGRAPH
+0xE377	0x7E22	#CJK UNIFIED IDEOGRAPH
+0xE378	0x7E46	#CJK UNIFIED IDEOGRAPH
+0xE379	0x7E66	#CJK UNIFIED IDEOGRAPH
+0xE37A	0x7E3B	#CJK UNIFIED IDEOGRAPH
+0xE37B	0x7E35	#CJK UNIFIED IDEOGRAPH
+0xE37C	0x7E39	#CJK UNIFIED IDEOGRAPH
+0xE37D	0x7E43	#CJK UNIFIED IDEOGRAPH
+0xE37E	0x7E37	#CJK UNIFIED IDEOGRAPH
+0xE380	0x7E32	#CJK UNIFIED IDEOGRAPH
+0xE381	0x7E3A	#CJK UNIFIED IDEOGRAPH
+0xE382	0x7E67	#CJK UNIFIED IDEOGRAPH
+0xE383	0x7E5D	#CJK UNIFIED IDEOGRAPH
+0xE384	0x7E56	#CJK UNIFIED IDEOGRAPH
+0xE385	0x7E5E	#CJK UNIFIED IDEOGRAPH
+0xE386	0x7E59	#CJK UNIFIED IDEOGRAPH
+0xE387	0x7E5A	#CJK UNIFIED IDEOGRAPH
+0xE388	0x7E79	#CJK UNIFIED IDEOGRAPH
+0xE389	0x7E6A	#CJK UNIFIED IDEOGRAPH
+0xE38A	0x7E69	#CJK UNIFIED IDEOGRAPH
+0xE38B	0x7E7C	#CJK UNIFIED IDEOGRAPH
+0xE38C	0x7E7B	#CJK UNIFIED IDEOGRAPH
+0xE38D	0x7E83	#CJK UNIFIED IDEOGRAPH
+0xE38E	0x7DD5	#CJK UNIFIED IDEOGRAPH
+0xE38F	0x7E7D	#CJK UNIFIED IDEOGRAPH
+0xE390	0x8FAE	#CJK UNIFIED IDEOGRAPH
+0xE391	0x7E7F	#CJK UNIFIED IDEOGRAPH
+0xE392	0x7E88	#CJK UNIFIED IDEOGRAPH
+0xE393	0x7E89	#CJK UNIFIED IDEOGRAPH
+0xE394	0x7E8C	#CJK UNIFIED IDEOGRAPH
+0xE395	0x7E92	#CJK UNIFIED IDEOGRAPH
+0xE396	0x7E90	#CJK UNIFIED IDEOGRAPH
+0xE397	0x7E93	#CJK UNIFIED IDEOGRAPH
+0xE398	0x7E94	#CJK UNIFIED IDEOGRAPH
+0xE399	0x7E96	#CJK UNIFIED IDEOGRAPH
+0xE39A	0x7E8E	#CJK UNIFIED IDEOGRAPH
+0xE39B	0x7E9B	#CJK UNIFIED IDEOGRAPH
+0xE39C	0x7E9C	#CJK UNIFIED IDEOGRAPH
+0xE39D	0x7F38	#CJK UNIFIED IDEOGRAPH
+0xE39E	0x7F3A	#CJK UNIFIED IDEOGRAPH
+0xE39F	0x7F45	#CJK UNIFIED IDEOGRAPH
+0xE3A0	0x7F4C	#CJK UNIFIED IDEOGRAPH
+0xE3A1	0x7F4D	#CJK UNIFIED IDEOGRAPH
+0xE3A2	0x7F4E	#CJK UNIFIED IDEOGRAPH
+0xE3A3	0x7F50	#CJK UNIFIED IDEOGRAPH
+0xE3A4	0x7F51	#CJK UNIFIED IDEOGRAPH
+0xE3A5	0x7F55	#CJK UNIFIED IDEOGRAPH
+0xE3A6	0x7F54	#CJK UNIFIED IDEOGRAPH
+0xE3A7	0x7F58	#CJK UNIFIED IDEOGRAPH
+0xE3A8	0x7F5F	#CJK UNIFIED IDEOGRAPH
+0xE3A9	0x7F60	#CJK UNIFIED IDEOGRAPH
+0xE3AA	0x7F68	#CJK UNIFIED IDEOGRAPH
+0xE3AB	0x7F69	#CJK UNIFIED IDEOGRAPH
+0xE3AC	0x7F67	#CJK UNIFIED IDEOGRAPH
+0xE3AD	0x7F78	#CJK UNIFIED IDEOGRAPH
+0xE3AE	0x7F82	#CJK UNIFIED IDEOGRAPH
+0xE3AF	0x7F86	#CJK UNIFIED IDEOGRAPH
+0xE3B0	0x7F83	#CJK UNIFIED IDEOGRAPH
+0xE3B1	0x7F88	#CJK UNIFIED IDEOGRAPH
+0xE3B2	0x7F87	#CJK UNIFIED IDEOGRAPH
+0xE3B3	0x7F8C	#CJK UNIFIED IDEOGRAPH
+0xE3B4	0x7F94	#CJK UNIFIED IDEOGRAPH
+0xE3B5	0x7F9E	#CJK UNIFIED IDEOGRAPH
+0xE3B6	0x7F9D	#CJK UNIFIED IDEOGRAPH
+0xE3B7	0x7F9A	#CJK UNIFIED IDEOGRAPH
+0xE3B8	0x7FA3	#CJK UNIFIED IDEOGRAPH
+0xE3B9	0x7FAF	#CJK UNIFIED IDEOGRAPH
+0xE3BA	0x7FB2	#CJK UNIFIED IDEOGRAPH
+0xE3BB	0x7FB9	#CJK UNIFIED IDEOGRAPH
+0xE3BC	0x7FAE	#CJK UNIFIED IDEOGRAPH
+0xE3BD	0x7FB6	#CJK UNIFIED IDEOGRAPH
+0xE3BE	0x7FB8	#CJK UNIFIED IDEOGRAPH
+0xE3BF	0x8B71	#CJK UNIFIED IDEOGRAPH
+0xE3C0	0x7FC5	#CJK UNIFIED IDEOGRAPH
+0xE3C1	0x7FC6	#CJK UNIFIED IDEOGRAPH
+0xE3C2	0x7FCA	#CJK UNIFIED IDEOGRAPH
+0xE3C3	0x7FD5	#CJK UNIFIED IDEOGRAPH
+0xE3C4	0x7FD4	#CJK UNIFIED IDEOGRAPH
+0xE3C5	0x7FE1	#CJK UNIFIED IDEOGRAPH
+0xE3C6	0x7FE6	#CJK UNIFIED IDEOGRAPH
+0xE3C7	0x7FE9	#CJK UNIFIED IDEOGRAPH
+0xE3C8	0x7FF3	#CJK UNIFIED IDEOGRAPH
+0xE3C9	0x7FF9	#CJK UNIFIED IDEOGRAPH
+0xE3CA	0x98DC	#CJK UNIFIED IDEOGRAPH
+0xE3CB	0x8006	#CJK UNIFIED IDEOGRAPH
+0xE3CC	0x8004	#CJK UNIFIED IDEOGRAPH
+0xE3CD	0x800B	#CJK UNIFIED IDEOGRAPH
+0xE3CE	0x8012	#CJK UNIFIED IDEOGRAPH
+0xE3CF	0x8018	#CJK UNIFIED IDEOGRAPH
+0xE3D0	0x8019	#CJK UNIFIED IDEOGRAPH
+0xE3D1	0x801C	#CJK UNIFIED IDEOGRAPH
+0xE3D2	0x8021	#CJK UNIFIED IDEOGRAPH
+0xE3D3	0x8028	#CJK UNIFIED IDEOGRAPH
+0xE3D4	0x803F	#CJK UNIFIED IDEOGRAPH
+0xE3D5	0x803B	#CJK UNIFIED IDEOGRAPH
+0xE3D6	0x804A	#CJK UNIFIED IDEOGRAPH
+0xE3D7	0x8046	#CJK UNIFIED IDEOGRAPH
+0xE3D8	0x8052	#CJK UNIFIED IDEOGRAPH
+0xE3D9	0x8058	#CJK UNIFIED IDEOGRAPH
+0xE3DA	0x805A	#CJK UNIFIED IDEOGRAPH
+0xE3DB	0x805F	#CJK UNIFIED IDEOGRAPH
+0xE3DC	0x8062	#CJK UNIFIED IDEOGRAPH
+0xE3DD	0x8068	#CJK UNIFIED IDEOGRAPH
+0xE3DE	0x8073	#CJK UNIFIED IDEOGRAPH
+0xE3DF	0x8072	#CJK UNIFIED IDEOGRAPH
+0xE3E0	0x8070	#CJK UNIFIED IDEOGRAPH
+0xE3E1	0x8076	#CJK UNIFIED IDEOGRAPH
+0xE3E2	0x8079	#CJK UNIFIED IDEOGRAPH
+0xE3E3	0x807D	#CJK UNIFIED IDEOGRAPH
+0xE3E4	0x807F	#CJK UNIFIED IDEOGRAPH
+0xE3E5	0x8084	#CJK UNIFIED IDEOGRAPH
+0xE3E6	0x8086	#CJK UNIFIED IDEOGRAPH
+0xE3E7	0x8085	#CJK UNIFIED IDEOGRAPH
+0xE3E8	0x809B	#CJK UNIFIED IDEOGRAPH
+0xE3E9	0x8093	#CJK UNIFIED IDEOGRAPH
+0xE3EA	0x809A	#CJK UNIFIED IDEOGRAPH
+0xE3EB	0x80AD	#CJK UNIFIED IDEOGRAPH
+0xE3EC	0x5190	#CJK UNIFIED IDEOGRAPH
+0xE3ED	0x80AC	#CJK UNIFIED IDEOGRAPH
+0xE3EE	0x80DB	#CJK UNIFIED IDEOGRAPH
+0xE3EF	0x80E5	#CJK UNIFIED IDEOGRAPH
+0xE3F0	0x80D9	#CJK UNIFIED IDEOGRAPH
+0xE3F1	0x80DD	#CJK UNIFIED IDEOGRAPH
+0xE3F2	0x80C4	#CJK UNIFIED IDEOGRAPH
+0xE3F3	0x80DA	#CJK UNIFIED IDEOGRAPH
+0xE3F4	0x80D6	#CJK UNIFIED IDEOGRAPH
+0xE3F5	0x8109	#CJK UNIFIED IDEOGRAPH
+0xE3F6	0x80EF	#CJK UNIFIED IDEOGRAPH
+0xE3F7	0x80F1	#CJK UNIFIED IDEOGRAPH
+0xE3F8	0x811B	#CJK UNIFIED IDEOGRAPH
+0xE3F9	0x8129	#CJK UNIFIED IDEOGRAPH
+0xE3FA	0x8123	#CJK UNIFIED IDEOGRAPH
+0xE3FB	0x812F	#CJK UNIFIED IDEOGRAPH
+0xE3FC	0x814B	#CJK UNIFIED IDEOGRAPH
+0xE440	0x968B	#CJK UNIFIED IDEOGRAPH
+0xE441	0x8146	#CJK UNIFIED IDEOGRAPH
+0xE442	0x813E	#CJK UNIFIED IDEOGRAPH
+0xE443	0x8153	#CJK UNIFIED IDEOGRAPH
+0xE444	0x8151	#CJK UNIFIED IDEOGRAPH
+0xE445	0x80FC	#CJK UNIFIED IDEOGRAPH
+0xE446	0x8171	#CJK UNIFIED IDEOGRAPH
+0xE447	0x816E	#CJK UNIFIED IDEOGRAPH
+0xE448	0x8165	#CJK UNIFIED IDEOGRAPH
+0xE449	0x8166	#CJK UNIFIED IDEOGRAPH
+0xE44A	0x8174	#CJK UNIFIED IDEOGRAPH
+0xE44B	0x8183	#CJK UNIFIED IDEOGRAPH
+0xE44C	0x8188	#CJK UNIFIED IDEOGRAPH
+0xE44D	0x818A	#CJK UNIFIED IDEOGRAPH
+0xE44E	0x8180	#CJK UNIFIED IDEOGRAPH
+0xE44F	0x8182	#CJK UNIFIED IDEOGRAPH
+0xE450	0x81A0	#CJK UNIFIED IDEOGRAPH
+0xE451	0x8195	#CJK UNIFIED IDEOGRAPH
+0xE452	0x81A4	#CJK UNIFIED IDEOGRAPH
+0xE453	0x81A3	#CJK UNIFIED IDEOGRAPH
+0xE454	0x815F	#CJK UNIFIED IDEOGRAPH
+0xE455	0x8193	#CJK UNIFIED IDEOGRAPH
+0xE456	0x81A9	#CJK UNIFIED IDEOGRAPH
+0xE457	0x81B0	#CJK UNIFIED IDEOGRAPH
+0xE458	0x81B5	#CJK UNIFIED IDEOGRAPH
+0xE459	0x81BE	#CJK UNIFIED IDEOGRAPH
+0xE45A	0x81B8	#CJK UNIFIED IDEOGRAPH
+0xE45B	0x81BD	#CJK UNIFIED IDEOGRAPH
+0xE45C	0x81C0	#CJK UNIFIED IDEOGRAPH
+0xE45D	0x81C2	#CJK UNIFIED IDEOGRAPH
+0xE45E	0x81BA	#CJK UNIFIED IDEOGRAPH
+0xE45F	0x81C9	#CJK UNIFIED IDEOGRAPH
+0xE460	0x81CD	#CJK UNIFIED IDEOGRAPH
+0xE461	0x81D1	#CJK UNIFIED IDEOGRAPH
+0xE462	0x81D9	#CJK UNIFIED IDEOGRAPH
+0xE463	0x81D8	#CJK UNIFIED IDEOGRAPH
+0xE464	0x81C8	#CJK UNIFIED IDEOGRAPH
+0xE465	0x81DA	#CJK UNIFIED IDEOGRAPH
+0xE466	0x81DF	#CJK UNIFIED IDEOGRAPH
+0xE467	0x81E0	#CJK UNIFIED IDEOGRAPH
+0xE468	0x81E7	#CJK UNIFIED IDEOGRAPH
+0xE469	0x81FA	#CJK UNIFIED IDEOGRAPH
+0xE46A	0x81FB	#CJK UNIFIED IDEOGRAPH
+0xE46B	0x81FE	#CJK UNIFIED IDEOGRAPH
+0xE46C	0x8201	#CJK UNIFIED IDEOGRAPH
+0xE46D	0x8202	#CJK UNIFIED IDEOGRAPH
+0xE46E	0x8205	#CJK UNIFIED IDEOGRAPH
+0xE46F	0x8207	#CJK UNIFIED IDEOGRAPH
+0xE470	0x820A	#CJK UNIFIED IDEOGRAPH
+0xE471	0x820D	#CJK UNIFIED IDEOGRAPH
+0xE472	0x8210	#CJK UNIFIED IDEOGRAPH
+0xE473	0x8216	#CJK UNIFIED IDEOGRAPH
+0xE474	0x8229	#CJK UNIFIED IDEOGRAPH
+0xE475	0x822B	#CJK UNIFIED IDEOGRAPH
+0xE476	0x8238	#CJK UNIFIED IDEOGRAPH
+0xE477	0x8233	#CJK UNIFIED IDEOGRAPH
+0xE478	0x8240	#CJK UNIFIED IDEOGRAPH
+0xE479	0x8259	#CJK UNIFIED IDEOGRAPH
+0xE47A	0x8258	#CJK UNIFIED IDEOGRAPH
+0xE47B	0x825D	#CJK UNIFIED IDEOGRAPH
+0xE47C	0x825A	#CJK UNIFIED IDEOGRAPH
+0xE47D	0x825F	#CJK UNIFIED IDEOGRAPH
+0xE47E	0x8264	#CJK UNIFIED IDEOGRAPH
+0xE480	0x8262	#CJK UNIFIED IDEOGRAPH
+0xE481	0x8268	#CJK UNIFIED IDEOGRAPH
+0xE482	0x826A	#CJK UNIFIED IDEOGRAPH
+0xE483	0x826B	#CJK UNIFIED IDEOGRAPH
+0xE484	0x822E	#CJK UNIFIED IDEOGRAPH
+0xE485	0x8271	#CJK UNIFIED IDEOGRAPH
+0xE486	0x8277	#CJK UNIFIED IDEOGRAPH
+0xE487	0x8278	#CJK UNIFIED IDEOGRAPH
+0xE488	0x827E	#CJK UNIFIED IDEOGRAPH
+0xE489	0x828D	#CJK UNIFIED IDEOGRAPH
+0xE48A	0x8292	#CJK UNIFIED IDEOGRAPH
+0xE48B	0x82AB	#CJK UNIFIED IDEOGRAPH
+0xE48C	0x829F	#CJK UNIFIED IDEOGRAPH
+0xE48D	0x82BB	#CJK UNIFIED IDEOGRAPH
+0xE48E	0x82AC	#CJK UNIFIED IDEOGRAPH
+0xE48F	0x82E1	#CJK UNIFIED IDEOGRAPH
+0xE490	0x82E3	#CJK UNIFIED IDEOGRAPH
+0xE491	0x82DF	#CJK UNIFIED IDEOGRAPH
+0xE492	0x82D2	#CJK UNIFIED IDEOGRAPH
+0xE493	0x82F4	#CJK UNIFIED IDEOGRAPH
+0xE494	0x82F3	#CJK UNIFIED IDEOGRAPH
+0xE495	0x82FA	#CJK UNIFIED IDEOGRAPH
+0xE496	0x8393	#CJK UNIFIED IDEOGRAPH
+0xE497	0x8303	#CJK UNIFIED IDEOGRAPH
+0xE498	0x82FB	#CJK UNIFIED IDEOGRAPH
+0xE499	0x82F9	#CJK UNIFIED IDEOGRAPH
+0xE49A	0x82DE	#CJK UNIFIED IDEOGRAPH
+0xE49B	0x8306	#CJK UNIFIED IDEOGRAPH
+0xE49C	0x82DC	#CJK UNIFIED IDEOGRAPH
+0xE49D	0x8309	#CJK UNIFIED IDEOGRAPH
+0xE49E	0x82D9	#CJK UNIFIED IDEOGRAPH
+0xE49F	0x8335	#CJK UNIFIED IDEOGRAPH
+0xE4A0	0x8334	#CJK UNIFIED IDEOGRAPH
+0xE4A1	0x8316	#CJK UNIFIED IDEOGRAPH
+0xE4A2	0x8332	#CJK UNIFIED IDEOGRAPH
+0xE4A3	0x8331	#CJK UNIFIED IDEOGRAPH
+0xE4A4	0x8340	#CJK UNIFIED IDEOGRAPH
+0xE4A5	0x8339	#CJK UNIFIED IDEOGRAPH
+0xE4A6	0x8350	#CJK UNIFIED IDEOGRAPH
+0xE4A7	0x8345	#CJK UNIFIED IDEOGRAPH
+0xE4A8	0x832F	#CJK UNIFIED IDEOGRAPH
+0xE4A9	0x832B	#CJK UNIFIED IDEOGRAPH
+0xE4AA	0x8317	#CJK UNIFIED IDEOGRAPH
+0xE4AB	0x8318	#CJK UNIFIED IDEOGRAPH
+0xE4AC	0x8385	#CJK UNIFIED IDEOGRAPH
+0xE4AD	0x839A	#CJK UNIFIED IDEOGRAPH
+0xE4AE	0x83AA	#CJK UNIFIED IDEOGRAPH
+0xE4AF	0x839F	#CJK UNIFIED IDEOGRAPH
+0xE4B0	0x83A2	#CJK UNIFIED IDEOGRAPH
+0xE4B1	0x8396	#CJK UNIFIED IDEOGRAPH
+0xE4B2	0x8323	#CJK UNIFIED IDEOGRAPH
+0xE4B3	0x838E	#CJK UNIFIED IDEOGRAPH
+0xE4B4	0x8387	#CJK UNIFIED IDEOGRAPH
+0xE4B5	0x838A	#CJK UNIFIED IDEOGRAPH
+0xE4B6	0x837C	#CJK UNIFIED IDEOGRAPH
+0xE4B7	0x83B5	#CJK UNIFIED IDEOGRAPH
+0xE4B8	0x8373	#CJK UNIFIED IDEOGRAPH
+0xE4B9	0x8375	#CJK UNIFIED IDEOGRAPH
+0xE4BA	0x83A0	#CJK UNIFIED IDEOGRAPH
+0xE4BB	0x8389	#CJK UNIFIED IDEOGRAPH
+0xE4BC	0x83A8	#CJK UNIFIED IDEOGRAPH
+0xE4BD	0x83F4	#CJK UNIFIED IDEOGRAPH
+0xE4BE	0x8413	#CJK UNIFIED IDEOGRAPH
+0xE4BF	0x83EB	#CJK UNIFIED IDEOGRAPH
+0xE4C0	0x83CE	#CJK UNIFIED IDEOGRAPH
+0xE4C1	0x83FD	#CJK UNIFIED IDEOGRAPH
+0xE4C2	0x8403	#CJK UNIFIED IDEOGRAPH
+0xE4C3	0x83D8	#CJK UNIFIED IDEOGRAPH
+0xE4C4	0x840B	#CJK UNIFIED IDEOGRAPH
+0xE4C5	0x83C1	#CJK UNIFIED IDEOGRAPH
+0xE4C6	0x83F7	#CJK UNIFIED IDEOGRAPH
+0xE4C7	0x8407	#CJK UNIFIED IDEOGRAPH
+0xE4C8	0x83E0	#CJK UNIFIED IDEOGRAPH
+0xE4C9	0x83F2	#CJK UNIFIED IDEOGRAPH
+0xE4CA	0x840D	#CJK UNIFIED IDEOGRAPH
+0xE4CB	0x8422	#CJK UNIFIED IDEOGRAPH
+0xE4CC	0x8420	#CJK UNIFIED IDEOGRAPH
+0xE4CD	0x83BD	#CJK UNIFIED IDEOGRAPH
+0xE4CE	0x8438	#CJK UNIFIED IDEOGRAPH
+0xE4CF	0x8506	#CJK UNIFIED IDEOGRAPH
+0xE4D0	0x83FB	#CJK UNIFIED IDEOGRAPH
+0xE4D1	0x846D	#CJK UNIFIED IDEOGRAPH
+0xE4D2	0x842A	#CJK UNIFIED IDEOGRAPH
+0xE4D3	0x843C	#CJK UNIFIED IDEOGRAPH
+0xE4D4	0x855A	#CJK UNIFIED IDEOGRAPH
+0xE4D5	0x8484	#CJK UNIFIED IDEOGRAPH
+0xE4D6	0x8477	#CJK UNIFIED IDEOGRAPH
+0xE4D7	0x846B	#CJK UNIFIED IDEOGRAPH
+0xE4D8	0x84AD	#CJK UNIFIED IDEOGRAPH
+0xE4D9	0x846E	#CJK UNIFIED IDEOGRAPH
+0xE4DA	0x8482	#CJK UNIFIED IDEOGRAPH
+0xE4DB	0x8469	#CJK UNIFIED IDEOGRAPH
+0xE4DC	0x8446	#CJK UNIFIED IDEOGRAPH
+0xE4DD	0x842C	#CJK UNIFIED IDEOGRAPH
+0xE4DE	0x846F	#CJK UNIFIED IDEOGRAPH
+0xE4DF	0x8479	#CJK UNIFIED IDEOGRAPH
+0xE4E0	0x8435	#CJK UNIFIED IDEOGRAPH
+0xE4E1	0x84CA	#CJK UNIFIED IDEOGRAPH
+0xE4E2	0x8462	#CJK UNIFIED IDEOGRAPH
+0xE4E3	0x84B9	#CJK UNIFIED IDEOGRAPH
+0xE4E4	0x84BF	#CJK UNIFIED IDEOGRAPH
+0xE4E5	0x849F	#CJK UNIFIED IDEOGRAPH
+0xE4E6	0x84D9	#CJK UNIFIED IDEOGRAPH
+0xE4E7	0x84CD	#CJK UNIFIED IDEOGRAPH
+0xE4E8	0x84BB	#CJK UNIFIED IDEOGRAPH
+0xE4E9	0x84DA	#CJK UNIFIED IDEOGRAPH
+0xE4EA	0x84D0	#CJK UNIFIED IDEOGRAPH
+0xE4EB	0x84C1	#CJK UNIFIED IDEOGRAPH
+0xE4EC	0x84C6	#CJK UNIFIED IDEOGRAPH
+0xE4ED	0x84D6	#CJK UNIFIED IDEOGRAPH
+0xE4EE	0x84A1	#CJK UNIFIED IDEOGRAPH
+0xE4EF	0x8521	#CJK UNIFIED IDEOGRAPH
+0xE4F0	0x84FF	#CJK UNIFIED IDEOGRAPH
+0xE4F1	0x84F4	#CJK UNIFIED IDEOGRAPH
+0xE4F2	0x8517	#CJK UNIFIED IDEOGRAPH
+0xE4F3	0x8518	#CJK UNIFIED IDEOGRAPH
+0xE4F4	0x852C	#CJK UNIFIED IDEOGRAPH
+0xE4F5	0x851F	#CJK UNIFIED IDEOGRAPH
+0xE4F6	0x8515	#CJK UNIFIED IDEOGRAPH
+0xE4F7	0x8514	#CJK UNIFIED IDEOGRAPH
+0xE4F8	0x84FC	#CJK UNIFIED IDEOGRAPH
+0xE4F9	0x8540	#CJK UNIFIED IDEOGRAPH
+0xE4FA	0x8563	#CJK UNIFIED IDEOGRAPH
+0xE4FB	0x8558	#CJK UNIFIED IDEOGRAPH
+0xE4FC	0x8548	#CJK UNIFIED IDEOGRAPH
+0xE540	0x8541	#CJK UNIFIED IDEOGRAPH
+0xE541	0x8602	#CJK UNIFIED IDEOGRAPH
+0xE542	0x854B	#CJK UNIFIED IDEOGRAPH
+0xE543	0x8555	#CJK UNIFIED IDEOGRAPH
+0xE544	0x8580	#CJK UNIFIED IDEOGRAPH
+0xE545	0x85A4	#CJK UNIFIED IDEOGRAPH
+0xE546	0x8588	#CJK UNIFIED IDEOGRAPH
+0xE547	0x8591	#CJK UNIFIED IDEOGRAPH
+0xE548	0x858A	#CJK UNIFIED IDEOGRAPH
+0xE549	0x85A8	#CJK UNIFIED IDEOGRAPH
+0xE54A	0x856D	#CJK UNIFIED IDEOGRAPH
+0xE54B	0x8594	#CJK UNIFIED IDEOGRAPH
+0xE54C	0x859B	#CJK UNIFIED IDEOGRAPH
+0xE54D	0x85EA	#CJK UNIFIED IDEOGRAPH
+0xE54E	0x8587	#CJK UNIFIED IDEOGRAPH
+0xE54F	0x859C	#CJK UNIFIED IDEOGRAPH
+0xE550	0x8577	#CJK UNIFIED IDEOGRAPH
+0xE551	0x857E	#CJK UNIFIED IDEOGRAPH
+0xE552	0x8590	#CJK UNIFIED IDEOGRAPH
+0xE553	0x85C9	#CJK UNIFIED IDEOGRAPH
+0xE554	0x85BA	#CJK UNIFIED IDEOGRAPH
+0xE555	0x85CF	#CJK UNIFIED IDEOGRAPH
+0xE556	0x85B9	#CJK UNIFIED IDEOGRAPH
+0xE557	0x85D0	#CJK UNIFIED IDEOGRAPH
+0xE558	0x85D5	#CJK UNIFIED IDEOGRAPH
+0xE559	0x85DD	#CJK UNIFIED IDEOGRAPH
+0xE55A	0x85E5	#CJK UNIFIED IDEOGRAPH
+0xE55B	0x85DC	#CJK UNIFIED IDEOGRAPH
+0xE55C	0x85F9	#CJK UNIFIED IDEOGRAPH
+0xE55D	0x860A	#CJK UNIFIED IDEOGRAPH
+0xE55E	0x8613	#CJK UNIFIED IDEOGRAPH
+0xE55F	0x860B	#CJK UNIFIED IDEOGRAPH
+0xE560	0x85FE	#CJK UNIFIED IDEOGRAPH
+0xE561	0x85FA	#CJK UNIFIED IDEOGRAPH
+0xE562	0x8606	#CJK UNIFIED IDEOGRAPH
+0xE563	0x8622	#CJK UNIFIED IDEOGRAPH
+0xE564	0x861A	#CJK UNIFIED IDEOGRAPH
+0xE565	0x8630	#CJK UNIFIED IDEOGRAPH
+0xE566	0x863F	#CJK UNIFIED IDEOGRAPH
+0xE567	0x864D	#CJK UNIFIED IDEOGRAPH
+0xE568	0x4E55	#CJK UNIFIED IDEOGRAPH
+0xE569	0x8654	#CJK UNIFIED IDEOGRAPH
+0xE56A	0x865F	#CJK UNIFIED IDEOGRAPH
+0xE56B	0x8667	#CJK UNIFIED IDEOGRAPH
+0xE56C	0x8671	#CJK UNIFIED IDEOGRAPH
+0xE56D	0x8693	#CJK UNIFIED IDEOGRAPH
+0xE56E	0x86A3	#CJK UNIFIED IDEOGRAPH
+0xE56F	0x86A9	#CJK UNIFIED IDEOGRAPH
+0xE570	0x86AA	#CJK UNIFIED IDEOGRAPH
+0xE571	0x868B	#CJK UNIFIED IDEOGRAPH
+0xE572	0x868C	#CJK UNIFIED IDEOGRAPH
+0xE573	0x86B6	#CJK UNIFIED IDEOGRAPH
+0xE574	0x86AF	#CJK UNIFIED IDEOGRAPH
+0xE575	0x86C4	#CJK UNIFIED IDEOGRAPH
+0xE576	0x86C6	#CJK UNIFIED IDEOGRAPH
+0xE577	0x86B0	#CJK UNIFIED IDEOGRAPH
+0xE578	0x86C9	#CJK UNIFIED IDEOGRAPH
+0xE579	0x8823	#CJK UNIFIED IDEOGRAPH
+0xE57A	0x86AB	#CJK UNIFIED IDEOGRAPH
+0xE57B	0x86D4	#CJK UNIFIED IDEOGRAPH
+0xE57C	0x86DE	#CJK UNIFIED IDEOGRAPH
+0xE57D	0x86E9	#CJK UNIFIED IDEOGRAPH
+0xE57E	0x86EC	#CJK UNIFIED IDEOGRAPH
+0xE580	0x86DF	#CJK UNIFIED IDEOGRAPH
+0xE581	0x86DB	#CJK UNIFIED IDEOGRAPH
+0xE582	0x86EF	#CJK UNIFIED IDEOGRAPH
+0xE583	0x8712	#CJK UNIFIED IDEOGRAPH
+0xE584	0x8706	#CJK UNIFIED IDEOGRAPH
+0xE585	0x8708	#CJK UNIFIED IDEOGRAPH
+0xE586	0x8700	#CJK UNIFIED IDEOGRAPH
+0xE587	0x8703	#CJK UNIFIED IDEOGRAPH
+0xE588	0x86FB	#CJK UNIFIED IDEOGRAPH
+0xE589	0x8711	#CJK UNIFIED IDEOGRAPH
+0xE58A	0x8709	#CJK UNIFIED IDEOGRAPH
+0xE58B	0x870D	#CJK UNIFIED IDEOGRAPH
+0xE58C	0x86F9	#CJK UNIFIED IDEOGRAPH
+0xE58D	0x870A	#CJK UNIFIED IDEOGRAPH
+0xE58E	0x8734	#CJK UNIFIED IDEOGRAPH
+0xE58F	0x873F	#CJK UNIFIED IDEOGRAPH
+0xE590	0x8737	#CJK UNIFIED IDEOGRAPH
+0xE591	0x873B	#CJK UNIFIED IDEOGRAPH
+0xE592	0x8725	#CJK UNIFIED IDEOGRAPH
+0xE593	0x8729	#CJK UNIFIED IDEOGRAPH
+0xE594	0x871A	#CJK UNIFIED IDEOGRAPH
+0xE595	0x8760	#CJK UNIFIED IDEOGRAPH
+0xE596	0x875F	#CJK UNIFIED IDEOGRAPH
+0xE597	0x8778	#CJK UNIFIED IDEOGRAPH
+0xE598	0x874C	#CJK UNIFIED IDEOGRAPH
+0xE599	0x874E	#CJK UNIFIED IDEOGRAPH
+0xE59A	0x8774	#CJK UNIFIED IDEOGRAPH
+0xE59B	0x8757	#CJK UNIFIED IDEOGRAPH
+0xE59C	0x8768	#CJK UNIFIED IDEOGRAPH
+0xE59D	0x876E	#CJK UNIFIED IDEOGRAPH
+0xE59E	0x8759	#CJK UNIFIED IDEOGRAPH
+0xE59F	0x8753	#CJK UNIFIED IDEOGRAPH
+0xE5A0	0x8763	#CJK UNIFIED IDEOGRAPH
+0xE5A1	0x876A	#CJK UNIFIED IDEOGRAPH
+0xE5A2	0x8805	#CJK UNIFIED IDEOGRAPH
+0xE5A3	0x87A2	#CJK UNIFIED IDEOGRAPH
+0xE5A4	0x879F	#CJK UNIFIED IDEOGRAPH
+0xE5A5	0x8782	#CJK UNIFIED IDEOGRAPH
+0xE5A6	0x87AF	#CJK UNIFIED IDEOGRAPH
+0xE5A7	0x87CB	#CJK UNIFIED IDEOGRAPH
+0xE5A8	0x87BD	#CJK UNIFIED IDEOGRAPH
+0xE5A9	0x87C0	#CJK UNIFIED IDEOGRAPH
+0xE5AA	0x87D0	#CJK UNIFIED IDEOGRAPH
+0xE5AB	0x96D6	#CJK UNIFIED IDEOGRAPH
+0xE5AC	0x87AB	#CJK UNIFIED IDEOGRAPH
+0xE5AD	0x87C4	#CJK UNIFIED IDEOGRAPH
+0xE5AE	0x87B3	#CJK UNIFIED IDEOGRAPH
+0xE5AF	0x87C7	#CJK UNIFIED IDEOGRAPH
+0xE5B0	0x87C6	#CJK UNIFIED IDEOGRAPH
+0xE5B1	0x87BB	#CJK UNIFIED IDEOGRAPH
+0xE5B2	0x87EF	#CJK UNIFIED IDEOGRAPH
+0xE5B3	0x87F2	#CJK UNIFIED IDEOGRAPH
+0xE5B4	0x87E0	#CJK UNIFIED IDEOGRAPH
+0xE5B5	0x880F	#CJK UNIFIED IDEOGRAPH
+0xE5B6	0x880D	#CJK UNIFIED IDEOGRAPH
+0xE5B7	0x87FE	#CJK UNIFIED IDEOGRAPH
+0xE5B8	0x87F6	#CJK UNIFIED IDEOGRAPH
+0xE5B9	0x87F7	#CJK UNIFIED IDEOGRAPH
+0xE5BA	0x880E	#CJK UNIFIED IDEOGRAPH
+0xE5BB	0x87D2	#CJK UNIFIED IDEOGRAPH
+0xE5BC	0x8811	#CJK UNIFIED IDEOGRAPH
+0xE5BD	0x8816	#CJK UNIFIED IDEOGRAPH
+0xE5BE	0x8815	#CJK UNIFIED IDEOGRAPH
+0xE5BF	0x8822	#CJK UNIFIED IDEOGRAPH
+0xE5C0	0x8821	#CJK UNIFIED IDEOGRAPH
+0xE5C1	0x8831	#CJK UNIFIED IDEOGRAPH
+0xE5C2	0x8836	#CJK UNIFIED IDEOGRAPH
+0xE5C3	0x8839	#CJK UNIFIED IDEOGRAPH
+0xE5C4	0x8827	#CJK UNIFIED IDEOGRAPH
+0xE5C5	0x883B	#CJK UNIFIED IDEOGRAPH
+0xE5C6	0x8844	#CJK UNIFIED IDEOGRAPH
+0xE5C7	0x8842	#CJK UNIFIED IDEOGRAPH
+0xE5C8	0x8852	#CJK UNIFIED IDEOGRAPH
+0xE5C9	0x8859	#CJK UNIFIED IDEOGRAPH
+0xE5CA	0x885E	#CJK UNIFIED IDEOGRAPH
+0xE5CB	0x8862	#CJK UNIFIED IDEOGRAPH
+0xE5CC	0x886B	#CJK UNIFIED IDEOGRAPH
+0xE5CD	0x8881	#CJK UNIFIED IDEOGRAPH
+0xE5CE	0x887E	#CJK UNIFIED IDEOGRAPH
+0xE5CF	0x889E	#CJK UNIFIED IDEOGRAPH
+0xE5D0	0x8875	#CJK UNIFIED IDEOGRAPH
+0xE5D1	0x887D	#CJK UNIFIED IDEOGRAPH
+0xE5D2	0x88B5	#CJK UNIFIED IDEOGRAPH
+0xE5D3	0x8872	#CJK UNIFIED IDEOGRAPH
+0xE5D4	0x8882	#CJK UNIFIED IDEOGRAPH
+0xE5D5	0x8897	#CJK UNIFIED IDEOGRAPH
+0xE5D6	0x8892	#CJK UNIFIED IDEOGRAPH
+0xE5D7	0x88AE	#CJK UNIFIED IDEOGRAPH
+0xE5D8	0x8899	#CJK UNIFIED IDEOGRAPH
+0xE5D9	0x88A2	#CJK UNIFIED IDEOGRAPH
+0xE5DA	0x888D	#CJK UNIFIED IDEOGRAPH
+0xE5DB	0x88A4	#CJK UNIFIED IDEOGRAPH
+0xE5DC	0x88B0	#CJK UNIFIED IDEOGRAPH
+0xE5DD	0x88BF	#CJK UNIFIED IDEOGRAPH
+0xE5DE	0x88B1	#CJK UNIFIED IDEOGRAPH
+0xE5DF	0x88C3	#CJK UNIFIED IDEOGRAPH
+0xE5E0	0x88C4	#CJK UNIFIED IDEOGRAPH
+0xE5E1	0x88D4	#CJK UNIFIED IDEOGRAPH
+0xE5E2	0x88D8	#CJK UNIFIED IDEOGRAPH
+0xE5E3	0x88D9	#CJK UNIFIED IDEOGRAPH
+0xE5E4	0x88DD	#CJK UNIFIED IDEOGRAPH
+0xE5E5	0x88F9	#CJK UNIFIED IDEOGRAPH
+0xE5E6	0x8902	#CJK UNIFIED IDEOGRAPH
+0xE5E7	0x88FC	#CJK UNIFIED IDEOGRAPH
+0xE5E8	0x88F4	#CJK UNIFIED IDEOGRAPH
+0xE5E9	0x88E8	#CJK UNIFIED IDEOGRAPH
+0xE5EA	0x88F2	#CJK UNIFIED IDEOGRAPH
+0xE5EB	0x8904	#CJK UNIFIED IDEOGRAPH
+0xE5EC	0x890C	#CJK UNIFIED IDEOGRAPH
+0xE5ED	0x890A	#CJK UNIFIED IDEOGRAPH
+0xE5EE	0x8913	#CJK UNIFIED IDEOGRAPH
+0xE5EF	0x8943	#CJK UNIFIED IDEOGRAPH
+0xE5F0	0x891E	#CJK UNIFIED IDEOGRAPH
+0xE5F1	0x8925	#CJK UNIFIED IDEOGRAPH
+0xE5F2	0x892A	#CJK UNIFIED IDEOGRAPH
+0xE5F3	0x892B	#CJK UNIFIED IDEOGRAPH
+0xE5F4	0x8941	#CJK UNIFIED IDEOGRAPH
+0xE5F5	0x8944	#CJK UNIFIED IDEOGRAPH
+0xE5F6	0x893B	#CJK UNIFIED IDEOGRAPH
+0xE5F7	0x8936	#CJK UNIFIED IDEOGRAPH
+0xE5F8	0x8938	#CJK UNIFIED IDEOGRAPH
+0xE5F9	0x894C	#CJK UNIFIED IDEOGRAPH
+0xE5FA	0x891D	#CJK UNIFIED IDEOGRAPH
+0xE5FB	0x8960	#CJK UNIFIED IDEOGRAPH
+0xE5FC	0x895E	#CJK UNIFIED IDEOGRAPH
+0xE640	0x8966	#CJK UNIFIED IDEOGRAPH
+0xE641	0x8964	#CJK UNIFIED IDEOGRAPH
+0xE642	0x896D	#CJK UNIFIED IDEOGRAPH
+0xE643	0x896A	#CJK UNIFIED IDEOGRAPH
+0xE644	0x896F	#CJK UNIFIED IDEOGRAPH
+0xE645	0x8974	#CJK UNIFIED IDEOGRAPH
+0xE646	0x8977	#CJK UNIFIED IDEOGRAPH
+0xE647	0x897E	#CJK UNIFIED IDEOGRAPH
+0xE648	0x8983	#CJK UNIFIED IDEOGRAPH
+0xE649	0x8988	#CJK UNIFIED IDEOGRAPH
+0xE64A	0x898A	#CJK UNIFIED IDEOGRAPH
+0xE64B	0x8993	#CJK UNIFIED IDEOGRAPH
+0xE64C	0x8998	#CJK UNIFIED IDEOGRAPH
+0xE64D	0x89A1	#CJK UNIFIED IDEOGRAPH
+0xE64E	0x89A9	#CJK UNIFIED IDEOGRAPH
+0xE64F	0x89A6	#CJK UNIFIED IDEOGRAPH
+0xE650	0x89AC	#CJK UNIFIED IDEOGRAPH
+0xE651	0x89AF	#CJK UNIFIED IDEOGRAPH
+0xE652	0x89B2	#CJK UNIFIED IDEOGRAPH
+0xE653	0x89BA	#CJK UNIFIED IDEOGRAPH
+0xE654	0x89BD	#CJK UNIFIED IDEOGRAPH
+0xE655	0x89BF	#CJK UNIFIED IDEOGRAPH
+0xE656	0x89C0	#CJK UNIFIED IDEOGRAPH
+0xE657	0x89DA	#CJK UNIFIED IDEOGRAPH
+0xE658	0x89DC	#CJK UNIFIED IDEOGRAPH
+0xE659	0x89DD	#CJK UNIFIED IDEOGRAPH
+0xE65A	0x89E7	#CJK UNIFIED IDEOGRAPH
+0xE65B	0x89F4	#CJK UNIFIED IDEOGRAPH
+0xE65C	0x89F8	#CJK UNIFIED IDEOGRAPH
+0xE65D	0x8A03	#CJK UNIFIED IDEOGRAPH
+0xE65E	0x8A16	#CJK UNIFIED IDEOGRAPH
+0xE65F	0x8A10	#CJK UNIFIED IDEOGRAPH
+0xE660	0x8A0C	#CJK UNIFIED IDEOGRAPH
+0xE661	0x8A1B	#CJK UNIFIED IDEOGRAPH
+0xE662	0x8A1D	#CJK UNIFIED IDEOGRAPH
+0xE663	0x8A25	#CJK UNIFIED IDEOGRAPH
+0xE664	0x8A36	#CJK UNIFIED IDEOGRAPH
+0xE665	0x8A41	#CJK UNIFIED IDEOGRAPH
+0xE666	0x8A5B	#CJK UNIFIED IDEOGRAPH
+0xE667	0x8A52	#CJK UNIFIED IDEOGRAPH
+0xE668	0x8A46	#CJK UNIFIED IDEOGRAPH
+0xE669	0x8A48	#CJK UNIFIED IDEOGRAPH
+0xE66A	0x8A7C	#CJK UNIFIED IDEOGRAPH
+0xE66B	0x8A6D	#CJK UNIFIED IDEOGRAPH
+0xE66C	0x8A6C	#CJK UNIFIED IDEOGRAPH
+0xE66D	0x8A62	#CJK UNIFIED IDEOGRAPH
+0xE66E	0x8A85	#CJK UNIFIED IDEOGRAPH
+0xE66F	0x8A82	#CJK UNIFIED IDEOGRAPH
+0xE670	0x8A84	#CJK UNIFIED IDEOGRAPH
+0xE671	0x8AA8	#CJK UNIFIED IDEOGRAPH
+0xE672	0x8AA1	#CJK UNIFIED IDEOGRAPH
+0xE673	0x8A91	#CJK UNIFIED IDEOGRAPH
+0xE674	0x8AA5	#CJK UNIFIED IDEOGRAPH
+0xE675	0x8AA6	#CJK UNIFIED IDEOGRAPH
+0xE676	0x8A9A	#CJK UNIFIED IDEOGRAPH
+0xE677	0x8AA3	#CJK UNIFIED IDEOGRAPH
+0xE678	0x8AC4	#CJK UNIFIED IDEOGRAPH
+0xE679	0x8ACD	#CJK UNIFIED IDEOGRAPH
+0xE67A	0x8AC2	#CJK UNIFIED IDEOGRAPH
+0xE67B	0x8ADA	#CJK UNIFIED IDEOGRAPH
+0xE67C	0x8AEB	#CJK UNIFIED IDEOGRAPH
+0xE67D	0x8AF3	#CJK UNIFIED IDEOGRAPH
+0xE67E	0x8AE7	#CJK UNIFIED IDEOGRAPH
+0xE680	0x8AE4	#CJK UNIFIED IDEOGRAPH
+0xE681	0x8AF1	#CJK UNIFIED IDEOGRAPH
+0xE682	0x8B14	#CJK UNIFIED IDEOGRAPH
+0xE683	0x8AE0	#CJK UNIFIED IDEOGRAPH
+0xE684	0x8AE2	#CJK UNIFIED IDEOGRAPH
+0xE685	0x8AF7	#CJK UNIFIED IDEOGRAPH
+0xE686	0x8ADE	#CJK UNIFIED IDEOGRAPH
+0xE687	0x8ADB	#CJK UNIFIED IDEOGRAPH
+0xE688	0x8B0C	#CJK UNIFIED IDEOGRAPH
+0xE689	0x8B07	#CJK UNIFIED IDEOGRAPH
+0xE68A	0x8B1A	#CJK UNIFIED IDEOGRAPH
+0xE68B	0x8AE1	#CJK UNIFIED IDEOGRAPH
+0xE68C	0x8B16	#CJK UNIFIED IDEOGRAPH
+0xE68D	0x8B10	#CJK UNIFIED IDEOGRAPH
+0xE68E	0x8B17	#CJK UNIFIED IDEOGRAPH
+0xE68F	0x8B20	#CJK UNIFIED IDEOGRAPH
+0xE690	0x8B33	#CJK UNIFIED IDEOGRAPH
+0xE691	0x97AB	#CJK UNIFIED IDEOGRAPH
+0xE692	0x8B26	#CJK UNIFIED IDEOGRAPH
+0xE693	0x8B2B	#CJK UNIFIED IDEOGRAPH
+0xE694	0x8B3E	#CJK UNIFIED IDEOGRAPH
+0xE695	0x8B28	#CJK UNIFIED IDEOGRAPH
+0xE696	0x8B41	#CJK UNIFIED IDEOGRAPH
+0xE697	0x8B4C	#CJK UNIFIED IDEOGRAPH
+0xE698	0x8B4F	#CJK UNIFIED IDEOGRAPH
+0xE699	0x8B4E	#CJK UNIFIED IDEOGRAPH
+0xE69A	0x8B49	#CJK UNIFIED IDEOGRAPH
+0xE69B	0x8B56	#CJK UNIFIED IDEOGRAPH
+0xE69C	0x8B5B	#CJK UNIFIED IDEOGRAPH
+0xE69D	0x8B5A	#CJK UNIFIED IDEOGRAPH
+0xE69E	0x8B6B	#CJK UNIFIED IDEOGRAPH
+0xE69F	0x8B5F	#CJK UNIFIED IDEOGRAPH
+0xE6A0	0x8B6C	#CJK UNIFIED IDEOGRAPH
+0xE6A1	0x8B6F	#CJK UNIFIED IDEOGRAPH
+0xE6A2	0x8B74	#CJK UNIFIED IDEOGRAPH
+0xE6A3	0x8B7D	#CJK UNIFIED IDEOGRAPH
+0xE6A4	0x8B80	#CJK UNIFIED IDEOGRAPH
+0xE6A5	0x8B8C	#CJK UNIFIED IDEOGRAPH
+0xE6A6	0x8B8E	#CJK UNIFIED IDEOGRAPH
+0xE6A7	0x8B92	#CJK UNIFIED IDEOGRAPH
+0xE6A8	0x8B93	#CJK UNIFIED IDEOGRAPH
+0xE6A9	0x8B96	#CJK UNIFIED IDEOGRAPH
+0xE6AA	0x8B99	#CJK UNIFIED IDEOGRAPH
+0xE6AB	0x8B9A	#CJK UNIFIED IDEOGRAPH
+0xE6AC	0x8C3A	#CJK UNIFIED IDEOGRAPH
+0xE6AD	0x8C41	#CJK UNIFIED IDEOGRAPH
+0xE6AE	0x8C3F	#CJK UNIFIED IDEOGRAPH
+0xE6AF	0x8C48	#CJK UNIFIED IDEOGRAPH
+0xE6B0	0x8C4C	#CJK UNIFIED IDEOGRAPH
+0xE6B1	0x8C4E	#CJK UNIFIED IDEOGRAPH
+0xE6B2	0x8C50	#CJK UNIFIED IDEOGRAPH
+0xE6B3	0x8C55	#CJK UNIFIED IDEOGRAPH
+0xE6B4	0x8C62	#CJK UNIFIED IDEOGRAPH
+0xE6B5	0x8C6C	#CJK UNIFIED IDEOGRAPH
+0xE6B6	0x8C78	#CJK UNIFIED IDEOGRAPH
+0xE6B7	0x8C7A	#CJK UNIFIED IDEOGRAPH
+0xE6B8	0x8C82	#CJK UNIFIED IDEOGRAPH
+0xE6B9	0x8C89	#CJK UNIFIED IDEOGRAPH
+0xE6BA	0x8C85	#CJK UNIFIED IDEOGRAPH
+0xE6BB	0x8C8A	#CJK UNIFIED IDEOGRAPH
+0xE6BC	0x8C8D	#CJK UNIFIED IDEOGRAPH
+0xE6BD	0x8C8E	#CJK UNIFIED IDEOGRAPH
+0xE6BE	0x8C94	#CJK UNIFIED IDEOGRAPH
+0xE6BF	0x8C7C	#CJK UNIFIED IDEOGRAPH
+0xE6C0	0x8C98	#CJK UNIFIED IDEOGRAPH
+0xE6C1	0x621D	#CJK UNIFIED IDEOGRAPH
+0xE6C2	0x8CAD	#CJK UNIFIED IDEOGRAPH
+0xE6C3	0x8CAA	#CJK UNIFIED IDEOGRAPH
+0xE6C4	0x8CBD	#CJK UNIFIED IDEOGRAPH
+0xE6C5	0x8CB2	#CJK UNIFIED IDEOGRAPH
+0xE6C6	0x8CB3	#CJK UNIFIED IDEOGRAPH
+0xE6C7	0x8CAE	#CJK UNIFIED IDEOGRAPH
+0xE6C8	0x8CB6	#CJK UNIFIED IDEOGRAPH
+0xE6C9	0x8CC8	#CJK UNIFIED IDEOGRAPH
+0xE6CA	0x8CC1	#CJK UNIFIED IDEOGRAPH
+0xE6CB	0x8CE4	#CJK UNIFIED IDEOGRAPH
+0xE6CC	0x8CE3	#CJK UNIFIED IDEOGRAPH
+0xE6CD	0x8CDA	#CJK UNIFIED IDEOGRAPH
+0xE6CE	0x8CFD	#CJK UNIFIED IDEOGRAPH
+0xE6CF	0x8CFA	#CJK UNIFIED IDEOGRAPH
+0xE6D0	0x8CFB	#CJK UNIFIED IDEOGRAPH
+0xE6D1	0x8D04	#CJK UNIFIED IDEOGRAPH
+0xE6D2	0x8D05	#CJK UNIFIED IDEOGRAPH
+0xE6D3	0x8D0A	#CJK UNIFIED IDEOGRAPH
+0xE6D4	0x8D07	#CJK UNIFIED IDEOGRAPH
+0xE6D5	0x8D0F	#CJK UNIFIED IDEOGRAPH
+0xE6D6	0x8D0D	#CJK UNIFIED IDEOGRAPH
+0xE6D7	0x8D10	#CJK UNIFIED IDEOGRAPH
+0xE6D8	0x9F4E	#CJK UNIFIED IDEOGRAPH
+0xE6D9	0x8D13	#CJK UNIFIED IDEOGRAPH
+0xE6DA	0x8CCD	#CJK UNIFIED IDEOGRAPH
+0xE6DB	0x8D14	#CJK UNIFIED IDEOGRAPH
+0xE6DC	0x8D16	#CJK UNIFIED IDEOGRAPH
+0xE6DD	0x8D67	#CJK UNIFIED IDEOGRAPH
+0xE6DE	0x8D6D	#CJK UNIFIED IDEOGRAPH
+0xE6DF	0x8D71	#CJK UNIFIED IDEOGRAPH
+0xE6E0	0x8D73	#CJK UNIFIED IDEOGRAPH
+0xE6E1	0x8D81	#CJK UNIFIED IDEOGRAPH
+0xE6E2	0x8D99	#CJK UNIFIED IDEOGRAPH
+0xE6E3	0x8DC2	#CJK UNIFIED IDEOGRAPH
+0xE6E4	0x8DBE	#CJK UNIFIED IDEOGRAPH
+0xE6E5	0x8DBA	#CJK UNIFIED IDEOGRAPH
+0xE6E6	0x8DCF	#CJK UNIFIED IDEOGRAPH
+0xE6E7	0x8DDA	#CJK UNIFIED IDEOGRAPH
+0xE6E8	0x8DD6	#CJK UNIFIED IDEOGRAPH
+0xE6E9	0x8DCC	#CJK UNIFIED IDEOGRAPH
+0xE6EA	0x8DDB	#CJK UNIFIED IDEOGRAPH
+0xE6EB	0x8DCB	#CJK UNIFIED IDEOGRAPH
+0xE6EC	0x8DEA	#CJK UNIFIED IDEOGRAPH
+0xE6ED	0x8DEB	#CJK UNIFIED IDEOGRAPH
+0xE6EE	0x8DDF	#CJK UNIFIED IDEOGRAPH
+0xE6EF	0x8DE3	#CJK UNIFIED IDEOGRAPH
+0xE6F0	0x8DFC	#CJK UNIFIED IDEOGRAPH
+0xE6F1	0x8E08	#CJK UNIFIED IDEOGRAPH
+0xE6F2	0x8E09	#CJK UNIFIED IDEOGRAPH
+0xE6F3	0x8DFF	#CJK UNIFIED IDEOGRAPH
+0xE6F4	0x8E1D	#CJK UNIFIED IDEOGRAPH
+0xE6F5	0x8E1E	#CJK UNIFIED IDEOGRAPH
+0xE6F6	0x8E10	#CJK UNIFIED IDEOGRAPH
+0xE6F7	0x8E1F	#CJK UNIFIED IDEOGRAPH
+0xE6F8	0x8E42	#CJK UNIFIED IDEOGRAPH
+0xE6F9	0x8E35	#CJK UNIFIED IDEOGRAPH
+0xE6FA	0x8E30	#CJK UNIFIED IDEOGRAPH
+0xE6FB	0x8E34	#CJK UNIFIED IDEOGRAPH
+0xE6FC	0x8E4A	#CJK UNIFIED IDEOGRAPH
+0xE740	0x8E47	#CJK UNIFIED IDEOGRAPH
+0xE741	0x8E49	#CJK UNIFIED IDEOGRAPH
+0xE742	0x8E4C	#CJK UNIFIED IDEOGRAPH
+0xE743	0x8E50	#CJK UNIFIED IDEOGRAPH
+0xE744	0x8E48	#CJK UNIFIED IDEOGRAPH
+0xE745	0x8E59	#CJK UNIFIED IDEOGRAPH
+0xE746	0x8E64	#CJK UNIFIED IDEOGRAPH
+0xE747	0x8E60	#CJK UNIFIED IDEOGRAPH
+0xE748	0x8E2A	#CJK UNIFIED IDEOGRAPH
+0xE749	0x8E63	#CJK UNIFIED IDEOGRAPH
+0xE74A	0x8E55	#CJK UNIFIED IDEOGRAPH
+0xE74B	0x8E76	#CJK UNIFIED IDEOGRAPH
+0xE74C	0x8E72	#CJK UNIFIED IDEOGRAPH
+0xE74D	0x8E7C	#CJK UNIFIED IDEOGRAPH
+0xE74E	0x8E81	#CJK UNIFIED IDEOGRAPH
+0xE74F	0x8E87	#CJK UNIFIED IDEOGRAPH
+0xE750	0x8E85	#CJK UNIFIED IDEOGRAPH
+0xE751	0x8E84	#CJK UNIFIED IDEOGRAPH
+0xE752	0x8E8B	#CJK UNIFIED IDEOGRAPH
+0xE753	0x8E8A	#CJK UNIFIED IDEOGRAPH
+0xE754	0x8E93	#CJK UNIFIED IDEOGRAPH
+0xE755	0x8E91	#CJK UNIFIED IDEOGRAPH
+0xE756	0x8E94	#CJK UNIFIED IDEOGRAPH
+0xE757	0x8E99	#CJK UNIFIED IDEOGRAPH
+0xE758	0x8EAA	#CJK UNIFIED IDEOGRAPH
+0xE759	0x8EA1	#CJK UNIFIED IDEOGRAPH
+0xE75A	0x8EAC	#CJK UNIFIED IDEOGRAPH
+0xE75B	0x8EB0	#CJK UNIFIED IDEOGRAPH
+0xE75C	0x8EC6	#CJK UNIFIED IDEOGRAPH
+0xE75D	0x8EB1	#CJK UNIFIED IDEOGRAPH
+0xE75E	0x8EBE	#CJK UNIFIED IDEOGRAPH
+0xE75F	0x8EC5	#CJK UNIFIED IDEOGRAPH
+0xE760	0x8EC8	#CJK UNIFIED IDEOGRAPH
+0xE761	0x8ECB	#CJK UNIFIED IDEOGRAPH
+0xE762	0x8EDB	#CJK UNIFIED IDEOGRAPH
+0xE763	0x8EE3	#CJK UNIFIED IDEOGRAPH
+0xE764	0x8EFC	#CJK UNIFIED IDEOGRAPH
+0xE765	0x8EFB	#CJK UNIFIED IDEOGRAPH
+0xE766	0x8EEB	#CJK UNIFIED IDEOGRAPH
+0xE767	0x8EFE	#CJK UNIFIED IDEOGRAPH
+0xE768	0x8F0A	#CJK UNIFIED IDEOGRAPH
+0xE769	0x8F05	#CJK UNIFIED IDEOGRAPH
+0xE76A	0x8F15	#CJK UNIFIED IDEOGRAPH
+0xE76B	0x8F12	#CJK UNIFIED IDEOGRAPH
+0xE76C	0x8F19	#CJK UNIFIED IDEOGRAPH
+0xE76D	0x8F13	#CJK UNIFIED IDEOGRAPH
+0xE76E	0x8F1C	#CJK UNIFIED IDEOGRAPH
+0xE76F	0x8F1F	#CJK UNIFIED IDEOGRAPH
+0xE770	0x8F1B	#CJK UNIFIED IDEOGRAPH
+0xE771	0x8F0C	#CJK UNIFIED IDEOGRAPH
+0xE772	0x8F26	#CJK UNIFIED IDEOGRAPH
+0xE773	0x8F33	#CJK UNIFIED IDEOGRAPH
+0xE774	0x8F3B	#CJK UNIFIED IDEOGRAPH
+0xE775	0x8F39	#CJK UNIFIED IDEOGRAPH
+0xE776	0x8F45	#CJK UNIFIED IDEOGRAPH
+0xE777	0x8F42	#CJK UNIFIED IDEOGRAPH
+0xE778	0x8F3E	#CJK UNIFIED IDEOGRAPH
+0xE779	0x8F4C	#CJK UNIFIED IDEOGRAPH
+0xE77A	0x8F49	#CJK UNIFIED IDEOGRAPH
+0xE77B	0x8F46	#CJK UNIFIED IDEOGRAPH
+0xE77C	0x8F4E	#CJK UNIFIED IDEOGRAPH
+0xE77D	0x8F57	#CJK UNIFIED IDEOGRAPH
+0xE77E	0x8F5C	#CJK UNIFIED IDEOGRAPH
+0xE780	0x8F62	#CJK UNIFIED IDEOGRAPH
+0xE781	0x8F63	#CJK UNIFIED IDEOGRAPH
+0xE782	0x8F64	#CJK UNIFIED IDEOGRAPH
+0xE783	0x8F9C	#CJK UNIFIED IDEOGRAPH
+0xE784	0x8F9F	#CJK UNIFIED IDEOGRAPH
+0xE785	0x8FA3	#CJK UNIFIED IDEOGRAPH
+0xE786	0x8FAD	#CJK UNIFIED IDEOGRAPH
+0xE787	0x8FAF	#CJK UNIFIED IDEOGRAPH
+0xE788	0x8FB7	#CJK UNIFIED IDEOGRAPH
+0xE789	0x8FDA	#CJK UNIFIED IDEOGRAPH
+0xE78A	0x8FE5	#CJK UNIFIED IDEOGRAPH
+0xE78B	0x8FE2	#CJK UNIFIED IDEOGRAPH
+0xE78C	0x8FEA	#CJK UNIFIED IDEOGRAPH
+0xE78D	0x8FEF	#CJK UNIFIED IDEOGRAPH
+0xE78E	0x9087	#CJK UNIFIED IDEOGRAPH
+0xE78F	0x8FF4	#CJK UNIFIED IDEOGRAPH
+0xE790	0x9005	#CJK UNIFIED IDEOGRAPH
+0xE791	0x8FF9	#CJK UNIFIED IDEOGRAPH
+0xE792	0x8FFA	#CJK UNIFIED IDEOGRAPH
+0xE793	0x9011	#CJK UNIFIED IDEOGRAPH
+0xE794	0x9015	#CJK UNIFIED IDEOGRAPH
+0xE795	0x9021	#CJK UNIFIED IDEOGRAPH
+0xE796	0x900D	#CJK UNIFIED IDEOGRAPH
+0xE797	0x901E	#CJK UNIFIED IDEOGRAPH
+0xE798	0x9016	#CJK UNIFIED IDEOGRAPH
+0xE799	0x900B	#CJK UNIFIED IDEOGRAPH
+0xE79A	0x9027	#CJK UNIFIED IDEOGRAPH
+0xE79B	0x9036	#CJK UNIFIED IDEOGRAPH
+0xE79C	0x9035	#CJK UNIFIED IDEOGRAPH
+0xE79D	0x9039	#CJK UNIFIED IDEOGRAPH
+0xE79E	0x8FF8	#CJK UNIFIED IDEOGRAPH
+0xE79F	0x904F	#CJK UNIFIED IDEOGRAPH
+0xE7A0	0x9050	#CJK UNIFIED IDEOGRAPH
+0xE7A1	0x9051	#CJK UNIFIED IDEOGRAPH
+0xE7A2	0x9052	#CJK UNIFIED IDEOGRAPH
+0xE7A3	0x900E	#CJK UNIFIED IDEOGRAPH
+0xE7A4	0x9049	#CJK UNIFIED IDEOGRAPH
+0xE7A5	0x903E	#CJK UNIFIED IDEOGRAPH
+0xE7A6	0x9056	#CJK UNIFIED IDEOGRAPH
+0xE7A7	0x9058	#CJK UNIFIED IDEOGRAPH
+0xE7A8	0x905E	#CJK UNIFIED IDEOGRAPH
+0xE7A9	0x9068	#CJK UNIFIED IDEOGRAPH
+0xE7AA	0x906F	#CJK UNIFIED IDEOGRAPH
+0xE7AB	0x9076	#CJK UNIFIED IDEOGRAPH
+0xE7AC	0x96A8	#CJK UNIFIED IDEOGRAPH
+0xE7AD	0x9072	#CJK UNIFIED IDEOGRAPH
+0xE7AE	0x9082	#CJK UNIFIED IDEOGRAPH
+0xE7AF	0x907D	#CJK UNIFIED IDEOGRAPH
+0xE7B0	0x9081	#CJK UNIFIED IDEOGRAPH
+0xE7B1	0x9080	#CJK UNIFIED IDEOGRAPH
+0xE7B2	0x908A	#CJK UNIFIED IDEOGRAPH
+0xE7B3	0x9089	#CJK UNIFIED IDEOGRAPH
+0xE7B4	0x908F	#CJK UNIFIED IDEOGRAPH
+0xE7B5	0x90A8	#CJK UNIFIED IDEOGRAPH
+0xE7B6	0x90AF	#CJK UNIFIED IDEOGRAPH
+0xE7B7	0x90B1	#CJK UNIFIED IDEOGRAPH
+0xE7B8	0x90B5	#CJK UNIFIED IDEOGRAPH
+0xE7B9	0x90E2	#CJK UNIFIED IDEOGRAPH
+0xE7BA	0x90E4	#CJK UNIFIED IDEOGRAPH
+0xE7BB	0x6248	#CJK UNIFIED IDEOGRAPH
+0xE7BC	0x90DB	#CJK UNIFIED IDEOGRAPH
+0xE7BD	0x9102	#CJK UNIFIED IDEOGRAPH
+0xE7BE	0x9112	#CJK UNIFIED IDEOGRAPH
+0xE7BF	0x9119	#CJK UNIFIED IDEOGRAPH
+0xE7C0	0x9132	#CJK UNIFIED IDEOGRAPH
+0xE7C1	0x9130	#CJK UNIFIED IDEOGRAPH
+0xE7C2	0x914A	#CJK UNIFIED IDEOGRAPH
+0xE7C3	0x9156	#CJK UNIFIED IDEOGRAPH
+0xE7C4	0x9158	#CJK UNIFIED IDEOGRAPH
+0xE7C5	0x9163	#CJK UNIFIED IDEOGRAPH
+0xE7C6	0x9165	#CJK UNIFIED IDEOGRAPH
+0xE7C7	0x9169	#CJK UNIFIED IDEOGRAPH
+0xE7C8	0x9173	#CJK UNIFIED IDEOGRAPH
+0xE7C9	0x9172	#CJK UNIFIED IDEOGRAPH
+0xE7CA	0x918B	#CJK UNIFIED IDEOGRAPH
+0xE7CB	0x9189	#CJK UNIFIED IDEOGRAPH
+0xE7CC	0x9182	#CJK UNIFIED IDEOGRAPH
+0xE7CD	0x91A2	#CJK UNIFIED IDEOGRAPH
+0xE7CE	0x91AB	#CJK UNIFIED IDEOGRAPH
+0xE7CF	0x91AF	#CJK UNIFIED IDEOGRAPH
+0xE7D0	0x91AA	#CJK UNIFIED IDEOGRAPH
+0xE7D1	0x91B5	#CJK UNIFIED IDEOGRAPH
+0xE7D2	0x91B4	#CJK UNIFIED IDEOGRAPH
+0xE7D3	0x91BA	#CJK UNIFIED IDEOGRAPH
+0xE7D4	0x91C0	#CJK UNIFIED IDEOGRAPH
+0xE7D5	0x91C1	#CJK UNIFIED IDEOGRAPH
+0xE7D6	0x91C9	#CJK UNIFIED IDEOGRAPH
+0xE7D7	0x91CB	#CJK UNIFIED IDEOGRAPH
+0xE7D8	0x91D0	#CJK UNIFIED IDEOGRAPH
+0xE7D9	0x91D6	#CJK UNIFIED IDEOGRAPH
+0xE7DA	0x91DF	#CJK UNIFIED IDEOGRAPH
+0xE7DB	0x91E1	#CJK UNIFIED IDEOGRAPH
+0xE7DC	0x91DB	#CJK UNIFIED IDEOGRAPH
+0xE7DD	0x91FC	#CJK UNIFIED IDEOGRAPH
+0xE7DE	0x91F5	#CJK UNIFIED IDEOGRAPH
+0xE7DF	0x91F6	#CJK UNIFIED IDEOGRAPH
+0xE7E0	0x921E	#CJK UNIFIED IDEOGRAPH
+0xE7E1	0x91FF	#CJK UNIFIED IDEOGRAPH
+0xE7E2	0x9214	#CJK UNIFIED IDEOGRAPH
+0xE7E3	0x922C	#CJK UNIFIED IDEOGRAPH
+0xE7E4	0x9215	#CJK UNIFIED IDEOGRAPH
+0xE7E5	0x9211	#CJK UNIFIED IDEOGRAPH
+0xE7E6	0x925E	#CJK UNIFIED IDEOGRAPH
+0xE7E7	0x9257	#CJK UNIFIED IDEOGRAPH
+0xE7E8	0x9245	#CJK UNIFIED IDEOGRAPH
+0xE7E9	0x9249	#CJK UNIFIED IDEOGRAPH
+0xE7EA	0x9264	#CJK UNIFIED IDEOGRAPH
+0xE7EB	0x9248	#CJK UNIFIED IDEOGRAPH
+0xE7EC	0x9295	#CJK UNIFIED IDEOGRAPH
+0xE7ED	0x923F	#CJK UNIFIED IDEOGRAPH
+0xE7EE	0x924B	#CJK UNIFIED IDEOGRAPH
+0xE7EF	0x9250	#CJK UNIFIED IDEOGRAPH
+0xE7F0	0x929C	#CJK UNIFIED IDEOGRAPH
+0xE7F1	0x9296	#CJK UNIFIED IDEOGRAPH
+0xE7F2	0x9293	#CJK UNIFIED IDEOGRAPH
+0xE7F3	0x929B	#CJK UNIFIED IDEOGRAPH
+0xE7F4	0x925A	#CJK UNIFIED IDEOGRAPH
+0xE7F5	0x92CF	#CJK UNIFIED IDEOGRAPH
+0xE7F6	0x92B9	#CJK UNIFIED IDEOGRAPH
+0xE7F7	0x92B7	#CJK UNIFIED IDEOGRAPH
+0xE7F8	0x92E9	#CJK UNIFIED IDEOGRAPH
+0xE7F9	0x930F	#CJK UNIFIED IDEOGRAPH
+0xE7FA	0x92FA	#CJK UNIFIED IDEOGRAPH
+0xE7FB	0x9344	#CJK UNIFIED IDEOGRAPH
+0xE7FC	0x932E	#CJK UNIFIED IDEOGRAPH
+0xE840	0x9319	#CJK UNIFIED IDEOGRAPH
+0xE841	0x9322	#CJK UNIFIED IDEOGRAPH
+0xE842	0x931A	#CJK UNIFIED IDEOGRAPH
+0xE843	0x9323	#CJK UNIFIED IDEOGRAPH
+0xE844	0x933A	#CJK UNIFIED IDEOGRAPH
+0xE845	0x9335	#CJK UNIFIED IDEOGRAPH
+0xE846	0x933B	#CJK UNIFIED IDEOGRAPH
+0xE847	0x935C	#CJK UNIFIED IDEOGRAPH
+0xE848	0x9360	#CJK UNIFIED IDEOGRAPH
+0xE849	0x937C	#CJK UNIFIED IDEOGRAPH
+0xE84A	0x936E	#CJK UNIFIED IDEOGRAPH
+0xE84B	0x9356	#CJK UNIFIED IDEOGRAPH
+0xE84C	0x93B0	#CJK UNIFIED IDEOGRAPH
+0xE84D	0x93AC	#CJK UNIFIED IDEOGRAPH
+0xE84E	0x93AD	#CJK UNIFIED IDEOGRAPH
+0xE84F	0x9394	#CJK UNIFIED IDEOGRAPH
+0xE850	0x93B9	#CJK UNIFIED IDEOGRAPH
+0xE851	0x93D6	#CJK UNIFIED IDEOGRAPH
+0xE852	0x93D7	#CJK UNIFIED IDEOGRAPH
+0xE853	0x93E8	#CJK UNIFIED IDEOGRAPH
+0xE854	0x93E5	#CJK UNIFIED IDEOGRAPH
+0xE855	0x93D8	#CJK UNIFIED IDEOGRAPH
+0xE856	0x93C3	#CJK UNIFIED IDEOGRAPH
+0xE857	0x93DD	#CJK UNIFIED IDEOGRAPH
+0xE858	0x93D0	#CJK UNIFIED IDEOGRAPH
+0xE859	0x93C8	#CJK UNIFIED IDEOGRAPH
+0xE85A	0x93E4	#CJK UNIFIED IDEOGRAPH
+0xE85B	0x941A	#CJK UNIFIED IDEOGRAPH
+0xE85C	0x9414	#CJK UNIFIED IDEOGRAPH
+0xE85D	0x9413	#CJK UNIFIED IDEOGRAPH
+0xE85E	0x9403	#CJK UNIFIED IDEOGRAPH
+0xE85F	0x9407	#CJK UNIFIED IDEOGRAPH
+0xE860	0x9410	#CJK UNIFIED IDEOGRAPH
+0xE861	0x9436	#CJK UNIFIED IDEOGRAPH
+0xE862	0x942B	#CJK UNIFIED IDEOGRAPH
+0xE863	0x9435	#CJK UNIFIED IDEOGRAPH
+0xE864	0x9421	#CJK UNIFIED IDEOGRAPH
+0xE865	0x943A	#CJK UNIFIED IDEOGRAPH
+0xE866	0x9441	#CJK UNIFIED IDEOGRAPH
+0xE867	0x9452	#CJK UNIFIED IDEOGRAPH
+0xE868	0x9444	#CJK UNIFIED IDEOGRAPH
+0xE869	0x945B	#CJK UNIFIED IDEOGRAPH
+0xE86A	0x9460	#CJK UNIFIED IDEOGRAPH
+0xE86B	0x9462	#CJK UNIFIED IDEOGRAPH
+0xE86C	0x945E	#CJK UNIFIED IDEOGRAPH
+0xE86D	0x946A	#CJK UNIFIED IDEOGRAPH
+0xE86E	0x9229	#CJK UNIFIED IDEOGRAPH
+0xE86F	0x9470	#CJK UNIFIED IDEOGRAPH
+0xE870	0x9475	#CJK UNIFIED IDEOGRAPH
+0xE871	0x9477	#CJK UNIFIED IDEOGRAPH
+0xE872	0x947D	#CJK UNIFIED IDEOGRAPH
+0xE873	0x945A	#CJK UNIFIED IDEOGRAPH
+0xE874	0x947C	#CJK UNIFIED IDEOGRAPH
+0xE875	0x947E	#CJK UNIFIED IDEOGRAPH
+0xE876	0x9481	#CJK UNIFIED IDEOGRAPH
+0xE877	0x947F	#CJK UNIFIED IDEOGRAPH
+0xE878	0x9582	#CJK UNIFIED IDEOGRAPH
+0xE879	0x9587	#CJK UNIFIED IDEOGRAPH
+0xE87A	0x958A	#CJK UNIFIED IDEOGRAPH
+0xE87B	0x9594	#CJK UNIFIED IDEOGRAPH
+0xE87C	0x9596	#CJK UNIFIED IDEOGRAPH
+0xE87D	0x9598	#CJK UNIFIED IDEOGRAPH
+0xE87E	0x9599	#CJK UNIFIED IDEOGRAPH
+0xE880	0x95A0	#CJK UNIFIED IDEOGRAPH
+0xE881	0x95A8	#CJK UNIFIED IDEOGRAPH
+0xE882	0x95A7	#CJK UNIFIED IDEOGRAPH
+0xE883	0x95AD	#CJK UNIFIED IDEOGRAPH
+0xE884	0x95BC	#CJK UNIFIED IDEOGRAPH
+0xE885	0x95BB	#CJK UNIFIED IDEOGRAPH
+0xE886	0x95B9	#CJK UNIFIED IDEOGRAPH
+0xE887	0x95BE	#CJK UNIFIED IDEOGRAPH
+0xE888	0x95CA	#CJK UNIFIED IDEOGRAPH
+0xE889	0x6FF6	#CJK UNIFIED IDEOGRAPH
+0xE88A	0x95C3	#CJK UNIFIED IDEOGRAPH
+0xE88B	0x95CD	#CJK UNIFIED IDEOGRAPH
+0xE88C	0x95CC	#CJK UNIFIED IDEOGRAPH
+0xE88D	0x95D5	#CJK UNIFIED IDEOGRAPH
+0xE88E	0x95D4	#CJK UNIFIED IDEOGRAPH
+0xE88F	0x95D6	#CJK UNIFIED IDEOGRAPH
+0xE890	0x95DC	#CJK UNIFIED IDEOGRAPH
+0xE891	0x95E1	#CJK UNIFIED IDEOGRAPH
+0xE892	0x95E5	#CJK UNIFIED IDEOGRAPH
+0xE893	0x95E2	#CJK UNIFIED IDEOGRAPH
+0xE894	0x9621	#CJK UNIFIED IDEOGRAPH
+0xE895	0x9628	#CJK UNIFIED IDEOGRAPH
+0xE896	0x962E	#CJK UNIFIED IDEOGRAPH
+0xE897	0x962F	#CJK UNIFIED IDEOGRAPH
+0xE898	0x9642	#CJK UNIFIED IDEOGRAPH
+0xE899	0x964C	#CJK UNIFIED IDEOGRAPH
+0xE89A	0x964F	#CJK UNIFIED IDEOGRAPH
+0xE89B	0x964B	#CJK UNIFIED IDEOGRAPH
+0xE89C	0x9677	#CJK UNIFIED IDEOGRAPH
+0xE89D	0x965C	#CJK UNIFIED IDEOGRAPH
+0xE89E	0x965E	#CJK UNIFIED IDEOGRAPH
+0xE89F	0x965D	#CJK UNIFIED IDEOGRAPH
+0xE8A0	0x965F	#CJK UNIFIED IDEOGRAPH
+0xE8A1	0x9666	#CJK UNIFIED IDEOGRAPH
+0xE8A2	0x9672	#CJK UNIFIED IDEOGRAPH
+0xE8A3	0x966C	#CJK UNIFIED IDEOGRAPH
+0xE8A4	0x968D	#CJK UNIFIED IDEOGRAPH
+0xE8A5	0x9698	#CJK UNIFIED IDEOGRAPH
+0xE8A6	0x9695	#CJK UNIFIED IDEOGRAPH
+0xE8A7	0x9697	#CJK UNIFIED IDEOGRAPH
+0xE8A8	0x96AA	#CJK UNIFIED IDEOGRAPH
+0xE8A9	0x96A7	#CJK UNIFIED IDEOGRAPH
+0xE8AA	0x96B1	#CJK UNIFIED IDEOGRAPH
+0xE8AB	0x96B2	#CJK UNIFIED IDEOGRAPH
+0xE8AC	0x96B0	#CJK UNIFIED IDEOGRAPH
+0xE8AD	0x96B4	#CJK UNIFIED IDEOGRAPH
+0xE8AE	0x96B6	#CJK UNIFIED IDEOGRAPH
+0xE8AF	0x96B8	#CJK UNIFIED IDEOGRAPH
+0xE8B0	0x96B9	#CJK UNIFIED IDEOGRAPH
+0xE8B1	0x96CE	#CJK UNIFIED IDEOGRAPH
+0xE8B2	0x96CB	#CJK UNIFIED IDEOGRAPH
+0xE8B3	0x96C9	#CJK UNIFIED IDEOGRAPH
+0xE8B4	0x96CD	#CJK UNIFIED IDEOGRAPH
+0xE8B5	0x894D	#CJK UNIFIED IDEOGRAPH
+0xE8B6	0x96DC	#CJK UNIFIED IDEOGRAPH
+0xE8B7	0x970D	#CJK UNIFIED IDEOGRAPH
+0xE8B8	0x96D5	#CJK UNIFIED IDEOGRAPH
+0xE8B9	0x96F9	#CJK UNIFIED IDEOGRAPH
+0xE8BA	0x9704	#CJK UNIFIED IDEOGRAPH
+0xE8BB	0x9706	#CJK UNIFIED IDEOGRAPH
+0xE8BC	0x9708	#CJK UNIFIED IDEOGRAPH
+0xE8BD	0x9713	#CJK UNIFIED IDEOGRAPH
+0xE8BE	0x970E	#CJK UNIFIED IDEOGRAPH
+0xE8BF	0x9711	#CJK UNIFIED IDEOGRAPH
+0xE8C0	0x970F	#CJK UNIFIED IDEOGRAPH
+0xE8C1	0x9716	#CJK UNIFIED IDEOGRAPH
+0xE8C2	0x9719	#CJK UNIFIED IDEOGRAPH
+0xE8C3	0x9724	#CJK UNIFIED IDEOGRAPH
+0xE8C4	0x972A	#CJK UNIFIED IDEOGRAPH
+0xE8C5	0x9730	#CJK UNIFIED IDEOGRAPH
+0xE8C6	0x9739	#CJK UNIFIED IDEOGRAPH
+0xE8C7	0x973D	#CJK UNIFIED IDEOGRAPH
+0xE8C8	0x973E	#CJK UNIFIED IDEOGRAPH
+0xE8C9	0x9744	#CJK UNIFIED IDEOGRAPH
+0xE8CA	0x9746	#CJK UNIFIED IDEOGRAPH
+0xE8CB	0x9748	#CJK UNIFIED IDEOGRAPH
+0xE8CC	0x9742	#CJK UNIFIED IDEOGRAPH
+0xE8CD	0x9749	#CJK UNIFIED IDEOGRAPH
+0xE8CE	0x975C	#CJK UNIFIED IDEOGRAPH
+0xE8CF	0x9760	#CJK UNIFIED IDEOGRAPH
+0xE8D0	0x9764	#CJK UNIFIED IDEOGRAPH
+0xE8D1	0x9766	#CJK UNIFIED IDEOGRAPH
+0xE8D2	0x9768	#CJK UNIFIED IDEOGRAPH
+0xE8D3	0x52D2	#CJK UNIFIED IDEOGRAPH
+0xE8D4	0x976B	#CJK UNIFIED IDEOGRAPH
+0xE8D5	0x9771	#CJK UNIFIED IDEOGRAPH
+0xE8D6	0x9779	#CJK UNIFIED IDEOGRAPH
+0xE8D7	0x9785	#CJK UNIFIED IDEOGRAPH
+0xE8D8	0x977C	#CJK UNIFIED IDEOGRAPH
+0xE8D9	0x9781	#CJK UNIFIED IDEOGRAPH
+0xE8DA	0x977A	#CJK UNIFIED IDEOGRAPH
+0xE8DB	0x9786	#CJK UNIFIED IDEOGRAPH
+0xE8DC	0x978B	#CJK UNIFIED IDEOGRAPH
+0xE8DD	0x978F	#CJK UNIFIED IDEOGRAPH
+0xE8DE	0x9790	#CJK UNIFIED IDEOGRAPH
+0xE8DF	0x979C	#CJK UNIFIED IDEOGRAPH
+0xE8E0	0x97A8	#CJK UNIFIED IDEOGRAPH
+0xE8E1	0x97A6	#CJK UNIFIED IDEOGRAPH
+0xE8E2	0x97A3	#CJK UNIFIED IDEOGRAPH
+0xE8E3	0x97B3	#CJK UNIFIED IDEOGRAPH
+0xE8E4	0x97B4	#CJK UNIFIED IDEOGRAPH
+0xE8E5	0x97C3	#CJK UNIFIED IDEOGRAPH
+0xE8E6	0x97C6	#CJK UNIFIED IDEOGRAPH
+0xE8E7	0x97C8	#CJK UNIFIED IDEOGRAPH
+0xE8E8	0x97CB	#CJK UNIFIED IDEOGRAPH
+0xE8E9	0x97DC	#CJK UNIFIED IDEOGRAPH
+0xE8EA	0x97ED	#CJK UNIFIED IDEOGRAPH
+0xE8EB	0x9F4F	#CJK UNIFIED IDEOGRAPH
+0xE8EC	0x97F2	#CJK UNIFIED IDEOGRAPH
+0xE8ED	0x7ADF	#CJK UNIFIED IDEOGRAPH
+0xE8EE	0x97F6	#CJK UNIFIED IDEOGRAPH
+0xE8EF	0x97F5	#CJK UNIFIED IDEOGRAPH
+0xE8F0	0x980F	#CJK UNIFIED IDEOGRAPH
+0xE8F1	0x980C	#CJK UNIFIED IDEOGRAPH
+0xE8F2	0x9838	#CJK UNIFIED IDEOGRAPH
+0xE8F3	0x9824	#CJK UNIFIED IDEOGRAPH
+0xE8F4	0x9821	#CJK UNIFIED IDEOGRAPH
+0xE8F5	0x9837	#CJK UNIFIED IDEOGRAPH
+0xE8F6	0x983D	#CJK UNIFIED IDEOGRAPH
+0xE8F7	0x9846	#CJK UNIFIED IDEOGRAPH
+0xE8F8	0x984F	#CJK UNIFIED IDEOGRAPH
+0xE8F9	0x984B	#CJK UNIFIED IDEOGRAPH
+0xE8FA	0x986B	#CJK UNIFIED IDEOGRAPH
+0xE8FB	0x986F	#CJK UNIFIED IDEOGRAPH
+0xE8FC	0x9870	#CJK UNIFIED IDEOGRAPH
+0xE940	0x9871	#CJK UNIFIED IDEOGRAPH
+0xE941	0x9874	#CJK UNIFIED IDEOGRAPH
+0xE942	0x9873	#CJK UNIFIED IDEOGRAPH
+0xE943	0x98AA	#CJK UNIFIED IDEOGRAPH
+0xE944	0x98AF	#CJK UNIFIED IDEOGRAPH
+0xE945	0x98B1	#CJK UNIFIED IDEOGRAPH
+0xE946	0x98B6	#CJK UNIFIED IDEOGRAPH
+0xE947	0x98C4	#CJK UNIFIED IDEOGRAPH
+0xE948	0x98C3	#CJK UNIFIED IDEOGRAPH
+0xE949	0x98C6	#CJK UNIFIED IDEOGRAPH
+0xE94A	0x98E9	#CJK UNIFIED IDEOGRAPH
+0xE94B	0x98EB	#CJK UNIFIED IDEOGRAPH
+0xE94C	0x9903	#CJK UNIFIED IDEOGRAPH
+0xE94D	0x9909	#CJK UNIFIED IDEOGRAPH
+0xE94E	0x9912	#CJK UNIFIED IDEOGRAPH
+0xE94F	0x9914	#CJK UNIFIED IDEOGRAPH
+0xE950	0x9918	#CJK UNIFIED IDEOGRAPH
+0xE951	0x9921	#CJK UNIFIED IDEOGRAPH
+0xE952	0x991D	#CJK UNIFIED IDEOGRAPH
+0xE953	0x991E	#CJK UNIFIED IDEOGRAPH
+0xE954	0x9924	#CJK UNIFIED IDEOGRAPH
+0xE955	0x9920	#CJK UNIFIED IDEOGRAPH
+0xE956	0x992C	#CJK UNIFIED IDEOGRAPH
+0xE957	0x992E	#CJK UNIFIED IDEOGRAPH
+0xE958	0x993D	#CJK UNIFIED IDEOGRAPH
+0xE959	0x993E	#CJK UNIFIED IDEOGRAPH
+0xE95A	0x9942	#CJK UNIFIED IDEOGRAPH
+0xE95B	0x9949	#CJK UNIFIED IDEOGRAPH
+0xE95C	0x9945	#CJK UNIFIED IDEOGRAPH
+0xE95D	0x9950	#CJK UNIFIED IDEOGRAPH
+0xE95E	0x994B	#CJK UNIFIED IDEOGRAPH
+0xE95F	0x9951	#CJK UNIFIED IDEOGRAPH
+0xE960	0x9952	#CJK UNIFIED IDEOGRAPH
+0xE961	0x994C	#CJK UNIFIED IDEOGRAPH
+0xE962	0x9955	#CJK UNIFIED IDEOGRAPH
+0xE963	0x9997	#CJK UNIFIED IDEOGRAPH
+0xE964	0x9998	#CJK UNIFIED IDEOGRAPH
+0xE965	0x99A5	#CJK UNIFIED IDEOGRAPH
+0xE966	0x99AD	#CJK UNIFIED IDEOGRAPH
+0xE967	0x99AE	#CJK UNIFIED IDEOGRAPH
+0xE968	0x99BC	#CJK UNIFIED IDEOGRAPH
+0xE969	0x99DF	#CJK UNIFIED IDEOGRAPH
+0xE96A	0x99DB	#CJK UNIFIED IDEOGRAPH
+0xE96B	0x99DD	#CJK UNIFIED IDEOGRAPH
+0xE96C	0x99D8	#CJK UNIFIED IDEOGRAPH
+0xE96D	0x99D1	#CJK UNIFIED IDEOGRAPH
+0xE96E	0x99ED	#CJK UNIFIED IDEOGRAPH
+0xE96F	0x99EE	#CJK UNIFIED IDEOGRAPH
+0xE970	0x99F1	#CJK UNIFIED IDEOGRAPH
+0xE971	0x99F2	#CJK UNIFIED IDEOGRAPH
+0xE972	0x99FB	#CJK UNIFIED IDEOGRAPH
+0xE973	0x99F8	#CJK UNIFIED IDEOGRAPH
+0xE974	0x9A01	#CJK UNIFIED IDEOGRAPH
+0xE975	0x9A0F	#CJK UNIFIED IDEOGRAPH
+0xE976	0x9A05	#CJK UNIFIED IDEOGRAPH
+0xE977	0x99E2	#CJK UNIFIED IDEOGRAPH
+0xE978	0x9A19	#CJK UNIFIED IDEOGRAPH
+0xE979	0x9A2B	#CJK UNIFIED IDEOGRAPH
+0xE97A	0x9A37	#CJK UNIFIED IDEOGRAPH
+0xE97B	0x9A45	#CJK UNIFIED IDEOGRAPH
+0xE97C	0x9A42	#CJK UNIFIED IDEOGRAPH
+0xE97D	0x9A40	#CJK UNIFIED IDEOGRAPH
+0xE97E	0x9A43	#CJK UNIFIED IDEOGRAPH
+0xE980	0x9A3E	#CJK UNIFIED IDEOGRAPH
+0xE981	0x9A55	#CJK UNIFIED IDEOGRAPH
+0xE982	0x9A4D	#CJK UNIFIED IDEOGRAPH
+0xE983	0x9A5B	#CJK UNIFIED IDEOGRAPH
+0xE984	0x9A57	#CJK UNIFIED IDEOGRAPH
+0xE985	0x9A5F	#CJK UNIFIED IDEOGRAPH
+0xE986	0x9A62	#CJK UNIFIED IDEOGRAPH
+0xE987	0x9A65	#CJK UNIFIED IDEOGRAPH
+0xE988	0x9A64	#CJK UNIFIED IDEOGRAPH
+0xE989	0x9A69	#CJK UNIFIED IDEOGRAPH
+0xE98A	0x9A6B	#CJK UNIFIED IDEOGRAPH
+0xE98B	0x9A6A	#CJK UNIFIED IDEOGRAPH
+0xE98C	0x9AAD	#CJK UNIFIED IDEOGRAPH
+0xE98D	0x9AB0	#CJK UNIFIED IDEOGRAPH
+0xE98E	0x9ABC	#CJK UNIFIED IDEOGRAPH
+0xE98F	0x9AC0	#CJK UNIFIED IDEOGRAPH
+0xE990	0x9ACF	#CJK UNIFIED IDEOGRAPH
+0xE991	0x9AD1	#CJK UNIFIED IDEOGRAPH
+0xE992	0x9AD3	#CJK UNIFIED IDEOGRAPH
+0xE993	0x9AD4	#CJK UNIFIED IDEOGRAPH
+0xE994	0x9ADE	#CJK UNIFIED IDEOGRAPH
+0xE995	0x9ADF	#CJK UNIFIED IDEOGRAPH
+0xE996	0x9AE2	#CJK UNIFIED IDEOGRAPH
+0xE997	0x9AE3	#CJK UNIFIED IDEOGRAPH
+0xE998	0x9AE6	#CJK UNIFIED IDEOGRAPH
+0xE999	0x9AEF	#CJK UNIFIED IDEOGRAPH
+0xE99A	0x9AEB	#CJK UNIFIED IDEOGRAPH
+0xE99B	0x9AEE	#CJK UNIFIED IDEOGRAPH
+0xE99C	0x9AF4	#CJK UNIFIED IDEOGRAPH
+0xE99D	0x9AF1	#CJK UNIFIED IDEOGRAPH
+0xE99E	0x9AF7	#CJK UNIFIED IDEOGRAPH
+0xE99F	0x9AFB	#CJK UNIFIED IDEOGRAPH
+0xE9A0	0x9B06	#CJK UNIFIED IDEOGRAPH
+0xE9A1	0x9B18	#CJK UNIFIED IDEOGRAPH
+0xE9A2	0x9B1A	#CJK UNIFIED IDEOGRAPH
+0xE9A3	0x9B1F	#CJK UNIFIED IDEOGRAPH
+0xE9A4	0x9B22	#CJK UNIFIED IDEOGRAPH
+0xE9A5	0x9B23	#CJK UNIFIED IDEOGRAPH
+0xE9A6	0x9B25	#CJK UNIFIED IDEOGRAPH
+0xE9A7	0x9B27	#CJK UNIFIED IDEOGRAPH
+0xE9A8	0x9B28	#CJK UNIFIED IDEOGRAPH
+0xE9A9	0x9B29	#CJK UNIFIED IDEOGRAPH
+0xE9AA	0x9B2A	#CJK UNIFIED IDEOGRAPH
+0xE9AB	0x9B2E	#CJK UNIFIED IDEOGRAPH
+0xE9AC	0x9B2F	#CJK UNIFIED IDEOGRAPH
+0xE9AD	0x9B32	#CJK UNIFIED IDEOGRAPH
+0xE9AE	0x9B44	#CJK UNIFIED IDEOGRAPH
+0xE9AF	0x9B43	#CJK UNIFIED IDEOGRAPH
+0xE9B0	0x9B4F	#CJK UNIFIED IDEOGRAPH
+0xE9B1	0x9B4D	#CJK UNIFIED IDEOGRAPH
+0xE9B2	0x9B4E	#CJK UNIFIED IDEOGRAPH
+0xE9B3	0x9B51	#CJK UNIFIED IDEOGRAPH
+0xE9B4	0x9B58	#CJK UNIFIED IDEOGRAPH
+0xE9B5	0x9B74	#CJK UNIFIED IDEOGRAPH
+0xE9B6	0x9B93	#CJK UNIFIED IDEOGRAPH
+0xE9B7	0x9B83	#CJK UNIFIED IDEOGRAPH
+0xE9B8	0x9B91	#CJK UNIFIED IDEOGRAPH
+0xE9B9	0x9B96	#CJK UNIFIED IDEOGRAPH
+0xE9BA	0x9B97	#CJK UNIFIED IDEOGRAPH
+0xE9BB	0x9B9F	#CJK UNIFIED IDEOGRAPH
+0xE9BC	0x9BA0	#CJK UNIFIED IDEOGRAPH
+0xE9BD	0x9BA8	#CJK UNIFIED IDEOGRAPH
+0xE9BE	0x9BB4	#CJK UNIFIED IDEOGRAPH
+0xE9BF	0x9BC0	#CJK UNIFIED IDEOGRAPH
+0xE9C0	0x9BCA	#CJK UNIFIED IDEOGRAPH
+0xE9C1	0x9BB9	#CJK UNIFIED IDEOGRAPH
+0xE9C2	0x9BC6	#CJK UNIFIED IDEOGRAPH
+0xE9C3	0x9BCF	#CJK UNIFIED IDEOGRAPH
+0xE9C4	0x9BD1	#CJK UNIFIED IDEOGRAPH
+0xE9C5	0x9BD2	#CJK UNIFIED IDEOGRAPH
+0xE9C6	0x9BE3	#CJK UNIFIED IDEOGRAPH
+0xE9C7	0x9BE2	#CJK UNIFIED IDEOGRAPH
+0xE9C8	0x9BE4	#CJK UNIFIED IDEOGRAPH
+0xE9C9	0x9BD4	#CJK UNIFIED IDEOGRAPH
+0xE9CA	0x9BE1	#CJK UNIFIED IDEOGRAPH
+0xE9CB	0x9C3A	#CJK UNIFIED IDEOGRAPH
+0xE9CC	0x9BF2	#CJK UNIFIED IDEOGRAPH
+0xE9CD	0x9BF1	#CJK UNIFIED IDEOGRAPH
+0xE9CE	0x9BF0	#CJK UNIFIED IDEOGRAPH
+0xE9CF	0x9C15	#CJK UNIFIED IDEOGRAPH
+0xE9D0	0x9C14	#CJK UNIFIED IDEOGRAPH
+0xE9D1	0x9C09	#CJK UNIFIED IDEOGRAPH
+0xE9D2	0x9C13	#CJK UNIFIED IDEOGRAPH
+0xE9D3	0x9C0C	#CJK UNIFIED IDEOGRAPH
+0xE9D4	0x9C06	#CJK UNIFIED IDEOGRAPH
+0xE9D5	0x9C08	#CJK UNIFIED IDEOGRAPH
+0xE9D6	0x9C12	#CJK UNIFIED IDEOGRAPH
+0xE9D7	0x9C0A	#CJK UNIFIED IDEOGRAPH
+0xE9D8	0x9C04	#CJK UNIFIED IDEOGRAPH
+0xE9D9	0x9C2E	#CJK UNIFIED IDEOGRAPH
+0xE9DA	0x9C1B	#CJK UNIFIED IDEOGRAPH
+0xE9DB	0x9C25	#CJK UNIFIED IDEOGRAPH
+0xE9DC	0x9C24	#CJK UNIFIED IDEOGRAPH
+0xE9DD	0x9C21	#CJK UNIFIED IDEOGRAPH
+0xE9DE	0x9C30	#CJK UNIFIED IDEOGRAPH
+0xE9DF	0x9C47	#CJK UNIFIED IDEOGRAPH
+0xE9E0	0x9C32	#CJK UNIFIED IDEOGRAPH
+0xE9E1	0x9C46	#CJK UNIFIED IDEOGRAPH
+0xE9E2	0x9C3E	#CJK UNIFIED IDEOGRAPH
+0xE9E3	0x9C5A	#CJK UNIFIED IDEOGRAPH
+0xE9E4	0x9C60	#CJK UNIFIED IDEOGRAPH
+0xE9E5	0x9C67	#CJK UNIFIED IDEOGRAPH
+0xE9E6	0x9C76	#CJK UNIFIED IDEOGRAPH
+0xE9E7	0x9C78	#CJK UNIFIED IDEOGRAPH
+0xE9E8	0x9CE7	#CJK UNIFIED IDEOGRAPH
+0xE9E9	0x9CEC	#CJK UNIFIED IDEOGRAPH
+0xE9EA	0x9CF0	#CJK UNIFIED IDEOGRAPH
+0xE9EB	0x9D09	#CJK UNIFIED IDEOGRAPH
+0xE9EC	0x9D08	#CJK UNIFIED IDEOGRAPH
+0xE9ED	0x9CEB	#CJK UNIFIED IDEOGRAPH
+0xE9EE	0x9D03	#CJK UNIFIED IDEOGRAPH
+0xE9EF	0x9D06	#CJK UNIFIED IDEOGRAPH
+0xE9F0	0x9D2A	#CJK UNIFIED IDEOGRAPH
+0xE9F1	0x9D26	#CJK UNIFIED IDEOGRAPH
+0xE9F2	0x9DAF	#CJK UNIFIED IDEOGRAPH
+0xE9F3	0x9D23	#CJK UNIFIED IDEOGRAPH
+0xE9F4	0x9D1F	#CJK UNIFIED IDEOGRAPH
+0xE9F5	0x9D44	#CJK UNIFIED IDEOGRAPH
+0xE9F6	0x9D15	#CJK UNIFIED IDEOGRAPH
+0xE9F7	0x9D12	#CJK UNIFIED IDEOGRAPH
+0xE9F8	0x9D41	#CJK UNIFIED IDEOGRAPH
+0xE9F9	0x9D3F	#CJK UNIFIED IDEOGRAPH
+0xE9FA	0x9D3E	#CJK UNIFIED IDEOGRAPH
+0xE9FB	0x9D46	#CJK UNIFIED IDEOGRAPH
+0xE9FC	0x9D48	#CJK UNIFIED IDEOGRAPH
+0xEA40	0x9D5D	#CJK UNIFIED IDEOGRAPH
+0xEA41	0x9D5E	#CJK UNIFIED IDEOGRAPH
+0xEA42	0x9D64	#CJK UNIFIED IDEOGRAPH
+0xEA43	0x9D51	#CJK UNIFIED IDEOGRAPH
+0xEA44	0x9D50	#CJK UNIFIED IDEOGRAPH
+0xEA45	0x9D59	#CJK UNIFIED IDEOGRAPH
+0xEA46	0x9D72	#CJK UNIFIED IDEOGRAPH
+0xEA47	0x9D89	#CJK UNIFIED IDEOGRAPH
+0xEA48	0x9D87	#CJK UNIFIED IDEOGRAPH
+0xEA49	0x9DAB	#CJK UNIFIED IDEOGRAPH
+0xEA4A	0x9D6F	#CJK UNIFIED IDEOGRAPH
+0xEA4B	0x9D7A	#CJK UNIFIED IDEOGRAPH
+0xEA4C	0x9D9A	#CJK UNIFIED IDEOGRAPH
+0xEA4D	0x9DA4	#CJK UNIFIED IDEOGRAPH
+0xEA4E	0x9DA9	#CJK UNIFIED IDEOGRAPH
+0xEA4F	0x9DB2	#CJK UNIFIED IDEOGRAPH
+0xEA50	0x9DC4	#CJK UNIFIED IDEOGRAPH
+0xEA51	0x9DC1	#CJK UNIFIED IDEOGRAPH
+0xEA52	0x9DBB	#CJK UNIFIED IDEOGRAPH
+0xEA53	0x9DB8	#CJK UNIFIED IDEOGRAPH
+0xEA54	0x9DBA	#CJK UNIFIED IDEOGRAPH
+0xEA55	0x9DC6	#CJK UNIFIED IDEOGRAPH
+0xEA56	0x9DCF	#CJK UNIFIED IDEOGRAPH
+0xEA57	0x9DC2	#CJK UNIFIED IDEOGRAPH
+0xEA58	0x9DD9	#CJK UNIFIED IDEOGRAPH
+0xEA59	0x9DD3	#CJK UNIFIED IDEOGRAPH
+0xEA5A	0x9DF8	#CJK UNIFIED IDEOGRAPH
+0xEA5B	0x9DE6	#CJK UNIFIED IDEOGRAPH
+0xEA5C	0x9DED	#CJK UNIFIED IDEOGRAPH
+0xEA5D	0x9DEF	#CJK UNIFIED IDEOGRAPH
+0xEA5E	0x9DFD	#CJK UNIFIED IDEOGRAPH
+0xEA5F	0x9E1A	#CJK UNIFIED IDEOGRAPH
+0xEA60	0x9E1B	#CJK UNIFIED IDEOGRAPH
+0xEA61	0x9E1E	#CJK UNIFIED IDEOGRAPH
+0xEA62	0x9E75	#CJK UNIFIED IDEOGRAPH
+0xEA63	0x9E79	#CJK UNIFIED IDEOGRAPH
+0xEA64	0x9E7D	#CJK UNIFIED IDEOGRAPH
+0xEA65	0x9E81	#CJK UNIFIED IDEOGRAPH
+0xEA66	0x9E88	#CJK UNIFIED IDEOGRAPH
+0xEA67	0x9E8B	#CJK UNIFIED IDEOGRAPH
+0xEA68	0x9E8C	#CJK UNIFIED IDEOGRAPH
+0xEA69	0x9E92	#CJK UNIFIED IDEOGRAPH
+0xEA6A	0x9E95	#CJK UNIFIED IDEOGRAPH
+0xEA6B	0x9E91	#CJK UNIFIED IDEOGRAPH
+0xEA6C	0x9E9D	#CJK UNIFIED IDEOGRAPH
+0xEA6D	0x9EA5	#CJK UNIFIED IDEOGRAPH
+0xEA6E	0x9EA9	#CJK UNIFIED IDEOGRAPH
+0xEA6F	0x9EB8	#CJK UNIFIED IDEOGRAPH
+0xEA70	0x9EAA	#CJK UNIFIED IDEOGRAPH
+0xEA71	0x9EAD	#CJK UNIFIED IDEOGRAPH
+0xEA72	0x9761	#CJK UNIFIED IDEOGRAPH
+0xEA73	0x9ECC	#CJK UNIFIED IDEOGRAPH
+0xEA74	0x9ECE	#CJK UNIFIED IDEOGRAPH
+0xEA75	0x9ECF	#CJK UNIFIED IDEOGRAPH
+0xEA76	0x9ED0	#CJK UNIFIED IDEOGRAPH
+0xEA77	0x9ED4	#CJK UNIFIED IDEOGRAPH
+0xEA78	0x9EDC	#CJK UNIFIED IDEOGRAPH
+0xEA79	0x9EDE	#CJK UNIFIED IDEOGRAPH
+0xEA7A	0x9EDD	#CJK UNIFIED IDEOGRAPH
+0xEA7B	0x9EE0	#CJK UNIFIED IDEOGRAPH
+0xEA7C	0x9EE5	#CJK UNIFIED IDEOGRAPH
+0xEA7D	0x9EE8	#CJK UNIFIED IDEOGRAPH
+0xEA7E	0x9EEF	#CJK UNIFIED IDEOGRAPH
+0xEA80	0x9EF4	#CJK UNIFIED IDEOGRAPH
+0xEA81	0x9EF6	#CJK UNIFIED IDEOGRAPH
+0xEA82	0x9EF7	#CJK UNIFIED IDEOGRAPH
+0xEA83	0x9EF9	#CJK UNIFIED IDEOGRAPH
+0xEA84	0x9EFB	#CJK UNIFIED IDEOGRAPH
+0xEA85	0x9EFC	#CJK UNIFIED IDEOGRAPH
+0xEA86	0x9EFD	#CJK UNIFIED IDEOGRAPH
+0xEA87	0x9F07	#CJK UNIFIED IDEOGRAPH
+0xEA88	0x9F08	#CJK UNIFIED IDEOGRAPH
+0xEA89	0x76B7	#CJK UNIFIED IDEOGRAPH
+0xEA8A	0x9F15	#CJK UNIFIED IDEOGRAPH
+0xEA8B	0x9F21	#CJK UNIFIED IDEOGRAPH
+0xEA8C	0x9F2C	#CJK UNIFIED IDEOGRAPH
+0xEA8D	0x9F3E	#CJK UNIFIED IDEOGRAPH
+0xEA8E	0x9F4A	#CJK UNIFIED IDEOGRAPH
+0xEA8F	0x9F52	#CJK UNIFIED IDEOGRAPH
+0xEA90	0x9F54	#CJK UNIFIED IDEOGRAPH
+0xEA91	0x9F63	#CJK UNIFIED IDEOGRAPH
+0xEA92	0x9F5F	#CJK UNIFIED IDEOGRAPH
+0xEA93	0x9F60	#CJK UNIFIED IDEOGRAPH
+0xEA94	0x9F61	#CJK UNIFIED IDEOGRAPH
+0xEA95	0x9F66	#CJK UNIFIED IDEOGRAPH
+0xEA96	0x9F67	#CJK UNIFIED IDEOGRAPH
+0xEA97	0x9F6C	#CJK UNIFIED IDEOGRAPH
+0xEA98	0x9F6A	#CJK UNIFIED IDEOGRAPH
+0xEA99	0x9F77	#CJK UNIFIED IDEOGRAPH
+0xEA9A	0x9F72	#CJK UNIFIED IDEOGRAPH
+0xEA9B	0x9F76	#CJK UNIFIED IDEOGRAPH
+0xEA9C	0x9F95	#CJK UNIFIED IDEOGRAPH
+0xEA9D	0x9F9C	#CJK UNIFIED IDEOGRAPH
+0xEA9E	0x9FA0	#CJK UNIFIED IDEOGRAPH
+0xEA9F	0x582F	#CJK UNIFIED IDEOGRAPH
+0xEAA0	0x69C7	#CJK UNIFIED IDEOGRAPH
+0xEAA1	0x9059	#CJK UNIFIED IDEOGRAPH
+0xEAA2	0x7464	#CJK UNIFIED IDEOGRAPH
+0xEAA3	0x51DC	#CJK UNIFIED IDEOGRAPH
+0xEAA4	0x7199	#CJK UNIFIED IDEOGRAPH
+0xED40	0x7E8A	#CJK UNIFIED IDEOGRAPH
+0xED41	0x891C	#CJK UNIFIED IDEOGRAPH
+0xED42	0x9348	#CJK UNIFIED IDEOGRAPH
+0xED43	0x9288	#CJK UNIFIED IDEOGRAPH
+0xED44	0x84DC	#CJK UNIFIED IDEOGRAPH
+0xED45	0x4FC9	#CJK UNIFIED IDEOGRAPH
+0xED46	0x70BB	#CJK UNIFIED IDEOGRAPH
+0xED47	0x6631	#CJK UNIFIED IDEOGRAPH
+0xED48	0x68C8	#CJK UNIFIED IDEOGRAPH
+0xED49	0x92F9	#CJK UNIFIED IDEOGRAPH
+0xED4A	0x66FB	#CJK UNIFIED IDEOGRAPH
+0xED4B	0x5F45	#CJK UNIFIED IDEOGRAPH
+0xED4C	0x4E28	#CJK UNIFIED IDEOGRAPH
+0xED4D	0x4EE1	#CJK UNIFIED IDEOGRAPH
+0xED4E	0x4EFC	#CJK UNIFIED IDEOGRAPH
+0xED4F	0x4F00	#CJK UNIFIED IDEOGRAPH
+0xED50	0x4F03	#CJK UNIFIED IDEOGRAPH
+0xED51	0x4F39	#CJK UNIFIED IDEOGRAPH
+0xED52	0x4F56	#CJK UNIFIED IDEOGRAPH
+0xED53	0x4F92	#CJK UNIFIED IDEOGRAPH
+0xED54	0x4F8A	#CJK UNIFIED IDEOGRAPH
+0xED55	0x4F9A	#CJK UNIFIED IDEOGRAPH
+0xED56	0x4F94	#CJK UNIFIED IDEOGRAPH
+0xED57	0x4FCD	#CJK UNIFIED IDEOGRAPH
+0xED58	0x5040	#CJK UNIFIED IDEOGRAPH
+0xED59	0x5022	#CJK UNIFIED IDEOGRAPH
+0xED5A	0x4FFF	#CJK UNIFIED IDEOGRAPH
+0xED5B	0x501E	#CJK UNIFIED IDEOGRAPH
+0xED5C	0x5046	#CJK UNIFIED IDEOGRAPH
+0xED5D	0x5070	#CJK UNIFIED IDEOGRAPH
+0xED5E	0x5042	#CJK UNIFIED IDEOGRAPH
+0xED5F	0x5094	#CJK UNIFIED IDEOGRAPH
+0xED60	0x50F4	#CJK UNIFIED IDEOGRAPH
+0xED61	0x50D8	#CJK UNIFIED IDEOGRAPH
+0xED62	0x514A	#CJK UNIFIED IDEOGRAPH
+0xED63	0x5164	#CJK UNIFIED IDEOGRAPH
+0xED64	0x519D	#CJK UNIFIED IDEOGRAPH
+0xED65	0x51BE	#CJK UNIFIED IDEOGRAPH
+0xED66	0x51EC	#CJK UNIFIED IDEOGRAPH
+0xED67	0x5215	#CJK UNIFIED IDEOGRAPH
+0xED68	0x529C	#CJK UNIFIED IDEOGRAPH
+0xED69	0x52A6	#CJK UNIFIED IDEOGRAPH
+0xED6A	0x52C0	#CJK UNIFIED IDEOGRAPH
+0xED6B	0x52DB	#CJK UNIFIED IDEOGRAPH
+0xED6C	0x5300	#CJK UNIFIED IDEOGRAPH
+0xED6D	0x5307	#CJK UNIFIED IDEOGRAPH
+0xED6E	0x5324	#CJK UNIFIED IDEOGRAPH
+0xED6F	0x5372	#CJK UNIFIED IDEOGRAPH
+0xED70	0x5393	#CJK UNIFIED IDEOGRAPH
+0xED71	0x53B2	#CJK UNIFIED IDEOGRAPH
+0xED72	0x53DD	#CJK UNIFIED IDEOGRAPH
+0xED73	0xFA0E	#CJK COMPATIBILITY IDEOGRAPH
+0xED74	0x549C	#CJK UNIFIED IDEOGRAPH
+0xED75	0x548A	#CJK UNIFIED IDEOGRAPH
+0xED76	0x54A9	#CJK UNIFIED IDEOGRAPH
+0xED77	0x54FF	#CJK UNIFIED IDEOGRAPH
+0xED78	0x5586	#CJK UNIFIED IDEOGRAPH
+0xED79	0x5759	#CJK UNIFIED IDEOGRAPH
+0xED7A	0x5765	#CJK UNIFIED IDEOGRAPH
+0xED7B	0x57AC	#CJK UNIFIED IDEOGRAPH
+0xED7C	0x57C8	#CJK UNIFIED IDEOGRAPH
+0xED7D	0x57C7	#CJK UNIFIED IDEOGRAPH
+0xED7E	0xFA0F	#CJK COMPATIBILITY IDEOGRAPH
+0xED80	0xFA10	#CJK COMPATIBILITY IDEOGRAPH
+0xED81	0x589E	#CJK UNIFIED IDEOGRAPH
+0xED82	0x58B2	#CJK UNIFIED IDEOGRAPH
+0xED83	0x590B	#CJK UNIFIED IDEOGRAPH
+0xED84	0x5953	#CJK UNIFIED IDEOGRAPH
+0xED85	0x595B	#CJK UNIFIED IDEOGRAPH
+0xED86	0x595D	#CJK UNIFIED IDEOGRAPH
+0xED87	0x5963	#CJK UNIFIED IDEOGRAPH
+0xED88	0x59A4	#CJK UNIFIED IDEOGRAPH
+0xED89	0x59BA	#CJK UNIFIED IDEOGRAPH
+0xED8A	0x5B56	#CJK UNIFIED IDEOGRAPH
+0xED8B	0x5BC0	#CJK UNIFIED IDEOGRAPH
+0xED8C	0x752F	#CJK UNIFIED IDEOGRAPH
+0xED8D	0x5BD8	#CJK UNIFIED IDEOGRAPH
+0xED8E	0x5BEC	#CJK UNIFIED IDEOGRAPH
+0xED8F	0x5C1E	#CJK UNIFIED IDEOGRAPH
+0xED90	0x5CA6	#CJK UNIFIED IDEOGRAPH
+0xED91	0x5CBA	#CJK UNIFIED IDEOGRAPH
+0xED92	0x5CF5	#CJK UNIFIED IDEOGRAPH
+0xED93	0x5D27	#CJK UNIFIED IDEOGRAPH
+0xED94	0x5D53	#CJK UNIFIED IDEOGRAPH
+0xED95	0xFA11	#CJK COMPATIBILITY IDEOGRAPH
+0xED96	0x5D42	#CJK UNIFIED IDEOGRAPH
+0xED97	0x5D6D	#CJK UNIFIED IDEOGRAPH
+0xED98	0x5DB8	#CJK UNIFIED IDEOGRAPH
+0xED99	0x5DB9	#CJK UNIFIED IDEOGRAPH
+0xED9A	0x5DD0	#CJK UNIFIED IDEOGRAPH
+0xED9B	0x5F21	#CJK UNIFIED IDEOGRAPH
+0xED9C	0x5F34	#CJK UNIFIED IDEOGRAPH
+0xED9D	0x5F67	#CJK UNIFIED IDEOGRAPH
+0xED9E	0x5FB7	#CJK UNIFIED IDEOGRAPH
+0xED9F	0x5FDE	#CJK UNIFIED IDEOGRAPH
+0xEDA0	0x605D	#CJK UNIFIED IDEOGRAPH
+0xEDA1	0x6085	#CJK UNIFIED IDEOGRAPH
+0xEDA2	0x608A	#CJK UNIFIED IDEOGRAPH
+0xEDA3	0x60DE	#CJK UNIFIED IDEOGRAPH
+0xEDA4	0x60D5	#CJK UNIFIED IDEOGRAPH
+0xEDA5	0x6120	#CJK UNIFIED IDEOGRAPH
+0xEDA6	0x60F2	#CJK UNIFIED IDEOGRAPH
+0xEDA7	0x6111	#CJK UNIFIED IDEOGRAPH
+0xEDA8	0x6137	#CJK UNIFIED IDEOGRAPH
+0xEDA9	0x6130	#CJK UNIFIED IDEOGRAPH
+0xEDAA	0x6198	#CJK UNIFIED IDEOGRAPH
+0xEDAB	0x6213	#CJK UNIFIED IDEOGRAPH
+0xEDAC	0x62A6	#CJK UNIFIED IDEOGRAPH
+0xEDAD	0x63F5	#CJK UNIFIED IDEOGRAPH
+0xEDAE	0x6460	#CJK UNIFIED IDEOGRAPH
+0xEDAF	0x649D	#CJK UNIFIED IDEOGRAPH
+0xEDB0	0x64CE	#CJK UNIFIED IDEOGRAPH
+0xEDB1	0x654E	#CJK UNIFIED IDEOGRAPH
+0xEDB2	0x6600	#CJK UNIFIED IDEOGRAPH
+0xEDB3	0x6615	#CJK UNIFIED IDEOGRAPH
+0xEDB4	0x663B	#CJK UNIFIED IDEOGRAPH
+0xEDB5	0x6609	#CJK UNIFIED IDEOGRAPH
+0xEDB6	0x662E	#CJK UNIFIED IDEOGRAPH
+0xEDB7	0x661E	#CJK UNIFIED IDEOGRAPH
+0xEDB8	0x6624	#CJK UNIFIED IDEOGRAPH
+0xEDB9	0x6665	#CJK UNIFIED IDEOGRAPH
+0xEDBA	0x6657	#CJK UNIFIED IDEOGRAPH
+0xEDBB	0x6659	#CJK UNIFIED IDEOGRAPH
+0xEDBC	0xFA12	#CJK COMPATIBILITY IDEOGRAPH
+0xEDBD	0x6673	#CJK UNIFIED IDEOGRAPH
+0xEDBE	0x6699	#CJK UNIFIED IDEOGRAPH
+0xEDBF	0x66A0	#CJK UNIFIED IDEOGRAPH
+0xEDC0	0x66B2	#CJK UNIFIED IDEOGRAPH
+0xEDC1	0x66BF	#CJK UNIFIED IDEOGRAPH
+0xEDC2	0x66FA	#CJK UNIFIED IDEOGRAPH
+0xEDC3	0x670E	#CJK UNIFIED IDEOGRAPH
+0xEDC4	0xF929	#CJK COMPATIBILITY IDEOGRAPH
+0xEDC5	0x6766	#CJK UNIFIED IDEOGRAPH
+0xEDC6	0x67BB	#CJK UNIFIED IDEOGRAPH
+0xEDC7	0x6852	#CJK UNIFIED IDEOGRAPH
+0xEDC8	0x67C0	#CJK UNIFIED IDEOGRAPH
+0xEDC9	0x6801	#CJK UNIFIED IDEOGRAPH
+0xEDCA	0x6844	#CJK UNIFIED IDEOGRAPH
+0xEDCB	0x68CF	#CJK UNIFIED IDEOGRAPH
+0xEDCC	0xFA13	#CJK COMPATIBILITY IDEOGRAPH
+0xEDCD	0x6968	#CJK UNIFIED IDEOGRAPH
+0xEDCE	0xFA14	#CJK COMPATIBILITY IDEOGRAPH
+0xEDCF	0x6998	#CJK UNIFIED IDEOGRAPH
+0xEDD0	0x69E2	#CJK UNIFIED IDEOGRAPH
+0xEDD1	0x6A30	#CJK UNIFIED IDEOGRAPH
+0xEDD2	0x6A6B	#CJK UNIFIED IDEOGRAPH
+0xEDD3	0x6A46	#CJK UNIFIED IDEOGRAPH
+0xEDD4	0x6A73	#CJK UNIFIED IDEOGRAPH
+0xEDD5	0x6A7E	#CJK UNIFIED IDEOGRAPH
+0xEDD6	0x6AE2	#CJK UNIFIED IDEOGRAPH
+0xEDD7	0x6AE4	#CJK UNIFIED IDEOGRAPH
+0xEDD8	0x6BD6	#CJK UNIFIED IDEOGRAPH
+0xEDD9	0x6C3F	#CJK UNIFIED IDEOGRAPH
+0xEDDA	0x6C5C	#CJK UNIFIED IDEOGRAPH
+0xEDDB	0x6C86	#CJK UNIFIED IDEOGRAPH
+0xEDDC	0x6C6F	#CJK UNIFIED IDEOGRAPH
+0xEDDD	0x6CDA	#CJK UNIFIED IDEOGRAPH
+0xEDDE	0x6D04	#CJK UNIFIED IDEOGRAPH
+0xEDDF	0x6D87	#CJK UNIFIED IDEOGRAPH
+0xEDE0	0x6D6F	#CJK UNIFIED IDEOGRAPH
+0xEDE1	0x6D96	#CJK UNIFIED IDEOGRAPH
+0xEDE2	0x6DAC	#CJK UNIFIED IDEOGRAPH
+0xEDE3	0x6DCF	#CJK UNIFIED IDEOGRAPH
+0xEDE4	0x6DF8	#CJK UNIFIED IDEOGRAPH
+0xEDE5	0x6DF2	#CJK UNIFIED IDEOGRAPH
+0xEDE6	0x6DFC	#CJK UNIFIED IDEOGRAPH
+0xEDE7	0x6E39	#CJK UNIFIED IDEOGRAPH
+0xEDE8	0x6E5C	#CJK UNIFIED IDEOGRAPH
+0xEDE9	0x6E27	#CJK UNIFIED IDEOGRAPH
+0xEDEA	0x6E3C	#CJK UNIFIED IDEOGRAPH
+0xEDEB	0x6EBF	#CJK UNIFIED IDEOGRAPH
+0xEDEC	0x6F88	#CJK UNIFIED IDEOGRAPH
+0xEDED	0x6FB5	#CJK UNIFIED IDEOGRAPH
+0xEDEE	0x6FF5	#CJK UNIFIED IDEOGRAPH
+0xEDEF	0x7005	#CJK UNIFIED IDEOGRAPH
+0xEDF0	0x7007	#CJK UNIFIED IDEOGRAPH
+0xEDF1	0x7028	#CJK UNIFIED IDEOGRAPH
+0xEDF2	0x7085	#CJK UNIFIED IDEOGRAPH
+0xEDF3	0x70AB	#CJK UNIFIED IDEOGRAPH
+0xEDF4	0x710F	#CJK UNIFIED IDEOGRAPH
+0xEDF5	0x7104	#CJK UNIFIED IDEOGRAPH
+0xEDF6	0x715C	#CJK UNIFIED IDEOGRAPH
+0xEDF7	0x7146	#CJK UNIFIED IDEOGRAPH
+0xEDF8	0x7147	#CJK UNIFIED IDEOGRAPH
+0xEDF9	0xFA15	#CJK COMPATIBILITY IDEOGRAPH
+0xEDFA	0x71C1	#CJK UNIFIED IDEOGRAPH
+0xEDFB	0x71FE	#CJK UNIFIED IDEOGRAPH
+0xEDFC	0x72B1	#CJK UNIFIED IDEOGRAPH
+0xEE40	0x72BE	#CJK UNIFIED IDEOGRAPH
+0xEE41	0x7324	#CJK UNIFIED IDEOGRAPH
+0xEE42	0xFA16	#CJK COMPATIBILITY IDEOGRAPH
+0xEE43	0x7377	#CJK UNIFIED IDEOGRAPH
+0xEE44	0x73BD	#CJK UNIFIED IDEOGRAPH
+0xEE45	0x73C9	#CJK UNIFIED IDEOGRAPH
+0xEE46	0x73D6	#CJK UNIFIED IDEOGRAPH
+0xEE47	0x73E3	#CJK UNIFIED IDEOGRAPH
+0xEE48	0x73D2	#CJK UNIFIED IDEOGRAPH
+0xEE49	0x7407	#CJK UNIFIED IDEOGRAPH
+0xEE4A	0x73F5	#CJK UNIFIED IDEOGRAPH
+0xEE4B	0x7426	#CJK UNIFIED IDEOGRAPH
+0xEE4C	0x742A	#CJK UNIFIED IDEOGRAPH
+0xEE4D	0x7429	#CJK UNIFIED IDEOGRAPH
+0xEE4E	0x742E	#CJK UNIFIED IDEOGRAPH
+0xEE4F	0x7462	#CJK UNIFIED IDEOGRAPH
+0xEE50	0x7489	#CJK UNIFIED IDEOGRAPH
+0xEE51	0x749F	#CJK UNIFIED IDEOGRAPH
+0xEE52	0x7501	#CJK UNIFIED IDEOGRAPH
+0xEE53	0x756F	#CJK UNIFIED IDEOGRAPH
+0xEE54	0x7682	#CJK UNIFIED IDEOGRAPH
+0xEE55	0x769C	#CJK UNIFIED IDEOGRAPH
+0xEE56	0x769E	#CJK UNIFIED IDEOGRAPH
+0xEE57	0x769B	#CJK UNIFIED IDEOGRAPH
+0xEE58	0x76A6	#CJK UNIFIED IDEOGRAPH
+0xEE59	0xFA17	#CJK COMPATIBILITY IDEOGRAPH
+0xEE5A	0x7746	#CJK UNIFIED IDEOGRAPH
+0xEE5B	0x52AF	#CJK UNIFIED IDEOGRAPH
+0xEE5C	0x7821	#CJK UNIFIED IDEOGRAPH
+0xEE5D	0x784E	#CJK UNIFIED IDEOGRAPH
+0xEE5E	0x7864	#CJK UNIFIED IDEOGRAPH
+0xEE5F	0x787A	#CJK UNIFIED IDEOGRAPH
+0xEE60	0x7930	#CJK UNIFIED IDEOGRAPH
+0xEE61	0xFA18	#CJK COMPATIBILITY IDEOGRAPH
+0xEE62	0xFA19	#CJK COMPATIBILITY IDEOGRAPH
+0xEE63	0xFA1A	#CJK COMPATIBILITY IDEOGRAPH
+0xEE64	0x7994	#CJK UNIFIED IDEOGRAPH
+0xEE65	0xFA1B	#CJK COMPATIBILITY IDEOGRAPH
+0xEE66	0x799B	#CJK UNIFIED IDEOGRAPH
+0xEE67	0x7AD1	#CJK UNIFIED IDEOGRAPH
+0xEE68	0x7AE7	#CJK UNIFIED IDEOGRAPH
+0xEE69	0xFA1C	#CJK COMPATIBILITY IDEOGRAPH
+0xEE6A	0x7AEB	#CJK UNIFIED IDEOGRAPH
+0xEE6B	0x7B9E	#CJK UNIFIED IDEOGRAPH
+0xEE6C	0xFA1D	#CJK COMPATIBILITY IDEOGRAPH
+0xEE6D	0x7D48	#CJK UNIFIED IDEOGRAPH
+0xEE6E	0x7D5C	#CJK UNIFIED IDEOGRAPH
+0xEE6F	0x7DB7	#CJK UNIFIED IDEOGRAPH
+0xEE70	0x7DA0	#CJK UNIFIED IDEOGRAPH
+0xEE71	0x7DD6	#CJK UNIFIED IDEOGRAPH
+0xEE72	0x7E52	#CJK UNIFIED IDEOGRAPH
+0xEE73	0x7F47	#CJK UNIFIED IDEOGRAPH
+0xEE74	0x7FA1	#CJK UNIFIED IDEOGRAPH
+0xEE75	0xFA1E	#CJK COMPATIBILITY IDEOGRAPH
+0xEE76	0x8301	#CJK UNIFIED IDEOGRAPH
+0xEE77	0x8362	#CJK UNIFIED IDEOGRAPH
+0xEE78	0x837F	#CJK UNIFIED IDEOGRAPH
+0xEE79	0x83C7	#CJK UNIFIED IDEOGRAPH
+0xEE7A	0x83F6	#CJK UNIFIED IDEOGRAPH
+0xEE7B	0x8448	#CJK UNIFIED IDEOGRAPH
+0xEE7C	0x84B4	#CJK UNIFIED IDEOGRAPH
+0xEE7D	0x8553	#CJK UNIFIED IDEOGRAPH
+0xEE7E	0x8559	#CJK UNIFIED IDEOGRAPH
+0xEE80	0x856B	#CJK UNIFIED IDEOGRAPH
+0xEE81	0xFA1F	#CJK COMPATIBILITY IDEOGRAPH
+0xEE82	0x85B0	#CJK UNIFIED IDEOGRAPH
+0xEE83	0xFA20	#CJK COMPATIBILITY IDEOGRAPH
+0xEE84	0xFA21	#CJK COMPATIBILITY IDEOGRAPH
+0xEE85	0x8807	#CJK UNIFIED IDEOGRAPH
+0xEE86	0x88F5	#CJK UNIFIED IDEOGRAPH
+0xEE87	0x8A12	#CJK UNIFIED IDEOGRAPH
+0xEE88	0x8A37	#CJK UNIFIED IDEOGRAPH
+0xEE89	0x8A79	#CJK UNIFIED IDEOGRAPH
+0xEE8A	0x8AA7	#CJK UNIFIED IDEOGRAPH
+0xEE8B	0x8ABE	#CJK UNIFIED IDEOGRAPH
+0xEE8C	0x8ADF	#CJK UNIFIED IDEOGRAPH
+0xEE8D	0xFA22	#CJK COMPATIBILITY IDEOGRAPH
+0xEE8E	0x8AF6	#CJK UNIFIED IDEOGRAPH
+0xEE8F	0x8B53	#CJK UNIFIED IDEOGRAPH
+0xEE90	0x8B7F	#CJK UNIFIED IDEOGRAPH
+0xEE91	0x8CF0	#CJK UNIFIED IDEOGRAPH
+0xEE92	0x8CF4	#CJK UNIFIED IDEOGRAPH
+0xEE93	0x8D12	#CJK UNIFIED IDEOGRAPH
+0xEE94	0x8D76	#CJK UNIFIED IDEOGRAPH
+0xEE95	0xFA23	#CJK COMPATIBILITY IDEOGRAPH
+0xEE96	0x8ECF	#CJK UNIFIED IDEOGRAPH
+0xEE97	0xFA24	#CJK COMPATIBILITY IDEOGRAPH
+0xEE98	0xFA25	#CJK COMPATIBILITY IDEOGRAPH
+0xEE99	0x9067	#CJK UNIFIED IDEOGRAPH
+0xEE9A	0x90DE	#CJK UNIFIED IDEOGRAPH
+0xEE9B	0xFA26	#CJK COMPATIBILITY IDEOGRAPH
+0xEE9C	0x9115	#CJK UNIFIED IDEOGRAPH
+0xEE9D	0x9127	#CJK UNIFIED IDEOGRAPH
+0xEE9E	0x91DA	#CJK UNIFIED IDEOGRAPH
+0xEE9F	0x91D7	#CJK UNIFIED IDEOGRAPH
+0xEEA0	0x91DE	#CJK UNIFIED IDEOGRAPH
+0xEEA1	0x91ED	#CJK UNIFIED IDEOGRAPH
+0xEEA2	0x91EE	#CJK UNIFIED IDEOGRAPH
+0xEEA3	0x91E4	#CJK UNIFIED IDEOGRAPH
+0xEEA4	0x91E5	#CJK UNIFIED IDEOGRAPH
+0xEEA5	0x9206	#CJK UNIFIED IDEOGRAPH
+0xEEA6	0x9210	#CJK UNIFIED IDEOGRAPH
+0xEEA7	0x920A	#CJK UNIFIED IDEOGRAPH
+0xEEA8	0x923A	#CJK UNIFIED IDEOGRAPH
+0xEEA9	0x9240	#CJK UNIFIED IDEOGRAPH
+0xEEAA	0x923C	#CJK UNIFIED IDEOGRAPH
+0xEEAB	0x924E	#CJK UNIFIED IDEOGRAPH
+0xEEAC	0x9259	#CJK UNIFIED IDEOGRAPH
+0xEEAD	0x9251	#CJK UNIFIED IDEOGRAPH
+0xEEAE	0x9239	#CJK UNIFIED IDEOGRAPH
+0xEEAF	0x9267	#CJK UNIFIED IDEOGRAPH
+0xEEB0	0x92A7	#CJK UNIFIED IDEOGRAPH
+0xEEB1	0x9277	#CJK UNIFIED IDEOGRAPH
+0xEEB2	0x9278	#CJK UNIFIED IDEOGRAPH
+0xEEB3	0x92E7	#CJK UNIFIED IDEOGRAPH
+0xEEB4	0x92D7	#CJK UNIFIED IDEOGRAPH
+0xEEB5	0x92D9	#CJK UNIFIED IDEOGRAPH
+0xEEB6	0x92D0	#CJK UNIFIED IDEOGRAPH
+0xEEB7	0xFA27	#CJK COMPATIBILITY IDEOGRAPH
+0xEEB8	0x92D5	#CJK UNIFIED IDEOGRAPH
+0xEEB9	0x92E0	#CJK UNIFIED IDEOGRAPH
+0xEEBA	0x92D3	#CJK UNIFIED IDEOGRAPH
+0xEEBB	0x9325	#CJK UNIFIED IDEOGRAPH
+0xEEBC	0x9321	#CJK UNIFIED IDEOGRAPH
+0xEEBD	0x92FB	#CJK UNIFIED IDEOGRAPH
+0xEEBE	0xFA28	#CJK COMPATIBILITY IDEOGRAPH
+0xEEBF	0x931E	#CJK UNIFIED IDEOGRAPH
+0xEEC0	0x92FF	#CJK UNIFIED IDEOGRAPH
+0xEEC1	0x931D	#CJK UNIFIED IDEOGRAPH
+0xEEC2	0x9302	#CJK UNIFIED IDEOGRAPH
+0xEEC3	0x9370	#CJK UNIFIED IDEOGRAPH
+0xEEC4	0x9357	#CJK UNIFIED IDEOGRAPH
+0xEEC5	0x93A4	#CJK UNIFIED IDEOGRAPH
+0xEEC6	0x93C6	#CJK UNIFIED IDEOGRAPH
+0xEEC7	0x93DE	#CJK UNIFIED IDEOGRAPH
+0xEEC8	0x93F8	#CJK UNIFIED IDEOGRAPH
+0xEEC9	0x9431	#CJK UNIFIED IDEOGRAPH
+0xEECA	0x9445	#CJK UNIFIED IDEOGRAPH
+0xEECB	0x9448	#CJK UNIFIED IDEOGRAPH
+0xEECC	0x9592	#CJK UNIFIED IDEOGRAPH
+0xEECD	0xF9DC	#CJK COMPATIBILITY IDEOGRAPH
+0xEECE	0xFA29	#CJK COMPATIBILITY IDEOGRAPH
+0xEECF	0x969D	#CJK UNIFIED IDEOGRAPH
+0xEED0	0x96AF	#CJK UNIFIED IDEOGRAPH
+0xEED1	0x9733	#CJK UNIFIED IDEOGRAPH
+0xEED2	0x973B	#CJK UNIFIED IDEOGRAPH
+0xEED3	0x9743	#CJK UNIFIED IDEOGRAPH
+0xEED4	0x974D	#CJK UNIFIED IDEOGRAPH
+0xEED5	0x974F	#CJK UNIFIED IDEOGRAPH
+0xEED6	0x9751	#CJK UNIFIED IDEOGRAPH
+0xEED7	0x9755	#CJK UNIFIED IDEOGRAPH
+0xEED8	0x9857	#CJK UNIFIED IDEOGRAPH
+0xEED9	0x9865	#CJK UNIFIED IDEOGRAPH
+0xEEDA	0xFA2A	#CJK COMPATIBILITY IDEOGRAPH
+0xEEDB	0xFA2B	#CJK COMPATIBILITY IDEOGRAPH
+0xEEDC	0x9927	#CJK UNIFIED IDEOGRAPH
+0xEEDD	0xFA2C	#CJK COMPATIBILITY IDEOGRAPH
+0xEEDE	0x999E	#CJK UNIFIED IDEOGRAPH
+0xEEDF	0x9A4E	#CJK UNIFIED IDEOGRAPH
+0xEEE0	0x9AD9	#CJK UNIFIED IDEOGRAPH
+0xEEE1	0x9ADC	#CJK UNIFIED IDEOGRAPH
+0xEEE2	0x9B75	#CJK UNIFIED IDEOGRAPH
+0xEEE3	0x9B72	#CJK UNIFIED IDEOGRAPH
+0xEEE4	0x9B8F	#CJK UNIFIED IDEOGRAPH
+0xEEE5	0x9BB1	#CJK UNIFIED IDEOGRAPH
+0xEEE6	0x9BBB	#CJK UNIFIED IDEOGRAPH
+0xEEE7	0x9C00	#CJK UNIFIED IDEOGRAPH
+0xEEE8	0x9D70	#CJK UNIFIED IDEOGRAPH
+0xEEE9	0x9D6B	#CJK UNIFIED IDEOGRAPH
+0xEEEA	0xFA2D	#CJK COMPATIBILITY IDEOGRAPH
+0xEEEB	0x9E19	#CJK UNIFIED IDEOGRAPH
+0xEEEC	0x9ED1	#CJK UNIFIED IDEOGRAPH
+0xEEEF	0x2170	#SMALL ROMAN NUMERAL ONE
+0xEEF0	0x2171	#SMALL ROMAN NUMERAL TWO
+0xEEF1	0x2172	#SMALL ROMAN NUMERAL THREE
+0xEEF2	0x2173	#SMALL ROMAN NUMERAL FOUR
+0xEEF3	0x2174	#SMALL ROMAN NUMERAL FIVE
+0xEEF4	0x2175	#SMALL ROMAN NUMERAL SIX
+0xEEF5	0x2176	#SMALL ROMAN NUMERAL SEVEN
+0xEEF6	0x2177	#SMALL ROMAN NUMERAL EIGHT
+0xEEF7	0x2178	#SMALL ROMAN NUMERAL NINE
+0xEEF8	0x2179	#SMALL ROMAN NUMERAL TEN
+0xEEF9	0xFFE2	#FULLWIDTH NOT SIGN
+0xEEFA	0xFFE4	#FULLWIDTH BROKEN BAR
+0xEEFB	0xFF07	#FULLWIDTH APOSTROPHE
+0xEEFC	0xFF02	#FULLWIDTH QUOTATION MARK
+0xFA40	0x2170	#SMALL ROMAN NUMERAL ONE
+0xFA41	0x2171	#SMALL ROMAN NUMERAL TWO
+0xFA42	0x2172	#SMALL ROMAN NUMERAL THREE
+0xFA43	0x2173	#SMALL ROMAN NUMERAL FOUR
+0xFA44	0x2174	#SMALL ROMAN NUMERAL FIVE
+0xFA45	0x2175	#SMALL ROMAN NUMERAL SIX
+0xFA46	0x2176	#SMALL ROMAN NUMERAL SEVEN
+0xFA47	0x2177	#SMALL ROMAN NUMERAL EIGHT
+0xFA48	0x2178	#SMALL ROMAN NUMERAL NINE
+0xFA49	0x2179	#SMALL ROMAN NUMERAL TEN
+0xFA4A	0x2160	#ROMAN NUMERAL ONE
+0xFA4B	0x2161	#ROMAN NUMERAL TWO
+0xFA4C	0x2162	#ROMAN NUMERAL THREE
+0xFA4D	0x2163	#ROMAN NUMERAL FOUR
+0xFA4E	0x2164	#ROMAN NUMERAL FIVE
+0xFA4F	0x2165	#ROMAN NUMERAL SIX
+0xFA50	0x2166	#ROMAN NUMERAL SEVEN
+0xFA51	0x2167	#ROMAN NUMERAL EIGHT
+0xFA52	0x2168	#ROMAN NUMERAL NINE
+0xFA53	0x2169	#ROMAN NUMERAL TEN
+0xFA54	0xFFE2	#FULLWIDTH NOT SIGN
+0xFA55	0xFFE4	#FULLWIDTH BROKEN BAR
+0xFA56	0xFF07	#FULLWIDTH APOSTROPHE
+0xFA57	0xFF02	#FULLWIDTH QUOTATION MARK
+0xFA58	0x3231	#PARENTHESIZED IDEOGRAPH STOCK
+0xFA59	0x2116	#NUMERO SIGN
+0xFA5A	0x2121	#TELEPHONE SIGN
+0xFA5B	0x2235	#BECAUSE
+0xFA5C	0x7E8A	#CJK UNIFIED IDEOGRAPH
+0xFA5D	0x891C	#CJK UNIFIED IDEOGRAPH
+0xFA5E	0x9348	#CJK UNIFIED IDEOGRAPH
+0xFA5F	0x9288	#CJK UNIFIED IDEOGRAPH
+0xFA60	0x84DC	#CJK UNIFIED IDEOGRAPH
+0xFA61	0x4FC9	#CJK UNIFIED IDEOGRAPH
+0xFA62	0x70BB	#CJK UNIFIED IDEOGRAPH
+0xFA63	0x6631	#CJK UNIFIED IDEOGRAPH
+0xFA64	0x68C8	#CJK UNIFIED IDEOGRAPH
+0xFA65	0x92F9	#CJK UNIFIED IDEOGRAPH
+0xFA66	0x66FB	#CJK UNIFIED IDEOGRAPH
+0xFA67	0x5F45	#CJK UNIFIED IDEOGRAPH
+0xFA68	0x4E28	#CJK UNIFIED IDEOGRAPH
+0xFA69	0x4EE1	#CJK UNIFIED IDEOGRAPH
+0xFA6A	0x4EFC	#CJK UNIFIED IDEOGRAPH
+0xFA6B	0x4F00	#CJK UNIFIED IDEOGRAPH
+0xFA6C	0x4F03	#CJK UNIFIED IDEOGRAPH
+0xFA6D	0x4F39	#CJK UNIFIED IDEOGRAPH
+0xFA6E	0x4F56	#CJK UNIFIED IDEOGRAPH
+0xFA6F	0x4F92	#CJK UNIFIED IDEOGRAPH
+0xFA70	0x4F8A	#CJK UNIFIED IDEOGRAPH
+0xFA71	0x4F9A	#CJK UNIFIED IDEOGRAPH
+0xFA72	0x4F94	#CJK UNIFIED IDEOGRAPH
+0xFA73	0x4FCD	#CJK UNIFIED IDEOGRAPH
+0xFA74	0x5040	#CJK UNIFIED IDEOGRAPH
+0xFA75	0x5022	#CJK UNIFIED IDEOGRAPH
+0xFA76	0x4FFF	#CJK UNIFIED IDEOGRAPH
+0xFA77	0x501E	#CJK UNIFIED IDEOGRAPH
+0xFA78	0x5046	#CJK UNIFIED IDEOGRAPH
+0xFA79	0x5070	#CJK UNIFIED IDEOGRAPH
+0xFA7A	0x5042	#CJK UNIFIED IDEOGRAPH
+0xFA7B	0x5094	#CJK UNIFIED IDEOGRAPH
+0xFA7C	0x50F4	#CJK UNIFIED IDEOGRAPH
+0xFA7D	0x50D8	#CJK UNIFIED IDEOGRAPH
+0xFA7E	0x514A	#CJK UNIFIED IDEOGRAPH
+0xFA80	0x5164	#CJK UNIFIED IDEOGRAPH
+0xFA81	0x519D	#CJK UNIFIED IDEOGRAPH
+0xFA82	0x51BE	#CJK UNIFIED IDEOGRAPH
+0xFA83	0x51EC	#CJK UNIFIED IDEOGRAPH
+0xFA84	0x5215	#CJK UNIFIED IDEOGRAPH
+0xFA85	0x529C	#CJK UNIFIED IDEOGRAPH
+0xFA86	0x52A6	#CJK UNIFIED IDEOGRAPH
+0xFA87	0x52C0	#CJK UNIFIED IDEOGRAPH
+0xFA88	0x52DB	#CJK UNIFIED IDEOGRAPH
+0xFA89	0x5300	#CJK UNIFIED IDEOGRAPH
+0xFA8A	0x5307	#CJK UNIFIED IDEOGRAPH
+0xFA8B	0x5324	#CJK UNIFIED IDEOGRAPH
+0xFA8C	0x5372	#CJK UNIFIED IDEOGRAPH
+0xFA8D	0x5393	#CJK UNIFIED IDEOGRAPH
+0xFA8E	0x53B2	#CJK UNIFIED IDEOGRAPH
+0xFA8F	0x53DD	#CJK UNIFIED IDEOGRAPH
+0xFA90	0xFA0E	#CJK COMPATIBILITY IDEOGRAPH
+0xFA91	0x549C	#CJK UNIFIED IDEOGRAPH
+0xFA92	0x548A	#CJK UNIFIED IDEOGRAPH
+0xFA93	0x54A9	#CJK UNIFIED IDEOGRAPH
+0xFA94	0x54FF	#CJK UNIFIED IDEOGRAPH
+0xFA95	0x5586	#CJK UNIFIED IDEOGRAPH
+0xFA96	0x5759	#CJK UNIFIED IDEOGRAPH
+0xFA97	0x5765	#CJK UNIFIED IDEOGRAPH
+0xFA98	0x57AC	#CJK UNIFIED IDEOGRAPH
+0xFA99	0x57C8	#CJK UNIFIED IDEOGRAPH
+0xFA9A	0x57C7	#CJK UNIFIED IDEOGRAPH
+0xFA9B	0xFA0F	#CJK COMPATIBILITY IDEOGRAPH
+0xFA9C	0xFA10	#CJK COMPATIBILITY IDEOGRAPH
+0xFA9D	0x589E	#CJK UNIFIED IDEOGRAPH
+0xFA9E	0x58B2	#CJK UNIFIED IDEOGRAPH
+0xFA9F	0x590B	#CJK UNIFIED IDEOGRAPH
+0xFAA0	0x5953	#CJK UNIFIED IDEOGRAPH
+0xFAA1	0x595B	#CJK UNIFIED IDEOGRAPH
+0xFAA2	0x595D	#CJK UNIFIED IDEOGRAPH
+0xFAA3	0x5963	#CJK UNIFIED IDEOGRAPH
+0xFAA4	0x59A4	#CJK UNIFIED IDEOGRAPH
+0xFAA5	0x59BA	#CJK UNIFIED IDEOGRAPH
+0xFAA6	0x5B56	#CJK UNIFIED IDEOGRAPH
+0xFAA7	0x5BC0	#CJK UNIFIED IDEOGRAPH
+0xFAA8	0x752F	#CJK UNIFIED IDEOGRAPH
+0xFAA9	0x5BD8	#CJK UNIFIED IDEOGRAPH
+0xFAAA	0x5BEC	#CJK UNIFIED IDEOGRAPH
+0xFAAB	0x5C1E	#CJK UNIFIED IDEOGRAPH
+0xFAAC	0x5CA6	#CJK UNIFIED IDEOGRAPH
+0xFAAD	0x5CBA	#CJK UNIFIED IDEOGRAPH
+0xFAAE	0x5CF5	#CJK UNIFIED IDEOGRAPH
+0xFAAF	0x5D27	#CJK UNIFIED IDEOGRAPH
+0xFAB0	0x5D53	#CJK UNIFIED IDEOGRAPH
+0xFAB1	0xFA11	#CJK COMPATIBILITY IDEOGRAPH
+0xFAB2	0x5D42	#CJK UNIFIED IDEOGRAPH
+0xFAB3	0x5D6D	#CJK UNIFIED IDEOGRAPH
+0xFAB4	0x5DB8	#CJK UNIFIED IDEOGRAPH
+0xFAB5	0x5DB9	#CJK UNIFIED IDEOGRAPH
+0xFAB6	0x5DD0	#CJK UNIFIED IDEOGRAPH
+0xFAB7	0x5F21	#CJK UNIFIED IDEOGRAPH
+0xFAB8	0x5F34	#CJK UNIFIED IDEOGRAPH
+0xFAB9	0x5F67	#CJK UNIFIED IDEOGRAPH
+0xFABA	0x5FB7	#CJK UNIFIED IDEOGRAPH
+0xFABB	0x5FDE	#CJK UNIFIED IDEOGRAPH
+0xFABC	0x605D	#CJK UNIFIED IDEOGRAPH
+0xFABD	0x6085	#CJK UNIFIED IDEOGRAPH
+0xFABE	0x608A	#CJK UNIFIED IDEOGRAPH
+0xFABF	0x60DE	#CJK UNIFIED IDEOGRAPH
+0xFAC0	0x60D5	#CJK UNIFIED IDEOGRAPH
+0xFAC1	0x6120	#CJK UNIFIED IDEOGRAPH
+0xFAC2	0x60F2	#CJK UNIFIED IDEOGRAPH
+0xFAC3	0x6111	#CJK UNIFIED IDEOGRAPH
+0xFAC4	0x6137	#CJK UNIFIED IDEOGRAPH
+0xFAC5	0x6130	#CJK UNIFIED IDEOGRAPH
+0xFAC6	0x6198	#CJK UNIFIED IDEOGRAPH
+0xFAC7	0x6213	#CJK UNIFIED IDEOGRAPH
+0xFAC8	0x62A6	#CJK UNIFIED IDEOGRAPH
+0xFAC9	0x63F5	#CJK UNIFIED IDEOGRAPH
+0xFACA	0x6460	#CJK UNIFIED IDEOGRAPH
+0xFACB	0x649D	#CJK UNIFIED IDEOGRAPH
+0xFACC	0x64CE	#CJK UNIFIED IDEOGRAPH
+0xFACD	0x654E	#CJK UNIFIED IDEOGRAPH
+0xFACE	0x6600	#CJK UNIFIED IDEOGRAPH
+0xFACF	0x6615	#CJK UNIFIED IDEOGRAPH
+0xFAD0	0x663B	#CJK UNIFIED IDEOGRAPH
+0xFAD1	0x6609	#CJK UNIFIED IDEOGRAPH
+0xFAD2	0x662E	#CJK UNIFIED IDEOGRAPH
+0xFAD3	0x661E	#CJK UNIFIED IDEOGRAPH
+0xFAD4	0x6624	#CJK UNIFIED IDEOGRAPH
+0xFAD5	0x6665	#CJK UNIFIED IDEOGRAPH
+0xFAD6	0x6657	#CJK UNIFIED IDEOGRAPH
+0xFAD7	0x6659	#CJK UNIFIED IDEOGRAPH
+0xFAD8	0xFA12	#CJK COMPATIBILITY IDEOGRAPH
+0xFAD9	0x6673	#CJK UNIFIED IDEOGRAPH
+0xFADA	0x6699	#CJK UNIFIED IDEOGRAPH
+0xFADB	0x66A0	#CJK UNIFIED IDEOGRAPH
+0xFADC	0x66B2	#CJK UNIFIED IDEOGRAPH
+0xFADD	0x66BF	#CJK UNIFIED IDEOGRAPH
+0xFADE	0x66FA	#CJK UNIFIED IDEOGRAPH
+0xFADF	0x670E	#CJK UNIFIED IDEOGRAPH
+0xFAE0	0xF929	#CJK COMPATIBILITY IDEOGRAPH
+0xFAE1	0x6766	#CJK UNIFIED IDEOGRAPH
+0xFAE2	0x67BB	#CJK UNIFIED IDEOGRAPH
+0xFAE3	0x6852	#CJK UNIFIED IDEOGRAPH
+0xFAE4	0x67C0	#CJK UNIFIED IDEOGRAPH
+0xFAE5	0x6801	#CJK UNIFIED IDEOGRAPH
+0xFAE6	0x6844	#CJK UNIFIED IDEOGRAPH
+0xFAE7	0x68CF	#CJK UNIFIED IDEOGRAPH
+0xFAE8	0xFA13	#CJK COMPATIBILITY IDEOGRAPH
+0xFAE9	0x6968	#CJK UNIFIED IDEOGRAPH
+0xFAEA	0xFA14	#CJK COMPATIBILITY IDEOGRAPH
+0xFAEB	0x6998	#CJK UNIFIED IDEOGRAPH
+0xFAEC	0x69E2	#CJK UNIFIED IDEOGRAPH
+0xFAED	0x6A30	#CJK UNIFIED IDEOGRAPH
+0xFAEE	0x6A6B	#CJK UNIFIED IDEOGRAPH
+0xFAEF	0x6A46	#CJK UNIFIED IDEOGRAPH
+0xFAF0	0x6A73	#CJK UNIFIED IDEOGRAPH
+0xFAF1	0x6A7E	#CJK UNIFIED IDEOGRAPH
+0xFAF2	0x6AE2	#CJK UNIFIED IDEOGRAPH
+0xFAF3	0x6AE4	#CJK UNIFIED IDEOGRAPH
+0xFAF4	0x6BD6	#CJK UNIFIED IDEOGRAPH
+0xFAF5	0x6C3F	#CJK UNIFIED IDEOGRAPH
+0xFAF6	0x6C5C	#CJK UNIFIED IDEOGRAPH
+0xFAF7	0x6C86	#CJK UNIFIED IDEOGRAPH
+0xFAF8	0x6C6F	#CJK UNIFIED IDEOGRAPH
+0xFAF9	0x6CDA	#CJK UNIFIED IDEOGRAPH
+0xFAFA	0x6D04	#CJK UNIFIED IDEOGRAPH
+0xFAFB	0x6D87	#CJK UNIFIED IDEOGRAPH
+0xFAFC	0x6D6F	#CJK UNIFIED IDEOGRAPH
+0xFB40	0x6D96	#CJK UNIFIED IDEOGRAPH
+0xFB41	0x6DAC	#CJK UNIFIED IDEOGRAPH
+0xFB42	0x6DCF	#CJK UNIFIED IDEOGRAPH
+0xFB43	0x6DF8	#CJK UNIFIED IDEOGRAPH
+0xFB44	0x6DF2	#CJK UNIFIED IDEOGRAPH
+0xFB45	0x6DFC	#CJK UNIFIED IDEOGRAPH
+0xFB46	0x6E39	#CJK UNIFIED IDEOGRAPH
+0xFB47	0x6E5C	#CJK UNIFIED IDEOGRAPH
+0xFB48	0x6E27	#CJK UNIFIED IDEOGRAPH
+0xFB49	0x6E3C	#CJK UNIFIED IDEOGRAPH
+0xFB4A	0x6EBF	#CJK UNIFIED IDEOGRAPH
+0xFB4B	0x6F88	#CJK UNIFIED IDEOGRAPH
+0xFB4C	0x6FB5	#CJK UNIFIED IDEOGRAPH
+0xFB4D	0x6FF5	#CJK UNIFIED IDEOGRAPH
+0xFB4E	0x7005	#CJK UNIFIED IDEOGRAPH
+0xFB4F	0x7007	#CJK UNIFIED IDEOGRAPH
+0xFB50	0x7028	#CJK UNIFIED IDEOGRAPH
+0xFB51	0x7085	#CJK UNIFIED IDEOGRAPH
+0xFB52	0x70AB	#CJK UNIFIED IDEOGRAPH
+0xFB53	0x710F	#CJK UNIFIED IDEOGRAPH
+0xFB54	0x7104	#CJK UNIFIED IDEOGRAPH
+0xFB55	0x715C	#CJK UNIFIED IDEOGRAPH
+0xFB56	0x7146	#CJK UNIFIED IDEOGRAPH
+0xFB57	0x7147	#CJK UNIFIED IDEOGRAPH
+0xFB58	0xFA15	#CJK COMPATIBILITY IDEOGRAPH
+0xFB59	0x71C1	#CJK UNIFIED IDEOGRAPH
+0xFB5A	0x71FE	#CJK UNIFIED IDEOGRAPH
+0xFB5B	0x72B1	#CJK UNIFIED IDEOGRAPH
+0xFB5C	0x72BE	#CJK UNIFIED IDEOGRAPH
+0xFB5D	0x7324	#CJK UNIFIED IDEOGRAPH
+0xFB5E	0xFA16	#CJK COMPATIBILITY IDEOGRAPH
+0xFB5F	0x7377	#CJK UNIFIED IDEOGRAPH
+0xFB60	0x73BD	#CJK UNIFIED IDEOGRAPH
+0xFB61	0x73C9	#CJK UNIFIED IDEOGRAPH
+0xFB62	0x73D6	#CJK UNIFIED IDEOGRAPH
+0xFB63	0x73E3	#CJK UNIFIED IDEOGRAPH
+0xFB64	0x73D2	#CJK UNIFIED IDEOGRAPH
+0xFB65	0x7407	#CJK UNIFIED IDEOGRAPH
+0xFB66	0x73F5	#CJK UNIFIED IDEOGRAPH
+0xFB67	0x7426	#CJK UNIFIED IDEOGRAPH
+0xFB68	0x742A	#CJK UNIFIED IDEOGRAPH
+0xFB69	0x7429	#CJK UNIFIED IDEOGRAPH
+0xFB6A	0x742E	#CJK UNIFIED IDEOGRAPH
+0xFB6B	0x7462	#CJK UNIFIED IDEOGRAPH
+0xFB6C	0x7489	#CJK UNIFIED IDEOGRAPH
+0xFB6D	0x749F	#CJK UNIFIED IDEOGRAPH
+0xFB6E	0x7501	#CJK UNIFIED IDEOGRAPH
+0xFB6F	0x756F	#CJK UNIFIED IDEOGRAPH
+0xFB70	0x7682	#CJK UNIFIED IDEOGRAPH
+0xFB71	0x769C	#CJK UNIFIED IDEOGRAPH
+0xFB72	0x769E	#CJK UNIFIED IDEOGRAPH
+0xFB73	0x769B	#CJK UNIFIED IDEOGRAPH
+0xFB74	0x76A6	#CJK UNIFIED IDEOGRAPH
+0xFB75	0xFA17	#CJK COMPATIBILITY IDEOGRAPH
+0xFB76	0x7746	#CJK UNIFIED IDEOGRAPH
+0xFB77	0x52AF	#CJK UNIFIED IDEOGRAPH
+0xFB78	0x7821	#CJK UNIFIED IDEOGRAPH
+0xFB79	0x784E	#CJK UNIFIED IDEOGRAPH
+0xFB7A	0x7864	#CJK UNIFIED IDEOGRAPH
+0xFB7B	0x787A	#CJK UNIFIED IDEOGRAPH
+0xFB7C	0x7930	#CJK UNIFIED IDEOGRAPH
+0xFB7D	0xFA18	#CJK COMPATIBILITY IDEOGRAPH
+0xFB7E	0xFA19	#CJK COMPATIBILITY IDEOGRAPH
+0xFB80	0xFA1A	#CJK COMPATIBILITY IDEOGRAPH
+0xFB81	0x7994	#CJK UNIFIED IDEOGRAPH
+0xFB82	0xFA1B	#CJK COMPATIBILITY IDEOGRAPH
+0xFB83	0x799B	#CJK UNIFIED IDEOGRAPH
+0xFB84	0x7AD1	#CJK UNIFIED IDEOGRAPH
+0xFB85	0x7AE7	#CJK UNIFIED IDEOGRAPH
+0xFB86	0xFA1C	#CJK COMPATIBILITY IDEOGRAPH
+0xFB87	0x7AEB	#CJK UNIFIED IDEOGRAPH
+0xFB88	0x7B9E	#CJK UNIFIED IDEOGRAPH
+0xFB89	0xFA1D	#CJK COMPATIBILITY IDEOGRAPH
+0xFB8A	0x7D48	#CJK UNIFIED IDEOGRAPH
+0xFB8B	0x7D5C	#CJK UNIFIED IDEOGRAPH
+0xFB8C	0x7DB7	#CJK UNIFIED IDEOGRAPH
+0xFB8D	0x7DA0	#CJK UNIFIED IDEOGRAPH
+0xFB8E	0x7DD6	#CJK UNIFIED IDEOGRAPH
+0xFB8F	0x7E52	#CJK UNIFIED IDEOGRAPH
+0xFB90	0x7F47	#CJK UNIFIED IDEOGRAPH
+0xFB91	0x7FA1	#CJK UNIFIED IDEOGRAPH
+0xFB92	0xFA1E	#CJK COMPATIBILITY IDEOGRAPH
+0xFB93	0x8301	#CJK UNIFIED IDEOGRAPH
+0xFB94	0x8362	#CJK UNIFIED IDEOGRAPH
+0xFB95	0x837F	#CJK UNIFIED IDEOGRAPH
+0xFB96	0x83C7	#CJK UNIFIED IDEOGRAPH
+0xFB97	0x83F6	#CJK UNIFIED IDEOGRAPH
+0xFB98	0x8448	#CJK UNIFIED IDEOGRAPH
+0xFB99	0x84B4	#CJK UNIFIED IDEOGRAPH
+0xFB9A	0x8553	#CJK UNIFIED IDEOGRAPH
+0xFB9B	0x8559	#CJK UNIFIED IDEOGRAPH
+0xFB9C	0x856B	#CJK UNIFIED IDEOGRAPH
+0xFB9D	0xFA1F	#CJK COMPATIBILITY IDEOGRAPH
+0xFB9E	0x85B0	#CJK UNIFIED IDEOGRAPH
+0xFB9F	0xFA20	#CJK COMPATIBILITY IDEOGRAPH
+0xFBA0	0xFA21	#CJK COMPATIBILITY IDEOGRAPH
+0xFBA1	0x8807	#CJK UNIFIED IDEOGRAPH
+0xFBA2	0x88F5	#CJK UNIFIED IDEOGRAPH
+0xFBA3	0x8A12	#CJK UNIFIED IDEOGRAPH
+0xFBA4	0x8A37	#CJK UNIFIED IDEOGRAPH
+0xFBA5	0x8A79	#CJK UNIFIED IDEOGRAPH
+0xFBA6	0x8AA7	#CJK UNIFIED IDEOGRAPH
+0xFBA7	0x8ABE	#CJK UNIFIED IDEOGRAPH
+0xFBA8	0x8ADF	#CJK UNIFIED IDEOGRAPH
+0xFBA9	0xFA22	#CJK COMPATIBILITY IDEOGRAPH
+0xFBAA	0x8AF6	#CJK UNIFIED IDEOGRAPH
+0xFBAB	0x8B53	#CJK UNIFIED IDEOGRAPH
+0xFBAC	0x8B7F	#CJK UNIFIED IDEOGRAPH
+0xFBAD	0x8CF0	#CJK UNIFIED IDEOGRAPH
+0xFBAE	0x8CF4	#CJK UNIFIED IDEOGRAPH
+0xFBAF	0x8D12	#CJK UNIFIED IDEOGRAPH
+0xFBB0	0x8D76	#CJK UNIFIED IDEOGRAPH
+0xFBB1	0xFA23	#CJK COMPATIBILITY IDEOGRAPH
+0xFBB2	0x8ECF	#CJK UNIFIED IDEOGRAPH
+0xFBB3	0xFA24	#CJK COMPATIBILITY IDEOGRAPH
+0xFBB4	0xFA25	#CJK COMPATIBILITY IDEOGRAPH
+0xFBB5	0x9067	#CJK UNIFIED IDEOGRAPH
+0xFBB6	0x90DE	#CJK UNIFIED IDEOGRAPH
+0xFBB7	0xFA26	#CJK COMPATIBILITY IDEOGRAPH
+0xFBB8	0x9115	#CJK UNIFIED IDEOGRAPH
+0xFBB9	0x9127	#CJK UNIFIED IDEOGRAPH
+0xFBBA	0x91DA	#CJK UNIFIED IDEOGRAPH
+0xFBBB	0x91D7	#CJK UNIFIED IDEOGRAPH
+0xFBBC	0x91DE	#CJK UNIFIED IDEOGRAPH
+0xFBBD	0x91ED	#CJK UNIFIED IDEOGRAPH
+0xFBBE	0x91EE	#CJK UNIFIED IDEOGRAPH
+0xFBBF	0x91E4	#CJK UNIFIED IDEOGRAPH
+0xFBC0	0x91E5	#CJK UNIFIED IDEOGRAPH
+0xFBC1	0x9206	#CJK UNIFIED IDEOGRAPH
+0xFBC2	0x9210	#CJK UNIFIED IDEOGRAPH
+0xFBC3	0x920A	#CJK UNIFIED IDEOGRAPH
+0xFBC4	0x923A	#CJK UNIFIED IDEOGRAPH
+0xFBC5	0x9240	#CJK UNIFIED IDEOGRAPH
+0xFBC6	0x923C	#CJK UNIFIED IDEOGRAPH
+0xFBC7	0x924E	#CJK UNIFIED IDEOGRAPH
+0xFBC8	0x9259	#CJK UNIFIED IDEOGRAPH
+0xFBC9	0x9251	#CJK UNIFIED IDEOGRAPH
+0xFBCA	0x9239	#CJK UNIFIED IDEOGRAPH
+0xFBCB	0x9267	#CJK UNIFIED IDEOGRAPH
+0xFBCC	0x92A7	#CJK UNIFIED IDEOGRAPH
+0xFBCD	0x9277	#CJK UNIFIED IDEOGRAPH
+0xFBCE	0x9278	#CJK UNIFIED IDEOGRAPH
+0xFBCF	0x92E7	#CJK UNIFIED IDEOGRAPH
+0xFBD0	0x92D7	#CJK UNIFIED IDEOGRAPH
+0xFBD1	0x92D9	#CJK UNIFIED IDEOGRAPH
+0xFBD2	0x92D0	#CJK UNIFIED IDEOGRAPH
+0xFBD3	0xFA27	#CJK COMPATIBILITY IDEOGRAPH
+0xFBD4	0x92D5	#CJK UNIFIED IDEOGRAPH
+0xFBD5	0x92E0	#CJK UNIFIED IDEOGRAPH
+0xFBD6	0x92D3	#CJK UNIFIED IDEOGRAPH
+0xFBD7	0x9325	#CJK UNIFIED IDEOGRAPH
+0xFBD8	0x9321	#CJK UNIFIED IDEOGRAPH
+0xFBD9	0x92FB	#CJK UNIFIED IDEOGRAPH
+0xFBDA	0xFA28	#CJK COMPATIBILITY IDEOGRAPH
+0xFBDB	0x931E	#CJK UNIFIED IDEOGRAPH
+0xFBDC	0x92FF	#CJK UNIFIED IDEOGRAPH
+0xFBDD	0x931D	#CJK UNIFIED IDEOGRAPH
+0xFBDE	0x9302	#CJK UNIFIED IDEOGRAPH
+0xFBDF	0x9370	#CJK UNIFIED IDEOGRAPH
+0xFBE0	0x9357	#CJK UNIFIED IDEOGRAPH
+0xFBE1	0x93A4	#CJK UNIFIED IDEOGRAPH
+0xFBE2	0x93C6	#CJK UNIFIED IDEOGRAPH
+0xFBE3	0x93DE	#CJK UNIFIED IDEOGRAPH
+0xFBE4	0x93F8	#CJK UNIFIED IDEOGRAPH
+0xFBE5	0x9431	#CJK UNIFIED IDEOGRAPH
+0xFBE6	0x9445	#CJK UNIFIED IDEOGRAPH
+0xFBE7	0x9448	#CJK UNIFIED IDEOGRAPH
+0xFBE8	0x9592	#CJK UNIFIED IDEOGRAPH
+0xFBE9	0xF9DC	#CJK COMPATIBILITY IDEOGRAPH
+0xFBEA	0xFA29	#CJK COMPATIBILITY IDEOGRAPH
+0xFBEB	0x969D	#CJK UNIFIED IDEOGRAPH
+0xFBEC	0x96AF	#CJK UNIFIED IDEOGRAPH
+0xFBED	0x9733	#CJK UNIFIED IDEOGRAPH
+0xFBEE	0x973B	#CJK UNIFIED IDEOGRAPH
+0xFBEF	0x9743	#CJK UNIFIED IDEOGRAPH
+0xFBF0	0x974D	#CJK UNIFIED IDEOGRAPH
+0xFBF1	0x974F	#CJK UNIFIED IDEOGRAPH
+0xFBF2	0x9751	#CJK UNIFIED IDEOGRAPH
+0xFBF3	0x9755	#CJK UNIFIED IDEOGRAPH
+0xFBF4	0x9857	#CJK UNIFIED IDEOGRAPH
+0xFBF5	0x9865	#CJK UNIFIED IDEOGRAPH
+0xFBF6	0xFA2A	#CJK COMPATIBILITY IDEOGRAPH
+0xFBF7	0xFA2B	#CJK COMPATIBILITY IDEOGRAPH
+0xFBF8	0x9927	#CJK UNIFIED IDEOGRAPH
+0xFBF9	0xFA2C	#CJK COMPATIBILITY IDEOGRAPH
+0xFBFA	0x999E	#CJK UNIFIED IDEOGRAPH
+0xFBFB	0x9A4E	#CJK UNIFIED IDEOGRAPH
+0xFBFC	0x9AD9	#CJK UNIFIED IDEOGRAPH
+0xFC40	0x9ADC	#CJK UNIFIED IDEOGRAPH
+0xFC41	0x9B75	#CJK UNIFIED IDEOGRAPH
+0xFC42	0x9B72	#CJK UNIFIED IDEOGRAPH
+0xFC43	0x9B8F	#CJK UNIFIED IDEOGRAPH
+0xFC44	0x9BB1	#CJK UNIFIED IDEOGRAPH
+0xFC45	0x9BBB	#CJK UNIFIED IDEOGRAPH
+0xFC46	0x9C00	#CJK UNIFIED IDEOGRAPH
+0xFC47	0x9D70	#CJK UNIFIED IDEOGRAPH
+0xFC48	0x9D6B	#CJK UNIFIED IDEOGRAPH
+0xFC49	0xFA2D	#CJK COMPATIBILITY IDEOGRAPH
+0xFC4A	0x9E19	#CJK UNIFIED IDEOGRAPH
+0xFC4B	0x9ED1	#CJK UNIFIED IDEOGRAPH
diff --git a/lib/unicode.nim b/lib/unicode.nim
index de3b80c94..e6665fbe2 100644
--- a/lib/unicode.nim
+++ b/lib/unicode.nim
@@ -7,6 +7,8 @@
 #    distribution, for details about the copyright.
 #
 
+## This module provides a way to handle various Unicode (or other) encodings.
+
 type
   TUniChar* = int32 ## type that can hold any Unicode character
   TUniChar16* = int16 ## 16 bit Unicode character
@@ -17,19 +19,15 @@ proc uniCharLen*(s: string): int =
   ## returns the number of Unicode characters of the string `s`.
   var i = 0
   while i < len(s):
-    if ord(s[i]) <= 127:
-      inc(i)
-    elif ord(s[i]) shr 5 == 0b110:
-      inc(i, 2)
-    elif ord(s[i]) shr 4 == 0b1110:
-      inc(i, 3)
-    elif ord(s[i]) shr 3 == 0b11110:
-      inc(i, 4)
-    else:
-      assert(false)
+    if ord(s[i]) <= 127: inc(i)
+    elif ord(s[i]) shr 5 == 0b110: inc(i, 2)
+    elif ord(s[i]) shr 4 == 0b1110: inc(i, 3)
+    elif ord(s[i]) shr 3 == 0b11110: inc(i, 4)
+    else: assert(false)
     inc(result)
 
 proc uniCharAt*(s: string, i: int): TUniChar =
+  ## returns the unicode character in `s` at byte index `i`
   if ord(s[i]) <= 127:
     result = ord(s[i])
   elif ord(s[i]) shr 5 == 0b110:
@@ -53,8 +51,7 @@ proc uniCharAt*(s: string, i: int): TUniChar =
     assert(false)
 
 iterator unichars*(s: string): TUniChar =
-  ## iterates over any unicode character of the string `s`. Fastest possible
-  ## method.
+  ## iterates over any unicode character of the string `s`.
   var
     i = 0
     result: TUniChar
@@ -79,6 +76,59 @@ iterator unichars*(s: string): TUniChar =
     else:
       assert(false)
     yield result
+    
+type
+  TCharacterSet = enum
+    cs8859_1, cs8859_2
+    
+const
+  characterSetToName: array [TCharacterSet, string] = [
+    "ISO/IEC 8859-1:1998",
+    "ISO 8859-2:1999",
+    "",
+    ""
+    ]
+    
+  cs8859_2toUnicode: array [0xA1..0xff, TUniChar16] = [
+    0x0104'i16, 0x02D8'i16, 0x0141'i16, 0x00A4'i16, 0x013D'i16, 0x015A'i16,  
+    0x00A7'i16, 0x00A8'i16, 0x0160'i16, 0x015E'i16, 0x0164'i16, 0x0179'i16,  
+    0x00AD'i16, 0x017D'i16, 0x017B'i16, 0x00B0'i16, 0x0105'i16, 0x02DB'i16,  
+    0x0142'i16, 0x00B4'i16, 0x013E'i16, 0x015B'i16, 0x02C7'i16, 0x00B8'i16,  
+    0x0161'i16, 0x015F'i16, 0x0165'i16, 0x017A'i16, 0x02DD'i16, 0x017E'i16,  
+    0x017C'i16, 0x0154'i16, 0x00C1'i16, 0x00C2'i16, 0x0102'i16, 0x00C4'i16,  
+    0x0139'i16, 0x0106'i16, 0x00C7'i16, 0x010C'i16, 0x00C9'i16, 0x0118'i16,  
+    0x00CB'i16, 0x011A'i16, 0x00CD'i16, 0x00CE'i16, 0x010E'i16, 0x0110'i16,  
+    0x0143'i16, 0x0147'i16, 0x00D3'i16, 0x00D4'i16, 0x0150'i16, 0x00D6'i16,  
+    0x00D7'i16, 0x0158'i16, 0x016E'i16, 0x00DA'i16, 0x0170'i16, 0x00DC'i16,  
+    0x00DD'i16, 0x0162'i16, 0x00DF'i16, 0x0155'i16, 0x00E1'i16, 0x00E2'i16,  
+    0x0103'i16, 0x00E4'i16, 0x013A'i16, 0x0107'i16, 0x00E7'i16, 0x010D'i16,  
+    0x00E9'i16, 0x0119'i16, 0x00EB'i16, 0x011B'i16, 0x00ED'i16, 0x00EE'i16,  
+    0x010F'i16, 0x0111'i16, 0x0144'i16, 0x0148'i16, 0x00F3'i16, 0x00F4'i16,  
+    0x0151'i16, 0x00F6'i16, 0x00F7'i16, 0x0159'i16, 0x016F'i16, 0x00FA'i16,  
+    0x0171'i16, 0x00FC'i16, 0x00FD'i16, 0x0163'i16, 0x02D9'i16]
+    
+proc searchTable(tab: openarray[TUniChar16], u: TUniChar16): int8 = 
+  var idx = find(tab, u)
+  assert(idx > 0)
+  result = toU8(idx)
+    
+proc csToUnicode(cs: TCharacterSet, c: int8): TUniChar16 = 
+  case cs
+  of cs8859_1: result = ze16(c) # no table lookup necessary
+  of cs8859_2: 
+    if c <=% 0xA0'i8: 
+      result = ze16(c)
+    else:
+      result = cs8859_2toUnicode[ze(c)]
+
+proc unicodeToCS(cs: TCharacterSet, u: TUniChar16): int8 = 
+  case cs
+  of cs8859_1: result = toU8(u) # no table lookup necessary
+  of cs8859_2:
+    if u <=% 0x00A0'i16: 
+      result = toU8(u)
+    else:
+      result = searchTable(cs8859_2toUnicode, u) +% 0xA1'8
 
 proc utf8toLocale*(s: string): string
 proc localeToUtf8*(s: string): string
diff --git a/lib/windows/windows.nim b/lib/windows/windows.nim
index d14f56d12..2ac5fd7b6 100644
--- a/lib/windows/windows.nim
+++ b/lib/windows/windows.nim
@@ -7362,8 +7362,6 @@ when defined(x86_64):
 
     TXmmSaveArea* = XMM_SAVE_AREA32
     PXmmSaveArea* = ptr TXmmSaveArea
-  const
-    LEGACY_SAVE_AREA_LENGTH* = sizeof(XMM_SAVE_AREA32)
   type
     CONTEXT* {.final, pure.} = object
       P1Home*: DWORD64
diff --git a/nim/ast.pas b/nim/ast.pas
index c84262db4..899554c4e 100644
--- a/nim/ast.pas
+++ b/nim/ast.pas
@@ -65,148 +65,148 @@ for key, val in enums.items():
   cog.out(a)

   cog.out(b)

 ]]]*)

-type

-  TTypeFlag = (

-    tfVarargs, tfFinal, tfAcyclic, tfEnumHasWholes);

-  TTypeFlags = set of TTypeFlag;

-const

-  TypeFlagToStr: array [TTypeFlag] of string = (

-    'tfVarargs', 'tfFinal', 'tfAcyclic', 'tfEnumHasWholes');

-type

-  TTypeKind = (

-    tyNone, tyBool, tyChar, tyEmpty, 

-    tyArrayConstr, tyNil, tyGeneric, tyGenericInst, 

-    tyGenericParam, tyEnum, tyAnyEnum, tyArray, 

-    tyObject, tyTuple, tySet, tyRange, 

-    tyPtr, tyRef, tyVar, tySequence, 

-    tyProc, tyPointer, tyOpenArray, tyString, 

-    tyCString, tyForward, tyInt, tyInt8, 

-    tyInt16, tyInt32, tyInt64, tyFloat, 

-    tyFloat32, tyFloat64, tyFloat128);

-  TTypeKinds = set of TTypeKind;

-const

-  TypeKindToStr: array [TTypeKind] of string = (

-    'tyNone', 'tyBool', 'tyChar', 'tyEmpty', 

-    'tyArrayConstr', 'tyNil', 'tyGeneric', 'tyGenericInst', 

-    'tyGenericParam', 'tyEnum', 'tyAnyEnum', 'tyArray', 

-    'tyObject', 'tyTuple', 'tySet', 'tyRange', 

-    'tyPtr', 'tyRef', 'tyVar', 'tySequence', 

-    'tyProc', 'tyPointer', 'tyOpenArray', 'tyString', 

-    'tyCString', 'tyForward', 'tyInt', 'tyInt8', 

-    'tyInt16', 'tyInt32', 'tyInt64', 'tyFloat', 

-    'tyFloat32', 'tyFloat64', 'tyFloat128');

-type

-  TSymFlag = (

-    sfUsed, sfStar, sfMinus, sfInInterface, 

-    sfFromGeneric, sfGlobal, sfForward, sfImportc, 

-    sfExportc, sfVolatile, sfRegister, sfPure, 

-    sfResult, sfNoSideEffect, sfMainModule, sfSystemModule, 

-    sfNoReturn, sfAddrTaken, sfCompilerProc, sfCppMethod, 

-    sfDiscriminant, sfDeprecated, sfInClosure, sfTypeCheck, 

-    sfCompileTime, sfThreadVar, sfMerge);

-  TSymFlags = set of TSymFlag;

-const

-  SymFlagToStr: array [TSymFlag] of string = (

-    'sfUsed', 'sfStar', 'sfMinus', 'sfInInterface', 

-    'sfFromGeneric', 'sfGlobal', 'sfForward', 'sfImportc', 

-    'sfExportc', 'sfVolatile', 'sfRegister', 'sfPure', 

-    'sfResult', 'sfNoSideEffect', 'sfMainModule', 'sfSystemModule', 

-    'sfNoReturn', 'sfAddrTaken', 'sfCompilerProc', 'sfCppMethod', 

-    'sfDiscriminant', 'sfDeprecated', 'sfInClosure', 'sfTypeCheck', 

-    'sfCompileTime', 'sfThreadVar', 'sfMerge');

-type

-  TNodeFlag = (

-    nfNone, nfBase2, nfBase8, nfBase16, 

-    nfAllConst, nfTransf, nfSem);

-  TNodeFlags = set of TNodeFlag;

-const

-  NodeFlagToStr: array [TNodeFlag] of string = (

-    'nfNone', 'nfBase2', 'nfBase8', 'nfBase16', 

-    'nfAllConst', 'nfTransf', 'nfSem');

-type

-  TSymKind = (

-    skUnknownSym, skConditional, skDynLib, skParam, 

-    skTypeParam, skTemp, skType, skConst, 

-    skVar, skProc, skIterator, skConverter, 

-    skMacro, skTemplate, skField, skEnumField, 

-    skForVar, skModule, skLabel, skStub);

-  TSymKinds = set of TSymKind;

-const

-  SymKindToStr: array [TSymKind] of string = (

-    'skUnknownSym', 'skConditional', 'skDynLib', 'skParam', 

-    'skTypeParam', 'skTemp', 'skType', 'skConst', 

-    'skVar', 'skProc', 'skIterator', 'skConverter', 

-    'skMacro', 'skTemplate', 'skField', 'skEnumField', 

-    'skForVar', 'skModule', 'skLabel', 'skStub');

-type

-  TNodeKind = (

-    nkNone, nkEmpty, nkIdent, nkSym, 

-    nkType, nkCharLit, nkIntLit, nkInt8Lit, 

-    nkInt16Lit, nkInt32Lit, nkInt64Lit, nkFloatLit, 

-    nkFloat32Lit, nkFloat64Lit, nkStrLit, nkRStrLit, 

-    nkTripleStrLit, nkMetaNode, nkNilLit, nkDotCall, 

-    nkCommand, nkCall, nkGenericCall, nkExplicitTypeListCall, 

-    nkExprEqExpr, nkExprColonExpr, nkIdentDefs, nkInfix, 

-    nkPrefix, nkPostfix, nkPar, nkCurly, 

-    nkBracket, nkBracketExpr, nkPragmaExpr, nkRange, 

-    nkDotExpr, nkCheckedFieldExpr, nkDerefExpr, nkIfExpr, 

-    nkElifExpr, nkElseExpr, nkLambda, nkAccQuoted, 

-    nkHeaderQuoted, nkTableConstr, nkQualified, nkHiddenStdConv, 

-    nkHiddenSubConv, nkHiddenCallConv, nkConv, nkCast, 

-    nkAddr, nkHiddenAddr, nkHiddenDeref, nkObjDownConv, 

-    nkObjUpConv, nkChckRangeF, nkChckRange64, nkChckRange, 

-    nkStringToCString, nkCStringToString, nkPassAsOpenArray, nkAsgn, 

-    nkDefaultTypeParam, nkGenericParams, nkFormalParams, nkOfInherit, 

-    nkModule, nkProcDef, nkConverterDef, nkMacroDef, 

-    nkTemplateDef, nkIteratorDef, nkOfBranch, nkElifBranch, 

-    nkExceptBranch, nkElse, nkMacroStmt, nkAsmStmt, 

-    nkPragma, nkIfStmt, nkWhenStmt, nkForStmt, 

-    nkWhileStmt, nkCaseStmt, nkVarSection, nkConstSection, 

-    nkConstDef, nkTypeSection, nkTypeDef, nkYieldStmt, 

-    nkTryStmt, nkFinally, nkRaiseStmt, nkReturnStmt, 

-    nkBreakStmt, nkContinueStmt, nkBlockStmt, nkDiscardStmt, 

-    nkStmtList, nkImportStmt, nkFromStmt, nkImportAs, 

-    nkIncludeStmt, nkAccessStmt, nkCommentStmt, nkStmtListExpr, 

-    nkBlockExpr, nkStmtListType, nkBlockType, nkVm, 

-    nkTypeOfExpr, nkObjectTy, nkTupleTy, nkRecList, 

-    nkRecCase, nkRecWhen, nkRefTy, nkPtrTy, 

-    nkVarTy, nkProcTy, nkEnumTy, nkEnumFieldDef, 

-    nkReturnToken);

-  TNodeKinds = set of TNodeKind;

-const

-  NodeKindToStr: array [TNodeKind] of string = (

-    'nkNone', 'nkEmpty', 'nkIdent', 'nkSym', 

-    'nkType', 'nkCharLit', 'nkIntLit', 'nkInt8Lit', 

-    'nkInt16Lit', 'nkInt32Lit', 'nkInt64Lit', 'nkFloatLit', 

-    'nkFloat32Lit', 'nkFloat64Lit', 'nkStrLit', 'nkRStrLit', 

-    'nkTripleStrLit', 'nkMetaNode', 'nkNilLit', 'nkDotCall', 

-    'nkCommand', 'nkCall', 'nkGenericCall', 'nkExplicitTypeListCall', 

-    'nkExprEqExpr', 'nkExprColonExpr', 'nkIdentDefs', 'nkInfix', 

-    'nkPrefix', 'nkPostfix', 'nkPar', 'nkCurly', 

-    'nkBracket', 'nkBracketExpr', 'nkPragmaExpr', 'nkRange', 

-    'nkDotExpr', 'nkCheckedFieldExpr', 'nkDerefExpr', 'nkIfExpr', 

-    'nkElifExpr', 'nkElseExpr', 'nkLambda', 'nkAccQuoted', 

-    'nkHeaderQuoted', 'nkTableConstr', 'nkQualified', 'nkHiddenStdConv', 

-    'nkHiddenSubConv', 'nkHiddenCallConv', 'nkConv', 'nkCast', 

-    'nkAddr', 'nkHiddenAddr', 'nkHiddenDeref', 'nkObjDownConv', 

-    'nkObjUpConv', 'nkChckRangeF', 'nkChckRange64', 'nkChckRange', 

-    'nkStringToCString', 'nkCStringToString', 'nkPassAsOpenArray', 'nkAsgn', 

-    'nkDefaultTypeParam', 'nkGenericParams', 'nkFormalParams', 'nkOfInherit', 

-    'nkModule', 'nkProcDef', 'nkConverterDef', 'nkMacroDef', 

-    'nkTemplateDef', 'nkIteratorDef', 'nkOfBranch', 'nkElifBranch', 

-    'nkExceptBranch', 'nkElse', 'nkMacroStmt', 'nkAsmStmt', 

-    'nkPragma', 'nkIfStmt', 'nkWhenStmt', 'nkForStmt', 

-    'nkWhileStmt', 'nkCaseStmt', 'nkVarSection', 'nkConstSection', 

-    'nkConstDef', 'nkTypeSection', 'nkTypeDef', 'nkYieldStmt', 

-    'nkTryStmt', 'nkFinally', 'nkRaiseStmt', 'nkReturnStmt', 

-    'nkBreakStmt', 'nkContinueStmt', 'nkBlockStmt', 'nkDiscardStmt', 

-    'nkStmtList', 'nkImportStmt', 'nkFromStmt', 'nkImportAs', 

-    'nkIncludeStmt', 'nkAccessStmt', 'nkCommentStmt', 'nkStmtListExpr', 

-    'nkBlockExpr', 'nkStmtListType', 'nkBlockType', 'nkVm', 

-    'nkTypeOfExpr', 'nkObjectTy', 'nkTupleTy', 'nkRecList', 

-    'nkRecCase', 'nkRecWhen', 'nkRefTy', 'nkPtrTy', 

-    'nkVarTy', 'nkProcTy', 'nkEnumTy', 'nkEnumFieldDef', 

-    'nkReturnToken');

+type
+  TNodeKind = (
+    nkNone, nkEmpty, nkIdent, nkSym, 
+    nkType, nkCharLit, nkIntLit, nkInt8Lit, 
+    nkInt16Lit, nkInt32Lit, nkInt64Lit, nkFloatLit, 
+    nkFloat32Lit, nkFloat64Lit, nkStrLit, nkRStrLit, 
+    nkTripleStrLit, nkMetaNode, nkNilLit, nkDotCall, 
+    nkCommand, nkCall, nkGenericCall, nkExplicitTypeListCall, 
+    nkExprEqExpr, nkExprColonExpr, nkIdentDefs, nkInfix, 
+    nkPrefix, nkPostfix, nkPar, nkCurly, 
+    nkBracket, nkBracketExpr, nkPragmaExpr, nkRange, 
+    nkDotExpr, nkCheckedFieldExpr, nkDerefExpr, nkIfExpr, 
+    nkElifExpr, nkElseExpr, nkLambda, nkAccQuoted, 
+    nkHeaderQuoted, nkTableConstr, nkQualified, nkHiddenStdConv, 
+    nkHiddenSubConv, nkHiddenCallConv, nkConv, nkCast, 
+    nkAddr, nkHiddenAddr, nkHiddenDeref, nkObjDownConv, 
+    nkObjUpConv, nkChckRangeF, nkChckRange64, nkChckRange, 
+    nkStringToCString, nkCStringToString, nkPassAsOpenArray, nkAsgn, 
+    nkDefaultTypeParam, nkGenericParams, nkFormalParams, nkOfInherit, 
+    nkModule, nkProcDef, nkConverterDef, nkMacroDef, 
+    nkTemplateDef, nkIteratorDef, nkOfBranch, nkElifBranch, 
+    nkExceptBranch, nkElse, nkMacroStmt, nkAsmStmt, 
+    nkPragma, nkIfStmt, nkWhenStmt, nkForStmt, 
+    nkWhileStmt, nkCaseStmt, nkVarSection, nkConstSection, 
+    nkConstDef, nkTypeSection, nkTypeDef, nkYieldStmt, 
+    nkTryStmt, nkFinally, nkRaiseStmt, nkReturnStmt, 
+    nkBreakStmt, nkContinueStmt, nkBlockStmt, nkDiscardStmt, 
+    nkStmtList, nkImportStmt, nkFromStmt, nkImportAs, 
+    nkIncludeStmt, nkAccessStmt, nkCommentStmt, nkStmtListExpr, 
+    nkBlockExpr, nkStmtListType, nkBlockType, nkVm, 
+    nkTypeOfExpr, nkObjectTy, nkTupleTy, nkRecList, 
+    nkRecCase, nkRecWhen, nkRefTy, nkPtrTy, 
+    nkVarTy, nkProcTy, nkEnumTy, nkEnumFieldDef, 
+    nkReturnToken);
+  TNodeKinds = set of TNodeKind;
+const
+  NodeKindToStr: array [TNodeKind] of string = (
+    'nkNone', 'nkEmpty', 'nkIdent', 'nkSym', 
+    'nkType', 'nkCharLit', 'nkIntLit', 'nkInt8Lit', 
+    'nkInt16Lit', 'nkInt32Lit', 'nkInt64Lit', 'nkFloatLit', 
+    'nkFloat32Lit', 'nkFloat64Lit', 'nkStrLit', 'nkRStrLit', 
+    'nkTripleStrLit', 'nkMetaNode', 'nkNilLit', 'nkDotCall', 
+    'nkCommand', 'nkCall', 'nkGenericCall', 'nkExplicitTypeListCall', 
+    'nkExprEqExpr', 'nkExprColonExpr', 'nkIdentDefs', 'nkInfix', 
+    'nkPrefix', 'nkPostfix', 'nkPar', 'nkCurly', 
+    'nkBracket', 'nkBracketExpr', 'nkPragmaExpr', 'nkRange', 
+    'nkDotExpr', 'nkCheckedFieldExpr', 'nkDerefExpr', 'nkIfExpr', 
+    'nkElifExpr', 'nkElseExpr', 'nkLambda', 'nkAccQuoted', 
+    'nkHeaderQuoted', 'nkTableConstr', 'nkQualified', 'nkHiddenStdConv', 
+    'nkHiddenSubConv', 'nkHiddenCallConv', 'nkConv', 'nkCast', 
+    'nkAddr', 'nkHiddenAddr', 'nkHiddenDeref', 'nkObjDownConv', 
+    'nkObjUpConv', 'nkChckRangeF', 'nkChckRange64', 'nkChckRange', 
+    'nkStringToCString', 'nkCStringToString', 'nkPassAsOpenArray', 'nkAsgn', 
+    'nkDefaultTypeParam', 'nkGenericParams', 'nkFormalParams', 'nkOfInherit', 
+    'nkModule', 'nkProcDef', 'nkConverterDef', 'nkMacroDef', 
+    'nkTemplateDef', 'nkIteratorDef', 'nkOfBranch', 'nkElifBranch', 
+    'nkExceptBranch', 'nkElse', 'nkMacroStmt', 'nkAsmStmt', 
+    'nkPragma', 'nkIfStmt', 'nkWhenStmt', 'nkForStmt', 
+    'nkWhileStmt', 'nkCaseStmt', 'nkVarSection', 'nkConstSection', 
+    'nkConstDef', 'nkTypeSection', 'nkTypeDef', 'nkYieldStmt', 
+    'nkTryStmt', 'nkFinally', 'nkRaiseStmt', 'nkReturnStmt', 
+    'nkBreakStmt', 'nkContinueStmt', 'nkBlockStmt', 'nkDiscardStmt', 
+    'nkStmtList', 'nkImportStmt', 'nkFromStmt', 'nkImportAs', 
+    'nkIncludeStmt', 'nkAccessStmt', 'nkCommentStmt', 'nkStmtListExpr', 
+    'nkBlockExpr', 'nkStmtListType', 'nkBlockType', 'nkVm', 
+    'nkTypeOfExpr', 'nkObjectTy', 'nkTupleTy', 'nkRecList', 
+    'nkRecCase', 'nkRecWhen', 'nkRefTy', 'nkPtrTy', 
+    'nkVarTy', 'nkProcTy', 'nkEnumTy', 'nkEnumFieldDef', 
+    'nkReturnToken');
+type
+  TSymFlag = (
+    sfUsed, sfStar, sfMinus, sfInInterface, 
+    sfFromGeneric, sfGlobal, sfForward, sfImportc, 
+    sfExportc, sfVolatile, sfRegister, sfPure, 
+    sfResult, sfNoSideEffect, sfMainModule, sfSystemModule, 
+    sfNoReturn, sfAddrTaken, sfCompilerProc, sfCppMethod, 
+    sfDiscriminant, sfDeprecated, sfInClosure, sfTypeCheck, 
+    sfCompileTime, sfThreadVar, sfMerge);
+  TSymFlags = set of TSymFlag;
+const
+  SymFlagToStr: array [TSymFlag] of string = (
+    'sfUsed', 'sfStar', 'sfMinus', 'sfInInterface', 
+    'sfFromGeneric', 'sfGlobal', 'sfForward', 'sfImportc', 
+    'sfExportc', 'sfVolatile', 'sfRegister', 'sfPure', 
+    'sfResult', 'sfNoSideEffect', 'sfMainModule', 'sfSystemModule', 
+    'sfNoReturn', 'sfAddrTaken', 'sfCompilerProc', 'sfCppMethod', 
+    'sfDiscriminant', 'sfDeprecated', 'sfInClosure', 'sfTypeCheck', 
+    'sfCompileTime', 'sfThreadVar', 'sfMerge');
+type
+  TTypeKind = (
+    tyNone, tyBool, tyChar, tyEmpty, 
+    tyArrayConstr, tyNil, tyGeneric, tyGenericInst, 
+    tyGenericParam, tyEnum, tyAnyEnum, tyArray, 
+    tyObject, tyTuple, tySet, tyRange, 
+    tyPtr, tyRef, tyVar, tySequence, 
+    tyProc, tyPointer, tyOpenArray, tyString, 
+    tyCString, tyForward, tyInt, tyInt8, 
+    tyInt16, tyInt32, tyInt64, tyFloat, 
+    tyFloat32, tyFloat64, tyFloat128);
+  TTypeKinds = set of TTypeKind;
+const
+  TypeKindToStr: array [TTypeKind] of string = (
+    'tyNone', 'tyBool', 'tyChar', 'tyEmpty', 
+    'tyArrayConstr', 'tyNil', 'tyGeneric', 'tyGenericInst', 
+    'tyGenericParam', 'tyEnum', 'tyAnyEnum', 'tyArray', 
+    'tyObject', 'tyTuple', 'tySet', 'tyRange', 
+    'tyPtr', 'tyRef', 'tyVar', 'tySequence', 
+    'tyProc', 'tyPointer', 'tyOpenArray', 'tyString', 
+    'tyCString', 'tyForward', 'tyInt', 'tyInt8', 
+    'tyInt16', 'tyInt32', 'tyInt64', 'tyFloat', 
+    'tyFloat32', 'tyFloat64', 'tyFloat128');
+type
+  TNodeFlag = (
+    nfNone, nfBase2, nfBase8, nfBase16, 
+    nfAllConst, nfTransf, nfSem);
+  TNodeFlags = set of TNodeFlag;
+const
+  NodeFlagToStr: array [TNodeFlag] of string = (
+    'nfNone', 'nfBase2', 'nfBase8', 'nfBase16', 
+    'nfAllConst', 'nfTransf', 'nfSem');
+type
+  TTypeFlag = (
+    tfVarargs, tfFinal, tfAcyclic, tfEnumHasWholes);
+  TTypeFlags = set of TTypeFlag;
+const
+  TypeFlagToStr: array [TTypeFlag] of string = (
+    'tfVarargs', 'tfFinal', 'tfAcyclic', 'tfEnumHasWholes');
+type
+  TSymKind = (
+    skUnknownSym, skConditional, skDynLib, skParam, 
+    skTypeParam, skTemp, skType, skConst, 
+    skVar, skProc, skIterator, skConverter, 
+    skMacro, skTemplate, skField, skEnumField, 
+    skForVar, skModule, skLabel, skStub);
+  TSymKinds = set of TSymKind;
+const
+  SymKindToStr: array [TSymKind] of string = (
+    'skUnknownSym', 'skConditional', 'skDynLib', 'skParam', 
+    'skTypeParam', 'skTemp', 'skType', 'skConst', 
+    'skVar', 'skProc', 'skIterator', 'skConverter', 
+    'skMacro', 'skTemplate', 'skField', 'skEnumField', 
+    'skForVar', 'skModule', 'skLabel', 'skStub');
 {[[[end]]]}

 

 type

@@ -219,43 +219,43 @@ type
     //  if (i+1) % 6 == 0: cog.outl("")

     //cog.outl("m" + magics[-1])

     //]]]

-    mNone, mDefined, mLow, mHigh, mSizeOf, mIs, 

-    mSucc, mPred, mInc, mDec, mOrd, mNew, 

-    mNewFinalize, mNewSeq, mRegisterFinalizer, mLengthOpenArray, mLengthStr, mLengthArray, 

-    mLengthSeq, mIncl, mExcl, mCard, mChr, mGCref, 

-    mGCunref, mAddI, mSubI, mMulI, mDivI, mModI, 

-    mAddI64, mSubI64, mMulI64, mDivI64, mModI64, mShrI, 

-    mShlI, mBitandI, mBitorI, mBitxorI, mMinI, mMaxI, 

-    mShrI64, mShlI64, mBitandI64, mBitorI64, mBitxorI64, mMinI64, 

-    mMaxI64, mAddF64, mSubF64, mMulF64, mDivF64, mMinF64, 

-    mMaxF64, mAddU, mSubU, mMulU, mDivU, mModU, 

-    mAddU64, mSubU64, mMulU64, mDivU64, mModU64, mEqI, 

-    mLeI, mLtI, mEqI64, mLeI64, mLtI64, mEqF64, 

-    mLeF64, mLtF64, mLeU, mLtU, mLeU64, mLtU64, 

-    mEqEnum, mLeEnum, mLtEnum, mEqCh, mLeCh, mLtCh, 

-    mEqB, mLeB, mLtB, mEqRef, mEqProc, mEqUntracedRef, 

-    mLePtr, mLtPtr, mEqCString, mXor, mUnaryMinusI, mUnaryMinusI64, 

-    mAbsI, mAbsI64, mNot, mUnaryPlusI, mBitnotI, mUnaryPlusI64, 

-    mBitnotI64, mUnaryPlusF64, mUnaryMinusF64, mAbsF64, mZe8ToI, mZe8ToI64, 

-    mZe16ToI, mZe16ToI64, mZe32ToI64, mZeIToI64, mToU8, mToU16, 

-    mToU32, mToFloat, mToBiggestFloat, mToInt, mToBiggestInt, mCharToStr, 

-    mBoolToStr, mIntToStr, mInt64ToStr, mFloatToStr, mCStrToStr, mStrToStr, 

-    mAnd, mOr, mEqStr, mLeStr, mLtStr, mEqSet, 

-    mLeSet, mLtSet, mMulSet, mPlusSet, mMinusSet, mSymDiffSet, 

-    mConStrStr, mConArrArr, mConArrT, mConTArr, mConTT, mSlice, 

-    mAppendStrCh, mAppendStrStr, mAppendSeqElem, mAppendSeqSeq, mInRange, mInSet, 

-    mAsgn, mRepr, mExit, mSetLengthStr, mSetLengthSeq, mAssert, 

-    mSwap, mIsNil, mArrToSeq, mArray, mOpenArray, mRange, 

-    mSet, mSeq, mInt, mInt8, mInt16, mInt32, 

-    mInt64, mFloat, mFloat32, mFloat64, mBool, mChar, 

-    mString, mCstring, mPointer, mAnyEnum, mEmptySet, mIntSetBaseType, 

-    mNil, mIsMainModule, mCompileDate, mCompileTime, mNimrodVersion, mNimrodMajor, 

-    mNimrodMinor, mNimrodPatch, mCpuEndian, mNaN, mInf, mNegInf, 

-    mNLen, mNChild, mNSetChild, mNAdd, mNAddMultiple, mNDel, 

-    mNKind, mNIntVal, mNFloatVal, mNSymbol, mNIdent, mNGetType, 

-    mNStrVal, mNSetIntVal, mNSetFloatVal, mNSetSymbol, mNSetIdent, mNSetType, 

-    mNSetStrVal, mNNewNimNode, mNCopyNimNode, mNCopyNimTree, mStrToIdent, mIdentToStr, 

-    mEqIdent, mNHint, mNWarning, mNError

+    mNone, mDefined, mLow, mHigh, mSizeOf, mIs, 
+    mSucc, mPred, mInc, mDec, mOrd, mNew, 
+    mNewFinalize, mNewSeq, mRegisterFinalizer, mLengthOpenArray, mLengthStr, mLengthArray, 
+    mLengthSeq, mIncl, mExcl, mCard, mChr, mGCref, 
+    mGCunref, mAddI, mSubI, mMulI, mDivI, mModI, 
+    mAddI64, mSubI64, mMulI64, mDivI64, mModI64, mShrI, 
+    mShlI, mBitandI, mBitorI, mBitxorI, mMinI, mMaxI, 
+    mShrI64, mShlI64, mBitandI64, mBitorI64, mBitxorI64, mMinI64, 
+    mMaxI64, mAddF64, mSubF64, mMulF64, mDivF64, mMinF64, 
+    mMaxF64, mAddU, mSubU, mMulU, mDivU, mModU, 
+    mAddU64, mSubU64, mMulU64, mDivU64, mModU64, mEqI, 
+    mLeI, mLtI, mEqI64, mLeI64, mLtI64, mEqF64, 
+    mLeF64, mLtF64, mLeU, mLtU, mLeU64, mLtU64, 
+    mEqEnum, mLeEnum, mLtEnum, mEqCh, mLeCh, mLtCh, 
+    mEqB, mLeB, mLtB, mEqRef, mEqProc, mEqUntracedRef, 
+    mLePtr, mLtPtr, mEqCString, mXor, mUnaryMinusI, mUnaryMinusI64, 
+    mAbsI, mAbsI64, mNot, mUnaryPlusI, mBitnotI, mUnaryPlusI64, 
+    mBitnotI64, mUnaryPlusF64, mUnaryMinusF64, mAbsF64, mZe8ToI, mZe8ToI64, 
+    mZe16ToI, mZe16ToI64, mZe32ToI64, mZeIToI64, mToU8, mToU16, 
+    mToU32, mToFloat, mToBiggestFloat, mToInt, mToBiggestInt, mCharToStr, 
+    mBoolToStr, mIntToStr, mInt64ToStr, mFloatToStr, mCStrToStr, mStrToStr, 
+    mAnd, mOr, mEqStr, mLeStr, mLtStr, mEqSet, 
+    mLeSet, mLtSet, mMulSet, mPlusSet, mMinusSet, mSymDiffSet, 
+    mConStrStr, mConArrArr, mConArrT, mConTArr, mConTT, mSlice, 
+    mAppendStrCh, mAppendStrStr, mAppendSeqElem, mAppendSeqSeq, mInRange, mInSet, 
+    mAsgn, mRepr, mExit, mSetLengthStr, mSetLengthSeq, mAssert, 
+    mSwap, mIsNil, mArrToSeq, mArray, mOpenArray, mRange, 
+    mSet, mSeq, mInt, mInt8, mInt16, mInt32, 
+    mInt64, mFloat, mFloat32, mFloat64, mBool, mChar, 
+    mString, mCstring, mPointer, mAnyEnum, mEmptySet, mIntSetBaseType, 
+    mNil, mIsMainModule, mCompileDate, mCompileTime, mNimrodVersion, mNimrodMajor, 
+    mNimrodMinor, mNimrodPatch, mCpuEndian, mNaN, mInf, mNegInf, 
+    mNLen, mNChild, mNSetChild, mNAdd, mNAddMultiple, mNDel, 
+    mNKind, mNIntVal, mNFloatVal, mNSymbol, mNIdent, mNGetType, 
+    mNStrVal, mNSetIntVal, mNSetFloatVal, mNSetSymbol, mNSetIdent, mNSetType, 
+    mNSetStrVal, mNNewNimNode, mNCopyNimNode, mNCopyNimTree, mStrToIdent, mIdentToStr, 
+    mEqIdent, mNHint, mNWarning, mNError
     //[[[end]]]

   );

 

@@ -319,10 +319,10 @@ type
     locField,      // location is a record field

     locArrayElem,  // location is an array element

     locExpr,       // "location" is really an expression

-    locImmediate,  // location is an immediate value

     locProc,       // location is a proc (an address of a procedure)

     locData,       // location is a constant

-    locCall,       // location is a call expression

+    locCall,       // location is a call expression
+    locImmediate,  // location is an immediate value

     locOther       // location is something other

   );

 

@@ -351,9 +351,10 @@ type
   end;

 

 // ---------------- end of backend information ------------------------------

-  TLibKind = (libHeader, libDynamic, libDynamicGenerated);

+  TLibKind = (libHeader, libDynamic);

   TLib = object(lists.TListEntry) // also misused for headers!

     kind: TLibKind;

+    generated: bool;

     // needed for the backends:

     name: PRope;

     path: string;

@@ -476,43 +477,43 @@ const // "MagicToStr" array:
     //  if (i+1) % 6 == 0: cog.outl("")

     //cog.outl("'%s'" % magics[-1])

     //]]]

-    'None', 'Defined', 'Low', 'High', 'SizeOf', 'Is', 

-    'Succ', 'Pred', 'Inc', 'Dec', 'Ord', 'New', 

-    'NewFinalize', 'NewSeq', 'RegisterFinalizer', 'LengthOpenArray', 'LengthStr', 'LengthArray', 

-    'LengthSeq', 'Incl', 'Excl', 'Card', 'Chr', 'GCref', 

-    'GCunref', 'AddI', 'SubI', 'MulI', 'DivI', 'ModI', 

-    'AddI64', 'SubI64', 'MulI64', 'DivI64', 'ModI64', 'ShrI', 

-    'ShlI', 'BitandI', 'BitorI', 'BitxorI', 'MinI', 'MaxI', 

-    'ShrI64', 'ShlI64', 'BitandI64', 'BitorI64', 'BitxorI64', 'MinI64', 

-    'MaxI64', 'AddF64', 'SubF64', 'MulF64', 'DivF64', 'MinF64', 

-    'MaxF64', 'AddU', 'SubU', 'MulU', 'DivU', 'ModU', 

-    'AddU64', 'SubU64', 'MulU64', 'DivU64', 'ModU64', 'EqI', 

-    'LeI', 'LtI', 'EqI64', 'LeI64', 'LtI64', 'EqF64', 

-    'LeF64', 'LtF64', 'LeU', 'LtU', 'LeU64', 'LtU64', 

-    'EqEnum', 'LeEnum', 'LtEnum', 'EqCh', 'LeCh', 'LtCh', 

-    'EqB', 'LeB', 'LtB', 'EqRef', 'EqProc', 'EqUntracedRef', 

-    'LePtr', 'LtPtr', 'EqCString', 'Xor', 'UnaryMinusI', 'UnaryMinusI64', 

-    'AbsI', 'AbsI64', 'Not', 'UnaryPlusI', 'BitnotI', 'UnaryPlusI64', 

-    'BitnotI64', 'UnaryPlusF64', 'UnaryMinusF64', 'AbsF64', 'Ze8ToI', 'Ze8ToI64', 

-    'Ze16ToI', 'Ze16ToI64', 'Ze32ToI64', 'ZeIToI64', 'ToU8', 'ToU16', 

-    'ToU32', 'ToFloat', 'ToBiggestFloat', 'ToInt', 'ToBiggestInt', 'CharToStr', 

-    'BoolToStr', 'IntToStr', 'Int64ToStr', 'FloatToStr', 'CStrToStr', 'StrToStr', 

-    'And', 'Or', 'EqStr', 'LeStr', 'LtStr', 'EqSet', 

-    'LeSet', 'LtSet', 'MulSet', 'PlusSet', 'MinusSet', 'SymDiffSet', 

-    'ConStrStr', 'ConArrArr', 'ConArrT', 'ConTArr', 'ConTT', 'Slice', 

-    'AppendStrCh', 'AppendStrStr', 'AppendSeqElem', 'AppendSeqSeq', 'InRange', 'InSet', 

-    'Asgn', 'Repr', 'Exit', 'SetLengthStr', 'SetLengthSeq', 'Assert', 

-    'Swap', 'IsNil', 'ArrToSeq', 'Array', 'OpenArray', 'Range', 

-    'Set', 'Seq', 'Int', 'Int8', 'Int16', 'Int32', 

-    'Int64', 'Float', 'Float32', 'Float64', 'Bool', 'Char', 

-    'String', 'Cstring', 'Pointer', 'AnyEnum', 'EmptySet', 'IntSetBaseType', 

-    'Nil', 'IsMainModule', 'CompileDate', 'CompileTime', 'NimrodVersion', 'NimrodMajor', 

-    'NimrodMinor', 'NimrodPatch', 'CpuEndian', 'NaN', 'Inf', 'NegInf', 

-    'NLen', 'NChild', 'NSetChild', 'NAdd', 'NAddMultiple', 'NDel', 

-    'NKind', 'NIntVal', 'NFloatVal', 'NSymbol', 'NIdent', 'NGetType', 

-    'NStrVal', 'NSetIntVal', 'NSetFloatVal', 'NSetSymbol', 'NSetIdent', 'NSetType', 

-    'NSetStrVal', 'NNewNimNode', 'NCopyNimNode', 'NCopyNimTree', 'StrToIdent', 'IdentToStr', 

-    'EqIdent', 'NHint', 'NWarning', 'NError'

+    'None', 'Defined', 'Low', 'High', 'SizeOf', 'Is', 
+    'Succ', 'Pred', 'Inc', 'Dec', 'Ord', 'New', 
+    'NewFinalize', 'NewSeq', 'RegisterFinalizer', 'LengthOpenArray', 'LengthStr', 'LengthArray', 
+    'LengthSeq', 'Incl', 'Excl', 'Card', 'Chr', 'GCref', 
+    'GCunref', 'AddI', 'SubI', 'MulI', 'DivI', 'ModI', 
+    'AddI64', 'SubI64', 'MulI64', 'DivI64', 'ModI64', 'ShrI', 
+    'ShlI', 'BitandI', 'BitorI', 'BitxorI', 'MinI', 'MaxI', 
+    'ShrI64', 'ShlI64', 'BitandI64', 'BitorI64', 'BitxorI64', 'MinI64', 
+    'MaxI64', 'AddF64', 'SubF64', 'MulF64', 'DivF64', 'MinF64', 
+    'MaxF64', 'AddU', 'SubU', 'MulU', 'DivU', 'ModU', 
+    'AddU64', 'SubU64', 'MulU64', 'DivU64', 'ModU64', 'EqI', 
+    'LeI', 'LtI', 'EqI64', 'LeI64', 'LtI64', 'EqF64', 
+    'LeF64', 'LtF64', 'LeU', 'LtU', 'LeU64', 'LtU64', 
+    'EqEnum', 'LeEnum', 'LtEnum', 'EqCh', 'LeCh', 'LtCh', 
+    'EqB', 'LeB', 'LtB', 'EqRef', 'EqProc', 'EqUntracedRef', 
+    'LePtr', 'LtPtr', 'EqCString', 'Xor', 'UnaryMinusI', 'UnaryMinusI64', 
+    'AbsI', 'AbsI64', 'Not', 'UnaryPlusI', 'BitnotI', 'UnaryPlusI64', 
+    'BitnotI64', 'UnaryPlusF64', 'UnaryMinusF64', 'AbsF64', 'Ze8ToI', 'Ze8ToI64', 
+    'Ze16ToI', 'Ze16ToI64', 'Ze32ToI64', 'ZeIToI64', 'ToU8', 'ToU16', 
+    'ToU32', 'ToFloat', 'ToBiggestFloat', 'ToInt', 'ToBiggestInt', 'CharToStr', 
+    'BoolToStr', 'IntToStr', 'Int64ToStr', 'FloatToStr', 'CStrToStr', 'StrToStr', 
+    'And', 'Or', 'EqStr', 'LeStr', 'LtStr', 'EqSet', 
+    'LeSet', 'LtSet', 'MulSet', 'PlusSet', 'MinusSet', 'SymDiffSet', 
+    'ConStrStr', 'ConArrArr', 'ConArrT', 'ConTArr', 'ConTT', 'Slice', 
+    'AppendStrCh', 'AppendStrStr', 'AppendSeqElem', 'AppendSeqSeq', 'InRange', 'InSet', 
+    'Asgn', 'Repr', 'Exit', 'SetLengthStr', 'SetLengthSeq', 'Assert', 
+    'Swap', 'IsNil', 'ArrToSeq', 'Array', 'OpenArray', 'Range', 
+    'Set', 'Seq', 'Int', 'Int8', 'Int16', 'Int32', 
+    'Int64', 'Float', 'Float32', 'Float64', 'Bool', 'Char', 
+    'String', 'Cstring', 'Pointer', 'AnyEnum', 'EmptySet', 'IntSetBaseType', 
+    'Nil', 'IsMainModule', 'CompileDate', 'CompileTime', 'NimrodVersion', 'NimrodMajor', 
+    'NimrodMinor', 'NimrodPatch', 'CpuEndian', 'NaN', 'Inf', 'NegInf', 
+    'NLen', 'NChild', 'NSetChild', 'NAdd', 'NAddMultiple', 'NDel', 
+    'NKind', 'NIntVal', 'NFloatVal', 'NSymbol', 'NIdent', 'NGetType', 
+    'NStrVal', 'NSetIntVal', 'NSetFloatVal', 'NSetSymbol', 'NSetIdent', 'NSetType', 
+    'NSetStrVal', 'NNewNimNode', 'NCopyNimNode', 'NCopyNimTree', 'StrToIdent', 'IdentToStr', 
+    'EqIdent', 'NHint', 'NWarning', 'NError'
     //[[[end]]]

   );

 

@@ -629,18 +630,29 @@ function leValue(a, b: PNode): Boolean; // a <= b? a, b are literals
 function ValueToString(a: PNode): string;

 

 // ------------- efficient integer sets -------------------------------------

+{@ignore}

+type

+  TBitScalar = int32; // FPC produces wrong code for ``int``

+{@emit

+type

+  TBitScalar = int; }

+

 const

-  IntsPerTrunk = 8;

   InitIntSetSize = 8; // must be a power of two!

-  BitsPerTrunk = IntsPerTrunk * sizeof(int) * 8;

-  BitsPerInt = sizeof(int) * 8;

+  TrunkShift = 9;

+  BitsPerTrunk = 1 shl TrunkShift; 

+    // needs to be a power of 2 and divisible by 64

+  TrunkMask = BitsPerTrunk-1;

+  IntsPerTrunk = BitsPerTrunk div (sizeof(TBitScalar)*8);

+  IntShift = 5+ord(sizeof(TBitScalar)=8); // 5 or 6, depending on int width

+  IntMask = 1 shl IntShift -1;

 

 type

   PTrunk = ^TTrunk;

   TTrunk = record

     next: PTrunk; // all nodes are connected with this pointer

     key: int;    // start address at bit 0

-    bits: array [0..IntsPerTrunk-1] of int; // a bit vector

+    bits: array [0..IntsPerTrunk-1] of TBitScalar; // a bit vector

   end;

   TTrunkSeq = array of PTrunk;

   TIntSet = record

@@ -661,45 +673,9 @@ const
 

 procedure registerID(id: PIdObj);

 

-// owner handling:

-function getCurrOwner(): PSym;

-procedure PushOwner(owner: PSym);

-procedure PopOwner;

-

 implementation

 

 var

-  gOwners: array of PSym; // owner stack (used for initializing the

-                          // owner field of syms)

-                          // the documentation comment always gets

-                          // assigned to the current owner

-                          // BUGFIX: global array is needed!

-{@emit gOwners := @[]; }

-

-function getCurrOwner(): PSym;

-begin

-  result := gOwners[high(gOwners)];

-end;

-

-procedure PushOwner(owner: PSym);

-var

-  len: int;

-begin

-  len := length(gOwners);

-  setLength(gOwners, len+1);

-  gOwners[len] := owner;

-end;

-

-procedure PopOwner;

-var

-  len: int;

-begin

-  len := length(gOwners);

-  if (len <= 0) then InternalError('popOwner');

-  setLength(gOwners, len - 1);

-end;

-

-var

   usedIds: TIntSet;

 

 procedure registerID(id: PIdObj);

@@ -1301,8 +1277,7 @@ begin
   result := nil

 end;

 

-procedure IntSetRawInsert(const t: TIntSet; var data: TTrunkSeq;

-                          desc: PTrunk);

+procedure IntSetRawInsert(const t: TIntSet; var data: TTrunkSeq; desc: PTrunk);

 var

   h: int;

 begin

@@ -1365,23 +1340,15 @@ end;
 

 // ---------- slightly higher level procs ----------------------------------

 

-function transform(key: int): int;

-begin

-  if key < 0 then result := 1000000000 + key // avoid negative numbers!

-  else result := key

-end;

-

 function IntSetContains(const s: TIntSet; key: int): bool;

 var

   u: int;

   t: PTrunk;

 begin

-  u := transform(key);

-  t := IntSetGet(s, u div BitsPerTrunk);

+  t := IntSetGet(s, key shr TrunkShift);

   if t <> nil then begin

-    u := u mod BitsPerTrunk;

-    result := (t.bits[u div BitsPerInt]

-      and (1 shl (u mod BitsPerInt))) <> 0

+    u := key and TrunkMask;

+    result := (t.bits[u shr IntShift] and (1 shl (u and IntMask))) <> 0

   end

   else

     result := false

@@ -1392,11 +1359,10 @@ var
   u: int;

   t: PTrunk;

 begin

-  u := transform(key);

-  t := IntSetPut(s, u div BitsPerTrunk);

-  u := u mod BitsPerTrunk;

-  t.bits[u div BitsPerInt] := t.bits[u div BitsPerInt]

-                            or (1 shl (u mod BitsPerInt));

+  t := IntSetPut(s, key shr TrunkShift);

+  u := key and TrunkMask;

+  t.bits[u shr IntShift] := t.bits[u shr IntShift]

+                            or (1 shl (u and IntMask));

 end;

 

 function IntSetContainsOrIncl(var s: TIntSet; key: int): bool;

@@ -1404,22 +1370,35 @@ var
   u: int;

   t: PTrunk;

 begin

-  u := transform(key);

-  t := IntSetGet(s, u div BitsPerTrunk);

+  t := IntSetGet(s, key shr TrunkShift);

   if t <> nil then begin

-    u := u mod BitsPerTrunk;

-    result := (t.bits[u div BitsPerInt]

-          and (1 shl (u mod BitsPerInt))) <> 0;

+    u := key and TrunkMask;

+    result := (t.bits[u shr IntShift] and (1 shl (u and IntMask))) <> 0;

     if not result then

-      t.bits[u div BitsPerInt] := t.bits[u div BitsPerInt]

-                                or (1 shl (u mod BitsPerInt));

+      t.bits[u shr IntShift] := t.bits[u shr IntShift]

+                                or (1 shl (u and IntMask));

   end

   else begin

     IntSetIncl(s, key);

     result := false

   end

 end;

-

+(*

+procedure IntSetDebug(const s: TIntSet);

+var

+  it: PTrunk;

+  i, j: int;

+begin

+  it := s.head;

+  while it <> nil do begin

+    for i := 0 to high(it.bits) do 

+      for j := 0 to BitsPerInt-1 do begin

+        if (it.bits[j] and (1 shl j)) <> 0 then

+          MessageOut('Contains key: ' + toString(it.key + i * BitsPerInt + j));

+      end;

+    it := it.next

+  end

+end;*)

 

 initialization

   if debugIDs then IntSetInit(usedIds);

diff --git a/nim/astalgo.pas b/nim/astalgo.pas
index ddd646efb..0e31f4ac7 100644
--- a/nim/astalgo.pas
+++ b/nim/astalgo.pas
@@ -274,11 +274,12 @@ begin
   res := '"' + '';
   for i := strStart to length(s)+strStart-1 do begin
     if (i-strStart+1) mod MaxLineLength = 0 then begin
-      res := res +{&} '"' +{&} nl;
+      addChar(res, '"');
+      add(res, nl);
       app(result, toRope(res));
       res := '"'+''; // reset
     end;
-    res := res +{&} toYamlChar(s[i]);
+    add(res, toYamlChar(s[i]));
   end;
   addChar(res, '"');
   app(result, toRope(res));
diff --git a/nim/ccgexprs.pas b/nim/ccgexprs.pas
index 97828680b..f94cff3a4 100644
--- a/nim/ccgexprs.pas
+++ b/nim/ccgexprs.pas
@@ -32,7 +32,7 @@ begin
 end;
 
 function genHexLiteral(v: PNode): PRope;
-// hex literals are unsigned in C (at least I think so)
+// hex literals are unsigned in C
 // so we don't generate hex literals any longer.
 begin
   if not (v.kind in [nkIntLit..nkInt64Lit]) then
@@ -58,7 +58,13 @@ begin
     nkCharLit..nkInt64Lit: begin
       case skipVarGenericRange(ty).kind of
         tyChar, tyInt64, tyNil: result := intLiteral(v.intVal);
-        tyInt..tyInt32: begin
+        tyInt8:  
+          result := ropef('((NI8) $1)', [intLiteral(biggestInt(int8(v.intVal)))]);
+        tyInt16: 
+          result := ropef('((NI16) $1)', [intLiteral(biggestInt(int16(v.intVal)))]);
+        tyInt32: 
+          result := ropef('((NI32) $1)', [intLiteral(biggestInt(int32(v.intVal)))]);
+        tyInt: begin
           if (v.intVal >= low(int32)) and (v.intVal <= high(int32)) then
             result := int32Literal(int32(v.intVal))
           else
@@ -436,8 +442,6 @@ begin
   InitLocExpr(p, e.sons[1], a);
   InitLocExpr(p, e.sons[2], b);
   appf(p.s[cpsStmts], frmt, [rdLoc(a), rdLoc(b)]);
-  freeTemp(p, a);
-  freeTemp(p, b)
 end;
 
 procedure unaryStmt(p: BProc; e: PNode; var d: TLoc;
@@ -449,7 +453,6 @@ begin
   if magic <> '' then useMagic(p.module, magic);
   InitLocExpr(p, e.sons[1], a);
   appf(p.s[cpsStmts], frmt, [rdLoc(a)]);
-  freeTemp(p, a);
 end;
 
 procedure binaryStmtChar(p: BProc; e: PNode; var d: TLoc;
@@ -462,8 +465,6 @@ begin
   InitLocExpr(p, e.sons[1], a);
   InitLocExpr(p, e.sons[2], b);
   appf(p.s[cpsStmts], frmt, [rdCharLoc(a), rdCharLoc(b)]);
-  freeTemp(p, a);
-  freeTemp(p, b)
 end;
 
 procedure binaryExpr(p: BProc; e: PNode; var d: TLoc;
@@ -476,12 +477,7 @@ begin
   assert(e.sons[2].typ <> nil);
   InitLocExpr(p, e.sons[1], a);
   InitLocExpr(p, e.sons[2], b);
-  putIntoDest(p, d, e.typ, 
-              ropef(frmt, [rdLoc(a), rdLoc(b), getTypeDesc(p.module, e.typ)]));
-  if d.k <> locExpr then begin // BACKPORT
-    freeTemp(p, a);
-    freeTemp(p, b)
-  end
+  putIntoDest(p, d, e.typ, ropef(frmt, [rdLoc(a), rdLoc(b)]));
 end;
 
 procedure binaryExprChar(p: BProc; e: PNode; var d: TLoc;
@@ -495,10 +491,6 @@ begin
   InitLocExpr(p, e.sons[1], a);
   InitLocExpr(p, e.sons[2], b);
   putIntoDest(p, d, e.typ, ropef(frmt, [rdCharLoc(a), rdCharLoc(b)]));
-  if d.k <> locExpr then begin // BACKPORT
-    freeTemp(p, a);
-    freeTemp(p, b)
-  end
 end;
 
 procedure unaryExpr(p: BProc; e: PNode; var d: TLoc;
@@ -508,10 +500,7 @@ var
 begin
   if magic <> '' then useMagic(p.module, magic);
   InitLocExpr(p, e.sons[1], a);
-  putIntoDest(p, d, e.typ, ropef(frmt, 
-             [rdLoc(a), getTypeDesc(p.module, e.typ)]));
-  if d.k <> locExpr then // BACKPORT
-    freeTemp(p, a)
+  putIntoDest(p, d, e.typ, ropef(frmt, [rdLoc(a)]));
 end;
 
 procedure unaryExprChar(p: BProc; e: PNode; var d: TLoc;
@@ -522,26 +511,90 @@ begin
   if magic <> '' then useMagic(p.module, magic);
   InitLocExpr(p, e.sons[1], a);
   putIntoDest(p, d, e.typ, ropef(frmt, [rdCharLoc(a)]));
-  if d.k <> locExpr then // BACKPORT
-    freeTemp(p, a)
 end;
 
+procedure binaryArithOverflow(p: BProc; e: PNode; var d: TLoc; m: TMagic);
 const
-  binOverflowTab: array [mAddi..mModi64] of string = (
+  prc: array [mAddi..mModi64] of string = (
     'addInt', 'subInt', 'mulInt', 'divInt', 'modInt',
     'addInt64', 'subInt64', 'mulInt64', 'divInt64', 'modInt64'
   );
-  binWoOverflowTab: array [mAddi..mModi64] of string = (
-    '($3)($1 + $2)', '($3)($1 - $2)', '($3)($1 * $2)', '($3)($1 / $2)', 
-    '($3)($1 % $2)',
-    '($1 + $2)', '($1 - $2)', '($1 * $2)', '($1 / $2)', '($1 % $2)'
+  opr: array [mAddi..mModi64] of string = (
+    '+'+'', '-'+'', '*'+'', '/'+'', '%'+'', 
+    '+'+'', '-'+'', '*'+'', '/'+'', '%'+''
+  );
+var
+  a, b: TLoc;
+  t: PType;
+begin
+  assert(e.sons[1].typ <> nil);
+  assert(e.sons[2].typ <> nil);
+  InitLocExpr(p, e.sons[1], a);
+  InitLocExpr(p, e.sons[2], b);
+  t := skipGenericRange(e.typ);
+  if getSize(t) >= platform.IntSize then begin
+    if optOverflowCheck in p.options then begin
+      useMagic(p.module, prc[m]);
+      putIntoDest(p, d, e.typ, ropef('$1($2, $3)', 
+                  [toRope(prc[m]), rdLoc(a), rdLoc(b)]));
+    end
+    else
+      putIntoDest(p, d, e.typ, ropef('(NI$4)($2 $1 $3)', 
+                  [toRope(opr[m]), rdLoc(a), rdLoc(b), toRope(getSize(t)*8)]));
+  end
+  else begin
+    if optOverflowCheck in p.options then begin
+      useMagic(p.module, 'raiseOverflow');
+      if (m = mModI) or (m = mDivI) then begin
+        useMagic(p.module, 'raiseDivByZero');
+        appf(p.s[cpsStmts], 'if (!$1) raiseDivByZero();$n', [rdLoc(b)]);       
+      end;
+      a.r := ropef('((NI)($2) $1 (NI)($3))', 
+                   [toRope(opr[m]), rdLoc(a), rdLoc(b)]);
+      if d.k = locNone then getTemp(p, getSysType(tyInt), d);
+      genAssignment(p, d, a, {@set}[]);
+      appf(p.s[cpsStmts], 'if ($1 < $2 || $1 > $3) raiseOverflow();$n',
+           [rdLoc(d), intLiteral(firstOrd(t)), intLiteral(lastOrd(t))]);
+      d.t := e.typ;
+      d.r := ropef('(NI$1)($2)', [toRope(getSize(t)*8), rdLoc(d)]);       
+    end
+    else 
+      putIntoDest(p, d, e.typ, ropef('(NI$4)($2 $1 $3)', 
+                  [toRope(opr[m]), rdLoc(a), rdLoc(b), toRope(getSize(t)*8)]));
+  end
+end;
+
+procedure unaryArithOverflow(p: BProc; e: PNode; var d: TLoc; m: TMagic);
+const
+  opr: array [mUnaryMinusI..mAbsI64] of string = (
+    '((NI$2)-($1))', // UnaryMinusI
+    '-($1)', // UnaryMinusI64
+    '(NI$2)abs($1)', // AbsI
+    '($1 > 0? ($1) : -($1))' // AbsI64
   );
+var
+  a: TLoc;
+  t: PType;
+begin
+  assert(e.sons[1].typ <> nil);
+  InitLocExpr(p, e.sons[1], a);
+  t := skipGenericRange(e.typ);
+  if optOverflowCheck in p.options then begin
+    useMagic(p.module, 'raiseOverflow');
+    appf(p.s[cpsStmts], 'if ($1 == $2) raiseOverflow();$n', 
+         [rdLoc(a), intLiteral(firstOrd(t))]);       
+  end;
+  putIntoDest(p, d, e.typ, ropef(opr[m], [rdLoc(a), toRope(getSize(t)*8)]));
+end;
+
+procedure binaryArith(p: BProc; e: PNode; var d: TLoc; op: TMagic);
+const
   binArithTab: array [mShrI..mXor] of string = (
-    '($3)((NU)($1) >> (NU)($2))', // ShrI
-    '($3)((NU)($1) << (NU)($2))', // ShlI
-    '($3)($1 & $2)', // BitandI
-    '($3)($1 | $2)', // BitorI
-    '($3)($1 ^ $2)', // BitxorI
+    '(NI$3)((NU$3)($1) >> (NU$3)($2))', // ShrI
+    '(NI$3)((NU$3)($1) << (NU$3)($2))', // ShlI
+    '(NI$3)($1 & $2)', // BitandI
+    '(NI$3)($1 | $2)', // BitorI
+    '(NI$3)($1 ^ $2)', // BitxorI
     '(($1 <= $2) ? $1 : $2)', // MinI
     '(($1 >= $2) ? $1 : $2)', // MaxI
     '(NI64)((NU64)($1) >> (NU64)($2))', // ShrI64
@@ -559,11 +612,11 @@ const
     '(($1 <= $2) ? $1 : $2)', // MinF64
     '(($1 >= $2) ? $1 : $2)', // MaxF64
 
-    '($3)((NU)($1) + (NU)($2))', // AddU
-    '($3)((NU)($1) - (NU)($2))', // SubU
-    '($3)((NU)($1) * (NU)($2))', // MulU
-    '($3)((NU)($1) / (NU)($2))', // DivU
-    '($3)((NU)($1) % (NU)($2))', // ModU
+    '(NI$3)((NU$3)($1) + (NU$3)($2))', // AddU
+    '(NI$3)((NU$3)($1) - (NU$3)($2))', // SubU
+    '(NI$3)((NU$3)($1) * (NU$3)($2))', // MulU
+    '(NI$3)((NU$3)($1) / (NU$3)($2))', // DivU
+    '(NI$3)((NU$3)($1) % (NU$3)($2))', // ModU
     '(NI64)((NU64)($1) + (NU64)($2))', // AddU64
     '(NI64)((NU64)($1) - (NU64)($2))', // SubU64
     '(NI64)((NU64)($1) * (NU64)($2))', // MulU64
@@ -580,8 +633,8 @@ const
     '($1 <= $2)', // LeF64
     '($1 < $2)', // LtF64
 
-    '((NU)($1) <= (NU)($2))', // LeU
-    '((NU)($1) < (NU)($2))',  // LtU
+    '((NU$3)($1) <= (NU$3)($2))', // LeU
+    '((NU$3)($1) < (NU$3)($2))',  // LtU
     '((NU64)($1) <= (NU64)($2))', // LeU64
     '((NU64)($1) < (NU64)($2))', // LtU64
 
@@ -604,16 +657,32 @@ const
 
     '($1 != $2)' // Xor
   );
+var
+  a, b: TLoc;
+  s: biggestInt;
+begin
+  assert(e.sons[1].typ <> nil);
+  assert(e.sons[2].typ <> nil);
+  InitLocExpr(p, e.sons[1], a);
+  InitLocExpr(p, e.sons[2], b);
+  // BUGFIX: cannot use result-type here, as it may be a boolean
+  s := max(getSize(a.t), getSize(b.t))*8;
+  putIntoDest(p, d, e.typ, ropef(binArithTab[op], 
+              [rdLoc(a), rdLoc(b), toRope(s)]));
+end;
+
+procedure unaryArith(p: BProc; e: PNode; var d: TLoc; op: TMagic);
+const
   unArithTab: array [mNot..mToBiggestInt] of string = (
     '!($1)',  // Not
     '$1',  // UnaryPlusI
-    '(($2) ~($1))',  // BitnotI
-    '+($1)',  // UnaryPlusI64
+    '(NI$2)((NU$2) ~($1))',  // BitnotI
+    '$1',  // UnaryPlusI64
     '~($1)',  // BitnotI64
-    '+($1)',  // UnaryPlusF64
+    '$1',  // UnaryPlusF64
     '-($1)',  // UnaryMinusF64
-    '($1 > 0? ($1) : -($1))',  // AbsF64; BUGFIX: fabs() makes problems for Tiny C, so we don't use it
-
+    '($1 > 0? ($1) : -($1))',  // AbsF64; BUGFIX: fabs() makes problems 
+                               // for Tiny C, so we don't use it
     '((NI)(NU)(NU8)($1))', // mZe8ToI
     '((NI64)(NU64)(NU8)($1))', // mZe8ToI64
     '((NI)(NU)(NU16)($1))', // mZe16ToI
@@ -630,70 +699,15 @@ const
     'float64ToInt32($1)', // ToInt XXX: this is not correct!
     'float64ToInt64($1)'  // ToBiggestInt
   );
-  unOverflowTab: array [mUnaryMinusI..mAbsI64] of string = (
-    'negInt', // UnaryMinusI
-    'negInt64', // UnaryMinusI64
-    'absInt', // AbsI
-    'absInt64'  // AbsI64
-  );
-  unWoOverflowTab: array [mUnaryMinusI..mAbsI64] of string = (
-    '(($2)-($1))', // UnaryMinusI
-    '-($1)', // UnaryMinusI64
-    '($2)abs($1)', // AbsI
-    '($1 > 0? ($1) : -($1))' // AbsI64
-  );
-
-procedure binaryArith(p: BProc; e: PNode; var d: TLoc; op: TMagic);
-begin
-  binaryExpr(p, e, d, '', binArithTab[op])
-end;
-
-procedure binaryArithOverflow(p: BProc; e: PNode; var d: TLoc; op: TMagic);
 var
-  a, b: TLoc;
-begin
-  if not (optOverflowCheck in p.options) then
-    binaryExpr(p, e, d, '', binWoOverflowTab[op])
-  else begin  
-    case op of
-      mAddi..mModi: begin
-        if (skipGeneric(e.typ).kind = tyInt) then
-          binaryExpr(p, e, d, binOverflowTab[op], 
-                     binOverflowTab[op] + '($1, $2)')
-        else begin
-          InitLocExpr(p, e.sons[1], a);
-          InitLocExpr(p, e.sons[2], b);
-          UseMagic(p.module, binOverflowTab[op]);
-          UseMagic(p.module, 'raiseOverflow');
-          a.r := ropef(binOverflowTab[op] + '($1, $2)',
-                      [rdLoc(a), rdLoc(b)]);
-          if d.k = locNone then getTemp(p, getSysType(tyInt), d);
-          genAssignment(p, d, a, {@set}[]);
-          appf(p.s[cpsStmts], 'if ($1 < $2 || $1 > $3) raiseOverflow();$n',
-               [rdLoc(d), intLiteral(firstOrd(e.typ)), 
-                          intLiteral(lastOrd(e.typ))]);
-          d.t := e.typ;
-          d.r := ropef('($1)($2)', [getTypeDesc(p.module, e.typ), rdLoc(d)]);
-        end
-      end;
-      mAddi64..mModi64: 
-        binaryExpr(p, e, d, binOverflowTab[op], binOverflowTab[op] + '($1, $2)');
-      else InternalError(e.info, 'binaryArithOverflow');
-    end
-  end
-end;
-
-procedure unaryArith(p: BProc; e: PNode; var d: TLoc; op: TMagic);
-begin
-  unaryExpr(p, e, d, '', unArithTab[op])
-end;
-
-procedure unaryArithOverflow(p: BProc; e: PNode; var d: TLoc; op: TMagic);
+  a: TLoc;
+  t: PType;
 begin
-  if optOverflowCheck in p.options then
-    unaryExpr(p, e, d, unOverflowTab[op], '($2)' + unOverflowTab[op] + '($1)')
-  else
-    unaryExpr(p, e, d, '', unWoOverflowTab[op])
+  assert(e.sons[1].typ <> nil);
+  InitLocExpr(p, e.sons[1], a);
+  t := skipGenericRange(e.typ);
+  putIntoDest(p, d, e.typ, ropef(unArithTab[op], 
+              [rdLoc(a), toRope(getSize(t)*8)]));
 end;
 
 procedure genDeref(p: BProc; e: PNode; var d: TLoc);
@@ -707,7 +721,7 @@ begin
     case skipGeneric(a.t).kind of
       tyRef: d.s := OnHeap;
       tyVar: d.s := OnUnknown;
-      tyPtr: d.s := OnStack;
+      tyPtr: d.s := OnUnknown; // BUGFIX!
       else InternalError(e.info, 'genDeref ' + typekindToStr[a.t.kind]);
     end;
     putIntoDest(p, d, a.t.sons[0], ropef('(*$1)', [rdLoc(a)]));
@@ -723,7 +737,6 @@ begin
   else begin
     InitLocExpr(p, e.sons[0], a);
     putIntoDest(p, d, e.typ, addrLoc(a));
-    if d.k <> locExpr then freeTemp(p, a)
   end
 end;
 
@@ -834,7 +847,7 @@ begin
   ty := skipPtrsGeneric(skipVarGenericRange(a.t));
   first := intLiteral(firstOrd(ty));
   // emit range check:
-  if (optBoundsCheck in p.options) then
+  if (optBoundsCheck in p.options) then begin
     if b.k <> locImmediate then begin // semantic pass has already checked:
       useMagic(p.module, 'raiseIndexError');
       if firstOrd(ty) = 0 then begin
@@ -848,11 +861,10 @@ begin
              'if ($1 < $2 || $1 > $3) raiseIndexError();$n',
              [rdCharLoc(b), first, intLiteral(lastOrd(ty))])
     end;
+  end;
   if d.k = locNone then d.s := a.s;
   putIntoDest(p, d, elemType(skipVarGeneric(ty)), ropef('$1[($2)-$3]',
     [rdLoc(a), rdCharLoc(b), first]));
-  // freeTemp(p, a); // backport
-  // freeTemp(p, b)
 end;
 
 procedure genCStringElem(p: BProc; e: PNode; var d: TLoc);
@@ -866,8 +878,6 @@ begin
   if d.k = locNone then d.s := a.s;
   putIntoDest(p, d, elemType(skipVarGeneric(ty)), ropef('$1[$2]',
     [rdLoc(a), rdCharLoc(b)]));
-  // freeTemp(p, a); // backport
-  // freeTemp(p, b)
 end;
 
 procedure genOpenArrayElem(p: BProc; e: PNode; var d: TLoc);
@@ -880,13 +890,12 @@ begin
   if (optBoundsCheck in p.options) then begin
     useMagic(p.module, 'raiseIndexError');
     appf(p.s[cpsStmts],
-      'if ((NU)($1) > (NU)($2Len0)) raiseIndexError();$n', [rdLoc(b), rdLoc(a)])
+      'if ((NU)($1) >= (NU)($2Len0)) raiseIndexError();$n', [rdLoc(b), rdLoc(a)])
+    // BUGFIX: ``>=`` and not ``>``!
   end;
   if d.k = locNone then d.s := a.s;
   putIntoDest(p, d, elemType(skipVarGeneric(a.t)), ropef('$1[$2]',
     [rdLoc(a), rdCharLoc(b)]));
-  // freeTemp(p, a); // backport
-  // freeTemp(p, b)
 end;
 
 procedure genSeqElem(p: BPRoc; e: PNode; var d: TLoc);
@@ -915,8 +924,6 @@ begin
     a.r := ropef('(*$1)', [a.r]);
   putIntoDest(p, d, elemType(skipVarGeneric(a.t)), ropef('$1->data[$2]',
     [rdLoc(a), rdCharLoc(b)]));
-  // freeTemp(p, a); // backport
-  // freeTemp(p, b)
 end;
 
 procedure genAndOr(p: BProc; e: PNode; var d: TLoc; m: TMagic);
@@ -955,10 +962,8 @@ begin
   fixLabel(p, L);
   if d.k = locNone then
     d := tmp
-  else begin
+  else
     genAssignment(p, d, tmp, {@set}[]); // no need for deep copying
-    freeTemp(p, tmp);
-  end
 end;
 
 procedure genIfExpr(p: BProc; n: PNode; var d: TLoc);
@@ -989,7 +994,6 @@ begin
         initLocExpr(p, it.sons[0], a);
         Lelse := getLabel(p);
         appf(p.s[cpsStmts], 'if (!$1) goto $2;$n', [rdLoc(a), Lelse]);
-        freeTemp(p, a);
         expr(p, it.sons[1], tmp);
         appf(p.s[cpsStmts], 'goto $1;$n', [Lend]);
         fixLabel(p, Lelse);
@@ -1003,10 +1007,8 @@ begin
   fixLabel(p, Lend);
   if d.k = locNone then
     d := tmp
-  else begin
+  else
     genAssignment(p, d, tmp, {@set}[]); // no need for deep copying
-    freeTemp(p, tmp);
-  end
 end;
 
 procedure genCall(p: BProc; t: PNode; var d: TLoc);
@@ -1111,14 +1113,10 @@ begin
   appf(p.s[cpsStmts], '$1 = rawNewString($2$3);$n',
     [tmp.r, lens, toRope(L)]);
   app(p.s[cpsStmts], appends);
-  for i := 0 to high(a) do
-    freeTemp(p, a[i]);
   if d.k = locNone then
     d := tmp
-  else begin
+  else 
     genAssignment(p, d, tmp, {@set}[]); // no need for deep copying
-    freeTemp(p, tmp); // BACKPORT
-  end
 end;
 
 procedure genStrAppend(p: BProc; e: PNode; var d: TLoc);
@@ -1170,8 +1168,6 @@ begin
   appf(p.s[cpsStmts], '$1 = resizeString($1, $2$3);$n',
     [rdLoc(a[0]), lens, toRope(L)]);
   app(p.s[cpsStmts], appends);
-  for i := 0 to high(a) do
-    freeTemp(p, a[i])
 end;
 
 procedure genSeqElemAppend(p: BProc; e: PNode; var d: TLoc);
@@ -1376,8 +1372,6 @@ begin
         [addrLoc(a), genTypeInfo(p.module, t)]))
     end
   end;
-  if d.k <> locExpr then
-    freeTemp(p, a);
 end;
 
 procedure genDollar(p: BProc; n: PNode; var d: TLoc; const magic, frmt: string);
@@ -1441,8 +1435,6 @@ begin
     '$1 = ($3) setLengthSeq(&($1)->Sup, sizeof($4), $2);$n',
     [rdLoc(a), rdLoc(b), getTypeDesc(p.module, t),
     getTypeDesc(p.module, t.sons[0])]);
-  freeTemp(p, a);
-  freeTemp(p, b)
 end;
 
 procedure genSetLengthStr(p: BProc; e: PNode; var d: TLoc);
@@ -1464,7 +1456,6 @@ begin
   genAssignment(p, tmp, a, {@set}[]);
   genAssignment(p, a, b, {@set}[]);
   genAssignment(p, b, tmp, {@set}[]);
-  freeTemp(p, tmp); // BACKPORT
 end;
 
 // -------------------- set operations ------------------------------------
@@ -1496,10 +1487,6 @@ procedure binaryExprIn(p: BProc; e: PNode; var a, b, d: TLoc;
                        const frmt: string);
 begin
   putIntoDest(p, d, e.typ, ropef(frmt, [rdLoc(a), rdSetElemLoc(b, a.t)]));
-  if d.k <> locExpr then begin
-    freeTemp(p, a);
-    freeTemp(p, b)
-  end
 end;
 
 procedure genInExprAux(p: BProc; e: PNode; var a, b, d: TLoc);
@@ -1521,8 +1508,6 @@ begin
   InitLocExpr(p, e.sons[1], a);
   InitLocExpr(p, e.sons[2], b);
   appf(p.s[cpsStmts], frmt, [rdLoc(a), rdSetElemLoc(b, a.t)]);
-  freeTemp(p, a);
-  freeTemp(p, b)
 end;
 
 procedure genInOp(p: BProc; e: PNode; var d: TLoc);
@@ -1557,10 +1542,6 @@ begin
     end;
     app(b.r, ')'+'');
     putIntoDest(p, d, e.typ, b.r);
-    if d.k <> locExpr then begin
-      for i := 0 to high(c) do freeTemp(p, c[i]);
-      freeTemp(p, a)
-    end
   end
   else begin
     assert(e.sons[1].typ <> nil);
@@ -1635,9 +1616,6 @@ begin
           if d.k = locNone then getTemp(p, a.t, d);
           appf(p.s[cpsStmts], lookupOpr[op], [rdLoc(i), toRope(size),
             rdLoc(d), rdLoc(a), rdLoc(b)]);
-          freeTemp(p, a);
-          freeTemp(p, b);
-          freeTemp(p, i)
         end;
         mEqSet:
           binaryExprChar(p, e, d, '',
@@ -1652,9 +1630,6 @@ begin
             'for ($1 = 0; $1 < $2; $1++) $n' +
             '  $3[$1] = $4[$1] $6 $5[$1];$n', [rdLoc(i), toRope(size),
             rdLoc(d), rdLoc(a), rdLoc(b), toRope(lookupOpr[op])]);
-          freeTemp(p, a);
-          freeTemp(p, b);
-          freeTemp(p, i)
         end;
         mInSet: genInOp(p, e, d);
         else internalError(e.info, 'genSetOp')
@@ -1686,7 +1661,6 @@ begin
   else
     putIntoDest(p, d, e.typ, ropef('(($1) ($2))',
       [getTypeDesc(p.module, e.typ), rdCharLoc(a)]));
-  if d.k <> locExpr then freeTemp(p, a)
 end;
 
 procedure genRangeChck(p: BProc; n: PNode; var d: TLoc; const magic: string);
@@ -1704,11 +1678,11 @@ begin
     InitLocExpr(p, n.sons[0], a);
     useMagic(p.module, magic);
     putIntoDest(p, d, dest,
-      ropef('(($1)' +{&} magic +{&} '($2, $3, $4))',
+      ropef('(($1)$5($2, $3, $4))',
         [getTypeDesc(p.module, dest),
          rdCharLoc(a), genLiteral(p, n.sons[1], dest),
-                       genLiteral(p, n.sons[2], dest)]));
-    if d.k <> locExpr then freeTemp(p, a)
+                       genLiteral(p, n.sons[2], dest),
+                       toRope(magic)]));
   end
 end;
 
@@ -1722,19 +1696,25 @@ var
   a: TLoc;
   dest: PType;
 begin
+  while n.sons[0].kind = nkPassAsOpenArray do
+    n.sons[0] := n.sons[0].sons[0]; // BUGFIX
   dest := skipVarGeneric(n.typ);
-  initLocExpr(p, n.sons[0], a);
-  case skipVarGeneric(a.t).kind of
-    tyOpenArray:
+  case skipVarGeneric(n.sons[0].typ).kind of
+    tyOpenArray: begin
+      initLocExpr(p, n.sons[0], a);
       putIntoDest(p, d, dest, ropef('$1, $1Len0', [rdLoc(a)]));
-    tyString, tySequence:
+    end;
+    tyString, tySequence: begin
+      initLocExpr(p, n.sons[0], a);
       putIntoDest(p, d, dest, ropef('$1->data, $1->Sup.len', [rdLoc(a)]));
-    tyArray, tyArrayConstr:
+    end;
+    tyArray, tyArrayConstr: begin
+      initLocExpr(p, n.sons[0], a);
       putIntoDest(p, d, dest, ropef('$1, $2',
         [rdLoc(a), toRope(lengthOrd(a.t))]));
+    end
     else InternalError(n.sons[0].info, 'passToOpenArray: ' + typeToString(a.t))
-  end;
-  if d.k <> locExpr then freeTemp(p, a)
+  end
 end;
 
 procedure convStrToCStr(p: BProc; n: PNode; var d: TLoc);
@@ -1743,7 +1723,6 @@ var
 begin
   initLocExpr(p, n.sons[0], a);
   putIntoDest(p, d, skipVarGeneric(n.typ), ropef('$1->data', [rdLoc(a)]));
-  if d.k <> locExpr then freeTemp(p, a)
 end;
 
 procedure convCStrToStr(p: BProc; n: PNode; var d: TLoc);
@@ -1754,7 +1733,6 @@ begin
   initLocExpr(p, n.sons[0], a);
   putIntoDest(p, d, skipVarGeneric(n.typ),
               ropef('cstrToNimstr($1)', [rdLoc(a)]));
-  if d.k <> locExpr then freeTemp(p, a)
 end;
 
 procedure genStrEquals(p: BProc; e: PNode; var d: TLoc);
@@ -1846,7 +1824,6 @@ begin
       InitLocExpr(p, e.sons[1], a);
       assert(a.t <> nil);
       expr(p, e.sons[2], a);
-      freeTemp(p, a)
     end;
     mSwap: genSwap(p, e, d);
     mPred: begin // XXX: range checking?
@@ -1978,15 +1955,11 @@ begin
             '$2[$1/8] |=(1<<($1%8));$n',
             [rdLoc(idx), rdLoc(d), rdSetElemLoc(a, e.typ),
              rdSetElemLoc(b, e.typ)]);
-          freeTemp(p, a);
-          freeTemp(p, b);
-          freeTemp(p, idx)
         end
         else begin
           initLocExpr(p, e.sons[i], a);
           appf(p.s[cpsStmts], '$1[$2/8] |=(1<<($2%8));$n',
                        [rdLoc(d), rdSetElemLoc(a, e.typ)]);
-          freeTemp(p, a)
         end
       end
     end
@@ -2003,9 +1976,6 @@ begin
             '$2 |=(1<<((' +{&} ts +{&} ')($1)%(sizeof(' +{&}ts+{&}')*8)));$n',
             [rdLoc(idx), rdLoc(d), rdSetElemLoc(a, e.typ),
              rdSetElemLoc(b, e.typ)]);
-          freeTemp(p, a);
-          freeTemp(p, b);
-          freeTemp(p, idx)
         end
         else begin
           initLocExpr(p, e.sons[i], a);
@@ -2013,7 +1983,6 @@ begin
                         '$1 |=(1<<((' +{&} ts +{&} ')($2)%(sizeof(' +{&}ts+{&}
                         ')*8)));$n',
                         [rdLoc(d), rdSetElemLoc(a, e.typ)]);
-          freeTemp(p, a)
         end
       end
     end
@@ -2191,7 +2160,8 @@ begin
     nkStrLit..nkTripleStrLit, nkIntLit..nkInt64Lit,
     nkFloatLit..nkFloat64Lit, nkNilLit, nkCharLit: begin
       putIntoDest(p, d, e.typ, genLiteral(p, e));
-      d.k := locImmediate // for removal of index checks
+      if d.k in [locNone, locExpr] then
+        d.k := locImmediate // for removal of index checks
     end;
     nkCall, nkHiddenCallConv, nkInfix, nkPrefix, nkPostfix, nkCommand: begin
       if (e.sons[0].kind = nkSym) and
diff --git a/nim/ccgstmts.pas b/nim/ccgstmts.pas
index b00751edd..0e93d6b0f 100644
--- a/nim/ccgstmts.pas
+++ b/nim/ccgstmts.pas
@@ -141,7 +141,6 @@ begin
         initLocExpr(p, it.sons[0], a);
         Lelse := getLabel(p);
         appf(p.s[cpsStmts], 'if (!$1) goto $2;$n', [rdLoc(a), Lelse]);
-        freeTemp(p, a);
         genStmts(p, it.sons[1]);
         if sonsLen(n) > 1 then
           appf(p.s[cpsStmts], 'goto $1;$n', [Lend]);
@@ -179,7 +178,6 @@ begin
     p.blocks[len].id := abs(p.blocks[len].id);
     appf(p.s[cpsStmts], 'if (!$1) goto $2;$n', [rdLoc(a), Labl]);
   end;
-  freeTemp(p, a);
   genStmts(p, t.sons[1]);
   if p.blocks[len].id > 0 then
     appf(p.s[cpsStmts], '} $1: ;$n', [Labl])
@@ -286,7 +284,6 @@ begin
     if gCmd <> cmdCompileToCpp then useMagic(p.module, 'raiseException');
     InitLocExpr(p, t.sons[0], a);
     e := rdLoc(a);
-    freeTemp(p, a);
     typ := t.sons[0].typ;
     while typ.kind in [tyVar, tyRef, tyPtr] do typ := typ.sons[0];
     appf(p.s[cpsStmts], getRaiseFrmt(p),
@@ -306,10 +303,11 @@ end;
 // ---------------- case statement generation -----------------------------
 
 const
-  stringCaseThreshold = 1000; //4; // above X strings a hash-switch for strings
-                          // is generated
-  // this version sets it too high to avoid hashing, because the hashing
-  // algorithm won't be the same; I don't know why
+  stringCaseThreshold = 100000; 
+  // above X strings a hash-switch for strings is generated
+  // this version sets it too high to avoid hashing, because this has not
+  // been tested for a long time
+  // XXX test and enable this optimization!
 
 procedure genCaseGenericBranch(p: BProc; b: PNode; const e: TLoc;
                                const rangeFormat, eqFormat: TFormatStr;
@@ -323,14 +321,11 @@ begin
     if b.sons[i].kind = nkRange then begin
       initLocExpr(p, b.sons[i].sons[0], x);
       initLocExpr(p, b.sons[i].sons[1], y);
-      freeTemp(p, x);
-      freeTemp(p, y);
       appf(p.s[cpsStmts], rangeFormat,
         [rdCharLoc(e), rdCharLoc(x), rdCharLoc(y), labl])
     end
     else begin
       initLocExpr(p, b.sons[i], x);
-      freeTemp(p, x);
       appf(p.s[cpsStmts], eqFormat,
         [rdCharLoc(e), rdCharLoc(x), labl])
     end
@@ -377,7 +372,6 @@ begin
   end;
   // second pass: generate statements
   genCaseSecondPass(p, t, labId);
-  freeTemp(p, a)
 end;
 
 {@ignore}
@@ -402,24 +396,24 @@ begin
     b := 0;
     for i := 0 to Length(s)-1 do begin
       b := b +{%} Ord(s[i]);
-      b := b +{%} b shl 10;
-      b := b xor (b shr 6)
+      b := b +{%} shlu(b, 10);
+      b := b xor shru(b, 6)
     end;
-    b := b +{%} b shl 3;
-    b := b xor (b shr 11);
-    b := b +{%} b shl 15;
+    b := b +{%} shlu(b, 3);
+    b := b xor shru(b, 11);
+    b := b +{%} shlu(b, 15);
     result := b
   end
   else begin
     a := 0;
     for i := 0 to Length(s)-1 do begin
       a := a +{%} int32(Ord(s[i]));
-      a := a +{%} a shl int32(10);
-      a := a xor (a shr int32(6));
+      a := a +{%} shlu(a, int32(10));
+      a := a xor shru(a, int32(6));
     end;
-    a := a +{%} a shl int32(3);
-    a := a xor (a shr int32(11));
-    a := a +{%} a shl int32(15);
+    a := a +{%} shlu(a, int32(3));
+    a := a xor shru(a, int32(11));
+    a := a +{%} shlu(a, int32(15));
     result := a
   end
 end;
@@ -448,7 +442,6 @@ begin
   for i := 0 to len - 2 do begin
     assert(b.sons[i].kind <> nkRange);
     initLocExpr(p, b.sons[i], x);
-    freeTemp(p, x);
     assert(b.sons[i].kind in [nkStrLit..nkTripleStrLit]);
     j := int(hashString(b.sons[i].strVal) and high(branches));
     appf(branches[j], 'if (eqStrings($1, $2)) goto $3;$n',
@@ -499,7 +492,6 @@ begin
       appf(p.s[cpsStmts], 'goto LA$1;$n', [toRope(p.labels)]);
     // third pass: generate statements
     genCaseSecondPass(p, t, labId);
-    freeTemp(p, a);
   end
   else
     genCaseGeneric(p, t, '', 'if (eqStrings($1, $2)) goto $3;$n')
@@ -541,7 +533,6 @@ begin
   if canGenerateSwitch then begin
     initLocExpr(p, t.sons[0], a);
     appf(p.s[cpsStmts], 'switch ($1) {$n', [rdCharLoc(a)]);
-    freeTemp(p, a);
     for i := 1 to sonsLen(t)-1 do begin
       if t.sons[i].kind = nkOfBranch then begin
         len := sonsLen(t.sons[i]);
@@ -823,7 +814,6 @@ begin
   InitLocExpr(p, e.sons[0], a);
   assert(a.t <> nil);
   expr(p, e.sons[1], a);
-  freeTemp(p, a)
 end;
 
 procedure genStmts(p: BProc; t: PNode);
@@ -852,13 +842,11 @@ begin
     nkCall: begin
       genLineDir(p, t);
       initLocExpr(p, t, a);
-      freeTemp(p, a);
     end;
     nkAsgn: genAsgn(p, t);
     nkDiscardStmt: begin
       genLineDir(p, t);
       initLocExpr(p, t.sons[0], a);
-      freeTemp(p, a)
     end;
     nkAsmStmt: genAsmStmt(p, t);
     nkTryStmt: begin
@@ -880,8 +868,11 @@ begin
         if (t.sons[codePos] <> nil)
         or (lfDynamicLib in prc.loc.flags) then begin // BUGFIX
           if IntSetContainsOrIncl(p.module.debugDeclared, prc.id) then begin
-            internalError(t.info, 'genProc()'); // XXX: remove this check!
+            internalError(t.info, 'genStmts(): ' + toString(prc.id)); 
+            // XXX: remove this check!
           end;
+          //if IntSetContains(p.module.debugDeclared, 2642) then 
+          //  InternalError(t.info, 'this sucks '  + toString(prc.id));
           genProc(p.module, prc)
         end
         //else if sfCompilerProc in prc.flags then genProcPrototype(prc);
diff --git a/nim/ccgtypes.pas b/nim/ccgtypes.pas
index 2c238ce84..5f4def667 100644
--- a/nim/ccgtypes.pas
+++ b/nim/ccgtypes.pas
@@ -33,7 +33,10 @@ begin
       'A'..'Z': addChar(result, chr(ord(name[i]) - ord('A') + ord('a')));
       '_': begin end;
       'a'..'z', '0'..'9': addChar(result, name[i]);
-      else result := result + 'HEX' +{&} toHex(ord(name[i]), 2);
+      else begin
+        add(result, 'HEX');
+        add(result, toHex(ord(name[i]), 2))
+      end
     end
   end
 end;
@@ -92,6 +95,7 @@ begin
           1: result := ctUInt8;
           2: result := ctUInt16;
           4: result := ctInt32;
+          8: result := ctInt64;
           else internalError('mapType');
         end
       end
@@ -284,8 +288,10 @@ begin
           1: result := typeNameOrLiteral(typ, 'NU8');
           2: result := typeNameOrLiteral(typ, 'NU16');
           4: result := typeNameOrLiteral(typ, 'NI32');
+          8: result := typeNameOrLiteral(typ, 'NI64');
           else begin
-            internalError('getSimpleTypeDesc()');
+            internalError(typ.sym.info,
+                          'getSimpleTypeDesc: ' + toString(getSize(typ)));
             result := nil
           end
         end
@@ -885,7 +891,7 @@ begin
         dataGen := true
       end;
       tyObject: begin
-        if sfPure in t.sym.flags then
+        if isPureObject(t) then
           id := getID()
         else begin
           id := t.id;
@@ -943,7 +949,7 @@ begin
             genEnumInfo(m, t, ropef('NTI$1', [toRope(t.id)]));
           end;
           tyObject: begin
-            if not (sfPure in t.sym.flags) then begin
+            if not isPureObject(t) then begin
               useMagic(m, 'TNimType');
               useMagic(m, 'TNimNode');
               genObjectInfo(m, t, ropef('NTI$1', [toRope(t.id)]));
diff --git a/nim/ccgutils.pas b/nim/ccgutils.pas
index 8e3775d22..05f2ea828 100644
--- a/nim/ccgutils.pas
+++ b/nim/ccgutils.pas
@@ -39,7 +39,7 @@ begin
   if key = nil then exit;
   case key.Kind of
     tyEmpty, tyChar, tyBool, tyNil, tyPointer, tyString, tyCString, 
-    tyInt..tyFloat128, tyProc, tyEnum, tyObject, tyAnyEnum: begin end;
+    tyInt..tyFloat128, tyProc, tyAnyEnum: begin end;
     tyNone, tyForward: 
       InternalError('GetUniqueType: ' + typeToString(key));
     tyGenericParam, tyGeneric, tySequence,
@@ -54,6 +54,13 @@ begin
       end;
       IdTablePut(gTypeTable, key, key);
     end;
+    tyObject, tyEnum: begin
+      result := PType(IdTableGet(gTypeTable, key));
+      if result = nil then begin
+        IdTablePut(gTypeTable, key, key);
+        result := key;
+      end
+    end;
     tyGenericInst: result := GetUniqueType(lastSon(key));
   end;
 end;
@@ -102,11 +109,14 @@ begin
   res := '"'+'';
   for i := strStart to length(s)+strStart-1 do begin
     if (i-strStart+1) mod MaxLineLength = 0 then begin
-      res := res +{&} '"' +{&} nl;
-      app(result, toRope(res));
-      res := '"'+''; // reset
+      add(res, '"');
+      add(res, nl);
+      app(result, toRope(res)); 
+      // reset:
+      setLength(res, 1);
+      res[strStart] := '"';
     end;
-    res := res +{&} toCChar(s[i]);
+    add(res, toCChar(s[i]));
   end;
   addChar(res, '"');
   app(result, toRope(res));
diff --git a/nim/cgen.pas b/nim/cgen.pas
index 2f89c4208..736d4b796 100644
--- a/nim/cgen.pas
+++ b/nim/cgen.pas
@@ -207,10 +207,6 @@ begin
   result.flags := {@set}[];
 end;
 
-procedure freeTemp(p: BProc; const temp: TLoc);
-begin
-end;
-
 // -------------------------- Variable manager ----------------------------
 
 procedure declareGlobalVar(m: BModule; s: PSym);
@@ -318,8 +314,8 @@ var
   tmp: PRope;
 begin
   assert(lib <> nil);
-  if lib.kind = libDynamic then begin
-    lib.kind := libDynamicGenerated;
+  if not lib.generated then begin
+    lib.generated := true;
     useMagic(m, 'nimLoadLibrary');
     useMagic(m, 'nimUnloadLibrary');
     useMagic(m, 'NimStringDesc');
diff --git a/nim/condsyms.pas b/nim/condsyms.pas
index c018a37ea..9c5d64d4b 100644
--- a/nim/condsyms.pas
+++ b/nim/condsyms.pas
@@ -102,6 +102,7 @@ begin
   case targetCPU of
     cpuI386: DefineSymbol('x86');
     cpuIa64: DefineSymbol('itanium');
+    cpuAmd64: DefineSymbol('x8664');
     else begin end
   end;
   case targetOS of
diff --git a/nim/crc.pas b/nim/crc.pas
index 429f0ec30..e14716605 100644
--- a/nim/crc.pas
+++ b/nim/crc.pas
@@ -126,7 +126,8 @@ const
 
 function updateCrc32(val: Byte; crc: TCrc32): TCrc32; overload;
 begin
-  result := crc32Table[(int(crc) xor (int(val) and $ff)) and $ff] xor (int(crc) shr 8);
+  result := TCrc32(crc32Table[(int(crc) xor (int(val) and $ff)) and $ff]) xor
+                  (crc shr TCrc32(8));
 end;
 
 function updateCrc32(val: Char; crc: TCrc32): TCrc32; overload;
diff --git a/nim/debugids.pas b/nim/debugids.pas
new file mode 100644
index 000000000..fff9ed10b
--- /dev/null
+++ b/nim/debugids.pas
@@ -0,0 +1,129 @@
+//
+//
+//           The Nimrod Compiler
+//        (c) Copyright 2008 Andreas Rumpf
+//
+//    See the file "copying.txt", included in this
+//    distribution, for details about the copyright.
+//
+unit debugids;
+
+interface
+
+{$include 'config.inc'}
+
+uses
+  nsystem, nos, strutils, ast;
+
+const
+  idfile = 'debugids.txt';
+
+// This module implements debugging facilities for the ID mechanism.
+procedure registerID(s: PSym);
+
+procedure writeIDTable();
+procedure loadIDTable();
+
+implementation
+
+type
+  TIdSymTuple = record{@tuple} // keep id from sym to better detect bugs
+    id: int;
+    s: PSym;
+  end;
+  TIdSymTupleSeq = array of TIdSymTuple;
+  TIdSymTable = record
+    counter: int;
+    data: TIdSymTupleSeq;
+  end;
+
+function TableRawGet(const t: TTable; key: PObject): int;
+var
+  h: THash;
+begin
+  h := hashNode(key) and high(t.data); // start with real hash value
+  while t.data[h].key <> nil do begin
+    if (t.data[h].key = key) then begin
+      result := h; exit
+    end;
+    h := nextTry(h, high(t.data))
+  end;
+  result := -1
+end;
+
+function TableSearch(const t: TTable; key, closure: PObject;
+                     comparator: TCmpProc): PObject;
+var
+  h: THash;
+begin
+  h := hashNode(key) and high(t.data); // start with real hash value
+  while t.data[h].key <> nil do begin
+    if (t.data[h].key = key) then
+      if comparator(t.data[h].val, closure) then begin // BUGFIX 1
+        result := t.data[h].val; exit
+      end;
+    h := nextTry(h, high(t.data))
+  end;
+  result := nil
+end;
+
+function TableGet(const t: TTable; key: PObject): PObject;
+var
+  index: int;
+begin
+  index := TableRawGet(t, key);
+  if index >= 0 then result := t.data[index].val
+  else result := nil
+end;
+
+procedure TableRawInsert(var data: TPairSeq; key, val: PObject);
+var
+  h: THash;
+begin
+  h := HashNode(key) and high(data);
+  while data[h].key <> nil do begin
+    assert(data[h].key <> key);
+    h := nextTry(h, high(data))
+  end;
+  assert(data[h].key = nil);
+  data[h].key := key;
+  data[h].val := val;
+end;
+
+procedure TableEnlarge(var t: TTable);
+var
+  n: TPairSeq;
+  i: int;
+begin
+{@ignore}
+  n := emptySeq;
+  setLength(n, length(t.data) * growthFactor);
+  fillChar(n[0], length(n)*sizeof(n[0]), 0);
+{@emit
+  newSeq(n, length(t.data) * growthFactor); }
+  for i := 0 to high(t.data) do
+    if t.data[i].key <> nil then
+      TableRawInsert(n, t.data[i].key, t.data[i].val);
+{@ignore}
+  t.data := n;
+{@emit
+  swap(t.data, n);
+}
+end;
+
+procedure TablePut(var t: TTable; key, val: PObject);
+var
+  index: int;
+begin
+  index := TableRawGet(t, key);
+  if index >= 0 then
+    t.data[index].val := val
+  else begin
+    if mustRehash(length(t.data), t.counter) then TableEnlarge(t);
+    TableRawInsert(t.data, key, val);
+    inc(t.counter)
+  end;
+end;
+
+
+end.
diff --git a/nim/depends.pas b/nim/depends.pas
new file mode 100644
index 000000000..d8b978142
--- /dev/null
+++ b/nim/depends.pas
@@ -0,0 +1,97 @@
+//
+//
+//           The Nimrod Compiler
+//        (c) Copyright 2008 Andreas Rumpf
+//
+//    See the file "copying.txt", included in this
+//    distribution, for details about the copyright.
+//
+unit depends;
+
+// This module implements a dependency file generator.
+
+interface
+
+{$include 'config.inc'}
+
+uses
+  nsystem, nos, options, ast, astalgo, msgs, ropes, idents, passes, importer;
+
+function genDependPass(): TPass;
+procedure generateDot(const project: string);
+
+implementation
+
+type
+  TGen = object(TPassContext)
+    module: PSym;
+    filename: string;
+  end;
+  PGen = ^TGen;
+
+var
+  gDotGraph: PRope; // the generated DOT file; we need a global variable
+
+procedure addDependencyAux(const importing, imported: string);
+begin
+  appf(gDotGraph, '$1 -> $2;$n', [toRope(importing),
+                                  toRope(imported)]);
+  //    s1 -> s2_4 [label="[0-9]"];
+end;
+
+function addDotDependency(c: PPassContext; n: PNode): PNode;
+var
+  i: int;
+  g: PGen;
+  imported: string;
+begin
+  result := n;
+  if n = nil then exit;
+  g := PGen(c);
+  case n.kind of
+    nkImportStmt: begin
+      for i := 0 to sonsLen(n)-1 do begin
+        imported := getFileTrunk(getModuleFile(n.sons[i]));
+        addDependencyAux(g.module.name.s, imported);
+      end
+    end;
+    nkFromStmt: begin
+      imported := getFileTrunk(getModuleFile(n.sons[0]));
+      addDependencyAux(g.module.name.s, imported);
+    end;
+    nkStmtList, nkBlockStmt, nkStmtListExpr, nkBlockExpr: begin
+      for i := 0 to sonsLen(n)-1 do {@discard} addDotDependency(c, n.sons[i]);
+    end
+    else begin end
+  end
+end;
+
+procedure generateDot(const project: string);
+begin
+  writeRope(
+    ropef('digraph $1 {$n$2}$n', [
+      toRope(changeFileExt(extractFileName(project), '')), gDotGraph]),
+    changeFileExt(project, 'dot') );
+end;
+
+function myOpen(module: PSym; const filename: string): PPassContext;
+var
+  g: PGen;
+begin
+  new(g);
+{@ignore}
+  fillChar(g^, sizeof(g^), 0);
+{@emit}
+  g.module := module;
+  g.filename := filename;
+  result := g;
+end;
+
+function gendependPass(): TPass;
+begin
+  initPass(result);
+  result.open := myOpen;
+  result.process := addDotDependency;
+end;
+
+end.
diff --git a/nim/docgen.pas b/nim/docgen.pas
index fd835db57..19dc93a91 100644
--- a/nim/docgen.pas
+++ b/nim/docgen.pas
@@ -209,10 +209,10 @@ end;
 procedure addXmlChar(var dest: string; c: Char);
 begin
   case c of
-    '&': dest := dest + '&amp;';
-    '<': dest := dest + '&lt;';
-    '>': dest := dest + '&gt;';
-    '"': dest := dest + '&quot;';
+    '&': add(dest, '&amp;');
+    '<': add(dest, '&lt;');
+    '>': add(dest, '&gt;');
+    '"': add(dest, '&quot;');
     else addChar(dest, c)
   end
 end;
@@ -292,8 +292,7 @@ var
   a, h: PRstNode;
 begin
   inc(d.id);
-  result := ropef('<em id="$1">$2</em>',
-                       [toRope(d.id), renderAux(d, n)]);
+  result := ropef('<em id="$1">$2</em>', [toRope(d.id), renderAux(d, n)]);
   h := newRstNode(rnHyperlink);
   a := newRstNode(rnLeaf, d.indexValFilename +{&} '#' +{&} toString(d.id));
   addSon(h, a);
@@ -709,8 +708,8 @@ begin
                             g.len+g.start-1+strStart));
         else
           appf(result, '<span class="$2">$1</span>',
-            [toRope(ncopy(m.text, g.start+strStart,
-                          g.len+g.start-1+strStart)),
+            [toRope(toXml(ncopy(m.text, g.start+strStart,
+                                g.len+g.start-1+strStart))),
              toRope(tokenClassToStr[g.kind])]);
       end;
     end;
diff --git a/nim/evals.pas b/nim/evals.pas
new file mode 100644
index 000000000..bb14f8be9
--- /dev/null
+++ b/nim/evals.pas
@@ -0,0 +1,1308 @@
+//
+//
+//           The Nimrod Compiler
+//        (c) Copyright 2008 Andreas Rumpf
+//
+//    See the file "copying.txt", included in this
+//    distribution, for details about the copyright.
+//
+unit evals;
+
+// This file implements the evaluator for Nimrod code.
+// The evaluator is very slow, but simple. Since this
+// is used mainly for evaluating macros and some other
+// stuff at compile time, performance is not that
+// important.
+
+interface
+
+{$include 'config.inc'}
+
+uses
+  sysutils, nsystem, charsets, strutils, magicsys,
+  lists, options, ast, astalgo, trees, treetab, nimsets,
+  msgs, nos, condsyms, idents, rnimsyn, types, passes, semfold;
+
+type
+  PStackFrame = ^TStackFrame;
+  TStackFrame = record
+    mapping: TIdNodeTable; // mapping from symbols to nodes
+    prc: PSym;        // current prc; proc that is evaluated
+    call: PNode;    // current for stmt
+    next: PStackFrame;   // for stacking
+    params: TNodeSeq;  // parameters passed to the proc
+  end;
+  
+  TEvalContext = object(passes.TPassContext)
+    module: PSym;
+    tos: PStackFrame; // top of a tos tos
+    lastException: PNode;
+  end;
+  PEvalContext = ^TEvalContext;
+
+function newStackFrame(): PStackFrame;
+procedure pushStackFrame(c: PEvalContext; t: PStackFrame);
+procedure popStackFrame(c: PEvalContext);
+
+function newEvalContext(module: PSym; const filename: string): PEvalContext;
+
+function eval(c: PEvalContext; n: PNode): PNode; 
+// eval never returns nil! This simplifies the code a lot and
+// makes it faster too.
+
+function evalPass(): TPass;
+
+implementation
+
+const
+  evalMaxIterations = 10000000; // max iterations of all loops
+  evalMaxRecDepth = 100000;     // max recursion depth for evaluation
+
+var
+  emptyNode: PNode;
+
+function newStackFrame(): PStackFrame;
+begin
+  new(result);
+{@ignore}
+  fillChar(result^, sizeof(result^), 0);
+{@emit}
+  initIdNodeTable(result.mapping);
+{@emit result.params := @[];}
+end;
+
+function newEvalContext(module: PSym; const filename: string): PEvalContext;
+begin
+  new(result);
+{@ignore}
+  fillChar(result^, sizeof(result^), 0);
+{@emit}
+  result.module := module;
+end;
+
+procedure pushStackFrame(c: PEvalContext; t: PStackFrame);
+begin
+  t.next := c.tos;
+  c.tos := t;
+end;
+
+procedure popStackFrame(c: PEvalContext);
+begin
+  if (c.tos = nil) then InternalError('popStackFrame');
+  c.tos := c.tos.next;
+end;
+
+function evalAux(c: PEvalContext; n: PNode): PNode; forward;
+
+procedure stackTraceAux(x: PStackFrame);
+begin
+  if x <> nil then begin
+    stackTraceAux(x.next);
+    messageOut(format('file: $1, line: $2', [toFilename(x.call.info),
+                    toString(toLineNumber(x.call.info))]));
+  end
+end;
+
+procedure stackTrace(c: PEvalContext; n: PNode; msg: TMsgKind;
+                     const arg: string = '');
+begin
+  messageOut('stack trace: (most recent call last)');
+  stackTraceAux(c.tos);
+  liMessage(n.info, msg, arg);
+end;
+
+function evalIf(c: PEvalContext; n: PNode): PNode;
+var
+  i, len: int;
+begin
+  i := 0;
+  len := sonsLen(n);
+  while (i < len) and (sonsLen(n.sons[i]) >= 2) do begin
+    result := evalAux(c, n.sons[i].sons[0]);
+    if result.kind = nkExceptBranch then exit;
+    if (result.kind = nkIntLit) and (result.intVal <> 0) then begin
+      result := evalAux(c, n.sons[i].sons[1]);
+      exit
+    end;
+    inc(i)
+  end;
+  if (i < len) and (sonsLen(n.sons[i]) < 2) then // eval else-part
+    result := evalAux(c, n.sons[0])
+  else
+    result := emptyNode
+end;
+
+function evalCase(c: PEvalContext; n: PNode): PNode;
+var
+  i, j: int;
+  res: PNode;
+begin
+  result := evalAux(c, n.sons[0]);
+  if result.kind = nkExceptBranch then exit;
+  res := result;
+  result := emptyNode;
+  for i := 1 to sonsLen(n)-1 do begin
+    if n.sons[i].kind = nkOfBranch then begin
+      for j := 0 to sonsLen(n.sons[i])-2 do begin
+        if overlap(res, n.sons[i].sons[j]) then begin
+          result := evalAux(c, lastSon(n.sons[i]));
+          exit
+        end
+      end
+    end
+    else begin
+      result := evalAux(c, lastSon(n.sons[i]));
+    end
+  end;
+end;
+
+var
+  gWhileCounter: int;  // Use a counter to prevend endless loops!
+                       // We make this counter global, because otherwise
+                       // nested loops could make the compiler extremely slow.
+  gNestedEvals: int;   // count the recursive calls to ``evalAux`` to prevent
+                       // endless recursion
+
+function evalWhile(c: PEvalContext; n: PNode): PNode;
+begin
+  while true do begin
+    result := evalAux(c, n.sons[0]);
+    if result.kind = nkExceptBranch then exit;
+    if getOrdValue(result) = 0 then break;
+    result := evalAux(c, n.sons[1]);
+    case result.kind of
+      nkBreakStmt: begin
+        if result.sons[0] = nil then begin
+          result := emptyNode; // consume ``break`` token
+          break
+        end
+      end;
+      nkExceptBranch, nkReturnToken: break;
+      else begin end
+    end;
+    dec(gWhileCounter);
+    if gWhileCounter <= 0 then begin
+      stackTrace(c, n, errTooManyIterations);
+      break;
+    end
+  end
+end;
+
+function evalBlock(c: PEvalContext; n: PNode): PNode;
+begin
+  result := evalAux(c, n.sons[1]);
+  if result.kind = nkBreakStmt then begin
+    if result.sons[0] <> nil then begin
+      assert(result.sons[0].kind = nkSym);
+      if n.sons[0] <> nil then begin
+        assert(n.sons[0].kind = nkSym);
+        if result.sons[0].sym.id = n.sons[0].sym.id then
+          result := emptyNode
+      end
+    end
+    else
+      result := emptyNode // consume ``break`` token
+  end
+end;
+
+function evalFinally(c: PEvalContext; n, exc: PNode): PNode;
+var
+  finallyNode: PNode;
+begin
+  finallyNode := lastSon(n);
+  if finallyNode.kind = nkFinally then begin
+    result := evalAux(c, finallyNode);
+    if result.kind <> nkExceptBranch then
+      result := exc
+  end
+  else
+    result := exc
+end;
+
+function evalTry(c: PEvalContext; n: PNode): PNode;
+var
+  exc: PNode;
+  i, j, len, blen: int;
+begin
+  result := evalAux(c, n.sons[0]);
+  case result.kind of
+    nkBreakStmt, nkReturnToken: begin end;
+    nkExceptBranch: begin
+      // exception token!
+      exc := result;
+      i := 1;
+      len := sonsLen(n);
+      while (i < len) and (n.sons[i].kind = nkExceptBranch) do begin
+        blen := sonsLen(n.sons[i]);
+        if blen = 1 then begin
+          // general except section:
+          result := evalAux(c, n.sons[i].sons[0]);
+          exc := result;
+          break
+        end
+        else begin
+          for j := 0 to blen-2 do begin
+            assert(n.sons[i].sons[j].kind = nkType);
+            if exc.typ.id = n.sons[i].sons[j].typ.id then begin
+              result := evalAux(c, n.sons[i].sons[blen-1]);
+              exc := result;
+              break
+            end
+          end
+        end;
+        inc(i);
+      end;
+      result := evalFinally(c, n, exc);
+    end;
+    else
+      result := evalFinally(c, n, emptyNode);
+  end
+end;
+
+function getNullValue(typ: PType; const info: TLineInfo): PNode;
+var
+  i: int;
+  t: PType;
+begin
+  t := skipGenericRange(typ);
+  result := emptyNode;
+  case t.kind of
+    tyBool, tyChar, tyInt..tyInt64: result := newNodeIT(nkIntLit, info, t);
+    tyFloat..tyFloat128: result := newNodeIt(nkFloatLit, info, t);
+    tyVar, tyPointer, tyPtr, tyRef, tyCString, tySequence, tyString:
+      result := newNodeIT(nkNilLit, info, t);
+    tyObject: begin
+      result := newNodeIT(nkPar, info, t);
+      internalError(info, 'init to implement');
+    end;
+    tyArray, tyArrayConstr: begin
+      result := newNodeIT(nkBracket, info, t);
+      for i := 0 to int(lengthOrd(t))-1 do
+        addSon(result, getNullValue(elemType(t), info));
+    end;
+    tyTuple: begin
+      result := newNodeIT(nkPar, info, t);
+      for i := 0 to sonsLen(t)-1 do
+        addSon(result, getNullValue(t.sons[i], info));
+    end;
+    else InternalError('getNullValue')
+  end
+end;
+
+function evalVar(c: PEvalContext; n: PNode): PNode;
+var
+  i: int;
+  v: PSym;
+  a: PNode;
+begin
+  for i := 0 to sonsLen(n)-1 do begin
+    a := n.sons[i];
+    if a.kind = nkCommentStmt then continue;
+    assert(a.kind = nkIdentDefs);
+    assert(a.sons[0].kind = nkSym);
+    v := a.sons[0].sym;
+    if a.sons[2] <> nil then begin
+      result := evalAux(c, a.sons[2]);
+      if result.kind = nkExceptBranch then exit;
+    end
+    else
+      result := getNullValue(a.sons[0].typ, a.sons[0].info);
+    IdNodeTablePut(c.tos.mapping, v, result);
+  end;
+  result := emptyNode;
+end;
+
+function evalCall(c: PEvalContext; n: PNode): PNode;
+var
+  d: PStackFrame;
+  prc: PNode;
+  i: int;
+begin
+  result := evalAux(c, n.sons[0]);
+  if result.kind = nkExceptBranch then exit;
+  prc := result;
+  // bind the actual params to the local parameter
+  // of a new binding
+  d := newStackFrame();
+  d.call := n;
+  if prc.kind = nkSym then begin
+    d.prc := prc.sym;
+    if not (prc.sym.kind in [skProc, skConverter]) then
+      InternalError(n.info, 'evalCall');
+  end;
+  setLength(d.params, sonsLen(n));
+  for i := 1 to sonsLen(n)-1 do begin
+    result := evalAux(c, n.sons[i]);
+    if result.kind = nkExceptBranch then exit;
+    d.params[i] := result;
+  end;
+  if n.typ <> nil then d.params[0] := getNullValue(n.typ, n.info);
+  pushStackFrame(c, d);
+  result := evalAux(c, prc);
+  if n.typ <> nil then result := d.params[0];
+  popStackFrame(c);
+end;
+
+function evalVariable(c: PStackFrame; sym: PSym): PNode;
+// We need to return a node to the actual value,
+// which can be modified.
+var
+  x: PStackFrame;
+begin
+  x := c;
+  while x <> nil do begin
+    if sfResult in sym.flags then begin
+      result := x.params[0];
+      exit
+    end;
+    result := IdNodeTableGet(x.mapping, sym);
+    if result <> nil then exit;
+    x := x.next
+  end;
+  result := emptyNode;
+end;
+
+function evalArrayAccess(c: PEvalContext; n: PNode): PNode;
+var
+  x: PNode;
+  idx: biggestInt;
+begin
+  result := evalAux(c, n.sons[0]);
+  if result.kind = nkExceptBranch then exit;
+  x := result;
+  result := evalAux(c, n.sons[1]);
+  if result.kind = nkExceptBranch then exit;
+  idx := getOrdValue(result);
+  result := emptyNode;
+  case x.kind of
+    nkBracket, nkPar, nkMetaNode: begin
+      if (idx >= 0) and (idx < sonsLen(x)) then
+        result := x.sons[int(idx)]
+      else
+        stackTrace(c, n, errIndexOutOfBounds);
+    end;
+    nkStrLit..nkTripleStrLit: begin
+      result := newNodeIT(nkCharLit, x.info, getSysType(tyChar));
+      if (idx >= 0) and (idx < length(x.strVal)) then
+        result.intVal := ord(x.strVal[int(idx)+strStart])
+      else if idx = length(x.strVal) then begin end
+      else
+        stackTrace(c, n, errIndexOutOfBounds);
+    end;
+    else
+      stackTrace(c, n, errIndexNoIntType);
+  end
+end;
+
+function evalFieldAccess(c: PEvalContext; n: PNode): PNode;
+// a real field access; proc calls have already been
+// transformed
+// XXX: field checks!
+var
+  x: PNode;
+  field: PSym;
+  i: int;
+begin
+  result := evalAux(c, n.sons[0]);
+  if result.kind = nkExceptBranch then exit;
+  x := result;
+  if x.kind <> nkPar then InternalError(n.info, 'evalFieldAccess');
+  field := n.sons[1].sym;
+  for i := 0 to sonsLen(n)-1 do begin
+    if x.sons[i].kind <> nkExprColonExpr then
+      InternalError(n.info, 'evalFieldAccess');
+    if x.sons[i].sons[0].sym.name.id = field.id then begin
+      result := x.sons[i].sons[1]; exit
+    end
+  end;
+  stackTrace(c, n, errFieldXNotFound, field.name.s);
+  result := emptyNode;
+end;
+
+function evalAsgn(c: PEvalContext; n: PNode): PNode;
+var
+  x: PNode;
+  i: int;
+begin
+  result := evalAux(c, n.sons[0]);
+  if result.kind = nkExceptBranch then exit;
+  x := result;
+  result := evalAux(c, n.sons[1]);
+  if result.kind = nkExceptBranch then exit;
+  x.kind := result.kind;
+  x.typ := result.typ;
+  case x.kind of
+    nkCharLit..nkInt64Lit: x.intVal := result.intVal;
+    nkFloatLit..nkFloat64Lit: x.floatVal := result.floatVal;
+    nkStrLit..nkTripleStrLit: begin
+      x.strVal := result.strVal;
+    end
+    else begin
+      if not (x.kind in [nkEmpty..nkNilLit]) then begin
+        discardSons(x);
+        for i := 0 to sonsLen(result)-1 do addSon(x, result.sons[i]);
+      end
+    end
+  end;
+  result := emptyNode
+end;
+
+function evalSwap(c: PEvalContext; n: PNode): PNode;
+var
+  x: PNode;
+  i: int;
+  tmpi: biggestInt;
+  tmpf: biggestFloat;
+  tmps: string;
+  tmpn: PNode;
+begin
+  result := evalAux(c, n.sons[0]);
+  if result.kind = nkExceptBranch then exit;
+  x := result;
+  result := evalAux(c, n.sons[1]);
+  if result.kind = nkExceptBranch then exit;
+  if (x.kind <> result.kind) then
+    stackTrace(c, n, errCannotInterpretNodeX, nodeKindToStr[n.kind])
+  else begin
+    case x.kind of
+      nkCharLit..nkInt64Lit: begin
+        tmpi := x.intVal;
+        x.intVal := result.intVal;
+        result.intVal := tmpi
+      end;
+      nkFloatLit..nkFloat64Lit: begin
+        tmpf := x.floatVal;
+        x.floatVal := result.floatVal;
+        result.floatVal := tmpf;
+      end;
+      nkStrLit..nkTripleStrLit: begin
+        tmps := x.strVal;
+        x.strVal := result.strVal;
+        result.strVal := tmps;
+      end
+      else begin
+        tmpn := copyTree(x);
+        discardSons(x);
+        for i := 0 to sonsLen(result)-1 do
+          addSon(x, result.sons[i]);
+        discardSons(result);
+        for i := 0 to sonsLen(tmpn)-1 do
+          addSon(result, tmpn.sons[i]);
+      end
+    end
+  end;
+  result := emptyNode
+end;
+
+function evalSym(c: PEvalContext; n: PNode): PNode;
+begin
+  case n.sym.kind of
+    skProc, skConverter, skMacro: result := n.sym.ast.sons[codePos];
+    skVar, skForVar, skTemp: result := evalVariable(c.tos, n.sym);
+    skParam: result := c.tos.params[n.sym.position+1];
+    skConst: result := n.sym.ast;
+    else begin
+      stackTrace(c, n, errCannotInterpretNodeX, symKindToStr[n.sym.kind]);
+      result := emptyNode
+    end
+  end;
+  if result = nil then InternalError(n.info, 'evalSym: ' + n.sym.name.s);
+end;
+
+function evalIncDec(c: PEvalContext; n: PNode; sign: biggestInt): PNode;
+var
+  a, b: PNode;
+begin
+  result := evalAux(c, n.sons[1]);
+  if result.kind = nkExceptBranch then exit;
+  a := result;
+  result := evalAux(c, n.sons[2]);
+  if result.kind = nkExceptBranch then exit;
+  b := result;
+  case a.kind of
+    nkCharLit..nkInt64Lit: a.intval := a.intVal + sign * getOrdValue(b);
+    else internalError(n.info, 'evalIncDec');
+  end;
+  result := emptyNode
+end;
+
+function evalExit(c: PEvalContext; n: PNode): PNode;
+begin
+  result := evalAux(c, n.sons[1]);
+  if result.kind = nkExceptBranch then exit;
+  liMessage(n.info, hintQuitCalled);
+  halt(int(getOrdValue(result)));
+end;
+
+function evalOr(c: PEvalContext; n: PNode): PNode;
+begin
+  result := evalAux(c, n.sons[1]);
+  if result.kind = nkExceptBranch then exit;
+  if result.kind <> nkIntLit then InternalError(n.info, 'evalOr');
+  if result.intVal = 0 then result := evalAux(c, n.sons[2])
+end;
+
+function evalAnd(c: PEvalContext; n: PNode): PNode;
+begin
+  result := evalAux(c, n.sons[1]);
+  if result.kind = nkExceptBranch then exit;
+  if result.kind <> nkIntLit then InternalError(n.info, 'evalAnd');
+  if result.intVal <> 0 then result := evalAux(c, n.sons[2])
+end;
+
+function evalNew(c: PEvalContext; n: PNode): PNode;
+var
+  t: PType;
+begin
+  t := skipVarGeneric(n.sons[1].typ);
+  result := newNodeIT(nkRefTy, n.info, t);
+  addSon(result, getNullValue(t.sons[0], n.info));
+end;
+
+function evalDeref(c: PEvalContext; n: PNode): PNode;
+begin
+  result := evalAux(c, n.sons[0]);
+  if result.kind = nkExceptBranch then exit;
+  if result.kind <> nkRefTy then InternalError(n.info, 'evalDeref');
+  result := result.sons[0];
+end;
+
+function evalAddr(c: PEvalContext; n: PNode): PNode;
+var
+  a: PNode;
+  t: PType;
+begin
+  result := evalAux(c, n.sons[0]);
+  if result.kind = nkExceptBranch then exit;
+  if result.kind <> nkRefTy then InternalError(n.info, 'evalDeref');
+  a := result;
+  t := newType(tyPtr, c.module);
+  addSon(t, a.typ);
+  result := newNodeIT(nkRefTy, n.info, t);
+  addSon(result, a);
+end;
+
+function evalConv(c: PEvalContext; n: PNode): PNode;
+begin
+  // hm, I cannot think of any conversions that need to be handled here...
+  result := evalAux(c, n.sons[1]);
+  result.typ := n.typ;
+end;
+
+function evalCheckedFieldAccess(c: PEvalContext; n: PNode): PNode;
+begin
+  result := evalAux(c, n.sons[0]);
+end;
+
+function evalUpConv(c: PEvalContext; n: PNode): PNode;
+var
+  dest, src: PType;
+begin
+  result := evalAux(c, n.sons[0]);
+  if result.kind = nkExceptBranch then exit;
+  dest := skipPtrsGeneric(n.typ);
+  src := skipPtrsGeneric(result.typ);
+  if inheritanceDiff(src, dest) > 0 then
+    stackTrace(c, n, errInvalidConversionFromTypeX, typeToString(src));
+end;
+
+function evalRangeChck(c: PEvalContext; n: PNode): PNode;
+var
+  x, a, b: PNode;
+begin
+  result := evalAux(c, n.sons[0]);
+  if result.kind = nkExceptBranch then exit;
+  x := result;
+  result := evalAux(c, n.sons[1]);
+  if result.kind = nkExceptBranch then exit;
+  a := result;
+  result := evalAux(c, n.sons[2]);
+  if result.kind = nkExceptBranch then exit;
+  b := result;
+
+  if leValueConv(a, x) and leValueConv(x, b) then begin
+    result := x; // a <= x and x <= b
+    result.typ := n.typ
+  end
+  else
+    stackTrace(c, n, errGenerated,
+      format(msgKindToString(errIllegalConvFromXtoY),
+        [typeToString(n.sons[0].typ), typeToString(n.typ)]));
+end;
+
+function evalConvStrToCStr(c: PEvalContext; n: PNode): PNode;
+begin
+  result := evalAux(c, n.sons[0]);
+  if result.kind = nkExceptBranch then exit;
+  result.typ := n.typ;
+end;
+
+function evalConvCStrToStr(c: PEvalContext; n: PNode): PNode;
+begin
+  result := evalAux(c, n.sons[0]);
+  if result.kind = nkExceptBranch then exit;
+  result.typ := n.typ;
+end;
+
+function evalRaise(c: PEvalContext; n: PNode): PNode;
+var
+  a: PNode;
+begin
+  if n.sons[0] <> nil then begin
+    result := evalAux(c, n.sons[0]);
+    if result.kind = nkExceptBranch then exit;
+    a := result;
+    result := newNodeIT(nkExceptBranch, n.info, a.typ);
+    addSon(result, a);
+    c.lastException := result;
+  end
+  else if c.lastException <> nil then
+    result := c.lastException
+  else begin
+    stackTrace(c, n, errExceptionAlreadyHandled);
+    result := newNodeIT(nkExceptBranch, n.info, nil);
+    addSon(result, nil);
+  end
+end;
+
+function evalReturn(c: PEvalContext; n: PNode): PNode;
+begin
+  if n.sons[0] <> nil then begin
+    result := evalAsgn(c, n.sons[0]);
+    if result.kind = nkExceptBranch then exit;
+  end;
+  result := newNodeIT(nkReturnToken, n.info, nil);
+end;
+
+function evalProc(c: PEvalContext; n: PNode): PNode;
+var
+  v: PSym;
+begin
+  if n.sons[genericParamsPos] = nil then begin
+    if (resultPos < sonsLen(n)) and (n.sons[resultPos] <> nil) then begin
+      v := n.sons[resultPos].sym;
+      result := getNullValue(v.typ, n.info);
+      IdNodeTablePut(c.tos.mapping, v, result);
+    end;
+    result := evalAux(c, n.sons[codePos]);
+    if result.kind = nkReturnToken then
+      result := IdNodeTableGet(c.tos.mapping, v);
+  end
+  else
+    result := emptyNode
+end;
+
+function evalHigh(c: PEvalContext; n: PNode): PNode;
+begin
+  result := evalAux(c, n.sons[1]);
+  if result.kind = nkExceptBranch then exit;
+  case skipVarGeneric(n.sons[1].typ).kind of
+    tyOpenArray, tySequence:
+      result := newIntNodeT(sonsLen(result), n);
+    tyString:
+      result := newIntNodeT(length(result.strVal)-1, n);
+    else InternalError(n.info, 'evalHigh')
+  end
+end;
+
+function evalIs(c: PEvalContext; n: PNode): PNode;
+begin
+  result := evalAux(c, n.sons[1]);
+  if result.kind = nkExceptBranch then exit;
+  result := newIntNodeT(ord(inheritanceDiff(result.typ, n.sons[2].typ) >= 0), n)
+end;
+
+function evalSetLengthStr(c: PEvalContext; n: PNode): PNode;
+var
+  a, b: PNode;
+begin
+  result := evalAux(c, n.sons[1]);
+  if result.kind = nkExceptBranch then exit;
+  a := result;
+  result := evalAux(c, n.sons[2]);
+  if result.kind = nkExceptBranch then exit;
+  b := result;
+  case a.kind of
+    nkStrLit..nkTripleStrLit: setLength(a.strVal, int(getOrdValue(b)));
+    else InternalError(n.info, 'evalSetLengthStr')
+  end;
+  result := emptyNode
+end;
+
+function evalSetLengthSeq(c: PEvalContext; n: PNode): PNode;
+var
+  a, b: PNode;
+begin
+  result := evalAux(c, n.sons[1]);
+  if result.kind = nkExceptBranch then exit;
+  a := result;
+  result := evalAux(c, n.sons[2]);
+  if result.kind = nkExceptBranch then exit;
+  b := result;
+  if a.kind = nkBracket then setLength(a.sons, int(getOrdValue(b)))
+  else InternalError(n.info, 'evalSetLengthSeq');
+  result := emptyNode
+end;
+
+function evalNewSeq(c: PEvalContext; n: PNode): PNode;
+var
+  a, b: PNode;
+  t: PType;
+  i: int;
+begin
+  result := evalAux(c, n.sons[1]);
+  if result.kind = nkExceptBranch then exit;
+  a := result;
+  result := evalAux(c, n.sons[2]);
+  if result.kind = nkExceptBranch then exit;
+  b := result;
+
+  t := skipVarGeneric(n.sons[1].typ);
+  result := newNodeIT(nkBracket, n.info, t);
+  for i := 0 to int(getOrdValue(b))-1 do
+    addSon(result, getNullValue(t.sons[0], n.info));
+  // XXX: assign to `a`? result := emptyNode
+end;
+
+function evalAssert(c: PEvalContext; n: PNode): PNode;
+begin
+  result := evalAux(c, n.sons[1]);
+  if result.kind = nkExceptBranch then exit;
+  if getOrdValue(result) <> 0 then
+    result := emptyNode
+  else
+    stackTrace(c, n, errAssertionFailed)
+end;
+
+function evalIncl(c: PEvalContext; n: PNode): PNode;
+var
+  a, b: PNode;
+begin
+  result := evalAux(c, n.sons[1]);
+  if result.kind = nkExceptBranch then exit;
+  a := result;
+  result := evalAux(c, n.sons[2]);
+  if result.kind = nkExceptBranch then exit;
+  b := result;
+  if not inSet(a, b) then addSon(a, copyTree(b));
+  result := emptyNode;
+end;
+
+function evalExcl(c: PEvalContext; n: PNode): PNode;
+var
+  a, b, r: PNode;
+  i: int;
+begin
+  result := evalAux(c, n.sons[1]);
+  if result.kind = nkExceptBranch then exit;
+  a := result;
+  result := evalAux(c, n.sons[2]);
+  if result.kind = nkExceptBranch then exit;
+  b := newNodeIT(nkCurly, n.info, n.sons[1].typ);
+  addSon(b, result);
+  r := diffSets(a, b);
+  discardSons(a);
+  for i := 0 to sonsLen(r)-1 do addSon(a, r.sons[i]);
+  result := emptyNode;
+end;
+
+function evalAppendStrCh(c: PEvalContext; n: PNode): PNode;
+var
+  a, b: PNode;
+begin
+  result := evalAux(c, n.sons[1]);
+  if result.kind = nkExceptBranch then exit;
+  a := result;
+  result := evalAux(c, n.sons[2]);
+  if result.kind = nkExceptBranch then exit;
+  b := result;
+  case a.kind of
+    nkStrLit..nkTripleStrLit: addChar(a.strVal, chr(int(getOrdValue(b))));
+    else InternalError(n.info, 'evalAppendStrCh');
+  end;
+  result := emptyNode;
+end;
+
+function getStrValue(n: PNode): string;
+begin
+  case n.kind of
+    nkStrLit..nkTripleStrLit: result := n.strVal;
+    else begin InternalError(n.info, 'getStrValue'); result := '' end;
+  end
+end;
+
+function evalConStrStr(c: PEvalContext; n: PNode): PNode;
+// we cannot use ``evalOp`` for this as we can here have more than 2 arguments
+var
+  a: PNode;
+  i: int;
+begin
+  result := evalAux(c, n.sons[1]);
+  if result.kind = nkExceptBranch then exit;
+  a := result;
+  for i := 2 to sonsLen(n)-1 do begin
+    result := evalAux(c, n.sons[i]);
+    if result.kind = nkExceptBranch then exit;
+    a.strVal := getStrValue(a) +{&} getStrValue(result);
+  end;
+  result := a;
+end;
+
+function evalAppendStrStr(c: PEvalContext; n: PNode): PNode;
+var
+  a, b: PNode;
+begin
+  result := evalAux(c, n.sons[1]);
+  if result.kind = nkExceptBranch then exit;
+  a := result;
+  result := evalAux(c, n.sons[2]);
+  if result.kind = nkExceptBranch then exit;
+  b := result;
+  case a.kind of
+    nkStrLit..nkTripleStrLit: a.strVal := a.strVal +{&} getStrValue(b);
+    else InternalError(n.info, 'evalAppendStrStr');
+  end;
+  result := emptyNode;
+end;
+
+function evalAppendSeqElem(c: PEvalContext; n: PNode): PNode;
+var
+  a, b: PNode;
+begin
+  result := evalAux(c, n.sons[1]);
+  if result.kind = nkExceptBranch then exit;
+  a := result;
+  result := evalAux(c, n.sons[2]);
+  if result.kind = nkExceptBranch then exit;
+  b := result;
+  if a.kind = nkBracket then addSon(a, copyTree(b))
+  else InternalError(n.info, 'evalAppendSeqElem');
+  result := emptyNode;
+end;
+
+function evalAppendSeqSeq(c: PEvalContext; n: PNode): PNode;
+var
+  a, b: PNode;
+  i: int;
+begin
+  result := evalAux(c, n.sons[1]);
+  if result.kind = nkExceptBranch then exit;
+  a := result;
+  result := evalAux(c, n.sons[2]);
+  if result.kind = nkExceptBranch then exit;
+  b := result;
+  if a.kind = nkBracket then
+    for i := 0 to sonsLen(b)-1 do addSon(a, copyTree(b.sons[i]))
+  else InternalError(n.info, 'evalAppendSeqSeq');
+  result := emptyNode;
+end;
+
+function evalRepr(c: PEvalContext; n: PNode): PNode;
+begin
+  result := evalAux(c, n.sons[1]);
+  if result.kind = nkExceptBranch then exit;
+  result := newStrNodeT(renderTree(result, {@set}[renderNoComments]), n);
+end;
+
+function evalMagicOrCall(c: PEvalContext; n: PNode): PNode;
+var
+  m: TMagic;
+  a, b: PNode;
+  k: biggestInt;
+  i: int;
+begin
+  m := getMagic(n);
+  case m of
+    mNone: result := evalCall(c, n);
+    mIs: result := evalIs(c, n);
+    mSizeOf: internalError(n.info, 'sizeof() should have been evaluated');
+    mHigh: result := evalHigh(c, n);
+    mAssert: result := evalAssert(c, n);
+    mExit: result := evalExit(c, n);
+    mNew, mNewFinalize: result := evalNew(c, n);
+    mNewSeq: result := evalNewSeq(c, n);
+    mSwap: result := evalSwap(c, n);
+    mInc: result := evalIncDec(c, n, 1);
+    ast.mDec: result := evalIncDec(c, n, -1);
+    mSetLengthStr: result := evalSetLengthStr(c, n);
+    mSetLengthSeq: result := evalSetLengthSeq(c, n);
+    mIncl: result := evalIncl(c, n);
+    mExcl: result := evalExcl(c, n);
+    mAnd: result := evalAnd(c, n);
+    mOr: result := evalOr(c, n);
+
+    mAppendStrCh: result := evalAppendStrCh(c, n);
+    mAppendStrStr: result := evalAppendStrStr(c, n);
+    mAppendSeqElem: result := evalAppendSeqElem(c, n);
+    mAppendSeqSeq: result := evalAppendSeqSeq(c, n);
+
+    mNLen: begin
+      result := evalAux(c, n.sons[1]);
+      if result.kind = nkExceptBranch then exit;
+      a := result;
+      result := newNodeIT(nkIntLit, n.info, n.typ);
+      case a.kind of
+        nkEmpty..nkNilLit: begin end;
+        else result.intVal := sonsLen(a);
+      end
+    end;
+    mNChild: begin
+      result := evalAux(c, n.sons[1]);
+      if result.kind = nkExceptBranch then exit;
+      a := result;
+      result := evalAux(c, n.sons[2]);
+      if result.kind = nkExceptBranch then exit;
+      k := getOrdValue(result);
+      if (k >= 0) and (k < sonsLen(a))
+      and not (a.kind in [nkEmpty..nkNilLit]) then
+        result := a.sons[int(k)]
+      else begin
+        stackTrace(c, n, errIndexOutOfBounds);
+        result := emptyNode
+      end;
+    end;
+    mNSetChild: begin
+      result := evalAux(c, n.sons[1]);
+      if result.kind = nkExceptBranch then exit;
+      a := result;
+      result := evalAux(c, n.sons[2]);
+      if result.kind = nkExceptBranch then exit;
+      b := result;
+      result := evalAux(c, n.sons[3]);
+      if result.kind = nkExceptBranch then exit;
+      k := getOrdValue(b);
+      if (k >= 0) and (k < sonsLen(a))
+      and not (a.kind in [nkEmpty..nkNilLit]) then
+        a.sons[int(k)] := result
+      else
+        stackTrace(c, n, errIndexOutOfBounds);
+      result := emptyNode;
+    end;
+    mNAdd: begin
+      result := evalAux(c, n.sons[1]);
+      if result.kind = nkExceptBranch then exit;
+      a := result;
+      result := evalAux(c, n.sons[2]);
+      if result.kind = nkExceptBranch then exit;
+      addSon(a, result);
+      result := emptyNode
+    end;
+    mNAddMultiple: begin
+      result := evalAux(c, n.sons[1]);
+      if result.kind = nkExceptBranch then exit;
+      a := result;
+      result := evalAux(c, n.sons[2]);
+      if result.kind = nkExceptBranch then exit;
+      for i := 0 to sonsLen(result)-1 do addSon(a, result.sons[i]);
+      result := emptyNode
+    end;
+    mNDel: begin
+      result := evalAux(c, n.sons[1]);
+      if result.kind = nkExceptBranch then exit;
+      a := result;
+      result := evalAux(c, n.sons[2]);
+      if result.kind = nkExceptBranch then exit;
+      b := result;
+      result := evalAux(c, n.sons[3]);
+      if result.kind = nkExceptBranch then exit;
+      for i := 0 to int(getOrdValue(result))-1 do
+        delSon(a, int(getOrdValue(b)));
+      result := emptyNode;
+    end;
+    mNKind: begin
+      result := evalAux(c, n.sons[1]);
+      if result.kind = nkExceptBranch then exit;
+      a := result;
+      result := newNodeIT(nkIntLit, n.info, n.typ);
+      result.intVal := ord(a.kind);
+    end;
+    mNIntVal: begin
+      result := evalAux(c, n.sons[1]);
+      if result.kind = nkExceptBranch then exit;
+      a := result;
+      result := newNodeIT(nkIntLit, n.info, n.typ);
+      case a.kind of
+        nkCharLit..nkInt64Lit: result.intVal := a.intVal;
+        else InternalError(n.info, 'no int value')
+      end
+    end;
+    mNFloatVal: begin
+      result := evalAux(c, n.sons[1]);
+      if result.kind = nkExceptBranch then exit;
+      a := result;
+      result := newNodeIT(nkFloatLit, n.info, n.typ);
+      case a.kind of
+        nkFloatLit..nkFloat64Lit: result.floatVal := a.floatVal;
+        else InternalError(n.info, 'no float value')
+      end
+    end;
+    mNSymbol: begin
+      result := evalAux(c, n.sons[1]);
+      if result.kind = nkExceptBranch then exit;
+      if result.kind <> nkSym then InternalError(n.info, 'no symbol')
+    end;
+    mNIdent: begin
+      result := evalAux(c, n.sons[1]);
+      if result.kind = nkExceptBranch then exit;
+      if result.kind <> nkIdent then InternalError(n.info, 'no symbol')
+    end;
+    mNGetType: result := evalAux(c, n.sons[1]);
+    mNStrVal: begin
+      result := evalAux(c, n.sons[1]);
+      if result.kind = nkExceptBranch then exit;
+      a := result;
+      result := newNodeIT(nkStrLit, n.info, n.typ);
+      case a.kind of
+        nkStrLit..nkTripleStrLit: result.strVal := a.strVal;
+        else InternalError(n.info, 'no string value')
+      end
+    end;
+    mNSetIntVal: begin
+      result := evalAux(c, n.sons[1]);
+      if result.kind = nkExceptBranch then exit;
+      a := result;
+      result := evalAux(c, n.sons[2]);
+      if result.kind = nkExceptBranch then exit;
+      a.intVal := result.intVal; // XXX: exception handling?
+      result := emptyNode
+    end;
+    mNSetFloatVal: begin
+      result := evalAux(c, n.sons[1]);
+      if result.kind = nkExceptBranch then exit;
+      a := result;
+      result := evalAux(c, n.sons[2]);
+      if result.kind = nkExceptBranch then exit;
+      a.floatVal := result.floatVal; // XXX: exception handling?
+      result := emptyNode
+    end;
+    mNSetSymbol: begin
+      result := evalAux(c, n.sons[1]);
+      if result.kind = nkExceptBranch then exit;
+      a := result;
+      result := evalAux(c, n.sons[2]);
+      if result.kind = nkExceptBranch then exit;
+      a.sym := result.sym; // XXX: exception handling?
+      result := emptyNode
+    end;
+    mNSetIdent: begin
+      result := evalAux(c, n.sons[1]);
+      if result.kind = nkExceptBranch then exit;
+      a := result;
+      result := evalAux(c, n.sons[2]);
+      if result.kind = nkExceptBranch then exit;
+      a.ident := result.ident; // XXX: exception handling?
+      result := emptyNode
+    end;
+    mNSetType: begin
+      result := evalAux(c, n.sons[1]);
+      if result.kind = nkExceptBranch then exit;
+      a := result;
+      result := evalAux(c, n.sons[2]);
+      if result.kind = nkExceptBranch then exit;
+      a.typ := result.typ; // XXX: exception handling?
+      result := emptyNode
+    end;
+    mNSetStrVal: begin
+      result := evalAux(c, n.sons[1]);
+      if result.kind = nkExceptBranch then exit;
+      a := result;
+      result := evalAux(c, n.sons[2]);
+      if result.kind = nkExceptBranch then exit;
+      a.strVal := result.strVal; // XXX: exception handling?
+      result := emptyNode
+    end;
+    mNNewNimNode: begin
+      result := evalAux(c, n.sons[1]);
+      if result.kind = nkExceptBranch then exit;
+      k := getOrdValue(result);
+      result := evalAux(c, n.sons[2]);
+      if result.kind = nkExceptBranch then exit;
+      a := result;
+      if (k < 0) or (k > ord(high(TNodeKind))) then
+        internalError(n.info, 'request to create a NimNode with invalid kind');
+      if a.kind = nkNilLit then
+        result := newNodeI(TNodeKind(int(k)), n.info)
+      else
+        result := newNodeI(TNodeKind(int(k)), a.info)
+    end;
+    mNCopyNimNode: begin
+      result := evalAux(c, n.sons[1]);
+      if result.kind = nkExceptBranch then exit;
+      result := copyNode(result);
+    end;
+    mNCopyNimTree: begin
+      result := evalAux(c, n.sons[1]);
+      if result.kind = nkExceptBranch then exit;
+      result := copyTree(result);
+    end;
+    mStrToIdent: begin
+      result := evalAux(c, n.sons[1]);
+      if result.kind = nkExceptBranch then exit;
+      if not (result.kind in [nkStrLit..nkTripleStrLit]) then
+        InternalError(n.info, 'no string node');
+      a := result;
+      result := newNodeIT(nkIdent, n.info, n.typ);
+      result.ident := getIdent(a.strVal);
+    end;
+    mIdentToStr: begin
+      result := evalAux(c, n.sons[1]);
+      if result.kind = nkExceptBranch then exit;
+      if result.kind <> nkIdent then
+        InternalError(n.info, 'no ident node');
+      a := result;
+      result := newNodeIT(nkStrLit, n.info, n.typ);
+      result.strVal := a.ident.s;
+    end;
+    mEqIdent: begin
+      result := evalAux(c, n.sons[1]);
+      if result.kind = nkExceptBranch then exit;
+      a := result;
+      result := evalAux(c, n.sons[2]);
+      if result.kind = nkExceptBranch then exit;
+      b := result;
+      result := newNodeIT(nkIntLit, n.info, n.typ);
+      if (a.kind = nkIdent) and (b.kind = nkIdent) then
+        if a.ident.id = b.ident.id then result.intVal := 1
+    end;
+    mNHint: begin
+      result := evalAux(c, n.sons[1]);
+      if result.kind = nkExceptBranch then exit;
+      liMessage(n.info, hintUser, getStrValue(result));
+      result := emptyNode
+    end;
+    mNWarning: begin
+      result := evalAux(c, n.sons[1]);
+      if result.kind = nkExceptBranch then exit;
+      liMessage(n.info, warnUser, getStrValue(result));
+      result := emptyNode
+    end;
+    mNError: begin
+      result := evalAux(c, n.sons[1]);
+      if result.kind = nkExceptBranch then exit;
+      liMessage(n.info, errUser, getStrValue(result));
+      result := emptyNode
+    end;
+    mConStrStr: result := evalConStrStr(c, n);
+    mRepr: result := evalRepr(c, n);
+    else begin
+      result := evalAux(c, n.sons[1]);
+      if result.kind = nkExceptBranch then exit;
+      a := result;
+      if sonsLen(n) > 2 then begin
+        result := evalAux(c, n.sons[2]);
+        if result.kind = nkExceptBranch then exit;
+      end
+      else
+        result := nil;
+      result := evalOp(m, n, a, result);
+    end
+  end
+end;
+
+function evalAux(c: PEvalContext; n: PNode): PNode;
+var
+  i: int;
+begin
+  result := emptyNode;
+  dec(gNestedEvals);
+  if gNestedEvals <= 0 then stackTrace(c, n, errTooManyIterations);
+  case n.kind of // atoms:
+    nkEmpty: result := n;
+    nkSym: result := evalSym(c, n);
+    nkType..pred(nkNilLit): result := copyNode(n);
+    nkNilLit: result := n; // end of atoms
+
+    nkCall, nkHiddenCallConv, nkMacroStmt: result := evalMagicOrCall(c, n);
+    nkCurly, nkBracket: begin
+      result := copyNode(n);
+      for i := 0 to sonsLen(n)-1 do addSon(result, evalAux(c, n.sons[i]));
+    end;
+    nkPar: begin
+      result := copyTree(n);
+      for i := 0 to sonsLen(n)-1 do
+        result.sons[i].sons[1] := evalAux(c, n.sons[i].sons[1]);
+    end;
+    nkBracketExpr: result := evalArrayAccess(c, n);
+    nkDotExpr: result := evalFieldAccess(c, n);
+    nkDerefExpr, nkHiddenDeref: result := evalDeref(c, n);
+    nkAddr, nkHiddenAddr: result := evalAddr(c, n);
+    nkHiddenStdConv, nkHiddenSubConv, nkConv: result := evalConv(c, n);
+    nkAsgn: result := evalAsgn(c, n);
+    nkWhenStmt, nkIfStmt, nkIfExpr: result := evalIf(c, n);
+    nkWhileStmt: result := evalWhile(c, n);
+    nkCaseStmt: result := evalCase(c, n);
+    nkVarSection: result := evalVar(c, n);
+    nkTryStmt: result := evalTry(c, n);
+    nkRaiseStmt: result := evalRaise(c, n);
+    nkReturnStmt: result := evalReturn(c, n);
+    nkBreakStmt, nkReturnToken: result := n;
+    nkBlockExpr, nkBlockStmt: result := evalBlock(c, n);
+    nkDiscardStmt: result := evalAux(c, n.sons[0]);
+    nkCheckedFieldExpr: result := evalCheckedFieldAccess(c, n);
+    nkObjDownConv: result := evalAux(c, n.sons[0]);
+    nkObjUpConv: result := evalUpConv(c, n);
+    nkChckRangeF, nkChckRange64, nkChckRange: result := evalRangeChck(c, n);
+    nkStringToCString: result := evalConvStrToCStr(c, n);
+    nkCStringToString: result := evalConvCStrToStr(c, n);
+    nkPassAsOpenArray: result := evalAux(c, n.sons[0]);
+
+    nkStmtListExpr, nkStmtList, nkModule: begin
+      for i := 0 to sonsLen(n)-1 do begin
+        result := evalAux(c, n.sons[i]);
+        case result.kind of
+          nkExceptBranch, nkReturnToken, nkBreakStmt: break;
+          else begin end
+        end
+      end
+    end;
+    nkProcDef, nkMacroDef, nkCommentStmt, nkPragma, nkTypeSection,
+    nkTemplateDef, nkConstSection, nkIteratorDef, nkConverterDef,
+    nkIncludeStmt, nkImportStmt, nkFromStmt: begin end;
+    nkIdentDefs, nkCast, nkYieldStmt, nkAsmStmt, nkForStmt, nkPragmaExpr,
+    nkQualified, nkLambda, nkContinueStmt:
+      stackTrace(c, n, errCannotInterpretNodeX, nodeKindToStr[n.kind]);
+    else InternalError(n.info, 'evalAux: ' + nodekindToStr[n.kind]);
+  end;
+  if result = nil then
+    InternalError(n.info, 'evalAux: returned nil ' + nodekindToStr[n.kind]);
+  inc(gNestedEvals);
+end;
+
+function eval(c: PEvalContext; n: PNode): PNode;
+begin
+  gWhileCounter := evalMaxIterations;
+  gNestedEvals := evalMaxRecDepth;
+  result := evalAux(c, n);
+  if result.kind = nkExceptBranch then
+    stackTrace(c, n, errUnhandledExceptionX, typeToString(result.typ));
+end;
+
+function myOpen(module: PSym; const filename: string): PPassContext;
+var
+  c: PEvalContext;
+begin
+  c := newEvalContext(module, filename);
+  pushStackFrame(c, newStackFrame());
+  result := c;
+end;
+
+function myProcess(c: PPassContext; n: PNode): PNode;
+begin
+  result := eval(PEvalContext(c), n);
+end;
+
+function evalPass(): TPass;
+begin
+  initPass(result);
+  result.open := myOpen;
+  result.close := myProcess;
+  result.process := myProcess;
+end;
+
+initialization
+  new(emptyNode);
+{@ignore}
+  fillChar(emptyNode^, sizeof(emptyNode^), 0);
+{@emit}
+  emptyNode.kind := nkEmpty;
+end.
diff --git a/nim/hashes.pas b/nim/hashes.pas
index cf5ab03bc..1bd3c7d2a 100644
--- a/nim/hashes.pas
+++ b/nim/hashes.pas
@@ -44,9 +44,6 @@ function finishHash(h: THash): THash;
 
 implementation
 
-type
-  TUnsignedHash = cardinal;
-
 {@ignore}
 {$ifopt Q+} { we need Q- here! }
   {$define Q_on}
@@ -89,7 +86,7 @@ end;
 
 function GetDataHash(Data: Pointer; Size: int): THash;
 var
-  h: TUnsignedHash;
+  h: THash;
   p: PChar;
   i, s: int;
 begin
@@ -116,7 +113,7 @@ end;
 
 function GetHash(str: PChar): THash;
 var
-  h: TUnsignedHash;
+  h: THash;
   i: int;
 begin
   h := 0;
@@ -135,7 +132,7 @@ end;
 
 function GetHashStr(const s: string): THash;
 var
-  h: TUnsignedHash;
+  h: THash;
   i: int;
 begin
   h := 0;
@@ -152,7 +149,7 @@ end;
 
 function getNormalizedHash(const s: string): THash;
 var
-  h: TUnsignedHash;
+  h: THash;
   c: Char;
   i: int;
 begin
@@ -173,7 +170,7 @@ end;
 
 function GetHashStrCI(const s: string): THash;
 var
-  h: TUnsignedHash;
+  h: THash;
   c: Char;
   i: int;
 begin
@@ -193,7 +190,7 @@ end;
 
 function GetHashCI(str: PChar): THash;
 var
-  h: TUnsignedHash;
+  h: THash;
   c: Char;
   i: int;
 begin
diff --git a/nim/hashtest.pas b/nim/hashtest.pas
new file mode 100644
index 000000000..ba7a62372
--- /dev/null
+++ b/nim/hashtest.pas
@@ -0,0 +1,10 @@
+program hashtest;
+
+{$include 'config.inc'}
+
+uses
+  hashes;
+
+begin
+  writeln(output, getNormalizedHash(ParamStr(1)));
+end.
diff --git a/nim/interact.pas b/nim/interact.pas
new file mode 100644
index 000000000..ac238107f
--- /dev/null
+++ b/nim/interact.pas
@@ -0,0 +1,22 @@
+//
+//
+//           The Nimrod Compiler
+//        (c) Copyright 2008 Andreas Rumpf
+//
+//    See the file "copying.txt", included in this
+//    distribution, for details about the copyright.
+//
+unit interact;
+
+// This file implements interactive sessions.
+
+interface
+
+{$include 'config.inc'}
+
+uses
+  nsystem, llstream, strutils, charsets, ropes, strtabs, msgs;
+
+implementation
+
+end.
diff --git a/nim/lists.pas b/nim/lists.pas
index 74b1479d9..e3442eb29 100644
--- a/nim/lists.pas
+++ b/nim/lists.pas
@@ -8,7 +8,7 @@
 //
 unit lists;
 
-// This unit implements a generic doubled linked list.
+// This module implements a generic doubled linked list.
 
 interface
 
diff --git a/nim/llstream.pas b/nim/llstream.pas
new file mode 100644
index 000000000..2d4336664
--- /dev/null
+++ b/nim/llstream.pas
@@ -0,0 +1,250 @@
+//
+//
+//           The Nimrod Compiler
+//        (c) Copyright 2008 Andreas Rumpf
+//
+//    See the file "copying.txt", included in this
+//    distribution, for details about the copyright.
+//
+unit llstream;
+
+// Low-level streams for high performance.
+
+interface
+
+uses
+  nsystem, charsets, strutils;
+
+type
+  TLLStreamKind = (
+    llsNone,          // null stream: reading and writing has no effect
+    llsString,        // stream encapsulates a string
+    llsFile,          // stream encapsulates a file
+    llsStdIn);        // stream encapsulates stdin
+  TLLStream = object(NObject)
+    kind: TLLStreamKind; // exposed for low-level access (lexbase uses this)
+    f: TBinaryFile;
+    s: string;
+    pos: int; // for string streams
+  end;
+  PLLStream = ^TLLStream;
+  
+
+function LLStreamOpen(const data: string): PLLStream; overload;
+function LLStreamOpen(var f: TBinaryFile): PLLStream; overload;
+function LLStreamOpen(const filename: string; mode: TFileMode): PLLStream; overload;
+function LLStreamOpen(): PLLStream; overload;
+function LLStreamOpenStdIn(): PLLStream;
+
+procedure LLStreamClose(s: PLLStream);
+
+function LLStreamRead(s: PLLStream; buf: pointer; bufLen: int): int; 
+function LLStreamReadLine(s: PLLStream): string; 
+function LLStreamReadAll(s: PLLStream): string;
+
+procedure LLStreamWrite(s: PLLStream; const data: string); overload;
+procedure LLStreamWrite(s: PLLStream; data: Char); overload;
+procedure LLStreamWrite(s: PLLStream; buf: pointer; buflen: int); overload;
+
+function LLStreamAtEnd(s: PLLStream): bool;
+
+implementation
+
+function LLStreamOpen(const data: string): PLLStream; overload;
+begin
+  new(result);
+  {@ignore}
+  fillChar(result^, sizeof(result^), 0);
+  {@emit}
+  result.s := data;
+  result.kind := llsString;
+end;
+
+function LLStreamOpen(var f: TBinaryFile): PLLStream; overload;
+begin
+  new(result);
+  {@ignore}
+  fillChar(result^, sizeof(result^), 0);
+  {@emit}
+  result.f := f;
+  result.kind := llsFile;
+end;
+
+function LLStreamOpen(const filename: string; mode: TFileMode): PLLStream; overload;
+begin
+  new(result);
+  {@ignore}
+  fillChar(result^, sizeof(result^), 0);
+  {@emit}
+  result.kind := llsFile;
+  if not OpenFile(result.f, filename, mode) then result := nil;
+end;
+
+function LLStreamOpen(): PLLStream; overload;
+begin
+  new(result);
+  {@ignore}
+  fillChar(result^, sizeof(result^), 0);
+  {@emit}
+  result.kind := llsNone;
+end;
+
+function LLStreamOpenStdIn(): PLLStream;
+begin
+  new(result);
+  {@ignore}
+  fillChar(result^, sizeof(result^), 0);
+  {@emit}
+  result.kind := llsStdIn;
+  result.s := '';
+  result.pos := -1;
+end;
+
+procedure LLStreamClose(s: PLLStream);
+begin
+  case s.kind of 
+    llsNone, llsString, llsStdIn: begin end;
+    llsFile: nimCloseFile(s.f); 
+  end
+end;
+
+function LLreadFromStdin(s: PLLStream; buf: pointer; bufLen: int): int;
+var
+  line: string;
+  L: int;
+begin
+  s.s := '';
+  s.pos := 0;
+  while true do begin
+    write(output, 'Nimrod> ');
+    line := readLine(input);
+    L := length(line);
+    add(s.s, line);
+    add(s.s, nl);
+    if (L > 0) and (line[L-1+strStart] = '#') then break;
+  end;
+  result := min(bufLen, length(s.s)-s.pos);
+  if result > 0 then begin
+    copyMem(buf, addr(s.s[strStart+s.pos]), result);
+    inc(s.pos, result)
+  end
+end;
+
+function LLStreamRead(s: PLLStream; buf: pointer; bufLen: int): int; 
+begin
+  case s.kind of 
+    llsNone: result := 0;
+    llsString: begin
+      result := min(bufLen, length(s.s)-s.pos);
+      if result > 0 then begin
+        copyMem(buf, addr(s.s[strStart+s.pos]), result);
+        inc(s.pos, result)
+      end
+    end;
+    llsFile:  result := readBuffer(s.f, buf, bufLen);
+    llsStdIn: result := LLreadFromStdin(s, buf, bufLen);
+  end
+end;
+
+function LLStreamReadLine(s: PLLStream): string; 
+begin
+  case s.kind of 
+    llsNone: result := '';
+    llsString: begin
+      result := '';
+      while s.pos < length(s.s) do begin
+        case s.s[s.pos+strStart] of 
+          #13: begin 
+            inc(s.pos); 
+            if s.s[s.pos+strStart] = #10 then inc(s.pos);
+            break
+          end;
+          #10: begin inc(s.pos); break end;
+          else begin
+            addChar(result, s.s[s.pos+strStart]);
+            inc(s.pos);
+          end
+        end
+      end    
+    end;
+    llsFile: result := readLine(s.f);
+    llsStdIn: result := readLine(input);
+  end
+end;
+
+function LLStreamAtEnd(s: PLLStream): bool;
+begin
+  case s.kind of
+    llsNone: result := true;
+    llsString: result := s.pos < length(s.s);
+    llsFile: result := endOfFile(s.f);
+    llsStdIn: result := false;
+  end
+end;
+
+procedure LLStreamWrite(s: PLLStream; const data: string); overload;
+begin
+  case s.kind of 
+    llsNone, llsStdIn: begin end;
+    llsString: add(s.s, data);
+    llsFile: nimWrite(s.f, data);
+  end
+end;
+
+procedure LLStreamWrite(s: PLLStream; data: Char); overload;
+var
+  c: char;
+begin
+  case s.kind of 
+    llsNone, llsStdIn: begin end;
+    llsString: addChar(s.s, data);
+    llsFile: begin
+      c := data;
+      {@discard} writeBuffer(s.f, addr(c), sizeof(c));
+    end
+  end
+end;
+
+procedure LLStreamWrite(s: PLLStream; buf: pointer; buflen: int); overload;
+begin
+  case s.kind of 
+    llsNone, llsStdIn: begin end;
+    llsString: begin
+      if bufLen > 0 then begin
+        setLength(s.s, length(s.s) + bufLen);
+        copyMem(addr(s.s[strStart+s.pos]), buf, bufLen);
+        inc(s.pos, bufLen);
+      end
+    end;
+    llsFile: {@discard} writeBuffer(s.f, buf, bufLen);
+  end
+end;
+
+function LLStreamReadAll(s: PLLStream): string;
+const  
+  bufSize = 2048;
+var
+  bytes, i: int;
+begin
+  case s.kind of 
+    llsNone, llsStdIn: result := '';
+    llsString: begin
+      if s.pos = 0 then result := s.s
+      else result := ncopy(s.s, s.pos+strStart);
+      s.pos := length(s.s);
+    end;
+    llsFile: begin
+      result := newString(bufSize);
+      bytes := readBuffer(s.f, addr(result[strStart]), bufSize);
+      i := bytes;
+      while bytes = bufSize do begin
+        setLength(result, i+bufSize);
+        bytes := readBuffer(s.f, addr(result[i+strStart]), bufSize);
+        inc(i, bytes);
+      end;
+      setLength(result, i);
+    end
+  end
+end;
+
+end.
diff --git a/nim/lookups.pas b/nim/lookups.pas
new file mode 100644
index 000000000..a9a4a783b
--- /dev/null
+++ b/nim/lookups.pas
@@ -0,0 +1,289 @@
+//
+//
+//           The Nimrod Compiler
+//        (c) Copyright 2008 Andreas Rumpf
+//
+//    See the file "copying.txt", included in this
+//    distribution, for details about the copyright.
+//
+unit lookups;
+
+// This module implements lookup helpers.
+
+interface
+
+uses 
+  nsystem, ast, astalgo, idents, semdata, types, msgs, options, rodread,
+  rnimsyn;
+
+{$include 'config.inc'}
+
+type
+  TOverloadIterMode = (oimNoQualifier, oimSelfModule, oimOtherModule);
+  TOverloadIter = record
+    stackPtr: int;
+    it: TIdentIter;
+    m: PSym;
+    mode: TOverloadIterMode;
+  end;
+
+function getSymRepr(s: PSym): string;
+
+procedure CloseScope(var tab: TSymTab);
+
+procedure AddSym(var t: TStrTable; n: PSym);
+
+procedure addDecl(c: PContext; sym: PSym);
+procedure addDeclAt(c: PContext; sym: PSym; at: Natural);
+procedure addOverloadableSymAt(c: PContext; fn: PSym; at: Natural);
+
+procedure addInterfaceDecl(c: PContext; sym: PSym);
+procedure addInterfaceOverloadableSymAt(c: PContext; sym: PSym; at: int);
+
+function lookUp(c: PContext; n: PNode): PSym;
+// Looks up a symbol. Generates an error in case of nil.
+
+function QualifiedLookUp(c: PContext; n: PNode; ambigiousCheck: bool): PSym;
+
+function InitOverloadIter(out o: TOverloadIter; c: PContext; n: PNode): PSym;
+function nextOverloadIter(var o: TOverloadIter; c: PContext; n: PNode): PSym;
+
+implementation
+
+function getSymRepr(s: PSym): string;
+begin
+  case s.kind of
+    skProc, skConverter, skIterator: result := getProcHeader(s);
+    else result := s.name.s
+  end
+end;
+
+procedure CloseScope(var tab: TSymTab);
+var
+  it: TTabIter;
+  s: PSym;
+begin
+  // check if all symbols have been used and defined:
+  if (tab.tos > length(tab.stack)) then InternalError('CloseScope');
+  s := InitTabIter(it, tab.stack[tab.tos-1]);
+  while s <> nil do begin
+    if sfForward in s.flags then
+      liMessage(s.info, errImplOfXexpected, getSymRepr(s))
+    else if ([sfUsed, sfInInterface] * s.flags = []) and
+            (optHints in s.options) then // BUGFIX: check options in s!
+      if not (s.kind in [skForVar, skParam]) then
+        liMessage(s.info, hintXDeclaredButNotUsed, getSymRepr(s));
+    s := NextIter(it, tab.stack[tab.tos-1]);
+  end;
+  astalgo.rawCloseScope(tab);
+end;
+
+procedure AddSym(var t: TStrTable; n: PSym);
+begin
+  if StrTableIncl(t, n) then liMessage(n.info, errAttemptToRedefine, n.name.s);
+end;
+
+procedure addDecl(c: PContext; sym: PSym);
+begin
+  if SymTabAddUnique(c.tab, sym) = Failure then
+    liMessage(sym.info, errAttemptToRedefine, sym.Name.s);
+end;
+
+procedure addDeclAt(c: PContext; sym: PSym; at: Natural);
+begin
+  if SymTabAddUniqueAt(c.tab, sym, at) = Failure then
+    liMessage(sym.info, errAttemptToRedefine, sym.Name.s);
+end;
+
+procedure addOverloadableSymAt(c: PContext; fn: PSym; at: Natural);
+var
+  check: PSym;
+begin
+  if not (fn.kind in OverloadableSyms) then
+    InternalError(fn.info, 'addOverloadableSymAt');
+  check := StrTableGet(c.tab.stack[at], fn.name);
+  if (check <> nil) and (check.Kind <> fn.kind) then
+    liMessage(fn.info, errAttemptToRedefine, fn.Name.s);
+  SymTabAddAt(c.tab, fn, at);
+end;
+
+procedure AddInterfaceDeclAux(c: PContext; sym: PSym);
+begin
+  if (sfInInterface in sym.flags) then begin
+    // add to interface:
+    if c.module = nil then InternalError(sym.info, 'AddInterfaceDeclAux');
+    StrTableAdd(c.module.tab, sym);
+  end;
+  if getCurrOwner().kind = skModule then
+    include(sym.flags, sfGlobal)
+end;
+
+procedure addInterfaceDecl(c: PContext; sym: PSym);
+begin  // it adds the symbol to the interface if appropriate
+  addDecl(c, sym);
+  AddInterfaceDeclAux(c, sym);
+end;
+
+procedure addInterfaceOverloadableSymAt(c: PContext; sym: PSym; at: int);
+begin  // it adds the symbol to the interface if appropriate
+  addOverloadableSymAt(c, sym, at);
+  AddInterfaceDeclAux(c, sym);
+end;
+
+function lookUp(c: PContext; n: PNode): PSym;
+// Looks up a symbol. Generates an error in case of nil.
+begin
+  case n.kind of
+    nkAccQuoted: result := lookup(c, n.sons[0]);
+    nkSym: begin
+      result := SymtabGet(c.Tab, n.sym.name);
+      if result = nil then
+        liMessage(n.info, errUndeclaredIdentifier, n.sym.name.s);
+      include(result.flags, sfUsed);
+    end;
+    nkIdent: begin
+      result := SymtabGet(c.Tab, n.ident);
+      if result = nil then
+        liMessage(n.info, errUndeclaredIdentifier, n.ident.s);
+      include(result.flags, sfUsed);
+    end
+    else InternalError(n.info, 'lookUp');
+  end;
+  if IntSetContains(c.AmbigiousSymbols, result.id) then
+    liMessage(n.info, errUseQualifier, result.name.s);
+  if result.kind = skStub then loadStub(result);
+end;
+
+function QualifiedLookUp(c: PContext; n: PNode; ambigiousCheck: bool): PSym;
+var
+  m: PSym;
+  ident: PIdent;
+begin
+  case n.kind of
+    nkIdent: begin
+      result := SymtabGet(c.Tab, n.ident);
+      if result = nil then
+        liMessage(n.info, errUndeclaredIdentifier, n.ident.s)
+      else if ambigiousCheck
+          and IntSetContains(c.AmbigiousSymbols, result.id) then
+        liMessage(n.info, errUseQualifier, n.ident.s)
+    end;
+    nkSym: begin
+      result := SymtabGet(c.Tab, n.sym.name);
+      if result = nil then
+        liMessage(n.info, errUndeclaredIdentifier, n.sym.name.s)
+      else if ambigiousCheck
+          and IntSetContains(c.AmbigiousSymbols, result.id) then
+        liMessage(n.info, errUseQualifier, n.sym.name.s)
+    end;
+    nkDotExpr, nkQualified: begin
+      result := nil;
+      m := qualifiedLookUp(c, n.sons[0], false);
+      if (m <> nil) and (m.kind = skModule) then begin
+        ident := nil;
+        if (n.sons[1].kind = nkIdent) then 
+          ident := n.sons[1].ident
+        else if (n.sons[1].kind = nkAccQuoted) 
+        and (n.sons[1].sons[0].kind = nkIdent) then
+          ident := n.sons[1].sons[0].ident;
+        if ident <> nil then begin
+          if m = c.module then
+            // a module may access its private members:
+            result := StrTableGet(c.tab.stack[ModuleTablePos], ident)
+          else
+            result := StrTableGet(m.tab, ident);
+          if result = nil then
+            liMessage(n.sons[1].info, errUndeclaredIdentifier, ident.s)
+        end
+        else
+          liMessage(n.sons[1].info, errIdentifierExpected, 
+                    renderTree(n.sons[1]));
+      end
+    end;
+    nkAccQuoted: result := QualifiedLookup(c, n.sons[0], ambigiousCheck);
+    else begin
+      result := nil;
+      //liMessage(n.info, errIdentifierExpected, '')
+    end;
+  end;
+  if (result <> nil) and (result.kind = skStub) then loadStub(result);
+end;
+
+function InitOverloadIter(out o: TOverloadIter; c: PContext; n: PNode): PSym;
+var
+  ident: PIdent;
+begin
+  result := nil;
+  case n.kind of
+    nkIdent: begin
+      o.stackPtr := c.tab.tos;
+      o.mode := oimNoQualifier;
+      while (result = nil) do begin
+        dec(o.stackPtr);
+        if o.stackPtr < 0 then break;
+        result := InitIdentIter(o.it, c.tab.stack[o.stackPtr], n.ident);
+      end;
+    end;
+    nkSym: begin
+      o.stackPtr := c.tab.tos;
+      o.mode := oimNoQualifier;
+      while (result = nil) do begin
+        dec(o.stackPtr);
+        if o.stackPtr < 0 then break;
+        result := InitIdentIter(o.it, c.tab.stack[o.stackPtr], n.sym.name);
+      end;
+    end;
+    nkDotExpr, nkQualified: begin
+      o.mode := oimOtherModule;
+      o.m := qualifiedLookUp(c, n.sons[0], false);
+      if (o.m <> nil) and (o.m.kind = skModule) then begin
+        ident := nil;
+        if (n.sons[1].kind = nkIdent) then 
+          ident := n.sons[1].ident
+        else if (n.sons[1].kind = nkAccQuoted) 
+        and (n.sons[1].sons[0].kind = nkIdent) then
+          ident := n.sons[1].sons[0].ident;
+        if ident <> nil then begin
+          if o.m = c.module then begin
+            // a module may access its private members:
+            result := InitIdentIter(o.it, c.tab.stack[ModuleTablePos], ident);
+            o.mode := oimSelfModule;
+          end
+          else
+            result := InitIdentIter(o.it, o.m.tab, ident);
+        end
+        else
+          liMessage(n.sons[1].info, errIdentifierExpected, 
+                    renderTree(n.sons[1]));
+      end
+    end;
+    nkAccQuoted: result := InitOverloadIter(o, c, n.sons[0]);
+    else begin end
+  end;
+  if (result <> nil) and (result.kind = skStub) then loadStub(result);
+end;
+
+function nextOverloadIter(var o: TOverloadIter; c: PContext; n: PNode): PSym;
+begin
+  case o.mode of
+    oimNoQualifier: begin
+      if n.kind = nkAccQuoted then 
+        result := nextOverloadIter(o, c, n.sons[0]) // BUGFIX
+      else if o.stackPtr >= 0 then begin
+        result := nextIdentIter(o.it, c.tab.stack[o.stackPtr]);
+        while (result = nil) do begin
+          dec(o.stackPtr);
+          if o.stackPtr < 0 then break;
+          result := InitIdentIter(o.it, c.tab.stack[o.stackPtr], o.it.name);
+          // BUGFIX: o.it.name <-> n.ident
+        end
+      end
+      else result := nil;
+    end;
+    oimSelfModule:  result := nextIdentIter(o.it, c.tab.stack[ModuleTablePos]);
+    oimOtherModule: result := nextIdentIter(o.it, o.m.tab);
+  end;
+  if (result <> nil) and (result.kind = skStub) then loadStub(result);
+end;
+
+end.
diff --git a/nim/main.pas b/nim/main.pas
index 7cf3fbd0a..565373685 100644
--- a/nim/main.pas
+++ b/nim/main.pas
@@ -127,7 +127,6 @@ begin
   registerPass(verbosePass());
   registerPass(sem.semPass());
   registerPass(transf.transfPass());
-  registerPass(rodwrite.rodwritePass());
 end;
 
 procedure CommandGenDepend(const filename: string);
@@ -152,6 +151,7 @@ procedure CommandCompileToC(const filename: string);
 begin
   semanticPasses();
   registerPass(cgen.cgenPass());
+  registerPass(rodwrite.rodwritePass());
   registerPass(cleanupPass());
   compileProject(filename);
   //for i := low(TTypeKind) to high(TTypeKind) do
diff --git a/nim/nsystem.pas b/nim/nsystem.pas
index 340477461..c33236189 100644
--- a/nim/nsystem.pas
+++ b/nim/nsystem.pas
@@ -41,6 +41,8 @@ type
   EOverflow = class(Exception)
   end;
 {$endif}
+  EOutOfRange = class(Exception)
+  end;
 
   float32 = single;
   float64 = double;
@@ -153,6 +155,7 @@ function ltU(a, b: biggestInt): bool;
 function leU(a, b: biggestInt): bool;
 
 function toU8(a: biggestInt): byte;
+function toU16(a: biggestInt): int16;
 function toU32(a: biggestInt): int32;
 function ze64(a: byte): biggestInt;
 function ze(a: byte): int;
@@ -206,9 +209,25 @@ function readFile(const filename: string): string;
 
 procedure nimWrite(var f: tBinaryFile; const str: string); overload;
 
+procedure add(var x: string; const y: string);
+// Pascal version of string appending. Terminating zero is ignored.
 
 implementation
 
+{@ignore}
+procedure add(var x: string; const y: string);
+// Pascal version of string appending. Terminating zero is ignored.
+var
+  L: int;
+begin
+  L := length(y);
+  if L > 0 then begin
+    if y[L] = #0 then x := x + copy(y, 1, L-1)
+    else x := x + y;
+  end
+end;
+{@emit}
+
 function alloc(size: int): Pointer;
 begin
   getMem(result, size); // use standard allocator
@@ -284,6 +303,11 @@ begin
   result := int32(a and $ffffffff);
 end;
 
+function toU16(a: biggestInt): int16;
+begin
+  result := int16(a and $ffff);  
+end;
+
 function ze64(a: byte): biggestInt;
 begin
   result := a
@@ -565,16 +589,30 @@ end;
 var
   zero: float;
   Saved8087CW: Word;
+  savedExcMask: TFPUExceptionMask;
 initialization
+{$ifdef cpu64}
+  savedExcMask := SetExceptionMask([exInvalidOp,
+	exDenormalized,
+	exPrecision,
+	exZeroDivide,
+	exOverflow,
+	exUnderflow
+	]);
+{$else}
   Saved8087CW := Default8087CW;
   Set8087CW($133f); // Disable all fpu exceptions
-
+{$endif}
   zero := 0.0;
   NaN := 0.0 / zero;
   inf := 1.0 / zero;
   NegInf := -inf;
 finalization
+{$ifdef cpu64}
+  SetExceptionMask(savedExcMask); // set back exception mask
+{$else}
   Set8087CW(Saved8087CW);
+{$endif}
 {$ifdef R_on}
   {$R+,Q+}
 {$endif}
diff --git a/nim/nversion.pas b/nim/nversion.pas
index 51390a073..9629079b2 100644
--- a/nim/nversion.pas
+++ b/nim/nversion.pas
@@ -31,10 +31,10 @@ const
   //cog.outl('VersionMinor = %s;' % ver[1])
   //cog.outl('VersionPatch = %s;' % ver[2])
   //]]]
-  VersionAsString = '0.7.0';
+  VersionAsString = '0.7.2';
   VersionMajor = 0;
   VersionMinor = 7;
-  VersionPatch = 0;
+  VersionPatch = 2;
   //[[[[end]]]]
 
 implementation
diff --git a/nim/paslex.pas b/nim/paslex.pas
index 678f3af1a..c0136e4d8 100644
--- a/nim/paslex.pas
+++ b/nim/paslex.pas
@@ -298,7 +298,7 @@ begin
       end;
       '_': inc(pos);
       '0', '1': begin
-        xi := (xi shl 1) or (ord(L.buf[pos]) - ord('0'));
+        xi := shlu(xi, 1) or (ord(L.buf[pos]) - ord('0'));
         inc(pos);
         inc(bits);
       end;
@@ -330,17 +330,17 @@ begin
       end;
       '_': inc(pos);
       '0'..'9': begin
-        xi := (xi shl 4) or (ord(L.buf[pos]) - ord('0'));
+        xi := shlu(xi, 4) or (ord(L.buf[pos]) - ord('0'));
         inc(pos);
         inc(bits, 4);
       end;
       'a'..'f': begin
-        xi := (xi shl 4) or (ord(L.buf[pos]) - ord('a') + 10);
+        xi := shlu(xi, 4) or (ord(L.buf[pos]) - ord('a') + 10);
         inc(pos);
         inc(bits, 4);
       end;
       'A'..'F': begin
-        xi := (xi shl 4) or (ord(L.buf[pos]) - ord('A') + 10);
+        xi := shlu(xi, 4) or (ord(L.buf[pos]) - ord('A') + 10);
         inc(pos);
         inc(bits, 4);
       end;
diff --git a/nim/passaux.pas b/nim/passaux.pas
new file mode 100644
index 000000000..6344efb0b
--- /dev/null
+++ b/nim/passaux.pas
@@ -0,0 +1,74 @@
+//
+//
+//           The Nimrod Compiler
+//        (c) Copyright 2008 Andreas Rumpf
+//
+//    See the file "copying.txt", included in this
+//    distribution, for details about the copyright.
+//
+unit passaux;
+
+// implements some little helper passes
+{$include 'config.inc'}
+
+interface
+
+uses
+  nsystem, strutils, ast, passes, msgs, options;
+
+function verbosePass: TPass;
+function cleanupPass: TPass;
+
+implementation
+
+function verboseOpen(s: PSym; const filename: string): PPassContext;
+begin
+  //MessageOut('compiling ' + s.name.s);
+  result := nil; // we don't need a context
+  if gVerbosity > 0 then 
+    rawMessage(hintProcessing, s.name.s);
+end;
+
+function verboseProcess(context: PPassContext; n: PNode): PNode;
+begin
+  result := n;
+  if context <> nil then InternalError('logpass: context is not nil');
+  if gVerbosity = 3 then
+    liMessage(n.info, hintProcessing, toString(ast.gid));
+end;
+
+function verbosePass: TPass;
+begin
+  initPass(result);
+  result.open := verboseOpen;
+  result.process := verboseProcess;
+end;
+
+function cleanUp(c: PPassContext; n: PNode): PNode;
+var
+  i: int;
+  s: PSym;
+begin
+  result := n;
+  case n.kind of
+    nkStmtList: begin
+      for i := 0 to sonsLen(n)-1 do {@discard} cleanup(c, n.sons[i]);
+    end;
+    nkProcDef: begin
+      if (n.sons[namePos].kind = nkSym) then begin
+        s := n.sons[namePos].sym;
+        if not astNeeded(s) then s.ast.sons[codePos] := nil; // free the memory
+      end
+    end
+    else begin end;
+  end
+end;
+
+function cleanupPass: TPass;
+begin
+  initPass(result);
+  result.process := cleanUp;
+  result.close := cleanUp;
+end;
+
+end.
diff --git a/nim/passes.pas b/nim/passes.pas
new file mode 100644
index 000000000..028cfc2a2
--- /dev/null
+++ b/nim/passes.pas
@@ -0,0 +1,216 @@
+//
+//
+//           The Nimrod Compiler
+//        (c) Copyright 2008 Andreas Rumpf
+//
+//    See the file "copying.txt", included in this
+//    distribution, for details about the copyright.
+//
+unit passes;
+
+// This module implements the passes functionality. A pass must implement the
+// `TPass` interface.
+
+interface
+
+{$include 'config.inc'}
+
+uses
+  nsystem, charsets, strutils,
+  lists, options, ast, astalgo, llstream,
+  msgs, platform, nos, condsyms, idents, rnimsyn, types,
+  extccomp, nmath, magicsys, nversion, nimsets, pnimsyn, ntime, rodread;
+
+type
+  TPassContext = object(NObject) // the pass's context
+  end;
+  PPassContext = ^TPassContext;
+
+  TPass = record {@tuple} // a pass is a tuple of procedure vars
+    open: function (module: PSym; const filename: string): PPassContext;
+    openCached: function (module: PSym; const filename: string;
+                          rd: PRodReader): PPassContext;
+    close: function (p: PPassContext; n: PNode): PNode;
+    process: function (p: PPassContext; topLevelStmt: PNode): PNode;
+  end;
+
+// ``TPass.close`` may produce additional nodes. These are passed to the other
+// close procedures. This mechanism is needed for the instantiation of
+// generics.
+ 
+procedure registerPass(const p: TPass);
+
+procedure initPass(var p: TPass);
+
+// This implements a memory preserving scheme: Top level statements are
+// processed in a pipeline. The compiler never looks at a whole module
+// any longer. However, this is simple to change, as new passes may perform
+// whole program optimizations. For now, we avoid it to save a lot of memory.
+
+procedure processModule(module: PSym; const filename: string;
+                        stream: PLLStream; rd: PRodReader);
+
+
+function astNeeded(s: PSym): bool;
+  // The ``rodwrite`` module uses this to determine if the body of a proc
+  // needs to be stored. The passes manager frees s.sons[codePos] when
+  // appropriate to free the procedure body's memory. This is important
+  // to keep memory usage down.
+
+// some passes (the semantic checker) need these:
+var
+  gImportModule: function (const filename: string): PSym;
+  gIncludeFile: function (const filename: string): PNode;
+  gIncludeTmplFile: function (const filename: string): PNode;
+
+implementation
+
+function astNeeded(s: PSym): bool;
+begin
+  if (s.kind = skProc)
+  and ([sfCompilerProc, sfCompileTime] * s.flags = [])
+  and (s.typ.callConv <> ccInline)
+  and (s.ast.sons[genericParamsPos] = nil) then
+    result := false
+  else
+    result := true
+end;
+
+const
+  maxPasses = 10;
+  
+type
+  TPassContextArray = array [0..maxPasses-1] of PPassContext;
+var
+  gPasses: array [0..maxPasses-1] of TPass;
+  gPassesLen: int;
+
+procedure registerPass(const p: TPass);
+begin
+  gPasses[gPassesLen] := p;
+  inc(gPassesLen);
+end;
+
+procedure openPasses(var a: TPassContextArray; module: PSym;
+                     const filename: string);
+var
+  i: int;
+begin
+  for i := 0 to gPassesLen-1 do
+    if assigned(gPasses[i].open) then
+      a[i] := gPasses[i].open(module, filename)
+    else
+      a[i] := nil
+end;
+
+procedure openPassesCached(var a: TPassContextArray; module: PSym;
+                           const filename: string; rd: PRodReader);
+var
+  i: int;
+begin
+  for i := 0 to gPassesLen-1 do
+    if assigned(gPasses[i].openCached) then
+      a[i] := gPasses[i].openCached(module, filename, rd)
+    else
+      a[i] := nil
+end;
+
+procedure closePasses(var a: TPassContextArray);
+var
+  i: int;
+  m: PNode;
+begin
+  m := nil;
+  for i := 0 to gPassesLen-1 do begin
+    if assigned(gPasses[i].close) then m := gPasses[i].close(a[i], m);
+    a[i] := nil; // free the memory here
+  end
+end;
+
+procedure processTopLevelStmt(n: PNode; var a: TPassContextArray);
+var
+  i: int;
+  m: PNode;
+begin
+  // this implements the code transformation pipeline
+  m := n;
+  for i := 0 to gPassesLen-1 do
+    if assigned(gPasses[i].process) then m := gPasses[i].process(a[i], m);
+end;
+
+procedure processTopLevelStmtCached(n: PNode; var a: TPassContextArray);
+var
+  i: int;
+  m: PNode;
+begin
+  // this implements the code transformation pipeline
+  m := n;
+  for i := 0 to gPassesLen-1 do
+    if assigned(gPasses[i].openCached) then m := gPasses[i].process(a[i], m);
+end;
+
+procedure closePassesCached(var a: TPassContextArray);
+var
+  i: int;
+  m: PNode;
+begin
+  m := nil;
+  for i := 0 to gPassesLen-1 do begin
+    if assigned(gPasses[i].openCached) and assigned(gPasses[i].close) then 
+      m := gPasses[i].close(a[i], m);
+    a[i] := nil; // free the memory here
+  end
+end;
+
+procedure processModule(module: PSym; const filename: string;
+                        stream: PLLStream; rd: PRodReader);
+var
+  p: TParser;
+  n: PNode;
+  a: TPassContextArray;
+  s: PLLStream;
+  i: int;
+begin
+  if rd = nil then begin
+    openPasses(a, module, filename);
+    if stream = nil then begin
+      s := LLStreamOpen(filename, fmRead);
+      if s = nil then begin
+        rawMessage(errCannotOpenFile, filename);
+        exit
+      end;
+    end
+    else
+      s := stream;
+    while true do begin
+      openParser(p, filename, s); 
+      while true do begin
+        n := parseTopLevelStmt(p);
+        if n = nil then break;
+        processTopLevelStmt(n, a)
+      end;
+      closeParser(p);
+      if s.kind <> llsStdIn then break;
+    end;
+    closePasses(a);
+    // id synchronization point for more consistent code generation:
+    IDsynchronizationPoint(1000);
+  end
+  else begin
+    openPassesCached(a, module, filename, rd);
+    n := loadInitSection(rd);
+    //MessageOut('init section' + renderTree(n));
+    for i := 0 to sonsLen(n)-1 do processTopLevelStmtCached(n.sons[i], a);
+    closePassesCached(a);
+  end;
+end;
+
+procedure initPass(var p: TPass);
+begin
+  p.open := nil;
+  p.openCached := nil;
+  p.close := nil;
+  p.process := nil;
+end;
+
+end.
diff --git a/nim/pragmas.pas b/nim/pragmas.pas
index 372d8d4a4..68bc366f1 100644
--- a/nim/pragmas.pas
+++ b/nim/pragmas.pas
@@ -197,10 +197,10 @@ begin
   while it <> nil do begin
     if it.kind = kind then begin
       if ospCaseInsensitive in platform.OS[targetOS].props then begin
-        if it.path = path then begin result := it; exit end;
+        if cmpIgnoreCase(it.path, path) = 0 then begin result := it; exit end;
       end
       else begin
-        if cmpIgnoreCase(it.path, path) = 0 then begin result := it; exit end;
+        if it.path = path then begin result := it; exit end;
       end
     end;
     it := PLib(it.next)
diff --git a/nim/ptmplsyn.pas b/nim/ptmplsyn.pas
new file mode 100644
index 000000000..2368b22c7
--- /dev/null
+++ b/nim/ptmplsyn.pas
@@ -0,0 +1,270 @@
+//
+//
+//           The Nimrod Compiler
+//        (c) Copyright 2008 Andreas Rumpf
+//
+//    See the file "copying.txt", included in this
+//    distribution, for details about the copyright.
+//
+unit ptmplsyn;
+
+// This module implements the parser of the Nimrod Template files.
+
+{$include config.inc}
+
+interface
+
+uses
+  nsystem, llstream, nos, charsets, wordrecg, strutils,
+  ast, astalgo, msgs, options, pnimsyn;
+
+function ParseTmplFile(const filename: string): PNode;
+
+
+type
+  TParseState = (psDirective, psMultiDir, psTempl);
+  TTmplParser = record
+    inp: PLLStream;
+    state: TParseState;
+    info: TLineInfo;
+    indent, par: int;
+    x: string; // the current input line
+    outp: PLLStream; // the ouput will be parsed by pnimsyn
+    subsChar: Char;
+  end;
+
+function ParseTmpl(var p: TTmplParser): PNode;
+
+procedure openTmplParser(var p: TTmplParser; const filename: string;
+                         inputStream: PLLStream);
+procedure closeTmplParser(var p: TTmplParser);
+
+implementation
+
+const
+  NimDirective = '#';
+  PatternChars = ['a'..'z', 'A'..'Z', '0'..'9', #128..#255, '.', '_'];
+
+procedure newLine(var p: TTmplParser);
+begin
+  LLStreamWrite(p.outp, repeatChar(p.par, ')'));
+  p.par := 0;
+  if p.info.line > int16(1) then LLStreamWrite(p.outp, nl);
+end;
+
+procedure parseLine(var p: TTmplParser);
+var
+  d, j, curly: int;
+  keyw: string;
+begin
+  j := strStart;
+  while p.x[j] = ' ' do inc(j);
+  if p.state = psMultiDir then begin
+    newLine(p);
+    if p.x[j] = '*' then begin
+      inc(j);
+      if p.x[j] = NimDirective then p.state := psTempl;
+      // ignore the rest of the line
+    end
+    else
+      LLStreamWrite(p.outp, p.x); // simply add the whole line
+  end
+  else if p.x[j] = NimDirective then begin
+    newLine(p);
+    inc(j);
+    while p.x[j] = ' ' do inc(j);
+    d := j;
+    if p.x[j] = '*' then begin
+      inc(j);
+      p.state := psMultiDir;
+      LLStreamWrite(p.outp, repeatChar(p.indent));
+      LLStreamWrite(p.outp, '#*');
+      LLStreamWrite(p.outp, ncopy(p.x, j)); // simply add the whole line
+    end
+    else begin
+      keyw := '';
+      while p.x[j] in PatternChars do begin
+        addChar(keyw, p.x[j]);
+        inc(j);
+      end;
+      case whichKeyword(keyw) of
+        wEnd: begin
+          if p.indent >= 2 then
+            dec(p.indent, 2)
+          else begin
+            p.info.col := int16(j);
+            liMessage(p.info, errXNotAllowedHere, 'end');
+          end;
+          LLStreamWrite(p.outp, repeatChar(p.indent));
+          LLStreamWrite(p.outp, '#end');
+        end;
+        wSubsChar: begin
+          LLStreamWrite(p.outp, repeatChar(p.indent));
+          LLStreamWrite(p.outp, '#subschar');
+          while p.x[j] = ' ' do inc(j);
+          if p.x[j] in ['+', '-', '*', '/', '<', '>', '!', '?', '^', '.',
+                 '|', '=', '%', '&', '$', '@', '~'] then p.subsChar := p.x[j]
+          else begin
+            p.info.col := int16(j);
+            liMessage(p.info, errXNotAllowedHere, p.x[j]+'');
+          end
+        end;
+        wIf, wWhen, wTry, wWhile, wFor, wBlock, wCase, wProc, wIterator,
+        wConverter, wMacro, wTemplate: begin
+          LLStreamWrite(p.outp, repeatChar(p.indent));
+          LLStreamWrite(p.outp, ncopy(p.x, d));
+          inc(p.indent, 2);
+        end;
+        wElif, wOf, wElse, wExcept, wFinally: begin
+          LLStreamWrite(p.outp, repeatChar(p.indent-2));
+          LLStreamWrite(p.outp, ncopy(p.x, d));
+        end
+        else begin
+          LLStreamWrite(p.outp, repeatChar(p.indent));
+          LLStreamWrite(p.outp, ncopy(p.x, d));
+        end
+      end;
+      p.state := psDirective;
+    end
+  end
+  else begin
+    // data line
+    j := strStart;
+    case p.state of
+      psTempl: begin
+        // next line of string literal:
+        LLStreamWrite(p.outp, ' &'+nl);
+        LLStreamWrite(p.outp, repeatChar(p.indent + 2));
+        LLStreamWrite(p.outp, '"'+'');
+      end;
+      psDirective: begin
+        newLine(p);
+        LLStreamWrite(p.outp, repeatChar(p.indent));
+        LLStreamWrite(p.outp, 'add(result, "');
+        inc(p.par);
+      end;
+      else InternalError(p.info, 'parser in invalid state');
+    end;
+    p.state := psTempl;
+    while true do begin
+      case p.x[j] of
+        #0: break;
+        #1..#31, #128..#255: begin
+          LLStreamWrite(p.outp, '\x');
+          LLStreamWrite(p.outp, toHex(ord(p.x[j]), 2));
+          inc(j);
+        end;
+        '\': begin LLStreamWrite(p.outp, '\\'); inc(j); end;
+        '''': begin LLStreamWrite(p.outp, '\'''); inc(j); end;
+        '"': begin LLStreamWrite(p.outp, '\"'); inc(j); end;
+        else if p.x[j] = p.subsChar then begin // parse Nimrod expression:
+          inc(j);
+          case p.x[j] of
+            '{': begin
+              p.info.col := int16(j);
+              LLStreamWrite(p.outp, '" & $(');
+              inc(j);
+              curly := 0;
+              while true do begin
+                case p.x[j] of
+                  #0: liMessage(p.info, errXExpected, '}'+'');
+                  '{': begin
+                    inc(j);
+                    inc(curly);
+                    LLStreamWrite(p.outp, '{'+'');
+                  end;
+                  '}': begin
+                    inc(j);
+                    if curly = 0 then break;
+                    if curly > 0 then dec(curly);
+                    LLStreamWrite(p.outp, '}'+'');
+                  end;
+                  else begin
+                    LLStreamWrite(p.outp, p.x[j]);
+                    inc(j)
+                  end
+                end
+              end;
+              LLStreamWrite(p.outp, ') & "')
+            end;
+            'A'..'Z', 'a'..'z', '_': begin
+              LLStreamWrite(p.outp, '" & $');
+              while p.x[j] in PatternChars do begin
+                LLStreamWrite(p.outp, p.x[j]);
+                inc(j)
+              end;
+              LLStreamWrite(p.outp, ' & "')
+            end;
+            else if p.x[j] = p.subsChar then begin
+              LLStreamWrite(p.outp, p.subsChar);
+              inc(j);
+            end
+            else begin
+              p.info.col := int16(j);
+              liMessage(p.info, errInvalidExpression, '$'+'');
+            end
+          end;
+        end
+        else begin
+          LLStreamWrite(p.outp, p.x[j]);
+          inc(j);
+        end
+      end
+    end;
+    LLStreamWrite(p.outp, '\n"');
+  end
+end;
+
+function ParseTmpl(var p: TTmplParser): PNode;
+var
+  q: TParser;
+begin
+  while not LLStreamAtEnd(p.inp) do begin
+    p.x := LLStreamReadLine(p.inp) {@ignore} + #0 {@emit};
+    p.info.line := p.info.line + int16(1);
+    parseLine(p);
+  end;
+  newLine(p);
+  if gVerbosity >= 2 then begin
+    rawMessage(hintCodeBegin);
+    messageOut(p.outp.s);
+    rawMessage(hintCodeEnd);
+  end;
+  openParser(q, toFilename(p.info), p.outp);
+  result := ParseModule(q);
+  closeParser(q);
+end;
+
+procedure openTmplParser(var p: TTmplParser; const filename: string;
+                         inputStream: PLLStream);
+begin
+{@ignore}
+  FillChar(p, sizeof(p), 0);
+{@emit}
+  p.info := newLineInfo(filename, 0, 0);
+  p.outp := LLStreamOpen('');
+  p.inp := inputStream;
+  p.subsChar := '$';
+end;
+
+procedure CloseTmplParser(var p: TTmplParser);
+begin
+  LLStreamClose(p.inp);
+end;
+
+function ParseTmplFile(const filename: string): PNode;
+var
+  p: TTmplParser;
+  f: TBinaryFile;
+begin
+  if not OpenFile(f, filename) then begin
+    rawMessage(errCannotOpenFile, filename);
+    result := nil;
+    exit
+  end;
+  OpenTmplParser(p, filename, LLStreamOpen(f));
+  result := ParseTmpl(p);
+  CloseTmplParser(p);
+end;
+
+end.
diff --git a/nim/rodread.pas b/nim/rodread.pas
new file mode 100644
index 000000000..549cfec58
--- /dev/null
+++ b/nim/rodread.pas
@@ -0,0 +1,1134 @@
+//
+//
+//           The Nimrod Compiler
+//        (c) Copyright 2008 Andreas Rumpf
+//
+//    See the file "copying.txt", included in this
+//    distribution, for details about the copyright.
+//
+unit rodread;
+
+// This module is responsible for loading of rod files.
+(*
+  Reading and writing binary files are really hard to debug. Therefore we use
+  a special text format. ROD-files only describe the interface of a module.
+  Thus they are smaller than the source files most of the time. Even if they
+  are bigger, they are more efficient to process because symbols are only
+  loaded on demand.
+  It consists of:
+
+  - a header:
+    NIM:$fileversion\n
+  - the module's id (even if the module changed, its ID will not!):
+    ID:Ax3\n
+  - CRC value of this module:
+    CRC:CRC-val\n
+  - a section containing the compiler options and defines this
+    module has been compiled with:
+    OPTIONS:options\n
+    DEFINES:defines\n
+  - FILES(
+    myfile.inc
+    lib/mymodA
+    )
+  - a include file dependency section:
+    INCLUDES(
+    <fileidx> <CRC of myfile.inc>\n # fileidx is the LINE in the file section!
+    )
+  - a module dependency section:
+    DEPS: <fileidx> <fileidx>\n
+  - an interface section:
+    INTERF(
+    identifier1 id\n # id is the symbol's id
+    identifier2 id\n
+    )
+  - a compiler proc section:
+    COMPILERPROCS(
+    identifier1 id\n # id is the symbol's id    
+    )
+  - an index consisting of (ID, linenumber)-pairs:
+    INDEX(
+    id-diff idx-diff\n
+    id-diff idx-diff\n
+    )
+  - an import index consisting of (ID, moduleID)-pairs:
+    IMPORTS(
+    id-diff moduleID-diff\n
+    id-diff moduleID-diff\n
+    )
+  - a list of all exported type converters because they are needed for correct
+    semantic checking:
+    CONVERTERS:id id\n   # position of the symbol in the DATA section
+  - an AST section that contains the module's AST:
+    INIT(
+    idx\n  # position of the node in the DATA section
+    idx\n
+    )
+  - a data section, where each type, symbol or AST is stored.
+    DATA(
+    type
+    (node)
+    sym
+    )
+
+  We now also do index compression, because an index always needs to be read.
+*)
+
+interface
+
+{$include 'config.inc'}
+
+uses
+  sysutils, nsystem, nos, options, strutils, nversion, ast, astalgo, msgs,
+  platform, condsyms, ropes, idents, crc;
+
+type
+  TReasonForRecompile = (
+    rrEmpty,     // used by moddeps module
+    rrNone,      // no need to recompile
+    rrRodDoesNotExist, // rod file does not exist
+    rrRodInvalid, // rod file is invalid
+    rrCrcChange, // file has been edited since last recompilation
+    rrDefines,   // defines have changed
+    rrOptions,   // options have changed
+    rrInclDeps,  // an include has changed
+    rrModDeps    // a module this module depends on has been changed
+  );
+const
+  reasonToFrmt: array [TReasonForRecompile] of string = (
+    '',
+    'no need to recompile: $1',
+    'symbol file for $1 does not exist',
+    'symbol file for $1 has the wrong version',
+    'file edited since last compilation: $1',
+    'list of conditional symbols changed for: $1',
+    'list of options changed for: $1',
+    'an include file edited: $1',
+    'a module $1 depends on has changed'
+  );
+
+type
+  TIndex = record // an index with compression
+    lastIdxKey, lastIdxVal: int;
+    tab: TIITable;
+    r: PRope;     // writers use this
+    offset: int;  // readers use this
+  end;
+  TRodReader = object(NObject)
+    pos: int;    // position; used for parsing
+    s: string;   // the whole file in memory
+    options: TOptions;
+    reason: TReasonForRecompile;
+    modDeps: TStringSeq;
+    files: TStringSeq;
+    dataIdx: int;       // offset of start of data section
+    convertersIdx: int; // offset of start of converters section
+    initIdx, interfIdx, compilerProcsIdx: int;
+    filename: string;
+    index, imports: TIndex;
+    readerIndex: int;
+    line: int;          // only used for debugging, but is always in the code
+    moduleID: int;
+    syms: TIdTable;     // already processed symbols
+  end;
+  PRodReader = ^TRodReader;
+
+const
+  FileVersion = '1012'; // modify this if the rod-format changes!
+
+var
+  rodCompilerprocs: TStrTable; // global because this is needed by magicsys
+
+
+function handleSymbolFile(module: PSym; const filename: string): PRodReader;
+function GetCRC(const filename: string): TCrc32;
+
+function loadInitSection(r: PRodReader): PNode;
+
+procedure loadStub(s: PSym);
+
+function encodeInt(x: BiggestInt): PRope;
+function encode(const s: string): PRope;
+
+implementation
+
+var
+  gTypeTable: TIdTable;
+
+function rrGetSym(r: PRodReader; id: int; const info: TLineInfo): PSym; forward;
+  // `info` is only used for debugging purposes
+
+function rrGetType(r: PRodReader; id: int; const info: TLineInfo): PType; forward;
+
+function decode(r: PRodReader): string; forward;
+function decodeInt(r: PRodReader): int; forward;
+function decodeBInt(r: PRodReader): biggestInt; forward;
+
+function encode(const s: string): PRope;
+var
+  i: int;
+  res: string;
+begin
+  res := '';
+  for i := strStart to length(s)+strStart-1 do begin
+    case s[i] of
+      '0'..'9', 'a'..'z', 'A'..'Z', '_':
+        addChar(res, s[i]);
+      else
+        res := res +{&} '\' +{&} toHex(ord(s[i]), 2)
+    end
+  end;
+  result := toRope(res);
+end;
+
+procedure encodeIntAux(var str: string; x: BiggestInt);
+const
+  chars: string =
+    '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
+var
+  v, rem: biggestInt;
+  d: char;
+  idx: int;
+begin
+  v := x;
+  rem := v mod 190;
+  if (rem < 0) then begin
+    str := str + '-';
+    v := -(v div 190);
+    rem := -rem;
+  end
+  else
+    v := v div 190;
+  idx := int(rem);
+  if idx < 62 then d := chars[idx+strStart]
+  else d := chr(idx - 62 + 128);
+  if (v <> 0) then encodeIntAux(str, v);
+  addChar(str, d);
+end;
+
+function encodeInt(x: BiggestInt): PRope;
+var
+  res: string;
+begin
+  res := '';
+  encodeIntAux(res, x);
+  result := toRope(res);
+end;
+
+
+procedure decodeLineInfo(r: PRodReader; var info: TLineInfo);
+begin
+  if r.s[r.pos] = '?' then begin
+    inc(r.pos);
+    if r.s[r.pos] = ',' then
+      info.col := int16(-1)
+    else
+      info.col := int16(decodeInt(r));
+    if r.s[r.pos] = ',' then begin
+      inc(r.pos);
+      if r.s[r.pos] = ',' then info.line := int16(-1)
+      else info.line := int16(decodeInt(r));
+      if r.s[r.pos] = ',' then begin
+        inc(r.pos);
+        info := newLineInfo(r.files[decodeInt(r)], info.line, info.col);
+      end
+    end
+  end
+end;
+
+function decodeNode(r: PRodReader; const fInfo: TLineInfo): PNode;
+var
+  id: int;
+  fl: string;
+begin
+  result := nil;
+  if r.s[r.pos] = '(' then begin
+    inc(r.pos);
+    if r.s[r.pos] = ')' then begin
+      inc(r.pos); exit; // nil node
+    end;
+    result := newNodeI(TNodeKind(decodeInt(r)), fInfo);
+    decodeLineInfo(r, result.info);
+    if r.s[r.pos] = '$' then begin
+      inc(r.pos);
+      result.flags := {@cast}TNodeFlags(int32(decodeInt(r)));
+    end;
+    if r.s[r.pos] = '^' then begin
+      inc(r.pos);
+      id := decodeInt(r);
+      result.typ := rrGetType(r, id, result.info);
+    end;
+    case result.kind of
+      nkCharLit..nkInt64Lit: begin
+        if r.s[r.pos] = '!' then begin
+          inc(r.pos);
+          result.intVal := decodeBInt(r);
+        end
+      end;
+      nkFloatLit..nkFloat64Lit: begin
+        if r.s[r.pos] = '!' then begin
+          inc(r.pos);
+          fl := decode(r);
+          result.floatVal := parseFloat(fl);
+        end
+      end;
+      nkStrLit..nkTripleStrLit: begin
+        if r.s[r.pos] = '!' then begin
+          inc(r.pos);
+          result.strVal := decode(r);
+        end
+        else
+          result.strVal := ''; // BUGFIX
+      end;
+      nkIdent: begin
+        if r.s[r.pos] = '!' then begin
+          inc(r.pos);
+          fl := decode(r);
+          result.ident := getIdent(fl);
+        end
+        else
+          internalError(result.info, 'decodeNode: nkIdent');
+      end;
+      nkSym: begin
+        if r.s[r.pos] = '!' then begin
+          inc(r.pos);
+          id := decodeInt(r);
+          result.sym := rrGetSym(r, id, result.info);
+        end
+        else
+          internalError(result.info, 'decodeNode: nkSym');
+      end;
+      else begin
+        while r.s[r.pos] <> ')' do
+          addSon(result, decodeNode(r, result.info));
+      end
+    end;
+    if r.s[r.pos] = ')' then inc(r.pos)
+    else internalError(result.info, 'decodeNode');
+  end
+  else InternalError(result.info, 'decodeNode ' + r.s[r.pos])
+end;
+
+procedure decodeLoc(r: PRodReader; var loc: TLoc; const info: TLineInfo);
+begin
+  if r.s[r.pos] = '<' then begin
+    inc(r.pos);
+    if r.s[r.pos] in ['0'..'9', 'a'..'z', 'A'..'Z'] then
+      loc.k := TLocKind(decodeInt(r))
+    else
+      loc.k := low(loc.k);
+    if r.s[r.pos] = '*' then begin
+      inc(r.pos);
+      loc.s := TStorageLoc(decodeInt(r));
+    end
+    else
+      loc.s := low(loc.s);
+    if r.s[r.pos] = '$' then begin
+      inc(r.pos);
+      loc.flags := {@cast}TLocFlags(int32(decodeInt(r)));
+    end
+    else
+      loc.flags := {@set}[];
+    if r.s[r.pos] = '^' then begin
+      inc(r.pos);
+      loc.t := rrGetType(r, decodeInt(r), info);
+    end
+    else
+      loc.t := nil;
+    if r.s[r.pos] = '!' then begin
+      inc(r.pos);
+      loc.r := toRope(decode(r));
+    end
+    else
+      loc.r := nil;
+    if r.s[r.pos] = '?' then begin
+      inc(r.pos);
+      loc.a := decodeInt(r);
+    end
+    else
+      loc.a := 0;
+    if r.s[r.pos] = '>' then inc(r.pos)
+    else InternalError(info, 'decodeLoc ' + r.s[r.pos]);
+  end
+end;
+
+function decodeType(r: PRodReader; const info: TLineInfo): PType;
+var
+  d: int;
+begin
+  result := nil;
+  if r.s[r.pos] = '[' then begin
+    inc(r.pos);
+    if r.s[r.pos] = ']' then begin
+      inc(r.pos); exit; // nil type
+    end;
+  end;
+  new(result);
+{@ignore}
+  FillChar(result^, sizeof(result^), 0);
+{@emit}
+  result.kind := TTypeKind(decodeInt(r));
+  if r.s[r.pos] = '+' then begin
+    inc(r.pos);
+    result.id := decodeInt(r);
+    setId(result.id);
+    if debugIds then registerID(result);
+  end
+  else
+    InternalError(info, 'decodeType: no id');
+  IdTablePut(gTypeTable, result, result); // here this also
+  // avoids endless recursion for recursive type
+  if r.s[r.pos] = '(' then
+    result.n := decodeNode(r, UnknownLineInfo());
+  if r.s[r.pos] = '$' then begin
+    inc(r.pos);
+    result.flags := {@cast}TTypeFlags(int32(decodeInt(r)));
+  end;
+  if r.s[r.pos] = '?' then begin
+    inc(r.pos);
+    result.callConv := TCallingConvention(decodeInt(r));
+  end;
+  if r.s[r.pos] = '*' then begin
+    inc(r.pos);
+    result.owner := rrGetSym(r, decodeInt(r), info);
+  end;
+  if r.s[r.pos] = '&' then begin
+    inc(r.pos);
+    result.sym := rrGetSym(r, decodeInt(r), info);
+  end;
+  if r.s[r.pos] = '/' then begin
+    inc(r.pos);
+    result.size := decodeInt(r);
+  end
+  else result.size := -1;
+  if r.s[r.pos] = '=' then begin
+    inc(r.pos);
+    result.align := decodeInt(r);
+  end
+  else result.align := 2;
+  if r.s[r.pos] = '@' then begin
+    inc(r.pos);
+    result.containerID := decodeInt(r);
+  end;
+  decodeLoc(r, result.loc, info);
+  while r.s[r.pos] = '^' do begin
+    inc(r.pos);
+    if r.s[r.pos] = '(' then begin
+      inc(r.pos);
+      if r.s[r.pos] = ')' then inc(r.pos)
+      else InternalError(info, 'decodeType ^(' + r.s[r.pos]);
+      addSon(result, nil);
+    end
+    else begin
+      d := decodeInt(r);
+      addSon(result, rrGetType(r, d, info));
+    end;
+  end
+end;
+
+function decodeLib(r: PRodReader): PLib;
+begin
+  result := nil;
+  if r.s[r.pos] = '|' then begin
+    new(result);
+  {@ignore}
+    fillChar(result^, sizeof(result^), 0);
+  {@emit}
+    inc(r.pos);
+    result.kind := TLibKind(decodeInt(r));
+    if r.s[r.pos] <> '|' then InternalError('decodeLib: 1');
+    inc(r.pos);
+    result.name := toRope(decode(r));
+    if r.s[r.pos] <> '|' then InternalError('decodeLib: 2');
+    inc(r.pos);
+    result.path := decode(r);
+  end
+end;
+
+function decodeSym(r: PRodReader; const info: TLineInfo): PSym;
+var
+  k: TSymKind;
+  id: int;
+  ident: PIdent;
+begin
+  result := nil;
+  if r.s[r.pos] = '{' then begin
+    inc(r.pos);
+    if r.s[r.pos] = '}' then begin
+      inc(r.pos); exit; // nil sym
+    end
+  end;
+  k := TSymKind(decodeInt(r));
+  if r.s[r.pos] = '+' then begin
+    inc(r.pos);
+    id := decodeInt(r);
+    setId(id);
+  end
+  else
+    InternalError(info, 'decodeSym: no id');
+  if r.s[r.pos] = '&' then begin
+    inc(r.pos);
+    ident := getIdent(decode(r));
+  end
+  else
+    InternalError(info, 'decodeSym: no ident');
+  result := PSym(IdTableGet(r.syms, id));
+  if result = nil then begin
+    new(result);
+  {@ignore}
+    FillChar(result^, sizeof(result^), 0);
+  {@emit}
+    result.id := id;
+    IdTablePut(r.syms, result, result);
+    if debugIds then registerID(result);
+  end
+  else if (result.id <> id) then
+    InternalError(info, 'decodeSym: wrong id');
+  result.kind := k;
+  result.name := ident;
+  // read the rest of the symbol description:
+  if r.s[r.pos] = '^' then begin
+    inc(r.pos);
+    result.typ := rrGetType(r, decodeInt(r), info);
+  end;
+  decodeLineInfo(r, result.info);
+  if r.s[r.pos] = '*' then begin
+    inc(r.pos);
+    result.owner := rrGetSym(r, decodeInt(r), result.info);
+  end;
+  if r.s[r.pos] = '$' then begin
+    inc(r.pos);
+    result.flags := {@cast}TSymFlags(int32(decodeInt(r)));
+  end;
+  if r.s[r.pos] = '@' then begin
+    inc(r.pos);
+    result.magic := TMagic(decodeInt(r));
+  end;
+  if r.s[r.pos] = '(' then
+    result.ast := decodeNode(r, result.info);
+  if r.s[r.pos] = '!' then begin
+    inc(r.pos);
+    result.options := {@cast}TOptions(int32(decodeInt(r)));
+  end
+  else
+    result.options := r.options;
+  if r.s[r.pos] = '%' then begin
+    inc(r.pos);
+    result.position := decodeInt(r);
+  end
+  else
+    result.position := 0; // BUGFIX: this may have been misused as reader index!
+  if r.s[r.pos] = '`' then begin
+    inc(r.pos);
+    result.offset := decodeInt(r);
+  end
+  else
+    result.offset := -1;
+  decodeLoc(r, result.loc, result.info);
+  result.annex := decodeLib(r);
+end;
+
+function decodeInt(r: PRodReader): int; // base 190 numbers
+var
+  i: int;
+  sign: int;
+begin
+  i := r.pos;
+  sign := -1;
+  assert(r.s[i] in ['0'..'9', 'a'..'z', 'A'..'Z', '-', #128..#255]);
+  if r.s[i] = '-' then begin
+    inc(i);
+    sign := 1
+  end;
+  result := 0;
+  while true do begin
+    case r.s[i] of
+      '0'..'9': result := result * 190 - (ord(r.s[i]) - ord('0'));
+      'a'..'z': result := result * 190 - (ord(r.s[i]) - ord('a') + 10);
+      'A'..'Z': result := result * 190 - (ord(r.s[i]) - ord('A') + 36);
+      #128..#255: result := result * 190 - (ord(r.s[i]) - 128 + 62);
+      else break;
+    end;
+    inc(i)
+  end;
+  result := result * sign;
+  r.pos := i
+end;
+
+function decodeBInt(r: PRodReader): biggestInt;
+var
+  i: int;
+  sign: biggestInt;
+begin
+  i := r.pos;
+  sign := -1;
+  assert(r.s[i] in ['0'..'9', 'a'..'z', 'A'..'Z', '-', #128..#255]);
+  if r.s[i] = '-' then begin
+    inc(i);
+    sign := 1
+  end;
+  result := 0;
+  while true do begin
+    case r.s[i] of
+      '0'..'9': result := result * 190 - (ord(r.s[i]) - ord('0'));
+      'a'..'z': result := result * 190 - (ord(r.s[i]) - ord('a') + 10);
+      'A'..'Z': result := result * 190 - (ord(r.s[i]) - ord('A') + 36);
+      #128..#255: result := result * 190 - (ord(r.s[i]) - 128 + 62);
+      else break;
+    end;
+    inc(i)
+  end;
+  result := result * sign;
+  r.pos := i
+end;
+
+procedure hexChar(c: char; var xi: int);
+begin
+  case c of
+    '0'..'9': xi := (xi shl 4) or (ord(c) - ord('0'));
+    'a'..'f': xi := (xi shl 4) or (ord(c) - ord('a') + 10);
+    'A'..'F': xi := (xi shl 4) or (ord(c) - ord('A') + 10);
+    else begin end
+  end
+end;
+
+function decode(r: PRodReader): string;
+var
+  i, xi: int;
+begin
+  i := r.pos;
+  result := '';
+  while true do begin
+    case r.s[i] of
+      '\': begin
+        inc(i, 3); xi := 0;
+        hexChar(r.s[i-2], xi);
+        hexChar(r.s[i-1], xi);
+        addChar(result, chr(xi));
+      end;
+      'a'..'z', '0'..'9', 'A'..'Z', '_': begin
+        addChar(result, r.s[i]);
+        inc(i);
+      end
+      else break
+    end
+  end;
+  r.pos := i;
+end;
+
+procedure skipSection(r: PRodReader);
+var
+  c: int;
+begin
+  if r.s[r.pos] = ':' then begin
+    while r.s[r.pos] > #10 do inc(r.pos);
+  end
+  else if r.s[r.pos] = '(' then begin
+    c := 0; // count () pairs
+    inc(r.pos);
+    while true do begin
+      case r.s[r.pos] of
+        #10: inc(r.line);
+        '(': inc(c);
+        ')': begin
+          if c = 0 then begin inc(r.pos); break end
+          else if c > 0 then dec(c);
+        end;
+        #0: break; // end of file
+        else begin end;
+      end;
+      inc(r.pos);
+    end
+  end
+  else
+    InternalError('skipSection ' + toString(r.line));
+end;
+
+function rdWord(r: PRodReader): string;
+begin
+  result := '';
+  while r.s[r.pos] in ['A'..'Z', '_', 'a'..'z', '0'..'9'] do begin
+    addChar(result, r.s[r.pos]);
+    inc(r.pos);
+  end;
+end;
+
+function newStub(r: PRodReader; const name: string; id: int): PSym;
+begin
+  new(result);
+{@ignore}
+  fillChar(result^, sizeof(result^), 0);
+{@emit}
+  result.kind := skStub;
+  result.id := id;
+  result.name := getIdent(name);
+  result.position := r.readerIndex;
+  setID(id);
+  //MessageOut(result.name.s);
+  if debugIds then registerID(result);
+end;
+
+procedure processInterf(r: PRodReader; module: PSym);
+var
+  s: PSym;
+  w: string;
+  key: int;
+begin
+  if r.interfIdx = 0 then InternalError('processInterf');
+  r.pos := r.interfIdx;
+  while (r.s[r.pos] > #10) and (r.s[r.pos] <> ')') do begin
+    w := decode(r);
+    inc(r.pos);
+    key := decodeInt(r);
+    inc(r.pos); // #10
+    s := newStub(r, w, key);
+    s.owner := module;
+    StrTableAdd(module.tab, s);
+    IdTablePut(r.syms, s, s);
+  end;
+end;
+
+procedure processCompilerProcs(r: PRodReader; module: PSym);
+var
+  s: PSym;
+  w: string;
+  key: int;
+begin
+  if r.compilerProcsIdx = 0 then InternalError('processCompilerProcs');
+  r.pos := r.compilerProcsIdx;
+  while (r.s[r.pos] > #10) and (r.s[r.pos] <> ')') do begin
+    w := decode(r);
+    inc(r.pos);
+    key := decodeInt(r);
+    inc(r.pos); // #10
+    s := PSym(IdTableGet(r.syms, key));
+    if s = nil then begin
+      s := newStub(r, w, key);
+      s.owner := module;
+      IdTablePut(r.syms, s, s);
+    end;
+    StrTableAdd(rodCompilerProcs, s);
+  end;
+end;
+
+procedure processIndex(r: PRodReader; var idx: TIndex);
+var
+  key, val, tmp: int;
+begin
+  inc(r.pos, 2); // skip "(\10"
+  inc(r.line);
+  while (r.s[r.pos] > #10) and (r.s[r.pos] <> ')') do begin
+    tmp := decodeInt(r);
+    if r.s[r.pos] = ' ' then begin
+      inc(r.pos);
+      key := idx.lastIdxKey + tmp;
+      val := decodeInt(r) + idx.lastIdxVal;
+    end
+    else begin
+      key := idx.lastIdxKey + 1;
+      val := tmp + idx.lastIdxVal;
+    end;
+    IITablePut(idx.tab, key, val);
+    idx.lastIdxKey := key;
+    idx.lastIdxVal := val;
+    setID(key); // ensure that this id will not be used
+    if r.s[r.pos] = #10 then begin inc(r.pos); inc(r.line) end;
+  end;
+  if r.s[r.pos] = ')' then inc(r.pos);
+end;
+
+procedure processRodFile(r: PRodReader; crc: TCrc32);
+var
+  section, w: string;
+  d, L, inclCrc: int;
+begin
+  while r.s[r.pos] <> #0 do begin
+    section := rdWord(r);
+    if r.reason <> rrNone then break; // no need to process this file further
+    if section = 'CRC' then begin
+      inc(r.pos); // skip ':'
+      if int(crc) <> decodeInt(r) then
+        r.reason := rrCrcChange
+    end
+    else if section = 'ID' then begin
+      inc(r.pos); // skip ':'
+      r.moduleID := decodeInt(r);
+      setID(r.moduleID);
+    end
+    else if section = 'OPTIONS' then begin
+      inc(r.pos); // skip ':'
+      r.options := {@cast}TOptions(int32(decodeInt(r)));
+      if options.gOptions <> r.options then r.reason := rrOptions
+    end
+    else if section = 'DEFINES' then begin
+      inc(r.pos); // skip ':'
+      d := 0;
+      while r.s[r.pos] > #10 do begin
+        w := decode(r);
+        inc(d);
+        if not condsyms.isDefined(getIdent(w)) then begin
+          r.reason := rrDefines;
+          //MessageOut('not defined, but should: ' + w);
+        end;
+        if r.s[r.pos] = ' ' then inc(r.pos);
+      end;
+      if (d <> countDefinedSymbols()) then
+        r.reason := rrDefines
+    end
+    else if section = 'FILES' then begin
+      inc(r.pos, 2); // skip "(\10"
+      inc(r.line);
+      L := 0;
+      while (r.s[r.pos] > #10) and (r.s[r.pos] <> ')') do begin
+        setLength(r.files, L+1);
+        r.files[L] := decode(r);
+        inc(r.pos); // skip #10
+        inc(r.line);
+        inc(L);
+      end;
+      if r.s[r.pos] = ')' then inc(r.pos);
+    end
+    else if section = 'INCLUDES' then begin
+      inc(r.pos, 2); // skip "(\10"
+      inc(r.line);
+      while (r.s[r.pos] > #10) and (r.s[r.pos] <> ')') do begin
+        w := r.files[decodeInt(r)];
+        inc(r.pos); // skip ' '
+        inclCrc := decodeInt(r);
+        if r.reason = rrNone then begin
+          if not ExistsFile(w) or (inclCrc <> int(crcFromFile(w))) then
+            r.reason := rrInclDeps
+        end;
+        if r.s[r.pos] = #10 then begin inc(r.pos); inc(r.line) end;
+      end;
+      if r.s[r.pos] = ')' then inc(r.pos);
+    end
+    else if section = 'DEPS' then begin
+      inc(r.pos); // skip ':'
+      L := 0;
+      while (r.s[r.pos] > #10) do begin
+        setLength(r.modDeps, L+1);
+        r.modDeps[L] := r.files[decodeInt(r)];
+        inc(L);
+        if r.s[r.pos] = ' ' then inc(r.pos);
+      end;
+    end
+    else if section = 'INTERF' then begin
+      r.interfIdx := r.pos+2;
+      skipSection(r);
+    end
+    else if section = 'COMPILERPROCS' then begin
+      r.compilerProcsIdx := r.pos+2;
+      skipSection(r);
+    end
+    else if section = 'INDEX' then begin
+      processIndex(r, r.index);
+    end
+    else if section = 'IMPORTS' then begin
+      processIndex(r, r.imports);
+    end
+    else if section = 'CONVERTERS' then begin
+      r.convertersIdx := r.pos+1;
+      skipSection(r);
+    end
+    else if section = 'DATA' then begin
+      r.dataIdx := r.pos+2; // "(\10"
+      // We do not read the DATA section here! We read the needed objects on
+      // demand.
+      skipSection(r);
+    end
+    else if section = 'INIT' then begin
+      r.initIdx := r.pos+2; // "(\10"
+      skipSection(r);
+    end
+    else begin
+      MessageOut('skipping section: ' + toString(r.pos));
+      skipSection(r);
+    end;
+    if r.s[r.pos] = #10 then begin inc(r.pos); inc(r.line) end;
+  end
+end;
+
+function newRodReader(const modfilename: string; crc: TCrc32;
+                      readerIndex: int): PRodReader;
+var
+  version: string;
+  r: PRodReader;
+begin
+  new(result);
+{@ignore}
+  fillChar(result^, sizeof(result^), 0);
+{@emit result.files := @[];}
+{@emit result.modDeps := @[];}
+  r := result;
+  r.reason := rrNone;
+  r.pos := strStart;
+  r.line := 1;
+  r.readerIndex := readerIndex;
+  r.filename := modfilename;    
+  InitIdTable(r.syms);
+  r.s := readFile(modfilename) {@ignore} + #0 {@emit};
+  if startsWith(r.s, 'NIM:') then begin
+    initIITable(r.index.tab);
+    initIITable(r.imports.tab);
+    // looks like a ROD file
+    inc(r.pos, 4);
+    version := '';
+    while not (r.s[r.pos] in [#0,#10]) do begin
+      addChar(version, r.s[r.pos]);
+      inc(r.pos);
+    end;
+    if r.s[r.pos] = #10 then inc(r.pos);
+    if version = FileVersion then begin
+      // since ROD files are only for caching, no backwarts compability is
+      // needed
+      processRodFile(r, crc);
+    end
+    else
+      result := nil
+  end
+  else
+    result := nil;
+end;
+
+function rrGetType(r: PRodReader; id: int; const info: TLineInfo): PType;
+var
+  oldPos, d: int;
+begin
+  result := PType(IdTableGet(gTypeTable, id));
+  if result = nil then begin
+    // load the type:
+    oldPos := r.pos;
+    d := IITableGet(r.index.tab, id);
+    if d = invalidKey then InternalError(info, 'rrGetType');
+    r.pos := d + r.dataIdx;
+    result := decodeType(r, info);
+    r.pos := oldPos;
+  end;
+end;
+
+type
+  TFileModuleRec = record
+    filename: string;
+    reason: TReasonForRecompile;
+    rd: PRodReader;
+    crc: TCrc32;
+  end;
+  TFileModuleMap = array of TFileModuleRec;
+var
+  gMods: TFileModuleMap = {@ignore} nil {@emit @[]}; // all compiled modules
+
+function decodeSymSafePos(rd: PRodReader; offset: int;
+                          const info: TLineInfo): PSym;
+var
+  oldPos: int;
+begin
+  if rd.dataIdx = 0 then InternalError(info, 'dataIdx == 0');
+  oldPos := rd.pos;
+  rd.pos := offset + rd.dataIdx;
+  result := decodeSym(rd, info);
+  rd.pos := oldPos;
+end;
+
+function rrGetSym(r: PRodReader; id: int; const info: TLineInfo): PSym;
+var
+  d, i, moduleID: int;
+  rd: PRodReader;
+begin
+  result := PSym(IdTableGet(r.syms, id));
+  if result = nil then begin
+    // load the symbol:
+    d := IITableGet(r.index.tab, id);
+    if d = invalidKey then begin
+      moduleID := IiTableGet(r.imports.tab, id);
+      if moduleID < 0 then
+        InternalError(info,
+          'missing from both indexes: +' + ropeToStr(encodeInt(id)));
+      // find the reader with the correct moduleID:
+      for i := 0 to high(gMods) do begin
+        rd := gMods[i].rd;
+        if (rd <> nil) then begin
+          if (rd.moduleID = moduleID) then begin
+            d := IITableGet(rd.index.tab, id);
+            if d <> invalidKey then begin
+              result := decodeSymSafePos(rd, d, info);
+              break
+            end
+            else
+              InternalError(info,
+                'rrGetSym: no reader found: +' + ropeToStr(encodeInt(id)));
+          end
+          else begin
+            //if IiTableGet(rd.index.tab, id) <> invalidKey then
+            // XXX expensive check!
+              //InternalError(info,
+              //'id found in other module: +' + ropeToStr(encodeInt(id)))
+          end
+        end
+      end;
+    end
+    else begin
+      // own symbol:
+      result := decodeSymSafePos(r, d, info);
+    end;
+  end;
+  if (result <> nil) and (result.kind = skStub) then loadStub(result);
+end;
+
+function loadInitSection(r: PRodReader): PNode;
+var
+  d, oldPos, p: int;
+begin
+  if (r.initIdx = 0) or (r.dataIdx = 0) then InternalError('loadInitSection');
+  oldPos := r.pos;
+  r.pos := r.initIdx;
+  result := newNode(nkStmtList);
+  while (r.s[r.pos] > #10) and (r.s[r.pos] <> ')') do begin
+    d := decodeInt(r);
+    inc(r.pos); // #10
+    p := r.pos;
+    r.pos := d + r.dataIdx;
+    addSon(result, decodeNode(r, UnknownLineInfo()));
+    r.pos := p;
+  end;
+  r.pos := oldPos;
+end;
+
+procedure loadConverters(r: PRodReader);
+var
+  d: int;
+begin
+  // We have to ensure that no exported converter is a stub anymore.
+  if (r.convertersIdx = 0) or (r.dataIdx = 0) then
+    InternalError('importConverters');
+  r.pos := r.convertersIdx;
+  while (r.s[r.pos] > #10) do begin
+    d := decodeInt(r);
+    {@discard} rrGetSym(r, d, UnknownLineInfo());
+    if r.s[r.pos] = ' ' then inc(r.pos)
+  end;
+end;
+
+function getModuleIdx(const filename: string): int;
+var
+  i: int;
+begin
+  for i := 0 to high(gMods) do
+    if sameFile(gMods[i].filename, filename) then begin
+      result := i; exit
+    end;
+  // not found, reserve space:
+  result := length(gMods);
+  setLength(gMods, result+1);
+end;
+
+function checkDep(const filename: string): TReasonForRecompile;
+var
+  crc: TCrc32;
+  r: PRodReader;
+  rodfile: string;
+  idx, i: int;
+  res: TReasonForRecompile;
+begin
+  idx := getModuleIdx(filename);
+  if gMods[idx].reason <> rrEmpty then begin
+    // reason has already been computed for this module:
+    result := gMods[idx].reason; exit
+  end;
+  crc := crcFromFile(filename);
+  gMods[idx].reason := rrNone; // we need to set it here to avoid cycles
+  gMods[idx].filename := filename;
+  gMods[idx].crc := crc;
+  result := rrNone;
+  r := nil;
+  rodfile := toGeneratedFile(filename, RodExt);
+  if ExistsFile(rodfile) then begin
+    r := newRodReader(rodfile, crc, idx);
+    if r = nil then
+      result := rrRodInvalid
+    else begin
+      result := r.reason;
+      if result = rrNone then begin
+        // check modules it depends on
+        // NOTE: we need to process the entire module graph so that no ID will
+        // be used twice! However, compilation speed does not suffer much from
+        // this, since results are cached.
+        res := checkDep(JoinPath(options.libpath, 
+                        appendFileExt('system', nimExt)));
+        if res <> rrNone then result := rrModDeps;
+        for i := 0 to high(r.modDeps) do begin
+          res := checkDep(r.modDeps[i]);
+          if res <> rrNone then begin
+            result := rrModDeps;
+            //break // BUGFIX: cannot break here!
+          end
+        end
+      end
+    end
+  end
+  else
+    result := rrRodDoesNotExist;
+  if (result <> rrNone) and (gVerbosity > 0) then
+    MessageOut(format(reasonToFrmt[result], [filename]));
+  if (result <> rrNone) or (optForceFullMake in gGlobalOptions) then begin
+    // recompilation is necessary:
+    r := nil;
+  end;
+  gMods[idx].rd := r;
+  gMods[idx].reason := result; // now we know better
+end;
+
+function handleSymbolFile(module: PSym; const filename: string): PRodReader;
+var
+  idx: int;
+begin
+  if not (optSymbolFiles in gGlobalOptions) then begin
+    module.id := getID();
+    result := nil;
+    exit
+  end;
+  {@discard} checkDep(filename);
+  idx := getModuleIdx(filename);
+  if gMods[idx].reason = rrEmpty then InternalError('handleSymbolFile');
+  result := gMods[idx].rd;
+  if result <> nil then begin
+    module.id := result.moduleID;
+    IdTablePut(result.syms, module, module);
+    processInterf(result, module);
+    processCompilerProcs(result, module);
+    loadConverters(result);
+  end
+  else
+    module.id := getID();
+end;
+
+function GetCRC(const filename: string): TCrc32;
+var
+  idx: int;
+begin
+  idx := getModuleIdx(filename);
+  result := gMods[idx].crc;
+end;
+
+procedure loadStub(s: PSym);
+var
+  rd: PRodReader;
+  d, theId: int;
+  rs: PSym;
+begin
+  if s.kind <> skStub then InternalError('loadStub');
+  //MessageOut('loading stub: ' + s.name.s);
+  rd := gMods[s.position].rd;
+  theId := s.id; // used for later check
+  d := IITableGet(rd.index.tab, s.id);
+  if d = invalidKey then InternalError('loadStub: invalid key');
+  rs := decodeSymSafePos(rd, d, UnknownLineInfo());
+  if rs <> s then InternalError(rs.info, 'loadStub: wrong symbol')
+  else if rs.id <> theId then InternalError(rs.info, 'loadStub: wrong ID');
+  //MessageOut('loaded stub: ' + s.name.s);
+end;
+
+initialization
+  InitIdTable(gTypeTable);
+  InitStrTable(rodCompilerProcs);
+end.
diff --git a/nim/rodwrite.pas b/nim/rodwrite.pas
new file mode 100644
index 000000000..64f3d6733
--- /dev/null
+++ b/nim/rodwrite.pas
@@ -0,0 +1,609 @@
+//
+//
+//           The Nimrod Compiler
+//        (c) Copyright 2008 Andreas Rumpf
+//
+//    See the file "copying.txt", included in this
+//    distribution, for details about the copyright.
+//
+unit rodwrite;
+
+// This module is responsible for writing of rod files. Note that writing of
+// rod files is a pass, reading of rod files is not! This is why reading and
+// writing of rod files is split into two different modules.
+
+interface
+
+{$include 'config.inc'}
+
+uses
+  sysutils, nsystem, nos, options, strutils, nversion, ast, astalgo, msgs,
+  platform, condsyms, ropes, idents, crc, rodread, passes, importer;
+
+function rodwritePass(): TPass;
+
+implementation
+
+type
+  TRodWriter = object(TPassContext)
+    module: PSym;
+    crc: TCrc32;
+    options: TOptions;
+    defines: PRope;
+    inclDeps: PRope;
+    modDeps: PRope;
+    interf: PRope;
+    compilerProcs: PRope;
+    index, imports: TIndex;
+    converters: PRope;
+    init: PRope;
+    data: PRope;
+    filename: string;
+    sstack: TSymSeq;  // a stack of symbols to process
+    tstack: TTypeSeq; // a stack of types to process
+    files: TStringSeq;
+  end;
+  PRodWriter = ^TRodWriter;
+
+function newRodWriter(const modfilename: string; crc: TCrc32;
+                      module: PSym): PRodWriter; forward;
+procedure addModDep(w: PRodWriter; const dep: string); forward;
+procedure addInclDep(w: PRodWriter; const dep: string); forward;
+procedure addInterfaceSym(w: PRodWriter; s: PSym); forward;
+procedure addStmt(w: PRodWriter; n: PNode); forward;
+procedure writeRod(w: PRodWriter); forward;
+
+function encodeStr(w: PRodWriter; const s: string): PRope;
+begin
+  result := encode(s)
+end;
+
+procedure processStacks(w: PRodWriter); forward;
+
+function getDefines: PRope;
+var
+  it: TTabIter;
+  s: PSym;
+begin
+  s := InitTabIter(it, gSymbols);
+  result := nil;
+  while s <> nil do begin
+    if s.position = 1 then begin
+      if result <> nil then app(result, ' '+'');
+      app(result, s.name.s);
+    end;
+    s := nextIter(it, gSymbols);
+  end
+end;
+
+function fileIdx(w: PRodWriter; const filename: string): int;
+var
+  i: int;
+begin
+  for i := 0 to high(w.files) do begin
+    if w.files[i] = filename then begin result := i; exit end;
+  end;
+  result := length(w.files);
+  setLength(w.files, result+1);
+  w.files[result] := filename;
+end;
+
+function newRodWriter(const modfilename: string; crc: TCrc32;
+                      module: PSym): PRodWriter;
+begin
+  new(result);
+{@ignore}
+  fillChar(result^, sizeof(result^), 0);
+{@emit
+  result.sstack := @[];}
+{@emit
+  result.tstack := @[];}
+  InitIITable(result.index.tab);
+  InitIITable(result.imports.tab);
+  result.filename := modfilename;
+  result.crc := crc;
+  result.module := module;
+  result.defines := getDefines();
+  result.options := options.gOptions;
+  {@emit result.files := @[];}
+end;
+
+procedure addModDep(w: PRodWriter; const dep: string);
+begin
+  if w.modDeps <> nil then app(w.modDeps, ' '+'');
+  app(w.modDeps, encodeInt(fileIdx(w, dep)));
+end;
+
+const
+  rodNL = #10+'';
+
+procedure addInclDep(w: PRodWriter; const dep: string);
+begin
+  app(w.inclDeps, encodeInt(fileIdx(w, dep)));
+  app(w.inclDeps, ' '+'');
+  app(w.inclDeps, encodeInt(crcFromFile(dep)));
+  app(w.inclDeps, rodNL);
+end;
+
+procedure pushType(w: PRodWriter; t: PType);
+var
+  L: int;
+begin
+  // check so that the stack does not grow too large:
+  if IiTableGet(w.index.tab, t.id) = invalidKey then begin
+    L := length(w.tstack);
+    setLength(w.tstack, L+1);
+    w.tstack[L] := t;
+  end
+end;
+
+procedure pushSym(w: PRodWriter; s: PSym);
+var
+  L: int;
+begin
+  // check so that the stack does not grow too large:
+  if IiTableGet(w.index.tab, s.id) = invalidKey then begin
+    L := length(w.sstack);
+    setLength(w.sstack, L+1);
+    w.sstack[L] := s;
+  end
+end;
+
+function encodeNode(w: PRodWriter; const fInfo: TLineInfo; n: PNode): PRope;
+var
+  i: int;
+  f: TNodeFlags;
+begin
+  if n = nil then begin
+    // nil nodes have to be stored too:
+    result := toRope('()'); exit
+  end;
+  result := toRope('('+'');
+  app(result, encodeInt(ord(n.kind)));
+  // we do not write comments for now
+  // Line information takes easily 20% or more of the filesize! Therefore we
+  // omit line information if it is the same as the father's line information:
+  if (finfo.fileIndex <> n.info.fileIndex) then
+    appf(result, '?$1,$2,$3', [encodeInt(n.info.col), encodeInt(n.info.line),
+                               encodeInt(fileIdx(w, toFilename(n.info)))])
+  else if (finfo.line <> n.info.line) then
+    appf(result, '?$1,$2', [encodeInt(n.info.col), encodeInt(n.info.line)])
+  else if (finfo.col <> n.info.col) then
+    appf(result, '?$1', [encodeInt(n.info.col)]);
+    // No need to output the file index, as this is the serialization of one
+    // file.
+  f := n.flags * PersistentNodeFlags;
+  if f <> {@set}[] then
+    appf(result, '$$$1', [encodeInt({@cast}int32(f))]);
+  if n.typ <> nil then begin
+    appf(result, '^$1', [encodeInt(n.typ.id)]);
+    pushType(w, n.typ);
+  end;
+  case n.kind of
+    nkCharLit..nkInt64Lit: begin
+      if n.intVal <> 0 then
+        appf(result, '!$1', [encodeInt(n.intVal)]);
+    end;
+    nkFloatLit..nkFloat64Lit: begin
+      if n.floatVal <> 0.0 then
+        appf(result, '!$1', [encodeStr(w, toStringF(n.floatVal))]);
+    end;
+    nkStrLit..nkTripleStrLit: begin
+      if n.strVal <> '' then
+        appf(result, '!$1', [encodeStr(w, n.strVal)]);
+    end;
+    nkIdent:
+      appf(result, '!$1', [encodeStr(w, n.ident.s)]);
+    nkSym: begin
+      appf(result, '!$1', [encodeInt(n.sym.id)]);
+      pushSym(w, n.sym);
+    end;
+    else begin
+      for i := 0 to sonsLen(n)-1 do
+        app(result, encodeNode(w, n.info, n.sons[i]));
+    end
+  end;
+  app(result, ')'+'');
+end;
+
+function encodeLoc(w: PRodWriter; const loc: TLoc): PRope;
+begin
+  result := nil;
+  if loc.k <> low(loc.k) then
+    app(result, encodeInt(ord(loc.k)));
+  if loc.s <> low(loc.s) then
+    appf(result, '*$1', [encodeInt(ord(loc.s))]);
+  if loc.flags <> {@set}[] then
+    appf(result, '$$$1', [encodeInt({@cast}int32(loc.flags))]);
+  if loc.t <> nil then begin
+    appf(result, '^$1', [encodeInt(loc.t.id)]);
+    pushType(w, loc.t);
+  end;
+  if loc.r <> nil then
+    appf(result, '!$1', [encodeStr(w, ropeToStr(loc.r))]);
+  if loc.a <> 0 then
+    appf(result, '?$1', [encodeInt(loc.a)]);
+  if result <> nil then
+    result := ropef('<$1>', [result]);
+end;
+
+function encodeType(w: PRodWriter; t: PType): PRope;
+var
+  i: int;
+begin
+  if t = nil then begin
+    // nil nodes have to be stored too:
+    result := toRope('[]'); exit
+  end;
+  result := nil;
+  if t.kind = tyForward then InternalError('encodeType: tyForward');
+  app(result, encodeInt(ord(t.kind)));
+  appf(result, '+$1', [encodeInt(t.id)]);
+  if t.n <> nil then
+    app(result, encodeNode(w, UnknownLineInfo(), t.n));
+  if t.flags <> {@set}[] then
+    appf(result, '$$$1', [encodeInt({@cast}int32(t.flags))]);
+  if t.callConv <> low(t.callConv) then
+    appf(result, '?$1', [encodeInt(ord(t.callConv))]);
+  if t.owner <> nil then begin
+    appf(result, '*$1', [encodeInt(t.owner.id)]);
+    pushSym(w, t.owner);
+  end;
+  if t.sym <> nil then begin
+    appf(result, '&$1', [encodeInt(t.sym.id)]);
+    pushSym(w, t.sym);
+  end;
+  if t.size <> -1 then appf(result, '/$1', [encodeInt(t.size)]);
+  if t.align <> 2 then appf(result, '=$1', [encodeInt(t.align)]);
+  if t.containerID <> 0 then
+    appf(result, '@$1', [encodeInt(t.containerID)]);
+  app(result, encodeLoc(w, t.loc));
+  for i := 0 to sonsLen(t)-1 do begin
+    if t.sons[i] = nil then
+      app(result, '^()')
+    else begin
+      appf(result, '^$1', [encodeInt(t.sons[i].id)]);
+      pushType(w, t.sons[i]);
+    end
+  end;
+end;
+
+function encodeLib(w: PRodWriter; lib: PLib): PRope;
+begin
+  result := nil;
+  appf(result, '|$1', [encodeInt(ord(lib.kind))]);
+  appf(result, '|$1', [encodeStr(w, ropeToStr(lib.name))]);
+  appf(result, '|$1', [encodeStr(w, lib.path)]);
+end;
+
+function encodeSym(w: PRodWriter; s: PSym): PRope;
+var
+  codeAst: PNode;
+  col, line: PRope;
+begin
+  codeAst := nil;
+  if s = nil then begin
+    // nil nodes have to be stored too:
+    result := toRope('{}'); exit
+  end;
+  result := nil;
+  app(result, encodeInt(ord(s.kind)));
+  appf(result, '+$1', [encodeInt(s.id)]);
+  appf(result, '&$1', [encodeStr(w, s.name.s)]);
+  if s.typ <> nil then begin
+    appf(result, '^$1', [encodeInt(s.typ.id)]);
+    pushType(w, s.typ);
+  end;
+  if s.info.col = int16(-1) then col := nil
+  else col := encodeInt(s.info.col);
+  if s.info.line = int16(-1) then line := nil
+  else line := encodeInt(s.info.line);
+  appf(result, '?$1,$2,$3', [col, line,
+       encodeInt(fileIdx(w, toFilename(s.info)))]);
+  if s.owner <> nil then begin
+    appf(result, '*$1', [encodeInt(s.owner.id)]);
+    pushSym(w, s.owner);
+  end;
+  if s.flags <> {@set}[] then
+    appf(result, '$$$1', [encodeInt({@cast}int32(s.flags))]);
+  if s.magic <> mNone then
+    appf(result, '@$1', [encodeInt(ord(s.magic))]);
+  if (s.ast <> nil) then begin
+    if not astNeeded(s) then begin
+      codeAst := s.ast.sons[codePos];
+      s.ast.sons[codePos] := nil;
+    end;
+    app(result, encodeNode(w, s.info, s.ast));
+    if codeAst <> nil then // restore code ast
+      s.ast.sons[codePos] := codeAst;
+  end;
+  if s.options <> w.options then
+    appf(result, '!$1', [encodeInt({@cast}int32(s.options))]);
+  if s.position <> 0 then
+    appf(result, '%$1', [encodeInt(s.position)]);
+  if s.offset <> -1 then
+    appf(result, '`$1', [encodeInt(s.offset)]);
+  app(result, encodeLoc(w, s.loc));
+  if s.annex <> nil then
+    app(result, encodeLib(w, s.annex));
+end;
+
+procedure addToIndex(var w: TIndex; key, val: int);
+begin
+  if key - w.lastIdxKey = 1 then begin
+    // we do not store a key-diff of 1 to safe space
+    app(w.r, encodeInt(val - w.lastIdxVal));
+    app(w.r, rodNL);
+  end
+  else
+    appf(w.r, '$1 $2'+rodNL, [encodeInt(key - w.lastIdxKey),
+                              encodeInt(val - w.lastIdxVal)]);
+  w.lastIdxKey := key;
+  w.lastIdxVal := val;
+  IiTablePut(w.tab, key, val);
+end;
+
+var
+  debugWritten: TIntSet;
+
+procedure symStack(w: PRodWriter);
+var
+  i, L: int;
+  s, m: PSym;
+begin
+  i := 0;
+  while i < length(w.sstack) do begin
+    s := w.sstack[i];
+    if IiTableGet(w.index.tab, s.id) = invalidKey then begin
+      m := getModule(s);
+      if m = nil then InternalError('symStack: module nil: ' + s.name.s);
+      if (m.id = w.module.id) or (sfFromGeneric in s.flags) then begin
+        // put definition in here
+        L := ropeLen(w.data);
+        addToIndex(w.index, s.id, L);
+        //intSetIncl(debugWritten, s.id);
+        app(w.data, encodeSym(w, s));
+        app(w.data, rodNL);
+        if sfInInterface in s.flags then
+          appf(w.interf, '$1 $2'+rodNL, [encode(s.name.s), encodeInt(s.id)]);
+        if sfCompilerProc in s.flags then
+          appf(w.compilerProcs, '$1 $2'+rodNL, [encode(s.name.s), encodeInt(s.id)]);
+        if s.kind = skConverter then begin
+          if w.converters <> nil then app(w.converters, ' '+'');
+          app(w.converters, encodeInt(s.id))
+        end
+      end
+      else if IiTableGet(w.imports.tab, s.id) = invalidKey then begin
+        addToIndex(w.imports, s.id, m.id);
+        //if not IntSetContains(debugWritten, s.id) then begin 
+        //  MessageOut(w.filename);
+        //  debug(s.owner);
+        //  debug(s);
+        //  InternalError('BUG!!!!');
+        //end
+      end
+    end;
+    inc(i);
+  end;
+  setLength(w.sstack, 0);
+end;
+
+procedure typeStack(w: PRodWriter);
+var
+  i, L: int;
+begin
+  i := 0;
+  while i < length(w.tstack) do begin
+    if IiTableGet(w.index.tab, w.tstack[i].id) = invalidKey then begin
+      L := ropeLen(w.data);
+      addToIndex(w.index, w.tstack[i].id, L);
+      app(w.data, encodeType(w, w.tstack[i]));
+      app(w.data, rodNL);
+    end;
+    inc(i);
+  end;
+  setLength(w.tstack, 0);
+end;
+
+procedure processStacks(w: PRodWriter);
+begin
+  while (length(w.tstack) > 0) or (length(w.sstack) > 0) do begin
+    symStack(w);
+    typeStack(w);
+  end
+end;
+
+procedure rawAddInterfaceSym(w: PRodWriter; s: PSym);
+begin
+  pushSym(w, s);
+  processStacks(w);
+end;
+
+procedure addInterfaceSym(w: PRodWriter; s: PSym);
+begin
+  if w = nil then exit;
+  if [sfInInterface, sfCompilerProc] * s.flags <> [] then begin
+    rawAddInterfaceSym(w, s);
+  end
+end;
+
+procedure addStmt(w: PRodWriter; n: PNode);
+begin
+  app(w.init, encodeInt(ropeLen(w.data)));
+  app(w.init, rodNL);
+  app(w.data, encodeNode(w, UnknownLineInfo(), n));
+  app(w.data, rodNL);
+  processStacks(w);
+end;
+
+procedure writeRod(w: PRodWriter);
+var
+  content: PRope;
+  i: int;
+begin
+  processStacks(w);
+  // write header:
+  content := toRope('NIM:');
+  app(content, toRope(FileVersion));
+  app(content, rodNL);
+  app(content, toRope('ID:'));
+  app(content, encodeInt(w.module.id));
+  app(content, rodNL);
+  app(content, toRope('CRC:'));
+  app(content, encodeInt(w.crc));
+  app(content, rodNL);
+  app(content, toRope('OPTIONS:'));
+  app(content, encodeInt({@cast}int32(w.options)));
+  app(content, rodNL);
+  app(content, toRope('DEFINES:'));
+  app(content, w.defines);
+  app(content, rodNL);
+  app(content, toRope('FILES('+rodNL));
+  for i := 0 to high(w.files) do begin
+    app(content, encode(w.files[i]));
+    app(content, rodNL);
+  end;
+  app(content, toRope(')'+rodNL));
+  app(content, toRope('INCLUDES('+rodNL));
+  app(content, w.inclDeps);
+  app(content, toRope(')'+rodNL));
+  app(content, toRope('DEPS:'));
+  app(content, w.modDeps);
+  app(content, rodNL);
+  app(content, toRope('INTERF('+rodNL));
+  app(content, w.interf);
+  app(content, toRope(')'+rodNL));
+  app(content, toRope('COMPILERPROCS('+rodNL));
+  app(content, w.compilerProcs);
+  app(content, toRope(')'+rodNL));
+  app(content, toRope('INDEX('+rodNL));
+  app(content, w.index.r);
+  app(content, toRope(')'+rodNL));
+  app(content, toRope('IMPORTS('+rodNL));
+  app(content, w.imports.r);
+  app(content, toRope(')'+rodNL));
+  app(content, toRope('CONVERTERS:'));
+  app(content, w.converters);
+  app(content, toRope(rodNL));
+  app(content, toRope('INIT('+rodNL));
+  app(content, w.init);
+  app(content, toRope(')'+rodNL));
+  app(content, toRope('DATA('+rodNL));
+  app(content, w.data);
+  app(content, toRope(')'+rodNL));
+
+  //MessageOut('interf ' + ToString(ropeLen(w.interf)));
+  //MessageOut('index ' + ToString(ropeLen(w.indexRope)));
+  //MessageOut('init ' + ToString(ropeLen(w.init)));
+  //MessageOut('data ' + ToString(ropeLen(w.data)));
+
+  writeRope(content,
+            completeGeneratedFilePath(changeFileExt(w.filename, 'rod')));
+end;
+
+function process(c: PPassContext; n: PNode): PNode;
+var
+  i, j: int;
+  w: PRodWriter;
+  a: PNode;
+  s: PSym;
+begin
+  result := n;
+  if c = nil then exit;
+  w := PRodWriter(c);
+  case n.kind of 
+    nkStmtList: begin
+      for i := 0 to sonsLen(n)-1 do {@discard} process(c, n.sons[i]);
+    end;
+    nkTemplateDef, nkMacroDef: begin
+      s := n.sons[namePos].sym;
+      addInterfaceSym(w, s);    
+    end; 
+    nkProcDef, nkIteratorDef, nkConverterDef: begin
+      s := n.sons[namePos].sym;
+      if s = nil then InternalError(n.info, 'rodwrite.process');
+      if (n.sons[codePos] <> nil) or (s.magic <> mNone)
+      or not (sfForward in s.flags) then begin
+        addInterfaceSym(w, s);
+      end
+    end;
+    nkVarSection: begin
+      for i := 0 to sonsLen(n)-1 do begin
+        a := n.sons[i];
+        if a.kind <> nkIdentDefs then InternalError(a.info, 'rodwrite.process');
+        addInterfaceSym(w, a.sons[0].sym);
+      end
+    end;
+    nkConstSection: begin
+      for i := 0 to sonsLen(n)-1 do begin
+        a := n.sons[i];
+        if a.kind <> nkConstDef then InternalError(a.info, 'rodwrite.process');
+        addInterfaceSym(w, a.sons[0].sym);
+      end
+    end;
+    nkTypeSection: begin
+      for i := 0 to sonsLen(n)-1 do begin
+        a := n.sons[i];
+        if a.sons[0].kind <> nkSym then
+          InternalError(a.info, 'rodwrite.process');
+        s := a.sons[0].sym;
+        addInterfaceSym(w, s); // this takes care of enum fields too
+        // Note: The check for ``s.typ.kind = tyEnum`` is wrong for enum
+        // type aliasing! Otherwise the same enum symbol would be included
+        // several times!
+        (*
+        if (a.sons[2] <> nil) and (a.sons[2].kind = nkEnumTy) then begin
+          a := s.typ.n;
+          for j := 0 to sonsLen(a)-1 do 
+            addInterfaceSym(w, a.sons[j].sym);        
+        end *)
+      end
+    end;
+    nkImportStmt: begin
+      for i := 0 to sonsLen(n)-1 do addModDep(w, getModuleFile(n.sons[i]));
+      addStmt(w, n);
+    end;
+    nkFromStmt: begin
+      addModDep(w, getModuleFile(n.sons[0]));
+      addStmt(w, n);
+    end;
+    nkIncludeStmt: begin
+      for i := 0 to sonsLen(n)-1 do addInclDep(w, getModuleFile(n.sons[i]));
+    end;
+    nkPragma: addStmt(w, n);
+    else begin end
+  end;
+end;
+
+function myOpen(module: PSym; const filename: string): PPassContext;
+var
+  w: PRodWriter;
+begin
+  if module.id < 0 then InternalError('rodwrite: module ID not set');
+  w := newRodWriter(filename, rodread.GetCRC(filename), module);
+  rawAddInterfaceSym(w, module);
+  result := w;
+end;
+
+function myClose(c: PPassContext; n: PNode): PNode;
+var
+  w: PRodWriter;
+begin
+  w := PRodWriter(c);
+  writeRod(w);
+  result := n;
+end;
+
+function rodwritePass(): TPass;
+begin
+  initPass(result);
+  if optSymbolFiles in gGlobalOptions then begin
+    result.open := myOpen;
+    result.close := myClose;
+    result.process := process;
+  end
+end;
+
+initialization
+  IntSetInit(debugWritten);
+end.
diff --git a/nim/rst.pas b/nim/rst.pas
index b5e5846b1..cc92e41eb 100644
--- a/nim/rst.pas
+++ b/nim/rst.pas
@@ -469,19 +469,24 @@ end;
 
 // ---------------------------------------------------------------
 
-function addNodes(n: PRstNode): string;
+procedure addNodesAux(n: PRstNode; var result: string);
 var
   i: int;
 begin
   if n.kind = rnLeaf then
-    result := n.text
+    add(result, n.text)
   else begin
-    result := '';
     for i := 0 to rsonsLen(n)-1 do
-      result := result +{&} addNodes(n.sons[i])
+      addNodesAux(n.sons[i], result)
   end
 end;
 
+function addNodes(n: PRstNode): string;
+begin
+  result := '';
+  addNodesAux(n, result);
+end;
+
 procedure rstnodeToRefnameAux(n: PRstNode; var r: string; var b: bool);
 var
   i: int;
@@ -1118,7 +1123,7 @@ begin
     inc(p.idx);
     while p.tok[p.idx].kind in [tkWord, tkPunct, tkAdornment, tkOther] do begin
       if p.tok[p.idx].symbol = '::' then break;
-      result := result +{&} p.tok[p.idx].symbol;
+      add(result, p.tok[p.idx].symbol);
       inc(p.idx);
     end;
     if (p.tok[p.idx].kind = tkWhite) then inc(p.idx);
@@ -1287,12 +1292,13 @@ begin
             break;
           end
           else begin
-            n.text := n.text +{&} nl +{&} repeatChar(p.tok[p.idx].ival - indent);
+            add(n.text, nl);
+            add(n.text, repeatChar(p.tok[p.idx].ival - indent));
             inc(p.idx)
           end
         end
         else begin
-          n.text := n.text +{&} p.tok[p.idx].symbol;
+          add(n.text, p.tok[p.idx].symbol);
           inc(p.idx)
         end
       end
@@ -1300,7 +1306,7 @@ begin
   end
   else begin
     while not (p.tok[p.idx].kind in [tkIndent, tkEof]) do begin
-      n.text := n.text +{&} p.tok[p.idx].symbol;
+      add(n.text, p.tok[p.idx].symbol);
       inc(p.idx)
     end
   end;
@@ -1560,7 +1566,7 @@ begin
       i := 0;
       while not (p.tok[p.idx].kind in [tkIndent, tkEof]) do begin
         if (tokEnd(p) <= cols[i]) then begin
-          row[i] := row[i] +{&} p.tok[p.idx].symbol;
+          add(row[i], p.tok[p.idx].symbol);
           inc(p.idx);
         end
         else begin
diff --git a/nim/scanner.pas b/nim/scanner.pas
index 98bb54c07..83f5c12b0 100644
--- a/nim/scanner.pas
+++ b/nim/scanner.pas
@@ -10,12 +10,11 @@ unit scanner;
 
 // This scanner is handwritten for efficiency. I used an elegant buffering
 // scheme which I have not seen anywhere else:
-// We guarantee that a hole line is in the buffer (too long lines are reported
-// as an error). Thus only when scanning the \n or \r character we have
-// to check wether we need to read in the next chunk. (\n or \r already need
-// special handling for incrementing the line counter; choosing both \n and \r
-// allows the scanner to properly read Unix, DOS or Macintosh text files, even
-// when it is not the native format.
+// We guarantee that a whole line is in the buffer. Thus only when scanning
+// the \n or \r character we have to check wether we need to read in the next 
+// chunk. (\n or \r already need special handling for incrementing the line
+// counter; choosing both \n and \r allows the scanner to properly read Unix,
+// DOS or Macintosh text files, even when it is not the native format.
 
 interface
 
@@ -29,7 +28,7 @@ uses
 const
   MaxLineLength = 80; // lines longer than this lead to a warning
 
-  numChars: TCharSet = ['0'..'9','a'..'z','A'..'Z']; // we support up to base 36
+  numChars: TCharSet = ['0'..'9','a'..'z','A'..'Z'];
   SymChars: TCharSet = ['a'..'z', 'A'..'Z', '0'..'9', #128..#255];
   SymStartChars: TCharSet = ['a'..'z', 'A'..'Z', #128..#255];
   OpChars: TCharSet = ['+', '-', '*', '/', '<', '>', '!', '?', '^', '.',
@@ -436,7 +435,7 @@ begin
               end;
               '_': inc(pos);
               '0', '1': begin
-                xi := (xi shl 1) or (ord(L.buf[pos]) - ord('0'));
+                xi := shlu(xi, 1) or (ord(L.buf[pos]) - ord('0'));
                 inc(pos);
               end;
               else break;
@@ -453,7 +452,7 @@ begin
               end;
               '_': inc(pos);
               '0'..'7': begin
-                xi := (xi shl 3) or (ord(L.buf[pos]) - ord('0'));
+                xi := shlu(xi, 3) or (ord(L.buf[pos]) - ord('0'));
                 inc(pos);
               end;
               else break;
@@ -471,15 +470,15 @@ begin
               end;
               '_': inc(pos);
               '0'..'9': begin
-                xi := (xi shl 4) or (ord(L.buf[pos]) - ord('0'));
+                xi := shlu(xi, 4) or (ord(L.buf[pos]) - ord('0'));
                 inc(pos);
               end;
               'a'..'f': begin
-                xi := (xi shl 4) or (ord(L.buf[pos]) - ord('a') + 10);
+                xi := shlu(xi, 4) or (ord(L.buf[pos]) - ord('a') + 10);
                 inc(pos);
               end;
               'A'..'F': begin
-                xi := (xi shl 4) or (ord(L.buf[pos]) - ord('A') + 10);
+                xi := shlu(xi, 4) or (ord(L.buf[pos]) - ord('A') + 10);
                 inc(pos);
               end;
               else break;
@@ -490,8 +489,14 @@ begin
       end;
       // now look at the optional type suffix:
       case result.tokType of
-        tkIntLit..tkInt64Lit:
+        tkIntLit, tkInt64Lit:
           result.iNumber := xi;
+        tkInt8Lit:
+          result.iNumber := biggestInt(int8(toU8(int(xi))));
+        tkInt16Lit:
+          result.iNumber := biggestInt(toU16(int(xi)));
+        tkInt32Lit:
+          result.iNumber := biggestInt(toU32(xi));
         tkFloat32Lit:
           result.fNumber := ({@cast}PFloat32(addr(xi)))^;
           // note: this code is endian neutral!
@@ -525,6 +530,8 @@ begin
   {@emit}
     on EOverflow do
       lexMessage(L, errNumberOutOfRange, result.literal);
+    on EOutOfRange do
+      lexMessage(L, errNumberOutOfRange, result.literal);      
   end;
   L.bufpos := endpos;
 end;
diff --git a/nim/semdata.pas b/nim/semdata.pas
new file mode 100644
index 000000000..f920fae2a
--- /dev/null
+++ b/nim/semdata.pas
@@ -0,0 +1,254 @@
+//
+//
+//           The Nimrod Compiler
+//        (c) Copyright 2008 Andreas Rumpf
+//
+//    See the file "copying.txt", included in this
+//    distribution, for details about the copyright.
+//
+unit semdata;
+
+// This module contains the data structures for the semantic checking phase.
+
+interface
+
+{$include 'config.inc'}
+
+uses
+  sysutils, nsystem, charsets, strutils,
+  lists, options, scanner, ast, astalgo, trees, treetab, wordrecg,
+  ropes, msgs, platform, nos, condsyms, idents, rnimsyn, types,
+  extccomp, nmath, magicsys, nversion, nimsets, pnimsyn, ntime, passes,
+  rodread;
+
+type
+  TOptionEntry = object(lists.TListEntry)
+    // entries to put on a stack for pragma parsing
+    options: TOptions;
+    defaultCC: TCallingConvention;
+    dynlib: PLib;
+    Notes: TNoteKinds;
+  end;
+  POptionEntry = ^TOptionEntry;
+
+  TProcCon = record          // procedure context; also used for top-level
+                             // statements
+    owner: PSym;             // the symbol this context belongs to
+    resultSym: PSym;         // the result symbol (if we are in a proc)
+    nestedLoopCounter: int;  // whether we are in a loop or not
+    nestedBlockCounter: int; // whether we are in a block or not
+  end;
+  PProcCon = ^TProcCon;
+
+  PContext = ^TContext;
+  TContext = object(TPassContext) // a context represents a module
+    module: PSym;            // the module sym belonging to the context
+    tab: TSymTab;            // each module has its own symbol table
+    AmbigiousSymbols: TIntSet; // contains ids of all ambigious symbols (cannot
+                               // store this info in the syms themselves!)
+    generics: PNode;         // a list of the things to compile; list of
+                             // nkExprEqExpr nodes which contain the generic
+                             // symbol and the instantiated symbol
+    converters: TSymSeq;     // sequence of converters
+    optionStack: TLinkedList;
+    libs: TLinkedList;       // all libs used by this module
+    p: PProcCon;             // procedure context
+    fromCache: bool;         // is the module read from a cache?
+    semConstExpr: function (c: PContext; n: PNode): PNode;
+      // for the pragmas module
+  end;
+
+function newContext(module: PSym; const nimfile: string): PContext;
+function newProcCon(owner: PSym): PProcCon;
+
+function lastOptionEntry(c: PContext): POptionEntry;
+function newOptionEntry(): POptionEntry;
+
+procedure addConverter(c: PContext; conv: PSym);
+
+function newLib(kind: TLibKind): PLib;
+procedure addToLib(lib: PLib; sym: PSym);
+
+function makePtrType(c: PContext; baseType: PType): PType;
+function makeVarType(c: PContext; baseType: PType): PType;
+
+function newTypeS(const kind: TTypeKind; c: PContext): PType;
+procedure fillTypeS(dest: PType; const kind: TTypeKind; c: PContext);
+function makeRangeType(c: PContext; first, last: biggestInt;
+                       const info: TLineInfo): PType;
+
+procedure illFormedAst(n: PNode);
+function getSon(n: PNode; indx: int): PNode;
+procedure checkSonsLen(n: PNode; len: int);
+procedure checkMinSonsLen(n: PNode; len: int);
+
+// owner handling:
+function getCurrOwner(): PSym;
+procedure PushOwner(owner: PSym);
+procedure PopOwner;
+
+implementation
+
+var
+  gOwners: array of PSym; // owner stack (used for initializing the
+                          // owner field of syms)
+                          // the documentation comment always gets
+                          // assigned to the current owner
+                          // BUGFIX: global array is needed!
+{@emit gOwners := @[]; }
+
+function getCurrOwner(): PSym;
+begin
+  result := gOwners[high(gOwners)];
+end;
+
+procedure PushOwner(owner: PSym);
+var
+  len: int;
+begin
+  len := length(gOwners);
+  setLength(gOwners, len+1);
+  gOwners[len] := owner;
+end;
+
+procedure PopOwner;
+var
+  len: int;
+begin
+  len := length(gOwners);
+  if (len <= 0) then InternalError('popOwner');
+  setLength(gOwners, len - 1);
+end;
+
+function lastOptionEntry(c: PContext): POptionEntry;
+begin
+  result := POptionEntry(c.optionStack.tail);
+end;
+
+function newProcCon(owner: PSym): PProcCon;
+begin
+  new(result);
+{@ignore}
+  fillChar(result^, sizeof(result^), 0);
+{@emit}
+  result.owner := owner;
+end;
+
+function newOptionEntry(): POptionEntry;
+begin
+  new(result);
+{@ignore}
+  fillChar(result^, sizeof(result^), 0);
+{@emit}
+  result.options := gOptions;
+  result.defaultCC := ccDefault;
+  result.dynlib := nil;
+  result.notes := gNotes;
+end;
+
+function newContext(module: PSym; const nimfile: string): PContext;
+begin
+  new(result);
+{@ignore}
+  fillChar(result^, sizeof(result^), 0);
+{@emit}
+  InitSymTab(result.tab);
+  IntSetInit(result.AmbigiousSymbols);
+  initLinkedList(result.optionStack);
+  initLinkedList(result.libs);
+  append(result.optionStack, newOptionEntry());
+  result.module := module;
+  result.generics := newNode(nkStmtList);
+{@emit result.converters := @[];}
+end;
+
+procedure addConverter(c: PContext; conv: PSym);
+var
+  i, L: int;
+begin
+  L := length(c.converters);
+  for i := 0 to L-1 do
+    if c.converters[i].id = conv.id then exit;
+  setLength(c.converters, L+1);
+  c.converters[L] := conv;
+end;
+
+
+function newLib(kind: TLibKind): PLib;
+begin
+  new(result);
+{@ignore}
+  fillChar(result^, sizeof(result^), 0);
+{@emit}
+  result.kind := kind;
+  //initObjectSet(result.syms)
+end;
+
+procedure addToLib(lib: PLib; sym: PSym);
+begin
+  //ObjectSetIncl(lib.syms, sym);
+  if sym.annex <> nil then liMessage(sym.info, errInvalidPragma);
+  sym.annex := lib
+end;
+
+function makePtrType(c: PContext; baseType: PType): PType;
+begin
+  if (baseType = nil) then InternalError('makePtrType');
+  result := newTypeS(tyPtr, c);
+  addSon(result, baseType);
+end;
+
+function makeVarType(c: PContext; baseType: PType): PType;
+begin
+  if (baseType = nil) then InternalError('makeVarType');
+  result := newTypeS(tyVar, c);
+  addSon(result, baseType);
+end;
+
+function newTypeS(const kind: TTypeKind; c: PContext): PType;
+begin
+  result := newType(kind, getCurrOwner())
+end;
+
+procedure fillTypeS(dest: PType; const kind: TTypeKind; c: PContext);
+begin
+  dest.kind := kind;
+  dest.owner := getCurrOwner();
+  dest.size := -1;
+end;
+
+function makeRangeType(c: PContext; first, last: biggestInt;
+                       const info: TLineInfo): PType;
+var
+  n: PNode;
+begin
+  n := newNodeI(nkRange, info);
+  addSon(n, newIntNode(nkIntLit, first));
+  addSon(n, newIntNode(nkIntLit, last));
+  result := newTypeS(tyRange, c);
+  result.n := n;
+  addSon(result, getSysType(tyInt)); // basetype of range
+end;
+
+procedure illFormedAst(n: PNode);
+begin
+  liMessage(n.info, errIllFormedAstX, renderTree(n, {@set}[renderNoComments]));
+end;
+
+function getSon(n: PNode; indx: int): PNode;
+begin
+  if (n <> nil) and (indx < sonsLen(n)) then result := n.sons[indx]
+  else begin illFormedAst(n); result := nil end;
+end;
+
+procedure checkSonsLen(n: PNode; len: int);
+begin
+  if (n = nil) or (sonsLen(n) <> len) then illFormedAst(n);
+end;
+
+procedure checkMinSonsLen(n: PNode; len: int);
+begin
+  if (n = nil) or (sonsLen(n) < len) then illFormedAst(n);
+end;
+
+end.
diff --git a/nim/semexprs.pas b/nim/semexprs.pas
index 26e63c845..2c5672f7f 100644
--- a/nim/semexprs.pas
+++ b/nim/semexprs.pas
@@ -637,7 +637,7 @@ begin
         Consider::
           const x = []
           proc p(a: openarray[int], i: int)
-          proc q(a: sequence[char], c: char)
+          proc q(a: openarray[char], c: char)
           p(x, 0)
           q(x, '\0')
 
diff --git a/nim/semfold.pas b/nim/semfold.pas
index 9c27c3a16..fa2e97635 100644
--- a/nim/semfold.pas
+++ b/nim/semfold.pas
@@ -122,7 +122,7 @@ begin
     end;
     mZe8ToI, mZe8ToI64, mZe16ToI, mZe16ToI64, mZe32ToI64, mZeIToI64: begin
       // byte(-128) = 1...1..1000_0000'64 --> 0...0..1000_0000'64
-      result := newIntNodeT(getInt(a) and (1 shl a.typ.size*8 - 1), n);
+      result := newIntNodeT(getInt(a) and (shlu(1, getSize(a.typ)*8) - 1), n);
     end;
     mToU8:  result := newIntNodeT(getInt(a) and $ff, n);
     mToU16: result := newIntNodeT(getInt(a) and $ffff, n);
@@ -142,8 +142,26 @@ begin
       if getInt(a) > getInt(b) then result := newIntNodeT(getInt(a), n)
       else result := newIntNodeT(getInt(b), n);
     end;
-    mShlI, mShlI64: result := newIntNodeT(getInt(a) shl getInt(b), n);
-    mShrI, mShrI64: result := newIntNodeT(getInt(a) shr getInt(b), n);
+    mShlI, mShlI64: begin
+      case skipGenericRange(n.typ).kind of
+        tyInt8:  result := newIntNodeT(int8(getInt(a)) shl int8(getInt(b)), n);
+        tyInt16: result := newIntNodeT(int16(getInt(a)) shl int16(getInt(b)), n);
+        tyInt32: result := newIntNodeT(int32(getInt(a)) shl int32(getInt(b)), n);
+        tyInt64, tyInt:
+          result := newIntNodeT(shlu(getInt(a), getInt(b)), n);
+        else InternalError(n.info, 'constant folding for shl');
+      end
+    end;
+    mShrI, mShrI64: begin
+      case skipGenericRange(n.typ).kind of
+        tyInt8:  result := newIntNodeT(int8(getInt(a)) shr int8(getInt(b)), n);
+        tyInt16: result := newIntNodeT(int16(getInt(a)) shr int16(getInt(b)), n);
+        tyInt32: result := newIntNodeT(int32(getInt(a)) shr int32(getInt(b)), n);
+        tyInt64, tyInt:
+          result := newIntNodeT(shru(getInt(a), getInt(b)), n);
+        else InternalError(n.info, 'constant folding for shl');
+      end
+    end;
     mDivI, mDivI64: result := newIntNodeT(getInt(a) div getInt(b), n);
     mModI, mModI64: result := newIntNodeT(getInt(a) mod getInt(b), n);
 
@@ -380,7 +398,7 @@ begin
               result := nil // XXX: size computation for complex types
                             // is still wrong
             else
-              result := newIntNodeT(a.typ.size, n);
+              result := newIntNodeT(getSize(a.typ), n);
           end;
           mLow:  result := newIntNodeT(firstOrd(n.sons[1].typ), n);
           mHigh: begin
diff --git a/nim/seminst.pas b/nim/seminst.pas
new file mode 100644
index 000000000..4c3d416d4
--- /dev/null
+++ b/nim/seminst.pas
@@ -0,0 +1,278 @@
+//
+//
+//           The Nimrod Compiler
+//        (c) Copyright 2008 Andreas Rumpf
+//
+//    See the file "copying.txt", included in this
+//    distribution, for details about the copyright.
+//
+
+// This module does the instantiation of generic procs and types.
+
+function generateInstance(c: PContext; fn: PSym; const pt: TIdTable;
+                          const instantiator: TLineInfo): PSym; forward;
+// generates an instantiated proc
+
+type
+  TInstantiateClosure = object(NObject)
+    typeMap: TIdTable;            // map PType to PType
+    symMap: TIdTable;             // map PSym to PSym
+    fn: PSym;
+    module: PSym;
+    //newOwner: PSym;
+    instantiator: TLineInfo;
+  end;
+  PInstantiateClosure = ^TInstantiateClosure;
+  PInstClosure = PInstantiateClosure;
+
+function instantiateTree(c: PInstantiateClosure; t: PNode): PNode; forward;
+function instantiateSym(c: PInstantiateClosure; sym: PSym): PSym; forward;
+function instantiateType(c: PInstantiateClosure; typ: PType): PType; forward;
+
+function containsGenericTypeIter(t: PType; closure: PObject): bool;
+begin
+  result := t.kind in GenericTypes;
+end;
+
+function containsGenericType(t: PType): bool;
+begin
+  result := iterOverType(t, containsGenericTypeIter, nil);
+end;
+
+function instTypeNode(c: PInstantiateClosure; n: PNode): PNode;
+var
+  i: int;
+begin
+  result := nil;
+  if n <> nil then begin
+    result := copyNode(n);
+    result.typ := instantiateType(c, n.typ);
+    case n.kind of
+      nkNone..nkNilLit: begin // a leaf
+      end;
+      else begin
+        for i := 0 to sonsLen(n)-1 do
+          addSon(result, instTypeNode(c, n.sons[i]));
+      end
+    end
+  end
+end;
+
+function instantiateType(c: PInstantiateClosure; typ: PType): PType;
+var
+  i: int;
+begin
+  result := PType(idTableGet(c.typeMap, typ));
+  if result <> nil then exit;
+  //if typ.kind = tyOpenArray then
+  //  liMessage(c.instantiator, warnUser, 'instantiating type for: openarray');
+  if containsGenericType(typ) then begin
+    result := copyType(typ, typ.owner, false);
+    idTablePut(c.typeMap, typ, result); // to avoid cycles
+    for i := 0 to sonsLen(result)-1 do
+      result.sons[i] := instantiateType(c, result.sons[i]);
+    if result.n <> nil then
+      result.n := instTypeNode(c, result.n);
+  end
+  else
+    result := typ;
+  if result.Kind in GenericTypes then begin
+    liMessage(c.instantiator, errCannotInstantiateX,
+              TypeToString(typ, preferName));
+  end
+  else if result.kind = tyVar then begin
+    if result.sons[0].kind = tyVar then
+      liMessage(c.instantiator, errVarVarTypeNotAllowed);
+  end;
+end;
+
+function instantiateSym(c: PInstantiateClosure; sym: PSym): PSym;
+begin
+  if sym = nil then begin result := nil; exit end; // BUGFIX
+  result := PSym(idTableGet(c.symMap, sym));
+  if (result = nil) then begin
+    if (sym.owner.id = c.fn.id) then begin // XXX: nested generics?
+      result := copySym(sym, false);
+      include(result.flags, sfFromGeneric);
+      idTablePut(c.symMap, sym, result); // BUGFIX
+      result.typ := instantiateType(c, sym.typ);
+      if (result.owner <> nil) and (result.owner.kind = skModule) then
+        result.owner := c.module // BUGFIX
+      else
+        result.owner := instantiateSym(c, result.owner);
+      if sym.ast <> nil then begin
+        result.ast := instantiateTree(c, sym.ast);
+      end
+    end
+    else
+      result := sym // do not copy t!
+  end
+end;
+
+function instantiateTree(c: PInstantiateClosure; t: PNode): PNode;
+var
+  len, i: int;
+begin
+  if t = nil then begin result := nil; exit end;
+  result := copyNode(t);
+  if result.typ <> nil then result.typ := instantiateType(c, result.typ);
+  case t.kind of
+    nkNone..pred(nkSym), succ(nkSym)..nkNilLit: begin end;
+    nkSym: begin
+      if result.sym <> nil then result.sym := instantiateSym(c, result.sym);
+    end
+    else begin
+      len := sonsLen(t);
+      if len > 0 then begin
+        newSons(result, len);
+        for i := 0 to len-1 do
+          result.sons[i] := instantiateTree(c, t.sons[i]);
+      end
+    end
+  end
+end;
+
+procedure instantiateGenericParamList(c: PContext; n: PNode;
+                                      const pt: TIdTable);
+var
+  i: int;
+  s, q: PSym;
+  t: PType;
+begin
+  if (n.kind <> nkGenericParams) then 
+    InternalError(n.info, 'instantiateGenericParamList');
+  for i := 0 to sonsLen(n)-1 do begin
+    if n.sons[i].kind = nkDefaultTypeParam then begin
+      internalError(n.sons[i].info,
+        'instantiateGenericParamList() to implement');
+      // XXX
+    end;
+    if (n.sons[i].kind <> nkSym) then 
+      InternalError(n.info, 'instantiateGenericParamList');
+    q := n.sons[i].sym;
+    s := newSym(skType, q.name, getCurrOwner());
+    t := PType(IdTableGet(pt, q.typ));
+    if t = nil then
+      liMessage(n.sons[i].info, errCannotInstantiateX, s.name.s);
+    if (t.kind = tyGenericParam) then
+      InternalError(n.info, 'instantiateGenericParamList');    
+    s.typ := t;
+    addDecl(c, s);
+  end
+end;
+
+function GenericCacheGet(c: PContext; genericSym, instSym: PSym): PSym;
+var
+  i: int;
+  a, b: PSym;
+begin
+  result := nil;
+  for i := 0 to sonsLen(c.generics)-1 do begin
+    if c.generics.sons[i].kind <> nkExprEqExpr then
+      InternalError(genericSym.info, 'GenericCacheGet');
+    a := c.generics.sons[i].sons[0].sym;
+    if genericSym.id = a.id then begin
+      b := c.generics.sons[i].sons[1].sym;
+      if equalParams(b.typ.n, instSym.typ.n) = paramsEqual then begin
+        //if gVerbosity > 0 then 
+        //  MessageOut('found in cache: ' + getProcHeader(instSym));
+        result := b; exit
+      end
+    end
+  end
+end;
+
+procedure GenericCacheAdd(c: PContext; genericSym, instSym: PSym);
+var
+  n: PNode;
+begin
+  n := newNode(nkExprEqExpr);
+  addSon(n, newSymNode(genericSym));
+  addSon(n, newSymNode(instSym));
+  addSon(c.generics, n);
+end;
+
+procedure semParamList(c: PContext; n: PNode; s: PSym); forward;
+procedure addParams(c: PContext; n: PNode); forward;
+procedure addResult(c: PContext; t: PType; const info: TLineInfo); forward;
+procedure addResultNode(c: PContext; n: PNode); forward;
+
+function generateInstance(c: PContext; fn: PSym; const pt: TIdTable;
+                          const instantiator: TLineInfo): PSym;
+// generates an instantiated proc
+var
+  oldPrc: PSym;
+  oldP: PProcCon;
+  n: PNode;
+begin
+  oldP := c.p; // restore later
+  result := copySym(fn, false);
+  include(result.flags, sfFromGeneric);
+  //include(fn.flags, sfFromGeneric);
+  result.owner := getCurrOwner().owner;
+  //idTablePut(c.mapping, fn, result);
+  n := copyTree(fn.ast);
+  result.ast := n;
+  pushOwner(result);
+  openScope(c.tab);
+  if (n.sons[genericParamsPos] = nil) then 
+    InternalError(n.info, 'generateInstance');
+  n.sons[namePos] := newSymNode(result);
+  pushInfoContext(instantiator);
+
+  instantiateGenericParamList(c, n.sons[genericParamsPos], pt);
+  n.sons[genericParamsPos] := nil;
+  // semantic checking for the parameters:
+  if n.sons[paramsPos] <> nil then begin
+    semParamList(c, n.sons[ParamsPos], result);
+    addParams(c, result.typ.n);
+  end
+  else begin
+    result.typ := newTypeS(tyProc, c);
+    addSon(result.typ, nil);
+  end;
+
+  // now check if we have already such a proc generated
+  oldPrc := GenericCacheGet(c, fn, result);
+  if oldPrc = nil then begin
+    // add it here, so that recursive generic procs are possible:
+    addDecl(c, result);
+    if n.sons[codePos] <> nil then begin
+      c.p := newProcCon(result);
+      if result.kind in [skProc, skConverter] then begin
+        addResult(c, result.typ.sons[0], n.info);
+        addResultNode(c, n);
+      end;
+      n.sons[codePos] := semStmtScope(c, n.sons[codePos]);
+    end;
+    GenericCacheAdd(c, fn, result);
+  end
+  else
+    result := oldPrc;
+  popInfoContext();
+  closeScope(c.tab); // close scope for parameters
+  popOwner();
+  c.p := oldP; // restore
+end;
+
+function generateTypeInstance(p: PContext; const pt: TIdTable;
+                              const instantiator: TLineInfo; t: PType): PType;
+var
+  c: PInstantiateClosure;
+begin
+  new(c);
+{@ignore}
+  fillChar(c^, sizeof(c^), 0);
+{@emit}
+  copyIdTable(c.typeMap, pt);
+  InitIdTable(c.symMap);
+  c.fn := nil;
+  c.instantiator := instantiator;
+  c.module := p.module;
+  result := instantiateType(c, t);
+end;
+
+function partialSpecialization(c: PContext; n: PNode; s: PSym): PNode;
+begin
+  result := n;
+end;
diff --git a/nim/semtypes.pas b/nim/semtypes.pas
index 00cb019f8..5d9bd626a 100644
--- a/nim/semtypes.pas
+++ b/nim/semtypes.pas
@@ -157,7 +157,7 @@ begin
     liMessage(n.info, errOrdinalTypeExpected);
   if enumHasWholes(a.typ) then
     liMessage(n.info, errEnumXHasWholes, a.typ.sym.name.s);
-  if not leValue(a, b) then
+  if not leValue(a, b) then 
     liMessage(n.Info, errRangeIsEmpty);
   addSon(result.n, a);
   addSon(result.n, b);
diff --git a/nim/sigmatch.pas b/nim/sigmatch.pas
index 96001ed90..741052f05 100644
--- a/nim/sigmatch.pas
+++ b/nim/sigmatch.pas
@@ -570,9 +570,10 @@ begin
       result := copyTree(arg);
       result.typ := getInstantiatedType(c, arg, m, f);
       // BUG: f may not be the right key!
-      if (skipVarGeneric(f).kind in [tyTuple, tyOpenArray]) then
+      if (skipVarGeneric(result.typ).kind in [tyTuple, tyOpenArray]) then
         // BUGFIX: must pass length implicitely
         result := implicitConv(nkHiddenStdConv, f, copyTree(arg), m, c);
+      // BUGFIX: use ``result.typ`` and not `f` here
     end;
     isEqual: begin
       inc(m.exactMatches);
diff --git a/nim/transf.pas b/nim/transf.pas
index fb59eeef2..d74f2aa83 100644
--- a/nim/transf.pas
+++ b/nim/transf.pas
@@ -69,9 +69,15 @@ end;
 
 // ------------ helpers -----------------------------------------------------
 
+function getCurrOwner(c: PTransf): PSym;
+begin
+  if c.transCon <> nil then result := c.transCon.owner
+  else result := c.module;
+end;
+
 function newTemp(c: PTransf; typ: PType; const info: TLineInfo): PSym;
 begin
-  result := newSym(skTemp, getIdent(genPrefix), getCurrOwner());
+  result := newSym(skTemp, getIdent(genPrefix), getCurrOwner(c));
   result.info := info;
   result.typ := skipGeneric(typ);
   include(result.flags, sfFromGeneric);
@@ -195,7 +201,7 @@ begin
   for i := 0 to sonsLen(n)-1 do
     result.sons[i] := transform(c, n.sons[i]);
   counter := 0;
-  labl := newSym(skLabel, nil, getCurrOwner());
+  labl := newSym(skLabel, nil, getCurrOwner(c));
   labl.name := getIdent(genPrefix +{&} ToString(labl.id));
   labl.info := result.info;
   transformContinueAux(c, result, labl, counter);
@@ -270,7 +276,7 @@ begin
         include(newVar.flags, sfFromGeneric);
         // fixes a strange bug for rodgen:
         //include(it.sons[0].sym.flags, sfFromGeneric);
-        newVar.owner := getCurrOwner();
+        newVar.owner := getCurrOwner(c);
         IdNodeTablePut(c.transCon.mapping, it.sons[0].sym, newSymNode(newVar));
         it.sons[0] := newSymNode(newVar);
         it.sons[2] := transform(c, it.sons[2]);
@@ -460,7 +466,9 @@ begin
       // generate a temporary and produce an assignment statement:
       temp := newTemp(c, formal.typ, formal.info);
       addVar(v, newSymNode(temp));
-      addSon(result, newAsgnStmt(c, newSymNode(temp), copyTree(call.sons[i])));
+      // BUGFIX: do not copy call.sons[i], but transform it!
+      addSon(result, newAsgnStmt(c, newSymNode(temp),
+                                 transform(c, call.sons[i])));
       IdNodeTablePut(newC.mapping, formal, newSymNode(temp)); // BUGFIX
     end
   end;
diff --git a/nim/types.pas b/nim/types.pas
index bc42f2169..0686a368f 100644
--- a/nim/types.pas
+++ b/nim/types.pas
@@ -930,7 +930,7 @@ end;
 
 function align(address, alignment: biggestInt): biggestInt;
 begin
-  result := address + (alignment-1) and not (alignment-1);
+  result := (address + (alignment-1)) and not (alignment-1);
 end;
 
 // we compute the size of types lazily:
@@ -951,6 +951,7 @@ begin
         case n.sons[i].kind of
           nkOfBranch, nkElse: begin
             res := computeRecSizeAux(lastSon(n.sons[i]), b, currOffset);
+            if res < 0 then begin result := res; exit end;
             maxSize := max(maxSize, res);
             maxAlign := max(maxAlign, b);
           end;
@@ -966,6 +967,7 @@ begin
       maxAlign := 1;
       for i := 0 to sonsLen(n)-1 do begin
         res := computeRecSizeAux(n.sons[i], b, currOffset);
+        if res < 0 then begin result := res; exit end;
         currOffset := align(currOffset, b) + res;
         result := align(result, b) + res;
         if b > maxAlign then maxAlign := b;
@@ -1024,9 +1026,9 @@ begin
         result := 4 // use signed int32
       else begin
         len := lastOrd(typ); // BUGFIX: use lastOrd!
-        if len+1 < 1 shl 8 then result := 1
-        else if len+1 < 1 shl 16 then result := 2
-        else if len+1 < 1 shl 32 then result := 4
+        if len+1 < shlu(1, 8) then result := 1
+        else if len+1 < shlu(1, 16) then result := 2
+        else if len+1 < shlu(biggestInt(1), 32) then result := 4
         else result := 8;
       end;
       a := result;
@@ -1047,6 +1049,7 @@ begin
       maxAlign := 1;
       for i := 0 to sonsLen(typ)-1 do begin
         res := computeSizeAux(typ.sons[i], a);
+        if res < 0 then begin result := res; exit end;
         maxAlign := max(maxAlign, a);
         result := align(result, a) + res;
       end;
@@ -1056,6 +1059,7 @@ begin
     tyObject: begin
       if typ.sons[0] <> nil then begin
         result := computeSizeAux(typ.sons[0], a);
+        if result < 0 then exit;
         maxAlign := a
       end
       else if typ.kind = tyObject then begin
@@ -1066,6 +1070,7 @@ begin
       end;
       currOffset := result;
       result := computeRecSizeAux(typ.n, a, currOffset);
+      if result < 0 then exit;
       if a < maxAlign then a := maxAlign;
       result := align(result, a);
     end;
@@ -1097,4 +1102,3 @@ begin
 end;
 
 end.
-
diff --git a/objdata.txt b/objdata.txt
new file mode 100644
index 000000000..653ae5931
--- /dev/null
+++ b/objdata.txt
@@ -0,0 +1,8 @@
+nodes: 2224942
+syms:    39562
+Types:   28189
+
+nodes: 2224942
+syms:    39562
+Types:   29054
+Ropes: 1245961
diff --git a/rod/nimrod.cfg b/rod/nimrod.cfg
new file mode 100644
index 000000000..51a9dc52d
--- /dev/null
+++ b/rod/nimrod.cfg
@@ -0,0 +1,11 @@
+# Special configuration file for the Nimrod project
+
+--hint[XDeclaredButNotUsed]=off
+
+@if llvm_gcc or gcc:
+  # GCC, LLVM and Visual C++ have a problem to optimize some modules.
+  # This is really strange.
+  cgen.speed = "-O1 -fno-strict-aliasing"
+@elif vcc:
+  cgen.speed = ""
+@end
diff --git a/rod/nimrod.dot b/rod/nimrod.dot
new file mode 100644
index 000000000..8f77bb60d
--- /dev/null
+++ b/rod/nimrod.dot
@@ -0,0 +1,532 @@
+digraph nimrod {
+times -> strutils;
+os -> strutils;
+os -> times;
+hashes -> strutils;
+strtabs -> os;
+strtabs -> hashes;
+strtabs -> strutils;
+options -> os;
+options -> lists;
+options -> strutils;
+options -> strtabs;
+msgs -> options;
+msgs -> strutils;
+msgs -> os;
+nversion -> strutils;
+crc -> strutils;
+platform -> strutils;
+ropes -> msgs;
+ropes -> strutils;
+ropes -> platform;
+ropes -> hashes;
+ropes -> crc;
+idents -> hashes;
+idents -> strutils;
+ast -> msgs;
+ast -> hashes;
+ast -> nversion;
+ast -> options;
+ast -> strutils;
+ast -> crc;
+ast -> ropes;
+ast -> idents;
+ast -> lists;
+astalgo -> ast;
+astalgo -> hashes;
+astalgo -> strutils;
+astalgo -> options;
+astalgo -> msgs;
+astalgo -> ropes;
+astalgo -> idents;
+condsyms -> ast;
+condsyms -> astalgo;
+condsyms -> msgs;
+condsyms -> hashes;
+condsyms -> platform;
+condsyms -> strutils;
+condsyms -> idents;
+extccomp -> lists;
+extccomp -> ropes;
+extccomp -> os;
+extccomp -> strutils;
+extccomp -> platform;
+extccomp -> condsyms;
+extccomp -> options;
+extccomp -> msgs;
+wordrecg -> hashes;
+wordrecg -> strutils;
+wordrecg -> idents;
+commands -> os;
+commands -> msgs;
+commands -> options;
+commands -> nversion;
+commands -> condsyms;
+commands -> strutils;
+commands -> extccomp;
+commands -> platform;
+commands -> lists;
+commands -> wordrecg;
+llstream -> strutils;
+lexbase -> llstream;
+lexbase -> strutils;
+scanner -> hashes;
+scanner -> options;
+scanner -> msgs;
+scanner -> strutils;
+scanner -> platform;
+scanner -> idents;
+scanner -> lexbase;
+scanner -> llstream;
+scanner -> wordrecg;
+nimconf -> llstream;
+nimconf -> nversion;
+nimconf -> commands;
+nimconf -> os;
+nimconf -> strutils;
+nimconf -> msgs;
+nimconf -> platform;
+nimconf -> condsyms;
+nimconf -> scanner;
+nimconf -> options;
+nimconf -> idents;
+nimconf -> wordrecg;
+pnimsyn -> llstream;
+pnimsyn -> scanner;
+pnimsyn -> idents;
+pnimsyn -> strutils;
+pnimsyn -> ast;
+pnimsyn -> msgs;
+rnimsyn -> lexbase;
+rnimsyn -> scanner;
+rnimsyn -> options;
+rnimsyn -> idents;
+rnimsyn -> strutils;
+rnimsyn -> ast;
+rnimsyn -> msgs;
+rnimsyn -> lists;
+paslex -> hashes;
+paslex -> options;
+paslex -> msgs;
+paslex -> strutils;
+paslex -> platform;
+paslex -> idents;
+paslex -> lexbase;
+paslex -> wordrecg;
+paslex -> scanner;
+pasparse -> os;
+pasparse -> llstream;
+pasparse -> scanner;
+pasparse -> paslex;
+pasparse -> idents;
+pasparse -> wordrecg;
+pasparse -> strutils;
+pasparse -> ast;
+pasparse -> astalgo;
+pasparse -> msgs;
+pasparse -> options;
+rodread -> os;
+rodread -> options;
+rodread -> strutils;
+rodread -> nversion;
+rodread -> ast;
+rodread -> astalgo;
+rodread -> msgs;
+rodread -> platform;
+rodread -> condsyms;
+rodread -> ropes;
+rodread -> idents;
+rodread -> crc;
+trees -> ast;
+trees -> astalgo;
+trees -> scanner;
+trees -> msgs;
+trees -> strutils;
+types -> ast;
+types -> astalgo;
+types -> trees;
+types -> msgs;
+types -> strutils;
+types -> platform;
+magicsys -> ast;
+magicsys -> astalgo;
+magicsys -> hashes;
+magicsys -> msgs;
+magicsys -> platform;
+magicsys -> nversion;
+magicsys -> times;
+magicsys -> idents;
+magicsys -> rodread;
+nimsets -> ast;
+nimsets -> astalgo;
+nimsets -> trees;
+nimsets -> nversion;
+nimsets -> msgs;
+nimsets -> platform;
+nimsets -> bitsets;
+nimsets -> types;
+nimsets -> rnimsyn;
+passes -> strutils;
+passes -> lists;
+passes -> options;
+passes -> ast;
+passes -> astalgo;
+passes -> llstream;
+passes -> msgs;
+passes -> platform;
+passes -> os;
+passes -> condsyms;
+passes -> idents;
+passes -> rnimsyn;
+passes -> types;
+passes -> extccomp;
+passes -> math;
+passes -> magicsys;
+passes -> nversion;
+passes -> nimsets;
+passes -> pnimsyn;
+passes -> times;
+passes -> rodread;
+treetab -> hashes;
+treetab -> ast;
+treetab -> astalgo;
+treetab -> types;
+semdata -> strutils;
+semdata -> lists;
+semdata -> options;
+semdata -> scanner;
+semdata -> ast;
+semdata -> astalgo;
+semdata -> trees;
+semdata -> treetab;
+semdata -> wordrecg;
+semdata -> ropes;
+semdata -> msgs;
+semdata -> platform;
+semdata -> os;
+semdata -> condsyms;
+semdata -> idents;
+semdata -> rnimsyn;
+semdata -> types;
+semdata -> extccomp;
+semdata -> math;
+semdata -> magicsys;
+semdata -> nversion;
+semdata -> nimsets;
+semdata -> pnimsyn;
+semdata -> times;
+semdata -> passes;
+semdata -> rodread;
+lookups -> ast;
+lookups -> astalgo;
+lookups -> idents;
+lookups -> semdata;
+lookups -> types;
+lookups -> msgs;
+lookups -> options;
+lookups -> rodread;
+lookups -> rnimsyn;
+importer -> strutils;
+importer -> os;
+importer -> ast;
+importer -> astalgo;
+importer -> msgs;
+importer -> options;
+importer -> idents;
+importer -> rodread;
+importer -> lookups;
+importer -> semdata;
+importer -> passes;
+rodwrite -> os;
+rodwrite -> options;
+rodwrite -> strutils;
+rodwrite -> nversion;
+rodwrite -> ast;
+rodwrite -> astalgo;
+rodwrite -> msgs;
+rodwrite -> platform;
+rodwrite -> condsyms;
+rodwrite -> ropes;
+rodwrite -> idents;
+rodwrite -> crc;
+rodwrite -> rodread;
+rodwrite -> passes;
+rodwrite -> importer;
+semfold -> strutils;
+semfold -> lists;
+semfold -> options;
+semfold -> ast;
+semfold -> astalgo;
+semfold -> trees;
+semfold -> treetab;
+semfold -> nimsets;
+semfold -> times;
+semfold -> nversion;
+semfold -> platform;
+semfold -> math;
+semfold -> msgs;
+semfold -> os;
+semfold -> condsyms;
+semfold -> idents;
+semfold -> rnimsyn;
+semfold -> types;
+evals -> strutils;
+evals -> magicsys;
+evals -> lists;
+evals -> options;
+evals -> ast;
+evals -> astalgo;
+evals -> trees;
+evals -> treetab;
+evals -> nimsets;
+evals -> msgs;
+evals -> os;
+evals -> condsyms;
+evals -> idents;
+evals -> rnimsyn;
+evals -> types;
+evals -> passes;
+evals -> semfold;
+procfind -> ast;
+procfind -> astalgo;
+procfind -> msgs;
+procfind -> semdata;
+procfind -> types;
+pragmas -> os;
+pragmas -> platform;
+pragmas -> condsyms;
+pragmas -> ast;
+pragmas -> astalgo;
+pragmas -> idents;
+pragmas -> semdata;
+pragmas -> msgs;
+pragmas -> rnimsyn;
+pragmas -> wordrecg;
+pragmas -> ropes;
+pragmas -> options;
+pragmas -> strutils;
+pragmas -> lists;
+pragmas -> extccomp;
+pragmas -> math;
+pragmas -> magicsys;
+sem -> strutils;
+sem -> lists;
+sem -> options;
+sem -> scanner;
+sem -> ast;
+sem -> astalgo;
+sem -> trees;
+sem -> treetab;
+sem -> wordrecg;
+sem -> ropes;
+sem -> msgs;
+sem -> os;
+sem -> condsyms;
+sem -> idents;
+sem -> rnimsyn;
+sem -> types;
+sem -> platform;
+sem -> math;
+sem -> magicsys;
+sem -> pnimsyn;
+sem -> nversion;
+sem -> nimsets;
+sem -> semdata;
+sem -> evals;
+sem -> semfold;
+sem -> importer;
+sem -> procfind;
+sem -> lookups;
+sem -> rodread;
+sem -> pragmas;
+sem -> passes;
+rst -> os;
+rst -> msgs;
+rst -> strutils;
+rst -> platform;
+rst -> hashes;
+rst -> ropes;
+rst -> options;
+highlite -> hashes;
+highlite -> options;
+highlite -> msgs;
+highlite -> strutils;
+highlite -> platform;
+highlite -> idents;
+highlite -> lexbase;
+highlite -> wordrecg;
+highlite -> scanner;
+docgen -> ast;
+docgen -> astalgo;
+docgen -> strutils;
+docgen -> hashes;
+docgen -> options;
+docgen -> nversion;
+docgen -> msgs;
+docgen -> os;
+docgen -> ropes;
+docgen -> idents;
+docgen -> wordrecg;
+docgen -> math;
+docgen -> pnimsyn;
+docgen -> rnimsyn;
+docgen -> scanner;
+docgen -> rst;
+docgen -> times;
+docgen -> highlite;
+ccgutils -> ast;
+ccgutils -> astalgo;
+ccgutils -> ropes;
+ccgutils -> lists;
+ccgutils -> hashes;
+ccgutils -> strutils;
+ccgutils -> types;
+ccgutils -> msgs;
+cgen -> ast;
+cgen -> astalgo;
+cgen -> strutils;
+cgen -> hashes;
+cgen -> trees;
+cgen -> platform;
+cgen -> magicsys;
+cgen -> extccomp;
+cgen -> options;
+cgen -> nversion;
+cgen -> nimsets;
+cgen -> msgs;
+cgen -> crc;
+cgen -> bitsets;
+cgen -> idents;
+cgen -> lists;
+cgen -> types;
+cgen -> ccgutils;
+cgen -> os;
+cgen -> times;
+cgen -> ropes;
+cgen -> math;
+cgen -> passes;
+cgen -> rodread;
+cgen -> wordrecg;
+cgen -> rnimsyn;
+cgen -> treetab;
+ecmasgen -> ast;
+ecmasgen -> astalgo;
+ecmasgen -> strutils;
+ecmasgen -> hashes;
+ecmasgen -> trees;
+ecmasgen -> platform;
+ecmasgen -> magicsys;
+ecmasgen -> extccomp;
+ecmasgen -> options;
+ecmasgen -> nversion;
+ecmasgen -> nimsets;
+ecmasgen -> msgs;
+ecmasgen -> crc;
+ecmasgen -> bitsets;
+ecmasgen -> idents;
+ecmasgen -> lists;
+ecmasgen -> types;
+ecmasgen -> os;
+ecmasgen -> times;
+ecmasgen -> ropes;
+ecmasgen -> math;
+ecmasgen -> passes;
+ecmasgen -> ccgutils;
+ecmasgen -> wordrecg;
+ecmasgen -> rnimsyn;
+ecmasgen -> rodread;
+ptmplsyn -> llstream;
+ptmplsyn -> os;
+ptmplsyn -> wordrecg;
+ptmplsyn -> strutils;
+ptmplsyn -> ast;
+ptmplsyn -> astalgo;
+ptmplsyn -> msgs;
+ptmplsyn -> options;
+ptmplsyn -> pnimsyn;
+interact -> llstream;
+interact -> strutils;
+interact -> ropes;
+interact -> strtabs;
+interact -> msgs;
+passaux -> strutils;
+passaux -> ast;
+passaux -> passes;
+passaux -> msgs;
+passaux -> options;
+depends -> os;
+depends -> options;
+depends -> ast;
+depends -> astalgo;
+depends -> msgs;
+depends -> ropes;
+depends -> idents;
+depends -> passes;
+depends -> importer;
+transf -> strutils;
+transf -> lists;
+transf -> options;
+transf -> ast;
+transf -> astalgo;
+transf -> trees;
+transf -> treetab;
+transf -> msgs;
+transf -> os;
+transf -> idents;
+transf -> rnimsyn;
+transf -> types;
+transf -> passes;
+transf -> semfold;
+main -> llstream;
+main -> strutils;
+main -> ast;
+main -> astalgo;
+main -> scanner;
+main -> pnimsyn;
+main -> rnimsyn;
+main -> options;
+main -> msgs;
+main -> os;
+main -> lists;
+main -> condsyms;
+main -> paslex;
+main -> pasparse;
+main -> rodread;
+main -> rodwrite;
+main -> ropes;
+main -> trees;
+main -> wordrecg;
+main -> sem;
+main -> semdata;
+main -> idents;
+main -> passes;
+main -> docgen;
+main -> extccomp;
+main -> cgen;
+main -> ecmasgen;
+main -> platform;
+main -> ptmplsyn;
+main -> interact;
+main -> nimconf;
+main -> importer;
+main -> passaux;
+main -> depends;
+main -> transf;
+main -> evals;
+parseopt -> os;
+parseopt -> strutils;
+nimrod -> commands;
+nimrod -> scanner;
+nimrod -> condsyms;
+nimrod -> options;
+nimrod -> msgs;
+nimrod -> nversion;
+nimrod -> nimconf;
+nimrod -> ropes;
+nimrod -> extccomp;
+nimrod -> strutils;
+nimrod -> os;
+nimrod -> platform;
+nimrod -> main;
+nimrod -> parseopt;
+}
diff --git a/rod/nimrod.ini b/rod/nimrod.ini
new file mode 100644
index 000000000..3d0852f3b
--- /dev/null
+++ b/rod/nimrod.ini
@@ -0,0 +1,90 @@
+[Project]
+Name: "Nimrod"
+Version: "$version"
+OS: "linux;macosx;freebsd;netbsd;openbsd;solaris;aix"
+CPU: "i386;amd64;sparc;powerpc"
+Authors: "Andreas Rumpf"
+Description: """This is the Nimrod Compiler. Nimrod is a new statically typed,
+imperative programming language, that supports procedural, functional, object
+oriented and generic programming styles while remaining simple and efficient.
+A special feature that Nimrod inherited from Lisp is that Nimrod's abstract
+syntax tree (AST) is part of the specification - this allows a powerful macro
+system which can be used to create domain specific languages.
+
+Nimrod is a compiled, garbage-collected systems programming language
+which has an excellent productivity/performance ratio. Nimrod's design
+focuses on the 3E: efficiency, expressiveness, elegance (in the order of
+priority)."""
+
+App: Console
+License: "copying.txt"
+
+[InstallScript]
+[UninstallScript]
+
+[Common]
+Files: "readme.txt;install.txt"
+Files: "configure;makefile"
+Files: "*.html"
+Files: "*.py"
+Files: "*.ini"
+
+Files: "lib/nimbase.h;lib/cycle.h;lib/tlsf.h;lib/target.h;lib/dlmalloc.h"
+Files: "lib/tlsf.c;lib/dlmalloc.c"
+Files: "lib/*.nim"
+
+Files: "rod/readme.txt"
+Files: "rod/nimrod.ini"
+Files: "rod/nimrod.cfg"
+Files: "build/empty.txt"
+Files: "bin/empty.txt"
+Files: "nim/*.*"
+
+Files: "data/*.yml"
+Files: "data/*.txt"
+Files: "obj/*.txt"
+Files: "diff/*.txt"
+
+Files: "config/nimdoc.cfg"
+Files: "config/nimrod.cfg"
+
+Files: "doc/*.txt"
+Files: "doc/*.html"
+Files: "doc/*.cfg"
+
+Files: "tests/*.nim"
+Files: "tests/*.html"
+Files: "tests/*.txt"
+Files: "tests/*.cfg"
+Files: "tests/*.tmpl"
+Files: "tests/gtk/*.nim"
+
+Files: "lib/base/*.c"
+Files: "lib/base/*.nim"
+Files: "lib/base/gtk/*.nim"
+Files: "lib/base/cairo/*.nim"
+Files: "lib/base/x11/*.nim"
+Files: "lib/base/zip/*.nim"
+Files: "lib/base/zip/libzip_all.c"
+Files: "lib/windows/*.nim"
+Files: "lib/posix/*.nim"
+Files: "lib/ecmas/*.nim"
+Files: "lib/base/sdl/*.nim"
+Files: "lib/base/opengl/*.nim"
+Files: "lib/base/lua/*.nim"
+
+[Windows]
+Files: "bin/nimrod.exe"
+Files: "dist/llvm-gcc4.2"
+BinPath: r"bin;dist\llvm-gcc4.2\bin"
+
+[Unix]
+
+
+[InnoSetup]
+path = r"c:\programme\innosetup5\iscc.exe"
+flags = "/Q"
+
+[C_Compiler]
+path = r""
+flags = "-w"
diff --git a/tests/cairotest.nim b/tests/cairotest.nim
new file mode 100644
index 000000000..2c28e1abf
--- /dev/null
+++ b/tests/cairotest.nim
@@ -0,0 +1,14 @@
+import cairo
+
+var surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, 240, 80)
+var cr = cairo_create(surface)
+
+cairo_select_font_face(cr, "serif", CAIRO_FONT_SLANT_NORMAL, 
+                                    CAIRO_FONT_WEIGHT_BOLD)
+cairo_set_font_size(cr, 32.0)
+cairo_set_source_rgb(cr, 0.0, 0.0, 1.0)
+cairo_move_to(cr, 10.0, 50.0)
+cairo_show_text(cr, "Hello, world")
+cairo_destroy(cr)
+discard cairo_surface_write_to_png(surface, "hello.png")
+cairo_surface_destroy(surface)
diff --git a/tests/cgitest.nim b/tests/cgitest.nim
new file mode 100644
index 000000000..ef115c80b
--- /dev/null
+++ b/tests/cgitest.nim
@@ -0,0 +1,15 @@
+# Test the new CGI module
+import strtabs, cgi
+
+
+#setTestData("name", "the andreas", "password", "rumpf\t\ttab")
+
+var myData = readData()
+validateData(myData, "name", "password")
+writeContentType()
+
+write(stdout, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\">\n")
+write(stdout, "<html><head><title>Test</title></head><body>\n")
+writeln(stdout, "name: " & myData["name"])
+writeln(stdout, "password: " & myData["password"])
+writeln(stdout, "</body></html>")
diff --git a/tests/stckovfl.nim b/tests/stckovfl.nim
new file mode 100644
index 000000000..799fe0001
--- /dev/null
+++ b/tests/stckovfl.nim
@@ -0,0 +1,8 @@
+# To test stack overflow message
+
+proc over(a: int): int = 
+  if a == high(int): return
+  result = over(a+1)+5
+  
+Echo($over(0))
+
diff --git a/tests/sunset.tmpl b/tests/sunset.tmpl
new file mode 100644
index 000000000..08fa50f56
--- /dev/null
+++ b/tests/sunset.tmpl
@@ -0,0 +1,67 @@
+#proc sunsetTemplate*(current, ticker, content: string,
+#                     tabs: openarray[array[0..1, string]]): string = 
+#  result = ""
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
+
+<head>
+  <title>Nimrod Programming System</title>
+  <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
+  <link rel="stylesheet" type="text/css" href="style/style.css" />
+</head>
+
+<body>
+  <div id="main">
+    <div id="links">
+      <!-- **** INSERT LINKS HERE **** -->
+    </div>
+    <div id="logo"><h1>Nimrod Programming System</h1></div>
+    <div id="content">
+      <div id="menu">
+        <ul>
+  #for item in items(tabs):
+    #var name = item[0]
+    #var t = item[1]
+    #if t == current:
+          <li><a id="selected" href="${t}.html" title = "Nimrod - $name">$name</a></li>
+    #else:
+          <li><a               href="${t}.html" title = "Nimrod - $name">$name</a></li>
+    #end if
+  #end for
+        </ul>
+      </div>
+      <div id="column1">
+        <div class="sidebaritem">
+          <div class="sbihead">
+            <h1>latest news</h1>
+          </div>
+          <div class="sbicontent">
+            $ticker
+          </div>
+        </div>
+        <div class="sidebaritem">
+          <div class="sbihead">
+            <h1>additional links</h1>
+          </div>
+          <div class="sbilinks">
+            <!-- **** INSERT ADDITIONAL LINKS HERE **** -->
+            <ul>
+              <li><a class="reference" href="http://llvm.org">LLVM</a></li>
+              <li><a class="reference" href="http://gcc.gnu.org">GCC</a></li>
+            </ul>
+          </div>
+        </div>
+      </div>
+      <div id="column2">
+      $content
+      </div>
+    </div>
+    <div id="footer">
+      copyright &copy; 2008 Andreas Rumpf | Last update: ${getDateStr()}
+      | <a class="reference" href="http://validator.w3.org/check?uri=referer">XHTML 1.1</a>
+      | <a class="reference" href="http://jigsaw.w3.org/css-validator/check/referer">CSS</a>
+      | <a class="reference" href="http://www.dcarter.co.uk">design by dcarter</a>
+    </div>
+  </div>
+</body>
+</html>
diff --git a/tests/tambsym2.nim b/tests/tambsym2.nim
new file mode 100644
index 000000000..9178182aa
--- /dev/null
+++ b/tests/tambsym2.nim
@@ -0,0 +1,18 @@
+# Test overloading of procs with locals
+
+type
+  TMyType = object
+    len: int
+    data: string
+    
+proc len(x: TMyType): int {.inline.} = return x.len
+
+proc x(s: TMyType, len: int) = 
+  writeln(stdout, len(s))
+  
+var
+  m: TMyType
+m.len = 7
+m.data = "1234"
+
+x(m, 5) #OUT 7
diff --git a/tests/tambsym3.nim b/tests/tambsym3.nim
new file mode 100644
index 000000000..5d0a5f6b2
--- /dev/null
+++ b/tests/tambsym3.nim
@@ -0,0 +1,8 @@
+# Test ambigious symbols

+

+import mambsym1, times

+

+var

+  v = mDec #ERROR_MSG ambigious identifier

+

+writeln(stdout, ord(v))

diff --git a/tests/tester.nim b/tests/tester.nim
new file mode 100644
index 000000000..fc75754d5
--- /dev/null
+++ b/tests/tester.nim
@@ -0,0 +1,161 @@
+#
+#
+#            Nimrod Tester
+#        (c) Copyright 2008 Andreas Rumpf
+#
+#    See the file "copying.txt", included in this
+#    distribution, for details about the copyright.
+#
+
+## This program verifies Nimrod against the testcases.
+## The testcases may contain the directives '#ERROR' or '#ERROR_IN'.
+## '#ERROR' is used to indicate that the compiler should report
+## an error in the marked line (the line that contains the '#ERROR'
+## directive.)
+## The format for '#ERROR_IN' is:
+##      #ERROR_IN filename linenumber
+## One can omit the extension of the filename ('.nim' is then assumed).
+## Tests which contain none of the two directives should compile. Thus they
+## are executed after successful compilation and their output is verified
+## against the results specified with the '#OUT' directive.
+## (Tests which require user interaction are not possible.)
+## Tests can have an #ERROR_MSG directive specifiying the error message
+## Nimrod shall produce.
+
+import
+  strutils, regexprs, os, osproc, streams
+
+const
+  cmdTemplate = r"nimrod cc --hints:on $options $filename"
+
+type
+  TSpec = object of TObject ## specification object
+    line: int    ## line number where compiler should throw an error
+    file: string ## file where compiler should throw an error
+    err: bool    ## true if the specification says there should be an error
+    outp: string ## output that should be produced
+    puremsg: string ## pure message of compiler
+
+proc myExec(cmd: string): string =
+  #echo("Executing: " & cmd)
+  result = osproc.executeProcess(cmd)
+  #echo("Received: " & result)
+
+proc parseTest(filename: string): TSpec =
+  var i = 0 # the line counter
+  var matches: array [0..2, string]
+  result.outp = ""
+  result.puremsg = ""
+  result.file = filename
+  for s in lines(filename):
+    inc(i)
+    if find(s, r"\#OUT\s*(.*)", matches):
+      result.outp = matches[1]
+      break
+    if find(s, r"\#ERROR_IN\s*(\S*)\s*(\d+)", matches):
+      result.file = matches[1]
+      result.line = parseInt(matches[2])
+      result.err = true
+      break
+    if find(s, r"\#ERROR_MSG\s*(.*)", matches):
+      result.line = i
+      result.outp = matches[1]
+      result.err = True
+      break
+    if find(s, r"\#ERROR$", matches):
+      result.line = i
+      result.err = true
+      break
+
+proc callCompiler(filename, options: string): TSpec =
+  var c = parseCmdLine(cmdTemplate % ["filename", filename, "options", options])
+  var a: seq[string] = @[] # slicing is not yet implemented :-(
+  for i in 1 .. c.len-1: add(a, c[i])
+  var p = startProcess(command=c[0], args=a,
+                       options={poStdErrToStdOut, poUseShell})
+  var outp = p.outputStream
+  while running(p) or not outp.atEnd(outp):
+    var s = outp.readLine()
+    var matches: array [0..3, string]
+    result.outp = ""
+    result.puremsg = ""
+    result.file = ""
+    result.err = true
+    if match(s, r"(.*)\((\d+), \d+\) Error\: (.*)", matches):
+      result.file = matches[1]
+      result.line = parseInt(matches[2])
+      result.outp = matches[0]
+      result.puremsg = matches[3]
+      break
+    elif match(s, r"Error\: (.*)", matches):
+      result.puremsg = matches[1]
+      result.outp = matches[0]
+      result.line = 1
+      break
+    elif match(s, r"Hint\: operation successful", matches):
+      result.outp = matches[0]
+      result.err = false
+      break
+
+proc cmpResults(filename: string, spec, comp: TSpec): bool =
+  # short filename for messages (better readability):
+  var shortfile = os.extractFilename(filename)
+
+  if comp.err and comp.outp == "":
+    # the compiler did not say "[Error]" nor "operation sucessful"
+    Echo("[Tester] $1 -- FAILED; COMPILER BROKEN" % shortfile)
+  elif spec.err != comp.err:
+    Echo(("[Tester] $1 -- FAILED\n" &
+         "Compiler says: $2\n" &
+         "But specification says: $3") %
+         [shortfile, comp.outp, spec.outp])
+  elif spec.err:
+    if extractFilename(comp.file) != extractFilename(spec.file):
+      Echo(("[Tester] $1 -- FAILED: file names do not match:\n" &
+           "Compiler: $2\nSpec: $3") % [shortfile, comp.file, spec.file])
+    elif strip(spec.outp) notin strip(comp.puremsg):
+      Echo(("[Tester] $1 -- FAILED: error messages do not match:\n" &
+           "Compiler: $2\nSpec: $3") % [shortfile, comp.pureMsg, spec.outp])
+    elif comp.line != spec.line:
+      Echo(("[Tester] $1 -- FAILED: line numbers do not match:\n" &
+           "Compiler: $2\nSpec: $3") % [shortfile, $comp.line, $spec.line])
+    else:
+      Echo("[Tester] $1 -- OK" % shortfile)
+      result = true
+  else:
+    # we have to run the executable and check its output:
+    var exeFile = changeFileExt(filename, ExeExt)
+    if ExistsFile(exeFile):
+      if len(spec.outp) == 0:
+        # we have no output to validate against, but compilation succeeded,
+        # so it's okay:
+        Echo("[Tester] $1 -- OK" % shortfile)
+        result = true
+      else:
+        var buf = myExec(exeFile)
+        result = strip(buf) == strip(spec.outp)
+        if result:
+          Echo("[Tester] $1 -- compiled program OK" % shortfile)
+        else:
+          Echo("[Tester] $1 -- compiled program FAILED" % shortfile)
+    else:
+      Echo("[Tester] $1 -- FAILED; executable not found" % shortfile)
+
+proc main(options: string) =
+  # runs the complete testsuite
+  var total = 0
+  var passed = 0
+  for filename in os.walkFiles("tests/t*.nim"):
+    if extractFilename(filename) == "tester.nim": continue
+    var spec = parseTest(filename)
+    var comp = callCompiler(filename, options)
+    if cmpResults(filename, spec, comp): inc(passed)
+    inc(total)
+  Echo("[Tester] $1/$2 tests passed\n" % [$passed, $total])
+
+var
+  options = ""
+for i in 1.. paramCount():
+  add(options, " ")
+  add(options, paramStr(i))
+main(options)
diff --git a/tests/tints.nim b/tests/tints.nim
new file mode 100644
index 000000000..f2b52c134
--- /dev/null
+++ b/tests/tints.nim
@@ -0,0 +1,41 @@
+# Test the different integer operations
+
+var testNumber = 0
+
+template test(opr, a, b, c: expr): stmt = 
+  # test the expression at compile and runtime
+  block:
+    const constExpr = opr(a, b)
+    when constExpr != c:
+      {.error: "Test failed " & $constExpr & " " & $c.}
+    inc(testNumber)
+    #Echo("Test: " & $testNumber)
+    var aa = a
+    var bb = b
+    var varExpr = opr(aa, bb)
+    assert(varExpr == c)
+
+test(`+`, 12'i8, -13'i16, -1'i16)
+test(`shl`, 0b11, 0b100, 0b110000)
+test(`shl`, 0b11'i32, 0b100'i64, 0b110000'i64)
+test(`shl`, 0b11'i32, 0b100'i32, 0b110000'i32)
+
+test(`or`, 0xf0f0'i16, 0x0d0d'i16, 0xfdfd'i16)
+test(`and`, 0xf0f0'i16, 0xfdfd'i16, 0xf0f0'i16)
+
+test(`shr`, 0xffffffffffffffff'i64, 0x4'i64, 0x0fffffffffffffff'i64)
+test(`shr`, 0xffff'i16, 0x4'i16, 0x0fff'i16)
+test(`shr`, 0xff'i8, 0x4'i8, 0x0f'i8)
+
+test(`shr`, 0xffffffff'i64, 0x4'i64, 0x0fffffff'i64)
+test(`shr`, 0xffffffff'i32, 0x4'i32, 0x0fffffff'i32)
+
+test(`shl`, 0xffffffffffffffff'i64, 0x4'i64, 0xfffffffffffffff0'i64)
+test(`shl`, 0xffff'i16, 0x4'i16, 0xfff0'i16)
+test(`shl`, 0xff'i8, 0x4'i8, 0xf0'i8)
+
+test(`shl`, 0xffffffff'i64, 0x4'i64, 0xffffffff0'i64)
+test(`shl`, 0xffffffff'i32, 0x4'i32, 0xfffffff0'i32)
+
+Echo("Success") #OUT Success
+
diff --git a/tests/tisopr.nim b/tests/tisopr.nim
new file mode 100644
index 000000000..d52859b09
--- /dev/null
+++ b/tests/tisopr.nim
@@ -0,0 +1,20 @@
+# Test is operator
+
+type
+  TMyType = object
+    len: int
+    data: string
+    
+  TOtherType = object of TMyType
+   
+proc p(x: TMyType): bool = 
+  return x is TOtherType
+    
+var
+  m: TMyType
+  n: TOtherType
+
+write(stdout, p(m))
+write(stdout, p(n))
+
+#OUT falsetrue
diff --git a/tests/tlibs.nim b/tests/tlibs.nim
new file mode 100644
index 000000000..317430744
--- /dev/null
+++ b/tests/tlibs.nim
@@ -0,0 +1,19 @@
+# Test wether the bindings at least compile...
+
+import
+  osproc, zipfiles,
+  sdl, smpeg, sdl_gfx, sdl_net, sdl_mixer, sdl_ttf,
+  sdl_image, sdl_mixer_nosmpeg
+  cursorfont, xatom, xf86vmode, xkb, xrandr, xshm, xvlib, keysym, xcms, xi,
+  xkblib, xrender, xutil, x, xf86dga, xinerama, xlib, xresource, xv,
+  gtk2, glib2, pango, gdk2,
+  cairowin32, cairoxlib,
+  odbcsql,
+  gl, glut, glu, glx, glext, wingl,
+  zlib
+
+import "lib/base/lua/lua"
+import "lib/base/lua/lualib"
+import "lib/base/lua/lauxlib"
+
+writeln(stdout, "test compilation of binding modules")
diff --git a/tests/topenlen.nim b/tests/topenlen.nim
new file mode 100644
index 000000000..b9d7fbc2d
--- /dev/null
+++ b/tests/topenlen.nim
@@ -0,0 +1,12 @@
+# Tests a special bug
+
+proc choose(b: openArray[string]): string = return b[0]
+
+proc p(a, b: openarray[string]): int =
+  result = a.len + b.len - 1
+  for j in 0 .. a.len: inc(result)
+  discard choose(a)
+  discard choose(b)
+
+discard choose(["sh", "-c", $p([""], ["a"])])
+echo($p(["", "ha", "abc"], ["xyz"])) #OUT 7
diff --git a/tests/tos.nim b/tests/tos.nim
new file mode 100644
index 000000000..9ab4295f8
--- /dev/null
+++ b/tests/tos.nim
@@ -0,0 +1,12 @@
+# test some things of the os module
+
+import os
+
+proc walkDirTree(root: string) = 
+  for k, f in walkDir(root):
+    case k 
+    of pcFile, pcLinkToFile: echo(f)
+    of pcDirectory: walkDirTree(f)
+    of pcLinkToDirectory: nil
+
+walkDirTree(".")
diff --git a/tests/trectype.nim b/tests/trectype.nim
index 8e68767b5..3161b0255 100644
--- a/tests/trectype.nim
+++ b/tests/trectype.nim
@@ -13,3 +13,5 @@ type
   PB = ref TB

   TB = array [0..3, P1]

   T1 = array [0..6, PB]

+#ERROR_MSG internal error: cannot generate C type for: PA
+
diff --git a/tests/tsets.nim b/tests/tsets.nim
index 2a01292f3..08ab3e54b 100644
--- a/tests/tsets.nim
+++ b/tests/tsets.nim
@@ -34,7 +34,8 @@ type
   TTokTypes* = set[TTokTypeRange]

 

 const

-  toktypes: TTokTypes = {tkSymbol..pred(tkIntLit), tkStrLit..tkTripleStrLit}

+  toktypes: TTokTypes = {TTokTypeRange(tkSymbol)..pred(tkIntLit), 
+                         tkStrLit..tkTripleStrLit}

 

 var

   s: set[char]

@@ -46,11 +47,12 @@ else: write(stdout, "BUG: F ist nicht in s!\n")
 a = {} #{'a'..'z'}

 for x in low(TAZ) .. high(TAZ):

   incl(a, x)

-  if x in a: write(stdout, x & " ")

+  if x in a: nil

   else: write(stdout, "BUG: something not in a!\n")

 

 for x in low(TTokTypeRange) .. high(TTokTypeRange):

   if x in tokTypes:

-    writeln(stdout, "the token '$1' is in the set" % repr(x))

+    nil
+    #writeln(stdout, "the token '$1' is in the set" % repr(x))

 

 #OUT Ha ein F ist in s!

diff --git a/tests/tstreams.nim b/tests/tstreams.nim
new file mode 100644
index 000000000..68ca8eeeb
--- /dev/null
+++ b/tests/tstreams.nim
@@ -0,0 +1,7 @@
+import streams
+
+var outp = newFileStream(stdout)
+var inp = newFileStream(stdin)
+write(outp, "Hallo! What is your name?")
+var line = readLine(inp)
+write(outp, "nice name: " & line)
diff --git a/tests/ttempl.nim b/tests/ttempl.nim
new file mode 100644
index 000000000..dcf096671
--- /dev/null
+++ b/tests/ttempl.nim
@@ -0,0 +1,27 @@
+# Test the new template file mechanism
+
+import
+  os, times
+
+include "sunset.tmpl"
+
+const
+  tabs = [["home", "index"],
+          ["news", "news"],
+          ["documentation", "documentation"],
+          ["download", "download"],
+          ["FAQ", "question"],
+          ["links", "links"]]
+
+
+var i = 0
+for item in items(tabs): 
+  var content = $i
+  var file: TFile
+  if openFile(file, changeFileExt(item[1], "html"), fmWrite): 
+    write(file, sunsetTemplate(current=item[1], ticker="", content=content,
+                               tabs=tabs))
+    closeFile(file)
+  else:
+    write(stdout, "cannot open file for writing")
+  inc(i)
diff --git a/tests/tvarnums.nim b/tests/tvarnums.nim
index 5079e0e16..1b683ad94 100644
--- a/tests/tvarnums.nim
+++ b/tests/tvarnums.nim
@@ -66,13 +66,13 @@ proc toNum(b: TBuffer): int32 =
   result = ze(b[0]) and 63

   var

     i = 0

-    Shift = 6

+    Shift = 6'i32

   while (ze(b[i]) and 128) != 0:

     inc(i)

-    result = result or int32((ze(b[i]) and 127) shl Shift)

-    inc(Shift, 7)

+    result = result or ((int32(ze(b[i])) and 127'i32) shl Shift)

+    Shift = shift + 7'i32

   if (ze(b[0]) and (1 shl 6)) != 0: # sign bit set?

-    result = not int(result) +% 1

+    result = (not result) +% 1'i32

     # this is the same as ``- result``

     # but gives no overflow error for low(int)

 

diff --git a/tests/typalias.nim b/tests/typalias.nim
new file mode 100644
index 000000000..ba9f38ed9
--- /dev/null
+++ b/tests/typalias.nim
@@ -0,0 +1,15 @@
+
+type
+  TMyObj = TYourObj
+  TYourObj = object of TObject
+    x, y: int
+  
+proc init: TYourObj =
+  result.x = 0
+  result.y = -1
+  
+proc f(x: var TYourObj) =
+  nil
+  
+var m: TMyObj = init()
+f(m)
diff --git a/tests/x11test.nim b/tests/x11test.nim
new file mode 100644
index 000000000..2769b6c74
--- /dev/null
+++ b/tests/x11test.nim
@@ -0,0 +1,71 @@
+import xlib, xutil, x, keysym
+
+const
+  WINDOW_WIDTH = 400
+  WINDOW_HEIGHT = 300
+  
+var
+  width, height: int
+  display: PDisplay
+  screen: cint
+  depth: int
+  win: TWindow
+  sizeHints: TXSizeHints
+
+proc create_window = 
+  width = WINDOW_WIDTH
+  height = WINDOW_HEIGHT
+
+  display = XOpenDisplay(nil)
+  if display == nil:
+    echo("Verbindung zum X-Server fehlgeschlagen")
+    quit(1)
+
+  screen = XDefaultScreen(display)
+  depth = XDefaultDepth(display, screen)
+  var rootwin = XRootWindow(display, screen)
+  win = XCreateSimpleWindow(display, rootwin, 100, 10,
+                            width, height, 5,
+                            XBlackPixel(display, screen),
+                            XWhitePixel(display, screen))
+  size_hints.flags = PSize or PMinSize or PMaxSize
+  size_hints.min_width =  width
+  size_hints.max_width =  width
+  size_hints.min_height = height
+  size_hints.max_height = height
+  discard XSetStandardProperties(display, win, "Simple Window", "window",
+                         0, nil, 0, addr(size_hints))
+  discard XSelectInput(display, win, ButtonPressMask or KeyPressMask or 
+                                     PointerMotionMask)
+  discard XMapWindow(display, win)
+
+proc close_window =
+  discard XDestroyWindow(display, win)
+  discard XCloseDisplay(display)
+    
+var
+  xev: TXEvent
+
+proc process_event =
+  var key: TKeySym
+  case int(xev.theType)
+  of KeyPress:
+    key = XLookupKeysym(cast[ptr TXKeyEvent](addr(xev)), 0)
+    if key != 0:
+      echo("keyboard event")
+  of ButtonPressMask, PointerMotionMask:
+    Echo("Mouse event")
+  else: nil
+
+proc eventloop =
+  discard XFlush(display)
+  var num_events = int(XPending(display))
+  while num_events != 0:
+     dec(num_events)
+     discard XNextEvent(display, addr(xev))
+     process_event()
+
+create_window()
+while true:
+  eventloop()
+close_window()
diff --git a/todo.txt b/todo.txt
index 149f9bc30..2cd30ceea 100644
--- a/todo.txt
+++ b/todo.txt
@@ -8,20 +8,15 @@ RST
 
 Bugs
 ----
-- BUG: sigmatch for ``len`` matches the open array too often... *sigh*
-- BUG:
-    for j in 0 .. a.len + b.len - 1: nil
-  where a and b are open arrays does not compile
 
-- BUG: ["sh", "-c", someProcWithOpenArray(openArr)] produces wrong C code
-- BUG: bootstrapping does not work with Borland C
-- BUG: addr/deref does not work when interpreting
-- BUG: Check that pure procs only consist of asm statements (and comments)
-- BUG: tlastmod returns wrong results on BSD (Linux, MacOS X: works)
+- BUG: addr/deref may not work when interpreting
 - BUG: the parser allows empty statements/object case branches
+- BUG: the parser allows to omit commas
 - BUG: when optmizing cgen.c with Visual C++, GCC, LLVM (O3), it breaks.
 - BUG: ``-cc:bcc`` command line option does not error
 - BUG: symbol files still do not work
+- BUG: tlastmod returns wrong results on BSD (Linux, MacOS X: works)
+- BUG: sigmatch for ``len`` matches the open array too often... (?)
 
 
 High priority
@@ -30,7 +25,7 @@ High priority
 - documentation: var types, ``[]`` overloading, ``cast`` and type convertions,
   ``if`` expresssions, (anonymous) procs
 - implement two-phase lookup for generics (this is hard...): This is useful
-  for macros too! Alternative: Explicit early name binding. Both is hard to
+  for macros too! Alternative: Explicit early name binding. Both are hard to
   implement
 - implement closures for the C code generator
 - get rid of ``nkHiddenStdConv`` in several places: this mechanism caused more
@@ -39,7 +34,7 @@ High priority
 
 Library
 -------
-- xml, html, url, cgi, fastcgi: implement from scratch
+- xml, html, url, fastcgi: implement from scratch
 - unicode library
 - socket library (does SDL for us?)
 - osproc for Windows
@@ -325,6 +320,28 @@ Changelog
 - fixed many bugs in ``os`` module for Windows
 - bug in ``semVar`` removed standard convertions
 - BUGFIX: ``setLen`` for sequences may lead to memory leaks
+0.7.1
+- gtk2: cleaned up return types for ``Gtk_*_new`` constructors
+- gtk2: added ``pure`` to ``final`` objects
+- BUGFIX: ``genTypeSection`` uses ``isPureObject`` now
+- BUGFIX: ``GetUniqueType`` was wrong
+- BUGFIX: count references from untraced heap to traced heap!
+- BUGFIX: fixed owner handling bug; only accessible in semantic checking phase  
+- BUGFIX: ``ParamTypesMatch`` generics resulting in openarray now generate the
+  nkHiddenStdConv tree
+- BUGFIX: dynamic libraries are reused again -> much smaller C code is produced
+- small corrections in the manual
+- BUGFIX: the build script did not detect 64 bit Linux
+- BUGFIX: the Pascal version did not compile for 64 bit (TUnsignedHash!)
+- several bugfixes for 64bit version
+- BUGFIX: no index checking was generated for some code that should be checked!
+- BUGFIX: docgen did not escape tokens from highlite module
+- BUGFIX: fixed seldom integer operations
+- BUGFIX: illegal type recursion detection
+- BUGFIX: ``for j in 0 .. a.len`` where a is an open array did not transform
+          correctly
+0.7.2
+- small performance improvements for the RST parser
 
 
 For the next versions
diff --git a/tools/inno.tmpl b/tools/inno.tmpl
new file mode 100644
index 000000000..e2d31eb80
--- /dev/null
+++ b/tools/inno.tmpl
@@ -0,0 +1,180 @@
+#proc GenerateInnoSetup(c: TConfigData): string =
+#  result = ""
+; Default Template for NimInst
+[Setup]
+AppName=$c.name
+AppVerName=$c.name $c.version
+DefaultDirName={code:GiveMeAPath|nimrod}
+DefaultGroupName=$c.name
+AllowNoIcons=yes
+LicenseFile=${expandFilename(c.license)}
+OutputBaseFilename=${c.name}_${c.version}
+Compression=lzma
+SolidCompression=yes
+PrivilegesRequired=none
+ChangesEnvironment=yes
+
+[Languages]
+Name: english; MessagesFile: compiler:Default.isl
+
+[Files]
+  #for f in items(c.commonFiles):
+Source: ${expandFilename(f)}; DestDir: {app}\${extractDir(f)}; Flags: ignoreversion
+  #end for
+  #for f in items(c.windowsFiles):
+Source: ${expandFilename(f)}; DestDir: {app}\${extractDir(f)}; Flags: ignoreversion
+  #end for
+
+[Icons]
+  #if c.app == appConsole:
+Name: {group}\Console for $c.name; Filename: {cmd}
+  #else:
+Name: {group}\$c.name; Filename: {app}
+  #end if
+Name: {group}\Documentation; Filename: {app}\doc\overview.html
+Name: {group}\{cm:UninstallProgram,$c.name}; Filename: {uninstallexe}
+
+  #if c.binPaths.len > 0:
+[Tasks]
+Name: modifypath; Description: &Add $c.name to your system path (if not in path already);
+  #end if
+
+[Code]
+function GiveMeAPath(const DefaultPathName: string): string;
+begin
+  if IsAdminLoggedOn then Result := ExpandConstant('{pf}')
+  else Result := ExpandConstant('{userdocs}');
+  Result := Result + '\' + DefaultPathName;
+end;
+
+  #if c.binPaths.len > 0:
+// ----------------------------------------------------------------------------
+//
+// Inno Setup Ver:  5.2.1
+// Script Version:  1.3.1
+// Author:          Jared Breland <jbreland@legroom.net>
+// Homepage:    http://www.legroom.net/software
+//
+// Script Function:
+//  Enable modification of system path directly from Inno Setup installers
+
+function ModPathDir(): TArrayOfString;
+begin
+  setArrayLength(result, $c.binPaths.len);
+    #var i = 0
+    #for b in items(c.binPaths):
+  result[$i] := ExpandConstant('{app}') + '\$b';
+      #inc(i)
+    #end for
+end;
+
+procedure ModPath();
+var
+  oldpath, newpath, aExecFile: String;
+  pathArr, aExecArr, pathdir: TArrayOfString;
+  i, d: Integer;
+begin
+  // Get array of new directories and act on each individually
+  pathdir := ModPathDir();
+  for d := 0 to GetArrayLength(pathdir)-1 do begin
+    // Modify WinNT path
+    if UsingWinNT() then begin
+      // Get current path, split into an array
+      RegQueryStringValue(HKEY_LOCAL_MACHINE,
+        'SYSTEM\CurrentControlSet\Control\Session Manager\Environment',
+        'Path', oldpath);
+      oldpath := oldpath + ';';
+      i := 0;
+      while (Pos(';', oldpath) > 0) do begin
+        SetArrayLength(pathArr, i+1);
+        pathArr[i] := Copy(oldpath, 0, Pos(';', oldpath)-1);
+        oldpath := Copy(oldpath, Pos(';', oldpath)+1, Length(oldpath));
+        i := i + 1;
+        // Check if current directory matches app dir
+        if pathdir[d] = pathArr[i-1] then begin
+          // if uninstalling, remove dir from path
+          if IsUninstaller() then continue
+          // if installing, abort because dir was already in path
+          else abort;
+        end;
+        // Add current directory to new path
+        if i = 1 then newpath := pathArr[i-1]
+        else newpath := newpath + ';' + pathArr[i-1];
+      end;
+      // Append app dir to path if not already included
+      if not IsUninstaller() then
+        newpath := newpath + ';' + pathdir[d];
+      // Write new path
+      RegWriteStringValue(HKEY_LOCAL_MACHINE,
+        'SYSTEM\CurrentControlSet\Control\Session Manager\Environment',
+        'Path', newpath);
+    end
+    else begin
+      // Modify Win9x path
+      // Convert to shortened dirname
+      pathdir[d] := GetShortName(pathdir[d]);
+      // If autoexec.bat exists, check if app dir already exists in path
+      aExecFile := 'C:\AUTOEXEC.BAT';
+      if FileExists(aExecFile) then begin
+        LoadStringsFromFile(aExecFile, aExecArr);
+        for i := 0 to GetArrayLength(aExecArr)-1 do begin
+          if not IsUninstaller() then begin
+            // If app dir already exists while installing, abort add
+            if (Pos(pathdir[d], aExecArr[i]) > 0) then
+              abort;
+          end
+          else begin
+            // If app dir exists and = what we originally set,
+            // then delete at uninstall
+            if aExecArr[i] = 'SET PATH=%PATH%;' + pathdir[d] then
+              aExecArr[i] := '';
+          end;
+        end;
+      end;
+      // If app dir not found, or autoexec.bat didn't exist, then
+      // (create and) append to current path
+      if not IsUninstaller() then begin
+        SaveStringToFile(aExecFile, #13#10 + 'SET PATH=%PATH%;' + pathdir[d],
+                         True);
+      end
+      else begin
+        // If uninstalling, write the full autoexec out
+        SaveStringsToFile(aExecFile, aExecArr, False);
+      end;
+    end;
+
+    // Write file to flag modifypath was selected
+    // Workaround since IsTaskSelected() cannot be called at uninstall and
+    // AppName and AppId cannot be "read" in Code section
+    if not IsUninstaller() then
+      SaveStringToFile(ExpandConstant('{app}') + '\uninsTasks.txt',
+                       WizardSelectedTasks(False), False);
+  end;
+end;
+
+procedure CurStepChanged(CurStep: TSetupStep);
+begin
+  if CurStep = ssPostInstall then begin
+    if IsTaskSelected('modifypath') then
+      ModPath();
+  end
+end;
+
+procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
+var
+  appdir, selectedTasks: String;
+begin
+  appdir := ExpandConstant('{app}');
+  if CurUninstallStep = usUninstall then begin
+    if LoadStringFromFile(appdir + '\uninsTasks.txt', selectedTasks) then
+      if Pos('modifypath', selectedTasks) > 0 then
+        ModPath();
+    DeleteFile(appdir + '\uninsTasks.txt')
+  end;
+end;
+
+function NeedRestart(): Boolean;
+begin
+  result := IsTaskSelected('modifypath') and not UsingWinNT()
+end;
+  #end if
diff --git a/tools/install.tmpl b/tools/install.tmpl
new file mode 100644
index 000000000..c98cbc8d5
--- /dev/null
+++ b/tools/install.tmpl
@@ -0,0 +1,97 @@
+#subsChar ?
+#proc GenerateInstallScript(c: TConfigData): string = 
+#  result = "#! /bin/sh\n# Generated by niminst\n"
+CC="gcc"
+LINKER="gcc"
+COMP_FLAGS="-w"
+LINK_FLAGS=""
+#  add(result, "# platform detection\n")
+ucpu=`uname -m`
+uos=`uname`
+
+#  add(result, "# convert to lower case:\n")
+upcu=`echo $ucpu | tr "[:upper:]" "[:lower:]"`
+uos=`echo $uos | tr "[:upper:]" "[:lower:]"`
+
+case $uos in
+  *linux* ) 
+    myos="linux" 
+    LINK_FLAGS="$LINK_FLAGS -ldl -lm"
+    ;;
+  *freebsd* ) 
+    myos="freebsd"
+    LINK_FLAGS="$LINK_FLAGS -lm"
+    ;;
+  *openbsd* )
+    myos="openbsd" 
+    LINK_FLAGS="$LINK_FLAGS -lm"
+    ;;
+  *netbsd* )
+    myos="netbsd"
+    LINK_FLAGS="$LINK_FLAGS -lm"
+    ;;
+  *darwin* ) 
+    myos="macosx"
+    LINK_FLAGS="$LINK_FLAGS -ldl -lm"
+    ;;
+  *aix* )
+    myos="aix"
+    LINK_FLAGS="$LINK_FLAGS -ldl -lm"    
+    ;;
+  *solaris* | *sun* ) 
+    myos="solaris"
+    LINK_FLAGS="$LINK_FLAGS -ldl -lm"
+    ;;
+  *) 
+    echo "Error: unknown operating system: $uos"
+    exit 1
+    ;;
+esac
+
+case $ucpu in
+  *i386* | *i486* | *i586* | *i686* ) 
+    mycpu="i386" ;;
+  *amd*64* | *x86-64* | *x86_64* ) 
+    mycpu="amd64" ;;
+  *sparc*|*sun* ) 
+    mycpu="sparc" ;;
+  *power* ) 
+    mycpu="powerpc" ;;
+  *mips* ) 
+    mycpu="mips" ;;
+  *) 
+    echo "Error: unknown processor: $ucpu"
+    exit 1
+    ;;
+esac
+
+#  add(result, "# write ``build/platdef.c`` file\n")
+cat >build/platdef.c <<EOF
+char* nimOS(void) { return "$myos"; }
+char* nimCPU(void) { return "$mycpu"; }
+EOF
+#  add(result, "# call the compiler:\n")
+
+case $myos in
+#  for osA in 1..c.oses.len:
+?{c.oses[osA-1]}) 
+  case $mycpu in
+#    for cpuA in 1..c.cpus.len:
+  ?{c.cpus[cpuA-1]})
+#      var linkCmd = "build/platdef.o"
+#      for f in items(c.cfiles[osA][cpuA]):
+    echo "$CC $COMP_FLAGS -Ibuild -c ?{f} -o ?{changeFileExt(f, "o")}"
+    $CC $COMP_FLAGS -Ibuild -c ?{f} -o ?{changeFileExt(f, "o")} || exit 1
+#        add(linkCmd, " \\\n" & changeFileExt(f, "o"))
+#      end for    
+    $CC $COMP_FLAGS -Ibuild -c build/platdef.c -o build/platdef.o || exit 1
+    echo "$LINKER $LINK_FLAGS -o ?{c.binPaths[0]}/?{toLower(c.name)} ?linkCmd"
+    $LINKER $LINK_FLAGS -o ?{c.binPaths[0]}/?{toLower(c.name)} ?linkCmd || exit 1
+    ;;
+#    end for
+  esac
+  ;;
+#  end for
+esac
+
+echo "SUCCESS"
diff --git a/tools/niminst b/tools/niminst
new file mode 100644
index 000000000..1eb39a5b6
--- /dev/null
+++ b/tools/niminst
Binary files differdiff --git a/tools/niminst.nim b/tools/niminst.nim
new file mode 100644
index 000000000..2418ea6c9
--- /dev/null
+++ b/tools/niminst.nim
@@ -0,0 +1,346 @@
+#
+#
+#        The Nimrod Installation Generator
+#        (c) Copyright 2008 Andreas Rumpf
+#
+#    See the file "copying.txt", included in this
+#    distribution, for details about the copyright.
+#
+
+const
+  haveZipLib = defined(unix)
+
+when haveZipLib:
+  import zipfiles
+
+import
+  os, strutils, parseopt, parsecfg, strtabs, streams
+
+const
+  maxOS = 20 # max number of OSes
+  maxCPU = 10 # max number of CPUs
+  buildShFile = "build.sh"
+
+type
+  TAppType = enum appConsole, appGUI
+  TAction = enum
+    actionNone,   # action not yet known
+    actionCSource # action: create C sources
+    actionInno,   # action: create Inno Setup installer
+    actionZip     # action: create zip file
+  TConfigData = object of TObject
+    actions: set[TAction]
+    commonFiles, windowsFiles, unixFiles, binPaths, authors,
+      oses, cpus: seq[string]
+    cfiles: array[1..maxOS, array[1..maxCPU, seq[string]]]
+    ccompiler, innosetup: tuple[path, flags: string]
+    name, version, description, license, infile, outdir: string
+    innoSetupFlag, installScript, uninstallScript: bool
+    vars: PStringTable
+    app: TAppType
+    nimrodArgs: string
+
+proc initConfigData(c: var TConfigData) =
+  c.actions = {}
+  c.commonFiles = @[]
+  c.windowsFiles = @[]
+  c.unixFiles = @[]
+  c.binPaths = @[]
+  c.authors = @[]
+  c.oses = @[]
+  c.cpus = @[]
+  c.ccompiler = ("", "")
+  c.innosetup = ("", "")
+  c.name = ""
+  c.version = ""
+  c.description = ""
+  c.license = ""
+  c.infile = ""
+  c.outdir = ""
+  c.nimrodArgs = ""
+  c.innoSetupFlag = false
+  c.installScript = false
+  c.uninstallScript = false
+  c.vars = newStringTable(modeStyleInsensitive)
+
+include "inno.tmpl"
+include "install.tmpl"
+
+# ------------------------- configuration file -------------------------------
+
+const
+  Version = "0.5"
+  Usage = "niminst - Nimrod Installation Generator Version " & version & """
+
+  (c) 2008 Andreas Rumpf
+Usage:
+  niminst [options] command[;command2...] ini-file[.ini] [compile_options]
+Command:
+  csource             build C source code for source based installations
+  zip                 build the ZIP file
+  inno                build the Inno Setup installer
+Options:
+  -o, --output:dir    set the output directory
+  --var:name=value    set the value of a variable
+  -h, --help          shows this help
+  -v, --version       shows the version
+Compile_options:
+  will be passed to the Nimrod compiler
+"""
+
+proc parseCmdLine(c: var TConfigData) =
+  var p = init()
+  while true:
+    next(p)
+    var kind = p.kind
+    var key = p.key
+    var val = p.val
+    case kind
+    of cmdArgument:
+      if c.actions == {}:
+        for a in split(normalize(key), {';', ','}):
+          case a
+          of "csource": incl(c.actions, actionCSource)
+          of "zip": incl(c.actions, actionZip)
+          of "inno": incl(c.actions, actionInno)
+          else: quit(Usage)
+      else:
+        c.infile = appendFileExt(key, "ini")
+        c.nimrodArgs = getRestOfCommandLine(p)
+        break
+    of cmdLongOption, cmdShortOption:
+      case normalize(key)
+      of "help", "h": write(stdout, Usage)
+      of "version", "v": writeln(stdout, Version)
+      of "o", "output": c.outdir = val
+      of "var":
+        var idx = findSubStr('=', val)
+        if idx < 0: quit("invalid command line")
+        c.vars[copy(val, 0, idx-1)] = copy(val, idx+1)
+      else: quit(Usage)
+    of cmdEnd: break
+  if c.infile.len == 0: quit(Usage)
+
+proc walkDirRecursively(s: var seq[string], root: string) =
+  for k, f in walkDir(root):
+    case k
+    of pcFile, pcLinkToFile: add(s, UnixToNativePath(f))
+    of pcDirectory: walkDirRecursively(s, f)
+    of pcLinkToDirectory: nil
+
+proc addFiles(s: var seq[string], patterns: seq[string]) =
+  for p in items(patterns):
+    if existsDir(p):
+      walkDirRecursively(s, p)
+    else:
+      var i = 0
+      for f in walkFiles(p):
+        add(s, UnixToNativePath(f))
+        inc(i)
+      if i == 0: echo("[Warning] No file found that matches: " & p)
+
+proc pathFlags(p: var TCfgParser, k, v: string,
+               t: var tuple[path, flags: string]) =
+  case normalize(k)
+  of "path": t.path = v
+  of "flags": t.flags = v
+  else: quit(errorStr(p, "unknown variable: " & k))
+
+proc parseIniFile(c: var TConfigData) =
+  var
+    p: TCfgParser
+    section: string # current section
+  var input = newFileStream(c.infile, fmRead)
+  if input != nil:
+    open(p, input, c.infile)
+    while true:
+      var k = next(p)
+      case k.kind
+      of cfgEof: break
+      of cfgSectionStart:
+        section = normalize(k.section)
+        case section
+        of "innosetup": c.innoSetupFlag = true
+        of "installscript": c.installScript = true
+        of "uninstallscript": c.uninstallScript = true
+        of "var", "project", "common", "ccompiler", "windows", "unix", "7z": nil
+        else: nil # quit(errorStr(p, "invalid section: " & section))
+
+      of cfgKeyValuePair:
+        var v = k.value % c.vars
+        c.vars[k.key] = v
+
+        case section
+        of "project":
+          case normalize(k.key)
+          of "name": c.name = v
+          of "version": c.version = v
+          of "os": c.oses = splitSeq(v, {';'})
+          of "cpu": c.cpus = splitSeq(v, {';'})
+          of "authors": c.authors = splitSeq(v, {';'})
+          of "description": c.description = v
+          of "app":
+            case normalize(v)
+            of "console": c.app = appConsole
+            of "gui": c.app = appGUI
+            else: quit(errorStr(p, "expected: console or gui"))
+          of "license": c.license = UnixToNativePath(k.value)
+          else: quit(errorStr(p, "unknown variable: " & k.key))
+        of "var": nil
+        of "installscript", "uninstallscript":
+          quit(errorStr(p, "unknown variable: " & k.key))
+        of "common":
+          case normalize(k.key)
+          of "files": addFiles(c.commonFiles, splitSeq(v, {';'}))
+          else: quit(errorStr(p, "unknown variable: " & k.key))
+        of "innosetup": pathFlags(p, k.key, v, c.innoSetup)
+        of "ccompiler": pathFlags(p, k.key, v, c.ccompiler)
+        of "windows":
+          case normalize(k.key)
+          of "files": addFiles(c.windowsFiles, splitSeq(v, {';'}))
+          of "binpath": c.binPaths = splitSeq(v, {';'})
+          else: quit(errorStr(p, "unknown variable: " & k.key))
+        of "unix":
+          case normalize(k.key)
+          of "files": addFiles(c.unixFiles, splitSeq(v, {';'}))
+          else: quit(errorStr(p, "unknown variable: " & k.key))
+        else: nil
+
+      of cfgOption: quit(errorStr(p, "syntax error"))
+      of cfgError: quit(errorStr(p, k.msg))
+    close(p)
+    if c.name.len == 0: c.name = changeFileExt(extractFilename(c.infile), "")
+  else:
+    quit("cannot open: " & c.infile)
+
+# ------------------------- generate source based installation ---------------
+
+proc readCFiles(c: var TConfigData, osA, cpuA: int) =
+  var cfg: TCfgParser
+  var cfilesSection = false
+  var f = extractDir(c.infile) / "mapping.txt"
+  c.cfiles[osA][cpuA] = @[]
+  var input = newFileStream(f, fmRead)
+  if input != nil:
+    open(cfg, input, f)
+    while true:
+      var k = next(cfg)
+      case k.kind
+      of cfgEof: break
+      of cfgSectionStart:
+        if cfilesSection: break
+        cfilesSection = cmpIgnoreStyle(k.section, "cfiles") == 0
+      of cfgKeyValuePair: nil
+      of cfgOption:
+        if cfilesSection and cmpIgnoreStyle(k.key, "file") == 0:
+          add(c.cfiles[osA][cpuA], k.value)
+      of cfgError: quit(errorStr(cfg, k.msg))
+    close(cfg)
+  else:
+    quit("Cannot open: " & f)
+
+proc buildDir(os, cpu: int): string =
+  return "build" / ($os & "_" & $cpu)
+
+proc srcdist(c: var TConfigData) =
+  for x in walkFiles("lib/*.h"): CopyFile("build" / extractFilename(x), x)
+  for osA in 1..c.oses.len:
+    for cpuA in 1..c.cpus.len:
+      var dir = buildDir(osA, cpuA)
+      createDir(dir)
+      var cmd = ("nimrod compile -f --symbolfiles:off --compileonly " &
+                 "--gen_mapping $1 " &
+                 " --os:$2 --cpu:$3 $4") %
+                 [c.nimrodArgs, c.oses[osA-1], c.cpus[cpuA-1],
+                 changeFileExt(c.infile, "nim")]
+      echo("Executing: " & cmd)
+      if executeShellCommand(cmd) != 0:
+        quit("Error: call to nimrod compiler failed")
+      readCFiles(c, osA, cpuA)
+      for i in 0 .. c.cfiles[osA][cpuA].len-1:
+        var dest = dir / extractFilename(c.cfiles[osA][cpuA][i])
+        CopyFile(dest, c.cfiles[osA][cpuA][i])
+        c.cfiles[osA][cpuA][i] = dest
+  # second pass: remove duplicate files
+  for osA in countdown(c.oses.len, 1):
+    for cpuA in countdown(c.cpus.len, 1):
+      for i in 0..c.cfiles[osA][cpuA].len-1:
+        var dup = c.cfiles[osA][cpuA][i]
+        var f = extractFilename(dup)
+        for osB in 1..c.oses.len:
+          for cpuB in 1..c.cpus.len:
+            if osB != osA or cpuB != cpuA:
+              var orig = buildDir(osB, cpuB) / f
+              if ExistsFile(orig) and ExistsFile(dup) and
+                  sameFileContent(orig, dup):
+                # file is identical, so delete duplicate:
+                RemoveFile(dup)
+                c.cfiles[osA][cpuA][i] = orig
+  var scrpt = GenerateInstallScript(c)
+  var f: TFile
+  if openFile(f, buildShFile, fmWrite):
+    writeln(f, scrpt)
+    closeFile(f)
+  else:
+    quit("Cannot open for writing: " & buildShFile)
+
+# --------------------- generate inno setup -----------------------------------
+proc setupDist(c: var TConfigData) =
+  var scrpt = GenerateInnoSetup(c)
+  var f: TFile
+  var n = "build" / "install_$1_$2.iss" % [toLower(c.name), c.version]
+  if openFile(f, n, fmWrite):
+    writeln(f, scrpt)
+    closeFile(f)
+    when defined(windows):
+      if c.innoSetup.path.len == 0:
+        c.innoSetup.path = "iscc.exe"
+      var outcmd = if c.outdir.len == 0: "build" else: c.outdir
+      var cmd = "$1 $2 /O$3 $4" % [c.innoSetup.path, c.innoSetup.flags,
+                                   outcmd, n]
+      Echo("Executing: " & cmd)
+      if executeShellCommand(cmd) == 0:
+        removeFile(n)
+      else:
+        quit("External program failed")
+  else:
+    quit("Cannot open for writing: " & n)
+
+# ------------------ generate ZIP file ---------------------------------------
+when haveZipLib:
+  proc zipDist(c: var TConfigData) =
+    var proj = toLower(c.name)
+    var n = "$1_$2.zip" % [proj, c.version]
+    if c.outdir.len == 0: n = "build" / n
+    else: n = c.outdir / n
+    var z: TZipArchive
+    if open(z, n, fmWrite):
+      addFile(z, proj / buildShFile, buildShFile)
+      for f in walkFiles("lib/*.h"):
+        addFile(z, proj / "build" / extractFilename(f), f)
+      for osA in 1..c.oses.len:
+        for cpuA in 1..c.cpus.len:
+          var dir = buildDir(osA, cpuA)
+          for k, f in walkDir(dir):
+            if k == pcFile: addFile(z, proj / dir / extractFilename(f), f)
+      for f in items(c.commonFiles): addFile(z, proj / f, f)
+      for f in items(c.unixFiles): addFile(z, proj / f, f)
+      close(z)
+    else:
+      quit("Cannot open for writing: " & n)
+
+# ------------------- main ----------------------------------------------------
+
+var c: TConfigData
+initConfigData(c)
+parseCmdLine(c)
+parseIniFile(c)
+if actionInno in c.actions:
+  setupDist(c)
+if actionCSource in c.actions:
+  srcdist(c)
+if actionZip in c.actions:
+  when haveZipLib:
+    zipdist(c)
+  else:
+    quit("libzip is not installed")
diff --git a/tools/nimweb.nim b/tools/nimweb.nim
new file mode 100644
index 000000000..4835c5f4f
--- /dev/null
+++ b/tools/nimweb.nim
@@ -0,0 +1,203 @@
+#
+#
+#        The Nimrod Website Generator
+#        (c) Copyright 2008 Andreas Rumpf
+#
+#    See the file "copying.txt", included in this
+#    distribution, for details about the copyright.
+#
+
+import
+  os, strutils, times, parseopt, parsecfg, streams, strtabs
+
+type
+  TKeyValPair = tuple[key, val: string]
+  TConfigData = object of TObject
+    tabs, links: seq[TKeyValPair]
+    doc, srcdoc, webdoc: seq[string]
+    authors, projectName, projectTitle, infile, outdir, ticker: string
+    vars: PStringTable
+    nimrodArgs: string
+
+proc initConfigData(c: var TConfigData) =
+  c.tabs = @[]
+  c.links = @[]
+  c.doc = @[]
+  c.srcdoc = @[]
+  c.webdoc = @[]
+  c.infile = ""
+  c.outdir = ""
+  c.nimrodArgs = ""
+  c.authors = ""
+  c.ticker = ""
+  c.vars = newStringTable(modeStyleInsensitive)
+
+include "sunset.tmpl"
+
+# ------------------------- configuration file -------------------------------
+
+const
+  Version = "0.5"
+  Usage = "nimweb - Nimrod Installation Generator Version " & version & """
+
+  (c) 2008 Andreas Rumpf
+Usage:
+  nimweb [options] ini-file[.ini] [compile_options]
+Options:
+  -o, --output:dir    set the output directory (default: same as ini-file)
+  --var:name=value    set the value of a variable
+  -h, --help          shows this help
+  -v, --version       shows the version
+Compile_options:
+  will be passed to the Nimrod compiler
+"""
+
+proc parseCmdLine(c: var TConfigData) =
+  var p = init()
+  while true:
+    next(p)
+    var kind = p.kind
+    var key = p.key
+    var val = p.val
+    case kind
+    of cmdArgument:
+      c.infile = appendFileExt(key, "ini")
+      c.nimrodArgs = getRestOfCommandLine(p)
+      break
+    of cmdLongOption, cmdShortOption:
+      case normalize(key)
+      of "help", "h": write(stdout, Usage)
+      of "version", "v": writeln(stdout, Version)
+      of "o", "output": c.outdir = val
+      of "var":
+        var idx = findSubStr('=', val)
+        if idx < 0: quit("invalid command line")
+        c.vars[copy(val, 0, idx-1)] = copy(val, idx+1)
+      else: quit(Usage)
+    of cmdEnd: break
+  if c.infile.len == 0: quit(Usage)
+
+proc walkDirRecursively(s: var seq[string], root, ext: string) =
+  for k, f in walkDir(root):
+    case k
+    of pcFile, pcLinkToFile: 
+      if cmpIgnoreCase(ext, extractFileExt(f)) == 0:
+        add(s, f)
+    of pcDirectory: walkDirRecursively(s, f, ext)
+    of pcLinkToDirectory: nil
+
+proc addFiles(s: var seq[string], dir, ext: string, patterns: seq[string]) =
+  for p in items(patterns):
+    if existsDir(dir / p):
+      walkDirRecursively(s, dir / p, ext)
+    else:
+      add(s, dir / appendFileExt(p, ext))
+
+proc parseIniFile(c: var TConfigData) =
+  var
+    p: TCfgParser
+    section: string # current section
+  var input = newFileStream(c.infile, fmRead)
+  if input != nil:
+    open(p, input, c.infile)
+    while true:
+      var k = next(p)
+      case k.kind
+      of cfgEof: break
+      of cfgSectionStart:
+        section = normalize(k.section)
+        case section
+        of "project", "links", "tabs", "ticker", "documentation", "var": nil
+        else: echo("[Warning] Skipping unknown section: " & section)
+
+      of cfgKeyValuePair:
+        var v = k.value % c.vars
+        c.vars[k.key] = v
+
+        case section
+        of "project":
+          case normalize(k.key)
+          of "name": c.projectName = v
+          of "title": c.projectTitle = v
+          of "authors": c.authors = v
+          else: quit(errorStr(p, "unknown variable: " & k.key))
+        of "var": nil
+        of "links": add(c.links, (key: k.key, val: v))
+        of "tabs": add(c.tabs, (key: k.key, val: v))
+        of "ticker": c.ticker = v
+        of "documentation": 
+          case normalize(k.key)
+          of "doc": addFiles(c.doc, "doc", "txt" splitSeq(v, {';'}))
+          of "srcdoc": addFiles(c.srcdoc, "lib", "nim", splitSeq(v, {';'}))
+          of "webdoc": addFiles(c.webdoc, "lib", "nim", splitSeq(v, {';'}))
+          else: quit(errorStr(p, "unknown variable: " & k.key))
+        else: nil
+
+      of cfgOption: quit(errorStr(p, "syntax error"))
+      of cfgError: quit(errorStr(p, k.msg))
+    close(p)
+    if c.projectName.len == 0: 
+      c.projectName = changeFileExt(extractFilename(c.infile), "")
+    if c.outdir.len == 0:
+      c.outdir = extractDir(c.infile)
+  else:
+    quit("cannot open: " & c.infile)
+
+# ------------------- main ----------------------------------------------------
+
+proc Exec(cmd: string) = 
+  echo(cmd)
+  if os.executeShellCommand(cmd) != 0: quit("external program failed")
+
+proc buildDoc(c: var TConfigData, destPath: string) =
+  # call nim for the documentation:
+  for d in items(c.doc):
+    Exec("nimrod rst2html $1 -o:$2 --index=$3/theindex $4" % 
+      [c.nimrodArgs, destPath / changeFileExt(extractFileTrunk(d), "html"), 
+       destpath, d])
+  for d in items(c.srcdoc):
+    Exec("nimrod doc $1 -o:$2 --index=$3/theindex $4" % 
+      [c.nimrodArgs, destPath / changeFileExt(extractFileTrunk(d), "html"),
+       destpath, d])
+  Exec("nimrod rst2html $1 -o:$2/theindex.html $2/theindex" % 
+       [c.nimrodArgs, destPath])
+
+proc buildAddDoc(c: var TConfigData, destPath: string) = 
+  # build additional documentation (without the index):
+  for d in items(c.webdoc):
+    Exec("nimrod doc $1 -o:$2 $3" % 
+      [c.nimrodArgs, destPath / changeFileExt(extractFileTrunk(d), "html"), d])
+
+proc main(c: var TConfigData) = 
+  const
+    cmd = "nimrod rst2html --compileonly $1 -o:web/$2.temp web/$2.txt"
+  if c.ticker.len > 0: 
+    Exec(cmd % [c.nimrodArgs, c.ticker])
+    var temp = "web" / changeFileExt(c.ticker, "temp")
+    c.ticker = readFile(temp)
+    if isNil(c.ticker): quit("[Error] cannot open:" & temp)
+    RemoveFile(temp)
+  for i in 0..c.tabs.len-1:
+    var file = c.tabs[i].val
+    Exec(cmd % [c.nimrodArgs, file])
+    var temp = "web" / changeFileExt(file, "temp")
+    var content = readFile(temp)
+    if isNil(content): quit("[Error] cannot open: " & temp)
+    var f: TFile
+    var outfile = "web/upload/$1.html" % file
+    if openFile(f, outfile, fmWrite):
+      writeln(f, generateHTMLPage(c, file, content))
+      closeFile(f)
+    else:
+      quit("[Error] cannot write file: " & outfile)
+    removeFile(temp)
+  
+  buildAddDoc(c, "web/upload")
+  buildDoc(c, "web/upload")
+  buildDoc(c, "doc")
+
+var c: TConfigData
+initConfigData(c)
+parseCmdLine(c)
+parseIniFile(c)
+main(c)
diff --git a/tools/sunset.tmpl b/tools/sunset.tmpl
new file mode 100644
index 000000000..02e49218c
--- /dev/null
+++ b/tools/sunset.tmpl
@@ -0,0 +1,72 @@
+#proc generateHTMLPage(c: var TConfigData, currentTab, content: string): string = 
+#  result = ""
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
+
+<head>
+  <title>$c.projectTitle</title>
+  <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
+  <link rel="stylesheet" type="text/css" href="style/style.css" />
+</head>
+
+<body>
+  <div id="main">
+    <div id="links">
+      <!-- **** INSERT LINKS HERE **** -->
+    </div>
+    <div id="logo"><h1>$c.projectTitle</h1></div>
+    <div id="content">
+      <div id="menu">
+        <ul>
+#for i in 0.. c.tabs.len-1:
+#  var name = c.tabs[i].key
+#  var t = c.tabs[i].val
+  #if currentTab == t:
+  <li><a id="selected" 
+  #else:
+  <li><a
+  #end if
+  href="${t}.html" title = "$c.projectName - $name">$name</a></li>
+#end for
+        </ul>
+      </div>
+      <div id="column1">
+#  if len(c.ticker) > 0:
+        <div class="sidebaritem">
+          <div class="sbihead">
+            <h1>latest news</h1>
+          </div>
+          <div class="sbicontent">
+            $c.ticker
+          </div>
+        </div>
+#  end if
+#  if len(c.links) > 0:
+        <div class="sidebaritem">
+          <div class="sbihead">
+            <h1>additional links</h1>
+          </div>
+          <div class="sbilinks">
+            <!-- **** INSERT ADDITIONAL LINKS HERE **** -->
+            <ul>
+#          for i in 0..c.links.len-1:
+             <li><a class="reference" href="${c.links[i].val}">${c.links[i].key}</a></li>
+#          end for
+            </ul>
+          </div>
+        </div>
+#  end if
+      </div>
+      <div id="column2">
+      $content
+      </div>
+    </div>
+    <div id="footer">
+      copyright &copy; 2008 $c.authors | Last update: ${getDateStr()}
+      | <a class="reference" href="http://validator.w3.org/check?uri=referer">XHTML 1.1</a>
+      | <a class="reference" href="http://jigsaw.w3.org/css-validator/check/referer">CSS</a>
+      | <a class="reference" href="http://www.dcarter.co.uk">design by dcarter</a>
+    </div>
+  </div>
+</body>
+</html>