Merge playlist support.
authorRichard Kettlewell <rjk@greenend.org.uk>
Sat, 10 Oct 2009 20:03:23 +0000 (21:03 +0100)
committerRichard Kettlewell <rjk@greenend.org.uk>
Sat, 10 Oct 2009 20:03:23 +0000 (21:03 +0100)
131 files changed:
.bzrignore
CHANGES.html
Doxyfile
README
README.developers
README.reload [new file with mode: 0644]
README.upgrades
cgi/Makefile.am
cgi/cgimain.c
clients/Makefile.am
clients/disorder.c
clients/playrtp-alsa.c [deleted file]
clients/playrtp-coreaudio.c [deleted file]
clients/playrtp-oss.c [deleted file]
clients/playrtp.c
clients/playrtp.h
clients/rtpmon.c [new file with mode: 0644]
configure.ac
debian/Makefile.am
debian/control
debian/overrides.disorder-server [new file with mode: 0644]
debian/postinst.disobedience
debian/postinst.disorder-server
debian/postrm.disobedience
debian/postrm.disorder-server
debian/rules
disobedience/Makefile.am
disobedience/control.c
disobedience/disobedience.c
disobedience/disobedience.h
disobedience/login.c
disobedience/menu.c
doc/disobedience.1.in
doc/disorder-playrtp.1.in
doc/disorder.1.in
doc/disorder.3
doc/disorder_config.5.in
doc/disorder_protocol.5.in
doc/disorderd.8.in
images/Makefile.am
images/duck55.png [new file with mode: 0644]
lib/Makefile.am
lib/addr.c
lib/addr.h
lib/alsabg.c [deleted file]
lib/alsabg.h [deleted file]
lib/basen.c
lib/basen.h
lib/client-common.c
lib/client.c
lib/configuration.c
lib/configuration.h
lib/coreaudio.c [new file with mode: 0644]
lib/coreaudio.h [moved from server/api-client.h with 64% similarity]
lib/log-impl.h [deleted file]
lib/log.c
lib/log.h
lib/macros-builtin.c
lib/mem-impl.h [deleted file]
lib/mem.c
lib/mem.h
lib/mixer-alsa.c [deleted file]
lib/mixer-oss.c [deleted file]
lib/mixer.c [deleted file]
lib/mixer.h [deleted file]
lib/queue.c
lib/queue.h
lib/random.c
lib/timeval.h
lib/trackdb-stub.c
lib/trackdb.c
lib/uaudio-alsa.c [new file with mode: 0644]
lib/uaudio-apis.c [new file with mode: 0644]
lib/uaudio-command.c [new file with mode: 0644]
lib/uaudio-coreaudio.c [new file with mode: 0644]
lib/uaudio-oss.c [new file with mode: 0644]
lib/uaudio-rtp.c [new file with mode: 0644]
lib/uaudio-schedule.c [new file with mode: 0644]
lib/uaudio-thread.c [new file with mode: 0644]
lib/uaudio.c [new file with mode: 0644]
lib/uaudio.h [new file with mode: 0644]
lib/unicode.c
lib/unidata.c
lib/unidata.h
lib/wstat.c
lib/wstat.h
libtests/t-addr.c
libtests/t-basen.c
libtests/t-event.c
libtests/t-unicode.c
plugins/Makefile.am
python/disorder.py.in
scripts/make-unidata
server/Makefile.am
server/api-client.c [deleted file]
server/api.c
server/background.c [new file with mode: 0644]
server/choose.c
server/dbparams.c [new file with mode: 0644]
server/dbupgrade.c
server/deadlock.c
server/decode.c
server/disorder-server.h
server/disorderd.c
server/dump.c
server/endian.c [new file with mode: 0644]
server/normalize.c
server/play.c
server/queue-ops.c
server/rescan.c
server/server-queue.c
server/server.c
server/speaker-alsa.c [deleted file]
server/speaker-command.c [deleted file]
server/speaker-coreaudio.c [deleted file]
server/speaker-network.c [deleted file]
server/speaker-oss.c [deleted file]
server/speaker.c
server/speaker.h [deleted file]
server/state.c
server/stats.c
server/trackname.c
sounds/Makefile.am
templates/Makefile.am
templates/about.tmpl
templates/macros.tmpl
tests/Makefile.am
tests/dtest.py
tests/fail.py [new file with mode: 0755]
tests/hashes.py [new file with mode: 0755]
tests/schedule.py

index 022ddca..3b13be6 100644 (file)
@@ -200,3 +200,6 @@ doc/disorder_preferences.5.html
 plugins/index.html
 doc/disorder-choose.8
 doc/disorder-choose.8.html
+config.aux/compile
+server/endian
+clients/rtpmon
index 6dca25c..8b0b28f 100644 (file)
@@ -58,6 +58,137 @@ span.command {
 <p>This file documents recent user-visible changes to <a
  href="http://www.greenend.org.uk/rjk/disorder/">DisOrder</a>.</p>
 
+<h2>Changes up to version 4.4</h2>
+
+  <div class=section>
+  
+    <h3>Server</h3>
+    <div class=section>
+
+      <p>The <tt>device</tt> configuration option now works under OS X.
+      Devices may
+      be specified either by UID or name.  Fixes <a
+       href="http://code.google.com/p/disorder/issues/detail?id=27">Issue
+      27</a>.</p>
+
+      <p>Gapless play should be more reliable, and playback latency over RTP
+      should be a bit lower.  Note though that all the sound output code has
+      been reorganized and in some cases completely rewritten, so it's possible
+      that bugs may have been (re-)introduced.</p>
+      
+      <p>The <tt>command</tt> backend now (optionally) sends silence instead
+      of suspending writes when a pause occurs or no track is playing.</p>
+      
+    </div>
+      
+    <h3>Web Interface</h3>
+    <div class=section>
+
+      <p>Confirmation URLs should be cleaner (and in particular not end
+      with punctuation).  (Please see <a
+      href="README.upgrades">README.upgrades</a> for more about this.)</p>
+      
+    </div>
+      
+    <h3>RTP Player</h3>
+  
+    <div class=section>
+
+      <p>There is a new <tt>--command</tt> option which allows the RTP player
+      to send audio data to a user-chosen command instead of an audio API. See
+      the man page for details.</p>
+      
+      <p>The <tt>--device</tt> option to <tt>disorder-playrtp</tt> now works
+      under OS X (as above).</p>
+        
+    </div>
+      
+    <h3>General</h3>
+
+    <div class=section>
+
+      <p>IPv6 should now work.  Network address specifications
+      (<tt>listen</tt>, <tt>connect</tt> etc) can now be prefixed with
+      <tt>-4</tt> or <tt>-6</tt> to force use
+      of IPv4 or IPv6, though normally this should not be needed.</p>
+
+      <p>Unicode support has been upgraded to <a
+      href="http://www.unicode.org/versions/Unicode5.1.0/">Unicode
+      5.1.0</a>.</p>
+
+      <p>Various elements of the source code have been
+      rationalized.</p>
+      
+    </div>
+    
+    <h3>Bugs fixed</h3>
+  
+    <div class=section>
+
+      <table class=bugs>
+        <tr>
+          <th>ID</th>
+          <th>Description</th>
+        </tr>
+        
+        <tr>
+          <td><a href="http://code.google.com/p/disorder/issues/detail?id=27">#27</a></td>
+          <td>Mac DisOrder uses wrong sound device</td>
+        </tr>
+
+        <tr>
+          <td><a href="http://code.google.com/p/disorder/issues/detail?id=33">#33</a></d>
+          <td>(Some) plugins need -lm.</td>
+        </tr>
+
+        <tr>
+          <td><a href="http://code.google.com/p/disorder/issues/detail?id=39">#39</a></d>
+          <td>Double bind() non-multicast AF_INET</td>
+        </tr>
+
+        <tr>
+          <td><a href="http://code.google.com/p/disorder/issues/detail?id=40">#40</a></d>
+          <td>Missing stub function</td>
+        </tr>
+
+        <tr>
+          <td><a href="http://code.google.com/p/disorder/issues/detail?id=41">#41</a></d>
+          <td>Missing includes for timeval</td>
+        </tr>
+
+        <tr>
+          <td><a href="http://code.google.com/p/disorder/issues/detail?id=42">#42</a></d>
+          <td>syntax error in empeg_host section</td>
+        </tr>
+
+        <tr>
+          <td><a href="http://code.google.com/p/disorder/issues/detail?id=43">#43</a></d>
+          <td>decoder segfault with FLAC 1.2.1</td>
+        </tr>
+
+        <tr>
+          <td><a href="http://code.google.com/p/disorder/issues/detail?id=44">#44</a></d>
+          <td>gcc 4.3.2-1ubuntu12 SUYB patch</td>
+        </tr>
+
+        <tr>
+          <td><a href="http://code.google.com/p/disorder/issues/detail?id=45">#45</a></d>
+          <td>disobedience doesn't configure its back end</td>
+        </tr>
+
+        <tr>
+          <td><a href="http://code.google.com/p/disorder/issues/detail?id=48">#48</a></d>
+          <td>build-time dependency on <tt>oggdec</tt> removed</td>
+        </tr>
+
+        
+      </table>
+      
+    </div>
+  </div>
+
 <h2>Changes up to version 4.3</h2>
 
   <div class=section>
index c603807..b350738 100644 (file)
--- a/Doxyfile
+++ b/Doxyfile
@@ -53,16 +53,6 @@ CREATE_SUBDIRS         = NO
 
 OUTPUT_LANGUAGE        = English
 
-# This tag can be used to specify the encoding used in the generated output. 
-# The encoding is not always determined by the language that is chosen, 
-# but also whether or not the output is meant for Windows or non-Windows users. 
-# In case there is a difference, setting the USE_WINDOWS_ENCODING tag to YES 
-# forces the Windows encoding (this is the default for the Windows binary), 
-# whereas setting the tag to NO uses a Unix-style encoding (the default for 
-# all platforms other than Windows).
-
-USE_WINDOWS_ENCODING   = NO
-
 # If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will 
 # include brief member descriptions after the members that are listed in 
 # the file and class documentation (similar to JavaDoc). 
@@ -1187,22 +1177,6 @@ DOT_PATH               =
 
 DOTFILE_DIRS           = 
 
-# The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width 
-# (in pixels) of the graphs generated by dot. If a graph becomes larger than 
-# this value, doxygen will try to truncate the graph, so that it fits within 
-# the specified constraint. Beware that most browsers cannot cope with very 
-# large images.
-
-MAX_DOT_GRAPH_WIDTH    = 1024
-
-# The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height 
-# (in pixels) of the graphs generated by dot. If a graph becomes larger than 
-# this value, doxygen will try to truncate the graph, so that it fits within 
-# the specified constraint. Beware that most browsers cannot cope with very 
-# large images.
-
-MAX_DOT_GRAPH_HEIGHT   = 1024
-
 # The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the 
 # graphs generated by dot. A depth value of 3 means that only nodes reachable 
 # from the root by following a path via at most 3 edges will be shown. Nodes 
diff --git a/README b/README
index a7736da..8fa033d 100644 (file)
--- a/README
+++ b/README
@@ -37,7 +37,7 @@ Build dependencies:
   GNU C            4.1.2               }
   GNU Make         3.81                } Non-GNU versions will NOT work
   GNU Sed          4.1.5               }
-  Python           2.4.4               (optional)
+  Python           2.5.2               (optional; 2.4 won't work)
   GTK+             2.8.20              (if you want the GTK+ client)
   GLIB             2.12.4              (if you want the GTK+ client)
 
@@ -88,6 +88,9 @@ platform, please get in touch.
      --without-gtk          Don't build GTK+ client (Disobedience)
      --without-python       Don't build Python support
 
+   On a Mac you can use --with-bits=64 to request a 64-bit build.  The default
+   is 32 bits.  You will need suitable versions of all the libraries used.
+
    If configure cannot guess where your web server keeps its HTML documents and
    CGI programs, you may have to tell it, for instance:
 
@@ -263,7 +266,7 @@ Copyright
   "Nothing but another drug, a licence that you buy and sell"
 
 DisOrder - select and play digital audio files
-Copyright (C) 2003-2008 Richard Kettlewell
+Copyright (C) 2003-2009 Richard Kettlewell
 Portions copyright (C) 2007 Ross Younger
 Portions copyright (C) 2007 Mark Wooding
 Portions extracted from MPG321, http://mpg321.sourceforge.net/
index 10226fd..75c1c44 100644 (file)
@@ -61,16 +61,11 @@ APIs And Formats:
 
    * To support a new sound API:
      1) Teach configure.ac how to detect any libraries required.
-     2) Define a new BACKEND_ value and update configuration.[ch] for it.
-     3) Create a suitable server/speaker-*.c along the pattern of the existing
-        ones.
-     4) If possible create a suitable lib/mixer-*.c.  This doesn't make sense
-        for all APIs (e.g. network), but even for those it does, playback
-        support without volume control support is likely to be acceptable (even
-        if inferior to full support).
+     2) Create lib/uaudio-<name>.c; see uaudio.h for the interface.
+     3) Update the list in lib/uaudio-apis.c
+     4) Add a new option to clients/playrtp.c and document it in
+        doc/disorder-playrtp.1.in (if appropriate).
      5) Update doc/disorder_config.5.in.
-     6) If relevant, create a suitable clients/playrtp-*.c and update
-        doc/disorder-playrtp.1.in.
 
    * To support a new file format:
      1) Teach configure.ac how to detect any libraries required.
@@ -140,8 +135,9 @@ The Server:
 Web Interface:
 
    * The web interface does not use Javascript or Flash and I would like to
-     keep it that way.  Clever use of CSS is OK provided it works well on the
-     mainstream browsers.
+     keep it that way; Javascript might be acceptable but it must degrade
+     gracefuly if disabled.  Clever use of CSS is OK provided it works well on
+     the mainstream browsers.
 
    * Update templates/help.tmpl for any changes you make.
 
diff --git a/README.reload b/README.reload
new file mode 100644 (file)
index 0000000..f9fa4c7
--- /dev/null
@@ -0,0 +1,187 @@
+The effect of "disorder reconfigure"
+====================================
+
+This is current rather vaguely defined and implemented.  This file
+will lay out what you can and cannot change over a reconfigure.  Any
+other changes will require a full server restart.
+
+The situation is gradually improving; this file tracks the current
+state.
+
+* Options that might have to remain the same across restart
+
+Arguably if there is anything in this section then that's a serious
+bug!
+
+** alias (enforced at reload only)
+
+This defines how aliases are inserted into the track database.  Need
+to think about how changing it will affect things.
+
+** namepart (enforced at reload only)
+
+Probably affects alias construction.
+
+** stopword (enforced at reload only)
+
+The search database will have to be rebuilt from scratch.
+
+** user (enforced at reload only)
+
+All the files will be owned by the wrong user!
+
+** Alias, search database, etc
+
+Rescan can regenerate aliases and the search and tag databases but we
+rather assume that they are either empty or good.  Therefore we need
+to store anything that can affect these values and erase them if they
+change.
+
+The solution is a global pref _dbparams which contains the hash of the
+alias, stopword and namepart data.
+
+* Options that must remain the same across reload
+
+Some things will just require a restart.  We should either enforce
+this (refusing to accept modified configurations that purport to
+change them) or explicitly ignore it.
+
+** home (enforced at reload)
+
+We absolutely cannot accept changing our state directory.
+
+** lock (generates a deprecation warning)
+
+Liable to be removed anyway.
+
+** nice_speaker (generates a warning)
+
+You can't renice a running speaker to make it less nice (and we don't
+try to make it more nice).
+
+* Options that ought to be changable across reload but aren't
+
+These options need some work somewhere to be changeable just by a
+reload.
+
+** api
+
+The main server will cope fine with this changing.  The speaker will
+ignore the change however.
+
+** broadcast
+
+The speaker will ignore the change.
+
+** broadcast_from
+
+The speaker will ignore the change.
+
+** collection
+
+If the set of collections change we ought to initiate a rescan.
+
+** device
+
+The speaker will ignore the change.
+
+** multicast_loop
+
+The speaker will ignore the change.
+
+** multicast_ttl
+
+The speaker will ignore the change.
+
+** pause_mode
+
+The speaker will ignore the change.
+
+** sample_format
+
+The speaker will ignore the change.
+
+** speaker_command
+
+The speaker will ignore the change.
+
+* Options that can be changed across reload
+
+These options can be changed at reload and it should just work.
+
+** authorization_algoritm
+
+** channel
+
+** default_rights
+
+** listen
+
+** mixer
+
+** new_bias
+
+** new_bias_age
+
+** new_max
+
+** nice_rescan
+
+Wouldn't affect an already-running rescan, but reload already cancels
+and restarts the underway rescan anyway.
+
+** noticed_history
+
+** reminder_interval
+
+** remote_userman
+
+** replay_min
+
+** signal
+
+** sox_generation
+
+** scratch
+
+* Options that can change, but with a caveat
+
+These options can be changed at reload but there is some caveat about
+this (which ought to be documented, and in some cases is).
+
+** plugins
+
+Plugin path.  You can change the plugin path but an already-loaded
+plugin may stay loaded.
+
+** cookie_key_lifetime
+
+Only affects subsequently generated keys - cannot shorten (or extend)
+the lifetime of the current key.
+
+** cookie_login_lifetime
+
+Only affects subsequently generated cookies - cannot shorten (or
+extend) the lifetime of already-generated cookies.
+
+** history
+
+The history might not shorten until it's next written.
+
+** player
+
+Won't affect running players or decoders.
+
+** queue_pad
+
+Won't shrink the queue.
+
+** tracklength
+
+Won't affect already-computed lengths.
+
+* Implementation Considerations
+
+A likely change is that the speaker will be created on demand and
+stopped when idle.  Some changes will still be handled via SM_RELOAD
+but others may require the speaker to quit and restart.
index c586dd8..b030b5c 100644 (file)
@@ -17,6 +17,39 @@ all 1.1.x versions.
 
 If you install from .deb files then much of this work is automated.
 
+* 4.x -> 5.0
+
+** Web Confirmation Strings
+
+The syntax of confirmation strings for online registrations has changed and old
+ones no longer work.  This only affects users who registered before the upgrade
+but have not yet confirmed their login.  You can delete such half-created users
+with 'disorder deluser USERNAME' (as an administrative user, for instance as
+root on the server) and they can start the registration process again.
+
+** Handling Of Configuration Changes
+
+There is a new mechanism to ensure that the search database and aliases are
+reconstructed if any options that affect them change.  Unfortunately this means
+that the reconstruction step always takes place on upgrade from 4.3 or earlier,
+as those versions don't record sufficient information for the server to tell
+whether it needs to reconstruct or not.
+
+The result will be a log message of the form:
+
+new database parameter string dbparams-0-sha256:61609f3e6395ec8dee317ee216fe2848d70c249d347dd03c6a219441a13dd456 - removing old data
+
+...and a slower rescan on startup.  Subsequent restarts should not have this
+problem (unless of course you change a relevant option).
+
+** Deprecation Notices
+
+The player --wait-for-device option is deprecated and will be removed in a
+future version.
+
+The 'lock' option no longer does anything.  You must delete it from any
+configuration files that contain it.
+
 * 3.0 -> 4.x
 
 If you customized any of the templates, you will pretty much have to start from
index 22e2a77..88cb24d 100644 (file)
@@ -1,6 +1,6 @@
 #
 # This file is part of DisOrder.
-# Copyright (C) 2004-2008 Richard Kettlewell
+# Copyright (C) 2004-2009 Richard Kettlewell
 #
 # 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
@@ -23,7 +23,7 @@ AM_CPPFLAGS=-I${top_srcdir}/lib -I../lib
 disorder_SOURCES=macros-disorder.c lookup.c options.c actions.c        \
        login.c cgimain.c disorder-cgi.h
 disorder_LDADD=../lib/libdisorder.a \
-       $(LIBPCRE) $(LIBGCRYPT) $(LIBDL) $(LIBDB)
+       $(LIBPCRE) $(LIBGCRYPT) $(LIBDL) $(LIBDB) $(LIBICONV)
 disorder_LDFLAGS=-export-dynamic
 disorder_DEPENDENCIES=../lib/libdisorder.a
 
index 583af30..e4c7220 100644 (file)
@@ -48,7 +48,7 @@ int main(int argc, char **argv) {
   if(getenv("DISORDER_DEBUG"))
     debugging = 1;
   /* Read configuration */
-  if(config_read(0/*!server*/))
+  if(config_read(0/*!server*/, NULL))
     exit(EXIT_FAILURE);
   /* Figure out our URL.  This can still be overridden from the config file if
    * necessary but it shouldn't be necessary in ordinary installations. */
index 91d4448..1817f15 100644 (file)
@@ -1,6 +1,6 @@
 #
 # This file is part of DisOrder.
-# Copyright (C) 2006-2008 Richard Kettlewell
+# Copyright (C) 2006-2009 Richard Kettlewell
 #
 # 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
@@ -17,7 +17,7 @@
 #
 
 bin_PROGRAMS=disorder disorderfm disorder-playrtp
-noinst_PROGRAMS=filename-bytes
+noinst_PROGRAMS=filename-bytes rtpmon
 noinst_SCRIPTS=dump2wav
 
 AM_CPPFLAGS=-I${top_srcdir}/lib -I../lib
@@ -25,7 +25,7 @@ AM_CPPFLAGS=-I${top_srcdir}/lib -I../lib
 disorder_SOURCES=disorder.c authorize.c authorize.h \
        ../lib/memgc.c
 disorder_LDADD=$(LIBOBJS) ../lib/libdisorder.a \
-       $(LIBGC) $(LIBGCRYPT) $(LIBPCRE) $(LIBDB)
+       $(LIBGC) $(LIBGCRYPT) $(LIBPCRE) $(LIBICONV) $(LIBDB) $(LIBPTHREAD)
 disorder_DEPENDENCIES=$(LIBOBJS) ../lib/libdisorder.a
 
 disorderfm_SOURCES=disorderfm.c \
@@ -33,13 +33,15 @@ disorderfm_SOURCES=disorderfm.c \
 disorderfm_LDADD=$(LIBOBJS) ../lib/libdisorder.a $(LIBGC) $(LIBICONV)
 disorderfm_DEPENDENCIES=$(LIBOBJS) ../lib/libdisorder.a
 
-disorder_playrtp_SOURCES=playrtp.c playrtp.h playrtp-mem.c \
-                        playrtp-alsa.c playrtp-coreaudio.c playrtp-oss.c
+disorder_playrtp_SOURCES=playrtp.c playrtp.h playrtp-mem.c
 disorder_playrtp_LDADD=$(LIBOBJS) ../lib/libdisorder.a \
        $(LIBASOUND) $(LIBPCRE) $(LIBICONV) $(LIBGCRYPT) $(COREAUDIO) \
-       $(LIBDB) $(LIBPTHREAD)
+       $(LIBDB) $(LIBPTHREAD) -lm
 disorder_playrtp_DEPENDENCIES=$(LIBOBJS) ../lib/libdisorder.a
 
+rtpmon_SOURCES=rtpmon.c
+rtpmon_LDADD=$(LIBOBJS) ../lib/libdisorder.a
+
 filename_bytes_SOURCES=filename-bytes.c
 
 install-exec-hook:
index 4161d93..a246eee 100644 (file)
@@ -32,6 +32,7 @@
 #include <unistd.h>
 #include <pcre.h>
 #include <ctype.h>
+#include <gcrypt.h>
 #include <langinfo.h>
 
 #include "configuration.h"
@@ -51,6 +52,7 @@
 #include "vector.h"
 #include "version.h"
 #include "dateparse.h"
+#include "trackdb.h"
 #include "inputline.h"
 
 static disorder_client *client;
@@ -65,6 +67,7 @@ static const struct option options[] = {
   { "help-commands", no_argument, 0, 'H' },
   { "user", required_argument, 0, 'u' },
   { "password", required_argument, 0, 'p' },
+  { "wait-for-root", no_argument, 0, 'W' },
   { 0, 0, 0, 0 }
 };
 
@@ -159,7 +162,7 @@ static void cf_shutdown(char attribute((unused)) **argv) {
 
 static void cf_reconfigure(char attribute((unused)) **argv) {
   /* Re-check configuration for server */
-  if(config_read(1)) fatal(0, "cannot read configuration");
+  if(config_read(1, NULL)) fatal(0, "cannot read configuration");
   if(disorder_reconfigure(getclient())) exit(EXIT_FAILURE);
 }
 
@@ -811,8 +814,28 @@ static void help_commands(void) {
   exit(0);
 }
 
+static void wait_for_root(void) {
+  const char *password;
+
+  while(!trackdb_readable()) {
+    info("waiting for trackdb...");
+    sleep(1);
+  }
+  trackdb_init(TRACKDB_NO_RECOVER|TRACKDB_NO_UPGRADE);
+  for(;;) {
+    trackdb_open(TRACKDB_READ_ONLY);
+    password = trackdb_get_password("root");
+    trackdb_close();
+    if(password)
+      break;
+    info("waiting for root user to be created...");
+    sleep(1);
+  }
+  trackdb_deinit();
+}
+
 int main(int argc, char **argv) {
-  int n, i, j, local = 0;
+  int n, i, j, local = 0, wfr = 0;
   int status = 0;
   struct vector args;
   const char *user = 0, *password = 0;
@@ -823,7 +846,7 @@ int main(int argc, char **argv) {
   pcre_free = xfree;
   if(!setlocale(LC_CTYPE, "")) fatal(errno, "error calling setlocale");
   if(!setlocale(LC_TIME, "")) fatal(errno, "error calling setlocale");
-  while((n = getopt_long(argc, argv, "+hVc:dHlNu:p:", options, 0)) >= 0) {
+  while((n = getopt_long(argc, argv, "+hVc:dHlNu:p:W", options, 0)) >= 0) {
     switch(n) {
     case 'h': help();
     case 'H': help_commands();
@@ -834,10 +857,11 @@ int main(int argc, char **argv) {
     case 'N': config_per_user = 0; break;
     case 'u': user = optarg; break;
     case 'p': password = optarg; break;
+    case 'W': wfr = 1; break;
     default: fatal(0, "invalid option");
     }
   }
-  if(config_read(0)) fatal(0, "cannot read configuration");
+  if(config_read(0, NULL)) fatal(0, "cannot read configuration");
   if(user) {
     config->username = user;
     config->password = 0;
@@ -845,9 +869,16 @@ int main(int argc, char **argv) {
   if(password)
     config->password = password;
   if(local)
-    config->connect.n = 0;
+    config->connect.af = -1;
+  if(wfr)
+    wait_for_root();
   n = optind;
   optind = 1;                          /* for subsequent getopt calls */
+  /* gcrypt initialization */
+  if(!gcry_check_version(NULL))
+    disorder_fatal(0, "gcry_check_version failed");
+  gcry_control(GCRYCTL_INIT_SECMEM, 0);
+  gcry_control (GCRYCTL_INITIALIZATION_FINISHED, 0);
   /* accumulate command args */
   while(n < argc) {
     if((i = TABLE_FIND(commands, name, argv[n])) < 0)
diff --git a/clients/playrtp-alsa.c b/clients/playrtp-alsa.c
deleted file mode 100644 (file)
index a407b2f..0000000
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- * This file is part of DisOrder.
- * Copyright (C) 2008 Richard Kettlewell
- *
- * 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 3 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, see <http://www.gnu.org/licenses/>.
- */
-/** @file clients/playrtp-alsa.c
- * @brief RTP player - ALSA support
- *
- * This has been rewritten to use the @ref alsabg.h interface and is therefore
- * now closely modelled on @ref playrtp-coreaudio.c.  Given a similar interface
- * wrapping OSS the whole of playrtp could probably be greatly simplified.
- */
-
-#include "common.h"
-
-#if HAVE_ALSA_ASOUNDLIB_H 
-
-#include <poll.h>
-#include <alsa/asoundlib.h>
-#include <pthread.h>
-#include <arpa/inet.h>
-
-#include "mem.h"
-#include "log.h"
-#include "vector.h"
-#include "heap.h"
-#include "playrtp.h"
-#include "alsabg.h"
-
-/** @brief Callback from alsa_bg_collect() */
-static int playrtp_alsa_supply(void *dst,
-                               unsigned supply_nsamples) {
-  unsigned samples_available;
-  const struct packet *p;
-
-  pthread_mutex_lock(&lock);
-  p = playrtp_next_packet();
-  if(p && contains(p, next_timestamp)) {
-    /* This packet is ready to play */
-    const uint32_t packet_end = p->timestamp + p->nsamples;
-    const uint32_t offset = next_timestamp - p->timestamp;
-    const uint16_t *src = (void *)(p->samples_raw + offset);
-    samples_available = packet_end - next_timestamp;
-    if(samples_available > supply_nsamples)
-      samples_available = supply_nsamples;
-    next_timestamp += samples_available;
-    memcpy(dst, src, samples_available * sizeof (int16_t));
-    /* We don't bother junking the packet - that'll be dealt with next time
-     * round */
-  } else {
-    /* No packet is ready to play (and there might be no packet at all) */
-    samples_available = p ? p->timestamp - next_timestamp : supply_nsamples;
-    if(samples_available > supply_nsamples)
-      samples_available = supply_nsamples;
-    /*info("infill %d", samples_available);*/
-    next_timestamp += samples_available;
-    /* Unlike Core Audio the buffer is not guaranteed to be 0-filled */
-    memset(dst, 0, samples_available * sizeof (int16_t));
-  }
-  pthread_mutex_unlock(&lock);
-  return samples_available;
-}
-
-void playrtp_alsa(void) {
-  alsa_bg_init(device ? device : "default",
-               playrtp_alsa_supply);
-  pthread_mutex_lock(&lock);
-  for(;;) {
-    /* Wait for the buffer to fill up a bit */
-    playrtp_fill_buffer();
-    /* Start playing now */
-    info("Playing...");
-    next_timestamp = pheap_first(&packets)->timestamp;
-    active = 1;
-    alsa_bg_enable();
-    /* Wait until the buffer empties out */
-    while(nsamples >= minbuffer
-         || (nsamples > 0
-             && contains(pheap_first(&packets), next_timestamp))) {
-      pthread_cond_wait(&cond, &lock);
-    }
-    /* Stop playing for a bit until the buffer re-fills */
-    alsa_bg_disable();
-    active = 0;
-    /* Go back round */
-  }
-}
-
-#endif
-
-/*
-Local Variables:
-c-basic-offset:2
-comment-column:40
-fill-column:79
-indent-tabs-mode:nil
-End:
-*/
diff --git a/clients/playrtp-coreaudio.c b/clients/playrtp-coreaudio.c
deleted file mode 100644 (file)
index 809c89c..0000000
+++ /dev/null
@@ -1,176 +0,0 @@
-/*
- * This file is part of DisOrder.
- * Copyright (C) 2007 Richard Kettlewell
- *
- * 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 3 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, see <http://www.gnu.org/licenses/>.
- */
-/** @file clients/playrtp-coreaudio.c
- * @brief RTP player - Core Audio support
- */
-
-#include "common.h"
-
-#if HAVE_COREAUDIO_AUDIOHARDWARE_H
-#include <pthread.h>
-#include <CoreAudio/AudioHardware.h>
-
-#include "mem.h"
-#include "log.h"
-#include "vector.h"
-#include "heap.h"
-#include "playrtp.h"
-
-/** @brief Callback from Core Audio */
-static OSStatus adioproc
-    (AudioDeviceID attribute((unused)) inDevice,
-     const AudioTimeStamp attribute((unused)) *inNow,
-     const AudioBufferList attribute((unused)) *inInputData,
-     const AudioTimeStamp attribute((unused)) *inInputTime,
-     AudioBufferList *outOutputData,
-     const AudioTimeStamp attribute((unused)) *inOutputTime,
-     void attribute((unused)) *inClientData) {
-  UInt32 nbuffers = outOutputData->mNumberBuffers;
-  AudioBuffer *ab = outOutputData->mBuffers;
-  uint32_t samples_available;
-
-  pthread_mutex_lock(&lock);
-  while(nbuffers > 0) {
-    float *samplesOut = ab->mData;
-    size_t samplesOutLeft = ab->mDataByteSize / sizeof (float);
-
-    while(samplesOutLeft > 0) {
-      const struct packet *p = playrtp_next_packet();
-      if(p && contains(p, next_timestamp)) {
-        /* This packet is ready to play */
-        const uint32_t packet_end = p->timestamp + p->nsamples;
-        const uint32_t offset = next_timestamp - p->timestamp;
-        const uint16_t *ptr = (void *)(p->samples_raw + offset);
-
-        samples_available = packet_end - next_timestamp;
-        if(samples_available > samplesOutLeft)
-          samples_available = samplesOutLeft;
-        next_timestamp += samples_available;
-        samplesOutLeft -= samples_available;
-        if(dump_buffer) {
-          size_t n;
-
-          for(n = 0; n < samples_available; ++n) {
-            dump_buffer[dump_index++] = (int16_t)ntohs(ptr[n]);
-            dump_index %= dump_size;
-          }
-        }
-        while(samples_available-- > 0)
-          *samplesOut++ = (int16_t)ntohs(*ptr++) * (0.5 / 32767);
-        /* We don't bother junking the packet - that'll be dealt with next time
-         * round */
-      } else {
-        /* No packet is ready to play (and there might be no packet at all) */
-        samples_available = p ? p->timestamp - next_timestamp
-                              : samplesOutLeft;
-        if(samples_available > samplesOutLeft)
-          samples_available = samplesOutLeft;
-        //info("infill by %"PRIu32, samples_available);
-        /* Conveniently the buffer is 0 to start with */
-        next_timestamp += samples_available;
-        samplesOut += samples_available;
-        samplesOutLeft -= samples_available;
-        if(dump_buffer) {
-          size_t n;
-
-          for(n = 0; n < samples_available; ++n) {
-            dump_buffer[dump_index++] = 0;
-            dump_index %= dump_size;
-          }
-        }
-      }
-    }
-    ++ab;
-    --nbuffers;
-  }
-  pthread_mutex_unlock(&lock);
-  return 0;
-}
-
-void playrtp_coreaudio(void) {
-  OSStatus status;
-  UInt32 propertySize;
-  AudioDeviceID adid;
-  AudioStreamBasicDescription asbd;
-
-  /* If this looks suspiciously like libao's macosx driver there's an
-   * excellent reason for that... */
-
-  /* TODO report errors as strings not numbers */
-  propertySize = sizeof adid;
-  status = AudioHardwareGetProperty(kAudioHardwarePropertyDefaultOutputDevice,
-                                   &propertySize, &adid);
-  if(status)
-    fatal(0, "AudioHardwareGetProperty: %d", (int)status);
-  if(adid == kAudioDeviceUnknown)
-    fatal(0, "no output device");
-  propertySize = sizeof asbd;
-  status = AudioDeviceGetProperty(adid, 0, false,
-                                 kAudioDevicePropertyStreamFormat,
-                                 &propertySize, &asbd);
-  if(status)
-    fatal(0, "AudioHardwareGetProperty: %d", (int)status);
-  D(("mSampleRate       %f", asbd.mSampleRate));
-  D(("mFormatID         %08lx", asbd.mFormatID));
-  D(("mFormatFlags      %08lx", asbd.mFormatFlags));
-  D(("mBytesPerPacket   %08lx", asbd.mBytesPerPacket));
-  D(("mFramesPerPacket  %08lx", asbd.mFramesPerPacket));
-  D(("mBytesPerFrame    %08lx", asbd.mBytesPerFrame));
-  D(("mChannelsPerFrame %08lx", asbd.mChannelsPerFrame));
-  D(("mBitsPerChannel   %08lx", asbd.mBitsPerChannel));
-  D(("mReserved         %08lx", asbd.mReserved));
-  if(asbd.mFormatID != kAudioFormatLinearPCM)
-    fatal(0, "audio device does not support kAudioFormatLinearPCM");
-  status = AudioDeviceAddIOProc(adid, adioproc, 0);
-  if(status)
-    fatal(0, "AudioDeviceAddIOProc: %d", (int)status);
-  pthread_mutex_lock(&lock);
-  for(;;) {
-    /* Wait for the buffer to fill up a bit */
-    playrtp_fill_buffer();
-    /* Start playing now */
-    info("Playing...");
-    next_timestamp = pheap_first(&packets)->timestamp;
-    active = 1;
-    status = AudioDeviceStart(adid, adioproc);
-    if(status)
-      fatal(0, "AudioDeviceStart: %d", (int)status);
-    /* Wait until the buffer empties out */
-    while(nsamples >= minbuffer
-         || (nsamples > 0
-             && contains(pheap_first(&packets), next_timestamp)))
-      pthread_cond_wait(&cond, &lock);
-    /* Stop playing for a bit until the buffer re-fills */
-    status = AudioDeviceStop(adid, adioproc);
-    if(status)
-      fatal(0, "AudioDeviceStop: %d", (int)status);
-    active = 0;
-    /* Go back round */
-  }
-}
-
-#endif
-
-/*
-Local Variables:
-c-basic-offset:2
-comment-column:40
-fill-column:79
-indent-tabs-mode:nil
-End:
-*/
diff --git a/clients/playrtp-oss.c b/clients/playrtp-oss.c
deleted file mode 100644 (file)
index 4b0ab83..0000000
+++ /dev/null
@@ -1,278 +0,0 @@
-/*
- * This file is part of DisOrder.
- * Copyright (C) 2007 Richard Kettlewell
- * Portions copyright (C) 2007 Ross Younger
- *
- * 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 3 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, see <http://www.gnu.org/licenses/>.
- */
-/** @file clients/playrtp-oss.c
- * @brief RTP player - OSS and empeg support
- */
-
-#include "common.h"
-
-#if HAVE_SYS_SOUNDCARD_H || EMPEG_HOST
-
-#include <poll.h>
-#include <sys/ioctl.h>
-#if !EMPEG_HOST
-#include <sys/soundcard.h>
-#endif
-#include <pthread.h>
-#include <fcntl.h>
-#include <unistd.h>
-#include <errno.h>
-#include <arpa/inet.h>
-
-#include "mem.h"
-#include "log.h"
-#include "vector.h"
-#include "heap.h"
-#include "syscalls.h"
-#include "playrtp.h"
-
-/** @brief /dev/dsp (or whatever) */
-static int playrtp_oss_fd = -1;
-
-/** @brief Audio buffer */
-static char *playrtp_oss_buffer;
-
-/** @brief Size of @ref playrtp_oss_buffer in bytes */
-static int playrtp_oss_bufsize;
-
-/** @brief Number of bytes used in @ref playrtp_oss_buffer */
-static int playrtp_oss_bufused;
-
-/** @brief Open and configure the OSS audio device */
-static void playrtp_oss_enable(void) {
-  if(playrtp_oss_fd == -1) {
-#if EMPEG_HOST
-    /* empeg audio driver only knows /dev/audio, only supports the equivalent
-     * of AFMT_S16_NE, has a fixed buffer size, and does not support the
-     * SNDCTL_ ioctls. */
-    if(!device)
-      device = "/dev/audio";
-    if((playrtp_oss_fd = open(device, O_WRONLY)) < 0)
-      fatal(errno, "error opening %s", device);
-    playrtp_oss_bufsize = 4608;
-#else
-    int rate = 44100, stereo = 1, format = AFMT_S16_BE;
-    if(!device) {
-      if(access("/dev/dsp", W_OK) == 0)
-       device = "/dev/dsp";
-      else if(access("/dev/audio", W_OK) == 0)
-       device = "/dev/audio";
-      else
-       fatal(0, "cannot determine default audio device");
-    }
-    if((playrtp_oss_fd = open(device, O_WRONLY)) < 0)
-      fatal(errno, "error opening %s", device);
-    if(ioctl(playrtp_oss_fd, SNDCTL_DSP_SETFMT, &format) < 0)
-      fatal(errno, "ioctl SNDCTL_DSP_SETFMT");
-    if(ioctl(playrtp_oss_fd, SNDCTL_DSP_STEREO, &stereo) < 0)
-      fatal(errno, "ioctl SNDCTL_DSP_STEREO");
-    if(ioctl(playrtp_oss_fd, SNDCTL_DSP_SPEED, &rate) < 0)
-      fatal(errno, "ioctl SNDCTL_DSP_SPEED");
-    if(rate != 44100)
-      error(0, "asking for 44100Hz, got %dHz", rate);
-    if(ioctl(playrtp_oss_fd, SNDCTL_DSP_GETBLKSIZE, &playrtp_oss_bufsize) < 0)
-      fatal(errno, "ioctl SNDCTL_DSP_GETBLKSIZE");
-    info("OSS buffer size %d", playrtp_oss_bufsize);
-#endif
-    playrtp_oss_buffer = xmalloc(playrtp_oss_bufsize);
-    playrtp_oss_bufused = 0;
-    nonblock(playrtp_oss_fd);
-  }
-}
-
-/** @brief Flush the OSS output buffer
- * @return 0 on success, non-0 on error
- */
-static int playrtp_oss_flush(void) {
-  int nbyteswritten;
-
-  if(!playrtp_oss_bufused)
-    return 0;                           /* nothing to do */
-  /* 0 out the unused portion of the buffer */
-  memset(playrtp_oss_buffer + playrtp_oss_bufused, 0,
-         playrtp_oss_bufsize - playrtp_oss_bufused);
-#if EMPEG_HOST 
-  /* empeg audio driver insists on native-endian samples */
-  {
-    uint16_t *ptr,
-      *const limit = (uint16_t *)(playrtp_oss_buffer + playrtp_oss_bufused);
-
-    for(ptr = (uint16_t *)playrtp_oss_buffer; ptr < limit; ++ptr)
-      *ptr = ntohs(*ptr);
-  }
-#endif
-  for(;;) {
-    nbyteswritten = write(playrtp_oss_fd,
-                          playrtp_oss_buffer, playrtp_oss_bufsize);
-    if(nbyteswritten < 0) {
-      switch(errno) {
-      case EINTR:
-        break;                          /* try again */
-      case EAGAIN:
-        return 0;                       /* try later */
-      default:
-        error(errno, "error writing to %s", device);
-        return -1;
-      }
-    } else {
-      if(nbyteswritten < playrtp_oss_bufsize)
-        error(0, "%s: short write (%d/%d)",
-              device, nbyteswritten, playrtp_oss_bufsize);
-      if(dump_buffer) {
-        int count;
-        const int16_t *sp = (const int16_t *)playrtp_oss_buffer;
-        
-        for(count = 0; count < playrtp_oss_bufsize; count += sizeof(int16_t)) {
-          dump_buffer[dump_index++] = (int16_t)ntohs(*sp++);
-          dump_index %= dump_size;
-        }
-      }
-      playrtp_oss_bufused = 0;
-      return 0;
-    }
-  }
-}
-
-/** @brief Wait until the audio device can accept more data */
-static void playrtp_oss_wait(void) {
-  struct pollfd fds[1];
-  int n;
-
-  do {
-    fds[0].fd = playrtp_oss_fd;
-    fds[0].events = POLLOUT;
-    while((n = poll(fds, 1, -1)) < 0 && errno == EINTR)
-      ;
-    if(n < 0)
-      fatal(errno, "calling poll");
-  } while(!(fds[0].revents & (POLLOUT|POLLERR)));
-}
-
-/** @brief Close the OSS output device
- * @param hard If nonzero, drop pending data
- */
-static void playrtp_oss_disable(int hard) {
-  if(hard) {
-#if !EMPEG_HOST
-    /* No SNDCTL_DSP_ ioctls on empeg */
-    if(ioctl(playrtp_oss_fd, SNDCTL_DSP_RESET, 0) < 0)
-      error(errno, "ioctl SNDCTL_DSP_RESET");
-#endif
-  } else
-    playrtp_oss_flush();
-  xclose(playrtp_oss_fd);
-  playrtp_oss_fd = -1;
-  free(playrtp_oss_buffer);
-  playrtp_oss_buffer = 0;
-}
-
-/** @brief Write samples to OSS output device
- * @param data Pointer to sample data
- * @param samples Number of samples
- * @return 0 on success, non-0 on error
- */
-static int playrtp_oss_write(const char *data, size_t samples) {
-  long bytes = samples * sizeof(int16_t);
-  while(bytes > 0) {
-    int n = playrtp_oss_bufsize - playrtp_oss_bufused;
-
-    if(n > bytes)
-      n = bytes;
-    memcpy(playrtp_oss_buffer + playrtp_oss_bufused, data, n);
-    bytes -= n;
-    data += n;
-    playrtp_oss_bufused += n;
-    if(playrtp_oss_bufused == playrtp_oss_bufsize)
-      if(playrtp_oss_flush())
-        return -1;
-  }
-  next_timestamp += samples;
-  return 0;
-}
-
-/** @brief Play some data from packet @p p
- *
- * @p p is assumed to contain @ref next_timestamp.
- */
-static int playrtp_oss_play(const struct packet *p) {
-  return playrtp_oss_write
-    ((const char *)(p->samples_raw + next_timestamp - p->timestamp),
-     (p->timestamp + p->nsamples) - next_timestamp);
-}
-
-/** @brief Play some silence before packet @p p
- *
- * @p p is assumed to be entirely before @ref next_timestamp.
- */
-static int playrtp_oss_infill(const struct packet *p) {
-  static const char zeros[INFILL_SAMPLES * sizeof(int16_t)];
-  size_t samples_available = INFILL_SAMPLES;
-
-  if(p && samples_available > p->timestamp - next_timestamp)
-    samples_available = p->timestamp - next_timestamp;
-  return playrtp_oss_write(zeros, samples_available);
-}
-
-/** @brief OSS backend for playrtp */
-void playrtp_oss(void) {
-  int escape;
-  const struct packet *p;
-
-  pthread_mutex_lock(&lock);
-  for(;;) {
-    /* Wait for the buffer to fill up a bit */
-    playrtp_fill_buffer();
-    playrtp_oss_enable();
-    escape = 0;
-    info("Playing...");
-    /* Keep playing until the buffer empties out, we get an error */
-    while((nsamples >= minbuffer
-          || (nsamples > 0
-              && contains(pheap_first(&packets), next_timestamp)))
-         && !escape) {
-      /* Wait until we can play more */
-      pthread_mutex_unlock(&lock);
-      playrtp_oss_wait();
-      pthread_mutex_lock(&lock);
-      /* Device is ready for more data, find something to play */
-      p = playrtp_next_packet();
-      /* Play it or play some silence */
-      if(contains(p, next_timestamp))
-       escape = playrtp_oss_play(p);
-      else
-       escape = playrtp_oss_infill(p);
-    }
-    active = 0;
-    /* We stop playing for a bit until the buffer re-fills */
-    pthread_mutex_unlock(&lock);
-    playrtp_oss_disable(escape);
-    pthread_mutex_lock(&lock);
-  }
-}
-
-#endif
-
-/*
-Local Variables:
-c-basic-offset:2
-comment-column:40
-fill-column:79
-indent-tabs-mode:nil
-End:
-*/
index aca1532..c07c153 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * This file is part of DisOrder.
- * Copyright (C) 2007, 2008 Richard Kettlewell
+ * Copyright (C) 2007-2009 Richard Kettlewell
  *
  * 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
  * systems.  There is no support for Microsoft Windows yet, and that will in
  * fact probably an entirely separate program.
  *
- * The program runs (at least) three threads.  listen_thread() is responsible
- * for reading RTP packets off the wire and adding them to the linked list @ref
- * received_packets, assuming they are basically sound.  queue_thread() takes
- * packets off this linked list and adds them to @ref packets (an operation
- * which might be much slower due to contention for @ref lock).
+ * The program runs (at least) three threads:
  *
- * The main thread is responsible for actually playing audio.  In ALSA this
- * means it waits until ALSA says it's ready for more audio which it then
- * plays.  See @ref clients/playrtp-alsa.c.
+ * listen_thread() is responsible for reading RTP packets off the wire and
+ * adding them to the linked list @ref received_packets, assuming they are
+ * basically sound.
  *
- * In Core Audio the main thread is only responsible for starting and stopping
- * play: the system does the actual playback in its own private thread, and
- * calls adioproc() to fetch the audio data.  See @ref
- * clients/playrtp-coreaudio.c.
+ * queue_thread() takes packets off this linked list and adds them to @ref
+ * packets (an operation which might be much slower due to contention for @ref
+ * lock).
+ *
+ * control_thread() accepts commands from Disobedience (or anything else).
+ *
+ * The main thread activates and deactivates audio playing via the @ref
+ * lib/uaudio.h API (which probably implies at least one further thread).
  *
  * Sometimes it happens that there is no audio available to play.  This may
  * because the server went away, or a packet was dropped, or the server
@@ -64,6 +64,7 @@
 #include <unistd.h>
 #include <sys/mman.h>
 #include <fcntl.h>
+#include <math.h>
 
 #include "log.h"
 #include "mem.h"
@@ -79,8 +80,7 @@
 #include "playrtp.h"
 #include "inputline.h"
 #include "version.h"
-
-#define readahead linux_headers_are_borked
+#include "uaudio.h"
 
 /** @brief Obsolete synonym */
 #ifndef IPV6_JOIN_GROUP
@@ -94,21 +94,14 @@ static int rtpfd;
 static FILE *logfp;
 
 /** @brief Output device */
-const char *device;
 
-/** @brief Minimum low watermark
- *
- * We'll stop playing if there's only this many samples in the buffer. */
-unsigned minbuffer = 2 * 44100 / 10;  /* 0.2 seconds */
+/** @brief Buffer low watermark in samples */
+unsigned minbuffer = 4 * (2 * 44100) / 10;  /* 0.4 seconds */
 
-/** @brief Buffer high watermark
+/** @brief Maximum buffer size in samples
  *
- * We'll only start playing when this many samples are available. */
-static unsigned readahead = 2 * 2 * 44100;
-
-/** @brief Maximum buffer size
- *
- * We'll stop reading from the network if we have this many samples. */
+ * We'll stop reading from the network if we have this many samples.
+ */
 static unsigned maxbuffer;
 
 /** @brief Received packets
@@ -168,16 +161,8 @@ pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
 /** @brief Condition variable signalled whenever @ref packets is changed */
 pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
 
-#if DEFAULT_BACKEND == BACKEND_ALSA
-# define DEFAULT_PLAYRTP_BACKEND playrtp_alsa
-#elif DEFAULT_BACKEND == BACKEND_OSS
-# define DEFAULT_PLAYRTP_BACKEND playrtp_oss
-#elif DEFAULT_BACKEND == BACKEND_COREAUDIO
-# define DEFAULT_PLAYRTP_BACKEND playrtp_coreaudio
-#endif
-
 /** @brief Backend to play with */
-static void (*backend)(void) = DEFAULT_PLAYRTP_BACKEND;
+static const struct uaudio *backend;
 
 HEAP_DEFINE(pheap, struct packet *, lt_packet);
 
@@ -212,7 +197,6 @@ static const struct option options[] = {
   { "device", required_argument, 0, 'D' },
   { "min", required_argument, 0, 'm' },
   { "max", required_argument, 0, 'x' },
-  { "buffer", required_argument, 0, 'b' },
   { "rcvbuf", required_argument, 0, 'R' },
 #if HAVE_SYS_SOUNDCARD_H || EMPEG_HOST
   { "oss", no_argument, 0, 'o' },
@@ -224,8 +208,11 @@ static const struct option options[] = {
   { "core-audio", no_argument, 0, 'c' },
 #endif
   { "dump", required_argument, 0, 'r' },
+  { "command", required_argument, 0, 'e' },
+  { "pause-mode", required_argument, 0, 'P' },
   { "socket", required_argument, 0, 's' },
   { "config", required_argument, 0, 'C' },
+  { "monitor", no_argument, 0, 'M' },
   { 0, 0, 0, 0 }
 };
 
@@ -337,6 +324,9 @@ static void *queue_thread(void attribute((unused)) *arg) {
     pthread_cond_broadcast(&cond);
     pthread_mutex_unlock(&lock);
   }
+#if HAVE_STUPID_GCC44
+  return NULL;
+#endif
 }
 
 /** @brief Background thread collecting samples
@@ -407,7 +397,7 @@ static void *listen_thread(void attribute((unused)) *arg) {
     if(header.mpt & 0x80)
       p->flags |= IDLE;
     switch(header.mpt & 0x7F) {
-    case 10:
+    case 10:                            /* L16 */
       p->nsamples = (n - sizeof header) / sizeof(uint16_t);
       break;
       /* TODO support other RFC3551 media types (when the speaker does) */
@@ -415,6 +405,14 @@ static void *listen_thread(void attribute((unused)) *arg) {
       fatal(0, "unsupported RTP payload type %d",
             header.mpt & 0x7F);
     }
+    /* See if packet is silent */
+    const uint16_t *s = p->samples_raw;
+    n = p->nsamples;
+    for(; n > 0; --n)
+      if(*s++)
+        break;
+    if(!n)
+      p->flags |= SILENT;
     if(logfp)
       fprintf(logfp, "sequence %u timestamp %"PRIx32" length %"PRIx32" end %"PRIx32"\n",
               seq, timestamp, p->nsamples, timestamp + p->nsamples);
@@ -446,12 +444,18 @@ static void *listen_thread(void attribute((unused)) *arg) {
  * Must be called with @ref lock held.
  */
 void playrtp_fill_buffer(void) {
-  while(nsamples)
+  /* Discard current buffer contents */
+  while(nsamples) {
+    //fprintf(stderr, "%8u/%u (%u) DROPPING\n", nsamples, maxbuffer, minbuffer);
     drop_first_packet();
+  }
   info("Buffering...");
-  while(nsamples < readahead) {
+  /* Wait until there's at least minbuffer samples available */
+  while(nsamples < minbuffer) {
+    //fprintf(stderr, "%8u/%u (%u) FILLING\n", nsamples, maxbuffer, minbuffer);
     pthread_cond_wait(&cond, &lock);
   }
+  /* Start from whatever is earliest */
   next_timestamp = pheap_first(&packets)->timestamp;
   active = 1;
 }
@@ -479,37 +483,13 @@ struct packet *playrtp_next_packet(void) {
   return 0;
 }
 
-/** @brief Play an RTP stream
- *
- * This is the guts of the program.  It is responsible for:
- * - starting the listening thread
- * - opening the audio device
- * - reading ahead to build up a buffer
- * - arranging for audio to be played
- * - detecting when the buffer has got too small and re-buffering
- */
-static void play_rtp(void) {
-  pthread_t ltid;
-  int err;
-
-  /* We receive and convert audio data in a background thread */
-  if((err = pthread_create(&ltid, 0, listen_thread, 0)))
-    fatal(err, "pthread_create listen_thread");
-  /* We have a second thread to add received packets to the queue */
-  if((err = pthread_create(&ltid, 0, queue_thread, 0)))
-    fatal(err, "pthread_create queue_thread");
-  /* The rest of the work is backend-specific */
-  backend();
-}
-
 /* display usage message and terminate */
 static void help(void) {
   xprintf("Usage:\n"
-         "  disorder-playrtp [OPTIONS] ADDRESS [PORT]\n"
+         "  disorder-playrtp [OPTIONS] [[ADDRESS] PORT]\n"
          "Options:\n"
           "  --device, -D DEVICE     Output device\n"
           "  --min, -m FRAMES        Buffer low water mark\n"
-          "  --buffer, -b FRAMES     Buffer high water mark\n"
           "  --max, -x FRAMES        Buffer maximum size\n"
           "  --rcvbuf, -R BYTES      Socket receive buffer size\n"
           "  --config, -C PATH       Set configuration file\n"
@@ -522,6 +502,9 @@ static void help(void) {
 #if HAVE_COREAUDIO_AUDIOHARDWARE_H
           "  --core-audio, -c        Use Core Audio to play audio\n"
 #endif
+          "  --command, -e COMMAND   Pipe audio to command.\n"
+          "  --pause-mode, -P silence  For -e: pauses send silence (default)\n"
+          "  --pause-mode, -P suspend  For -e: pauses suspend writes\n"
          "  --help, -h              Display usage message\n"
          "  --version, -V           Display version number\n"
           );
@@ -529,12 +512,114 @@ static void help(void) {
   exit(0);
 }
 
+static size_t playrtp_callback(void *buffer,
+                               size_t max_samples,
+                               void attribute((unused)) *userdata) {
+  size_t samples;
+  int silent = 0;
+
+  pthread_mutex_lock(&lock);
+  /* Get the next packet, junking any that are now in the past */
+  const struct packet *p = playrtp_next_packet();
+  if(p && contains(p, next_timestamp)) {
+    /* This packet is ready to play; the desired next timestamp points
+     * somewhere into it. */
+
+    /* Timestamp of end of packet */
+    const uint32_t packet_end = p->timestamp + p->nsamples;
+
+    /* Offset of desired next timestamp into current packet */
+    const uint32_t offset = next_timestamp - p->timestamp;
+
+    /* Pointer to audio data */
+    const uint16_t *ptr = (void *)(p->samples_raw + offset);
+
+    /* Compute number of samples left in packet, limited to output buffer
+     * size */
+    samples = packet_end - next_timestamp;
+    if(samples > max_samples)
+      samples = max_samples;
+
+    /* Copy into buffer, converting to native endianness */
+    size_t i = samples;
+    int16_t *bufptr = buffer;
+    while(i > 0) {
+      *bufptr++ = (int16_t)ntohs(*ptr++);
+      --i;
+    }
+    silent = !!(p->flags & SILENT);
+  } else {
+    /* There is no suitable packet.  We introduce 0s up to the next packet, or
+     * to fill the buffer if there's no next packet or that's too many.  The
+     * comparison with max_samples deals with the otherwise troubling overflow
+     * case. */
+    samples = p ? p->timestamp - next_timestamp : max_samples;
+    if(samples > max_samples)
+      samples = max_samples;
+    //info("infill by %zu", samples);
+    memset(buffer, 0, samples * uaudio_sample_size);
+    silent = 1;
+  }
+  /* Debug dump */
+  if(dump_buffer) {
+    for(size_t i = 0; i < samples; ++i) {
+      dump_buffer[dump_index++] = ((int16_t *)buffer)[i];
+      dump_index %= dump_size;
+    }
+  }
+  /* Advance timestamp */
+  next_timestamp += samples;
+  /* If we're getting behind then try to drop just silent packets
+   *
+   * In theory this shouldn't be necessary.  The server is supposed to send
+   * packets at the right rate and compares the number of samples sent with the
+   * time in order to ensure this.
+   *
+   * However, various things could throw this off:
+   *
+   * - the server's clock could advance at the wrong rate.  This would cause it
+   *   to mis-estimate the right number of samples to have sent and
+   *   inappropriately throttle or speed up.
+   *
+   * - playback could happen at the wrong rate.  If the playback host's sound
+   *   card has a slightly incorrect clock then eventually it will get out
+   *   of step.
+   *
+   * So if we play back slightly slower than the server sends for either of
+   * these reasons then eventually our buffer, and the socket's buffer, will
+   * fill, and the kernel will start dropping packets.  The result is audible
+   * and not very nice.
+   *
+   * Therefore if we're getting behind, we pre-emptively drop silent packets,
+   * since a change in the duration of a silence is less noticeable than a
+   * dropped packet from the middle of continuous music.
+   *
+   * (If things go wrong the other way then eventually we run out of packets to
+   * play and are forced to play silence.  This doesn't seem to happen in
+   * practice but if it does then in the same way we can artificially extend
+   * silent packets to compensate.)
+   *
+   * Dropped packets are always logged; use 'disorder-playrtp --monitor' to
+   * track how close to target buffer occupancy we are on a once-a-minute
+   * basis.
+   */
+  if(nsamples > minbuffer && silent) {
+    info("dropping %zu samples (%"PRIu32" > %"PRIu32")",
+         samples, nsamples, minbuffer);
+    samples = 0;
+  }
+  /* Junk obsolete packets */
+  playrtp_next_packet();
+  pthread_mutex_unlock(&lock);
+  return samples;
+}
+
 int main(int argc, char **argv) {
   int n, err;
   struct addrinfo *res;
   struct stringlist sl;
   char *sockname;
-  int rcvbuf, target_rcvbuf = 131072;
+  int rcvbuf, target_rcvbuf = 0;
   socklen_t len;
   struct ip_mreq mreq;
   struct ipv6_mreq mreq6;
@@ -548,6 +633,9 @@ int main(int argc, char **argv) {
   };
   union any_sockaddr mgroup;
   const char *dumpfile = 0;
+  pthread_t ltid;
+  int monitor = 0;
+  static const int one = 1;
 
   static const struct addrinfo prefs = {
     .ai_flags = AI_PASSIVE,
@@ -556,37 +644,43 @@ int main(int argc, char **argv) {
     .ai_protocol = IPPROTO_UDP
   };
 
+  /* Timing information is often important to debugging playrtp, so we include
+   * timestamps in the logs */
+  logdate = 1;
   mem_init();
   if(!setlocale(LC_CTYPE, "")) fatal(errno, "error calling setlocale");
-  while((n = getopt_long(argc, argv, "hVdD:m:b:x:L:R:M:aocC:r", options, 0)) >= 0) {
+  backend = uaudio_apis[0];
+  while((n = getopt_long(argc, argv, "hVdD:m:x:L:R:aocC:re:P:M", options, 0)) >= 0) {
     switch(n) {
     case 'h': help();
     case 'V': version("disorder-playrtp");
     case 'd': debugging = 1; break;
-    case 'D': device = optarg; break;
+    case 'D': uaudio_set("device", optarg); break;
     case 'm': minbuffer = 2 * atol(optarg); break;
-    case 'b': readahead = 2 * atol(optarg); break;
     case 'x': maxbuffer = 2 * atol(optarg); break;
     case 'L': logfp = fopen(optarg, "w"); break;
     case 'R': target_rcvbuf = atoi(optarg); break;
 #if HAVE_ALSA_ASOUNDLIB_H
-    case 'a': backend = playrtp_alsa; break;
+    case 'a': backend = &uaudio_alsa; break;
 #endif
 #if HAVE_SYS_SOUNDCARD_H || EMPEG_HOST
-    case 'o': backend = playrtp_oss; break;
+    case 'o': backend = &uaudio_oss; break;
 #endif
 #if HAVE_COREAUDIO_AUDIOHARDWARE_H      
-    case 'c': backend = playrtp_coreaudio; break;
+    case 'c': backend = &uaudio_coreaudio; break;
 #endif
     case 'C': configfile = optarg; break;
     case 's': control_socket = optarg; break;
     case 'r': dumpfile = optarg; break;
+    case 'e': backend = &uaudio_command; uaudio_set("command", optarg); break;
+    case 'P': uaudio_set("pause-mode", optarg); break;
+    case 'M': monitor = 1; break;
     default: fatal(0, "invalid option");
     }
   }
-  if(config_read(0)) fatal(0, "cannot read configuration");
+  if(config_read(0, NULL)) fatal(0, "cannot read configuration");
   if(!maxbuffer)
-    maxbuffer = 4 * readahead;
+    maxbuffer = 2 * minbuffer;
   argc -= optind;
   argv += optind;
   switch(argc) {
@@ -617,8 +711,14 @@ int main(int argc, char **argv) {
                      res->ai_socktype,
                      res->ai_protocol)) < 0)
     fatal(errno, "error creating socket");
-  /* Stash the multicast group address */
-  if((is_multicast = multicast(res->ai_addr))) {
+  /* Allow multiple listeners */
+  xsetsockopt(rtpfd, SOL_SOCKET, SO_REUSEADDR, &one, sizeof one);
+  is_multicast = multicast(res->ai_addr);
+  /* The multicast and unicast/broadcast cases are different enough that they
+   * are totally split.  Trying to find commonality between them causes more
+   * trouble that it's worth. */
+  if(is_multicast) {
+    /* Stash the multicast group address */
     memcpy(&mgroup, res->ai_addr, res->ai_addrlen);
     switch(res->ai_addr->sa_family) {
     case AF_INET:
@@ -627,24 +727,13 @@ int main(int argc, char **argv) {
     case AF_INET6:
       mgroup.in6.sin6_port = 0;
       break;
+    default:
+      fatal(0, "unsupported family %d", (int)res->ai_addr->sa_family);
     }
-  }
-  /* Bind to 0/port */
-  switch(res->ai_addr->sa_family) {
-  case AF_INET:
-    memset(&((struct sockaddr_in *)res->ai_addr)->sin_addr, 0,
-           sizeof (struct in_addr));
-    break;
-  case AF_INET6:
-    memset(&((struct sockaddr_in6 *)res->ai_addr)->sin6_addr, 0,
-           sizeof (struct in6_addr));
-    break;
-  default:
-    fatal(0, "unsupported family %d", (int)res->ai_addr->sa_family);
-  }
-  if(bind(rtpfd, res->ai_addr, res->ai_addrlen) < 0)
-    fatal(errno, "error binding socket to %s", sockname);
-  if(is_multicast) {
+    /* Bind to to the multicast group address */
+    if(bind(rtpfd, res->ai_addr, res->ai_addrlen) < 0)
+      fatal(errno, "error binding socket to %s", format_sockaddr(res->ai_addr));
+    /* Add multicast group membership */
     switch(mgroup.sa.sa_family) {
     case PF_INET:
       mreq.imr_multiaddr = mgroup.in.sin_addr;
@@ -663,10 +752,32 @@ int main(int argc, char **argv) {
     default:
       fatal(0, "unsupported address family %d", res->ai_family);
     }
+    /* Report what we did */
     info("listening on %s multicast group %s",
          format_sockaddr(res->ai_addr), format_sockaddr(&mgroup.sa));
-  } else
+  } else {
+    /* Bind to 0/port */
+    switch(res->ai_addr->sa_family) {
+    case AF_INET: {
+      struct sockaddr_in *in = (struct sockaddr_in *)res->ai_addr;
+      
+      memset(&in->sin_addr, 0, sizeof (struct in_addr));
+      break;
+    }
+    case AF_INET6: {
+      struct sockaddr_in6 *in6 = (struct sockaddr_in6 *)res->ai_addr;
+      
+      memset(&in6->sin6_addr, 0, sizeof (struct in6_addr));
+      break;
+    }
+    default:
+      fatal(0, "unsupported family %d", (int)res->ai_addr->sa_family);
+    }
+    if(bind(rtpfd, res->ai_addr, res->ai_addrlen) < 0)
+      fatal(errno, "error binding socket to %s", format_sockaddr(res->ai_addr));
+    /* Report what we did */
     info("listening on %s", format_sockaddr(res->ai_addr));
+  }
   len = sizeof rcvbuf;
   if(getsockopt(rtpfd, SOL_SOCKET, SO_RCVBUF, &rcvbuf, &len) < 0)
     fatal(errno, "error calling getsockopt SO_RCVBUF");
@@ -681,6 +792,7 @@ int main(int argc, char **argv) {
            rcvbuf, target_rcvbuf);
   } else
     info("default socket receive buffer %d", rcvbuf);
+  //info("minbuffer %u maxbuffer %u", minbuffer, maxbuffer);
   if(logfp)
     info("WARNING: -L option can impact performance");
   if(control_socket) {
@@ -710,7 +822,72 @@ int main(int argc, char **argv) {
       fatal(errno, "mapping %s", dumpfile);
     info("dumping to %s", dumpfile);
   }
-  play_rtp();
+  /* Set up output.  Currently we only support L16 so there's no harm setting
+   * the format before we know what it is! */
+  uaudio_set_format(44100/*Hz*/, 2/*channels*/,
+                    16/*bits/channel*/, 1/*signed*/);
+  backend->start(playrtp_callback, NULL);
+  /* We receive and convert audio data in a background thread */
+  if((err = pthread_create(&ltid, 0, listen_thread, 0)))
+    fatal(err, "pthread_create listen_thread");
+  /* We have a second thread to add received packets to the queue */
+  if((err = pthread_create(&ltid, 0, queue_thread, 0)))
+    fatal(err, "pthread_create queue_thread");
+  pthread_mutex_lock(&lock);
+  time_t lastlog = 0;
+  for(;;) {
+    /* Wait for the buffer to fill up a bit */
+    playrtp_fill_buffer();
+    /* Start playing now */
+    info("Playing...");
+    next_timestamp = pheap_first(&packets)->timestamp;
+    active = 1;
+    pthread_mutex_unlock(&lock);
+    backend->activate();
+    pthread_mutex_lock(&lock);
+    /* Wait until the buffer empties out
+     *
+     * If there's a packet that we can play right now then we definitely
+     * continue.
+     *
+     * Also if there's at least minbuffer samples we carry on regardless and
+     * insert silence.  The assumption is there's been a pause but more data
+     * is now available.
+     */
+    while(nsamples >= minbuffer
+         || (nsamples > 0
+             && contains(pheap_first(&packets), next_timestamp))) {
+      if(monitor) {
+        time_t now = time(0);
+
+        if(now >= lastlog + 60) {
+          int offset = nsamples - minbuffer;
+          double offtime = (double)offset / (uaudio_rate * uaudio_channels);
+          info("%+d samples off (%d.%02ds, %d bytes)",
+               offset,
+               (int)fabs(offtime) * (offtime < 0 ? -1 : 1),
+               (int)(fabs(offtime) * 100) % 100,
+               offset * uaudio_bits / CHAR_BIT);
+          lastlog = now;
+        }
+      }
+      //fprintf(stderr, "%8u/%u (%u) PLAYING\n", nsamples, maxbuffer, minbuffer);
+      pthread_cond_wait(&cond, &lock);
+    }
+#if 0
+    if(nsamples) {
+      struct packet *p = pheap_first(&packets);
+      fprintf(stderr, "nsamples=%u (%u) next_timestamp=%"PRIx32", first packet is [%"PRIx32",%"PRIx32")\n",
+              nsamples, minbuffer, next_timestamp,p->timestamp,p->timestamp+p->nsamples);
+    }
+#endif
+    /* Stop playing for a bit until the buffer re-fills */
+    pthread_mutex_unlock(&lock);
+    backend->deactivate();
+    pthread_mutex_lock(&lock);
+    active = 0;
+    /* Go back round */
+  }
   return 0;
 }
 
index 900ff50..ff8a761 100644 (file)
@@ -58,11 +58,15 @@ struct packet {
    *
    * Valid values are:
    * - @ref IDLE - the idle bit was set in the RTP packet
+   * - @ref SILENT - packet is entirely silent
    */
   unsigned flags;
 /** @brief idle bit set in RTP packet*/
 #define IDLE 0x0001
 
+/** @brief RTP packet is entirely silent */
+#define SILENT 0x0002
+
   /** @brief Raw sample data
    *
    * Only the first @p nsamples samples are defined; the rest is uninitialized
@@ -128,7 +132,6 @@ void playrtp_free_packet(struct packet *p);
 void playrtp_fill_buffer(void);
 struct packet *playrtp_next_packet(void);
 
-extern const char *device;
 extern struct packet *received_packets;
 extern struct packet **received_tail;
 extern pthread_mutex_t receive_lock;
diff --git a/clients/rtpmon.c b/clients/rtpmon.c
new file mode 100644 (file)
index 0000000..e64b08e
--- /dev/null
@@ -0,0 +1,295 @@
+/*
+ * This file is part of DisOrder.
+ * Copyright (C) 2009 Richard Kettlewell
+ *
+ * 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 3 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, see <http://www.gnu.org/licenses/>.
+ */
+/** @file clients/rtpmon.c
+ * @brief RTP monitor
+ *
+ * This progam monitors the rate at which data arrives by RTP and
+ * constantly display it.  It is intended for debugging only.
+ *
+ * TODO de-dupe with playrtp.
+ */
+#include "common.h"
+
+#include <getopt.h>
+#include <sys/socket.h>
+#include <sys/types.h>
+#include <netdb.h>
+#include <netinet/in.h>
+#include <sys/time.h>
+#include <unistd.h>
+#include <locale.h>
+#include <errno.h>
+#include <stdlib.h>
+#include <sys/uio.h>
+
+#include "syscalls.h"
+#include "timeval.h"
+#include "mem.h"
+#include "log.h"
+#include "version.h"
+#include "addr.h"
+#include "configuration.h"
+#include "rtp.h"
+
+/** @brief Record of one packet */
+struct entry {
+  /** @brief When packet arrived */
+  struct timeval when;
+
+  /** @brief Serial number of first sample */
+  uint32_t serial;
+};
+
+/** @brief Bytes per frame */
+static unsigned bpf = 4;
+
+/** @brief Frame serial number */
+static uint32_t serial;
+
+/** @brief Size of ring buffer */
+#define RINGSIZE 131072
+
+/** @brief Ring buffer */
+static struct entry ring[RINGSIZE];
+
+/** @brief Where new packets join the ring */
+static unsigned ringtail;
+
+static const struct option options[] = {
+  { "help", no_argument, 0, 'h' },
+  { "version", no_argument, 0, 'V' },
+  { "bpf", required_argument, 0, 'b' },
+  { 0, 0, 0, 0 }
+};
+
+static void help(void) {
+  xprintf("Usage:\n"
+         "  rtpmon [OPTIONS] [ADDRESS] PORT\n"
+         "Options:\n"
+          "  --bpf, -b               Bytes/frame (default 4)\n"
+         "  --help, -h              Display usage message\n"
+         "  --version, -V           Display version number\n"
+          );
+  xfclose(stdout);
+  exit(0);
+}
+
+/** @brief Compute the rate by sampling at two points in the ring buffer */
+static double rate(unsigned earlier, unsigned later) {
+  const uint32_t frames = ring[later].serial - ring[earlier].serial;
+  const int64_t us = tvsub_us(ring[later].when, ring[earlier].when);
+
+  if(us)  
+    return 1000000.0 * frames / us;
+  else
+    return 0.0;
+}
+
+/** @brief Called to say we received some bytes
+ * @param when When we received them
+ * @param n How many frames of audio data we received
+ */
+static void frames(const struct timeval *when, size_t n) {
+  const time_t prev = ring[(ringtail - 1) % RINGSIZE].when.tv_sec;
+
+  ring[ringtail].when = *when;
+  ring[ringtail].serial = serial;
+  serial += n;
+  ringtail = (ringtail + 1) % RINGSIZE;
+  // Report once a second
+  if(prev != when->tv_sec) {
+    if(printf("%8.2f  %8.2f  %8.2f  %8.2f  %8.2f  %8.2f  %8.2f\n",
+              rate((ringtail - RINGSIZE / 128) % RINGSIZE,
+                   (ringtail - 1) % RINGSIZE),
+              rate((ringtail - RINGSIZE / 64) % RINGSIZE,
+                   (ringtail - 1) % RINGSIZE),
+              rate((ringtail - RINGSIZE / 32) % RINGSIZE,
+                   (ringtail - 1) % RINGSIZE),
+              rate((ringtail - RINGSIZE / 16) % RINGSIZE,
+                   (ringtail - 1) % RINGSIZE),
+              rate((ringtail - RINGSIZE / 8) % RINGSIZE,
+                   (ringtail - 1) % RINGSIZE),
+              rate((ringtail - RINGSIZE / 4) % RINGSIZE,
+                   (ringtail - 1) % RINGSIZE),
+              rate((ringtail - RINGSIZE / 2) % RINGSIZE,
+                   (ringtail - 1) % RINGSIZE)) < 0
+       || fflush(stdout) < 0)
+      fatal(errno, "stdout");
+  }
+}
+
+int main(int argc, char **argv) {
+  int n;
+  struct addrinfo *res;
+  struct stringlist sl;
+  struct ip_mreq mreq;
+  struct ipv6_mreq mreq6;
+  int rtpfd;
+  char *sockname;
+  int is_multicast;
+  union any_sockaddr {
+    struct sockaddr sa;
+    struct sockaddr_in in;
+    struct sockaddr_in6 in6;
+  };
+  union any_sockaddr mgroup;
+
+  static const struct addrinfo prefs = {
+    .ai_flags = AI_PASSIVE,
+    .ai_family = PF_INET,
+    .ai_socktype = SOCK_DGRAM,
+    .ai_protocol = IPPROTO_UDP
+  };
+  static const int one = 1;
+
+  mem_init();
+  if(!setlocale(LC_CTYPE, "")) 
+    fatal(errno, "error calling setlocale");
+  while((n = getopt_long(argc, argv, "hVb:", options, 0)) >= 0) {
+    switch(n) {
+    case 'h': help();
+    case 'V': version("rtpmon");
+    case 'b': bpf = atoi(optarg); break;
+    default: fatal(0, "invalid option");
+    }
+  }
+  argc -= optind;
+  argv += optind;
+  switch(argc) {
+  case 1:
+  case 2:
+    /* Use command-line ADDRESS+PORT or just PORT */
+    sl.n = argc;
+    sl.s = argv;
+    break;
+  default:
+    fatal(0, "usage: rtpmon [OPTIONS] [ADDRESS] PORT");
+  }
+  if(!(res = get_address(&sl, &prefs, &sockname)))
+    exit(1);
+  /* Create the socket */
+  if((rtpfd = socket(res->ai_family,
+                     res->ai_socktype,
+                     res->ai_protocol)) < 0)
+    fatal(errno, "error creating socket");
+  /* Allow multiple listeners */
+  xsetsockopt(rtpfd, SOL_SOCKET, SO_REUSEADDR, &one, sizeof one);
+  is_multicast = multicast(res->ai_addr);
+  /* The multicast and unicast/broadcast cases are different enough that they
+   * are totally split.  Trying to find commonality between them causes more
+   * trouble that it's worth. */
+  if(is_multicast) {
+    /* Stash the multicast group address */
+    memcpy(&mgroup, res->ai_addr, res->ai_addrlen);
+    switch(res->ai_addr->sa_family) {
+    case AF_INET:
+      mgroup.in.sin_port = 0;
+      break;
+    case AF_INET6:
+      mgroup.in6.sin6_port = 0;
+      break;
+    default:
+      fatal(0, "unsupported family %d", (int)res->ai_addr->sa_family);
+    }
+    /* Bind to to the multicast group address */
+    if(bind(rtpfd, res->ai_addr, res->ai_addrlen) < 0)
+      fatal(errno, "error binding socket to %s", format_sockaddr(res->ai_addr));
+    /* Add multicast group membership */
+    switch(mgroup.sa.sa_family) {
+    case PF_INET:
+      mreq.imr_multiaddr = mgroup.in.sin_addr;
+      mreq.imr_interface.s_addr = 0;      /* use primary interface */
+      if(setsockopt(rtpfd, IPPROTO_IP, IP_ADD_MEMBERSHIP,
+                    &mreq, sizeof mreq) < 0)
+        fatal(errno, "error calling setsockopt IP_ADD_MEMBERSHIP");
+      break;
+    case PF_INET6:
+      mreq6.ipv6mr_multiaddr = mgroup.in6.sin6_addr;
+      memset(&mreq6.ipv6mr_interface, 0, sizeof mreq6.ipv6mr_interface);
+      if(setsockopt(rtpfd, IPPROTO_IPV6, IPV6_JOIN_GROUP,
+                    &mreq6, sizeof mreq6) < 0)
+        fatal(errno, "error calling setsockopt IPV6_JOIN_GROUP");
+      break;
+    default:
+      fatal(0, "unsupported address family %d", res->ai_family);
+    }
+    /* Report what we did */
+    info("listening on %s multicast group %s",
+         format_sockaddr(res->ai_addr), format_sockaddr(&mgroup.sa));
+  } else {
+    /* Bind to 0/port */
+    switch(res->ai_addr->sa_family) {
+    case AF_INET: {
+      struct sockaddr_in *in = (struct sockaddr_in *)res->ai_addr;
+      
+      memset(&in->sin_addr, 0, sizeof (struct in_addr));
+      if(bind(rtpfd, res->ai_addr, res->ai_addrlen) < 0)
+        fatal(errno, "error binding socket to 0.0.0.0 port %d",
+              ntohs(in->sin_port));
+      break;
+    }
+    case AF_INET6: {
+      struct sockaddr_in6 *in6 = (struct sockaddr_in6 *)res->ai_addr;
+      
+      memset(&in6->sin6_addr, 0, sizeof (struct in6_addr));
+      break;
+    }
+    default:
+      fatal(0, "unsupported family %d", (int)res->ai_addr->sa_family);
+    }
+    if(bind(rtpfd, res->ai_addr, res->ai_addrlen) < 0)
+      fatal(errno, "error binding socket to %s", format_sockaddr(res->ai_addr));
+    /* Report what we did */
+    info("listening on %s", format_sockaddr(res->ai_addr));
+  }
+  for(;;) {
+    struct rtp_header header;
+    char buffer[4096];
+    struct iovec iov[2];
+    struct timeval when;
+
+    iov[0].iov_base = &header;
+    iov[0].iov_len = sizeof header;
+    iov[1].iov_base = buffer;
+    iov[1].iov_len = sizeof buffer;
+    n = readv(rtpfd, iov, 2);
+    gettimeofday(&when, 0);
+    if(n < 0) {
+      switch(errno) {
+      case EINTR:
+        continue;
+      default:
+        fatal(errno, "error reading from socket");
+      }
+    }
+    if((size_t)n <= sizeof (struct rtp_header)) {
+      info("ignored a short packet");
+      continue;
+    }
+    frames(&when, (n - sizeof header) / bpf);
+  }
+}
+
+/*
+Local Variables:
+c-basic-offset:2
+comment-column:40
+fill-column:79
+indent-tabs-mode:nil
+End:
+*/
index 1e465ab..ee452c9 100644 (file)
@@ -1,7 +1,7 @@
 # Process this file with autoconf to produce a configure script.
 #
 # This file is part of DisOrder.
-# Copyright (C) 2004-2008 Richard Kettlewell
+# Copyright (C) 2004-2009 Richard Kettlewell
 # Portions copyright (C) 2007 Ross Younger
 #
 # This program is free software: you can redistribute it and/or modify
@@ -39,8 +39,24 @@ want_alsa=yes
 want_oss=yes
 want_coreaudio=yes
 
+# By default we don't want gtk-osx.  But if you ask for --with-gtk-osx...
+#
+# Disobedience can be built to a native OS X application.  There are some
+# caveats:
+#  - you will still need Fink (or something) for other libraries
+#  - if you wanted an application bundle you are out of luck
+#  - the menu bar is still in the main window (not at the top of the screen)
+#
+# So it's still rather rough and ready.  But it does work...
+#
+# See:
+#   http://www.gtk-osx.org/
+#   http://live.gnome.org/GTK%2B/OSX/Framework
+want_gtkosx=no
+
 # Checks for programs.
 AC_PROG_CC
+AM_PROG_CC_C_O
 AC_PROG_AWK
 AC_SET_MAKE
 if test "x$GCC" = xyes; then
@@ -73,6 +89,10 @@ AC_ARG_WITH([tests],
            [AS_HELP_STRING([--without-tests],
                            [do not build test suit])],
            [want_tests=$withval])
+AC_ARG_WITH([gtk-osx],
+           [AS_HELP_STRING([--with-gtk-osx],
+                           [use native GTK+ (OS X only)])],
+           [want_gtkosx=$withval])
 
 AC_MSG_CHECKING([for a known target platform])
 case "$host" in
@@ -90,8 +110,11 @@ case "$host" in
   ;;
 *-apple-darwin* )
   AC_MSG_RESULT([Mac OS X])
+  # AudioHardwareGetProperty is deprecated in 10.6, but it's still _there_,
+  # so we'll just turn off the warning.
+  CC="$CC -Wno-deprecated-declarations"
   if test $want_coreaudio = yes; then
-    COREAUDIO="-framework CoreAudio"
+    COREAUDIO="-framework CoreFoundation -framework CoreServices -framework CoreAudio"
   fi
   browser=open
   AC_MSG_CHECKING([Mac OS X target version])
@@ -117,9 +140,11 @@ case "$host" in
   AC_DEFINE_UNQUOTED([MAC_OS_X_VERSION_MIN_REQUIRED], [$minver],
                      [define to minimum version of Mac OS X to support])
 
-  # Fink's GTK+ is hopelessly broken
-  PKG_CONFIG_PATH=${PKG_CONFIG_PATH:-/sw/lib/pango-ft219/lib/pkgconfig}
-  export PKG_CONFIG_PATH
+  if test $want_gtkosx = no; then
+    # Fink's GTK+ is hopelessly broken
+    PKG_CONFIG_PATH=${PKG_CONFIG_PATH:-/sw/lib/pango-ft219/lib/pkgconfig}
+    export PKG_CONFIG_PATH
+  fi
 
   ;;
 *-freebsd* )
@@ -320,7 +345,7 @@ if test $want_gtk = yes; then
   fi
 fi
 if test $want_tests = yes && test $want_python = yes; then
-  AM_PATH_PYTHON([2.4])
+  AM_PATH_PYTHON([2.5])
   subdirs="${subdirs} python tests"
 fi
 AC_SUBST([subdirs])
@@ -359,16 +384,39 @@ AC_PATH_PROG([SENDMAIL],[sendmail],[none],[$PATH:/usr/sbin:/usr/lib])
 # Macs might have libraries under fink's root
 AC_PATH_PROG([FINK],[fink],[none],[$PATH:/sw/bin])
 if test "x$FINK" != xnone; then
+  # Find Fink prefix
   AC_CACHE_CHECK([fink install directory],[rjk_cv_finkprefix],[
     rjk_cv_finkprefix="`echo "$FINK" | sed 's,/bin/fink$,,'`"
   ])
+  # Add include and link paths
   finkdir="${rjk_cv_finkprefix}"
   finkbindir="${rjk_cv_finkprefix}/bin"
-  CPPFLAGS="${CPPFLAGS} -I${rjk_cv_finkprefix}/include/gc -I${rjk_cv_finkprefix}/include"
+  CPPFLAGS="${CPPFLAGS} -isystem ${rjk_cv_finkprefix}/include/gc -isystem ${rjk_cv_finkprefix}/include"
   if test $want_server = yes; then
-    CPPFLAGS="${CPPFLAGS} -I${rjk_cv_finkprefix}/include/db4"
+    CPPFLAGS="${CPPFLAGS} -isystem ${rjk_cv_finkprefix}/include/db4"
   fi
   LDFLAGS="${LDFLAGS} -L${rjk_cv_finkprefix}/lib"
+  # Distinguish 32- and 64-bit fink
+  AC_CACHE_CHECK([whether Fink is 32-bit or 64-bit],[rjk_cv_finkbits],[
+    odata=`otool -v -h $finkbindir/dpkg`
+    case "$odata" in
+    *X86_64* )
+      rjk_cv_finkbits=64
+      ;;
+    *I386* )
+      rjk_cv_finkbits=32
+      ;;
+    * )
+      rjk_cv_finkbits=unknown
+      ;;
+    esac
+  ])
+  # Match Fink so we can use its libraries
+  case $rjk_cv_finkbits in
+  32 | 64 )
+    CC="$CC -m$rjk_cv_finkbits"
+    ;;
+  esac
 else
   finkbindir=""
 fi
@@ -416,8 +464,14 @@ AC_CHECK_LIB([pthread], [pthread_create],
             [missing_libraries="$missing_libraries libpthread"])
 
 if test $want_gtk = yes; then
-  AM_PATH_GLIB_2_0([],[],[missing_libraries="$missing_libraries libglib"])
-  AM_PATH_GTK_2_0([],[],[missing_libraries="$missing_libraries libgtk"])
+  if test $want_gtkosx = yes; then
+    GTK_CFLAGS="-isystem /Library/Frameworks/Gtk.framework/Headers -isystem /Library/Frameworks/Cairo.framework/Headers"
+    GLIB_CFLAGS="-isystem /Library/Frameworks/GLib.framework/Headers"
+    GTK_LIBS="-framework Gtk -framework GLib"
+  else
+    AM_PATH_GLIB_2_0([],[],[missing_libraries="$missing_libraries libglib"])
+    AM_PATH_GTK_2_0([],[],[missing_libraries="$missing_libraries libgtk"])
+  fi
 fi
 
 # Some platforms have iconv already
@@ -669,6 +723,25 @@ if test "x$GCC" = xyes; then
     gcc_werror=''
   fi
 
+  AC_CACHE_CHECK([checking for excessively strict -Wreturn-type],
+                 [rjk_cv_gcc44_stupidity],[
+    old_CC="$CC"
+    if test $GCC = yes; then
+      CC="$CC -Wreturn-type -Werror"
+    fi
+    AC_COMPILE_IFELSE([
+      static void *threadfn(void) {
+        for(;;)
+          ;
+      }],
+      [rjk_cv_gcc44_stupidity=no],
+      [rjk_cv_gcc44_stupidity=yes])
+    CC="$old_CC"
+  ])
+  if test $rjk_cv_gcc44_stupidity = yes; then
+    AC_DEFINE([HAVE_STUPID_GCC44],[1],[Define if your compiler has excessively strict -Wreturn-type])
+  fi
+
   # a reasonable default set of warnings
   CC="${CC} -Wall -W -Wpointer-arith -Wbad-function-cast \
        -Wwrite-strings -Wmissing-prototypes \
index b4af06d..b799a1c 100644 (file)
@@ -22,7 +22,7 @@ EXTRA_DIST=README.Debian config.disorder-server control \
           copyright README.RTP \
           etc.disorder.options.user etc.disorder.config \
           postinst.disorder-server prerm.disorder-server \
-          postrm.disorder-server \
+          postrm.disorder-server overrides.disorder-server \
           templates.disorder-server conffiles.disorder-server \
           rules changelog usr.share.menu.disobedience \
           postinst.disobedience
index f171349..390175e 100644 (file)
@@ -2,7 +2,7 @@ Source: disorder
 Maintainer: Richard Kettlewell <rjk@greenend.org.uk>
 Section: sound
 Priority: optional
-Standards-Version: 3.7.2.2
+Standards-Version: 3.8.1.0
 Build-Depends: libgc6-dev | libgc-dev, libgcrypt-dev, libdb4.3-dev, libpcre3-dev, libvorbis-dev, libmad0-dev, libasound2-dev, libao-dev, python, libflac-dev, libgtk2.0-dev
 Vcs-Bzr: http://www.greenend.org.uk/rjk/bzr/disorder.dev/
 Homepage: http://www.greenend.org.uk/rjk/disorder/
diff --git a/debian/overrides.disorder-server b/debian/overrides.disorder-server
new file mode 100644 (file)
index 0000000..404841e
--- /dev/null
@@ -0,0 +1,3 @@
+# No, we can't use '/etc/init.d/disorder stop', the whole point is to
+# avoid problems with that not working.
+disorder-server: start-stop-daemon-in-maintainer-script prerm:29
index 4c06bef..fc26afa 100644 (file)
@@ -21,7 +21,7 @@ set -e
 
 case "$1" in
 configure )
-  if type update-menus >/dev/null 2>&1; then
+  if command -v update-menus >/dev/null 2>&1; then
     update-menus
   fi
   ;;
index cb5e60d..316f1e9 100755 (executable)
@@ -1,7 +1,7 @@
 #! /bin/sh
 #
 # This file is part of DisOrder
-# Copyright (C) 2004, 2007, 2008 Richard Kettlewell
+# Copyright (C) 2004, 2007-2009 Richard Kettlewell
 #
 # 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
@@ -34,10 +34,31 @@ configure_init_d() {
 }
 
 restart_server() {
+  local first
+  local time
   invoke-rc.d disorder restart
-  # Wait for the server to get going.  This is a horrid bodge and ought
-  # to be done away with, but is required for the time being.  Sorry.
-  sleep 5
+  # Wait for the server to start
+  first=true
+  time=0
+  while :; do
+    if disorder version >/dev/null 2>&1; then
+      break
+    else
+      if [ $time -gt 30 ]; then
+        echo
+        echo "Server did not stabilise in a reasonable amount of time"
+        exit 1
+      fi
+      if $first; then
+       printf "Waiting for server to stabilise"
+       first=false
+      fi
+      printf "."
+      sleep 1
+    fi
+    time=`expr $time + 1`
+  done
+  echo
 }
 
 setup_guest() {
index 85f80a4..0742696 100755 (executable)
@@ -21,7 +21,7 @@ set -e
 
 case "$1" in
 remove )
-  if type update-menus >/dev/null 2>&1; then
+  if command -v update-menus >/dev/null 2>&1; then
     update-menus
   fi
   ;;
index 7ba0933..5aa1df6 100755 (executable)
@@ -30,6 +30,7 @@ cleanup_remove() {
   rm -f $state/__db.*
   rm -f $state/noticed.db
   rm -f $state/search.db
+  rm -f $state/isearch.db
   rm -f $state/tags.db
   rm -f $state/tracks.db
 }
@@ -43,6 +44,7 @@ cleanup_purge() {
   rm -f $state/prefs.db
   rm -f $state/schedule.db
   rm -f $state/users.db
+  rm -f $state/playlists.db
 }
 
 case "$1" in
@@ -54,7 +56,7 @@ purge )
     . /usr/share/debconf/confmodule
     db_purge
   fi
-  update-rc.d disorder remove
+  update-rc.d disorder remove > /dev/null
   cleanup_remove
   cleanup_purge
   ;;
index 5c53f50..620c775 100755 (executable)
@@ -60,6 +60,8 @@ SENDMAIL=/usr/sbin/sendmail
 LIBTOOL=./libtool
 FAKEROOT=fakeroot
 
+SHELL=bash
+
 # ./prepare is the script that generates configure etc.  It only needs to be
 # run if building from a checkout rather than a tarball.
 build:
@@ -85,8 +87,8 @@ pkg-disorder: build
        $(INSTALL_DATA) debian/copyright \
                debian/disorder/usr/share/doc/disorder/copyright
        $(INSTALL_DATA) debian/changelog \
-               debian/disorder/usr/share/doc/disorder/changelog.Debian
-       gzip -9 debian/disorder/usr/share/doc/disorder/changelog.Debian
+               debian/disorder/usr/share/doc/disorder/changelog
+       gzip -9 debian/disorder/usr/share/doc/disorder/changelog*
        @for f in conffiles templates; do\
          if test -e debian/$$f.disorder; then\
            echo $(INSTALL_DATA) debian/$$f.disorder debian/disorder/DEBIAN/$$f; \
@@ -101,6 +103,8 @@ pkg-disorder: build
        done
        $(MAKE) DESTDIR=`pwd`/debian/disorder installdirs install -C doc
        $(MAKE) DESTDIR=`pwd`/debian/disorder installdirs install -C clients
+       strip --remove-section=.comment debian/disorder/usr/bin/disorder
+       strip --remove-section=.comment debian/disorder/usr/bin/disorderfm
        $(MAKE) DESTDIR=`pwd`/debian/disorder installdirs install -C lib
        $(INSTALL_DATA) scripts/completion.bash \
                debian/disorder/etc/bash_completion.d/disorder
@@ -125,6 +129,10 @@ pkg-disorder: build
                 debian/disorder/usr/share/doc/disorder/README.* \
                 debian/disorder/usr/share/doc/disorder/BUGS \
                 debian/disorder/usr/share/man/man*/*
+       cd debian/disorder && \
+               find -name DEBIAN -prune -o -type f -print \
+                       | sed 's/^\.\///' \
+                       | xargs md5sum > DEBIAN/md5sums
        dpkg-gencontrol -isp -pdisorder -Pdebian/disorder -Tdebian/substvars.disorder
        chown -R root:root debian/disorder
        chmod -R g-ws debian/disorder
@@ -135,11 +143,14 @@ pkg-disorder-server: build
        $(MKDIR) debian/disorder-server
        $(MKDIR) debian/disorder-server/DEBIAN
        $(MKDIR) debian/disorder-server/usr/share/doc/disorder-server
+       $(MKDIR) debian/disorder-server/usr/share/lintian/overrides
+       $(INSTALL_DATA) debian/overrides.disorder-server \
+           debian/disorder-server/usr/share/lintian/overrides/disorder-server
        $(INSTALL_DATA) debian/copyright \
                debian/disorder-server/usr/share/doc/disorder-server/copyright
        $(INSTALL_DATA) debian/changelog \
-               debian/disorder-server/usr/share/doc/disorder-server/changelog.Debian
-       gzip -9 debian/disorder-server/usr/share/doc/disorder-server/changelog.Debian
+               debian/disorder-server/usr/share/doc/disorder-server/changelog
+       gzip -9 debian/disorder-server/usr/share/doc/disorder-server/changelog*
        @for f in preinst postinst prerm postrm config; do\
          if test -e debian/$$f.disorder-server; then\
            echo $(INSTALL_SCRIPT) debian/$$f.disorder-server debian/disorder-server/DEBIAN/$$f; \
@@ -197,6 +208,15 @@ pkg-disorder-server: build
                debian/disorder-server/usr/lib/disorder/*.so
        rm -rf debian/disorder-server/usr/share/doc/disorder-server
        ln -s disorder debian/disorder-server/usr/share/doc/disorder-server
+       strip --remove-section=.comment \
+               debian/disorder-server/usr/sbin/* \
+               debian/disorder-server${cgiexecdir}/* \
+               debian/disorder-server/usr/lib/ao/plugins*/*.so \
+               debian/disorder-server/usr/lib/disorder/*.so
+       cd debian/disorder-server && \
+               find -name DEBIAN -prune -o -type f -print \
+                       | sed 's/^\.\///' \
+                       | xargs md5sum > DEBIAN/md5sums
        dpkg-gencontrol -isp -pdisorder-server -Pdebian/disorder-server -Tdebian/substvars.disorder-server
        chown -R root:root debian/disorder-server
        chmod -R g-ws debian/disorder-server
@@ -210,8 +230,8 @@ pkg-disorder-playrtp: build
        $(INSTALL_DATA) debian/copyright \
                debian/disorder-playrtp/usr/share/doc/disorder-playrtp/copyright
        $(INSTALL_DATA) debian/changelog \
-               debian/disorder-playrtp/usr/share/doc/disorder-playrtp/changelog.Debian
-       gzip -9 debian/disorder-playrtp/usr/share/doc/disorder-playrtp/changelog.Debian
+               debian/disorder-playrtp/usr/share/doc/disorder-playrtp/changelog
+       gzip -9 debian/disorder-playrtp/usr/share/doc/disorder-playrtp/changelog*
        @for f in preinst postinst prerm postrm conffiles templates config; do\
          if test -e debian/$$f.disorder-playrtp; then\
            echo $(INSTALL_SCRIPT) debian/$$f.disorder-playrtp debian/disorder-playrtp/DEBIAN/$$f; \
@@ -222,6 +242,7 @@ pkg-disorder-playrtp: build
        $(MKDIR) debian/disorder-playrtp/usr/share/man/man1
        $(INSTALL_PROGRAM) clients/disorder-playrtp \
                debian/disorder-playrtp/usr/bin/disorder-playrtp
+       strip --remove-section=.comment debian/disorder-playrtp/usr/bin/disorder-playrtp
        $(INSTALL_DATA) doc/disorder-playrtp.1 \
                debian/disorder-playrtp/usr/share/man/man1/disorder-playrtp.1
        dpkg-shlibdeps -Tdebian/substvars.disorder-playrtp \
@@ -230,6 +251,10 @@ pkg-disorder-playrtp: build
                debian/disorder-playrtp/usr/share/doc/disorder-playrtp/README
        $(INSTALL_DATA) CHANGES.html debian/disorder-playrtp/usr/share/doc/disorder-playrtp/CHANGES.html
        gzip -9f debian/disorder-playrtp/usr/share/man/man*/*
+       cd debian/disorder-playrtp && \
+               find -name DEBIAN -prune -o -type f -print \
+                       | sed 's/^\.\///' \
+                       | xargs md5sum > DEBIAN/md5sums
        dpkg-gencontrol -isp -pdisorder-playrtp -Pdebian/disorder-playrtp -Tdebian/substvars.disorder-playrtp
        chown -R root:root debian/disorder-playrtp
        chmod -R g-ws debian/disorder-playrtp
@@ -243,8 +268,8 @@ pkg-disobedience: build
        $(INSTALL_DATA) debian/copyright \
                debian/disobedience/usr/share/doc/disobedience/copyright
        $(INSTALL_DATA) debian/changelog \
-               debian/disobedience/usr/share/doc/disobedience/changelog.Debian
-       gzip -9 debian/disobedience/usr/share/doc/disobedience/changelog.Debian
+               debian/disobedience/usr/share/doc/disobedience/changelog
+       gzip -9 debian/disobedience/usr/share/doc/disobedience/changelog*
        @for f in preinst postinst prerm postrm conffiles templates config; do\
          if test -e debian/$$f.disobedience; then\
            echo $(INSTALL_SCRIPT) debian/$$f.disobedience debian/disobedience/DEBIAN/$$f; \
@@ -256,6 +281,7 @@ pkg-disobedience: build
        $(MKDIR) debian/disobedience/usr/share/pixmaps
        $(MKDIR) debian/disobedience/usr/share/menu
        $(MAKE) -C disobedience install DESTDIR=`pwd`/debian/disobedience
+       strip --remove-section=.comment debian/disobedience/usr/bin/disobedience
        $(INSTALL_DATA) doc/disobedience.1 \
                debian/disobedience/usr/share/man/man1/disobedience.1
        $(INSTALL_DATA) images/disobedience16x16.xpm \
@@ -268,6 +294,10 @@ pkg-disobedience: build
                debian/disobedience/usr/bin/*
        rm -rf debian/disobedience/usr/share/doc/disobedience
        ln -s disorder debian/disobedience/usr/share/doc/disobedience
+       cd debian/disobedience && \
+               find -name DEBIAN -prune -o -type f -print \
+                       | sed 's/^\.\///' \
+                       | xargs md5sum > DEBIAN/md5sums
        dpkg-gencontrol -isp -pdisobedience -Pdebian/disobedience -Tdebian/substvars.disobedience
        chown -R root:root debian/disobedience
        chmod -R g-ws debian/disobedience
index 94a4c78..f8bdb14 100644 (file)
@@ -1,6 +1,6 @@
 #
 # This file is part of DisOrder.
-# Copyright (C) 2006-2008 Richard Kettlewell
+# Copyright (C) 2006-2009 Richard Kettlewell
 #
 # 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
@@ -30,7 +30,7 @@ disobedience_SOURCES=disobedience.h disobedience.c client.c queue.c   \
        help.c ../lib/memgc.c settings.c users.c lookup.c choose.h      \
        popup.h playlists.c
 disobedience_LDADD=../lib/libdisorder.a $(LIBPCRE) $(LIBGC) $(LIBGCRYPT) \
-       $(LIBASOUND) $(COREAUDIO) $(LIBDB)
+       $(LIBASOUND) $(COREAUDIO) $(LIBDB) $(LIBICONV)
 disobedience_LDFLAGS=$(GTK_LIBS)
 
 install-exec-hook:
index c512059..852885f 100644 (file)
@@ -20,7 +20,6 @@
  */
 
 #include "disobedience.h"
-#include "mixer.h"
 
 /* Forward declarations ---------------------------------------------------- */
 
@@ -323,7 +322,7 @@ static void volume_changed(const char attribute((unused)) *event,
   ++suppress_actions;
   /* Only display volume/balance controls if they will work */
   if(!rtp_supported
-     || (rtp_supported && mixer_supported(DEFAULT_BACKEND)))
+     || (rtp_supported && backend && backend->set_volume))
     volume_supported = TRUE;
   else
     volume_supported = FALSE;
@@ -444,7 +443,8 @@ static void volume_adjusted(GtkAdjustment attribute((unused)) *a,
    * from the log. */
   if(rtp_supported) {
     int l = nearbyint(left(v, b) * 100), r = nearbyint(right(v, b) * 100);
-    mixer_control(DEFAULT_BACKEND, &l, &r, 1);
+    if(backend && backend->set_volume)
+      backend->set_volume(&l, &r);
   } else
     disorder_eclient_volume(client, volume_completed,
                             nearbyint(left(v, b) * 100),
index 1f9ee43..2b31941 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * This file is part of DisOrder.
- * Copyright (C) 2006, 2007, 2008 Richard Kettlewell
+ * Copyright (C) 2006-2009 Richard Kettlewell
  *
  * 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
  */
 
 #include "disobedience.h"
-#include "mixer.h"
 #include "version.h"
 
 #include <getopt.h>
 #include <locale.h>
 #include <pcre.h>
+#include <gcrypt.h>
 
 /* Apologies for the numerous de-consting casts, but GLib et al do not seem to
  * have heard of const. */
@@ -68,6 +68,9 @@ int volume_l;
 /** @brief Right channel volume */
 int volume_r;
 
+/** @brief Audio backend */
+const struct uaudio *backend;
+
 double goesupto = 10;                   /* volume upper bound */
 
 /** @brief True if a NOP is in flight */
@@ -264,10 +267,10 @@ static gboolean periodic_fast(gpointer attribute((unused)) data) {
   }
   last = now;
 #endif
-  if(rtp_supported && mixer_supported(DEFAULT_BACKEND)) {
+  if(rtp_supported && backend && backend->get_volume) {
     int nl, nr;
-    if(!mixer_control(DEFAULT_BACKEND, &nl, &nr, 0)
-       && (nl != volume_l || nr != volume_r)) {
+    backend->get_volume(&nl, &nr);
+    if(nl != volume_l || nr != volume_r) {
       volume_l = nl;
       volume_r = nr;
       event_raise("volume-changed", 0);
@@ -448,13 +451,24 @@ int main(int argc, char **argv) {
   }
   if(!gtkok)
     fatal(0, "failed to initialize GTK+");
+  /* gcrypt initialization */
+  if(!gcry_check_version(NULL))
+    disorder_fatal(0, "gcry_check_version failed");
+  gcry_control(GCRYCTL_INIT_SECMEM, 0);
+  gcry_control (GCRYCTL_INITIALIZATION_FINISHED, 0);
   signal(SIGPIPE, SIG_IGN);
   init_styles();
   load_settings();
   /* create the event loop */
   D(("create main loop"));
   mainloop = g_main_loop_new(0, 0);
-  if(config_read(0)) fatal(0, "cannot read configuration");
+  if(config_read(0, NULL)) fatal(0, "cannot read configuration");
+  /* we'll need mixer support */
+  backend = uaudio_apis[0];
+  if(backend->configure)
+    backend->configure();
+  if(backend->open_mixer)
+    backend->open_mixer();
   /* create the clients */
   if(!(client = gtkclient())
      || !(logclient = gtkclient()))
index 4687724..e34d383 100644 (file)
@@ -47,6 +47,7 @@
 #include "eventdist.h"
 #include "split.h"
 #include "timeval.h"
+#include "uaudio.h"
 
 #include <glib.h>
 #include <gtk/gtk.h>
@@ -104,6 +105,7 @@ extern GtkTooltips *tips;
 extern int rtp_supported;
 extern int rtp_is_running;
 extern GtkItemFactory *mainmenufactory;
+extern const struct uaudio *backend;
 
 extern const disorder_eclient_log_callbacks log_callbacks;
 
index 1c6df79..36850c1 100644 (file)
@@ -73,7 +73,7 @@ static void default_connect(void) {
   if(config->password)
     return;
   /* If we already have a host and/or port that's good too */
-  if(config->connect.n)
+  if(config->connect.af != -1)
     return;
   /* If there's a suitable socket that's probably what we wanted */
   const char *s = config_get_file("socket");
@@ -84,11 +84,21 @@ static void default_connect(void) {
 }
 
 static const char *get_hostname(void) {
-  return config->connect.n >= 2 ? config->connect.s[0] : "";
+  if(config->connect.af == -1 || !config->connect.address)
+    return "";
+  else
+    return config->connect.address;
 }
 
 static const char *get_service(void) {
-  return config->connect.n >= 2 ? config->connect.s[1] : "";
+  if(config->connect.af == -1)
+    return "";
+  else {
+    char *s;
+
+    byte_xasprintf(&s, "%d", config->connect.port);
+    return s;
+  }
 }
 
 static const char *get_username(void) {
@@ -100,11 +110,13 @@ static const char *get_password(void) {
 }
 
 static void set_hostname(struct config *c, const char *s) {
-  c->connect.s[0] = (char *)s;
+  if(c->connect.af == -1)
+    c->connect.af = AF_UNSPEC;
+  c->connect.address = xstrdup(s);
 }
 
 static void set_service(struct config *c, const char *s) {
-  c->connect.s[1] = (char *)s;
+  c->connect.port = atoi(s);
 }
 
 static void set_username(struct config *c, const char *s) {
@@ -131,13 +143,10 @@ static void login_update_config(struct config *c) {
   size_t n;
   const gboolean remote = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(lwi_remote));
 
-  if(remote) {
-    c->connect.n = 2;
-    c->connect.s = xcalloc(2, sizeof (char *));
-  } else {
-    c->connect.n = 0;
-    c->connect.s = 0;
-  }
+  if(remote)
+    c->connect.af = AF_UNSPEC;
+  else
+    c->connect.af = -1;
   for(n = 0; n < NLWIS; ++n)
     if(remote || !(lwis[n].flags & LWI_REMOTE))
       lwis[n].set(c, xstrdup(gtk_entry_get_text(GTK_ENTRY(lwi_entry[n]))));
@@ -161,10 +170,12 @@ static void login_save_config(void) {
                    "password %s\n",
                    quoteutf8(config->username),
                    quoteutf8(config->password));
-  if(rc >= 0 && config->connect.n)
-    rc = fprintf(fp, "connect %s %s\n",
-                 quoteutf8(config->connect.s[0]),
-                 quoteutf8(config->connect.s[1]));
+  if(rc >= 0 && config->connect.af != -1) {
+    char **vec;
+
+    netaddress_format(&config->connect, NULL, &vec);
+    rc = fprintf(fp, "connect %s %s %s\n", vec[0], vec[1], vec[2]);
+  }
   if(rc < 0) {
     fpopup_msg(GTK_MESSAGE_ERROR, "error writing to %s: %s",
                tmp, strerror(errno));
@@ -327,7 +338,7 @@ void login_box(void) {
   }
   /* Initial settings */
   gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(lwi_remote),
-                               config->connect.n >= 2);
+                               config->connect.af != -1);
   lwi_remote_toggled(GTK_TOGGLE_BUTTON(lwi_remote), 0);
   buttonbox = create_buttons(buttons, NBUTTONS);
   vbox = gtk_vbox_new(FALSE, 1);
index 1d50223..f8bd58e 100644 (file)
@@ -176,7 +176,7 @@ static void about_popup_got_version(void attribute((unused)) *v,
                      FALSE/*fill*/,
                      1/*padding*/);
   gtk_box_pack_start(GTK_BOX(vbox),
-                     gtk_label_new("\xC2\xA9 2004-2008 Richard Kettlewell"),
+                     gtk_label_new("\xC2\xA9 2004-2009 Richard Kettlewell"),
                      FALSE/*expand*/,
                      FALSE/*fill*/,
                      1/*padding*/);
index fa4bd42..e8b1c5e 100644 (file)
@@ -108,7 +108,7 @@ it.
 .TP
 .B "Balance slider"
 The balance slider indicates the current balance and can be used to adjust it.
--1 means only the left speaker, 0 means both speakers at equal volume and +1
+\-1 means only the left speaker, 0 means both speakers at equal volume and +1
 means the only the right speaker.
 .SS "Queue Tab"
 This displays the currently playing track and the queue.
index 5e0d091..c92c55a 100644 (file)
@@ -1,5 +1,5 @@
 .\"
-.\" Copyright (C) 2007, 2008 Richard Kettlewell
+.\" Copyright (C) 2007-2009 Richard Kettlewell
 .\"
 .\" 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
@@ -21,38 +21,66 @@ disorder-playrtp \- play DisOrder network broadcasts
 .B disorder\-playrtp
 .RI [ OPTIONS ]
 .RB [ \-\- ]
-.RI [[ GROUP ]
+.RI [[ ADDRESS ]
 .IR PORT ]
 .SH DESCRIPTION
 \fBdisorder\-playrtp\fR plays a network broadcast sent from the specified
 address.
 .PP
-If neither a group nor port are specified then the local DisOrder
+If neither an address nor port are specified then the local DisOrder
 configuration is consulted to find the server and the server is asked where the
 RTP stream is.
 .PP
 If just a port is specified then the RTP stream is assumed to be unicast or
 broadcast to that port.
 .PP
-If a group and a port are specified then the RTP stream is assumed to be
-multicast to that group and port.
+If an address and a port are specified then the RTP stream is assumed to be
+multicast to that group address and port.
 .SH OPTIONS
 The default sound API is the first of the ones listed below that are available.
 Usually this implies ALSA under Linux and Core Audio under OS X.
 .TP
-.B \-\-alsa\fR, \fB-\a
+.B \-\-alsa\fR, \fB\-a
 Use ALSA to play sound.
+Only available on Linux.
 .TP
 .B \-\-oss\fR, \fB\-o
 Use OSS to play sound.
+Only available on Linux and FreeBSD.
 .TP
 .B \-\-core\-audio\fR, \fB\-c
 Use Core Audio to play sound.
+Only available on Macs.
 .TP
 .B \-\-device \fIDEVICE\fR, \fB\-D \fIDEVICE\fR
 Specifies the audio device to use.
-The exact meaning of this is platform-dependent; on Linux it is the
-ALSA device name.
+See
+.B "DEVICE NAMES"
+below for more information.
+.TP
+.B \-\-command \fICOMMAND\fR, \fB-e \fICOMMAND\fR
+Instead of sending to a physical audio device, invoke \fICOMMAND\fR using the
+shell and write audio samples to its standard input.
+Currently the input will be 44100KHz 16-bit signed stereo samples.
+If \fICOMMAND\fR exits it is re-executed; any samples that had been written to
+the pipe but not processed by the previous instance will be lost.
+.IP
+.B \-\-device
+is redundant with this option, but you might want to set
+.BR \-\-pause\-mode .
+.IP
+As an example,
+.B "-e \(aqcat > dump\(aq"
+would log audio data to a file for later processing.
+You could convert it to another format with, for instance:
+.IP
+.B "sox -c2 -traw -r44100 -s -w dump dump.wav"
+.TP
+.B \-\-pause\-mode \fIMODE\fR, \fB-P \fIMODE
+Set the pause mode for \fB\-\-command\fR to either \fBsilence\fR (the default), in
+which pauses are represented by sending silent samples, or \fBsuspend\fR, in which
+writes to  the subprocess are suspended, requiring it to infer a pause from flow
+control.
 .TP
 .B \-\-config \fIPATH\fR, \fB\-C \fIPATH
 Set the configuration file.
@@ -70,26 +98,30 @@ Display a usage message.
 Display version number.
 .SS "Buffer Control Options"
 You shouldn't need to use these options.
+Their effects are subject to change between version without warning.
+You should consult the source code for details of their effects.
 .TP
 .B \-\-min \fIFRAMES\fR, \fB\-m \fIFRAMES\fR
 Specifies the buffer low watermark in frames.
-If the number of frames falls below this value then playing will be
-stopped until the buffer fills up.
-.TP
-.B \-\-buffer \fIFRAMES\fR, \fB\-b \fIFRAMES\fR
-Specifies the buffer high watermark in frames.
-Once there are this many frames in the buffer, playing will be (re-)started.
+This also acts as the target buffer occupancy.
 .TP
 .B \-\-max \fIFRAMES\fR, \fB\-x \fIFRAMES\fR
 Specifies the maximum buffer size in frames.
 If there are this many frames in the buffer then reading from the
 network socket will be suspended.
-The default is four times the \fB\-\-buffer\fR value.
+The default is twice the \fB\-\-min\fR value.
 .TP
 .B \-\-rcvbuf \fIBYTES\fR, \fB\-R \fIBYTES\fR
 Specifies socket receive buffer size.
-The default is 131072 (128Kbytes).
+The default is not to change the buffer size, i.e. you get whatever the
+local operating system chooses.
 The buffer size will not be reduced below the operating system's default.
+.TP
+.B \-\-monitor\fR, \fB\-M
+Periodically report how close to the buffer low watermark the buffer is.
+If you have trouble with poor playback quality, enable this option to see if
+the buffer is emptying out (or overfilling, though there are measures to
+prevent that from happening).
 .SH "REMOTE CONTROL"
 The
 .B \-\-socket
@@ -113,6 +145,16 @@ After the first command the connection is closed.
 Only one connection at a time will be serviced.
 .PP
 This protocol is not guaranteed to be stable.
+.SH "DEVICE NAMES"
+.SS "Core Audio"
+On a Mac, the device name can either be the human-readable name of the desired
+output or its UID.
+To get a list of the human-readable names, visit System Preferences -> Sound;
+the Type column has the name you want.
+.PP
+For example, you might use "Built-in Output" for the built-in speaker
+or "Built-in Line Output" if you have connected external speakers.
+Remember to quote the name.
 .SH "SEE ALSO"
 .BR disobedience (1),
 .BR disorder_config (5),
index 784b37a..b61a825 100644 (file)
@@ -190,6 +190,11 @@ recently played one.
 .TP
 .B reconfigure
 Make the daemon reload its configuration file.
+.IP
+Not all configuration options can be modified during the lifetime of the
+server; of those that can't, some will just be ignored if they change while
+others will cause the new configuration to be rejected.
+See \fBdisorder_config\fR(5) for details.
 .TP
 .B remove \fITRACK\fR
 Remove a track from the queue.
index 5bd10b3..2b71bf9 100644 (file)
@@ -146,7 +146,7 @@ If the track or key are not found a null pointer is returned.
 .IP
 This function sets the value of \fBkey\fR for \fBtrack\fR to
 \fBvalue\fR.
-On success, 0 is returned; on error, -1 is returned.
+On success, 0 is returned; on error, \-1 is returned.
 .IP
 If \fBvalue\fR is a null pointer then the preference is deleted.
 .IP
@@ -292,7 +292,7 @@ match them back up to the right collection to call
 .fi
 .IP
 Check whether file \fBpath\fR under \fBroot\fR still exists.
-Should return 1 if it exists, 0 if it does not and -1 on error.
+Should return 1 if it exists, 0 if it does not and \-1 on error.
 This is run in the main server process.
 .PP
 Both scan and recheck are executed inside a subprocess, so it will not
@@ -392,10 +392,10 @@ This function must never block, as it runs inside the main loop of the
 server.
 .IP
 On success, should return 0 and set \fB*playedp\fR to the number of
-seconds played so far of this track, or to -1 if this cannot be
+seconds played so far of this track, or to \-1 if this cannot be
 determined.
 .IP
-On error, should return -1.
+On error, should return \-1.
 .PP
 .nf
 \fBvoid disorder_play_resume(void *data);
index e2f1ab0..ef3a70f 100644 (file)
@@ -1,5 +1,5 @@
 .\"
-.\" Copyright (C) 2004-2008 Richard Kettlewell
+.\" Copyright (C) 2004-2009 Richard Kettlewell
 .\"
 .\" 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
@@ -177,7 +177,7 @@ Backslash
 Quotation mark
 .\" "
 .TP
-.B \e'
+.B \e\(aq
 Apostrophe
 .TP
 .B \en
@@ -223,6 +223,8 @@ The home directory for state files.
 Defaults to
 .IR pkgstatedir .
 The server will create this directory on startup if it does not exist.
+.IP
+This setting cannot be changed during the lifetime of the server.
 .TP
 .B plugins \fIPATH\fR
 Adds a directory to the plugin path.
@@ -252,6 +254,8 @@ The pattern should not attempt to include the collection root, which is
 automatically included, but should include the proper extension.
 .IP
 The default is \fB{/artist}{/album}{/title}{ext}\fR.
+.IP
+This setting cannot be changed during the lifetime of the server.
 .TP
 .B api \fINAME\fR
 Selects the backend used to play sound and to set the volume.
@@ -275,13 +279,19 @@ Execute a command.
 This is the default if
 .B speaker_command
 is specified, or if no native is available.
+.IP
+You might want to set
+.B pause_mode
+with this backend.
 .TP
-.B network
+.B rtp
 Transmit audio over the network.
 This is the default if \fBbroadcast\fR is specified.
 You can use
 .BR disorder-playrtp (1)
 to receive and play the resulting stream on Linux and OS X.
+.B network
+is a deprecated synonym for this API.
 .RE
 .TP
 .B authorization_algorithm \fIALGORITHM\fR
@@ -291,14 +301,22 @@ See
 .BR disorder_protocol (5)
 for more details.
 .TP
-.B broadcast \fIADDRESS\fR \fIPORT\fR
+.B broadcast \fR[\fIFAMILY\fR] \fIADDRESS\fR \fIPORT\fR
 Transmit sound data to \fIADDRESS\fR using UDP port \fIPORT\fR.
-This implies \fBapi network\fR.
+This implies \fBapi rtp\fR.
+.IP
+\fIFAMILY\fR can be \fB-4\fR or \fB-6\fR to force IPv4 or IPv6, if this is not
+implied by \fIADDRESS\fR.
+Note that IPv6 is not currently well tested.
 .IP
 See also \fBmulticast_loop\fR and \fBmulticast_ttl\fR.
 .TP
-.B broadcast_from \fIADDRESS\fR \fIPORT\fR
+.B broadcast_from \fR[\fIFAMILY\fR] \fIADDRESS\fR \fIPORT\fR
 Sets the (local) source address used by \fBbroadcast\fR.
+.IP
+\fIFAMILY\fR can be \fB-4\fR or \fB-6\fR to force IPv4 or IPv6, if this is not
+implied by \fIADDRESS\fR.
+Note that IPv6 is not currently well tested.
 .TP
 .B channel \fICHANNEL\fR
 The mixer channel that the volume control should use.
@@ -307,6 +325,7 @@ For \fBapi oss\fR the possible values are:
 .RS
 .TP 8
 .B pcm
+
 Output level for the audio device.
 This is probably what you want and is the default.
 .TP
@@ -361,11 +380,17 @@ It must be an absolute path and should not end with a "/".
 .B cookie_key_lifetime \fISECONDS\fR
 Lifetime of the signing key used in constructing cookies.  The default is one
 week.
+.IP
+If this is changed during the lifetime of the server, the current key doesn't
+hvave its lifetime retroactively changed.
 .TP
 .B cookie_login_lifetime \fISECONDS\fR
 Lifetime of a cookie enforced by the server.  When the cookie expires the user
 will have to log in again even if their browser has remembered the cookie that
 long.  The default is one day.
+.IP
+If this is changed during the lifetime of the server, cookies that have already
+een generated don't hvave their lifetime retroactively changed.
 .TP
 .B default_rights \fIRIGHTS\fR
 Defines the set of rights given to new users.
@@ -386,34 +411,39 @@ will be tried.
 .IP
 For \fBapi alsa\fR this is the device name to use.
 .IP
-For \fBapi coreaudio\fR this is currently ignored.
+For \fBapi coreaudio\fR this can be either the UID or the human-readable
+name of the desired device.
+For a list of names, visit System Preferences -> Sound and look at the Type column.
+For example, you might use "Built-in Output" for the built-in speaker
+or "Built-in Line Output" if you have connected external speakers.
+Remember to quote the name.
 .IP
 The default is \fBdefault\fR, which is intended to map to whatever the system's
 default is.
 .TP
 .B gap \fISECONDS\fR
-Specifies the number of seconds to leave between tracks.
-The default is 0.
-.IP
-NB this option currently DOES NOT WORK.  If there is genuine demand it might be
-reinstated.
+This option no longer does anything and will be removed in a future version.
 .TP
 .B history \fIINTEGER\fR
 Specifies the number of recently played tracks to remember (including
 failed tracks and scratches).
+.IP
+If this is changed during the lifetime of the server, it won't actually reduce
+the size of the list until it is next modified.
 .TP
-.B listen \fR[\fIHOST\fR] \fISERVICE\fR
+.B listen \fR[\fIFAMILY\fR] \fR[\fIHOST\fR] \fISERVICE\fR
 Listen for connections on the address specified by \fIHOST\fR and port
 specified by \fISERVICE\fR.
-If \fIHOST\fR is omitted then listens on all local addresses.
+If \fIHOST\fR is omitted, or is \fB*\fR, then listens on all local addresses.
+.IP
+\fIFAMILY\fR can be \fB-4\fR or \fB-6\fR to force IPv4 or IPv6, if this is not
+implied by \fIHOST\fR.
+Note that IPv6 is not currently well tested.
 .IP
 Normally the server only listens on a UNIX domain socket.
 .TP
 .B lock yes\fR|\fBno
-Determines whether the server locks against concurrent operation.
-Default is \fByes\fR.
-There is no good reason to set this to \fBno\fR and the option will
-probably be removed in a future version.
+This option no longer does anything and will be removed in a future version.
 .TP
 .B mixer \fIDEVICE\fR
 The mixer device name, if it needs to be specified separately from
@@ -430,12 +460,12 @@ For \fBapi coreaudio\fR, volume setting is not currently supported.
 .B multicast_loop yes\fR|\fBno
 Determines whether multicast packets are loop backed to the sending host.
 The default is \fByes\fR.
-This only applies if \fBapi\fR is set to \fBnetwork\fR and \fBbroadcast\fR
+This only applies if \fBapi\fR is set to \fBrtp\fR and \fBbroadcast\fR
 is actually a multicast address.
 .TP
 .B multicast_ttl \fIHOPS\fR
 Set the maximum number of hops to send multicast packets.
-This only applies if \fBapi\fR is set to \fBnetwork\fR and
+This only applies if \fBapi\fR is set to \fBrtp\fR and
 \fBbroadcast\fR is actually a multicast address.
 The default is 1.
 .TP
@@ -474,15 +504,23 @@ namepart album  "/([^/]+)/[^/]+$"                          $1 *
 namepart artist "/([^/]+)/[^/]+/[^/]+$"                    $1 *
 namepart ext    "(\\.[a-zA-Z0-9]+)$"                        $1 *
 .fi
+.IP
+This setting cannot be changed during the lifetime of the server.
 .TP
 .B new_bias \fIWEIGHT\fR
 The weight for new tracks.
 The default is 450000, i.e. recently added tracks are a fifty times as likely
 to be picked as normal.
+.IP
+New values of this option may be picked up from the configuration file even
+without a reload.
 .TP
 .B new_bias_age \fISECONDS\fR
 The maximum age of tracks that \fBnew_bias\fR applies to, in seconds.
 The default is one week.
+.IP
+New values of this option may be picked up from the configuration file even
+without a reload.
 .TP
 .B new_max \fIMAX\fR
 The maximum number of tracks to list when reporting newly noticed tracks.
@@ -504,6 +542,8 @@ by programs it executes.
 If you have limited CPU then it might help to set this to a small
 negative value.
 The default is 0.
+.IP
+Changes to this value during the lifetime of the server are ignored.
 .TP
 .B nice_speaker \fIPRIORITY\fR
 Set the speaker process priority.
@@ -514,12 +554,27 @@ standards but depends on reasonably timely scheduling.
 If you have limited CPU then it might help to set this to a small
 negative value.
 The default is 0.
+.IP
+Changes to this value during the lifetime of the server are ignored.
 .TP
 .B noticed_history
 The maximum days that a track can survive in the database of newly added
 tracks.
 The default is 31.
 .TP
+.B pause_mode \fIMODE
+Sets the pause mode for the \fBcommand\fR backend.
+The possible values are:
+.RS
+.TP
+.B silence
+Send silent (0-value) samples when paused.
+This is the default.
+.TP
+.B suspend
+Stop writing when paused.
+.RE
+.TP
 .B player \fIPATTERN\fR \fIMODULE\fR [\fIOPTIONS.. [\fB\-\-\fR]] \fIARGS\fR...
 Specifies the player for files matching the glob \fIPATTERN\fR.
 \fIMODULE\fR specifies which plugin module to use.
@@ -528,6 +583,10 @@ The following options are supported:
 .RS
 .TP
 .B \-\-wait\-for\-device\fR[\fB=\fIDEVICE\fR]
+\fBThis option is deprecated\fR.
+If you want gapless play use raw-format players and the speaker process instead.
+(This the default in any case.)
+.IP
 Waits (for up to a couple of seconds) for the default, or specified, libao
 device to become openable.
 .TP
@@ -577,16 +636,24 @@ command.
 If
 .B player
 is used without arguments, the list of players is cleared.
+.IP
+Although players can be changed during the lifetime of the server, note that
+background decoders will not be stopped and restarted using changed
+configuration once they have been started.
 .TP
 .B prefsync \fISECONDS\fR
-The interval at which the preferences log file will be synchronised.
-Defaults to 3600, i.e. one hour.
+This option no longer does anything and will be removed in a future version.
 .TP
 .B queue_pad \fICOUNT\fR
 The target size of the queue.
 If random play is enabled then randomly picked tracks will be added until
 the queue is at least this big.
 The default is 10.
+.IP
+If this is reduced during the lifetime of the server, the queue won't be
+reduced in size to fit; it just won't start growing again until it is under the
+new value.
+However, if it is increased, new tracks will start being added immediately.
 .TP
 .B reminder_interval \fISECONDS\fR
 The minimum number of seconds that must elapse between password reminders.
@@ -601,6 +668,9 @@ The minimum number of seconds that must elapse after a track has been played
 before it can be picked at random.  The default is 8 hours.  If this is set to
 0 then there is no limit, though current \fBdisorder-choose\fR will not pick
 anything currently listed in the recently-played list.
+.IP
+New values of this option may be picked up from the configuration file even
+without a reload.
 .TP
 .B sample_format \fIBITS\fB/\fIRATE\fB/\fICHANNELS
 Describes the sample format expected by the \fBspeaker_command\fR (below).
@@ -623,7 +693,7 @@ The default is
 .BR 16/44100/2 .
 .PP
 With the
-.B network
+.B rtp
 backend the sample format is forced to
 .B 16b/44100/2
 and with the
@@ -688,6 +758,8 @@ cleared.
 .IP
 There is a default set of stopwords built in, but this option can be used to
 augment or replace that list.
+.IP
+This setting cannot be changed during the lifetime of the server.
 .TP
 .B tracklength \fIPATTERN\fR \fIMODULE\fR
 Specifies the module used to calculate the length of files matching
@@ -696,18 +768,29 @@ Specifies the module used to calculate the length of files matching
 .IP
 If \fBtracklength\fR is used without arguments then the list of modules is
 cleared.
+.IP
+Track lengths are cached in the database, and changing this setting won't cause
+them to be regenerated.
 .TP
 .B user \fIUSERNAME\fR
 Specifies the user to run as.
 Only makes sense if invoked as root (or the target user).
+.IP
+This setting cannot be changed during the lifetime of the server
+(and if it is changed with a restart, you will need to adjust file permissions
+on the server's database).
 .SS "Client Configuration"
 These options would normally be used in \fI~\fRUSERNAME\fI/.disorder/passwd\fR
 or
 \fIpkgconfdir/config.\fRUSERNAME.
 .TP
-.B connect \fIHOST SERVICE\fR
+.B connect \fR[\fIFAMILY\fR] \fIHOST SERVICE\fR
 Connect to the address specified by \fIHOST\fR and port specified by
 \fISERVICE\fR.
+.IP
+\fIFAMILY\fR can be \fB-4\fR or \fB-6\fR to force IPv4 or IPv6, if this is not
+implied by \fIHOST\fR.
+Note that IPv6 is not currently well tested.
 .TP
 .B password \fIPASSWORD\fR
 Specify password.
@@ -781,7 +864,6 @@ longer needs to be specified.
 .IP
 This must be the full URL, e.g. \fBhttp://myhost/cgi-bin/jukebox\fR and not
 \fB/cgi-bin/jukebox\fR.
-.SH "GLOBAL PREFERENCES"
 .SH "LIBAO DRIVER"
 .SS "Raw Protocol Players"
 Raw protocol players are expected to use the \fBdisorder\fR libao driver.
index 4ad1d42..a0baadb 100644 (file)
@@ -282,6 +282,11 @@ See below for the track information syntax.
 .B reconfigure
 Request that DisOrder reconfigure itself.
 Requires the \fBadmin\fR right.
+.IP
+Not all configuration options can be modified during the lifetime of the
+server; of those that can't, some will just be ignored if they change while
+others will cause the new configuration to be rejected.
+See \fBdisorder_config\fR(5) for details.
 .TP
 .B register \fIUSERNAME PASSWORD EMAIL
 Register a new user.
index a575c58..f194a0e 100644 (file)
@@ -112,6 +112,11 @@ automatically, and thus has relatively modest storage requirements.
 .TP 8
 .B SIGHUP
 Re-read the configuration file.
+.IP
+Not all configuration options can be modified during the lifetime of the
+server; of those that can't, some will just be ignored if they change while
+others will cause the new configuration to be rejected.
+See \fBdisorder_config\fR(5) for details.
 .TP
 .B SIGTERM
 Terminate the daemon gracefully.
index 109a7e2..ffe393c 100644 (file)
@@ -27,6 +27,6 @@ disobedience32x32.xpm cross.svg go.svg notes.svg noteson.svg pause.svg        \
 query.svg queryon.svg speaker.svg speakeron.svg cross32.png            \
 pause32.png play32.png playdisabled32.png playenabled32.png            \
 randomdisabled32.png randomenabled32.png rtpdisabled32.png             \
-rtpenabled32.png
+rtpenabled32.png duck55.png
 
 CLEANFILES=$(SEDFILES)
diff --git a/images/duck55.png b/images/duck55.png
new file mode 100644 (file)
index 0000000..9fc0425
Binary files /dev/null and b/images/duck55.png differ
index ca0e82d..d0890e1 100644 (file)
@@ -1,6 +1,6 @@
 #
 # This file is part of DisOrder.
-# Copyright (C) 2004-2008 Richard Kettlewell
+# Copyright (C) 2004-2009 Richard Kettlewell
 #
 # 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
@@ -27,7 +27,6 @@ endif
 
 libdisorder_a_SOURCES=charset.c charset.h              \
        addr.c addr.h                                   \
-       alsabg.c alsabg.h                               \
        arcfour.c arcfour.h                             \
        authhash.c authhash.h                           \
        basen.c basen.h                                 \
@@ -39,6 +38,7 @@ libdisorder_a_SOURCES=charset.c charset.h             \
        client-common.c client-common.h                 \
        configuration.c configuration.h                 \
        cookies.c cookies.h                             \
+       coreaudio.c coreaudio.h                         \
        dateparse.c dateparse.h xgetdate.c              \
        defs.c defs.h                                   \
        eclient.c eclient.h                             \
@@ -54,12 +54,11 @@ libdisorder_a_SOURCES=charset.c charset.h           \
        ifreq.c ifreq.h                                 \
        inputline.c inputline.h                         \
        kvp.c kvp.h                                     \
-       log.c log.h log-impl.h                          \
+       log.c log.h                                     \
        logfd.c logfd.h                                 \
        macros.c macros-builtin.c macros.h              \
-       mem.c mem.h mem-impl.h                          \
+       mem.c mem.h                                     \
        mime.h mime.c                                   \
-       mixer.c mixer.h mixer-oss.c mixer-alsa.c        \
        printf.c printf.h                               \
        asprintf.c fprintf.c snprintf.c                 \
        queue.c queue.h                                 \
@@ -82,6 +81,10 @@ libdisorder_a_SOURCES=charset.c charset.h            \
        trackdb-playlists.c                             \
        trackname.c trackorder.c trackname.h            \
        tracksort.c                                     \
+       uaudio.c uaudio-thread.c uaudio.h uaudio-apis.c \
+       uaudio-oss.c uaudio-alsa.c                      \
+       uaudio-coreaudio.c                              \
+       uaudio-rtp.c uaudio-command.c uaudio-schedule.c \
        url.h url.c                                     \
        user.h user.c                                   \
        unicode.h unicode.c                             \
index fecc28c..ecbab22 100644 (file)
@@ -30,6 +30,9 @@
 #include "printf.h"
 #include "addr.h"
 #include "mem.h"
+#include "syscalls.h"
+#include "configuration.h"
+#include "vector.h"
 
 /** @brief Convert a pair of strings to an address
  * @param a Pointer to string list
@@ -92,29 +95,38 @@ struct addrinfo *get_address(const struct stringlist *a,
  */
 int addrinfocmp(const struct addrinfo *a,
                const struct addrinfo *b) {
-  const struct sockaddr_in *ina, *inb;
-  const struct sockaddr_in6 *in6a, *in6b;
-  
   if(a->ai_family != b->ai_family) return a->ai_family - b->ai_family;
   if(a->ai_socktype != b->ai_socktype) return a->ai_socktype - b->ai_socktype;
   if(a->ai_protocol != b->ai_protocol) return a->ai_protocol - b->ai_protocol;
-  switch(a->ai_family) {
+  return sockaddrcmp(a->ai_addr, b->ai_addr);
+}
+
+/** @brief Comparison function for socket addresses
+ *
+ * Suitable for qsort().
+ */
+int sockaddrcmp(const struct sockaddr *a,
+               const struct sockaddr *b) {
+  const struct sockaddr_in *ina, *inb;
+  const struct sockaddr_in6 *in6a, *in6b;
+  
+  if(a->sa_family != b->sa_family) return a->sa_family - b->sa_family;
+  switch(a->sa_family) {
   case PF_INET:
-    ina = (const struct sockaddr_in *)a->ai_addr;
-    inb = (const struct sockaddr_in *)b->ai_addr;
+    ina = (const struct sockaddr_in *)a;
+    inb = (const struct sockaddr_in *)b;
     if(ina->sin_port != inb->sin_port) return ina->sin_port - inb->sin_port;
     return ina->sin_addr.s_addr - inb->sin_addr.s_addr;
     break;
   case PF_INET6:
-    in6a = (const struct sockaddr_in6 *)a->ai_addr;
-    in6b = (const struct sockaddr_in6 *)b->ai_addr;
+    in6a = (const struct sockaddr_in6 *)a;
+    in6b = (const struct sockaddr_in6 *)b;
     if(in6a->sin6_port != in6b->sin6_port)
       return in6a->sin6_port - in6b->sin6_port;
     return memcmp(&in6a->sin6_addr, &in6b->sin6_addr,
                  sizeof (struct in6_addr));
   default:
-    error(0, "unsupported protocol family %d", a->ai_protocol);
-    return memcmp(a->ai_addr, b->ai_addr, a->ai_addrlen); /* kludge */
+    fatal(0, "unsupported protocol family %d", a->sa_family);
   }
 }
 
@@ -194,6 +206,142 @@ char *format_sockaddr(const struct sockaddr *sa) {
   }
 }
 
+/** @brief Parse the text form of a network address
+ * @param na Where to store result
+ * @param nvec Number of strings
+ * @param vec List of strings
+ * @return 0 on success, -1 on syntax error
+ */
+int netaddress_parse(struct netaddress *na,
+                    int nvec,
+                    char **vec) {
+  const char *port;
+
+  na->af = AF_UNSPEC;
+  if(nvec > 0 && vec[0][0] == '-') {
+    if(!strcmp(vec[0], "-4"))
+      na->af = AF_INET;
+    else if(!strcmp(vec[0], "-6")) 
+      na->af = AF_INET6;
+    else if(!strcmp(vec[0], "-unix"))
+      na->af = AF_UNIX;
+    else if(!strcmp(vec[0], "-"))
+      na->af = AF_UNSPEC;
+    else
+      return -1;
+    --nvec;
+    ++vec;
+  }
+  if(nvec == 0)
+    return -1;
+  /* Possibilities are:
+   *
+   *       /path/to/unix/socket      an AF_UNIX socket
+   *       * PORT                    any address, specific port
+   *       PORT                      any address, specific port
+   *       ADDRESS PORT              specific address, specific port
+   */
+  if(vec[0][0] == '/' && na->af == AF_UNSPEC)
+    na->af = AF_UNIX;
+  if(na->af == AF_UNIX) {
+    if(nvec != 1)
+      return -1;
+    na->address = xstrdup(vec[0]);
+    na->port = -1;                     /* makes no sense */
+  } else {
+    switch(nvec) {
+    case 1:
+      na->address = NULL;
+      port = vec[0];
+      break;
+    case 2:
+      if(!strcmp(vec[0], "*"))
+       na->address = NULL;
+      else
+       na->address = xstrdup(vec[0]);
+      port = vec[1];
+      break;
+    default:
+      return -1;
+    }
+    if(port[strspn(port, "0123456789")])
+      return -1;
+    long p;
+    int e = xstrtol(&p, port, NULL, 10);
+
+    if(e)
+      return -1;
+    if(p > 65535)
+      return -1;
+    na->port = (int)p;
+  }
+  return 0;
+}
+
+/** @brief Format a @ref netaddress structure
+ * @param na Network address to format
+ * @param nvecp Where to put string count, or NULL
+ * @param vecp Where to put strings
+ *
+ * The formatted form is suitable for passing to netaddress_parse().
+ */
+void netaddress_format(const struct netaddress *na,
+                      int *nvecp,
+                      char ***vecp) {
+  struct vector v[1];
+
+  vector_init(v);
+  switch(na->af) {
+  case AF_UNSPEC: vector_append(v, xstrdup("-")); break;
+  case AF_INET: vector_append(v, xstrdup("-4")); break;
+  case AF_INET6: vector_append(v, xstrdup("-6")); break;
+  case AF_UNIX: vector_append(v, xstrdup("-unix")); break;
+  }
+  if(na->address)
+    vector_append(v, xstrdup(na->address));
+  else
+    vector_append(v, xstrdup("*"));
+  if(na->port != -1) {
+    char buffer[64];
+
+    snprintf(buffer, sizeof buffer, "%d", na->port);
+    vector_append(v, xstrdup(buffer));
+  }
+  vector_terminate(v);
+  if(nvecp)
+    *nvecp = v->nvec;
+  if(vecp)
+    *vecp = v->vec;
+}
+
+/** @brief Resolve a network address
+ * @param na Address structure
+ * @param passive True if passive (bindable) address is desired
+ * @param protocol Protocol number desired (e.g. @c IPPROTO_TCP)
+ * @return List of suitable addresses or NULL
+ */
+struct addrinfo *netaddress_resolve(const struct netaddress *na,
+                                   int passive,
+                                   int protocol) {
+  struct addrinfo *res, hints[1];
+  char service[64];
+  int rc;
+
+  memset(hints, 0, sizeof hints);
+  hints->ai_family = na->af;
+  hints->ai_protocol = protocol;
+  hints->ai_flags = passive ? AI_PASSIVE : 0;
+  snprintf(service, sizeof service, "%d", na->port);
+  rc = getaddrinfo(na->address, service, hints, &res);
+  if(rc) {
+    error(0, "getaddrinfo %s %d: %s",
+         na->address ? na->address : "*",
+         na->port, gai_strerror(rc));
+    return NULL;
+  }
+  return res;
+}
+
 /*
 Local Variables:
 c-basic-offset:2
index 973733f..90c165e 100644 (file)
 
 #include <netdb.h>
 
-#include "configuration.h"
+struct stringlist;
+
+/** @brief A network address */
+struct netaddress {
+  /** @brief Address family
+   *
+   * Typically @c AF_UNIX, @c AF_INET, @c AF_INET6 or @c AF_UNSPEC.
+   * Set to -1 to mean 'no address'.
+   */
+  int af;
+
+  /** @brief Address or NULL for 'any' */
+  char *address;
+
+  /** @brief Port number */
+  int port;
+};
 
 struct addrinfo *get_address(const struct stringlist *a,
                             const struct addrinfo *pref,
@@ -31,10 +47,22 @@ struct addrinfo *get_address(const struct stringlist *a,
 
 int addrinfocmp(const struct addrinfo *a,
                const struct addrinfo *b);
+int sockaddrcmp(const struct sockaddr *a,
+               const struct sockaddr *b);
 
 int multicast(const struct sockaddr *sa);
 char *format_sockaddr(const struct sockaddr *sa);
 
+int netaddress_parse(struct netaddress *na,
+                    int nvec,
+                    char **vec);
+void netaddress_format(const struct netaddress *na,
+                      int *nvecp,
+                      char ***vecp);
+struct addrinfo *netaddress_resolve(const struct netaddress *na,
+                                   int passive,
+                                   int protocol);
+
 #endif /* ADDR_H */
 
 /*
diff --git a/lib/alsabg.c b/lib/alsabg.c
deleted file mode 100644 (file)
index 56e5c6a..0000000
+++ /dev/null
@@ -1,312 +0,0 @@
-/*
- * This file is part of DisOrder.
- * Copyright (C) 2008 Richard Kettlewell
- *
- * 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 3 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, see <http://www.gnu.org/licenses/>.
- */
-/** @file alsabg.c
- * @brief Background-thread interface to ALSA
- *
- * This wraps ALSA with an interface which calls back to the client from a
- * thread.  It's not intended for completely general use, just what DisOrder
- * needs.
- *
- * Only builds on Linux systems.
- */
-
-#include "common.h"
-
-#if HAVE_ALSA_ASOUNDLIB_H
-#include <alsa/asoundlib.h>
-#include <pthread.h>
-
-#include "alsabg.h"
-#include "log.h"
-
-/** @brief Output handle */
-static snd_pcm_t *pcm;
-
-/** @brief Called to get audio data */
-static alsa_bg_supply *supplyfn;
-
-static pthread_t alsa_bg_collect_tid, alsa_bg_play_tid;
-
-/** @brief Set to shut down the background threads */
-static int alsa_bg_shutdown = 0;
-
-/** @brief Number of channels (samples per frame) */
-#define CHANNELS 2
-
-/** @brief Number of bytes per samples */
-#define BYTES_PER_SAMPLE 2
-
-/** @brief Number of bytes per frame */
-#define BYTES_PER_FRAME (CHANNELS * BYTES_PER_SAMPLE)
-
-/** @brief Buffer size in bytes */
-#define BUFFER_BYTES 65536
-
-/** @brief Buffer size in frames */
-#define BUFFER_FRAMES (BUFFER_BYTES / BYTES_PER_FRAME)
-
-/** @brief Buffer size in samples */
-#define BUFFER_SAMPLES (BUFFER_BYTES / BYTES_PER_SAMPLE)
-
-/** @brief Audio buffer */
-static uint8_t alsa_bg_buffer[BUFFER_BYTES];
-
-/** @brief First playable byte in audio buffer */
-static unsigned alsa_bg_start;
-
-/** @brief Number of playable bytes in audio buffer */
-static unsigned alsa_bg_count;
-
-/** @brief Current enable status */
-static int alsa_bg_enabled;
-
-/** @brief Lock protecting audio buffer pointers */
-static pthread_mutex_t alsa_bg_lock = PTHREAD_MUTEX_INITIALIZER;
-
-/** @brief Signaled when buffer contents changes */
-static pthread_cond_t alsa_bg_cond = PTHREAD_COND_INITIALIZER;
-
-/** @brief Call a pthread_ function and fatal() on exit */
-#define ep(x) do {                             \
-  int prc;                                     \
-                                               \
-  if((prc = (x)))                              \
-    fatal(prc, "%s", #x);                      \
-} while(0)
-
-/** @brief Data collection thread
- *
- * This thread collects audio data to play and stores it in the ring
- * buffer.
- */
-static void *alsa_bg_collect(void attribute((unused)) *arg) {
-  unsigned avail_start, avail_count;
-  int count;
-
-  ep(pthread_mutex_lock(&alsa_bg_lock));
-  for(;;) {
-    /* If we're shutting down, quit straight away */
-    if(alsa_bg_shutdown)
-      break;
-    /* While we're disabled or the buffer is full, just wait */
-    if(!alsa_bg_enabled || alsa_bg_count == BUFFER_BYTES) {
-      ep(pthread_cond_wait(&alsa_bg_cond, &alsa_bg_lock));
-      continue;
-    }
-    /* Figure out where and how big the gap we can write into is */
-    avail_start = alsa_bg_start + alsa_bg_count;
-    if(avail_start < BUFFER_BYTES)
-      avail_count = BUFFER_BYTES - avail_start;
-    else {
-      avail_start %= BUFFER_BYTES;
-      avail_count = alsa_bg_start - avail_start;
-    }
-    assert(avail_start < BUFFER_BYTES);
-    assert(avail_count <= BUFFER_BYTES);
-    assert(avail_count + alsa_bg_count <= BUFFER_BYTES);
-    ep(pthread_mutex_unlock(&alsa_bg_lock));
-    count = supplyfn(alsa_bg_buffer + avail_start,
-                    avail_count / BYTES_PER_SAMPLE);
-    ep(pthread_mutex_lock(&alsa_bg_lock));
-    alsa_bg_count += count * BYTES_PER_SAMPLE;
-    assert(alsa_bg_start < BUFFER_BYTES);
-    assert(alsa_bg_count <= BUFFER_BYTES);
-    ep(pthread_cond_signal(&alsa_bg_cond));
-  }
-  ep(pthread_mutex_unlock(&alsa_bg_lock));
-  return 0;
-}
-
-/** @brief Playback thread
- *
- * This thread reads audio data out of the ring buffer and plays it back
- */
-static void *alsa_bg_play(void attribute((unused)) *arg) {
-  int prepared = 1, err;
-  int start, nbytes, nframes, rframes;
-  
-  ep(pthread_mutex_lock(&alsa_bg_lock));
-  for(;;) {
-    /* If we're shutting down, quit straight away */
-    if(alsa_bg_shutdown)
-      break;
-    /* Wait for some data to be available.  (If we are marked disabled
-     * we keep on playing what we've got.) */
-    if(alsa_bg_count == 0) {
-      if(prepared) {
-       if((err = snd_pcm_drain(pcm)))
-         fatal(0, "snd_pcm_drain: %d", err);
-       prepared = 0;
-      }
-      ep(pthread_cond_wait(&alsa_bg_cond, &alsa_bg_lock));
-      continue;
-    }
-    /* Calculate how much we can play */
-    start = alsa_bg_start;
-    if(start + alsa_bg_count <= BUFFER_BYTES)
-      nbytes = alsa_bg_count;
-    else
-      nbytes = BUFFER_BYTES - start;
-    /* Limit how much of the buffer we play.  The effect is that we return from
-     * _writei earlier, and therefore free up more buffer space to read fresh
-     * data into.  /2 works fine, /4 is just conservative.  /1 (i.e. abolishing
-     * the heuristic) produces noticably noisy output. */
-    if(nbytes > BUFFER_BYTES / 4)
-      nbytes = BUFFER_BYTES / 4;
-    assert((unsigned)nbytes <= alsa_bg_count);
-    nframes = nbytes / BYTES_PER_FRAME;
-    ep(pthread_mutex_unlock(&alsa_bg_lock));
-    /* Make sure the PCM is prepared */
-    if(!prepared) {
-      if((err = snd_pcm_prepare(pcm)))
-       fatal(0, "snd_pcm_prepare: %d", err);
-      prepared = 1;
-    }
-    /* Play what we can */
-    rframes = snd_pcm_writei(pcm, alsa_bg_buffer + start, nframes);
-    ep(pthread_mutex_lock(&alsa_bg_lock));
-    if(rframes < 0) {
-      switch(rframes) {
-      case -EPIPE:
-        error(0, "underrun detected");
-        if((err = snd_pcm_prepare(pcm)))
-          fatal(0, "snd_pcm_prepare: %d", err);
-        break;
-      default:
-        fatal(0, "snd_pcm_writei: %d", rframes);
-      }
-    } else {
-      const int rbytes = rframes * BYTES_PER_FRAME;
-      /*fprintf(stderr, "%5d -> %5d\n", nbytes, rbytes);*/
-      /* Update the buffer pointers */
-      alsa_bg_count -= rbytes;
-      alsa_bg_start += rbytes;
-      if(alsa_bg_start >= BUFFER_BYTES)
-       alsa_bg_start -= BUFFER_BYTES;
-      assert(alsa_bg_start < BUFFER_BYTES);
-      assert(alsa_bg_count <= BUFFER_BYTES);
-      /* Let the collector know we've opened up some space */
-      ep(pthread_cond_signal(&alsa_bg_cond));
-    }
-  }
-  ep(pthread_mutex_unlock(&alsa_bg_lock));
-  return 0;
-}
-
-/** @brief Enable ALSA play */
-void alsa_bg_enable(void) {
-  ep(pthread_mutex_lock(&alsa_bg_lock));
-  alsa_bg_enabled = 1;
-  ep(pthread_cond_broadcast(&alsa_bg_cond));
-  ep(pthread_mutex_unlock(&alsa_bg_lock));
-}
-
-/** @brief Disable ALSA play */
-void alsa_bg_disable(void) {
-  ep(pthread_mutex_lock(&alsa_bg_lock));
-  alsa_bg_enabled = 0;
-  ep(pthread_cond_broadcast(&alsa_bg_cond));
-  ep(pthread_mutex_unlock(&alsa_bg_lock));
-}
-
-/** @brief Initialize background ALSA playback
- * @param device Target device or NULL to use default
- * @param supply Function to call to get audio data to play
- *
- * Playback is not initially enabled; see alsa_bg_enable().  When playback is
- * enabled, @p supply will be called in a background thread to request audio
- * data.  It should return in a timely manner, but playback happens from a
- * further thread and delays in @p supply will not delay transfer of data to
- * the sound device (provided it doesn't actually run out).
- */
-void alsa_bg_init(const char *device,
-                 alsa_bg_supply *supply) {
-  snd_pcm_hw_params_t *hwparams;
-  /* Only support one format for now */
-  const int sample_format = SND_PCM_FORMAT_S16_BE;
-  unsigned rate = 44100;
-  int err;
-
-  if((err = snd_pcm_open(&pcm,
-                         device ? device : "default",
-                         SND_PCM_STREAM_PLAYBACK,
-                         0)))
-    fatal(0, "error from snd_pcm_open: %d", err);
-  /* Set up 'hardware' parameters */
-  snd_pcm_hw_params_alloca(&hwparams);
-  if((err = snd_pcm_hw_params_any(pcm, hwparams)) < 0)
-    fatal(0, "error from snd_pcm_hw_params_any: %d", err);
-  if((err = snd_pcm_hw_params_set_access(pcm, hwparams,
-                                         SND_PCM_ACCESS_RW_INTERLEAVED)) < 0)
-    fatal(0, "error from snd_pcm_hw_params_set_access: %d", err);
-  if((err = snd_pcm_hw_params_set_format(pcm, hwparams,
-                                         sample_format)) < 0)
-    
-    fatal(0, "error from snd_pcm_hw_params_set_format (%d): %d",
-          sample_format, err);
-  if((err = snd_pcm_hw_params_set_rate_near(pcm, hwparams, &rate, 0)) < 0)
-    fatal(0, "error from snd_pcm_hw_params_set_rate (%d): %d",
-          rate, err);
-  if((err = snd_pcm_hw_params_set_channels(pcm, hwparams,
-                                           CHANNELS)) < 0)
-    fatal(0, "error from snd_pcm_hw_params_set_channels (%d): %d",
-          CHANNELS, err);
-  if((err = snd_pcm_hw_params(pcm, hwparams)) < 0)
-    fatal(0, "error calling snd_pcm_hw_params: %d", err);
-
-  /* Record the audio supply function */
-  supplyfn = supply;
-
-  /* Create the audio output thread */
-  alsa_bg_shutdown = 0;
-  alsa_bg_enabled = 0;
-  ep(pthread_create(&alsa_bg_collect_tid, 0, alsa_bg_collect, 0));
-  ep(pthread_create(&alsa_bg_play_tid, 0, alsa_bg_play, 0));
-}
-
-/** @brief Deinitialize background ALSA playback
- *
- * The opposite of alsa_bg_init().
- */
-void alsa_bg_close(void) {
-  void *r;
-
-  /* Notify background threads that we're shutting down */
-  ep(pthread_mutex_lock(&alsa_bg_lock));
-  alsa_bg_enabled = 0;
-  alsa_bg_shutdown = 1;
-  ep(pthread_cond_signal(&alsa_bg_cond));
-  ep(pthread_mutex_unlock(&alsa_bg_lock));
-  /* Join background threads when they're done */
-  ep(pthread_join(alsa_bg_collect_tid, &r));
-  ep(pthread_join(alsa_bg_play_tid, &r));
-  /* Close audio device */
-  snd_pcm_close(pcm);
-  pcm = 0;
-}
-
-#endif
-
-/*
-Local Variables:
-c-basic-offset:2
-comment-column:40
-fill-column:79
-indent-tabs-mode:nil
-End:
-*/
diff --git a/lib/alsabg.h b/lib/alsabg.h
deleted file mode 100644 (file)
index 78c83dc..0000000
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * This file is part of DisOrder.
- * Copyright (C) 2008 Richard Kettlewell
- *
- * 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 3 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, see <http://www.gnu.org/licenses/>.
- */
-/** @file alsabg.h
- * @brief Background-thread interface to ALSA
- *
- * This wraps ALSA with an interface which calls back to the client from a
- * thread.  It's not intended for completely general use, just what DisOrder
- * needs.
- */
-
-#ifndef ALSABG_H
-#define ALSABG_H
-
-/** @brief Supply audio callback
- * @param dst Where to write audio data
- * @param nsamples Number of samples to write
- * @return Number of samples written
- *
- * This function should write up to @p *nsamples samples of data at
- * @p dst, and return the number of samples written, or -1 if some error
- * occurred.  It will be called in a background thread.
- */
-typedef int alsa_bg_supply(void *dst,
-                          unsigned nsamples_max);
-
-void alsa_bg_init(const char *dev,
-                 alsa_bg_supply *supply);
-
-void alsa_bg_enable(void);
-
-void alsa_bg_disable(void);
-
-void alsa_bg_close(void);
-
-#endif /* ALSABG_H */
-
-/*
-Local Variables:
-c-basic-offset:2
-comment-column:40
-fill-column:79
-indent-tabs-mode:nil
-End:
-*/
index 87d2795..7c1f9ec 100644 (file)
@@ -31,7 +31,7 @@
  * @param nwords Length of bignum
  * @return !v
  */
-static int zero(const unsigned long *v, int nwords) {
+static int zero(const uint32_t *v, int nwords) {
   int n;
 
   for(n = 0; n < nwords && !v[n]; ++n)
@@ -47,7 +47,7 @@ static int zero(const unsigned long *v, int nwords) {
  *
  * The quotient is stored in @p v.
  */
-static unsigned divide(unsigned long *v, int nwords, unsigned long m) {
+static unsigned divide(uint32_t *v, int nwords, unsigned long m) {
   unsigned long r = 0, a, b;
   int n;
 
@@ -66,6 +66,31 @@ static unsigned divide(unsigned long *v, int nwords, unsigned long m) {
   return r;
 }
 
+/** @brief Multiple v by m and add a
+ * @param v Pointer to bigendian bignum
+ * @param nwords Length of bignum
+ * @param m Value to multiply by
+ * @param a Value to add
+ * @return 0 on success, non-0 on overflow
+ *
+ * Does v = m * v + a.
+ */
+static int mla(uint32_t *v, int nwords, uint32_t m, uint32_t a) {
+  int n = nwords - 1;
+  uint32_t carry = a;
+
+  while(n >= 0) {
+    const uint64_t p = (uint64_t)v[n] * m + carry;
+    carry = (uint32_t)(p >> 32);
+    v[n] = (uint32_t)p;
+    --n;
+  }
+  /* If there is still a carry then we overflowed */
+  return !!carry;
+}
+
+static const char basen_chars[] = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
+
 /** @brief Convert v to a chosen base
  * @param v Pointer to bigendian bignum (modified!)
  * @param nwords Length of bignum
@@ -75,26 +100,53 @@ static unsigned divide(unsigned long *v, int nwords, unsigned long m) {
  * @return 0 on success, -1 if the buffer is too small
  *
  * Converts @p v to a string in the given base using decimal digits, lower case
- * letter sand upper case letters as digits.
+ * letters and upper case letters as digits.
+ *
+ * The inverse of nesab().
  */
-int basen(unsigned long *v,
+int basen(uint32_t *v,
          int nwords,
          char buffer[],
          size_t bufsize,
          unsigned base) {
   size_t i = bufsize;
-  static const char chars[] = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
   
   do {
     if(i <= 1)
       return -1;                       /* overflow */
-    buffer[--i] = chars[divide(v, nwords, base)];
+    buffer[--i] = basen_chars[divide(v, nwords, base)];
   } while(!zero(v, nwords));
   memmove(buffer, buffer + i, bufsize - i);
   buffer[bufsize - i] = 0;
   return 0;
 }
 
+/** @brief Convert a string back to a large integer in an arbitrary base
+ * @param v Where to store result as a bigendian bignum
+ * @param nwords Space available in @p v
+ * @param s Input string
+ * @param base Number base (2..62)
+ * @return 0 on success, non-0 on overflow or invalid input
+ *
+ * The inverse of basen().  If the number is much smaller than the buffer then
+ * the first words will be 0.
+ */
+int nesab(uint32_t *v,
+          int nwords,
+          const char *s,
+          unsigned base) {
+  /* Initialize to 0 */
+  memset(v, 0, nwords * sizeof *v);
+  while(*s) {
+    const char *dp = strchr(basen_chars, *s++);
+    if(!dp)
+      return -1;
+    if(mla(v, nwords, base, dp - basen_chars))
+      return -1;
+  }
+  return 0;
+}
+
 /*
 Local Variables:
 c-basic-offset:2
index 717f2ea..c1a60f0 100644 (file)
@@ -19,7 +19,7 @@
 #ifndef BASEN_H
 #define BASEN_H
 
-int basen(unsigned long *v,
+int basen(uint32_t *v,
          int nwords,
          char buffer[],
          size_t bufsize,
@@ -29,6 +29,11 @@ int basen(unsigned long *v,
  * Returns 0 on success or -1 on overflow.
  */
 
+int nesab(uint32_t *v,
+          int nwords,
+          const char *s,
+          unsigned base);
+
 #endif /* BASEN_H */
 
 /*
index ced82e4..aa43124 100644 (file)
@@ -45,17 +45,11 @@ socklen_t find_server(struct config *c,
   struct addrinfo *res = 0;
   char *name;
   socklen_t len;
-   
-  static const struct addrinfo pref = {
-    .ai_flags = 0,
-    .ai_family = PF_INET,
-    .ai_socktype = SOCK_STREAM,
-    .ai_protocol = IPPROTO_TCP,
-  };
 
-  if(c->connect.n) {
-    res = get_address(&c->connect, &pref, &name);
-    if(!res) return -1;
+  if(c->connect.af != -1) {
+    res = netaddress_resolve(&c->connect, 0, IPPROTO_TCP);
+    if(!res) 
+      return -1;
     sa = res->ai_addr;
     len = res->ai_addrlen;
   } else {
@@ -73,7 +67,7 @@ socklen_t find_server(struct config *c,
   *sap = xmalloc_noptr(len);
   memcpy(*sap, sa, len);
   if(namep)
-    *namep = name;
+    *namep = format_sockaddr(sa);
   if(res)
     freeaddrinfo(res);
   return len;
index f8a2c9e..a0502eb 100644 (file)
@@ -451,7 +451,7 @@ int disorder_connect(disorder_client *c) {
   if(!password) {
     /* Oh well */
     c->last = "no password";
-    error(0, "no password configured");
+    error(0, "no password configured for user '%s'", username);
     return -1;
   }
   return disorder_connect_generic(config,
index cd83224..ff59968 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * This file is part of DisOrder.
- * Copyright (C) 2004-2008 Richard Kettlewell
+ * Copyright (C) 2004-2009 Richard Kettlewell
  * Portions copyright (C) 2007 Mark Wooding
  *
  * This program is free software: you can redistribute it and/or modify
 #include "inputline.h"
 #include "charset.h"
 #include "defs.h"
-#include "mixer.h"
 #include "printf.h"
 #include "regsub.h"
 #include "signame.h"
 #include "authhash.h"
 #include "vector.h"
+#include "uaudio.h"
 
 /** @brief Path to config file 
  *
@@ -62,6 +62,12 @@ char *configfile;
  */
 int config_per_user = 1;
 
+/** @brief Table of audio APIs
+ *
+ * Only set in server processes.
+ */
+const struct uaudio *const *config_uaudio_apis;
+
 /** @brief Config file parser state */
 struct config_state {
   /** @brief Filename */
@@ -103,6 +109,11 @@ struct conftype {
 /** @brief Return the value of an item */
 #define VALUE(C, TYPE) (*ADDRESS(C, TYPE))
 
+static int stringlist_compare(const struct stringlist *a,
+                              const struct stringlist *b);
+static int namepartlist_compare(const struct namepartlist *a,
+                                const struct namepartlist *b);
+
 static int set_signal(const struct config_state *cs,
                      const struct conf *whoami,
                      int nvec, char **vec) {
@@ -414,6 +425,7 @@ static int set_namepart(const struct config_state *cs,
   npl->s = xrealloc(npl->s, (npl->n + 1) * sizeof (struct namepart));
   npl->s[npl->n].part = xstrdup(vec[0]);
   npl->s[npl->n].re = re;
+  npl->s[npl->n].res = xstrdup(vec[1]);
   npl->s[npl->n].replace = xstrdup(vec[2]);
   npl->s[npl->n].context = xstrdup(vec[3]);
   npl->s[npl->n].reflags = reflags;
@@ -466,52 +478,6 @@ static int set_transform(const struct config_state *cs,
   return 0;
 }
 
-static int set_backend(const struct config_state *cs,
-                      const struct conf *whoami,
-                      int nvec, char **vec) {
-  int *const valuep = ADDRESS(cs->config, int);
-  
-  if(nvec != 1) {
-    error(0, "%s:%d: '%s' requires one argument",
-         cs->path, cs->line, whoami->name);
-    return -1;
-  }
-  if(!strcmp(vec[0], "alsa")) {
-#if HAVE_ALSA_ASOUNDLIB_H
-    *valuep = BACKEND_ALSA;
-#else
-    error(0, "%s:%d: ALSA is not available on this platform",
-         cs->path, cs->line);
-    return -1;
-#endif
-  } else if(!strcmp(vec[0], "command"))
-    *valuep = BACKEND_COMMAND;
-  else if(!strcmp(vec[0], "network"))
-    *valuep = BACKEND_NETWORK;
-  else if(!strcmp(vec[0], "coreaudio")) {
-#if HAVE_COREAUDIO_AUDIOHARDWARE_H
-    *valuep = BACKEND_COREAUDIO;
-#else
-    error(0, "%s:%d: Core Audio is not available on this platform",
-         cs->path, cs->line);
-    return -1;
-#endif
-  } else if(!strcmp(vec[0], "oss")) {
-#if HAVE_SYS_SOUNDCARD_H
-    *valuep = BACKEND_OSS;
-#else
-    error(0, "%s:%d: OSS is not available on this platform",
-         cs->path, cs->line);
-    return -1;
-#endif
-  } else {
-    error(0, "%s:%d: invalid '%s' value '%s'",
-         cs->path, cs->line, whoami->name, vec[0]);
-    return -1;
-  }
-  return 0;
-}
-
 static int set_rights(const struct config_state *cs,
                      const struct conf *whoami,
                      int nvec, char **vec) {
@@ -529,6 +495,18 @@ static int set_rights(const struct config_state *cs,
   return 0;
 }
 
+static int set_netaddress(const struct config_state *cs,
+                         const struct conf *whoami,
+                         int nvec, char **vec) {
+  struct netaddress *na = ADDRESS(cs->config, struct netaddress);
+
+  if(netaddress_parse(na, nvec, vec)) {
+    error(0, "%s:%d: invalid network address", cs->path, cs->line);
+    return -1;
+  }
+  return 0;
+}
+
 /* free functions */
 
 static void free_none(struct config attribute((unused)) *c,
@@ -538,6 +516,7 @@ static void free_none(struct config attribute((unused)) *c,
 static void free_string(struct config *c,
                        const struct conf *whoami) {
   xfree(VALUE(c, char *));
+  VALUE(c, char *) = 0;
 }
 
 static void free_stringlist(struct config *c,
@@ -590,6 +569,7 @@ static void free_namepartlist(struct config *c,
     np = &npl->s[n];
     xfree(np->part);
     pcre_free(np->re);                 /* ...whatever pcre_free is set to. */
+    xfree(np->res);
     xfree(np->replace);
     xfree(np->context);
   }
@@ -612,6 +592,13 @@ static void free_transformlist(struct config *c,
   xfree(tl->t);
 }
 
+static void free_netaddress(struct config *c,
+                           const struct conf *whoami) {
+  struct netaddress *na = ADDRESS(c, struct netaddress);
+
+  xfree(na->address);
+}
+
 /* configuration types */
 
 static const struct conftype
@@ -627,8 +614,8 @@ static const struct conftype
   type_restrict = { set_restrict, free_none },
   type_namepart = { set_namepart, free_namepartlist },
   type_transform = { set_transform, free_transformlist },
-  type_rights = { set_rights, free_none },
-  type_backend = { set_backend, free_none };
+  type_netaddress = { set_netaddress, free_netaddress },
+  type_rights = { set_rights, free_none };
 
 /* specific validation routine */
 
@@ -854,54 +841,63 @@ static int validate_alias(const struct config_state *cs,
   return 0;
 }
 
-static int validate_addrport(const struct config_state attribute((unused)) *cs,
-                            int nvec,
-                            char attribute((unused)) **vec) {
-  switch(nvec) {
-  case 0:
-    error(0, "%s:%d: missing address",
-         cs->path, cs->line);
-    return -1;
-  case 1:
-    error(0, "%s:%d: missing port name/number",
-         cs->path, cs->line);
+static int validate_algo(const struct config_state attribute((unused)) *cs,
+                        int nvec,
+                        char **vec) {
+  if(nvec != 1) {
+    error(0, "%s:%d: invalid algorithm specification", cs->path, cs->line);
     return -1;
-  case 2:
-    return 0;
-  default:
-    error(0, "%s:%d: expected ADDRESS PORT",
-         cs->path, cs->line);
+  }
+  if(!valid_authhash(vec[0])) {
+    error(0, "%s:%d: unsuported algorithm '%s'", cs->path, cs->line, vec[0]);
     return -1;
   }
+  return 0;
 }
 
-static int validate_port(const struct config_state attribute((unused)) *cs,
-                        int nvec,
-                        char attribute((unused)) **vec) {
-  switch(nvec) {
-  case 0:
-    error(0, "%s:%d: missing address",
-         cs->path, cs->line);
+static int validate_backend(const struct config_state attribute((unused)) *cs,
+                            int nvec,
+                            char **vec) {
+  int n;
+  if(nvec != 1) {
+    error(0, "%s:%d: invalid sound API specification", cs->path, cs->line);
     return -1;
-  case 1:
-  case 2:
+  }
+  if(!strcmp(vec[0], "network")) {
+    error(0, "'api network' is deprecated; use 'api rtp'");
     return 0;
-  default:
-    error(0, "%s:%d: expected [ADDRESS] PORT",
-         cs->path, cs->line);
+  }
+  if(config_uaudio_apis) {
+    for(n = 0; config_uaudio_apis[n]; ++n)
+      if(!strcmp(vec[0], config_uaudio_apis[n]->name))
+        return 0;
+    error(0, "%s:%d: unrecognized sound API '%s'", cs->path, cs->line, vec[0]);
     return -1;
   }
+  /* In non-server processes we have no idea what's valid */
+  return 0;
 }
 
-static int validate_algo(const struct config_state attribute((unused)) *cs,
-                        int nvec,
-                        char **vec) {
-  if(nvec != 1) {
-    error(0, "%s:%d: invalid algorithm specification", cs->path, cs->line);
+static int validate_pausemode(const struct config_state attribute((unused)) *cs,
+                              int nvec,
+                              char **vec) {
+  if(nvec == 1 && (!strcmp(vec[0], "silence") || !strcmp(vec[0], "suspend")))
+    return 0;
+  error(0, "%s:%d: invalid pause mode", cs->path, cs->line);
+  return -1;
+}
+
+static int validate_destaddr(const struct config_state attribute((unused)) *cs,
+                            int nvec,
+                            char **vec) {
+  struct netaddress na[1];
+
+  if(netaddress_parse(na, nvec, vec)) {
+    error(0, "%s:%d: invalid network address", cs->path, cs->line);
     return -1;
   }
-  if(!valid_authhash(vec[0])) {
-    error(0, "%s:%d: unsuported algorithm '%s'", cs->path, cs->line, vec[0]);
+  if(!na->address) {
+    error(0, "%s:%d: destination address required", cs->path, cs->line);
     return -1;
   }
   return 0;
@@ -916,15 +912,15 @@ static int validate_algo(const struct config_state attribute((unused)) *cs,
 static const struct conf conf[] = {
   { C(alias),            &type_string,           validate_alias },
   { C(allow),            &type_stringlist_accum, validate_allow },
-  { C(api),              &type_backend,          validate_any },
+  { C(api),              &type_string,           validate_backend },
   { C(authorization_algorithm), &type_string,    validate_algo },
-  { C(broadcast),        &type_stringlist,       validate_addrport },
-  { C(broadcast_from),   &type_stringlist,       validate_addrport },
+  { C(broadcast),        &type_netaddress,       validate_destaddr },
+  { C(broadcast_from),   &type_netaddress,       validate_any },
   { C(channel),          &type_string,           validate_any },
   { C(checkpoint_kbyte), &type_integer,          validate_non_negative },
   { C(checkpoint_min),   &type_integer,          validate_non_negative },
   { C(collection),       &type_collections,      validate_any },
-  { C(connect),          &type_stringlist,       validate_addrport },
+  { C(connect),          &type_netaddress,       validate_destaddr },
   { C(cookie_login_lifetime),  &type_integer,    validate_positive },
   { C(cookie_key_lifetime),  &type_integer,      validate_positive },
   { C(dbversion),        &type_integer,          validate_positive },
@@ -933,7 +929,7 @@ static const struct conf conf[] = {
   { C(gap),              &type_integer,          validate_non_negative },
   { C(history),          &type_integer,          validate_positive },
   { C(home),             &type_string,           validate_isabspath },
-  { C(listen),           &type_stringlist,       validate_port },
+  { C(listen),           &type_netaddress,       validate_any },
   { C(lock),             &type_boolean,          validate_any },
   { C(mail_sender),      &type_string,           validate_any },
   { C(mixer),            &type_string,           validate_any },
@@ -949,6 +945,7 @@ static const struct conf conf[] = {
   { C(nice_speaker),     &type_integer,          validate_any },
   { C(noticed_history),  &type_integer,          validate_positive },
   { C(password),         &type_string,           validate_any },
+  { C(pause_mode),       &type_string,           validate_pausemode },
   { C(player),           &type_stringlist_accum, validate_player },
   { C(playlist_lock_timeout), &type_integer,     validate_positive },
   { C(playlist_max) ,    &type_integer,          validate_positive },
@@ -960,6 +957,7 @@ static const struct conf conf[] = {
   { C(reminder_interval), &type_integer,         validate_positive },
   { C(remote_userman),   &type_boolean,          validate_any },
   { C2(restrict, restrictions),         &type_restrict,         validate_any },
+  { C(rtp_delay_threshold), &type_integer,       validate_positive },
   { C(sample_format),    &type_sample_format,    validate_sample_format },
   { C(scratch),          &type_string_accum,     validate_isreg },
   { C(sendmail),         &type_string,           validate_isabspath },
@@ -967,7 +965,7 @@ static const struct conf conf[] = {
   { C(signal),           &type_signal,           validate_any },
   { C(smtp_server),      &type_string,           validate_any },
   { C(sox_generation),   &type_integer,          validate_non_negative },
-  { C2(speaker_backend, api),  &type_backend,          validate_any },
+  { C2(speaker_backend, api),  &type_string,     validate_backend },
   { C(speaker_command),  &type_string,           validate_any },
   { C(stopword),         &type_string_accum,     validate_any },
   { C(templates),        &type_string_accum,     validate_isdir },
@@ -1167,7 +1165,7 @@ static struct config *config_default(void) {
   logname = pw->pw_name;
   c->username = xstrdup(logname);
   c->refresh = 15;
-  c->prefsync = 3600;
+  c->prefsync = 0;
   c->signal = SIGKILL;
   c->alias = xstrdup("{/artist}{/album}{/title}{ext}");
   c->lock = 1;
@@ -1180,7 +1178,7 @@ static struct config *config_default(void) {
   c->sample_format.endian = ENDIAN_NATIVE;
   c->queue_pad = 10;
   c->replay_min = 8 * 3600;
-  c->api = -1;
+  c->api = NULL;
   c->multicast_ttl = 1;
   c->multicast_loop = 1;
   c->authorization_algorithm = xstrdup("sha1");
@@ -1213,6 +1211,10 @@ static struct config *config_default(void) {
                       default_players[n], "disorder-tracklength", (char *)0))
       exit(1);
   }
+  c->broadcast.af = -1;
+  c->broadcast_from.af = -1;
+  c->listen.af = -1;
+  c->connect.af = -1;
   return c;
 }
 
@@ -1281,34 +1283,36 @@ static void config_postdefaults(struct config *c,
     for(n = 0; n < NTRANSFORM; ++n)
       set_transform(&cs, whoami, 5, (char **)transform[n]);
   }
-  if(c->api == -1) {
+  if(!c->api) {
     if(c->speaker_command)
-      c->api = BACKEND_COMMAND;
-    else if(c->broadcast.n)
-      c->api = BACKEND_NETWORK;
+      c->api = xstrdup("command");
+    else if(c->broadcast.af != -1)
+      c->api = xstrdup("rtp");
+    else if(config_uaudio_apis)
+      c->api = xstrdup(config_uaudio_apis[0]->name);
     else
-      c->api = DEFAULT_BACKEND;
+      c->api = xstrdup("<none>");
   }
+  if(!strcmp(c->api, "network"))
+    c->api = xstrdup("rtp");
   if(server) {
-    if(c->api == BACKEND_COMMAND && !c->speaker_command)
+    if(!strcmp(c->api, "command") && !c->speaker_command)
       fatal(0, "'api command' but speaker_command is not set");
-    if(c->api == BACKEND_NETWORK && !c->broadcast.n)
-      fatal(0, "'api network' but broadcast is not set");
+    if((!strcmp(c->api, "rtp")) && c->broadcast.af == -1)
+      fatal(0, "'api rtp' but broadcast is not set");
   }
   /* Override sample format */
-  switch(c->api) {
-  case BACKEND_NETWORK:
+  if(!strcmp(c->api, "rtp")) {
     c->sample_format.rate = 44100;
     c->sample_format.channels = 2;
     c->sample_format.bits = 16;
-    c->sample_format.endian = ENDIAN_BIG;
-    break;
-  case BACKEND_COREAUDIO:
+    c->sample_format.endian = ENDIAN_NATIVE;
+  }
+  if(!strcmp(c->api, "coreaudio")) {
     c->sample_format.rate = 44100;
     c->sample_format.channels = 2;
     c->sample_format.bits = 16;
     c->sample_format.endian = ENDIAN_NATIVE;
-    break; 
   }
   if(!c->default_rights) {
     rights_type r = RIGHTS__MASK & ~(RIGHT_ADMIN|RIGHT_REGISTER
@@ -1333,8 +1337,14 @@ static void config_postdefaults(struct config *c,
 
 /** @brief (Re-)read the config file
  * @param server If set, do extra checking
+ * @param oldconfig Old configuration for compatibility check
+ * @return 0 on success, non-0 on error
+ *
+ * If @p oldconfig is set, then certain compatibility checks are done between
+ * the old and new configurations.
  */
-int config_read(int server) {
+int config_read(int server,
+                const struct config *oldconfig) {
   struct config *c;
   char *privconf;
   struct passwd *pw;
@@ -1369,6 +1379,41 @@ int config_read(int server) {
   }
   /* install default namepart and transform settings */
   config_postdefaults(c, server);
+  if(oldconfig)  {
+    int failed = 0;
+    if(strcmp(c->home, oldconfig->home)) {
+      error(0, "'home' cannot be changed without a restart");
+      failed = 1;
+    }
+    if(strcmp(c->alias, oldconfig->alias)) {
+      error(0, "'alias' cannot be changed without a restart");
+      failed = 1;
+    }
+    if(strcmp(c->user, oldconfig->user)) {
+      error(0, "'user' cannot be changed without a restart");
+      failed = 1;
+    }
+    if(c->nice_speaker != oldconfig->nice_speaker) {
+      error(0, "'nice_speaker' cannot be changed without a restart");
+      /* ...but we accept the new config anyway */
+    }
+    if(c->nice_server != oldconfig->nice_server) {
+      error(0, "'nice_server' cannot be changed without a restart");
+      /* ...but we accept the new config anyway */
+    }
+    if(namepartlist_compare(&c->namepart, &oldconfig->namepart)) {
+      error(0, "'namepart' settings cannot be changed without a restart");
+      failed = 1;
+    }
+    if(stringlist_compare(&c->stopword, &oldconfig->stopword)) {
+      error(0, "'stopword' settings cannot be changed without a restart");
+      failed = 1;
+    }
+    if(failed) {
+      error(0, "not installing incompatible new configuration");
+      return -1;
+    }
+  }
   /* everything is good so we shall use the new config */
   config_free(config);
   /* warn about obsolete directives */
@@ -1378,6 +1423,12 @@ int config_read(int server) {
     error(0, "'allow' will be removed in a future version");
   if(c->trust.n)
     error(0, "'trust' will be removed in a future version");
+  if(!c->lock)
+    error(0, "'lock' will be removed in a future version");
+  if(c->gap)
+    error(0, "'gap' will be removed in a future version");
+  if(c->prefsync)
+    error(0, "'prefsync' will be removed in a future version");
   config = c;
   return 0;
 }
@@ -1417,6 +1468,59 @@ char *config_get_file(const char *name) {
   return config_get_file2(config, name);
 }
 
+static int stringlist_compare(const struct stringlist *a,
+                              const struct stringlist *b) {
+  int n = 0, c;
+
+  while(n < a->n && n < b->n) {
+    if((c = strcmp(a->s[n], b->s[n])))
+      return c;
+    ++n;
+  }
+  if(a->n < b->n)
+    return -1;
+  else if(a->n > b->n)
+    return 1;
+  else
+    return 0;
+}
+
+static int namepart_compare(const struct namepart *a,
+                            const struct namepart *b) {
+  int c;
+
+  if((c = strcmp(a->part, b->part)))
+    return c;
+  if((c = strcmp(a->res, b->res)))
+    return c;
+  if((c = strcmp(a->replace, b->replace)))
+    return c;
+  if((c = strcmp(a->context, b->context)))
+    return c;
+  if(a->reflags > b->reflags)
+    return 1;
+  if(a->reflags < b->reflags)
+    return -1;
+  return 0;
+}
+
+static int namepartlist_compare(const struct namepartlist *a,
+                                const struct namepartlist *b) {
+  int n = 0, c;
+
+  while(n < a->n && n < b->n) {
+    if((c = namepart_compare(&a->s[n], &b->s[n])))
+      return c;
+    ++n;
+  }
+  if(a->n > b->n)
+    return 1;
+  else if(a->n < b->n)
+    return -1;
+  else
+    return 0;
+}
+
 /*
 Local Variables:
 c-basic-offset:2
index 54fb4f8..9170a2f 100644 (file)
@@ -1,7 +1,6 @@
-
 /*
  * This file is part of DisOrder.
- * Copyright (C) 2004-2008 Richard Kettlewell
+ * Copyright (C) 2004-2009 Richard Kettlewell
  *
  * 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
@@ -27,6 +26,9 @@
 
 #include "speaker-protocol.h"
 #include "rights.h"
+#include "addr.h"
+
+struct uaudio;
 
 /* Configuration is kept in a @struct config@; the live configuration
  * is always pointed to by @config@.  Values in @config@ are UTF-8 encoded.
@@ -68,7 +70,8 @@ struct collectionlist {
 
 struct namepart {
   char *part;                          /* part */
-  pcre *re;                            /* regexp */
+  pcre *re;                            /* compiled regexp */
+  char *res;                            /* regexp as a string */
   char *replace;                       /* replacement string */
   char *context;                       /* context glob */
   unsigned reflags;                    /* regexp flags */
@@ -153,7 +156,7 @@ struct config {
   long prefsync;                       /* preflog sync interval */
 
   /** @brief Secondary listen address */
-  struct stringlist listen;
+  struct netaddress listen;
 
   /** @brief Alias format string */
   const char *alias;
@@ -170,18 +173,17 @@ struct config {
   /** @brief Command execute by speaker to play audio */
   const char *speaker_command;
 
+  /** @brief Pause mode for command backend */
+  const char *pause_mode;
+  
   /** @brief Target sample format */
   struct stream_header sample_format;
 
   /** @brief Sox syntax generation */
   long sox_generation;
 
-  /** @brief API used to play sound
-   *
-   * Choices are @ref BACKEND_ALSA, @ref BACKEND_COMMAND or @ref
-   * BACKEND_NETWORK.
-   */
-  int api;
+  /** @brief API used to play sound */
+  const char *api;
 
   /** @brief Maximum size of a playlist */
   long playlist_max;
@@ -189,23 +191,6 @@ struct config {
   /** @brief Maximum lifetime of a playlist lock */
   long playlist_lock_timeout;
 
-/* These values had better be non-negative */
-#define BACKEND_ALSA 0                 /**< Use ALSA (Linux only) */
-#define BACKEND_COMMAND 1              /**< Execute a command */
-#define BACKEND_NETWORK 2              /**< Transmit RTP  */
-#define BACKEND_COREAUDIO 3            /**< Use Core Audio (Mac only) */
-#define BACKEND_OSS 4                  /**< Use OSS */
-
-#if HAVE_ALSA_ASOUNDLIB_H
-# define DEFAULT_BACKEND BACKEND_ALSA
-#elif HAVE_SYS_SOUNDCARD_H || EMPEG_HOST
-# define DEFAULT_BACKEND BACKEND_OSS
-#elif HAVE_COREAUDIO_AUDIOHARDWARE_H
-# define DEFAULT_BACKEND BACKEND_COREAUDIO
-#else
-# error Cannot choose a default backend
-#endif
-
   /** @brief Home directory for state files */
   const char *home;
 
@@ -216,7 +201,7 @@ struct config {
   const char *password;
 
   /** @brief Address to connect to */
-  struct stringlist connect;
+  struct netaddress connect;
 
   /** @brief Directories to search for web templates */
   struct stringlist templates;
@@ -256,11 +241,14 @@ struct config {
   struct transformlist transform;      /* path name transformations */
 
   /** @brief Address to send audio data to */
-  struct stringlist broadcast;
+  struct netaddress broadcast;
 
   /** @brief Source address for network audio transmission */
-  struct stringlist broadcast_from;
+  struct netaddress broadcast_from;
 
+  /** @brief RTP delay threshold */
+  long rtp_delay_threshold;
+  
   /** @brief TTL for multicast packets */
   long multicast_ttl;
 
@@ -311,7 +299,8 @@ struct config {
 extern struct config *config;
 /* the current configuration */
 
-int config_read(int server);
+int config_read(int server,
+                const struct config *oldconfig);
 /* re-read config, return 0 on success or non-0 on error.
  * Only updates @config@ if the new configuration is valid. */
 
@@ -334,6 +323,8 @@ char *config_private(void);
 extern char *configfile;
 extern int config_per_user;
 
+extern const struct uaudio *const *config_uaudio_apis;
+
 #endif /* CONFIGURATION_H */
 
 /*
diff --git a/lib/coreaudio.c b/lib/coreaudio.c
new file mode 100644 (file)
index 0000000..8540faa
--- /dev/null
@@ -0,0 +1,168 @@
+/*
+ * This file is part of DisOrder
+ * Copyright (C) 2009 Richard Kettlewell
+ *
+ * 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 3 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, see <http://www.gnu.org/licenses/>.
+ */
+/** @file lib/coreaudio.c
+ * @brief Support for Apple Core Audio
+ */
+
+#include "common.h"
+
+#if HAVE_COREAUDIO_AUDIOHARDWARE_H
+
+#include "coreaudio.h"
+#include "log.h"
+#include "printf.h"
+#include <CoreFoundation/CFString.h>
+/* evil bodge to work around broken header file */
+#undef error
+#include <CoreServices/CoreServices.h>
+#include <stdarg.h>
+
+/** @brief Report an error with an OSStatus */
+void coreaudio_fatal(OSStatus err, const char *fmt, ...) {
+  va_list ap;
+  char *msg;
+
+  va_start(ap, fmt);
+  byte_vasprintf(&msg, fmt, ap);
+  va_end(ap);
+
+  disorder_fatal(0, "%s: error %u", msg, (unsigned)err);
+}
+
+/** @brief Return the default device ID */
+static AudioDeviceID coreaudio_use_default(void) {
+  OSStatus status;
+  UInt32 propertySize;
+  AudioDeviceID adid;
+
+  /* TODO should we use kAudioHardwarePropertyDefaultSystemOutputDevice
+   * instead?  It is listed in the enumeration but is not documented, so we
+   * leave it alone until better information is available. */
+  propertySize = sizeof adid;
+  status = AudioHardwareGetProperty(kAudioHardwarePropertyDefaultOutputDevice,
+                                    &propertySize, &adid);
+  if(status)
+    coreaudio_fatal(status, "AudioHardwareGetProperty kAudioHardwarePropertyDefaultOutputDevice");
+  if(adid == kAudioDeviceUnknown)
+    disorder_fatal(0, "no output device");
+  return adid;
+}
+
+/** @brief Find a device by some string
+ * @param selector Selector for property to look for
+ * @param devs List of device IDs
+ * @param ndevs Number of device IDs in @p devs
+ * @param dev Desired device name
+ * @param resultp Where to put device ID
+ * @return 1 if found, 0 if not found
+ */
+static int coreaudio_find_device(AudioObjectPropertySelector selector,
+                                 //const char *description,
+                                 const AudioDeviceID *devs,
+                                 unsigned ndevs,
+                                 CFStringRef dev,
+                                 AudioDeviceID *resultp) {
+  OSStatus status;
+  UInt32 propertySize;
+
+  for(unsigned n = 0; n < ndevs; ++n) {
+    CFStringRef name;
+    propertySize = sizeof name;
+    status = AudioDeviceGetProperty(devs[n], 0, FALSE,
+                                    selector,
+                                    &propertySize, &name);
+    if(status)
+      coreaudio_fatal(status, "AudioDeviceGetProperty");
+#if 0
+    UInt8 output[1024];
+    CFIndex used;
+    CFRange r = { 0, CFStringGetLength(name) };
+    CFStringGetBytes(name, r, kCFStringEncodingUTF8,
+                     '?', FALSE, output, sizeof output,
+                     &used);
+    output[used] = 0;
+    info("device %u %s: %s", n, description, (char *)output);
+#endif
+    if(CFStringCompare(dev, name,
+                       kCFCompareCaseInsensitive|kCFCompareNonliteral)
+       == kCFCompareEqualTo) {
+      *resultp = devs[n];
+      CFRelease(name);
+      return 1;
+    }
+    CFRelease(name);
+  }
+  return 0;                             /* didn't find it */
+}
+
+/** @brief Identify audio device
+ * @param name Device name
+ * @return Device ID
+ */
+AudioDeviceID coreaudio_getdevice(const char *name) {
+  OSStatus status;
+  UInt32 propertySize;
+  int found;
+  AudioDeviceID adid;
+
+  if(!name
+     || !*name
+     || !strcmp(name, "default"))
+    return coreaudio_use_default();
+  /* Convert the configured device name to a CFString */
+  CFStringRef dev;
+  dev = CFStringCreateWithCString(NULL/*default allocator*/,
+                                  name,
+                                  kCFStringEncodingUTF8);
+  if(!dev)
+    disorder_fatal(0, "CFStringCreateWithBytes failed");
+  /* Get a list of available devices */
+  AudioDeviceID devs[1024];
+  unsigned ndevs;
+
+  propertySize = sizeof devs;
+  status = AudioHardwareGetProperty(kAudioHardwarePropertyDevices,
+                                    &propertySize, devs);
+  if(status)
+    coreaudio_fatal(status, "AudioHardwareGetProperty kAudioHardwarePropertyDevices");
+  ndevs = propertySize / sizeof *devs;
+  if(!ndevs)
+    disorder_fatal(0, "no sound devices found");
+  /* Try looking up by UID first */
+  found = coreaudio_find_device(-1*kAudioDevicePropertyDeviceUID, //"UID",
+                                devs, ndevs, dev, &adid);
+  /* Failing that try looking up by name */
+  if(!found)
+    found = coreaudio_find_device(kAudioObjectPropertyName, //"name",
+                                  devs, ndevs, dev, &adid);
+  CFRelease(dev);
+  if(!found)
+    disorder_fatal(0, "cannot find device '%s'", name);
+  return adid;
+}
+
+#endif
+
+/*
+Local Variables:
+c-basic-offset:2
+comment-column:40
+fill-column:79
+indent-tabs-mode:nil
+End:
+*/
similarity index 64%
rename from server/api-client.h
rename to lib/coreaudio.h
index 99a9410..706f609 100644 (file)
@@ -1,6 +1,6 @@
 /*
- * This file is part of DisOrder.
- * Copyright (C) 2004, 2007, 2008 Richard Kettlewell
+ * This file is part of DisOrder
+ * Copyright (C) 2009 Richard Kettlewell
  *
  * 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
  * You should have received a copy of the GNU General Public License
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
-#ifndef API_CLIENT_H
-#define API_CLIENT_H
+/** @file lib/coreaudio.h
+ * @brief Support for Apple Core Audio
+ */
+
+#ifndef COREAUDIO_H
+#define COREAUDIO_H
+
+#include <CoreAudio/AudioHardware.h>
 
-disorder_client *disorder_get_client(void);
+void coreaudio_fatal(OSStatus err, const char *fmt, ...);
+AudioDeviceID coreaudio_getdevice(const char *name);
 
-#endif /* API_CLIENT_H */
+#endif /* COREAUDIO_H */
 
 /*
 Local Variables:
 c-basic-offset:2
 comment-column:40
+fill-column:79
+indent-tabs-mode:nil
 End:
 */
diff --git a/lib/log-impl.h b/lib/log-impl.h
deleted file mode 100644 (file)
index de47cf2..0000000
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * This file is part of DisOrder.
- * Copyright (C) 2004, 2005, 2007, 2008 Richard Kettlewell
- *
- * 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 3 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, see <http://www.gnu.org/licenses/>.
- */
-/** @file lib/log-impl.h @brief Errors and logging */
-
-/** @brief Log an error and quit
- *
- * If @c ${DISORDER_FATAL_ABORT} is defined (as anything) then the process
- * is aborted, so you can get a backtrace.
- */
-void disorder_fatal(int errno_value, const char *msg, ...) {
-  va_list ap;
-
-  va_start(ap, msg);
-  elog(LOG_CRIT, errno_value, msg, ap);
-  va_end(ap);
-  if(getenv("DISORDER_FATAL_ABORT")) abort();
-  exitfn(EXIT_FAILURE);
-}
-
-/** @brief Log an error */
-void disorder_error(int errno_value, const char *msg, ...) {
-  va_list ap;
-
-  va_start(ap, msg);
-  elog(LOG_ERR, errno_value, msg, ap);
-  va_end(ap);
-}
-
-/** @brief Log an informational message */
-void disorder_info(const char *msg, ...) {
-  va_list ap;
-
-  va_start(ap, msg);
-  elog(LOG_INFO, 0, msg, ap);
-  va_end(ap);
-}
-
-/*
-Local Variables:
-c-basic-offset:2
-comment-column:40
-End:
-*/
index f885e88..95a89a1 100644 (file)
--- a/lib/log.c
+++ b/lib/log.c
@@ -38,6 +38,7 @@
 #include <errno.h>
 #include <syslog.h>
 #include <sys/time.h>
+#include <time.h>
 
 #include "log.h"
 #include "disorder.h"
@@ -66,6 +67,9 @@ const char *progname;
 /** @brief Filename for debug messages */
 const char *debug_filename;
 
+/** @brief Set to include timestamps in log messages */
+int logdate;
+
 /** @brief Line number for debug messages */
 int debug_lineno;
 
@@ -121,6 +125,14 @@ static void logfp(int pri, const char *msg, void *user) {
   
   if(progname)
     fprintf(fp, "%s: ", progname);
+  if(logdate) {
+    char timebuf[64];
+    struct tm *tm;
+    gettimeofday(&tv, 0);
+    tm = localtime(&tv.tv_sec);
+    strftime(timebuf, sizeof timebuf, "%Y-%m-%d %H:%M:%S %Z", tm);
+    fprintf(fp, "%s: ", timebuf);
+  }
   if(pri <= LOG_ERR)
     fputs("ERROR: ", fp);
   else if(pri < LOG_DEBUG)
@@ -194,15 +206,41 @@ void elog(int pri, int errno_value, const char *fmt, va_list ap) {
   }
 }
 
-#define disorder_fatal fatal
-#define disorder_error error
-#define disorder_info info
+/** @brief Log an error and quit
+ *
+ * If @c ${DISORDER_FATAL_ABORT} is defined (as anything) then the process
+ * is aborted, so you can get a backtrace.
+ */
+void disorder_fatal(int errno_value, const char *msg, ...) {
+  va_list ap;
 
-/* shared implementation of vararg functions */
-#include "log-impl.h"
+  va_start(ap, msg);
+  elog(LOG_CRIT, errno_value, msg, ap);
+  va_end(ap);
+  if(getenv("DISORDER_FATAL_ABORT")) abort();
+  exitfn(EXIT_FAILURE);
+}
+
+/** @brief Log an error */
+void disorder_error(int errno_value, const char *msg, ...) {
+  va_list ap;
+
+  va_start(ap, msg);
+  elog(LOG_ERR, errno_value, msg, ap);
+  va_end(ap);
+}
+
+/** @brief Log an informational message */
+void disorder_info(const char *msg, ...) {
+  va_list ap;
+
+  va_start(ap, msg);
+  elog(LOG_INFO, 0, msg, ap);
+  va_end(ap);
+}
 
 /** @brief Log a debug message */
-void debug(const char *msg, ...) {
+void disorder_debug(const char *msg, ...) {
   va_list ap;
 
   va_start(ap, msg);
index e7f6e43..5d39732 100644 (file)
--- a/lib/log.h
+++ b/lib/log.h
@@ -30,17 +30,29 @@ void set_progname(char **argv);
 
 void elog(int pri, int errno_value, const char *fmt, va_list ap);
 
-void fatal(int errno_value, const char *msg, ...) attribute((noreturn))
+void disorder_fatal(int errno_value, const char *msg, ...) attribute((noreturn))
   attribute((format (printf, 2, 3)));
-void error(int errno_value, const char *msg, ...)
+void disorder_error(int errno_value, const char *msg, ...)
   attribute((format (printf, 2, 3)));
-void info(const char *msg, ...)
+void disorder_info(const char *msg, ...)
   attribute((format (printf, 1, 2)));
-void debug(const char *msg, ...)
+void disorder_debug(const char *msg, ...)
   attribute((format (printf, 1, 2)));
 /* report a message of the given class.  @errno_value@ if present an
  * non-zero is included.  @fatal@ terminates the process. */
 
+/** @brief Backward-compatibility alias for disorder_fatal() */
+#define fatal disorder_fatal
+
+/** @brief Backward-compatibility alias for disorder_error() */
+#define error disorder_error
+
+/** @brief Backward-compatibility alias for disorder_info() */
+#define info disorder_info
+
+/** @brief Backward-compatibility alias for disorder_debug() */
+#define debug disorder_debug
+
 extern int debugging;
 /* set when debugging enabled */
 
@@ -55,6 +67,7 @@ extern struct log_output log_stderr, log_syslog, *log_default;
 
 extern const char *debug_filename;
 extern int debug_lineno;
+extern int logdate;
 
 #define D(x) do {                              \
   if(debugging) {                              \
index 3d49c25..f314bd9 100644 (file)
@@ -156,7 +156,7 @@ static int exp_include(int attribute((unused)) nargs,
 
 /*$ @include{COMMAND}
  *
- * Executes COMMAND via the shell (using "sh -c") and copies its
+ * Executes COMMAND via the shell (using "sh \-c") and copies its
  * standard output to the template output.  The shell command output
  * is not expanded or modified in any other way.
  *
diff --git a/lib/mem-impl.h b/lib/mem-impl.h
deleted file mode 100644 (file)
index b3a16bb..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * This file is part of DisOrder.
- * Copyright (C) 2004, 2007, 2008 Richard Kettlewell
- *
- * 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 3 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, see <http://www.gnu.org/licenses/>.
- */
-
-int disorder_asprintf(char **rp, const char *fmt, ...) {
-  va_list ap;
-  int n;
-
-  va_start(ap, fmt);
-  n = byte_vasprintf(rp, fmt, ap);
-  va_end(ap);
-  return n;
-}
-
-/*
-Local Variables:
-c-basic-offset:2
-comment-column:40
-End:
-*/
index 5f08b90..89570ab 100644 (file)
--- a/lib/mem.c
+++ b/lib/mem.c
@@ -1,6 +1,6 @@
 /*
  * This file is part of DisOrder.
- * Copyright (C) 2004, 2005, 2006, 2007 Richard Kettlewell
+ * Copyright (C) 2004, 2005, 2006, 2007, 2009 Richard Kettlewell
  *
  * 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
@@ -136,6 +136,20 @@ void *xmalloc_noptr(size_t n) {
   return ptr;
 }
 
+/** @brief Allocate memory
+ * @param count Number of objects to allocate
+ * @param size Size of one object
+ * @return Pointer to allocated memory
+ *
+ * Terminates the process on error.  IMPORTANT: the allocated memory is NOT
+ * 0-filled (unlike @c calloc()).
+ */
+void *xcalloc_noptr(size_t count, size_t size) {
+  if(count > SIZE_MAX / size)
+    fatal(0, "excessively large calloc");
+  return xmalloc_noptr(count * size);
+}
+
 /** @brief Reallocate memory
  * @param ptr Block to reallocated
  * @param n Bytes to allocate
@@ -196,5 +210,7 @@ void xfree(void *ptr) {
 Local Variables:
 c-basic-offset:2
 comment-column:40
+fill-column:79
+indent-tabs-mode:nil
 End:
 */
index 2aa70aa..46412eb 100644 (file)
--- a/lib/mem.h
+++ b/lib/mem.h
@@ -1,6 +1,6 @@
 /*
  * This file is part of DisOrder.
- * Copyright (C) 2004-2008 Richard Kettlewell
+ * Copyright (C) 2004-2009 Richard Kettlewell
  *
  * 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
@@ -42,6 +42,7 @@ void *xcalloc(size_t count, size_t size);
 
 void *xmalloc_noptr(size_t);
 void *xrealloc_noptr(void *, size_t);
+void *xcalloc_noptr(size_t count, size_t size);
 char *xstrdup(const char *);
 char *xstrndup(const char *, size_t);
 /* As malloc/realloc/strdup, but
diff --git a/lib/mixer-alsa.c b/lib/mixer-alsa.c
deleted file mode 100644 (file)
index 1ab85ab..0000000
+++ /dev/null
@@ -1,221 +0,0 @@
-/*
- * This file is part of DisOrder
- * Copyright (C) 2007, 2008 Richard Kettlewell
- *
- * 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 3 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, see <http://www.gnu.org/licenses/>.
- */
-/** @file lib/mixer-alsa.c
- * @brief ALSA mixer support
- *
- * The documentation for ALSA's mixer support is completely hopeless,
- * which is a particular nuisnace given it's got an incredibly verbose
- * API.  Much of this code is cribbed from
- * alsa-utils-1.0.13/amixer/amixer.c.
- *
- * Mono output devices are supported, but the support is not tested
- * (as I don't one).
- */
-
-#include "common.h"
-
-#if HAVE_ALSA_ASOUNDLIB_H
-
-#include <fcntl.h>
-#include <unistd.h>
-#include <errno.h>
-#include <stddef.h>
-#include <ctype.h>
-#include <sys/ioctl.h>
-#include <alsa/asoundlib.h>
-
-#include "configuration.h"
-#include "mixer.h"
-#include "log.h"
-#include "syscalls.h"
-
-/** @brief Shared state for ALSA mixer support */
-struct alsa_mixer_state {
-  /** @brief Mixer handle */
-  snd_mixer_t *handle;
-
-  /** @brief Mixer control */
-  snd_mixer_elem_t *elem;
-
-  /** @brief Left channel */
-  snd_mixer_selem_channel_id_t left;
-
-  /** @brief Right channel */
-  snd_mixer_selem_channel_id_t right;
-
-  /** @brief Minimum level */
-  long min;
-
-  /** @brief Maximum level */
-  long max;
-};
-
-/** @brief Destroy a @ref alsa_mixer_state */
-static void alsa_close(struct alsa_mixer_state *h) {
-  /* TODO h->elem */
-  if(h->handle)
-    snd_mixer_close(h->handle);
-}
-
-/** @brief Initialize a @ref alsa_mixer_state */
-static int alsa_open(struct alsa_mixer_state *h) {
-  int err;
-  snd_mixer_selem_id_t *id;
-
-  snd_mixer_selem_id_alloca(&id);
-  memset(h, 0, sizeof h);
-  if((err = snd_mixer_open(&h->handle, 0))) {
-    error(0, "snd_mixer_open: %s", snd_strerror(err));
-    return -1;
-  }
-  if((err = snd_mixer_attach(h->handle, config->device))) {
-    error(0, "snd_mixer_attach %s: %s",
-         config->device, snd_strerror(err));
-    goto error;
-  }
-  if((err = snd_mixer_selem_register(h->handle, 0/*options*/, 0/*classp*/))) {
-    error(0, "snd_mixer_selem_register %s: %s",
-         config->device, snd_strerror(err));
-    goto error;
-  }
-  if((err = snd_mixer_load(h->handle))) {
-    error(0, "snd_mixer_load %s: %s",
-         config->device, snd_strerror(err));
-    goto error;
-  }
-  snd_mixer_selem_id_set_name(id, config->channel);
-  snd_mixer_selem_id_set_index(id, atoi(config->mixer));
-  if(!(h->elem = snd_mixer_find_selem(h->handle, id))) {
-    error(0, "device '%s' mixer control '%s,%s' does not exist",
-         config->device, config->channel, config->mixer);
-    goto error;
-  }
-  if(!snd_mixer_selem_has_playback_volume(h->elem)) {
-    error(0, "device '%s' mixer control '%s,%s' has no playback volume",
-         config->device, config->channel, config->mixer);
-    goto error;
-  }
-  if(snd_mixer_selem_is_playback_mono(h->elem)) {
-    h->left = h->right = SND_MIXER_SCHN_MONO;
-  } else {
-    h->left = SND_MIXER_SCHN_FRONT_LEFT;
-    h->right = SND_MIXER_SCHN_FRONT_RIGHT;
-  }
-  if(!snd_mixer_selem_has_playback_channel(h->elem, h->left)
-     || !snd_mixer_selem_has_playback_channel(h->elem, h->right)) {
-    error(0, "device '%s' mixer control '%s,%s' lacks required playback channels",
-         config->device, config->channel, config->mixer);
-    goto error;
-  }
-  snd_mixer_selem_get_playback_volume_range(h->elem, &h->min, &h->max);
-  return 0;
-error:
-  alsa_close(h);
-  return -1;
-}
-
-/** @brief Convert a level to a percentage */
-static int to_percent(const struct alsa_mixer_state *h, long n) {
-  return (n - h->min) * 100 / (h->max - h->min);
-}
-
-/** @brief Get ALSA volume */
-static int alsa_get(int *left, int *right) {
-  struct alsa_mixer_state h[1];
-  long l, r;
-  int err;
-  
-  if(alsa_open(h))
-    return -1;
-  if((err = snd_mixer_selem_get_playback_volume(h->elem, h->left, &l))
-     || (err = snd_mixer_selem_get_playback_volume(h->elem, h->right, &r))) {
-    error(0, "snd_mixer_selem_get_playback_volume: %s", snd_strerror(err));
-    goto error;
-  }
-  *left = to_percent(h, l);
-  *right = to_percent(h, r);
-  alsa_close(h);
-  return 0;
-error:
-  alsa_close(h);
-  return -1;
-}
-
-/** @brief Convert a percentage to a level */
-static int from_percent(const struct alsa_mixer_state *h, int n) {
-  return h->min + n * (h->max - h->min) / 100;
-}
-
-/** @brief Set ALSA volume */
-static int alsa_set(int *left, int *right) {
-  struct alsa_mixer_state h[1];
-  long l, r;
-  int err;
-  
-  if(alsa_open(h))
-    return -1;
-  /* Set the volume */
-  if(h->left == h->right) {
-    /* Mono output - just use the loudest */
-    if((err = snd_mixer_selem_set_playback_volume
-       (h->elem, h->left,
-        from_percent(h, *left > *right ? *left : *right)))) {
-      error(0, "snd_mixer_selem_set_playback_volume: %s", snd_strerror(err));
-      goto error;
-    }
-  } else {
-    /* Stereo output */
-    if((err = snd_mixer_selem_set_playback_volume
-       (h->elem, h->left, from_percent(h, *left)))
-       || (err = snd_mixer_selem_set_playback_volume
-          (h->elem, h->right, from_percent(h, *right)))) {
-      error(0, "snd_mixer_selem_set_playback_volume: %s", snd_strerror(err));
-      goto error;
-    }
-  }
-  /* Read it back to see what we ended up at */
-  if((err = snd_mixer_selem_get_playback_volume(h->elem, h->left, &l))
-     || (err = snd_mixer_selem_get_playback_volume(h->elem, h->right, &r))) {
-    error(0, "snd_mixer_selem_get_playback_volume: %s", snd_strerror(err));
-    goto error;
-  }
-  *left = to_percent(h, l);
-  *right = to_percent(h, r);
-  alsa_close(h);
-  return 0;
-error:
-  alsa_close(h);
-  return -1;
-}
-
-/** @brief ALSA mixer vtable */
-const struct mixer mixer_alsa = {
-  BACKEND_ALSA,
-  alsa_get,
-  alsa_set,
-  "0",
-  "PCM"
-};
-#endif
-
-/*
-Local Variables:
-c-basic-offset:2
-comment-column:40
-End:
-*/
diff --git a/lib/mixer-oss.c b/lib/mixer-oss.c
deleted file mode 100644 (file)
index a4ee419..0000000
+++ /dev/null
@@ -1,158 +0,0 @@
-/*
- * This file is part of DisOrder
- * Copyright (C) 2004, 2007, 2008 Richard Kettlewell
- *
- * 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 3 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, see <http://www.gnu.org/licenses/>.
- */
-/** @file lib/mixer-oss.c
- * @brief OSS mixer support
- *
- * Mono output devices aren't explicitly supported (but may work
- * nonetheless).
- */
-
-#include "common.h"
-
-#if HAVE_SYS_SOUNDCARD_H
-
-#include <fcntl.h>
-#include <unistd.h>
-#include <errno.h>
-#include <stddef.h>
-#include <sys/ioctl.h>
-#include <sys/soundcard.h>
-
-#include "configuration.h"
-#include "mixer.h"
-#include "log.h"
-#include "syscalls.h"
-#include "mem.h"
-
-/* documentation does not match implementation! */
-#ifndef SOUND_MIXER_READ
-# define SOUND_MIXER_READ(x) MIXER_READ(x)
-#endif
-#ifndef SOUND_MIXER_WRITE
-# define SOUND_MIXER_WRITE(x) MIXER_WRITE(x)
-#endif
-
-/** @brief Channel names */
-static const char *channels[] = SOUND_DEVICE_NAMES;
-
-/** @brief Convert channel name to number */
-static int mixer_channel(const char *c) {
-  unsigned n;
-  
-  if(!c[strspn(c, "0123456789")])
-    return atoi(c);
-  else {
-    for(n = 0; n < sizeof channels / sizeof *channels; ++n)
-      if(!strcmp(channels[n], c))
-       return n;
-    return -1;
-  }
-}
-
-/** @brief Open the OSS mixer device and return its fd */
-static int oss_do_open(void) {
-  int fd;
-  
-  if((fd = open(config->mixer, O_RDWR, 0)) < 0) {
-    static char *reported;
-
-    if(!reported || strcmp(reported, config->mixer)) {
-      if(reported)
-       xfree(reported);
-      reported = xstrdup(config->mixer);
-      error(errno, "error opening %s", config->mixer);
-    }
-  }
-  return fd;
-}
-
-/** @brief Get the OSS mixer setting */
-static int oss_do_get(int *left, int *right, int fd, int ch) {
-  int r;
-  
-  if(ioctl(fd, SOUND_MIXER_READ(ch), &r) == -1) {
-    error(errno, "error reading %s channel %s",
-         config->mixer, config->channel);
-    return -1;
-  }
-  *left = r & 0xff;
-  *right = (r >> 8) & 0xff;
-  return 0;
-}
-
-/** @brief Get OSS volume */
-static int oss_get(int *left, int *right) {
-  int ch, fd;
-
-  if(config->mixer
-     && config->channel
-     && (ch = mixer_channel(config->channel)) != -1) {
-    if((fd = oss_do_open()) < 0)
-      return -1;
-    if(oss_do_get(left, right, fd, ch) < 0) {
-      xclose(fd);
-      return -1;
-    }
-    xclose(fd);
-    return 0;
-  } else
-    return -1;
-}
-
-/** @brief Set OSS volume */
-static int oss_set(int *left, int *right) {
-  int ch, fd, r;
-
-  if(config->mixer
-     && config->channel
-     && (ch = mixer_channel(config->channel)) != -1) {
-    if((fd = oss_do_open()) < 0)
-      return -1;
-    r = (*left & 0xff) + (*right & 0xff) * 256;
-    if(ioctl(fd, SOUND_MIXER_WRITE(ch), &r) == -1) {
-      error(errno, "error changing %s channel %s",
-           config->mixer, config->channel);
-      xclose(fd);
-      return -1;
-    }
-    if(oss_do_get(left, right, fd, ch) < 0) {
-      xclose(fd);
-      return -1;
-    }
-    xclose(fd);
-    return 0;
-  } else
-    return -1;
-}
-
-/** @brief OSS mixer vtable */
-const struct mixer mixer_oss = {
-  BACKEND_OSS,
-  oss_get,
-  oss_set,
-  "/dev/mixer",
-  "pcm"
-};
-#endif
-
-/*
-Local Variables:
-c-basic-offset:2
-comment-column:40
-End:
-*/
diff --git a/lib/mixer.c b/lib/mixer.c
deleted file mode 100644 (file)
index a24f7eb..0000000
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
- * This file is part of DisOrder
- * Copyright (C) 2007 Richard Kettlewell
- *
- * 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 3 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, see <http://www.gnu.org/licenses/>.
- */
-/** @file lib/mixer.c
- * @brief Mixer support
- */
-
-#include "common.h"
-
-#include "configuration.h"
-#include "mixer.h"
-#include "log.h"
-#include "mem.h"
-
-/** @brief Whether lack of volume support has been reported yet */
-static int none_reported;
-
-/** @brief Get/set volume stub if volume control is not supported */
-static int none_get_set(int attribute((unused)) *left,
-                       int attribute((unused)) *right) {
-  if(!none_reported) {
-    error(0, "don't know how to get/set volume with this api");
-    none_reported = 1;
-  }
-  return -1;
-}
-
-/** @brief Stub mixer control */
-static const struct mixer mixer_none = {
-  -1,
-  none_get_set,
-  none_get_set,
-  "",
-  ""
-};
-
-/** @brief Table of mixer definitions */
-static const struct mixer *mixers[] = {
-#if HAVE_SYS_SOUNDCARD_H
-  &mixer_oss,
-#endif
-#if HAVE_ALSA_ASOUNDLIB_H
-  &mixer_alsa,
-#endif
-  &mixer_none                          /* make sure array is never empty */
-};
-
-/** @brief Number of mixer definitions */
-#define NMIXERS (sizeof mixers / sizeof *mixers)
-
-/** @brief Find the mixer definition */
-static const struct mixer *find_mixer(int api) {
-  size_t n;
-
-  if(api == -1)
-    api = config->api;
-  for(n = 0; n < NMIXERS; ++n)
-    if(mixers[n]->api == api)
-      return mixers[n];
-  return &mixer_none;
-}
-
-/** @brief Return true if we know how to drive the mixer
- * @param api Sound api or -1 for default
- * @return true if suppored, false otherwise
- */
-int mixer_supported(int api) {
-  const struct mixer *const m = find_mixer(api);
-  return m != &mixer_none;
-}
-
-/** @brief Get/set volume
- * @param api Sound api or -1 for default
- * @param left Left channel level, 0-100
- * @param right Right channel level, 0-100
- * @param set Set volume if non-0
- * @return 0 on success, non-0 on error
- *
- * If getting the volume then @p left and @p right are filled in.
- *
- * If setting the volume then the target levels are read from @p left and
- * @p right, and the actual level set is stored in them.
- */
-int mixer_control(int api, int *left, int *right, int set) {
-  const struct mixer *const m = find_mixer(api);
-
-  /* We impose defaults bizarrely late, but this has the advantage of
-   * not making everything depend on sound libraries */
-  if(!config->mixer)
-    config->mixer = xstrdup(m->device);
-  if(!config->channel)
-    config->channel = xstrdup(m->channel);
-  if(set)
-    return m->set(left, right);
-  else
-    return m->get(left, right);
-}
-
-/*
-Local Variables:
-c-basic-offset:2
-comment-column:40
-End:
-*/
diff --git a/lib/mixer.h b/lib/mixer.h
deleted file mode 100644 (file)
index 3d42246..0000000
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * This file is part of DisOrder
- * Copyright (C) 2004, 2007 Richard Kettlewell
- *
- * 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 3 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, see <http://www.gnu.org/licenses/>.
- */
-/** @file lib/mixer.h
- * @brief Mixer support
- */
-
-#ifndef MIXER_H
-#define MIXER_H
-
-/** @brief Definition of a mixer */
-struct mixer {
-  /** @brief API used by this mixer */
-  int api;
-
-  /** @brief Get the volume
-   * @param left Where to store left-channel volume
-   * @param right Where to store right-channel volume
-   * @return 0 on success, non-0 on error
-   */
-  int (*get)(int *left, int *right);
-
-  /** @brief Set the volume
-   * @param left Pointer to target left-channel volume
-   * @param right Pointer to target right-channel volume
-   * @return 0 on success, non-0 on error
-   *
-   * @p left and @p right are updated with the actual volume set.
-   */
-  int (*set)(int *left, int *right);
-
-  /** @brief Default device */
-  const char *device;
-
-  /** @brief Default channel */
-  const char *channel;
-};
-
-int mixer_control(int api, int *left, int *right, int set);
-const char *mixer_default_device(int api);
-const char *mixer_default_channel(int api);
-int mixer_supported(int api);
-
-extern const struct mixer mixer_oss;
-extern const struct mixer mixer_alsa;
-
-#endif /* MIXER_H */
-
-/*
-Local Variables:
-c-basic-offset:2
-comment-column:40
-End:
-*/
index 333fe7d..1486ebf 100644 (file)
@@ -203,6 +203,7 @@ int queue_unmarshall(struct queue_entry *q, const char *s,
   char **vec;
   int nvec;
 
+  q->pid = -1;                          /* =none */
   if(!(vec = split(s, &nvec, SPLIT_QUOTES, error_handler, u)))
     return -1;
   return queue_unmarshall_vec(q, nvec, vec, error_handler, u);
index 1c70cfd..72e3876 100644 (file)
@@ -38,9 +38,9 @@ enum playing_state {
    */
   playing_isscratch,
 
-  /** @brief Could not find a player
+  /** @brief OBSOLETE
    *
-   * Obsolete - nothing sets this any more
+   * Formerly meant that no player could be found.  Nothing sets this any more.
    */
   playing_no_player,
 
@@ -188,7 +188,14 @@ struct queue_entry {
   /** @brief How much of track has been played so far (seconds) */
   long sofar;
 
-  /** @brief True if decoder is connected to speaker */
+  /** @brief True if decoder is connected to speaker 
+   *
+   * This is not a @ref playing_state for a couple of reasons
+   * - it is orthogonal to @ref playing_started and @ref playing_unplayed
+   * - it would have to be hidden to other users of @c queue_entry
+   *
+   * For non-raw tracks this should always be zero.
+   */
   int prepared;
   /* For DISORDER_PLAYER_PAUSES only: */
 
@@ -203,6 +210,9 @@ struct queue_entry {
 
   /** @brief Owning queue (for Disobedience only) */
   struct queuelike *ql;
+  
+  /** @brief Decoder (or player) process ID */
+  pid_t pid;
 };
 
 void queue_insert_entry(struct queue_entry *b, struct queue_entry *n);
index 3f8f714..d6be3d9 100644 (file)
@@ -75,7 +75,7 @@ void random_get(void *ptr, size_t bytes) {
 
 /** @brief Return a random ID string */
 char *random_id(void) {
-  unsigned long words[2];
+  uint32_t words[2];
   char id[128];
 
   random_get(words, sizeof words);
index 930ad24..fe2906c 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * This file is part of DisOrder.
- * Copyright (C) 2007, 2008 Richard Kettlewell
+ * Copyright (C) 2007-2009 Richard Kettlewell
  *
  * 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
@@ -22,6 +22,7 @@
 #define TIMEVAL_H
 
 #include <time.h>
+#include <sys/time.h>
 
 static inline struct timeval tvsub(const struct timeval a,
                                    const struct timeval b) {
index 5fd7c32..5a62ff8 100644 (file)
@@ -41,6 +41,9 @@ void trackdb_open(int attribute((unused)) flags) {
 void trackdb_init(int attribute((unused)) flags) {
 }
 
+void trackdb_deinit(void) {
+}
+
 int trackdb_readable(void) {
   return 0;
 }
index b98752f..a188caa 100644 (file)
@@ -479,8 +479,8 @@ void trackdb_open(int flags) {
   trackdb_noticeddb = open_db("noticed.db",
                              DB_DUPSORT, DB_BTREE, dbflags, 0666);
   trackdb_scheduledb = open_db("schedule.db", 0, DB_HASH, dbflags, 0666);
+  if(!trackdb_existing_database && !(flags & TRACKDB_READ_ONLY)) {
   trackdb_playlistsdb = open_db("playlists.db", 0, DB_HASH, dbflags, 0666);
-  if(!trackdb_existing_database) {
     /* Stash the database version */
     char buf[32];
 
diff --git a/lib/uaudio-alsa.c b/lib/uaudio-alsa.c
new file mode 100644 (file)
index 0000000..3cec315
--- /dev/null
@@ -0,0 +1,288 @@
+/*
+ * This file is part of DisOrder.
+ * Copyright (C) 2009 Richard Kettlewell
+ *
+ * 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 3 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, see <http://www.gnu.org/licenses/>.
+ */
+/** @file lib/uaudio-alsa.c
+ * @brief Support for ALSA backend */
+#include "common.h"
+
+#if HAVE_ALSA_ASOUNDLIB_H
+
+#include <alsa/asoundlib.h>
+
+#include "mem.h"
+#include "log.h"
+#include "uaudio.h"
+#include "configuration.h"
+
+/** @brief The current PCM handle */
+static snd_pcm_t *alsa_pcm;
+
+static const char *const alsa_options[] = {
+  "device",
+  "mixer-control",
+  "mixer-channel",
+  NULL
+};
+
+/** @brief Mixer handle */
+snd_mixer_t *alsa_mixer_handle;
+
+/** @brief Mixer control */
+static snd_mixer_elem_t *alsa_mixer_elem;
+
+/** @brief Left channel */
+static snd_mixer_selem_channel_id_t alsa_mixer_left;
+
+/** @brief Right channel */
+static snd_mixer_selem_channel_id_t alsa_mixer_right;
+
+/** @brief Minimum level */
+static long alsa_mixer_min;
+
+/** @brief Maximum level */
+static long alsa_mixer_max;
+
+/** @brief Actually play sound via ALSA */
+static size_t alsa_play(void *buffer, size_t samples, unsigned flags) {
+  /* If we're paused we just pretend.  We rely on snd_pcm_writei() blocking so
+   * we have to fake up a sleep here.  However it doesn't have to be all that
+   * accurate - in particular it's quite acceptable to greatly underestimate
+   * the required wait time.  For 'lengthy' waits we do this by the blunt
+   * instrument of halving it.  */
+  if(flags & UAUDIO_PAUSED) {
+    if(samples > 64)
+      samples /= 2;
+    const uint64_t ns = ((uint64_t)samples * 1000000000
+                         / (uaudio_rate * uaudio_channels));
+    struct timespec ts[1];
+    ts->tv_sec = ns / 1000000000;
+    ts->tv_nsec = ns % 1000000000;
+    while(nanosleep(ts, ts) < 0 && errno == EINTR)
+      ;
+    return samples;
+  }
+  int err;
+  /* ALSA wants 'frames', where frame = several concurrently played samples */
+  const snd_pcm_uframes_t frames = samples / uaudio_channels;
+
+  snd_pcm_sframes_t rc = snd_pcm_writei(alsa_pcm, buffer, frames);
+  if(rc < 0) {
+    switch(rc) {
+    case -EPIPE:
+      if((err = snd_pcm_prepare(alsa_pcm)))
+       fatal(0, "error calling snd_pcm_prepare: %d", err);
+      return 0;
+    case -EAGAIN:
+      return 0;
+    default:
+      fatal(0, "error calling snd_pcm_writei: %d", (int)rc);
+    }
+  }
+  return rc * uaudio_channels;
+}
+
+/** @brief Open the ALSA sound device */
+static void alsa_open(void) {
+  const char *device = uaudio_get("device", "default");
+  int err;
+
+  if((err = snd_pcm_open(&alsa_pcm,
+                        device,
+                        SND_PCM_STREAM_PLAYBACK,
+                        0)))
+    fatal(0, "error from snd_pcm_open: %d", err);
+  snd_pcm_hw_params_t *hwparams;
+  snd_pcm_hw_params_alloca(&hwparams);
+  if((err = snd_pcm_hw_params_any(alsa_pcm, hwparams)) < 0)
+    fatal(0, "error from snd_pcm_hw_params_any: %d", err);
+  if((err = snd_pcm_hw_params_set_access(alsa_pcm, hwparams,
+                                         SND_PCM_ACCESS_RW_INTERLEAVED)) < 0)
+    fatal(0, "error from snd_pcm_hw_params_set_access: %d", err);
+  int sample_format;
+  if(uaudio_bits == 16)
+    sample_format = uaudio_signed ? SND_PCM_FORMAT_S16 : SND_PCM_FORMAT_U16;
+  else
+    sample_format = uaudio_signed ? SND_PCM_FORMAT_S8 : SND_PCM_FORMAT_U8;
+  if((err = snd_pcm_hw_params_set_format(alsa_pcm, hwparams,
+                                         sample_format)) < 0)
+    fatal(0, "error from snd_pcm_hw_params_set_format (%d): %d",
+          sample_format, err);
+  unsigned rate = uaudio_rate;
+  if((err = snd_pcm_hw_params_set_rate_near(alsa_pcm, hwparams, &rate, 0)) < 0)
+    fatal(0, "error from snd_pcm_hw_params_set_rate_near (%d): %d",
+          rate, err);
+  if((err = snd_pcm_hw_params_set_channels(alsa_pcm, hwparams,
+                                           uaudio_channels)) < 0)
+    fatal(0, "error from snd_pcm_hw_params_set_channels (%d): %d",
+          uaudio_channels, err);
+  if((err = snd_pcm_hw_params(alsa_pcm, hwparams)) < 0)
+    fatal(0, "error calling snd_pcm_hw_params: %d", err);
+  
+}
+
+static void alsa_start(uaudio_callback *callback,
+                      void *userdata) {
+  if(uaudio_channels != 1 && uaudio_channels != 2)
+    fatal(0, "asked for %d channels but only support 1 or 2",
+          uaudio_channels); 
+  if(uaudio_bits != 8 && uaudio_bits != 16)
+    fatal(0, "asked for %d bits/channel but only support 8 or 16",
+          uaudio_bits); 
+  alsa_open();
+  uaudio_thread_start(callback, userdata, alsa_play,
+                      32 / uaudio_sample_size,
+                      4096 / uaudio_sample_size,
+                      0);
+}
+
+static void alsa_stop(void) {
+  uaudio_thread_stop();
+  snd_pcm_close(alsa_pcm);
+  alsa_pcm = 0;
+}
+
+/** @brief Convert a level to a percentage */
+static int to_percent(long n) {
+  return (n - alsa_mixer_min) * 100 / (alsa_mixer_max - alsa_mixer_min);
+}
+
+/** @brief Convert a percentage to a level */
+static int from_percent(int n) {
+  return alsa_mixer_min + n * (alsa_mixer_max - alsa_mixer_min) / 100;
+}
+
+static void alsa_open_mixer(void) {
+  int err;
+  snd_mixer_selem_id_t *id;
+  const char *device = uaudio_get("device", "default");
+  const char *mixer = uaudio_get("mixer-control", "0");
+  const char *channel = uaudio_get("mixer-channel", "PCM");
+
+  snd_mixer_selem_id_alloca(&id);
+  if((err = snd_mixer_open(&alsa_mixer_handle, 0)))
+    fatal(0, "snd_mixer_open: %s", snd_strerror(err));
+  if((err = snd_mixer_attach(alsa_mixer_handle, device)))
+    fatal(0, "snd_mixer_attach %s: %s", device, snd_strerror(err));
+  if((err = snd_mixer_selem_register(alsa_mixer_handle,
+                                     0/*options*/, 0/*classp*/)))
+    fatal(0, "snd_mixer_selem_register %s: %s",
+          device, snd_strerror(err));
+  if((err = snd_mixer_load(alsa_mixer_handle)))
+    fatal(0, "snd_mixer_load %s: %s", device, snd_strerror(err));
+  snd_mixer_selem_id_set_name(id, channel);
+  snd_mixer_selem_id_set_index(id, atoi(mixer));
+  if(!(alsa_mixer_elem = snd_mixer_find_selem(alsa_mixer_handle, id)))
+    fatal(0, "device '%s' mixer control '%s,%s' does not exist",
+         device, channel, mixer);
+  if(!snd_mixer_selem_has_playback_volume(alsa_mixer_elem))
+    fatal(0, "device '%s' mixer control '%s,%s' has no playback volume",
+         device, channel, mixer);
+  if(snd_mixer_selem_is_playback_mono(alsa_mixer_elem)) {
+    alsa_mixer_left = alsa_mixer_right = SND_MIXER_SCHN_MONO;
+  } else {
+    alsa_mixer_left = SND_MIXER_SCHN_FRONT_LEFT;
+    alsa_mixer_right = SND_MIXER_SCHN_FRONT_RIGHT;
+  }
+  if(!snd_mixer_selem_has_playback_channel(alsa_mixer_elem,
+                                           alsa_mixer_left)
+     || !snd_mixer_selem_has_playback_channel(alsa_mixer_elem,
+                                              alsa_mixer_right))
+    fatal(0, "device '%s' mixer control '%s,%s' lacks required playback channels",
+         device, channel, mixer);
+  snd_mixer_selem_get_playback_volume_range(alsa_mixer_elem,
+                                            &alsa_mixer_min, &alsa_mixer_max);
+
+}
+
+static void alsa_close_mixer(void) {
+  /* TODO alsa_mixer_elem */
+  if(alsa_mixer_handle)
+    snd_mixer_close(alsa_mixer_handle);
+}
+
+static void alsa_get_volume(int *left, int *right) {
+  long l, r;
+  int err;
+  
+  if((err = snd_mixer_selem_get_playback_volume(alsa_mixer_elem,
+                                                alsa_mixer_left, &l))
+     || (err = snd_mixer_selem_get_playback_volume(alsa_mixer_elem,
+                                                   alsa_mixer_right, &r)))
+    fatal(0, "snd_mixer_selem_get_playback_volume: %s", snd_strerror(err));
+  *left = to_percent(l);
+  *right = to_percent(r);
+}
+
+static void alsa_set_volume(int *left, int *right) {
+  long l, r;
+  int err;
+  
+  /* Set the volume */
+  if(alsa_mixer_left == alsa_mixer_right) {
+    /* Mono output - just use the loudest */
+    if((err = snd_mixer_selem_set_playback_volume
+       (alsa_mixer_elem, alsa_mixer_left,
+        from_percent(*left > *right ? *left : *right))))
+      fatal(0, "snd_mixer_selem_set_playback_volume: %s", snd_strerror(err));
+  } else {
+    /* Stereo output */
+    if((err = snd_mixer_selem_set_playback_volume
+       (alsa_mixer_elem, alsa_mixer_left, from_percent(*left)))
+       || (err = snd_mixer_selem_set_playback_volume
+          (alsa_mixer_elem, alsa_mixer_right, from_percent(*right))))
+      fatal(0, "snd_mixer_selem_set_playback_volume: %s", snd_strerror(err));
+  }
+  /* Read it back to see what we ended up at */
+  if((err = snd_mixer_selem_get_playback_volume(alsa_mixer_elem,
+                                                alsa_mixer_left, &l))
+     || (err = snd_mixer_selem_get_playback_volume(alsa_mixer_elem,
+                                                   alsa_mixer_right, &r)))
+    fatal(0, "snd_mixer_selem_get_playback_volume: %s", snd_strerror(err));
+  *left = to_percent(l);
+  *right = to_percent(r);
+}
+
+static void alsa_configure(void) {
+  uaudio_set("device", config->device);
+  uaudio_set("mixer-control", config->mixer);
+  uaudio_set("mixer-channel", config->channel);
+}
+
+const struct uaudio uaudio_alsa = {
+  .name = "alsa",
+  .options = alsa_options,
+  .start = alsa_start,
+  .stop = alsa_stop,
+  .activate = uaudio_thread_activate,
+  .deactivate = uaudio_thread_deactivate,
+  .open_mixer = alsa_open_mixer,
+  .close_mixer = alsa_close_mixer,
+  .get_volume = alsa_get_volume,
+  .set_volume = alsa_set_volume,
+  .configure = alsa_configure
+};
+
+#endif
+
+/*
+Local Variables:
+c-basic-offset:2
+comment-column:40
+fill-column:79
+indent-tabs-mode:nil
+End:
+*/
diff --git a/lib/uaudio-apis.c b/lib/uaudio-apis.c
new file mode 100644 (file)
index 0000000..1006fd9
--- /dev/null
@@ -0,0 +1,68 @@
+/*
+ * This file is part of DisOrder.
+ * Copyright (C) 2009 Richard Kettlewell
+ *
+ * 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 3 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, see <http://www.gnu.org/licenses/>.
+ */
+
+/** @file lib/uaudio-apis.c
+ * @brief Audio API list
+ */
+
+#include "common.h"
+#include "uaudio.h"
+#include "log.h"
+
+/** @brief List of known APIs
+ *
+ * Terminated by a null pointer.
+ *
+ * The first one will be used as a default, so putting ALSA before OSS
+ * constitutes a policy decision.
+ */
+const struct uaudio *const uaudio_apis[] = {
+#if HAVE_COREAUDIO_AUDIOHARDWARE_H
+  &uaudio_coreaudio,
+#endif  
+#if HAVE_ALSA_ASOUNDLIB_H
+  &uaudio_alsa,
+#endif
+#if HAVE_SYS_SOUNDCARD_H || EMPEG_HOST
+  &uaudio_oss,
+#endif
+  &uaudio_rtp,
+  &uaudio_command,
+  NULL,
+};
+
+/** @brief Look up an audio API by name */
+const struct uaudio *uaudio_find(const char *name) {
+  int n;
+
+  for(n = 0; uaudio_apis[n]; ++n)
+    if(!strcmp(uaudio_apis[n]->name, name))
+      return uaudio_apis[n];
+  if(!strcmp(name, "network"))
+    return &uaudio_rtp;
+  fatal(0, "cannot find audio API '%s'", name);
+}
+
+/*
+Local Variables:
+c-basic-offset:2
+comment-column:40
+fill-column:79
+indent-tabs-mode:nil
+End:
+*/
diff --git a/lib/uaudio-command.c b/lib/uaudio-command.c
new file mode 100644 (file)
index 0000000..57e8762
--- /dev/null
@@ -0,0 +1,175 @@
+/*
+ * This file is part of DisOrder.
+ * Copyright (C) 2005, 2006, 2007, 2009 Richard Kettlewell
+ * Portions (C) 2007 Mark Wooding
+ *
+ * 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 3 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, see <http://www.gnu.org/licenses/>.
+ */
+/** @file lib/uaudio-command.c
+ * @brief Support for commmand backend
+ *
+ * We use the code in @ref lib/uaudio-schedule.c to ensure that we write at
+ * approximately the 'real' rate.  For disorder-playrtp this isn't very useful
+ * (thought it might reduce the size of various buffers downstream of us) but
+ * when run from the speaker it means that pausing stands a chance of working.
+ */
+#include "common.h"
+
+#include <errno.h>
+#include <unistd.h>
+
+#include "syscalls.h"
+#include "log.h"
+#include "mem.h"
+#include "wstat.h"
+#include "uaudio.h"
+#include "configuration.h"
+
+/** @brief Pipe to subprocess */
+static int command_fd;
+
+/** @brief Child process ID */
+static pid_t command_pid;
+
+/** @brief Whether to suspend on pause */
+static int command_suspend_on_pause;
+
+static const char *const command_options[] = {
+  "command",
+  "pause-mode",
+  NULL
+};
+
+/** @brief Close pipe and wait for subprocess to terminate */
+static void command_wait(void) {
+  int w;
+  pid_t rc;
+  char *ws;
+
+  close(command_fd);
+  while((rc = waitpid(command_pid, &w, 0) < 0 && errno == EINTR))
+    ;
+  if(rc < 0)
+    fatal(errno, "waitpid");
+  if(w) {
+    ws = wstat(w);
+    error(0, "command subprocess %s", ws);
+    xfree(ws);
+  }
+}
+
+/** @brief Create subprocess */ 
+static void command_open(void) {
+  int pfd[2];
+  const char *command;
+
+  if(!(command = uaudio_get("command", NULL)))
+    fatal(0, "'command' not set");
+  xpipe(pfd);
+  command_pid = xfork();
+  if(!command_pid) {
+    exitfn = _exit;
+    signal(SIGPIPE, SIG_DFL);
+    xdup2(pfd[0], 0);
+    close(pfd[0]);
+    close(pfd[1]);
+    /* TODO it would be nice to set some environment variables given the sample
+     * format.  The original intended model is that you adapt DisOrder to the
+     * command you run but it'd be nice to support the opposite. */
+    execl("/bin/sh", "sh", "-c", command, (char *)0);
+    fatal(errno, "error executing /bin/sh");
+  }
+  close(pfd[0]);
+  command_fd = pfd[1];
+}
+
+/** @brief Send audio data to subprocess */
+static size_t command_play(void *buffer, size_t nsamples, unsigned flags) {
+  uaudio_schedule_sync();
+  /* If we're pausing and want that to be represented by stopping writing, we
+   * just pretend */
+  if((flags & UAUDIO_PAUSED) && command_suspend_on_pause)
+    return nsamples;
+  const size_t bytes = nsamples * uaudio_sample_size;
+  int written = write(command_fd, buffer, bytes);
+  if(written < 0) {
+    switch(errno) {
+    case EINTR:
+      return 0;                        /* will retry */
+    case EPIPE:
+      error(0, "audio command subprocess terminated");
+      command_wait();
+      command_open();
+      return 0;                        /* will retry */
+    default:
+      fatal(errno, "error writing to audio command subprocess");
+    }
+  }
+  /* TODO what if we write a partial sample? Actually reasonably unlikely but
+   * not impossible.  Maybe someone who actually uses this backend should sort
+   * it out. */
+  const size_t written_samples = written / uaudio_sample_size;
+  uaudio_schedule_sent(written_samples);
+  return written_samples;
+}
+
+static void command_start(uaudio_callback *callback,
+                      void *userdata) {
+  const char *pausemode = uaudio_get("pause-mode", "silence");
+  unsigned flags = 0;
+
+  if(!strcmp(pausemode, "silence"))
+    command_suspend_on_pause = 0;
+  else if(!strcmp(pausemode, "suspend"))
+    command_suspend_on_pause = 1;
+  else
+    fatal(0, "unknown pause mode '%s'", pausemode);
+  command_open();
+  uaudio_schedule_init();
+  uaudio_thread_start(callback,
+                      userdata,
+                      command_play,
+                      uaudio_channels,
+                     4096 / uaudio_sample_size,
+                      flags);
+}
+
+static void command_stop(void) {
+  uaudio_thread_stop();
+  command_wait();
+}
+
+static void command_configure(void) {
+  uaudio_set("command", config->speaker_command);
+  uaudio_set("pause-mode", config->pause_mode);
+}
+
+const struct uaudio uaudio_command = {
+  .name = "command",
+  .options = command_options,
+  .start = command_start,
+  .stop = command_stop,
+  .activate = uaudio_thread_activate,
+  .deactivate = uaudio_thread_deactivate,
+  .configure = command_configure,
+};
+
+/*
+Local Variables:
+c-basic-offset:2
+comment-column:40
+fill-column:79
+indent-tabs-mode:nil
+End:
+*/
diff --git a/lib/uaudio-coreaudio.c b/lib/uaudio-coreaudio.c
new file mode 100644 (file)
index 0000000..5f28e67
--- /dev/null
@@ -0,0 +1,209 @@
+/*
+ * This file is part of DisOrder.
+ * Copyright (C) 2009 Richard Kettlewell
+ *
+ * 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 3 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, see <http://www.gnu.org/licenses/>.
+ */
+/** @file lib/uaudio-coreaudio.c
+ * @brief Support for Core Audio backend */
+#include "common.h"
+
+#if HAVE_COREAUDIO_AUDIOHARDWARE_H
+
+#include "coreaudio.h"
+#include "uaudio.h"
+#include "mem.h"
+#include "log.h"
+#include "syscalls.h"
+#include "configuration.h"
+
+/** @brief Callback to request sample data */
+static uaudio_callback *coreaudio_callback;
+
+/** @brief Userdata for @ref coreaudio_callback */
+static void *coreaudio_userdata;
+
+/** @brief Core Audio device ID */
+static AudioDeviceID coreaudio_adid;
+
+/** @brief Core Audio option names */
+static const char *const coreaudio_options[] = {
+  "device",
+  NULL
+};
+
+/** @brief Callback from Core Audio
+ *
+ * Core Audio demands floating point samples but we provide integers.
+ * So there is a conversion step in here.
+ */
+static OSStatus coreaudio_adioproc
+    (AudioDeviceID attribute((unused)) inDevice,
+     const AudioTimeStamp attribute((unused)) *inNow,
+     const AudioBufferList attribute((unused)) *inInputData,
+     const AudioTimeStamp attribute((unused)) *inInputTime,
+     AudioBufferList *outOutputData,
+     const AudioTimeStamp attribute((unused)) *inOutputTime,
+     void attribute((unused)) *inClientData) {
+  /* Number of buffers we must fill */
+  unsigned nbuffers = outOutputData->mNumberBuffers;
+  /* Pointer to buffer to fill */
+  AudioBuffer *ab = outOutputData->mBuffers;
+  
+  while(nbuffers > 0) {
+    /* Where to store converted sample data */
+    float *samples = ab->mData;
+    /* Number of samples left to fill */
+    size_t nsamples = ab->mDataByteSize / sizeof (float);
+
+    while(nsamples > 0) {
+      /* Integer-format input buffer */
+      unsigned char input[1024];
+      const size_t maxsamples = sizeof input / uaudio_sample_size;
+      /* How many samples we'll ask for */
+      const size_t ask = nsamples > maxsamples ? maxsamples : nsamples;
+      /* How many we get */
+      int got;
+
+      got = coreaudio_callback(input, ask, coreaudio_userdata);
+      /* Convert the samples and store in the output buffer */
+      nsamples -= got;
+      if(uaudio_signed) {
+        if(uaudio_bits == 16) {
+          const int16_t *ptr = (int16_t *)input;
+          while(got > 0) {
+            --got;
+            *samples++ = *ptr++ * (0.5 / 32767);
+          }
+        } else {
+          const int8_t *ptr = (int8_t *)input;
+          while(got > 0) {
+            --got;
+            *samples++ = *ptr++ * (0.5 / 127);
+          }
+        }
+      } else {
+        if(uaudio_bits == 16) {
+          const uint16_t *ptr = (uint16_t *)input;
+          while(got > 0) {
+            --got;
+            *samples++ = ((int)*ptr++ - 32768) * (0.5 / 32767);
+          }
+        } else {
+          const uint8_t *ptr = (uint8_t *)input;
+          while(got > 0) {
+            --got;
+            *samples++ = ((int)*ptr++ - 128) * (0.5 / 127);
+          }
+        }
+      }
+    }
+    /* Move on to the next buffer */
+    ++ab;
+    --nbuffers;
+  }
+  return 0;
+}
+
+static void coreaudio_start(uaudio_callback *callback,
+                            void *userdata) {
+  OSStatus status;
+  UInt32 propertySize;
+  AudioStreamBasicDescription asbd;
+  const char *device;
+
+  if(uaudio_bits != 8 && uaudio_bits != 16)
+    disorder_fatal(0, "asked for %d bits/channel but only support 8 and 16",
+                   uaudio_bits);
+  coreaudio_callback = callback;
+  coreaudio_userdata = userdata;
+  device = uaudio_get("device", "default");
+  coreaudio_adid = coreaudio_getdevice(device);
+  /* Get the device properties */
+  propertySize = sizeof asbd;
+  status = AudioDeviceGetProperty(coreaudio_adid, 0, false,
+                                 kAudioDevicePropertyStreamFormat,
+                                 &propertySize, &asbd);
+  if(status)
+    coreaudio_fatal(status, "AudioHardwareGetProperty");
+  D(("mSampleRate       %f", asbd.mSampleRate));
+  D(("mFormatID         %08lx", asbd.mFormatID));
+  D(("mFormatFlags      %08lx", asbd.mFormatFlags));
+  D(("mBytesPerPacket   %08lx", asbd.mBytesPerPacket));
+  D(("mFramesPerPacket  %08lx", asbd.mFramesPerPacket));
+  D(("mBytesPerFrame    %08lx", asbd.mBytesPerFrame));
+  D(("mChannelsPerFrame %08lx", asbd.mChannelsPerFrame));
+  D(("mBitsPerChannel   %08lx", asbd.mBitsPerChannel));
+  D(("mReserved         %08lx", asbd.mReserved));
+  /* Check that everything adds up */
+  if(asbd.mFormatID != kAudioFormatLinearPCM)
+    disorder_fatal(0, "audio device does not support kAudioFormatLinearPCM");
+  if(asbd.mSampleRate != uaudio_rate
+     || asbd.mChannelsPerFrame != (unsigned)uaudio_channels) {
+    disorder_fatal(0, "want %dHz %d channels "
+                      "but got %gHz %"PRIu32" channels",
+                   uaudio_rate,
+                   uaudio_channels,
+                   (double)asbd.mSampleRate,
+                   (uint32_t)asbd.mChannelsPerFrame);
+  }
+  /* Add a collector callback */
+  status = AudioDeviceAddIOProc(coreaudio_adid, coreaudio_adioproc, 0);
+  if(status)
+    coreaudio_fatal(status, "AudioDeviceAddIOProc");
+}
+
+static void coreaudio_stop(void) {
+}
+
+static void coreaudio_activate(void) {
+  OSStatus status;
+
+  status = AudioDeviceStart(coreaudio_adid, coreaudio_adioproc);
+  if(status)
+    coreaudio_fatal(status, "AudioDeviceStart");
+}
+
+static void coreaudio_deactivate(void) {
+  OSStatus status;
+
+  status = AudioDeviceStop(coreaudio_adid, coreaudio_adioproc);
+  if(status)
+    coreaudio_fatal(status, "AudioDeviceStop");
+}
+
+static void coreaudio_configure(void) {
+  uaudio_set("device", config->device);
+}
+
+const struct uaudio uaudio_coreaudio = {
+  .name = "coreaudio",
+  .options = coreaudio_options,
+  .start = coreaudio_start,
+  .stop = coreaudio_stop,
+  .activate = coreaudio_activate,
+  .deactivate = coreaudio_deactivate,
+  .configure = coreaudio_configure,
+};
+
+#endif
+
+/*
+Local Variables:
+c-basic-offset:2
+comment-column:40
+fill-column:79
+indent-tabs-mode:nil
+End:
+*/
diff --git a/lib/uaudio-oss.c b/lib/uaudio-oss.c
new file mode 100644 (file)
index 0000000..d0c9062
--- /dev/null
@@ -0,0 +1,246 @@
+/*
+ * This file is part of DisOrder.
+ * Copyright (C) 2009 Richard Kettlewell
+ *
+ * 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 3 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, see <http://www.gnu.org/licenses/>.
+ */
+/** @file lib/uaudio-oss.c
+ * @brief Support for OSS backend */
+#include "common.h"
+
+#if HAVE_SYS_SOUNDCARD_H || EMPEG_HOST
+
+#if HAVE_SYS_SOUNDCARD_H
+# include <sys/soundcard.h>
+#endif
+#include <sys/ioctl.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <errno.h>
+#include <time.h>
+
+#include "mem.h"
+#include "log.h"
+#include "uaudio.h"
+#include "configuration.h"
+
+#ifndef AFMT_U16_NE
+# if BYTE_ORDER == BIG_ENDIAN
+#  define AFMT_U16_NE AFMT_U16_BE
+# else
+#  define AFMT_U16_NE AFMT_U16_LE
+# endif
+#endif
+
+/* documentation does not match implementation! */
+#ifndef SOUND_MIXER_READ
+# define SOUND_MIXER_READ(x) MIXER_READ(x)
+#endif
+#ifndef SOUND_MIXER_WRITE
+# define SOUND_MIXER_WRITE(x) MIXER_WRITE(x)
+#endif
+
+static int oss_fd = -1;
+static int oss_mixer_fd = -1;
+static int oss_mixer_channel;
+
+static const char *const oss_options[] = {
+  "device",
+  "mixer-device",
+  "mixer-channel",
+  NULL
+};
+
+/** @brief Open the OSS sound device */
+static void oss_open(void) {
+  const char *device = uaudio_get("device", NULL);
+
+#if EMPEG_HOST
+  if(!device || !*device || !strcmp(device, "default"))
+    device = "/dev/audio";
+#else
+  if(!device || !*device || !strcmp(device, "default")) {
+    if(access("/dev/dsp", W_OK) == 0)
+      device = "/dev/dsp";
+    else
+      device = "/dev/audio";
+  }
+#endif
+  if((oss_fd = open(device, O_WRONLY, 0)) < 0)
+    fatal(errno, "error opening %s", device);
+#if !EMPEG_HOST
+  int stereo = (uaudio_channels == 2), format;
+  if(ioctl(oss_fd, SNDCTL_DSP_STEREO, &stereo) < 0)
+    fatal(errno, "error calling ioctl SNDCTL_DSP_STEREO %d", stereo);
+  if(uaudio_bits == 16)
+    format = uaudio_signed ? AFMT_S16_NE : AFMT_U16_NE;
+  else
+    format = uaudio_signed ? AFMT_S8 : AFMT_U8;
+  if(ioctl(oss_fd, SNDCTL_DSP_SETFMT, &format) < 0)
+    fatal(errno, "error calling ioctl SNDCTL_DSP_SETFMT %#x", format);
+  int rate = uaudio_rate;
+  if(ioctl(oss_fd, SNDCTL_DSP_SPEED, &rate) < 0)
+    fatal(errno, "error calling ioctl SNDCTL_DSP_SPEED %d", rate);
+  if(rate != uaudio_rate)
+    error(0, "asked for %dHz, got %dHz", uaudio_rate, rate);
+#endif
+}
+
+/** @brief Close the OSS sound device */
+static void oss_close(void) {
+  if(oss_fd != -1) {
+    close(oss_fd);
+    oss_fd = -1;
+  }
+}
+
+/** @brief Actually play sound via OSS */
+static size_t oss_play(void *buffer, size_t samples, unsigned flags) {
+  /* cf uaudio-alsa.c:alsa-play() */
+  if(flags & UAUDIO_PAUSED) {
+    if(flags & UAUDIO_PAUSE)
+      oss_close();
+    if(samples > 64)
+      samples /= 2;
+    const uint64_t ns = ((uint64_t)samples * 1000000000
+                         / (uaudio_rate * uaudio_channels));
+    struct timespec ts[1];
+    ts->tv_sec = ns / 1000000000;
+    ts->tv_nsec = ns % 1000000000;
+    while(nanosleep(ts, ts) < 0 && errno == EINTR)
+      ;
+    return samples;
+  }
+  if(flags & UAUDIO_RESUME)
+    oss_open();
+  const size_t bytes = samples * uaudio_sample_size;
+  int rc = write(oss_fd, buffer, bytes);
+  if(rc < 0)
+    fatal(errno, "error writing to sound device");
+  return rc / uaudio_sample_size;
+}
+
+static void oss_start(uaudio_callback *callback,
+                      void *userdata) {
+  if(uaudio_channels != 1 && uaudio_channels != 2)
+    fatal(0, "asked for %d channels but only support 1 or 2",
+          uaudio_channels); 
+  if(uaudio_bits != 8 && uaudio_bits != 16)
+    fatal(0, "asked for %d bits/channel but only support 8 or 16",
+          uaudio_bits); 
+#if EMPEG_HOST
+  /* Very specific buffer size requirements here apparently */
+  uaudio_thread_start(callback, userdata, oss_play, 
+                      4608 / uaudio_sample_size,
+                      4608 / uaudio_sample_size,
+                      0);
+#else
+  /* We could SNDCTL_DSP_GETBLKSIZE but only when the device is already open,
+   * which is kind of inconvenient.  We go with 1-4Kbyte for now. */
+  uaudio_thread_start(callback, userdata, oss_play, 
+                      32 / uaudio_sample_size,
+                      4096 / uaudio_sample_size,
+                      0);
+#endif
+}
+
+static void oss_stop(void) {
+  uaudio_thread_stop();
+  oss_close();                          /* might not have been paused */
+}
+
+/** @brief Channel names */
+static const char *oss_channels[] = SOUND_DEVICE_NAMES;
+
+static int oss_mixer_find_channel(const char *channel) {
+  if(!channel[strspn(channel, "0123456789")])
+    return atoi(channel);
+  else {
+    for(unsigned n = 0; n < sizeof oss_channels / sizeof *oss_channels; ++n)
+      if(!strcmp(oss_channels[n], channel))
+       return n;
+    return -1;
+  }
+}  
+
+static void oss_open_mixer(void) {
+  const char *mixer = uaudio_get("mixer-device", "/dev/mixer");
+  /* TODO infer mixer-device from device */
+  if((oss_mixer_fd = open(mixer, O_RDWR, 0)) < 0)
+    fatal(errno, "error opening %s", mixer);
+  const char *channel = uaudio_get("mixer-channel", "pcm");
+  oss_mixer_channel = oss_mixer_find_channel(channel);
+  if(oss_mixer_channel < 0)
+    fatal(0, "no such channel as '%s'", channel);
+}
+
+static void oss_close_mixer(void) {
+  close(oss_mixer_fd);
+  oss_mixer_fd = -1;
+}
+
+static void oss_get_volume(int *left, int *right) {
+  int r;
+
+  *left = *right = 0;
+  if(ioctl(oss_mixer_fd, SOUND_MIXER_READ(oss_mixer_channel), &r) < 0)
+    error(errno, "error getting volume");
+  else {
+    *left = r & 0xff;
+    *right = (r >> 8) & 0xff;
+  }
+}
+
+static void oss_set_volume(int *left, int *right) {
+  int r =  (*left & 0xff) + (*right & 0xff) * 256;
+  if(ioctl(oss_mixer_fd, SOUND_MIXER_WRITE(oss_mixer_channel), &r) == -1)
+    error(errno, "error setting volume");
+  else if(ioctl(oss_mixer_fd, SOUND_MIXER_READ(oss_mixer_channel), &r) < 0)
+    error(errno, "error getting volume");
+  else {
+    *left = r & 0xff;
+    *right = (r >> 8) & 0xff;
+  }
+}
+
+static void oss_configure(void) {
+  uaudio_set("device", config->device);
+  uaudio_set("mixer-device", config->mixer);
+  uaudio_set("mixer-channel", config->channel);
+}
+
+const struct uaudio uaudio_oss = {
+  .name = "oss",
+  .options = oss_options,
+  .start = oss_start,
+  .stop = oss_stop,
+  .activate = uaudio_thread_activate,
+  .deactivate = uaudio_thread_deactivate,
+  .open_mixer = oss_open_mixer,
+  .close_mixer = oss_close_mixer,
+  .get_volume = oss_get_volume,
+  .set_volume = oss_set_volume,
+  .configure = oss_configure,
+};
+
+#endif
+
+/*
+Local Variables:
+c-basic-offset:2
+comment-column:40
+fill-column:79
+indent-tabs-mode:nil
+End:
+*/
diff --git a/lib/uaudio-rtp.c b/lib/uaudio-rtp.c
new file mode 100644 (file)
index 0000000..e1768a8
--- /dev/null
@@ -0,0 +1,367 @@
+/*
+ * This file is part of DisOrder.
+ * Copyright (C) 2009 Richard Kettlewell
+ *
+ * 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 3 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, see <http://www.gnu.org/licenses/>.
+ */
+/** @file lib/uaudio-rtp.c
+ * @brief Support for RTP network play backend */
+#include "common.h"
+
+#include <errno.h>
+#include <sys/socket.h>
+#include <ifaddrs.h>
+#include <net/if.h>
+#include <arpa/inet.h>
+#include <netinet/in.h>
+#include <gcrypt.h>
+#include <unistd.h>
+#include <time.h>
+#include <sys/uio.h>
+
+#include "uaudio.h"
+#include "mem.h"
+#include "log.h"
+#include "syscalls.h"
+#include "rtp.h"
+#include "addr.h"
+#include "ifreq.h"
+#include "timeval.h"
+#include "configuration.h"
+
+/** @brief Bytes to send per network packet
+ *
+ * This is the maximum number of bytes we pass to write(2); to determine actual
+ * packet sizes, add a UDP header and an IP header (and a link layer header if
+ * it's the link layer size you care about).
+ *
+ * Don't make this too big or arithmetic will start to overflow.
+ */
+#define NETWORK_BYTES (1500-8/*UDP*/-40/*IP*/-8/*conservatism*/)
+
+/** @brief RTP payload type */
+static int rtp_payload;
+
+/** @brief RTP output socket */
+static int rtp_fd;
+
+/** @brief RTP SSRC */
+static uint32_t rtp_id;
+
+/** @brief Base for timestamp */
+static uint32_t rtp_base;
+
+/** @brief RTP sequence number */
+static uint16_t rtp_sequence;
+
+/** @brief Network error count
+ *
+ * If too many errors occur in too short a time, we give up.
+ */
+static int rtp_errors;
+
+/** @brief Set while paused */
+static volatile int rtp_paused;
+
+static const char *const rtp_options[] = {
+  "rtp-destination",
+  "rtp-destination-port",
+  "rtp-source",
+  "rtp-source-port",
+  "multicast-ttl",
+  "multicast-loop",
+  NULL
+};
+
+static void rtp_get_netconfig(const char *af,
+                              const char *addr,
+                              const char *port,
+                              struct netaddress *na) {
+  char *vec[3];
+  
+  vec[0] = uaudio_get(af, NULL);
+  vec[1] = uaudio_get(addr, NULL);
+  vec[2] = uaudio_get(port, NULL);
+  if(!*vec)
+    na->af = -1;
+  else
+    if(netaddress_parse(na, 3, vec))
+      fatal(0, "invalid RTP address");
+}
+
+static void rtp_set_netconfig(const char *af,
+                              const char *addr,
+                              const char *port,
+                              const struct netaddress *na) {
+  uaudio_set(af, NULL);
+  uaudio_set(addr, NULL);
+  uaudio_set(port, NULL);
+  if(na->af != -1) {
+    int nvec;
+    char **vec;
+
+    netaddress_format(na, &nvec, &vec);
+    if(nvec > 0) {
+      uaudio_set(af, vec[0]);
+      xfree(vec[0]);
+    }
+    if(nvec > 1) {
+      uaudio_set(addr, vec[1]);
+      xfree(vec[1]);
+    }
+    if(nvec > 2) {
+      uaudio_set(port, vec[2]);
+      xfree(vec[2]);
+    }
+    xfree(vec);
+  }
+}
+
+static size_t rtp_play(void *buffer, size_t nsamples, unsigned flags) {
+  struct rtp_header header;
+  struct iovec vec[2];
+
+#if 0
+  if(flags & (UAUDIO_PAUSE|UAUDIO_RESUME))
+    fprintf(stderr, "rtp_play %zu samples%s%s%s%s\n", nsamples,
+            flags & UAUDIO_PAUSE ? " UAUDIO_PAUSE" : "",
+            flags & UAUDIO_RESUME ? " UAUDIO_RESUME" : "",
+            flags & UAUDIO_PLAYING ? " UAUDIO_PLAYING" : "",
+            flags & UAUDIO_PAUSED ? " UAUDIO_PAUSED" : "");
+#endif
+          
+  /* We do as much work as possible before checking what time it is */
+  /* Fill out header */
+  header.vpxcc = 2 << 6;              /* V=2, P=0, X=0, CC=0 */
+  header.seq = htons(rtp_sequence++);
+  header.ssrc = rtp_id;
+  header.mpt = rtp_payload;
+  /* If we've come out of a pause, set the marker bit */
+  if(flags & UAUDIO_RESUME)
+    header.mpt |= 0x80;
+#if !WORDS_BIGENDIAN
+  /* Convert samples to network byte order */
+  uint16_t *u = buffer, *const limit = u + nsamples;
+  while(u < limit) {
+    *u = htons(*u);
+    ++u;
+  }
+#endif
+  vec[0].iov_base = (void *)&header;
+  vec[0].iov_len = sizeof header;
+  vec[1].iov_base = buffer;
+  vec[1].iov_len = nsamples * uaudio_sample_size;
+  const uint32_t timestamp = uaudio_schedule_sync();
+  header.timestamp = htonl(rtp_base + (uint32_t)timestamp);
+  /* If we're paused don't actually end a packet, we just pretend */
+  if(flags & UAUDIO_PAUSED) {
+    uaudio_schedule_sent(nsamples);
+    return nsamples;
+  }
+  int written_bytes;
+  do {
+    written_bytes = writev(rtp_fd, vec, 2);
+  } while(written_bytes < 0 && errno == EINTR);
+  if(written_bytes < 0) {
+    error(errno, "error transmitting audio data");
+    ++rtp_errors;
+    if(rtp_errors == 10)
+      fatal(0, "too many audio tranmission errors");
+    return 0;
+  } else
+    rtp_errors /= 2;                    /* gradual decay */
+  /* TODO what can we sensibly do about short writes here?  Really that's just
+   * an error and we ought to be using smaller packets. */
+  uaudio_schedule_sent(nsamples);
+  return nsamples;
+}
+
+static void rtp_open(void) {
+  struct addrinfo *res, *sres;
+  static const int one = 1;
+  int sndbuf, target_sndbuf = 131072;
+  socklen_t len;
+  struct netaddress dst[1], src[1];
+  
+  /* Get configuration */
+  rtp_get_netconfig("rtp-destination-af",
+                    "rtp-destination",
+                    "rtp-destination-port",
+                    dst);
+  rtp_get_netconfig("rtp-source-af",
+                    "rtp-source",
+                    "rtp-source-port",
+                    src);
+  /* ...microseconds */
+
+  /* Resolve addresses */
+  res = netaddress_resolve(dst, 0, IPPROTO_UDP);
+  if(!res)
+    exit(-1);
+  if(src->af != -1) {
+    sres = netaddress_resolve(src, 1, IPPROTO_UDP);
+    if(!sres)
+      exit(-1);
+  } else
+    sres = 0;
+  /* Create the socket */
+  if((rtp_fd = socket(res->ai_family,
+                      res->ai_socktype,
+                      res->ai_protocol)) < 0)
+    fatal(errno, "error creating broadcast socket");
+  if(multicast(res->ai_addr)) {
+    /* Enable multicast options */
+    const int ttl = atoi(uaudio_get("multicast-ttl", "1"));
+    const int loop = !strcmp(uaudio_get("multicast-loop", "yes"), "yes");
+    switch(res->ai_family) {
+    case PF_INET: {
+      if(setsockopt(rtp_fd, IPPROTO_IP, IP_MULTICAST_TTL,
+                    &ttl, sizeof ttl) < 0)
+        fatal(errno, "error setting IP_MULTICAST_TTL on multicast socket");
+      if(setsockopt(rtp_fd, IPPROTO_IP, IP_MULTICAST_LOOP,
+                    &loop, sizeof loop) < 0)
+        fatal(errno, "error setting IP_MULTICAST_LOOP on multicast socket");
+      break;
+    }
+    case PF_INET6: {
+      if(setsockopt(rtp_fd, IPPROTO_IPV6, IPV6_MULTICAST_HOPS,
+                    &ttl, sizeof ttl) < 0)
+        fatal(errno, "error setting IPV6_MULTICAST_HOPS on multicast socket");
+      if(setsockopt(rtp_fd, IPPROTO_IP, IPV6_MULTICAST_LOOP,
+                    &loop, sizeof loop) < 0)
+        fatal(errno, "error setting IPV6_MULTICAST_LOOP on multicast socket");
+      break;
+    }
+    default:
+      fatal(0, "unsupported address family %d", res->ai_family);
+    }
+    info("multicasting on %s TTL=%d loop=%s", 
+         format_sockaddr(res->ai_addr), ttl, loop ? "yes" : "no");
+  } else {
+    struct ifaddrs *ifs;
+
+    if(getifaddrs(&ifs) < 0)
+      fatal(errno, "error calling getifaddrs");
+    while(ifs) {
+      /* (At least on Darwin) IFF_BROADCAST might be set but ifa_broadaddr
+       * still a null pointer.  It turns out that there's a subsequent entry
+       * for he same interface which _does_ have ifa_broadaddr though... */
+      if((ifs->ifa_flags & IFF_BROADCAST)
+         && ifs->ifa_broadaddr
+         && sockaddr_equal(ifs->ifa_broadaddr, res->ai_addr))
+        break;
+      ifs = ifs->ifa_next;
+    }
+    if(ifs) {
+      if(setsockopt(rtp_fd, SOL_SOCKET, SO_BROADCAST, &one, sizeof one) < 0)
+        fatal(errno, "error setting SO_BROADCAST on broadcast socket");
+      info("broadcasting on %s (%s)", 
+           format_sockaddr(res->ai_addr), ifs->ifa_name);
+    } else
+      info("unicasting on %s", format_sockaddr(res->ai_addr));
+  }
+  /* Enlarge the socket buffer */
+  len = sizeof sndbuf;
+  if(getsockopt(rtp_fd, SOL_SOCKET, SO_SNDBUF,
+                &sndbuf, &len) < 0)
+    fatal(errno, "error getting SO_SNDBUF");
+  if(target_sndbuf > sndbuf) {
+    if(setsockopt(rtp_fd, SOL_SOCKET, SO_SNDBUF,
+                  &target_sndbuf, sizeof target_sndbuf) < 0)
+      error(errno, "error setting SO_SNDBUF to %d", target_sndbuf);
+    else
+      info("changed socket send buffer size from %d to %d",
+           sndbuf, target_sndbuf);
+  } else
+    info("default socket send buffer is %d",
+         sndbuf);
+  /* We might well want to set additional broadcast- or multicast-related
+   * options here */
+  if(sres && bind(rtp_fd, sres->ai_addr, sres->ai_addrlen) < 0)
+    fatal(errno, "error binding broadcast socket to %s", 
+          format_sockaddr(sres->ai_addr));
+  if(connect(rtp_fd, res->ai_addr, res->ai_addrlen) < 0)
+    fatal(errno, "error connecting broadcast socket to %s", 
+          format_sockaddr(res->ai_addr));
+}
+
+static void rtp_start(uaudio_callback *callback,
+                      void *userdata) {
+  /* We only support L16 (but we do stereo and mono and will convert sign) */
+  if(uaudio_channels == 2
+     && uaudio_bits == 16
+     && uaudio_rate == 44100)
+    rtp_payload = 10;
+  else if(uaudio_channels == 1
+     && uaudio_bits == 16
+     && uaudio_rate == 44100)
+    rtp_payload = 11;
+  else
+    fatal(0, "asked for %d/%d/%d 16/44100/1 and 16/44100/2",
+          uaudio_bits, uaudio_rate, uaudio_channels); 
+  /* Various fields are required to have random initial values by RFC3550.  The
+   * packet contents are highly public so there's no point asking for very
+   * strong randomness. */
+  gcry_create_nonce(&rtp_id, sizeof rtp_id);
+  gcry_create_nonce(&rtp_base, sizeof rtp_base);
+  gcry_create_nonce(&rtp_sequence, sizeof rtp_sequence);
+  rtp_open();
+  uaudio_schedule_init();
+  uaudio_thread_start(callback,
+                      userdata,
+                      rtp_play,
+                      256 / uaudio_sample_size,
+                      (NETWORK_BYTES - sizeof(struct rtp_header))
+                      / uaudio_sample_size,
+                      0);
+}
+
+static void rtp_stop(void) {
+  uaudio_thread_stop();
+  close(rtp_fd);
+  rtp_fd = -1;
+}
+
+static void rtp_configure(void) {
+  char buffer[64];
+
+  rtp_set_netconfig("rtp-destination-af",
+                    "rtp-destination",
+                    "rtp-destination-port", &config->broadcast);
+  rtp_set_netconfig("rtp-source-af",
+                    "rtp-source",
+                    "rtp-source-port", &config->broadcast_from);
+  snprintf(buffer, sizeof buffer, "%ld", config->multicast_ttl);
+  uaudio_set("multicast-ttl", buffer);
+  uaudio_set("multicast-loop", config->multicast_loop ? "yes" : "no");
+}
+
+const struct uaudio uaudio_rtp = {
+  .name = "rtp",
+  .options = rtp_options,
+  .start = rtp_start,
+  .stop = rtp_stop,
+  .activate = uaudio_thread_activate,
+  .deactivate = uaudio_thread_deactivate,
+  .configure = rtp_configure,
+};
+
+/*
+Local Variables:
+c-basic-offset:2
+comment-column:40
+fill-column:79
+indent-tabs-mode:nil
+End:
+*/
diff --git a/lib/uaudio-schedule.c b/lib/uaudio-schedule.c
new file mode 100644 (file)
index 0000000..361681b
--- /dev/null
@@ -0,0 +1,165 @@
+/*
+ * This file is part of DisOrder.
+ * Copyright (C) 2009 Richard Kettlewell
+ *
+ * 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 3 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, see <http://www.gnu.org/licenses/>.
+ */
+/** @file lib/uaudio-schedule.c
+ * @brief Scheduler for RTP and command backends
+ *
+ * These functions ensure that audio is only written at approximately the rate
+ * it should play at, allowing pause to function properly.
+ *
+ * OSS and ALSA we expect to be essentially synchronous (though we could use
+ * this code if they don't play nicely).  Core Audio sorts out its own timing
+ * issues itself.
+ *
+ * The sequence numbers are intended for RTP's use but it's more convenient to
+ * maintain them here.
+ *
+ * The basic idea:
+ * - we maintain a base time
+ * - we calculate from this how many samples SHOULD have been sent by now
+ * - we compare this with the number of samples sent so far
+ * - we use this to wait until we're ready to send something
+ * - it's up to the caller to send nothing, or send 0s, if it's supposed to
+ *   be paused
+ *
+ * An implication of this is that the caller must still call
+ * uaudio_schedule_sync() when deactivated (paused) and pretend to send 0s.
+ */
+
+#include "common.h"
+
+#include <unistd.h>
+#include <time.h>
+#include <errno.h>
+
+#include "uaudio.h"
+#include "mem.h"
+#include "log.h"
+#include "syscalls.h"
+#include "timeval.h"
+
+/** @brief Sample timestamp
+ *
+ * This is the timestamp that will be used on the next outbound packet.
+ *
+ * The timestamp in an RTP packet header is only 32 bits wide.  With 44100Hz
+ * stereo, that only gives about half a day before wrapping, which is not
+ * particularly convenient for certain debugging purposes.  Therefore the
+ * timestamp is maintained as a 64-bit integer, giving around six million years
+ * before wrapping, and truncated to 32 bits when transmitting.
+ */
+static uint64_t timestamp;
+
+/** @brief Base time
+ *
+ * This is the base time that corresponds to a timestamp of 0.
+ */
+struct timeval base;
+
+/** @brief Synchronize playback operations against real time
+ * @return Sample number
+ *
+ */
+uint32_t uaudio_schedule_sync(void) {
+  const unsigned rate = uaudio_rate * uaudio_channels;
+  struct timeval now;
+
+  xgettimeofday(&now, NULL);
+  /* If we're just starting then we might as well send as much as possible
+   * straight away. */
+  if(!base.tv_sec) {
+    base = now;
+    return timestamp;
+  }
+  /* Calculate how many microseconds ahead of the base time we are */
+  uint64_t us = tvsub_us(now, base);
+  /* Calculate how many samples that is */
+  uint64_t samples = us * rate / 1000000;
+  /* So...
+   *
+   * We've actually sent 'timestamp' samples so far.
+   *
+   * We OUGHT to have sent 'samples' samples so far.
+   *
+   * Suppose it's the SECOND call.  timestamp will be (say) 716.  'samples'
+   * will be (say) 10 - there's been a bit of scheduling delay.  So in that
+   * case we should wait for 716-10=706 samples worth of time before we can
+   * even send one sample.
+   *
+   * So we wait that long and send our 716 samples.
+   *
+   * On the next call we'll have timestamp=1432 and samples=726, say.  So we
+   * wait and send again.
+   *
+   * On the next call there's been a bit of a delay.  timestamp=2148 but
+   * samples=2200.  So we send our 716 samples immediately.
+   *
+   * If the delay had been longer we might sent further packets back to back to
+   * make up for it.
+   *
+   * Now timestamp=2864 and samples=2210 (say).  Now we're back to waiting.
+   */
+  if(samples < timestamp) {
+    /* We should delay a bit */
+    int64_t wait_samples = timestamp - samples;
+    int64_t wait_ns = wait_samples * 1000000000 / rate;
+    
+    struct timespec ts[1];
+    ts->tv_sec = wait_ns / 1000000000;
+    ts->tv_nsec = wait_ns % 1000000000;
+#if 0
+    fprintf(stderr,
+            "samples=%8"PRIu64" timestamp=%8"PRIu64" wait=%"PRId64" (%"PRId64"ns)\n",
+            samples, timestamp, wait_samples, wait_ns);
+#endif
+    while(nanosleep(ts, ts) < 0 && errno == EINTR)
+      ;
+  } else {
+#if 0
+    fprintf(stderr, "samples=%8"PRIu64" timestamp=%8"PRIu64"\n",
+            samples, timestamp);
+#endif
+  }
+  /* If samples >= timestamp then it's time, or gone time, to play the
+   * timestamp'th sample.  So we return immediately. */
+  return timestamp;
+}
+
+/** @brief Report how many samples we actually sent
+ * @param nsamples Number of samples sent
+ */
+void uaudio_schedule_sent(size_t nsamples_sent) {
+  timestamp += nsamples_sent;
+}
+
+/** @brief Initialize audio scheduling
+ *
+ * Should be called from your API's @c start callback.
+ */
+void uaudio_schedule_init(void) {
+  /* uaudio_schedule_play() will spot this and choose an initial value */
+  base.tv_sec = 0;
+}
+
+/*
+Local Variables:
+c-basic-offset:2
+comment-column:40
+fill-column:79
+indent-tabs-mode:nil
+End:
+*/
diff --git a/lib/uaudio-thread.c b/lib/uaudio-thread.c
new file mode 100644 (file)
index 0000000..f04b84b
--- /dev/null
@@ -0,0 +1,294 @@
+/*
+ * This file is part of DisOrder.
+ * Copyright (C) 2009 Richard Kettlewell
+ *
+ * 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 3 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, see <http://www.gnu.org/licenses/>.
+ */
+/** @file lib/uaudio-thread.c
+ * @brief Background thread for audio processing */
+#include "common.h"
+
+#include <pthread.h>
+#include <unistd.h>
+
+#include "uaudio.h"
+#include "log.h"
+#include "mem.h"
+
+/** @brief Number of buffers
+ *
+ * Must be at least 2 and should normally be at least 3.  We maintain multiple
+ * buffers so that we can read new data into one while the previous is being
+ * played.
+ */
+#define UAUDIO_THREAD_BUFFERS 4
+
+/** @brief Buffer data structure */
+struct uaudio_buffer {
+  /** @brief Pointer to sample data */
+  void *samples;
+
+  /** @brief Count of samples */
+  size_t nsamples;
+};
+
+/** @brief Input buffers
+ *
+ * This is actually a ring buffer, managed by @ref uaudio_collect_buffer and
+ * @ref uaudio_play_buffer.
+ *
+ * Initially both pointers are 0.  Whenever the pointers are equal, we
+ * interpreted this as meaning that there is no data stored at all.  A
+ * consequence of this is that maximal occupancy is when the collect point is
+ * just before the play point, so at least one buffer is always empty (hence it
+ * being good for @ref UAUDIO_THREAD_BUFFERS to be at least 3).
+ */
+static struct uaudio_buffer uaudio_buffers[UAUDIO_THREAD_BUFFERS];
+
+/** @brief Buffer to read into */
+static unsigned uaudio_collect_buffer;
+
+/** @brief Buffer to play from */
+static unsigned uaudio_play_buffer;
+
+/** @brief Collection thread ID */
+static pthread_t uaudio_collect_thread;
+
+/** @brief Playing thread ID */
+static pthread_t uaudio_play_thread;
+
+/** @brief Flags */
+static unsigned uaudio_thread_flags;
+
+static uaudio_callback *uaudio_thread_collect_callback;
+static uaudio_playcallback *uaudio_thread_play_callback;
+static void *uaudio_thread_userdata;
+static int uaudio_thread_started;
+static int uaudio_thread_collecting;
+static pthread_mutex_t uaudio_thread_lock = PTHREAD_MUTEX_INITIALIZER;
+static pthread_cond_t uaudio_thread_cond = PTHREAD_COND_INITIALIZER;
+
+/** @brief Minimum number of samples per chunk */
+static size_t uaudio_thread_min;
+
+/** @brief Maximum number of samples per chunk */
+static size_t uaudio_thread_max;
+
+/** @brief Set when activated, clear when paused */
+static int uaudio_thread_activated;
+
+/** @brief Return number of buffers currently in use */
+static int uaudio_buffers_used(void) {
+  return (uaudio_collect_buffer - uaudio_play_buffer) % UAUDIO_THREAD_BUFFERS;
+}
+
+/** @brief Background thread for audio collection
+ *
+ * Collects data while activated and communicates its status via @ref
+ * uaudio_thread_collecting.
+ */
+static void *uaudio_collect_thread_fn(void attribute((unused)) *arg) {
+  pthread_mutex_lock(&uaudio_thread_lock);
+  while(uaudio_thread_started) {
+    /* Wait until we're activatd */
+    if(!uaudio_thread_activated) {
+      pthread_cond_wait(&uaudio_thread_cond, &uaudio_thread_lock);
+      continue;
+    }
+    /* We are definitely active now */
+    uaudio_thread_collecting = 1;
+    pthread_cond_broadcast(&uaudio_thread_cond);
+    while(uaudio_thread_activated) {
+      if(uaudio_buffers_used() < UAUDIO_THREAD_BUFFERS - 1) {
+        /* At least one buffer is available.  We release the lock while
+         * collecting data so that other already-filled buffers can be played
+         * without delay.  */
+        struct uaudio_buffer *const b = &uaudio_buffers[uaudio_collect_buffer];
+        pthread_mutex_unlock(&uaudio_thread_lock);
+        //fprintf(stderr, "C%d.", uaudio_collect_buffer);
+        
+        /* Keep on trying until we get the minimum required amount of data */
+        b->nsamples = 0;
+        if(uaudio_thread_activated) {
+          while(b->nsamples < uaudio_thread_min) {
+            b->nsamples += uaudio_thread_collect_callback
+              ((char *)b->samples
+               + b->nsamples * uaudio_sample_size,
+               uaudio_thread_max - b->nsamples,
+               uaudio_thread_userdata);
+          }
+        }
+        pthread_mutex_lock(&uaudio_thread_lock);
+        /* Advance to next buffer */
+        uaudio_collect_buffer = (1 + uaudio_collect_buffer) % UAUDIO_THREAD_BUFFERS;
+        /* Awaken player */
+        pthread_cond_broadcast(&uaudio_thread_cond);
+      } else
+        /* No space, wait for player */
+        pthread_cond_wait(&uaudio_thread_cond, &uaudio_thread_lock);
+    }
+    uaudio_thread_collecting = 0;
+    pthread_cond_broadcast(&uaudio_thread_cond);
+  }
+  pthread_mutex_unlock(&uaudio_thread_lock);
+  return NULL;
+}
+
+/** @brief Background thread for audio playing 
+ *
+ * This thread plays data as long as there is something to play.  So the
+ * buffers will drain to empty before deactivation completes.
+ */
+static void *uaudio_play_thread_fn(void attribute((unused)) *arg) {
+  int resync = 1;
+  unsigned last_flags = 0;
+  unsigned char zero[uaudio_thread_max * uaudio_sample_size];
+  memset(zero, 0, sizeof zero);
+
+  while(uaudio_thread_started) {
+    // If we're paused then just play silence
+    if(!uaudio_thread_activated) {
+      pthread_mutex_unlock(&uaudio_thread_lock);
+      unsigned flags = UAUDIO_PAUSED;
+      if(last_flags & UAUDIO_PLAYING)
+        flags |= UAUDIO_PAUSE;
+      uaudio_thread_play_callback(zero, uaudio_thread_max,
+                                  last_flags = flags);
+      /* We expect the play callback to block for a reasonable period */
+      pthread_mutex_lock(&uaudio_thread_lock);
+      continue;
+    }
+    const int used = uaudio_buffers_used();
+    int go;
+
+    if(resync)
+      go = (used == UAUDIO_THREAD_BUFFERS - 1);
+    else
+      go = (used > 0);
+    if(go) {
+      /* At least one buffer is filled.  We release the lock while playing so
+       * that more collection can go on. */
+      struct uaudio_buffer *const b = &uaudio_buffers[uaudio_play_buffer];
+      pthread_mutex_unlock(&uaudio_thread_lock);
+      //fprintf(stderr, "P%d.", uaudio_play_buffer);
+      size_t played = 0;
+      while(played < b->nsamples) {
+        unsigned flags = UAUDIO_PLAYING;
+        if(last_flags & UAUDIO_PAUSED)
+          flags |= UAUDIO_RESUME;
+        played += uaudio_thread_play_callback((char *)b->samples
+                                              + played * uaudio_sample_size,
+                                              b->nsamples - played,
+                                              last_flags = flags);
+      }
+      pthread_mutex_lock(&uaudio_thread_lock);
+      /* Move to next buffer */
+      uaudio_play_buffer = (1 + uaudio_play_buffer) % UAUDIO_THREAD_BUFFERS;
+      /* Awaken collector */
+      pthread_cond_broadcast(&uaudio_thread_cond);
+      resync = 0;
+    } else {
+      /* Insufficient data to play, wait for collector */
+      pthread_cond_wait(&uaudio_thread_cond, &uaudio_thread_lock);
+      /* (Still) re-synchronizing */
+      resync = 1;
+    }
+  }
+  pthread_mutex_unlock(&uaudio_thread_lock);
+  return NULL;
+}
+
+/** @brief Create background threads for audio processing 
+ * @param callback Callback to collect audio data
+ * @param userdata Passed to @p callback
+ * @param playcallback Callback to play audio data
+ * @param min Minimum number of samples to play in a chunk
+ * @param max Maximum number of samples to play in a chunk
+ * @param flags Flags (not currently used)
+ *
+ * @p callback will be called multiple times in quick succession if necessary
+ * to gather at least @p min samples.  Equally @p playcallback may be called
+ * repeatedly in quick succession to play however much was received in a single
+ * chunk.
+ */
+void uaudio_thread_start(uaudio_callback *callback,
+                        void *userdata,
+                        uaudio_playcallback *playcallback,
+                        size_t min,
+                         size_t max,
+                         unsigned flags) {
+  int e;
+  uaudio_thread_collect_callback = callback;
+  uaudio_thread_userdata = userdata;
+  uaudio_thread_play_callback = playcallback;
+  uaudio_thread_min = min;
+  uaudio_thread_max = max;
+  uaudio_thread_flags = flags;
+  uaudio_thread_started = 1;
+  uaudio_thread_activated = 0;
+  for(int n = 0; n < UAUDIO_THREAD_BUFFERS; ++n)
+    uaudio_buffers[n].samples = xcalloc_noptr(uaudio_thread_max,
+                                              uaudio_sample_size);
+  uaudio_collect_buffer = uaudio_play_buffer = 0;
+  if((e = pthread_create(&uaudio_collect_thread,
+                         NULL,
+                         uaudio_collect_thread_fn,
+                         NULL)))
+    fatal(e, "pthread_create");
+  if((e = pthread_create(&uaudio_play_thread,
+                         NULL,
+                         uaudio_play_thread_fn,
+                         NULL)))
+    fatal(e, "pthread_create");
+}
+
+/** @brief Shut down background threads for audio processing */
+void uaudio_thread_stop(void) {
+  void *result;
+
+  pthread_mutex_lock(&uaudio_thread_lock);
+  uaudio_thread_activated = 0;
+  uaudio_thread_started = 0;
+  pthread_cond_broadcast(&uaudio_thread_cond);
+  pthread_mutex_unlock(&uaudio_thread_lock);
+  pthread_join(uaudio_collect_thread, &result);
+  pthread_join(uaudio_play_thread, &result);
+  for(int n = 0; n < UAUDIO_THREAD_BUFFERS; ++n)
+    xfree(uaudio_buffers[n].samples);
+}
+
+/** @brief Activate audio output */
+void uaudio_thread_activate(void) {
+  pthread_mutex_lock(&uaudio_thread_lock);
+  uaudio_thread_activated = 1;
+  pthread_cond_broadcast(&uaudio_thread_cond);
+  pthread_mutex_unlock(&uaudio_thread_lock);
+}
+
+/** @brief Deactivate audio output */
+void uaudio_thread_deactivate(void) {
+  pthread_mutex_lock(&uaudio_thread_lock);
+  uaudio_thread_activated = 0; 
+  pthread_cond_broadcast(&uaudio_thread_cond);
+  pthread_mutex_unlock(&uaudio_thread_lock);
+}
+
+/*
+Local Variables:
+c-basic-offset:2
+comment-column:40
+fill-column:79
+indent-tabs-mode:nil
+End:
+*/
diff --git a/lib/uaudio.c b/lib/uaudio.c
new file mode 100644 (file)
index 0000000..e793045
--- /dev/null
@@ -0,0 +1,107 @@
+/*
+ * This file is part of DisOrder.
+ * Copyright (C) 2009 Richard Kettlewell
+ *
+ * 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 3 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, see <http://www.gnu.org/licenses/>.
+ */
+
+/** @file lib/uaudio.c
+ * @brief Uniform audio interface
+ */
+
+#include "common.h"
+#include "uaudio.h"
+#include "hash.h"
+#include "mem.h"
+#include "log.h"
+
+/** @brief Options for chosen uaudio API */
+static hash *uaudio_options;
+
+/** @brief Sample rate (Hz) */
+int uaudio_rate;
+
+/** @brief Bits per channel */
+int uaudio_bits;
+
+/** @brief Number of channels */
+int uaudio_channels;
+
+/** @brief Whether samples are signed or unsigned */
+int uaudio_signed;
+
+/** @brief Sample size in bytes
+ *
+ * NB one sample is a single point sample; up to @c uaudio_channels samples may
+ * play at the same time through different speakers.  Thus this value is
+ * independent of @ref uaudio_channels.
+ */
+size_t uaudio_sample_size;
+
+/** @brief Set a uaudio option */
+void uaudio_set(const char *name, const char *value) {
+  if(!value) {
+    if(uaudio_options)
+      hash_remove(uaudio_options, name);
+    return;
+  }
+  if(!uaudio_options)
+    uaudio_options = hash_new(sizeof(char *));
+  value = xstrdup(value);
+  hash_add(uaudio_options, name, &value, HASH_INSERT_OR_REPLACE);
+}
+
+/** @brief Get a uaudio option */
+char *uaudio_get(const char *name, const char *default_value) {
+  if(!uaudio_options)
+    return default_value ? xstrdup(default_value) : 0;
+  char **valuep = hash_find(uaudio_options, name);
+  if(!valuep)
+    return default_value ? xstrdup(default_value) : 0;
+  return xstrdup(*valuep);
+}
+
+/** @brief Set sample format 
+ * @param rate Sample rate in KHz
+ * @param channels Number of channels (i.e. 2 for stereo)
+ * @param bits Number of bits per channel (typically 8 or 16)
+ * @param signed_ True for signed samples, false for unsigned
+ *
+ * Sets @ref uaudio_rate, @ref uaudio_channels, @ref uaudio_bits, @ref
+ * uaudio_signed and @ref uaudio_sample_size.
+ *
+ * Currently there is no way to specify non-native endian formats even if the
+ * underlying API can conveniently handle them.  Actually this would be quite
+ * convenient for playrtp, so it might be added at some point.
+ *
+ * Not all APIs can support all sample formats.  Generally the @c start
+ * function will do some error checking but some may be deferred to the point
+ * the device is opened (which might be @c activate).
+ */
+void uaudio_set_format(int rate, int channels, int bits, int signed_) {
+  uaudio_rate = rate;
+  uaudio_channels = channels;
+  uaudio_bits = bits;
+  uaudio_signed = signed_;
+  uaudio_sample_size = bits / CHAR_BIT;
+}
+
+/*
+Local Variables:
+c-basic-offset:2
+comment-column:40
+fill-column:79
+indent-tabs-mode:nil
+End:
+*/
diff --git a/lib/uaudio.h b/lib/uaudio.h
new file mode 100644 (file)
index 0000000..6592d53
--- /dev/null
@@ -0,0 +1,202 @@
+/*
+ * This file is part of DisOrder.
+ * Copyright (C) 2009 Richard Kettlewell
+ *
+ * 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 3 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, see <http://www.gnu.org/licenses/>.
+ */
+
+/** @file lib/uaudio.h
+ * @brief Uniform audio interface
+ */
+
+#ifndef UAUDIO_H
+#define UAUDIO_H
+
+extern int uaudio_rate;
+extern int uaudio_bits;
+extern int uaudio_channels;
+extern int uaudio_signed;
+extern size_t uaudio_sample_size;
+
+/** @brief Callback to get audio data
+ * @param buffer Where to put audio data
+ * @param max_samples How many samples to supply
+ * @param userdata As passed to uaudio_open()
+ * @return Number of samples filled
+ *
+ * This function should not block if possible (better to fill the buffer with
+ * 0s) and should definitely not block indefinitely.  This great caution with
+ * any locks or syscalls!  In particular avoid it taking a lock that may be
+ * held while any of the @ref uaudio members are called.
+ *
+ * If it's more convenient, it's OK to return less than the maximum number of
+ * samples (including 0) provided you expect to be called again for more
+ * samples immediately.
+ */
+typedef size_t uaudio_callback(void *buffer,
+                               size_t max_samples,
+                               void *userdata);
+
+/** @brief Callback to play audio data
+ * @param buffer Pointer to audio buffer
+ * @param samples Number of samples to play
+ * @param flags Flags word
+ * @return Number of samples played
+ *
+ * Used with uaudio_thread_start() etc.
+ *
+ * @p flags is a bitmap giving the current pause state and transitions:
+ * - @ref UAUDIO_PAUSE if this is the first call of a pause
+ * - @ref UAUDIO_RESUME if this is the first call of a resumse
+ * - @ref UAUDIO_PLAYING if this is outside a pause
+ * - @ref UAUDIO_PAUSED if this is in a pause
+ *
+ * During a pause, the sample data is guaranteed to be 0.
+ */
+typedef size_t uaudio_playcallback(void *buffer, size_t samples,
+                                   unsigned flags);
+
+/** @brief Start of a pause */
+#define UAUDIO_PAUSE 0x0001
+
+/** @brief End of a pause */
+#define UAUDIO_RESUME 0x0002
+
+/** @brief Currently playing */
+#define UAUDIO_PLAYING 0x0004
+
+/** @brief Currently paused */
+#define UAUDIO_PAUSED 0x0008
+
+/** @brief Audio API definition */
+struct uaudio {
+  /** @brief Name of this API */
+  const char *name;
+
+  /** @brief List of options, terminated by NULL */
+  const char *const *options;
+
+  /** @brief Do slow setup
+   * @param ua Handle returned by uaudio_open()
+   * @param callback Called for audio data
+   * @param userdata Passed to @p callback
+   *
+   * This does resource-intensive setup for the output device.
+   *
+   * For instance it might open mixable audio devices or network sockets.  It
+   * will create any background thread required.  However, it must not exclude
+   * other processes from outputting sound.
+   */
+  void (*start)(uaudio_callback *callback,
+                void *userdata);
+
+  /** @brief Tear down
+   * @param ua Handle returned by uaudio_open()
+   *
+   * This undoes the effect of @c start.
+   */
+  void (*stop)(void);
+
+  /** @brief Enable output
+   *
+   * A background thread will start calling @c callback as set by @c
+   * start and playing the audio data received from it.
+   */
+  void (*activate)(void);
+
+  /** @brief Disable output
+   *
+   * The background thread will stop calling @c callback.
+   */
+  void (*deactivate)(void);
+
+  /** @brief Open mixer device */
+  void (*open_mixer)(void);
+
+  /** @brief Closer mixer device */
+  void (*close_mixer)(void);
+
+  /** @brief Get volume
+   * @param left Where to put the left-channel value
+   * @param right Where to put the right-channel value
+   *
+   * 0 is silent and 100 is maximum volume.
+   */
+  void (*get_volume)(int *left, int *right);
+
+  /** @brief Set volume
+   * @param left Pointer to left-channel value (updated)
+   * @param right Pointer to right-channel value (updated)
+   *
+   * The values are updated with those actually set by the underlying system
+   * call.
+   *
+   * 0 is silent and 100 is maximum volume.
+   */
+  void (*set_volume)(int *left, int *right);
+
+  /** @brief Set configuration */
+  void (*configure)(void);
+  
+};
+
+void uaudio_set_format(int rate, int channels, int samplesize, int signed_);
+void uaudio_set(const char *name, const char *value);
+char *uaudio_get(const char *name, const char *default_value);
+void uaudio_thread_start(uaudio_callback *callback,
+                        void *userdata,
+                        uaudio_playcallback *playcallback,
+                        size_t min,
+                         size_t max,
+                         unsigned flags);
+
+void uaudio_thread_stop(void);
+void uaudio_thread_activate(void);
+void uaudio_thread_deactivate(void);
+uint32_t uaudio_schedule_sync(void);
+void uaudio_schedule_sent(size_t nsamples_sent);
+void uaudio_schedule_init(void);
+const struct uaudio *uaudio_find(const char *name);
+
+extern uint64_t uaudio_schedule_timestamp;
+extern int uaudio_schedule_reactivated;
+
+#if HAVE_COREAUDIO_AUDIOHARDWARE_H
+extern const struct uaudio uaudio_coreaudio;
+#endif
+
+#if HAVE_ALSA_ASOUNDLIB_H
+extern const struct uaudio uaudio_alsa;
+#endif
+
+#if HAVE_SYS_SOUNDCARD_H || EMPEG_HOST
+extern const struct uaudio uaudio_oss;
+#endif
+
+extern const struct uaudio uaudio_rtp;
+
+extern const struct uaudio uaudio_command;
+
+extern const struct uaudio *const uaudio_apis[];
+
+#endif /* UAUDIO_H */
+
+/*
+Local Variables:
+c-basic-offset:2
+comment-column:40
+fill-column:79
+indent-tabs-mode:nil
+End:
+*/
index 3adbea0..675f703 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * This file is part of DisOrder
- * Copyright (C) 2007 Richard Kettlewell
+ * Copyright (C) 2007, 2009 Richard Kettlewell
  *
  * 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
@@ -603,6 +603,12 @@ int utf32_iterator_grapheme_boundary(utf32_iterator it) {
   /* GB9 */
   if(gbafter == unicode_Grapheme_Break_Extend)
     return 0;
+  /* GB9a */
+  if(gbafter == unicode_Grapheme_Break_SpacingMark)
+    return 0;
+  /* GB9b */
+  if(gbbefore == unicode_Grapheme_Break_Prepend)
+    return 0;
   /* GB10 */
   return 1;
 
@@ -618,26 +624,39 @@ int utf32_iterator_grapheme_boundary(utf32_iterator it) {
  * string) and 0 otherwise.
  */
 int utf32_iterator_word_boundary(utf32_iterator it) {
-  enum unicode_Word_Break twobefore, before, after, twoafter;
+  uint32_t before, after;
+  enum unicode_Word_Break wbtwobefore, wbbefore, wbafter, wbtwoafter;
   size_t nn;
 
   /* WB1 and WB2 */
   if(it->n == 0 || it->n == it->ns)
     return 1;
+  before = it->s[it->n-1];
+  after = it->s[it->n];
   /* WB3 */
-  if(it->s[it->n-1] == 0x000D && it->s[it->n] == 0x000A)
+  if(before == 0x000D && after == 0x000A)
     return 0;
+  /* WB3a */
+  if(utf32__iterator_word_break(it, before) == unicode_Word_Break_Newline
+     || before == 0x000D
+     || before == 0x000A)
+    return 1;
+  /* WB3b */
+  if(utf32__iterator_word_break(it, after) == unicode_Word_Break_Newline
+     || after == 0x000D
+     || after == 0x000A)
+    return 1;
   /* WB4 */
   /* (!Sep) x (Extend|Format) as in UAX #29 s6.2 */
-  if(utf32__sentence_break(it->s[it->n-1]) != unicode_Sentence_Break_Sep
-     && utf32__boundary_ignorable(utf32__iterator_word_break(it, it->s[it->n])))
+  if(utf32__sentence_break(before) != unicode_Sentence_Break_Sep
+     && utf32__boundary_ignorable(utf32__iterator_word_break(it, after)))
     return 0;
   /* Gather the property values we'll need for the rest of the test taking the
    * s6.2 changes into account */
   /* First we look at the code points after the proposed boundary */
   nn = it->n;                           /* <it->ns */
-  after = utf32__iterator_word_break(it, it->s[nn++]);
-  if(!utf32__boundary_ignorable(after)) {
+  wbafter = utf32__iterator_word_break(it, it->s[nn++]);
+  if(!utf32__boundary_ignorable(wbafter)) {
     /* X (Extend|Format)* -> X */
     while(nn < it->ns
           && utf32__boundary_ignorable(utf32__iterator_word_break(it,
@@ -646,67 +665,71 @@ int utf32_iterator_word_boundary(utf32_iterator it) {
   }
   /* It's possible now that nn=ns */
   if(nn < it->ns)
-    twoafter = utf32__iterator_word_break(it, it->s[nn]);
+    wbtwoafter = utf32__iterator_word_break(it, it->s[nn]);
   else
-    twoafter = unicode_Word_Break_Other;
+    wbtwoafter = unicode_Word_Break_Other;
 
   /* We've already recorded the non-ignorable code points before the proposed
    * boundary */
-  before = utf32__iterator_word_break(it, it->last[1]);
-  twobefore = utf32__iterator_word_break(it, it->last[0]);
+  wbbefore = utf32__iterator_word_break(it, it->last[1]);
+  wbtwobefore = utf32__iterator_word_break(it, it->last[0]);
 
   /* WB5 */
-  if(before == unicode_Word_Break_ALetter
-     && after == unicode_Word_Break_ALetter)
+  if(wbbefore == unicode_Word_Break_ALetter
+     && wbafter == unicode_Word_Break_ALetter)
     return 0;
   /* WB6 */
-  if(before == unicode_Word_Break_ALetter
-     && after == unicode_Word_Break_MidLetter
-     && twoafter == unicode_Word_Break_ALetter)
+  if(wbbefore == unicode_Word_Break_ALetter
+     && (wbafter == unicode_Word_Break_MidLetter
+         || wbafter == unicode_Word_Break_MidNumLet)
+     && wbtwoafter == unicode_Word_Break_ALetter)
     return 0;
   /* WB7 */
-  if(twobefore == unicode_Word_Break_ALetter
-     && before == unicode_Word_Break_MidLetter
-     && after == unicode_Word_Break_ALetter)
+  if(wbtwobefore == unicode_Word_Break_ALetter
+     && (wbbefore == unicode_Word_Break_MidLetter
+         || wbbefore == unicode_Word_Break_MidNumLet)
+     && wbafter == unicode_Word_Break_ALetter)
     return 0;
   /* WB8 */
-  if(before == unicode_Word_Break_Numeric
-     && after == unicode_Word_Break_Numeric)
+  if(wbbefore == unicode_Word_Break_Numeric
+     && wbafter == unicode_Word_Break_Numeric)
     return 0;
   /* WB9 */
-  if(before == unicode_Word_Break_ALetter
-     && after == unicode_Word_Break_Numeric)
+  if(wbbefore == unicode_Word_Break_ALetter
+     && wbafter == unicode_Word_Break_Numeric)
     return 0;
   /* WB10 */
-  if(before == unicode_Word_Break_Numeric
-     && after == unicode_Word_Break_ALetter)
+  if(wbbefore == unicode_Word_Break_Numeric
+     && wbafter == unicode_Word_Break_ALetter)
     return 0;
    /* WB11 */
-  if(twobefore == unicode_Word_Break_Numeric
-     && before == unicode_Word_Break_MidNum
-     && after == unicode_Word_Break_Numeric)
+  if(wbtwobefore == unicode_Word_Break_Numeric
+     && (wbbefore == unicode_Word_Break_MidNum
+         || wbbefore == unicode_Word_Break_MidNumLet)
+     && wbafter == unicode_Word_Break_Numeric)
     return 0;
   /* WB12 */
-  if(before == unicode_Word_Break_Numeric
-     && after == unicode_Word_Break_MidNum
-     && twoafter == unicode_Word_Break_Numeric)
+  if(wbbefore == unicode_Word_Break_Numeric
+     && (wbafter == unicode_Word_Break_MidNum
+         || wbafter == unicode_Word_Break_MidNumLet)
+     && wbtwoafter == unicode_Word_Break_Numeric)
     return 0;
   /* WB13 */
-  if(before == unicode_Word_Break_Katakana
-     && after == unicode_Word_Break_Katakana)
+  if(wbbefore == unicode_Word_Break_Katakana
+     && wbafter == unicode_Word_Break_Katakana)
     return 0;
   /* WB13a */
-  if((before == unicode_Word_Break_ALetter
-      || before == unicode_Word_Break_Numeric
-      || before == unicode_Word_Break_Katakana
-      || before == unicode_Word_Break_ExtendNumLet)
-     && after == unicode_Word_Break_ExtendNumLet)
+  if((wbbefore == unicode_Word_Break_ALetter
+      || wbbefore == unicode_Word_Break_Numeric
+      || wbbefore == unicode_Word_Break_Katakana
+      || wbbefore == unicode_Word_Break_ExtendNumLet)
+     && wbafter == unicode_Word_Break_ExtendNumLet)
     return 0;
   /* WB13b */
-  if(before == unicode_Word_Break_ExtendNumLet
-     && (after == unicode_Word_Break_ALetter
-         || after == unicode_Word_Break_Numeric
-         || after == unicode_Word_Break_Katakana))
+  if(wbbefore == unicode_Word_Break_ExtendNumLet
+     && (wbafter == unicode_Word_Break_ALetter
+         || wbafter == unicode_Word_Break_Numeric
+         || wbafter == unicode_Word_Break_Katakana))
     return 0;
   /* WB14 */
   return 1;
@@ -1358,8 +1381,10 @@ uint32_t **utf32_word_split(const uint32_t *s, size_t ns, size_t *nwp,
       }
       /* If it's a word add it to the list of results */
       if(isword) {
-        w = xcalloc(b2 - b1 + 1, sizeof(uint32_t));
-        memcpy(w, it->s + b1, (b2 - b1) * sizeof (uint32_t));
+        const size_t len = b2 - b1;
+        w = xcalloc_noptr(len + 1, sizeof(uint32_t));
+        memcpy(w, it->s + b1, len * sizeof (uint32_t));
+        w[len] = 0;
         vector32_append(v32, w);
       }
     }
index b22b5bc..87b90f5 100644 (file)
 #define GBLV unicode_Grapheme_Break_LV
 #define GBLVT unicode_Grapheme_Break_LVT
 #define GBOther unicode_Grapheme_Break_Other
+#define GBPrepend unicode_Grapheme_Break_Prepend
+#define GBSpacingMark unicode_Grapheme_Break_SpacingMark
 #define GBT unicode_Grapheme_Break_T
 #define GBV unicode_Grapheme_Break_V
 #define WBALetter unicode_Word_Break_ALetter
+#define WBCR unicode_Word_Break_CR
 #define WBExtend unicode_Word_Break_Extend
 #define WBExtendNumLet unicode_Word_Break_ExtendNumLet
 #define WBFormat unicode_Word_Break_Format
 #define WBKatakana unicode_Word_Break_Katakana
+#define WBLF unicode_Word_Break_LF
 #define WBMidLetter unicode_Word_Break_MidLetter
 #define WBMidNum unicode_Word_Break_MidNum
+#define WBMidNumLet unicode_Word_Break_MidNumLet
+#define WBNewline unicode_Word_Break_Newline
 #define WBNumeric unicode_Word_Break_Numeric
 #define WBOther unicode_Word_Break_Other
 #define SBATerm unicode_Sentence_Break_ATerm
+#define SBCR unicode_Sentence_Break_CR
 #define SBClose unicode_Sentence_Break_Close
 #define SBExtend unicode_Sentence_Break_Extend
 #define SBFormat unicode_Sentence_Break_Format
+#define SBLF unicode_Sentence_Break_LF
 #define SBLower unicode_Sentence_Break_Lower
 #define SBNumeric unicode_Sentence_Break_Numeric
 #define SBOLetter unicode_Sentence_Break_OLetter
 #define SBOther unicode_Sentence_Break_Other
+#define SBSContinue unicode_Sentence_Break_SContinue
 #define SBSTerm unicode_Sentence_Break_STerm
 #define SBSep unicode_Sentence_Break_Sep
 #define SBSp unicode_Sentence_Break_Sp
@@ -79,29 +88,38 @@ const char *const unicode_Grapheme_Break_names[] = {
   "LV",
   "LVT",
   "Other",
+  "Prepend",
+  "SpacingMark",
   "T",
   "V"
 };
 const char *const unicode_Word_Break_names[] = {
   "ALetter",
+  "CR",
   "Extend",
   "ExtendNumLet",
   "Format",
   "Katakana",
+  "LF",
   "MidLetter",
   "MidNum",
+  "MidNumLet",
+  "Newline",
   "Numeric",
   "Other"
 };
 const char *const unicode_Sentence_Break_names[] = {
   "ATerm",
+  "CR",
   "Close",
   "Extend",
   "Format",
+  "LF",
   "Lower",
   "Numeric",
   "OLetter",
   "Other",
+  "SContinue",
   "STerm",
   "Sep",
   "Sp",
@@ -2237,2670 +2255,2767 @@ dd2126[]={50,57,26085,0},
 dd2127[]={51,48,26085,0},
 dd2128[]={51,49,26085,0},
 dd2129[]={103,97,108,0},
-dd2130[]={35912,0},
-dd2131[]={26356,0},
-dd2132[]={36040,0},
-dd2133[]={28369,0},
-dd2134[]={20018,0},
-dd2135[]={21477,0},
-dd2136[]={22865,0},
-dd2137[]={21895,0},
-dd2138[]={22856,0},
-dd2139[]={25078,0},
-dd2140[]={30313,0},
-dd2141[]={32645,0},
-dd2142[]={34367,0},
-dd2143[]={34746,0},
-dd2144[]={35064,0},
-dd2145[]={37007,0},
-dd2146[]={27138,0},
-dd2147[]={27931,0},
-dd2148[]={28889,0},
-dd2149[]={29662,0},
-dd2150[]={33853,0},
-dd2151[]={37226,0},
-dd2152[]={39409,0},
-dd2153[]={20098,0},
-dd2154[]={21365,0},
-dd2155[]={27396,0},
-dd2156[]={29211,0},
-dd2157[]={34349,0},
-dd2158[]={40478,0},
-dd2159[]={23888,0},
-dd2160[]={28651,0},
-dd2161[]={34253,0},
-dd2162[]={35172,0},
-dd2163[]={25289,0},
-dd2164[]={33240,0},
-dd2165[]={34847,0},
-dd2166[]={24266,0},
-dd2167[]={26391,0},
-dd2168[]={28010,0},
-dd2169[]={29436,0},
-dd2170[]={37070,0},
-dd2171[]={20358,0},
-dd2172[]={20919,0},
-dd2173[]={21214,0},
-dd2174[]={25796,0},
-dd2175[]={27347,0},
-dd2176[]={29200,0},
-dd2177[]={30439,0},
-dd2178[]={34310,0},
-dd2179[]={34396,0},
-dd2180[]={36335,0},
-dd2181[]={38706,0},
-dd2182[]={39791,0},
-dd2183[]={40442,0},
-dd2184[]={30860,0},
-dd2185[]={31103,0},
-dd2186[]={32160,0},
-dd2187[]={33737,0},
-dd2188[]={37636,0},
-dd2189[]={35542,0},
-dd2190[]={22751,0},
-dd2191[]={24324,0},
-dd2192[]={31840,0},
-dd2193[]={32894,0},
-dd2194[]={29282,0},
-dd2195[]={30922,0},
-dd2196[]={36034,0},
-dd2197[]={38647,0},
-dd2198[]={22744,0},
-dd2199[]={23650,0},
-dd2200[]={27155,0},
-dd2201[]={28122,0},
-dd2202[]={28431,0},
-dd2203[]={32047,0},
-dd2204[]={32311,0},
-dd2205[]={38475,0},
-dd2206[]={21202,0},
-dd2207[]={32907,0},
-dd2208[]={20956,0},
-dd2209[]={20940,0},
-dd2210[]={31260,0},
-dd2211[]={32190,0},
-dd2212[]={33777,0},
-dd2213[]={38517,0},
-dd2214[]={35712,0},
-dd2215[]={25295,0},
-dd2216[]={35582,0},
-dd2217[]={20025,0},
-dd2218[]={23527,0},
-dd2219[]={24594,0},
-dd2220[]={29575,0},
-dd2221[]={30064,0},
-dd2222[]={21271,0},
-dd2223[]={30971,0},
-dd2224[]={20415,0},
-dd2225[]={24489,0},
-dd2226[]={19981,0},
-dd2227[]={27852,0},
-dd2228[]={25976,0},
-dd2229[]={32034,0},
-dd2230[]={21443,0},
-dd2231[]={22622,0},
-dd2232[]={30465,0},
-dd2233[]={33865,0},
-dd2234[]={35498,0},
-dd2235[]={27578,0},
-dd2236[]={27784,0},
-dd2237[]={25342,0},
-dd2238[]={33509,0},
-dd2239[]={25504,0},
-dd2240[]={30053,0},
-dd2241[]={20142,0},
-dd2242[]={20841,0},
-dd2243[]={20937,0},
-dd2244[]={26753,0},
-dd2245[]={31975,0},
-dd2246[]={33391,0},
-dd2247[]={35538,0},
-dd2248[]={37327,0},
-dd2249[]={21237,0},
-dd2250[]={21570,0},
-dd2251[]={24300,0},
-dd2252[]={26053,0},
-dd2253[]={28670,0},
-dd2254[]={31018,0},
-dd2255[]={38317,0},
-dd2256[]={39530,0},
-dd2257[]={40599,0},
-dd2258[]={40654,0},
-dd2259[]={26310,0},
-dd2260[]={27511,0},
-dd2261[]={36706,0},
-dd2262[]={24180,0},
-dd2263[]={24976,0},
-dd2264[]={25088,0},
-dd2265[]={25754,0},
-dd2266[]={28451,0},
-dd2267[]={29001,0},
-dd2268[]={29833,0},
-dd2269[]={31178,0},
-dd2270[]={32244,0},
-dd2271[]={32879,0},
-dd2272[]={36646,0},
-dd2273[]={34030,0},
-dd2274[]={36899,0},
-dd2275[]={37706,0},
-dd2276[]={21015,0},
-dd2277[]={21155,0},
-dd2278[]={21693,0},
-dd2279[]={28872,0},
-dd2280[]={35010,0},
-dd2281[]={24265,0},
-dd2282[]={24565,0},
-dd2283[]={25467,0},
-dd2284[]={27566,0},
-dd2285[]={31806,0},
-dd2286[]={29557,0},
-dd2287[]={20196,0},
-dd2288[]={22265,0},
-dd2289[]={23994,0},
-dd2290[]={24604,0},
-dd2291[]={29618,0},
-dd2292[]={29801,0},
-dd2293[]={32666,0},
-dd2294[]={32838,0},
-dd2295[]={37428,0},
-dd2296[]={38646,0},
-dd2297[]={38728,0},
-dd2298[]={38936,0},
-dd2299[]={20363,0},
-dd2300[]={31150,0},
-dd2301[]={37300,0},
-dd2302[]={38584,0},
-dd2303[]={24801,0},
-dd2304[]={20102,0},
-dd2305[]={20698,0},
-dd2306[]={23534,0},
-dd2307[]={23615,0},
-dd2308[]={26009,0},
-dd2309[]={29134,0},
-dd2310[]={30274,0},
-dd2311[]={34044,0},
-dd2312[]={36988,0},
-dd2313[]={26248,0},
-dd2314[]={38446,0},
-dd2315[]={21129,0},
-dd2316[]={26491,0},
-dd2317[]={26611,0},
-dd2318[]={27969,0},
-dd2319[]={28316,0},
-dd2320[]={29705,0},
-dd2321[]={30041,0},
-dd2322[]={30827,0},
-dd2323[]={32016,0},
-dd2324[]={39006,0},
-dd2325[]={25134,0},
-dd2326[]={38520,0},
-dd2327[]={20523,0},
-dd2328[]={23833,0},
-dd2329[]={28138,0},
-dd2330[]={36650,0},
-dd2331[]={24459,0},
-dd2332[]={24900,0},
-dd2333[]={26647,0},
-dd2334[]={38534,0},
-dd2335[]={21033,0},
-dd2336[]={21519,0},
-dd2337[]={23653,0},
-dd2338[]={26131,0},
-dd2339[]={26446,0},
-dd2340[]={26792,0},
-dd2341[]={27877,0},
-dd2342[]={29702,0},
-dd2343[]={30178,0},
-dd2344[]={32633,0},
-dd2345[]={35023,0},
-dd2346[]={35041,0},
-dd2347[]={38626,0},
-dd2348[]={21311,0},
-dd2349[]={28346,0},
-dd2350[]={21533,0},
-dd2351[]={29136,0},
-dd2352[]={29848,0},
-dd2353[]={34298,0},
-dd2354[]={38563,0},
-dd2355[]={40023,0},
-dd2356[]={40607,0},
-dd2357[]={26519,0},
-dd2358[]={28107,0},
-dd2359[]={33256,0},
-dd2360[]={31520,0},
-dd2361[]={31890,0},
-dd2362[]={29376,0},
-dd2363[]={28825,0},
-dd2364[]={35672,0},
-dd2365[]={20160,0},
-dd2366[]={33590,0},
-dd2367[]={21050,0},
-dd2368[]={20999,0},
-dd2369[]={24230,0},
-dd2370[]={25299,0},
-dd2371[]={31958,0},
-dd2372[]={23429,0},
-dd2373[]={27934,0},
-dd2374[]={26292,0},
-dd2375[]={36667,0},
-dd2376[]={38477,0},
-dd2377[]={24275,0},
-dd2378[]={20800,0},
-dd2379[]={21952,0},
-dd2380[]={22618,0},
-dd2381[]={26228,0},
-dd2382[]={20958,0},
-dd2383[]={29482,0},
-dd2384[]={30410,0},
-dd2385[]={31036,0},
-dd2386[]={31070,0},
-dd2387[]={31077,0},
-dd2388[]={31119,0},
-dd2389[]={38742,0},
-dd2390[]={31934,0},
-dd2391[]={34322,0},
-dd2392[]={35576,0},
-dd2393[]={36920,0},
-dd2394[]={37117,0},
-dd2395[]={39151,0},
-dd2396[]={39164,0},
-dd2397[]={39208,0},
-dd2398[]={40372,0},
-dd2399[]={20398,0},
-dd2400[]={20711,0},
-dd2401[]={20813,0},
-dd2402[]={21193,0},
-dd2403[]={21220,0},
-dd2404[]={21329,0},
-dd2405[]={21917,0},
-dd2406[]={22022,0},
-dd2407[]={22120,0},
-dd2408[]={22592,0},
-dd2409[]={22696,0},
-dd2410[]={23652,0},
-dd2411[]={24724,0},
-dd2412[]={24936,0},
-dd2413[]={24974,0},
-dd2414[]={25074,0},
-dd2415[]={25935,0},
-dd2416[]={26082,0},
-dd2417[]={26257,0},
-dd2418[]={26757,0},
-dd2419[]={28023,0},
-dd2420[]={28186,0},
-dd2421[]={28450,0},
-dd2422[]={29038,0},
-dd2423[]={29227,0},
-dd2424[]={29730,0},
-dd2425[]={30865,0},
-dd2426[]={31049,0},
-dd2427[]={31048,0},
-dd2428[]={31056,0},
-dd2429[]={31062,0},
-dd2430[]={31117,0},
-dd2431[]={31118,0},
-dd2432[]={31296,0},
-dd2433[]={31361,0},
-dd2434[]={31680,0},
-dd2435[]={32265,0},
-dd2436[]={32321,0},
-dd2437[]={32626,0},
-dd2438[]={32773,0},
-dd2439[]={33261,0},
-dd2440[]={33401,0},
-dd2441[]={33879,0},
-dd2442[]={35088,0},
-dd2443[]={35222,0},
-dd2444[]={35585,0},
-dd2445[]={35641,0},
-dd2446[]={36051,0},
-dd2447[]={36104,0},
-dd2448[]={36790,0},
-dd2449[]={38627,0},
-dd2450[]={38911,0},
-dd2451[]={38971,0},
-dd2452[]={20006,0},
-dd2453[]={20917,0},
-dd2454[]={20840,0},
-dd2455[]={20352,0},
-dd2456[]={20805,0},
-dd2457[]={20864,0},
-dd2458[]={21191,0},
-dd2459[]={21242,0},
-dd2460[]={21845,0},
-dd2461[]={21913,0},
-dd2462[]={21986,0},
-dd2463[]={22707,0},
-dd2464[]={22852,0},
-dd2465[]={22868,0},
-dd2466[]={23138,0},
-dd2467[]={23336,0},
-dd2468[]={24274,0},
-dd2469[]={24281,0},
-dd2470[]={24425,0},
-dd2471[]={24493,0},
-dd2472[]={24792,0},
-dd2473[]={24910,0},
-dd2474[]={24840,0},
-dd2475[]={24928,0},
-dd2476[]={25140,0},
-dd2477[]={25540,0},
-dd2478[]={25628,0},
-dd2479[]={25682,0},
-dd2480[]={25942,0},
-dd2481[]={26395,0},
-dd2482[]={26454,0},
-dd2483[]={28379,0},
-dd2484[]={28363,0},
-dd2485[]={28702,0},
-dd2486[]={30631,0},
-dd2487[]={29237,0},
-dd2488[]={29359,0},
-dd2489[]={29809,0},
-dd2490[]={29958,0},
-dd2491[]={30011,0},
-dd2492[]={30237,0},
-dd2493[]={30239,0},
-dd2494[]={30427,0},
-dd2495[]={30452,0},
-dd2496[]={30538,0},
-dd2497[]={30528,0},
-dd2498[]={30924,0},
-dd2499[]={31409,0},
-dd2500[]={31867,0},
-dd2501[]={32091,0},
-dd2502[]={32574,0},
-dd2503[]={33618,0},
-dd2504[]={33775,0},
-dd2505[]={34681,0},
-dd2506[]={35137,0},
-dd2507[]={35206,0},
-dd2508[]={35519,0},
-dd2509[]={35531,0},
-dd2510[]={35565,0},
-dd2511[]={35722,0},
-dd2512[]={36664,0},
-dd2513[]={36978,0},
-dd2514[]={37273,0},
-dd2515[]={37494,0},
-dd2516[]={38524,0},
-dd2517[]={38875,0},
-dd2518[]={38923,0},
-dd2519[]={39698,0},
-dd2520[]={141386,0},
-dd2521[]={141380,0},
-dd2522[]={144341,0},
-dd2523[]={15261,0},
-dd2524[]={16408,0},
-dd2525[]={16441,0},
-dd2526[]={152137,0},
-dd2527[]={154832,0},
-dd2528[]={163539,0},
-dd2529[]={40771,0},
-dd2530[]={40846,0},
-dd2531[]={102,102,0},
-dd2532[]={102,105,0},
-dd2533[]={102,108,0},
-dd2534[]={102,102,105,0},
-dd2535[]={102,102,108,0},
-dd2536[]={383,116,0},
-dd2537[]={115,116,0},
-dd2538[]={1396,1398,0},
-dd2539[]={1396,1381,0},
-dd2540[]={1396,1387,0},
-dd2541[]={1406,1398,0},
-dd2542[]={1396,1389,0},
-dd2543[]={1497,1460,0},
-dd2544[]={1522,1463,0},
-dd2545[]={1506,0},
-dd2546[]={1492,0},
-dd2547[]={1499,0},
-dd2548[]={1500,0},
-dd2549[]={1501,0},
-dd2550[]={1512,0},
-dd2551[]={1514,0},
-dd2552[]={1513,1473,0},
-dd2553[]={1513,1474,0},
-dd2554[]={64329,1473,0},
-dd2555[]={64329,1474,0},
-dd2556[]={1488,1463,0},
-dd2557[]={1488,1464,0},
-dd2558[]={1488,1468,0},
-dd2559[]={1489,1468,0},
-dd2560[]={1490,1468,0},
-dd2561[]={1491,1468,0},
-dd2562[]={1492,1468,0},
-dd2563[]={1493,1468,0},
-dd2564[]={1494,1468,0},
-dd2565[]={1496,1468,0},
-dd2566[]={1497,1468,0},
-dd2567[]={1498,1468,0},
-dd2568[]={1499,1468,0},
-dd2569[]={1500,1468,0},
-dd2570[]={1502,1468,0},
-dd2571[]={1504,1468,0},
-dd2572[]={1505,1468,0},
-dd2573[]={1507,1468,0},
-dd2574[]={1508,1468,0},
-dd2575[]={1510,1468,0},
-dd2576[]={1511,1468,0},
-dd2577[]={1512,1468,0},
-dd2578[]={1513,1468,0},
-dd2579[]={1514,1468,0},
-dd2580[]={1493,1465,0},
-dd2581[]={1489,1471,0},
-dd2582[]={1499,1471,0},
-dd2583[]={1508,1471,0},
-dd2584[]={1488,1500,0},
-dd2585[]={1649,0},
-dd2586[]={1659,0},
-dd2587[]={1662,0},
-dd2588[]={1664,0},
-dd2589[]={1658,0},
-dd2590[]={1663,0},
-dd2591[]={1657,0},
-dd2592[]={1700,0},
-dd2593[]={1702,0},
-dd2594[]={1668,0},
-dd2595[]={1667,0},
-dd2596[]={1670,0},
-dd2597[]={1671,0},
-dd2598[]={1677,0},
-dd2599[]={1676,0},
-dd2600[]={1678,0},
-dd2601[]={1672,0},
-dd2602[]={1688,0},
-dd2603[]={1681,0},
-dd2604[]={1705,0},
-dd2605[]={1711,0},
-dd2606[]={1715,0},
-dd2607[]={1713,0},
-dd2608[]={1722,0},
-dd2609[]={1723,0},
-dd2610[]={1728,0},
-dd2611[]={1729,0},
-dd2612[]={1726,0},
-dd2613[]={1746,0},
-dd2614[]={1747,0},
-dd2615[]={1709,0},
-dd2616[]={1735,0},
-dd2617[]={1734,0},
-dd2618[]={1736,0},
-dd2619[]={1655,0},
-dd2620[]={1739,0},
-dd2621[]={1733,0},
-dd2622[]={1737,0},
-dd2623[]={1744,0},
-dd2624[]={1609,0},
-dd2625[]={1574,1575,0},
-dd2626[]={1574,1749,0},
-dd2627[]={1574,1608,0},
-dd2628[]={1574,1735,0},
-dd2629[]={1574,1734,0},
-dd2630[]={1574,1736,0},
-dd2631[]={1574,1744,0},
-dd2632[]={1574,1609,0},
-dd2633[]={1740,0},
-dd2634[]={1574,1580,0},
-dd2635[]={1574,1581,0},
-dd2636[]={1574,1605,0},
-dd2637[]={1574,1610,0},
-dd2638[]={1576,1580,0},
-dd2639[]={1576,1581,0},
-dd2640[]={1576,1582,0},
-dd2641[]={1576,1605,0},
-dd2642[]={1576,1609,0},
-dd2643[]={1576,1610,0},
-dd2644[]={1578,1580,0},
-dd2645[]={1578,1581,0},
-dd2646[]={1578,1582,0},
-dd2647[]={1578,1605,0},
-dd2648[]={1578,1609,0},
-dd2649[]={1578,1610,0},
-dd2650[]={1579,1580,0},
-dd2651[]={1579,1605,0},
-dd2652[]={1579,1609,0},
-dd2653[]={1579,1610,0},
-dd2654[]={1580,1581,0},
-dd2655[]={1580,1605,0},
-dd2656[]={1581,1580,0},
-dd2657[]={1581,1605,0},
-dd2658[]={1582,1580,0},
-dd2659[]={1582,1581,0},
-dd2660[]={1582,1605,0},
-dd2661[]={1587,1580,0},
-dd2662[]={1587,1581,0},
-dd2663[]={1587,1582,0},
-dd2664[]={1587,1605,0},
-dd2665[]={1589,1581,0},
-dd2666[]={1589,1605,0},
-dd2667[]={1590,1580,0},
-dd2668[]={1590,1581,0},
-dd2669[]={1590,1582,0},
-dd2670[]={1590,1605,0},
-dd2671[]={1591,1581,0},
-dd2672[]={1591,1605,0},
-dd2673[]={1592,1605,0},
-dd2674[]={1593,1580,0},
-dd2675[]={1593,1605,0},
-dd2676[]={1594,1580,0},
-dd2677[]={1594,1605,0},
-dd2678[]={1601,1580,0},
-dd2679[]={1601,1581,0},
-dd2680[]={1601,1582,0},
-dd2681[]={1601,1605,0},
-dd2682[]={1601,1609,0},
-dd2683[]={1601,1610,0},
-dd2684[]={1602,1581,0},
-dd2685[]={1602,1605,0},
-dd2686[]={1602,1609,0},
-dd2687[]={1602,1610,0},
-dd2688[]={1603,1575,0},
-dd2689[]={1603,1580,0},
-dd2690[]={1603,1581,0},
-dd2691[]={1603,1582,0},
-dd2692[]={1603,1604,0},
-dd2693[]={1603,1605,0},
-dd2694[]={1603,1609,0},
-dd2695[]={1603,1610,0},
-dd2696[]={1604,1580,0},
-dd2697[]={1604,1581,0},
-dd2698[]={1604,1582,0},
-dd2699[]={1604,1605,0},
-dd2700[]={1604,1609,0},
-dd2701[]={1604,1610,0},
-dd2702[]={1605,1580,0},
-dd2703[]={1605,1581,0},
-dd2704[]={1605,1582,0},
-dd2705[]={1605,1605,0},
-dd2706[]={1605,1609,0},
-dd2707[]={1605,1610,0},
-dd2708[]={1606,1580,0},
-dd2709[]={1606,1581,0},
-dd2710[]={1606,1582,0},
-dd2711[]={1606,1605,0},
-dd2712[]={1606,1609,0},
-dd2713[]={1606,1610,0},
-dd2714[]={1607,1580,0},
-dd2715[]={1607,1605,0},
-dd2716[]={1607,1609,0},
-dd2717[]={1607,1610,0},
-dd2718[]={1610,1580,0},
-dd2719[]={1610,1581,0},
-dd2720[]={1610,1582,0},
-dd2721[]={1610,1605,0},
-dd2722[]={1610,1609,0},
-dd2723[]={1610,1610,0},
-dd2724[]={1584,1648,0},
-dd2725[]={1585,1648,0},
-dd2726[]={1609,1648,0},
-dd2727[]={32,1612,1617,0},
-dd2728[]={32,1613,1617,0},
-dd2729[]={32,1614,1617,0},
-dd2730[]={32,1615,1617,0},
-dd2731[]={32,1616,1617,0},
-dd2732[]={32,1617,1648,0},
-dd2733[]={1574,1585,0},
-dd2734[]={1574,1586,0},
-dd2735[]={1574,1606,0},
-dd2736[]={1576,1585,0},
-dd2737[]={1576,1586,0},
-dd2738[]={1576,1606,0},
-dd2739[]={1578,1585,0},
-dd2740[]={1578,1586,0},
-dd2741[]={1578,1606,0},
-dd2742[]={1579,1585,0},
-dd2743[]={1579,1586,0},
-dd2744[]={1579,1606,0},
-dd2745[]={1605,1575,0},
-dd2746[]={1606,1585,0},
-dd2747[]={1606,1586,0},
-dd2748[]={1606,1606,0},
-dd2749[]={1610,1585,0},
-dd2750[]={1610,1586,0},
-dd2751[]={1610,1606,0},
-dd2752[]={1574,1582,0},
-dd2753[]={1574,1607,0},
-dd2754[]={1576,1607,0},
-dd2755[]={1578,1607,0},
-dd2756[]={1589,1582,0},
-dd2757[]={1604,1607,0},
-dd2758[]={1606,1607,0},
-dd2759[]={1607,1648,0},
-dd2760[]={1610,1607,0},
-dd2761[]={1579,1607,0},
-dd2762[]={1587,1607,0},
-dd2763[]={1588,1605,0},
-dd2764[]={1588,1607,0},
-dd2765[]={1600,1614,1617,0},
-dd2766[]={1600,1615,1617,0},
-dd2767[]={1600,1616,1617,0},
-dd2768[]={1591,1609,0},
-dd2769[]={1591,1610,0},
-dd2770[]={1593,1609,0},
-dd2771[]={1593,1610,0},
-dd2772[]={1594,1609,0},
-dd2773[]={1594,1610,0},
-dd2774[]={1587,1609,0},
-dd2775[]={1587,1610,0},
-dd2776[]={1588,1609,0},
-dd2777[]={1588,1610,0},
-dd2778[]={1581,1609,0},
-dd2779[]={1581,1610,0},
-dd2780[]={1580,1609,0},
-dd2781[]={1580,1610,0},
-dd2782[]={1582,1609,0},
-dd2783[]={1582,1610,0},
-dd2784[]={1589,1609,0},
-dd2785[]={1589,1610,0},
-dd2786[]={1590,1609,0},
-dd2787[]={1590,1610,0},
-dd2788[]={1588,1580,0},
-dd2789[]={1588,1581,0},
-dd2790[]={1588,1582,0},
-dd2791[]={1588,1585,0},
-dd2792[]={1587,1585,0},
-dd2793[]={1589,1585,0},
-dd2794[]={1590,1585,0},
-dd2795[]={1575,1611,0},
-dd2796[]={1578,1580,1605,0},
-dd2797[]={1578,1581,1580,0},
-dd2798[]={1578,1581,1605,0},
-dd2799[]={1578,1582,1605,0},
-dd2800[]={1578,1605,1580,0},
-dd2801[]={1578,1605,1581,0},
-dd2802[]={1578,1605,1582,0},
-dd2803[]={1580,1605,1581,0},
-dd2804[]={1581,1605,1610,0},
-dd2805[]={1581,1605,1609,0},
-dd2806[]={1587,1581,1580,0},
-dd2807[]={1587,1580,1581,0},
-dd2808[]={1587,1580,1609,0},
-dd2809[]={1587,1605,1581,0},
-dd2810[]={1587,1605,1580,0},
-dd2811[]={1587,1605,1605,0},
-dd2812[]={1589,1581,1581,0},
-dd2813[]={1589,1605,1605,0},
-dd2814[]={1588,1581,1605,0},
-dd2815[]={1588,1580,1610,0},
-dd2816[]={1588,1605,1582,0},
-dd2817[]={1588,1605,1605,0},
-dd2818[]={1590,1581,1609,0},
-dd2819[]={1590,1582,1605,0},
-dd2820[]={1591,1605,1581,0},
-dd2821[]={1591,1605,1605,0},
-dd2822[]={1591,1605,1610,0},
-dd2823[]={1593,1580,1605,0},
-dd2824[]={1593,1605,1605,0},
-dd2825[]={1593,1605,1609,0},
-dd2826[]={1594,1605,1605,0},
-dd2827[]={1594,1605,1610,0},
-dd2828[]={1594,1605,1609,0},
-dd2829[]={1601,1582,1605,0},
-dd2830[]={1602,1605,1581,0},
-dd2831[]={1602,1605,1605,0},
-dd2832[]={1604,1581,1605,0},
-dd2833[]={1604,1581,1610,0},
-dd2834[]={1604,1581,1609,0},
-dd2835[]={1604,1580,1580,0},
-dd2836[]={1604,1582,1605,0},
-dd2837[]={1604,1605,1581,0},
-dd2838[]={1605,1581,1580,0},
-dd2839[]={1605,1581,1605,0},
-dd2840[]={1605,1581,1610,0},
-dd2841[]={1605,1580,1581,0},
-dd2842[]={1605,1580,1605,0},
-dd2843[]={1605,1582,1580,0},
-dd2844[]={1605,1582,1605,0},
-dd2845[]={1605,1580,1582,0},
-dd2846[]={1607,1605,1580,0},
-dd2847[]={1607,1605,1605,0},
-dd2848[]={1606,1581,1605,0},
-dd2849[]={1606,1581,1609,0},
-dd2850[]={1606,1580,1605,0},
-dd2851[]={1606,1580,1609,0},
-dd2852[]={1606,1605,1610,0},
-dd2853[]={1606,1605,1609,0},
-dd2854[]={1610,1605,1605,0},
-dd2855[]={1576,1582,1610,0},
-dd2856[]={1578,1580,1610,0},
-dd2857[]={1578,1580,1609,0},
-dd2858[]={1578,1582,1610,0},
-dd2859[]={1578,1582,1609,0},
-dd2860[]={1578,1605,1610,0},
-dd2861[]={1578,1605,1609,0},
-dd2862[]={1580,1605,1610,0},
-dd2863[]={1580,1581,1609,0},
-dd2864[]={1580,1605,1609,0},
-dd2865[]={1587,1582,1609,0},
-dd2866[]={1589,1581,1610,0},
-dd2867[]={1588,1581,1610,0},
-dd2868[]={1590,1581,1610,0},
-dd2869[]={1604,1580,1610,0},
-dd2870[]={1604,1605,1610,0},
-dd2871[]={1610,1581,1610,0},
-dd2872[]={1610,1580,1610,0},
-dd2873[]={1610,1605,1610,0},
-dd2874[]={1605,1605,1610,0},
-dd2875[]={1602,1605,1610,0},
-dd2876[]={1606,1581,1610,0},
-dd2877[]={1593,1605,1610,0},
-dd2878[]={1603,1605,1610,0},
-dd2879[]={1606,1580,1581,0},
-dd2880[]={1605,1582,1610,0},
-dd2881[]={1604,1580,1605,0},
-dd2882[]={1603,1605,1605,0},
-dd2883[]={1580,1581,1610,0},
-dd2884[]={1581,1580,1610,0},
-dd2885[]={1605,1580,1610,0},
-dd2886[]={1601,1605,1610,0},
-dd2887[]={1576,1581,1610,0},
-dd2888[]={1587,1582,1610,0},
-dd2889[]={1606,1580,1610,0},
-dd2890[]={1589,1604,1746,0},
-dd2891[]={1602,1604,1746,0},
-dd2892[]={1575,1604,1604,1607,0},
-dd2893[]={1575,1603,1576,1585,0},
-dd2894[]={1605,1581,1605,1583,0},
-dd2895[]={1589,1604,1593,1605,0},
-dd2896[]={1585,1587,1608,1604,0},
-dd2897[]={1593,1604,1610,1607,0},
-dd2898[]={1608,1587,1604,1605,0},
-dd2899[]={1589,1604,1609,0},
-dd2900[]={1589,1604,1609,32,1575,1604,1604,1607,32,1593,1604,1610,1607,32,1608,1587,1604,1605,0},
-dd2901[]={1580,1604,32,1580,1604,1575,1604,1607,0},
-dd2902[]={1585,1740,1575,1604,0},
-dd2903[]={44,0},
-dd2904[]={12289,0},
-dd2905[]={12290,0},
-dd2906[]={58,0},
-dd2907[]={33,0},
-dd2908[]={63,0},
-dd2909[]={12310,0},
-dd2910[]={12311,0},
-dd2911[]={8230,0},
-dd2912[]={8229,0},
-dd2913[]={8212,0},
-dd2914[]={8211,0},
-dd2915[]={95,0},
-dd2916[]={123,0},
-dd2917[]={125,0},
-dd2918[]={12308,0},
-dd2919[]={12309,0},
-dd2920[]={12304,0},
-dd2921[]={12305,0},
-dd2922[]={12298,0},
-dd2923[]={12299,0},
-dd2924[]={12300,0},
-dd2925[]={12301,0},
-dd2926[]={12302,0},
-dd2927[]={12303,0},
-dd2928[]={91,0},
-dd2929[]={93,0},
-dd2930[]={8254,0},
-dd2931[]={35,0},
-dd2932[]={38,0},
-dd2933[]={42,0},
-dd2934[]={45,0},
-dd2935[]={60,0},
-dd2936[]={62,0},
-dd2937[]={92,0},
-dd2938[]={36,0},
-dd2939[]={37,0},
-dd2940[]={64,0},
-dd2941[]={32,1611,0},
-dd2942[]={1600,1611,0},
-dd2943[]={32,1612,0},
-dd2944[]={32,1613,0},
-dd2945[]={32,1614,0},
-dd2946[]={1600,1614,0},
-dd2947[]={32,1615,0},
-dd2948[]={1600,1615,0},
-dd2949[]={32,1616,0},
-dd2950[]={1600,1616,0},
-dd2951[]={32,1617,0},
-dd2952[]={1600,1617,0},
-dd2953[]={32,1618,0},
-dd2954[]={1600,1618,0},
-dd2955[]={1569,0},
-dd2956[]={1570,0},
-dd2957[]={1571,0},
-dd2958[]={1572,0},
-dd2959[]={1573,0},
-dd2960[]={1574,0},
-dd2961[]={1575,0},
-dd2962[]={1576,0},
-dd2963[]={1577,0},
-dd2964[]={1578,0},
-dd2965[]={1579,0},
-dd2966[]={1580,0},
-dd2967[]={1581,0},
-dd2968[]={1582,0},
-dd2969[]={1583,0},
-dd2970[]={1584,0},
-dd2971[]={1585,0},
-dd2972[]={1586,0},
-dd2973[]={1587,0},
-dd2974[]={1588,0},
-dd2975[]={1589,0},
-dd2976[]={1590,0},
-dd2977[]={1591,0},
-dd2978[]={1592,0},
-dd2979[]={1593,0},
-dd2980[]={1594,0},
-dd2981[]={1601,0},
-dd2982[]={1602,0},
-dd2983[]={1603,0},
-dd2984[]={1604,0},
-dd2985[]={1605,0},
-dd2986[]={1606,0},
-dd2987[]={1607,0},
-dd2988[]={1608,0},
-dd2989[]={1610,0},
-dd2990[]={1604,1570,0},
-dd2991[]={1604,1571,0},
-dd2992[]={1604,1573,0},
-dd2993[]={1604,1575,0},
-dd2994[]={34,0},
-dd2995[]={39,0},
-dd2996[]={47,0},
-dd2997[]={94,0},
-dd2998[]={124,0},
-dd2999[]={126,0},
-dd3000[]={10629,0},
-dd3001[]={10630,0},
-dd3002[]={12539,0},
-dd3003[]={12449,0},
-dd3004[]={12451,0},
-dd3005[]={12453,0},
-dd3006[]={12455,0},
-dd3007[]={12457,0},
-dd3008[]={12515,0},
-dd3009[]={12517,0},
-dd3010[]={12519,0},
-dd3011[]={12483,0},
-dd3012[]={12540,0},
-dd3013[]={12531,0},
-dd3014[]={12441,0},
-dd3015[]={12442,0},
-dd3016[]={12644,0},
-dd3017[]={12593,0},
-dd3018[]={12594,0},
-dd3019[]={12595,0},
-dd3020[]={12596,0},
-dd3021[]={12597,0},
-dd3022[]={12598,0},
-dd3023[]={12599,0},
-dd3024[]={12600,0},
-dd3025[]={12601,0},
-dd3026[]={12602,0},
-dd3027[]={12603,0},
-dd3028[]={12604,0},
-dd3029[]={12605,0},
-dd3030[]={12606,0},
-dd3031[]={12607,0},
-dd3032[]={12608,0},
-dd3033[]={12609,0},
-dd3034[]={12610,0},
-dd3035[]={12611,0},
-dd3036[]={12612,0},
-dd3037[]={12613,0},
-dd3038[]={12614,0},
-dd3039[]={12615,0},
-dd3040[]={12616,0},
-dd3041[]={12617,0},
-dd3042[]={12618,0},
-dd3043[]={12619,0},
-dd3044[]={12620,0},
-dd3045[]={12621,0},
-dd3046[]={12622,0},
-dd3047[]={12623,0},
-dd3048[]={12624,0},
-dd3049[]={12625,0},
-dd3050[]={12626,0},
-dd3051[]={12627,0},
-dd3052[]={12628,0},
-dd3053[]={12629,0},
-dd3054[]={12630,0},
-dd3055[]={12631,0},
-dd3056[]={12632,0},
-dd3057[]={12633,0},
-dd3058[]={12634,0},
-dd3059[]={12635,0},
-dd3060[]={12636,0},
-dd3061[]={12637,0},
-dd3062[]={12638,0},
-dd3063[]={12639,0},
-dd3064[]={12640,0},
-dd3065[]={12641,0},
-dd3066[]={12642,0},
-dd3067[]={12643,0},
-dd3068[]={162,0},
-dd3069[]={163,0},
-dd3070[]={172,0},
-dd3071[]={175,0},
-dd3072[]={166,0},
-dd3073[]={165,0},
-dd3074[]={8361,0},
-dd3075[]={9474,0},
-dd3076[]={8592,0},
-dd3077[]={8593,0},
-dd3078[]={8594,0},
-dd3079[]={8595,0},
-dd3080[]={9632,0},
-dd3081[]={9675,0},
-dd3082[]={119127,119141,0},
-dd3083[]={119128,119141,0},
-dd3084[]={119135,119150,0},
-dd3085[]={119135,119151,0},
-dd3086[]={119135,119152,0},
-dd3087[]={119135,119153,0},
-dd3088[]={119135,119154,0},
-dd3089[]={119225,119141,0},
-dd3090[]={119226,119141,0},
-dd3091[]={119227,119150,0},
-dd3092[]={119228,119150,0},
-dd3093[]={119227,119151,0},
-dd3094[]={119228,119151,0},
-dd3095[]={305,0},
-dd3096[]={567,0},
-dd3097[]={913,0},
-dd3098[]={914,0},
-dd3099[]={916,0},
-dd3100[]={917,0},
-dd3101[]={918,0},
-dd3102[]={919,0},
-dd3103[]={921,0},
-dd3104[]={922,0},
-dd3105[]={923,0},
-dd3106[]={924,0},
-dd3107[]={925,0},
-dd3108[]={926,0},
-dd3109[]={927,0},
-dd3110[]={929,0},
-dd3111[]={1012,0},
-dd3112[]={932,0},
-dd3113[]={934,0},
-dd3114[]={935,0},
-dd3115[]={936,0},
-dd3116[]={8711,0},
-dd3117[]={945,0},
-dd3118[]={950,0},
-dd3119[]={951,0},
-dd3120[]={955,0},
-dd3121[]={957,0},
-dd3122[]={958,0},
-dd3123[]={959,0},
-dd3124[]={963,0},
-dd3125[]={964,0},
-dd3126[]={965,0},
-dd3127[]={968,0},
-dd3128[]={969,0},
-dd3129[]={8706,0},
-dd3130[]={1013,0},
-dd3131[]={977,0},
-dd3132[]={1008,0},
-dd3133[]={981,0},
-dd3134[]={1009,0},
-dd3135[]={982,0},
-dd3136[]={988,0},
-dd3137[]={989,0},
-dd3138[]={20029,0},
-dd3139[]={20024,0},
-dd3140[]={20033,0},
-dd3141[]={131362,0},
-dd3142[]={20320,0},
-dd3143[]={20411,0},
-dd3144[]={20482,0},
-dd3145[]={20602,0},
-dd3146[]={20633,0},
-dd3147[]={20687,0},
-dd3148[]={13470,0},
-dd3149[]={132666,0},
-dd3150[]={20820,0},
-dd3151[]={20836,0},
-dd3152[]={20855,0},
-dd3153[]={132380,0},
-dd3154[]={13497,0},
-dd3155[]={20839,0},
-dd3156[]={20877,0},
-dd3157[]={132427,0},
-dd3158[]={20887,0},
-dd3159[]={20900,0},
-dd3160[]={20172,0},
-dd3161[]={20908,0},
-dd3162[]={168415,0},
-dd3163[]={20995,0},
-dd3164[]={13535,0},
-dd3165[]={21051,0},
-dd3166[]={21062,0},
-dd3167[]={21106,0},
-dd3168[]={21111,0},
-dd3169[]={13589,0},
-dd3170[]={21253,0},
-dd3171[]={21254,0},
-dd3172[]={21321,0},
-dd3173[]={21338,0},
-dd3174[]={21363,0},
-dd3175[]={21373,0},
-dd3176[]={21375,0},
-dd3177[]={133676,0},
-dd3178[]={28784,0},
-dd3179[]={21450,0},
-dd3180[]={21471,0},
-dd3181[]={133987,0},
-dd3182[]={21483,0},
-dd3183[]={21489,0},
-dd3184[]={21510,0},
-dd3185[]={21662,0},
-dd3186[]={21560,0},
-dd3187[]={21576,0},
-dd3188[]={21608,0},
-dd3189[]={21666,0},
-dd3190[]={21750,0},
-dd3191[]={21776,0},
-dd3192[]={21843,0},
-dd3193[]={21859,0},
-dd3194[]={21892,0},
-dd3195[]={21931,0},
-dd3196[]={21939,0},
-dd3197[]={21954,0},
-dd3198[]={22294,0},
-dd3199[]={22295,0},
-dd3200[]={22097,0},
-dd3201[]={22132,0},
-dd3202[]={22766,0},
-dd3203[]={22478,0},
-dd3204[]={22516,0},
-dd3205[]={22541,0},
-dd3206[]={22411,0},
-dd3207[]={22578,0},
-dd3208[]={22577,0},
-dd3209[]={22700,0},
-dd3210[]={136420,0},
-dd3211[]={22770,0},
-dd3212[]={22775,0},
-dd3213[]={22790,0},
-dd3214[]={22810,0},
-dd3215[]={22818,0},
-dd3216[]={22882,0},
-dd3217[]={136872,0},
-dd3218[]={136938,0},
-dd3219[]={23020,0},
-dd3220[]={23067,0},
-dd3221[]={23079,0},
-dd3222[]={23000,0},
-dd3223[]={23142,0},
-dd3224[]={14062,0},
-dd3225[]={14076,0},
-dd3226[]={23304,0},
-dd3227[]={23358,0},
-dd3228[]={137672,0},
-dd3229[]={23491,0},
-dd3230[]={23512,0},
-dd3231[]={23539,0},
-dd3232[]={138008,0},
-dd3233[]={23551,0},
-dd3234[]={23558,0},
-dd3235[]={24403,0},
-dd3236[]={14209,0},
-dd3237[]={23648,0},
-dd3238[]={23744,0},
-dd3239[]={23693,0},
-dd3240[]={138724,0},
-dd3241[]={23875,0},
-dd3242[]={138726,0},
-dd3243[]={23918,0},
-dd3244[]={23915,0},
-dd3245[]={23932,0},
-dd3246[]={24033,0},
-dd3247[]={24034,0},
-dd3248[]={14383,0},
-dd3249[]={24061,0},
-dd3250[]={24104,0},
-dd3251[]={24125,0},
-dd3252[]={24169,0},
-dd3253[]={14434,0},
-dd3254[]={139651,0},
-dd3255[]={14460,0},
-dd3256[]={24240,0},
-dd3257[]={24243,0},
-dd3258[]={24246,0},
-dd3259[]={172946,0},
-dd3260[]={140081,0},
-dd3261[]={33281,0},
-dd3262[]={24354,0},
-dd3263[]={14535,0},
-dd3264[]={144056,0},
-dd3265[]={156122,0},
-dd3266[]={24418,0},
-dd3267[]={24427,0},
-dd3268[]={14563,0},
-dd3269[]={24474,0},
-dd3270[]={24525,0},
-dd3271[]={24535,0},
-dd3272[]={24569,0},
-dd3273[]={24705,0},
-dd3274[]={14650,0},
-dd3275[]={14620,0},
-dd3276[]={141012,0},
-dd3277[]={24775,0},
-dd3278[]={24904,0},
-dd3279[]={24908,0},
-dd3280[]={24954,0},
-dd3281[]={25010,0},
-dd3282[]={24996,0},
-dd3283[]={25007,0},
-dd3284[]={25054,0},
-dd3285[]={25104,0},
-dd3286[]={25115,0},
-dd3287[]={25181,0},
-dd3288[]={25265,0},
-dd3289[]={25300,0},
-dd3290[]={25424,0},
-dd3291[]={142092,0},
-dd3292[]={25405,0},
-dd3293[]={25340,0},
-dd3294[]={25448,0},
-dd3295[]={25475,0},
-dd3296[]={25572,0},
-dd3297[]={142321,0},
-dd3298[]={25634,0},
-dd3299[]={25541,0},
-dd3300[]={25513,0},
-dd3301[]={14894,0},
-dd3302[]={25705,0},
-dd3303[]={25726,0},
-dd3304[]={25757,0},
-dd3305[]={25719,0},
-dd3306[]={14956,0},
-dd3307[]={25964,0},
-dd3308[]={143370,0},
-dd3309[]={26083,0},
-dd3310[]={26360,0},
-dd3311[]={26185,0},
-dd3312[]={15129,0},
-dd3313[]={15112,0},
-dd3314[]={15076,0},
-dd3315[]={20882,0},
-dd3316[]={20885,0},
-dd3317[]={26368,0},
-dd3318[]={26268,0},
-dd3319[]={32941,0},
-dd3320[]={17369,0},
-dd3321[]={26401,0},
-dd3322[]={26462,0},
-dd3323[]={26451,0},
-dd3324[]={144323,0},
-dd3325[]={15177,0},
-dd3326[]={26618,0},
-dd3327[]={26501,0},
-dd3328[]={26706,0},
-dd3329[]={144493,0},
-dd3330[]={26766,0},
-dd3331[]={26655,0},
-dd3332[]={26900,0},
-dd3333[]={26946,0},
-dd3334[]={27043,0},
-dd3335[]={27114,0},
-dd3336[]={27304,0},
-dd3337[]={145059,0},
-dd3338[]={27355,0},
-dd3339[]={15384,0},
-dd3340[]={27425,0},
-dd3341[]={145575,0},
-dd3342[]={27476,0},
-dd3343[]={15438,0},
-dd3344[]={27506,0},
-dd3345[]={27551,0},
-dd3346[]={27579,0},
-dd3347[]={146061,0},
-dd3348[]={138507,0},
-dd3349[]={146170,0},
-dd3350[]={27726,0},
-dd3351[]={146620,0},
-dd3352[]={27839,0},
-dd3353[]={27853,0},
-dd3354[]={27751,0},
-dd3355[]={27926,0},
-dd3356[]={27966,0},
-dd3357[]={28009,0},
-dd3358[]={28024,0},
-dd3359[]={28037,0},
-dd3360[]={146718,0},
-dd3361[]={27956,0},
-dd3362[]={28207,0},
-dd3363[]={28270,0},
-dd3364[]={15667,0},
-dd3365[]={28359,0},
-dd3366[]={147153,0},
-dd3367[]={28153,0},
-dd3368[]={28526,0},
-dd3369[]={147294,0},
-dd3370[]={147342,0},
-dd3371[]={28614,0},
-dd3372[]={28729,0},
-dd3373[]={28699,0},
-dd3374[]={15766,0},
-dd3375[]={28746,0},
-dd3376[]={28797,0},
-dd3377[]={28791,0},
-dd3378[]={28845,0},
-dd3379[]={132389,0},
-dd3380[]={28997,0},
-dd3381[]={148067,0},
-dd3382[]={29084,0},
-dd3383[]={148395,0},
-dd3384[]={29224,0},
-dd3385[]={29264,0},
-dd3386[]={149000,0},
-dd3387[]={29312,0},
-dd3388[]={29333,0},
-dd3389[]={149301,0},
-dd3390[]={149524,0},
-dd3391[]={29562,0},
-dd3392[]={29579,0},
-dd3393[]={16044,0},
-dd3394[]={29605,0},
-dd3395[]={16056,0},
-dd3396[]={29767,0},
-dd3397[]={29788,0},
-dd3398[]={29829,0},
-dd3399[]={29898,0},
-dd3400[]={16155,0},
-dd3401[]={29988,0},
-dd3402[]={150582,0},
-dd3403[]={30014,0},
-dd3404[]={150674,0},
-dd3405[]={139679,0},
-dd3406[]={30224,0},
-dd3407[]={151457,0},
-dd3408[]={151480,0},
-dd3409[]={151620,0},
-dd3410[]={16380,0},
-dd3411[]={16392,0},
-dd3412[]={151795,0},
-dd3413[]={151794,0},
-dd3414[]={151833,0},
-dd3415[]={151859,0},
-dd3416[]={30494,0},
-dd3417[]={30495,0},
-dd3418[]={30603,0},
-dd3419[]={16454,0},
-dd3420[]={16534,0},
-dd3421[]={152605,0},
-dd3422[]={30798,0},
-dd3423[]={16611,0},
-dd3424[]={153126,0},
-dd3425[]={153242,0},
-dd3426[]={153285,0},
-dd3427[]={31211,0},
-dd3428[]={16687,0},
-dd3429[]={31306,0},
-dd3430[]={31311,0},
-dd3431[]={153980,0},
-dd3432[]={154279,0},
-dd3433[]={31470,0},
-dd3434[]={16898,0},
-dd3435[]={154539,0},
-dd3436[]={31686,0},
-dd3437[]={31689,0},
-dd3438[]={16935,0},
-dd3439[]={154752,0},
-dd3440[]={31954,0},
-dd3441[]={17056,0},
-dd3442[]={31976,0},
-dd3443[]={31971,0},
-dd3444[]={32000,0},
-dd3445[]={155526,0},
-dd3446[]={32099,0},
-dd3447[]={17153,0},
-dd3448[]={32199,0},
-dd3449[]={32258,0},
-dd3450[]={32325,0},
-dd3451[]={17204,0},
-dd3452[]={156200,0},
-dd3453[]={156231,0},
-dd3454[]={17241,0},
-dd3455[]={156377,0},
-dd3456[]={32634,0},
-dd3457[]={156478,0},
-dd3458[]={32661,0},
-dd3459[]={32762,0},
-dd3460[]={156890,0},
-dd3461[]={156963,0},
-dd3462[]={32864,0},
-dd3463[]={157096,0},
-dd3464[]={32880,0},
-dd3465[]={144223,0},
-dd3466[]={17365,0},
-dd3467[]={32946,0},
-dd3468[]={33027,0},
-dd3469[]={17419,0},
-dd3470[]={33086,0},
-dd3471[]={23221,0},
-dd3472[]={157607,0},
-dd3473[]={157621,0},
-dd3474[]={144275,0},
-dd3475[]={144284,0},
-dd3476[]={33284,0},
-dd3477[]={36766,0},
-dd3478[]={17515,0},
-dd3479[]={33425,0},
-dd3480[]={33419,0},
-dd3481[]={33437,0},
-dd3482[]={21171,0},
-dd3483[]={33457,0},
-dd3484[]={33459,0},
-dd3485[]={33469,0},
-dd3486[]={33510,0},
-dd3487[]={158524,0},
-dd3488[]={33565,0},
-dd3489[]={33635,0},
-dd3490[]={33709,0},
-dd3491[]={33571,0},
-dd3492[]={33725,0},
-dd3493[]={33767,0},
-dd3494[]={33619,0},
-dd3495[]={33738,0},
-dd3496[]={33740,0},
-dd3497[]={33756,0},
-dd3498[]={158774,0},
-dd3499[]={159083,0},
-dd3500[]={158933,0},
-dd3501[]={17707,0},
-dd3502[]={34033,0},
-dd3503[]={34035,0},
-dd3504[]={34070,0},
-dd3505[]={160714,0},
-dd3506[]={34148,0},
-dd3507[]={159532,0},
-dd3508[]={17757,0},
-dd3509[]={17761,0},
-dd3510[]={159665,0},
-dd3511[]={159954,0},
-dd3512[]={17771,0},
-dd3513[]={34384,0},
-dd3514[]={34407,0},
-dd3515[]={34409,0},
-dd3516[]={34473,0},
-dd3517[]={34440,0},
-dd3518[]={34574,0},
-dd3519[]={34530,0},
-dd3520[]={34600,0},
-dd3521[]={34667,0},
-dd3522[]={34694,0},
-dd3523[]={17879,0},
-dd3524[]={34785,0},
-dd3525[]={34817,0},
-dd3526[]={17913,0},
-dd3527[]={34912,0},
-dd3528[]={161383,0},
-dd3529[]={35031,0},
-dd3530[]={35038,0},
-dd3531[]={17973,0},
-dd3532[]={35066,0},
-dd3533[]={13499,0},
-dd3534[]={161966,0},
-dd3535[]={162150,0},
-dd3536[]={18110,0},
-dd3537[]={18119,0},
-dd3538[]={35488,0},
-dd3539[]={162984,0},
-dd3540[]={36011,0},
-dd3541[]={36033,0},
-dd3542[]={36123,0},
-dd3543[]={36215,0},
-dd3544[]={163631,0},
-dd3545[]={133124,0},
-dd3546[]={36299,0},
-dd3547[]={36284,0},
-dd3548[]={36336,0},
-dd3549[]={133342,0},
-dd3550[]={36564,0},
-dd3551[]={165330,0},
-dd3552[]={165357,0},
-dd3553[]={37012,0},
-dd3554[]={37105,0},
-dd3555[]={37137,0},
-dd3556[]={165678,0},
-dd3557[]={37147,0},
-dd3558[]={37432,0},
-dd3559[]={37591,0},
-dd3560[]={37592,0},
-dd3561[]={37500,0},
-dd3562[]={37881,0},
-dd3563[]={37909,0},
-dd3564[]={166906,0},
-dd3565[]={38283,0},
-dd3566[]={18837,0},
-dd3567[]={38327,0},
-dd3568[]={167287,0},
-dd3569[]={18918,0},
-dd3570[]={38595,0},
-dd3571[]={23986,0},
-dd3572[]={38691,0},
-dd3573[]={168261,0},
-dd3574[]={168474,0},
-dd3575[]={19054,0},
-dd3576[]={19062,0},
-dd3577[]={38880,0},
-dd3578[]={168970,0},
-dd3579[]={19122,0},
-dd3580[]={169110,0},
-dd3581[]={38953,0},
-dd3582[]={169398,0},
-dd3583[]={39138,0},
-dd3584[]={19251,0},
-dd3585[]={39209,0},
-dd3586[]={39335,0},
-dd3587[]={39362,0},
-dd3588[]={39422,0},
-dd3589[]={19406,0},
-dd3590[]={170800,0},
-dd3591[]={40000,0},
-dd3592[]={40189,0},
-dd3593[]={19662,0},
-dd3594[]={19693,0},
-dd3595[]={40295,0},
-dd3596[]={172238,0},
-dd3597[]={19704,0},
-dd3598[]={172293,0},
-dd3599[]={172558,0},
-dd3600[]={172689,0},
-dd3601[]={19798,0},
-dd3602[]={40702,0},
-dd3603[]={40709,0},
-dd3604[]={40719,0},
-dd3605[]={40726,0},
-dd3606[]={173568,0},
-dd3607[]={8814,0},
-dd3608[]={8800,0},
-dd3609[]={8815,0},
-dd3610[]={192,193,194,195,196,197,256,258,260,461,512,514,550,7680,7840,7842,0},
-dd3611[]={7682,7684,7686,0},
-dd3612[]={199,262,264,266,268,0},
-dd3613[]={270,7690,7692,7694,7696,7698,0},
-dd3614[]={200,201,202,203,274,276,278,280,282,516,518,552,7704,7706,7864,7866,7868,0},
-dd3615[]={7710,0},
-dd3616[]={284,286,288,290,486,500,7712,0},
-dd3617[]={292,542,7714,7716,7718,7720,7722,0},
-dd3618[]={204,205,206,207,296,298,300,302,304,463,520,522,7724,7880,7882,0},
-dd3619[]={308,0},
-dd3620[]={310,488,7728,7730,7732,0},
-dd3621[]={313,315,317,7734,7738,7740,0},
-dd3622[]={7742,7744,7746,0},
-dd3623[]={209,323,325,327,504,7748,7750,7752,7754,0},
-dd3624[]={210,211,212,213,214,332,334,336,416,465,490,524,526,558,7884,7886,0},
-dd3625[]={7764,7766,0},
-dd3626[]={340,342,344,528,530,7768,7770,7774,0},
-dd3627[]={346,348,350,352,536,7776,7778,0},
-dd3628[]={354,356,538,7786,7788,7790,7792,0},
-dd3629[]={217,218,219,220,360,362,364,366,368,370,431,467,532,534,7794,7796,7798,7908,7910,0},
-dd3630[]={7804,7806,0},
-dd3631[]={372,7808,7810,7812,7814,7816,0},
-dd3632[]={7818,7820,0},
-dd3633[]={221,374,376,562,7822,7922,7924,7926,7928,0},
-dd3634[]={377,379,381,7824,7826,7828,0},
-dd3635[]={224,225,226,227,228,229,257,259,261,462,513,515,551,7681,7841,7843,0},
-dd3636[]={7683,7685,7687,0},
-dd3637[]={231,263,265,267,269,0},
-dd3638[]={271,7691,7693,7695,7697,7699,0},
-dd3639[]={232,233,234,235,275,277,279,281,283,517,519,553,7705,7707,7865,7867,7869,0},
-dd3640[]={7711,0},
-dd3641[]={285,287,289,291,487,501,7713,0},
-dd3642[]={293,543,7715,7717,7719,7721,7723,7830,0},
-dd3643[]={236,237,238,239,297,299,301,303,464,521,523,7725,7881,7883,0},
-dd3644[]={309,496,0},
-dd3645[]={311,489,7729,7731,7733,0},
-dd3646[]={314,316,318,7735,7739,7741,0},
-dd3647[]={7743,7745,7747,0},
-dd3648[]={241,324,326,328,505,7749,7751,7753,7755,0},
-dd3649[]={242,243,244,245,246,333,335,337,417,466,491,525,527,559,7885,7887,0},
-dd3650[]={7765,7767,0},
-dd3651[]={341,343,345,529,531,7769,7771,7775,0},
-dd3652[]={347,349,351,353,537,7777,7779,0},
-dd3653[]={355,357,539,7787,7789,7791,7793,7831,0},
-dd3654[]={249,250,251,252,361,363,365,367,369,371,432,468,533,535,7795,7797,7799,7909,7911,0},
-dd3655[]={7805,7807,0},
-dd3656[]={373,7809,7811,7813,7815,7817,7832,0},
-dd3657[]={7819,7821,0},
-dd3658[]={253,255,375,563,7823,7833,7923,7925,7927,7929,0},
-dd3659[]={378,380,382,7825,7827,7829,0},
-dd3660[]={901,8129,8173,0},
-dd3661[]={7844,7846,7848,7850,0},
-dd3662[]={478,0},
-dd3663[]={506,0},
-dd3664[]={482,508,0},
-dd3665[]={7688,0},
-dd3666[]={7870,7872,7874,7876,0},
-dd3667[]={7726,0},
-dd3668[]={7888,7890,7892,7894,0},
-dd3669[]={556,7756,7758,0},
-dd3670[]={554,0},
-dd3671[]={510,0},
-dd3672[]={469,471,473,475,0},
-dd3673[]={7845,7847,7849,7851,0},
-dd3674[]={479,0},
-dd3675[]={507,0},
-dd3676[]={483,509,0},
-dd3677[]={7689,0},
-dd3678[]={7871,7873,7875,7877,0},
-dd3679[]={7727,0},
-dd3680[]={7889,7891,7893,7895,0},
-dd3681[]={557,7757,7759,0},
-dd3682[]={555,0},
-dd3683[]={511,0},
-dd3684[]={470,472,474,476,0},
-dd3685[]={7854,7856,7858,7860,0},
-dd3686[]={7855,7857,7859,7861,0},
-dd3687[]={7700,7702,0},
-dd3688[]={7701,7703,0},
-dd3689[]={7760,7762,0},
-dd3690[]={7761,7763,0},
-dd3691[]={7780,0},
-dd3692[]={7781,0},
-dd3693[]={7782,0},
-dd3694[]={7783,0},
-dd3695[]={7800,0},
-dd3696[]={7801,0},
-dd3697[]={7802,0},
-dd3698[]={7803,0},
-dd3699[]={7835,0},
-dd3700[]={7898,7900,7902,7904,7906,0},
-dd3701[]={7899,7901,7903,7905,7907,0},
-dd3702[]={7912,7914,7916,7918,7920,0},
-dd3703[]={7913,7915,7917,7919,7921,0},
-dd3704[]={494,0},
-dd3705[]={492,0},
-dd3706[]={493,0},
-dd3707[]={480,0},
-dd3708[]={481,0},
-dd3709[]={7708,0},
-dd3710[]={7709,0},
-dd3711[]={560,0},
-dd3712[]={561,0},
-dd3713[]={495,0},
-dd3714[]={902,7944,7945,8120,8121,8122,8124,0},
-dd3715[]={904,7960,7961,8136,0},
-dd3716[]={905,7976,7977,8138,8140,0},
-dd3717[]={906,938,7992,7993,8152,8153,8154,0},
-dd3718[]={908,8008,8009,8184,0},
-dd3719[]={8172,0},
-dd3720[]={910,939,8025,8168,8169,8170,0},
-dd3721[]={911,8040,8041,8186,8188,0},
-dd3722[]={8116,0},
-dd3723[]={8132,0},
-dd3724[]={940,7936,7937,8048,8112,8113,8115,8118,0},
-dd3725[]={941,7952,7953,8050,0},
-dd3726[]={942,7968,7969,8052,8131,8134,0},
-dd3727[]={943,970,7984,7985,8054,8144,8145,8150,0},
-dd3728[]={972,8000,8001,8056,0},
-dd3729[]={8164,8165,0},
-dd3730[]={971,973,8016,8017,8058,8160,8161,8166,0},
-dd3731[]={974,8032,8033,8060,8179,8182,0},
-dd3732[]={912,8146,8151,0},
-dd3733[]={944,8162,8167,0},
-dd3734[]={8180,0},
-dd3735[]={979,980,0},
-dd3736[]={1031,0},
-dd3737[]={1232,1234,0},
-dd3738[]={1027,0},
-dd3739[]={1024,1025,1238,0},
-dd3740[]={1217,1244,0},
-dd3741[]={1246,0},
-dd3742[]={1037,1049,1250,1252,0},
-dd3743[]={1036,0},
-dd3744[]={1254,0},
-dd3745[]={1038,1262,1264,1266,0},
-dd3746[]={1268,0},
-dd3747[]={1272,0},
-dd3748[]={1260,0},
-dd3749[]={1233,1235,0},
-dd3750[]={1107,0},
-dd3751[]={1104,1105,1239,0},
-dd3752[]={1218,1245,0},
-dd3753[]={1247,0},
-dd3754[]={1081,1117,1251,1253,0},
-dd3755[]={1116,0},
-dd3756[]={1255,0},
-dd3757[]={1118,1263,1265,1267,0},
-dd3758[]={1269,0},
-dd3759[]={1273,0},
-dd3760[]={1261,0},
-dd3761[]={1111,0},
-dd3762[]={1142,0},
-dd3763[]={1143,0},
-dd3764[]={1242,0},
-dd3765[]={1243,0},
-dd3766[]={1258,0},
-dd3767[]={1259,0},
-dd3768[]={1570,1571,1573,0},
-dd3769[]={1730,0},
-dd3770[]={2345,0},
-dd3771[]={2353,0},
-dd3772[]={2356,0},
-dd3773[]={2507,2508,0},
-dd3774[]={2888,2891,2892,0},
-dd3775[]={2964,0},
-dd3776[]={3018,3020,0},
-dd3777[]={3019,0},
-dd3778[]={3144,0},
-dd3779[]={3264,0},
-dd3780[]={3271,3272,3274,0},
-dd3781[]={3275,0},
-dd3782[]={3402,3404,0},
-dd3783[]={3403,0},
-dd3784[]={3546,3548,3550,0},
-dd3785[]={3549,0},
-dd3786[]={4134,0},
-dd3787[]={6918,0},
-dd3788[]={6920,0},
-dd3789[]={6922,0},
-dd3790[]={6924,0},
-dd3791[]={6926,0},
-dd3792[]={6930,0},
-dd3793[]={6971,0},
-dd3794[]={6973,0},
-dd3795[]={6976,0},
-dd3796[]={6977,0},
-dd3797[]={6979,0},
-dd3798[]={7736,0},
-dd3799[]={7737,0},
-dd3800[]={7772,0},
-dd3801[]={7773,0},
-dd3802[]={7784,0},
-dd3803[]={7785,0},
-dd3804[]={7852,7862,0},
-dd3805[]={7853,7863,0},
-dd3806[]={7878,0},
-dd3807[]={7879,0},
-dd3808[]={7896,0},
-dd3809[]={7897,0},
-dd3810[]={7938,7940,7942,8064,0},
-dd3811[]={7939,7941,7943,8065,0},
-dd3812[]={8066,0},
-dd3813[]={8067,0},
-dd3814[]={8068,0},
-dd3815[]={8069,0},
-dd3816[]={8070,0},
-dd3817[]={8071,0},
-dd3818[]={7946,7948,7950,8072,0},
-dd3819[]={7947,7949,7951,8073,0},
-dd3820[]={8074,0},
-dd3821[]={8075,0},
-dd3822[]={8076,0},
-dd3823[]={8077,0},
-dd3824[]={8078,0},
-dd3825[]={8079,0},
-dd3826[]={7954,7956,0},
-dd3827[]={7955,7957,0},
-dd3828[]={7962,7964,0},
-dd3829[]={7963,7965,0},
-dd3830[]={7970,7972,7974,8080,0},
-dd3831[]={7971,7973,7975,8081,0},
-dd3832[]={8082,0},
-dd3833[]={8083,0},
-dd3834[]={8084,0},
-dd3835[]={8085,0},
-dd3836[]={8086,0},
-dd3837[]={8087,0},
-dd3838[]={7978,7980,7982,8088,0},
-dd3839[]={7979,7981,7983,8089,0},
-dd3840[]={8090,0},
-dd3841[]={8091,0},
-dd3842[]={8092,0},
-dd3843[]={8093,0},
-dd3844[]={8094,0},
-dd3845[]={8095,0},
-dd3846[]={7986,7988,7990,0},
-dd3847[]={7987,7989,7991,0},
-dd3848[]={7994,7996,7998,0},
-dd3849[]={7995,7997,7999,0},
-dd3850[]={8002,8004,0},
-dd3851[]={8003,8005,0},
-dd3852[]={8010,8012,0},
-dd3853[]={8011,8013,0},
-dd3854[]={8018,8020,8022,0},
-dd3855[]={8019,8021,8023,0},
-dd3856[]={8027,8029,8031,0},
-dd3857[]={8034,8036,8038,8096,0},
-dd3858[]={8035,8037,8039,8097,0},
-dd3859[]={8098,0},
-dd3860[]={8099,0},
-dd3861[]={8100,0},
-dd3862[]={8101,0},
-dd3863[]={8102,0},
-dd3864[]={8103,0},
-dd3865[]={8042,8044,8046,8104,0},
-dd3866[]={8043,8045,8047,8105,0},
-dd3867[]={8106,0},
-dd3868[]={8107,0},
-dd3869[]={8108,0},
-dd3870[]={8109,0},
-dd3871[]={8110,0},
-dd3872[]={8111,0},
-dd3873[]={8114,0},
-dd3874[]={8130,0},
-dd3875[]={8178,0},
-dd3876[]={8119,0},
-dd3877[]={8141,8142,8143,0},
-dd3878[]={8135,0},
-dd3879[]={8183,0},
-dd3880[]={8157,8158,8159,0},
-dd3881[]={8602,0},
-dd3882[]={8603,0},
-dd3883[]={8622,0},
-dd3884[]={8653,0},
-dd3885[]={8655,0},
-dd3886[]={8654,0},
-dd3887[]={8708,0},
-dd3888[]={8713,0},
-dd3889[]={8716,0},
-dd3890[]={8740,0},
-dd3891[]={8742,0},
-dd3892[]={8769,0},
-dd3893[]={8772,0},
-dd3894[]={8775,0},
-dd3895[]={8777,0},
-dd3896[]={8813,0},
-dd3897[]={8802,0},
-dd3898[]={8816,0},
-dd3899[]={8817,0},
-dd3900[]={8820,0},
-dd3901[]={8821,0},
-dd3902[]={8824,0},
-dd3903[]={8825,0},
-dd3904[]={8832,0},
-dd3905[]={8833,0},
-dd3906[]={8928,0},
-dd3907[]={8929,0},
-dd3908[]={8836,0},
-dd3909[]={8837,0},
-dd3910[]={8840,0},
-dd3911[]={8841,0},
-dd3912[]={8930,0},
-dd3913[]={8931,0},
-dd3914[]={8876,0},
-dd3915[]={8877,0},
-dd3916[]={8878,0},
-dd3917[]={8879,0},
-dd3918[]={8938,0},
-dd3919[]={8939,0},
-dd3920[]={8940,0},
-dd3921[]={8941,0},
-dd3922[]={12436,0},
-dd3923[]={12364,0},
-dd3924[]={12366,0},
-dd3925[]={12368,0},
-dd3926[]={12370,0},
-dd3927[]={12372,0},
-dd3928[]={12374,0},
-dd3929[]={12376,0},
-dd3930[]={12378,0},
-dd3931[]={12380,0},
-dd3932[]={12382,0},
-dd3933[]={12384,0},
-dd3934[]={12386,0},
-dd3935[]={12389,0},
-dd3936[]={12391,0},
-dd3937[]={12393,0},
-dd3938[]={12400,12401,0},
-dd3939[]={12403,12404,0},
-dd3940[]={12406,12407,0},
-dd3941[]={12409,12410,0},
-dd3942[]={12412,12413,0},
-dd3943[]={12446,0},
-dd3944[]={12532,0},
-dd3945[]={12460,0},
-dd3946[]={12462,0},
-dd3947[]={12464,0},
-dd3948[]={12466,0},
-dd3949[]={12468,0},
-dd3950[]={12470,0},
-dd3951[]={12472,0},
-dd3952[]={12474,0},
-dd3953[]={12476,0},
-dd3954[]={12478,0},
-dd3955[]={12480,0},
-dd3956[]={12482,0},
-dd3957[]={12485,0},
-dd3958[]={12487,0},
-dd3959[]={12489,0},
-dd3960[]={12496,12497,0},
-dd3961[]={12499,12500,0},
-dd3962[]={12502,12503,0},
-dd3963[]={12505,12506,0},
-dd3964[]={12508,12509,0},
-dd3965[]={12535,0},
-dd3966[]={12536,0},
-dd3967[]={12537,0},
-dd3968[]={12538,0},
-dd3969[]={12542,0},
-dd3970[]={224,0},
-dd3971[]={225,0},
-dd3972[]={226,0},
-dd3973[]={227,0},
-dd3974[]={228,0},
-dd3975[]={229,0},
-dd3976[]={230,0},
-dd3977[]={231,0},
-dd3978[]={232,0},
-dd3979[]={233,0},
-dd3980[]={234,0},
-dd3981[]={235,0},
-dd3982[]={236,0},
-dd3983[]={237,0},
-dd3984[]={238,0},
-dd3985[]={239,0},
-dd3986[]={241,0},
-dd3987[]={242,0},
-dd3988[]={243,0},
-dd3989[]={244,0},
-dd3990[]={245,0},
-dd3991[]={246,0},
-dd3992[]={248,0},
-dd3993[]={249,0},
-dd3994[]={250,0},
-dd3995[]={251,0},
-dd3996[]={252,0},
-dd3997[]={253,0},
-dd3998[]={254,0},
-dd3999[]={115,115,0},
-dd4000[]={257,0},
-dd4001[]={259,0},
-dd4002[]={261,0},
-dd4003[]={263,0},
-dd4004[]={265,0},
-dd4005[]={267,0},
-dd4006[]={269,0},
-dd4007[]={271,0},
-dd4008[]={273,0},
-dd4009[]={275,0},
-dd4010[]={277,0},
-dd4011[]={279,0},
-dd4012[]={281,0},
-dd4013[]={283,0},
-dd4014[]={285,0},
-dd4015[]={287,0},
-dd4016[]={289,0},
-dd4017[]={291,0},
-dd4018[]={293,0},
-dd4019[]={297,0},
-dd4020[]={299,0},
-dd4021[]={301,0},
-dd4022[]={303,0},
-dd4023[]={105,775,0},
-dd4024[]={307,0},
-dd4025[]={309,0},
-dd4026[]={311,0},
-dd4027[]={314,0},
-dd4028[]={316,0},
-dd4029[]={318,0},
-dd4030[]={320,0},
-dd4031[]={322,0},
-dd4032[]={324,0},
-dd4033[]={326,0},
-dd4034[]={328,0},
-dd4035[]={333,0},
-dd4036[]={335,0},
-dd4037[]={337,0},
-dd4038[]={339,0},
-dd4039[]={341,0},
-dd4040[]={343,0},
-dd4041[]={345,0},
-dd4042[]={347,0},
-dd4043[]={349,0},
-dd4044[]={351,0},
-dd4045[]={353,0},
-dd4046[]={355,0},
-dd4047[]={357,0},
-dd4048[]={359,0},
-dd4049[]={361,0},
-dd4050[]={363,0},
-dd4051[]={365,0},
-dd4052[]={367,0},
-dd4053[]={369,0},
-dd4054[]={371,0},
-dd4055[]={373,0},
-dd4056[]={375,0},
-dd4057[]={255,0},
-dd4058[]={378,0},
-dd4059[]={380,0},
-dd4060[]={382,0},
-dd4061[]={595,0},
-dd4062[]={387,0},
-dd4063[]={389,0},
-dd4064[]={392,0},
-dd4065[]={598,0},
-dd4066[]={599,0},
-dd4067[]={396,0},
-dd4068[]={477,0},
-dd4069[]={402,0},
-dd4070[]={608,0},
-dd4071[]={409,0},
-dd4072[]={417,0},
-dd4073[]={419,0},
-dd4074[]={421,0},
-dd4075[]={640,0},
-dd4076[]={424,0},
-dd4077[]={429,0},
-dd4078[]={648,0},
-dd4079[]={432,0},
-dd4080[]={436,0},
-dd4081[]={438,0},
-dd4082[]={441,0},
-dd4083[]={445,0},
-dd4084[]={454,0},
-dd4085[]={457,0},
-dd4086[]={460,0},
-dd4087[]={462,0},
-dd4088[]={464,0},
-dd4089[]={466,0},
-dd4090[]={468,0},
-dd4091[]={470,0},
-dd4092[]={472,0},
-dd4093[]={474,0},
-dd4094[]={476,0},
-dd4095[]={483,0},
-dd4096[]={485,0},
-dd4097[]={487,0},
-dd4098[]={489,0},
-dd4099[]={491,0},
-dd4100[]={499,0},
-dd4101[]={501,0},
-dd4102[]={405,0},
-dd4103[]={447,0},
-dd4104[]={505,0},
-dd4105[]={509,0},
-dd4106[]={513,0},
-dd4107[]={515,0},
-dd4108[]={517,0},
-dd4109[]={519,0},
-dd4110[]={521,0},
-dd4111[]={523,0},
-dd4112[]={525,0},
-dd4113[]={527,0},
-dd4114[]={529,0},
-dd4115[]={531,0},
-dd4116[]={533,0},
-dd4117[]={535,0},
-dd4118[]={537,0},
-dd4119[]={539,0},
-dd4120[]={541,0},
-dd4121[]={543,0},
-dd4122[]={414,0},
-dd4123[]={547,0},
-dd4124[]={549,0},
-dd4125[]={551,0},
-dd4126[]={553,0},
-dd4127[]={557,0},
-dd4128[]={559,0},
-dd4129[]={563,0},
-dd4130[]={11365,0},
-dd4131[]={572,0},
-dd4132[]={410,0},
-dd4133[]={11366,0},
-dd4134[]={578,0},
-dd4135[]={384,0},
-dd4136[]={583,0},
-dd4137[]={585,0},
-dd4138[]={587,0},
-dd4139[]={589,0},
-dd4140[]={591,0},
-dd4141[]={953,776,769,0},
-dd4142[]={970,0},
-dd4143[]={971,0},
-dd4144[]={965,776,769,0},
-dd4145[]={985,0},
-dd4146[]={987,0},
-dd4147[]={991,0},
-dd4148[]={993,0},
-dd4149[]={995,0},
-dd4150[]={997,0},
-dd4151[]={999,0},
-dd4152[]={1001,0},
-dd4153[]={1003,0},
-dd4154[]={1005,0},
-dd4155[]={1007,0},
-dd4156[]={1016,0},
-dd4157[]={1010,0},
-dd4158[]={1019,0},
-dd4159[]={891,0},
-dd4160[]={892,0},
-dd4161[]={893,0},
-dd4162[]={1104,0},
-dd4163[]={1105,0},
-dd4164[]={1106,0},
-dd4165[]={1108,0},
-dd4166[]={1109,0},
-dd4167[]={1110,0},
-dd4168[]={1112,0},
-dd4169[]={1113,0},
-dd4170[]={1114,0},
-dd4171[]={1115,0},
-dd4172[]={1117,0},
-dd4173[]={1118,0},
-dd4174[]={1119,0},
-dd4175[]={1072,0},
-dd4176[]={1073,0},
-dd4177[]={1074,0},
-dd4178[]={1075,0},
-dd4179[]={1076,0},
-dd4180[]={1077,0},
-dd4181[]={1078,0},
-dd4182[]={1079,0},
-dd4183[]={1080,0},
-dd4184[]={1081,0},
-dd4185[]={1082,0},
-dd4186[]={1083,0},
-dd4187[]={1084,0},
-dd4188[]={1086,0},
-dd4189[]={1087,0},
-dd4190[]={1088,0},
-dd4191[]={1089,0},
-dd4192[]={1090,0},
-dd4193[]={1091,0},
-dd4194[]={1092,0},
-dd4195[]={1093,0},
-dd4196[]={1094,0},
-dd4197[]={1095,0},
-dd4198[]={1096,0},
-dd4199[]={1097,0},
-dd4200[]={1098,0},
-dd4201[]={1099,0},
-dd4202[]={1100,0},
-dd4203[]={1101,0},
-dd4204[]={1102,0},
-dd4205[]={1103,0},
-dd4206[]={1121,0},
-dd4207[]={1123,0},
-dd4208[]={1125,0},
-dd4209[]={1127,0},
-dd4210[]={1129,0},
-dd4211[]={1131,0},
-dd4212[]={1133,0},
-dd4213[]={1135,0},
-dd4214[]={1137,0},
-dd4215[]={1139,0},
-dd4216[]={1141,0},
-dd4217[]={1145,0},
-dd4218[]={1147,0},
-dd4219[]={1149,0},
-dd4220[]={1151,0},
-dd4221[]={1153,0},
-dd4222[]={1163,0},
-dd4223[]={1165,0},
-dd4224[]={1167,0},
-dd4225[]={1169,0},
-dd4226[]={1171,0},
-dd4227[]={1173,0},
-dd4228[]={1175,0},
-dd4229[]={1177,0},
-dd4230[]={1179,0},
-dd4231[]={1181,0},
-dd4232[]={1183,0},
-dd4233[]={1185,0},
-dd4234[]={1187,0},
-dd4235[]={1189,0},
-dd4236[]={1191,0},
-dd4237[]={1193,0},
-dd4238[]={1195,0},
-dd4239[]={1197,0},
-dd4240[]={1199,0},
-dd4241[]={1201,0},
-dd4242[]={1203,0},
-dd4243[]={1205,0},
-dd4244[]={1207,0},
-dd4245[]={1209,0},
-dd4246[]={1211,0},
-dd4247[]={1213,0},
-dd4248[]={1215,0},
-dd4249[]={1231,0},
-dd4250[]={1218,0},
-dd4251[]={1220,0},
-dd4252[]={1222,0},
-dd4253[]={1224,0},
-dd4254[]={1226,0},
-dd4255[]={1228,0},
-dd4256[]={1230,0},
-dd4257[]={1233,0},
-dd4258[]={1235,0},
-dd4259[]={1237,0},
-dd4260[]={1239,0},
-dd4261[]={1241,0},
-dd4262[]={1245,0},
-dd4263[]={1249,0},
-dd4264[]={1251,0},
-dd4265[]={1253,0},
-dd4266[]={1257,0},
-dd4267[]={1263,0},
-dd4268[]={1265,0},
-dd4269[]={1267,0},
-dd4270[]={1271,0},
-dd4271[]={1275,0},
-dd4272[]={1277,0},
-dd4273[]={1279,0},
-dd4274[]={1281,0},
-dd4275[]={1283,0},
-dd4276[]={1285,0},
-dd4277[]={1287,0},
-dd4278[]={1289,0},
-dd4279[]={1291,0},
-dd4280[]={1293,0},
-dd4281[]={1295,0},
-dd4282[]={1297,0},
-dd4283[]={1299,0},
-dd4284[]={1377,0},
-dd4285[]={1378,0},
-dd4286[]={1379,0},
-dd4287[]={1380,0},
-dd4288[]={1381,0},
-dd4289[]={1382,0},
-dd4290[]={1383,0},
-dd4291[]={1384,0},
-dd4292[]={1385,0},
-dd4293[]={1386,0},
-dd4294[]={1387,0},
-dd4295[]={1388,0},
-dd4296[]={1389,0},
-dd4297[]={1390,0},
-dd4298[]={1391,0},
-dd4299[]={1392,0},
-dd4300[]={1393,0},
-dd4301[]={1394,0},
-dd4302[]={1395,0},
-dd4303[]={1396,0},
-dd4304[]={1397,0},
-dd4305[]={1398,0},
-dd4306[]={1399,0},
-dd4307[]={1400,0},
-dd4308[]={1401,0},
-dd4309[]={1402,0},
-dd4310[]={1403,0},
-dd4311[]={1404,0},
-dd4312[]={1405,0},
-dd4313[]={1406,0},
-dd4314[]={1407,0},
-dd4315[]={1408,0},
-dd4316[]={1409,0},
-dd4317[]={1410,0},
-dd4318[]={1411,0},
-dd4319[]={1412,0},
-dd4320[]={1413,0},
-dd4321[]={1414,0},
-dd4322[]={11520,0},
-dd4323[]={11521,0},
-dd4324[]={11522,0},
-dd4325[]={11523,0},
-dd4326[]={11524,0},
-dd4327[]={11525,0},
-dd4328[]={11526,0},
-dd4329[]={11527,0},
-dd4330[]={11528,0},
-dd4331[]={11529,0},
-dd4332[]={11530,0},
-dd4333[]={11531,0},
-dd4334[]={11532,0},
-dd4335[]={11533,0},
-dd4336[]={11534,0},
-dd4337[]={11535,0},
-dd4338[]={11536,0},
-dd4339[]={11537,0},
-dd4340[]={11538,0},
-dd4341[]={11539,0},
-dd4342[]={11540,0},
-dd4343[]={11541,0},
-dd4344[]={11542,0},
-dd4345[]={11543,0},
-dd4346[]={11544,0},
-dd4347[]={11545,0},
-dd4348[]={11546,0},
-dd4349[]={11547,0},
-dd4350[]={11548,0},
-dd4351[]={11549,0},
-dd4352[]={11550,0},
-dd4353[]={11551,0},
-dd4354[]={11552,0},
-dd4355[]={11553,0},
-dd4356[]={11554,0},
-dd4357[]={11555,0},
-dd4358[]={11556,0},
-dd4359[]={11557,0},
-dd4360[]={7681,0},
-dd4361[]={7683,0},
-dd4362[]={7685,0},
-dd4363[]={7687,0},
-dd4364[]={7691,0},
-dd4365[]={7693,0},
-dd4366[]={7695,0},
-dd4367[]={7697,0},
-dd4368[]={7699,0},
-dd4369[]={7701,0},
-dd4370[]={7703,0},
-dd4371[]={7705,0},
-dd4372[]={7707,0},
-dd4373[]={7713,0},
-dd4374[]={7715,0},
-dd4375[]={7717,0},
-dd4376[]={7719,0},
-dd4377[]={7721,0},
-dd4378[]={7723,0},
-dd4379[]={7725,0},
-dd4380[]={7729,0},
-dd4381[]={7731,0},
-dd4382[]={7733,0},
-dd4383[]={7735,0},
-dd4384[]={7739,0},
-dd4385[]={7741,0},
-dd4386[]={7743,0},
-dd4387[]={7745,0},
-dd4388[]={7747,0},
-dd4389[]={7749,0},
-dd4390[]={7751,0},
-dd4391[]={7753,0},
-dd4392[]={7755,0},
-dd4393[]={7757,0},
-dd4394[]={7759,0},
-dd4395[]={7761,0},
-dd4396[]={7763,0},
-dd4397[]={7765,0},
-dd4398[]={7767,0},
-dd4399[]={7769,0},
-dd4400[]={7771,0},
-dd4401[]={7775,0},
-dd4402[]={7777,0},
-dd4403[]={7779,0},
-dd4404[]={7787,0},
-dd4405[]={7789,0},
-dd4406[]={7791,0},
-dd4407[]={7793,0},
-dd4408[]={7795,0},
-dd4409[]={7797,0},
-dd4410[]={7799,0},
-dd4411[]={7805,0},
-dd4412[]={7807,0},
-dd4413[]={7809,0},
-dd4414[]={7811,0},
-dd4415[]={7813,0},
-dd4416[]={7815,0},
-dd4417[]={7817,0},
-dd4418[]={7819,0},
-dd4419[]={7821,0},
-dd4420[]={7823,0},
-dd4421[]={7825,0},
-dd4422[]={7827,0},
-dd4423[]={7829,0},
-dd4424[]={7841,0},
-dd4425[]={7843,0},
-dd4426[]={7845,0},
-dd4427[]={7847,0},
-dd4428[]={7849,0},
-dd4429[]={7851,0},
-dd4430[]={7853,0},
-dd4431[]={7855,0},
-dd4432[]={7857,0},
-dd4433[]={7859,0},
-dd4434[]={7861,0},
-dd4435[]={7863,0},
-dd4436[]={7865,0},
-dd4437[]={7867,0},
-dd4438[]={7869,0},
-dd4439[]={7871,0},
-dd4440[]={7873,0},
-dd4441[]={7875,0},
-dd4442[]={7877,0},
-dd4443[]={7881,0},
-dd4444[]={7883,0},
-dd4445[]={7885,0},
-dd4446[]={7887,0},
-dd4447[]={7889,0},
-dd4448[]={7891,0},
-dd4449[]={7893,0},
-dd4450[]={7895,0},
-dd4451[]={7899,0},
-dd4452[]={7901,0},
-dd4453[]={7903,0},
-dd4454[]={7905,0},
-dd4455[]={7907,0},
-dd4456[]={7909,0},
-dd4457[]={7911,0},
-dd4458[]={7913,0},
-dd4459[]={7915,0},
-dd4460[]={7917,0},
-dd4461[]={7919,0},
-dd4462[]={7921,0},
-dd4463[]={7923,0},
-dd4464[]={7925,0},
-dd4465[]={7927,0},
-dd4466[]={7929,0},
-dd4467[]={7936,0},
-dd4468[]={7937,0},
-dd4469[]={7938,0},
-dd4470[]={7939,0},
-dd4471[]={7940,0},
-dd4472[]={7941,0},
-dd4473[]={7942,0},
-dd4474[]={7943,0},
-dd4475[]={7952,0},
-dd4476[]={7953,0},
-dd4477[]={7954,0},
-dd4478[]={7955,0},
-dd4479[]={7956,0},
-dd4480[]={7957,0},
-dd4481[]={7968,0},
-dd4482[]={7969,0},
-dd4483[]={7970,0},
-dd4484[]={7971,0},
-dd4485[]={7972,0},
-dd4486[]={7973,0},
-dd4487[]={7974,0},
-dd4488[]={7975,0},
-dd4489[]={7984,0},
-dd4490[]={7985,0},
-dd4491[]={7986,0},
-dd4492[]={7987,0},
-dd4493[]={7988,0},
-dd4494[]={7989,0},
-dd4495[]={7990,0},
-dd4496[]={7991,0},
-dd4497[]={8000,0},
-dd4498[]={8001,0},
-dd4499[]={8002,0},
-dd4500[]={8003,0},
-dd4501[]={8004,0},
-dd4502[]={8005,0},
-dd4503[]={965,787,768,0},
-dd4504[]={965,787,769,0},
-dd4505[]={965,787,834,0},
-dd4506[]={8017,0},
-dd4507[]={8019,0},
-dd4508[]={8021,0},
-dd4509[]={8023,0},
-dd4510[]={8032,0},
-dd4511[]={8033,0},
-dd4512[]={8034,0},
-dd4513[]={8035,0},
-dd4514[]={8036,0},
-dd4515[]={8037,0},
-dd4516[]={8038,0},
-dd4517[]={8039,0},
-dd4518[]={7936,953,0},
-dd4519[]={7937,953,0},
-dd4520[]={7938,953,0},
-dd4521[]={7939,953,0},
-dd4522[]={7940,953,0},
-dd4523[]={7941,953,0},
-dd4524[]={7942,953,0},
-dd4525[]={7943,953,0},
-dd4526[]={7968,953,0},
-dd4527[]={7969,953,0},
-dd4528[]={7970,953,0},
-dd4529[]={7971,953,0},
-dd4530[]={7972,953,0},
-dd4531[]={7973,953,0},
-dd4532[]={7974,953,0},
-dd4533[]={7975,953,0},
-dd4534[]={8032,953,0},
-dd4535[]={8033,953,0},
-dd4536[]={8034,953,0},
-dd4537[]={8035,953,0},
-dd4538[]={8036,953,0},
-dd4539[]={8037,953,0},
-dd4540[]={8038,953,0},
-dd4541[]={8039,953,0},
-dd4542[]={8048,953,0},
-dd4543[]={945,953,0},
-dd4544[]={940,953,0},
-dd4545[]={945,834,953,0},
-dd4546[]={8112,0},
-dd4547[]={8113,0},
-dd4548[]={8048,0},
-dd4549[]={8049,0},
-dd4550[]={8052,953,0},
-dd4551[]={951,953,0},
-dd4552[]={942,953,0},
-dd4553[]={951,834,953,0},
-dd4554[]={8050,0},
-dd4555[]={8051,0},
-dd4556[]={8052,0},
-dd4557[]={8053,0},
-dd4558[]={953,776,768,0},
-dd4559[]={953,776,834,0},
-dd4560[]={8144,0},
-dd4561[]={8145,0},
-dd4562[]={8054,0},
-dd4563[]={8055,0},
-dd4564[]={965,776,768,0},
-dd4565[]={965,776,834,0},
-dd4566[]={8160,0},
-dd4567[]={8161,0},
-dd4568[]={8058,0},
-dd4569[]={8059,0},
-dd4570[]={8165,0},
-dd4571[]={8060,953,0},
-dd4572[]={969,953,0},
-dd4573[]={974,953,0},
-dd4574[]={969,834,953,0},
-dd4575[]={8056,0},
-dd4576[]={8057,0},
-dd4577[]={8060,0},
-dd4578[]={8061,0},
-dd4579[]={8526,0},
-dd4580[]={8560,0},
-dd4581[]={8561,0},
-dd4582[]={8562,0},
-dd4583[]={8563,0},
-dd4584[]={8564,0},
-dd4585[]={8565,0},
-dd4586[]={8566,0},
-dd4587[]={8567,0},
-dd4588[]={8568,0},
-dd4589[]={8569,0},
-dd4590[]={8570,0},
-dd4591[]={8571,0},
-dd4592[]={8572,0},
-dd4593[]={8573,0},
-dd4594[]={8574,0},
-dd4595[]={8575,0},
-dd4596[]={8580,0},
-dd4597[]={9424,0},
-dd4598[]={9425,0},
-dd4599[]={9426,0},
-dd4600[]={9427,0},
-dd4601[]={9428,0},
-dd4602[]={9429,0},
-dd4603[]={9430,0},
-dd4604[]={9431,0},
-dd4605[]={9432,0},
-dd4606[]={9433,0},
-dd4607[]={9434,0},
-dd4608[]={9435,0},
-dd4609[]={9436,0},
-dd4610[]={9437,0},
-dd4611[]={9438,0},
-dd4612[]={9439,0},
-dd4613[]={9440,0},
-dd4614[]={9441,0},
-dd4615[]={9442,0},
-dd4616[]={9443,0},
-dd4617[]={9444,0},
-dd4618[]={9445,0},
-dd4619[]={9446,0},
-dd4620[]={9447,0},
-dd4621[]={9448,0},
-dd4622[]={9449,0},
-dd4623[]={11312,0},
-dd4624[]={11313,0},
-dd4625[]={11314,0},
-dd4626[]={11315,0},
-dd4627[]={11316,0},
-dd4628[]={11317,0},
-dd4629[]={11318,0},
-dd4630[]={11319,0},
-dd4631[]={11320,0},
-dd4632[]={11321,0},
-dd4633[]={11322,0},
-dd4634[]={11323,0},
-dd4635[]={11324,0},
-dd4636[]={11325,0},
-dd4637[]={11326,0},
-dd4638[]={11327,0},
-dd4639[]={11328,0},
-dd4640[]={11329,0},
-dd4641[]={11330,0},
-dd4642[]={11331,0},
-dd4643[]={11332,0},
-dd4644[]={11333,0},
-dd4645[]={11334,0},
-dd4646[]={11335,0},
-dd4647[]={11336,0},
-dd4648[]={11337,0},
-dd4649[]={11338,0},
-dd4650[]={11339,0},
-dd4651[]={11340,0},
-dd4652[]={11341,0},
-dd4653[]={11342,0},
-dd4654[]={11343,0},
-dd4655[]={11344,0},
-dd4656[]={11345,0},
-dd4657[]={11346,0},
-dd4658[]={11347,0},
-dd4659[]={11348,0},
-dd4660[]={11349,0},
-dd4661[]={11350,0},
-dd4662[]={11351,0},
-dd4663[]={11352,0},
-dd4664[]={11353,0},
-dd4665[]={11354,0},
-dd4666[]={11355,0},
-dd4667[]={11356,0},
-dd4668[]={11357,0},
-dd4669[]={11358,0},
-dd4670[]={11361,0},
-dd4671[]={619,0},
-dd4672[]={7549,0},
-dd4673[]={637,0},
-dd4674[]={11368,0},
-dd4675[]={11370,0},
-dd4676[]={11372,0},
-dd4677[]={11382,0},
-dd4678[]={11393,0},
-dd4679[]={11395,0},
-dd4680[]={11397,0},
-dd4681[]={11399,0},
-dd4682[]={11401,0},
-dd4683[]={11403,0},
-dd4684[]={11405,0},
-dd4685[]={11407,0},
-dd4686[]={11409,0},
-dd4687[]={11411,0},
-dd4688[]={11413,0},
-dd4689[]={11415,0},
-dd4690[]={11417,0},
-dd4691[]={11419,0},
-dd4692[]={11421,0},
-dd4693[]={11423,0},
-dd4694[]={11425,0},
-dd4695[]={11427,0},
-dd4696[]={11429,0},
-dd4697[]={11431,0},
-dd4698[]={11433,0},
-dd4699[]={11435,0},
-dd4700[]={11437,0},
-dd4701[]={11439,0},
-dd4702[]={11441,0},
-dd4703[]={11443,0},
-dd4704[]={11445,0},
-dd4705[]={11447,0},
-dd4706[]={11449,0},
-dd4707[]={11451,0},
-dd4708[]={11453,0},
-dd4709[]={11455,0},
-dd4710[]={11457,0},
-dd4711[]={11459,0},
-dd4712[]={11461,0},
-dd4713[]={11463,0},
-dd4714[]={11465,0},
-dd4715[]={11467,0},
-dd4716[]={11469,0},
-dd4717[]={11471,0},
-dd4718[]={11473,0},
-dd4719[]={11475,0},
-dd4720[]={11477,0},
-dd4721[]={11479,0},
-dd4722[]={11481,0},
-dd4723[]={11483,0},
-dd4724[]={11485,0},
-dd4725[]={11487,0},
-dd4726[]={11489,0},
-dd4727[]={11491,0},
-dd4728[]={65345,0},
-dd4729[]={65346,0},
-dd4730[]={65347,0},
-dd4731[]={65348,0},
-dd4732[]={65349,0},
-dd4733[]={65350,0},
-dd4734[]={65351,0},
-dd4735[]={65352,0},
-dd4736[]={65353,0},
-dd4737[]={65354,0},
-dd4738[]={65355,0},
-dd4739[]={65356,0},
-dd4740[]={65357,0},
-dd4741[]={65358,0},
-dd4742[]={65359,0},
-dd4743[]={65360,0},
-dd4744[]={65361,0},
-dd4745[]={65362,0},
-dd4746[]={65363,0},
-dd4747[]={65364,0},
-dd4748[]={65365,0},
-dd4749[]={65366,0},
-dd4750[]={65367,0},
-dd4751[]={65368,0},
-dd4752[]={65369,0},
-dd4753[]={65370,0},
-dd4754[]={66600,0},
-dd4755[]={66601,0},
-dd4756[]={66602,0},
-dd4757[]={66603,0},
-dd4758[]={66604,0},
-dd4759[]={66605,0},
-dd4760[]={66606,0},
-dd4761[]={66607,0},
-dd4762[]={66608,0},
-dd4763[]={66609,0},
-dd4764[]={66610,0},
-dd4765[]={66611,0},
-dd4766[]={66612,0},
-dd4767[]={66613,0},
-dd4768[]={66614,0},
-dd4769[]={66615,0},
-dd4770[]={66616,0},
-dd4771[]={66617,0},
-dd4772[]={66618,0},
-dd4773[]={66619,0},
-dd4774[]={66620,0},
-dd4775[]={66621,0},
-dd4776[]={66622,0},
-dd4777[]={66623,0},
-dd4778[]={66624,0},
-dd4779[]={66625,0},
-dd4780[]={66626,0},
-dd4781[]={66627,0},
-dd4782[]={66628,0},
-dd4783[]={66629,0},
-dd4784[]={66630,0},
-dd4785[]={66631,0},
-dd4786[]={66632,0},
-dd4787[]={66633,0},
-dd4788[]={66634,0},
-dd4789[]={66635,0},
-dd4790[]={66636,0},
-dd4791[]={66637,0},
-dd4792[]={66638,0},
-dd4793[]={66639,0};
+dd2130[]={42863,0},
+dd2131[]={35912,0},
+dd2132[]={26356,0},
+dd2133[]={36040,0},
+dd2134[]={28369,0},
+dd2135[]={20018,0},
+dd2136[]={21477,0},
+dd2137[]={22865,0},
+dd2138[]={21895,0},
+dd2139[]={22856,0},
+dd2140[]={25078,0},
+dd2141[]={30313,0},
+dd2142[]={32645,0},
+dd2143[]={34367,0},
+dd2144[]={34746,0},
+dd2145[]={35064,0},
+dd2146[]={37007,0},
+dd2147[]={27138,0},
+dd2148[]={27931,0},
+dd2149[]={28889,0},
+dd2150[]={29662,0},
+dd2151[]={33853,0},
+dd2152[]={37226,0},
+dd2153[]={39409,0},
+dd2154[]={20098,0},
+dd2155[]={21365,0},
+dd2156[]={27396,0},
+dd2157[]={29211,0},
+dd2158[]={34349,0},
+dd2159[]={40478,0},
+dd2160[]={23888,0},
+dd2161[]={28651,0},
+dd2162[]={34253,0},
+dd2163[]={35172,0},
+dd2164[]={25289,0},
+dd2165[]={33240,0},
+dd2166[]={34847,0},
+dd2167[]={24266,0},
+dd2168[]={26391,0},
+dd2169[]={28010,0},
+dd2170[]={29436,0},
+dd2171[]={37070,0},
+dd2172[]={20358,0},
+dd2173[]={20919,0},
+dd2174[]={21214,0},
+dd2175[]={25796,0},
+dd2176[]={27347,0},
+dd2177[]={29200,0},
+dd2178[]={30439,0},
+dd2179[]={34310,0},
+dd2180[]={34396,0},
+dd2181[]={36335,0},
+dd2182[]={38706,0},
+dd2183[]={39791,0},
+dd2184[]={40442,0},
+dd2185[]={30860,0},
+dd2186[]={31103,0},
+dd2187[]={32160,0},
+dd2188[]={33737,0},
+dd2189[]={37636,0},
+dd2190[]={35542,0},
+dd2191[]={22751,0},
+dd2192[]={24324,0},
+dd2193[]={31840,0},
+dd2194[]={32894,0},
+dd2195[]={29282,0},
+dd2196[]={30922,0},
+dd2197[]={36034,0},
+dd2198[]={38647,0},
+dd2199[]={22744,0},
+dd2200[]={23650,0},
+dd2201[]={27155,0},
+dd2202[]={28122,0},
+dd2203[]={28431,0},
+dd2204[]={32047,0},
+dd2205[]={32311,0},
+dd2206[]={38475,0},
+dd2207[]={21202,0},
+dd2208[]={32907,0},
+dd2209[]={20956,0},
+dd2210[]={20940,0},
+dd2211[]={31260,0},
+dd2212[]={32190,0},
+dd2213[]={33777,0},
+dd2214[]={38517,0},
+dd2215[]={35712,0},
+dd2216[]={25295,0},
+dd2217[]={35582,0},
+dd2218[]={20025,0},
+dd2219[]={23527,0},
+dd2220[]={24594,0},
+dd2221[]={29575,0},
+dd2222[]={30064,0},
+dd2223[]={21271,0},
+dd2224[]={30971,0},
+dd2225[]={20415,0},
+dd2226[]={24489,0},
+dd2227[]={19981,0},
+dd2228[]={27852,0},
+dd2229[]={25976,0},
+dd2230[]={32034,0},
+dd2231[]={21443,0},
+dd2232[]={22622,0},
+dd2233[]={30465,0},
+dd2234[]={33865,0},
+dd2235[]={35498,0},
+dd2236[]={27578,0},
+dd2237[]={27784,0},
+dd2238[]={25342,0},
+dd2239[]={33509,0},
+dd2240[]={25504,0},
+dd2241[]={30053,0},
+dd2242[]={20142,0},
+dd2243[]={20841,0},
+dd2244[]={20937,0},
+dd2245[]={26753,0},
+dd2246[]={31975,0},
+dd2247[]={33391,0},
+dd2248[]={35538,0},
+dd2249[]={37327,0},
+dd2250[]={21237,0},
+dd2251[]={21570,0},
+dd2252[]={24300,0},
+dd2253[]={26053,0},
+dd2254[]={28670,0},
+dd2255[]={31018,0},
+dd2256[]={38317,0},
+dd2257[]={39530,0},
+dd2258[]={40599,0},
+dd2259[]={40654,0},
+dd2260[]={26310,0},
+dd2261[]={27511,0},
+dd2262[]={36706,0},
+dd2263[]={24180,0},
+dd2264[]={24976,0},
+dd2265[]={25088,0},
+dd2266[]={25754,0},
+dd2267[]={28451,0},
+dd2268[]={29001,0},
+dd2269[]={29833,0},
+dd2270[]={31178,0},
+dd2271[]={32244,0},
+dd2272[]={32879,0},
+dd2273[]={36646,0},
+dd2274[]={34030,0},
+dd2275[]={36899,0},
+dd2276[]={37706,0},
+dd2277[]={21015,0},
+dd2278[]={21155,0},
+dd2279[]={21693,0},
+dd2280[]={28872,0},
+dd2281[]={35010,0},
+dd2282[]={24265,0},
+dd2283[]={24565,0},
+dd2284[]={25467,0},
+dd2285[]={27566,0},
+dd2286[]={31806,0},
+dd2287[]={29557,0},
+dd2288[]={20196,0},
+dd2289[]={22265,0},
+dd2290[]={23994,0},
+dd2291[]={24604,0},
+dd2292[]={29618,0},
+dd2293[]={29801,0},
+dd2294[]={32666,0},
+dd2295[]={32838,0},
+dd2296[]={37428,0},
+dd2297[]={38646,0},
+dd2298[]={38728,0},
+dd2299[]={38936,0},
+dd2300[]={20363,0},
+dd2301[]={31150,0},
+dd2302[]={37300,0},
+dd2303[]={38584,0},
+dd2304[]={24801,0},
+dd2305[]={20102,0},
+dd2306[]={20698,0},
+dd2307[]={23534,0},
+dd2308[]={23615,0},
+dd2309[]={26009,0},
+dd2310[]={29134,0},
+dd2311[]={30274,0},
+dd2312[]={34044,0},
+dd2313[]={36988,0},
+dd2314[]={26248,0},
+dd2315[]={38446,0},
+dd2316[]={21129,0},
+dd2317[]={26491,0},
+dd2318[]={26611,0},
+dd2319[]={27969,0},
+dd2320[]={28316,0},
+dd2321[]={29705,0},
+dd2322[]={30041,0},
+dd2323[]={30827,0},
+dd2324[]={32016,0},
+dd2325[]={39006,0},
+dd2326[]={25134,0},
+dd2327[]={38520,0},
+dd2328[]={20523,0},
+dd2329[]={23833,0},
+dd2330[]={28138,0},
+dd2331[]={36650,0},
+dd2332[]={24459,0},
+dd2333[]={24900,0},
+dd2334[]={26647,0},
+dd2335[]={38534,0},
+dd2336[]={21033,0},
+dd2337[]={21519,0},
+dd2338[]={23653,0},
+dd2339[]={26131,0},
+dd2340[]={26446,0},
+dd2341[]={26792,0},
+dd2342[]={27877,0},
+dd2343[]={29702,0},
+dd2344[]={30178,0},
+dd2345[]={32633,0},
+dd2346[]={35023,0},
+dd2347[]={35041,0},
+dd2348[]={38626,0},
+dd2349[]={21311,0},
+dd2350[]={28346,0},
+dd2351[]={21533,0},
+dd2352[]={29136,0},
+dd2353[]={29848,0},
+dd2354[]={34298,0},
+dd2355[]={38563,0},
+dd2356[]={40023,0},
+dd2357[]={40607,0},
+dd2358[]={26519,0},
+dd2359[]={28107,0},
+dd2360[]={33256,0},
+dd2361[]={31520,0},
+dd2362[]={31890,0},
+dd2363[]={29376,0},
+dd2364[]={28825,0},
+dd2365[]={35672,0},
+dd2366[]={20160,0},
+dd2367[]={33590,0},
+dd2368[]={21050,0},
+dd2369[]={20999,0},
+dd2370[]={24230,0},
+dd2371[]={25299,0},
+dd2372[]={31958,0},
+dd2373[]={23429,0},
+dd2374[]={27934,0},
+dd2375[]={26292,0},
+dd2376[]={36667,0},
+dd2377[]={38477,0},
+dd2378[]={24275,0},
+dd2379[]={20800,0},
+dd2380[]={21952,0},
+dd2381[]={22618,0},
+dd2382[]={26228,0},
+dd2383[]={20958,0},
+dd2384[]={29482,0},
+dd2385[]={30410,0},
+dd2386[]={31036,0},
+dd2387[]={31070,0},
+dd2388[]={31077,0},
+dd2389[]={31119,0},
+dd2390[]={38742,0},
+dd2391[]={31934,0},
+dd2392[]={34322,0},
+dd2393[]={35576,0},
+dd2394[]={36920,0},
+dd2395[]={37117,0},
+dd2396[]={39151,0},
+dd2397[]={39164,0},
+dd2398[]={39208,0},
+dd2399[]={40372,0},
+dd2400[]={20398,0},
+dd2401[]={20711,0},
+dd2402[]={20813,0},
+dd2403[]={21193,0},
+dd2404[]={21220,0},
+dd2405[]={21329,0},
+dd2406[]={21917,0},
+dd2407[]={22022,0},
+dd2408[]={22120,0},
+dd2409[]={22592,0},
+dd2410[]={22696,0},
+dd2411[]={23652,0},
+dd2412[]={24724,0},
+dd2413[]={24936,0},
+dd2414[]={24974,0},
+dd2415[]={25074,0},
+dd2416[]={25935,0},
+dd2417[]={26082,0},
+dd2418[]={26257,0},
+dd2419[]={26757,0},
+dd2420[]={28023,0},
+dd2421[]={28186,0},
+dd2422[]={28450,0},
+dd2423[]={29038,0},
+dd2424[]={29227,0},
+dd2425[]={29730,0},
+dd2426[]={30865,0},
+dd2427[]={31049,0},
+dd2428[]={31048,0},
+dd2429[]={31056,0},
+dd2430[]={31062,0},
+dd2431[]={31117,0},
+dd2432[]={31118,0},
+dd2433[]={31296,0},
+dd2434[]={31361,0},
+dd2435[]={31680,0},
+dd2436[]={32265,0},
+dd2437[]={32321,0},
+dd2438[]={32626,0},
+dd2439[]={32773,0},
+dd2440[]={33261,0},
+dd2441[]={33401,0},
+dd2442[]={33879,0},
+dd2443[]={35088,0},
+dd2444[]={35222,0},
+dd2445[]={35585,0},
+dd2446[]={35641,0},
+dd2447[]={36051,0},
+dd2448[]={36104,0},
+dd2449[]={36790,0},
+dd2450[]={38627,0},
+dd2451[]={38911,0},
+dd2452[]={38971,0},
+dd2453[]={20006,0},
+dd2454[]={20917,0},
+dd2455[]={20840,0},
+dd2456[]={20352,0},
+dd2457[]={20805,0},
+dd2458[]={20864,0},
+dd2459[]={21191,0},
+dd2460[]={21242,0},
+dd2461[]={21845,0},
+dd2462[]={21913,0},
+dd2463[]={21986,0},
+dd2464[]={22707,0},
+dd2465[]={22852,0},
+dd2466[]={22868,0},
+dd2467[]={23138,0},
+dd2468[]={23336,0},
+dd2469[]={24274,0},
+dd2470[]={24281,0},
+dd2471[]={24425,0},
+dd2472[]={24493,0},
+dd2473[]={24792,0},
+dd2474[]={24910,0},
+dd2475[]={24840,0},
+dd2476[]={24928,0},
+dd2477[]={25140,0},
+dd2478[]={25540,0},
+dd2479[]={25628,0},
+dd2480[]={25682,0},
+dd2481[]={25942,0},
+dd2482[]={26395,0},
+dd2483[]={26454,0},
+dd2484[]={28379,0},
+dd2485[]={28363,0},
+dd2486[]={28702,0},
+dd2487[]={30631,0},
+dd2488[]={29237,0},
+dd2489[]={29359,0},
+dd2490[]={29809,0},
+dd2491[]={29958,0},
+dd2492[]={30011,0},
+dd2493[]={30237,0},
+dd2494[]={30239,0},
+dd2495[]={30427,0},
+dd2496[]={30452,0},
+dd2497[]={30538,0},
+dd2498[]={30528,0},
+dd2499[]={30924,0},
+dd2500[]={31409,0},
+dd2501[]={31867,0},
+dd2502[]={32091,0},
+dd2503[]={32574,0},
+dd2504[]={33618,0},
+dd2505[]={33775,0},
+dd2506[]={34681,0},
+dd2507[]={35137,0},
+dd2508[]={35206,0},
+dd2509[]={35519,0},
+dd2510[]={35531,0},
+dd2511[]={35565,0},
+dd2512[]={35722,0},
+dd2513[]={36664,0},
+dd2514[]={36978,0},
+dd2515[]={37273,0},
+dd2516[]={37494,0},
+dd2517[]={38524,0},
+dd2518[]={38875,0},
+dd2519[]={38923,0},
+dd2520[]={39698,0},
+dd2521[]={141386,0},
+dd2522[]={141380,0},
+dd2523[]={144341,0},
+dd2524[]={15261,0},
+dd2525[]={16408,0},
+dd2526[]={16441,0},
+dd2527[]={152137,0},
+dd2528[]={154832,0},
+dd2529[]={163539,0},
+dd2530[]={40771,0},
+dd2531[]={40846,0},
+dd2532[]={102,102,0},
+dd2533[]={102,105,0},
+dd2534[]={102,108,0},
+dd2535[]={102,102,105,0},
+dd2536[]={102,102,108,0},
+dd2537[]={383,116,0},
+dd2538[]={115,116,0},
+dd2539[]={1396,1398,0},
+dd2540[]={1396,1381,0},
+dd2541[]={1396,1387,0},
+dd2542[]={1406,1398,0},
+dd2543[]={1396,1389,0},
+dd2544[]={1497,1460,0},
+dd2545[]={1522,1463,0},
+dd2546[]={1506,0},
+dd2547[]={1492,0},
+dd2548[]={1499,0},
+dd2549[]={1500,0},
+dd2550[]={1501,0},
+dd2551[]={1512,0},
+dd2552[]={1514,0},
+dd2553[]={1513,1473,0},
+dd2554[]={1513,1474,0},
+dd2555[]={64329,1473,0},
+dd2556[]={64329,1474,0},
+dd2557[]={1488,1463,0},
+dd2558[]={1488,1464,0},
+dd2559[]={1488,1468,0},
+dd2560[]={1489,1468,0},
+dd2561[]={1490,1468,0},
+dd2562[]={1491,1468,0},
+dd2563[]={1492,1468,0},
+dd2564[]={1493,1468,0},
+dd2565[]={1494,1468,0},
+dd2566[]={1496,1468,0},
+dd2567[]={1497,1468,0},
+dd2568[]={1498,1468,0},
+dd2569[]={1499,1468,0},
+dd2570[]={1500,1468,0},
+dd2571[]={1502,1468,0},
+dd2572[]={1504,1468,0},
+dd2573[]={1505,1468,0},
+dd2574[]={1507,1468,0},
+dd2575[]={1508,1468,0},
+dd2576[]={1510,1468,0},
+dd2577[]={1511,1468,0},
+dd2578[]={1512,1468,0},
+dd2579[]={1513,1468,0},
+dd2580[]={1514,1468,0},
+dd2581[]={1493,1465,0},
+dd2582[]={1489,1471,0},
+dd2583[]={1499,1471,0},
+dd2584[]={1508,1471,0},
+dd2585[]={1488,1500,0},
+dd2586[]={1649,0},
+dd2587[]={1659,0},
+dd2588[]={1662,0},
+dd2589[]={1664,0},
+dd2590[]={1658,0},
+dd2591[]={1663,0},
+dd2592[]={1657,0},
+dd2593[]={1700,0},
+dd2594[]={1702,0},
+dd2595[]={1668,0},
+dd2596[]={1667,0},
+dd2597[]={1670,0},
+dd2598[]={1671,0},
+dd2599[]={1677,0},
+dd2600[]={1676,0},
+dd2601[]={1678,0},
+dd2602[]={1672,0},
+dd2603[]={1688,0},
+dd2604[]={1681,0},
+dd2605[]={1705,0},
+dd2606[]={1711,0},
+dd2607[]={1715,0},
+dd2608[]={1713,0},
+dd2609[]={1722,0},
+dd2610[]={1723,0},
+dd2611[]={1728,0},
+dd2612[]={1729,0},
+dd2613[]={1726,0},
+dd2614[]={1746,0},
+dd2615[]={1747,0},
+dd2616[]={1709,0},
+dd2617[]={1735,0},
+dd2618[]={1734,0},
+dd2619[]={1736,0},
+dd2620[]={1655,0},
+dd2621[]={1739,0},
+dd2622[]={1733,0},
+dd2623[]={1737,0},
+dd2624[]={1744,0},
+dd2625[]={1609,0},
+dd2626[]={1574,1575,0},
+dd2627[]={1574,1749,0},
+dd2628[]={1574,1608,0},
+dd2629[]={1574,1735,0},
+dd2630[]={1574,1734,0},
+dd2631[]={1574,1736,0},
+dd2632[]={1574,1744,0},
+dd2633[]={1574,1609,0},
+dd2634[]={1740,0},
+dd2635[]={1574,1580,0},
+dd2636[]={1574,1581,0},
+dd2637[]={1574,1605,0},
+dd2638[]={1574,1610,0},
+dd2639[]={1576,1580,0},
+dd2640[]={1576,1581,0},
+dd2641[]={1576,1582,0},
+dd2642[]={1576,1605,0},
+dd2643[]={1576,1609,0},
+dd2644[]={1576,1610,0},
+dd2645[]={1578,1580,0},
+dd2646[]={1578,1581,0},
+dd2647[]={1578,1582,0},
+dd2648[]={1578,1605,0},
+dd2649[]={1578,1609,0},
+dd2650[]={1578,1610,0},
+dd2651[]={1579,1580,0},
+dd2652[]={1579,1605,0},
+dd2653[]={1579,1609,0},
+dd2654[]={1579,1610,0},
+dd2655[]={1580,1581,0},
+dd2656[]={1580,1605,0},
+dd2657[]={1581,1580,0},
+dd2658[]={1581,1605,0},
+dd2659[]={1582,1580,0},
+dd2660[]={1582,1581,0},
+dd2661[]={1582,1605,0},
+dd2662[]={1587,1580,0},
+dd2663[]={1587,1581,0},
+dd2664[]={1587,1582,0},
+dd2665[]={1587,1605,0},
+dd2666[]={1589,1581,0},
+dd2667[]={1589,1605,0},
+dd2668[]={1590,1580,0},
+dd2669[]={1590,1581,0},
+dd2670[]={1590,1582,0},
+dd2671[]={1590,1605,0},
+dd2672[]={1591,1581,0},
+dd2673[]={1591,1605,0},
+dd2674[]={1592,1605,0},
+dd2675[]={1593,1580,0},
+dd2676[]={1593,1605,0},
+dd2677[]={1594,1580,0},
+dd2678[]={1594,1605,0},
+dd2679[]={1601,1580,0},
+dd2680[]={1601,1581,0},
+dd2681[]={1601,1582,0},
+dd2682[]={1601,1605,0},
+dd2683[]={1601,1609,0},
+dd2684[]={1601,1610,0},
+dd2685[]={1602,1581,0},
+dd2686[]={1602,1605,0},
+dd2687[]={1602,1609,0},
+dd2688[]={1602,1610,0},
+dd2689[]={1603,1575,0},
+dd2690[]={1603,1580,0},
+dd2691[]={1603,1581,0},
+dd2692[]={1603,1582,0},
+dd2693[]={1603,1604,0},
+dd2694[]={1603,1605,0},
+dd2695[]={1603,1609,0},
+dd2696[]={1603,1610,0},
+dd2697[]={1604,1580,0},
+dd2698[]={1604,1581,0},
+dd2699[]={1604,1582,0},
+dd2700[]={1604,1605,0},
+dd2701[]={1604,1609,0},
+dd2702[]={1604,1610,0},
+dd2703[]={1605,1580,0},
+dd2704[]={1605,1581,0},
+dd2705[]={1605,1582,0},
+dd2706[]={1605,1605,0},
+dd2707[]={1605,1609,0},
+dd2708[]={1605,1610,0},
+dd2709[]={1606,1580,0},
+dd2710[]={1606,1581,0},
+dd2711[]={1606,1582,0},
+dd2712[]={1606,1605,0},
+dd2713[]={1606,1609,0},
+dd2714[]={1606,1610,0},
+dd2715[]={1607,1580,0},
+dd2716[]={1607,1605,0},
+dd2717[]={1607,1609,0},
+dd2718[]={1607,1610,0},
+dd2719[]={1610,1580,0},
+dd2720[]={1610,1581,0},
+dd2721[]={1610,1582,0},
+dd2722[]={1610,1605,0},
+dd2723[]={1610,1609,0},
+dd2724[]={1610,1610,0},
+dd2725[]={1584,1648,0},
+dd2726[]={1585,1648,0},
+dd2727[]={1609,1648,0},
+dd2728[]={32,1612,1617,0},
+dd2729[]={32,1613,1617,0},
+dd2730[]={32,1614,1617,0},
+dd2731[]={32,1615,1617,0},
+dd2732[]={32,1616,1617,0},
+dd2733[]={32,1617,1648,0},
+dd2734[]={1574,1585,0},
+dd2735[]={1574,1586,0},
+dd2736[]={1574,1606,0},
+dd2737[]={1576,1585,0},
+dd2738[]={1576,1586,0},
+dd2739[]={1576,1606,0},
+dd2740[]={1578,1585,0},
+dd2741[]={1578,1586,0},
+dd2742[]={1578,1606,0},
+dd2743[]={1579,1585,0},
+dd2744[]={1579,1586,0},
+dd2745[]={1579,1606,0},
+dd2746[]={1605,1575,0},
+dd2747[]={1606,1585,0},
+dd2748[]={1606,1586,0},
+dd2749[]={1606,1606,0},
+dd2750[]={1610,1585,0},
+dd2751[]={1610,1586,0},
+dd2752[]={1610,1606,0},
+dd2753[]={1574,1582,0},
+dd2754[]={1574,1607,0},
+dd2755[]={1576,1607,0},
+dd2756[]={1578,1607,0},
+dd2757[]={1589,1582,0},
+dd2758[]={1604,1607,0},
+dd2759[]={1606,1607,0},
+dd2760[]={1607,1648,0},
+dd2761[]={1610,1607,0},
+dd2762[]={1579,1607,0},
+dd2763[]={1587,1607,0},
+dd2764[]={1588,1605,0},
+dd2765[]={1588,1607,0},
+dd2766[]={1600,1614,1617,0},
+dd2767[]={1600,1615,1617,0},
+dd2768[]={1600,1616,1617,0},
+dd2769[]={1591,1609,0},
+dd2770[]={1591,1610,0},
+dd2771[]={1593,1609,0},
+dd2772[]={1593,1610,0},
+dd2773[]={1594,1609,0},
+dd2774[]={1594,1610,0},
+dd2775[]={1587,1609,0},
+dd2776[]={1587,1610,0},
+dd2777[]={1588,1609,0},
+dd2778[]={1588,1610,0},
+dd2779[]={1581,1609,0},
+dd2780[]={1581,1610,0},
+dd2781[]={1580,1609,0},
+dd2782[]={1580,1610,0},
+dd2783[]={1582,1609,0},
+dd2784[]={1582,1610,0},
+dd2785[]={1589,1609,0},
+dd2786[]={1589,1610,0},
+dd2787[]={1590,1609,0},
+dd2788[]={1590,1610,0},
+dd2789[]={1588,1580,0},
+dd2790[]={1588,1581,0},
+dd2791[]={1588,1582,0},
+dd2792[]={1588,1585,0},
+dd2793[]={1587,1585,0},
+dd2794[]={1589,1585,0},
+dd2795[]={1590,1585,0},
+dd2796[]={1575,1611,0},
+dd2797[]={1578,1580,1605,0},
+dd2798[]={1578,1581,1580,0},
+dd2799[]={1578,1581,1605,0},
+dd2800[]={1578,1582,1605,0},
+dd2801[]={1578,1605,1580,0},
+dd2802[]={1578,1605,1581,0},
+dd2803[]={1578,1605,1582,0},
+dd2804[]={1580,1605,1581,0},
+dd2805[]={1581,1605,1610,0},
+dd2806[]={1581,1605,1609,0},
+dd2807[]={1587,1581,1580,0},
+dd2808[]={1587,1580,1581,0},
+dd2809[]={1587,1580,1609,0},
+dd2810[]={1587,1605,1581,0},
+dd2811[]={1587,1605,1580,0},
+dd2812[]={1587,1605,1605,0},
+dd2813[]={1589,1581,1581,0},
+dd2814[]={1589,1605,1605,0},
+dd2815[]={1588,1581,1605,0},
+dd2816[]={1588,1580,1610,0},
+dd2817[]={1588,1605,1582,0},
+dd2818[]={1588,1605,1605,0},
+dd2819[]={1590,1581,1609,0},
+dd2820[]={1590,1582,1605,0},
+dd2821[]={1591,1605,1581,0},
+dd2822[]={1591,1605,1605,0},
+dd2823[]={1591,1605,1610,0},
+dd2824[]={1593,1580,1605,0},
+dd2825[]={1593,1605,1605,0},
+dd2826[]={1593,1605,1609,0},
+dd2827[]={1594,1605,1605,0},
+dd2828[]={1594,1605,1610,0},
+dd2829[]={1594,1605,1609,0},
+dd2830[]={1601,1582,1605,0},
+dd2831[]={1602,1605,1581,0},
+dd2832[]={1602,1605,1605,0},
+dd2833[]={1604,1581,1605,0},
+dd2834[]={1604,1581,1610,0},
+dd2835[]={1604,1581,1609,0},
+dd2836[]={1604,1580,1580,0},
+dd2837[]={1604,1582,1605,0},
+dd2838[]={1604,1605,1581,0},
+dd2839[]={1605,1581,1580,0},
+dd2840[]={1605,1581,1605,0},
+dd2841[]={1605,1581,1610,0},
+dd2842[]={1605,1580,1581,0},
+dd2843[]={1605,1580,1605,0},
+dd2844[]={1605,1582,1580,0},
+dd2845[]={1605,1582,1605,0},
+dd2846[]={1605,1580,1582,0},
+dd2847[]={1607,1605,1580,0},
+dd2848[]={1607,1605,1605,0},
+dd2849[]={1606,1581,1605,0},
+dd2850[]={1606,1581,1609,0},
+dd2851[]={1606,1580,1605,0},
+dd2852[]={1606,1580,1609,0},
+dd2853[]={1606,1605,1610,0},
+dd2854[]={1606,1605,1609,0},
+dd2855[]={1610,1605,1605,0},
+dd2856[]={1576,1582,1610,0},
+dd2857[]={1578,1580,1610,0},
+dd2858[]={1578,1580,1609,0},
+dd2859[]={1578,1582,1610,0},
+dd2860[]={1578,1582,1609,0},
+dd2861[]={1578,1605,1610,0},
+dd2862[]={1578,1605,1609,0},
+dd2863[]={1580,1605,1610,0},
+dd2864[]={1580,1581,1609,0},
+dd2865[]={1580,1605,1609,0},
+dd2866[]={1587,1582,1609,0},
+dd2867[]={1589,1581,1610,0},
+dd2868[]={1588,1581,1610,0},
+dd2869[]={1590,1581,1610,0},
+dd2870[]={1604,1580,1610,0},
+dd2871[]={1604,1605,1610,0},
+dd2872[]={1610,1581,1610,0},
+dd2873[]={1610,1580,1610,0},
+dd2874[]={1610,1605,1610,0},
+dd2875[]={1605,1605,1610,0},
+dd2876[]={1602,1605,1610,0},
+dd2877[]={1606,1581,1610,0},
+dd2878[]={1593,1605,1610,0},
+dd2879[]={1603,1605,1610,0},
+dd2880[]={1606,1580,1581,0},
+dd2881[]={1605,1582,1610,0},
+dd2882[]={1604,1580,1605,0},
+dd2883[]={1603,1605,1605,0},
+dd2884[]={1580,1581,1610,0},
+dd2885[]={1581,1580,1610,0},
+dd2886[]={1605,1580,1610,0},
+dd2887[]={1601,1605,1610,0},
+dd2888[]={1576,1581,1610,0},
+dd2889[]={1587,1582,1610,0},
+dd2890[]={1606,1580,1610,0},
+dd2891[]={1589,1604,1746,0},
+dd2892[]={1602,1604,1746,0},
+dd2893[]={1575,1604,1604,1607,0},
+dd2894[]={1575,1603,1576,1585,0},
+dd2895[]={1605,1581,1605,1583,0},
+dd2896[]={1589,1604,1593,1605,0},
+dd2897[]={1585,1587,1608,1604,0},
+dd2898[]={1593,1604,1610,1607,0},
+dd2899[]={1608,1587,1604,1605,0},
+dd2900[]={1589,1604,1609,0},
+dd2901[]={1589,1604,1609,32,1575,1604,1604,1607,32,1593,1604,1610,1607,32,1608,1587,1604,1605,0},
+dd2902[]={1580,1604,32,1580,1604,1575,1604,1607,0},
+dd2903[]={1585,1740,1575,1604,0},
+dd2904[]={44,0},
+dd2905[]={12289,0},
+dd2906[]={12290,0},
+dd2907[]={58,0},
+dd2908[]={33,0},
+dd2909[]={63,0},
+dd2910[]={12310,0},
+dd2911[]={12311,0},
+dd2912[]={8230,0},
+dd2913[]={8229,0},
+dd2914[]={8212,0},
+dd2915[]={8211,0},
+dd2916[]={95,0},
+dd2917[]={123,0},
+dd2918[]={125,0},
+dd2919[]={12308,0},
+dd2920[]={12309,0},
+dd2921[]={12304,0},
+dd2922[]={12305,0},
+dd2923[]={12298,0},
+dd2924[]={12299,0},
+dd2925[]={12300,0},
+dd2926[]={12301,0},
+dd2927[]={12302,0},
+dd2928[]={12303,0},
+dd2929[]={91,0},
+dd2930[]={93,0},
+dd2931[]={8254,0},
+dd2932[]={35,0},
+dd2933[]={38,0},
+dd2934[]={42,0},
+dd2935[]={45,0},
+dd2936[]={60,0},
+dd2937[]={62,0},
+dd2938[]={92,0},
+dd2939[]={36,0},
+dd2940[]={37,0},
+dd2941[]={64,0},
+dd2942[]={32,1611,0},
+dd2943[]={1600,1611,0},
+dd2944[]={32,1612,0},
+dd2945[]={32,1613,0},
+dd2946[]={32,1614,0},
+dd2947[]={1600,1614,0},
+dd2948[]={32,1615,0},
+dd2949[]={1600,1615,0},
+dd2950[]={32,1616,0},
+dd2951[]={1600,1616,0},
+dd2952[]={32,1617,0},
+dd2953[]={1600,1617,0},
+dd2954[]={32,1618,0},
+dd2955[]={1600,1618,0},
+dd2956[]={1569,0},
+dd2957[]={1570,0},
+dd2958[]={1571,0},
+dd2959[]={1572,0},
+dd2960[]={1573,0},
+dd2961[]={1574,0},
+dd2962[]={1575,0},
+dd2963[]={1576,0},
+dd2964[]={1577,0},
+dd2965[]={1578,0},
+dd2966[]={1579,0},
+dd2967[]={1580,0},
+dd2968[]={1581,0},
+dd2969[]={1582,0},
+dd2970[]={1583,0},
+dd2971[]={1584,0},
+dd2972[]={1585,0},
+dd2973[]={1586,0},
+dd2974[]={1587,0},
+dd2975[]={1588,0},
+dd2976[]={1589,0},
+dd2977[]={1590,0},
+dd2978[]={1591,0},
+dd2979[]={1592,0},
+dd2980[]={1593,0},
+dd2981[]={1594,0},
+dd2982[]={1601,0},
+dd2983[]={1602,0},
+dd2984[]={1603,0},
+dd2985[]={1604,0},
+dd2986[]={1605,0},
+dd2987[]={1606,0},
+dd2988[]={1607,0},
+dd2989[]={1608,0},
+dd2990[]={1610,0},
+dd2991[]={1604,1570,0},
+dd2992[]={1604,1571,0},
+dd2993[]={1604,1573,0},
+dd2994[]={1604,1575,0},
+dd2995[]={34,0},
+dd2996[]={39,0},
+dd2997[]={47,0},
+dd2998[]={94,0},
+dd2999[]={124,0},
+dd3000[]={126,0},
+dd3001[]={10629,0},
+dd3002[]={10630,0},
+dd3003[]={12539,0},
+dd3004[]={12449,0},
+dd3005[]={12451,0},
+dd3006[]={12453,0},
+dd3007[]={12455,0},
+dd3008[]={12457,0},
+dd3009[]={12515,0},
+dd3010[]={12517,0},
+dd3011[]={12519,0},
+dd3012[]={12483,0},
+dd3013[]={12540,0},
+dd3014[]={12531,0},
+dd3015[]={12441,0},
+dd3016[]={12442,0},
+dd3017[]={12644,0},
+dd3018[]={12593,0},
+dd3019[]={12594,0},
+dd3020[]={12595,0},
+dd3021[]={12596,0},
+dd3022[]={12597,0},
+dd3023[]={12598,0},
+dd3024[]={12599,0},
+dd3025[]={12600,0},
+dd3026[]={12601,0},
+dd3027[]={12602,0},
+dd3028[]={12603,0},
+dd3029[]={12604,0},
+dd3030[]={12605,0},
+dd3031[]={12606,0},
+dd3032[]={12607,0},
+dd3033[]={12608,0},
+dd3034[]={12609,0},
+dd3035[]={12610,0},
+dd3036[]={12611,0},
+dd3037[]={12612,0},
+dd3038[]={12613,0},
+dd3039[]={12614,0},
+dd3040[]={12615,0},
+dd3041[]={12616,0},
+dd3042[]={12617,0},
+dd3043[]={12618,0},
+dd3044[]={12619,0},
+dd3045[]={12620,0},
+dd3046[]={12621,0},
+dd3047[]={12622,0},
+dd3048[]={12623,0},
+dd3049[]={12624,0},
+dd3050[]={12625,0},
+dd3051[]={12626,0},
+dd3052[]={12627,0},
+dd3053[]={12628,0},
+dd3054[]={12629,0},
+dd3055[]={12630,0},
+dd3056[]={12631,0},
+dd3057[]={12632,0},
+dd3058[]={12633,0},
+dd3059[]={12634,0},
+dd3060[]={12635,0},
+dd3061[]={12636,0},
+dd3062[]={12637,0},
+dd3063[]={12638,0},
+dd3064[]={12639,0},
+dd3065[]={12640,0},
+dd3066[]={12641,0},
+dd3067[]={12642,0},
+dd3068[]={12643,0},
+dd3069[]={162,0},
+dd3070[]={163,0},
+dd3071[]={172,0},
+dd3072[]={175,0},
+dd3073[]={166,0},
+dd3074[]={165,0},
+dd3075[]={8361,0},
+dd3076[]={9474,0},
+dd3077[]={8592,0},
+dd3078[]={8593,0},
+dd3079[]={8594,0},
+dd3080[]={8595,0},
+dd3081[]={9632,0},
+dd3082[]={9675,0},
+dd3083[]={119127,119141,0},
+dd3084[]={119128,119141,0},
+dd3085[]={119135,119150,0},
+dd3086[]={119135,119151,0},
+dd3087[]={119135,119152,0},
+dd3088[]={119135,119153,0},
+dd3089[]={119135,119154,0},
+dd3090[]={119225,119141,0},
+dd3091[]={119226,119141,0},
+dd3092[]={119227,119150,0},
+dd3093[]={119228,119150,0},
+dd3094[]={119227,119151,0},
+dd3095[]={119228,119151,0},
+dd3096[]={305,0},
+dd3097[]={567,0},
+dd3098[]={913,0},
+dd3099[]={914,0},
+dd3100[]={916,0},
+dd3101[]={917,0},
+dd3102[]={918,0},
+dd3103[]={919,0},
+dd3104[]={921,0},
+dd3105[]={922,0},
+dd3106[]={923,0},
+dd3107[]={924,0},
+dd3108[]={925,0},
+dd3109[]={926,0},
+dd3110[]={927,0},
+dd3111[]={929,0},
+dd3112[]={1012,0},
+dd3113[]={932,0},
+dd3114[]={934,0},
+dd3115[]={935,0},
+dd3116[]={936,0},
+dd3117[]={8711,0},
+dd3118[]={945,0},
+dd3119[]={950,0},
+dd3120[]={951,0},
+dd3121[]={955,0},
+dd3122[]={957,0},
+dd3123[]={958,0},
+dd3124[]={959,0},
+dd3125[]={963,0},
+dd3126[]={964,0},
+dd3127[]={965,0},
+dd3128[]={968,0},
+dd3129[]={969,0},
+dd3130[]={8706,0},
+dd3131[]={1013,0},
+dd3132[]={977,0},
+dd3133[]={1008,0},
+dd3134[]={981,0},
+dd3135[]={1009,0},
+dd3136[]={982,0},
+dd3137[]={988,0},
+dd3138[]={989,0},
+dd3139[]={20029,0},
+dd3140[]={20024,0},
+dd3141[]={20033,0},
+dd3142[]={131362,0},
+dd3143[]={20320,0},
+dd3144[]={20411,0},
+dd3145[]={20482,0},
+dd3146[]={20602,0},
+dd3147[]={20633,0},
+dd3148[]={20687,0},
+dd3149[]={13470,0},
+dd3150[]={132666,0},
+dd3151[]={20820,0},
+dd3152[]={20836,0},
+dd3153[]={20855,0},
+dd3154[]={132380,0},
+dd3155[]={13497,0},
+dd3156[]={20839,0},
+dd3157[]={20877,0},
+dd3158[]={132427,0},
+dd3159[]={20887,0},
+dd3160[]={20900,0},
+dd3161[]={20172,0},
+dd3162[]={20908,0},
+dd3163[]={168415,0},
+dd3164[]={20995,0},
+dd3165[]={13535,0},
+dd3166[]={21051,0},
+dd3167[]={21062,0},
+dd3168[]={21106,0},
+dd3169[]={21111,0},
+dd3170[]={13589,0},
+dd3171[]={21253,0},
+dd3172[]={21254,0},
+dd3173[]={21321,0},
+dd3174[]={21338,0},
+dd3175[]={21363,0},
+dd3176[]={21373,0},
+dd3177[]={21375,0},
+dd3178[]={133676,0},
+dd3179[]={28784,0},
+dd3180[]={21450,0},
+dd3181[]={21471,0},
+dd3182[]={133987,0},
+dd3183[]={21483,0},
+dd3184[]={21489,0},
+dd3185[]={21510,0},
+dd3186[]={21662,0},
+dd3187[]={21560,0},
+dd3188[]={21576,0},
+dd3189[]={21608,0},
+dd3190[]={21666,0},
+dd3191[]={21750,0},
+dd3192[]={21776,0},
+dd3193[]={21843,0},
+dd3194[]={21859,0},
+dd3195[]={21892,0},
+dd3196[]={21931,0},
+dd3197[]={21939,0},
+dd3198[]={21954,0},
+dd3199[]={22294,0},
+dd3200[]={22295,0},
+dd3201[]={22097,0},
+dd3202[]={22132,0},
+dd3203[]={22766,0},
+dd3204[]={22478,0},
+dd3205[]={22516,0},
+dd3206[]={22541,0},
+dd3207[]={22411,0},
+dd3208[]={22578,0},
+dd3209[]={22577,0},
+dd3210[]={22700,0},
+dd3211[]={136420,0},
+dd3212[]={22770,0},
+dd3213[]={22775,0},
+dd3214[]={22790,0},
+dd3215[]={22810,0},
+dd3216[]={22818,0},
+dd3217[]={22882,0},
+dd3218[]={136872,0},
+dd3219[]={136938,0},
+dd3220[]={23020,0},
+dd3221[]={23067,0},
+dd3222[]={23079,0},
+dd3223[]={23000,0},
+dd3224[]={23142,0},
+dd3225[]={14062,0},
+dd3226[]={14076,0},
+dd3227[]={23304,0},
+dd3228[]={23358,0},
+dd3229[]={137672,0},
+dd3230[]={23491,0},
+dd3231[]={23512,0},
+dd3232[]={23539,0},
+dd3233[]={138008,0},
+dd3234[]={23551,0},
+dd3235[]={23558,0},
+dd3236[]={24403,0},
+dd3237[]={14209,0},
+dd3238[]={23648,0},
+dd3239[]={23744,0},
+dd3240[]={23693,0},
+dd3241[]={138724,0},
+dd3242[]={23875,0},
+dd3243[]={138726,0},
+dd3244[]={23918,0},
+dd3245[]={23915,0},
+dd3246[]={23932,0},
+dd3247[]={24033,0},
+dd3248[]={24034,0},
+dd3249[]={14383,0},
+dd3250[]={24061,0},
+dd3251[]={24104,0},
+dd3252[]={24125,0},
+dd3253[]={24169,0},
+dd3254[]={14434,0},
+dd3255[]={139651,0},
+dd3256[]={14460,0},
+dd3257[]={24240,0},
+dd3258[]={24243,0},
+dd3259[]={24246,0},
+dd3260[]={172946,0},
+dd3261[]={140081,0},
+dd3262[]={33281,0},
+dd3263[]={24354,0},
+dd3264[]={14535,0},
+dd3265[]={144056,0},
+dd3266[]={156122,0},
+dd3267[]={24418,0},
+dd3268[]={24427,0},
+dd3269[]={14563,0},
+dd3270[]={24474,0},
+dd3271[]={24525,0},
+dd3272[]={24535,0},
+dd3273[]={24569,0},
+dd3274[]={24705,0},
+dd3275[]={14650,0},
+dd3276[]={14620,0},
+dd3277[]={141012,0},
+dd3278[]={24775,0},
+dd3279[]={24904,0},
+dd3280[]={24908,0},
+dd3281[]={24954,0},
+dd3282[]={25010,0},
+dd3283[]={24996,0},
+dd3284[]={25007,0},
+dd3285[]={25054,0},
+dd3286[]={25104,0},
+dd3287[]={25115,0},
+dd3288[]={25181,0},
+dd3289[]={25265,0},
+dd3290[]={25300,0},
+dd3291[]={25424,0},
+dd3292[]={142092,0},
+dd3293[]={25405,0},
+dd3294[]={25340,0},
+dd3295[]={25448,0},
+dd3296[]={25475,0},
+dd3297[]={25572,0},
+dd3298[]={142321,0},
+dd3299[]={25634,0},
+dd3300[]={25541,0},
+dd3301[]={25513,0},
+dd3302[]={14894,0},
+dd3303[]={25705,0},
+dd3304[]={25726,0},
+dd3305[]={25757,0},
+dd3306[]={25719,0},
+dd3307[]={14956,0},
+dd3308[]={25964,0},
+dd3309[]={143370,0},
+dd3310[]={26083,0},
+dd3311[]={26360,0},
+dd3312[]={26185,0},
+dd3313[]={15129,0},
+dd3314[]={15112,0},
+dd3315[]={15076,0},
+dd3316[]={20882,0},
+dd3317[]={20885,0},
+dd3318[]={26368,0},
+dd3319[]={26268,0},
+dd3320[]={32941,0},
+dd3321[]={17369,0},
+dd3322[]={26401,0},
+dd3323[]={26462,0},
+dd3324[]={26451,0},
+dd3325[]={144323,0},
+dd3326[]={15177,0},
+dd3327[]={26618,0},
+dd3328[]={26501,0},
+dd3329[]={26706,0},
+dd3330[]={144493,0},
+dd3331[]={26766,0},
+dd3332[]={26655,0},
+dd3333[]={26900,0},
+dd3334[]={26946,0},
+dd3335[]={27043,0},
+dd3336[]={27114,0},
+dd3337[]={27304,0},
+dd3338[]={145059,0},
+dd3339[]={27355,0},
+dd3340[]={15384,0},
+dd3341[]={27425,0},
+dd3342[]={145575,0},
+dd3343[]={27476,0},
+dd3344[]={15438,0},
+dd3345[]={27506,0},
+dd3346[]={27551,0},
+dd3347[]={27579,0},
+dd3348[]={146061,0},
+dd3349[]={138507,0},
+dd3350[]={146170,0},
+dd3351[]={27726,0},
+dd3352[]={146620,0},
+dd3353[]={27839,0},
+dd3354[]={27853,0},
+dd3355[]={27751,0},
+dd3356[]={27926,0},
+dd3357[]={27966,0},
+dd3358[]={28009,0},
+dd3359[]={28024,0},
+dd3360[]={28037,0},
+dd3361[]={146718,0},
+dd3362[]={27956,0},
+dd3363[]={28207,0},
+dd3364[]={28270,0},
+dd3365[]={15667,0},
+dd3366[]={28359,0},
+dd3367[]={147153,0},
+dd3368[]={28153,0},
+dd3369[]={28526,0},
+dd3370[]={147294,0},
+dd3371[]={147342,0},
+dd3372[]={28614,0},
+dd3373[]={28729,0},
+dd3374[]={28699,0},
+dd3375[]={15766,0},
+dd3376[]={28746,0},
+dd3377[]={28797,0},
+dd3378[]={28791,0},
+dd3379[]={28845,0},
+dd3380[]={132389,0},
+dd3381[]={28997,0},
+dd3382[]={148067,0},
+dd3383[]={29084,0},
+dd3384[]={148395,0},
+dd3385[]={29224,0},
+dd3386[]={29264,0},
+dd3387[]={149000,0},
+dd3388[]={29312,0},
+dd3389[]={29333,0},
+dd3390[]={149301,0},
+dd3391[]={149524,0},
+dd3392[]={29562,0},
+dd3393[]={29579,0},
+dd3394[]={16044,0},
+dd3395[]={29605,0},
+dd3396[]={16056,0},
+dd3397[]={29767,0},
+dd3398[]={29788,0},
+dd3399[]={29829,0},
+dd3400[]={29898,0},
+dd3401[]={16155,0},
+dd3402[]={29988,0},
+dd3403[]={150582,0},
+dd3404[]={30014,0},
+dd3405[]={150674,0},
+dd3406[]={139679,0},
+dd3407[]={30224,0},
+dd3408[]={151457,0},
+dd3409[]={151480,0},
+dd3410[]={151620,0},
+dd3411[]={16380,0},
+dd3412[]={16392,0},
+dd3413[]={151795,0},
+dd3414[]={151794,0},
+dd3415[]={151833,0},
+dd3416[]={151859,0},
+dd3417[]={30494,0},
+dd3418[]={30495,0},
+dd3419[]={30603,0},
+dd3420[]={16454,0},
+dd3421[]={16534,0},
+dd3422[]={152605,0},
+dd3423[]={30798,0},
+dd3424[]={16611,0},
+dd3425[]={153126,0},
+dd3426[]={153242,0},
+dd3427[]={153285,0},
+dd3428[]={31211,0},
+dd3429[]={16687,0},
+dd3430[]={31306,0},
+dd3431[]={31311,0},
+dd3432[]={153980,0},
+dd3433[]={154279,0},
+dd3434[]={31470,0},
+dd3435[]={16898,0},
+dd3436[]={154539,0},
+dd3437[]={31686,0},
+dd3438[]={31689,0},
+dd3439[]={16935,0},
+dd3440[]={154752,0},
+dd3441[]={31954,0},
+dd3442[]={17056,0},
+dd3443[]={31976,0},
+dd3444[]={31971,0},
+dd3445[]={32000,0},
+dd3446[]={155526,0},
+dd3447[]={32099,0},
+dd3448[]={17153,0},
+dd3449[]={32199,0},
+dd3450[]={32258,0},
+dd3451[]={32325,0},
+dd3452[]={17204,0},
+dd3453[]={156200,0},
+dd3454[]={156231,0},
+dd3455[]={17241,0},
+dd3456[]={156377,0},
+dd3457[]={32634,0},
+dd3458[]={156478,0},
+dd3459[]={32661,0},
+dd3460[]={32762,0},
+dd3461[]={156890,0},
+dd3462[]={156963,0},
+dd3463[]={32864,0},
+dd3464[]={157096,0},
+dd3465[]={32880,0},
+dd3466[]={144223,0},
+dd3467[]={17365,0},
+dd3468[]={32946,0},
+dd3469[]={33027,0},
+dd3470[]={17419,0},
+dd3471[]={33086,0},
+dd3472[]={23221,0},
+dd3473[]={157607,0},
+dd3474[]={157621,0},
+dd3475[]={144275,0},
+dd3476[]={144284,0},
+dd3477[]={33284,0},
+dd3478[]={36766,0},
+dd3479[]={17515,0},
+dd3480[]={33425,0},
+dd3481[]={33419,0},
+dd3482[]={33437,0},
+dd3483[]={21171,0},
+dd3484[]={33457,0},
+dd3485[]={33459,0},
+dd3486[]={33469,0},
+dd3487[]={33510,0},
+dd3488[]={158524,0},
+dd3489[]={33565,0},
+dd3490[]={33635,0},
+dd3491[]={33709,0},
+dd3492[]={33571,0},
+dd3493[]={33725,0},
+dd3494[]={33767,0},
+dd3495[]={33619,0},
+dd3496[]={33738,0},
+dd3497[]={33740,0},
+dd3498[]={33756,0},
+dd3499[]={158774,0},
+dd3500[]={159083,0},
+dd3501[]={158933,0},
+dd3502[]={17707,0},
+dd3503[]={34033,0},
+dd3504[]={34035,0},
+dd3505[]={34070,0},
+dd3506[]={160714,0},
+dd3507[]={34148,0},
+dd3508[]={159532,0},
+dd3509[]={17757,0},
+dd3510[]={17761,0},
+dd3511[]={159665,0},
+dd3512[]={159954,0},
+dd3513[]={17771,0},
+dd3514[]={34384,0},
+dd3515[]={34407,0},
+dd3516[]={34409,0},
+dd3517[]={34473,0},
+dd3518[]={34440,0},
+dd3519[]={34574,0},
+dd3520[]={34530,0},
+dd3521[]={34600,0},
+dd3522[]={34667,0},
+dd3523[]={34694,0},
+dd3524[]={17879,0},
+dd3525[]={34785,0},
+dd3526[]={34817,0},
+dd3527[]={17913,0},
+dd3528[]={34912,0},
+dd3529[]={161383,0},
+dd3530[]={35031,0},
+dd3531[]={35038,0},
+dd3532[]={17973,0},
+dd3533[]={35066,0},
+dd3534[]={13499,0},
+dd3535[]={161966,0},
+dd3536[]={162150,0},
+dd3537[]={18110,0},
+dd3538[]={18119,0},
+dd3539[]={35488,0},
+dd3540[]={162984,0},
+dd3541[]={36011,0},
+dd3542[]={36033,0},
+dd3543[]={36123,0},
+dd3544[]={36215,0},
+dd3545[]={163631,0},
+dd3546[]={133124,0},
+dd3547[]={36299,0},
+dd3548[]={36284,0},
+dd3549[]={36336,0},
+dd3550[]={133342,0},
+dd3551[]={36564,0},
+dd3552[]={165330,0},
+dd3553[]={165357,0},
+dd3554[]={37012,0},
+dd3555[]={37105,0},
+dd3556[]={37137,0},
+dd3557[]={165678,0},
+dd3558[]={37147,0},
+dd3559[]={37432,0},
+dd3560[]={37591,0},
+dd3561[]={37592,0},
+dd3562[]={37500,0},
+dd3563[]={37881,0},
+dd3564[]={37909,0},
+dd3565[]={166906,0},
+dd3566[]={38283,0},
+dd3567[]={18837,0},
+dd3568[]={38327,0},
+dd3569[]={167287,0},
+dd3570[]={18918,0},
+dd3571[]={38595,0},
+dd3572[]={23986,0},
+dd3573[]={38691,0},
+dd3574[]={168261,0},
+dd3575[]={168474,0},
+dd3576[]={19054,0},
+dd3577[]={19062,0},
+dd3578[]={38880,0},
+dd3579[]={168970,0},
+dd3580[]={19122,0},
+dd3581[]={169110,0},
+dd3582[]={38953,0},
+dd3583[]={169398,0},
+dd3584[]={39138,0},
+dd3585[]={19251,0},
+dd3586[]={39209,0},
+dd3587[]={39335,0},
+dd3588[]={39362,0},
+dd3589[]={39422,0},
+dd3590[]={19406,0},
+dd3591[]={170800,0},
+dd3592[]={40000,0},
+dd3593[]={40189,0},
+dd3594[]={19662,0},
+dd3595[]={19693,0},
+dd3596[]={40295,0},
+dd3597[]={172238,0},
+dd3598[]={19704,0},
+dd3599[]={172293,0},
+dd3600[]={172558,0},
+dd3601[]={172689,0},
+dd3602[]={19798,0},
+dd3603[]={40702,0},
+dd3604[]={40709,0},
+dd3605[]={40719,0},
+dd3606[]={40726,0},
+dd3607[]={173568,0},
+dd3608[]={8814,0},
+dd3609[]={8800,0},
+dd3610[]={8815,0},
+dd3611[]={192,193,194,195,196,197,256,258,260,461,512,514,550,7680,7840,7842,0},
+dd3612[]={7682,7684,7686,0},
+dd3613[]={199,262,264,266,268,0},
+dd3614[]={270,7690,7692,7694,7696,7698,0},
+dd3615[]={200,201,202,203,274,276,278,280,282,516,518,552,7704,7706,7864,7866,7868,0},
+dd3616[]={7710,0},
+dd3617[]={284,286,288,290,486,500,7712,0},
+dd3618[]={292,542,7714,7716,7718,7720,7722,0},
+dd3619[]={204,205,206,207,296,298,300,302,304,463,520,522,7724,7880,7882,0},
+dd3620[]={308,0},
+dd3621[]={310,488,7728,7730,7732,0},
+dd3622[]={313,315,317,7734,7738,7740,0},
+dd3623[]={7742,7744,7746,0},
+dd3624[]={209,323,325,327,504,7748,7750,7752,7754,0},
+dd3625[]={210,211,212,213,214,332,334,336,416,465,490,524,526,558,7884,7886,0},
+dd3626[]={7764,7766,0},
+dd3627[]={340,342,344,528,530,7768,7770,7774,0},
+dd3628[]={346,348,350,352,536,7776,7778,0},
+dd3629[]={354,356,538,7786,7788,7790,7792,0},
+dd3630[]={217,218,219,220,360,362,364,366,368,370,431,467,532,534,7794,7796,7798,7908,7910,0},
+dd3631[]={7804,7806,0},
+dd3632[]={372,7808,7810,7812,7814,7816,0},
+dd3633[]={7818,7820,0},
+dd3634[]={221,374,376,562,7822,7922,7924,7926,7928,0},
+dd3635[]={377,379,381,7824,7826,7828,0},
+dd3636[]={224,225,226,227,228,229,257,259,261,462,513,515,551,7681,7841,7843,0},
+dd3637[]={7683,7685,7687,0},
+dd3638[]={231,263,265,267,269,0},
+dd3639[]={271,7691,7693,7695,7697,7699,0},
+dd3640[]={232,233,234,235,275,277,279,281,283,517,519,553,7705,7707,7865,7867,7869,0},
+dd3641[]={7711,0},
+dd3642[]={285,287,289,291,487,501,7713,0},
+dd3643[]={293,543,7715,7717,7719,7721,7723,7830,0},
+dd3644[]={236,237,238,239,297,299,301,303,464,521,523,7725,7881,7883,0},
+dd3645[]={309,496,0},
+dd3646[]={311,489,7729,7731,7733,0},
+dd3647[]={314,316,318,7735,7739,7741,0},
+dd3648[]={7743,7745,7747,0},
+dd3649[]={241,324,326,328,505,7749,7751,7753,7755,0},
+dd3650[]={242,243,244,245,246,333,335,337,417,466,491,525,527,559,7885,7887,0},
+dd3651[]={7765,7767,0},
+dd3652[]={341,343,345,529,531,7769,7771,7775,0},
+dd3653[]={347,349,351,353,537,7777,7779,0},
+dd3654[]={355,357,539,7787,7789,7791,7793,7831,0},
+dd3655[]={249,250,251,252,361,363,365,367,369,371,432,468,533,535,7795,7797,7799,7909,7911,0},
+dd3656[]={7805,7807,0},
+dd3657[]={373,7809,7811,7813,7815,7817,7832,0},
+dd3658[]={7819,7821,0},
+dd3659[]={253,255,375,563,7823,7833,7923,7925,7927,7929,0},
+dd3660[]={378,380,382,7825,7827,7829,0},
+dd3661[]={901,8129,8173,0},
+dd3662[]={7844,7846,7848,7850,0},
+dd3663[]={478,0},
+dd3664[]={506,0},
+dd3665[]={482,508,0},
+dd3666[]={7688,0},
+dd3667[]={7870,7872,7874,7876,0},
+dd3668[]={7726,0},
+dd3669[]={7888,7890,7892,7894,0},
+dd3670[]={556,7756,7758,0},
+dd3671[]={554,0},
+dd3672[]={510,0},
+dd3673[]={469,471,473,475,0},
+dd3674[]={7845,7847,7849,7851,0},
+dd3675[]={479,0},
+dd3676[]={507,0},
+dd3677[]={483,509,0},
+dd3678[]={7689,0},
+dd3679[]={7871,7873,7875,7877,0},
+dd3680[]={7727,0},
+dd3681[]={7889,7891,7893,7895,0},
+dd3682[]={557,7757,7759,0},
+dd3683[]={555,0},
+dd3684[]={511,0},
+dd3685[]={470,472,474,476,0},
+dd3686[]={7854,7856,7858,7860,0},
+dd3687[]={7855,7857,7859,7861,0},
+dd3688[]={7700,7702,0},
+dd3689[]={7701,7703,0},
+dd3690[]={7760,7762,0},
+dd3691[]={7761,7763,0},
+dd3692[]={7780,0},
+dd3693[]={7781,0},
+dd3694[]={7782,0},
+dd3695[]={7783,0},
+dd3696[]={7800,0},
+dd3697[]={7801,0},
+dd3698[]={7802,0},
+dd3699[]={7803,0},
+dd3700[]={7835,0},
+dd3701[]={7898,7900,7902,7904,7906,0},
+dd3702[]={7899,7901,7903,7905,7907,0},
+dd3703[]={7912,7914,7916,7918,7920,0},
+dd3704[]={7913,7915,7917,7919,7921,0},
+dd3705[]={494,0},
+dd3706[]={492,0},
+dd3707[]={493,0},
+dd3708[]={480,0},
+dd3709[]={481,0},
+dd3710[]={7708,0},
+dd3711[]={7709,0},
+dd3712[]={560,0},
+dd3713[]={561,0},
+dd3714[]={495,0},
+dd3715[]={902,7944,7945,8120,8121,8122,8124,0},
+dd3716[]={904,7960,7961,8136,0},
+dd3717[]={905,7976,7977,8138,8140,0},
+dd3718[]={906,938,7992,7993,8152,8153,8154,0},
+dd3719[]={908,8008,8009,8184,0},
+dd3720[]={8172,0},
+dd3721[]={910,939,8025,8168,8169,8170,0},
+dd3722[]={911,8040,8041,8186,8188,0},
+dd3723[]={8116,0},
+dd3724[]={8132,0},
+dd3725[]={940,7936,7937,8048,8112,8113,8115,8118,0},
+dd3726[]={941,7952,7953,8050,0},
+dd3727[]={942,7968,7969,8052,8131,8134,0},
+dd3728[]={943,970,7984,7985,8054,8144,8145,8150,0},
+dd3729[]={972,8000,8001,8056,0},
+dd3730[]={8164,8165,0},
+dd3731[]={971,973,8016,8017,8058,8160,8161,8166,0},
+dd3732[]={974,8032,8033,8060,8179,8182,0},
+dd3733[]={912,8146,8151,0},
+dd3734[]={944,8162,8167,0},
+dd3735[]={8180,0},
+dd3736[]={979,980,0},
+dd3737[]={1031,0},
+dd3738[]={1232,1234,0},
+dd3739[]={1027,0},
+dd3740[]={1024,1025,1238,0},
+dd3741[]={1217,1244,0},
+dd3742[]={1246,0},
+dd3743[]={1037,1049,1250,1252,0},
+dd3744[]={1036,0},
+dd3745[]={1254,0},
+dd3746[]={1038,1262,1264,1266,0},
+dd3747[]={1268,0},
+dd3748[]={1272,0},
+dd3749[]={1260,0},
+dd3750[]={1233,1235,0},
+dd3751[]={1107,0},
+dd3752[]={1104,1105,1239,0},
+dd3753[]={1218,1245,0},
+dd3754[]={1247,0},
+dd3755[]={1081,1117,1251,1253,0},
+dd3756[]={1116,0},
+dd3757[]={1255,0},
+dd3758[]={1118,1263,1265,1267,0},
+dd3759[]={1269,0},
+dd3760[]={1273,0},
+dd3761[]={1261,0},
+dd3762[]={1111,0},
+dd3763[]={1142,0},
+dd3764[]={1143,0},
+dd3765[]={1242,0},
+dd3766[]={1243,0},
+dd3767[]={1258,0},
+dd3768[]={1259,0},
+dd3769[]={1570,1571,1573,0},
+dd3770[]={1730,0},
+dd3771[]={2345,0},
+dd3772[]={2353,0},
+dd3773[]={2356,0},
+dd3774[]={2507,2508,0},
+dd3775[]={2888,2891,2892,0},
+dd3776[]={2964,0},
+dd3777[]={3018,3020,0},
+dd3778[]={3019,0},
+dd3779[]={3144,0},
+dd3780[]={3264,0},
+dd3781[]={3271,3272,3274,0},
+dd3782[]={3275,0},
+dd3783[]={3402,3404,0},
+dd3784[]={3403,0},
+dd3785[]={3546,3548,3550,0},
+dd3786[]={3549,0},
+dd3787[]={4134,0},
+dd3788[]={6918,0},
+dd3789[]={6920,0},
+dd3790[]={6922,0},
+dd3791[]={6924,0},
+dd3792[]={6926,0},
+dd3793[]={6930,0},
+dd3794[]={6971,0},
+dd3795[]={6973,0},
+dd3796[]={6976,0},
+dd3797[]={6977,0},
+dd3798[]={6979,0},
+dd3799[]={7736,0},
+dd3800[]={7737,0},
+dd3801[]={7772,0},
+dd3802[]={7773,0},
+dd3803[]={7784,0},
+dd3804[]={7785,0},
+dd3805[]={7852,7862,0},
+dd3806[]={7853,7863,0},
+dd3807[]={7878,0},
+dd3808[]={7879,0},
+dd3809[]={7896,0},
+dd3810[]={7897,0},
+dd3811[]={7938,7940,7942,8064,0},
+dd3812[]={7939,7941,7943,8065,0},
+dd3813[]={8066,0},
+dd3814[]={8067,0},
+dd3815[]={8068,0},
+dd3816[]={8069,0},
+dd3817[]={8070,0},
+dd3818[]={8071,0},
+dd3819[]={7946,7948,7950,8072,0},
+dd3820[]={7947,7949,7951,8073,0},
+dd3821[]={8074,0},
+dd3822[]={8075,0},
+dd3823[]={8076,0},
+dd3824[]={8077,0},
+dd3825[]={8078,0},
+dd3826[]={8079,0},
+dd3827[]={7954,7956,0},
+dd3828[]={7955,7957,0},
+dd3829[]={7962,7964,0},
+dd3830[]={7963,7965,0},
+dd3831[]={7970,7972,7974,8080,0},
+dd3832[]={7971,7973,7975,8081,0},
+dd3833[]={8082,0},
+dd3834[]={8083,0},
+dd3835[]={8084,0},
+dd3836[]={8085,0},
+dd3837[]={8086,0},
+dd3838[]={8087,0},
+dd3839[]={7978,7980,7982,8088,0},
+dd3840[]={7979,7981,7983,8089,0},
+dd3841[]={8090,0},
+dd3842[]={8091,0},
+dd3843[]={8092,0},
+dd3844[]={8093,0},
+dd3845[]={8094,0},
+dd3846[]={8095,0},
+dd3847[]={7986,7988,7990,0},
+dd3848[]={7987,7989,7991,0},
+dd3849[]={7994,7996,7998,0},
+dd3850[]={7995,7997,7999,0},
+dd3851[]={8002,8004,0},
+dd3852[]={8003,8005,0},
+dd3853[]={8010,8012,0},
+dd3854[]={8011,8013,0},
+dd3855[]={8018,8020,8022,0},
+dd3856[]={8019,8021,8023,0},
+dd3857[]={8027,8029,8031,0},
+dd3858[]={8034,8036,8038,8096,0},
+dd3859[]={8035,8037,8039,8097,0},
+dd3860[]={8098,0},
+dd3861[]={8099,0},
+dd3862[]={8100,0},
+dd3863[]={8101,0},
+dd3864[]={8102,0},
+dd3865[]={8103,0},
+dd3866[]={8042,8044,8046,8104,0},
+dd3867[]={8043,8045,8047,8105,0},
+dd3868[]={8106,0},
+dd3869[]={8107,0},
+dd3870[]={8108,0},
+dd3871[]={8109,0},
+dd3872[]={8110,0},
+dd3873[]={8111,0},
+dd3874[]={8114,0},
+dd3875[]={8130,0},
+dd3876[]={8178,0},
+dd3877[]={8119,0},
+dd3878[]={8141,8142,8143,0},
+dd3879[]={8135,0},
+dd3880[]={8183,0},
+dd3881[]={8157,8158,8159,0},
+dd3882[]={8602,0},
+dd3883[]={8603,0},
+dd3884[]={8622,0},
+dd3885[]={8653,0},
+dd3886[]={8655,0},
+dd3887[]={8654,0},
+dd3888[]={8708,0},
+dd3889[]={8713,0},
+dd3890[]={8716,0},
+dd3891[]={8740,0},
+dd3892[]={8742,0},
+dd3893[]={8769,0},
+dd3894[]={8772,0},
+dd3895[]={8775,0},
+dd3896[]={8777,0},
+dd3897[]={8813,0},
+dd3898[]={8802,0},
+dd3899[]={8816,0},
+dd3900[]={8817,0},
+dd3901[]={8820,0},
+dd3902[]={8821,0},
+dd3903[]={8824,0},
+dd3904[]={8825,0},
+dd3905[]={8832,0},
+dd3906[]={8833,0},
+dd3907[]={8928,0},
+dd3908[]={8929,0},
+dd3909[]={8836,0},
+dd3910[]={8837,0},
+dd3911[]={8840,0},
+dd3912[]={8841,0},
+dd3913[]={8930,0},
+dd3914[]={8931,0},
+dd3915[]={8876,0},
+dd3916[]={8877,0},
+dd3917[]={8878,0},
+dd3918[]={8879,0},
+dd3919[]={8938,0},
+dd3920[]={8939,0},
+dd3921[]={8940,0},
+dd3922[]={8941,0},
+dd3923[]={12436,0},
+dd3924[]={12364,0},
+dd3925[]={12366,0},
+dd3926[]={12368,0},
+dd3927[]={12370,0},
+dd3928[]={12372,0},
+dd3929[]={12374,0},
+dd3930[]={12376,0},
+dd3931[]={12378,0},
+dd3932[]={12380,0},
+dd3933[]={12382,0},
+dd3934[]={12384,0},
+dd3935[]={12386,0},
+dd3936[]={12389,0},
+dd3937[]={12391,0},
+dd3938[]={12393,0},
+dd3939[]={12400,12401,0},
+dd3940[]={12403,12404,0},
+dd3941[]={12406,12407,0},
+dd3942[]={12409,12410,0},
+dd3943[]={12412,12413,0},
+dd3944[]={12446,0},
+dd3945[]={12532,0},
+dd3946[]={12460,0},
+dd3947[]={12462,0},
+dd3948[]={12464,0},
+dd3949[]={12466,0},
+dd3950[]={12468,0},
+dd3951[]={12470,0},
+dd3952[]={12472,0},
+dd3953[]={12474,0},
+dd3954[]={12476,0},
+dd3955[]={12478,0},
+dd3956[]={12480,0},
+dd3957[]={12482,0},
+dd3958[]={12485,0},
+dd3959[]={12487,0},
+dd3960[]={12489,0},
+dd3961[]={12496,12497,0},
+dd3962[]={12499,12500,0},
+dd3963[]={12502,12503,0},
+dd3964[]={12505,12506,0},
+dd3965[]={12508,12509,0},
+dd3966[]={12535,0},
+dd3967[]={12536,0},
+dd3968[]={12537,0},
+dd3969[]={12538,0},
+dd3970[]={12542,0},
+dd3971[]={224,0},
+dd3972[]={225,0},
+dd3973[]={226,0},
+dd3974[]={227,0},
+dd3975[]={228,0},
+dd3976[]={229,0},
+dd3977[]={230,0},
+dd3978[]={231,0},
+dd3979[]={232,0},
+dd3980[]={233,0},
+dd3981[]={234,0},
+dd3982[]={235,0},
+dd3983[]={236,0},
+dd3984[]={237,0},
+dd3985[]={238,0},
+dd3986[]={239,0},
+dd3987[]={241,0},
+dd3988[]={242,0},
+dd3989[]={243,0},
+dd3990[]={244,0},
+dd3991[]={245,0},
+dd3992[]={246,0},
+dd3993[]={248,0},
+dd3994[]={249,0},
+dd3995[]={250,0},
+dd3996[]={251,0},
+dd3997[]={252,0},
+dd3998[]={253,0},
+dd3999[]={254,0},
+dd4000[]={115,115,0},
+dd4001[]={257,0},
+dd4002[]={259,0},
+dd4003[]={261,0},
+dd4004[]={263,0},
+dd4005[]={265,0},
+dd4006[]={267,0},
+dd4007[]={269,0},
+dd4008[]={271,0},
+dd4009[]={273,0},
+dd4010[]={275,0},
+dd4011[]={277,0},
+dd4012[]={279,0},
+dd4013[]={281,0},
+dd4014[]={283,0},
+dd4015[]={285,0},
+dd4016[]={287,0},
+dd4017[]={289,0},
+dd4018[]={291,0},
+dd4019[]={293,0},
+dd4020[]={297,0},
+dd4021[]={299,0},
+dd4022[]={301,0},
+dd4023[]={303,0},
+dd4024[]={105,775,0},
+dd4025[]={307,0},
+dd4026[]={309,0},
+dd4027[]={311,0},
+dd4028[]={314,0},
+dd4029[]={316,0},
+dd4030[]={318,0},
+dd4031[]={320,0},
+dd4032[]={322,0},
+dd4033[]={324,0},
+dd4034[]={326,0},
+dd4035[]={328,0},
+dd4036[]={333,0},
+dd4037[]={335,0},
+dd4038[]={337,0},
+dd4039[]={339,0},
+dd4040[]={341,0},
+dd4041[]={343,0},
+dd4042[]={345,0},
+dd4043[]={347,0},
+dd4044[]={349,0},
+dd4045[]={351,0},
+dd4046[]={353,0},
+dd4047[]={355,0},
+dd4048[]={357,0},
+dd4049[]={359,0},
+dd4050[]={361,0},
+dd4051[]={363,0},
+dd4052[]={365,0},
+dd4053[]={367,0},
+dd4054[]={369,0},
+dd4055[]={371,0},
+dd4056[]={373,0},
+dd4057[]={375,0},
+dd4058[]={255,0},
+dd4059[]={378,0},
+dd4060[]={380,0},
+dd4061[]={382,0},
+dd4062[]={595,0},
+dd4063[]={387,0},
+dd4064[]={389,0},
+dd4065[]={392,0},
+dd4066[]={598,0},
+dd4067[]={599,0},
+dd4068[]={396,0},
+dd4069[]={477,0},
+dd4070[]={402,0},
+dd4071[]={608,0},
+dd4072[]={409,0},
+dd4073[]={417,0},
+dd4074[]={419,0},
+dd4075[]={421,0},
+dd4076[]={640,0},
+dd4077[]={424,0},
+dd4078[]={429,0},
+dd4079[]={648,0},
+dd4080[]={432,0},
+dd4081[]={436,0},
+dd4082[]={438,0},
+dd4083[]={441,0},
+dd4084[]={445,0},
+dd4085[]={454,0},
+dd4086[]={457,0},
+dd4087[]={460,0},
+dd4088[]={462,0},
+dd4089[]={464,0},
+dd4090[]={466,0},
+dd4091[]={468,0},
+dd4092[]={470,0},
+dd4093[]={472,0},
+dd4094[]={474,0},
+dd4095[]={476,0},
+dd4096[]={483,0},
+dd4097[]={485,0},
+dd4098[]={487,0},
+dd4099[]={489,0},
+dd4100[]={491,0},
+dd4101[]={499,0},
+dd4102[]={501,0},
+dd4103[]={405,0},
+dd4104[]={447,0},
+dd4105[]={505,0},
+dd4106[]={509,0},
+dd4107[]={513,0},
+dd4108[]={515,0},
+dd4109[]={517,0},
+dd4110[]={519,0},
+dd4111[]={521,0},
+dd4112[]={523,0},
+dd4113[]={525,0},
+dd4114[]={527,0},
+dd4115[]={529,0},
+dd4116[]={531,0},
+dd4117[]={533,0},
+dd4118[]={535,0},
+dd4119[]={537,0},
+dd4120[]={539,0},
+dd4121[]={541,0},
+dd4122[]={543,0},
+dd4123[]={414,0},
+dd4124[]={547,0},
+dd4125[]={549,0},
+dd4126[]={551,0},
+dd4127[]={553,0},
+dd4128[]={557,0},
+dd4129[]={559,0},
+dd4130[]={563,0},
+dd4131[]={11365,0},
+dd4132[]={572,0},
+dd4133[]={410,0},
+dd4134[]={11366,0},
+dd4135[]={578,0},
+dd4136[]={384,0},
+dd4137[]={583,0},
+dd4138[]={585,0},
+dd4139[]={587,0},
+dd4140[]={589,0},
+dd4141[]={591,0},
+dd4142[]={881,0},
+dd4143[]={883,0},
+dd4144[]={887,0},
+dd4145[]={953,776,769,0},
+dd4146[]={970,0},
+dd4147[]={971,0},
+dd4148[]={965,776,769,0},
+dd4149[]={983,0},
+dd4150[]={985,0},
+dd4151[]={987,0},
+dd4152[]={991,0},
+dd4153[]={993,0},
+dd4154[]={995,0},
+dd4155[]={997,0},
+dd4156[]={999,0},
+dd4157[]={1001,0},
+dd4158[]={1003,0},
+dd4159[]={1005,0},
+dd4160[]={1007,0},
+dd4161[]={1016,0},
+dd4162[]={1010,0},
+dd4163[]={1019,0},
+dd4164[]={891,0},
+dd4165[]={892,0},
+dd4166[]={893,0},
+dd4167[]={1104,0},
+dd4168[]={1105,0},
+dd4169[]={1106,0},
+dd4170[]={1108,0},
+dd4171[]={1109,0},
+dd4172[]={1110,0},
+dd4173[]={1112,0},
+dd4174[]={1113,0},
+dd4175[]={1114,0},
+dd4176[]={1115,0},
+dd4177[]={1117,0},
+dd4178[]={1118,0},
+dd4179[]={1119,0},
+dd4180[]={1072,0},
+dd4181[]={1073,0},
+dd4182[]={1074,0},
+dd4183[]={1075,0},
+dd4184[]={1076,0},
+dd4185[]={1077,0},
+dd4186[]={1078,0},
+dd4187[]={1079,0},
+dd4188[]={1080,0},
+dd4189[]={1081,0},
+dd4190[]={1082,0},
+dd4191[]={1083,0},
+dd4192[]={1084,0},
+dd4193[]={1086,0},
+dd4194[]={1087,0},
+dd4195[]={1088,0},
+dd4196[]={1089,0},
+dd4197[]={1090,0},
+dd4198[]={1091,0},
+dd4199[]={1092,0},
+dd4200[]={1093,0},
+dd4201[]={1094,0},
+dd4202[]={1095,0},
+dd4203[]={1096,0},
+dd4204[]={1097,0},
+dd4205[]={1098,0},
+dd4206[]={1099,0},
+dd4207[]={1100,0},
+dd4208[]={1101,0},
+dd4209[]={1102,0},
+dd4210[]={1103,0},
+dd4211[]={1121,0},
+dd4212[]={1123,0},
+dd4213[]={1125,0},
+dd4214[]={1127,0},
+dd4215[]={1129,0},
+dd4216[]={1131,0},
+dd4217[]={1133,0},
+dd4218[]={1135,0},
+dd4219[]={1137,0},
+dd4220[]={1139,0},
+dd4221[]={1141,0},
+dd4222[]={1145,0},
+dd4223[]={1147,0},
+dd4224[]={1149,0},
+dd4225[]={1151,0},
+dd4226[]={1153,0},
+dd4227[]={1163,0},
+dd4228[]={1165,0},
+dd4229[]={1167,0},
+dd4230[]={1169,0},
+dd4231[]={1171,0},
+dd4232[]={1173,0},
+dd4233[]={1175,0},
+dd4234[]={1177,0},
+dd4235[]={1179,0},
+dd4236[]={1181,0},
+dd4237[]={1183,0},
+dd4238[]={1185,0},
+dd4239[]={1187,0},
+dd4240[]={1189,0},
+dd4241[]={1191,0},
+dd4242[]={1193,0},
+dd4243[]={1195,0},
+dd4244[]={1197,0},
+dd4245[]={1199,0},
+dd4246[]={1201,0},
+dd4247[]={1203,0},
+dd4248[]={1205,0},
+dd4249[]={1207,0},
+dd4250[]={1209,0},
+dd4251[]={1211,0},
+dd4252[]={1213,0},
+dd4253[]={1215,0},
+dd4254[]={1231,0},
+dd4255[]={1218,0},
+dd4256[]={1220,0},
+dd4257[]={1222,0},
+dd4258[]={1224,0},
+dd4259[]={1226,0},
+dd4260[]={1228,0},
+dd4261[]={1230,0},
+dd4262[]={1233,0},
+dd4263[]={1235,0},
+dd4264[]={1237,0},
+dd4265[]={1239,0},
+dd4266[]={1241,0},
+dd4267[]={1245,0},
+dd4268[]={1249,0},
+dd4269[]={1251,0},
+dd4270[]={1253,0},
+dd4271[]={1257,0},
+dd4272[]={1263,0},
+dd4273[]={1265,0},
+dd4274[]={1267,0},
+dd4275[]={1271,0},
+dd4276[]={1275,0},
+dd4277[]={1277,0},
+dd4278[]={1279,0},
+dd4279[]={1281,0},
+dd4280[]={1283,0},
+dd4281[]={1285,0},
+dd4282[]={1287,0},
+dd4283[]={1289,0},
+dd4284[]={1291,0},
+dd4285[]={1293,0},
+dd4286[]={1295,0},
+dd4287[]={1297,0},
+dd4288[]={1299,0},
+dd4289[]={1301,0},
+dd4290[]={1303,0},
+dd4291[]={1305,0},
+dd4292[]={1307,0},
+dd4293[]={1309,0},
+dd4294[]={1311,0},
+dd4295[]={1313,0},
+dd4296[]={1315,0},
+dd4297[]={1377,0},
+dd4298[]={1378,0},
+dd4299[]={1379,0},
+dd4300[]={1380,0},
+dd4301[]={1381,0},
+dd4302[]={1382,0},
+dd4303[]={1383,0},
+dd4304[]={1384,0},
+dd4305[]={1385,0},
+dd4306[]={1386,0},
+dd4307[]={1387,0},
+dd4308[]={1388,0},
+dd4309[]={1389,0},
+dd4310[]={1390,0},
+dd4311[]={1391,0},
+dd4312[]={1392,0},
+dd4313[]={1393,0},
+dd4314[]={1394,0},
+dd4315[]={1395,0},
+dd4316[]={1396,0},
+dd4317[]={1397,0},
+dd4318[]={1398,0},
+dd4319[]={1399,0},
+dd4320[]={1400,0},
+dd4321[]={1401,0},
+dd4322[]={1402,0},
+dd4323[]={1403,0},
+dd4324[]={1404,0},
+dd4325[]={1405,0},
+dd4326[]={1406,0},
+dd4327[]={1407,0},
+dd4328[]={1408,0},
+dd4329[]={1409,0},
+dd4330[]={1410,0},
+dd4331[]={1411,0},
+dd4332[]={1412,0},
+dd4333[]={1413,0},
+dd4334[]={1414,0},
+dd4335[]={11520,0},
+dd4336[]={11521,0},
+dd4337[]={11522,0},
+dd4338[]={11523,0},
+dd4339[]={11524,0},
+dd4340[]={11525,0},
+dd4341[]={11526,0},
+dd4342[]={11527,0},
+dd4343[]={11528,0},
+dd4344[]={11529,0},
+dd4345[]={11530,0},
+dd4346[]={11531,0},
+dd4347[]={11532,0},
+dd4348[]={11533,0},
+dd4349[]={11534,0},
+dd4350[]={11535,0},
+dd4351[]={11536,0},
+dd4352[]={11537,0},
+dd4353[]={11538,0},
+dd4354[]={11539,0},
+dd4355[]={11540,0},
+dd4356[]={11541,0},
+dd4357[]={11542,0},
+dd4358[]={11543,0},
+dd4359[]={11544,0},
+dd4360[]={11545,0},
+dd4361[]={11546,0},
+dd4362[]={11547,0},
+dd4363[]={11548,0},
+dd4364[]={11549,0},
+dd4365[]={11550,0},
+dd4366[]={11551,0},
+dd4367[]={11552,0},
+dd4368[]={11553,0},
+dd4369[]={11554,0},
+dd4370[]={11555,0},
+dd4371[]={11556,0},
+dd4372[]={11557,0},
+dd4373[]={7681,0},
+dd4374[]={7683,0},
+dd4375[]={7685,0},
+dd4376[]={7687,0},
+dd4377[]={7691,0},
+dd4378[]={7693,0},
+dd4379[]={7695,0},
+dd4380[]={7697,0},
+dd4381[]={7699,0},
+dd4382[]={7701,0},
+dd4383[]={7703,0},
+dd4384[]={7705,0},
+dd4385[]={7707,0},
+dd4386[]={7713,0},
+dd4387[]={7715,0},
+dd4388[]={7717,0},
+dd4389[]={7719,0},
+dd4390[]={7721,0},
+dd4391[]={7723,0},
+dd4392[]={7725,0},
+dd4393[]={7729,0},
+dd4394[]={7731,0},
+dd4395[]={7733,0},
+dd4396[]={7735,0},
+dd4397[]={7739,0},
+dd4398[]={7741,0},
+dd4399[]={7743,0},
+dd4400[]={7745,0},
+dd4401[]={7747,0},
+dd4402[]={7749,0},
+dd4403[]={7751,0},
+dd4404[]={7753,0},
+dd4405[]={7755,0},
+dd4406[]={7757,0},
+dd4407[]={7759,0},
+dd4408[]={7761,0},
+dd4409[]={7763,0},
+dd4410[]={7765,0},
+dd4411[]={7767,0},
+dd4412[]={7769,0},
+dd4413[]={7771,0},
+dd4414[]={7775,0},
+dd4415[]={7777,0},
+dd4416[]={7779,0},
+dd4417[]={7787,0},
+dd4418[]={7789,0},
+dd4419[]={7791,0},
+dd4420[]={7793,0},
+dd4421[]={7795,0},
+dd4422[]={7797,0},
+dd4423[]={7799,0},
+dd4424[]={7805,0},
+dd4425[]={7807,0},
+dd4426[]={7809,0},
+dd4427[]={7811,0},
+dd4428[]={7813,0},
+dd4429[]={7815,0},
+dd4430[]={7817,0},
+dd4431[]={7819,0},
+dd4432[]={7821,0},
+dd4433[]={7823,0},
+dd4434[]={7825,0},
+dd4435[]={7827,0},
+dd4436[]={7829,0},
+dd4437[]={7841,0},
+dd4438[]={7843,0},
+dd4439[]={7845,0},
+dd4440[]={7847,0},
+dd4441[]={7849,0},
+dd4442[]={7851,0},
+dd4443[]={7853,0},
+dd4444[]={7855,0},
+dd4445[]={7857,0},
+dd4446[]={7859,0},
+dd4447[]={7861,0},
+dd4448[]={7863,0},
+dd4449[]={7865,0},
+dd4450[]={7867,0},
+dd4451[]={7869,0},
+dd4452[]={7871,0},
+dd4453[]={7873,0},
+dd4454[]={7875,0},
+dd4455[]={7877,0},
+dd4456[]={7881,0},
+dd4457[]={7883,0},
+dd4458[]={7885,0},
+dd4459[]={7887,0},
+dd4460[]={7889,0},
+dd4461[]={7891,0},
+dd4462[]={7893,0},
+dd4463[]={7895,0},
+dd4464[]={7899,0},
+dd4465[]={7901,0},
+dd4466[]={7903,0},
+dd4467[]={7905,0},
+dd4468[]={7907,0},
+dd4469[]={7909,0},
+dd4470[]={7911,0},
+dd4471[]={7913,0},
+dd4472[]={7915,0},
+dd4473[]={7917,0},
+dd4474[]={7919,0},
+dd4475[]={7921,0},
+dd4476[]={7923,0},
+dd4477[]={7925,0},
+dd4478[]={7927,0},
+dd4479[]={7929,0},
+dd4480[]={7931,0},
+dd4481[]={7933,0},
+dd4482[]={7935,0},
+dd4483[]={7936,0},
+dd4484[]={7937,0},
+dd4485[]={7938,0},
+dd4486[]={7939,0},
+dd4487[]={7940,0},
+dd4488[]={7941,0},
+dd4489[]={7942,0},
+dd4490[]={7943,0},
+dd4491[]={7952,0},
+dd4492[]={7953,0},
+dd4493[]={7954,0},
+dd4494[]={7955,0},
+dd4495[]={7956,0},
+dd4496[]={7957,0},
+dd4497[]={7968,0},
+dd4498[]={7969,0},
+dd4499[]={7970,0},
+dd4500[]={7971,0},
+dd4501[]={7972,0},
+dd4502[]={7973,0},
+dd4503[]={7974,0},
+dd4504[]={7975,0},
+dd4505[]={7984,0},
+dd4506[]={7985,0},
+dd4507[]={7986,0},
+dd4508[]={7987,0},
+dd4509[]={7988,0},
+dd4510[]={7989,0},
+dd4511[]={7990,0},
+dd4512[]={7991,0},
+dd4513[]={8000,0},
+dd4514[]={8001,0},
+dd4515[]={8002,0},
+dd4516[]={8003,0},
+dd4517[]={8004,0},
+dd4518[]={8005,0},
+dd4519[]={965,787,768,0},
+dd4520[]={965,787,769,0},
+dd4521[]={965,787,834,0},
+dd4522[]={8017,0},
+dd4523[]={8019,0},
+dd4524[]={8021,0},
+dd4525[]={8023,0},
+dd4526[]={8032,0},
+dd4527[]={8033,0},
+dd4528[]={8034,0},
+dd4529[]={8035,0},
+dd4530[]={8036,0},
+dd4531[]={8037,0},
+dd4532[]={8038,0},
+dd4533[]={8039,0},
+dd4534[]={7936,953,0},
+dd4535[]={7937,953,0},
+dd4536[]={7938,953,0},
+dd4537[]={7939,953,0},
+dd4538[]={7940,953,0},
+dd4539[]={7941,953,0},
+dd4540[]={7942,953,0},
+dd4541[]={7943,953,0},
+dd4542[]={7968,953,0},
+dd4543[]={7969,953,0},
+dd4544[]={7970,953,0},
+dd4545[]={7971,953,0},
+dd4546[]={7972,953,0},
+dd4547[]={7973,953,0},
+dd4548[]={7974,953,0},
+dd4549[]={7975,953,0},
+dd4550[]={8032,953,0},
+dd4551[]={8033,953,0},
+dd4552[]={8034,953,0},
+dd4553[]={8035,953,0},
+dd4554[]={8036,953,0},
+dd4555[]={8037,953,0},
+dd4556[]={8038,953,0},
+dd4557[]={8039,953,0},
+dd4558[]={8048,953,0},
+dd4559[]={945,953,0},
+dd4560[]={940,953,0},
+dd4561[]={945,834,953,0},
+dd4562[]={8112,0},
+dd4563[]={8113,0},
+dd4564[]={8048,0},
+dd4565[]={8049,0},
+dd4566[]={8052,953,0},
+dd4567[]={951,953,0},
+dd4568[]={942,953,0},
+dd4569[]={951,834,953,0},
+dd4570[]={8050,0},
+dd4571[]={8051,0},
+dd4572[]={8052,0},
+dd4573[]={8053,0},
+dd4574[]={953,776,768,0},
+dd4575[]={953,776,834,0},
+dd4576[]={8144,0},
+dd4577[]={8145,0},
+dd4578[]={8054,0},
+dd4579[]={8055,0},
+dd4580[]={965,776,768,0},
+dd4581[]={965,776,834,0},
+dd4582[]={8160,0},
+dd4583[]={8161,0},
+dd4584[]={8058,0},
+dd4585[]={8059,0},
+dd4586[]={8165,0},
+dd4587[]={8060,953,0},
+dd4588[]={969,953,0},
+dd4589[]={974,953,0},
+dd4590[]={969,834,953,0},
+dd4591[]={8056,0},
+dd4592[]={8057,0},
+dd4593[]={8060,0},
+dd4594[]={8061,0},
+dd4595[]={8526,0},
+dd4596[]={8560,0},
+dd4597[]={8561,0},
+dd4598[]={8562,0},
+dd4599[]={8563,0},
+dd4600[]={8564,0},
+dd4601[]={8565,0},
+dd4602[]={8566,0},
+dd4603[]={8567,0},
+dd4604[]={8568,0},
+dd4605[]={8569,0},
+dd4606[]={8570,0},
+dd4607[]={8571,0},
+dd4608[]={8572,0},
+dd4609[]={8573,0},
+dd4610[]={8574,0},
+dd4611[]={8575,0},
+dd4612[]={8580,0},
+dd4613[]={9424,0},
+dd4614[]={9425,0},
+dd4615[]={9426,0},
+dd4616[]={9427,0},
+dd4617[]={9428,0},
+dd4618[]={9429,0},
+dd4619[]={9430,0},
+dd4620[]={9431,0},
+dd4621[]={9432,0},
+dd4622[]={9433,0},
+dd4623[]={9434,0},
+dd4624[]={9435,0},
+dd4625[]={9436,0},
+dd4626[]={9437,0},
+dd4627[]={9438,0},
+dd4628[]={9439,0},
+dd4629[]={9440,0},
+dd4630[]={9441,0},
+dd4631[]={9442,0},
+dd4632[]={9443,0},
+dd4633[]={9444,0},
+dd4634[]={9445,0},
+dd4635[]={9446,0},
+dd4636[]={9447,0},
+dd4637[]={9448,0},
+dd4638[]={9449,0},
+dd4639[]={11312,0},
+dd4640[]={11313,0},
+dd4641[]={11314,0},
+dd4642[]={11315,0},
+dd4643[]={11316,0},
+dd4644[]={11317,0},
+dd4645[]={11318,0},
+dd4646[]={11319,0},
+dd4647[]={11320,0},
+dd4648[]={11321,0},
+dd4649[]={11322,0},
+dd4650[]={11323,0},
+dd4651[]={11324,0},
+dd4652[]={11325,0},
+dd4653[]={11326,0},
+dd4654[]={11327,0},
+dd4655[]={11328,0},
+dd4656[]={11329,0},
+dd4657[]={11330,0},
+dd4658[]={11331,0},
+dd4659[]={11332,0},
+dd4660[]={11333,0},
+dd4661[]={11334,0},
+dd4662[]={11335,0},
+dd4663[]={11336,0},
+dd4664[]={11337,0},
+dd4665[]={11338,0},
+dd4666[]={11339,0},
+dd4667[]={11340,0},
+dd4668[]={11341,0},
+dd4669[]={11342,0},
+dd4670[]={11343,0},
+dd4671[]={11344,0},
+dd4672[]={11345,0},
+dd4673[]={11346,0},
+dd4674[]={11347,0},
+dd4675[]={11348,0},
+dd4676[]={11349,0},
+dd4677[]={11350,0},
+dd4678[]={11351,0},
+dd4679[]={11352,0},
+dd4680[]={11353,0},
+dd4681[]={11354,0},
+dd4682[]={11355,0},
+dd4683[]={11356,0},
+dd4684[]={11357,0},
+dd4685[]={11358,0},
+dd4686[]={11361,0},
+dd4687[]={619,0},
+dd4688[]={7549,0},
+dd4689[]={637,0},
+dd4690[]={11368,0},
+dd4691[]={11370,0},
+dd4692[]={11372,0},
+dd4693[]={11379,0},
+dd4694[]={11382,0},
+dd4695[]={11393,0},
+dd4696[]={11395,0},
+dd4697[]={11397,0},
+dd4698[]={11399,0},
+dd4699[]={11401,0},
+dd4700[]={11403,0},
+dd4701[]={11405,0},
+dd4702[]={11407,0},
+dd4703[]={11409,0},
+dd4704[]={11411,0},
+dd4705[]={11413,0},
+dd4706[]={11415,0},
+dd4707[]={11417,0},
+dd4708[]={11419,0},
+dd4709[]={11421,0},
+dd4710[]={11423,0},
+dd4711[]={11425,0},
+dd4712[]={11427,0},
+dd4713[]={11429,0},
+dd4714[]={11431,0},
+dd4715[]={11433,0},
+dd4716[]={11435,0},
+dd4717[]={11437,0},
+dd4718[]={11439,0},
+dd4719[]={11441,0},
+dd4720[]={11443,0},
+dd4721[]={11445,0},
+dd4722[]={11447,0},
+dd4723[]={11449,0},
+dd4724[]={11451,0},
+dd4725[]={11453,0},
+dd4726[]={11455,0},
+dd4727[]={11457,0},
+dd4728[]={11459,0},
+dd4729[]={11461,0},
+dd4730[]={11463,0},
+dd4731[]={11465,0},
+dd4732[]={11467,0},
+dd4733[]={11469,0},
+dd4734[]={11471,0},
+dd4735[]={11473,0},
+dd4736[]={11475,0},
+dd4737[]={11477,0},
+dd4738[]={11479,0},
+dd4739[]={11481,0},
+dd4740[]={11483,0},
+dd4741[]={11485,0},
+dd4742[]={11487,0},
+dd4743[]={11489,0},
+dd4744[]={11491,0},
+dd4745[]={42561,0},
+dd4746[]={42563,0},
+dd4747[]={42565,0},
+dd4748[]={42567,0},
+dd4749[]={42569,0},
+dd4750[]={42571,0},
+dd4751[]={42573,0},
+dd4752[]={42575,0},
+dd4753[]={42577,0},
+dd4754[]={42579,0},
+dd4755[]={42581,0},
+dd4756[]={42583,0},
+dd4757[]={42585,0},
+dd4758[]={42587,0},
+dd4759[]={42589,0},
+dd4760[]={42591,0},
+dd4761[]={42595,0},
+dd4762[]={42597,0},
+dd4763[]={42599,0},
+dd4764[]={42601,0},
+dd4765[]={42603,0},
+dd4766[]={42605,0},
+dd4767[]={42625,0},
+dd4768[]={42627,0},
+dd4769[]={42629,0},
+dd4770[]={42631,0},
+dd4771[]={42633,0},
+dd4772[]={42635,0},
+dd4773[]={42637,0},
+dd4774[]={42639,0},
+dd4775[]={42641,0},
+dd4776[]={42643,0},
+dd4777[]={42645,0},
+dd4778[]={42647,0},
+dd4779[]={42787,0},
+dd4780[]={42789,0},
+dd4781[]={42791,0},
+dd4782[]={42793,0},
+dd4783[]={42795,0},
+dd4784[]={42797,0},
+dd4785[]={42799,0},
+dd4786[]={42803,0},
+dd4787[]={42805,0},
+dd4788[]={42807,0},
+dd4789[]={42809,0},
+dd4790[]={42811,0},
+dd4791[]={42813,0},
+dd4792[]={42815,0},
+dd4793[]={42817,0},
+dd4794[]={42819,0},
+dd4795[]={42821,0},
+dd4796[]={42823,0},
+dd4797[]={42825,0},
+dd4798[]={42827,0},
+dd4799[]={42829,0},
+dd4800[]={42831,0},
+dd4801[]={42833,0},
+dd4802[]={42835,0},
+dd4803[]={42837,0},
+dd4804[]={42839,0},
+dd4805[]={42841,0},
+dd4806[]={42843,0},
+dd4807[]={42845,0},
+dd4808[]={42847,0},
+dd4809[]={42849,0},
+dd4810[]={42851,0},
+dd4811[]={42853,0},
+dd4812[]={42855,0},
+dd4813[]={42857,0},
+dd4814[]={42859,0},
+dd4815[]={42861,0},
+dd4816[]={42874,0},
+dd4817[]={42876,0},
+dd4818[]={7545,0},
+dd4819[]={42879,0},
+dd4820[]={42881,0},
+dd4821[]={42883,0},
+dd4822[]={42885,0},
+dd4823[]={42887,0},
+dd4824[]={42892,0},
+dd4825[]={65345,0},
+dd4826[]={65346,0},
+dd4827[]={65347,0},
+dd4828[]={65348,0},
+dd4829[]={65349,0},
+dd4830[]={65350,0},
+dd4831[]={65351,0},
+dd4832[]={65352,0},
+dd4833[]={65353,0},
+dd4834[]={65354,0},
+dd4835[]={65355,0},
+dd4836[]={65356,0},
+dd4837[]={65357,0},
+dd4838[]={65358,0},
+dd4839[]={65359,0},
+dd4840[]={65360,0},
+dd4841[]={65361,0},
+dd4842[]={65362,0},
+dd4843[]={65363,0},
+dd4844[]={65364,0},
+dd4845[]={65365,0},
+dd4846[]={65366,0},
+dd4847[]={65367,0},
+dd4848[]={65368,0},
+dd4849[]={65369,0},
+dd4850[]={65370,0},
+dd4851[]={66600,0},
+dd4852[]={66601,0},
+dd4853[]={66602,0},
+dd4854[]={66603,0},
+dd4855[]={66604,0},
+dd4856[]={66605,0},
+dd4857[]={66606,0},
+dd4858[]={66607,0},
+dd4859[]={66608,0},
+dd4860[]={66609,0},
+dd4861[]={66610,0},
+dd4862[]={66611,0},
+dd4863[]={66612,0},
+dd4864[]={66613,0},
+dd4865[]={66614,0},
+dd4866[]={66615,0},
+dd4867[]={66616,0},
+dd4868[]={66617,0},
+dd4869[]={66618,0},
+dd4870[]={66619,0},
+dd4871[]={66620,0},
+dd4872[]={66621,0},
+dd4873[]={66622,0},
+dd4874[]={66623,0},
+dd4875[]={66624,0},
+dd4876[]={66625,0},
+dd4877[]={66626,0},
+dd4878[]={66627,0},
+dd4879[]={66628,0},
+dd4880[]={66629,0},
+dd4881[]={66630,0},
+dd4882[]={66631,0},
+dd4883[]={66632,0},
+dd4884[]={66633,0},
+dd4885[]={66634,0},
+dd4886[]={66635,0},
+dd4887[]={66636,0},
+dd4888[]={66637,0},
+dd4889[]={66638,0},
+dd4890[]={66639,0};
 /* 0000-000F */
 static const struct unidata st0[] = {
 {0,0,0,0,Cc,0,GBControl,WBOther,SBOther},
@@ -4913,10 +5028,10 @@ static const struct unidata st0[] = {
 {0,0,0,0,Cc,0,GBControl,WBOther,SBOther},
 {0,0,0,0,Cc,0,GBControl,WBOther,SBOther},
 {0,0,0,0,Cc,0,GBControl,WBOther,SBSp},
-{0,0,0,0,Cc,0,GBLF,WBOther,SBSep},
-{0,0,0,0,Cc,0,GBControl,WBOther,SBSp},
-{0,0,0,0,Cc,0,GBControl,WBOther,SBSp},
-{0,0,0,0,Cc,0,GBCR,WBOther,SBSep},
+{0,0,0,0,Cc,0,GBLF,WBLF,SBLF},
+{0,0,0,0,Cc,0,GBControl,WBNewline,SBSp},
+{0,0,0,0,Cc,0,GBControl,WBNewline,SBSp},
+{0,0,0,0,Cc,0,GBCR,WBCR,SBCR},
 {0,0,0,0,Cc,0,GBControl,WBOther,SBOther},
 {0,0,0,0,Cc,0,GBControl,WBOther,SBOther}
 };
@@ -4948,14 +5063,14 @@ static const struct unidata st2[] = {
 {0,0,0,0,Sc,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Po,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Po,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Po,0,GBOther,WBMidLetter,SBClose},
+{0,0,0,0,Po,0,GBOther,WBMidNumLet,SBClose},
 {0,0,0,0,Ps,0,GBOther,WBOther,SBClose},
 {0,0,0,0,Pe,0,GBOther,WBOther,SBClose},
 {0,0,0,0,Po,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Po,0,GBOther,WBMidNum,SBOther},
-{0,0,0,0,Pd,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Po,0,GBOther,WBMidNum,SBATerm},
+{0,0,0,0,Po,0,GBOther,WBMidNum,SBSContinue},
+{0,0,0,0,Pd,0,GBOther,WBOther,SBSContinue},
+{0,0,0,0,Po,0,GBOther,WBMidNumLet,SBATerm},
 {0,0,0,0,Po,0,GBOther,WBOther,SBOther}
 };
 /* 0030-003F */
@@ -4970,45 +5085,45 @@ static const struct unidata st3[] = {
 {0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric},
 {0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric},
 {0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric},
-{0,0,0,0,Po,0,GBOther,WBMidLetter,SBOther},
+{0,0,0,0,Po,0,GBOther,WBMidLetter,SBSContinue},
 {0,0,0,0,Po,0,GBOther,WBMidNum,SBOther},
-{0,0,dd3607,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,dd3608,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,dd3609,0,Sm,0,GBOther,WBOther,SBOther},
+{0,0,dd3610,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Po,0,GBOther,WBOther,SBSTerm}
 };
 /* 0040-004F */
 static const struct unidata st4[] = {
 {0,0,0,0,Po,0,GBOther,WBOther,SBOther},
-{0,dd2,dd3610,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd515,dd3611,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd541,dd3612,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd516,dd3613,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd517,dd3614,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd544,dd3615,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd521,dd3616,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd284,dd3617,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd538,dd3618,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd286,dd3619,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd522,dd3620,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd300,dd3621,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd523,dd3622,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd1082,dd3623,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd10,dd3624,0,Lu,0,GBOther,WBALetter,SBUpper}
+{0,dd2,dd3611,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd515,dd3612,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd541,dd3613,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd516,dd3614,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd517,dd3615,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd544,dd3616,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd521,dd3617,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd284,dd3618,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd538,dd3619,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd286,dd3620,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd522,dd3621,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd300,dd3622,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd523,dd3623,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd1082,dd3624,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd10,dd3625,0,Lu,0,GBOther,WBALetter,SBUpper}
 };
 /* 0050-005F */
 static const struct unidata st5[] = {
-{0,dd528,dd3625,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd528,dd3626,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,dd1272,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd287,dd3626,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd180,dd3627,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd529,dd3628,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd530,dd3629,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd533,dd3630,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd291,dd3631,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd301,dd3632,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd292,dd3633,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd571,dd3634,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd287,dd3627,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd180,dd3628,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd529,dd3629,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd530,dd3630,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd533,dd3631,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd291,dd3632,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd301,dd3633,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd292,dd3634,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd571,dd3635,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ps,0,GBOther,WBOther,SBClose},
 {0,0,0,0,Po,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Pe,0,GBOther,WBOther,SBClose},
@@ -5018,7 +5133,6 @@ static const struct unidata st5[] = {
 /* 0060-006F */
 static const struct unidata st6[] = {
 {0,0,0,0,Sk,0,GBOther,WBOther,SBOther},
-{0,0,dd3635,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,dd3636,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,dd3637,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,dd3638,0,Ll,0,GBOther,WBALetter,SBLower},
@@ -5032,13 +5146,13 @@ static const struct unidata st6[] = {
 {0,0,dd3646,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,dd3647,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,dd3648,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,0,dd3649,0,Ll,0,GBOther,WBALetter,SBLower}
+{0,0,dd3649,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,0,dd3650,0,Ll,0,GBOther,WBALetter,SBLower}
 };
 /* 0070-007F */
 static const struct unidata st7[] = {
-{0,0,dd3650,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,dd3651,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,dd3652,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,dd3653,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,dd3654,0,Ll,0,GBOther,WBALetter,SBLower},
@@ -5047,6 +5161,7 @@ static const struct unidata st7[] = {
 {0,0,dd3657,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,dd3658,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,dd3659,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,0,dd3660,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ps,0,GBOther,WBOther,SBClose},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Pe,0,GBOther,WBOther,SBClose},
@@ -5060,7 +5175,7 @@ static const struct unidata st8[] = {
 {0,0,0,0,Cc,0,GBControl,WBOther,SBOther},
 {0,0,0,0,Cc,0,GBControl,WBOther,SBOther},
 {0,0,0,0,Cc,0,GBControl,WBOther,SBOther},
-{0,0,0,0,Cc,0,GBControl,WBOther,SBSep},
+{0,0,0,0,Cc,0,GBControl,WBNewline,SBSep},
 {0,0,0,0,Cc,0,GBControl,WBOther,SBOther},
 {0,0,0,0,Cc,0,GBControl,WBOther,SBOther},
 {0,0,0,0,Cc,0,GBControl,WBOther,SBOther},
@@ -5074,7 +5189,7 @@ static const struct unidata st8[] = {
 };
 /* 00A0-00AF */
 static const struct unidata st9[] = {
-{dd0,0,0,0,Zs,CD,GBOther,WBOther,SBOLetter},
+{dd0,0,0,0,Zs,CD,GBOther,WBOther,SBSp},
 {0,0,0,0,Po,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sc,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sc,0,GBOther,WBOther,SBOther},
@@ -5082,7 +5197,7 @@ static const struct unidata st9[] = {
 {0,0,0,0,Sc,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{dd1,0,dd3660,0,Sk,CD,GBOther,WBOther,SBOther},
+{dd1,0,dd3661,0,Sk,CD,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {dd2,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {0,0,0,0,Pi,0,GBOther,WBOther,SBClose},
@@ -5112,60 +5227,60 @@ static const struct unidata st10[] = {
 };
 /* 00C0-00CF */
 static const struct unidata st11[] = {
-{dd14,dd3970,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd15,dd3971,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd16,dd3972,dd3661,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd17,dd3973,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd18,dd3974,dd3662,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd19,dd3975,dd3663,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd3976,dd3664,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd20,dd3977,dd3665,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd21,dd3978,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd22,dd3979,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd23,dd3980,dd3666,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd24,dd3981,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd25,dd3982,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd26,dd3983,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd27,dd3984,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd28,dd3985,dd3667,0,Lu,0,GBOther,WBALetter,SBUpper}
+{dd14,dd3971,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd15,dd3972,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd16,dd3973,dd3662,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd17,dd3974,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd18,dd3975,dd3663,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd19,dd3976,dd3664,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd3977,dd3665,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd20,dd3978,dd3666,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd21,dd3979,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd22,dd3980,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd23,dd3981,dd3667,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd24,dd3982,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd25,dd3983,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd26,dd3984,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd27,dd3985,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd28,dd3986,dd3668,0,Lu,0,GBOther,WBALetter,SBUpper}
 };
 /* 00D0-00DF */
 static const struct unidata st12[] = {
 {0,dd543,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd29,dd3986,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd30,dd3987,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd31,dd3988,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd32,dd3989,dd3668,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd33,dd3990,dd3669,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd34,dd3991,dd3670,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
-{0,dd3992,dd3671,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd35,dd3993,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd36,dd3994,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd37,dd3995,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd38,dd3996,dd3672,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd39,dd3997,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd3998,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd3999,0,0,Ll,0,GBOther,WBALetter,SBLower}
+{dd29,dd3987,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd30,dd3988,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd31,dd3989,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd32,dd3990,dd3669,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd33,dd3991,dd3670,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd34,dd3992,dd3671,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
+{0,dd3993,dd3672,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd35,dd3994,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd36,dd3995,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd37,dd3996,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd38,dd3997,dd3673,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd39,dd3998,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd3999,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4000,0,0,Ll,0,GBOther,WBALetter,SBLower}
 };
 /* 00E0-00EF */
 static const struct unidata st13[] = {
 {dd40,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {dd41,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd42,0,dd3673,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd42,0,dd3674,0,Ll,0,GBOther,WBALetter,SBLower},
 {dd43,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd44,0,dd3674,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd45,0,dd3675,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,0,dd3676,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd46,0,dd3677,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd44,0,dd3675,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd45,0,dd3676,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,0,dd3677,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd46,0,dd3678,0,Ll,0,GBOther,WBALetter,SBLower},
 {dd47,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {dd48,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd49,0,dd3678,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd49,0,dd3679,0,Ll,0,GBOther,WBALetter,SBLower},
 {dd50,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {dd51,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {dd52,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {dd53,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd54,0,dd3679,0,Ll,0,GBOther,WBALetter,SBLower}
+{dd54,0,dd3680,0,Ll,0,GBOther,WBALetter,SBLower}
 };
 /* 00F0-00FF */
 static const struct unidata st14[] = {
@@ -5173,201 +5288,201 @@ static const struct unidata st14[] = {
 {dd55,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {dd56,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {dd57,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd58,0,dd3680,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd59,0,dd3681,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd60,0,dd3682,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd58,0,dd3681,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd59,0,dd3682,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd60,0,dd3683,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
-{0,0,dd3683,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,0,dd3684,0,Ll,0,GBOther,WBALetter,SBLower},
 {dd61,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {dd62,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {dd63,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd64,0,dd3684,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd64,0,dd3685,0,Ll,0,GBOther,WBALetter,SBLower},
 {dd65,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {dd66,0,0,0,Ll,0,GBOther,WBALetter,SBLower}
 };
 /* 0100-010F */
 static const struct unidata st15[] = {
-{dd67,dd4000,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd67,dd4001,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd68,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd69,dd4001,dd3685,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd70,0,dd3686,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd71,dd4002,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd69,dd4002,dd3686,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd70,0,dd3687,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd71,dd4003,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd72,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd73,dd4003,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd73,dd4004,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd74,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd75,dd4004,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd75,dd4005,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd76,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd77,dd4005,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd77,dd4006,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd78,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd79,dd4006,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd79,dd4007,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd80,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd81,dd4007,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd81,dd4008,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd82,0,0,0,Ll,0,GBOther,WBALetter,SBLower}
 };
 /* 0110-011F */
 static const struct unidata st16[] = {
-{0,dd4008,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4009,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd83,dd4009,dd3687,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd84,0,dd3688,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd85,dd4010,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd83,dd4010,dd3688,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd84,0,dd3689,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd85,dd4011,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd86,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd87,dd4011,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd87,dd4012,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd88,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd89,dd4012,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd89,dd4013,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd90,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd91,dd4013,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd91,dd4014,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd92,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd93,dd4014,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd93,dd4015,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd94,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd95,dd4015,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd95,dd4016,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd96,0,0,0,Ll,0,GBOther,WBALetter,SBLower}
 };
 /* 0120-012F */
 static const struct unidata st17[] = {
-{dd97,dd4016,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd97,dd4017,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd98,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd99,dd4017,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd99,dd4018,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd100,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd101,dd4018,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd101,dd4019,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd102,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,dd1092,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd103,dd4019,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd103,dd4020,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd104,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd105,dd4020,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd105,dd4021,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd106,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd107,dd4021,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd107,dd4022,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd108,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd109,dd4022,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd109,dd4023,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd110,0,0,0,Ll,0,GBOther,WBALetter,SBLower}
 };
 /* 0130-013F */
 static const struct unidata st18[] = {
-{dd111,dd4023,0,0,Lu,NBC,GBOther,WBALetter,SBUpper},
+{dd111,dd4024,0,0,Lu,NBC,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd112,dd4024,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd112,dd4025,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
 {dd113,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd114,dd4025,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd114,dd4026,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd115,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd116,dd4026,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd116,dd4027,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd117,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd118,dd4027,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd118,dd4028,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd119,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd120,dd4028,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd120,dd4029,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd121,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd122,dd4029,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd122,dd4030,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd123,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd124,dd4030,0,0,Lu,CD,GBOther,WBALetter,SBUpper}
+{dd124,dd4031,0,0,Lu,CD,GBOther,WBALetter,SBUpper}
 };
 /* 0140-014F */
 static const struct unidata st19[] = {
 {dd125,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{0,dd4031,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4032,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd126,dd4032,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd126,dd4033,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd127,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd128,dd4033,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd128,dd4034,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd129,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd130,dd4034,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd130,dd4035,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd131,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {dd132,dd132,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {0,dd524,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd133,dd4035,dd3689,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd134,0,dd3690,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd135,dd4036,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd133,dd4036,dd3690,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd134,0,dd3691,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd135,dd4037,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd136,0,0,0,Ll,0,GBOther,WBALetter,SBLower}
 };
 /* 0150-015F */
 static const struct unidata st20[] = {
-{dd137,dd4037,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd137,dd4038,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd138,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4038,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4039,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd139,dd4039,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd139,dd4040,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd140,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd141,dd4040,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd141,dd4041,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd142,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd143,dd4041,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd143,dd4042,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd144,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd145,dd4042,dd3691,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd146,0,dd3692,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd147,dd4043,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd145,dd4043,dd3692,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd146,0,dd3693,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd147,dd4044,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd148,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd149,dd4044,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd149,dd4045,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd150,0,0,0,Ll,0,GBOther,WBALetter,SBLower}
 };
 /* 0160-016F */
 static const struct unidata st21[] = {
-{dd151,dd4045,dd3693,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd152,0,dd3694,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd153,dd4046,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd151,dd4046,dd3694,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd152,0,dd3695,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd153,dd4047,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd154,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd155,dd4047,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd155,dd4048,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd156,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4048,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4049,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd157,dd4049,dd3695,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd158,0,dd3696,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd159,dd4050,dd3697,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd160,0,dd3698,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd161,dd4051,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd157,dd4050,dd3696,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd158,0,dd3697,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd159,dd4051,dd3698,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd160,0,dd3699,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd161,dd4052,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd162,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd163,dd4052,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd163,dd4053,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd164,0,0,0,Ll,0,GBOther,WBALetter,SBLower}
 };
 /* 0170-017F */
 static const struct unidata st22[] = {
-{dd165,dd4053,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd165,dd4054,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd166,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd167,dd4054,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd167,dd4055,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd168,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd169,dd4055,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd169,dd4056,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd170,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd171,dd4056,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd171,dd4057,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd172,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd173,dd4057,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd174,dd4058,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd173,dd4058,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd174,dd4059,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd175,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd176,dd4059,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd176,dd4060,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd177,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd178,dd4060,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd178,dd4061,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd179,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd180,dd180,dd3699,0,Ll,CD,GBOther,WBALetter,SBLower}
+{dd180,dd180,dd3700,0,Ll,CD,GBOther,WBALetter,SBLower}
 };
 /* 0180-018F */
 static const struct unidata st23[] = {
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4061,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,dd4062,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,dd4063,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd525,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,dd4064,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,dd525,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,dd4065,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,dd4066,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,dd4067,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4068,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4068,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4069,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,dd518,0,0,Lu,0,GBOther,WBALetter,SBUpper}
 };
 /* 0190-019F */
 static const struct unidata st24[] = {
 {0,dd519,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4069,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,dd4070,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,dd4071,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,dd299,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,dd549,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,dd548,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4071,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4072,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
@@ -5378,38 +5493,38 @@ static const struct unidata st24[] = {
 };
 /* 01A0-01AF */
 static const struct unidata st25[] = {
-{dd181,dd4072,dd3700,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd182,0,dd3701,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4073,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd181,dd4073,dd3701,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd182,0,dd3702,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,dd4074,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,dd4075,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,dd4076,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4077,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,dd564,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4077,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,dd4078,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd183,dd4079,dd3702,0,Lu,0,GBOther,WBALetter,SBUpper}
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,dd4079,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd183,dd4080,dd3703,0,Lu,0,GBOther,WBALetter,SBUpper}
 };
 /* 01B0-01BF */
 static const struct unidata st26[] = {
-{dd184,0,dd3703,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd184,0,dd3704,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,dd567,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,dd569,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4080,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,dd4081,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd574,dd3704,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,dd4082,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,dd574,dd3705,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4083,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,dd4083,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4084,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower}
@@ -5420,138 +5535,138 @@ static const struct unidata st27[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{dd185,dd4084,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd186,dd4084,0,0,Lt,CD,GBOther,WBALetter,SBUpper},
+{dd185,dd4085,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd186,dd4085,0,0,Lt,CD,GBOther,WBALetter,SBUpper},
 {dd187,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd188,dd4085,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd189,dd4085,0,0,Lt,CD,GBOther,WBALetter,SBUpper},
+{dd188,dd4086,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd189,dd4086,0,0,Lt,CD,GBOther,WBALetter,SBUpper},
 {dd190,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd191,dd4086,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd192,dd4086,0,0,Lt,CD,GBOther,WBALetter,SBUpper},
+{dd191,dd4087,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd192,dd4087,0,0,Lt,CD,GBOther,WBALetter,SBUpper},
 {dd193,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd194,dd4087,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd194,dd4088,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd195,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd196,dd4088,0,0,Lu,0,GBOther,WBALetter,SBUpper}
+{dd196,dd4089,0,0,Lu,0,GBOther,WBALetter,SBUpper}
 };
 /* 01D0-01DF */
 static const struct unidata st28[] = {
 {dd197,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd198,dd4089,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd198,dd4090,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd199,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd200,dd4090,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd200,dd4091,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd201,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd202,dd4091,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd202,dd4092,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd203,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd204,dd4092,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd204,dd4093,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd205,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd206,dd4093,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd206,dd4094,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd207,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd208,dd4094,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd208,dd4095,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd209,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd210,dd3674,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd210,dd3675,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd211,0,0,0,Ll,0,GBOther,WBALetter,SBLower}
 };
 /* 01E0-01EF */
 static const struct unidata st29[] = {
-{dd212,dd3708,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd212,dd3709,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd213,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd214,dd4095,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd214,dd4096,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd215,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4096,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4097,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd216,dd4097,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd216,dd4098,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd217,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd218,dd4098,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd218,dd4099,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd219,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd220,dd4099,dd3705,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd221,0,dd3706,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd222,dd3706,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd220,dd4100,dd3706,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd221,0,dd3707,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd222,dd3707,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd223,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd224,dd3713,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd224,dd3714,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd225,0,0,0,Ll,0,GBOther,WBALetter,SBLower}
 };
 /* 01F0-01FF */
 static const struct unidata st30[] = {
 {dd226,dd226,0,0,Ll,NBC,GBOther,WBALetter,SBLower},
-{dd227,dd4100,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd228,dd4100,0,0,Lt,CD,GBOther,WBALetter,SBUpper},
+{dd227,dd4101,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd228,dd4101,0,0,Lt,CD,GBOther,WBALetter,SBUpper},
 {dd229,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd230,dd4101,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd230,dd4102,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd231,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4102,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,dd4103,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd232,dd4104,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4104,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd232,dd4105,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd233,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd234,dd3675,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd234,dd3676,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd235,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd236,dd4105,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd236,dd4106,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd237,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd238,dd3683,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd238,dd3684,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd239,0,0,0,Ll,0,GBOther,WBALetter,SBLower}
 };
 /* 0200-020F */
 static const struct unidata st31[] = {
-{dd240,dd4106,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd240,dd4107,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd241,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd242,dd4107,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd242,dd4108,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd243,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd244,dd4108,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd244,dd4109,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd245,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd246,dd4109,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd246,dd4110,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd247,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd248,dd4110,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd248,dd4111,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd249,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd250,dd4111,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd250,dd4112,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd251,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd252,dd4112,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd252,dd4113,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd253,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd254,dd4113,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd254,dd4114,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd255,0,0,0,Ll,0,GBOther,WBALetter,SBLower}
 };
 /* 0210-021F */
 static const struct unidata st32[] = {
-{dd256,dd4114,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd256,dd4115,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd257,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd258,dd4115,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd258,dd4116,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd259,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd260,dd4116,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd260,dd4117,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd261,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd262,dd4117,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd262,dd4118,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd263,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd264,dd4118,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd264,dd4119,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd265,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd266,dd4119,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd266,dd4120,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd267,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4120,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4121,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd268,dd4121,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd268,dd4122,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd269,0,0,0,Ll,0,GBOther,WBALetter,SBLower}
 };
 /* 0220-022F */
 static const struct unidata st33[] = {
-{0,dd4122,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,dd4123,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,dd4124,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd270,dd4125,dd3707,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd271,0,dd3708,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd272,dd4126,dd3709,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd273,0,dd3710,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd274,dd3682,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4125,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd270,dd4126,dd3708,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd271,0,dd3709,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd272,dd4127,dd3710,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd273,0,dd3711,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd274,dd3683,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd275,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd276,dd4127,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd276,dd4128,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd277,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd278,dd4128,dd3711,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd279,0,dd3712,0,Ll,0,GBOther,WBALetter,SBLower}
+{dd278,dd4129,dd3712,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd279,0,dd3713,0,Ll,0,GBOther,WBALetter,SBLower}
 };
 /* 0230-023F */
 static const struct unidata st34[] = {
-{dd280,dd3712,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd280,dd3713,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd281,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd282,dd4129,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd282,dd4130,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd283,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
@@ -5559,23 +5674,21 @@ static const struct unidata st34[] = {
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4130,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,dd4131,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,dd4132,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,dd4133,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4134,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower}
 };
 /* 0240-024F */
 static const struct unidata st35[] = {
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4134,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,dd4135,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,dd4136,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,dd566,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,dd570,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4136,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,dd4137,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,dd4138,0,0,Lu,0,GBOther,WBALetter,SBUpper},
@@ -5583,6 +5696,8 @@ static const struct unidata st35[] = {
 {0,dd4139,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,dd4140,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,dd4141,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower}
 };
 /* 0250-025F */
@@ -5608,7 +5723,7 @@ static const struct unidata st36[] = {
 static const struct unidata st37[] = {
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,0,dd3713,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,0,dd3714,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
@@ -5694,7 +5809,7 @@ static const struct unidata st41[] = {
 {0,0,0,0,Sk,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sk,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sk,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Sk,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Lm,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Sk,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Lm,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Sk,0,GBOther,WBOther,SBOther}
@@ -5853,14 +5968,14 @@ static const struct unidata st49[] = {
 };
 /* 0370-037F */
 static const struct unidata st50[] = {
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{dd307,0,0,0,Sk,0,GBOther,WBOther,SBOther},
+{0,dd4142,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,dd4143,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd307,0,0,0,Lm,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Sk,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,dd4144,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {dd308,0,0,0,Lm,CD,GBOther,WBALetter,SBLower},
@@ -5879,7 +5994,7 @@ static const struct unidata st51[] = {
 {dd6,0,0,0,Sk,CD,GBOther,WBOther,SBOther},
 {dd310,0,0,0,Sk,0,GBOther,WBOther,SBOther},
 {dd311,dd922,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd312,0,0,0,Po,0,GBOther,WBOther,SBOther},
+{dd312,0,0,0,Po,0,GBOther,WBMidLetter,SBOther},
 {dd313,dd924,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd314,dd926,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd315,dd928,0,0,Lu,0,GBOther,WBALetter,SBUpper},
@@ -5891,116 +6006,116 @@ static const struct unidata st51[] = {
 };
 /* 0390-039F */
 static const struct unidata st52[] = {
-{dd319,dd4141,0,0,Ll,NBC,GBOther,WBALetter,SBLower},
-{0,dd3117,dd3714,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd319,dd4145,0,0,Ll,NBC,GBOther,WBALetter,SBLower},
+{0,dd3118,dd3715,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,dd332,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,dd535,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,dd536,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd343,dd3715,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd3118,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd3119,dd3716,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd343,dd3716,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd3119,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd3120,dd3717,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,dd333,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd996,dd3717,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd996,dd3718,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,dd339,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd3120,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd7,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,dd3121,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd7,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,dd3122,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd3123,dd3718,0,Lu,0,GBOther,WBALetter,SBUpper}
+{0,dd3123,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd3124,dd3719,0,Lu,0,GBOther,WBALetter,SBUpper}
 };
 /* 03A0-03AF */
 static const struct unidata st53[] = {
 {0,dd338,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd340,dd3719,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd340,dd3720,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,dd3124,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,dd3125,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd3126,dd3720,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd3126,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd3127,dd3721,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,dd337,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,dd537,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd3127,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd3128,dd3721,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd320,dd4142,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd321,dd4143,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd322,0,dd3722,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,dd3128,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd3129,dd3722,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd320,dd4146,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd321,dd4147,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd322,0,dd3723,0,Ll,0,GBOther,WBALetter,SBLower},
 {dd323,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd324,0,dd3723,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd324,0,dd3724,0,Ll,0,GBOther,WBALetter,SBLower},
 {dd325,0,0,0,Ll,0,GBOther,WBALetter,SBLower}
 };
 /* 03B0-03BF */
 static const struct unidata st54[] = {
-{dd326,dd4144,0,0,Ll,NBC,GBOther,WBALetter,SBLower},
-{0,0,dd3724,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd326,dd4148,0,0,Ll,NBC,GBOther,WBALetter,SBLower},
+{0,0,dd3725,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,0,dd3725,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,dd3726,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,dd3727,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,0,dd3728,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,0,dd3728,0,Ll,0,GBOther,WBALetter,SBLower}
+{0,0,dd3729,0,Ll,0,GBOther,WBALetter,SBLower}
 };
 /* 03C0-03CF */
 static const struct unidata st55[] = {
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,0,dd3729,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd3124,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,0,dd3730,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,dd3125,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,0,dd3730,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,0,dd3731,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,0,dd3731,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd327,0,dd3732,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd328,0,dd3733,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,0,dd3732,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd327,0,dd3733,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd328,0,dd3734,0,Ll,0,GBOther,WBALetter,SBLower},
 {dd329,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {dd330,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd331,0,dd3734,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
+{dd331,0,dd3735,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,dd4149,0,0,Lu,0,GBOther,WBALetter,SBUpper}
 };
 /* 03D0-03DF */
 static const struct unidata st56[] = {
 {dd332,dd332,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {dd333,dd333,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd334,0,dd3735,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd334,0,dd3736,0,Lu,CD,GBOther,WBALetter,SBUpper},
 {dd335,0,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd336,0,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd337,dd337,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {dd338,dd338,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4145,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4150,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4146,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4151,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd3137,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd3138,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4147,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4152,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower}
 };
 /* 03E0-03EF */
 static const struct unidata st57[] = {
-{0,dd4148,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4153,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4149,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4154,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4150,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4155,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4151,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4156,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4152,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4157,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4153,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4158,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4154,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4159,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4155,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4160,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower}
 };
 /* 03F0-03FF */
@@ -6012,90 +6127,90 @@ static const struct unidata st58[] = {
 {dd342,dd333,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
 {dd343,dd343,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
-{0,dd4156,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4161,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd344,dd4157,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{0,dd4158,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd344,dd4162,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{0,dd4163,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4159,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4160,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4161,0,0,Lu,0,GBOther,WBALetter,SBUpper}
+{0,dd4164,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4165,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4166,0,0,Lu,0,GBOther,WBALetter,SBUpper}
 };
 /* 0400-040F */
 static const struct unidata st59[] = {
-{dd345,dd4162,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd346,dd4163,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4164,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd347,dd3750,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4165,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4166,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4167,dd3736,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd348,dd3761,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4168,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd345,dd4167,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd346,dd4168,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,dd4169,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd347,dd3751,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,dd4170,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,dd4171,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd349,dd3755,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd350,dd4172,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd351,dd4173,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4174,0,0,Lu,0,GBOther,WBALetter,SBUpper}
+{0,dd4172,dd3737,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd348,dd3762,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4173,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4174,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4175,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4176,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd349,dd3756,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd350,dd4177,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd351,dd4178,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4179,0,0,Lu,0,GBOther,WBALetter,SBUpper}
 };
 /* 0410-041F */
 static const struct unidata st60[] = {
-{0,dd4175,dd3737,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4176,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4177,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4178,dd3738,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4179,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4180,dd3739,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4181,dd3740,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4182,dd3741,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4183,dd3742,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd352,dd4184,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4185,dd3743,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4186,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4187,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4180,dd3738,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4181,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4182,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4183,dd3739,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4184,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4185,dd3740,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4186,dd3741,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4187,dd3742,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4188,dd3743,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd352,dd4189,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4190,dd3744,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4191,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4192,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,dd539,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4188,dd3744,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4189,0,0,Lu,0,GBOther,WBALetter,SBUpper}
+{0,dd4193,dd3745,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4194,0,0,Lu,0,GBOther,WBALetter,SBUpper}
 };
 /* 0420-042F */
 static const struct unidata st61[] = {
-{0,dd4190,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4191,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4192,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4193,dd3745,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4194,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,dd4195,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,dd4196,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4197,dd3746,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4198,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4197,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4198,dd3746,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,dd4199,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,dd4200,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4201,dd3747,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4202,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4203,dd3748,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4201,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4202,dd3747,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4203,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,dd4204,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4205,0,0,Lu,0,GBOther,WBALetter,SBUpper}
+{0,dd4205,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4206,dd3748,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4207,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4208,dd3749,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4209,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4210,0,0,Lu,0,GBOther,WBALetter,SBUpper}
 };
 /* 0430-043F */
 static const struct unidata st62[] = {
-{0,0,dd3749,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,dd3750,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,dd3751,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,dd3752,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,dd3753,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,dd3754,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd353,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,dd3755,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd353,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,0,dd3756,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,0,dd3756,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,0,dd3757,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower}
 };
 /* 0440-044F */
@@ -6103,18 +6218,18 @@ static const struct unidata st63[] = {
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,0,dd3757,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,dd3758,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,dd3759,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,dd3760,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,0,dd3761,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower}
 };
 /* 0450-045F */
@@ -6125,7 +6240,7 @@ static const struct unidata st64[] = {
 {dd356,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,0,dd3761,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,0,dd3762,0,Ll,0,GBOther,WBALetter,SBLower},
 {dd357,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
@@ -6138,82 +6253,69 @@ static const struct unidata st64[] = {
 };
 /* 0460-046F */
 static const struct unidata st65[] = {
-{0,dd4206,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4211,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4207,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4212,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4208,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4213,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4209,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4214,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4210,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4215,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4211,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4216,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4212,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4217,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4213,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4218,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower}
 };
 /* 0470-047F */
 static const struct unidata st66[] = {
-{0,dd4214,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4219,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4215,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4220,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4216,dd3762,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,0,dd3763,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd361,dd3763,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4221,dd3763,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,dd3764,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd361,dd3764,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd362,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4217,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4222,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4218,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4223,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4219,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4224,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4220,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4225,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower}
 };
 /* 0480-048F */
 static const struct unidata st67[] = {
-{0,dd4221,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4226,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Me,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Me,0,GBExtend,WBExtend,SBExtend},
-{0,dd4222,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4227,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4223,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4228,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4224,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4229,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower}
 };
 /* 0490-049F */
 static const struct unidata st68[] = {
-{0,dd4225,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4226,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4227,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4228,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4229,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,dd4230,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,dd4231,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,dd4232,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower}
-};
-/* 04A0-04AF */
-static const struct unidata st69[] = {
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,dd4233,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,dd4234,0,0,Lu,0,GBOther,WBALetter,SBUpper},
@@ -6223,16 +6325,16 @@ static const struct unidata st69[] = {
 {0,dd4236,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,dd4237,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower}
+};
+/* 04A0-04AF */
+static const struct unidata st69[] = {
 {0,dd4238,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,dd4239,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,dd4240,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower}
-};
-/* 04B0-04BF */
-static const struct unidata st70[] = {
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,dd4241,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,dd4242,0,0,Lu,0,GBOther,WBALetter,SBUpper},
@@ -6242,134 +6344,147 @@ static const struct unidata st70[] = {
 {0,dd4244,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,dd4245,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower}
+};
+/* 04B0-04BF */
+static const struct unidata st70[] = {
 {0,dd4246,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,dd4247,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,dd4248,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,dd4249,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,dd4250,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,dd4251,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,dd4252,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,dd4253,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower}
 };
 /* 04C0-04CF */
 static const struct unidata st71[] = {
-{0,dd4249,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd363,dd4250,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4254,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd363,dd4255,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd364,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4251,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4256,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4252,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4257,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4253,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4258,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4254,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4259,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4255,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4260,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4256,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4261,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower}
 };
 /* 04D0-04DF */
 static const struct unidata st72[] = {
-{dd365,dd4257,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd365,dd4262,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd366,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd367,dd4258,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd367,dd4263,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd368,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4259,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4264,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd369,dd4260,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd369,dd4265,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd370,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4261,dd3764,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,0,dd3765,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd371,dd3765,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4266,dd3765,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,dd3766,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd371,dd3766,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd372,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd373,dd4262,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd373,dd4267,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd374,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd375,dd3753,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd375,dd3754,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd376,0,0,0,Ll,0,GBOther,WBALetter,SBLower}
 };
 /* 04E0-04EF */
 static const struct unidata st73[] = {
-{0,dd4263,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4268,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd377,dd4264,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd377,dd4269,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd378,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd379,dd4265,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd379,dd4270,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd380,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd381,dd3756,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd381,dd3757,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd382,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4266,dd3766,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,0,dd3767,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd383,dd3767,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4271,dd3767,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,dd3768,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd383,dd3768,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd384,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd385,dd3760,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd385,dd3761,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd386,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd387,dd4267,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd387,dd4272,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd388,0,0,0,Ll,0,GBOther,WBALetter,SBLower}
 };
 /* 04F0-04FF */
 static const struct unidata st74[] = {
-{dd389,dd4268,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd389,dd4273,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd390,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd391,dd4269,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd391,dd4274,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd392,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd393,dd3758,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd393,dd3759,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd394,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4270,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4275,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd395,dd3759,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd395,dd3760,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd396,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4271,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4276,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4272,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4277,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4273,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4278,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower}
 };
 /* 0500-050F */
 static const struct unidata st75[] = {
-{0,dd4274,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4279,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4275,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4280,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4276,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4281,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4277,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4282,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4278,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4283,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4279,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4284,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4280,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4285,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4281,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4286,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower}
 };
 /* 0510-051F */
 static const struct unidata st76[] = {
-{0,dd4282,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4287,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4283,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4288,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
+{0,dd4289,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,dd4290,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,dd4291,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,dd4292,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,dd4293,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,dd4294,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower}
 };
 /* 0520-052F */
 static const struct unidata st77[] = {
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,dd4295,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,dd4296,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
@@ -6386,24 +6501,8 @@ static const struct unidata st77[] = {
 /* 0530-053F */
 static const struct unidata st78[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,dd4284,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4285,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4286,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4287,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4288,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4289,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4290,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4291,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4292,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4293,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4294,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4295,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4296,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,dd4297,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4298,0,0,Lu,0,GBOther,WBALetter,SBUpper}
-};
-/* 0540-054F */
-static const struct unidata st79[] = {
+{0,dd4298,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,dd4299,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,dd4300,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,dd4301,0,0,Lu,0,GBOther,WBALetter,SBUpper},
@@ -6416,13 +6515,13 @@ static const struct unidata st79[] = {
 {0,dd4308,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,dd4309,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,dd4310,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4311,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4311,0,0,Lu,0,GBOther,WBALetter,SBUpper}
+};
+/* 0540-054F */
+static const struct unidata st79[] = {
 {0,dd4312,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,dd4313,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4314,0,0,Lu,0,GBOther,WBALetter,SBUpper}
-};
-/* 0550-055F */
-static const struct unidata st80[] = {
+{0,dd4314,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,dd4315,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,dd4316,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,dd4317,0,0,Lu,0,GBOther,WBALetter,SBUpper},
@@ -6430,13 +6529,29 @@ static const struct unidata st80[] = {
 {0,dd4319,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,dd4320,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,dd4321,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4322,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4323,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4324,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4325,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4326,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4327,0,0,Lu,0,GBOther,WBALetter,SBUpper}
+};
+/* 0550-055F */
+static const struct unidata st80[] = {
+{0,dd4328,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4329,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4330,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4331,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4332,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4333,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4334,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Lm,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Po,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Po,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Po,0,GBOther,WBOther,SBSTerm},
-{0,0,0,0,Po,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Po,0,GBOther,WBOther,SBSContinue},
 {0,0,0,0,Po,0,GBOther,WBOther,SBSTerm},
 {0,0,0,0,Po,0,GBOther,WBOther,SBOther}
 };
@@ -6532,7 +6647,7 @@ static const struct unidata st85[] = {
 {0,0,0,20,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,21,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,22,Mn,0,GBExtend,WBExtend,SBExtend},
-{0,0,0,0,Po,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Pd,0,GBOther,WBOther,SBOther},
 {0,0,0,23,Mn,0,GBExtend,WBExtend,SBExtend}
 };
 /* 05C0-05CF */
@@ -6619,14 +6734,14 @@ static const struct unidata st90[] = {
 {0,0,0,0,Cf,0,GBControl,WBFormat,SBFormat},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Sc,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Po,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Po,0,GBOther,WBMidNum,SBOther},
+{0,0,0,0,Po,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Sc,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Po,0,GBOther,WBMidNum,SBSContinue},
+{0,0,0,0,Po,0,GBOther,WBMidNum,SBSContinue},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther}
 };
@@ -6638,11 +6753,11 @@ static const struct unidata st91[] = {
 {0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,30,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,31,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,32,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Po,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
@@ -6658,7 +6773,7 @@ static const struct unidata st92[] = {
 {dd400,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {dd401,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {dd402,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,dd3768,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,dd3769,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
@@ -6678,9 +6793,9 @@ static const struct unidata st93[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,dd2958,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,dd2959,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,dd2960,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,dd2961,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,27,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,28,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,29,Mn,0,GBExtend,WBExtend,SBExtend},
@@ -6720,7 +6835,7 @@ static const struct unidata st95[] = {
 {0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric},
 {0,0,0,0,Po,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Po,0,GBOther,WBNumeric,SBNumeric},
-{0,0,0,0,Po,0,GBOther,WBNumeric,SBNumeric},
+{0,0,0,0,Po,0,GBOther,WBMidNum,SBNumeric},
 {0,0,0,0,Po,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter}
@@ -6747,7 +6862,7 @@ static const struct unidata st96[] = {
 /* 06C0-06CF */
 static const struct unidata st97[] = {
 {dd407,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,dd3769,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,dd3770,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {dd408,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
@@ -6767,10 +6882,10 @@ static const struct unidata st97[] = {
 static const struct unidata st98[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,dd2614,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,dd2615,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {dd409,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Po,0,GBOther,WBOther,SBSTerm},
-{0,0,dd2610,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,dd2611,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
@@ -6896,27 +7011,8 @@ static const struct unidata st104[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter}
 };
-/* 0760-076F */
-static const struct unidata st105[] = {
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
-};
 /* 07A0-07AF */
-static const struct unidata st106[] = {
+static const struct unidata st105[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
@@ -6935,7 +7031,7 @@ static const struct unidata st106[] = {
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend}
 };
 /* 07B0-07BF */
-static const struct unidata st107[] = {
+static const struct unidata st106[] = {
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
@@ -6954,7 +7050,7 @@ static const struct unidata st107[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 07C0-07CF */
-static const struct unidata st108[] = {
+static const struct unidata st107[] = {
 {0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric},
 {0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric},
 {0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric},
@@ -6973,7 +7069,7 @@ static const struct unidata st108[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter}
 };
 /* 07E0-07EF */
-static const struct unidata st109[] = {
+static const struct unidata st108[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
@@ -6992,7 +7088,7 @@ static const struct unidata st109[] = {
 {0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend}
 };
 /* 07F0-07FF */
-static const struct unidata st110[] = {
+static const struct unidata st109[] = {
 {0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,220,Mn,0,GBExtend,WBExtend,SBExtend},
@@ -7001,7 +7097,7 @@ static const struct unidata st110[] = {
 {0,0,0,0,Lm,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Po,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Po,0,GBOther,WBMidNum,SBOther},
+{0,0,0,0,Po,0,GBOther,WBMidNum,SBSContinue},
 {0,0,0,0,Po,0,GBOther,WBOther,SBSTerm},
 {0,0,0,0,Lm,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
@@ -7010,12 +7106,31 @@ static const struct unidata st110[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
+/* 0800-080F */
+static const struct unidata st110[] = {
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
+};
 /* 0900-090F */
 static const struct unidata st111[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
-{0,0,0,0,Mc,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
@@ -7039,7 +7154,7 @@ static const struct unidata st112[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,dd3770,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,dd3771,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {dd410,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
@@ -7050,10 +7165,10 @@ static const struct unidata st112[] = {
 };
 /* 0930-093F */
 static const struct unidata st113[] = {
-{0,0,dd3771,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,dd3772,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {dd411,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,dd3772,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,dd3773,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {dd412,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
@@ -7064,12 +7179,12 @@ static const struct unidata st113[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,7,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Mc,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Mc,0,GBOther,WBALetter,SBOLetter}
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend}
 };
 /* 0940-094F */
 static const struct unidata st114[] = {
-{0,0,0,0,Mc,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
@@ -7078,10 +7193,10 @@ static const struct unidata st114[] = {
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
-{0,0,0,0,Mc,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Mc,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Mc,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Mc,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
 {0,0,0,9,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
@@ -7127,8 +7242,8 @@ static const struct unidata st116[] = {
 /* 0970-097F */
 static const struct unidata st117[] = {
 {0,0,0,0,Po,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Lm,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
@@ -7147,8 +7262,8 @@ static const struct unidata st117[] = {
 static const struct unidata st118[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
-{0,0,0,0,Mc,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Mc,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
@@ -7217,23 +7332,23 @@ static const struct unidata st121[] = {
 {0,0,0,7,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Mc,0,GBExtend,WBExtend,SBExtend},
-{0,0,0,0,Mc,0,GBOther,WBALetter,SBOLetter}
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend}
 };
 /* 09C0-09CF */
 static const struct unidata st122[] = {
-{0,0,0,0,Mc,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,dd3773,0,Mc,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Mc,0,GBOther,WBALetter,SBOLetter},
+{0,0,dd3774,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{dd421,0,0,0,Mc,0,GBOther,WBALetter,SBOLetter},
-{dd422,0,0,0,Mc,0,GBOther,WBALetter,SBOLetter},
+{dd421,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{dd422,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
 {0,0,0,9,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
@@ -7300,7 +7415,7 @@ static const struct unidata st126[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
-{0,0,0,0,Mc,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
@@ -7330,12 +7445,12 @@ static const struct unidata st127[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,7,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Mc,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Mc,0,GBOther,WBALetter,SBOLetter}
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend}
 };
 /* 0A40-0A4F */
 static const struct unidata st128[] = {
-{0,0,0,0,Mc,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
@@ -7355,7 +7470,7 @@ static const struct unidata st128[] = {
 /* 0A50-0A5F */
 static const struct unidata st129[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
@@ -7397,7 +7512,7 @@ static const struct unidata st131[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
@@ -7414,7 +7529,7 @@ static const struct unidata st132[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
-{0,0,0,0,Mc,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
@@ -7463,12 +7578,12 @@ static const struct unidata st134[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,7,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Mc,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Mc,0,GBOther,WBALetter,SBOLetter}
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend}
 };
 /* 0AC0-0ACF */
 static const struct unidata st135[] = {
-{0,0,0,0,Mc,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
@@ -7477,10 +7592,10 @@ static const struct unidata st135[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
-{0,0,0,0,Mc,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Mc,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Mc,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
 {0,0,0,9,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
@@ -7544,19 +7659,19 @@ static const struct unidata st138[] = {
 };
 /* 0B40-0B4F */
 static const struct unidata st139[] = {
-{0,0,0,0,Mc,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,dd3774,0,Mc,0,GBOther,WBALetter,SBOLetter},
-{dd432,0,0,0,Mc,0,GBOther,WBALetter,SBOLetter},
+{0,0,dd3775,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{dd432,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{dd433,0,0,0,Mc,0,GBOther,WBALetter,SBOLetter},
-{dd434,0,0,0,Mc,0,GBOther,WBALetter,SBOLetter},
+{dd433,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{dd434,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
 {0,0,0,9,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
@@ -7580,27 +7695,8 @@ static const struct unidata st140[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter}
 };
-/* 0B60-0B6F */
-static const struct unidata st141[] = {
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric},
-{0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric},
-{0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric},
-{0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric},
-{0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric},
-{0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric},
-{0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric},
-{0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric},
-{0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric},
-{0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric}
-};
 /* 0B70-0B7F */
-static const struct unidata st142[] = {
+static const struct unidata st141[] = {
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
@@ -7619,7 +7715,7 @@ static const struct unidata st142[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 0B80-0B8F */
-static const struct unidata st143[] = {
+static const struct unidata st142[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
@@ -7638,10 +7734,10 @@ static const struct unidata st143[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter}
 };
 /* 0B90-0B9F */
-static const struct unidata st144[] = {
+static const struct unidata st143[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,dd3775,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,dd3776,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {dd437,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
@@ -7657,7 +7753,7 @@ static const struct unidata st144[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter}
 };
 /* 0BA0-0BAF */
-static const struct unidata st145[] = {
+static const struct unidata st144[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
@@ -7676,7 +7772,7 @@ static const struct unidata st145[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter}
 };
 /* 0BB0-0BBF */
-static const struct unidata st146[] = {
+static const struct unidata st145[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
@@ -7692,30 +7788,30 @@ static const struct unidata st146[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Mc,0,GBExtend,WBExtend,SBExtend},
-{0,0,0,0,Mc,0,GBOther,WBALetter,SBOLetter}
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend}
 };
 /* 0BC0-0BCF */
-static const struct unidata st147[] = {
+static const struct unidata st146[] = {
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
-{0,0,0,0,Mc,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Mc,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,dd3776,0,Mc,0,GBOther,WBALetter,SBOLetter},
-{0,0,dd3777,0,Mc,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Mc,0,GBOther,WBALetter,SBOLetter},
+{0,0,dd3777,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,dd3778,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{dd438,0,0,0,Mc,0,GBOther,WBALetter,SBOLetter},
-{dd439,0,0,0,Mc,0,GBOther,WBALetter,SBOLetter},
-{dd440,0,0,0,Mc,0,GBOther,WBALetter,SBOLetter},
+{dd438,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{dd439,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{dd440,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
 {0,0,0,9,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 0BD0-0BDF */
-static const struct unidata st148[] = {
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+static const struct unidata st147[] = {
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
@@ -7733,7 +7829,7 @@ static const struct unidata st148[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 0BF0-0BFF */
-static const struct unidata st149[] = {
+static const struct unidata st148[] = {
 {0,0,0,0,No,0,GBOther,WBOther,SBOther},
 {0,0,0,0,No,0,GBOther,WBOther,SBOther},
 {0,0,0,0,No,0,GBOther,WBOther,SBOther},
@@ -7752,11 +7848,11 @@ static const struct unidata st149[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 0C00-0C0F */
-static const struct unidata st150[] = {
+static const struct unidata st149[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Mc,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Mc,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Mc,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
@@ -7771,7 +7867,7 @@ static const struct unidata st150[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter}
 };
 /* 0C10-0C1F */
-static const struct unidata st151[] = {
+static const struct unidata st150[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
@@ -7790,7 +7886,7 @@ static const struct unidata st151[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter}
 };
 /* 0C30-0C3F */
-static const struct unidata st152[] = {
+static const struct unidata st151[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
@@ -7804,19 +7900,19 @@ static const struct unidata st152[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend}
 };
 /* 0C40-0C4F */
-static const struct unidata st153[] = {
+static const struct unidata st152[] = {
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
-{0,0,0,0,Mc,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Mc,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Mc,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Mc,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,dd3778,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,dd3779,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {dd441,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
@@ -7828,7 +7924,7 @@ static const struct unidata st153[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 0C50-0C5F */
-static const struct unidata st154[] = {
+static const struct unidata st153[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
@@ -7837,21 +7933,40 @@ static const struct unidata st154[] = {
 {0,0,0,84,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,91,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
+};
+/* 0C70-0C7F */
+static const struct unidata st154[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,No,0,GBOther,WBOther,SBOther},
+{0,0,0,0,No,0,GBOther,WBOther,SBOther},
+{0,0,0,0,No,0,GBOther,WBOther,SBOther},
+{0,0,0,0,No,0,GBOther,WBOther,SBOther},
+{0,0,0,0,No,0,GBOther,WBOther,SBOther},
+{0,0,0,0,No,0,GBOther,WBOther,SBOther},
+{0,0,0,0,No,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther}
 };
 /* 0C80-0C8F */
 static const struct unidata st155[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Mc,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Mc,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
@@ -7881,23 +7996,23 @@ static const struct unidata st156[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,7,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Mc,0,GBOther,WBALetter,SBOLetter},
-{0,0,dd3779,0,Mn,0,GBExtend,WBExtend,SBExtend}
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,dd3780,0,Mn,0,GBExtend,WBExtend,SBExtend}
 };
 /* 0CC0-0CCF */
 static const struct unidata st157[] = {
-{dd442,0,0,0,Mc,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Mc,0,GBOther,WBALetter,SBOLetter},
+{dd442,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
 {0,0,0,0,Mc,0,GBExtend,WBExtend,SBExtend},
-{0,0,0,0,Mc,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Mc,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,dd3780,0,Mn,0,GBExtend,WBExtend,SBExtend},
-{dd443,0,0,0,Mc,0,GBOther,WBALetter,SBOLetter},
-{dd444,0,0,0,Mc,0,GBOther,WBALetter,SBOLetter},
+{0,0,dd3781,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{dd443,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{dd444,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{dd445,0,dd3781,0,Mc,0,GBOther,WBALetter,SBOLetter},
-{dd446,0,0,0,Mc,0,GBOther,WBALetter,SBOLetter},
+{dd445,0,dd3782,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{dd446,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,9,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
@@ -7941,31 +8056,88 @@ static const struct unidata st159[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
-/* 0D40-0D4F */
+/* 0D30-0D3F */
 static const struct unidata st160[] = {
-{0,0,0,0,Mc,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Mc,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend}
+};
+/* 0D40-0D4F */
+static const struct unidata st161[] = {
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,dd3783,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,dd3784,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,dd3782,0,Mc,0,GBOther,WBALetter,SBOLetter},
-{0,0,dd3783,0,Mc,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Mc,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{dd447,0,0,0,Mc,0,GBOther,WBALetter,SBOLetter},
-{dd448,0,0,0,Mc,0,GBOther,WBALetter,SBOLetter},
-{dd449,0,0,0,Mc,0,GBOther,WBALetter,SBOLetter},
+{dd447,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{dd448,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{dd449,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
 {0,0,0,9,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
+/* 0D50-0D5F */
+static const struct unidata st162[] = {
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Mc,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
+};
+/* 0D70-0D7F */
+static const struct unidata st163[] = {
+{0,0,0,0,No,0,GBOther,WBOther,SBOther},
+{0,0,0,0,No,0,GBOther,WBOther,SBOther},
+{0,0,0,0,No,0,GBOther,WBOther,SBOther},
+{0,0,0,0,No,0,GBOther,WBOther,SBOther},
+{0,0,0,0,No,0,GBOther,WBOther,SBOther},
+{0,0,0,0,No,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter}
+};
 /* 0D80-0D8F */
-static const struct unidata st161[] = {
+static const struct unidata st164[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Mc,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Mc,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
@@ -7980,7 +8152,7 @@ static const struct unidata st161[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter}
 };
 /* 0D90-0D9F */
-static const struct unidata st162[] = {
+static const struct unidata st165[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
@@ -7999,7 +8171,7 @@ static const struct unidata st162[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter}
 };
 /* 0DB0-0DBF */
-static const struct unidata st163[] = {
+static const struct unidata st166[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
@@ -8018,7 +8190,7 @@ static const struct unidata st163[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 0DC0-0DCF */
-static const struct unidata st164[] = {
+static const struct unidata st167[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
@@ -8037,30 +8209,30 @@ static const struct unidata st164[] = {
 {0,0,0,0,Mc,0,GBExtend,WBExtend,SBExtend}
 };
 /* 0DD0-0DDF */
-static const struct unidata st165[] = {
-{0,0,0,0,Mc,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Mc,0,GBOther,WBALetter,SBOLetter},
+static const struct unidata st168[] = {
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Mc,0,GBOther,WBALetter,SBOLetter},
-{0,0,dd3784,0,Mc,0,GBOther,WBALetter,SBOLetter},
-{dd450,0,0,0,Mc,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Mc,0,GBOther,WBALetter,SBOLetter},
-{dd451,0,dd3785,0,Mc,0,GBOther,WBALetter,SBOLetter},
-{dd452,0,0,0,Mc,0,GBOther,WBALetter,SBOLetter},
-{dd453,0,0,0,Mc,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,dd3785,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{dd450,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{dd451,0,dd3786,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{dd452,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{dd453,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
 {0,0,0,0,Mc,0,GBExtend,WBExtend,SBExtend}
 };
 /* 0DF0-0DFF */
-static const struct unidata st166[] = {
+static const struct unidata st169[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Mc,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Mc,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
 {0,0,0,0,Po,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
@@ -8075,7 +8247,7 @@ static const struct unidata st166[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 0E00-0E0F */
-static const struct unidata st167[] = {
+static const struct unidata st170[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
@@ -8094,7 +8266,7 @@ static const struct unidata st167[] = {
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
 };
 /* 0E10-0E1F */
-static const struct unidata st168[] = {
+static const struct unidata st171[] = {
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
@@ -8113,11 +8285,11 @@ static const struct unidata st168[] = {
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
 };
 /* 0E30-0E3F */
-static const struct unidata st169[] = {
-{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+static const struct unidata st172[] = {
+{0,0,0,0,Lo,0,GBExtend,WBExtend,SBOLetter},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
-{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd454,0,0,0,Lo,CD,GBOther,WBOther,SBOLetter},
+{0,0,0,0,Lo,0,GBExtend,WBExtend,SBOLetter},
+{dd454,0,0,0,Lo,CD,GBExtend,WBExtend,SBOLetter},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
@@ -8132,13 +8304,13 @@ static const struct unidata st169[] = {
 {0,0,0,0,Sc,0,GBOther,WBOther,SBOther}
 };
 /* 0E40-0E4F */
-static const struct unidata st170[] = {
-{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+static const struct unidata st173[] = {
+{0,0,0,0,Lo,0,GBPrepend,WBOther,SBOLetter},
+{0,0,0,0,Lo,0,GBPrepend,WBOther,SBOLetter},
+{0,0,0,0,Lo,0,GBPrepend,WBOther,SBOLetter},
+{0,0,0,0,Lo,0,GBPrepend,WBOther,SBOLetter},
+{0,0,0,0,Lo,0,GBPrepend,WBOther,SBOLetter},
+{0,0,0,0,Lo,0,GBExtend,WBExtend,SBOLetter},
 {0,0,0,0,Lm,0,GBOther,WBOther,SBOLetter},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,107,Mn,0,GBExtend,WBExtend,SBExtend},
@@ -8151,7 +8323,7 @@ static const struct unidata st170[] = {
 {0,0,0,0,Po,0,GBOther,WBOther,SBOther}
 };
 /* 0E50-0E5F */
-static const struct unidata st171[] = {
+static const struct unidata st174[] = {
 {0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric},
 {0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric},
 {0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric},
@@ -8170,7 +8342,7 @@ static const struct unidata st171[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 0E80-0E8F */
-static const struct unidata st172[] = {
+static const struct unidata st175[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
@@ -8189,7 +8361,7 @@ static const struct unidata st172[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 0E90-0E9F */
-static const struct unidata st173[] = {
+static const struct unidata st176[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
@@ -8208,7 +8380,7 @@ static const struct unidata st173[] = {
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
 };
 /* 0EA0-0EAF */
-static const struct unidata st174[] = {
+static const struct unidata st177[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
@@ -8227,11 +8399,11 @@ static const struct unidata st174[] = {
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
 };
 /* 0EB0-0EBF */
-static const struct unidata st175[] = {
-{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+static const struct unidata st178[] = {
+{0,0,0,0,Lo,0,GBExtend,WBExtend,SBOLetter},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
-{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd455,0,0,0,Lo,CD,GBOther,WBOther,SBOLetter},
+{0,0,0,0,Lo,0,GBExtend,WBExtend,SBOLetter},
+{dd455,0,0,0,Lo,CD,GBExtend,WBExtend,SBOLetter},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
@@ -8246,12 +8418,12 @@ static const struct unidata st175[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 0EC0-0ECF */
-static const struct unidata st176[] = {
-{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+static const struct unidata st179[] = {
+{0,0,0,0,Lo,0,GBPrepend,WBOther,SBOLetter},
+{0,0,0,0,Lo,0,GBPrepend,WBOther,SBOLetter},
+{0,0,0,0,Lo,0,GBPrepend,WBOther,SBOLetter},
+{0,0,0,0,Lo,0,GBPrepend,WBOther,SBOLetter},
+{0,0,0,0,Lo,0,GBPrepend,WBOther,SBOLetter},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Lm,0,GBOther,WBOther,SBOLetter},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
@@ -8265,7 +8437,7 @@ static const struct unidata st176[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 0ED0-0EDF */
-static const struct unidata st177[] = {
+static const struct unidata st180[] = {
 {0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric},
 {0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric},
 {0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric},
@@ -8284,7 +8456,7 @@ static const struct unidata st177[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 0F00-0F0F */
-static const struct unidata st178[] = {
+static const struct unidata st181[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
@@ -8303,7 +8475,7 @@ static const struct unidata st178[] = {
 {0,0,0,0,Po,0,GBOther,WBOther,SBOther}
 };
 /* 0F10-0F1F */
-static const struct unidata st179[] = {
+static const struct unidata st182[] = {
 {0,0,0,0,Po,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Po,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Po,0,GBOther,WBOther,SBOther},
@@ -8322,7 +8494,7 @@ static const struct unidata st179[] = {
 {0,0,0,0,So,0,GBOther,WBOther,SBOther}
 };
 /* 0F20-0F2F */
-static const struct unidata st180[] = {
+static const struct unidata st183[] = {
 {0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric},
 {0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric},
 {0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric},
@@ -8341,7 +8513,7 @@ static const struct unidata st180[] = {
 {0,0,0,0,No,0,GBOther,WBOther,SBOther}
 };
 /* 0F30-0F3F */
-static const struct unidata st181[] = {
+static const struct unidata st184[] = {
 {0,0,0,0,No,0,GBOther,WBOther,SBOther},
 {0,0,0,0,No,0,GBOther,WBOther,SBOther},
 {0,0,0,0,No,0,GBOther,WBOther,SBOther},
@@ -8356,11 +8528,11 @@ static const struct unidata st181[] = {
 {0,0,0,0,Pe,0,GBOther,WBOther,SBClose},
 {0,0,0,0,Ps,0,GBOther,WBOther,SBClose},
 {0,0,0,0,Pe,0,GBOther,WBOther,SBClose},
-{0,0,0,0,Mc,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Mc,0,GBOther,WBOther,SBOther}
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend}
 };
 /* 0F40-0F4F */
-static const struct unidata st182[] = {
+static const struct unidata st185[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
@@ -8379,7 +8551,7 @@ static const struct unidata st182[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter}
 };
 /* 0F50-0F5F */
-static const struct unidata st183[] = {
+static const struct unidata st186[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {dd461,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
@@ -8398,7 +8570,7 @@ static const struct unidata st183[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter}
 };
 /* 0F60-0F6F */
-static const struct unidata st184[] = {
+static const struct unidata st187[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
@@ -8410,14 +8582,14 @@ static const struct unidata st184[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {dd464,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 0F70-0F7F */
-static const struct unidata st185[] = {
+static const struct unidata st188[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,129,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,130,Mn,0,GBExtend,WBExtend,SBExtend},
@@ -8433,10 +8605,10 @@ static const struct unidata st185[] = {
 {0,0,0,130,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,130,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
-{0,0,0,0,Mc,0,GBOther,WBALetter,SBOLetter}
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend}
 };
 /* 0F80-0F8F */
-static const struct unidata st186[] = {
+static const struct unidata st189[] = {
 {0,0,0,130,Mn,0,GBExtend,WBExtend,SBExtend},
 {dd471,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
@@ -8455,7 +8627,7 @@ static const struct unidata st186[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 0F90-0F9F */
-static const struct unidata st187[] = {
+static const struct unidata st190[] = {
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
@@ -8474,7 +8646,7 @@ static const struct unidata st187[] = {
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend}
 };
 /* 0FA0-0FAF */
-static const struct unidata st188[] = {
+static const struct unidata st191[] = {
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {dd474,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
@@ -8493,7 +8665,7 @@ static const struct unidata st188[] = {
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend}
 };
 /* 0FB0-0FBF */
-static const struct unidata st189[] = {
+static const struct unidata st192[] = {
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
@@ -8512,7 +8684,7 @@ static const struct unidata st189[] = {
 {0,0,0,0,So,0,GBOther,WBOther,SBOther}
 };
 /* 0FC0-0FCF */
-static const struct unidata st190[] = {
+static const struct unidata st193[] = {
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
@@ -8527,16 +8699,16 @@ static const struct unidata st190[] = {
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther}
 };
 /* 0FD0-0FDF */
-static const struct unidata st191[] = {
+static const struct unidata st194[] = {
+{0,0,0,0,Po,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Po,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Po,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Po,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Po,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
@@ -8550,45 +8722,45 @@ static const struct unidata st191[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 1020-102F */
-static const struct unidata st192[] = {
+static const struct unidata st195[] = {
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{0,0,dd3786,0,Lo,0,GBOther,WBOther,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{0,0,dd3787,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd478,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Mc,0,GBOther,WBOther,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend}
 };
 /* 1030-103F */
-static const struct unidata st193[] = {
+static const struct unidata st196[] = {
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
-{0,0,0,0,Mc,0,GBOther,WBOther,SBOLetter},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,7,Mn,0,GBExtend,WBExtend,SBExtend},
-{0,0,0,0,Mc,0,GBOther,WBOther,SBOLetter},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
 {0,0,0,9,Mn,0,GBExtend,WBExtend,SBExtend},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
+{0,0,0,9,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
 };
 /* 1040-104F */
-static const struct unidata st194[] = {
+static const struct unidata st197[] = {
 {0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric},
 {0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric},
 {0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric},
@@ -8607,45 +8779,105 @@ static const struct unidata st194[] = {
 {0,0,0,0,Po,0,GBOther,WBOther,SBOther}
 };
 /* 1050-105F */
-static const struct unidata st195[] = {
+static const struct unidata st198[] = {
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{0,0,0,0,Mc,0,GBOther,WBOther,SBOLetter},
-{0,0,0,0,Mc,0,GBOther,WBOther,SBOLetter},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend}
+};
+/* 1060-106F */
+static const struct unidata st199[] = {
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+};
+/* 1070-107F */
+static const struct unidata st200[] = {
+{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+};
+/* 1080-108F */
+static const struct unidata st201[] = {
+{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,220,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend}
+};
+/* 1090-109F */
+static const struct unidata st202[] = {
+{0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric},
+{0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric},
+{0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric},
+{0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric},
+{0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric},
+{0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric},
+{0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric},
+{0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric},
+{0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric},
+{0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther}
 };
 /* 10A0-10AF */
-static const struct unidata st196[] = {
-{0,dd4322,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4323,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4324,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4325,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4326,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4327,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4328,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4329,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4330,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4331,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4332,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4333,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4334,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+static const struct unidata st203[] = {
 {0,dd4335,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,dd4336,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4337,0,0,Lu,0,GBOther,WBALetter,SBUpper}
-};
-/* 10B0-10BF */
-static const struct unidata st197[] = {
+{0,dd4337,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,dd4338,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,dd4339,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,dd4340,0,0,Lu,0,GBOther,WBALetter,SBUpper},
@@ -8658,19 +8890,35 @@ static const struct unidata st197[] = {
 {0,dd4347,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,dd4348,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,dd4349,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4350,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4350,0,0,Lu,0,GBOther,WBALetter,SBUpper}
+};
+/* 10B0-10BF */
+static const struct unidata st204[] = {
 {0,dd4351,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,dd4352,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4353,0,0,Lu,0,GBOther,WBALetter,SBUpper}
-};
-/* 10C0-10CF */
-static const struct unidata st198[] = {
+{0,dd4353,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,dd4354,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,dd4355,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,dd4356,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,dd4357,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,dd4358,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,dd4359,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4360,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4361,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4362,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4363,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4364,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4365,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4366,0,0,Lu,0,GBOther,WBALetter,SBUpper}
+};
+/* 10C0-10CF */
+static const struct unidata st205[] = {
+{0,dd4367,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4368,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4369,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4370,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4371,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4372,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
@@ -8683,7 +8931,7 @@ static const struct unidata st198[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 10F0-10FF */
-static const struct unidata st199[] = {
+static const struct unidata st206[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
@@ -8702,7 +8950,7 @@ static const struct unidata st199[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 1100-110F */
-static const struct unidata st200[] = {
+static const struct unidata st207[] = {
 {0,0,0,0,Lo,0,GBL,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBL,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBL,WBALetter,SBOLetter},
@@ -8721,7 +8969,7 @@ static const struct unidata st200[] = {
 {0,0,0,0,Lo,0,GBL,WBALetter,SBOLetter}
 };
 /* 1150-115F */
-static const struct unidata st201[] = {
+static const struct unidata st208[] = {
 {0,0,0,0,Lo,0,GBL,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBL,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBL,WBALetter,SBOLetter},
@@ -8740,7 +8988,7 @@ static const struct unidata st201[] = {
 {0,0,0,0,Lo,0,GBL,WBALetter,SBOLetter}
 };
 /* 1160-116F */
-static const struct unidata st202[] = {
+static const struct unidata st209[] = {
 {0,0,0,0,Lo,0,GBV,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBV,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBV,WBALetter,SBOLetter},
@@ -8759,7 +9007,7 @@ static const struct unidata st202[] = {
 {0,0,0,0,Lo,0,GBV,WBALetter,SBOLetter}
 };
 /* 11A0-11AF */
-static const struct unidata st203[] = {
+static const struct unidata st210[] = {
 {0,0,0,0,Lo,0,GBV,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBV,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBV,WBALetter,SBOLetter},
@@ -8778,7 +9026,7 @@ static const struct unidata st203[] = {
 {0,0,0,0,Lo,0,GBT,WBALetter,SBOLetter}
 };
 /* 11B0-11BF */
-static const struct unidata st204[] = {
+static const struct unidata st211[] = {
 {0,0,0,0,Lo,0,GBT,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBT,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBT,WBALetter,SBOLetter},
@@ -8797,7 +9045,7 @@ static const struct unidata st204[] = {
 {0,0,0,0,Lo,0,GBT,WBALetter,SBOLetter}
 };
 /* 11F0-11FF */
-static const struct unidata st205[] = {
+static const struct unidata st212[] = {
 {0,0,0,0,Lo,0,GBT,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBT,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBT,WBALetter,SBOLetter},
@@ -8816,7 +9064,7 @@ static const struct unidata st205[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 1240-124F */
-static const struct unidata st206[] = {
+static const struct unidata st213[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
@@ -8835,7 +9083,7 @@ static const struct unidata st206[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 1250-125F */
-static const struct unidata st207[] = {
+static const struct unidata st214[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
@@ -8854,7 +9102,7 @@ static const struct unidata st207[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 12B0-12BF */
-static const struct unidata st208[] = {
+static const struct unidata st215[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
@@ -8873,7 +9121,7 @@ static const struct unidata st208[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 12C0-12CF */
-static const struct unidata st209[] = {
+static const struct unidata st216[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
@@ -8892,7 +9140,7 @@ static const struct unidata st209[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter}
 };
 /* 12D0-12DF */
-static const struct unidata st210[] = {
+static const struct unidata st217[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
@@ -8911,7 +9159,7 @@ static const struct unidata st210[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter}
 };
 /* 1350-135F */
-static const struct unidata st211[] = {
+static const struct unidata st218[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
@@ -8930,7 +9178,7 @@ static const struct unidata st211[] = {
 {0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend}
 };
 /* 1360-136F */
-static const struct unidata st212[] = {
+static const struct unidata st219[] = {
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Po,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Po,0,GBOther,WBOther,SBSTerm},
@@ -8949,7 +9197,7 @@ static const struct unidata st212[] = {
 {0,0,0,0,No,0,GBOther,WBOther,SBOther}
 };
 /* 1370-137F */
-static const struct unidata st213[] = {
+static const struct unidata st220[] = {
 {0,0,0,0,No,0,GBOther,WBOther,SBOther},
 {0,0,0,0,No,0,GBOther,WBOther,SBOther},
 {0,0,0,0,No,0,GBOther,WBOther,SBOther},
@@ -8968,7 +9216,7 @@ static const struct unidata st213[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 1390-139F */
-static const struct unidata st214[] = {
+static const struct unidata st221[] = {
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
@@ -8987,7 +9235,7 @@ static const struct unidata st214[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 13F0-13FF */
-static const struct unidata st215[] = {
+static const struct unidata st222[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
@@ -9006,7 +9254,7 @@ static const struct unidata st215[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 1400-140F */
-static const struct unidata st216[] = {
+static const struct unidata st223[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
@@ -9025,7 +9273,7 @@ static const struct unidata st216[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter}
 };
 /* 1660-166F */
-static const struct unidata st217[] = {
+static const struct unidata st224[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
@@ -9044,7 +9292,7 @@ static const struct unidata st217[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter}
 };
 /* 1670-167F */
-static const struct unidata st218[] = {
+static const struct unidata st225[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
@@ -9063,7 +9311,7 @@ static const struct unidata st218[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 1680-168F */
-static const struct unidata st219[] = {
+static const struct unidata st226[] = {
 {0,0,0,0,Zs,0,GBOther,WBOther,SBSp},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
@@ -9082,7 +9330,7 @@ static const struct unidata st219[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter}
 };
 /* 1690-169F */
-static const struct unidata st220[] = {
+static const struct unidata st227[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
@@ -9101,7 +9349,7 @@ static const struct unidata st220[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 16E0-16EF */
-static const struct unidata st221[] = {
+static const struct unidata st228[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
@@ -9120,7 +9368,7 @@ static const struct unidata st221[] = {
 {0,0,0,0,Nl,0,GBOther,WBALetter,SBOLetter}
 };
 /* 16F0-16FF */
-static const struct unidata st222[] = {
+static const struct unidata st229[] = {
 {0,0,0,0,Nl,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
@@ -9139,7 +9387,7 @@ static const struct unidata st222[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 1700-170F */
-static const struct unidata st223[] = {
+static const struct unidata st230[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
@@ -9158,7 +9406,7 @@ static const struct unidata st223[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter}
 };
 /* 1710-171F */
-static const struct unidata st224[] = {
+static const struct unidata st231[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
@@ -9177,7 +9425,7 @@ static const struct unidata st224[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 1730-173F */
-static const struct unidata st225[] = {
+static const struct unidata st232[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
@@ -9196,7 +9444,7 @@ static const struct unidata st225[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 1750-175F */
-static const struct unidata st226[] = {
+static const struct unidata st233[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
@@ -9215,7 +9463,7 @@ static const struct unidata st226[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 1770-177F */
-static const struct unidata st227[] = {
+static const struct unidata st234[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
@@ -9234,14 +9482,14 @@ static const struct unidata st227[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 17B0-17BF */
-static const struct unidata st228[] = {
+static const struct unidata st235[] = {
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {0,0,0,0,Cf,0,GBControl,WBFormat,SBFormat},
 {0,0,0,0,Cf,0,GBControl,WBFormat,SBFormat},
-{0,0,0,0,Mc,0,GBOther,WBOther,SBOLetter},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
@@ -9249,20 +9497,20 @@ static const struct unidata st228[] = {
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
-{0,0,0,0,Mc,0,GBOther,WBOther,SBOLetter},
-{0,0,0,0,Mc,0,GBOther,WBOther,SBOLetter}
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend}
 };
 /* 17C0-17CF */
-static const struct unidata st229[] = {
-{0,0,0,0,Mc,0,GBOther,WBOther,SBOLetter},
-{0,0,0,0,Mc,0,GBOther,WBOther,SBOLetter},
-{0,0,0,0,Mc,0,GBOther,WBOther,SBOLetter},
-{0,0,0,0,Mc,0,GBOther,WBOther,SBOLetter},
-{0,0,0,0,Mc,0,GBOther,WBOther,SBOLetter},
-{0,0,0,0,Mc,0,GBOther,WBOther,SBOLetter},
+static const struct unidata st236[] = {
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
-{0,0,0,0,Mc,0,GBOther,WBOther,SBOLetter},
-{0,0,0,0,Mc,0,GBOther,WBOther,SBOLetter},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
@@ -9272,7 +9520,7 @@ static const struct unidata st229[] = {
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend}
 };
 /* 17D0-17DF */
-static const struct unidata st230[] = {
+static const struct unidata st237[] = {
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,9,Mn,0,GBExtend,WBExtend,SBExtend},
@@ -9291,7 +9539,7 @@ static const struct unidata st230[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 17E0-17EF */
-static const struct unidata st231[] = {
+static const struct unidata st238[] = {
 {0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric},
 {0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric},
 {0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric},
@@ -9310,7 +9558,7 @@ static const struct unidata st231[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 17F0-17FF */
-static const struct unidata st232[] = {
+static const struct unidata st239[] = {
 {0,0,0,0,No,0,GBOther,WBOther,SBOther},
 {0,0,0,0,No,0,GBOther,WBOther,SBOther},
 {0,0,0,0,No,0,GBOther,WBOther,SBOther},
@@ -9329,16 +9577,16 @@ static const struct unidata st232[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 1800-180F */
-static const struct unidata st233[] = {
-{0,0,0,0,Po,0,GBOther,WBOther,SBOther},
+static const struct unidata st240[] = {
 {0,0,0,0,Po,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Po,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Po,0,GBOther,WBOther,SBSContinue},
 {0,0,0,0,Po,0,GBOther,WBOther,SBSTerm},
 {0,0,0,0,Po,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Po,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Pd,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Po,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Po,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Po,0,GBOther,WBOther,SBSContinue},
 {0,0,0,0,Po,0,GBOther,WBOther,SBSTerm},
 {0,0,0,0,Po,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
@@ -9348,7 +9596,7 @@ static const struct unidata st233[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 1840-184F */
-static const struct unidata st234[] = {
+static const struct unidata st241[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
@@ -9367,7 +9615,7 @@ static const struct unidata st234[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter}
 };
 /* 1870-187F */
-static const struct unidata st235[] = {
+static const struct unidata st242[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
@@ -9386,7 +9634,7 @@ static const struct unidata st235[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 18A0-18AF */
-static const struct unidata st236[] = {
+static const struct unidata st243[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
@@ -9397,7 +9645,7 @@ static const struct unidata st236[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,228,Mn,0,GBExtend,WBExtend,SBExtend},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
@@ -9405,7 +9653,7 @@ static const struct unidata st236[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 1910-191F */
-static const struct unidata st237[] = {
+static const struct unidata st244[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
@@ -9424,35 +9672,35 @@ static const struct unidata st237[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 1920-192F */
-static const struct unidata st238[] = {
+static const struct unidata st245[] = {
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
-{0,0,0,0,Mc,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Mc,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Mc,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Mc,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
-{0,0,0,0,Mc,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Mc,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Mc,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 1930-193F */
-static const struct unidata st239[] = {
-{0,0,0,0,Mc,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Mc,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
-{0,0,0,0,Mc,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Mc,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Mc,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Mc,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Mc,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Mc,0,GBOther,WBALetter,SBOLetter},
+static const struct unidata st246[] = {
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
 {0,0,0,222,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,220,Mn,0,GBExtend,WBExtend,SBExtend},
@@ -9462,7 +9710,7 @@ static const struct unidata st239[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 1940-194F */
-static const struct unidata st240[] = {
+static const struct unidata st247[] = {
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
@@ -9481,7 +9729,7 @@ static const struct unidata st240[] = {
 {0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric}
 };
 /* 1960-196F */
-static const struct unidata st241[] = {
+static const struct unidata st248[] = {
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
@@ -9500,7 +9748,7 @@ static const struct unidata st241[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 1970-197F */
-static const struct unidata st242[] = {
+static const struct unidata st249[] = {
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
@@ -9519,7 +9767,7 @@ static const struct unidata st242[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 19A0-19AF */
-static const struct unidata st243[] = {
+static const struct unidata st250[] = {
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
@@ -9538,27 +9786,27 @@ static const struct unidata st243[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 19B0-19BF */
-static const struct unidata st244[] = {
-{0,0,0,0,Mc,0,GBOther,WBOther,SBOLetter},
-{0,0,0,0,Mc,0,GBOther,WBOther,SBOLetter},
-{0,0,0,0,Mc,0,GBOther,WBOther,SBOLetter},
-{0,0,0,0,Mc,0,GBOther,WBOther,SBOLetter},
-{0,0,0,0,Mc,0,GBOther,WBOther,SBOLetter},
-{0,0,0,0,Mc,0,GBOther,WBOther,SBOLetter},
-{0,0,0,0,Mc,0,GBOther,WBOther,SBOLetter},
-{0,0,0,0,Mc,0,GBOther,WBOther,SBOLetter},
-{0,0,0,0,Mc,0,GBOther,WBOther,SBOLetter},
-{0,0,0,0,Mc,0,GBOther,WBOther,SBOLetter},
-{0,0,0,0,Mc,0,GBOther,WBOther,SBOLetter},
-{0,0,0,0,Mc,0,GBOther,WBOther,SBOLetter},
-{0,0,0,0,Mc,0,GBOther,WBOther,SBOLetter},
-{0,0,0,0,Mc,0,GBOther,WBOther,SBOLetter},
-{0,0,0,0,Mc,0,GBOther,WBOther,SBOLetter},
-{0,0,0,0,Mc,0,GBOther,WBOther,SBOLetter}
+static const struct unidata st251[] = {
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend}
 };
 /* 19C0-19CF */
-static const struct unidata st245[] = {
-{0,0,0,0,Mc,0,GBOther,WBOther,SBOLetter},
+static const struct unidata st252[] = {
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
@@ -9566,8 +9814,8 @@ static const struct unidata st245[] = {
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{0,0,0,0,Mc,0,GBOther,WBOther,SBOLetter},
-{0,0,0,0,Mc,0,GBOther,WBOther,SBOLetter},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
@@ -9576,7 +9824,7 @@ static const struct unidata st245[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 19D0-19DF */
-static const struct unidata st246[] = {
+static const struct unidata st253[] = {
 {0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric},
 {0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric},
 {0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric},
@@ -9595,7 +9843,7 @@ static const struct unidata st246[] = {
 {0,0,0,0,Po,0,GBOther,WBOther,SBOther}
 };
 /* 19E0-19EF */
-static const struct unidata st247[] = {
+static const struct unidata st254[] = {
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
@@ -9614,7 +9862,7 @@ static const struct unidata st247[] = {
 {0,0,0,0,So,0,GBOther,WBOther,SBOther}
 };
 /* 1A10-1A1F */
-static const struct unidata st248[] = {
+static const struct unidata st255[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
@@ -9624,37 +9872,37 @@ static const struct unidata st248[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,220,Mn,0,GBExtend,WBExtend,SBExtend},
-{0,0,0,0,Mc,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Mc,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Mc,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Po,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Po,0,GBOther,WBOther,SBOther}
 };
 /* 1B00-1B0F */
-static const struct unidata st249[] = {
+static const struct unidata st256[] = {
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
-{0,0,0,0,Mc,0,GBOther,WBALetter,SBOLetter},
-{0,0,dd3787,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{dd480,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
 {0,0,dd3788,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{dd481,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{dd480,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,dd3789,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{dd482,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{dd481,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,dd3790,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{dd483,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{dd482,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,dd3791,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{dd483,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,dd3792,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {dd484,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter}
 };
 /* 1B10-1B1F */
-static const struct unidata st250[] = {
+static const struct unidata st257[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,dd3792,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,dd3793,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {dd485,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
@@ -9671,31 +9919,31 @@ static const struct unidata st250[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter}
 };
 /* 1B30-1B3F */
-static const struct unidata st251[] = {
+static const struct unidata st258[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,7,Mn,0,GBExtend,WBExtend,SBExtend},
-{0,0,0,0,Mc,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
-{0,0,dd3793,0,Mn,0,GBExtend,WBExtend,SBExtend},
-{dd486,0,0,0,Mc,0,GBOther,WBALetter,SBOLetter},
 {0,0,dd3794,0,Mn,0,GBExtend,WBExtend,SBExtend},
-{dd487,0,0,0,Mc,0,GBOther,WBALetter,SBOLetter},
-{0,0,dd3795,0,Mc,0,GBOther,WBALetter,SBOLetter},
-{0,0,dd3796,0,Mc,0,GBOther,WBALetter,SBOLetter}
+{dd486,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,dd3795,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{dd487,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,dd3796,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,dd3797,0,Mc,0,GBSpacingMark,WBExtend,SBExtend}
 };
 /* 1B40-1B4F */
-static const struct unidata st252[] = {
-{dd488,0,0,0,Mc,0,GBOther,WBALetter,SBOLetter},
-{dd489,0,0,0,Mc,0,GBOther,WBALetter,SBOLetter},
-{0,0,dd3797,0,Mn,0,GBExtend,WBExtend,SBExtend},
-{dd490,0,0,0,Mc,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,9,Mc,0,GBOther,WBOther,SBOther},
+static const struct unidata st259[] = {
+{dd488,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{dd489,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,dd3798,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{dd490,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,9,Mc,0,GBSpacingMark,WBExtend,SBExtend},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
@@ -9709,7 +9957,7 @@ static const struct unidata st252[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 1B50-1B5F */
-static const struct unidata st253[] = {
+static const struct unidata st260[] = {
 {0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric},
 {0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric},
 {0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric},
@@ -9728,7 +9976,7 @@ static const struct unidata st253[] = {
 {0,0,0,0,Po,0,GBOther,WBOther,SBSTerm}
 };
 /* 1B60-1B6F */
-static const struct unidata st254[] = {
+static const struct unidata st261[] = {
 {0,0,0,0,Po,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
@@ -9747,7 +9995,7 @@ static const struct unidata st254[] = {
 {0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend}
 };
 /* 1B70-1B7F */
-static const struct unidata st255[] = {
+static const struct unidata st262[] = {
 {0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
@@ -9765,8 +10013,122 @@ static const struct unidata st255[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
+/* 1B80-1B8F */
+static const struct unidata st263[] = {
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter}
+};
+/* 1BA0-1BAF */
+static const struct unidata st264[] = {
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,9,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter}
+};
+/* 1C20-1C2F */
+static const struct unidata st265[] = {
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend}
+};
+/* 1C30-1C3F */
+static const struct unidata st266[] = {
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,7,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Po,0,GBOther,WBOther,SBSTerm},
+{0,0,0,0,Po,0,GBOther,WBOther,SBSTerm},
+{0,0,0,0,Po,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Po,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Po,0,GBOther,WBOther,SBOther}
+};
+/* 1C40-1C4F */
+static const struct unidata st267[] = {
+{0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric},
+{0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric},
+{0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric},
+{0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric},
+{0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric},
+{0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric},
+{0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric},
+{0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric},
+{0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric},
+{0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter}
+};
+/* 1C70-1C7F */
+static const struct unidata st268[] = {
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lm,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lm,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lm,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lm,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lm,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lm,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Po,0,GBOther,WBOther,SBSTerm},
+{0,0,0,0,Po,0,GBOther,WBOther,SBSTerm}
+};
 /* 1D20-1D2F */
-static const struct unidata st256[] = {
+static const struct unidata st269[] = {
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
@@ -9785,7 +10147,7 @@ static const struct unidata st256[] = {
 {0,0,0,0,Lm,0,GBOther,WBALetter,SBLower}
 };
 /* 1D30-1D3F */
-static const struct unidata st257[] = {
+static const struct unidata st270[] = {
 {dd494,0,0,0,Lm,CD,GBOther,WBALetter,SBLower},
 {dd495,0,0,0,Lm,CD,GBOther,WBALetter,SBLower},
 {dd496,0,0,0,Lm,CD,GBOther,WBALetter,SBLower},
@@ -9804,7 +10166,7 @@ static const struct unidata st257[] = {
 {dd508,0,0,0,Lm,CD,GBOther,WBALetter,SBLower}
 };
 /* 1D40-1D4F */
-static const struct unidata st258[] = {
+static const struct unidata st271[] = {
 {dd509,0,0,0,Lm,CD,GBOther,WBALetter,SBLower},
 {dd510,0,0,0,Lm,CD,GBOther,WBALetter,SBLower},
 {dd511,0,0,0,Lm,CD,GBOther,WBALetter,SBLower},
@@ -9823,7 +10185,7 @@ static const struct unidata st258[] = {
 {dd522,0,0,0,Lm,CD,GBOther,WBALetter,SBLower}
 };
 /* 1D50-1D5F */
-static const struct unidata st259[] = {
+static const struct unidata st272[] = {
 {dd523,0,0,0,Lm,CD,GBOther,WBALetter,SBLower},
 {dd524,0,0,0,Lm,CD,GBOther,WBALetter,SBLower},
 {dd10,0,0,0,Lm,CD,GBOther,WBALetter,SBLower},
@@ -9842,7 +10204,7 @@ static const struct unidata st259[] = {
 {dd536,0,0,0,Lm,CD,GBOther,WBALetter,SBLower}
 };
 /* 1D60-1D6F */
-static const struct unidata st260[] = {
+static const struct unidata st273[] = {
 {dd337,0,0,0,Lm,CD,GBOther,WBALetter,SBLower},
 {dd537,0,0,0,Lm,CD,GBOther,WBALetter,SBLower},
 {dd538,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
@@ -9861,7 +10223,7 @@ static const struct unidata st260[] = {
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower}
 };
 /* 1D70-1D7F */
-static const struct unidata st261[] = {
+static const struct unidata st274[] = {
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
@@ -9880,7 +10242,7 @@ static const struct unidata st261[] = {
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower}
 };
 /* 1D90-1D9F */
-static const struct unidata st262[] = {
+static const struct unidata st275[] = {
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
@@ -9899,7 +10261,7 @@ static const struct unidata st262[] = {
 {dd520,0,0,0,Lm,CD,GBOther,WBALetter,SBLower}
 };
 /* 1DA0-1DAF */
-static const struct unidata st263[] = {
+static const struct unidata st276[] = {
 {dd544,0,0,0,Lm,CD,GBOther,WBALetter,SBLower},
 {dd545,0,0,0,Lm,CD,GBOther,WBALetter,SBLower},
 {dd546,0,0,0,Lm,CD,GBOther,WBALetter,SBLower},
@@ -9918,7 +10280,7 @@ static const struct unidata st263[] = {
 {dd559,0,0,0,Lm,CD,GBOther,WBALetter,SBLower}
 };
 /* 1DB0-1DBF */
-static const struct unidata st264[] = {
+static const struct unidata st277[] = {
 {dd560,0,0,0,Lm,CD,GBOther,WBALetter,SBLower},
 {dd561,0,0,0,Lm,CD,GBOther,WBALetter,SBLower},
 {dd562,0,0,0,Lm,CD,GBOther,WBALetter,SBLower},
@@ -9937,7 +10299,7 @@ static const struct unidata st264[] = {
 {dd333,0,0,0,Lm,CD,GBOther,WBALetter,SBLower}
 };
 /* 1DC0-1DCF */
-static const struct unidata st265[] = {
+static const struct unidata st278[] = {
 {0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,220,Mn,0,GBExtend,WBExtend,SBExtend},
@@ -9949,6 +10311,44 @@ static const struct unidata st265[] = {
 {0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,220,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,234,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,214,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,220,Mn,0,GBExtend,WBExtend,SBExtend}
+};
+/* 1DD0-1DDF */
+static const struct unidata st279[] = {
+{0,0,0,202,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend}
+};
+/* 1DE0-1DEF */
+static const struct unidata st280[] = {
+{0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
@@ -9956,7 +10356,7 @@ static const struct unidata st265[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 1DF0-1DFF */
-static const struct unidata st266[] = {
+static const struct unidata st281[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
@@ -9975,449 +10375,449 @@ static const struct unidata st266[] = {
 {0,0,0,220,Mn,0,GBExtend,WBExtend,SBExtend}
 };
 /* 1E00-1E0F */
-static const struct unidata st267[] = {
-{dd575,dd4360,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+static const struct unidata st282[] = {
+{dd575,dd4373,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd576,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd577,dd4361,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd577,dd4374,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd578,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd579,dd4362,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd579,dd4375,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd580,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd581,dd4363,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd581,dd4376,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd582,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd583,dd3677,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd583,dd3678,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd584,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd585,dd4364,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd585,dd4377,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd586,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd587,dd4365,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd587,dd4378,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd588,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd589,dd4366,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd589,dd4379,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd590,0,0,0,Ll,0,GBOther,WBALetter,SBLower}
 };
 /* 1E10-1E1F */
-static const struct unidata st268[] = {
-{dd591,dd4367,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+static const struct unidata st283[] = {
+{dd591,dd4380,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd592,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd593,dd4368,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd593,dd4381,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd594,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd595,dd4369,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd595,dd4382,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd596,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd597,dd4370,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd597,dd4383,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd598,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd599,dd4371,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd599,dd4384,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd600,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd601,dd4372,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd601,dd4385,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd602,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd603,dd3710,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd603,dd3711,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd604,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd605,dd3640,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd605,dd3641,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd606,0,0,0,Ll,0,GBOther,WBALetter,SBLower}
 };
 /* 1E20-1E2F */
-static const struct unidata st269[] = {
-{dd607,dd4373,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+static const struct unidata st284[] = {
+{dd607,dd4386,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd608,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd609,dd4374,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd609,dd4387,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd610,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd611,dd4375,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd611,dd4388,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd612,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd613,dd4376,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd613,dd4389,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd614,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd615,dd4377,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd615,dd4390,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd616,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd617,dd4378,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd617,dd4391,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd618,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd619,dd4379,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd619,dd4392,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd620,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd621,dd3679,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd621,dd3680,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd622,0,0,0,Ll,0,GBOther,WBALetter,SBLower}
 };
 /* 1E30-1E3F */
-static const struct unidata st270[] = {
-{dd623,dd4380,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+static const struct unidata st285[] = {
+{dd623,dd4393,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd624,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd625,dd4381,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd625,dd4394,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd626,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd627,dd4382,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd627,dd4395,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd628,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd629,dd4383,dd3798,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd630,0,dd3799,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd631,dd3799,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd629,dd4396,dd3799,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd630,0,dd3800,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd631,dd3800,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd632,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd633,dd4384,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd633,dd4397,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd634,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd635,dd4385,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd635,dd4398,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd636,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd637,dd4386,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd637,dd4399,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd638,0,0,0,Ll,0,GBOther,WBALetter,SBLower}
 };
 /* 1E40-1E4F */
-static const struct unidata st271[] = {
-{dd639,dd4387,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+static const struct unidata st286[] = {
+{dd639,dd4400,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd640,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd641,dd4388,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd641,dd4401,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd642,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd643,dd4389,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd643,dd4402,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd644,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd645,dd4390,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd645,dd4403,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd646,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd647,dd4391,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd647,dd4404,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd648,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd649,dd4392,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd649,dd4405,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd650,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd651,dd4393,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd651,dd4406,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd652,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd653,dd4394,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd653,dd4407,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd654,0,0,0,Ll,0,GBOther,WBALetter,SBLower}
 };
 /* 1E50-1E5F */
-static const struct unidata st272[] = {
-{dd655,dd4395,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+static const struct unidata st287[] = {
+{dd655,dd4408,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd656,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd657,dd4396,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd657,dd4409,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd658,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd659,dd4397,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd659,dd4410,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd660,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd661,dd4398,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd661,dd4411,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd662,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd663,dd4399,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd663,dd4412,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd664,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd665,dd4400,dd3800,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd666,0,dd3801,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd667,dd3801,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd665,dd4413,dd3801,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd666,0,dd3802,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd667,dd3802,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd668,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd669,dd4401,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd669,dd4414,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd670,0,0,0,Ll,0,GBOther,WBALetter,SBLower}
 };
 /* 1E60-1E6F */
-static const struct unidata st273[] = {
-{dd671,dd4402,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+static const struct unidata st288[] = {
+{dd671,dd4415,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd672,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd673,dd4403,dd3802,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd674,0,dd3803,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd675,dd3692,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd673,dd4416,dd3803,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd674,0,dd3804,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd675,dd3693,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd676,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd677,dd3694,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd677,dd3695,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd678,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd679,dd3803,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd679,dd3804,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd680,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd681,dd4404,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd681,dd4417,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd682,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd683,dd4405,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd683,dd4418,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd684,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd685,dd4406,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd685,dd4419,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd686,0,0,0,Ll,0,GBOther,WBALetter,SBLower}
 };
 /* 1E70-1E7F */
-static const struct unidata st274[] = {
-{dd687,dd4407,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+static const struct unidata st289[] = {
+{dd687,dd4420,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd688,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd689,dd4408,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd689,dd4421,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd690,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd691,dd4409,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd691,dd4422,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd692,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd693,dd4410,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd693,dd4423,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd694,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd695,dd3696,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd695,dd3697,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd696,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd697,dd3698,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd697,dd3699,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd698,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd699,dd4411,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd699,dd4424,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd700,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd701,dd4412,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd701,dd4425,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd702,0,0,0,Ll,0,GBOther,WBALetter,SBLower}
 };
 /* 1E80-1E8F */
-static const struct unidata st275[] = {
-{dd703,dd4413,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+static const struct unidata st290[] = {
+{dd703,dd4426,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd704,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd705,dd4414,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd705,dd4427,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd706,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd707,dd4415,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd707,dd4428,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd708,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd709,dd4416,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd709,dd4429,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd710,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd711,dd4417,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd711,dd4430,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd712,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd713,dd4418,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd713,dd4431,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd714,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd715,dd4419,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd715,dd4432,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd716,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd717,dd4420,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd717,dd4433,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd718,0,0,0,Ll,0,GBOther,WBALetter,SBLower}
 };
 /* 1E90-1E9F */
-static const struct unidata st276[] = {
-{dd719,dd4421,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+static const struct unidata st291[] = {
+{dd719,dd4434,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd720,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd721,dd4422,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd721,dd4435,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd722,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd723,dd4423,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd723,dd4436,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd724,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {dd725,dd725,0,0,Ll,NBC,GBOther,WBALetter,SBLower},
 {dd726,dd726,0,0,Ll,NBC,GBOther,WBALetter,SBLower},
 {dd727,dd727,0,0,Ll,NBC,GBOther,WBALetter,SBLower},
 {dd728,dd728,0,0,Ll,NBC,GBOther,WBALetter,SBLower},
 {dd729,dd729,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd730,dd4402,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
+{dd730,dd4415,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,dd4000,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower}
 };
 /* 1EA0-1EAF */
-static const struct unidata st277[] = {
-{dd731,dd4424,dd3804,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd732,0,dd3805,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd733,dd4425,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+static const struct unidata st292[] = {
+{dd731,dd4437,dd3805,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd732,0,dd3806,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd733,dd4438,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd734,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd735,dd4426,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd735,dd4439,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd736,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd737,dd4427,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd737,dd4440,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd738,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd739,dd4428,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd739,dd4441,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd740,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd741,dd4429,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd741,dd4442,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd742,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd743,dd4430,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd743,dd4443,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd744,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd745,dd4431,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd745,dd4444,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd746,0,0,0,Ll,0,GBOther,WBALetter,SBLower}
 };
 /* 1EB0-1EBF */
-static const struct unidata st278[] = {
-{dd747,dd4432,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+static const struct unidata st293[] = {
+{dd747,dd4445,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd748,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd749,dd4433,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd749,dd4446,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd750,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd751,dd4434,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd751,dd4447,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd752,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd753,dd4435,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd753,dd4448,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd754,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd755,dd4436,dd3806,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd756,0,dd3807,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd757,dd4437,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd755,dd4449,dd3807,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd756,0,dd3808,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd757,dd4450,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd758,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd759,dd4438,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd759,dd4451,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd760,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd761,dd4439,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd761,dd4452,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd762,0,0,0,Ll,0,GBOther,WBALetter,SBLower}
 };
 /* 1EC0-1ECF */
-static const struct unidata st279[] = {
-{dd763,dd4440,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+static const struct unidata st294[] = {
+{dd763,dd4453,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd764,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd765,dd4441,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd765,dd4454,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd766,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd767,dd4442,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd767,dd4455,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd768,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd769,dd3807,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd769,dd3808,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd770,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd771,dd4443,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd771,dd4456,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd772,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd773,dd4444,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd773,dd4457,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd774,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd775,dd4445,dd3808,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd776,0,dd3809,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd777,dd4446,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd775,dd4458,dd3809,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd776,0,dd3810,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd777,dd4459,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd778,0,0,0,Ll,0,GBOther,WBALetter,SBLower}
 };
 /* 1ED0-1EDF */
-static const struct unidata st280[] = {
-{dd779,dd4447,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+static const struct unidata st295[] = {
+{dd779,dd4460,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd780,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd781,dd4448,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd781,dd4461,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd782,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd783,dd4449,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd783,dd4462,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd784,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd785,dd4450,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd785,dd4463,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd786,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd787,dd3809,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd787,dd3810,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd788,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd789,dd4451,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd789,dd4464,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd790,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd791,dd4452,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd791,dd4465,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd792,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd793,dd4453,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd793,dd4466,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd794,0,0,0,Ll,0,GBOther,WBALetter,SBLower}
 };
 /* 1EE0-1EEF */
-static const struct unidata st281[] = {
-{dd795,dd4454,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+static const struct unidata st296[] = {
+{dd795,dd4467,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd796,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd797,dd4455,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd797,dd4468,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd798,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd799,dd4456,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd799,dd4469,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd800,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd801,dd4457,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd801,dd4470,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd802,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd803,dd4458,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd803,dd4471,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd804,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd805,dd4459,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd805,dd4472,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd806,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd807,dd4460,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd807,dd4473,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd808,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd809,dd4461,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd809,dd4474,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd810,0,0,0,Ll,0,GBOther,WBALetter,SBLower}
 };
 /* 1EF0-1EFF */
-static const struct unidata st282[] = {
-{dd811,dd4462,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+static const struct unidata st297[] = {
+{dd811,dd4475,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd812,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd813,dd4463,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd813,dd4476,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd814,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd815,dd4464,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd815,dd4477,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd816,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd817,dd4465,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd817,dd4478,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd818,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd819,dd4466,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd819,dd4479,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd820,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
+{0,dd4480,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,dd4481,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,dd4482,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower}
 };
 /* 1F00-1F0F */
-static const struct unidata st283[] = {
-{dd821,0,dd3810,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd822,0,dd3811,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd823,0,dd3812,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd824,0,dd3813,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd825,0,dd3814,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd826,0,dd3815,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd827,0,dd3816,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd828,0,dd3817,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd829,dd4467,dd3818,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd830,dd4468,dd3819,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd831,dd4469,dd3820,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd832,dd4470,dd3821,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd833,dd4471,dd3822,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd834,dd4472,dd3823,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd835,dd4473,dd3824,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd836,dd4474,dd3825,0,Lu,0,GBOther,WBALetter,SBUpper}
+static const struct unidata st298[] = {
+{dd821,0,dd3811,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd822,0,dd3812,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd823,0,dd3813,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd824,0,dd3814,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd825,0,dd3815,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd826,0,dd3816,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd827,0,dd3817,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd828,0,dd3818,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd829,dd4483,dd3819,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd830,dd4484,dd3820,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd831,dd4485,dd3821,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd832,dd4486,dd3822,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd833,dd4487,dd3823,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd834,dd4488,dd3824,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd835,dd4489,dd3825,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd836,dd4490,dd3826,0,Lu,0,GBOther,WBALetter,SBUpper}
 };
 /* 1F10-1F1F */
-static const struct unidata st284[] = {
-{dd837,0,dd3826,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd838,0,dd3827,0,Ll,0,GBOther,WBALetter,SBLower},
+static const struct unidata st299[] = {
+{dd837,0,dd3827,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd838,0,dd3828,0,Ll,0,GBOther,WBALetter,SBLower},
 {dd839,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {dd840,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {dd841,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {dd842,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{dd843,dd4475,dd3828,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd844,dd4476,dd3829,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd845,dd4477,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd846,dd4478,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd847,dd4479,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd848,dd4480,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd843,dd4491,dd3829,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd844,dd4492,dd3830,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd845,dd4493,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd846,dd4494,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd847,dd4495,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd848,dd4496,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 1F20-1F2F */
-static const struct unidata st285[] = {
-{dd849,0,dd3830,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd850,0,dd3831,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd851,0,dd3832,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd852,0,dd3833,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd853,0,dd3834,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd854,0,dd3835,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd855,0,dd3836,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd856,0,dd3837,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd857,dd4481,dd3838,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd858,dd4482,dd3839,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd859,dd4483,dd3840,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd860,dd4484,dd3841,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd861,dd4485,dd3842,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd862,dd4486,dd3843,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd863,dd4487,dd3844,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd864,dd4488,dd3845,0,Lu,0,GBOther,WBALetter,SBUpper}
+static const struct unidata st300[] = {
+{dd849,0,dd3831,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd850,0,dd3832,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd851,0,dd3833,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd852,0,dd3834,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd853,0,dd3835,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd854,0,dd3836,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd855,0,dd3837,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd856,0,dd3838,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd857,dd4497,dd3839,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd858,dd4498,dd3840,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd859,dd4499,dd3841,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd860,dd4500,dd3842,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd861,dd4501,dd3843,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd862,dd4502,dd3844,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd863,dd4503,dd3845,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd864,dd4504,dd3846,0,Lu,0,GBOther,WBALetter,SBUpper}
 };
 /* 1F30-1F3F */
-static const struct unidata st286[] = {
-{dd865,0,dd3846,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd866,0,dd3847,0,Ll,0,GBOther,WBALetter,SBLower},
+static const struct unidata st301[] = {
+{dd865,0,dd3847,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd866,0,dd3848,0,Ll,0,GBOther,WBALetter,SBLower},
 {dd867,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {dd868,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {dd869,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {dd870,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {dd871,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {dd872,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd873,dd4489,dd3848,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd874,dd4490,dd3849,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd875,dd4491,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd876,dd4492,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd877,dd4493,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd878,dd4494,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd879,dd4495,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd880,dd4496,0,0,Lu,0,GBOther,WBALetter,SBUpper}
+{dd873,dd4505,dd3849,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd874,dd4506,dd3850,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd875,dd4507,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd876,dd4508,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd877,dd4509,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd878,dd4510,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd879,dd4511,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd880,dd4512,0,0,Lu,0,GBOther,WBALetter,SBUpper}
 };
 /* 1F40-1F4F */
-static const struct unidata st287[] = {
-{dd881,0,dd3850,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd882,0,dd3851,0,Ll,0,GBOther,WBALetter,SBLower},
+static const struct unidata st302[] = {
+{dd881,0,dd3851,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd882,0,dd3852,0,Ll,0,GBOther,WBALetter,SBLower},
 {dd883,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {dd884,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {dd885,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {dd886,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{dd887,dd4497,dd3852,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd888,dd4498,dd3853,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd889,dd4499,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd890,dd4500,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd891,dd4501,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd892,dd4502,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd887,dd4513,dd3853,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd888,dd4514,dd3854,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd889,dd4515,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd890,dd4516,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd891,dd4517,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd892,dd4518,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 1F50-1F5F */
-static const struct unidata st288[] = {
-{dd893,dd893,dd3854,0,Ll,NBC,GBOther,WBALetter,SBLower},
-{dd894,0,dd3855,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd895,dd4503,0,0,Ll,NBC,GBOther,WBALetter,SBLower},
+static const struct unidata st303[] = {
+{dd893,dd893,dd3855,0,Ll,NBC,GBOther,WBALetter,SBLower},
+{dd894,0,dd3856,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd895,dd4519,0,0,Ll,NBC,GBOther,WBALetter,SBLower},
 {dd896,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd897,dd4504,0,0,Ll,NBC,GBOther,WBALetter,SBLower},
+{dd897,dd4520,0,0,Ll,NBC,GBOther,WBALetter,SBLower},
 {dd898,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd899,dd4505,0,0,Ll,NBC,GBOther,WBALetter,SBLower},
+{dd899,dd4521,0,0,Ll,NBC,GBOther,WBALetter,SBLower},
 {dd900,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{dd901,dd4506,dd3856,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd901,dd4522,dd3857,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{dd902,dd4507,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd902,dd4523,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{dd903,dd4508,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd903,dd4524,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{dd904,dd4509,0,0,Lu,0,GBOther,WBALetter,SBUpper}
+{dd904,dd4525,0,0,Lu,0,GBOther,WBALetter,SBUpper}
 };
 /* 1F60-1F6F */
-static const struct unidata st289[] = {
-{dd905,0,dd3857,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd906,0,dd3858,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd907,0,dd3859,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd908,0,dd3860,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd909,0,dd3861,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd910,0,dd3862,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd911,0,dd3863,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd912,0,dd3864,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd913,dd4510,dd3865,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd914,dd4511,dd3866,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd915,dd4512,dd3867,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd916,dd4513,dd3868,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd917,dd4514,dd3869,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd918,dd4515,dd3870,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd919,dd4516,dd3871,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd920,dd4517,dd3872,0,Lu,0,GBOther,WBALetter,SBUpper}
+static const struct unidata st304[] = {
+{dd905,0,dd3858,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd906,0,dd3859,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd907,0,dd3860,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd908,0,dd3861,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd909,0,dd3862,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd910,0,dd3863,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd911,0,dd3864,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd912,0,dd3865,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd913,dd4526,dd3866,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd914,dd4527,dd3867,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd915,dd4528,dd3868,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd916,dd4529,dd3869,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd917,dd4530,dd3870,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd918,dd4531,dd3871,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd919,dd4532,dd3872,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd920,dd4533,dd3873,0,Lu,0,GBOther,WBALetter,SBUpper}
 };
 /* 1F70-1F7F */
-static const struct unidata st290[] = {
-{dd921,0,dd3873,0,Ll,0,GBOther,WBALetter,SBLower},
+static const struct unidata st305[] = {
+{dd921,0,dd3874,0,Ll,0,GBOther,WBALetter,SBLower},
 {dd922,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {dd923,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {dd924,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd925,0,dd3874,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd925,0,dd3875,0,Ll,0,GBOther,WBALetter,SBLower},
 {dd926,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {dd927,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {dd928,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
@@ -10425,165 +10825,165 @@ static const struct unidata st290[] = {
 {dd930,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {dd931,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {dd932,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd933,0,dd3875,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd933,0,dd3876,0,Ll,0,GBOther,WBALetter,SBLower},
 {dd934,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 1F80-1F8F */
-static const struct unidata st291[] = {
-{dd935,dd4518,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd936,dd4519,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd937,dd4520,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd938,dd4521,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd939,dd4522,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd940,dd4523,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd941,dd4524,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd942,dd4525,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd943,dd4518,0,0,Lt,0,GBOther,WBALetter,SBUpper},
-{dd944,dd4519,0,0,Lt,0,GBOther,WBALetter,SBUpper},
-{dd945,dd4520,0,0,Lt,0,GBOther,WBALetter,SBUpper},
-{dd946,dd4521,0,0,Lt,0,GBOther,WBALetter,SBUpper},
-{dd947,dd4522,0,0,Lt,0,GBOther,WBALetter,SBUpper},
-{dd948,dd4523,0,0,Lt,0,GBOther,WBALetter,SBUpper},
-{dd949,dd4524,0,0,Lt,0,GBOther,WBALetter,SBUpper},
-{dd950,dd4525,0,0,Lt,0,GBOther,WBALetter,SBUpper}
+static const struct unidata st306[] = {
+{dd935,dd4534,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd936,dd4535,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd937,dd4536,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd938,dd4537,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd939,dd4538,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd940,dd4539,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd941,dd4540,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd942,dd4541,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd943,dd4534,0,0,Lt,0,GBOther,WBALetter,SBUpper},
+{dd944,dd4535,0,0,Lt,0,GBOther,WBALetter,SBUpper},
+{dd945,dd4536,0,0,Lt,0,GBOther,WBALetter,SBUpper},
+{dd946,dd4537,0,0,Lt,0,GBOther,WBALetter,SBUpper},
+{dd947,dd4538,0,0,Lt,0,GBOther,WBALetter,SBUpper},
+{dd948,dd4539,0,0,Lt,0,GBOther,WBALetter,SBUpper},
+{dd949,dd4540,0,0,Lt,0,GBOther,WBALetter,SBUpper},
+{dd950,dd4541,0,0,Lt,0,GBOther,WBALetter,SBUpper}
 };
 /* 1F90-1F9F */
-static const struct unidata st292[] = {
-{dd951,dd4526,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd952,dd4527,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd953,dd4528,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd954,dd4529,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd955,dd4530,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd956,dd4531,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd957,dd4532,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd958,dd4533,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd959,dd4526,0,0,Lt,0,GBOther,WBALetter,SBUpper},
-{dd960,dd4527,0,0,Lt,0,GBOther,WBALetter,SBUpper},
-{dd961,dd4528,0,0,Lt,0,GBOther,WBALetter,SBUpper},
-{dd962,dd4529,0,0,Lt,0,GBOther,WBALetter,SBUpper},
-{dd963,dd4530,0,0,Lt,0,GBOther,WBALetter,SBUpper},
-{dd964,dd4531,0,0,Lt,0,GBOther,WBALetter,SBUpper},
-{dd965,dd4532,0,0,Lt,0,GBOther,WBALetter,SBUpper},
-{dd966,dd4533,0,0,Lt,0,GBOther,WBALetter,SBUpper}
+static const struct unidata st307[] = {
+{dd951,dd4542,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd952,dd4543,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd953,dd4544,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd954,dd4545,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd955,dd4546,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd956,dd4547,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd957,dd4548,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd958,dd4549,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd959,dd4542,0,0,Lt,0,GBOther,WBALetter,SBUpper},
+{dd960,dd4543,0,0,Lt,0,GBOther,WBALetter,SBUpper},
+{dd961,dd4544,0,0,Lt,0,GBOther,WBALetter,SBUpper},
+{dd962,dd4545,0,0,Lt,0,GBOther,WBALetter,SBUpper},
+{dd963,dd4546,0,0,Lt,0,GBOther,WBALetter,SBUpper},
+{dd964,dd4547,0,0,Lt,0,GBOther,WBALetter,SBUpper},
+{dd965,dd4548,0,0,Lt,0,GBOther,WBALetter,SBUpper},
+{dd966,dd4549,0,0,Lt,0,GBOther,WBALetter,SBUpper}
 };
 /* 1FA0-1FAF */
-static const struct unidata st293[] = {
-{dd967,dd4534,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd968,dd4535,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd969,dd4536,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd970,dd4537,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd971,dd4538,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd972,dd4539,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd973,dd4540,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd974,dd4541,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd975,dd4534,0,0,Lt,0,GBOther,WBALetter,SBUpper},
-{dd976,dd4535,0,0,Lt,0,GBOther,WBALetter,SBUpper},
-{dd977,dd4536,0,0,Lt,0,GBOther,WBALetter,SBUpper},
-{dd978,dd4537,0,0,Lt,0,GBOther,WBALetter,SBUpper},
-{dd979,dd4538,0,0,Lt,0,GBOther,WBALetter,SBUpper},
-{dd980,dd4539,0,0,Lt,0,GBOther,WBALetter,SBUpper},
-{dd981,dd4540,0,0,Lt,0,GBOther,WBALetter,SBUpper},
-{dd982,dd4541,0,0,Lt,0,GBOther,WBALetter,SBUpper}
+static const struct unidata st308[] = {
+{dd967,dd4550,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd968,dd4551,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd969,dd4552,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd970,dd4553,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd971,dd4554,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd972,dd4555,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd973,dd4556,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd974,dd4557,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd975,dd4550,0,0,Lt,0,GBOther,WBALetter,SBUpper},
+{dd976,dd4551,0,0,Lt,0,GBOther,WBALetter,SBUpper},
+{dd977,dd4552,0,0,Lt,0,GBOther,WBALetter,SBUpper},
+{dd978,dd4553,0,0,Lt,0,GBOther,WBALetter,SBUpper},
+{dd979,dd4554,0,0,Lt,0,GBOther,WBALetter,SBUpper},
+{dd980,dd4555,0,0,Lt,0,GBOther,WBALetter,SBUpper},
+{dd981,dd4556,0,0,Lt,0,GBOther,WBALetter,SBUpper},
+{dd982,dd4557,0,0,Lt,0,GBOther,WBALetter,SBUpper}
 };
 /* 1FB0-1FBF */
-static const struct unidata st294[] = {
+static const struct unidata st309[] = {
 {dd983,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {dd984,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd985,dd4542,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd986,dd4543,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd987,dd4544,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{dd988,dd988,dd3876,0,Ll,NBC,GBOther,WBALetter,SBLower},
-{dd989,dd4545,0,0,Ll,NBC,GBOther,WBALetter,SBLower},
-{dd990,dd4546,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd991,dd4547,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd992,dd4548,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd993,dd4549,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd994,dd4543,0,0,Lt,0,GBOther,WBALetter,SBUpper},
+{dd985,dd4558,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd986,dd4559,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd987,dd4560,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{dd988,dd988,dd3877,0,Ll,NBC,GBOther,WBALetter,SBLower},
+{dd989,dd4561,0,0,Ll,NBC,GBOther,WBALetter,SBLower},
+{dd990,dd4562,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd991,dd4563,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd992,dd4564,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd993,dd4565,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd994,dd4559,0,0,Lt,0,GBOther,WBALetter,SBUpper},
 {dd995,0,0,0,Sk,CD,GBOther,WBOther,SBOther},
 {dd996,dd996,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd995,0,dd3877,0,Sk,CD,GBOther,WBOther,SBOther}
+{dd995,0,dd3878,0,Sk,CD,GBOther,WBOther,SBOther}
 };
 /* 1FC0-1FCF */
-static const struct unidata st295[] = {
+static const struct unidata st310[] = {
 {dd997,0,0,0,Sk,CD,GBOther,WBOther,SBOther},
 {dd998,0,0,0,Sk,0,GBOther,WBOther,SBOther},
-{dd999,dd4550,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd1000,dd4551,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd1001,dd4552,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{dd1002,dd1002,dd3878,0,Ll,NBC,GBOther,WBALetter,SBLower},
-{dd1003,dd4553,0,0,Ll,NBC,GBOther,WBALetter,SBLower},
-{dd1004,dd4554,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd1005,dd4555,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd1006,dd4556,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd1007,dd4557,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd1008,dd4551,0,0,Lt,0,GBOther,WBALetter,SBUpper},
+{dd999,dd4566,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd1000,dd4567,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd1001,dd4568,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{dd1002,dd1002,dd3879,0,Ll,NBC,GBOther,WBALetter,SBLower},
+{dd1003,dd4569,0,0,Ll,NBC,GBOther,WBALetter,SBLower},
+{dd1004,dd4570,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd1005,dd4571,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd1006,dd4572,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd1007,dd4573,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd1008,dd4567,0,0,Lt,0,GBOther,WBALetter,SBUpper},
 {dd1009,0,0,0,Sk,0,GBOther,WBOther,SBOther},
 {dd1010,0,0,0,Sk,0,GBOther,WBOther,SBOther},
 {dd1011,0,0,0,Sk,0,GBOther,WBOther,SBOther}
 };
 /* 1FD0-1FDF */
-static const struct unidata st296[] = {
+static const struct unidata st311[] = {
 {dd1012,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {dd1013,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd1014,dd4558,0,0,Ll,NBC,GBOther,WBALetter,SBLower},
-{dd1015,dd4141,0,0,Ll,NBC,GBOther,WBALetter,SBLower},
+{dd1014,dd4574,0,0,Ll,NBC,GBOther,WBALetter,SBLower},
+{dd1015,dd4145,0,0,Ll,NBC,GBOther,WBALetter,SBLower},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {dd1016,dd1016,0,0,Ll,NBC,GBOther,WBALetter,SBLower},
-{dd1017,dd4559,0,0,Ll,NBC,GBOther,WBALetter,SBLower},
-{dd1018,dd4560,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd1019,dd4561,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd1020,dd4562,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd1021,dd4563,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd1017,dd4575,0,0,Ll,NBC,GBOther,WBALetter,SBLower},
+{dd1018,dd4576,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd1019,dd4577,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd1020,dd4578,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd1021,dd4579,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {dd1022,0,0,0,Sk,0,GBOther,WBOther,SBOther},
 {dd1023,0,0,0,Sk,0,GBOther,WBOther,SBOther},
 {dd1024,0,0,0,Sk,0,GBOther,WBOther,SBOther}
 };
 /* 1FE0-1FEF */
-static const struct unidata st297[] = {
+static const struct unidata st312[] = {
 {dd1025,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {dd1026,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd1027,dd4564,0,0,Ll,NBC,GBOther,WBALetter,SBLower},
-{dd1028,dd4144,0,0,Ll,NBC,GBOther,WBALetter,SBLower},
+{dd1027,dd4580,0,0,Ll,NBC,GBOther,WBALetter,SBLower},
+{dd1028,dd4148,0,0,Ll,NBC,GBOther,WBALetter,SBLower},
 {dd1029,dd1029,0,0,Ll,NBC,GBOther,WBALetter,SBLower},
 {dd1030,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {dd1031,dd1031,0,0,Ll,NBC,GBOther,WBALetter,SBLower},
-{dd1032,dd4565,0,0,Ll,NBC,GBOther,WBALetter,SBLower},
-{dd1033,dd4566,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd1034,dd4567,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd1035,dd4568,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd1036,dd4569,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd1037,dd4570,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd1032,dd4581,0,0,Ll,NBC,GBOther,WBALetter,SBLower},
+{dd1033,dd4582,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd1034,dd4583,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd1035,dd4584,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd1036,dd4585,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd1037,dd4586,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd1038,0,0,0,Sk,0,GBOther,WBOther,SBOther},
 {dd1039,0,0,0,Sk,0,GBOther,WBOther,SBOther},
 {dd1040,0,0,0,Sk,0,GBOther,WBOther,SBOther}
 };
 /* 1FF0-1FFF */
-static const struct unidata st298[] = {
+static const struct unidata st313[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{dd1041,dd4571,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd1042,dd4572,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{dd1043,dd4573,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd1041,dd4587,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd1042,dd4588,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{dd1043,dd4589,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{dd1044,dd1044,dd3879,0,Ll,NBC,GBOther,WBALetter,SBLower},
-{dd1045,dd4574,0,0,Ll,NBC,GBOther,WBALetter,SBLower},
-{dd1046,dd4575,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd1047,dd4576,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd1048,dd4577,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd1049,dd4578,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd1050,dd4572,0,0,Lt,0,GBOther,WBALetter,SBUpper},
+{dd1044,dd1044,dd3880,0,Ll,NBC,GBOther,WBALetter,SBLower},
+{dd1045,dd4590,0,0,Ll,NBC,GBOther,WBALetter,SBLower},
+{dd1046,dd4591,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd1047,dd4592,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd1048,dd4593,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd1049,dd4594,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd1050,dd4588,0,0,Lt,0,GBOther,WBALetter,SBUpper},
 {dd1051,0,0,0,Sk,0,GBOther,WBOther,SBOther},
-{dd1052,0,dd3880,0,Sk,CD,GBOther,WBOther,SBOther},
+{dd1052,0,dd3881,0,Sk,CD,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 2000-200F */
-static const struct unidata st299[] = {
+static const struct unidata st314[] = {
 {dd1053,0,0,0,Zs,0,GBOther,WBOther,SBSp},
 {dd1054,0,0,0,Zs,0,GBOther,WBOther,SBSp},
 {dd0,0,0,0,Zs,CD,GBOther,WBOther,SBSp},
@@ -10602,17 +11002,17 @@ static const struct unidata st299[] = {
 {0,0,0,0,Cf,0,GBControl,WBFormat,SBFormat}
 };
 /* 2010-201F */
-static const struct unidata st300[] = {
+static const struct unidata st315[] = {
 {0,0,0,0,Pd,0,GBOther,WBOther,SBOther},
 {dd1055,0,0,0,Pd,CD,GBOther,WBOther,SBOther},
 {0,0,0,0,Pd,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Pd,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Pd,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Pd,0,GBOther,WBOther,SBSContinue},
+{0,0,0,0,Pd,0,GBOther,WBOther,SBSContinue},
 {0,0,0,0,Pd,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Po,0,GBOther,WBOther,SBOther},
 {dd1056,0,0,0,Po,CD,GBOther,WBOther,SBOther},
-{0,0,0,0,Pi,0,GBOther,WBOther,SBClose},
-{0,0,0,0,Pf,0,GBOther,WBMidLetter,SBClose},
+{0,0,0,0,Pi,0,GBOther,WBMidNumLet,SBClose},
+{0,0,0,0,Pf,0,GBOther,WBMidNumLet,SBClose},
 {0,0,0,0,Ps,0,GBOther,WBOther,SBClose},
 {0,0,0,0,Pi,0,GBOther,WBOther,SBClose},
 {0,0,0,0,Pi,0,GBOther,WBOther,SBClose},
@@ -10621,17 +11021,17 @@ static const struct unidata st300[] = {
 {0,0,0,0,Pi,0,GBOther,WBOther,SBClose}
 };
 /* 2020-202F */
-static const struct unidata st301[] = {
+static const struct unidata st316[] = {
 {0,0,0,0,Po,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Po,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Po,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Po,0,GBOther,WBOther,SBOther},
-{dd1057,0,0,0,Po,CD,GBOther,WBOther,SBOther},
+{dd1057,0,0,0,Po,CD,GBOther,WBMidNumLet,SBATerm},
 {dd1058,0,0,0,Po,CD,GBOther,WBOther,SBOther},
 {dd1059,0,0,0,Po,CD,GBOther,WBOther,SBOther},
 {0,0,0,0,Po,0,GBOther,WBMidLetter,SBOther},
-{0,0,0,0,Zl,0,GBControl,WBOther,SBSep},
-{0,0,0,0,Zp,0,GBControl,WBOther,SBSep},
+{0,0,0,0,Zl,0,GBControl,WBNewline,SBSep},
+{0,0,0,0,Zp,0,GBControl,WBNewline,SBSep},
 {0,0,0,0,Cf,0,GBControl,WBFormat,SBFormat},
 {0,0,0,0,Cf,0,GBControl,WBFormat,SBFormat},
 {0,0,0,0,Cf,0,GBControl,WBFormat,SBFormat},
@@ -10640,7 +11040,7 @@ static const struct unidata st301[] = {
 {dd0,0,0,0,Zs,CD,GBOther,WBOther,SBSp}
 };
 /* 2030-203F */
-static const struct unidata st302[] = {
+static const struct unidata st317[] = {
 {0,0,0,0,Po,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Po,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Po,0,GBOther,WBOther,SBOther},
@@ -10659,7 +11059,7 @@ static const struct unidata st302[] = {
 {0,0,0,0,Pc,0,GBOther,WBExtendNumLet,SBOther}
 };
 /* 2040-204F */
-static const struct unidata st303[] = {
+static const struct unidata st318[] = {
 {0,0,0,0,Pc,0,GBOther,WBExtendNumLet,SBOther},
 {0,0,0,0,Po,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Po,0,GBOther,WBOther,SBOther},
@@ -10678,7 +11078,7 @@ static const struct unidata st303[] = {
 {0,0,0,0,Po,0,GBOther,WBOther,SBOther}
 };
 /* 2050-205F */
-static const struct unidata st304[] = {
+static const struct unidata st319[] = {
 {0,0,0,0,Po,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Po,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
@@ -10697,12 +11097,12 @@ static const struct unidata st304[] = {
 {dd0,0,0,0,Zs,CD,GBOther,WBOther,SBSp}
 };
 /* 2060-206F */
-static const struct unidata st305[] = {
+static const struct unidata st320[] = {
+{0,0,0,0,Cf,0,GBControl,WBFormat,SBFormat},
 {0,0,0,0,Cf,0,GBControl,WBFormat,SBFormat},
 {0,0,0,0,Cf,0,GBControl,WBFormat,SBFormat},
 {0,0,0,0,Cf,0,GBControl,WBFormat,SBFormat},
 {0,0,0,0,Cf,0,GBControl,WBFormat,SBFormat},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
@@ -10716,7 +11116,7 @@ static const struct unidata st305[] = {
 {0,0,0,0,Cf,0,GBControl,WBFormat,SBFormat}
 };
 /* 2070-207F */
-static const struct unidata st306[] = {
+static const struct unidata st321[] = {
 {dd1070,0,0,0,No,CD,GBOther,WBOther,SBOther},
 {dd538,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
@@ -10735,7 +11135,7 @@ static const struct unidata st306[] = {
 {dd1082,0,0,0,Ll,CD,GBOther,WBALetter,SBLower}
 };
 /* 2080-208F */
-static const struct unidata st307[] = {
+static const struct unidata st322[] = {
 {dd1070,0,0,0,No,CD,GBOther,WBOther,SBOther},
 {dd9,0,0,0,No,CD,GBOther,WBOther,SBOther},
 {dd4,0,0,0,No,CD,GBOther,WBOther,SBOther},
@@ -10754,7 +11154,7 @@ static const struct unidata st307[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 2090-209F */
-static const struct unidata st308[] = {
+static const struct unidata st323[] = {
 {dd2,0,0,0,Lm,CD,GBOther,WBALetter,SBLower},
 {dd517,0,0,0,Lm,CD,GBOther,WBALetter,SBLower},
 {dd10,0,0,0,Lm,CD,GBOther,WBALetter,SBLower},
@@ -10773,7 +11173,7 @@ static const struct unidata st308[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 20A0-20AF */
-static const struct unidata st309[] = {
+static const struct unidata st324[] = {
 {0,0,0,0,Sc,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sc,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sc,0,GBOther,WBOther,SBOther},
@@ -10792,7 +11192,7 @@ static const struct unidata st309[] = {
 {0,0,0,0,Sc,0,GBOther,WBOther,SBOther}
 };
 /* 20B0-20BF */
-static const struct unidata st310[] = {
+static const struct unidata st325[] = {
 {0,0,0,0,Sc,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sc,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sc,0,GBOther,WBOther,SBOther},
@@ -10811,7 +11211,7 @@ static const struct unidata st310[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 20D0-20DF */
-static const struct unidata st311[] = {
+static const struct unidata st326[] = {
 {0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,1,Mn,0,GBExtend,WBExtend,SBExtend},
@@ -10830,7 +11230,7 @@ static const struct unidata st311[] = {
 {0,0,0,0,Me,0,GBExtend,WBExtend,SBExtend}
 };
 /* 20E0-20EF */
-static const struct unidata st312[] = {
+static const struct unidata st327[] = {
 {0,0,0,0,Me,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Me,0,GBExtend,WBExtend,SBExtend},
@@ -10848,8 +11248,27 @@ static const struct unidata st312[] = {
 {0,0,0,220,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,220,Mn,0,GBExtend,WBExtend,SBExtend}
 };
+/* 20F0-20FF */
+static const struct unidata st328[] = {
+{0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
+};
 /* 2100-210F */
-static const struct unidata st313[] = {
+static const struct unidata st329[] = {
 {dd1084,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1085,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1086,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
@@ -10868,7 +11287,7 @@ static const struct unidata st313[] = {
 {dd1092,0,0,0,Ll,CD,GBOther,WBALetter,SBLower}
 };
 /* 2110-211F */
-static const struct unidata st314[] = {
+static const struct unidata st330[] = {
 {dd499,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
 {dd499,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
 {dd502,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
@@ -10887,29 +11306,29 @@ static const struct unidata st314[] = {
 {0,0,0,0,So,0,GBOther,WBOther,SBOther}
 };
 /* 2120-212F */
-static const struct unidata st315[] = {
+static const struct unidata st331[] = {
 {dd1095,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1096,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1097,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {dd1098,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{dd1099,dd3128,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd1099,dd3129,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {dd1098,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {dd501,dd522,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{dd1100,dd3975,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{dd1100,dd3976,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd493,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
 {dd1086,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {dd517,0,0,0,Ll,CD,GBOther,WBALetter,SBLower}
 };
 /* 2130-213F */
-static const struct unidata st316[] = {
+static const struct unidata st332[] = {
 {dd495,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
 {dd1101,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{0,dd4579,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4595,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {dd503,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
 {dd10,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {dd1102,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
@@ -10925,7 +11344,7 @@ static const struct unidata st316[] = {
 {dd1108,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper}
 };
 /* 2140-214F */
-static const struct unidata st317[] = {
+static const struct unidata st333[] = {
 {dd1109,0,0,0,Sm,CD,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
@@ -10941,10 +11360,10 @@ static const struct unidata st317[] = {
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
+{0,0,0,0,So,0,GBOther,WBOther,SBOther}
 };
 /* 2150-215F */
-static const struct unidata st318[] = {
+static const struct unidata st334[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
@@ -10963,26 +11382,26 @@ static const struct unidata st318[] = {
 {dd1122,0,0,0,No,CD,GBOther,WBOther,SBOther}
 };
 /* 2160-216F */
-static const struct unidata st319[] = {
-{dd499,dd4580,0,0,Nl,CD,GBOther,WBALetter,SBUpper},
-{dd1123,dd4581,0,0,Nl,CD,GBOther,WBALetter,SBUpper},
-{dd1124,dd4582,0,0,Nl,CD,GBOther,WBALetter,SBUpper},
-{dd1125,dd4583,0,0,Nl,CD,GBOther,WBALetter,SBUpper},
-{dd1126,dd4584,0,0,Nl,CD,GBOther,WBALetter,SBUpper},
-{dd1127,dd4585,0,0,Nl,CD,GBOther,WBALetter,SBUpper},
-{dd1128,dd4586,0,0,Nl,CD,GBOther,WBALetter,SBUpper},
-{dd1129,dd4587,0,0,Nl,CD,GBOther,WBALetter,SBUpper},
-{dd1130,dd4588,0,0,Nl,CD,GBOther,WBALetter,SBUpper},
-{dd1131,dd4589,0,0,Nl,CD,GBOther,WBALetter,SBUpper},
-{dd1132,dd4590,0,0,Nl,CD,GBOther,WBALetter,SBUpper},
-{dd1133,dd4591,0,0,Nl,CD,GBOther,WBALetter,SBUpper},
-{dd502,dd4592,0,0,Nl,CD,GBOther,WBALetter,SBUpper},
-{dd1086,dd4593,0,0,Nl,CD,GBOther,WBALetter,SBUpper},
-{dd494,dd4594,0,0,Nl,CD,GBOther,WBALetter,SBUpper},
-{dd503,dd4595,0,0,Nl,CD,GBOther,WBALetter,SBUpper}
+static const struct unidata st335[] = {
+{dd499,dd4596,0,0,Nl,CD,GBOther,WBALetter,SBUpper},
+{dd1123,dd4597,0,0,Nl,CD,GBOther,WBALetter,SBUpper},
+{dd1124,dd4598,0,0,Nl,CD,GBOther,WBALetter,SBUpper},
+{dd1125,dd4599,0,0,Nl,CD,GBOther,WBALetter,SBUpper},
+{dd1126,dd4600,0,0,Nl,CD,GBOther,WBALetter,SBUpper},
+{dd1127,dd4601,0,0,Nl,CD,GBOther,WBALetter,SBUpper},
+{dd1128,dd4602,0,0,Nl,CD,GBOther,WBALetter,SBUpper},
+{dd1129,dd4603,0,0,Nl,CD,GBOther,WBALetter,SBUpper},
+{dd1130,dd4604,0,0,Nl,CD,GBOther,WBALetter,SBUpper},
+{dd1131,dd4605,0,0,Nl,CD,GBOther,WBALetter,SBUpper},
+{dd1132,dd4606,0,0,Nl,CD,GBOther,WBALetter,SBUpper},
+{dd1133,dd4607,0,0,Nl,CD,GBOther,WBALetter,SBUpper},
+{dd502,dd4608,0,0,Nl,CD,GBOther,WBALetter,SBUpper},
+{dd1086,dd4609,0,0,Nl,CD,GBOther,WBALetter,SBUpper},
+{dd494,dd4610,0,0,Nl,CD,GBOther,WBALetter,SBUpper},
+{dd503,dd4611,0,0,Nl,CD,GBOther,WBALetter,SBUpper}
 };
 /* 2170-217F */
-static const struct unidata st320[] = {
+static const struct unidata st336[] = {
 {dd538,0,0,0,Nl,CD,GBOther,WBALetter,SBLower},
 {dd1134,0,0,0,Nl,CD,GBOther,WBALetter,SBLower},
 {dd1135,0,0,0,Nl,CD,GBOther,WBALetter,SBLower},
@@ -11001,16 +11420,16 @@ static const struct unidata st320[] = {
 {dd523,0,0,0,Nl,CD,GBOther,WBALetter,SBLower}
 };
 /* 2180-218F */
-static const struct unidata st321[] = {
+static const struct unidata st337[] = {
 {0,0,0,0,Nl,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Nl,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Nl,0,GBOther,WBALetter,SBOLetter},
-{0,dd4596,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4612,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Nl,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Nl,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Nl,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Nl,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
@@ -11020,12 +11439,12 @@ static const struct unidata st321[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 2190-219F */
-static const struct unidata st322[] = {
-{0,0,dd3881,0,Sm,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
+static const struct unidata st338[] = {
 {0,0,dd3882,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,dd3883,0,Sm,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
+{0,0,dd3884,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
@@ -11039,7 +11458,7 @@ static const struct unidata st322[] = {
 {0,0,0,0,So,0,GBOther,WBOther,SBOther}
 };
 /* 21A0-21AF */
-static const struct unidata st323[] = {
+static const struct unidata st339[] = {
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
@@ -11058,7 +11477,7 @@ static const struct unidata st323[] = {
 {0,0,0,0,So,0,GBOther,WBOther,SBOther}
 };
 /* 21C0-21CF */
-static const struct unidata st324[] = {
+static const struct unidata st340[] = {
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
@@ -11077,13 +11496,13 @@ static const struct unidata st324[] = {
 {dd1148,0,0,0,Sm,0,GBOther,WBOther,SBOther}
 };
 /* 21D0-21DF */
-static const struct unidata st325[] = {
-{0,0,dd3884,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,dd3885,0,Sm,0,GBOther,WBOther,SBOther},
+static const struct unidata st341[] = {
+{0,0,dd3885,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,dd3886,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,dd3887,0,Sm,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
@@ -11096,7 +11515,7 @@ static const struct unidata st325[] = {
 {0,0,0,0,So,0,GBOther,WBOther,SBOther}
 };
 /* 21F0-21FF */
-static const struct unidata st326[] = {
+static const struct unidata st342[] = {
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
@@ -11115,26 +11534,26 @@ static const struct unidata st326[] = {
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther}
 };
 /* 2200-220F */
-static const struct unidata st327[] = {
+static const struct unidata st343[] = {
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
-{0,0,dd3887,0,Sm,0,GBOther,WBOther,SBOther},
+{0,0,dd3888,0,Sm,0,GBOther,WBOther,SBOther},
 {dd1149,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
-{0,0,dd3888,0,Sm,0,GBOther,WBOther,SBOther},
+{0,0,dd3889,0,Sm,0,GBOther,WBOther,SBOther},
 {dd1150,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
-{0,0,dd3889,0,Sm,0,GBOther,WBOther,SBOther},
+{0,0,dd3890,0,Sm,0,GBOther,WBOther,SBOther},
 {dd1151,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther}
 };
 /* 2210-221F */
-static const struct unidata st328[] = {
+static const struct unidata st344[] = {
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
@@ -11153,13 +11572,13 @@ static const struct unidata st328[] = {
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther}
 };
 /* 2220-222F */
-static const struct unidata st329[] = {
+static const struct unidata st345[] = {
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
-{0,0,dd3890,0,Sm,0,GBOther,WBOther,SBOther},
-{dd1152,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,dd3891,0,Sm,0,GBOther,WBOther,SBOther},
+{dd1152,0,0,0,Sm,0,GBOther,WBOther,SBOther},
+{0,0,dd3892,0,Sm,0,GBOther,WBOther,SBOther},
 {dd1153,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
@@ -11172,7 +11591,7 @@ static const struct unidata st329[] = {
 {dd1156,0,0,0,Sm,CD,GBOther,WBOther,SBOther}
 };
 /* 2230-223F */
-static const struct unidata st330[] = {
+static const struct unidata st346[] = {
 {dd1157,0,0,0,Sm,CD,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
@@ -11185,38 +11604,38 @@ static const struct unidata st330[] = {
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
-{0,0,dd3892,0,Sm,0,GBOther,WBOther,SBOther},
+{0,0,dd3893,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther}
 };
 /* 2240-224F */
-static const struct unidata st331[] = {
+static const struct unidata st347[] = {
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {dd1158,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
-{0,0,dd3893,0,Sm,0,GBOther,WBOther,SBOther},
-{dd1159,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,dd3894,0,Sm,0,GBOther,WBOther,SBOther},
+{dd1159,0,0,0,Sm,0,GBOther,WBOther,SBOther},
+{0,0,dd3895,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {dd1160,0,0,0,Sm,0,GBOther,WBOther,SBOther},
-{0,0,dd3895,0,Sm,0,GBOther,WBOther,SBOther},
+{0,0,dd3896,0,Sm,0,GBOther,WBOther,SBOther},
 {dd1161,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
-{0,0,dd3896,0,Sm,0,GBOther,WBOther,SBOther},
+{0,0,dd3897,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther}
 };
 /* 2260-226F */
-static const struct unidata st332[] = {
+static const struct unidata st348[] = {
 {dd1162,0,0,0,Sm,0,GBOther,WBOther,SBOther},
-{0,0,dd3897,0,Sm,0,GBOther,WBOther,SBOther},
+{0,0,dd3898,0,Sm,0,GBOther,WBOther,SBOther},
 {dd1163,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
-{0,0,dd3898,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,dd3899,0,Sm,0,GBOther,WBOther,SBOther},
+{0,0,dd3900,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
@@ -11229,34 +11648,34 @@ static const struct unidata st332[] = {
 {dd1166,0,0,0,Sm,0,GBOther,WBOther,SBOther}
 };
 /* 2270-227F */
-static const struct unidata st333[] = {
+static const struct unidata st349[] = {
 {dd1167,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {dd1168,0,0,0,Sm,0,GBOther,WBOther,SBOther},
-{0,0,dd3900,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,dd3901,0,Sm,0,GBOther,WBOther,SBOther},
+{0,0,dd3902,0,Sm,0,GBOther,WBOther,SBOther},
 {dd1169,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {dd1170,0,0,0,Sm,0,GBOther,WBOther,SBOther},
-{0,0,dd3902,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,dd3903,0,Sm,0,GBOther,WBOther,SBOther},
+{0,0,dd3904,0,Sm,0,GBOther,WBOther,SBOther},
 {dd1171,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {dd1172,0,0,0,Sm,0,GBOther,WBOther,SBOther},
-{0,0,dd3904,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,dd3905,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,dd3906,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,dd3907,0,Sm,0,GBOther,WBOther,SBOther},
+{0,0,dd3908,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther}
 };
 /* 2280-228F */
-static const struct unidata st334[] = {
+static const struct unidata st350[] = {
 {dd1173,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {dd1174,0,0,0,Sm,0,GBOther,WBOther,SBOther},
-{0,0,dd3908,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,dd3909,0,Sm,0,GBOther,WBOther,SBOther},
+{0,0,dd3910,0,Sm,0,GBOther,WBOther,SBOther},
 {dd1175,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {dd1176,0,0,0,Sm,0,GBOther,WBOther,SBOther},
-{0,0,dd3910,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,dd3911,0,Sm,0,GBOther,WBOther,SBOther},
+{0,0,dd3912,0,Sm,0,GBOther,WBOther,SBOther},
 {dd1177,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {dd1178,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
@@ -11267,10 +11686,10 @@ static const struct unidata st334[] = {
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther}
 };
 /* 2290-229F */
-static const struct unidata st335[] = {
+static const struct unidata st351[] = {
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
-{0,0,dd3912,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,dd3913,0,Sm,0,GBOther,WBOther,SBOther},
+{0,0,dd3914,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
@@ -11286,32 +11705,32 @@ static const struct unidata st335[] = {
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther}
 };
 /* 22A0-22AF */
-static const struct unidata st336[] = {
+static const struct unidata st352[] = {
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
-{0,0,dd3914,0,Sm,0,GBOther,WBOther,SBOther},
+{0,0,dd3915,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
-{0,0,dd3915,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,dd3916,0,Sm,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,dd3917,0,Sm,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
+{0,0,dd3918,0,Sm,0,GBOther,WBOther,SBOther},
 {dd1179,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {dd1180,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {dd1181,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {dd1182,0,0,0,Sm,0,GBOther,WBOther,SBOther}
 };
 /* 22B0-22BF */
-static const struct unidata st337[] = {
+static const struct unidata st353[] = {
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
-{0,0,dd3918,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,dd3919,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,dd3920,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,dd3921,0,Sm,0,GBOther,WBOther,SBOther},
+{0,0,dd3922,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
@@ -11324,7 +11743,7 @@ static const struct unidata st337[] = {
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther}
 };
 /* 22E0-22EF */
-static const struct unidata st338[] = {
+static const struct unidata st354[] = {
 {dd1183,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {dd1184,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {dd1185,0,0,0,Sm,0,GBOther,WBOther,SBOther},
@@ -11343,7 +11762,7 @@ static const struct unidata st338[] = {
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther}
 };
 /* 2300-230F */
-static const struct unidata st339[] = {
+static const struct unidata st355[] = {
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
@@ -11362,7 +11781,7 @@ static const struct unidata st339[] = {
 {0,0,0,0,So,0,GBOther,WBOther,SBOther}
 };
 /* 2320-232F */
-static const struct unidata st340[] = {
+static const struct unidata st356[] = {
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
@@ -11381,7 +11800,7 @@ static const struct unidata st340[] = {
 {0,0,0,0,So,0,GBOther,WBOther,SBOther}
 };
 /* 2370-237F */
-static const struct unidata st341[] = {
+static const struct unidata st357[] = {
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
@@ -11400,7 +11819,7 @@ static const struct unidata st341[] = {
 {0,0,0,0,So,0,GBOther,WBOther,SBOther}
 };
 /* 2390-239F */
-static const struct unidata st342[] = {
+static const struct unidata st358[] = {
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
@@ -11419,7 +11838,7 @@ static const struct unidata st342[] = {
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther}
 };
 /* 23B0-23BF */
-static const struct unidata st343[] = {
+static const struct unidata st359[] = {
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
@@ -11438,7 +11857,7 @@ static const struct unidata st343[] = {
 {0,0,0,0,So,0,GBOther,WBOther,SBOther}
 };
 /* 23D0-23DF */
-static const struct unidata st344[] = {
+static const struct unidata st360[] = {
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
@@ -11457,7 +11876,7 @@ static const struct unidata st344[] = {
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther}
 };
 /* 23E0-23EF */
-static const struct unidata st345[] = {
+static const struct unidata st361[] = {
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
@@ -11476,7 +11895,7 @@ static const struct unidata st345[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 2420-242F */
-static const struct unidata st346[] = {
+static const struct unidata st362[] = {
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
@@ -11495,7 +11914,7 @@ static const struct unidata st346[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 2440-244F */
-static const struct unidata st347[] = {
+static const struct unidata st363[] = {
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
@@ -11514,7 +11933,7 @@ static const struct unidata st347[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 2460-246F */
-static const struct unidata st348[] = {
+static const struct unidata st364[] = {
 {dd9,0,0,0,No,CD,GBOther,WBOther,SBOther},
 {dd4,0,0,0,No,CD,GBOther,WBOther,SBOther},
 {dd5,0,0,0,No,CD,GBOther,WBOther,SBOther},
@@ -11533,7 +11952,7 @@ static const struct unidata st348[] = {
 {dd1199,0,0,0,No,CD,GBOther,WBOther,SBOther}
 };
 /* 2470-247F */
-static const struct unidata st349[] = {
+static const struct unidata st365[] = {
 {dd1200,0,0,0,No,CD,GBOther,WBOther,SBOther},
 {dd1201,0,0,0,No,CD,GBOther,WBOther,SBOther},
 {dd1202,0,0,0,No,CD,GBOther,WBOther,SBOther},
@@ -11552,7 +11971,7 @@ static const struct unidata st349[] = {
 {dd1215,0,0,0,No,CD,GBOther,WBOther,SBOther}
 };
 /* 2480-248F */
-static const struct unidata st350[] = {
+static const struct unidata st366[] = {
 {dd1216,0,0,0,No,CD,GBOther,WBOther,SBOther},
 {dd1217,0,0,0,No,CD,GBOther,WBOther,SBOther},
 {dd1218,0,0,0,No,CD,GBOther,WBOther,SBOther},
@@ -11571,7 +11990,7 @@ static const struct unidata st350[] = {
 {dd1231,0,0,0,No,CD,GBOther,WBOther,SBOther}
 };
 /* 2490-249F */
-static const struct unidata st351[] = {
+static const struct unidata st367[] = {
 {dd1232,0,0,0,No,CD,GBOther,WBOther,SBOther},
 {dd1233,0,0,0,No,CD,GBOther,WBOther,SBOther},
 {dd1234,0,0,0,No,CD,GBOther,WBOther,SBOther},
@@ -11590,7 +12009,7 @@ static const struct unidata st351[] = {
 {dd1247,0,0,0,So,CD,GBOther,WBOther,SBOther}
 };
 /* 24A0-24AF */
-static const struct unidata st352[] = {
+static const struct unidata st368[] = {
 {dd1248,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1249,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1250,0,0,0,So,CD,GBOther,WBOther,SBOther},
@@ -11609,45 +12028,45 @@ static const struct unidata st352[] = {
 {dd1263,0,0,0,So,CD,GBOther,WBOther,SBOther}
 };
 /* 24B0-24BF */
-static const struct unidata st353[] = {
+static const struct unidata st369[] = {
 {dd1264,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1265,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1266,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1267,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1268,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1269,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd491,dd4597,0,0,So,CD,GBOther,WBALetter,SBUpper},
-{dd493,dd4598,0,0,So,CD,GBOther,WBALetter,SBUpper},
-{dd1086,dd4599,0,0,So,CD,GBOther,WBALetter,SBUpper},
-{dd494,dd4600,0,0,So,CD,GBOther,WBALetter,SBUpper},
-{dd495,dd4601,0,0,So,CD,GBOther,WBALetter,SBUpper},
-{dd1101,dd4602,0,0,So,CD,GBOther,WBALetter,SBUpper},
-{dd497,dd4603,0,0,So,CD,GBOther,WBALetter,SBUpper},
-{dd498,dd4604,0,0,So,CD,GBOther,WBALetter,SBUpper},
-{dd499,dd4605,0,0,So,CD,GBOther,WBALetter,SBUpper},
-{dd500,dd4606,0,0,So,CD,GBOther,WBALetter,SBUpper}
+{dd491,dd4613,0,0,So,CD,GBOther,WBALetter,SBUpper},
+{dd493,dd4614,0,0,So,CD,GBOther,WBALetter,SBUpper},
+{dd1086,dd4615,0,0,So,CD,GBOther,WBALetter,SBUpper},
+{dd494,dd4616,0,0,So,CD,GBOther,WBALetter,SBUpper},
+{dd495,dd4617,0,0,So,CD,GBOther,WBALetter,SBUpper},
+{dd1101,dd4618,0,0,So,CD,GBOther,WBALetter,SBUpper},
+{dd497,dd4619,0,0,So,CD,GBOther,WBALetter,SBUpper},
+{dd498,dd4620,0,0,So,CD,GBOther,WBALetter,SBUpper},
+{dd499,dd4621,0,0,So,CD,GBOther,WBALetter,SBUpper},
+{dd500,dd4622,0,0,So,CD,GBOther,WBALetter,SBUpper}
 };
 /* 24C0-24CF */
-static const struct unidata st354[] = {
-{dd501,dd4607,0,0,So,CD,GBOther,WBALetter,SBUpper},
-{dd502,dd4608,0,0,So,CD,GBOther,WBALetter,SBUpper},
-{dd503,dd4609,0,0,So,CD,GBOther,WBALetter,SBUpper},
-{dd504,dd4610,0,0,So,CD,GBOther,WBALetter,SBUpper},
-{dd505,dd4611,0,0,So,CD,GBOther,WBALetter,SBUpper},
-{dd507,dd4612,0,0,So,CD,GBOther,WBALetter,SBUpper},
-{dd1094,dd4613,0,0,So,CD,GBOther,WBALetter,SBUpper},
-{dd508,dd4614,0,0,So,CD,GBOther,WBALetter,SBUpper},
-{dd1270,dd4615,0,0,So,CD,GBOther,WBALetter,SBUpper},
-{dd509,dd4616,0,0,So,CD,GBOther,WBALetter,SBUpper},
-{dd510,dd4617,0,0,So,CD,GBOther,WBALetter,SBUpper},
-{dd1126,dd4618,0,0,So,CD,GBOther,WBALetter,SBUpper},
-{dd511,dd4619,0,0,So,CD,GBOther,WBALetter,SBUpper},
-{dd1131,dd4620,0,0,So,CD,GBOther,WBALetter,SBUpper},
-{dd1271,dd4621,0,0,So,CD,GBOther,WBALetter,SBUpper},
-{dd1098,dd4622,0,0,So,CD,GBOther,WBALetter,SBUpper}
+static const struct unidata st370[] = {
+{dd501,dd4623,0,0,So,CD,GBOther,WBALetter,SBUpper},
+{dd502,dd4624,0,0,So,CD,GBOther,WBALetter,SBUpper},
+{dd503,dd4625,0,0,So,CD,GBOther,WBALetter,SBUpper},
+{dd504,dd4626,0,0,So,CD,GBOther,WBALetter,SBUpper},
+{dd505,dd4627,0,0,So,CD,GBOther,WBALetter,SBUpper},
+{dd507,dd4628,0,0,So,CD,GBOther,WBALetter,SBUpper},
+{dd1094,dd4629,0,0,So,CD,GBOther,WBALetter,SBUpper},
+{dd508,dd4630,0,0,So,CD,GBOther,WBALetter,SBUpper},
+{dd1270,dd4631,0,0,So,CD,GBOther,WBALetter,SBUpper},
+{dd509,dd4632,0,0,So,CD,GBOther,WBALetter,SBUpper},
+{dd510,dd4633,0,0,So,CD,GBOther,WBALetter,SBUpper},
+{dd1126,dd4634,0,0,So,CD,GBOther,WBALetter,SBUpper},
+{dd511,dd4635,0,0,So,CD,GBOther,WBALetter,SBUpper},
+{dd1131,dd4636,0,0,So,CD,GBOther,WBALetter,SBUpper},
+{dd1271,dd4637,0,0,So,CD,GBOther,WBALetter,SBUpper},
+{dd1098,dd4638,0,0,So,CD,GBOther,WBALetter,SBUpper}
 };
 /* 24D0-24DF */
-static const struct unidata st355[] = {
+static const struct unidata st371[] = {
 {dd2,0,0,0,So,CD,GBOther,WBALetter,SBLower},
 {dd515,0,0,0,So,CD,GBOther,WBALetter,SBLower},
 {dd541,0,0,0,So,CD,GBOther,WBALetter,SBLower},
@@ -11666,7 +12085,7 @@ static const struct unidata st355[] = {
 {dd528,0,0,0,So,CD,GBOther,WBALetter,SBLower}
 };
 /* 24E0-24EF */
-static const struct unidata st356[] = {
+static const struct unidata st372[] = {
 {dd1272,0,0,0,So,CD,GBOther,WBALetter,SBLower},
 {dd287,0,0,0,So,CD,GBOther,WBALetter,SBLower},
 {dd180,0,0,0,So,CD,GBOther,WBALetter,SBLower},
@@ -11685,7 +12104,7 @@ static const struct unidata st356[] = {
 {0,0,0,0,No,0,GBOther,WBOther,SBOther}
 };
 /* 24F0-24FF */
-static const struct unidata st357[] = {
+static const struct unidata st373[] = {
 {0,0,0,0,No,0,GBOther,WBOther,SBOther},
 {0,0,0,0,No,0,GBOther,WBOther,SBOther},
 {0,0,0,0,No,0,GBOther,WBOther,SBOther},
@@ -11704,7 +12123,7 @@ static const struct unidata st357[] = {
 {0,0,0,0,No,0,GBOther,WBOther,SBOther}
 };
 /* 25B0-25BF */
-static const struct unidata st358[] = {
+static const struct unidata st374[] = {
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
@@ -11723,7 +12142,7 @@ static const struct unidata st358[] = {
 {0,0,0,0,So,0,GBOther,WBOther,SBOther}
 };
 /* 25C0-25CF */
-static const struct unidata st359[] = {
+static const struct unidata st375[] = {
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
@@ -11742,7 +12161,7 @@ static const struct unidata st359[] = {
 {0,0,0,0,So,0,GBOther,WBOther,SBOther}
 };
 /* 25F0-25FF */
-static const struct unidata st360[] = {
+static const struct unidata st376[] = {
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
@@ -11761,7 +12180,7 @@ static const struct unidata st360[] = {
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther}
 };
 /* 2660-266F */
-static const struct unidata st361[] = {
+static const struct unidata st377[] = {
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
@@ -11780,7 +12199,8 @@ static const struct unidata st361[] = {
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther}
 };
 /* 2690-269F */
-static const struct unidata st362[] = {
+static const struct unidata st378[] = {
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
@@ -11795,15 +12215,33 @@ static const struct unidata st362[] = {
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 26B0-26BF */
-static const struct unidata st363[] = {
+static const struct unidata st379[] = {
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
+};
+/* 26C0-26CF */
+static const struct unidata st380[] = {
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
@@ -11818,7 +12256,7 @@ static const struct unidata st363[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 2700-270F */
-static const struct unidata st364[] = {
+static const struct unidata st381[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
@@ -11837,7 +12275,7 @@ static const struct unidata st364[] = {
 {0,0,0,0,So,0,GBOther,WBOther,SBOther}
 };
 /* 2720-272F */
-static const struct unidata st365[] = {
+static const struct unidata st382[] = {
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
@@ -11856,7 +12294,7 @@ static const struct unidata st365[] = {
 {0,0,0,0,So,0,GBOther,WBOther,SBOther}
 };
 /* 2740-274F */
-static const struct unidata st366[] = {
+static const struct unidata st383[] = {
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
@@ -11875,7 +12313,7 @@ static const struct unidata st366[] = {
 {0,0,0,0,So,0,GBOther,WBOther,SBOther}
 };
 /* 2750-275F */
-static const struct unidata st367[] = {
+static const struct unidata st384[] = {
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
@@ -11894,7 +12332,7 @@ static const struct unidata st367[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 2760-276F */
-static const struct unidata st368[] = {
+static const struct unidata st385[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
@@ -11913,7 +12351,7 @@ static const struct unidata st368[] = {
 {0,0,0,0,Pe,0,GBOther,WBOther,SBClose}
 };
 /* 2770-277F */
-static const struct unidata st369[] = {
+static const struct unidata st386[] = {
 {0,0,0,0,Ps,0,GBOther,WBOther,SBClose},
 {0,0,0,0,Pe,0,GBOther,WBOther,SBClose},
 {0,0,0,0,Ps,0,GBOther,WBOther,SBClose},
@@ -11932,7 +12370,7 @@ static const struct unidata st369[] = {
 {0,0,0,0,No,0,GBOther,WBOther,SBOther}
 };
 /* 2790-279F */
-static const struct unidata st370[] = {
+static const struct unidata st387[] = {
 {0,0,0,0,No,0,GBOther,WBOther,SBOther},
 {0,0,0,0,No,0,GBOther,WBOther,SBOther},
 {0,0,0,0,No,0,GBOther,WBOther,SBOther},
@@ -11951,7 +12389,7 @@ static const struct unidata st370[] = {
 {0,0,0,0,So,0,GBOther,WBOther,SBOther}
 };
 /* 27B0-27BF */
-static const struct unidata st371[] = {
+static const struct unidata st388[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
@@ -11970,7 +12408,7 @@ static const struct unidata st371[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 27C0-27CF */
-static const struct unidata st372[] = {
+static const struct unidata st389[] = {
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
@@ -11983,13 +12421,13 @@ static const struct unidata st372[] = {
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 27E0-27EF */
-static const struct unidata st373[] = {
+static const struct unidata st390[] = {
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
@@ -12002,13 +12440,13 @@ static const struct unidata st373[] = {
 {0,0,0,0,Pe,0,GBOther,WBOther,SBClose},
 {0,0,0,0,Ps,0,GBOther,WBOther,SBClose},
 {0,0,0,0,Pe,0,GBOther,WBOther,SBClose},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
+{0,0,0,0,Ps,0,GBOther,WBOther,SBClose},
+{0,0,0,0,Pe,0,GBOther,WBOther,SBClose},
+{0,0,0,0,Ps,0,GBOther,WBOther,SBClose},
+{0,0,0,0,Pe,0,GBOther,WBOther,SBClose}
 };
 /* 2980-298F */
-static const struct unidata st374[] = {
+static const struct unidata st391[] = {
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
@@ -12027,7 +12465,7 @@ static const struct unidata st374[] = {
 {0,0,0,0,Ps,0,GBOther,WBOther,SBClose}
 };
 /* 2990-299F */
-static const struct unidata st375[] = {
+static const struct unidata st392[] = {
 {0,0,0,0,Pe,0,GBOther,WBOther,SBClose},
 {0,0,0,0,Ps,0,GBOther,WBOther,SBClose},
 {0,0,0,0,Pe,0,GBOther,WBOther,SBClose},
@@ -12046,7 +12484,7 @@ static const struct unidata st375[] = {
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther}
 };
 /* 29D0-29DF */
-static const struct unidata st376[] = {
+static const struct unidata st393[] = {
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
@@ -12065,7 +12503,7 @@ static const struct unidata st376[] = {
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther}
 };
 /* 29F0-29FF */
-static const struct unidata st377[] = {
+static const struct unidata st394[] = {
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
@@ -12084,7 +12522,7 @@ static const struct unidata st377[] = {
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther}
 };
 /* 2A00-2A0F */
-static const struct unidata st378[] = {
+static const struct unidata st395[] = {
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
@@ -12103,7 +12541,7 @@ static const struct unidata st378[] = {
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther}
 };
 /* 2A70-2A7F */
-static const struct unidata st379[] = {
+static const struct unidata st396[] = {
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
@@ -12122,7 +12560,7 @@ static const struct unidata st379[] = {
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther}
 };
 /* 2AD0-2ADF */
-static const struct unidata st380[] = {
+static const struct unidata st397[] = {
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
@@ -12140,13 +12578,32 @@ static const struct unidata st380[] = {
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Sm,0,GBOther,WBOther,SBOther}
 };
-/* 2B20-2B2F */
-static const struct unidata st381[] = {
+/* 2B40-2B4F */
+static const struct unidata st398[] = {
+{0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Sm,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
+};
+/* 2B50-2B5F */
+static const struct unidata st399[] = {
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
@@ -12160,26 +12617,7 @@ static const struct unidata st381[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 2C00-2C0F */
-static const struct unidata st382[] = {
-{0,dd4623,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4624,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4625,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4626,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4627,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4628,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4629,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4630,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4631,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4632,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4633,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4634,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4635,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4636,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4637,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4638,0,0,Lu,0,GBOther,WBALetter,SBUpper}
-};
-/* 2C10-2C1F */
-static const struct unidata st383[] = {
+static const struct unidata st400[] = {
 {0,dd4639,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,dd4640,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,dd4641,0,0,Lu,0,GBOther,WBALetter,SBUpper},
@@ -12197,8 +12635,8 @@ static const struct unidata st383[] = {
 {0,dd4653,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,dd4654,0,0,Lu,0,GBOther,WBALetter,SBUpper}
 };
-/* 2C20-2C2F */
-static const struct unidata st384[] = {
+/* 2C10-2C1F */
+static const struct unidata st401[] = {
 {0,dd4655,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,dd4656,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,dd4657,0,0,Lu,0,GBOther,WBALetter,SBUpper},
@@ -12214,10 +12652,29 @@ static const struct unidata st384[] = {
 {0,dd4667,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,dd4668,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,dd4669,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4670,0,0,Lu,0,GBOther,WBALetter,SBUpper}
+};
+/* 2C20-2C2F */
+static const struct unidata st402[] = {
+{0,dd4671,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4672,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4673,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4674,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4675,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4676,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4677,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4678,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4679,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4680,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4681,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4682,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4683,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4684,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4685,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 2C50-2C5F */
-static const struct unidata st385[] = {
+static const struct unidata st403[] = {
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
@@ -12236,85 +12693,45 @@ static const struct unidata st385[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 2C60-2C6F */
-static const struct unidata st386[] = {
-{0,dd4670,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+static const struct unidata st404[] = {
+{0,dd4686,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4671,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4672,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4673,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4687,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4688,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4689,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4674,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4690,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4675,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4691,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4676,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4692,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
+{0,dd513,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd556,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd512,0,0,Lu,0,GBOther,WBALetter,SBUpper}
 };
 /* 2C70-2C7F */
-static const struct unidata st387[] = {
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4677,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+static const struct unidata st405[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
-};
-/* 2C80-2C8F */
-static const struct unidata st388[] = {
-{0,dd4678,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4679,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4680,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4681,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4682,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4683,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4684,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4693,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4685,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower}
-};
-/* 2C90-2C9F */
-static const struct unidata st389[] = {
-{0,dd4686,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4687,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4694,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4688,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4689,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4690,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4691,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4692,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4693,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower}
+{dd286,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd1126,0,0,0,Lm,CD,GBOther,WBALetter,SBLower},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
-/* 2CA0-2CAF */
-static const struct unidata st390[] = {
-{0,dd4694,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+/* 2C80-2C8F */
+static const struct unidata st406[] = {
 {0,dd4695,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,dd4696,0,0,Lu,0,GBOther,WBALetter,SBUpper},
@@ -12328,12 +12745,12 @@ static const struct unidata st390[] = {
 {0,dd4700,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,dd4701,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,dd4702,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower}
 };
-/* 2CB0-2CBF */
-static const struct unidata st391[] = {
-{0,dd4702,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+/* 2C90-2C9F */
+static const struct unidata st407[] = {
 {0,dd4703,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,dd4704,0,0,Lu,0,GBOther,WBALetter,SBUpper},
@@ -12347,12 +12764,12 @@ static const struct unidata st391[] = {
 {0,dd4708,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,dd4709,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,dd4710,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower}
 };
-/* 2CC0-2CCF */
-static const struct unidata st392[] = {
-{0,dd4710,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+/* 2CA0-2CAF */
+static const struct unidata st408[] = {
 {0,dd4711,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,dd4712,0,0,Lu,0,GBOther,WBALetter,SBUpper},
@@ -12366,12 +12783,12 @@ static const struct unidata st392[] = {
 {0,dd4716,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,dd4717,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,dd4718,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower}
 };
-/* 2CD0-2CDF */
-static const struct unidata st393[] = {
-{0,dd4718,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+/* 2CB0-2CBF */
+static const struct unidata st409[] = {
 {0,dd4719,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,dd4720,0,0,Lu,0,GBOther,WBALetter,SBUpper},
@@ -12385,13 +12802,53 @@ static const struct unidata st393[] = {
 {0,dd4724,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,dd4725,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,dd4726,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower}
+};
+/* 2CC0-2CCF */
+static const struct unidata st410[] = {
+{0,dd4727,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,dd4728,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,dd4729,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,dd4730,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,dd4731,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,dd4732,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,dd4733,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,dd4734,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower}
+};
+/* 2CD0-2CDF */
+static const struct unidata st411[] = {
+{0,dd4735,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,dd4736,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,dd4737,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,dd4738,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,dd4739,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,dd4740,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,dd4741,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,dd4742,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower}
 };
 /* 2CE0-2CEF */
-static const struct unidata st394[] = {
-{0,dd4726,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+static const struct unidata st412[] = {
+{0,dd4743,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,dd4727,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4744,0,0,Lu,0,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
@@ -12407,7 +12864,7 @@ static const struct unidata st394[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 2CF0-2CFF */
-static const struct unidata st395[] = {
+static const struct unidata st413[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
@@ -12426,7 +12883,7 @@ static const struct unidata st395[] = {
 {0,0,0,0,Po,0,GBOther,WBOther,SBOther}
 };
 /* 2D20-2D2F */
-static const struct unidata st396[] = {
+static const struct unidata st414[] = {
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
@@ -12445,7 +12902,7 @@ static const struct unidata st396[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 2D60-2D6F */
-static const struct unidata st397[] = {
+static const struct unidata st415[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
@@ -12464,7 +12921,7 @@ static const struct unidata st397[] = {
 {dd1278,0,0,0,Lm,CD,GBOther,WBALetter,SBOLetter}
 };
 /* 2DA0-2DAF */
-static const struct unidata st398[] = {
+static const struct unidata st416[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
@@ -12483,7 +12940,7 @@ static const struct unidata st398[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 2E00-2E0F */
-static const struct unidata st399[] = {
+static const struct unidata st417[] = {
 {0,0,0,0,Po,0,GBOther,WBOther,SBClose},
 {0,0,0,0,Po,0,GBOther,WBOther,SBClose},
 {0,0,0,0,Pi,0,GBOther,WBOther,SBClose},
@@ -12502,7 +12959,7 @@ static const struct unidata st399[] = {
 {0,0,0,0,Po,0,GBOther,WBOther,SBOther}
 };
 /* 2E10-2E1F */
-static const struct unidata st400[] = {
+static const struct unidata st418[] = {
 {0,0,0,0,Po,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Po,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Po,0,GBOther,WBOther,SBOther},
@@ -12511,17 +12968,55 @@ static const struct unidata st400[] = {
 {0,0,0,0,Po,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Po,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Pd,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Po,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Po,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Pd,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Po,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Pi,0,GBOther,WBOther,SBClose},
+{0,0,0,0,Pf,0,GBOther,WBOther,SBClose},
+{0,0,0,0,Po,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Po,0,GBOther,WBOther,SBOther}
+};
+/* 2E20-2E2F */
+static const struct unidata st419[] = {
+{0,0,0,0,Pi,0,GBOther,WBOther,SBClose},
+{0,0,0,0,Pf,0,GBOther,WBOther,SBClose},
+{0,0,0,0,Ps,0,GBOther,WBOther,SBClose},
+{0,0,0,0,Pe,0,GBOther,WBOther,SBClose},
+{0,0,0,0,Ps,0,GBOther,WBOther,SBClose},
+{0,0,0,0,Pe,0,GBOther,WBOther,SBClose},
+{0,0,0,0,Ps,0,GBOther,WBOther,SBClose},
+{0,0,0,0,Pe,0,GBOther,WBOther,SBClose},
+{0,0,0,0,Ps,0,GBOther,WBOther,SBClose},
+{0,0,0,0,Pe,0,GBOther,WBOther,SBClose},
+{0,0,0,0,Po,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Po,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Po,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Po,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Po,0,GBOther,WBOther,SBSTerm},
+{0,0,0,0,Lm,0,GBOther,WBALetter,SBOLetter}
+};
+/* 2E30-2E3F */
+static const struct unidata st420[] = {
+{0,0,0,0,Po,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Pi,0,GBOther,WBOther,SBClose},
-{0,0,0,0,Pf,0,GBOther,WBOther,SBClose},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 2E90-2E9F */
-static const struct unidata st401[] = {
+static const struct unidata st421[] = {
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
@@ -12540,7 +13035,7 @@ static const struct unidata st401[] = {
 {dd1279,0,0,0,So,CD,GBOther,WBOther,SBOther}
 };
 /* 2EF0-2EFF */
-static const struct unidata st402[] = {
+static const struct unidata st422[] = {
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
@@ -12559,7 +13054,7 @@ static const struct unidata st402[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 2F00-2F0F */
-static const struct unidata st403[] = {
+static const struct unidata st423[] = {
 {dd1281,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1282,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1283,0,0,0,So,CD,GBOther,WBOther,SBOther},
@@ -12578,7 +13073,7 @@ static const struct unidata st403[] = {
 {dd1296,0,0,0,So,CD,GBOther,WBOther,SBOther}
 };
 /* 2F10-2F1F */
-static const struct unidata st404[] = {
+static const struct unidata st424[] = {
 {dd1297,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1298,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1299,0,0,0,So,CD,GBOther,WBOther,SBOther},
@@ -12597,7 +13092,7 @@ static const struct unidata st404[] = {
 {dd1312,0,0,0,So,CD,GBOther,WBOther,SBOther}
 };
 /* 2F20-2F2F */
-static const struct unidata st405[] = {
+static const struct unidata st425[] = {
 {dd1313,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1314,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1315,0,0,0,So,CD,GBOther,WBOther,SBOther},
@@ -12616,7 +13111,7 @@ static const struct unidata st405[] = {
 {dd1328,0,0,0,So,CD,GBOther,WBOther,SBOther}
 };
 /* 2F30-2F3F */
-static const struct unidata st406[] = {
+static const struct unidata st426[] = {
 {dd1329,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1330,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1331,0,0,0,So,CD,GBOther,WBOther,SBOther},
@@ -12635,7 +13130,7 @@ static const struct unidata st406[] = {
 {dd1344,0,0,0,So,CD,GBOther,WBOther,SBOther}
 };
 /* 2F40-2F4F */
-static const struct unidata st407[] = {
+static const struct unidata st427[] = {
 {dd1345,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1346,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1347,0,0,0,So,CD,GBOther,WBOther,SBOther},
@@ -12654,7 +13149,7 @@ static const struct unidata st407[] = {
 {dd1360,0,0,0,So,CD,GBOther,WBOther,SBOther}
 };
 /* 2F50-2F5F */
-static const struct unidata st408[] = {
+static const struct unidata st428[] = {
 {dd1361,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1362,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1363,0,0,0,So,CD,GBOther,WBOther,SBOther},
@@ -12673,7 +13168,7 @@ static const struct unidata st408[] = {
 {dd1376,0,0,0,So,CD,GBOther,WBOther,SBOther}
 };
 /* 2F60-2F6F */
-static const struct unidata st409[] = {
+static const struct unidata st429[] = {
 {dd1377,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1378,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1379,0,0,0,So,CD,GBOther,WBOther,SBOther},
@@ -12692,7 +13187,7 @@ static const struct unidata st409[] = {
 {dd1392,0,0,0,So,CD,GBOther,WBOther,SBOther}
 };
 /* 2F70-2F7F */
-static const struct unidata st410[] = {
+static const struct unidata st430[] = {
 {dd1393,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1394,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1395,0,0,0,So,CD,GBOther,WBOther,SBOther},
@@ -12711,7 +13206,7 @@ static const struct unidata st410[] = {
 {dd1408,0,0,0,So,CD,GBOther,WBOther,SBOther}
 };
 /* 2F80-2F8F */
-static const struct unidata st411[] = {
+static const struct unidata st431[] = {
 {dd1409,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1410,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1411,0,0,0,So,CD,GBOther,WBOther,SBOther},
@@ -12730,7 +13225,7 @@ static const struct unidata st411[] = {
 {dd1424,0,0,0,So,CD,GBOther,WBOther,SBOther}
 };
 /* 2F90-2F9F */
-static const struct unidata st412[] = {
+static const struct unidata st432[] = {
 {dd1425,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1426,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1427,0,0,0,So,CD,GBOther,WBOther,SBOther},
@@ -12749,7 +13244,7 @@ static const struct unidata st412[] = {
 {dd1440,0,0,0,So,CD,GBOther,WBOther,SBOther}
 };
 /* 2FA0-2FAF */
-static const struct unidata st413[] = {
+static const struct unidata st433[] = {
 {dd1441,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1442,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1443,0,0,0,So,CD,GBOther,WBOther,SBOther},
@@ -12768,7 +13263,7 @@ static const struct unidata st413[] = {
 {dd1456,0,0,0,So,CD,GBOther,WBOther,SBOther}
 };
 /* 2FB0-2FBF */
-static const struct unidata st414[] = {
+static const struct unidata st434[] = {
 {dd1457,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1458,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1459,0,0,0,So,CD,GBOther,WBOther,SBOther},
@@ -12787,7 +13282,7 @@ static const struct unidata st414[] = {
 {dd1472,0,0,0,So,CD,GBOther,WBOther,SBOther}
 };
 /* 2FC0-2FCF */
-static const struct unidata st415[] = {
+static const struct unidata st435[] = {
 {dd1473,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1474,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1475,0,0,0,So,CD,GBOther,WBOther,SBOther},
@@ -12806,7 +13301,7 @@ static const struct unidata st415[] = {
 {dd1488,0,0,0,So,CD,GBOther,WBOther,SBOther}
 };
 /* 2FD0-2FDF */
-static const struct unidata st416[] = {
+static const struct unidata st436[] = {
 {dd1489,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1490,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1491,0,0,0,So,CD,GBOther,WBOther,SBOther},
@@ -12825,7 +13320,7 @@ static const struct unidata st416[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 2FF0-2FFF */
-static const struct unidata st417[] = {
+static const struct unidata st437[] = {
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
@@ -12844,9 +13339,9 @@ static const struct unidata st417[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 3000-300F */
-static const struct unidata st418[] = {
+static const struct unidata st438[] = {
 {dd0,0,0,0,Zs,CD,GBOther,WBOther,SBSp},
-{0,0,0,0,Po,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Po,0,GBOther,WBOther,SBSContinue},
 {0,0,0,0,Po,0,GBOther,WBOther,SBSTerm},
 {0,0,0,0,Po,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
@@ -12863,7 +13358,7 @@ static const struct unidata st418[] = {
 {0,0,0,0,Pe,0,GBOther,WBOther,SBClose}
 };
 /* 3010-301F */
-static const struct unidata st419[] = {
+static const struct unidata st439[] = {
 {0,0,0,0,Ps,0,GBOther,WBOther,SBClose},
 {0,0,0,0,Pe,0,GBOther,WBOther,SBClose},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
@@ -12882,7 +13377,7 @@ static const struct unidata st419[] = {
 {0,0,0,0,Pe,0,GBOther,WBOther,SBClose}
 };
 /* 3020-302F */
-static const struct unidata st420[] = {
+static const struct unidata st440[] = {
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Nl,0,GBOther,WBOther,SBOLetter},
 {0,0,0,0,Nl,0,GBOther,WBOther,SBOLetter},
@@ -12901,7 +13396,7 @@ static const struct unidata st420[] = {
 {0,0,0,224,Mn,0,GBExtend,WBExtend,SBExtend}
 };
 /* 3030-303F */
-static const struct unidata st421[] = {
+static const struct unidata st441[] = {
 {0,0,0,0,Pd,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Lm,0,GBOther,WBKatakana,SBOLetter},
 {0,0,0,0,Lm,0,GBOther,WBKatakana,SBOLetter},
@@ -12920,83 +13415,83 @@ static const struct unidata st421[] = {
 {0,0,0,0,So,0,GBOther,WBOther,SBOther}
 };
 /* 3040-304F */
-static const struct unidata st422[] = {
+static const struct unidata st442[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{0,0,dd3922,0,Lo,0,GBOther,WBOther,SBOLetter},
+{0,0,dd3923,0,Lo,0,GBOther,WBOther,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{0,0,dd3923,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd1498,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {0,0,dd3924,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd1498,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{0,0,dd3925,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd1499,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{0,0,dd3925,0,Lo,0,GBOther,WBOther,SBOLetter}
+{0,0,dd3926,0,Lo,0,GBOther,WBOther,SBOLetter}
 };
 /* 3050-305F */
-static const struct unidata st423[] = {
+static const struct unidata st443[] = {
 {dd1500,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{0,0,dd3926,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd1501,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {0,0,dd3927,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd1502,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd1501,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {0,0,dd3928,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd1503,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd1502,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {0,0,dd3929,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd1504,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd1503,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {0,0,dd3930,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd1505,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd1504,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {0,0,dd3931,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd1506,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd1505,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {0,0,dd3932,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd1506,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{0,0,dd3933,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd1507,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{0,0,dd3933,0,Lo,0,GBOther,WBOther,SBOLetter}
+{0,0,dd3934,0,Lo,0,GBOther,WBOther,SBOLetter}
 };
 /* 3060-306F */
-static const struct unidata st424[] = {
+static const struct unidata st444[] = {
 {dd1508,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{0,0,dd3934,0,Lo,0,GBOther,WBOther,SBOLetter},
+{0,0,dd3935,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd1509,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{0,0,dd3935,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd1510,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {0,0,dd3936,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd1511,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd1510,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {0,0,dd3937,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd1511,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{0,0,dd3938,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd1512,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{0,0,dd3938,0,Lo,0,GBOther,WBOther,SBOLetter}
+{0,0,dd3939,0,Lo,0,GBOther,WBOther,SBOLetter}
 };
 /* 3070-307F */
-static const struct unidata st425[] = {
+static const struct unidata st445[] = {
 {dd1513,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd1514,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{0,0,dd3939,0,Lo,0,GBOther,WBOther,SBOLetter},
+{0,0,dd3940,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd1515,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd1516,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{0,0,dd3940,0,Lo,0,GBOther,WBOther,SBOLetter},
+{0,0,dd3941,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd1517,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd1518,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{0,0,dd3941,0,Lo,0,GBOther,WBOther,SBOLetter},
+{0,0,dd3942,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd1519,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd1520,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{0,0,dd3942,0,Lo,0,GBOther,WBOther,SBOLetter},
+{0,0,dd3943,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd1521,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {dd1522,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
 };
 /* 3090-309F */
-static const struct unidata st426[] = {
+static const struct unidata st446[] = {
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
@@ -13010,88 +13505,88 @@ static const struct unidata st426[] = {
 {0,0,0,8,Mn,0,GBExtend,WBExtend,SBExtend},
 {dd1524,0,0,0,Sk,CD,GBOther,WBKatakana,SBOther},
 {dd1525,0,0,0,Sk,CD,GBOther,WBKatakana,SBOther},
-{0,0,dd3943,0,Lm,0,GBOther,WBOther,SBOLetter},
+{0,0,dd3944,0,Lm,0,GBOther,WBOther,SBOLetter},
 {dd1526,0,0,0,Lm,0,GBOther,WBOther,SBOLetter},
 {dd1527,0,0,0,Lo,CD,GBOther,WBOther,SBOLetter}
 };
 /* 30A0-30AF */
-static const struct unidata st427[] = {
+static const struct unidata st447[] = {
 {0,0,0,0,Pd,0,GBOther,WBKatakana,SBOther},
 {0,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter},
-{0,0,dd3944,0,Lo,0,GBOther,WBKatakana,SBOLetter},
+{0,0,dd3945,0,Lo,0,GBOther,WBKatakana,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter},
-{0,0,dd3945,0,Lo,0,GBOther,WBKatakana,SBOLetter},
-{dd1528,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter},
 {0,0,dd3946,0,Lo,0,GBOther,WBKatakana,SBOLetter},
+{dd1528,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter},
+{0,0,dd3947,0,Lo,0,GBOther,WBKatakana,SBOLetter},
 {dd1529,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter},
-{0,0,dd3947,0,Lo,0,GBOther,WBKatakana,SBOLetter}
+{0,0,dd3948,0,Lo,0,GBOther,WBKatakana,SBOLetter}
 };
 /* 30B0-30BF */
-static const struct unidata st428[] = {
+static const struct unidata st448[] = {
 {dd1530,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter},
-{0,0,dd3948,0,Lo,0,GBOther,WBKatakana,SBOLetter},
-{dd1531,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter},
 {0,0,dd3949,0,Lo,0,GBOther,WBKatakana,SBOLetter},
-{dd1532,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter},
+{dd1531,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter},
 {0,0,dd3950,0,Lo,0,GBOther,WBKatakana,SBOLetter},
-{dd1533,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter},
+{dd1532,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter},
 {0,0,dd3951,0,Lo,0,GBOther,WBKatakana,SBOLetter},
-{dd1534,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter},
+{dd1533,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter},
 {0,0,dd3952,0,Lo,0,GBOther,WBKatakana,SBOLetter},
-{dd1535,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter},
+{dd1534,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter},
 {0,0,dd3953,0,Lo,0,GBOther,WBKatakana,SBOLetter},
-{dd1536,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter},
+{dd1535,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter},
 {0,0,dd3954,0,Lo,0,GBOther,WBKatakana,SBOLetter},
+{dd1536,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter},
+{0,0,dd3955,0,Lo,0,GBOther,WBKatakana,SBOLetter},
 {dd1537,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter},
-{0,0,dd3955,0,Lo,0,GBOther,WBKatakana,SBOLetter}
+{0,0,dd3956,0,Lo,0,GBOther,WBKatakana,SBOLetter}
 };
 /* 30C0-30CF */
-static const struct unidata st429[] = {
+static const struct unidata st449[] = {
 {dd1538,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter},
-{0,0,dd3956,0,Lo,0,GBOther,WBKatakana,SBOLetter},
+{0,0,dd3957,0,Lo,0,GBOther,WBKatakana,SBOLetter},
 {dd1539,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter},
-{0,0,dd3957,0,Lo,0,GBOther,WBKatakana,SBOLetter},
-{dd1540,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter},
 {0,0,dd3958,0,Lo,0,GBOther,WBKatakana,SBOLetter},
-{dd1541,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter},
+{dd1540,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter},
 {0,0,dd3959,0,Lo,0,GBOther,WBKatakana,SBOLetter},
+{dd1541,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter},
+{0,0,dd3960,0,Lo,0,GBOther,WBKatakana,SBOLetter},
 {dd1542,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter},
-{0,0,dd3960,0,Lo,0,GBOther,WBKatakana,SBOLetter}
+{0,0,dd3961,0,Lo,0,GBOther,WBKatakana,SBOLetter}
 };
 /* 30D0-30DF */
-static const struct unidata st430[] = {
+static const struct unidata st450[] = {
 {dd1543,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter},
 {dd1544,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter},
-{0,0,dd3961,0,Lo,0,GBOther,WBKatakana,SBOLetter},
+{0,0,dd3962,0,Lo,0,GBOther,WBKatakana,SBOLetter},
 {dd1545,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter},
 {dd1546,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter},
-{0,0,dd3962,0,Lo,0,GBOther,WBKatakana,SBOLetter},
+{0,0,dd3963,0,Lo,0,GBOther,WBKatakana,SBOLetter},
 {dd1547,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter},
 {dd1548,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter},
-{0,0,dd3963,0,Lo,0,GBOther,WBKatakana,SBOLetter},
+{0,0,dd3964,0,Lo,0,GBOther,WBKatakana,SBOLetter},
 {dd1549,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter},
 {dd1550,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter},
-{0,0,dd3964,0,Lo,0,GBOther,WBKatakana,SBOLetter},
+{0,0,dd3965,0,Lo,0,GBOther,WBKatakana,SBOLetter},
 {dd1551,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter},
 {dd1552,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter}
 };
 /* 30E0-30EF */
-static const struct unidata st431[] = {
+static const struct unidata st451[] = {
 {0,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter},
@@ -13107,13 +13602,13 @@ static const struct unidata st431[] = {
 {0,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter},
-{0,0,dd3965,0,Lo,0,GBOther,WBKatakana,SBOLetter}
+{0,0,dd3966,0,Lo,0,GBOther,WBKatakana,SBOLetter}
 };
 /* 30F0-30FF */
-static const struct unidata st432[] = {
-{0,0,dd3966,0,Lo,0,GBOther,WBKatakana,SBOLetter},
+static const struct unidata st452[] = {
 {0,0,dd3967,0,Lo,0,GBOther,WBKatakana,SBOLetter},
 {0,0,dd3968,0,Lo,0,GBOther,WBKatakana,SBOLetter},
+{0,0,dd3969,0,Lo,0,GBOther,WBKatakana,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter},
 {dd1553,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter},
@@ -13124,12 +13619,12 @@ static const struct unidata st432[] = {
 {dd1557,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter},
 {0,0,0,0,Po,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Lm,0,GBOther,WBKatakana,SBOLetter},
-{0,0,dd3969,0,Lm,0,GBOther,WBKatakana,SBOLetter},
+{0,0,dd3970,0,Lm,0,GBOther,WBKatakana,SBOLetter},
 {dd1558,0,0,0,Lm,0,GBOther,WBKatakana,SBOLetter},
 {dd1559,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter}
 };
 /* 3100-310F */
-static const struct unidata st433[] = {
+static const struct unidata st453[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
@@ -13147,8 +13642,27 @@ static const struct unidata st433[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter}
 };
+/* 3120-312F */
+static const struct unidata st454[] = {
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
+};
 /* 3130-313F */
-static const struct unidata st434[] = {
+static const struct unidata st455[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {dd1560,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd1561,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
@@ -13167,7 +13681,7 @@ static const struct unidata st434[] = {
 {dd1574,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
 };
 /* 3140-314F */
-static const struct unidata st435[] = {
+static const struct unidata st456[] = {
 {dd1575,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd1576,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd1577,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
@@ -13186,7 +13700,7 @@ static const struct unidata st435[] = {
 {dd1590,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
 };
 /* 3150-315F */
-static const struct unidata st436[] = {
+static const struct unidata st457[] = {
 {dd1591,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd1592,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd1593,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
@@ -13205,7 +13719,7 @@ static const struct unidata st436[] = {
 {dd1606,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
 };
 /* 3160-316F */
-static const struct unidata st437[] = {
+static const struct unidata st458[] = {
 {dd1607,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd1608,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd1609,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
@@ -13224,7 +13738,7 @@ static const struct unidata st437[] = {
 {dd1622,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
 };
 /* 3170-317F */
-static const struct unidata st438[] = {
+static const struct unidata st459[] = {
 {dd1623,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd1624,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd1625,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
@@ -13243,7 +13757,7 @@ static const struct unidata st438[] = {
 {dd1638,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
 };
 /* 3180-318F */
-static const struct unidata st439[] = {
+static const struct unidata st460[] = {
 {dd1639,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd1640,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd1641,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
@@ -13262,7 +13776,7 @@ static const struct unidata st439[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 3190-319F */
-static const struct unidata st440[] = {
+static const struct unidata st461[] = {
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {dd1281,0,0,0,No,CD,GBOther,WBOther,SBOther},
@@ -13281,7 +13795,7 @@ static const struct unidata st440[] = {
 {dd1289,0,0,0,So,CD,GBOther,WBOther,SBOther}
 };
 /* 31F0-31FF */
-static const struct unidata st441[] = {
+static const struct unidata st462[] = {
 {0,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter},
@@ -13300,7 +13814,7 @@ static const struct unidata st441[] = {
 {0,0,0,0,Lo,0,GBOther,WBKatakana,SBOLetter}
 };
 /* 3200-320F */
-static const struct unidata st442[] = {
+static const struct unidata st463[] = {
 {dd1664,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1665,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1666,0,0,0,So,CD,GBOther,WBOther,SBOther},
@@ -13319,7 +13833,7 @@ static const struct unidata st442[] = {
 {dd1679,0,0,0,So,CD,GBOther,WBOther,SBOther}
 };
 /* 3210-321F */
-static const struct unidata st443[] = {
+static const struct unidata st464[] = {
 {dd1680,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1681,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1682,0,0,0,So,CD,GBOther,WBOther,SBOther},
@@ -13338,7 +13852,7 @@ static const struct unidata st443[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 3220-322F */
-static const struct unidata st444[] = {
+static const struct unidata st465[] = {
 {dd1695,0,0,0,No,CD,GBOther,WBOther,SBOther},
 {dd1696,0,0,0,No,CD,GBOther,WBOther,SBOther},
 {dd1697,0,0,0,No,CD,GBOther,WBOther,SBOther},
@@ -13357,7 +13871,7 @@ static const struct unidata st444[] = {
 {dd1710,0,0,0,So,CD,GBOther,WBOther,SBOther}
 };
 /* 3230-323F */
-static const struct unidata st445[] = {
+static const struct unidata st466[] = {
 {dd1711,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1712,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1713,0,0,0,So,CD,GBOther,WBOther,SBOther},
@@ -13376,7 +13890,7 @@ static const struct unidata st445[] = {
 {dd1726,0,0,0,So,CD,GBOther,WBOther,SBOther}
 };
 /* 3240-324F */
-static const struct unidata st446[] = {
+static const struct unidata st467[] = {
 {dd1727,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1728,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1729,0,0,0,So,CD,GBOther,WBOther,SBOther},
@@ -13395,7 +13909,7 @@ static const struct unidata st446[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 3250-325F */
-static const struct unidata st447[] = {
+static const struct unidata st468[] = {
 {dd1731,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1732,0,0,0,No,CD,GBOther,WBOther,SBOther},
 {dd1733,0,0,0,No,CD,GBOther,WBOther,SBOther},
@@ -13414,7 +13928,7 @@ static const struct unidata st447[] = {
 {dd1746,0,0,0,No,CD,GBOther,WBOther,SBOther}
 };
 /* 3260-326F */
-static const struct unidata st448[] = {
+static const struct unidata st469[] = {
 {dd1560,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1563,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1566,0,0,0,So,CD,GBOther,WBOther,SBOther},
@@ -13433,7 +13947,7 @@ static const struct unidata st448[] = {
 {dd1748,0,0,0,So,CD,GBOther,WBOther,SBOther}
 };
 /* 3270-327F */
-static const struct unidata st449[] = {
+static const struct unidata st470[] = {
 {dd1749,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1750,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1751,0,0,0,So,CD,GBOther,WBOther,SBOther},
@@ -13452,7 +13966,7 @@ static const struct unidata st449[] = {
 {0,0,0,0,So,0,GBOther,WBOther,SBOther}
 };
 /* 3280-328F */
-static const struct unidata st450[] = {
+static const struct unidata st471[] = {
 {dd1281,0,0,0,No,CD,GBOther,WBOther,SBOther},
 {dd1287,0,0,0,No,CD,GBOther,WBOther,SBOther},
 {dd1654,0,0,0,No,CD,GBOther,WBOther,SBOther},
@@ -13471,7 +13985,7 @@ static const struct unidata st450[] = {
 {dd1312,0,0,0,So,CD,GBOther,WBOther,SBOther}
 };
 /* 3290-329F */
-static const struct unidata st451[] = {
+static const struct unidata st472[] = {
 {dd1352,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1768,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1769,0,0,0,So,CD,GBOther,WBOther,SBOther},
@@ -13490,7 +14004,7 @@ static const struct unidata st451[] = {
 {dd1781,0,0,0,So,CD,GBOther,WBOther,SBOther}
 };
 /* 32A0-32AF */
-static const struct unidata st452[] = {
+static const struct unidata st473[] = {
 {dd1782,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1783,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1784,0,0,0,So,CD,GBOther,WBOther,SBOther},
@@ -13509,7 +14023,7 @@ static const struct unidata st452[] = {
 {dd1794,0,0,0,So,CD,GBOther,WBOther,SBOther}
 };
 /* 32B0-32BF */
-static const struct unidata st453[] = {
+static const struct unidata st474[] = {
 {dd1795,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1796,0,0,0,No,CD,GBOther,WBOther,SBOther},
 {dd1797,0,0,0,No,CD,GBOther,WBOther,SBOther},
@@ -13528,7 +14042,7 @@ static const struct unidata st453[] = {
 {dd1810,0,0,0,No,CD,GBOther,WBOther,SBOther}
 };
 /* 32C0-32CF */
-static const struct unidata st454[] = {
+static const struct unidata st475[] = {
 {dd1811,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1812,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1813,0,0,0,So,CD,GBOther,WBOther,SBOther},
@@ -13547,167 +14061,167 @@ static const struct unidata st454[] = {
 {dd1826,0,0,0,So,CD,GBOther,WBOther,SBOther}
 };
 /* 32D0-32DF */
-static const struct unidata st455[] = {
-{dd1827,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1828,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1829,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1830,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1831,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1832,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1833,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1834,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1835,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1836,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1837,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1838,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1839,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1840,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1841,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1842,0,0,0,So,CD,GBOther,WBOther,SBOther}
+static const struct unidata st476[] = {
+{dd1827,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1828,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1829,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1830,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1831,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1832,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1833,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1834,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1835,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1836,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1837,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1838,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1839,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1840,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1841,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1842,0,0,0,So,CD,GBOther,WBKatakana,SBOther}
 };
 /* 32E0-32EF */
-static const struct unidata st456[] = {
-{dd1843,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1844,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1845,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1846,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1847,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1848,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1849,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1850,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1851,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1852,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1853,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1854,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1855,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1856,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1857,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1858,0,0,0,So,CD,GBOther,WBOther,SBOther}
+static const struct unidata st477[] = {
+{dd1843,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1844,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1845,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1846,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1847,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1848,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1849,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1850,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1851,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1852,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1853,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1854,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1855,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1856,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1857,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1858,0,0,0,So,CD,GBOther,WBKatakana,SBOther}
 };
 /* 32F0-32FF */
-static const struct unidata st457[] = {
-{dd1859,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1860,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1861,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1862,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1863,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1864,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1865,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1866,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1867,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1868,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1869,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1870,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1871,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1872,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1873,0,0,0,So,CD,GBOther,WBOther,SBOther},
+static const struct unidata st478[] = {
+{dd1859,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1860,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1861,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1862,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1863,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1864,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1865,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1866,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1867,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1868,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1869,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1870,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1871,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1872,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1873,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* 3300-330F */
-static const struct unidata st458[] = {
-{dd1874,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1875,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1876,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1877,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1878,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1879,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1880,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1881,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1882,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1883,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1884,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1885,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1886,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1887,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1888,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1889,0,0,0,So,CD,GBOther,WBOther,SBOther}
+static const struct unidata st479[] = {
+{dd1874,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1875,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1876,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1877,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1878,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1879,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1880,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1881,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1882,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1883,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1884,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1885,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1886,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1887,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1888,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1889,0,0,0,So,CD,GBOther,WBKatakana,SBOther}
 };
 /* 3310-331F */
-static const struct unidata st459[] = {
-{dd1890,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1891,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1892,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1893,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1894,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1895,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1896,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1897,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1898,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1899,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1900,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1901,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1902,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1903,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1904,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1905,0,0,0,So,CD,GBOther,WBOther,SBOther}
+static const struct unidata st480[] = {
+{dd1890,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1891,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1892,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1893,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1894,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1895,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1896,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1897,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1898,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1899,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1900,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1901,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1902,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1903,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1904,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1905,0,0,0,So,CD,GBOther,WBKatakana,SBOther}
 };
 /* 3320-332F */
-static const struct unidata st460[] = {
-{dd1906,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1907,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1908,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1909,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1910,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1911,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1912,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1913,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1914,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1915,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1916,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1917,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1918,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1919,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1920,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1921,0,0,0,So,CD,GBOther,WBOther,SBOther}
+static const struct unidata st481[] = {
+{dd1906,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1907,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1908,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1909,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1910,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1911,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1912,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1913,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1914,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1915,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1916,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1917,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1918,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1919,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1920,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1921,0,0,0,So,CD,GBOther,WBKatakana,SBOther}
 };
 /* 3330-333F */
-static const struct unidata st461[] = {
-{dd1922,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1923,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1924,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1925,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1926,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1927,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1928,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1929,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1930,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1931,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1932,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1933,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1934,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1935,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1936,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1937,0,0,0,So,CD,GBOther,WBOther,SBOther}
+static const struct unidata st482[] = {
+{dd1922,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1923,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1924,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1925,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1926,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1927,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1928,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1929,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1930,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1931,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1932,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1933,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1934,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1935,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1936,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1937,0,0,0,So,CD,GBOther,WBKatakana,SBOther}
 };
 /* 3340-334F */
-static const struct unidata st462[] = {
-{dd1938,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1939,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1940,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1941,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1942,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1943,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1944,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1945,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1946,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1947,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1948,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1949,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1950,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1951,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1952,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1953,0,0,0,So,CD,GBOther,WBOther,SBOther}
+static const struct unidata st483[] = {
+{dd1938,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1939,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1940,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1941,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1942,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1943,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1944,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1945,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1946,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1947,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1948,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1949,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1950,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1951,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1952,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1953,0,0,0,So,CD,GBOther,WBKatakana,SBOther}
 };
 /* 3350-335F */
-static const struct unidata st463[] = {
-{dd1954,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1955,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1956,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1957,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1958,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1959,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1960,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd1961,0,0,0,So,CD,GBOther,WBOther,SBOther},
+static const struct unidata st484[] = {
+{dd1954,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1955,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1956,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1957,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1958,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1959,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1960,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
+{dd1961,0,0,0,So,CD,GBOther,WBKatakana,SBOther},
 {dd1962,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1963,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1964,0,0,0,So,CD,GBOther,WBOther,SBOther},
@@ -13718,7 +14232,7 @@ static const struct unidata st463[] = {
 {dd1969,0,0,0,So,CD,GBOther,WBOther,SBOther}
 };
 /* 3360-336F */
-static const struct unidata st464[] = {
+static const struct unidata st485[] = {
 {dd1970,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1971,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1972,0,0,0,So,CD,GBOther,WBOther,SBOther},
@@ -13737,7 +14251,7 @@ static const struct unidata st464[] = {
 {dd1985,0,0,0,So,CD,GBOther,WBOther,SBOther}
 };
 /* 3370-337F */
-static const struct unidata st465[] = {
+static const struct unidata st486[] = {
 {dd1986,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1987,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd1988,0,0,0,So,CD,GBOther,WBOther,SBOther},
@@ -13756,7 +14270,7 @@ static const struct unidata st465[] = {
 {dd2001,0,0,0,So,CD,GBOther,WBOther,SBOther}
 };
 /* 3380-338F */
-static const struct unidata st466[] = {
+static const struct unidata st487[] = {
 {dd2002,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd2003,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd2004,0,0,0,So,CD,GBOther,WBOther,SBOther},
@@ -13775,7 +14289,7 @@ static const struct unidata st466[] = {
 {dd2017,0,0,0,So,CD,GBOther,WBOther,SBOther}
 };
 /* 3390-339F */
-static const struct unidata st467[] = {
+static const struct unidata st488[] = {
 {dd2018,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd2019,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd2020,0,0,0,So,CD,GBOther,WBOther,SBOther},
@@ -13794,7 +14308,7 @@ static const struct unidata st467[] = {
 {dd2033,0,0,0,So,CD,GBOther,WBOther,SBOther}
 };
 /* 33A0-33AF */
-static const struct unidata st468[] = {
+static const struct unidata st489[] = {
 {dd2034,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd2035,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd2036,0,0,0,So,CD,GBOther,WBOther,SBOther},
@@ -13813,7 +14327,7 @@ static const struct unidata st468[] = {
 {dd2049,0,0,0,So,CD,GBOther,WBOther,SBOther}
 };
 /* 33B0-33BF */
-static const struct unidata st469[] = {
+static const struct unidata st490[] = {
 {dd2050,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd2051,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd2052,0,0,0,So,CD,GBOther,WBOther,SBOther},
@@ -13832,7 +14346,7 @@ static const struct unidata st469[] = {
 {dd2065,0,0,0,So,CD,GBOther,WBOther,SBOther}
 };
 /* 33C0-33CF */
-static const struct unidata st470[] = {
+static const struct unidata st491[] = {
 {dd2066,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd2067,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd2068,0,0,0,So,CD,GBOther,WBOther,SBOther},
@@ -13851,7 +14365,7 @@ static const struct unidata st470[] = {
 {dd2081,0,0,0,So,CD,GBOther,WBOther,SBOther}
 };
 /* 33D0-33DF */
-static const struct unidata st471[] = {
+static const struct unidata st492[] = {
 {dd2082,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd2083,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd2084,0,0,0,So,CD,GBOther,WBOther,SBOther},
@@ -13870,7 +14384,7 @@ static const struct unidata st471[] = {
 {dd2097,0,0,0,So,CD,GBOther,WBOther,SBOther}
 };
 /* 33E0-33EF */
-static const struct unidata st472[] = {
+static const struct unidata st493[] = {
 {dd2098,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd2099,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd2100,0,0,0,So,CD,GBOther,WBOther,SBOther},
@@ -13889,7 +14403,7 @@ static const struct unidata st472[] = {
 {dd2113,0,0,0,So,CD,GBOther,WBOther,SBOther}
 };
 /* 33F0-33FF */
-static const struct unidata st473[] = {
+static const struct unidata st494[] = {
 {dd2114,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd2115,0,0,0,So,CD,GBOther,WBOther,SBOther},
 {dd2116,0,0,0,So,CD,GBOther,WBOther,SBOther},
@@ -13908,7 +14422,7 @@ static const struct unidata st473[] = {
 {dd2129,0,0,0,So,CD,GBOther,WBOther,SBOther}
 };
 /* 4DB0-4DBF */
-static const struct unidata st474[] = {
+static const struct unidata st495[] = {
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
@@ -13926,16 +14440,8 @@ static const struct unidata st474[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
-/* 9FB0-9FBF */
-static const struct unidata st475[] = {
-{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+/* 9FC0-9FCF */
+static const struct unidata st496[] = {
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
@@ -13943,10 +14449,18 @@ static const struct unidata st475[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
 /* A010-A01F */
-static const struct unidata st476[] = {
+static const struct unidata st497[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
@@ -13964,92 +14478,149 @@ static const struct unidata st476[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter}
 };
-/* A710-A71F */
-static const struct unidata st477[] = {
-{0,0,0,0,Sk,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Sk,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Sk,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Sk,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Sk,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Sk,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Sk,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Lm,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Lm,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Lm,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Lm,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
-};
-/* A720-A72F */
-static const struct unidata st478[] = {
-{0,0,0,0,Sk,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Sk,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
-};
-/* A800-A80F */
-static const struct unidata st479[] = {
+/* A600-A60F */
+static const struct unidata st498[] = {
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Mc,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,9,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter}
+{0,0,0,0,Lm,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Po,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Po,0,GBOther,WBOther,SBSTerm},
+{0,0,0,0,Po,0,GBOther,WBOther,SBSTerm}
 };
-/* A820-A82F */
-static const struct unidata st480[] = {
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+/* A620-A62F */
+static const struct unidata st499[] = {
+{0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric},
+{0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric},
+{0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric},
+{0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric},
+{0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric},
+{0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric},
+{0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric},
+{0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric},
+{0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric},
+{0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Mc,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Mc,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
-{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
-{0,0,0,0,Mc,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
-/* A870-A87F */
-static const struct unidata st481[] = {
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+/* A640-A64F */
+static const struct unidata st500[] = {
+{0,dd4745,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,dd4746,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,dd4747,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,dd4748,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,dd4749,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,dd4750,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,dd4751,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,dd4752,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower}
+};
+/* A650-A65F */
+static const struct unidata st501[] = {
+{0,dd4753,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,dd4754,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,dd4755,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,dd4756,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,dd4757,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,dd4758,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,dd4759,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,dd4760,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower}
+};
+/* A660-A66F */
+static const struct unidata st502[] = {
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,dd4761,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,dd4762,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,dd4763,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,dd4764,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,dd4765,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,dd4766,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend}
+};
+/* A670-A67F */
+static const struct unidata st503[] = {
+{0,0,0,0,Me,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Me,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Me,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Po,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Po,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Po,0,GBOther,WBOther,SBSTerm},
-{0,0,0,0,Po,0,GBOther,WBOther,SBSTerm},
+{0,0,0,0,Lm,0,GBOther,WBALetter,SBOLetter}
+};
+/* A680-A68F */
+static const struct unidata st504[] = {
+{0,dd4767,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,dd4768,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,dd4769,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,dd4770,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,dd4771,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,dd4772,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,dd4773,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,dd4774,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower}
+};
+/* A690-A69F */
+static const struct unidata st505[] = {
+{0,dd4775,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,dd4776,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,dd4777,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,dd4778,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
@@ -14059,107 +14630,160 @@ static const struct unidata st481[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
-/* AC00-AC0F */
-static const struct unidata st482[] = {
-{0,0,0,0,Lo,0,GBLV,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter}
-};
-/* AC10-AC1F */
-static const struct unidata st483[] = {
-{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBLV,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter}
+/* A710-A71F */
+static const struct unidata st506[] = {
+{0,0,0,0,Sk,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Sk,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Sk,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Sk,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Sk,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Sk,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Sk,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Lm,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lm,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lm,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lm,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lm,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lm,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lm,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lm,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lm,0,GBOther,WBALetter,SBOLetter}
 };
-/* AC20-AC2F */
-static const struct unidata st484[] = {
-{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter}
+/* A720-A72F */
+static const struct unidata st507[] = {
+{0,0,0,0,Sk,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Sk,0,GBOther,WBOther,SBOther},
+{0,dd4779,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,dd4780,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,dd4781,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,dd4782,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,dd4783,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,dd4784,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,dd4785,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower}
 };
-/* AC30-AC3F */
-static const struct unidata st485[] = {
-{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBLV,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter}
+/* A730-A73F */
+static const struct unidata st508[] = {
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,dd4786,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,dd4787,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,dd4788,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,dd4789,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,dd4790,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,dd4791,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,dd4792,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower}
 };
-/* AC50-AC5F */
-static const struct unidata st486[] = {
-{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBLV,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter}
+/* A740-A74F */
+static const struct unidata st509[] = {
+{0,dd4793,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,dd4794,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,dd4795,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,dd4796,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,dd4797,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,dd4798,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,dd4799,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,dd4800,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower}
 };
-/* D7A0-D7AF */
-static const struct unidata st487[] = {
-{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
+/* A750-A75F */
+static const struct unidata st510[] = {
+{0,dd4801,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,dd4802,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,dd4803,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,dd4804,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,dd4805,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,dd4806,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,dd4807,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,dd4808,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower}
+};
+/* A760-A76F */
+static const struct unidata st511[] = {
+{0,dd4809,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,dd4810,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,dd4811,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,dd4812,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,dd4813,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,dd4814,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,dd4815,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,dd2130,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower}
+};
+/* A770-A77F */
+static const struct unidata st512[] = {
+{dd2130,0,0,0,Lm,CD,GBOther,WBALetter,SBLower},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,dd4816,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,dd4817,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,dd4818,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4819,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower}
+};
+/* A780-A78F */
+static const struct unidata st513[] = {
+{0,dd4820,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,dd4821,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,dd4822,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,dd4823,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,0,0,0,Lm,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Sk,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Sk,0,GBOther,WBOther,SBOther},
+{0,dd4824,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
+};
+/* A7F0-A7FF */
+static const struct unidata st514[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
@@ -14171,625 +14795,363 @@ static const struct unidata st487[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter}
 };
-/* D800-D80F */
-static const struct unidata st488[] = {
-{0,0,0,0,Cs,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cs,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cs,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cs,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cs,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cs,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cs,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cs,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cs,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cs,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cs,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cs,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cs,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cs,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cs,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cs,0,GBOther,WBOther,SBOther}
+/* A800-A80F */
+static const struct unidata st515[] = {
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,9,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter}
 };
-/* E000-E00F */
-static const struct unidata st489[] = {
-{0,0,0,0,Co,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Co,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Co,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Co,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Co,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Co,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Co,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Co,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Co,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Co,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Co,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Co,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Co,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Co,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Co,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Co,0,GBOther,WBOther,SBOther}
+/* A820-A82F */
+static const struct unidata st516[] = {
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
-/* F900-F90F */
-static const struct unidata st490[] = {
-{dd2130,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2131,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd1439,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2132,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2133,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2134,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2135,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd1493,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd1493,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2136,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd1447,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2137,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2138,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2139,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2140,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2141,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+/* A870-A87F */
+static const struct unidata st517[] = {
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Po,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Po,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Po,0,GBOther,WBOther,SBSTerm},
+{0,0,0,0,Po,0,GBOther,WBOther,SBSTerm},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
-/* F910-F91F */
-static const struct unidata st491[] = {
-{dd2142,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2143,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2144,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2145,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2146,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2147,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2148,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2149,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2150,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2151,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2152,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2153,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2154,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2155,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2156,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2157,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
-};
-/* F920-F92F */
-static const struct unidata st492[] = {
-{dd2158,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2159,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2160,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2161,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2162,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2163,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2164,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2165,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2166,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2167,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2168,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2169,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2170,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2171,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2172,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2173,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+/* A880-A88F */
+static const struct unidata st518[] = {
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter}
 };
-/* F930-F93F */
-static const struct unidata st493[] = {
-{dd2174,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2175,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2176,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2177,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd1405,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2178,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2179,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2180,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2181,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2182,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2183,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2184,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2185,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2186,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2187,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2188,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+/* A8B0-A8BF */
+static const struct unidata st519[] = {
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend}
 };
-/* F940-F94F */
-static const struct unidata st494[] = {
-{dd1478,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2189,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2190,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2191,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2192,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2193,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2194,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2195,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2196,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2197,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2198,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2199,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2200,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2201,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2202,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2203,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+/* A8C0-A8CF */
+static const struct unidata st520[] = {
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,9,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Po,0,GBOther,WBOther,SBSTerm},
+{0,0,0,0,Po,0,GBOther,WBOther,SBSTerm}
 };
-/* F950-F95F */
-static const struct unidata st495[] = {
-{dd2204,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2205,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2206,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2207,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2208,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2209,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2210,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2211,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2212,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2213,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2214,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2215,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2146,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2216,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2217,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2218,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+/* A920-A92F */
+static const struct unidata st521[] = {
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,220,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,220,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,220,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Po,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Po,0,GBOther,WBOther,SBSTerm}
 };
-/* F960-F96F */
-static const struct unidata st496[] = {
-{dd2219,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2220,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2221,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2222,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2223,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2224,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2225,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2226,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2227,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2228,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2229,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2230,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2231,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2232,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2233,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2234,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+/* A940-A94F */
+static const struct unidata st522[] = {
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend}
 };
-/* F970-F97F */
-static const struct unidata st497[] = {
-{dd2235,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd1441,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2236,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2237,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2238,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2239,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2240,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2241,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2242,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2243,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2244,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2245,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2246,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2247,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2248,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2249,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+/* A950-A95F */
+static const struct unidata st523[] = {
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,9,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Po,0,GBOther,WBOther,SBOther}
 };
-/* F980-F98F */
-static const struct unidata st498[] = {
-{dd2250,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd1318,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2251,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2252,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2253,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2254,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2255,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2256,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2257,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2258,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd1299,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2259,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2260,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2261,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2262,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2263,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+/* AA20-AA2F */
+static const struct unidata st524[] = {
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend}
 };
-/* F990-F99F */
-static const struct unidata st499[] = {
-{dd2264,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2265,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2266,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2267,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2268,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2269,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2270,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2271,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2272,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2273,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2274,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2275,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2276,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2277,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2278,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2279,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+/* AA30-AA3F */
+static const struct unidata st525[] = {
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
-/* F9A0-F9AF */
-static const struct unidata st500[] = {
-{dd2280,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2234,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2281,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2282,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2283,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2284,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2285,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2286,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2287,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2288,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2218,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2289,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2290,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2291,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2292,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2293,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
-};
-/* F9B0-F9BF */
-static const struct unidata st501[] = {
-{dd2294,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2295,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2296,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2297,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2298,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2299,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2300,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2301,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2302,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2303,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2304,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2305,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2306,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2307,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2308,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2146,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
-};
-/* F9C0-F9CF */
-static const struct unidata st502[] = {
-{dd2309,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2310,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2311,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2312,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd1492,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2313,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2314,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2315,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2316,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2317,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2318,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2319,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2320,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2321,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2322,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2323,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
-};
-/* F9D0-F9DF */
-static const struct unidata st503[] = {
-{dd2324,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd1765,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2325,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2326,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2327,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2328,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2329,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2330,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2331,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2332,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2333,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2220,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2334,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2335,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2336,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2337,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
-};
-/* F9E0-F9EF */
-static const struct unidata st504[] = {
-{dd2338,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2339,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2340,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2341,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2342,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2343,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2344,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2345,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2346,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd1446,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2347,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2348,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2349,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2350,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2351,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2352,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
-};
-/* F9F0-F9FF */
-static const struct unidata st505[] = {
-{dd2353,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2354,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2355,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2356,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2357,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2358,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2359,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd1397,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2360,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2361,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2362,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2363,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2364,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2365,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2366,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2367,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
-};
-/* FA00-FA0F */
-static const struct unidata st506[] = {
-{dd2368,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2369,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2370,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2371,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2372,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2373,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2374,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2375,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd1424,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2376,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd1427,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2377,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2378,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2379,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
-};
-/* FA10-FA1F */
-static const struct unidata st507[] = {
-{dd2380,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2381,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2382,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2383,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2384,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2385,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2386,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2387,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2388,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2389,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2390,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd1404,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
-};
-/* FA20-FA2F */
-static const struct unidata st508[] = {
-{dd2391,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2392,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2393,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2394,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2395,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2396,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2397,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2398,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+/* AA40-AA4F */
+static const struct unidata st526[] = {
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Mc,0,GBSpacingMark,WBExtend,SBExtend},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
-/* FA30-FA3F */
-static const struct unidata st509[] = {
-{dd2399,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{dd2400,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{dd2401,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{dd2402,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{dd2403,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{dd2404,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{dd2405,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{dd2406,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{dd2407,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{dd2408,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{dd2409,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{dd2410,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{dd1325,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{dd2411,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{dd2412,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{dd2413,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter}
-};
-/* FA40-FA4F */
-static const struct unidata st510[] = {
-{dd2414,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{dd2415,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{dd2416,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{dd2417,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{dd2418,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{dd2419,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{dd2420,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{dd2421,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{dd2422,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{dd2423,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{dd2424,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{dd2425,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{dd1770,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{dd2426,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{dd2427,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{dd2428,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter}
-};
-/* FA50-FA5F */
-static const struct unidata st511[] = {
-{dd2429,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{dd1774,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{dd2430,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{dd2431,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{dd2432,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{dd2433,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{dd2434,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{dd2270,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{dd2435,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{dd2436,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{dd2437,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{dd2438,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{dd2439,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{dd2440,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{dd2440,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{dd2441,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter}
-};
-/* FA60-FA6F */
-static const struct unidata st512[] = {
-{dd2442,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{dd2443,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{dd2444,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{dd2445,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{dd2446,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{dd2447,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{dd2448,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{dd2393,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{dd2449,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{dd2450,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{dd2451,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+/* AA50-AA5F */
+static const struct unidata st527[] = {
+{0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric},
+{0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric},
+{0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric},
+{0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric},
+{0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric},
+{0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric},
+{0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric},
+{0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric},
+{0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric},
+{0,0,0,0,Nd,0,GBOther,WBNumeric,SBNumeric},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
-};
-/* FA70-FA7F */
-static const struct unidata st513[] = {
-{dd2452,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2453,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2454,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2455,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2456,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2457,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2458,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2459,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2405,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2460,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2461,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2462,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2380,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2463,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2464,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2465,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+{0,0,0,0,Po,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Po,0,GBOther,WBOther,SBSTerm},
+{0,0,0,0,Po,0,GBOther,WBOther,SBSTerm},
+{0,0,0,0,Po,0,GBOther,WBOther,SBSTerm}
 };
-/* FA80-FA8F */
-static const struct unidata st514[] = {
-{dd2466,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2467,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2468,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2469,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2470,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2471,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2472,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2473,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2474,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2413,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2475,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2414,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2476,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2477,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2478,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2479,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+/* AC00-AC0F */
+static const struct unidata st528[] = {
+{0,0,0,0,Lo,0,GBLV,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter}
 };
-/* FA90-FA9F */
-static const struct unidata st515[] = {
-{dd2480,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2381,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2167,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2481,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2482,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd1358,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2235,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2318,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2483,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2484,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2421,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2485,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2422,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2486,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2487,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2488,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+/* AC10-AC1F */
+static const struct unidata st529[] = {
+{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBLV,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter}
 };
-/* FAA0-FAAF */
-static const struct unidata st516[] = {
-{dd2383,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2489,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2490,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2491,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2492,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2493,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2384,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2494,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2495,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2496,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2497,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2498,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2499,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2434,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2500,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2501,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+/* AC20-AC2F */
+static const struct unidata st530[] = {
+{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter}
 };
-/* FAB0-FABF */
-static const struct unidata st517[] = {
-{dd2270,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2502,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2438,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2503,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2504,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2505,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2506,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2507,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2443,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2508,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2392,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2509,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2444,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2216,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2510,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2445,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+/* AC30-AC3F */
+static const struct unidata st531[] = {
+{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBLV,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter}
 };
-/* FAC0-FACF */
-static const struct unidata st518[] = {
-{dd2511,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2447,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2512,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2513,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2514,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2515,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2516,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2449,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2389,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2517,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2450,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2518,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2451,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2519,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd1493,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2520,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+/* AC50-AC5F */
+static const struct unidata st532[] = {
+{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBLV,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter}
 };
-/* FAD0-FADF */
-static const struct unidata st519[] = {
-{dd2521,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2522,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2523,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2524,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2525,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2526,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2527,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2528,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2529,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2530,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+/* D7A0-D7AF */
+static const struct unidata st533[] = {
+{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBLVT,WBALetter,SBOLetter},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
-};
-/* FB00-FB0F */
-static const struct unidata st520[] = {
-{dd2531,dd2531,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd2532,dd2532,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd2533,dd2533,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd2534,dd2534,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd2535,dd2535,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd2536,dd2537,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd2537,dd2537,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
@@ -14800,854 +15162,626 @@ static const struct unidata st520[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
-/* FB10-FB1F */
-static const struct unidata st521[] = {
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{dd2538,dd2538,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd2539,dd2539,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd2540,dd2540,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd2541,dd2541,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd2542,dd2542,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{dd2543,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,26,Mn,0,GBExtend,WBExtend,SBExtend},
-{dd2544,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter}
+/* D800-D80F */
+static const struct unidata st534[] = {
+{0,0,0,0,Cs,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cs,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cs,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cs,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cs,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cs,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cs,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cs,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cs,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cs,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cs,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cs,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cs,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cs,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cs,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cs,0,GBOther,WBOther,SBOther}
 };
-/* FB20-FB2F */
-static const struct unidata st522[] = {
-{dd2545,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd1102,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd1105,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2546,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2547,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2548,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2549,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2550,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2551,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd1077,0,0,0,Sm,CD,GBOther,WBOther,SBOther},
-{dd2552,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{dd2553,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{dd2554,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{dd2555,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{dd2556,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{dd2557,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter}
+/* E000-E00F */
+static const struct unidata st535[] = {
+{0,0,0,0,Co,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Co,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Co,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Co,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Co,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Co,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Co,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Co,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Co,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Co,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Co,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Co,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Co,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Co,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Co,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Co,0,GBOther,WBOther,SBOther}
 };
-/* FB30-FB3F */
-static const struct unidata st523[] = {
-{dd2558,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{dd2559,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{dd2560,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{dd2561,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{dd2562,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{dd2563,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{dd2564,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{dd2565,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{dd2566,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{dd2567,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{dd2568,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{dd2569,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{dd2570,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
+/* F900-F90F */
+static const struct unidata st536[] = {
+{dd2131,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2132,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd1439,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2133,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2134,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2135,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2136,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd1493,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd1493,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2137,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd1447,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2138,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2139,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2140,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2141,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2142,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
 };
-/* FB40-FB4F */
-static const struct unidata st524[] = {
-{dd2571,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{dd2572,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{dd2573,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{dd2574,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{dd2575,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{dd2576,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{dd2577,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{dd2578,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{dd2579,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{dd2580,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{dd2581,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{dd2582,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{dd2583,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{dd2584,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
-};
-/* FB50-FB5F */
-static const struct unidata st525[] = {
-{dd2585,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2585,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2586,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2586,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2586,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2586,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2587,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2587,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2587,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2587,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2588,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2588,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2588,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2588,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2589,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2589,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
+/* F910-F91F */
+static const struct unidata st537[] = {
+{dd2143,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2144,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2145,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2146,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2147,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2148,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2149,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2150,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2151,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2152,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2153,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2154,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2155,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2156,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2157,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2158,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
 };
-/* FB60-FB6F */
-static const struct unidata st526[] = {
-{dd2589,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2589,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2590,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2590,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2590,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2590,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2591,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2591,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2591,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2591,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2592,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2592,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2592,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2592,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2593,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2593,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
+/* F920-F92F */
+static const struct unidata st538[] = {
+{dd2159,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2160,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2161,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2162,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2163,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2164,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2165,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2166,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2167,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2168,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2169,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2170,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2171,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2172,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2173,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2174,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
 };
-/* FB70-FB7F */
-static const struct unidata st527[] = {
-{dd2593,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2593,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2594,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2594,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2594,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2594,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2595,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2595,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2595,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2595,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2596,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2596,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2596,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2596,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2597,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2597,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
+/* F930-F93F */
+static const struct unidata st539[] = {
+{dd2175,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2176,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2177,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2178,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd1405,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2179,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2180,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2181,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2182,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2183,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2184,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2185,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2186,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2187,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2188,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2189,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
 };
-/* FB80-FB8F */
-static const struct unidata st528[] = {
-{dd2597,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2597,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2598,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2598,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2599,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2599,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2600,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2600,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2601,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2601,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2602,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2602,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2603,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2603,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2604,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2604,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
+/* F940-F94F */
+static const struct unidata st540[] = {
+{dd1478,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2190,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2191,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2192,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2193,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2194,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2195,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2196,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2197,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2198,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2199,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2200,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2201,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2202,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2203,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2204,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
 };
-/* FB90-FB9F */
-static const struct unidata st529[] = {
-{dd2604,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2604,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2605,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2605,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2605,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2605,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2606,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2606,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2606,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2606,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2607,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2607,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2607,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2607,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2608,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2608,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
+/* F950-F95F */
+static const struct unidata st541[] = {
+{dd2205,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2206,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2207,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2208,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2209,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2210,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2211,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2212,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2213,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2214,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2215,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2216,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2147,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2217,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2218,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2219,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
 };
-/* FBA0-FBAF */
-static const struct unidata st530[] = {
-{dd2609,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2609,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2609,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2609,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2610,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2610,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2611,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2611,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2611,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2611,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2612,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2612,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2612,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2612,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2613,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2613,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
+/* F960-F96F */
+static const struct unidata st542[] = {
+{dd2220,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2221,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2222,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2223,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2224,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2225,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2226,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2227,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2228,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2229,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2230,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2231,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2232,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2233,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2234,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2235,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
 };
-/* FBB0-FBBF */
-static const struct unidata st531[] = {
-{dd2614,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2614,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
+/* F970-F97F */
+static const struct unidata st543[] = {
+{dd2236,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd1441,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2237,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2238,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2239,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2240,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2241,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2242,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2243,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2244,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2245,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2246,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2247,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2248,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2249,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2250,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
 };
-/* FBD0-FBDF */
-static const struct unidata st532[] = {
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{dd2615,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2615,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2615,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2615,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2616,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2616,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2617,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2617,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2618,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2618,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2619,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2620,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2620,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
-};
-/* FBE0-FBEF */
-static const struct unidata st533[] = {
-{dd2621,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2621,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2622,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2622,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2623,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2623,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2623,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2623,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2624,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2624,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2625,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2625,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2626,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2626,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2627,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2627,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
+/* F980-F98F */
+static const struct unidata st544[] = {
+{dd2251,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd1318,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2252,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2253,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2254,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2255,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2256,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2257,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2258,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2259,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd1299,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2260,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2261,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2262,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2263,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2264,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
 };
-/* FBF0-FBFF */
-static const struct unidata st534[] = {
-{dd2628,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2628,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2629,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2629,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2630,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2630,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2631,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2631,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2631,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2632,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2632,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2632,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2633,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2633,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2633,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2633,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
+/* F990-F99F */
+static const struct unidata st545[] = {
+{dd2265,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2266,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2267,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2268,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2269,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2270,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2271,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2272,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2273,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2274,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2275,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2276,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2277,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2278,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2279,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2280,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
 };
-/* FC00-FC0F */
-static const struct unidata st535[] = {
-{dd2634,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2635,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2636,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2632,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2637,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2638,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2639,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2640,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2641,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2642,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2643,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2644,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2645,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2646,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2647,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2648,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
+/* F9A0-F9AF */
+static const struct unidata st546[] = {
+{dd2281,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2235,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2282,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2283,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2284,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2285,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2286,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2287,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2288,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2289,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2219,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2290,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2291,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2292,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2293,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2294,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
 };
-/* FC10-FC1F */
-static const struct unidata st536[] = {
-{dd2649,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2650,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2651,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2652,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2653,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2654,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2655,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2656,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2657,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2658,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2659,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2660,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2661,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2662,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2663,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2664,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
+/* F9B0-F9BF */
+static const struct unidata st547[] = {
+{dd2295,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2296,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2297,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2298,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2299,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2300,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2301,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2302,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2303,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2304,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2305,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2306,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2307,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2308,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2309,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2147,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
 };
-/* FC20-FC2F */
-static const struct unidata st537[] = {
-{dd2665,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2666,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2667,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2668,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2669,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2670,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2671,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2672,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2673,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2674,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2675,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2676,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2677,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2678,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2679,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2680,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
+/* F9C0-F9CF */
+static const struct unidata st548[] = {
+{dd2310,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2311,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2312,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2313,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd1492,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2314,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2315,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2316,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2317,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2318,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2319,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2320,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2321,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2322,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2323,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2324,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
 };
-/* FC30-FC3F */
-static const struct unidata st538[] = {
-{dd2681,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2682,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2683,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2684,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2685,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2686,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2687,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2688,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2689,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2690,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2691,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2692,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2693,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2694,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2695,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2696,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
+/* F9D0-F9DF */
+static const struct unidata st549[] = {
+{dd2325,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd1765,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2326,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2327,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2328,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2329,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2330,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2331,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2332,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2333,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2334,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2221,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2335,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2336,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2337,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2338,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
 };
-/* FC40-FC4F */
-static const struct unidata st539[] = {
-{dd2697,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2698,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2699,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2700,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2701,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2702,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2703,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2704,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2705,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2706,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2707,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2708,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2709,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2710,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2711,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2712,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
+/* F9E0-F9EF */
+static const struct unidata st550[] = {
+{dd2339,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2340,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2341,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2342,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2343,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2344,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2345,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2346,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2347,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd1446,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2348,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2349,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2350,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2351,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2352,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2353,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
 };
-/* FC50-FC5F */
-static const struct unidata st540[] = {
-{dd2713,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2714,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2715,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2716,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2717,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2718,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2719,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2720,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2721,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2722,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2723,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2724,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2725,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2726,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2727,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2728,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
-};
-/* FC60-FC6F */
-static const struct unidata st541[] = {
-{dd2729,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2730,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2731,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2732,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2733,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2734,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2636,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2735,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2632,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2637,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2736,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2737,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2641,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2738,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2642,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2643,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
+/* F9F0-F9FF */
+static const struct unidata st551[] = {
+{dd2354,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2355,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2356,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2357,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2358,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2359,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2360,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd1397,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2361,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2362,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2363,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2364,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2365,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2366,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2367,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2368,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
 };
-/* FC70-FC7F */
-static const struct unidata st542[] = {
-{dd2739,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2740,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2647,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2741,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2648,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2649,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2742,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2743,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2651,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2744,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2652,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2653,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2682,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2683,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2686,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2687,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
+/* FA00-FA0F */
+static const struct unidata st552[] = {
+{dd2369,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2370,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2371,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2372,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2373,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2374,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2375,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2376,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd1424,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2377,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd1427,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2378,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2379,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2380,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
 };
-/* FC80-FC8F */
-static const struct unidata st543[] = {
-{dd2688,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2692,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2693,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2694,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2695,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2699,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2700,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2701,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2745,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2705,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2746,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2747,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2711,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2748,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2712,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2713,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
+/* FA10-FA1F */
+static const struct unidata st553[] = {
+{dd2381,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2382,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2383,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2384,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2385,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2386,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2387,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2388,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2389,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2390,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2391,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd1404,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
 };
-/* FC90-FC9F */
-static const struct unidata st544[] = {
-{dd2726,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2749,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2750,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2721,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2751,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2722,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2723,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2634,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2635,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2752,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2636,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2753,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2638,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2639,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2640,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2641,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
+/* FA20-FA2F */
+static const struct unidata st554[] = {
+{dd2392,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2393,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2394,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2395,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2396,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2397,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2398,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2399,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
-/* FCA0-FCAF */
-static const struct unidata st545[] = {
-{dd2754,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2644,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2645,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2646,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2647,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2755,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2651,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2654,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2655,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2656,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2657,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2658,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2660,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2661,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2662,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2663,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
+/* FA30-FA3F */
+static const struct unidata st555[] = {
+{dd2400,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2401,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2402,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2403,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2404,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2405,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2406,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2407,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2408,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2409,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2410,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2411,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd1325,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2412,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2413,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2414,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
 };
-/* FCB0-FCBF */
-static const struct unidata st546[] = {
-{dd2664,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2665,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2756,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2666,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2667,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2668,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2669,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2670,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2671,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2673,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2674,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2675,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2676,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2677,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2678,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2679,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
+/* FA40-FA4F */
+static const struct unidata st556[] = {
+{dd2415,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2416,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2417,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2418,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2419,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2420,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2421,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2422,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2423,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2424,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2425,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2426,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd1770,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2427,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2428,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2429,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
 };
-/* FCC0-FCCF */
-static const struct unidata st547[] = {
-{dd2680,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2681,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2684,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2685,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2689,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2690,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2691,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2692,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2693,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2696,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2697,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2698,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2699,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2757,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2702,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2703,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
+/* FA50-FA5F */
+static const struct unidata st557[] = {
+{dd2430,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd1774,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2431,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2432,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2433,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2434,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2435,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2271,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2436,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2437,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2438,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2439,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2440,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2441,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2441,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2442,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
 };
-/* FCD0-FCDF */
-static const struct unidata st548[] = {
-{dd2704,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2705,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2708,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2709,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2710,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2711,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2758,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2714,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2715,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2759,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2718,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2719,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2720,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2721,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2760,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2636,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
+/* FA60-FA6F */
+static const struct unidata st558[] = {
+{dd2443,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2444,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2445,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2446,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2447,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2448,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2449,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2394,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2450,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2451,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2452,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
-/* FCE0-FCEF */
-static const struct unidata st549[] = {
-{dd2753,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2641,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2754,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2647,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2755,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2651,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2761,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2664,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2762,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2763,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2764,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2692,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2693,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2699,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2711,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2758,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
-};
-/* FCF0-FCFF */
-static const struct unidata st550[] = {
-{dd2721,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2760,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2765,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2766,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2767,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2768,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2769,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2770,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2771,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2772,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2773,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2774,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2775,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2776,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2777,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2778,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
+/* FA70-FA7F */
+static const struct unidata st559[] = {
+{dd2453,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2454,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2455,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2456,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2457,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2458,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2459,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2460,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2406,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2461,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2462,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2463,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2381,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2464,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2465,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2466,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
 };
-/* FD00-FD0F */
-static const struct unidata st551[] = {
-{dd2779,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2780,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2781,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2782,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2783,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2784,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2785,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2786,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2787,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2788,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2789,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2790,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2763,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2791,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2792,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2793,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
+/* FA80-FA8F */
+static const struct unidata st560[] = {
+{dd2467,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2468,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2469,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2470,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2471,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2472,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2473,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2474,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2475,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2414,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2476,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2415,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2477,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2478,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2479,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2480,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
 };
-/* FD10-FD1F */
-static const struct unidata st552[] = {
-{dd2794,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2768,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2769,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2770,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2771,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2772,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2773,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2774,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2775,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2776,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2777,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2778,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2779,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2780,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2781,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2782,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
+/* FA90-FA9F */
+static const struct unidata st561[] = {
+{dd2481,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2382,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2168,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2482,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2483,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd1358,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2236,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2319,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2484,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2485,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2422,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2486,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2423,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2487,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2488,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2489,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
 };
-/* FD20-FD2F */
-static const struct unidata st553[] = {
-{dd2783,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2784,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2785,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2786,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2787,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2788,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2789,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2790,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2763,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2791,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2792,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2793,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2794,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2788,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2789,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2790,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
+/* FAA0-FAAF */
+static const struct unidata st562[] = {
+{dd2384,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2490,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2491,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2492,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2493,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2494,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2385,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2495,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2496,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2497,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2498,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2499,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2500,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2435,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2501,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2502,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
 };
-/* FD30-FD3F */
-static const struct unidata st554[] = {
-{dd2763,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2762,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2764,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2672,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2661,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2662,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2663,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2788,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2789,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2790,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2672,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2673,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2795,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2795,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Ps,0,GBOther,WBOther,SBClose},
-{0,0,0,0,Pe,0,GBOther,WBOther,SBClose}
+/* FAB0-FABF */
+static const struct unidata st563[] = {
+{dd2271,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2503,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2439,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2504,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2505,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2506,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2507,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2508,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2444,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2509,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2393,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2510,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2445,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2217,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2511,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2446,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
 };
-/* FD50-FD5F */
-static const struct unidata st555[] = {
-{dd2796,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2797,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2797,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2798,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2799,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2800,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2801,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2802,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2803,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2803,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2804,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2805,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2806,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2807,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2808,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2809,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
+/* FAC0-FACF */
+static const struct unidata st564[] = {
+{dd2512,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2448,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2513,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2514,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2515,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2516,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2517,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2450,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2390,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2518,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2451,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2519,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2452,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2520,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd1493,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2521,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
 };
-/* FD60-FD6F */
-static const struct unidata st556[] = {
-{dd2809,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2810,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2811,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2811,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2812,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2812,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2813,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2814,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2814,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2815,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2816,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2816,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2817,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2817,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2818,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2819,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
+/* FAD0-FADF */
+static const struct unidata st565[] = {
+{dd2522,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2523,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2524,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2525,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2526,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2527,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2528,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2529,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2530,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2531,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
-/* FD70-FD7F */
-static const struct unidata st557[] = {
-{dd2819,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2820,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2820,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2821,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2822,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2823,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2824,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2824,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2825,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2826,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2827,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2828,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2829,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2829,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2830,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2831,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
-};
-/* FD80-FD8F */
-static const struct unidata st558[] = {
-{dd2832,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2833,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2834,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2835,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2835,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2836,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2836,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2837,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2837,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2838,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2839,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2840,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2841,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2842,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2843,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2844,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
-};
-/* FD90-FD9F */
-static const struct unidata st559[] = {
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{dd2845,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2846,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2847,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2848,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2849,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2850,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2850,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2851,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2852,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2853,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2854,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2854,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2855,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2856,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
-};
-/* FDA0-FDAF */
-static const struct unidata st560[] = {
-{dd2857,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2858,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2859,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2860,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2861,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2862,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2863,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2864,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2865,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2866,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2867,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2868,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2869,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2870,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2871,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2872,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
-};
-/* FDB0-FDBF */
-static const struct unidata st561[] = {
-{dd2873,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2874,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2875,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2876,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2830,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2832,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2877,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2878,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2879,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2880,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2881,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2882,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2881,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2879,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2883,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2884,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
-};
-/* FDC0-FDCF */
-static const struct unidata st562[] = {
-{dd2885,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2886,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2887,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2882,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2823,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2813,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2888,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2889,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+/* FB00-FB0F */
+static const struct unidata st566[] = {
+{dd2532,dd2532,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd2533,dd2533,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd2534,dd2534,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd2535,dd2535,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd2536,dd2536,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd2537,dd2538,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd2538,dd2538,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
-};
-/* FDF0-FDFF */
-static const struct unidata st563[] = {
-{dd2890,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2891,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2892,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2893,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2894,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2895,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2896,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2897,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2898,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2899,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2900,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2901,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2902,0,0,0,Sc,CD,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
-};
-/* FE00-FE0F */
-static const struct unidata st564[] = {
-{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
-{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
-{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
-{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
-{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
-{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
-{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
-{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
-{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
-{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
-{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
-{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
-{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
-{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
-{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
-{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend}
-};
-/* FE10-FE1F */
-static const struct unidata st565[] = {
-{dd2903,0,0,0,Po,CD,GBOther,WBMidNum,SBOther},
-{dd2904,0,0,0,Po,CD,GBOther,WBOther,SBOther},
-{dd2905,0,0,0,Po,CD,GBOther,WBOther,SBOther},
-{dd2906,0,0,0,Po,CD,GBOther,WBMidNum,SBOther},
-{dd309,0,0,0,Po,CD,GBOther,WBMidNum,SBOther},
-{dd2907,0,0,0,Po,CD,GBOther,WBOther,SBOther},
-{dd2908,0,0,0,Po,CD,GBOther,WBOther,SBOther},
-{dd2909,0,0,0,Ps,CD,GBOther,WBOther,SBClose},
-{dd2910,0,0,0,Pe,CD,GBOther,WBOther,SBClose},
-{dd2911,0,0,0,Po,CD,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
@@ -15655,814 +15789,795 @@ static const struct unidata st565[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
-/* FE20-FE2F */
-static const struct unidata st566[] = {
-{0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
-{0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
-{0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
-{0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+/* FB10-FB1F */
+static const struct unidata st567[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{dd2539,dd2539,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd2540,dd2540,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd2541,dd2541,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd2542,dd2542,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd2543,dd2543,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
-};
-/* FE30-FE3F */
-static const struct unidata st567[] = {
-{dd2912,0,0,0,Po,CD,GBOther,WBOther,SBOther},
-{dd2913,0,0,0,Pd,CD,GBOther,WBOther,SBOther},
-{dd2914,0,0,0,Pd,CD,GBOther,WBOther,SBOther},
-{dd2915,0,0,0,Pc,CD,GBOther,WBExtendNumLet,SBOther},
-{dd2915,0,0,0,Pc,CD,GBOther,WBExtendNumLet,SBOther},
-{dd1080,0,0,0,Ps,CD,GBOther,WBOther,SBClose},
-{dd1081,0,0,0,Pe,CD,GBOther,WBOther,SBClose},
-{dd2916,0,0,0,Ps,CD,GBOther,WBOther,SBClose},
-{dd2917,0,0,0,Pe,CD,GBOther,WBOther,SBClose},
-{dd2918,0,0,0,Ps,CD,GBOther,WBOther,SBClose},
-{dd2919,0,0,0,Pe,CD,GBOther,WBOther,SBClose},
-{dd2920,0,0,0,Ps,CD,GBOther,WBOther,SBClose},
-{dd2921,0,0,0,Pe,CD,GBOther,WBOther,SBClose},
-{dd2922,0,0,0,Ps,CD,GBOther,WBOther,SBClose},
-{dd2923,0,0,0,Pe,CD,GBOther,WBOther,SBClose},
-{dd1191,0,0,0,Ps,CD,GBOther,WBOther,SBClose}
+{dd2544,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,26,Mn,0,GBExtend,WBExtend,SBExtend},
+{dd2545,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter}
 };
-/* FE40-FE4F */
+/* FB20-FB2F */
 static const struct unidata st568[] = {
-{dd1192,0,0,0,Pe,CD,GBOther,WBOther,SBClose},
-{dd2924,0,0,0,Ps,CD,GBOther,WBOther,SBClose},
-{dd2925,0,0,0,Pe,CD,GBOther,WBOther,SBClose},
-{dd2926,0,0,0,Ps,CD,GBOther,WBOther,SBClose},
-{dd2927,0,0,0,Pe,CD,GBOther,WBOther,SBClose},
-{0,0,0,0,Po,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Po,0,GBOther,WBOther,SBOther},
-{dd2928,0,0,0,Ps,CD,GBOther,WBOther,SBClose},
-{dd2929,0,0,0,Pe,CD,GBOther,WBOther,SBClose},
-{dd2930,0,0,0,Po,CD,GBOther,WBOther,SBOther},
-{dd2930,0,0,0,Po,CD,GBOther,WBOther,SBOther},
-{dd2930,0,0,0,Po,CD,GBOther,WBOther,SBOther},
-{dd2930,0,0,0,Po,CD,GBOther,WBOther,SBOther},
-{dd2915,0,0,0,Pc,CD,GBOther,WBExtendNumLet,SBOther},
-{dd2915,0,0,0,Pc,CD,GBOther,WBExtendNumLet,SBOther},
-{dd2915,0,0,0,Pc,CD,GBOther,WBExtendNumLet,SBOther}
+{dd2546,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd1102,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd1105,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2547,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2548,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2549,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2550,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2551,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2552,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd1077,0,0,0,Sm,CD,GBOther,WBOther,SBOther},
+{dd2553,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{dd2554,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{dd2555,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{dd2556,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{dd2557,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{dd2558,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter}
 };
-/* FE50-FE5F */
+/* FB30-FB3F */
 static const struct unidata st569[] = {
-{dd2903,0,0,0,Po,CD,GBOther,WBOther,SBOther},
-{dd2904,0,0,0,Po,CD,GBOther,WBOther,SBOther},
-{dd1057,0,0,0,Po,CD,GBOther,WBOther,SBSTerm},
+{dd2559,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{dd2560,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{dd2561,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{dd2562,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{dd2563,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{dd2564,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{dd2565,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{dd309,0,0,0,Po,CD,GBOther,WBOther,SBOther},
-{dd2906,0,0,0,Po,CD,GBOther,WBOther,SBOther},
-{dd2908,0,0,0,Po,CD,GBOther,WBOther,SBSTerm},
-{dd2907,0,0,0,Po,CD,GBOther,WBOther,SBSTerm},
-{dd2913,0,0,0,Pd,CD,GBOther,WBOther,SBOther},
-{dd1080,0,0,0,Ps,CD,GBOther,WBOther,SBClose},
-{dd1081,0,0,0,Pe,CD,GBOther,WBOther,SBClose},
-{dd2916,0,0,0,Ps,CD,GBOther,WBOther,SBClose},
-{dd2917,0,0,0,Pe,CD,GBOther,WBOther,SBClose},
-{dd2918,0,0,0,Ps,CD,GBOther,WBOther,SBClose},
-{dd2919,0,0,0,Pe,CD,GBOther,WBOther,SBClose},
-{dd2931,0,0,0,Po,CD,GBOther,WBOther,SBOther}
+{dd2566,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{dd2567,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{dd2568,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{dd2569,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{dd2570,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{dd2571,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
-/* FE60-FE6F */
+/* FB40-FB4F */
 static const struct unidata st570[] = {
-{dd2932,0,0,0,Po,CD,GBOther,WBOther,SBOther},
-{dd2933,0,0,0,Po,CD,GBOther,WBOther,SBOther},
-{dd1077,0,0,0,Sm,CD,GBOther,WBOther,SBOther},
-{dd2934,0,0,0,Pd,CD,GBOther,WBOther,SBOther},
-{dd2935,0,0,0,Sm,CD,GBOther,WBOther,SBOther},
-{dd2936,0,0,0,Sm,CD,GBOther,WBOther,SBOther},
-{dd1079,0,0,0,Sm,CD,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{dd2937,0,0,0,Po,CD,GBOther,WBOther,SBOther},
-{dd2938,0,0,0,Sc,CD,GBOther,WBOther,SBOther},
-{dd2939,0,0,0,Po,CD,GBOther,WBOther,SBOther},
-{dd2940,0,0,0,Po,CD,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{dd2572,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{dd2573,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{dd2574,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{dd2575,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
+{dd2576,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{dd2577,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{dd2578,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{dd2579,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{dd2580,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{dd2581,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{dd2582,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{dd2583,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{dd2584,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{dd2585,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
 };
-/* FE70-FE7F */
+/* FB50-FB5F */
 static const struct unidata st571[] = {
-{dd2941,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2942,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2943,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{dd2944,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{dd2945,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2946,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2947,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2948,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2949,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2950,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2951,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2952,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2953,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2954,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
+{dd2586,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2586,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2587,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2587,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2587,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2587,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2588,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2588,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2588,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2588,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2589,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2589,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2589,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2589,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2590,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2590,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
 };
-/* FE80-FE8F */
+/* FB60-FB6F */
 static const struct unidata st572[] = {
-{dd2955,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2956,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2956,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2957,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2957,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2958,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2958,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2959,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2959,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2960,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2960,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2960,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2960,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2961,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2961,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2962,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
+{dd2590,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2590,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2591,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2591,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2591,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2591,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2592,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2592,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2592,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2592,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2593,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2593,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2593,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2593,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2594,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2594,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
 };
-/* FE90-FE9F */
+/* FB70-FB7F */
 static const struct unidata st573[] = {
-{dd2962,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2962,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2962,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2963,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2963,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2964,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2964,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2964,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2964,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2965,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2965,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2965,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2965,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2966,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2966,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2966,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
+{dd2594,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2594,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2595,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2595,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2595,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2595,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2596,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2596,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2596,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2596,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2597,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2597,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2597,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2597,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2598,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2598,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
 };
-/* FEA0-FEAF */
+/* FB80-FB8F */
 static const struct unidata st574[] = {
-{dd2966,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2967,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2967,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2967,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2967,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2968,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2968,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2968,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2968,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2969,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2969,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2970,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2970,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2971,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2971,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2972,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
+{dd2598,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2598,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2599,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2599,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2600,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2600,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2601,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2601,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2602,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2602,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2603,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2603,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2604,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2604,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2605,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2605,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
 };
-/* FEB0-FEBF */
+/* FB90-FB9F */
 static const struct unidata st575[] = {
-{dd2972,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2973,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2973,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2973,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2973,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2974,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2974,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2974,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2974,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2975,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2975,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2975,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2975,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2976,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2976,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2976,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
+{dd2605,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2605,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2606,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2606,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2606,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2606,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2607,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2607,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2607,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2607,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2608,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2608,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2608,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2608,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2609,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2609,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
 };
-/* FEC0-FECF */
+/* FBA0-FBAF */
 static const struct unidata st576[] = {
-{dd2976,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2977,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2977,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2977,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2977,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2978,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2978,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2978,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2978,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2979,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2979,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2979,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2979,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2980,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2980,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2980,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
+{dd2610,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2610,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2610,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2610,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2611,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2611,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2612,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2612,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2612,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2612,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2613,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2613,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2613,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2613,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2614,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2614,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
 };
-/* FED0-FEDF */
+/* FBB0-FBBF */
 static const struct unidata st577[] = {
-{dd2980,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2981,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2981,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2981,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2981,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2982,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2982,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2982,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2982,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2983,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2983,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2983,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2983,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2984,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2984,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2984,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
+{dd2615,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2615,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
-/* FEE0-FEEF */
+/* FBD0-FBDF */
 static const struct unidata st578[] = {
-{dd2984,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2985,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2985,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2985,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2985,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2986,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2986,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2986,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2986,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2987,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2987,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2987,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2987,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2988,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2988,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2624,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{dd2616,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2616,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2616,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2616,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2617,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2617,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2618,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2618,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2619,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2619,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2620,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2621,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2621,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
 };
-/* FEF0-FEFF */
+/* FBE0-FBEF */
 static const struct unidata st579[] = {
+{dd2622,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2622,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2623,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2623,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {dd2624,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2989,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2989,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2989,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2989,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2990,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2990,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2991,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2991,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2992,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2992,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2993,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd2993,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cf,0,GBControl,WBFormat,SBFormat}
+{dd2624,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2624,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2624,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2625,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2625,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2626,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2626,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2627,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2627,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2628,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2628,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
 };
-/* FF00-FF0F */
+/* FBF0-FBFF */
 static const struct unidata st580[] = {
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{dd2907,0,0,0,Po,CD,GBOther,WBOther,SBSTerm},
-{dd2994,0,0,0,Po,CD,GBOther,WBOther,SBOther},
-{dd2931,0,0,0,Po,CD,GBOther,WBOther,SBOther},
-{dd2938,0,0,0,Sc,CD,GBOther,WBOther,SBOther},
-{dd2939,0,0,0,Po,CD,GBOther,WBOther,SBOther},
-{dd2932,0,0,0,Po,CD,GBOther,WBOther,SBOther},
-{dd2995,0,0,0,Po,CD,GBOther,WBOther,SBOther},
-{dd1080,0,0,0,Ps,CD,GBOther,WBOther,SBClose},
-{dd1081,0,0,0,Pe,CD,GBOther,WBOther,SBClose},
-{dd2933,0,0,0,Po,CD,GBOther,WBOther,SBOther},
-{dd1077,0,0,0,Sm,CD,GBOther,WBOther,SBOther},
-{dd2903,0,0,0,Po,CD,GBOther,WBOther,SBOther},
-{dd2934,0,0,0,Pd,CD,GBOther,WBOther,SBOther},
-{dd1057,0,0,0,Po,CD,GBOther,WBOther,SBSTerm},
-{dd2996,0,0,0,Po,CD,GBOther,WBOther,SBOther}
+{dd2629,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2629,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2630,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2630,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2631,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2631,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2632,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2632,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2632,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2633,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2633,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2633,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2634,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2634,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2634,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2634,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
 };
-/* FF10-FF1F */
+/* FC00-FC0F */
 static const struct unidata st581[] = {
-{dd1070,0,0,0,Nd,CD,GBOther,WBOther,SBOther},
-{dd9,0,0,0,Nd,CD,GBOther,WBOther,SBOther},
-{dd4,0,0,0,Nd,CD,GBOther,WBOther,SBOther},
-{dd5,0,0,0,Nd,CD,GBOther,WBOther,SBOther},
-{dd1071,0,0,0,Nd,CD,GBOther,WBOther,SBOther},
-{dd1072,0,0,0,Nd,CD,GBOther,WBOther,SBOther},
-{dd1073,0,0,0,Nd,CD,GBOther,WBOther,SBOther},
-{dd1074,0,0,0,Nd,CD,GBOther,WBOther,SBOther},
-{dd1075,0,0,0,Nd,CD,GBOther,WBOther,SBOther},
-{dd1076,0,0,0,Nd,CD,GBOther,WBOther,SBOther},
-{dd2906,0,0,0,Po,CD,GBOther,WBOther,SBOther},
-{dd309,0,0,0,Po,CD,GBOther,WBOther,SBOther},
-{dd2935,0,0,0,Sm,CD,GBOther,WBOther,SBOther},
-{dd1079,0,0,0,Sm,CD,GBOther,WBOther,SBOther},
-{dd2936,0,0,0,Sm,CD,GBOther,WBOther,SBOther},
-{dd2908,0,0,0,Po,CD,GBOther,WBOther,SBSTerm}
+{dd2635,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2636,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2637,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2633,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2638,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2639,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2640,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2641,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2642,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2643,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2644,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2645,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2646,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2647,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2648,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2649,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
 };
-/* FF20-FF2F */
+/* FC10-FC1F */
 static const struct unidata st582[] = {
-{dd2940,0,0,0,Po,CD,GBOther,WBOther,SBOther},
-{dd491,dd4728,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd493,dd4729,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd1086,dd4730,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd494,dd4731,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd495,dd4732,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd1101,dd4733,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd497,dd4734,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd498,dd4735,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd499,dd4736,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd500,dd4737,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd501,dd4738,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd502,dd4739,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd503,dd4740,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd504,dd4741,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd505,dd4742,0,0,Lu,CD,GBOther,WBALetter,SBUpper}
+{dd2650,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2651,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2652,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2653,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2654,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2655,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2656,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2657,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2658,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2659,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2660,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2661,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2662,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2663,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2664,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2665,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
 };
-/* FF30-FF3F */
+/* FC20-FC2F */
 static const struct unidata st583[] = {
-{dd507,dd4743,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd1094,dd4744,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd508,dd4745,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd1270,dd4746,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd509,dd4747,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd510,dd4748,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd1126,dd4749,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd511,dd4750,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd1131,dd4751,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd1271,dd4752,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd1098,dd4753,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd2928,0,0,0,Ps,CD,GBOther,WBOther,SBClose},
-{dd2937,0,0,0,Po,CD,GBOther,WBOther,SBOther},
-{dd2929,0,0,0,Pe,CD,GBOther,WBOther,SBClose},
-{dd2997,0,0,0,Sk,CD,GBOther,WBOther,SBOther},
-{dd2915,0,0,0,Pc,CD,GBOther,WBExtendNumLet,SBOther}
+{dd2666,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2667,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2668,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2669,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2670,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2671,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2672,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2673,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2674,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2675,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2676,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2677,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2678,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2679,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2680,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2681,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
 };
-/* FF40-FF4F */
+/* FC30-FC3F */
 static const struct unidata st584[] = {
-{dd1040,0,0,0,Sk,CD,GBOther,WBOther,SBOther},
-{dd2,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd515,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd541,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd516,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd517,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd544,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd521,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd284,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd538,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd286,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd522,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd300,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd523,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd1082,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd10,0,0,0,Ll,CD,GBOther,WBALetter,SBLower}
+{dd2682,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2683,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2684,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2685,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2686,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2687,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2688,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2689,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2690,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2691,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2692,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2693,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2694,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2695,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2696,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2697,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
 };
-/* FF50-FF5F */
+/* FC40-FC4F */
 static const struct unidata st585[] = {
-{dd528,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd1272,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd287,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd180,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd529,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd530,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd533,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd291,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd301,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd292,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd571,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd2916,0,0,0,Ps,CD,GBOther,WBOther,SBClose},
-{dd2998,0,0,0,Sm,CD,GBOther,WBOther,SBOther},
-{dd2917,0,0,0,Pe,CD,GBOther,WBOther,SBClose},
-{dd2999,0,0,0,Sm,CD,GBOther,WBOther,SBOther},
-{dd3000,0,0,0,Ps,CD,GBOther,WBOther,SBClose}
+{dd2698,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2699,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2700,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2701,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2702,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2703,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2704,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2705,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2706,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2707,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2708,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2709,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2710,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2711,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2712,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2713,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
 };
-/* FF60-FF6F */
+/* FC50-FC5F */
 static const struct unidata st586[] = {
-{dd3001,0,0,0,Pe,CD,GBOther,WBOther,SBClose},
-{dd2905,0,0,0,Po,CD,GBOther,WBOther,SBSTerm},
-{dd2924,0,0,0,Ps,CD,GBOther,WBOther,SBClose},
-{dd2925,0,0,0,Pe,CD,GBOther,WBOther,SBClose},
-{dd2904,0,0,0,Po,CD,GBOther,WBOther,SBOther},
-{dd3002,0,0,0,Po,CD,GBOther,WBOther,SBOther},
-{dd1873,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
-{dd3003,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
-{dd3004,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
-{dd3005,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
-{dd3006,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
-{dd3007,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
-{dd3008,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
-{dd3009,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
-{dd3010,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
-{dd3011,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter}
+{dd2714,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2715,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2716,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2717,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2718,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2719,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2720,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2721,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2722,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2723,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2724,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2725,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2726,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2727,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2728,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2729,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
 };
-/* FF70-FF7F */
+/* FC60-FC6F */
 static const struct unidata st587[] = {
-{dd3012,0,0,0,Lm,CD,GBOther,WBKatakana,SBOLetter},
-{dd1827,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
-{dd1828,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
-{dd1829,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
-{dd1830,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
-{dd1831,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
-{dd1832,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
-{dd1833,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
-{dd1834,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
-{dd1835,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
-{dd1836,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
-{dd1837,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
-{dd1838,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
-{dd1839,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
-{dd1840,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
-{dd1841,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter}
+{dd2730,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2731,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2732,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2733,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2734,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2735,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2637,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2736,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2633,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2638,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2737,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2738,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2642,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2739,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2643,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2644,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
 };
-/* FF80-FF8F */
+/* FC70-FC7F */
 static const struct unidata st588[] = {
-{dd1842,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
-{dd1843,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
-{dd1844,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
-{dd1845,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
-{dd1846,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
-{dd1847,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
-{dd1848,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
-{dd1849,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
-{dd1850,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
-{dd1851,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
-{dd1852,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
-{dd1853,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
-{dd1854,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
-{dd1855,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
-{dd1856,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
-{dd1857,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter}
+{dd2740,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2741,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2648,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2742,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2649,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2650,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2743,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2744,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2652,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2745,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2653,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2654,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2683,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2684,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2687,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2688,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
 };
-/* FF90-FF9F */
+/* FC80-FC8F */
 static const struct unidata st589[] = {
-{dd1858,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
-{dd1859,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
-{dd1860,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
-{dd1861,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
-{dd1862,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
-{dd1863,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
-{dd1864,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
-{dd1865,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
-{dd1866,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
-{dd1867,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
-{dd1868,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
-{dd1869,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
-{dd1870,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
-{dd3013,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
-{dd3014,0,0,0,Lm,CD,GBOther,WBKatakana,SBOLetter},
-{dd3015,0,0,0,Lm,CD,GBOther,WBKatakana,SBOLetter}
-};
-/* FFA0-FFAF */
-static const struct unidata st590[] = {
-{dd3016,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd3017,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd3018,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd3019,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd3020,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd3021,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd3022,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd3023,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd3024,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd3025,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd3026,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd3027,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd3028,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd3029,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd3030,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd3031,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
+{dd2689,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2693,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2694,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2695,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2696,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2700,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2701,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2702,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2746,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2706,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2747,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2748,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2712,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2749,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2713,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2714,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
 };
-/* FFB0-FFBF */
+/* FC90-FC9F */
+static const struct unidata st590[] = {
+{dd2727,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2750,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2751,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2722,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2752,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2723,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2724,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2635,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2636,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2753,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2637,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2754,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2639,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2640,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2641,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2642,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
+};
+/* FCA0-FCAF */
 static const struct unidata st591[] = {
-{dd3032,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd3033,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd3034,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd3035,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd3036,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd3037,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd3038,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd3039,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd3040,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd3041,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd3042,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd3043,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd3044,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd3045,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd3046,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
+{dd2755,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2645,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2646,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2647,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2648,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2756,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2652,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2655,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2656,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2657,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2658,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2659,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2661,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2662,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2663,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2664,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
 };
-/* FFC0-FFCF */
+/* FCB0-FCBF */
 static const struct unidata st592[] = {
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{dd3047,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd3048,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd3049,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd3050,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd3051,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd3052,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{dd3053,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd3054,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd3055,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd3056,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd3057,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd3058,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
+{dd2665,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2666,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2757,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2667,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2668,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2669,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2670,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2671,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2672,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2674,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2675,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2676,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2677,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2678,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2679,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2680,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
 };
-/* FFD0-FFDF */
+/* FCC0-FCCF */
 static const struct unidata st593[] = {
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{dd3059,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd3060,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd3061,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd3062,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd3063,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd3064,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{dd3065,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd3066,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{dd3067,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
+{dd2681,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2682,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2685,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2686,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2690,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2691,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2692,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2693,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2694,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2697,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2698,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2699,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2700,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2758,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2703,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2704,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
 };
-/* FFE0-FFEF */
+/* FCD0-FCDF */
 static const struct unidata st594[] = {
-{dd3068,0,0,0,Sc,CD,GBOther,WBOther,SBOther},
-{dd3069,0,0,0,Sc,CD,GBOther,WBOther,SBOther},
-{dd3070,0,0,0,Sm,CD,GBOther,WBOther,SBOther},
-{dd3071,0,0,0,Sk,CD,GBOther,WBOther,SBOther},
-{dd3072,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd3073,0,0,0,Sc,CD,GBOther,WBOther,SBOther},
-{dd3074,0,0,0,Sc,CD,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{dd3075,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd3076,0,0,0,Sm,CD,GBOther,WBOther,SBOther},
-{dd3077,0,0,0,Sm,CD,GBOther,WBOther,SBOther},
-{dd3078,0,0,0,Sm,CD,GBOther,WBOther,SBOther},
-{dd3079,0,0,0,Sm,CD,GBOther,WBOther,SBOther},
-{dd3080,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{dd3081,0,0,0,So,CD,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
+{dd2705,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2706,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2709,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2710,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2711,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2712,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2759,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2715,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2716,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2760,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2719,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2720,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2721,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2722,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2761,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2637,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
 };
-/* FFF0-FFFF */
+/* FCE0-FCEF */
 static const struct unidata st595[] = {
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cf,0,GBControl,WBFormat,SBFormat},
-{0,0,0,0,Cf,0,GBControl,WBFormat,SBFormat},
-{0,0,0,0,Cf,0,GBControl,WBFormat,SBFormat},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
+{dd2754,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2642,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2755,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2648,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2756,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2652,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2762,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2665,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2763,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2764,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2765,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2693,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2694,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2700,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2712,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2759,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
 };
-/* 10000-1000F */
+/* FCF0-FCFF */
 static const struct unidata st596[] = {
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter}
+{dd2722,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2761,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2766,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2767,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2768,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2769,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2770,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2771,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2772,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2773,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2774,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2775,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2776,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2777,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2778,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2779,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
 };
-/* 10030-1003F */
+/* FD00-FD0F */
 static const struct unidata st597[] = {
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter}
-};
-/* 10100-1010F */
-static const struct unidata st598[] = {
-{0,0,0,0,Po,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Po,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,No,0,GBOther,WBOther,SBOther},
-{0,0,0,0,No,0,GBOther,WBOther,SBOther},
-{0,0,0,0,No,0,GBOther,WBOther,SBOther},
-{0,0,0,0,No,0,GBOther,WBOther,SBOther},
-{0,0,0,0,No,0,GBOther,WBOther,SBOther},
-{0,0,0,0,No,0,GBOther,WBOther,SBOther},
-{0,0,0,0,No,0,GBOther,WBOther,SBOther},
-{0,0,0,0,No,0,GBOther,WBOther,SBOther},
-{0,0,0,0,No,0,GBOther,WBOther,SBOther}
+{dd2780,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2781,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2782,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2783,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2784,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2785,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2786,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2787,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2788,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2789,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2790,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2791,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2764,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2792,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2793,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2794,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
 };
-/* 10130-1013F */
+/* FD10-FD1F */
+static const struct unidata st598[] = {
+{dd2795,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2769,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2770,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2771,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2772,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2773,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2774,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2775,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2776,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2777,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2778,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2779,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2780,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2781,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2782,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2783,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
+};
+/* FD20-FD2F */
 static const struct unidata st599[] = {
-{0,0,0,0,No,0,GBOther,WBOther,SBOther},
-{0,0,0,0,No,0,GBOther,WBOther,SBOther},
-{0,0,0,0,No,0,GBOther,WBOther,SBOther},
-{0,0,0,0,No,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther}
+{dd2784,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2785,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2786,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2787,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2788,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2789,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2790,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2791,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2764,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2792,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2793,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2794,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2795,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2789,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2790,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2791,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
 };
-/* 10140-1014F */
+/* FD30-FD3F */
 static const struct unidata st600[] = {
-{0,0,0,0,Nl,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Nl,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Nl,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Nl,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Nl,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Nl,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Nl,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Nl,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Nl,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Nl,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Nl,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Nl,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Nl,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Nl,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Nl,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Nl,0,GBOther,WBALetter,SBOLetter}
+{dd2764,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2763,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2765,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2673,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2662,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2663,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2664,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2789,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2790,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2791,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2673,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2674,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2796,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2796,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Ps,0,GBOther,WBOther,SBClose},
+{0,0,0,0,Pe,0,GBOther,WBOther,SBClose}
 };
-/* 10170-1017F */
+/* FD50-FD5F */
 static const struct unidata st601[] = {
-{0,0,0,0,Nl,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Nl,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Nl,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Nl,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Nl,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,No,0,GBOther,WBOther,SBOther},
-{0,0,0,0,No,0,GBOther,WBOther,SBOther},
-{0,0,0,0,No,0,GBOther,WBOther,SBOther},
-{0,0,0,0,No,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther}
+{dd2797,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2798,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2798,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2799,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2800,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2801,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2802,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2803,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2804,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2804,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2805,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2806,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2807,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2808,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2809,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2810,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
 };
-/* 10180-1018F */
+/* FD60-FD6F */
 static const struct unidata st602[] = {
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,No,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
+{dd2810,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2811,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2812,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2812,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2813,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2813,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2814,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2815,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2815,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2816,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2817,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2817,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2818,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2818,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2819,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2820,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
 };
-/* 10310-1031F */
+/* FD70-FD7F */
 static const struct unidata st603[] = {
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
+{dd2820,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2821,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2821,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2822,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2823,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2824,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2825,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2825,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2826,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2827,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2828,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2829,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2830,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2830,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2831,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2832,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
 };
-/* 10320-1032F */
+/* FD80-FD8F */
 static const struct unidata st604[] = {
-{0,0,0,0,No,0,GBOther,WBOther,SBOther},
-{0,0,0,0,No,0,GBOther,WBOther,SBOther},
-{0,0,0,0,No,0,GBOther,WBOther,SBOther},
-{0,0,0,0,No,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
+{dd2833,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2834,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2835,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2836,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2836,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2837,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2837,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2838,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2838,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2839,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2840,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2841,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2842,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2843,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2844,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2845,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
 };
-/* 10340-1034F */
+/* FD90-FD9F */
 static const struct unidata st605[] = {
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Nl,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Nl,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
+{dd2846,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2847,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2848,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2849,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2850,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2851,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2851,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2852,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2853,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2854,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2855,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2855,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2856,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2857,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
 };
-/* 10390-1039F */
+/* FDA0-FDAF */
 static const struct unidata st606[] = {
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Po,0,GBOther,WBOther,SBOther}
+{dd2858,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2859,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2860,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2861,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2862,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2863,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2864,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2865,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2866,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2867,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2868,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2869,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2870,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2871,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2872,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2873,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
 };
-/* 103C0-103CF */
+/* FDB0-FDBF */
 static const struct unidata st607[] = {
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter}
+{dd2874,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2875,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2876,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2877,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2831,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2833,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2878,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2879,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2880,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2881,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2882,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2883,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2882,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2880,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2884,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2885,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
 };
-/* 103D0-103DF */
+/* FDC0-FDCF */
 static const struct unidata st608[] = {
-{0,0,0,0,Po,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Nl,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Nl,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Nl,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Nl,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Nl,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{dd2886,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2887,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2888,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2883,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2824,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2814,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2889,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2890,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
@@ -16472,469 +16587,597 @@ static const struct unidata st608[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
-/* 10400-1040F */
+/* FDF0-FDFF */
 static const struct unidata st609[] = {
-{0,dd4754,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4755,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4756,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4757,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4758,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4759,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4760,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4761,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4762,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4763,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4764,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4765,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4766,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4767,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4768,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4769,0,0,Lu,0,GBOther,WBALetter,SBUpper}
+{dd2891,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2892,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2893,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2894,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2895,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2896,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2897,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2898,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2899,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2900,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2901,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2902,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2903,0,0,0,Sc,CD,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
-/* 10410-1041F */
+/* FE00-FE0F */
 static const struct unidata st610[] = {
-{0,dd4770,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4771,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4772,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4773,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4774,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4775,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4776,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4777,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4778,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4779,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4780,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4781,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4782,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4783,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4784,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4785,0,0,Lu,0,GBOther,WBALetter,SBUpper}
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend}
 };
-/* 10420-1042F */
+/* FE10-FE1F */
 static const struct unidata st611[] = {
-{0,dd4786,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4787,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4788,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4789,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4790,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4791,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4792,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,dd4793,0,0,Lu,0,GBOther,WBALetter,SBUpper},
-{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
-{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower}
-};
-/* 10800-1080F */
-static const struct unidata st612[] = {
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{dd2904,0,0,0,Po,CD,GBOther,WBMidNum,SBSContinue},
+{dd2905,0,0,0,Po,CD,GBOther,WBOther,SBSContinue},
+{dd2906,0,0,0,Po,CD,GBOther,WBOther,SBOther},
+{dd2907,0,0,0,Po,CD,GBOther,WBMidLetter,SBSContinue},
+{dd309,0,0,0,Po,CD,GBOther,WBMidNum,SBOther},
+{dd2908,0,0,0,Po,CD,GBOther,WBOther,SBOther},
+{dd2909,0,0,0,Po,CD,GBOther,WBOther,SBOther},
+{dd2910,0,0,0,Ps,CD,GBOther,WBOther,SBClose},
+{dd2911,0,0,0,Pe,CD,GBOther,WBOther,SBClose},
+{dd2912,0,0,0,Po,CD,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter}
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
-/* 10830-1083F */
+/* FE30-FE3F */
+static const struct unidata st612[] = {
+{dd2913,0,0,0,Po,CD,GBOther,WBOther,SBOther},
+{dd2914,0,0,0,Pd,CD,GBOther,WBOther,SBSContinue},
+{dd2915,0,0,0,Pd,CD,GBOther,WBOther,SBSContinue},
+{dd2916,0,0,0,Pc,CD,GBOther,WBExtendNumLet,SBOther},
+{dd2916,0,0,0,Pc,CD,GBOther,WBExtendNumLet,SBOther},
+{dd1080,0,0,0,Ps,CD,GBOther,WBOther,SBClose},
+{dd1081,0,0,0,Pe,CD,GBOther,WBOther,SBClose},
+{dd2917,0,0,0,Ps,CD,GBOther,WBOther,SBClose},
+{dd2918,0,0,0,Pe,CD,GBOther,WBOther,SBClose},
+{dd2919,0,0,0,Ps,CD,GBOther,WBOther,SBClose},
+{dd2920,0,0,0,Pe,CD,GBOther,WBOther,SBClose},
+{dd2921,0,0,0,Ps,CD,GBOther,WBOther,SBClose},
+{dd2922,0,0,0,Pe,CD,GBOther,WBOther,SBClose},
+{dd2923,0,0,0,Ps,CD,GBOther,WBOther,SBClose},
+{dd2924,0,0,0,Pe,CD,GBOther,WBOther,SBClose},
+{dd1191,0,0,0,Ps,CD,GBOther,WBOther,SBClose}
+};
+/* FE40-FE4F */
 static const struct unidata st613[] = {
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{dd1192,0,0,0,Pe,CD,GBOther,WBOther,SBClose},
+{dd2925,0,0,0,Ps,CD,GBOther,WBOther,SBClose},
+{dd2926,0,0,0,Pe,CD,GBOther,WBOther,SBClose},
+{dd2927,0,0,0,Ps,CD,GBOther,WBOther,SBClose},
+{dd2928,0,0,0,Pe,CD,GBOther,WBOther,SBClose},
+{0,0,0,0,Po,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Po,0,GBOther,WBOther,SBOther},
+{dd2929,0,0,0,Ps,CD,GBOther,WBOther,SBClose},
+{dd2930,0,0,0,Pe,CD,GBOther,WBOther,SBClose},
+{dd2931,0,0,0,Po,CD,GBOther,WBOther,SBOther},
+{dd2931,0,0,0,Po,CD,GBOther,WBOther,SBOther},
+{dd2931,0,0,0,Po,CD,GBOther,WBOther,SBOther},
+{dd2931,0,0,0,Po,CD,GBOther,WBOther,SBOther},
+{dd2916,0,0,0,Pc,CD,GBOther,WBExtendNumLet,SBOther},
+{dd2916,0,0,0,Pc,CD,GBOther,WBExtendNumLet,SBOther},
+{dd2916,0,0,0,Pc,CD,GBOther,WBExtendNumLet,SBOther}
+};
+/* FE50-FE5F */
+static const struct unidata st614[] = {
+{dd2904,0,0,0,Po,CD,GBOther,WBMidNum,SBSContinue},
+{dd2905,0,0,0,Po,CD,GBOther,WBOther,SBSContinue},
+{dd1057,0,0,0,Po,CD,GBOther,WBMidNumLet,SBATerm},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{dd309,0,0,0,Po,CD,GBOther,WBMidNum,SBOther},
+{dd2907,0,0,0,Po,CD,GBOther,WBMidLetter,SBSContinue},
+{dd2909,0,0,0,Po,CD,GBOther,WBOther,SBSTerm},
+{dd2908,0,0,0,Po,CD,GBOther,WBOther,SBSTerm},
+{dd2914,0,0,0,Pd,CD,GBOther,WBOther,SBSContinue},
+{dd1080,0,0,0,Ps,CD,GBOther,WBOther,SBClose},
+{dd1081,0,0,0,Pe,CD,GBOther,WBOther,SBClose},
+{dd2917,0,0,0,Ps,CD,GBOther,WBOther,SBClose},
+{dd2918,0,0,0,Pe,CD,GBOther,WBOther,SBClose},
+{dd2919,0,0,0,Ps,CD,GBOther,WBOther,SBClose},
+{dd2920,0,0,0,Pe,CD,GBOther,WBOther,SBClose},
+{dd2932,0,0,0,Po,CD,GBOther,WBOther,SBOther}
+};
+/* FE60-FE6F */
+static const struct unidata st615[] = {
+{dd2933,0,0,0,Po,CD,GBOther,WBOther,SBOther},
+{dd2934,0,0,0,Po,CD,GBOther,WBOther,SBOther},
+{dd1077,0,0,0,Sm,CD,GBOther,WBOther,SBOther},
+{dd2935,0,0,0,Pd,CD,GBOther,WBOther,SBSContinue},
+{dd2936,0,0,0,Sm,CD,GBOther,WBOther,SBOther},
+{dd2937,0,0,0,Sm,CD,GBOther,WBOther,SBOther},
+{dd1079,0,0,0,Sm,CD,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{dd2938,0,0,0,Po,CD,GBOther,WBOther,SBOther},
+{dd2939,0,0,0,Sc,CD,GBOther,WBOther,SBOther},
+{dd2940,0,0,0,Po,CD,GBOther,WBOther,SBOther},
+{dd2941,0,0,0,Po,CD,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter}
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
-/* 10910-1091F */
-static const struct unidata st614[] = {
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,No,0,GBOther,WBOther,SBOther},
-{0,0,0,0,No,0,GBOther,WBOther,SBOther},
-{0,0,0,0,No,0,GBOther,WBOther,SBOther},
-{0,0,0,0,No,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Po,0,GBOther,WBOther,SBOther}
-};
-/* 10A00-10A0F */
-static const struct unidata st615[] = {
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
-{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
-{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
-{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
-{0,0,0,220,Mn,0,GBExtend,WBExtend,SBExtend},
-{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
-{0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend}
-};
-/* 10A10-10A1F */
-static const struct unidata st616[] = {
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+/* FE70-FE7F */
+static const struct unidata st616[] = {
+{dd2942,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2943,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2944,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{dd2945,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter}
+{dd2946,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2947,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2948,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2949,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2950,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2951,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2952,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2953,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2954,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2955,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
 };
-/* 10A30-10A3F */
+/* FE80-FE8F */
 static const struct unidata st617[] = {
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
-{0,0,0,1,Mn,0,GBExtend,WBExtend,SBExtend},
-{0,0,0,220,Mn,0,GBExtend,WBExtend,SBExtend},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,9,Mn,0,GBExtend,WBExtend,SBExtend}
+{dd2956,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2957,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2957,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2958,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2958,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2959,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2959,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2960,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2960,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2961,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2961,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2961,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2961,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2962,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2962,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2963,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
 };
-/* 10A40-10A4F */
+/* FE90-FE9F */
 static const struct unidata st618[] = {
-{0,0,0,0,No,0,GBOther,WBOther,SBOther},
-{0,0,0,0,No,0,GBOther,WBOther,SBOther},
-{0,0,0,0,No,0,GBOther,WBOther,SBOther},
-{0,0,0,0,No,0,GBOther,WBOther,SBOther},
-{0,0,0,0,No,0,GBOther,WBOther,SBOther},
-{0,0,0,0,No,0,GBOther,WBOther,SBOther},
-{0,0,0,0,No,0,GBOther,WBOther,SBOther},
-{0,0,0,0,No,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
+{dd2963,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2963,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2963,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2964,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2964,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2965,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2965,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2965,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2965,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2966,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2966,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2966,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2966,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2967,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2967,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2967,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
 };
-/* 10A50-10A5F */
+/* FEA0-FEAF */
 static const struct unidata st619[] = {
-{0,0,0,0,Po,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Po,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Po,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Po,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Po,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Po,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Po,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Po,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Po,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
+{dd2967,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2968,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2968,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2968,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2968,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2969,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2969,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2969,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2969,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2970,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2970,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2971,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2971,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2972,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2972,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2973,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
 };
-/* 12460-1246F */
+/* FEB0-FEBF */
 static const struct unidata st620[] = {
-{0,0,0,0,Nl,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Nl,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Nl,0,GBOther,WBALetter,SBOLetter},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
+{dd2973,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2974,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2974,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2974,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2974,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2975,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2975,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2975,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2975,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2976,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2976,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2976,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2976,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2977,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2977,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2977,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
 };
-/* 12470-1247F */
+/* FEC0-FECF */
 static const struct unidata st621[] = {
-{0,0,0,0,Po,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Po,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Po,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Po,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
+{dd2977,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2978,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2978,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2978,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2978,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2979,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2979,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2979,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2979,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2980,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2980,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2980,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2980,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2981,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2981,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2981,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
 };
-/* 1D0F0-1D0FF */
+/* FED0-FEDF */
 static const struct unidata st622[] = {
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
+{dd2981,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2982,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2982,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2982,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2982,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2983,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2983,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2983,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2983,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2984,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2984,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2984,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2984,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2985,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2985,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2985,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
 };
-/* 1D120-1D12F */
+/* FEE0-FEEF */
 static const struct unidata st623[] = {
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther}
+{dd2985,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2986,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2986,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2986,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2986,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2987,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2987,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2987,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2987,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2988,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2988,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2988,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2988,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2989,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2989,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2625,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
 };
-/* 1D150-1D15F */
+/* FEF0-FEFF */
 static const struct unidata st624[] = {
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{dd3082,0,0,0,So,0,GBOther,WBOther,SBOther},
-{dd3083,0,0,0,So,0,GBOther,WBOther,SBOther}
+{dd2625,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2990,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2990,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2990,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2990,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2991,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2991,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2992,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2992,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2993,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2993,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2994,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd2994,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cf,0,GBControl,WBFormat,SBFormat}
 };
-/* 1D160-1D16F */
+/* FF00-FF0F */
 static const struct unidata st625[] = {
-{dd3084,0,0,0,So,0,GBOther,WBOther,SBOther},
-{dd3085,0,0,0,So,0,GBOther,WBOther,SBOther},
-{dd3086,0,0,0,So,0,GBOther,WBOther,SBOther},
-{dd3087,0,0,0,So,0,GBOther,WBOther,SBOther},
-{dd3088,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,216,Mc,0,GBExtend,WBExtend,SBExtend},
-{0,0,0,216,Mc,0,GBOther,WBOther,SBOther},
-{0,0,0,1,Mn,0,GBExtend,WBExtend,SBExtend},
-{0,0,0,1,Mn,0,GBExtend,WBExtend,SBExtend},
-{0,0,0,1,Mn,0,GBExtend,WBExtend,SBExtend},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,226,Mc,0,GBOther,WBOther,SBOther},
-{0,0,0,216,Mc,0,GBExtend,WBExtend,SBExtend},
-{0,0,0,216,Mc,0,GBExtend,WBExtend,SBExtend}
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{dd2908,0,0,0,Po,CD,GBOther,WBOther,SBSTerm},
+{dd2995,0,0,0,Po,CD,GBOther,WBOther,SBOther},
+{dd2932,0,0,0,Po,CD,GBOther,WBOther,SBOther},
+{dd2939,0,0,0,Sc,CD,GBOther,WBOther,SBOther},
+{dd2940,0,0,0,Po,CD,GBOther,WBOther,SBOther},
+{dd2933,0,0,0,Po,CD,GBOther,WBOther,SBOther},
+{dd2996,0,0,0,Po,CD,GBOther,WBMidNumLet,SBOther},
+{dd1080,0,0,0,Ps,CD,GBOther,WBOther,SBClose},
+{dd1081,0,0,0,Pe,CD,GBOther,WBOther,SBClose},
+{dd2934,0,0,0,Po,CD,GBOther,WBOther,SBOther},
+{dd1077,0,0,0,Sm,CD,GBOther,WBOther,SBOther},
+{dd2904,0,0,0,Po,CD,GBOther,WBMidNum,SBSContinue},
+{dd2935,0,0,0,Pd,CD,GBOther,WBOther,SBSContinue},
+{dd1057,0,0,0,Po,CD,GBOther,WBMidNumLet,SBATerm},
+{dd2997,0,0,0,Po,CD,GBOther,WBOther,SBOther}
 };
-/* 1D170-1D17F */
+/* FF10-FF1F */
 static const struct unidata st626[] = {
-{0,0,0,216,Mc,0,GBExtend,WBExtend,SBExtend},
-{0,0,0,216,Mc,0,GBExtend,WBExtend,SBExtend},
-{0,0,0,216,Mc,0,GBExtend,WBExtend,SBExtend},
-{0,0,0,0,Cf,0,GBControl,WBFormat,SBFormat},
-{0,0,0,0,Cf,0,GBControl,WBFormat,SBFormat},
-{0,0,0,0,Cf,0,GBControl,WBFormat,SBFormat},
-{0,0,0,0,Cf,0,GBControl,WBFormat,SBFormat},
-{0,0,0,0,Cf,0,GBControl,WBFormat,SBFormat},
-{0,0,0,0,Cf,0,GBControl,WBFormat,SBFormat},
-{0,0,0,0,Cf,0,GBControl,WBFormat,SBFormat},
-{0,0,0,0,Cf,0,GBControl,WBFormat,SBFormat},
-{0,0,0,220,Mn,0,GBExtend,WBExtend,SBExtend},
-{0,0,0,220,Mn,0,GBExtend,WBExtend,SBExtend},
-{0,0,0,220,Mn,0,GBExtend,WBExtend,SBExtend},
-{0,0,0,220,Mn,0,GBExtend,WBExtend,SBExtend},
-{0,0,0,220,Mn,0,GBExtend,WBExtend,SBExtend}
+{dd1070,0,0,0,Nd,CD,GBOther,WBOther,SBOther},
+{dd9,0,0,0,Nd,CD,GBOther,WBOther,SBOther},
+{dd4,0,0,0,Nd,CD,GBOther,WBOther,SBOther},
+{dd5,0,0,0,Nd,CD,GBOther,WBOther,SBOther},
+{dd1071,0,0,0,Nd,CD,GBOther,WBOther,SBOther},
+{dd1072,0,0,0,Nd,CD,GBOther,WBOther,SBOther},
+{dd1073,0,0,0,Nd,CD,GBOther,WBOther,SBOther},
+{dd1074,0,0,0,Nd,CD,GBOther,WBOther,SBOther},
+{dd1075,0,0,0,Nd,CD,GBOther,WBOther,SBOther},
+{dd1076,0,0,0,Nd,CD,GBOther,WBOther,SBOther},
+{dd2907,0,0,0,Po,CD,GBOther,WBMidLetter,SBSContinue},
+{dd309,0,0,0,Po,CD,GBOther,WBMidNum,SBOther},
+{dd2936,0,0,0,Sm,CD,GBOther,WBOther,SBOther},
+{dd1079,0,0,0,Sm,CD,GBOther,WBOther,SBOther},
+{dd2937,0,0,0,Sm,CD,GBOther,WBOther,SBOther},
+{dd2909,0,0,0,Po,CD,GBOther,WBOther,SBSTerm}
 };
-/* 1D180-1D18F */
+/* FF20-FF2F */
 static const struct unidata st627[] = {
-{0,0,0,220,Mn,0,GBExtend,WBExtend,SBExtend},
-{0,0,0,220,Mn,0,GBExtend,WBExtend,SBExtend},
-{0,0,0,220,Mn,0,GBExtend,WBExtend,SBExtend},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
-{0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
-{0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
-{0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
-{0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
-{0,0,0,220,Mn,0,GBExtend,WBExtend,SBExtend},
-{0,0,0,220,Mn,0,GBExtend,WBExtend,SBExtend},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther}
+{dd2941,0,0,0,Po,CD,GBOther,WBOther,SBOther},
+{dd491,dd4825,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd493,dd4826,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd1086,dd4827,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd494,dd4828,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd495,dd4829,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd1101,dd4830,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd497,dd4831,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd498,dd4832,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd499,dd4833,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd500,dd4834,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd501,dd4835,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd502,dd4836,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd503,dd4837,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd504,dd4838,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd505,dd4839,0,0,Lu,CD,GBOther,WBALetter,SBUpper}
 };
-/* 1D1A0-1D1AF */
+/* FF30-FF3F */
 static const struct unidata st628[] = {
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
-{0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
-{0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
-{0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther}
+{dd507,dd4840,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd1094,dd4841,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd508,dd4842,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd1270,dd4843,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd509,dd4844,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd510,dd4845,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd1126,dd4846,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd511,dd4847,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd1131,dd4848,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd1271,dd4849,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd1098,dd4850,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd2929,0,0,0,Ps,CD,GBOther,WBOther,SBClose},
+{dd2938,0,0,0,Po,CD,GBOther,WBOther,SBOther},
+{dd2930,0,0,0,Pe,CD,GBOther,WBOther,SBClose},
+{dd2998,0,0,0,Sk,CD,GBOther,WBOther,SBOther},
+{dd2916,0,0,0,Pc,CD,GBOther,WBExtendNumLet,SBOther}
 };
-/* 1D1B0-1D1BF */
+/* FF40-FF4F */
 static const struct unidata st629[] = {
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{dd3089,0,0,0,So,0,GBOther,WBOther,SBOther},
-{dd3090,0,0,0,So,0,GBOther,WBOther,SBOther},
-{dd3091,0,0,0,So,0,GBOther,WBOther,SBOther},
-{dd3092,0,0,0,So,0,GBOther,WBOther,SBOther},
-{dd3093,0,0,0,So,0,GBOther,WBOther,SBOther}
+{dd1040,0,0,0,Sk,CD,GBOther,WBOther,SBOther},
+{dd2,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd515,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd541,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd516,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd517,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd544,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd521,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd284,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd538,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd286,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd522,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd300,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd523,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd1082,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd10,0,0,0,Ll,CD,GBOther,WBALetter,SBLower}
 };
-/* 1D1C0-1D1CF */
+/* FF50-FF5F */
 static const struct unidata st630[] = {
-{dd3094,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther}
+{dd528,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd1272,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd287,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd180,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd529,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd530,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd533,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd291,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd301,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd292,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd571,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd2917,0,0,0,Ps,CD,GBOther,WBOther,SBClose},
+{dd2999,0,0,0,Sm,CD,GBOther,WBOther,SBOther},
+{dd2918,0,0,0,Pe,CD,GBOther,WBOther,SBClose},
+{dd3000,0,0,0,Sm,CD,GBOther,WBOther,SBOther},
+{dd3001,0,0,0,Ps,CD,GBOther,WBOther,SBClose}
 };
-/* 1D1D0-1D1DF */
+/* FF60-FF6F */
 static const struct unidata st631[] = {
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
+{dd3002,0,0,0,Pe,CD,GBOther,WBOther,SBClose},
+{dd2906,0,0,0,Po,CD,GBOther,WBOther,SBSTerm},
+{dd2925,0,0,0,Ps,CD,GBOther,WBOther,SBClose},
+{dd2926,0,0,0,Pe,CD,GBOther,WBOther,SBClose},
+{dd2905,0,0,0,Po,CD,GBOther,WBOther,SBSContinue},
+{dd3003,0,0,0,Po,CD,GBOther,WBOther,SBOther},
+{dd1873,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
+{dd3004,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
+{dd3005,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
+{dd3006,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
+{dd3007,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
+{dd3008,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
+{dd3009,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
+{dd3010,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
+{dd3011,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
+{dd3012,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter}
 };
-/* 1D240-1D24F */
+/* FF70-FF7F */
 static const struct unidata st632[] = {
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
-{0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
-{0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
-{0,0,0,0,So,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
+{dd3013,0,0,0,Lm,CD,GBOther,WBKatakana,SBOLetter},
+{dd1827,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
+{dd1828,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
+{dd1829,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
+{dd1830,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
+{dd1831,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
+{dd1832,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
+{dd1833,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
+{dd1834,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
+{dd1835,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
+{dd1836,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
+{dd1837,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
+{dd1838,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
+{dd1839,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
+{dd1840,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
+{dd1841,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter}
 };
-/* 1D370-1D37F */
+/* FF80-FF8F */
 static const struct unidata st633[] = {
-{0,0,0,0,No,0,GBOther,WBOther,SBOther},
-{0,0,0,0,No,0,GBOther,WBOther,SBOther},
+{dd1842,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
+{dd1843,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
+{dd1844,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
+{dd1845,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
+{dd1846,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
+{dd1847,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
+{dd1848,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
+{dd1849,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
+{dd1850,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
+{dd1851,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
+{dd1852,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
+{dd1853,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
+{dd1854,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
+{dd1855,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
+{dd1856,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
+{dd1857,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter}
+};
+/* FF90-FF9F */
+static const struct unidata st634[] = {
+{dd1858,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
+{dd1859,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
+{dd1860,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
+{dd1861,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
+{dd1862,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
+{dd1863,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
+{dd1864,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
+{dd1865,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
+{dd1866,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
+{dd1867,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
+{dd1868,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
+{dd1869,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
+{dd1870,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
+{dd3014,0,0,0,Lo,CD,GBOther,WBKatakana,SBOLetter},
+{dd3015,0,0,0,Lm,CD,GBExtend,WBExtend,SBExtend},
+{dd3016,0,0,0,Lm,CD,GBExtend,WBExtend,SBExtend}
+};
+/* FFA0-FFAF */
+static const struct unidata st635[] = {
+{dd3017,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd3018,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd3019,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd3020,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd3021,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd3022,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd3023,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd3024,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd3025,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd3026,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd3027,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd3028,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd3029,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd3030,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd3031,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd3032,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
+};
+/* FFB0-FFBF */
+static const struct unidata st636[] = {
+{dd3033,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd3034,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd3035,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd3036,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd3037,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd3038,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd3039,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd3040,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd3041,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd3042,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd3043,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd3044,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd3045,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd3046,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd3047,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
+};
+/* FFC0-FFCF */
+static const struct unidata st637[] = {
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{dd3048,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd3049,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd3050,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd3051,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd3052,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd3053,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{dd3054,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd3055,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd3056,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd3057,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd3058,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd3059,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter}
+};
+/* FFD0-FFDF */
+static const struct unidata st638[] = {
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{dd3060,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd3061,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd3062,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd3063,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd3064,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd3065,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{dd3066,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd3067,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
+{dd3068,0,0,0,Lo,CD,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
+};
+/* FFE0-FFEF */
+static const struct unidata st639[] = {
+{dd3069,0,0,0,Sc,CD,GBOther,WBOther,SBOther},
+{dd3070,0,0,0,Sc,CD,GBOther,WBOther,SBOther},
+{dd3071,0,0,0,Sm,CD,GBOther,WBOther,SBOther},
+{dd3072,0,0,0,Sk,CD,GBOther,WBOther,SBOther},
+{dd3073,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd3074,0,0,0,Sc,CD,GBOther,WBOther,SBOther},
+{dd3075,0,0,0,Sc,CD,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{dd3076,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd3077,0,0,0,Sm,CD,GBOther,WBOther,SBOther},
+{dd3078,0,0,0,Sm,CD,GBOther,WBOther,SBOther},
+{dd3079,0,0,0,Sm,CD,GBOther,WBOther,SBOther},
+{dd3080,0,0,0,Sm,CD,GBOther,WBOther,SBOther},
+{dd3081,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{dd3082,0,0,0,So,CD,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
+};
+/* FFF0-FFFF */
+static const struct unidata st640[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
@@ -16944,873 +17187,745 @@ static const struct unidata st633[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cf,0,GBControl,WBFormat,SBFormat},
+{0,0,0,0,Cf,0,GBControl,WBFormat,SBFormat},
+{0,0,0,0,Cf,0,GBControl,WBFormat,SBFormat},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
-/* 1D400-1D40F */
-static const struct unidata st634[] = {
-{dd491,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd493,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd1086,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd494,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd495,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd1101,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd497,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd498,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd499,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd500,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd501,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd502,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd503,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd504,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd505,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd507,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper}
+/* 10000-1000F */
+static const struct unidata st641[] = {
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter}
 };
-/* 1D410-1D41F */
-static const struct unidata st635[] = {
-{dd1094,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd508,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd1270,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd509,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd510,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd1126,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd511,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd1131,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd1271,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd1098,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd2,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd515,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd541,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd516,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd517,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd544,0,0,0,Ll,CD,GBOther,WBALetter,SBLower}
+/* 10030-1003F */
+static const struct unidata st642[] = {
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter}
 };
-/* 1D420-1D42F */
-static const struct unidata st636[] = {
-{dd521,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd284,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd538,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd286,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd522,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd300,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd523,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd1082,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd10,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd528,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd1272,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd287,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd180,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd529,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd530,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd533,0,0,0,Ll,CD,GBOther,WBALetter,SBLower}
+/* 10100-1010F */
+static const struct unidata st643[] = {
+{0,0,0,0,Po,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Po,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,No,0,GBOther,WBOther,SBOther},
+{0,0,0,0,No,0,GBOther,WBOther,SBOther},
+{0,0,0,0,No,0,GBOther,WBOther,SBOther},
+{0,0,0,0,No,0,GBOther,WBOther,SBOther},
+{0,0,0,0,No,0,GBOther,WBOther,SBOther},
+{0,0,0,0,No,0,GBOther,WBOther,SBOther},
+{0,0,0,0,No,0,GBOther,WBOther,SBOther},
+{0,0,0,0,No,0,GBOther,WBOther,SBOther},
+{0,0,0,0,No,0,GBOther,WBOther,SBOther}
 };
-/* 1D430-1D43F */
-static const struct unidata st637[] = {
-{dd291,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd301,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd292,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd571,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd491,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd493,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd1086,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd494,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd495,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd1101,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd497,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd498,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd499,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd500,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd501,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd502,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper}
-};
-/* 1D440-1D44F */
-static const struct unidata st638[] = {
-{dd503,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd504,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd505,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd507,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd1094,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd508,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd1270,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd509,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd510,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd1126,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd511,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd1131,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd1271,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd1098,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd2,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd515,0,0,0,Ll,CD,GBOther,WBALetter,SBLower}
-};
-/* 1D450-1D45F */
-static const struct unidata st639[] = {
-{dd541,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd516,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd517,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd544,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd521,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+/* 10130-1013F */
+static const struct unidata st644[] = {
+{0,0,0,0,No,0,GBOther,WBOther,SBOther},
+{0,0,0,0,No,0,GBOther,WBOther,SBOther},
+{0,0,0,0,No,0,GBOther,WBOther,SBOther},
+{0,0,0,0,No,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{dd538,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd286,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd522,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd300,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd523,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd1082,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd10,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd528,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd1272,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd287,0,0,0,Ll,CD,GBOther,WBALetter,SBLower}
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther}
 };
-/* 1D460-1D46F */
-static const struct unidata st640[] = {
-{dd180,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd529,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd530,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd533,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd291,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd301,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd292,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd571,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd491,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd493,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd1086,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd494,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd495,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd1101,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd497,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd498,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper}
+/* 10140-1014F */
+static const struct unidata st645[] = {
+{0,0,0,0,Nl,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Nl,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Nl,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Nl,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Nl,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Nl,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Nl,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Nl,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Nl,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Nl,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Nl,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Nl,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Nl,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Nl,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Nl,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Nl,0,GBOther,WBALetter,SBOLetter}
 };
-/* 1D470-1D47F */
-static const struct unidata st641[] = {
-{dd499,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd500,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd501,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd502,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd503,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd504,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd505,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd507,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd1094,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd508,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd1270,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd509,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd510,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd1126,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd511,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd1131,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper}
+/* 10170-1017F */
+static const struct unidata st646[] = {
+{0,0,0,0,Nl,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Nl,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Nl,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Nl,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Nl,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,No,0,GBOther,WBOther,SBOther},
+{0,0,0,0,No,0,GBOther,WBOther,SBOther},
+{0,0,0,0,No,0,GBOther,WBOther,SBOther},
+{0,0,0,0,No,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther}
 };
-/* 1D480-1D48F */
-static const struct unidata st642[] = {
-{dd1271,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd1098,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd2,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd515,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd541,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd516,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd517,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd544,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd521,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd284,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd538,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd286,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd522,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd300,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd523,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd1082,0,0,0,Ll,CD,GBOther,WBALetter,SBLower}
+/* 10180-1018F */
+static const struct unidata st647[] = {
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,No,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
-/* 1D490-1D49F */
-static const struct unidata st643[] = {
-{dd10,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd528,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd1272,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd287,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd180,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd529,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd530,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd533,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd291,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd301,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd292,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd571,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd491,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+/* 101F0-101FF */
+static const struct unidata st648[] = {
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,220,Mn,0,GBExtend,WBExtend,SBExtend},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{dd1086,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd494,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper}
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
-/* 1D4A0-1D4AF */
-static const struct unidata st644[] = {
+/* 10310-1031F */
+static const struct unidata st649[] = {
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
+};
+/* 10320-1032F */
+static const struct unidata st650[] = {
+{0,0,0,0,No,0,GBOther,WBOther,SBOther},
+{0,0,0,0,No,0,GBOther,WBOther,SBOther},
+{0,0,0,0,No,0,GBOther,WBOther,SBOther},
+{0,0,0,0,No,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{dd497,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{dd500,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd501,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{dd504,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd505,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd507,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd1094,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{dd1270,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd509,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper}
-};
-/* 1D4B0-1D4BF */
-static const struct unidata st645[] = {
-{dd510,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd1126,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd511,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd1131,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd1271,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd1098,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd2,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd515,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd541,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd516,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{dd544,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{dd284,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd538,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd286,0,0,0,Ll,CD,GBOther,WBALetter,SBLower}
-};
-/* 1D4C0-1D4CF */
-static const struct unidata st646[] = {
-{dd522,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd300,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd523,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd1082,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{dd528,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd1272,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd287,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd180,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd529,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd530,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd533,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd291,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd301,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd292,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd571,0,0,0,Ll,CD,GBOther,WBALetter,SBLower}
-};
-/* 1D500-1D50F */
-static const struct unidata st647[] = {
-{dd291,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd301,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd292,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd571,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd491,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd493,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{dd494,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd495,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd1101,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd497,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{dd500,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd501,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd502,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper}
-};
-/* 1D510-1D51F */
-static const struct unidata st648[] = {
-{dd503,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd504,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd505,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd507,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd1094,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{dd1270,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd509,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd510,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd1126,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd511,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd1131,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd1271,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{dd2,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd515,0,0,0,Ll,CD,GBOther,WBALetter,SBLower}
-};
-/* 1D520-1D52F */
-static const struct unidata st649[] = {
-{dd541,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd516,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd517,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd544,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd521,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd284,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd538,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd286,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd522,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd300,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd523,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd1082,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd10,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd528,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd1272,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd287,0,0,0,Ll,CD,GBOther,WBALetter,SBLower}
-};
-/* 1D530-1D53F */
-static const struct unidata st650[] = {
-{dd180,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd529,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd530,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd533,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd291,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd301,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd292,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd571,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd491,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd493,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{dd494,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd495,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd1101,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd497,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
-/* 1D540-1D54F */
+/* 10340-1034F */
 static const struct unidata st651[] = {
-{dd499,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd500,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd501,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd502,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd503,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Nl,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Nl,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{dd505,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{dd1270,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd509,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd510,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd1126,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd511,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd1131,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper}
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
-/* 1D550-1D55F */
+/* 10390-1039F */
 static const struct unidata st652[] = {
-{dd1271,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{dd2,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd515,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd541,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd516,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd517,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd544,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd521,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd284,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd538,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd286,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd522,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd300,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd523,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd1082,0,0,0,Ll,CD,GBOther,WBALetter,SBLower}
+{0,0,0,0,Po,0,GBOther,WBOther,SBOther}
 };
-/* 1D560-1D56F */
+/* 103C0-103CF */
 static const struct unidata st653[] = {
-{dd10,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd528,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd1272,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd287,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd180,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd529,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd530,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd533,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd291,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd301,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd292,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd571,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd491,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd493,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd1086,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd494,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper}
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter}
 };
-/* 1D570-1D57F */
+/* 103D0-103DF */
 static const struct unidata st654[] = {
-{dd495,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd1101,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd497,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd498,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd499,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd500,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd501,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd502,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd503,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd504,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd505,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd507,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd1094,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd508,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd1270,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd509,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper}
+{0,0,0,0,Po,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Nl,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Nl,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Nl,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Nl,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Nl,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
-/* 1D580-1D58F */
+/* 10400-1040F */
 static const struct unidata st655[] = {
-{dd510,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd1126,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd511,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd1131,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd1271,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd1098,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd2,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd515,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd541,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd516,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd517,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd544,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd521,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd284,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd538,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd286,0,0,0,Ll,CD,GBOther,WBALetter,SBLower}
+{0,dd4851,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4852,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4853,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4854,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4855,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4856,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4857,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4858,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4859,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4860,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4861,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4862,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4863,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4864,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4865,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4866,0,0,Lu,0,GBOther,WBALetter,SBUpper}
 };
-/* 1D590-1D59F */
+/* 10410-1041F */
 static const struct unidata st656[] = {
-{dd522,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd300,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd523,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd1082,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd10,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd528,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd1272,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd287,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd180,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd529,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd530,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd533,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd291,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd301,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd292,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd571,0,0,0,Ll,CD,GBOther,WBALetter,SBLower}
+{0,dd4867,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4868,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4869,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4870,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4871,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4872,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4873,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4874,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4875,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4876,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4877,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4878,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4879,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4880,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4881,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4882,0,0,Lu,0,GBOther,WBALetter,SBUpper}
 };
-/* 1D6A0-1D6AF */
+/* 10420-1042F */
 static const struct unidata st657[] = {
-{dd291,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd301,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd292,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd571,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3095,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3096,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{dd3097,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3098,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd1107,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3099,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3100,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3101,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3102,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd342,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper}
+{0,dd4883,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4884,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4885,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4886,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4887,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4888,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4889,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,dd4890,0,0,Lu,0,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower},
+{0,0,0,0,Ll,0,GBOther,WBALetter,SBLower}
 };
-/* 1D6B0-1D6BF */
+/* 10800-1080F */
 static const struct unidata st658[] = {
-{dd3103,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3104,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3105,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3106,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3107,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3108,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3109,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd1108,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3110,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3111,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd344,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3112,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd334,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3113,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3114,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3115,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper}
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter}
 };
-/* 1D6C0-1D6CF */
+/* 10830-1083F */
 static const struct unidata st659[] = {
-{dd1099,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3116,0,0,0,Sm,CD,GBOther,WBOther,SBOther},
-{dd3117,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd332,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd535,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd536,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd343,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3118,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3119,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd333,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd996,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd339,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3120,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd7,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3121,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3122,0,0,0,Ll,CD,GBOther,WBALetter,SBLower}
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter}
 };
-/* 1D6D0-1D6DF */
+/* 10910-1091F */
 static const struct unidata st660[] = {
-{dd3123,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd338,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd340,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd341,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3124,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3125,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3126,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd337,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd537,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3127,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3128,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3129,0,0,0,Sm,CD,GBOther,WBOther,SBOther},
-{dd3130,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3131,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3132,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3133,0,0,0,Ll,CD,GBOther,WBALetter,SBLower}
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,No,0,GBOther,WBOther,SBOther},
+{0,0,0,0,No,0,GBOther,WBOther,SBOther},
+{0,0,0,0,No,0,GBOther,WBOther,SBOther},
+{0,0,0,0,No,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Po,0,GBOther,WBOther,SBOther}
 };
-/* 1D6E0-1D6EF */
+/* 10930-1093F */
 static const struct unidata st661[] = {
-{dd3134,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3135,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3097,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3098,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd1107,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3099,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3100,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3101,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3102,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd342,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3103,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3104,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3105,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3106,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3107,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3108,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper}
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Po,0,GBOther,WBOther,SBOther}
 };
-/* 1D6F0-1D6FF */
+/* 10A00-10A0F */
 static const struct unidata st662[] = {
-{dd3109,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd1108,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3110,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3111,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd344,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3112,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd334,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3113,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3114,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3115,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd1099,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3116,0,0,0,Sm,CD,GBOther,WBOther,SBOther},
-{dd3117,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd332,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd535,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd536,0,0,0,Ll,CD,GBOther,WBALetter,SBLower}
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,220,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend}
 };
-/* 1D700-1D70F */
+/* 10A10-10A1F */
 static const struct unidata st663[] = {
-{dd343,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3118,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3119,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd333,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd996,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd339,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3120,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd7,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3121,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3122,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3123,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd338,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd340,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd341,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3124,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3125,0,0,0,Ll,CD,GBOther,WBALetter,SBLower}
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter}
 };
-/* 1D710-1D71F */
+/* 10A30-10A3F */
 static const struct unidata st664[] = {
-{dd3126,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd337,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd537,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3127,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3128,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3129,0,0,0,Sm,CD,GBOther,WBOther,SBOther},
-{dd3130,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3131,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3132,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3133,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3134,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3135,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3097,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3098,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd1107,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3099,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper}
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,1,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,220,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,9,Mn,0,GBExtend,WBExtend,SBExtend}
 };
-/* 1D720-1D72F */
+/* 10A40-10A4F */
 static const struct unidata st665[] = {
-{dd3100,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3101,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3102,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd342,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3103,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3104,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3105,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3106,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3107,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3108,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3109,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd1108,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3110,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3111,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd344,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3112,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper}
+{0,0,0,0,No,0,GBOther,WBOther,SBOther},
+{0,0,0,0,No,0,GBOther,WBOther,SBOther},
+{0,0,0,0,No,0,GBOther,WBOther,SBOther},
+{0,0,0,0,No,0,GBOther,WBOther,SBOther},
+{0,0,0,0,No,0,GBOther,WBOther,SBOther},
+{0,0,0,0,No,0,GBOther,WBOther,SBOther},
+{0,0,0,0,No,0,GBOther,WBOther,SBOther},
+{0,0,0,0,No,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
-/* 1D730-1D73F */
+/* 10A50-10A5F */
 static const struct unidata st666[] = {
-{dd334,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3113,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3114,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3115,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd1099,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3116,0,0,0,Sm,CD,GBOther,WBOther,SBOther},
-{dd3117,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd332,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd535,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd536,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd343,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3118,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3119,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd333,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd996,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd339,0,0,0,Ll,CD,GBOther,WBALetter,SBLower}
+{0,0,0,0,Po,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Po,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Po,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Po,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Po,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Po,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Po,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Po,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Po,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
-/* 1D740-1D74F */
+/* 12460-1246F */
 static const struct unidata st667[] = {
-{dd3120,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd7,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3121,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3122,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3123,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd338,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd340,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd341,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3124,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3125,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3126,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd337,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd537,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3127,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3128,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3129,0,0,0,Sm,CD,GBOther,WBOther,SBOther}
+{0,0,0,0,Nl,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Nl,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Nl,0,GBOther,WBALetter,SBOLetter},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
-/* 1D750-1D75F */
+/* 12470-1247F */
 static const struct unidata st668[] = {
-{dd3130,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3131,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3132,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3133,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3134,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3135,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3097,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3098,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd1107,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3099,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3100,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3101,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3102,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd342,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3103,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3104,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper}
+{0,0,0,0,Po,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Po,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Po,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Po,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
-/* 1D760-1D76F */
+/* 1D0F0-1D0FF */
 static const struct unidata st669[] = {
-{dd3105,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3106,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3107,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3108,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3109,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd1108,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3110,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3111,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd344,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3112,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd334,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3113,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3114,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3115,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd1099,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3116,0,0,0,Sm,CD,GBOther,WBOther,SBOther}
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
-/* 1D770-1D77F */
+/* 1D120-1D12F */
 static const struct unidata st670[] = {
-{dd3117,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd332,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd535,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd536,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd343,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3118,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3119,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd333,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd996,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd339,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3120,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd7,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3121,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3122,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3123,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd338,0,0,0,Ll,CD,GBOther,WBALetter,SBLower}
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther}
 };
-/* 1D780-1D78F */
+/* 1D150-1D15F */
 static const struct unidata st671[] = {
-{dd340,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd341,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3124,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3125,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3126,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd337,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd537,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3127,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3128,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3129,0,0,0,Sm,CD,GBOther,WBOther,SBOther},
-{dd3130,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3131,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3132,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3133,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3134,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3135,0,0,0,Ll,CD,GBOther,WBALetter,SBLower}
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{dd3083,0,0,0,So,0,GBOther,WBOther,SBOther},
+{dd3084,0,0,0,So,0,GBOther,WBOther,SBOther}
 };
-/* 1D790-1D79F */
+/* 1D160-1D16F */
 static const struct unidata st672[] = {
-{dd3097,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3098,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd1107,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3099,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3100,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3101,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3102,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd342,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3103,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3104,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3105,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3106,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3107,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3108,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3109,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd1108,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper}
+{dd3085,0,0,0,So,0,GBOther,WBOther,SBOther},
+{dd3086,0,0,0,So,0,GBOther,WBOther,SBOther},
+{dd3087,0,0,0,So,0,GBOther,WBOther,SBOther},
+{dd3088,0,0,0,So,0,GBOther,WBOther,SBOther},
+{dd3089,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,216,Mc,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,216,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,1,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,1,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,1,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,226,Mc,0,GBSpacingMark,WBExtend,SBExtend},
+{0,0,0,216,Mc,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,216,Mc,0,GBExtend,WBExtend,SBExtend}
 };
-/* 1D7A0-1D7AF */
+/* 1D170-1D17F */
 static const struct unidata st673[] = {
-{dd3110,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3111,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd344,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3112,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd334,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3113,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3114,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3115,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd1099,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3116,0,0,0,Sm,CD,GBOther,WBOther,SBOther},
-{dd3117,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd332,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd535,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd536,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd343,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3118,0,0,0,Ll,CD,GBOther,WBALetter,SBLower}
+{0,0,0,216,Mc,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,216,Mc,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,216,Mc,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,Cf,0,GBControl,WBFormat,SBFormat},
+{0,0,0,0,Cf,0,GBControl,WBFormat,SBFormat},
+{0,0,0,0,Cf,0,GBControl,WBFormat,SBFormat},
+{0,0,0,0,Cf,0,GBControl,WBFormat,SBFormat},
+{0,0,0,0,Cf,0,GBControl,WBFormat,SBFormat},
+{0,0,0,0,Cf,0,GBControl,WBFormat,SBFormat},
+{0,0,0,0,Cf,0,GBControl,WBFormat,SBFormat},
+{0,0,0,0,Cf,0,GBControl,WBFormat,SBFormat},
+{0,0,0,220,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,220,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,220,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,220,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,220,Mn,0,GBExtend,WBExtend,SBExtend}
 };
-/* 1D7B0-1D7BF */
+/* 1D180-1D18F */
 static const struct unidata st674[] = {
-{dd3119,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd333,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd996,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd339,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3120,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd7,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3121,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3122,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3123,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd338,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd340,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd341,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3124,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3125,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3126,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd337,0,0,0,Ll,CD,GBOther,WBALetter,SBLower}
+{0,0,0,220,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,220,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,220,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,220,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,220,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther}
 };
-/* 1D7C0-1D7CF */
+/* 1D1A0-1D1AF */
 static const struct unidata st675[] = {
-{dd537,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3127,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3128,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3129,0,0,0,Sm,CD,GBOther,WBOther,SBOther},
-{dd3130,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3131,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3132,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3133,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3134,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3135,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{dd3136,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
-{dd3137,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{dd1070,0,0,0,Nd,CD,GBOther,WBNumeric,SBNumeric},
-{dd9,0,0,0,Nd,CD,GBOther,WBNumeric,SBNumeric}
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther}
 };
-/* 1D7D0-1D7DF */
+/* 1D1B0-1D1BF */
 static const struct unidata st676[] = {
-{dd4,0,0,0,Nd,CD,GBOther,WBNumeric,SBNumeric},
-{dd5,0,0,0,Nd,CD,GBOther,WBNumeric,SBNumeric},
-{dd1071,0,0,0,Nd,CD,GBOther,WBNumeric,SBNumeric},
-{dd1072,0,0,0,Nd,CD,GBOther,WBNumeric,SBNumeric},
-{dd1073,0,0,0,Nd,CD,GBOther,WBNumeric,SBNumeric},
-{dd1074,0,0,0,Nd,CD,GBOther,WBNumeric,SBNumeric},
-{dd1075,0,0,0,Nd,CD,GBOther,WBNumeric,SBNumeric},
-{dd1076,0,0,0,Nd,CD,GBOther,WBNumeric,SBNumeric},
-{dd1070,0,0,0,Nd,CD,GBOther,WBNumeric,SBNumeric},
-{dd9,0,0,0,Nd,CD,GBOther,WBNumeric,SBNumeric},
-{dd4,0,0,0,Nd,CD,GBOther,WBNumeric,SBNumeric},
-{dd5,0,0,0,Nd,CD,GBOther,WBNumeric,SBNumeric},
-{dd1071,0,0,0,Nd,CD,GBOther,WBNumeric,SBNumeric},
-{dd1072,0,0,0,Nd,CD,GBOther,WBNumeric,SBNumeric},
-{dd1073,0,0,0,Nd,CD,GBOther,WBNumeric,SBNumeric},
-{dd1074,0,0,0,Nd,CD,GBOther,WBNumeric,SBNumeric}
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{dd3090,0,0,0,So,0,GBOther,WBOther,SBOther},
+{dd3091,0,0,0,So,0,GBOther,WBOther,SBOther},
+{dd3092,0,0,0,So,0,GBOther,WBOther,SBOther},
+{dd3093,0,0,0,So,0,GBOther,WBOther,SBOther},
+{dd3094,0,0,0,So,0,GBOther,WBOther,SBOther}
 };
-/* 1D7E0-1D7EF */
+/* 1D1C0-1D1CF */
 static const struct unidata st677[] = {
-{dd1075,0,0,0,Nd,CD,GBOther,WBNumeric,SBNumeric},
-{dd1076,0,0,0,Nd,CD,GBOther,WBNumeric,SBNumeric},
-{dd1070,0,0,0,Nd,CD,GBOther,WBNumeric,SBNumeric},
-{dd9,0,0,0,Nd,CD,GBOther,WBNumeric,SBNumeric},
-{dd4,0,0,0,Nd,CD,GBOther,WBNumeric,SBNumeric},
-{dd5,0,0,0,Nd,CD,GBOther,WBNumeric,SBNumeric},
-{dd1071,0,0,0,Nd,CD,GBOther,WBNumeric,SBNumeric},
-{dd1072,0,0,0,Nd,CD,GBOther,WBNumeric,SBNumeric},
-{dd1073,0,0,0,Nd,CD,GBOther,WBNumeric,SBNumeric},
-{dd1074,0,0,0,Nd,CD,GBOther,WBNumeric,SBNumeric},
-{dd1075,0,0,0,Nd,CD,GBOther,WBNumeric,SBNumeric},
-{dd1076,0,0,0,Nd,CD,GBOther,WBNumeric,SBNumeric},
-{dd1070,0,0,0,Nd,CD,GBOther,WBNumeric,SBNumeric},
-{dd9,0,0,0,Nd,CD,GBOther,WBNumeric,SBNumeric},
-{dd4,0,0,0,Nd,CD,GBOther,WBNumeric,SBNumeric},
-{dd5,0,0,0,Nd,CD,GBOther,WBNumeric,SBNumeric}
+{dd3095,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther}
 };
-/* 1D7F0-1D7FF */
+/* 1D240-1D24F */
 static const struct unidata st678[] = {
-{dd1071,0,0,0,Nd,CD,GBOther,WBNumeric,SBNumeric},
-{dd1072,0,0,0,Nd,CD,GBOther,WBNumeric,SBNumeric},
-{dd1073,0,0,0,Nd,CD,GBOther,WBNumeric,SBNumeric},
-{dd1074,0,0,0,Nd,CD,GBOther,WBNumeric,SBNumeric},
-{dd1075,0,0,0,Nd,CD,GBOther,WBNumeric,SBNumeric},
-{dd1076,0,0,0,Nd,CD,GBOther,WBNumeric,SBNumeric},
-{dd1070,0,0,0,Nd,CD,GBOther,WBNumeric,SBNumeric},
-{dd9,0,0,0,Nd,CD,GBOther,WBNumeric,SBNumeric},
-{dd4,0,0,0,Nd,CD,GBOther,WBNumeric,SBNumeric},
-{dd5,0,0,0,Nd,CD,GBOther,WBNumeric,SBNumeric},
-{dd1071,0,0,0,Nd,CD,GBOther,WBNumeric,SBNumeric},
-{dd1072,0,0,0,Nd,CD,GBOther,WBNumeric,SBNumeric},
-{dd1073,0,0,0,Nd,CD,GBOther,WBNumeric,SBNumeric},
-{dd1074,0,0,0,Nd,CD,GBOther,WBNumeric,SBNumeric},
-{dd1075,0,0,0,Nd,CD,GBOther,WBNumeric,SBNumeric},
-{dd1076,0,0,0,Nd,CD,GBOther,WBNumeric,SBNumeric}
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,230,Mn,0,GBExtend,WBExtend,SBExtend},
+{0,0,0,0,So,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
-/* 2A6D0-2A6DF */
+/* 1D370-1D37F */
 static const struct unidata st679[] = {
-{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{0,0,0,0,No,0,GBOther,WBOther,SBOther},
+{0,0,0,0,No,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
@@ -17821,664 +17936,873 @@ static const struct unidata st679[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
-/* 2F800-2F80F */
+/* 1D400-1D40F */
 static const struct unidata st680[] = {
-{dd3138,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3139,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3140,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3141,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3142,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2399,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3143,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3144,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3145,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3146,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2400,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3147,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3148,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3149,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2401,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3150,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+{dd491,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd493,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd1086,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd494,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd495,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd1101,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd497,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd498,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd499,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd500,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd501,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd502,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd503,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd504,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd505,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd507,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper}
 };
-/* 2F810-2F81F */
+/* 1D410-1D41F */
 static const struct unidata st681[] = {
-{dd3151,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3152,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3153,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3154,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3155,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3156,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3157,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3158,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3159,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3160,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3161,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2453,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3162,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd1297,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3163,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3164,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
-};
-/* 2F820-2F82F */
-static const struct unidata st682[] = {
-{dd3165,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3166,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3167,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3168,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3169,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2458,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2402,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2403,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2459,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3170,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3171,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2222,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3172,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2404,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3173,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3174,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+{dd1094,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd508,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd1270,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd509,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd510,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd1126,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd511,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd1131,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd1271,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd1098,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd2,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd515,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd541,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd516,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd517,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd544,0,0,0,Ll,CD,GBOther,WBALetter,SBLower}
 };
-/* 2F830-2F83F */
+/* 1D420-1D42F */
+static const struct unidata st682[] = {
+{dd521,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd284,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd538,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd286,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd522,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd300,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd523,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd1082,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd10,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd528,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd1272,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd287,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd180,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd529,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd530,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd533,0,0,0,Ll,CD,GBOther,WBALetter,SBLower}
+};
+/* 1D430-1D43F */
 static const struct unidata st683[] = {
-{dd3175,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3176,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3176,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3176,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3177,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3178,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3179,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3180,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3181,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3182,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3183,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3184,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3185,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3186,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3187,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3188,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+{dd291,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd301,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd292,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd571,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd491,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd493,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd1086,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd494,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd495,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd1101,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd497,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd498,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd499,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd500,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd501,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd502,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper}
 };
-/* 2F840-2F84F */
+/* 1D440-1D44F */
 static const struct unidata st684[] = {
-{dd3189,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3190,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3191,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3192,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3193,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3194,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3194,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2461,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3195,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3196,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3197,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3198,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2406,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3199,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3200,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3201,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+{dd503,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd504,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd505,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd507,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd1094,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd508,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd1270,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd509,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd510,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd1126,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd511,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd1131,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd1271,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd1098,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd2,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd515,0,0,0,Ll,CD,GBOther,WBALetter,SBLower}
 };
-/* 2F850-2F85F */
+/* 1D450-1D45F */
 static const struct unidata st685[] = {
-{dd2368,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3202,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3203,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3204,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3205,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3206,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3207,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3208,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3209,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3210,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3211,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3212,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3213,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3214,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3215,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3216,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+{dd541,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd516,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd517,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd544,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd521,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{dd538,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd286,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd522,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd300,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd523,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd1082,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd10,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd528,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd1272,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd287,0,0,0,Ll,CD,GBOther,WBALetter,SBLower}
 };
-/* 2F860-2F86F */
+/* 1D460-1D46F */
 static const struct unidata st686[] = {
-{dd3217,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3218,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3219,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3220,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3221,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3222,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3223,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3224,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3225,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3226,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3227,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3227,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3228,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3229,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3230,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2218,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+{dd180,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd529,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd530,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd533,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd291,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd301,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd292,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd571,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd491,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd493,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd1086,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd494,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd495,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd1101,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd497,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd498,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper}
 };
-/* 2F870-2F87F */
+/* 1D470-1D47F */
 static const struct unidata st687[] = {
-{dd3231,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3232,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3233,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3234,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3235,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd1323,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3236,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3237,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd1325,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3238,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3239,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3240,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3241,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3242,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3243,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3244,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+{dd499,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd500,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd501,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd502,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd503,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd504,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd505,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd507,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd1094,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd508,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd1270,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd509,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd510,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd1126,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd511,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd1131,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper}
 };
-/* 2F880-2F88F */
+/* 1D480-1D48F */
 static const struct unidata st688[] = {
-{dd3245,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3246,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3247,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3248,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3249,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3250,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3251,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3252,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3253,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3254,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3255,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3256,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3257,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3258,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2166,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3259,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+{dd1271,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd1098,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd2,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd515,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd541,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd516,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd517,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd544,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd521,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd284,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd538,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd286,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd522,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd300,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd523,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd1082,0,0,0,Ll,CD,GBOther,WBALetter,SBLower}
 };
-/* 2F890-2F89F */
+/* 1D490-1D49F */
 static const struct unidata st689[] = {
-{dd1335,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3260,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3260,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3261,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3262,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3262,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3263,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3264,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3265,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3266,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3267,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3268,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3269,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3270,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3271,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3272,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
-};
-/* 2F8A0-2F8AF */
-static const struct unidata st690[] = {
-{dd3273,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3274,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3275,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2411,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3276,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3277,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3278,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3279,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2473,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3279,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3280,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2413,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3281,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3282,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3283,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3284,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+{dd10,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd528,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd1272,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd287,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd180,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd529,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd530,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd533,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd291,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd301,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd292,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd571,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd491,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{dd1086,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd494,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper}
 };
-/* 2F8B0-2F8BF */
+/* 1D4A0-1D4AF */
+static const struct unidata st690[] = {
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{dd497,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{dd500,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd501,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{dd504,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd505,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd507,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd1094,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{dd1270,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd509,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper}
+};
+/* 1D4B0-1D4BF */
 static const struct unidata st691[] = {
-{dd2414,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2139,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3285,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3286,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3287,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3288,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3289,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3290,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3291,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3292,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3293,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3294,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3295,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3296,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3297,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3298,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+{dd510,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd1126,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd511,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd1131,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd1271,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd1098,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd2,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd515,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd541,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd516,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{dd544,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{dd284,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd538,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd286,0,0,0,Ll,CD,GBOther,WBALetter,SBLower}
 };
-/* 2F8C0-2F8CF */
+/* 1D4C0-1D4CF */
 static const struct unidata st692[] = {
-{dd3299,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3300,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3301,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3302,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3303,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3304,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3305,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3306,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2415,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3307,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3308,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3309,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3310,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3311,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3312,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2417,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+{dd522,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd300,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd523,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd1082,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{dd528,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd1272,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd287,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd180,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd529,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd530,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd533,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd291,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd301,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd292,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd571,0,0,0,Ll,CD,GBOther,WBALetter,SBLower}
 };
-/* 2F8D0-2F8DF */
+/* 1D500-1D50F */
 static const struct unidata st693[] = {
-{dd3313,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3314,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3315,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3316,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3317,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3318,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3319,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3320,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2167,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2481,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3321,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3322,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3323,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3324,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3325,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3326,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+{dd291,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd301,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd292,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd571,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd491,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd493,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{dd494,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd495,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd1101,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd497,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{dd500,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd501,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd502,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper}
 };
-/* 2F8E0-2F8EF */
+/* 1D510-1D51F */
 static const struct unidata st694[] = {
-{dd3327,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3328,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2418,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3329,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3330,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3331,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3332,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2523,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3333,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3334,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3335,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3336,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3337,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3338,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3339,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3340,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+{dd503,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd504,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd505,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd507,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd1094,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{dd1270,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd509,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd510,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd1126,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd511,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd1131,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd1271,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{dd2,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd515,0,0,0,Ll,CD,GBOther,WBALetter,SBLower}
 };
-/* 2F8F0-2F8FF */
+/* 1D520-1D52F */
 static const struct unidata st695[] = {
-{dd3341,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3342,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3343,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3344,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3345,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2235,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3346,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3347,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3348,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3349,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3350,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3351,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3352,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3353,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3354,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3355,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+{dd541,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd516,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd517,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd544,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd521,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd284,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd538,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd286,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd522,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd300,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd523,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd1082,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd10,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd528,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd1272,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd287,0,0,0,Ll,CD,GBOther,WBALetter,SBLower}
 };
-/* 2F900-2F90F */
+/* 1D530-1D53F */
 static const struct unidata st696[] = {
-{dd3356,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2419,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2318,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3357,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3358,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3359,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3360,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3361,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3362,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3363,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3364,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2484,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3365,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3366,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3367,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3368,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+{dd180,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd529,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd530,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd533,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd291,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd301,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd292,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd571,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd491,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd493,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{dd494,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd495,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd1101,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd497,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
-/* 2F910-2F91F */
+/* 1D540-1D54F */
 static const struct unidata st697[] = {
-{dd3369,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3370,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3371,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3372,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2485,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3373,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3374,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3375,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3376,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3377,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3378,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3379,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3380,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3381,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3382,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3383,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
-};
-/* 2F920-2F92F */
-static const struct unidata st698[] = {
-{dd3384,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2487,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3385,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3386,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3387,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3388,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3389,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3390,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3391,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3392,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3393,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3394,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3395,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3395,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3396,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3397,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+{dd499,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd500,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd501,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd502,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd503,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{dd505,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{dd1270,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd509,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd510,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd1126,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd511,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd1131,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper}
 };
-/* 2F930-2F93F */
+/* 1D550-1D55F */
+static const struct unidata st698[] = {
+{dd1271,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{dd2,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd515,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd541,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd516,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd517,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd544,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd521,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd284,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd538,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd286,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd522,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd300,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd523,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd1082,0,0,0,Ll,CD,GBOther,WBALetter,SBLower}
+};
+/* 1D560-1D56F */
 static const struct unidata st699[] = {
-{dd2489,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3398,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3399,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3400,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3401,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3402,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3403,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3404,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2221,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3405,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3406,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3407,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3408,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3409,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3410,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3411,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+{dd10,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd528,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd1272,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd287,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd180,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd529,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd530,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd533,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd291,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd301,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd292,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd571,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd491,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd493,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd1086,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd494,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper}
 };
-/* 2F940-2F94F */
+/* 1D570-1D57F */
 static const struct unidata st700[] = {
-{dd2495,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3412,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3413,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3414,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3415,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3416,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3417,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3417,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2496,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2525,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3418,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3419,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3420,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3421,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3422,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2184,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+{dd495,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd1101,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd497,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd498,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd499,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd500,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd501,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd502,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd503,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd504,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd505,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd507,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd1094,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd508,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd1270,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd509,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper}
 };
-/* 2F950-2F95F */
+/* 1D580-1D58F */
 static const struct unidata st701[] = {
-{dd2498,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3423,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3424,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2429,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3425,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3426,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2388,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3427,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3428,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2432,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3429,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3430,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3431,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3432,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3432,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3433,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+{dd510,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd1126,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd511,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd1131,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd1271,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd1098,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd2,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd515,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd541,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd516,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd517,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd544,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd521,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd284,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd538,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd286,0,0,0,Ll,CD,GBOther,WBALetter,SBLower}
 };
-/* 2F960-2F96F */
+/* 1D590-1D59F */
 static const struct unidata st702[] = {
-{dd3434,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3435,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3436,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3437,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3438,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3439,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3440,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3441,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3442,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3443,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3444,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3445,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3446,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3447,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3448,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3449,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+{dd522,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd300,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd523,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd1082,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd10,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd528,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd1272,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd287,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd180,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd529,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd530,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd533,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd291,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd301,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd292,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd571,0,0,0,Ll,CD,GBOther,WBALetter,SBLower}
 };
-/* 2F970-2F97F */
+/* 1D6A0-1D6AF */
 static const struct unidata st703[] = {
-{dd3450,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3451,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3452,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3453,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3454,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3455,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3456,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3457,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3458,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3459,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2438,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3460,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3461,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3462,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3463,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3464,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+{dd291,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd301,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd292,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd571,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3096,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3097,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{dd3098,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3099,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd1107,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3100,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3101,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3102,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3103,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd342,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper}
 };
-/* 2F980-2F98F */
+/* 1D6B0-1D6BF */
 static const struct unidata st704[] = {
-{dd3465,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3466,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3467,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3468,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3469,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3470,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3471,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3472,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3473,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3474,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3475,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3261,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3476,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3477,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3478,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3479,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+{dd3104,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3105,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3106,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3107,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3108,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3109,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3110,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd1108,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3111,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3112,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd344,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3113,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd334,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3114,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3115,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3116,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper}
 };
-/* 2F990-2F99F */
+/* 1D6C0-1D6CF */
 static const struct unidata st705[] = {
-{dd3480,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3481,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3482,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3483,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3484,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3485,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3486,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3487,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2238,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3488,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3489,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3490,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3491,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3492,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3493,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2441,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
-};
-/* 2F9A0-2F9AF */
+{dd1099,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3117,0,0,0,Sm,CD,GBOther,WBOther,SBOther},
+{dd3118,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd332,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd535,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd536,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd343,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3119,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3120,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd333,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd996,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd339,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3121,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd7,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3122,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3123,0,0,0,Ll,CD,GBOther,WBALetter,SBLower}
+};
+/* 1D6D0-1D6DF */
 static const struct unidata st706[] = {
-{dd3494,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3495,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3496,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3497,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3498,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3499,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3500,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3501,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3502,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3503,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3504,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3505,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3506,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3507,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3508,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3509,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+{dd3124,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd338,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd340,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd341,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3125,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3126,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3127,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd337,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd537,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3128,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3129,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3130,0,0,0,Sm,CD,GBOther,WBOther,SBOther},
+{dd3131,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3132,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3133,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3134,0,0,0,Ll,CD,GBOther,WBALetter,SBLower}
 };
-/* 2F9B0-2F9BF */
+/* 1D6E0-1D6EF */
 static const struct unidata st707[] = {
-{dd3510,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3511,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3512,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3513,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2179,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3514,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3515,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3516,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3517,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3518,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3519,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2505,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3520,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3521,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3522,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3523,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+{dd3135,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3136,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3098,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3099,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd1107,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3100,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3101,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3102,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3103,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd342,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3104,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3105,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3106,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3107,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3108,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3109,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper}
 };
-/* 2F9C0-2F9CF */
+/* 1D6F0-1D6FF */
 static const struct unidata st708[] = {
-{dd3524,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3525,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3526,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3527,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd1425,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3528,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3529,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3530,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3531,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3532,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3533,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3534,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3535,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3536,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3537,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3538,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+{dd3110,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd1108,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3111,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3112,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd344,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3113,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd334,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3114,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3115,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3116,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd1099,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3117,0,0,0,Sm,CD,GBOther,WBOther,SBOther},
+{dd3118,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd332,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd535,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd536,0,0,0,Ll,CD,GBOther,WBALetter,SBLower}
 };
-/* 2F9D0-2F9DF */
+/* 1D700-1D70F */
 static const struct unidata st709[] = {
-{dd2510,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2511,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd1432,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3539,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3540,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3541,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3542,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3543,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3544,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3545,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3546,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3547,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3548,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3549,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3550,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2512,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+{dd343,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3119,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3120,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd333,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd996,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd339,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3121,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd7,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3122,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3123,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3124,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd338,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd340,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd341,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3125,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3126,0,0,0,Ll,CD,GBOther,WBALetter,SBLower}
 };
-/* 2F9E0-2F9EF */
+/* 1D710-1D71F */
 static const struct unidata st710[] = {
-{dd3551,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3552,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3553,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3554,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3555,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3556,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3557,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3558,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3559,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3560,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3561,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3562,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3563,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3564,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3565,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3566,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+{dd3127,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd337,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd537,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3128,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3129,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3130,0,0,0,Sm,CD,GBOther,WBOther,SBOther},
+{dd3131,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3132,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3133,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3134,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3135,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3136,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3098,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3099,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd1107,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3100,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper}
 };
-/* 2F9F0-2F9FF */
+/* 1D720-1D72F */
 static const struct unidata st711[] = {
-{dd3567,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3568,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3569,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3570,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3571,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3572,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3573,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3574,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3575,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3576,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3577,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3578,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3579,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3580,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2518,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2518,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+{dd3101,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3102,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3103,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd342,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3104,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3105,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3106,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3107,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3108,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3109,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3110,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd1108,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3111,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3112,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd344,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3113,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper}
 };
-/* 2FA00-2FA0F */
+/* 1D730-1D73F */
 static const struct unidata st712[] = {
-{dd3581,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3582,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3583,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3584,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3585,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3586,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3587,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3588,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3589,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3590,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd2519,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3591,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3592,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3593,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3594,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3595,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+{dd334,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3114,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3115,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3116,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd1099,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3117,0,0,0,Sm,CD,GBOther,WBOther,SBOther},
+{dd3118,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd332,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd535,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd536,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd343,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3119,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3120,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd333,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd996,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd339,0,0,0,Ll,CD,GBOther,WBALetter,SBLower}
 };
-/* 2FA10-2FA1F */
+/* 1D740-1D74F */
 static const struct unidata st713[] = {
-{dd3596,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3597,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3598,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3599,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3600,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd1480,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3601,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd1484,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3602,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3603,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3604,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3605,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd1489,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{dd3606,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
-};
-/* E0000-E000F */
-static const struct unidata st714[] = {
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cf,0,GBControl,WBFormat,SBFormat},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
-{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{dd3121,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd7,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3122,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3123,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3124,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd338,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd340,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd341,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3125,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3126,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3127,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd337,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd537,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3128,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3129,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3130,0,0,0,Sm,CD,GBOther,WBOther,SBOther}
+};
+/* 1D750-1D75F */
+static const struct unidata st714[] = {
+{dd3131,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3132,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3133,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3134,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3135,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3136,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3098,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3099,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd1107,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3100,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3101,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3102,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3103,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd342,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3104,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3105,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper}
+};
+/* 1D760-1D76F */
+static const struct unidata st715[] = {
+{dd3106,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3107,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3108,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3109,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3110,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd1108,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3111,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3112,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd344,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3113,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd334,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3114,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3115,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3116,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd1099,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3117,0,0,0,Sm,CD,GBOther,WBOther,SBOther}
+};
+/* 1D770-1D77F */
+static const struct unidata st716[] = {
+{dd3118,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd332,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd535,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd536,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd343,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3119,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3120,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd333,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd996,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd339,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3121,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd7,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3122,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3123,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3124,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd338,0,0,0,Ll,CD,GBOther,WBALetter,SBLower}
+};
+/* 1D780-1D78F */
+static const struct unidata st717[] = {
+{dd340,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd341,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3125,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3126,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3127,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd337,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd537,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3128,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3129,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3130,0,0,0,Sm,CD,GBOther,WBOther,SBOther},
+{dd3131,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3132,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3133,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3134,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3135,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3136,0,0,0,Ll,CD,GBOther,WBALetter,SBLower}
+};
+/* 1D790-1D79F */
+static const struct unidata st718[] = {
+{dd3098,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3099,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd1107,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3100,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3101,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3102,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3103,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd342,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3104,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3105,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3106,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3107,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3108,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3109,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3110,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd1108,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper}
+};
+/* 1D7A0-1D7AF */
+static const struct unidata st719[] = {
+{dd3111,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3112,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd344,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3113,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd334,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3114,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3115,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3116,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd1099,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3117,0,0,0,Sm,CD,GBOther,WBOther,SBOther},
+{dd3118,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd332,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd535,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd536,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd343,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3119,0,0,0,Ll,CD,GBOther,WBALetter,SBLower}
+};
+/* 1D7B0-1D7BF */
+static const struct unidata st720[] = {
+{dd3120,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd333,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd996,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd339,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3121,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd7,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3122,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3123,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3124,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd338,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd340,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd341,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3125,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3126,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3127,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd337,0,0,0,Ll,CD,GBOther,WBALetter,SBLower}
+};
+/* 1D7C0-1D7CF */
+static const struct unidata st721[] = {
+{dd537,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3128,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3129,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3130,0,0,0,Sm,CD,GBOther,WBOther,SBOther},
+{dd3131,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3132,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3133,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3134,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3135,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3136,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{dd3137,0,0,0,Lu,CD,GBOther,WBALetter,SBUpper},
+{dd3138,0,0,0,Ll,CD,GBOther,WBALetter,SBLower},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{dd1070,0,0,0,Nd,CD,GBOther,WBNumeric,SBNumeric},
+{dd9,0,0,0,Nd,CD,GBOther,WBNumeric,SBNumeric}
+};
+/* 1D7D0-1D7DF */
+static const struct unidata st722[] = {
+{dd4,0,0,0,Nd,CD,GBOther,WBNumeric,SBNumeric},
+{dd5,0,0,0,Nd,CD,GBOther,WBNumeric,SBNumeric},
+{dd1071,0,0,0,Nd,CD,GBOther,WBNumeric,SBNumeric},
+{dd1072,0,0,0,Nd,CD,GBOther,WBNumeric,SBNumeric},
+{dd1073,0,0,0,Nd,CD,GBOther,WBNumeric,SBNumeric},
+{dd1074,0,0,0,Nd,CD,GBOther,WBNumeric,SBNumeric},
+{dd1075,0,0,0,Nd,CD,GBOther,WBNumeric,SBNumeric},
+{dd1076,0,0,0,Nd,CD,GBOther,WBNumeric,SBNumeric},
+{dd1070,0,0,0,Nd,CD,GBOther,WBNumeric,SBNumeric},
+{dd9,0,0,0,Nd,CD,GBOther,WBNumeric,SBNumeric},
+{dd4,0,0,0,Nd,CD,GBOther,WBNumeric,SBNumeric},
+{dd5,0,0,0,Nd,CD,GBOther,WBNumeric,SBNumeric},
+{dd1071,0,0,0,Nd,CD,GBOther,WBNumeric,SBNumeric},
+{dd1072,0,0,0,Nd,CD,GBOther,WBNumeric,SBNumeric},
+{dd1073,0,0,0,Nd,CD,GBOther,WBNumeric,SBNumeric},
+{dd1074,0,0,0,Nd,CD,GBOther,WBNumeric,SBNumeric}
+};
+/* 1D7E0-1D7EF */
+static const struct unidata st723[] = {
+{dd1075,0,0,0,Nd,CD,GBOther,WBNumeric,SBNumeric},
+{dd1076,0,0,0,Nd,CD,GBOther,WBNumeric,SBNumeric},
+{dd1070,0,0,0,Nd,CD,GBOther,WBNumeric,SBNumeric},
+{dd9,0,0,0,Nd,CD,GBOther,WBNumeric,SBNumeric},
+{dd4,0,0,0,Nd,CD,GBOther,WBNumeric,SBNumeric},
+{dd5,0,0,0,Nd,CD,GBOther,WBNumeric,SBNumeric},
+{dd1071,0,0,0,Nd,CD,GBOther,WBNumeric,SBNumeric},
+{dd1072,0,0,0,Nd,CD,GBOther,WBNumeric,SBNumeric},
+{dd1073,0,0,0,Nd,CD,GBOther,WBNumeric,SBNumeric},
+{dd1074,0,0,0,Nd,CD,GBOther,WBNumeric,SBNumeric},
+{dd1075,0,0,0,Nd,CD,GBOther,WBNumeric,SBNumeric},
+{dd1076,0,0,0,Nd,CD,GBOther,WBNumeric,SBNumeric},
+{dd1070,0,0,0,Nd,CD,GBOther,WBNumeric,SBNumeric},
+{dd9,0,0,0,Nd,CD,GBOther,WBNumeric,SBNumeric},
+{dd4,0,0,0,Nd,CD,GBOther,WBNumeric,SBNumeric},
+{dd5,0,0,0,Nd,CD,GBOther,WBNumeric,SBNumeric}
+};
+/* 1D7F0-1D7FF */
+static const struct unidata st724[] = {
+{dd1071,0,0,0,Nd,CD,GBOther,WBNumeric,SBNumeric},
+{dd1072,0,0,0,Nd,CD,GBOther,WBNumeric,SBNumeric},
+{dd1073,0,0,0,Nd,CD,GBOther,WBNumeric,SBNumeric},
+{dd1074,0,0,0,Nd,CD,GBOther,WBNumeric,SBNumeric},
+{dd1075,0,0,0,Nd,CD,GBOther,WBNumeric,SBNumeric},
+{dd1076,0,0,0,Nd,CD,GBOther,WBNumeric,SBNumeric},
+{dd1070,0,0,0,Nd,CD,GBOther,WBNumeric,SBNumeric},
+{dd9,0,0,0,Nd,CD,GBOther,WBNumeric,SBNumeric},
+{dd4,0,0,0,Nd,CD,GBOther,WBNumeric,SBNumeric},
+{dd5,0,0,0,Nd,CD,GBOther,WBNumeric,SBNumeric},
+{dd1071,0,0,0,Nd,CD,GBOther,WBNumeric,SBNumeric},
+{dd1072,0,0,0,Nd,CD,GBOther,WBNumeric,SBNumeric},
+{dd1073,0,0,0,Nd,CD,GBOther,WBNumeric,SBNumeric},
+{dd1074,0,0,0,Nd,CD,GBOther,WBNumeric,SBNumeric},
+{dd1075,0,0,0,Nd,CD,GBOther,WBNumeric,SBNumeric},
+{dd1076,0,0,0,Nd,CD,GBOther,WBNumeric,SBNumeric}
+};
+/* 2A6D0-2A6DF */
+static const struct unidata st725[] = {
+{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{0,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
@@ -18486,12186 +18810,8179 @@ static const struct unidata st714[] = {
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
 {0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
 };
-/* E0020-E002F */
-static const struct unidata st715[] = {
-{0,0,0,0,Cf,0,GBControl,WBFormat,SBFormat},
-{0,0,0,0,Cf,0,GBControl,WBFormat,SBFormat},
-{0,0,0,0,Cf,0,GBControl,WBFormat,SBFormat},
-{0,0,0,0,Cf,0,GBControl,WBFormat,SBFormat},
-{0,0,0,0,Cf,0,GBControl,WBFormat,SBFormat},
-{0,0,0,0,Cf,0,GBControl,WBFormat,SBFormat},
-{0,0,0,0,Cf,0,GBControl,WBFormat,SBFormat},
-{0,0,0,0,Cf,0,GBControl,WBFormat,SBFormat},
-{0,0,0,0,Cf,0,GBControl,WBFormat,SBFormat},
-{0,0,0,0,Cf,0,GBControl,WBFormat,SBFormat},
-{0,0,0,0,Cf,0,GBControl,WBFormat,SBFormat},
-{0,0,0,0,Cf,0,GBControl,WBFormat,SBFormat},
-{0,0,0,0,Cf,0,GBControl,WBFormat,SBFormat},
-{0,0,0,0,Cf,0,GBControl,WBFormat,SBFormat},
-{0,0,0,0,Cf,0,GBControl,WBFormat,SBFormat},
-{0,0,0,0,Cf,0,GBControl,WBFormat,SBFormat}
+/* 2F800-2F80F */
+static const struct unidata st726[] = {
+{dd3139,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3140,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3141,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3142,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3143,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2400,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3144,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3145,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3146,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3147,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2401,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3148,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3149,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3150,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2402,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3151,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
 };
-const struct unidata *const unidata[]={
-st0,
-st1,
-st2,
-st3,
-st4,
-st5,
-st6,
-st7,
-st8,
-st1,
-st9,
-st10,
-st11,
-st12,
-st13,
-st14,
-st15,
-st16,
-st17,
-st18,
-st19,
-st20,
-st21,
-st22,
-st23,
-st24,
-st25,
-st26,
-st27,
-st28,
-st29,
-st30,
-st31,
-st32,
-st33,
-st34,
-st35,
-st36,
-st36,
-st36,
-st36,
-st37,
-st36,
-st38,
-st39,
-st40,
-st41,
-st42,
-st43,
-st44,
-st45,
-st46,
-st47,
-st48,
-st49,
-st50,
-st51,
-st52,
-st53,
-st54,
-st55,
-st56,
-st57,
-st58,
-st59,
-st60,
-st61,
-st62,
-st63,
-st64,
-st65,
-st66,
-st67,
-st68,
-st69,
-st70,
-st71,
-st72,
-st73,
-st74,
-st75,
-st76,
-st77,
-st78,
-st79,
-st80,
-st81,
-st36,
-st82,
-st83,
-st84,
-st85,
-st86,
-st87,
-st88,
-st89,
-st90,
-st91,
-st92,
-st88,
-st93,
-st94,
-st95,
-st96,
-st87,
-st87,
-st87,
-st87,
-st97,
-st98,
-st99,
-st100,
-st101,
-st102,
-st87,
-st103,
-st104,
-st87,
-st105,
-st77,
-st87,
-st87,
-st106,
-st107,
-st108,
-st87,
-st109,
-st110,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st111,
-st87,
-st112,
-st113,
-st114,
-st115,
-st116,
-st117,
-st118,
-st119,
-st120,
-st121,
-st122,
-st123,
-st124,
-st125,
-st126,
-st119,
-st120,
-st127,
-st128,
-st129,
-st130,
-st131,
-st132,
-st133,
-st120,
-st134,
-st135,
-st136,
-st124,
-st137,
-st118,
-st119,
-st120,
-st138,
-st139,
-st140,
-st141,
-st142,
-st143,
-st144,
-st145,
-st146,
-st147,
-st148,
-st130,
-st149,
-st150,
-st151,
-st120,
-st152,
-st153,
-st154,
-st141,
-st77,
-st155,
-st151,
-st120,
-st156,
-st157,
-st158,
-st124,
-st159,
-st155,
-st151,
-st120,
-st146,
-st160,
-st148,
-st141,
-st77,
-st161,
-st162,
-st87,
-st163,
-st164,
-st165,
-st77,
-st166,
-st167,
-st168,
-st168,
-st169,
-st170,
-st171,
-st77,
-st77,
-st172,
-st173,
-st174,
-st175,
-st176,
-st177,
-st77,
-st77,
-st178,
-st179,
-st180,
-st181,
-st182,
-st183,
-st184,
-st185,
-st186,
-st187,
-st188,
-st189,
-st190,
-st191,
-st77,
-st77,
-st168,
-st168,
-st192,
-st193,
-st194,
-st195,
-st77,
-st77,
-st77,
-st77,
-st196,
-st197,
-st198,
-st87,
-st87,
-st199,
-st200,
-st200,
-st200,
-st200,
-st200,
-st201,
-st202,
-st202,
-st202,
-st202,
-st203,
-st204,
-st204,
-st204,
-st204,
-st205,
-st87,
-st87,
-st87,
-st87,
-st206,
-st207,
-st87,
-st87,
-st206,
-st87,
-st87,
-st208,
-st209,
-st210,
-st87,
-st87,
-st87,
-st209,
-st87,
-st87,
-st87,
-st211,
-st212,
-st213,
-st87,
-st214,
-st87,
-st87,
-st87,
-st87,
-st87,
-st215,
-st216,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st217,
-st218,
-st219,
-st220,
-st87,
-st87,
-st87,
-st87,
-st221,
-st222,
-st223,
-st224,
-st87,
-st225,
-st87,
-st226,
-st223,
-st227,
-st168,
-st168,
-st168,
-st228,
-st229,
-st230,
-st231,
-st232,
-st233,
-st231,
-st87,
-st87,
-st234,
-st87,
-st87,
-st235,
-st87,
-st87,
-st236,
-st77,
-st77,
-st77,
-st77,
-st77,
-st87,
-st237,
-st238,
-st239,
-st240,
-st168,
-st241,
-st242,
-st168,
-st168,
-st243,
-st244,
-st245,
-st246,
-st247,
-st247,
-st87,
-st248,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st249,
-st250,
-st87,
-st251,
-st252,
-st253,
-st254,
-st255,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st36,
-st36,
-st256,
-st257,
-st258,
-st259,
-st260,
-st261,
-st36,
-st262,
-st263,
-st264,
-st265,
-st77,
-st77,
-st266,
-st267,
-st268,
-st269,
-st270,
-st271,
-st272,
-st273,
-st274,
-st275,
-st276,
-st277,
-st278,
-st279,
-st280,
-st281,
-st282,
-st283,
-st284,
-st285,
-st286,
-st287,
-st288,
-st289,
-st290,
-st291,
-st292,
-st293,
-st294,
-st295,
-st296,
-st297,
-st298,
-st299,
-st300,
-st301,
-st302,
-st303,
-st304,
-st305,
-st306,
-st307,
-st308,
-st309,
-st310,
-st77,
-st311,
-st312,
-st77,
-st313,
-st314,
-st315,
-st316,
-st317,
-st318,
-st319,
-st320,
-st321,
-st322,
-st323,
-st247,
-st324,
-st325,
-st247,
-st326,
-st327,
-st328,
-st329,
-st330,
-st331,
-st328,
-st332,
-st333,
-st334,
-st335,
-st336,
-st337,
-st328,
-st328,
-st338,
-st328,
-st339,
-st247,
-st340,
-st247,
-st247,
-st247,
-st247,
-st341,
-st247,
-st342,
-st328,
-st343,
-st247,
-st344,
-st345,
-st77,
-st247,
-st247,
-st346,
-st77,
-st347,
-st77,
-st348,
-st349,
-st350,
-st351,
-st352,
-st353,
-st354,
-st355,
-st356,
-st357,
-st247,
-st247,
-st247,
-st247,
-st247,
-st247,
-st247,
-st247,
-st247,
-st247,
-st247,
-st358,
-st359,
-st247,
-st247,
-st360,
-st247,
-st247,
-st247,
-st247,
-st247,
-st247,
-st361,
-st247,
-st247,
-st362,
-st247,
-st363,
-st77,
-st77,
-st77,
-st77,
-st364,
-st247,
-st365,
-st247,
-st366,
-st367,
-st368,
-st369,
-st357,
-st370,
-st247,
-st371,
-st372,
-st328,
-st373,
-st328,
-st247,
-st247,
-st247,
-st247,
-st247,
-st247,
-st247,
-st247,
-st247,
-st247,
-st247,
-st247,
-st247,
-st247,
-st247,
-st247,
-st328,
-st328,
-st328,
-st328,
-st328,
-st328,
-st328,
-st328,
-st374,
-st375,
-st328,
-st328,
-st328,
-st376,
-st328,
-st377,
-st378,
-st328,
-st328,
-st328,
-st328,
-st328,
-st328,
-st379,
-st328,
-st328,
-st328,
-st328,
-st328,
-st380,
-st328,
-st328,
-st247,
-st347,
-st381,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st382,
-st383,
-st384,
-st36,
-st36,
-st385,
-st386,
-st387,
-st388,
-st389,
-st390,
-st391,
-st392,
-st393,
-st394,
-st395,
-st36,
-st36,
-st396,
-st87,
-st87,
-st87,
-st397,
-st77,
-st87,
-st218,
-st398,
-st398,
-st398,
-st398,
-st77,
-st77,
-st399,
-st400,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st247,
-st401,
-st247,
-st247,
-st247,
-st247,
-st247,
-st402,
-st403,
-st404,
-st405,
-st406,
-st407,
-st408,
-st409,
-st410,
-st411,
-st412,
-st413,
-st414,
-st415,
-st416,
-st77,
-st417,
-st418,
-st419,
-st420,
-st421,
-st422,
-st423,
-st424,
-st425,
-st168,
-st426,
-st427,
-st428,
-st429,
-st430,
-st431,
-st432,
-st433,
-st87,
-st237,
-st434,
-st435,
-st436,
-st437,
-st438,
-st439,
-st440,
-st87,
-st235,
-st247,
-st77,
-st77,
-st441,
-st442,
-st443,
-st444,
-st445,
-st446,
-st447,
-st448,
-st449,
-st450,
-st451,
-st452,
-st453,
-st454,
-st455,
-st456,
-st457,
-st458,
-st459,
-st460,
-st461,
-st462,
-st463,
-st464,
-st465,
-st466,
-st467,
-st468,
-st469,
-st470,
-st471,
-st472,
-st473,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st474,
-st247,
-st247,
-st247,
-st247,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st475,
-st77,
-st77,
-st77,
-st77,
-st87,
-st476,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st237,
-st247,
-st247,
-st247,
-st346,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st42,
-st477,
-st478,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st479,
-st87,
-st480,
-st77,
-st87,
-st87,
-st87,
-st481,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st482,
-st483,
-st484,
-st485,
-st484,
-st486,
-st484,
-st482,
-st483,
-st484,
-st485,
-st484,
-st486,
-st484,
-st482,
-st483,
-st484,
-st485,
-st484,
-st486,
-st484,
-st482,
-st483,
-st484,
-st485,
-st484,
-st486,
-st484,
-st482,
-st483,
-st484,
-st485,
-st484,
-st486,
-st484,
-st482,
-st483,
-st484,
-st485,
-st484,
-st486,
-st484,
-st482,
-st483,
-st484,
-st485,
-st484,
-st486,
-st484,
-st482,
-st483,
-st484,
-st485,
-st484,
-st486,
-st484,
-st482,
-st483,
-st484,
-st485,
-st484,
-st486,
-st484,
-st482,
-st483,
-st484,
-st485,
-st484,
-st486,
-st484,
-st482,
-st483,
-st484,
-st485,
-st484,
-st486,
-st484,
-st482,
-st483,
-st484,
-st485,
-st484,
-st486,
-st484,
-st482,
-st483,
-st484,
-st485,
-st484,
-st486,
-st484,
-st482,
-st483,
-st484,
-st485,
-st484,
-st486,
-st484,
-st482,
-st483,
-st484,
-st485,
-st484,
-st486,
-st484,
-st482,
-st483,
-st484,
-st485,
-st484,
-st486,
-st484,
-st482,
-st483,
-st484,
-st485,
-st484,
-st486,
-st484,
-st482,
-st483,
-st484,
-st485,
-st484,
-st486,
-st484,
-st482,
-st483,
-st484,
-st485,
-st484,
-st486,
-st484,
-st482,
-st483,
-st484,
-st485,
-st484,
-st486,
-st484,
-st482,
-st483,
-st484,
-st485,
-st484,
-st486,
-st484,
-st482,
-st483,
-st484,
-st485,
-st484,
-st486,
-st484,
-st482,
-st483,
-st484,
-st485,
-st484,
-st486,
-st484,
-st482,
-st483,
-st484,
-st485,
-st484,
-st486,
-st484,
-st482,
-st483,
-st484,
-st485,
-st484,
-st486,
-st484,
-st482,
-st483,
-st484,
-st485,
-st484,
-st486,
-st484,
-st482,
-st483,
-st484,
-st485,
-st484,
-st486,
-st484,
-st482,
-st483,
-st484,
-st485,
-st484,
-st486,
-st484,
-st482,
-st483,
-st484,
-st485,
-st484,
-st486,
-st484,
-st482,
-st483,
-st484,
-st485,
-st484,
-st486,
-st484,
-st482,
-st483,
-st484,
-st485,
-st484,
-st486,
-st484,
-st482,
-st483,
-st484,
-st485,
-st484,
-st486,
-st484,
-st482,
-st483,
-st484,
-st485,
-st484,
-st486,
-st484,
-st482,
-st483,
-st484,
-st485,
-st484,
-st486,
-st484,
-st482,
-st483,
-st484,
-st485,
-st484,
-st486,
-st484,
-st482,
-st483,
-st484,
-st485,
-st484,
-st486,
-st484,
-st482,
-st483,
-st484,
-st485,
-st484,
-st486,
-st484,
-st482,
-st483,
-st484,
-st485,
-st484,
-st486,
-st484,
-st482,
-st483,
-st484,
-st485,
-st484,
-st486,
-st484,
-st482,
-st483,
-st484,
-st485,
-st484,
-st486,
-st484,
-st482,
-st483,
-st484,
-st485,
-st484,
-st486,
-st484,
-st482,
-st483,
-st484,
-st485,
-st484,
-st486,
-st484,
-st482,
-st483,
-st484,
-st485,
-st484,
-st486,
-st484,
-st482,
-st483,
-st484,
-st485,
-st484,
-st486,
-st484,
-st482,
-st483,
-st484,
-st485,
-st484,
-st486,
-st484,
-st482,
-st483,
-st484,
-st485,
-st484,
-st486,
-st484,
-st482,
-st483,
-st484,
-st485,
-st484,
-st486,
-st484,
-st482,
-st483,
-st484,
-st485,
-st484,
-st486,
-st484,
-st482,
-st483,
-st484,
-st485,
-st484,
-st486,
-st484,
-st482,
-st483,
-st484,
-st485,
-st484,
-st486,
-st484,
-st482,
-st483,
-st484,
-st485,
-st484,
-st486,
-st484,
-st482,
-st483,
-st484,
-st485,
-st484,
-st486,
-st484,
-st482,
-st483,
-st484,
-st485,
-st484,
-st486,
-st484,
-st482,
-st483,
-st484,
-st485,
-st484,
-st486,
-st484,
-st482,
-st483,
-st484,
-st485,
-st484,
-st486,
-st484,
-st482,
-st483,
-st484,
-st485,
-st484,
-st486,
-st484,
-st482,
-st483,
-st484,
-st485,
-st484,
-st486,
-st484,
-st482,
-st483,
-st484,
-st485,
-st484,
-st486,
-st484,
-st482,
-st483,
-st484,
-st485,
-st484,
-st486,
-st484,
-st482,
-st483,
-st484,
-st485,
-st484,
-st486,
-st484,
-st482,
-st483,
-st484,
-st485,
-st484,
-st486,
-st484,
-st482,
-st483,
-st484,
-st485,
-st484,
-st486,
-st484,
-st482,
-st483,
-st484,
-st485,
-st484,
-st486,
-st484,
-st482,
-st483,
-st484,
-st485,
-st484,
-st486,
-st484,
-st482,
-st483,
-st484,
-st485,
-st484,
-st486,
-st484,
-st482,
-st483,
-st484,
-st485,
-st484,
-st486,
-st484,
-st482,
-st483,
-st484,
-st485,
-st484,
-st486,
-st484,
-st482,
-st483,
-st484,
-st485,
-st484,
-st486,
-st484,
-st482,
-st483,
-st484,
-st485,
-st484,
-st486,
-st484,
-st482,
-st483,
-st484,
-st485,
-st484,
-st486,
-st484,
-st482,
-st483,
-st484,
-st485,
-st484,
-st486,
-st484,
-st482,
-st483,
-st484,
-st485,
-st484,
-st486,
-st484,
-st482,
-st483,
-st484,
-st485,
-st484,
-st486,
-st484,
-st482,
-st483,
-st484,
-st485,
-st484,
-st486,
-st484,
-st482,
-st483,
-st484,
-st485,
-st484,
-st486,
-st484,
-st482,
-st483,
-st484,
-st485,
-st484,
-st486,
-st484,
-st482,
-st483,
-st484,
-st485,
-st484,
-st486,
-st484,
-st482,
-st483,
-st484,
-st485,
-st484,
-st486,
-st484,
-st482,
-st483,
-st484,
-st485,
-st484,
-st486,
-st484,
-st482,
-st483,
-st484,
-st485,
-st484,
-st486,
-st484,
-st482,
-st483,
-st484,
-st485,
-st484,
-st486,
-st484,
-st482,
-st483,
-st484,
-st485,
-st484,
-st486,
-st484,
-st482,
-st483,
-st484,
-st485,
-st484,
-st486,
-st484,
-st482,
-st483,
-st484,
-st485,
-st484,
-st486,
-st484,
-st482,
-st483,
-st484,
-st485,
-st484,
-st486,
-st484,
-st482,
-st483,
-st484,
-st485,
-st484,
-st486,
-st484,
-st482,
-st483,
-st484,
-st485,
-st484,
-st486,
-st484,
-st482,
-st483,
-st484,
-st485,
-st484,
-st486,
-st484,
-st482,
-st483,
-st484,
-st485,
-st484,
-st486,
-st484,
-st482,
-st483,
-st484,
-st485,
-st484,
-st486,
-st484,
-st482,
-st483,
-st484,
-st485,
-st484,
-st486,
-st484,
-st482,
-st483,
-st484,
-st485,
-st484,
-st486,
-st484,
-st482,
-st483,
-st484,
-st485,
-st484,
-st486,
-st484,
-st482,
-st483,
-st484,
-st485,
-st484,
-st486,
-st484,
-st482,
-st483,
-st484,
-st485,
-st484,
-st486,
-st484,
-st482,
-st483,
-st484,
-st485,
-st484,
-st486,
-st484,
-st482,
-st483,
-st484,
-st485,
-st484,
-st486,
-st484,
-st482,
-st483,
-st484,
-st485,
-st484,
-st486,
-st484,
-st482,
-st483,
-st484,
-st485,
-st484,
-st486,
-st484,
-st482,
-st483,
-st484,
-st485,
-st484,
-st487,
-st77,
-st77,
-st77,
-st77,
-st77,
-st488,
-st488,
-st488,
-st488,
-st488,
-st488,
-st488,
-st488,
-st488,
-st488,
-st488,
-st488,
-st488,
-st488,
-st488,
-st488,
-st488,
-st488,
-st488,
-st488,
-st488,
-st488,
-st488,
-st488,
-st488,
-st488,
-st488,
-st488,
-st488,
-st488,
-st488,
-st488,
-st488,
-st488,
-st488,
-st488,
-st488,
-st488,
-st488,
-st488,
-st488,
-st488,
-st488,
-st488,
-st488,
-st488,
-st488,
-st488,
-st488,
-st488,
-st488,
-st488,
-st488,
-st488,
-st488,
-st488,
-st488,
-st488,
-st488,
-st488,
-st488,
-st488,
-st488,
-st488,
-st488,
-st488,
-st488,
-st488,
-st488,
-st488,
-st488,
-st488,
-st488,
-st488,
-st488,
-st488,
-st488,
-st488,
-st488,
-st488,
-st488,
-st488,
-st488,
-st488,
-st488,
-st488,
-st488,
-st488,
-st488,
-st488,
-st488,
-st488,
-st488,
-st488,
-st488,
-st488,
-st488,
-st488,
-st488,
-st488,
-st488,
-st488,
-st488,
-st488,
-st488,
-st488,
-st488,
-st488,
-st488,
-st488,
-st488,
-st488,
-st488,
-st488,
-st488,
-st488,
-st488,
-st488,
-st488,
-st488,
-st488,
-st488,
-st488,
-st488,
-st488,
-st488,
-st488,
-st488,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st489,
-st490,
-st491,
-st492,
-st493,
-st494,
-st495,
-st496,
-st497,
-st498,
-st499,
-st500,
-st501,
-st502,
-st503,
-st504,
-st505,
-st506,
-st507,
-st508,
-st509,
-st510,
-st511,
-st512,
-st513,
-st514,
-st515,
-st516,
-st517,
-st518,
-st519,
-st77,
-st77,
-st520,
-st521,
-st522,
-st523,
-st524,
-st525,
-st526,
-st527,
-st528,
-st529,
-st530,
-st531,
-st77,
-st532,
-st533,
-st534,
-st535,
-st536,
-st537,
-st538,
-st539,
-st540,
-st541,
-st542,
-st543,
-st544,
-st545,
-st546,
-st547,
-st548,
-st549,
-st550,
-st551,
-st552,
-st553,
-st554,
-st77,
-st555,
-st556,
-st557,
-st558,
-st559,
-st560,
-st561,
-st562,
-st77,
-st77,
-st563,
-st564,
-st565,
-st566,
-st567,
-st568,
-st569,
-st570,
-st571,
-st572,
-st573,
-st574,
-st575,
-st576,
-st577,
-st578,
-st579,
-st580,
-st581,
-st582,
-st583,
-st584,
-st585,
-st586,
-st587,
-st588,
-st589,
-st590,
-st591,
-st592,
-st593,
-st594,
-st595,
-st596,
-st87,
-st210,
-st597,
-st105,
-st105,
-st77,
-st77,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st88,
-st598,
-st357,
-st357,
-st599,
-st600,
-st600,
-st600,
-st601,
-st602,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st87,
-st603,
-st604,
-st87,
-st605,
-st77,
-st77,
-st77,
-st87,
-st606,
-st87,
-st87,
-st607,
-st608,
-st77,
-st77,
-st609,
-st610,
-st611,
-st36,
-st36,
-st87,
-st87,
-st87,
-st87,
-st105,
-st231,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st612,
-st87,
-st87,
-st613,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st87,
-st614,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st615,
-st616,
-st87,
-st617,
-st618,
-st619,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st87,
-st603,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st600,
-st600,
-st600,
-st600,
-st600,
-st600,
-st620,
-st621,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st247,
-st247,
-st247,
-st247,
-st247,
-st247,
-st247,
-st247,
-st247,
-st247,
-st247,
-st247,
-st247,
-st247,
-st247,
-st622,
-st247,
-st247,
-st623,
-st247,
-st247,
-st624,
-st625,
-st626,
-st627,
-st247,
-st628,
-st629,
-st630,
-st631,
-st77,
-st77,
-st247,
-st247,
-st247,
-st247,
-st632,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st247,
-st247,
-st247,
-st247,
-st247,
-st346,
-st357,
-st633,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st634,
-st635,
-st636,
-st637,
-st638,
-st639,
-st640,
-st641,
-st642,
-st643,
-st644,
-st645,
-st646,
-st634,
-st635,
-st636,
-st647,
-st648,
-st649,
-st650,
-st651,
-st652,
-st653,
-st654,
-st655,
-st656,
-st634,
-st635,
-st636,
-st637,
-st638,
-st649,
-st640,
-st641,
-st642,
-st653,
-st654,
-st655,
-st656,
-st634,
-st635,
-st636,
-st657,
-st658,
-st659,
-st660,
-st661,
-st662,
-st663,
-st664,
-st665,
-st666,
-st667,
-st668,
-st669,
-st670,
-st671,
-st672,
-st673,
-st674,
-st675,
-st676,
-st677,
-st678,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st168,
-st679,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
+/* 2F810-2F81F */
+static const struct unidata st727[] = {
+{dd3152,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3153,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3154,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3155,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3156,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3157,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3158,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3159,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3160,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3161,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3162,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2454,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3163,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd1297,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3164,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3165,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+};
+/* 2F820-2F82F */
+static const struct unidata st728[] = {
+{dd3166,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3167,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3168,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3169,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3170,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2459,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2403,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2404,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2460,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3171,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3172,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2223,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3173,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2405,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3174,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3175,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+};
+/* 2F830-2F83F */
+static const struct unidata st729[] = {
+{dd3176,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3177,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3177,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3177,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3178,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3179,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3180,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3181,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3182,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3183,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3184,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3185,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3186,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3187,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3188,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3189,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+};
+/* 2F840-2F84F */
+static const struct unidata st730[] = {
+{dd3190,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3191,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3192,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3193,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3194,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3195,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3195,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2462,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3196,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3197,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3198,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3199,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2407,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3200,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3201,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3202,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+};
+/* 2F850-2F85F */
+static const struct unidata st731[] = {
+{dd2369,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3203,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3204,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3205,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3206,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3207,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3208,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3209,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3210,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3211,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3212,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3213,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3214,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3215,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3216,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3217,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+};
+/* 2F860-2F86F */
+static const struct unidata st732[] = {
+{dd3218,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3219,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3220,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3221,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3222,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3223,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3224,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3225,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3226,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3227,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3228,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3228,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3229,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3230,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3231,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2219,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+};
+/* 2F870-2F87F */
+static const struct unidata st733[] = {
+{dd3232,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3233,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3234,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3235,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3236,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd1323,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3237,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3238,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd1325,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3239,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3240,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3241,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3242,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3243,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3244,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3245,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+};
+/* 2F880-2F88F */
+static const struct unidata st734[] = {
+{dd3246,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3247,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3248,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3249,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3250,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3251,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3252,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3253,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3254,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3255,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3256,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3257,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3258,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3259,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2167,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3260,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+};
+/* 2F890-2F89F */
+static const struct unidata st735[] = {
+{dd1335,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3261,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3261,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3262,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3263,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3263,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3264,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3265,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3266,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3267,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3268,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3269,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3270,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3271,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3272,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3273,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+};
+/* 2F8A0-2F8AF */
+static const struct unidata st736[] = {
+{dd3274,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3275,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3276,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2412,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3277,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3278,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3279,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3280,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2474,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3280,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3281,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2414,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3282,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3283,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3284,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3285,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+};
+/* 2F8B0-2F8BF */
+static const struct unidata st737[] = {
+{dd2415,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2140,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3286,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3287,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3288,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3289,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3290,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3291,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3292,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3293,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3294,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3295,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3296,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3297,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3298,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3299,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+};
+/* 2F8C0-2F8CF */
+static const struct unidata st738[] = {
+{dd3300,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3301,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3302,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3303,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3304,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3305,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3306,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3307,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2416,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3308,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3309,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3310,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3311,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3312,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3313,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2418,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+};
+/* 2F8D0-2F8DF */
+static const struct unidata st739[] = {
+{dd3314,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3315,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3316,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3317,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3318,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3319,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3320,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3321,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2168,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2482,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3322,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3323,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3324,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3325,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3326,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3327,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+};
+/* 2F8E0-2F8EF */
+static const struct unidata st740[] = {
+{dd3328,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3329,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2419,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3330,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3331,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3332,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3333,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2524,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3334,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3335,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3336,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3337,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3338,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3339,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3340,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3341,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+};
+/* 2F8F0-2F8FF */
+static const struct unidata st741[] = {
+{dd3342,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3343,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3344,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3345,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3346,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2236,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3347,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3348,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3349,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3350,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3351,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3352,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3353,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3354,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3355,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3356,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+};
+/* 2F900-2F90F */
+static const struct unidata st742[] = {
+{dd3357,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2420,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2319,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3358,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3359,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3360,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3361,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3362,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3363,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3364,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3365,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2485,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3366,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3367,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3368,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3369,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+};
+/* 2F910-2F91F */
+static const struct unidata st743[] = {
+{dd3370,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3371,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3372,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3373,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2486,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3374,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3375,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3376,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3377,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3378,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3379,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3380,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3381,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3382,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3383,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3384,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+};
+/* 2F920-2F92F */
+static const struct unidata st744[] = {
+{dd3385,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2488,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3386,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3387,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3388,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3389,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3390,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3391,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3392,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3393,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3394,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3395,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3396,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3396,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3397,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3398,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+};
+/* 2F930-2F93F */
+static const struct unidata st745[] = {
+{dd2490,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3399,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3400,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3401,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3402,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3403,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3404,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3405,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2222,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3406,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3407,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3408,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3409,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3410,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3411,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3412,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+};
+/* 2F940-2F94F */
+static const struct unidata st746[] = {
+{dd2496,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3413,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3414,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3415,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3416,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3417,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3418,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3418,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2497,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2526,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3419,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3420,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3421,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3422,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3423,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2185,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+};
+/* 2F950-2F95F */
+static const struct unidata st747[] = {
+{dd2499,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3424,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3425,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2430,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3426,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3427,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2389,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3428,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3429,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2433,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3430,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3431,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3432,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3433,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3433,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3434,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+};
+/* 2F960-2F96F */
+static const struct unidata st748[] = {
+{dd3435,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3436,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3437,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3438,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3439,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3440,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3441,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3442,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3443,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3444,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3445,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3446,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3447,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3448,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3449,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3450,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+};
+/* 2F970-2F97F */
+static const struct unidata st749[] = {
+{dd3451,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3452,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3453,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3454,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3455,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3456,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3457,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3458,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3459,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3460,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2439,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3461,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3462,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3463,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3464,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3465,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+};
+/* 2F980-2F98F */
+static const struct unidata st750[] = {
+{dd3466,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3467,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3468,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3469,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3470,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3471,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3472,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3473,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3474,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3475,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3476,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3262,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3477,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3478,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3479,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3480,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+};
+/* 2F990-2F99F */
+static const struct unidata st751[] = {
+{dd3481,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3482,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3483,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3484,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3485,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3486,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3487,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3488,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2239,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3489,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3490,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3491,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3492,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3493,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3494,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2442,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+};
+/* 2F9A0-2F9AF */
+static const struct unidata st752[] = {
+{dd3495,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3496,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3497,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3498,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3499,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3500,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3501,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3502,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3503,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3504,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3505,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3506,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3507,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3508,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3509,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3510,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+};
+/* 2F9B0-2F9BF */
+static const struct unidata st753[] = {
+{dd3511,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3512,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3513,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3514,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2180,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3515,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3516,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3517,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3518,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3519,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3520,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2506,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3521,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3522,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3523,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3524,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+};
+/* 2F9C0-2F9CF */
+static const struct unidata st754[] = {
+{dd3525,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3526,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3527,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3528,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd1425,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3529,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3530,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3531,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3532,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3533,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3534,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3535,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3536,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3537,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3538,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3539,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+};
+/* 2F9D0-2F9DF */
+static const struct unidata st755[] = {
+{dd2511,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2512,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd1432,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3540,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3541,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3542,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3543,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3544,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3545,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3546,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3547,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3548,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3549,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3550,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3551,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2513,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+};
+/* 2F9E0-2F9EF */
+static const struct unidata st756[] = {
+{dd3552,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3553,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3554,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3555,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3556,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3557,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3558,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3559,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3560,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3561,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3562,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3563,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3564,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3565,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3566,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3567,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+};
+/* 2F9F0-2F9FF */
+static const struct unidata st757[] = {
+{dd3568,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3569,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3570,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3571,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3572,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3573,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3574,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3575,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3576,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3577,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3578,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3579,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3580,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3581,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2519,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2519,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+};
+/* 2FA00-2FA0F */
+static const struct unidata st758[] = {
+{dd3582,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3583,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3584,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3585,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3586,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3587,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3588,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3589,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3590,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3591,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd2520,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3592,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3593,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3594,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3595,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3596,0,0,0,Lo,0,GBOther,WBOther,SBOLetter}
+};
+/* 2FA10-2FA1F */
+static const struct unidata st759[] = {
+{dd3597,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3598,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3599,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3600,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3601,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd1480,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3602,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd1484,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3603,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3604,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3605,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3606,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd1489,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{dd3607,0,0,0,Lo,0,GBOther,WBOther,SBOLetter},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
+};
+/* E0000-E000F */
+static const struct unidata st760[] = {
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cf,0,GBControl,WBFormat,SBFormat},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther},
+{0,0,0,0,Cn,0,GBOther,WBOther,SBOther}
+};
+/* E0020-E002F */
+static const struct unidata st761[] = {
+{0,0,0,0,Cf,0,GBControl,WBFormat,SBFormat},
+{0,0,0,0,Cf,0,GBControl,WBFormat,SBFormat},
+{0,0,0,0,Cf,0,GBControl,WBFormat,SBFormat},
+{0,0,0,0,Cf,0,GBControl,WBFormat,SBFormat},
+{0,0,0,0,Cf,0,GBControl,WBFormat,SBFormat},
+{0,0,0,0,Cf,0,GBControl,WBFormat,SBFormat},
+{0,0,0,0,Cf,0,GBControl,WBFormat,SBFormat},
+{0,0,0,0,Cf,0,GBControl,WBFormat,SBFormat},
+{0,0,0,0,Cf,0,GBControl,WBFormat,SBFormat},
+{0,0,0,0,Cf,0,GBControl,WBFormat,SBFormat},
+{0,0,0,0,Cf,0,GBControl,WBFormat,SBFormat},
+{0,0,0,0,Cf,0,GBControl,WBFormat,SBFormat},
+{0,0,0,0,Cf,0,GBControl,WBFormat,SBFormat},
+{0,0,0,0,Cf,0,GBControl,WBFormat,SBFormat},
+{0,0,0,0,Cf,0,GBControl,WBFormat,SBFormat},
+{0,0,0,0,Cf,0,GBControl,WBFormat,SBFormat}
+};
+const struct unidata *const unidata[]={
+st0,
+st1,
+st2,
+st3,
+st4,
+st5,
+st6,
+st7,
+st8,
+st1,
+st9,
+st10,
+st11,
+st12,
+st13,
+st14,
+st15,
+st16,
+st17,
+st18,
+st19,
+st20,
+st21,
+st22,
+st23,
+st24,
+st25,
+st26,
+st27,
+st28,
+st29,
+st30,
+st31,
+st32,
+st33,
+st34,
+st35,
+st36,
+st36,
+st36,
+st36,
+st37,
+st36,
+st38,
+st39,
+st40,
+st41,
+st42,
+st43,
+st44,
+st45,
+st46,
+st47,
+st48,
+st49,
+st50,
+st51,
+st52,
+st53,
+st54,
+st55,
+st56,
+st57,
+st58,
+st59,
+st60,
+st61,
+st62,
+st63,
+st64,
+st65,
+st66,
+st67,
+st68,
+st69,
+st70,
+st71,
+st72,
+st73,
+st74,
+st75,
+st76,
 st77,
+st78,
+st79,
+st80,
+st81,
+st36,
+st82,
+st83,
+st84,
+st85,
+st86,
+st87,
+st88,
+st89,
+st90,
+st91,
+st92,
+st87,
+st93,
+st94,
+st95,
+st96,
+st87,
+st87,
+st87,
+st87,
+st97,
+st98,
+st99,
+st100,
+st101,
+st102,
+st87,
+st103,
+st104,
+st87,
+st87,
+st87,
+st87,
+st87,
+st105,
+st106,
+st107,
+st87,
+st108,
+st109,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st111,
+st87,
+st112,
+st113,
+st114,
+st115,
+st116,
+st117,
+st118,
+st119,
+st120,
+st121,
+st122,
+st123,
+st124,
+st125,
+st126,
+st119,
+st120,
+st127,
+st128,
+st129,
+st130,
+st131,
+st132,
+st133,
+st120,
+st134,
+st135,
+st136,
+st124,
+st137,
+st118,
+st119,
+st120,
+st138,
+st139,
+st140,
+st124,
+st141,
+st142,
+st143,
+st144,
+st145,
+st146,
+st147,
+st130,
+st148,
+st149,
+st150,
+st120,
+st151,
+st152,
+st153,
+st124,
+st154,
+st155,
+st150,
+st120,
+st156,
+st157,
+st158,
+st124,
+st159,
+st155,
+st150,
+st120,
+st160,
+st161,
+st162,
+st124,
+st163,
+st164,
+st165,
+st87,
+st166,
+st167,
+st168,
+st110,
+st169,
+st170,
+st171,
+st171,
+st172,
+st173,
+st174,
+st110,
+st110,
+st175,
+st176,
+st177,
+st178,
+st179,
+st180,
+st110,
+st110,
+st181,
+st182,
+st183,
+st184,
+st185,
+st186,
+st187,
+st188,
+st189,
+st190,
+st191,
+st192,
+st193,
+st194,
+st110,
+st110,
+st171,
+st171,
+st195,
+st196,
+st197,
+st198,
+st199,
+st200,
+st201,
+st202,
+st203,
+st204,
+st205,
+st87,
+st87,
+st206,
+st207,
+st207,
+st207,
+st207,
+st207,
+st208,
+st209,
+st209,
+st209,
+st209,
+st210,
+st211,
+st211,
+st211,
+st211,
+st212,
+st87,
+st87,
+st87,
+st87,
+st213,
+st214,
+st87,
+st87,
+st213,
+st87,
+st87,
+st215,
+st216,
+st217,
+st87,
+st87,
+st87,
+st216,
+st87,
+st87,
+st87,
+st218,
+st219,
+st220,
+st87,
+st221,
+st87,
+st87,
+st87,
+st87,
+st87,
+st222,
+st223,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st224,
+st225,
+st226,
+st227,
+st87,
+st87,
+st87,
+st87,
+st228,
+st229,
+st230,
+st231,
+st87,
+st232,
+st87,
+st233,
+st230,
+st234,
+st171,
+st171,
+st171,
+st235,
+st236,
+st237,
+st238,
+st239,
+st240,
+st238,
+st87,
+st87,
+st241,
+st87,
+st87,
+st242,
+st87,
+st87,
+st243,
+st110,
+st110,
+st110,
+st110,
+st110,
+st87,
+st244,
+st245,
+st246,
+st247,
+st171,
+st248,
+st249,
+st171,
+st171,
+st250,
+st251,
+st252,
+st253,
+st254,
+st254,
+st87,
+st255,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st256,
+st257,
+st87,
+st258,
+st259,
+st260,
+st261,
+st262,
+st263,
+st87,
+st264,
+st238,
+st110,
+st110,
+st110,
+st110,
+st87,
+st87,
+st265,
+st266,
+st267,
+st107,
+st87,
+st268,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st36,
+st36,
+st269,
+st270,
+st271,
+st272,
+st273,
+st274,
+st36,
+st275,
+st276,
+st277,
+st278,
+st279,
+st280,
+st281,
+st282,
+st283,
+st284,
+st285,
+st286,
+st287,
+st288,
+st289,
+st290,
+st291,
+st292,
+st293,
+st294,
+st295,
+st296,
+st297,
+st298,
+st299,
+st300,
+st301,
+st302,
+st303,
+st304,
+st305,
+st306,
+st307,
+st308,
+st309,
+st310,
+st311,
+st312,
+st313,
+st314,
+st315,
+st316,
+st317,
+st318,
+st319,
+st320,
+st321,
+st322,
+st323,
+st324,
+st325,
+st110,
+st326,
+st327,
+st328,
+st329,
+st330,
+st331,
+st332,
+st333,
+st334,
+st335,
+st336,
+st337,
+st338,
+st339,
+st254,
+st340,
+st341,
+st254,
+st342,
+st343,
+st344,
+st345,
+st346,
+st347,
+st344,
+st348,
+st349,
+st350,
+st351,
+st352,
+st353,
+st344,
+st344,
+st354,
+st344,
+st355,
+st254,
+st356,
+st254,
+st254,
+st254,
+st254,
+st357,
+st254,
+st358,
+st344,
+st359,
+st254,
+st360,
+st361,
+st110,
+st254,
+st254,
+st362,
+st110,
+st363,
+st110,
+st364,
+st365,
+st366,
+st367,
+st368,
+st369,
+st370,
+st371,
+st372,
+st373,
+st254,
+st254,
+st254,
+st254,
+st254,
+st254,
+st254,
+st254,
+st254,
+st254,
+st254,
+st374,
+st375,
+st254,
+st254,
+st376,
+st254,
+st254,
+st254,
+st254,
+st254,
+st254,
+st377,
+st254,
+st254,
+st378,
+st254,
+st379,
+st380,
+st110,
+st110,
+st110,
+st381,
+st254,
+st382,
+st254,
+st383,
+st384,
+st385,
+st386,
+st373,
+st387,
+st254,
+st388,
+st389,
+st344,
+st390,
+st344,
+st254,
+st254,
+st254,
+st254,
+st254,
+st254,
+st254,
+st254,
+st254,
+st254,
+st254,
+st254,
+st254,
+st254,
+st254,
+st254,
+st344,
+st344,
+st344,
+st344,
+st344,
+st344,
+st344,
+st344,
+st391,
+st392,
+st344,
+st344,
+st344,
+st393,
+st344,
+st394,
+st395,
+st344,
+st344,
+st344,
+st344,
+st344,
+st344,
+st396,
+st344,
+st344,
+st344,
+st344,
+st344,
+st397,
+st344,
+st344,
+st254,
+st254,
+st254,
+st344,
+st398,
+st399,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st400,
+st401,
+st402,
+st36,
+st36,
+st403,
+st404,
+st405,
+st406,
+st407,
+st408,
+st409,
+st410,
+st411,
+st412,
+st413,
+st36,
+st36,
+st414,
+st87,
+st87,
+st87,
+st415,
+st110,
+st87,
+st225,
+st416,
+st416,
+st416,
+st416,
+st43,
+st43,
+st417,
+st418,
+st419,
+st420,
+st110,
+st110,
+st110,
+st110,
+st254,
+st421,
+st254,
+st254,
+st254,
+st254,
+st254,
+st422,
+st423,
+st424,
+st425,
+st426,
+st427,
+st428,
+st429,
+st430,
+st431,
+st432,
+st433,
+st434,
+st435,
+st436,
+st110,
+st437,
+st438,
+st439,
+st440,
+st441,
+st442,
+st443,
+st444,
+st445,
+st171,
+st446,
+st447,
+st448,
+st449,
+st450,
+st451,
+st452,
+st453,
+st87,
+st454,
+st455,
+st456,
+st457,
+st458,
+st459,
+st460,
+st461,
+st87,
+st242,
+st254,
+st254,
+st380,
+st462,
+st463,
+st464,
+st465,
+st466,
+st467,
+st468,
+st469,
+st470,
+st471,
+st472,
+st473,
+st474,
+st475,
+st476,
+st477,
+st478,
+st479,
+st480,
+st481,
+st482,
+st483,
+st484,
+st485,
+st486,
+st487,
+st488,
+st489,
+st490,
+st491,
+st492,
+st493,
+st494,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st495,
+st254,
+st254,
+st254,
+st254,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st496,
+st110,
+st110,
+st110,
+st87,
+st497,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st244,
+st254,
+st254,
+st254,
+st362,
+st110,
+st110,
+st110,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st498,
+st87,
+st499,
+st110,
+st500,
+st501,
+st502,
+st503,
+st504,
+st505,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st42,
+st506,
+st507,
+st508,
+st509,
+st510,
+st511,
+st512,
+st513,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st514,
+st515,
+st87,
+st516,
+st110,
+st87,
+st87,
+st87,
+st517,
+st518,
+st87,
+st87,
+st519,
+st520,
+st238,
+st110,
+st110,
+st107,
+st87,
+st521,
+st87,
+st522,
+st523,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st87,
+st87,
+st524,
+st525,
+st526,
+st527,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st528,
+st529,
+st530,
+st531,
+st530,
+st532,
+st530,
+st528,
+st529,
+st530,
+st531,
+st530,
+st532,
+st530,
+st528,
+st529,
+st530,
+st531,
+st530,
+st532,
+st530,
+st528,
+st529,
+st530,
+st531,
+st530,
+st532,
+st530,
+st528,
+st529,
+st530,
+st531,
+st530,
+st532,
+st530,
+st528,
+st529,
+st530,
+st531,
+st530,
+st532,
+st530,
+st528,
+st529,
+st530,
+st531,
+st530,
+st532,
+st530,
+st528,
+st529,
+st530,
+st531,
+st530,
+st532,
+st530,
+st528,
+st529,
+st530,
+st531,
+st530,
+st532,
+st530,
+st528,
+st529,
+st530,
+st531,
+st530,
+st532,
+st530,
+st528,
+st529,
+st530,
+st531,
+st530,
+st532,
+st530,
+st528,
+st529,
+st530,
+st531,
+st530,
+st532,
+st530,
+st528,
+st529,
+st530,
+st531,
+st530,
+st532,
+st530,
+st528,
+st529,
+st530,
+st531,
+st530,
+st532,
+st530,
+st528,
+st529,
+st530,
+st531,
+st530,
+st532,
+st530,
+st528,
+st529,
+st530,
+st531,
+st530,
+st532,
+st530,
+st528,
+st529,
+st530,
+st531,
+st530,
+st532,
+st530,
+st528,
+st529,
+st530,
+st531,
+st530,
+st532,
+st530,
+st528,
+st529,
+st530,
+st531,
+st530,
+st532,
+st530,
+st528,
+st529,
+st530,
+st531,
+st530,
+st532,
+st530,
+st528,
+st529,
+st530,
+st531,
+st530,
+st532,
+st530,
+st528,
+st529,
+st530,
+st531,
+st530,
+st532,
+st530,
+st528,
+st529,
+st530,
+st531,
+st530,
+st532,
+st530,
+st528,
+st529,
+st530,
+st531,
+st530,
+st532,
+st530,
+st528,
+st529,
+st530,
+st531,
+st530,
+st532,
+st530,
+st528,
+st529,
+st530,
+st531,
+st530,
+st532,
+st530,
+st528,
+st529,
+st530,
+st531,
+st530,
+st532,
+st530,
+st528,
+st529,
+st530,
+st531,
+st530,
+st532,
+st530,
+st528,
+st529,
+st530,
+st531,
+st530,
+st532,
+st530,
+st528,
+st529,
+st530,
+st531,
+st530,
+st532,
+st530,
+st528,
+st529,
+st530,
+st531,
+st530,
+st532,
+st530,
+st528,
+st529,
+st530,
+st531,
+st530,
+st532,
+st530,
+st528,
+st529,
+st530,
+st531,
+st530,
+st532,
+st530,
+st528,
+st529,
+st530,
+st531,
+st530,
+st532,
+st530,
+st528,
+st529,
+st530,
+st531,
+st530,
+st532,
+st530,
+st528,
+st529,
+st530,
+st531,
+st530,
+st532,
+st530,
+st528,
+st529,
+st530,
+st531,
+st530,
+st532,
+st530,
+st528,
+st529,
+st530,
+st531,
+st530,
+st532,
+st530,
+st528,
+st529,
+st530,
+st531,
+st530,
+st532,
+st530,
+st528,
+st529,
+st530,
+st531,
+st530,
+st532,
+st530,
+st528,
+st529,
+st530,
+st531,
+st530,
+st532,
+st530,
+st528,
+st529,
+st530,
+st531,
+st530,
+st532,
+st530,
+st528,
+st529,
+st530,
+st531,
+st530,
+st532,
+st530,
+st528,
+st529,
+st530,
+st531,
+st530,
+st532,
+st530,
+st528,
+st529,
+st530,
+st531,
+st530,
+st532,
+st530,
+st528,
+st529,
+st530,
+st531,
+st530,
+st532,
+st530,
+st528,
+st529,
+st530,
+st531,
+st530,
+st532,
+st530,
+st528,
+st529,
+st530,
+st531,
+st530,
+st532,
+st530,
+st528,
+st529,
+st530,
+st531,
+st530,
+st532,
+st530,
+st528,
+st529,
+st530,
+st531,
+st530,
+st532,
+st530,
+st528,
+st529,
+st530,
+st531,
+st530,
+st532,
+st530,
+st528,
+st529,
+st530,
+st531,
+st530,
+st532,
+st530,
+st528,
+st529,
+st530,
+st531,
+st530,
+st532,
+st530,
+st528,
+st529,
+st530,
+st531,
+st530,
+st532,
+st530,
+st528,
+st529,
+st530,
+st531,
+st530,
+st532,
+st530,
+st528,
+st529,
+st530,
+st531,
+st530,
+st532,
+st530,
+st528,
+st529,
+st530,
+st531,
+st530,
+st532,
+st530,
+st528,
+st529,
+st530,
+st531,
+st530,
+st532,
+st530,
+st528,
+st529,
+st530,
+st531,
+st530,
+st532,
+st530,
+st528,
+st529,
+st530,
+st531,
+st530,
+st532,
+st530,
+st528,
+st529,
+st530,
+st531,
+st530,
+st532,
+st530,
+st528,
+st529,
+st530,
+st531,
+st530,
+st532,
+st530,
+st528,
+st529,
+st530,
+st531,
+st530,
+st532,
+st530,
+st528,
+st529,
+st530,
+st531,
+st530,
+st532,
+st530,
+st528,
+st529,
+st530,
+st531,
+st530,
+st532,
+st530,
+st528,
+st529,
+st530,
+st531,
+st530,
+st532,
+st530,
+st528,
+st529,
+st530,
+st531,
+st530,
+st532,
+st530,
+st528,
+st529,
+st530,
+st531,
+st530,
+st532,
+st530,
+st528,
+st529,
+st530,
+st531,
+st530,
+st532,
+st530,
+st528,
+st529,
+st530,
+st531,
+st530,
+st532,
+st530,
+st528,
+st529,
+st530,
+st531,
+st530,
+st532,
+st530,
+st528,
+st529,
+st530,
+st531,
+st530,
+st532,
+st530,
+st528,
+st529,
+st530,
+st531,
+st530,
+st532,
+st530,
+st528,
+st529,
+st530,
+st531,
+st530,
+st532,
+st530,
+st528,
+st529,
+st530,
+st531,
+st530,
+st532,
+st530,
+st528,
+st529,
+st530,
+st531,
+st530,
+st532,
+st530,
+st528,
+st529,
+st530,
+st531,
+st530,
+st532,
+st530,
+st528,
+st529,
+st530,
+st531,
+st530,
+st532,
+st530,
+st528,
+st529,
+st530,
+st531,
+st530,
+st532,
+st530,
+st528,
+st529,
+st530,
+st531,
+st530,
+st532,
+st530,
+st528,
+st529,
+st530,
+st531,
+st530,
+st532,
+st530,
+st528,
+st529,
+st530,
+st531,
+st530,
+st532,
+st530,
+st528,
+st529,
+st530,
+st531,
+st530,
+st532,
+st530,
+st528,
+st529,
+st530,
+st531,
+st530,
+st532,
+st530,
+st528,
+st529,
+st530,
+st531,
+st530,
+st532,
+st530,
+st528,
+st529,
+st530,
+st531,
+st530,
+st532,
+st530,
+st528,
+st529,
+st530,
+st531,
+st530,
+st532,
+st530,
+st528,
+st529,
+st530,
+st531,
+st530,
+st532,
+st530,
+st528,
+st529,
+st530,
+st531,
+st530,
+st532,
+st530,
+st528,
+st529,
+st530,
+st531,
+st530,
+st532,
+st530,
+st528,
+st529,
+st530,
+st531,
+st530,
+st532,
+st530,
+st528,
+st529,
+st530,
+st531,
+st530,
+st532,
+st530,
+st528,
+st529,
+st530,
+st531,
+st530,
+st532,
+st530,
+st528,
+st529,
+st530,
+st531,
+st530,
+st532,
+st530,
+st528,
+st529,
+st530,
+st531,
+st530,
+st532,
+st530,
+st528,
+st529,
+st530,
+st531,
+st530,
+st532,
+st530,
+st528,
+st529,
+st530,
+st531,
+st530,
+st532,
+st530,
+st528,
+st529,
+st530,
+st531,
+st530,
+st532,
+st530,
+st528,
+st529,
+st530,
+st531,
+st530,
+st532,
+st530,
+st528,
+st529,
+st530,
+st531,
+st530,
+st533,
+st110,
+st110,
+st110,
+st110,
+st110,
+st534,
+st534,
+st534,
+st534,
+st534,
+st534,
+st534,
+st534,
+st534,
+st534,
+st534,
+st534,
+st534,
+st534,
+st534,
+st534,
+st534,
+st534,
+st534,
+st534,
+st534,
+st534,
+st534,
+st534,
+st534,
+st534,
+st534,
+st534,
+st534,
+st534,
+st534,
+st534,
+st534,
+st534,
+st534,
+st534,
+st534,
+st534,
+st534,
+st534,
+st534,
+st534,
+st534,
+st534,
+st534,
+st534,
+st534,
+st534,
+st534,
+st534,
+st534,
+st534,
+st534,
+st534,
+st534,
+st534,
+st534,
+st534,
+st534,
+st534,
+st534,
+st534,
+st534,
+st534,
+st534,
+st534,
+st534,
+st534,
+st534,
+st534,
+st534,
+st534,
+st534,
+st534,
+st534,
+st534,
+st534,
+st534,
+st534,
+st534,
+st534,
+st534,
+st534,
+st534,
+st534,
+st534,
+st534,
+st534,
+st534,
+st534,
+st534,
+st534,
+st534,
+st534,
+st534,
+st534,
+st534,
+st534,
+st534,
+st534,
+st534,
+st534,
+st534,
+st534,
+st534,
+st534,
+st534,
+st534,
+st534,
+st534,
+st534,
+st534,
+st534,
+st534,
+st534,
+st534,
+st534,
+st534,
+st534,
+st534,
+st534,
+st534,
+st534,
+st534,
+st534,
+st534,
+st534,
+st534,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st535,
+st536,
+st537,
+st538,
+st539,
+st540,
+st541,
+st542,
+st543,
+st544,
+st545,
+st546,
+st547,
+st548,
+st549,
+st550,
+st551,
+st552,
+st553,
+st554,
+st555,
+st556,
+st557,
+st558,
+st559,
+st560,
+st561,
+st562,
+st563,
+st564,
+st565,
+st110,
+st110,
+st566,
+st567,
+st568,
+st569,
+st570,
+st571,
+st572,
+st573,
+st574,
+st575,
+st576,
+st577,
+st110,
+st578,
+st579,
+st580,
+st581,
+st582,
+st583,
+st584,
+st585,
+st586,
+st587,
+st588,
+st589,
+st590,
+st591,
+st592,
+st593,
+st594,
+st595,
+st596,
+st597,
+st598,
+st599,
+st600,
+st110,
+st601,
+st602,
+st603,
+st604,
+st605,
+st606,
+st607,
+st608,
+st110,
+st110,
+st609,
+st610,
+st611,
+st280,
+st612,
+st613,
+st614,
+st615,
+st616,
+st617,
+st618,
+st619,
+st620,
+st621,
+st622,
+st623,
+st624,
+st625,
+st626,
+st627,
+st628,
+st629,
+st630,
+st631,
+st632,
+st633,
+st634,
+st635,
+st636,
+st637,
+st638,
+st639,
+st640,
+st641,
+st87,
+st217,
+st642,
+st454,
+st454,
+st110,
+st110,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st88,
+st643,
+st373,
+st373,
+st644,
+st645,
+st645,
+st645,
+st646,
+st647,
+st437,
+st110,
+st110,
+st110,
+st254,
+st254,
+st648,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st87,
+st244,
+st87,
+st87,
+st87,
+st136,
+st110,
+st110,
+st87,
+st649,
+st650,
+st87,
+st651,
+st110,
+st110,
+st110,
+st87,
+st652,
+st87,
+st87,
+st653,
+st654,
+st110,
+st110,
+st655,
+st656,
+st657,
+st36,
+st36,
+st87,
+st87,
+st87,
+st87,
+st454,
+st238,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st658,
+st87,
+st87,
+st659,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st87,
+st660,
+st87,
+st661,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st662,
+st663,
+st87,
+st664,
+st665,
+st666,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st87,
+st649,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st645,
+st645,
+st645,
+st645,
+st645,
+st645,
+st667,
+st668,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st254,
+st254,
+st254,
+st254,
+st254,
+st254,
+st254,
+st254,
+st254,
+st254,
+st254,
+st254,
+st254,
+st254,
+st254,
+st669,
+st254,
+st254,
+st670,
+st254,
+st254,
+st671,
+st672,
+st673,
+st674,
+st254,
+st675,
+st676,
+st677,
+st378,
+st110,
+st110,
+st254,
+st254,
+st254,
+st254,
+st678,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st254,
+st254,
+st254,
+st254,
+st254,
+st362,
+st373,
+st679,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
 st680,
 st681,
 st682,
@@ -30675,20 +26992,39 @@ st685,
 st686,
 st687,
 st688,
-st689,
-st690,
-st691,
-st692,
-st693,
-st694,
-st695,
-st696,
-st697,
-st698,
+st689,
+st690,
+st691,
+st692,
+st680,
+st681,
+st682,
+st693,
+st694,
+st695,
+st696,
+st697,
+st698,
+st699,
+st700,
+st701,
+st702,
+st680,
+st681,
+st682,
+st683,
+st684,
+st695,
+st686,
+st687,
+st688,
 st699,
 st700,
 st701,
 st702,
+st680,
+st681,
+st682,
 st703,
 st704,
 st705,
@@ -30700,132 +27036,4785 @@ st710,
 st711,
 st712,
 st713,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
 st714,
-st77,
-st715,
-st715,
-st715,
 st715,
-st715,
-st715,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st77,
-st564,
-st564,
-st564,
-st564,
-st564,
-st564,
-st564,
-st564,
-st564,
-st564,
-st564,
-st564,
-st564,
-st564,
-st564,
-st77,
+st716,
+st717,
+st718,
+st719,
+st720,
+st721,
+st722,
+st723,
+st724,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st254,
+st254,
+st437,
+st254,
+st254,
+st254,
+st254,
+st254,
+st254,
+st380,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st171,
+st725,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st726,
+st727,
+st728,
+st729,
+st730,
+st731,
+st732,
+st733,
+st734,
+st735,
+st736,
+st737,
+st738,
+st739,
+st740,
+st741,
+st742,
+st743,
+st744,
+st745,
+st746,
+st747,
+st748,
+st749,
+st750,
+st751,
+st752,
+st753,
+st754,
+st755,
+st756,
+st757,
+st758,
+st759,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st760,
+st110,
+st761,
+st761,
+st761,
+st761,
+st761,
+st761,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st110,
+st610,
+st610,
+st610,
+st610,
+st610,
+st610,
+st610,
+st610,
+st610,
+st610,
+st610,
+st610,
+st610,
+st610,
+st610,
+st110,
 };
 const struct unicode_utf8_row unicode_utf8_valid[] = {
  { 1, 0, 0 }, /* 0 */
index 86f5fee..1d89322 100644 (file)
@@ -48,31 +48,40 @@ enum unicode_Grapheme_Break {
   unicode_Grapheme_Break_LV,
   unicode_Grapheme_Break_LVT,
   unicode_Grapheme_Break_Other,
+  unicode_Grapheme_Break_Prepend,
+  unicode_Grapheme_Break_SpacingMark,
   unicode_Grapheme_Break_T,
   unicode_Grapheme_Break_V
 };
 extern const char *const unicode_Grapheme_Break_names[];
 enum unicode_Word_Break {
   unicode_Word_Break_ALetter,
+  unicode_Word_Break_CR,
   unicode_Word_Break_Extend,
   unicode_Word_Break_ExtendNumLet,
   unicode_Word_Break_Format,
   unicode_Word_Break_Katakana,
+  unicode_Word_Break_LF,
   unicode_Word_Break_MidLetter,
   unicode_Word_Break_MidNum,
+  unicode_Word_Break_MidNumLet,
+  unicode_Word_Break_Newline,
   unicode_Word_Break_Numeric,
   unicode_Word_Break_Other
 };
 extern const char *const unicode_Word_Break_names[];
 enum unicode_Sentence_Break {
   unicode_Sentence_Break_ATerm,
+  unicode_Sentence_Break_CR,
   unicode_Sentence_Break_Close,
   unicode_Sentence_Break_Extend,
   unicode_Sentence_Break_Format,
+  unicode_Sentence_Break_LF,
   unicode_Sentence_Break_Lower,
   unicode_Sentence_Break_Numeric,
   unicode_Sentence_Break_OLetter,
   unicode_Sentence_Break_Other,
+  unicode_Sentence_Break_SContinue,
   unicode_Sentence_Break_STerm,
   unicode_Sentence_Break_Sep,
   unicode_Sentence_Break_Sp,
index dec036e..0ac2c17 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * This file is part of DisOrder.
- * Copyright (C) 2004, 2007, 2008 Richard Kettlewell
+ * Copyright (C) 2004, 2007-2009 Richard Kettlewell
  *
  * 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
@@ -32,7 +32,7 @@
  * @param w Exit status (e.g. from waitpid())
  * @return Allocated string containing description of status
  */
-const char *wstat(int w) {
+char *wstat(int w) {
   int n;
   char *r;
 
@@ -48,7 +48,7 @@ const char *wstat(int w) {
   else
     n = byte_xasprintf(&r, "terminated with unknown wait status %#x",
                      (unsigned)w);
-  return n >= 0 ? r : "[could not convert wait status]";
+  return n >= 0 ? r : xstrdup("[could not convert wait status]");
 }
 
 /*
index aebe6ef..b6deb8a 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * This file is part of DisOrder.
- * Copyright (C) 2004, 2007, 2008 Richard Kettlewell
+ * Copyright (C) 2004, 2007-2009 Richard Kettlewell
  *
  * 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
@@ -24,7 +24,7 @@
 
 #include <sys/wait.h>
 
-const char *wstat(int w);
+char *wstat(int w);
 /* Format wait status @w@.  In extremis the return value might be a
  * pointer to a string literal.  The result should always be ASCII. */
 
index 7710212..e33a1d6 100644 (file)
@@ -33,6 +33,7 @@ static void test_addr(void) {
   };
 
   struct sockaddr_in a1 = {
+    .sin_family = AF_INET,
     .sin_port = ntohs(25),
     .sin_addr = { .s_addr = 0}
   };
@@ -45,6 +46,7 @@ static void test_addr(void) {
   };
 
   struct sockaddr_in a2 = {
+    .sin_family = AF_INET,
     .sin_port = ntohs(119),
     .sin_addr = { .s_addr = htonl(0x7F000001) }
   };
index 715490c..3cbc044 100644 (file)
 #include "test.h"
 
 static void test_basen(void) {
-  unsigned long v[64];
+  uint32_t v[64];
   char buffer[1024];
 
   v[0] = 999;
   insist(basen(v, 1, buffer, sizeof buffer, 10) == 0);
   check_string(buffer, "999");
+  memset(v, 0xFF, sizeof v);
+  insist(nesab(v, 1, buffer, 10) == 0);
+  check_integer(v[0], 999);
+  check_integer(v[1], 0xFFFFFFFF);
+  insist(nesab(v, 4, buffer, 10) == 0);
+  check_integer(v[0], 0);
+  check_integer(v[1], 0);
+  check_integer(v[2], 0);
+  check_integer(v[3], 999);
+  check_integer(v[4], 0xFFFFFFFF);
 
   v[0] = 1+2*7+3*7*7+4*7*7*7;
   insist(basen(v, 1, buffer, sizeof buffer, 7) == 0);
@@ -35,6 +45,24 @@ static void test_basen(void) {
   v[3] = 0x0C0D0E0F;
   insist(basen(v, 4, buffer, sizeof buffer, 256) == 0);
   check_string(buffer, "123456789abcdef");
+  memset(v, 0xFF, sizeof v);
+  insist(nesab(v, 4, buffer, 256) == 0);
+  check_integer(v[0], 0x00010203);
+  check_integer(v[1], 0x04050607);
+  check_integer(v[2], 0x08090A0B);
+  check_integer(v[3], 0x0C0D0E0F);
+  check_integer(v[4], 0xFFFFFFFF);
+  memset(v, 0xFF, sizeof v);
+  insist(nesab(v, 8, buffer, 256) == 0);
+  check_integer(v[0], 0);
+  check_integer(v[1], 0);
+  check_integer(v[2], 0);
+  check_integer(v[3], 0);
+  check_integer(v[4], 0x00010203);
+  check_integer(v[5], 0x04050607);
+  check_integer(v[6], 0x08090A0B);
+  check_integer(v[7], 0x0C0D0E0F);
+  check_integer(v[8], 0xFFFFFFFF);
 
   v[0] = 0x00010203;
   v[1] = 0x04050607;
@@ -42,6 +70,24 @@ static void test_basen(void) {
   v[3] = 0x0C0D0E0F;
   insist(basen(v, 4, buffer, sizeof buffer, 16) == 0);
   check_string(buffer, "102030405060708090a0b0c0d0e0f");
+  memset(v, 0xFF, sizeof v);
+  insist(nesab(v, 4, buffer, 16) == 0);
+  check_integer(v[0], 0x00010203);
+  check_integer(v[1], 0x04050607);
+  check_integer(v[2], 0x08090A0B);
+  check_integer(v[3], 0x0C0D0E0F);
+  check_integer(v[4], 0xFFFFFFFF);
+  memset(v, 0xFF, sizeof v);
+  insist(nesab(v, 8, buffer, 16) == 0);
+  check_integer(v[0], 0);
+  check_integer(v[1], 0);
+  check_integer(v[2], 0);
+  check_integer(v[3], 0);
+  check_integer(v[4], 0x00010203);
+  check_integer(v[5], 0x04050607);
+  check_integer(v[6], 0x08090A0B);
+  check_integer(v[7], 0x0C0D0E0F);
+  check_integer(v[8], 0xFFFFFFFF);
 
   v[0] = 0x00010203;
   v[1] = 0x04050607;
index 87c803a..3a723b4 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * This file is part of DisOrder.
- * Copyright (C) 2008 Richard Kettlewell
+ * Copyright (C) 2008, 2009 Richard Kettlewell
  *
  * 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
@@ -19,6 +19,7 @@
 #include "event.h"
 
 #include <time.h>
+#include <sys/time.h>
 
 static int run1, run2, run3;
 static ev_timeout_handle t1, t2, t3;
index ba6bba5..de04e47 100644 (file)
@@ -30,7 +30,7 @@ static FILE *open_unicode_test(const char *path) {
     base = path;
   if(!(fp = fopen(base, "r"))) {
     snprintf(buffer, sizeof buffer,
-             "wget http://www.unicode.org/Public/5.0.0/ucd/%s", path);
+             "wget http://www.unicode.org/Public/5.1.0/ucd/%s", path);
     if((w = system(buffer)))
       fatal(0, "%s: %s", buffer, wstat(w));
     if(chmod(base, 0444) < 0)
index ae3f8eb..7852152 100644 (file)
@@ -25,7 +25,7 @@ notify_la_LDFLAGS=-module
 
 disorder_tracklength_la_SOURCES=tracklength.c mad.c madshim.h ../lib/wav.h ../lib/wav.c
 disorder_tracklength_la_LDFLAGS=-module
-disorder_tracklength_la_LIBADD=$(LIBVORBISFILE) $(LIBMAD) $(LIBFLAC)
+disorder_tracklength_la_LIBADD=$(LIBVORBISFILE) $(LIBMAD) $(LIBFLAC) -lm
 
 fs_la_SOURCES=fs.c
 fs_la_LDFLAGS=-module
index 3e1541e..d06c7ee 100644 (file)
@@ -50,7 +50,7 @@ import os
 import pwd
 import socket
 import binascii
-import sha
+import hashlib
 import sys
 import locale
 
@@ -66,6 +66,18 @@ _unquoted = re.compile("[^\"' \\t\\n\\r][^ \t\n\r]*")
 
 _response = re.compile("([0-9]{3}) ?(.*)")
 
+# hashes
+_hashes = {
+  "sha1": hashlib.sha1,
+  "SHA1": hashlib.sha1,
+  "sha256": hashlib.sha256,
+  "SHA256": hashlib.sha256,
+  "sha384": hashlib.sha384,
+  "SHA384": hashlib.sha384,
+  "sha512": hashlib.sha512,
+  "SHA512": hashlib.sha512,
+};
+
 version = "_version_"
 
 ########################################################################
@@ -387,8 +399,7 @@ class client:
             password = self.config['password']
           else:
             password = self.password
-          # TODO support algorithms other than SHA-1
-          h = sha.sha()
+          h = _hashes[algo]()
           h.update(password)
           h.update(binascii.unhexlify(challenge))
           self._simple("user", user, h.hexdigest())
index d1490cc..d43533e 100755 (executable)
@@ -92,7 +92,7 @@ sub input {
     my $path = shift;
     my $lpath = basename($path);
     if(!-e $lpath) {
-       system("wget http://www.unicode.org/Public/5.0.0/ucd/$path");
+       system("wget http://www.unicode.org/Public/5.1.0/ucd/$path");
        chmod(0444, $lpath) or die "$lpath: $!\n";
     }
     open(STDIN, "<$lpath") or die "$lpath: $!\n";
index 62ad1c4..f67db97 100644 (file)
@@ -1,6 +1,6 @@
 #
 # This file is part of DisOrder.
-# Copyright (C) 2004-2008 Richard Kettlewell
+# Copyright (C) 2004-2009 Richard Kettlewell
 #
 # 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
 sbin_PROGRAMS=disorderd disorder-deadlock disorder-rescan disorder-dump \
              disorder-speaker disorder-decode disorder-normalize \
              disorder-stats disorder-dbupgrade disorder-choose
-noinst_PROGRAMS=trackname
+noinst_PROGRAMS=trackname endian
 
 AM_CPPFLAGS=-I${top_srcdir}/lib -I../lib
 
 disorderd_SOURCES=disorderd.c api.c api-server.c daemonize.c play.c    \
        server.c server-queue.c queue-ops.c state.c plugin.c            \
-       schedule.c exports.c ../lib/memgc.c disorder-server.h
+       schedule.c dbparams.c background.c \
+       exports.c ../lib/memgc.c disorder-server.h
 disorderd_LDADD=$(LIBOBJS) ../lib/libdisorder.a \
        $(LIBPCRE) $(LIBDB) $(LIBAO) $(LIBGC) $(LIBGCRYPT) $(LIBICONV) \
        $(LIBASOUND) $(COREAUDIO)
@@ -37,14 +38,10 @@ disorder_deadlock_LDADD=$(LIBOBJS) ../lib/libdisorder.a \
        $(LIBDB) $(LIBPCRE) $(LIBICONV) $(LIBGCRYPT)
 disorder_deadlock_DEPENDENCIES=../lib/libdisorder.a
 
-disorder_speaker_SOURCES=speaker.c speaker.h \
-                        speaker-command.c \
-                        speaker-network.c \
-                        speaker-coreaudio.c \
-                        speaker-oss.c \
-                        speaker-alsa.c
+disorder_speaker_SOURCES=speaker.c
 disorder_speaker_LDADD=$(LIBOBJS) ../lib/libdisorder.a \
-       $(LIBASOUND) $(LIBPCRE) $(LIBICONV) $(LIBGCRYPT) $(COREAUDIO)
+       $(LIBASOUND) $(LIBPCRE) $(LIBICONV) $(LIBGCRYPT) $(COREAUDIO) \
+       $(LIBPTHREAD)
 disorder_speaker_DEPENDENCIES=../lib/libdisorder.a
 
 disorder_decode_SOURCES=decode.c disorder-server.h
@@ -67,7 +64,7 @@ disorder_rescan_DEPENDENCIES=../lib/libdisorder.a
 disorder_choose_SOURCES=choose.c server-queue.c ../lib/memgc.c \
                        disorder-server.h
 disorder_choose_LDADD=$(LIBOBJS) ../lib/libdisorder.a   \
-       $(LIBDB) $(LIBGC) $(LIBPCRE) $(LIBGCRYPT)
+       $(LIBDB) $(LIBGC) $(LIBPCRE) $(LIBICONV) $(LIBGCRYPT)
 disorder_choose_LDFLAGS=-export-dynamic
 disorder_choose_DEPENDENCIES=../lib/libdisorder.a
 
@@ -120,20 +117,38 @@ check-help: all
        ./disorder-choose --help > /dev/null
        ./disorder-choose --version > /dev/null
 
-# My sox doesn't know MP3 or FLAC unfortunately
-check-decode: disorder-decode disorder-normalize
+check-decode: disorder-decode disorder-normalize endian
        echo "speaker_backend network" > config
-       echo "broadcast 127.255.255.255 discard" > config
+       echo "broadcast 127.255.255.255 9" > config
+       oggdec -b 16 -e `./endian` -R -s 1 -o oggdec.raw ${top_srcdir}/sounds/scratch.ogg
+       @$(MAKE) check-ogg
+       @$(MAKE) check-wav
+       @if which flac >/dev/null 2>&1; then $(MAKE) check-flac; fi
+       rm -f config oggdec.raw
+
+# TODO mp3 - but sox doesn't (reliably) know how to encode to it
+
+check-ogg:
        ./disorder-decode ${top_srcdir}/sounds/scratch.ogg | \
-         ./disorder-normalize --config config > decoded.raw
-       oggdec -b 16 -e 1 -R -s 1 -o oggdec.raw ${top_srcdir}/sounds/scratch.ogg
-       cmp decoded.raw oggdec.raw
+         ./disorder-normalize --config config > ogged.raw
+       cmp ogged.raw oggdec.raw
+       rm -f ogged.raw
+
+check-wav:
        sox ${top_srcdir}/sounds/scratch.ogg scratch.wav
        ./disorder-decode scratch.wav | \
-         ./disorder-normalize --config config > decoded.raw
-       ls -l *.raw
-       cmp decoded.raw oggdec.raw
-       rm -f scratch.wav config decoded.raw oggdec.raw
+         ./disorder-normalize --config config > waved.raw
+       cmp waved.raw oggdec.raw
+       rm -rf scratch.wav waved.raw
+
+check-flac:
+       rm -f scratch.wav scratch.flac
+       sox ${top_srcdir}/sounds/scratch.ogg scratch.wav
+       flac scratch.wav
+       ./disorder-decode scratch.flac | \
+         ./disorder-normalize --config config > flacced.raw
+       cmp flacced.raw oggdec.raw
+       rm -f scratch.flac scratch.wav flacced.raw
 
 EXTRA_DIST=README.dbversions
 
diff --git a/server/api-client.c b/server/api-client.c
deleted file mode 100644 (file)
index 9321770..0000000
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * This file is part of DisOrder.
- * Copyright (C) 2004, 2007, 2008 Richard Kettlewell
- *
- * 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 3 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, see <http://www.gnu.org/licenses/>.
- */
-
-#include "common.h"
-
-#include <errno.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <locale.h>
-
-#include "client.h"
-#include "mem.h"
-#include "log.h"
-#include "configuration.h"
-#include "disorder.h"
-#include "api-client.h"
-
-static disorder_client *c;
-
-disorder_client *disorder_get_client(void) {
-  if(!c)
-    if(!(c = disorder_new(0))) exit(EXIT_FAILURE);
-  return c;
-}
-
-int disorder_track_exists(const char *track) {
-  int result;
-
-  return disorder_exists(c, track, &result) ? 0 : result;
-}
-
-const char *disorder_track_get_data(const char *track, const char *key) {
-  char *value;
-
-  if(disorder_get(c, track, key, &value)) return 0;
-  return value;
-}
-
-int disorder_track_set_data(const char *track,
-                           const char *key,
-                           const char *value) {
-  if(value)
-    return disorder_set(c, track, key, value);
-  else
-    return disorder_unset(c, track, key);
-}
-
-/*
-Local Variables:
-c-basic-offset:2
-comment-column:40
-End:
-*/
index fe9686c..e973fbe 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * This file is part of DisOrder.
- * Copyright (C) 2004, 2007, 2008 Richard Kettlewell
+ * Copyright (C) 2004, 2007, 2008, 2009 Richard Kettlewell
  *
  * 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
  */
 #include "disorder-server.h"
 
-/* shared implementation of vararg functions */
-#include "log-impl.h"
-#include "mem-impl.h"
-
 void *disorder_malloc(size_t n) {
   return xmalloc(n);
 }
@@ -60,6 +56,16 @@ int disorder_snprintf(char buffer[], size_t bufsize, const char *fmt, ...) {
   return n;
 }
 
+int disorder_asprintf(char **rp, const char *fmt, ...) {
+  va_list ap;
+  int n;
+
+  va_start(ap, fmt);
+  n = byte_vasprintf(rp, fmt, ap);
+  va_end(ap);
+  return n;
+}
+
 /*
 Local Variables:
 c-basic-offset:2
diff --git a/server/background.c b/server/background.c
new file mode 100644 (file)
index 0000000..be5a309
--- /dev/null
@@ -0,0 +1,137 @@
+/*
+ * This file is part of DisOrder.
+ * Copyright (C) 2004-2009 Richard Kettlewell
+ *
+ * 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 3 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, see <http://www.gnu.org/licenses/>.
+ */
+/** @file server/background.c
+ * @brief Background process support for playing tracks
+ */
+
+#include "disorder-server.h"
+
+/** @brief Fork the player or decoder for @p q 
+ * @param player Pointer to player information
+ * @param q Track to play or decode
+ * @param child Function to run inside fork
+ * @param bgdata Passed to @c child()
+ *
+ * @c q->pl had better already be set.
+ */
+int play_background(ev_source *ev,
+                    const struct stringlist *player,
+                    struct queue_entry *q,
+                    play_background_child_fn *child,
+                    void *bgdata) {
+  int lfd;
+  struct pbgc_params params[1];
+
+  memset(params, 0, sizeof params);
+  /* Get the raw path.  This needs to be done outside the fork.  It's needed by
+   * the play-track callback which has to have the raw filename bytes we got
+   * from readdir() as well as the normalized unicode version of the track
+   * name.  (Emphasize 'normalized'; even if you use UTF-8 for your filenames,
+   * they might not be normalized and if they are they might not be normalized
+   * to the same canonical form as DisOrder uses.) */
+  params->rawpath = trackdb_rawpath(q->track);
+  /* Call the prefork function in the player module.  None of the built-in
+   * modules use this so it's not well tested, unfortunately. */
+  if(q->type & DISORDER_PLAYER_PREFORK)
+    if(!(q->data = play_prefork(q->pl, q->track))) {
+      error(0, "prefork function for %s failed", q->track);
+      return START_HARDFAIL;
+    }
+  /* Capture the player/decoder's stderr and feed it into our logs.
+   *
+   * Use the second arg as the tag if available (it's probably a command name),
+   * otherwise the module name. */
+  if(!isatty(2))
+    lfd = logfd(ev, player->s[2] ? player->s[2] : player->s[1]);
+  else
+    lfd = -1;
+  /* Parse player arguments */
+  int optc = player->n - 2;
+  const char **optv = (const char **)&player->s[2];
+  while(optc > 0 && optv[0][0] == '-') {
+    if(!strcmp(optv[0], "--")) {
+      ++optv;
+      --optc;
+      break;
+    }
+    if(!strcmp(optv[0], "--wait-for-device")
+       || !strncmp(optv[0], "--wait-for-device=", 18)) {
+      const char *waitdevice;
+      if((waitdevice = strchr(optv[0], '='))) {
+       params->waitdevice = waitdevice + 1;
+      } else
+        params->waitdevice = "";       /* use default */
+      ++optv;
+      --optc;
+    } else {
+      error(0, "unknown option %s", optv[0]);
+      return START_HARDFAIL;
+    }
+  }
+  params->argc = optc;
+  params->argv = optv;
+  /* Create the child process */
+  switch(q->pid = fork()) {
+  case 0:
+    /* Child of disorderd */
+    exitfn = _exit;
+    progname = "disorderd-fork";
+    ev_signal_atfork(ev);
+    signal(SIGPIPE, SIG_DFL);
+    /* Send our log output to DisOrder's logs */
+    if(lfd != -1) {
+      xdup2(lfd, 1);
+      xdup2(lfd, 2);
+      xclose(lfd);                     /* tidy up */
+    }
+    /* Create a new process group, ID = child PID */
+    setpgid(0, 0);
+    _exit(child(q, params, bgdata));
+  case -1:
+    /* Back in disorderd (child could not be created) */
+    error(errno, "error calling fork");
+    if(q->type & DISORDER_PLAYER_PREFORK)
+      play_cleanup(q->pl, q->data);    /* else would leak */
+    if(lfd != -1)
+      xclose(lfd);
+    return START_SOFTFAIL;
+  }
+  /* We don't need the child's end of the log pipe */
+  if(lfd != -1)
+    xclose(lfd);
+  /* Set the child's process group ID.
+   *
+   * But wait, didn't we already set it in the child?  Yes, but it's possible
+   * that we'll need to address it by process group ID before it gets that far,
+   * so we set it here too.  One or the other may fail but as long as one
+   * succeeds that's fine.
+   */
+  setpgid(q->pid, q->pid);
+  /* Ask the event loop to tell us when the child terminates */
+  D(("player subprocess ID %lu", (unsigned long)q->pid));
+  return START_OK;
+}
+
+/*
+Local Variables:
+c-basic-offset:2
+comment-column:40
+fill-column:79
+indent-tabs-mode:nil
+End:
+*/
index bc82475..10ed360 100644 (file)
@@ -281,7 +281,7 @@ int main(int argc, char **argv) {
     openlog(progname, LOG_PID, LOG_DAEMON);
     log_default = &log_syslog;
   }
-  if(config_read(0)) fatal(0, "cannot read configuration");
+  if(config_read(0, NULL)) fatal(0, "cannot read configuration");
   /* Find out current queue/recent list */
   queue_read();
   recent_read();
diff --git a/server/dbparams.c b/server/dbparams.c
new file mode 100644 (file)
index 0000000..60ba4a8
--- /dev/null
@@ -0,0 +1,186 @@
+/*
+ * This file is part of DisOrder
+ * Copyright (C) 2009 Richard Kettlewell
+ *
+ * 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 3 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, see <http://www.gnu.org/licenses/>.
+ */
+/** @file server/dbparams.c
+ * @brief Parameters affecting the database
+ *
+ * Rescan can regenerate aliases and the search and tag databases but
+ * we rather assume that they are either empty or good.  Therefore we
+ * need to store anything that can affect these values and erase them
+ * if they change.
+ *
+ * The solution is a global pref _dbparams which contains the hash of
+ * the alias, stopword and namepart data.
+ */
+#include "disorder-server.h"
+#include <gcrypt.h>
+
+static int dbparams_cleanup(DB_TXN *tid);
+static void h_write_string(gcrypt_hash_handle h,
+                           const char *s);
+static char *compute_dbparams(void);
+
+/** @brief Check whether database parameters have changed
+ *
+ * If the database parameters have changed then deletes the search and
+ * tag database contents and all aliases.  The subsequent rescan will
+ * regenerate them.
+ */
+void dbparams_check(void) {
+  const char *newparams = compute_dbparams();
+  const char *oldparams = trackdb_get_global("_dbparams");
+
+  // If the parameters match, return straight away
+  if(oldparams && !strcmp(newparams, oldparams))
+    return;
+  // Log what we're going to do
+  for(;;) {
+    DB_TXN *tid;
+    if(oldparams)
+      info("database parameter string changed from %s to %s - removing old data",
+           oldparams, newparams);
+    else {
+      info("new database parameter string %s - removing old data",
+           newparams);
+      /* This is a slightly annoying case; the global pref wasn't present.  In
+       * practice this is almost certainly either an upgrade (with no change to
+       * any relevant parameters) or a new installation (with no tracks).
+       *
+       * The new installation case doesn't matter much; clearing an empty
+       * search database and iterating over a likewise track database won't
+       * take long.
+       *
+       * However for upgrade this will throw away a lot of data and laboriously
+       * regenerate it, which is rather a shame.
+       */
+    }
+    tid = trackdb_begin_transaction();
+    int err = dbparams_cleanup(tid);
+    if(!err)
+      err = trackdb_set_global_tid("_dbparams", newparams, tid);
+    switch(err) {
+    case 0:
+      trackdb_commit_transaction(tid);
+      info("removed old data OK, will regenerate on rescan");
+      return;
+    case DB_LOCK_DEADLOCK:
+      /* Deadlocked, try again */
+      trackdb_abort_transaction(tid);
+      break;
+    default:
+      fatal(0, "error updating database: %s", db_strerror(err));
+    }
+  }
+}
+
+/** @brief Clean up databases */
+static int dbparams_cleanup(DB_TXN *tid) {
+  int err;
+  u_int32_t count;
+
+  /* We'll regenerate search.db based on the new set of stopwords */
+  if((err = trackdb_searchdb->truncate(trackdb_searchdb, tid, &count, 0))) {
+    error(err, "truncating search.db: %s", db_strerror(err));
+    return err;
+  }
+  /* We'll regenerate aliases based on the new alias/namepart settings, so
+   * delete all the alias records currently present
+   *
+   * TODO this looks suspiciously similar to part of dump.c
+   */
+  DBC *cursor;
+  DBT k, d;
+  cursor = trackdb_opencursor(trackdb_tracksdb, tid);
+  if((err = cursor->c_get(cursor, prepare_data(&k), prepare_data(&d),
+                          DB_FIRST)) == DB_LOCK_DEADLOCK) {
+    error(0, "cursor->c_get: %s", db_strerror(err));
+    goto done;
+  }
+  while(err == 0) {
+    struct kvp *data = kvp_urldecode(d.data, d.size);
+    if(kvp_get(data, "_alias_for")) {
+      if((err = cursor->c_del(cursor, 0))) {
+        error(0, "cursor->c_del: %s", db_strerror(err));
+        goto done;
+      }
+    }
+    err = cursor->c_get(cursor, prepare_data(&k), prepare_data(&d), DB_NEXT);
+  }
+  if(err == DB_LOCK_DEADLOCK) {
+    error(0, "cursor operation: %s", db_strerror(err));
+    goto done;
+  }
+  if(err != DB_NOTFOUND) 
+    fatal(0, "cursor->c_get: %s", db_strerror(err));
+  err = 0;
+done:
+  if(trackdb_closecursor(cursor) && !err) err = DB_LOCK_DEADLOCK;
+  return err;
+}
+
+/** @brief Write a string into a gcrypt hash function
+ * @param h Hash handle
+ * @param s String to write
+ *
+ * The 0 terminator is included in the byte written.
+ */
+static void h_write_string(gcrypt_hash_handle h,
+                           const char *s) {
+  gcry_md_write(h, s, strlen(s) + 1);
+}
+
+/** @brief Compute database parameters hash
+ * @return Opaque string encapsulating database parameters
+ */
+static char *compute_dbparams(void) {
+  gcry_error_t e;
+  gcrypt_hash_handle h;
+
+  if((e = gcry_md_open(&h, GCRY_MD_SHA256, 0)))
+    fatal(0, "gcry_md_open: %s", gcry_strerror(e));
+  h_write_string(h, "alias");
+  h_write_string(h, config->alias);
+  for(int n = 0; n < config->stopword.n; ++n) {
+    h_write_string(h, "stopword");
+    h_write_string(h, config->stopword.s[n]);
+  }
+  for(int n = 0; n < config->namepart.n; ++n) {
+    h_write_string(h, "namepart");
+    h_write_string(h, config->namepart.s[n].part);
+    h_write_string(h, config->namepart.s[n].res);
+    h_write_string(h, config->namepart.s[n].replace);
+    h_write_string(h, config->namepart.s[n].context);
+    char buffer[64];
+    snprintf(buffer, sizeof buffer, "%u", config->namepart.s[n].reflags);
+    h_write_string(h, buffer);
+  }
+  char *result;
+  byte_xasprintf(&result, "dbparams-0-sha256:%s", 
+                 hex(gcry_md_read(h, GCRY_MD_SHA256), 
+                     gcry_md_get_algo_dlen(GCRY_MD_SHA256)));
+  gcry_md_close(h);
+  return result;
+}
+
+/*
+Local Variables:
+c-basic-offset:2
+comment-column:40
+fill-column:79
+indent-tabs-mode:nil
+End:
+*/
index bd08eed..09dd789 100644 (file)
@@ -333,7 +333,7 @@ int main(int argc, char **argv) {
     openlog(progname, LOG_PID, LOG_DAEMON);
     log_default = &log_syslog;
   }
-  if(config_read(0)) fatal(0, "cannot read configuration");
+  if(config_read(0, NULL)) fatal(0, "cannot read configuration");
   /* Open the database */
   trackdb_init(TRACKDB_NO_RECOVER);
   trackdb_open(TRACKDB_OPEN_FOR_UPGRADE);
index 3c13351..d90a123 100644 (file)
@@ -71,7 +71,7 @@ int main(int argc, char **argv) {
     openlog(progname, LOG_PID, LOG_DAEMON);
     log_default = &log_syslog;
   }
-  if(config_read(0)) fatal(0, "cannot read configuration");
+  if(config_read(0, NULL)) fatal(0, "cannot read configuration");
   info("started");
   trackdb_init(TRACKDB_NO_RECOVER);
   while(getppid() != 1) {
index ef999b3..0c8893c 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * This file is part of DisOrder
- * Copyright (C) 2007, 2008 Richard Kettlewell
+ * Copyright (C) 2007-2009 Richard Kettlewell
  *
  * 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
@@ -387,13 +387,20 @@ static void decode_flac(void) {
     fatal(0, "FLAC__file_decoder_init: %s", FLAC__FileDecoderStateString[fs]);
   FLAC__file_decoder_process_until_end_of_file(fd);
 #else
-  FLAC__StreamDecoder *sd = 0;
+  FLAC__StreamDecoder *sd = FLAC__stream_decoder_new();
   FLAC__StreamDecoderInitStatus is;
 
+  if (!sd)
+       fatal(0, "FLAC__stream_decoder_new failed");
+
   if((is = FLAC__stream_decoder_init_file(sd, path, flac_write, flac_metadata,
                                           flac_error, 0)))
     fatal(0, "FLAC__stream_decoder_init_file %s: %s",
           path, FLAC__StreamDecoderInitStatusString[is]);
+
+  FLAC__stream_decoder_process_until_end_of_stream(sd);
+  FLAC__stream_decoder_finish(sd);
+  FLAC__stream_decoder_delete(sd);
 #endif
 }
 
index 4eb58e4..60e97df 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * This file is part of DisOrder
- * Copyright (C) 2008 Richard Kettlewell
+ * Copyright (C) 2008, 2009 Richard Kettlewell
  *
  * 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
@@ -67,7 +67,6 @@
 #include "logfd.h"
 #include "mem.h"
 #include "mime.h"
-#include "mixer.h"
 #include "printf.h"
 #include "queue.h"
 #include "random.h"
 #include "trackdb-int.h"
 #include "trackdb.h"
 #include "trackname.h"
+#include "uaudio.h"
 #include "unicode.h"
 #include "user.h"
 #include "vector.h"
 #include "version.h"
 #include "wstat.h"
 
+extern const struct uaudio *api;
+
 void daemonize(const char *tag, int fac, const char *pidfile);
 /* Go into background.  Send stdout/stderr to syslog.
  * If @pri@ is non-null, it should be "facility.level"
@@ -97,8 +99,18 @@ void daemonize(const char *tag, int fac, const char *pidfile);
 void quit(ev_source *ev) attribute((noreturn));
 /* terminate the daemon */
 
-int reconfigure(ev_source *ev, int reload);
-/* reconfigure.  If @reload@ is nonzero, update the configuration. */
+int reconfigure(ev_source *ev, unsigned flags);
+/* reconfigure */
+
+void reset_sockets(ev_source *ev);
+
+/** @brief Set when starting server */
+#define RECONFIGURE_FIRST 0x0001
+
+/** @brief Set when reloading after SIGHUP etc */
+#define RECONFIGURE_RELOADING 0x0002
+
+void dbparams_check(void);
 
 extern struct queue_entry qhead;
 /* queue of things yet to be played.  the head will be played
@@ -322,6 +334,41 @@ int play_pause(const struct plugin *pl, long *playedp, void *data);
 void play_resume(const struct plugin *pl, void *data);
 /* Resume track. */
 
+/* background process support *************************************************/
+
+/** @brief Child process parameters */
+struct pbgc_params {
+  /** @brief Length of player command */
+  int argc;
+  /** @brief Player command */
+  const char **argv;
+  /** @brief Device to wait for or NULL */
+  const char *waitdevice;
+  /** @brief Raw track name */
+  const char *rawpath;
+};
+
+/** @brief Callback to play or prepare a track
+ * @param q Track to play or decode
+ * @param bgdata User data pointer
+ * @return Exit code
+ */
+typedef int play_background_child_fn(struct queue_entry *q,
+                                     const struct pbgc_params *params,
+                                     void *bgdata);
+
+int play_background(ev_source *ev,
+                    const struct stringlist *player,
+                    struct queue_entry *q,
+                    play_background_child_fn *child,
+                    void *bgdata);
+
+/* Return values from start(),  prepare() and play_background() */
+
+#define START_OK 0        /**< @brief Succeeded. */
+#define START_HARDFAIL 1   /**< @brief Track is broken. */
+#define START_SOFTFAIL 2   /**< @brief Track OK, system (temporarily?) broken */
+
 #endif /* DISORDER_SERVER_H */
 
 /*
index 2342c3c..31b70a4 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * This file is part of DisOrder.
- * Copyright (C) 2004-2008 Richard Kettlewell
+ * Copyright (C) 2004-2009 Richard Kettlewell
  *
  * 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
@@ -58,7 +58,7 @@ static int handle_sighup(ev_source attribute((unused)) *ev_,
                         int attribute((unused)) sig,
                         void attribute((unused)) *u) {
   info("received SIGHUP");
-  reconfigure(ev, 1);
+  reconfigure(ev, RECONFIGURE_RELOADING);
   return 0;
 }
 
@@ -132,7 +132,8 @@ static void periodic_volume_check(ev_source attribute((unused)) *ev_) {
   int l, r;
   char lb[32], rb[32];
 
-  if(!mixer_control(-1/*as configured*/, &l, &r, 0)) {
+  if(api && api->get_volume) {
+    api->get_volume(&l, &r);
     if(l != volume_left || r != volume_right) {
       volume_left = l;
       volume_right = r;
@@ -208,7 +209,10 @@ int main(int argc, char **argv) {
   fix_path();
   srand(time(0));                      /* don't start the same every time */
   /* gcrypt initialization */
+  if(!gcry_check_version(NULL))
+    disorder_fatal(0, "gcry_check_version failed");
   gcry_control(GCRYCTL_INIT_SECMEM, 1);
+  gcry_control (GCRYCTL_INITIALIZATION_FINISHED, 0);
   /* make sure we can't have more than FD_SETSIZE files open (event.c does
    * check but this provides an additional line of defence) */
   if(getrlimit(RLIMIT_NOFILE, rl) < 0)
@@ -225,7 +229,8 @@ int main(int argc, char **argv) {
   ev = ev_new();
   if(ev_child_setup(ev)) fatal(0, "ev_child_setup failed");
   /* read config */
-  if(config_read(1))
+  config_uaudio_apis = uaudio_apis;
+  if(config_read(1,  NULL))
     fatal(0, "cannot read configuration");
   /* make sure the home directory exists and has suitable permissions */
   make_home();
@@ -239,7 +244,7 @@ int main(int argc, char **argv) {
   /* make sure we're not root, whatever the config says */
   if(getuid() == 0 || geteuid() == 0) fatal(0, "do not run as root");
   /* open a lockfile - we only want one copy of the server to run at once. */
-  if(config->lock) {
+  if(1) {
     const char *lockfile;
     int lockfd;
     struct flock lock;
@@ -257,12 +262,24 @@ int main(int argc, char **argv) {
   /* initialize database environment */
   trackdb_init(TRACKDB_NORMAL_RECOVER|TRACKDB_MAY_CREATE);
   trackdb_master(ev);
-  /* install new config (calls trackdb_open()) */
-  reconfigure(ev, 0);
+  /* install new config; don't create socket */
+  if(reconfigure(ev, RECONFIGURE_FIRST))
+    fatal(0, "failed to read configuration");
+  /* Open the database */
+  trackdb_open(TRACKDB_CAN_UPGRADE);
+  /* load the queue and recently-played list */
+  queue_read();
+  recent_read();
+  /* Arrange timeouts for schedule actions */
+  schedule_init(ev);
   /* pull in old users */
   trackdb_old_users();
   /* create a root login */
   trackdb_create_root();
+  /* create sockets */
+  reset_sockets(ev);
+  /* check for change to database parameters */
+  dbparams_check();
   /* re-read config if we receive a SIGHUP */
   if(ev_signal(ev, SIGHUP, handle_sighup, 0)) fatal(0, "ev_signal failed");
   /* exit on SIGINT/SIGTERM */
index ab48e48..1cee366 100644 (file)
@@ -397,7 +397,7 @@ int main(int argc, char **argv) {
       fatal(0, "specify only a dump file name");
     path = argv[optind];
   }
-  if(config_read(0)) fatal(0, "cannot read configuration");
+  if(config_read(0, NULL)) fatal(0, "cannot read configuration");
   trackdb_init(recover|TRACKDB_MAY_CREATE);
   trackdb_open(TRACKDB_NO_UPGRADE);
   if(dump) {
diff --git a/server/endian.c b/server/endian.c
new file mode 100644 (file)
index 0000000..b7e9168
--- /dev/null
@@ -0,0 +1,23 @@
+/** @file server/endian.c
+ * @brief Expose runtime endianness to makefile for testing
+ */
+#include <config.h>
+#include <stdio.h>
+
+int main(void) {
+#if WORDS_BIGENDIAN
+  puts("1");
+#else
+  puts("0");
+#endif
+  return 0;
+}
+
+/*
+Local Variables:
+c-basic-offset:2
+comment-column:40
+fill-column:79
+indent-tabs-mode:nil
+End:
+*/
index db5b9d5..717f3cc 100644 (file)
@@ -141,7 +141,7 @@ int main(int argc, char attribute((unused)) **argv) {
     default: fatal(0, "invalid option");
     }
   }
-  if(config_read(1))
+  if(config_read(1, NULL))
     fatal(0, "cannot read configuration");
   if(logsyslog) {
     openlog(progname, LOG_PID, LOG_DAEMON);
index 93a7f48..f971991 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * This file is part of DisOrder.
- * Copyright (C) 2004-2008 Richard Kettlewell
+ * Copyright (C) 2004-2009 Richard Kettlewell
  *
  * 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
@@ -17,6 +17,8 @@
  */
 /** @file server/play.c
  * @brief Playing tracks
+ *
+ * This file is rather badly organized.  Sorry.  It's better than it was...
  */
 
 #include "disorder-server.h"
 
 #define SPEAKER "disorder-speaker"
 
+/** @brief The current playing track or NULL */
 struct queue_entry *playing;
+
+/** @brief Set when paused */
 int paused;
 
 static void finished(ev_source *ev);
-
+static int start_child(struct queue_entry *q, 
+                       const struct pbgc_params *params,
+                       void attribute((unused)) *bgdata);
+static int prepare_child(struct queue_entry *q, 
+                         const struct pbgc_params *params,
+                         void attribute((unused)) *bgdata);
+
+/** @brief File descriptor of our end of the socket to the speaker */
 static int speaker_fd = -1;
-static hash *player_pids;
-static int shutting_down;
-
-static void store_player_pid(const char *id, pid_t pid) {
-  if(!player_pids) player_pids = hash_new(sizeof (pid_t));
-  hash_add(player_pids, id, &pid, HASH_INSERT_OR_REPLACE);
-}
 
-static pid_t find_player_pid(const char *id) {
-  pid_t *pidp;
-
-  if(player_pids && (pidp = hash_find(player_pids, id))) return *pidp;
-  return -1;
-}
+/** @brief Set when shutting down */
+static int shutting_down;
 
-static void forget_player_pid(const char *id) {
-  if(player_pids) hash_remove(player_pids, id);
-}
+/* Speaker ------------------------------------------------------------------ */
 
-/* called when speaker process terminates */
+/** @brief Called when speaker process terminates
+ *
+ * Currently kills of DisOrder completely.  A future version could terminate
+ * the speaker when nothing was going on, or recover from failures, though any
+ * tracks with decoders already started would need to have them restarted.
+ */
 static int speaker_terminated(ev_source attribute((unused)) *ev,
                              pid_t attribute((unused)) pid,
                              int attribute((unused)) status,
@@ -59,7 +63,7 @@ static int speaker_terminated(ev_source attribute((unused)) *ev,
        wstat(status));
 }
 
-/* called when speaker process has something to say */
+/** @brief Called when we get a message from the speaker process */
 static int speaker_readable(ev_source *ev, int fd,
                            void attribute((unused)) *u) {
   struct speaker_message sm;
@@ -88,11 +92,12 @@ static int speaker_readable(ev_source *ev, int fd,
     playing->sofar = sm.data;
     break;
   default:
-    error(0, "unknown message type %d", sm.type);
+    error(0, "unknown speaker message type %d", sm.type);
   }
   return 0;
 }
 
+/** @brief Initialize the speaker process */
 void speaker_setup(ev_source *ev) {
   int sp[2];
   pid_t pid;
@@ -132,6 +137,7 @@ void speaker_setup(ev_source *ev) {
     fatal(0, "error registering speaker socket fd");
 }
 
+/** @brief Tell the speaker to reload its configuration */
 void speaker_reload(void) {
   struct speaker_message sm;
 
@@ -140,9 +146,23 @@ void speaker_reload(void) {
   speaker_send(speaker_fd, &sm);
 }
 
-/* Called when the currently playing track finishes playing.  This
- * might be because the player finished or because the speaker process
- * told us so. */
+/* Track termination -------------------------------------------------------- */
+
+/** @brief Called when the currently playing track finishes playing
+ * @param ev Event loop or NULL
+ *
+ * There are three places this is called from:
+ * 
+ * 1) speaker_readable(), when the speaker tells us the playing track finished.
+ * (Technically the speaker lies a little to arrange for gapless play.)
+ *
+ * 2) player_finished(), when the player for a non-raw track (i.e. one that
+ * does not use the speaker) finishes.
+ *
+ * 3) quitting(), after signalling the decoder or player but possible before it
+ * has actually terminated.  In this case @p ev is NULL, inhibiting any further
+ * attempt to play anything.
+ */
 static void finished(ev_source *ev) {
   D(("finished playing=%p", (void *)playing));
   if(!playing)
@@ -164,15 +184,20 @@ static void finished(ev_source *ev) {
   }
   queue_played(playing);
   recent_write();
-  forget_player_pid(playing->id);
   playing = 0;
   /* Try to play something else */
-  /* TODO re-support config->gap? */
   if(ev)
     play(ev);
 }
 
-/* Called when a player terminates. */
+/** @brief Called when a player or decoder process terminates
+ *
+ * This is called when a decoder process terminates (which might actually be
+ * some time before the speaker reports it as finished) or when a non-raw
+ * (i.e. non-speaker) player terminates.  In the latter case it's imaginable
+ * that the OS has buffered the last few samples.
+ * 
+ */
 static int player_finished(ev_source *ev,
                           pid_t pid,
                           int status,
@@ -185,18 +210,20 @@ static int player_finished(ev_source *ev,
   /* Record that this PID is dead.  If we killed the track we might know this
    * already, but also it might have exited or crashed.  Either way we don't
    * want to end up signalling it. */
-  if(pid == find_player_pid(q->id))
-    forget_player_pid(q->id);
+  q->pid = -1;
   switch(q->state) {
   case playing_unplayed:
   case playing_random:
     /* If this was a pre-prepared track then either it failed or we
-     * deliberately stopped it because it was removed from the queue or moved
-     * down it.  So leave it state alone for future use. */
+     * deliberately stopped it: it might have been removed from the queue, or
+     * moved down the queue, or the speaker might be on a break.  So we leave
+     * it state alone for future use.
+     */
     break;
   default:
     /* We actually started playing this track. */
     if(status) {
+      /* Don't override 'scratched' with 'failed'. */
       if(q->state != playing_scratched)
        q->state = playing_failed;
     } else 
@@ -219,262 +246,240 @@ static int player_finished(ev_source *ev,
   return 0;
 }
 
-/* Find the player for Q */
-static int find_player(const struct queue_entry *q) {
+/* Track initiation --------------------------------------------------------- */
+
+/** @brief Find the player for @p q */
+static const struct stringlist *find_player(const struct queue_entry *q) {
   int n;
   
   for(n = 0; n < config->player.n; ++n)
     if(fnmatch(config->player.s[n].s[0], q->track, 0) == 0)
       break;
   if(n >= config->player.n)
-    return -1;
+    return NULL;
   else
-    return n;
+    return &config->player.s[n];
 }
 
-/* Return values from start() */
-#define START_OK 0                     /**< @brief Succeeded. */
-#define START_HARDFAIL 1               /**< @brief Track is broken. */
-#define START_SOFTFAIL 2          /**< @brief Track OK, system (temporarily?) broken */
-
-/** @brief Play or prepare @p q
+/** @brief Start to play @p q
  * @param ev Event loop
  * @param q Track to play/prepare
- * @param prepare_only If true, only prepares track
  * @return @ref START_OK, @ref START_HARDFAIL or @ref START_SOFTFAIL
+ *
+ * This makes @p actually start playing.  It calls prepare() if necessary and
+ * either sends an @ref SM_START command or invokes the player itself in a
+ * subprocess.
+ *
+ * It's up to the caller to set @ref playing and @c playing->state (this might
+ * be changed in the future).
  */
 static int start(ev_source *ev,
-                struct queue_entry *q,
-                int prepare_only) {
-  int n, lfd;
-  const char *p;
-  int np[2], sfd;
-  struct speaker_message sm;
-  char buffer[64];
-  int optc;
-  ao_sample_format format;
-  ao_device *device;
-  int retries;
-  struct timespec ts;
-  const char *waitdevice = 0;
-  const char *const *optv;
-  pid_t pid, npid;
-  struct sockaddr_un addr;
-  uint32_t l;
+                struct queue_entry *q) {
+  const struct stringlist *player;
+  int rc;
 
-  memset(&sm, 0, sizeof sm);
-  D(("start %s %d", q->id, prepare_only));
-  if(q->prepared) {
-    /* The track is alraedy prepared */
-    if(!prepare_only) {
-      /* We want to run it, since it's prepared the answer is to tell the
-       * speaker to set it off */
-      strcpy(sm.id, q->id);
-      sm.type = SM_PLAY;
-      speaker_send(speaker_fd, &sm);
-      D(("sent SM_PLAY for %s", sm.id));
-    }
-    return START_OK;
-  }
+  D(("start %s", q->id));
   /* Find the player plugin. */
-  if((n = find_player(q)) < 0) return START_HARDFAIL;
-  if(!(q->pl = open_plugin(config->player.s[n].s[1], 0)))
+  if(!(player = find_player(q)) < 0)
+    return START_HARDFAIL;              /* No player */
+  if(!(q->pl = open_plugin(player->s[1], 0)))
     return START_HARDFAIL;
   q->type = play_get_type(q->pl);
-  /* Can't prepare non-raw tracks. */
-  if(prepare_only
-     && (q->type & DISORDER_PLAYER_TYPEMASK) != DISORDER_PLAYER_RAW)
+  /* Special handling for raw-format players */
+  if((q->type & DISORDER_PLAYER_TYPEMASK) == DISORDER_PLAYER_RAW) {
+    /* Make sure that the track is prepared */
+    if((rc = prepare(ev, q)))
+      return rc;
+    /* Now we're sure it's prepared, start it playing */
+    /* TODO actually it might not be fully prepared yet - it's all happening in
+     * a subprocess.  See speaker.c for further discussion.  */
+    struct speaker_message sm[1];
+    memset(sm, 0, sizeof sm);
+    strcpy(sm->id, q->id);
+    sm->type = SM_PLAY;
+    speaker_send(speaker_fd, sm);
+    D(("sent SM_PLAY for %s", sm->id));
+    /* Our caller will set playing and playing->state = playing_started */
     return START_OK;
-  /* Call the prefork function. */
-  p = trackdb_rawpath(q->track);
-  if(q->type & DISORDER_PLAYER_PREFORK)
-    if(!(q->data = play_prefork(q->pl, p))) {
-      error(0, "prefork function for %s failed", q->track);
-      return START_HARDFAIL;
-    }
-  /* Use the second arg as the tag if available (it's probably a command name),
-   * otherwise the module name. */
-  if(!isatty(2))
-    lfd = logfd(ev, (config->player.s[n].s[2]
-                    ? config->player.s[n].s[2] : config->player.s[n].s[1]));
-  else
-    lfd = -1;
-  optc = config->player.s[n].n - 2;
-  optv = (void *)&config->player.s[n].s[2];
-  while(optc > 0 && optv[0][0] == '-') {
-    if(!strcmp(optv[0], "--")) {
-      ++optv;
-      --optc;
-      break;
-    }
-    if(!strcmp(optv[0], "--wait-for-device")
-       || !strncmp(optv[0], "--wait-for-device=", 18)) {
-      if((waitdevice = strchr(optv[0], '='))) {
-       ++waitdevice;
-      } else
-       waitdevice = "";                /* use default */
-      ++optv;
-      --optc;
-    } else {
-      error(0, "unknown option %s", optv[0]);
-      return START_HARDFAIL;
-    }
+  } else {
+    rc = play_background(ev, player, q, start_child, NULL);
+    if(rc == START_OK)
+      ev_child(ev, q->pid, 0, player_finished, q);
+      /* Our caller will set playing and playing->state = playing_started */
+    return rc;
   }
-  switch(pid = fork()) {
-  case 0:                      /* child */
-    exitfn = _exit;
-    progname = "disorderd-fork";
-    ev_signal_atfork(ev);
-    signal(SIGPIPE, SIG_DFL);
-    if(lfd != -1) {
-      xdup2(lfd, 1);
-      xdup2(lfd, 2);
-      xclose(lfd);                     /* tidy up */
-    }
-    setpgid(0, 0);
-    if((q->type & DISORDER_PLAYER_TYPEMASK) == DISORDER_PLAYER_RAW) {
-      /* "Raw" format players always have their output send down a pipe
-       * to the disorder-normalize process.  This will connect to the
-       * speaker process to actually play the audio data.
-       */
-      /* np will be the pipe to disorder-normalize */
-      if(socketpair(PF_UNIX, SOCK_STREAM, 0, np) < 0)
-       fatal(errno, "error calling socketpair");
-      /* Beware of the Leopard!  On OS X 10.5.x, the order of the shutdown
-       * calls here DOES MATTER.  If you do the SHUT_WR first then the SHUT_RD
-       * fails with "Socket is not connected".  I think this is a bug but
-       * provided implementors either don't care about the order or all agree
-       * about the order, choosing the reliable order is an adequate
-       * workaround.  */
-      xshutdown(np[1], SHUT_RD);       /* decoder writes to np[1] */
-      xshutdown(np[0], SHUT_WR);       /* normalize reads from np[0] */
-      blocking(np[0]);
-      blocking(np[1]);
-      /* Start disorder-normalize */
-      if(!(npid = xfork())) {
-       if(!xfork()) {
-         /* Connect to the speaker process */
-         memset(&addr, 0, sizeof addr);
-         addr.sun_family = AF_UNIX;
-         snprintf(addr.sun_path, sizeof addr.sun_path,
-                  "%s/speaker/socket", config->home);
-         sfd = xsocket(PF_UNIX, SOCK_STREAM, 0);
-         if(connect(sfd, (const struct sockaddr *)&addr, sizeof addr) < 0)
-           fatal(errno, "connecting to %s", addr.sun_path);
-         l = strlen(q->id);
-         if(write(sfd, &l, sizeof l) < 0
-            || write(sfd, q->id, l) < 0)
-           fatal(errno, "writing to %s", addr.sun_path);
-         /* Await the ack */
-         if (read(sfd, &l, 1) < 0) 
-               fatal(errno, "reading ack from %s", addr.sun_path);
-         /* Plumbing */
-         xdup2(np[0], 0);
-         xdup2(sfd, 1);
-         xclose(np[0]);
-         xclose(np[1]);
-         xclose(sfd);
-         /* Ask the speaker to actually start playing the track; we do it here
-          * so it's definitely after ack. */
-         if(!prepare_only) {
-           strcpy(sm.id, q->id);
-           sm.type = SM_PLAY;
-           speaker_send(speaker_fd, &sm);
-           D(("sent SM_PLAY for %s", sm.id));
-         }
-         /* TODO stderr shouldn't be redirected for disorder-normalize
-          * (but it should be for play_track() */
-         execlp("disorder-normalize", "disorder-normalize",
-                log_default == &log_syslog ? "--syslog" : "--no-syslog",
-                "--config", configfile,
-                (char *)0);
-         fatal(errno, "executing disorder-normalize");
-         /* end of the innermost fork */
-       }
-       _exit(0);
-       /* end of the middle fork */
-      }
-      /* Wait for the middle fork to finish */
-      while(waitpid(npid, &n, 0) < 0 && errno == EINTR)
-       ;
-      /* Pass the file descriptor to the driver in an environment
-       * variable. */
-      snprintf(buffer, sizeof buffer, "DISORDER_RAW_FD=%d", np[1]);
-      if(putenv(buffer) < 0)
-       fatal(errno, "error calling putenv");
-      /* Close all the FDs we don't need */
-      xclose(np[0]);
-    }
-    if(waitdevice) {
-      ao_initialize();
-      if(*waitdevice) {
-       n = ao_driver_id(waitdevice);
-       if(n == -1)
-         fatal(0, "invalid libao driver: %s", optv[0]);
-       } else
-         n = ao_default_driver_id();
-      /* Make up a format. */
-      memset(&format, 0, sizeof format);
-      format.bits = 8;
-      format.rate = 44100;
-      format.channels = 1;
-      format.byte_format = AO_FMT_NATIVE;
-      retries = 20;
-      ts.tv_sec = 0;
-      ts.tv_nsec = 100000000;  /* 0.1s */
-      while((device = ao_open_live(n, &format, 0)) == 0 && retries-- > 0)
-         nanosleep(&ts, 0);
-      if(device)
-       ao_close(device);
-    }
-    play_track(q->pl,
-              optv, optc,
-              p,
-              q->track);
-    _exit(0);
-  case -1:                     /* error */
-    error(errno, "error calling fork");
-    if(q->type & DISORDER_PLAYER_PREFORK)
-      play_cleanup(q->pl, q->data);    /* else would leak */
-    if(lfd != -1)
-      xclose(lfd);
-    return START_SOFTFAIL;
+}
+
+/** @brief Child-process half of start() */
+static int start_child(struct queue_entry *q, 
+                       const struct pbgc_params *params,
+                       void attribute((unused)) *bgdata) {
+  int n;
+
+  /* Wait for a device to clear.  This ugliness is now deprecated and will
+   * eventually be removed. */
+  if(params->waitdevice) {
+    ao_initialize();
+    if(*params->waitdevice) {
+      n = ao_driver_id(params->waitdevice);
+      if(n == -1)
+        fatal(0, "invalid libao driver: %s", params->waitdevice);
+    } else
+      n = ao_default_driver_id();
+    /* Make up a format. */
+    ao_sample_format format;
+    memset(&format, 0, sizeof format);
+    format.bits = 8;
+    format.rate = 44100;
+    format.channels = 1;
+    format.byte_format = AO_FMT_NATIVE;
+    int retries = 20;
+    struct timespec ts;
+    ts.tv_sec = 0;
+    ts.tv_nsec = 100000000;             /* 0.1s */
+    ao_device *device;
+    while((device = ao_open_live(n, &format, 0)) == 0 && retries-- > 0)
+      nanosleep(&ts, 0);
+    if(device)
+      ao_close(device);
   }
-  store_player_pid(q->id, pid);
-  q->prepared = 1;
-  if(lfd != -1)
-    xclose(lfd);
-  setpgid(pid, pid);
-  ev_child(ev, pid, 0, player_finished, q);
-  D(("player subprocess ID %lu", (unsigned long)pid));
-  return START_OK;
+  /* Play the track */
+  play_track(q->pl,
+             params->argv, params->argc,
+             params->rawpath,
+             q->track);
+  return 0;
 }
 
+/** @brief Prepare a track for later play
+ * @return @ref START_OK, @ref START_HARDFAIL or @ref START_SOFTFAIL
+ *
+ * Only applies to raw-format (i.e. speaker-using) players; everything else
+ * gets @c START_OK.
+ */
 int prepare(ev_source *ev,
            struct queue_entry *q) {
-  int n;
+  const struct stringlist *player;
 
+  /* If there's a decoder (or player!) going we do nothing */
+  if(q->pid >= 0)
+    return START_OK;
+  /* If the track is already prepared, do nothing */
+  if(q->prepared)
+    return START_OK;
   /* Find the player plugin */
-  if(find_player_pid(q->id) > 0) return 0; /* Already going. */
-  if((n = find_player(q)) < 0) return -1; /* No player */
-  q->pl = open_plugin(config->player.s[n].s[1], 0); /* No player */
+  if(!(player = find_player(q)) < 0) 
+    return START_HARDFAIL;              /* No player */
+  q->pl = open_plugin(player->s[1], 0);
   q->type = play_get_type(q->pl);
   if((q->type & DISORDER_PLAYER_TYPEMASK) != DISORDER_PLAYER_RAW)
-    return 0;                          /* Not a raw player */
-  return start(ev, q, 1/*prepare_only*/); /* Prepare it */
+    return START_OK;                    /* Not a raw player */
+  const int rc = play_background(ev, player, q, prepare_child, NULL);
+  if(rc == START_OK) {
+    ev_child(ev, q->pid, 0, player_finished, q);
+    q->prepared = 1;
+  }
+  return rc;
 }
 
+/** @brief Child-process half of prepare() */
+static int prepare_child(struct queue_entry *q, 
+                         const struct pbgc_params *params,
+                         void attribute((unused)) *bgdata) {
+  /* np will be the pipe to disorder-normalize */
+  int np[2];
+  if(socketpair(PF_UNIX, SOCK_STREAM, 0, np) < 0)
+    fatal(errno, "error calling socketpair");
+  /* Beware of the Leopard!  On OS X 10.5.x, the order of the shutdown
+   * calls here DOES MATTER.  If you do the SHUT_WR first then the SHUT_RD
+   * fails with "Socket is not connected".  I think this is a bug but
+   * provided implementors either don't care about the order or all agree
+   * about the order, choosing the reliable order is an adequate
+   * workaround.  */
+  xshutdown(np[1], SHUT_RD);   /* decoder writes to np[1] */
+  xshutdown(np[0], SHUT_WR);   /* normalize reads from np[0] */
+  blocking(np[0]);
+  blocking(np[1]);
+  /* Start disorder-normalize.  We double-fork so that nothing has to wait
+   * for disorder-normalize. */
+  pid_t npid;
+  if(!(npid = xfork())) {
+    /* Grandchild of disorderd */
+    if(!xfork()) {
+      /* Great-grandchild of disorderd */
+      /* Connect to the speaker process */
+      struct sockaddr_un addr;
+      memset(&addr, 0, sizeof addr);
+      addr.sun_family = AF_UNIX;
+      snprintf(addr.sun_path, sizeof addr.sun_path,
+               "%s/speaker/socket", config->home);
+      int sfd = xsocket(PF_UNIX, SOCK_STREAM, 0);
+      if(connect(sfd, (const struct sockaddr *)&addr, sizeof addr) < 0)
+        fatal(errno, "connecting to %s", addr.sun_path);
+      /* Send the ID, with a NATIVE-ENDIAN 32 bit length */
+      uint32_t l = strlen(q->id);
+      if(write(sfd, &l, sizeof l) < 0
+         || write(sfd, q->id, l) < 0)
+        fatal(errno, "writing to %s", addr.sun_path);
+      /* Await the ack */
+      if (read(sfd, &l, 1) < 0) 
+        fatal(errno, "reading ack from %s", addr.sun_path);
+      /* Plumbing */
+      xdup2(np[0], 0);
+      xdup2(sfd, 1);
+      xclose(np[0]);
+      xclose(np[1]);
+      xclose(sfd);
+      /* TODO stderr shouldn't be redirected for disorder-normalize
+       * (but it should be for play_track() */
+      execlp("disorder-normalize", "disorder-normalize",
+             log_default == &log_syslog ? "--syslog" : "--no-syslog",
+             "--config", configfile,
+             (char *)0);
+      fatal(errno, "executing disorder-normalize");
+      /* End of the great-grandchild of disorderd */
+    }
+    /* Back in the grandchild of disorderd */
+    _exit(0);
+    /* End of the grandchild of disorderd */
+  }
+  /* Back in the child of disorderd */
+  /* Wait for the grandchild of disordered to finish */
+  int n;
+  while(waitpid(npid, &n, 0) < 0 && errno == EINTR)
+    ;
+  /* Pass the file descriptor to the driver in an environment
+   * variable. */
+  char buffer[64];
+  snprintf(buffer, sizeof buffer, "DISORDER_RAW_FD=%d", np[1]);
+  if(putenv(buffer) < 0)
+    fatal(errno, "error calling putenv");
+  /* Close all the FDs we don't need */
+  xclose(np[0]);
+  /* Start the decoder itself */
+  play_track(q->pl,
+             params->argv, params->argc,
+             params->rawpath,
+             q->track);
+  return 0;
+}
+
+/** @brief Abandon a queue entry
+ *
+ * Called from c_remove() (but NOT when scratching a track).  Only does
+ * anything to raw-format tracks.  Terminates the background decoder and tells
+ * the speaker process to cancel the track.
+ */
 void abandon(ev_source attribute((unused)) *ev,
             struct queue_entry *q) {
   struct speaker_message sm;
-  pid_t pid = find_player_pid(q->id);
 
-  if(pid < 0) return;                  /* Not prepared. */
+  if(q->pid < 0)
+    return;                             /* Not prepared. */
   if((q->type & DISORDER_PLAYER_TYPEMASK) != DISORDER_PLAYER_RAW)
     return;                            /* Not a raw player. */
   /* Terminate the player. */
-  kill(-pid, config->signal);
-  forget_player_pid(q->id);
+  kill(-q->pid, config->signal);
   /* Cancel the track. */
   memset(&sm, 0, sizeof sm);
   sm.type = SM_CANCEL;
@@ -482,6 +487,8 @@ void abandon(ev_source attribute((unused)) *ev,
   speaker_send(speaker_fd, &sm);
 }
 
+/* Random tracks ------------------------------------------------------------ */
+
 /** @brief Called with a new random track
  * @param ev Event loop
  * @param track Track name
@@ -502,6 +509,9 @@ static void chosen_random_track(ev_source *ev,
 
 /** @brief Maybe add a randomly chosen track
  * @param ev Event loop
+ *
+ * Picking can take some time so the track will only be added after this
+ * function has returned.
  */
 void add_random_track(ev_source *ev) {
   struct queue_entry *q;
@@ -518,12 +528,20 @@ void add_random_track(ev_source *ev) {
     trackdb_request_random(ev, chosen_random_track);
 }
 
-/* try to play a track */
+/* Track initiation (part 2) ------------------------------------------------ */
+
+/** @brief Attempt to play something
+ *
+ * This is called from numerous locations - whenever it might conceivably have
+ * become possible to play something.
+ */
 void play(ev_source *ev) {
   struct queue_entry *q;
   int random_enabled = random_is_enabled();
 
   D(("play playing=%p", (void *)playing));
+  /* If we're shutting down, or there's something playing, or playing is not
+   * enabled, give up now */
   if(shutting_down || playing || !playing_is_enabled()) return;
   /* See if there's anything to play */
   if(qhead.next == &qhead) {
@@ -531,6 +549,8 @@ void play(ev_source *ev) {
      * attempts to add a random track anyway.  However they are rarer than
      * attempts to force a track so we initiate one now. */
     add_random_track(ev);
+    /* chosen_random_track() will call play() when a new random track has been
+     * added to the queue. */
     return;
   }
   /* There must be at least one track in the queue. */
@@ -542,7 +562,7 @@ void play(ev_source *ev) {
     return;
   D(("taken %p (%s) from queue", (void *)q, q->track));
   /* Try to start playing. */
-  switch(start(ev, q, 0/*!prepare_only*/)) {
+  switch(start(ev, q)) {
   case START_HARDFAIL:
     if(q == qhead.next) {
       queue_remove(q, 0);              /* Abandon this track. */
@@ -556,10 +576,12 @@ void play(ev_source *ev) {
     /* We'll try the same track again shortly. */
     break;
   case START_OK:
+    /* Remove from the queue */
     if(q == qhead.next) {
       queue_remove(q, 0);
       queue_write();
     }
+    /* It's become the playing track */
     playing = q;
     time(&playing->played);
     playing->state = playing_started;
@@ -577,12 +599,16 @@ void play(ev_source *ev) {
   }
 }
 
+/* Miscelleneous ------------------------------------------------------------ */
+
+/** @brief Return true if play is enabled */
 int playing_is_enabled(void) {
   const char *s = trackdb_get_global("playing");
 
   return !s || !strcmp(s, "yes");
 }
 
+/** @brief Enable play */
 void enable_playing(const char *who, ev_source *ev) {
   trackdb_set_global("playing", "yes", who);
   /* Add a random track if necessary. */
@@ -590,49 +616,61 @@ void enable_playing(const char *who, ev_source *ev) {
   play(ev);
 }
 
+/** @brief Disable play */
 void disable_playing(const char *who) {
   trackdb_set_global("playing", "no", who);
 }
 
+/** @brief Return true if random play is enabled */
 int random_is_enabled(void) {
   const char *s = trackdb_get_global("random-play");
 
   return !s || !strcmp(s, "yes");
 }
 
+/** @brief Enable random play */
 void enable_random(const char *who, ev_source *ev) {
   trackdb_set_global("random-play", "yes", who);
   add_random_track(ev);
   play(ev);
 }
 
+/** @brief Disable random play */
 void disable_random(const char *who) {
   trackdb_set_global("random-play", "no", who);
 }
 
+/* Scratching --------------------------------------------------------------- */
+
+/** @brief Scratch a track
+ * @param User responsible (or NULL)
+ * @param Track ID (or NULL for current)
+ */
 void scratch(const char *who, const char *id) {
   struct queue_entry *q;
   struct speaker_message sm;
-  pid_t pid;
 
   D(("scratch playing=%p state=%d id=%s playing->id=%s",
      (void *)playing,
      playing ? playing->state : 0,
      id ? id : "(none)",
      playing ? playing->id : "(none)"));
+  /* There must be a playing track; it must be in a scratchable state; if a
+   * specific ID was mentioned it must be that track. */
   if(playing
      && (playing->state == playing_started
         || playing->state == playing_paused)
      && (!id
         || !strcmp(id, playing->id))) {
+    /* Update state (for the benefit of the 'recent' list) */
     playing->state = playing_scratched;
     playing->scratched = who ? xstrdup(who) : 0;
-    if((pid = find_player_pid(playing->id)) > 0) {
-      D(("kill -%d %lu", config->signal, (unsigned long)pid));
-      kill(-pid, config->signal);
-      forget_player_pid(playing->id);
-    } else
-      error(0, "could not find PID for %s", playing->id);
+    /* Find the player and kill the whole process group */
+    if(playing->pid >= 0) {
+      D(("kill -%d -%lu", config->signal, (unsigned long)playing->pid));
+      kill(-playing->pid, config->signal);
+    }
+    /* Tell the speaker, if we think it'll care */
     if((playing->type & DISORDER_PLAYER_TYPEMASK) == DISORDER_PLAYER_RAW) {
       memset(&sm, 0, sizeof sm);
       sm.type = SM_CANCEL;
@@ -651,35 +689,35 @@ void scratch(const char *who, const char *id) {
   }
 }
 
+/* Server termination ------------------------------------------------------- */
+
+/** @brief Called from quit() to tear down everything belonging to this file */
 void quitting(ev_source *ev) {
   struct queue_entry *q;
-  pid_t pid;
 
   /* Don't start anything new */
   shutting_down = 1;
   /* Shut down the current player */
   if(playing) {
-    if((pid = find_player_pid(playing->id)) > 0) {
-      kill(-pid, config->signal);
-      forget_player_pid(playing->id);
-    } else
-      error(0, "could not find PID for %s", playing->id);
+    if(playing->pid >= 0)
+      kill(-playing->pid, config->signal);
     playing->state = playing_quitting;
     finished(0);
   }
-  /* Zap any other players */
+  /* Zap any background decoders that are going */
   for(q = qhead.next; q != &qhead; q = q->next)
-    if((pid = find_player_pid(q->id)) > 0) {
-      D(("kill -%d %lu", config->signal, (unsigned long)pid));
-      kill(-pid, config->signal);
-      forget_player_pid(q->id);
-    } else
-      error(0, "could not find PID for %s", q->id);
+    if(q->pid >= 0) {
+      D(("kill -%d %lu", config->signal, (unsigned long)q->pid));
+      kill(-q->pid, config->signal);
+    }
   /* Don't need the speaker any more */
   ev_fd_cancel(ev, ev_read, speaker_fd);
   xclose(speaker_fd);
 }
 
+/* Pause and resume --------------------------------------------------------- */
+
+/** @brief Pause the playing track */
 int pause_playing(const char *who) {
   struct speaker_message sm;
   long played;
@@ -716,6 +754,7 @@ int pause_playing(const char *who) {
   return 0;
 }
 
+/** @brief Resume playing after a pause */
 void resume_playing(const char *who) {
   struct speaker_message sm;
 
@@ -724,7 +763,7 @@ void resume_playing(const char *who) {
   if(!playing) return;
   switch(playing->type & DISORDER_PLAYER_TYPEMASK) {
   case DISORDER_PLAYER_STANDALONE:
-    if(!playing->type & DISORDER_PLAYER_PAUSES) {
+    if(!(playing->type & DISORDER_PLAYER_PAUSES)) {
     default:
       /* Shouldn't happen */
       return;
@@ -750,5 +789,6 @@ Local Variables:
 c-basic-offset:2
 comment-column:40
 fill-column:79
+indent-tabs-mode:nil
 End:
 */
index 7dfcdb1..d5b5bf3 100644 (file)
@@ -57,6 +57,7 @@ struct queue_entry *queue_add(const char *track, const char *submitter,
   q->submitter = submitter ? xstrdup(submitter) : 0;
   q->state = playing_unplayed;
   q->origin = origin;
+  q->pid = -1;
   queue_id(q);
   time(&q->when);
   switch(where) {
index 1380e24..ebff098 100644 (file)
@@ -380,7 +380,7 @@ int main(int argc, char **argv) {
     openlog(progname, LOG_PID, LOG_DAEMON);
     log_default = &log_syslog;
   }
-  if(config_read(0)) fatal(0, "cannot read configuration");
+  if(config_read(0, NULL)) fatal(0, "cannot read configuration");
   xnice(config->nice_rescan);
   sa.sa_handler = signal_handler;
   sa.sa_flags = SA_RESTART;
index 88e7723..2efd94a 100644 (file)
@@ -15,6 +15,9 @@
  * You should have received a copy of the GNU General Public License
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
+/** @file server/server-queue.c
+ * @brief Server-specific track queue support
+ */
 #include "disorder-server.h"
 
 /* the head of the queue is played next, so normally we add to the tail */
index 320cbb1..ce45a1d 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * This file is part of DisOrder.
- * Copyright (C) 2004-2008 Richard Kettlewell
+ * Copyright (C) 2004-2009 Richard Kettlewell
  *
  * 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
  */
 
 #include "disorder-server.h"
+#include "basen.h"
 
 #ifndef NONCE_SIZE
 # define NONCE_SIZE 16
 #endif
 
 #ifndef CONFIRM_SIZE
-# define CONFIRM_SIZE 10
+/** @brief Size of nonce in confirmation string in 32-bit words
+ *
+ * 64 bits gives 11 digits (in base 62).
+ */
+# define CONFIRM_SIZE 2
 #endif
 
 int volume_left, volume_right;         /* last known volume */
@@ -874,17 +879,18 @@ static int c_volume(struct conn *c,
     sink_writes(ev_writer_sink(c->w), "510 Prohibited\n");
     return 1;
   }
-  if(mixer_control(-1/*as configured*/, &l, &r, set))
+  if(!api || !api->set_volume) {
     sink_writes(ev_writer_sink(c->w), "550 error accessing mixer\n");
-  else {
-    sink_printf(ev_writer_sink(c->w), "252 %d %d\n", l, r);
-    if(l != volume_left || r != volume_right) {
-      volume_left = l;
-      volume_right = r;
-      snprintf(lb, sizeof lb, "%d", l);
-      snprintf(rb, sizeof rb, "%d", r);
-      eventlog("volume", lb, rb, (char *)0);
-    }
+    return 1;
+  }
+  (set ? api->set_volume : api->get_volume)(&l, &r);
+  sink_printf(ev_writer_sink(c->w), "252 %d %d\n", l, r);
+  if(l != volume_left || r != volume_right) {
+    volume_left = l;
+    volume_right = r;
+    snprintf(lb, sizeof lb, "%d", l);
+    snprintf(rb, sizeof rb, "%d", r);
+    eventlog("volume", lb, rb, (char *)0);
   }
   return 1;
 }
@@ -1151,10 +1157,13 @@ static int c_new(struct conn *c,
 static int c_rtp_address(struct conn *c,
                         char attribute((unused)) **vec,
                         int attribute((unused)) nvec) {
-  if(config->api == BACKEND_NETWORK) {
+  if(api == &uaudio_rtp) {
+    char **addr;
+
+    netaddress_format(&config->broadcast, NULL, &addr);
     sink_printf(ev_writer_sink(c->w), "252 %s %s\n",
-               quoteutf8(config->broadcast.s[0]),
-               quoteutf8(config->broadcast.s[1]));
+               quoteutf8(addr[1]),
+               quoteutf8(addr[2]));
   } else
     sink_writes(ev_writer_sink(c->w), "550 No RTP\n");
   return 1;
@@ -1361,30 +1370,23 @@ static int c_users(struct conn *c,
   return list_response(c, "User list follows", trackdb_listusers());
 }
 
-/** @brief Base64 mapping table for confirmation strings
- *
- * This is used with generic_to_base64() and generic_base64().  We cannot use
- * the MIME table as that contains '+' and '=' which get quoted when
- * URL-encoding.  (The CGI still does the URL encoding but it is desirable to
- * avoid it being necessary.)
- */
-static const char confirm_base64_table[] =
-  "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789/.*";
-
 static int c_register(struct conn *c,
                      char **vec,
                      int attribute((unused)) nvec) {
-  char *buf, *cs;
-  size_t bufsize;
-  int offset;
-
-  /* The confirmation string is base64(username;nonce) */
-  bufsize = strlen(vec[0]) + CONFIRM_SIZE + 2;
-  buf = xmalloc_noptr(bufsize);
-  offset = byte_snprintf(buf, bufsize, "%s;", vec[0]);
-  gcry_randomize(buf + offset, CONFIRM_SIZE, GCRY_STRONG_RANDOM);
-  cs = generic_to_base64((uint8_t *)buf, offset + CONFIRM_SIZE,
-                        confirm_base64_table);
+  char *cs;
+  uint32_t nonce[CONFIRM_SIZE];
+  char nonce_str[(32 * CONFIRM_SIZE) / 5 + 1];
+
+  /* The confirmation string is username/base62(nonce).  The confirmation
+   * process will pick the username back out to identify them but the _whole_
+   * string is used as the confirmation string.  Base 62 means we used only
+   * letters and digits, minimizing the chance of the URL being mispasted. */
+  gcry_randomize(nonce, sizeof nonce, GCRY_STRONG_RANDOM);
+  if(basen(nonce, CONFIRM_SIZE, nonce_str, sizeof nonce_str, 62)) {
+    error(0, "buffer too small encoding confirmation string");
+    sink_writes(ev_writer_sink(c->w), "550 Cannot create user\n");
+  }
+  byte_xasprintf(&cs, "%s/%s", vec[0], nonce_str);
   if(trackdb_adduser(vec[0], vec[1], config->default_rights, vec[2], cs))
     sink_writes(ev_writer_sink(c->w), "550 Cannot create user\n");
   else
@@ -1395,7 +1397,6 @@ static int c_register(struct conn *c,
 static int c_confirm(struct conn *c,
                     char **vec,
                     int attribute((unused)) nvec) {
-  size_t nuser;
   char *user, *sep;
   rights_type rights;
   const char *host;
@@ -1405,12 +1406,12 @@ static int c_confirm(struct conn *c,
     sink_writes(ev_writer_sink(c->w), "530 Authentication failure\n");
     return 1;
   }
-  if(!(user = generic_base64(vec[0], &nuser, confirm_base64_table))
-     || !(sep = memchr(user, ';', nuser))) {
+  /* Picking the LAST / means we don't (here) rule out slashes in usernames. */
+  if(!(sep = strrchr(vec[0], '/'))) {
     sink_writes(ev_writer_sink(c->w), "550 Malformed confirmation string\n");
     return 1;
   }
-  *sep = 0;
+  user = xstrndup(vec[0], sep - vec[0]);
   if(trackdb_confirm(user, vec[0], &rights))
     sink_writes(ev_writer_sink(c->w), "550 Incorrect confirmation string\n");
   else {
@@ -2092,6 +2093,7 @@ int server_start(ev_source *ev, int pf,
   l->pf = pf;
   if(ev_listen(ev, fd, listen_callback, l, "server listener"))
     exit(EXIT_FAILURE);
+  info("listening on %s", name);
   return fd;
 }
 
diff --git a/server/speaker-alsa.c b/server/speaker-alsa.c
deleted file mode 100644 (file)
index d10ec19..0000000
+++ /dev/null
@@ -1,285 +0,0 @@
-/*
- * This file is part of DisOrder
- * Copyright (C) 2005, 2006, 2007 Richard Kettlewell
- *
- * 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 3 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, see <http://www.gnu.org/licenses/>.
- */
-/** @file server/speaker-alsa.c
- * @brief Support for @ref BACKEND_ALSA */
-
-#include "common.h"
-
-#if HAVE_ALSA_ASOUNDLIB_H
-
-#include <unistd.h>
-#include <poll.h>
-#include <alsa/asoundlib.h>
-
-#include "configuration.h"
-#include "syscalls.h"
-#include "log.h"
-#include "speaker-protocol.h"
-#include "speaker.h"
-
-/** @brief The current PCM handle */
-static snd_pcm_t *pcm;
-
-/** @brief Last seen buffer size */
-static snd_pcm_uframes_t last_pcm_bufsize;
-
-/** @brief ALSA backend initialization */
-static void alsa_init(void) {
-  info("selected ALSA backend");
-}
-
-/** @brief Log ALSA parameters */
-static void log_params(snd_pcm_hw_params_t *hwparams,
-                       snd_pcm_sw_params_t *swparams) {
-  snd_pcm_uframes_t f;
-
-  return;                               /* too verbose */
-  if(hwparams) {
-    /* TODO */
-  }
-  if(swparams) {
-    snd_pcm_sw_params_get_silence_size(swparams, &f);
-    info("sw silence_size=%lu", (unsigned long)f);
-    snd_pcm_sw_params_get_silence_threshold(swparams, &f);
-    info("sw silence_threshold=%lu", (unsigned long)f);
-#if HAVE_SND_PCM_SW_PARAMS_GET_SLEEP_MIN
-    {
-      unsigned u;
-
-      snd_pcm_sw_params_get_sleep_min(swparams, &u);
-      info("sw sleep_min=%lu", (unsigned long)u);
-    }
-#endif
-    snd_pcm_sw_params_get_start_threshold(swparams, &f);
-    info("sw start_threshold=%lu", (unsigned long)f);
-    snd_pcm_sw_params_get_stop_threshold(swparams, &f);
-    info("sw stop_threshold=%lu", (unsigned long)f);
-#if HAVE_SND_PCM_SW_PARAMS_GET_XFER_ALIGN
-    snd_pcm_sw_params_get_xfer_align(swparams, &f);
-    info("sw xfer_align=%lu", (unsigned long)f);
-#endif
-  }
-}
-
-/** @brief ALSA deactivation */
-static void alsa_deactivate(void) {
-  if(pcm) {
-    int err;
-    
-    if((err = snd_pcm_nonblock(pcm, 0)) < 0)
-      fatal(0, "error calling snd_pcm_nonblock: %d", err);
-    D(("draining pcm"));
-    snd_pcm_drain(pcm);
-    D(("closing pcm"));
-    snd_pcm_close(pcm);
-    pcm = 0;
-    device_state = device_closed;
-    D(("released audio device"));
-  }
-}
-
-/** @brief ALSA backend activation */
-static void alsa_activate(void) {
-  if(!pcm) {
-    snd_pcm_hw_params_t *hwparams;
-    snd_pcm_sw_params_t *swparams;
-    snd_pcm_uframes_t pcm_bufsize;
-    int err;
-    int sample_format = 0;
-    unsigned rate;
-
-    D(("snd_pcm_open"));
-    if((err = snd_pcm_open(&pcm,
-                           config->device,
-                           SND_PCM_STREAM_PLAYBACK,
-                           SND_PCM_NONBLOCK))) {
-      error(0, "error from snd_pcm_open: %d", err);
-      goto error;
-    }
-    snd_pcm_hw_params_alloca(&hwparams);
-    D(("set up hw params"));
-    if((err = snd_pcm_hw_params_any(pcm, hwparams)) < 0)
-      fatal(0, "error from snd_pcm_hw_params_any: %d", err);
-    if((err = snd_pcm_hw_params_set_access(pcm, hwparams,
-                                           SND_PCM_ACCESS_RW_INTERLEAVED)) < 0)
-      fatal(0, "error from snd_pcm_hw_params_set_access: %d", err);
-    switch(config->sample_format.bits) {
-    case 8:
-      sample_format = SND_PCM_FORMAT_S8;
-      break;
-    case 16:
-      switch(config->sample_format.endian) {
-      case ENDIAN_LITTLE: sample_format = SND_PCM_FORMAT_S16_LE; break;
-      case ENDIAN_BIG: sample_format = SND_PCM_FORMAT_S16_BE; break;
-      default:
-        error(0, "unrecognized byte format %d", config->sample_format.endian);
-        goto fatal;
-      }
-      break;
-    default:
-      error(0, "unsupported sample size %d", config->sample_format.bits);
-      goto fatal;
-    }
-    if((err = snd_pcm_hw_params_set_format(pcm, hwparams,
-                                           sample_format)) < 0) {
-      error(0, "error from snd_pcm_hw_params_set_format (%d): %d",
-            sample_format, err);
-      goto fatal;
-    }
-    rate = config->sample_format.rate;
-    if((err = snd_pcm_hw_params_set_rate_near(pcm, hwparams, &rate, 0)) < 0) {
-      error(0, "error from snd_pcm_hw_params_set_rate (%d): %d",
-            config->sample_format.rate, err);
-      goto fatal;
-    }
-    if(rate != (unsigned)config->sample_format.rate)
-      info("want rate %d, got %u", config->sample_format.rate, rate);
-    if((err = snd_pcm_hw_params_set_channels
-        (pcm, hwparams, config->sample_format.channels)) < 0) {
-      error(0, "error from snd_pcm_hw_params_set_channels (%d): %d",
-            config->sample_format.channels, err);
-      goto fatal;
-    }
-    pcm_bufsize = 3 * FRAMES;
-    if((err = snd_pcm_hw_params_set_buffer_size_near(pcm, hwparams,
-                                                     &pcm_bufsize)) < 0)
-      fatal(0, "error from snd_pcm_hw_params_set_buffer_size (%d): %d",
-            3 * FRAMES, err);
-    if(pcm_bufsize != 3 * FRAMES && pcm_bufsize != last_pcm_bufsize)
-      info("asked for PCM buffer of %d frames, got %d",
-           3 * FRAMES, (int)pcm_bufsize);
-    last_pcm_bufsize = pcm_bufsize;
-    if((err = snd_pcm_hw_params(pcm, hwparams)) < 0)
-      fatal(0, "error calling snd_pcm_hw_params: %d", err);
-    D(("set up sw params"));
-    snd_pcm_sw_params_alloca(&swparams);
-    if((err = snd_pcm_sw_params_current(pcm, swparams)) < 0)
-      fatal(0, "error calling snd_pcm_sw_params_current: %d", err);
-    if((err = snd_pcm_sw_params_set_avail_min(pcm, swparams, FRAMES)) < 0)
-      fatal(0, "error calling snd_pcm_sw_params_set_avail_min %d: %d",
-            FRAMES, err);
-    if((err = snd_pcm_sw_params(pcm, swparams)) < 0)
-      fatal(0, "error calling snd_pcm_sw_params: %d", err);
-    D(("acquired audio device"));
-    log_params(hwparams, swparams);
-    device_state = device_open;
-  }
-  return;
-fatal:
-  abandon();
-error:
-  /* We assume the error is temporary and that we'll retry in a bit. */
-  if(pcm) {
-    snd_pcm_close(pcm);
-    pcm = 0;
-    device_state = device_error;
-  }
-  return;
-}
-
-/** @brief Play via ALSA */
-static size_t alsa_play(size_t frames) {
-  snd_pcm_sframes_t pcm_written_frames;
-  int err;
-  
-  pcm_written_frames = snd_pcm_writei(pcm,
-                                      playing->buffer + playing->start,
-                                      frames);
-  D(("actually play %zu frames, wrote %d",
-     frames, (int)pcm_written_frames));
-  if(pcm_written_frames < 0) {
-    switch(pcm_written_frames) {
-    case -EPIPE:                        /* underrun */
-      error(0, "snd_pcm_writei reports underrun");
-      if((err = snd_pcm_prepare(pcm)) < 0)
-        fatal(0, "error calling snd_pcm_prepare: %d", err);
-      return 0;
-    case -EAGAIN:
-      return 0;
-    default:
-      fatal(0, "error calling snd_pcm_writei: %d",
-            (int)pcm_written_frames);
-    }
-  } else
-    return pcm_written_frames;
-}
-
-static int alsa_slots, alsa_nslots = -1;
-
-/** @brief Fill in poll fd array for ALSA */
-static void alsa_beforepoll(int attribute((unused)) *timeoutp) {
-  /* We send sample data to ALSA as fast as it can accept it, relying on
-   * the fact that it has a relatively small buffer to minimize pause
-   * latency. */
-  int retry = 3, err;
-  
-  alsa_slots = fdno;
-  do {
-    retry = 0;
-    alsa_nslots = snd_pcm_poll_descriptors(pcm, &fds[fdno], NFDS - fdno);
-    if((alsa_nslots <= 0
-        || !(fds[alsa_slots].events & POLLOUT))
-       && snd_pcm_state(pcm) == SND_PCM_STATE_XRUN) {
-      error(0, "underrun detected after call to snd_pcm_poll_descriptors()");
-      if((err = snd_pcm_prepare(pcm)))
-        fatal(0, "error calling snd_pcm_prepare: %d", err);
-    } else
-      break;
-  } while(retry-- > 0);
-  if(alsa_nslots >= 0)
-    fdno += alsa_nslots;
-}
-
-/** @brief Process poll() results for ALSA */
-static int alsa_ready(void) {
-  int err;
-
-  unsigned short alsa_revents;
-  
-  if((err = snd_pcm_poll_descriptors_revents(pcm,
-                                             &fds[alsa_slots],
-                                             alsa_nslots,
-                                             &alsa_revents)) < 0)
-    fatal(0, "error calling snd_pcm_poll_descriptors_revents: %d", err);
-  if(alsa_revents & (POLLOUT | POLLERR))
-    return 1;
-  else
-    return 0;
-}
-
-const struct speaker_backend alsa_backend = {
-  BACKEND_ALSA,
-  0,
-  alsa_init,
-  alsa_activate,
-  alsa_play,
-  alsa_deactivate,
-  alsa_beforepoll,
-  alsa_ready
-};
-
-#endif
-
-/*
-Local Variables:
-c-basic-offset:2
-comment-column:40
-fill-column:79
-indent-tabs-mode:nil
-End:
-*/
diff --git a/server/speaker-command.c b/server/speaker-command.c
deleted file mode 100644 (file)
index e85d198..0000000
+++ /dev/null
@@ -1,130 +0,0 @@
-/*
- * This file is part of DisOrder
- * Copyright (C) 2005, 2006, 2007 Richard Kettlewell
- * Portions (C) 2007 Mark Wooding
- *
- * 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 3 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, see <http://www.gnu.org/licenses/>.
- */
-/** @file server/speaker-command.c
- * @brief Support for @ref BACKEND_COMMAND */
-
-#include "common.h"
-
-#include <unistd.h>
-#include <poll.h>
-#include <errno.h>
-
-#include "configuration.h"
-#include "syscalls.h"
-#include "log.h"
-#include "speaker-protocol.h"
-#include "speaker.h"
-
-/** @brief Pipe to subprocess
- *
- * This is the file descriptor to write to for @ref BACKEND_COMMAND.
- */
-static int cmdfd = -1;
-
-/** @brief poll array slot for @ref cmdfd
- *
- * Set by command_beforepoll().
- */
-static int cmdfd_slot;
-
-/** @brief Start the subprocess for @ref BACKEND_COMMAND */
-static void fork_cmd(void) {
-  pid_t cmdpid;
-  int pfd[2];
-  if(cmdfd != -1) close(cmdfd);
-  xpipe(pfd);
-  cmdpid = xfork();
-  if(!cmdpid) {
-    exitfn = _exit;
-    signal(SIGPIPE, SIG_DFL);
-    xdup2(pfd[0], 0);
-    close(pfd[0]);
-    close(pfd[1]);
-    execl("/bin/sh", "sh", "-c", config->speaker_command, (char *)0);
-    fatal(errno, "error execing /bin/sh");
-  }
-  close(pfd[0]);
-  cmdfd = pfd[1];
-  D(("forked cmd %d, fd = %d", cmdpid, cmdfd));
-}
-
-/** @brief Command backend initialization */
-static void command_init(void) {
-  info("selected command backend");
-  fork_cmd();
-}
-
-/** @brief Play to a subprocess */
-static size_t command_play(size_t frames) {
-  size_t bytes = frames * bpf;
-  int written_bytes;
-
-  written_bytes = write(cmdfd, playing->buffer + playing->start, bytes);
-  D(("actually play %zu bytes, wrote %d",
-     bytes, written_bytes));
-  if(written_bytes < 0) {
-    switch(errno) {
-    case EPIPE:
-      error(0, "hmm, command died; trying another");
-      fork_cmd();
-      return 0;
-    case EAGAIN:
-      return 0;
-    default:
-      fatal(errno, "error writing to subprocess");
-    }
-  } else
-    return written_bytes / bpf;
-}
-
-/** @brief Update poll array for writing to subprocess */
-static void command_beforepoll(int attribute((unused)) *timeoutp) {
-  /* We send sample data to the subprocess as fast as it can accept it.
-   * This isn't ideal as pause latency can be very high as a result. */
-  if(cmdfd >= 0)
-    cmdfd_slot = addfd(cmdfd, POLLOUT);
-}
-
-/** @brief Process poll() results for subprocess play */
-static int command_ready(void) {
-  if(fds[cmdfd_slot].revents & (POLLOUT | POLLERR))
-    return 1;
-  else
-    return 0;
-}
-
-const struct speaker_backend command_backend = {
-  BACKEND_COMMAND,
-  0,
-  command_init,
-  0,                                    /* activate */
-  command_play,
-  0,                                    /* deactivate */
-  command_beforepoll,
-  command_ready
-};
-
-/*
-Local Variables:
-c-basic-offset:2
-comment-column:40
-fill-column:79
-indent-tabs-mode:nil
-End:
-*/
diff --git a/server/speaker-coreaudio.c b/server/speaker-coreaudio.c
deleted file mode 100644 (file)
index 42c3a36..0000000
+++ /dev/null
@@ -1,231 +0,0 @@
-/*
- * This file is part of DisOrder
- * Copyright (C) 2007 Richard Kettlewell
- *
- * 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 3 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, see <http://www.gnu.org/licenses/>.
- */
-/** @file server/speaker-coreaudio.c
- * @brief Support for @ref BACKEND_COREAUDIO
- *
- * Core Audio likes to make callbacks from a separate player thread
- * which then fill in the required number of bytes of audio.  We fit
- * this into the existing architecture by means of a pipe between the
- * threads.
- *
- * We currently only support 16-bit 44100Hz stereo (and enforce this
- * in @ref lib/configuration.c.)  There are some nasty bodges in this
- * code which depend on this and on further assumptions still...
- *
- * @todo support @ref config::device
- */
-
-#include "common.h"
-
-#if HAVE_COREAUDIO_AUDIOHARDWARE_H
-
-#include <poll.h>
-#include <sys/socket.h>
-#include <unistd.h>
-#include <CoreAudio/AudioHardware.h>
-
-#include "configuration.h"
-#include "syscalls.h"
-#include "log.h"
-#include "speaker-protocol.h"
-#include "speaker.h"
-
-/** @brief Core Audio Device ID */
-static AudioDeviceID adid;
-
-/** @brief Pipe between main and player threads
- *
- * We'll write samples to pfd[1] and read them from pfd[0].
- */
-static int pfd[2];
-
-/** @brief Slot number in poll array */
-static int pfd_slot;
-
-/** @brief Callback from Core Audio */
-static OSStatus adioproc
-    (AudioDeviceID attribute((unused)) inDevice,
-     const AudioTimeStamp attribute((unused)) *inNow,
-     const AudioBufferList attribute((unused)) *inInputData,
-     const AudioTimeStamp attribute((unused)) *inInputTime,
-     AudioBufferList *outOutputData,
-     const AudioTimeStamp attribute((unused)) *inOutputTime,
-     void attribute((unused)) *inClientData) {
-  UInt32 nbuffers = outOutputData->mNumberBuffers;
-  AudioBuffer *ab = outOutputData->mBuffers;
-
-  while(nbuffers > 0) {
-    float *samplesOut = ab->mData;
-    size_t samplesOutLeft = ab->mDataByteSize / sizeof (float);
-    int16_t input[1024], *ptr;
-    size_t bytes;
-    ssize_t bytes_read;
-    size_t samples;
-
-    while(samplesOutLeft > 0) {
-      /* Read some more data */
-      bytes = samplesOutLeft * sizeof (int16_t);
-      if(bytes > sizeof input)
-       bytes = sizeof input;
-      
-      bytes_read = read(pfd[0], input, bytes);
-      if(bytes_read < 0)
-       switch(errno) {
-       case EINTR:
-         continue;             /* just try again */
-       case EAGAIN:
-         return 0;             /* underrun - just play 0s */
-       default:
-         fatal(errno, "read error in core audio thread");
-       }
-      assert(bytes_read % 4 == 0); /* TODO horrible bodge! */
-      samples = bytes_read / sizeof (int16_t);
-      assert(samples <= samplesOutLeft);
-      ptr = input;
-      samplesOutLeft -= samples;
-      while(samples-- > 0)
-       *samplesOut++ = *ptr++ * (0.5 / 32767);
-    }
-    ++ab;
-    --nbuffers;
-  }
-  return 0;
-}
-
-/** @brief Core Audio backend initialization */
-static void coreaudio_init(void) {
-  OSStatus status;
-  UInt32 propertySize;
-  AudioStreamBasicDescription asbd;
-
-  propertySize = sizeof adid;
-  status = AudioHardwareGetProperty(kAudioHardwarePropertyDefaultOutputDevice,
-                                   &propertySize, &adid);
-  if(status)
-    fatal(0, "AudioHardwareGetProperty: %d", (int)status);
-  if(adid == kAudioDeviceUnknown)
-    fatal(0, "no output device");
-  propertySize = sizeof asbd;
-  status = AudioDeviceGetProperty(adid, 0, false,
-                                 kAudioDevicePropertyStreamFormat,
-                                 &propertySize, &asbd);
-  if(status)
-    fatal(0, "AudioHardwareGetProperty: %d", (int)status);
-  D(("mSampleRate       %f", asbd.mSampleRate));
-  D(("mFormatID         %08lx", asbd.mFormatID));
-  D(("mFormatFlags      %08lx", asbd.mFormatFlags));
-  D(("mBytesPerPacket   %08lx", asbd.mBytesPerPacket));
-  D(("mFramesPerPacket  %08lx", asbd.mFramesPerPacket));
-  D(("mBytesPerFrame    %08lx", asbd.mBytesPerFrame));
-  D(("mChannelsPerFrame %08lx", asbd.mChannelsPerFrame));
-  D(("mBitsPerChannel   %08lx", asbd.mBitsPerChannel));
-  D(("mReserved         %08lx", asbd.mReserved));
-  if(asbd.mFormatID != kAudioFormatLinearPCM)
-    fatal(0, "audio device does not support kAudioFormatLinearPCM");
-  status = AudioDeviceAddIOProc(adid, adioproc, 0);
-  if(status)
-    fatal(0, "AudioDeviceAddIOProc: %d", (int)status);
-  if(socketpair(PF_UNIX, SOCK_STREAM, 0, pfd) < 0)
-    fatal(errno, "error calling socketpair");
-  nonblock(pfd[0]);
-  nonblock(pfd[1]);
-  info("selected Core Audio backend");
-}
-
-/** @brief Core Audio deactivation */
-static void coreaudio_deactivate(void) {
-  const OSStatus status = AudioDeviceStop(adid, adioproc);
-  if(status) {
-    error(0, "AudioDeviceStop: %d", (int)status);
-    device_state = device_error;
-  } else
-    device_state = device_closed;
-}
-
-/** @brief Core Audio backend activation */
-static void coreaudio_activate(void) {
-  const OSStatus status = AudioDeviceStart(adid, adioproc);
-
-  if(status) {
-    error(0, "AudioDeviceStart: %d", (int)status);
-    device_state = device_error;  
-  }
-  device_state = device_open;
-}
-
-/** @brief Play via Core Audio */
-static size_t coreaudio_play(size_t frames) {
-  static size_t leftover;
-
-  size_t bytes = frames * bpf + leftover;
-  ssize_t bytes_written;
-
-  if(leftover)
-    /* There is a partial frame left over from an earlier write.  Try
-     * and finish that off before doing anything else. */
-    bytes = leftover;
-  bytes_written = write(pfd[1], playing->buffer + playing->start, bytes);
-  if(bytes_written < 0)
-    switch(errno) {
-    case EINTR:                        /* interrupted */
-    case EAGAIN:               /* buffer full */
-      return 0;                        /* try later */
-    default:
-      fatal(errno, "error writing to core audio player thread");
-    }
-  if(leftover) {
-    /* We were dealing the leftover bytes of a partial frame */
-    leftover -= bytes_written;
-    return !leftover;
-  }
-  leftover = bytes_written % bpf;
-  return bytes_written / bpf;
-}
-
-/** @brief Fill in poll fd array for Core Audio */
-static void coreaudio_beforepoll(int attribute((unused)) *timeoutp) {
-  pfd_slot = addfd(pfd[1], POLLOUT);
-}
-
-/** @brief Process poll() results for Core Audio */
-static int coreaudio_ready(void) {
-  return !!(fds[pfd_slot].revents & (POLLOUT|POLLERR));
-}
-
-/** @brief Backend definition for Core Audio */
-const struct speaker_backend coreaudio_backend = {
-  BACKEND_COREAUDIO,
-  0,
-  coreaudio_init,
-  coreaudio_activate,
-  coreaudio_play,
-  coreaudio_deactivate,
-  coreaudio_beforepoll,
-  coreaudio_ready
-};
-
-#endif
-
-/*
-Local Variables:
-c-basic-offset:2
-comment-column:40
-fill-column:79
-indent-tabs-mode:nil
-End:
-*/
diff --git a/server/speaker-network.c b/server/speaker-network.c
deleted file mode 100644 (file)
index e8a7190..0000000
+++ /dev/null
@@ -1,353 +0,0 @@
-/*
- * This file is part of DisOrder
- * Copyright (C) 2005-2008 Richard Kettlewell
- *
- * 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 3 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, see <http://www.gnu.org/licenses/>.
- */
-/** @file server/speaker-network.c
- * @brief Support for @ref BACKEND_NETWORK */
-
-#include "common.h"
-
-#include <unistd.h>
-#include <poll.h>
-#include <netdb.h>
-#include <gcrypt.h>
-#include <sys/socket.h>
-#include <sys/uio.h>
-#include <net/if.h>
-#include <ifaddrs.h>
-#include <errno.h>
-#include <netinet/in.h>
-
-#include "configuration.h"
-#include "syscalls.h"
-#include "log.h"
-#include "addr.h"
-#include "timeval.h"
-#include "rtp.h"
-#include "ifreq.h"
-#include "speaker-protocol.h"
-#include "speaker.h"
-
-/** @brief Network socket
- *
- * This is the file descriptor to write to for @ref BACKEND_NETWORK.
- */
-static int bfd = -1;
-
-/** @brief RTP timestamp
- *
- * This counts the number of samples played (NB not the number of frames
- * played).
- *
- * The timestamp in the packet header is only 32 bits wide.  With 44100Hz
- * stereo, that only gives about half a day before wrapping, which is not
- * particularly convenient for certain debugging purposes.  Therefore the
- * timestamp is maintained as a 64-bit integer, giving around six million years
- * before wrapping, and truncated to 32 bits when transmitting.
- */
-static uint64_t rtp_time;
-
-/** @brief RTP base timestamp
- *
- * This is the real time correspoding to an @ref rtp_time of 0.  It is used
- * to recalculate the timestamp after idle periods.
- */
-static struct timeval rtp_time_0;
-
-/** @brief RTP packet sequence number */
-static uint16_t rtp_seq;
-
-/** @brief RTP SSRC */
-static uint32_t rtp_id;
-
-/** @brief Error counter */
-static int audio_errors;
-
-/** @brief Network backend initialization */
-static void network_init(void) {
-  struct addrinfo *res, *sres;
-  static const struct addrinfo pref = {
-    .ai_flags = 0,
-    .ai_family = PF_INET,
-    .ai_socktype = SOCK_DGRAM,
-    .ai_protocol = IPPROTO_UDP,
-  };
-  static const struct addrinfo prefbind = {
-    .ai_flags = AI_PASSIVE,
-    .ai_family = PF_INET,
-    .ai_socktype = SOCK_DGRAM,
-    .ai_protocol = IPPROTO_UDP,
-  };
-  static const int one = 1;
-  int sndbuf, target_sndbuf = 131072;
-  socklen_t len;
-  char *sockname, *ssockname;
-
-  res = get_address(&config->broadcast, &pref, &sockname);
-  if(!res) exit(-1);
-  if(config->broadcast_from.n) {
-    sres = get_address(&config->broadcast_from, &prefbind, &ssockname);
-    if(!sres) exit(-1);
-  } else
-    sres = 0;
-  if((bfd = socket(res->ai_family,
-                   res->ai_socktype,
-                   res->ai_protocol)) < 0)
-    fatal(errno, "error creating broadcast socket");
-  if(multicast(res->ai_addr)) {
-    /* Multicasting */
-    switch(res->ai_family) {
-    case PF_INET: {
-      const int mttl = config->multicast_ttl;
-      if(setsockopt(bfd, IPPROTO_IP, IP_MULTICAST_TTL, &mttl, sizeof mttl) < 0)
-        fatal(errno, "error setting IP_MULTICAST_TTL on multicast socket");
-      if(setsockopt(bfd, IPPROTO_IP, IP_MULTICAST_LOOP,
-                    &config->multicast_loop, sizeof one) < 0)
-        fatal(errno, "error setting IP_MULTICAST_LOOP on multicast socket");
-      break;
-    }
-    case PF_INET6: {
-      const int mttl = config->multicast_ttl;
-      if(setsockopt(bfd, IPPROTO_IPV6, IPV6_MULTICAST_HOPS,
-                    &mttl, sizeof mttl) < 0)
-        fatal(errno, "error setting IPV6_MULTICAST_HOPS on multicast socket");
-      if(setsockopt(bfd, IPPROTO_IP, IPV6_MULTICAST_LOOP,
-                    &config->multicast_loop, sizeof (int)) < 0)
-        fatal(errno, "error setting IPV6_MULTICAST_LOOP on multicast socket");
-      break;
-    }
-    default:
-      fatal(0, "unsupported address family %d", res->ai_family);
-    }
-    info("multicasting on %s", sockname);
-  } else {
-    struct ifaddrs *ifs;
-
-    if(getifaddrs(&ifs) < 0)
-      fatal(errno, "error calling getifaddrs");
-    while(ifs) {
-      /* (At least on Darwin) IFF_BROADCAST might be set but ifa_broadaddr
-       * still a null pointer.  It turns out that there's a subsequent entry
-       * for he same interface which _does_ have ifa_broadaddr though... */
-      if((ifs->ifa_flags & IFF_BROADCAST)
-         && ifs->ifa_broadaddr
-         && sockaddr_equal(ifs->ifa_broadaddr, res->ai_addr))
-        break;
-      ifs = ifs->ifa_next;
-    }
-    if(ifs) {
-      if(setsockopt(bfd, SOL_SOCKET, SO_BROADCAST, &one, sizeof one) < 0)
-        fatal(errno, "error setting SO_BROADCAST on broadcast socket");
-      info("broadcasting on %s (%s)", sockname, ifs->ifa_name);
-    } else
-      info("unicasting on %s", sockname);
-  }
-  len = sizeof sndbuf;
-  if(getsockopt(bfd, SOL_SOCKET, SO_SNDBUF,
-                &sndbuf, &len) < 0)
-    fatal(errno, "error getting SO_SNDBUF");
-  if(target_sndbuf > sndbuf) {
-    if(setsockopt(bfd, SOL_SOCKET, SO_SNDBUF,
-                  &target_sndbuf, sizeof target_sndbuf) < 0)
-      error(errno, "error setting SO_SNDBUF to %d", target_sndbuf);
-    else
-      info("changed socket send buffer size from %d to %d",
-           sndbuf, target_sndbuf);
-  } else
-    info("default socket send buffer is %d",
-         sndbuf);
-  /* We might well want to set additional broadcast- or multicast-related
-   * options here */
-  if(sres && bind(bfd, sres->ai_addr, sres->ai_addrlen) < 0)
-    fatal(errno, "error binding broadcast socket to %s", ssockname);
-  if(connect(bfd, res->ai_addr, res->ai_addrlen) < 0)
-    fatal(errno, "error connecting broadcast socket to %s", sockname);
-  /* Select an SSRC */
-  gcry_randomize(&rtp_id, sizeof rtp_id, GCRY_STRONG_RANDOM);
-}
-
-/** @brief Play over the network */
-static size_t network_play(size_t frames) {
-  struct rtp_header header;
-  struct iovec vec[2];
-  size_t bytes = frames * bpf, written_frames;
-  int written_bytes;
-  /* We transmit using RTP (RFC3550) and attempt to conform to the internet
-   * AVT profile (RFC3551). */
-
-  /* If we're starting then initialize the base time */
-  if(!rtp_time)
-    xgettimeofday(&rtp_time_0, 0);
-  if(idled) {
-    /* There may have been a gap.  Fix up the RTP time accordingly. */
-    struct timeval now;
-    uint64_t delta;
-    uint64_t target_rtp_time;
-
-    /* Find the current time */
-    xgettimeofday(&now, 0);
-    /* Find the number of microseconds elapsed since rtp_time=0 */
-    delta = tvsub_us(now, rtp_time_0);
-    if(delta > UINT64_MAX / 88200)
-      fatal(0, "rtp_time=%"PRIu64" now=%ld.%06ld rtp_time_0=%ld.%06ld delta=%"PRIu64" (%"PRId64")",
-            rtp_time,
-            (long)now.tv_sec, (long)now.tv_usec,
-            (long)rtp_time_0.tv_sec, (long)rtp_time_0.tv_usec,
-            delta, delta);
-    target_rtp_time = (delta * config->sample_format.rate
-                       * config->sample_format.channels) / 1000000;
-    /* Overflows at ~6 years uptime with 44100Hz stereo */
-
-    /* rtp_time is the number of samples we've played.  NB that we play
-     * RTP_AHEAD_MS ahead of ourselves, so it may legitimately be ahead of
-     * the value we deduce from time comparison.
-     *
-     * Suppose we have 1s track started at t=0, and another track begins to
-     * play at t=2s.  Suppose 44100Hz stereo.  We send 1s of audio over the
-     * next (about) one second, giving rtp_time=88200.  rtp_time stops at this
-     * point.
-     *
-     * At t=2s we'll have calculated target_rtp_time=176400.  In this case we
-     * set rtp_time=176400 and the player can correctly conclude that it
-     * should leave 1s between the tracks.
-     *
-     * It's never right to reduce rtp_time, for that would imply packets with
-     * overlapping timestamp ranges, which does not make sense.
-     */
-    target_rtp_time &= ~(uint64_t)1;    /* stereo! */
-    if(target_rtp_time > rtp_time) {
-      /* More time has elapsed than we've transmitted samples.  That implies
-       * we've been 'sending' silence.  */
-      info("advancing rtp_time by %"PRIu64" samples",
-           target_rtp_time - rtp_time);
-      rtp_time = target_rtp_time;
-    } else if(target_rtp_time < rtp_time) {
-      info("would reverse rtp_time by %"PRIu64" samples",
-           rtp_time - target_rtp_time);
-    }
-  }
-  header.vpxcc = 2 << 6;              /* V=2, P=0, X=0, CC=0 */
-  header.seq = htons(rtp_seq++);
-  header.timestamp = htonl((uint32_t)rtp_time);
-  header.ssrc = rtp_id;
-  header.mpt = (idled ? 0x80 : 0x00) | 10;
-  /* 10 = L16 = 16-bit x 2 x 44100KHz.  We ought to deduce this value from
-   * the sample rate (in a library somewhere so that configuration.c can rule
-   * out invalid rates).
-   */
-  idled = 0;
-  if(bytes > NETWORK_BYTES - sizeof header) {
-    bytes = NETWORK_BYTES - sizeof header;
-    /* Always send a whole number of frames */
-    bytes -= bytes % bpf;
-  }
-  /* "The RTP clock rate used for generating the RTP timestamp is independent
-   * of the number of channels and the encoding; it equals the number of
-   * sampling periods per second.  For N-channel encodings, each sampling
-   * period (say, 1/8000 of a second) generates N samples. (This terminology
-   * is standard, but somewhat confusing, as the total number of samples
-   * generated per second is then the sampling rate times the channel
-   * count.)"
-   */
-  vec[0].iov_base = (void *)&header;
-  vec[0].iov_len = sizeof header;
-  vec[1].iov_base = playing->buffer + playing->start;
-  vec[1].iov_len = bytes;
-  do {
-    written_bytes = writev(bfd, vec, 2);
-  } while(written_bytes < 0 && errno == EINTR);
-  if(written_bytes < 0) {
-    error(errno, "error transmitting audio data");
-    ++audio_errors;
-    if(audio_errors == 10)
-      fatal(0, "too many audio errors");
-    return 0;
-  } else
-    audio_errors /= 2;
-  written_bytes -= sizeof (struct rtp_header);
-  written_frames = written_bytes / bpf;
-  /* Advance RTP's notion of the time */
-  rtp_time += written_frames * config->sample_format.channels;
-  return written_frames;
-}
-
-static int bfd_slot;
-
-/** @brief Set up poll array for network play */
-static void network_beforepoll(int *timeoutp) {
-  struct timeval now;
-  uint64_t target_us;
-  uint64_t target_rtp_time;
-  const int64_t samples_per_second = config->sample_format.rate
-                                   * config->sample_format.channels;
-  int64_t lead, ahead_ms;
-  
-  /* If we're starting then initialize the base time */
-  if(!rtp_time)
-    xgettimeofday(&rtp_time_0, 0);
-  /* We send audio data whenever we would otherwise get behind */
-  xgettimeofday(&now, 0);
-  target_us = tvsub_us(now, rtp_time_0);
-  if(target_us > UINT64_MAX / 88200)
-    fatal(0, "rtp_time=%"PRIu64" rtp_time_0=%ld.%06ld now=%ld.%06ld target_us=%"PRIu64" (%"PRId64")\n",
-          rtp_time,
-          (long)rtp_time_0.tv_sec, (long)rtp_time_0.tv_usec,
-          (long)now.tv_sec, (long)now.tv_usec,
-          target_us, target_us);
-  target_rtp_time = (target_us * config->sample_format.rate
-                               * config->sample_format.channels)
-                     / 1000000;
-  /* Lead is how far ahead we are */
-  lead = rtp_time - target_rtp_time;
-  if(lead <= 0)
-    /* We're behind or even, so we'll need to write as soon as we can */
-    bfd_slot = addfd(bfd, POLLOUT);
-  else {
-    /* We've ahead, we can afford to wait a bit even if the IP stack thinks it
-     * can accept more. */
-    ahead_ms = 1000 * lead / samples_per_second;
-    if(ahead_ms < *timeoutp)
-      *timeoutp = ahead_ms;
-  }
-}
-
-/** @brief Process poll() results for network play */
-static int network_ready(void) {
-  if(fds[bfd_slot].revents & (POLLOUT | POLLERR))
-    return 1;
-  else
-    return 0;
-}
-
-const struct speaker_backend network_backend = {
-  BACKEND_NETWORK,
-  0,
-  network_init,
-  0,                                    /* activate */
-  network_play,
-  0,                                    /* deactivate */
-  network_beforepoll,
-  network_ready
-};
-
-/*
-Local Variables:
-c-basic-offset:2
-comment-column:40
-fill-column:79
-indent-tabs-mode:nil
-End:
-*/
diff --git a/server/speaker-oss.c b/server/speaker-oss.c
deleted file mode 100644 (file)
index a84d0bb..0000000
+++ /dev/null
@@ -1,175 +0,0 @@
-/*
- * This file is part of DisOrder
- * Copyright (C) 2007, 2008 Richard Kettlewell
- * Portions copyright (C) 2007 Ross Younger
- *
- * 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 3 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, see <http://www.gnu.org/licenses/>.
- */
-/** @file server/speaker-oss.c
- * @brief Support for @ref BACKEND_OSS */
-
-#include "common.h"
-
-#if HAVE_SYS_SOUNDCARD_H
-
-#include <unistd.h>
-#include <poll.h>
-#include <fcntl.h>
-#include <unistd.h>
-#include <errno.h>
-#include <sys/ioctl.h>
-#include <sys/soundcard.h>
-
-#include "configuration.h"
-#include "syscalls.h"
-#include "log.h"
-#include "speaker-protocol.h"
-#include "speaker.h"
-
-/** @brief Current device */
-static int ossfd = -1;
-
-/** @brief OSS backend initialization */
-static void oss_init(void) {
-  info("selected OSS backend");
-}
-
-/** @brief OSS deactivation */
-static void oss_deactivate(void) {
-  if(ossfd != -1) {
-    xclose(ossfd);
-    ossfd = -1;
-    device_state = device_closed;
-    D(("released audio device"));
-  }
-}
-
-/** @brief OSS backend activation */
-static void oss_activate(void) {
-  int stereo, format, rate;
-  const char *device;
-
-  if(ossfd == -1) {
-    /* Try to pick a device */
-    if(!strcmp(config->device, "default")) {
-      if(access("/dev/dsp", W_OK) == 0)
-       device = "/dev/dsp";
-      else if(access("/dev/audio", W_OK) == 0)
-       device = "/dev/audio";
-      else {
-        static int reported;
-        
-        if(!reported) {
-          error(0, "cannot determine default OSS device");
-          reported = 1;
-        }
-        goto failed;
-      }
-    } else
-      device = config->device; /* just believe the user */
-    /* Open the device */
-    if((ossfd = open(device, O_WRONLY, 0)) < 0) {
-      error(errno, "error opening %s", device);
-      goto failed;
-    }
-    /* Set the audio format */
-    stereo = (config->sample_format.channels == 2);
-    if(ioctl(ossfd, SNDCTL_DSP_STEREO, &stereo) < 0) {
-      error(errno, "error calling ioctl SNDCTL_DSP_STEREO %d", stereo);
-      goto failed;
-    }
-    if(config->sample_format.bits == 8)
-      format = AFMT_U8;
-    else if(config->sample_format.bits == 16)
-      format = (config->sample_format.endian == ENDIAN_LITTLE
-               ? AFMT_S16_LE : AFMT_S16_BE);
-    else {
-      error(0, "unsupported sample_format for oss backend"); 
-      goto failed;
-    }
-    if(ioctl(ossfd, SNDCTL_DSP_SETFMT, &format) < 0) {
-      error(errno, "error calling ioctl SNDCTL_DSP_SETFMT %#x", format);
-      goto failed;
-    }
-    rate = config->sample_format.rate;
-    if(ioctl(ossfd, SNDCTL_DSP_SPEED, &rate) < 0) {
-      error(errno, "error calling ioctl SNDCTL_DSP_SPEED %d", rate);
-      goto failed;
-    }
-    if((unsigned)rate != config->sample_format.rate)
-      error(0, "asked for %luHz, got %dHz",
-           (unsigned long)config->sample_format.rate, rate);
-    nonblock(ossfd);
-    device_state = device_open;
-  }
-  return;
-failed:
-  device_state = device_error;
-  if(ossfd >= 0) {
-    xclose(ossfd);
-    ossfd = -1;
-  }
-}
-
-/** @brief Play via OSS */
-static size_t oss_play(size_t frames) {
-  const size_t bytes_to_play = frames * bpf;
-  ssize_t bytes_written;
-
-  bytes_written = write(ossfd, playing->buffer + playing->start,
-                       bytes_to_play);
-  if(bytes_written < 0)
-    switch(errno) {
-    case EINTR:                        /* interruped */
-    case EAGAIN:               /* overrun */
-      return 0;                        /* try again later */
-    default:
-      fatal(errno, "error writing to audio device");
-    }
-  return bytes_written / bpf;
-}
-
-static int oss_slot;
-
-/** @brief Fill in poll fd array for OSS */
-static void oss_beforepoll(int attribute((unused)) *timeoutp) {
-  oss_slot = addfd(ossfd, POLLOUT|POLLERR);
-}
-
-/** @brief Process poll() results for OSS */
-static int oss_ready(void) {
-  return !!(fds[oss_slot].revents & (POLLOUT|POLLERR));
-}
-
-const struct speaker_backend oss_backend = {
-  BACKEND_OSS,
-  0,
-  oss_init,
-  oss_activate,
-  oss_play,
-  oss_deactivate,
-  oss_beforepoll,
-  oss_ready
-};
-
-#endif
-
-/*
-Local Variables:
-c-basic-offset:2
-comment-column:40
-fill-column:79
-indent-tabs-mode:nil
-End:
-*/
index 340e995..2206547 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * This file is part of DisOrder
- * Copyright (C) 2005-2008 Richard Kettlewell
+ * Copyright (C) 2005-2009 Richard Kettlewell
  * Portions (C) 2007 Mark Wooding
  *
  * This program is free software: you can redistribute it and/or modify
  * process that is about to become disorder-normalize) and plays them in the
  * right order.
  *
- * @b Encodings.  For the <a href="http://www.alsa-project.org/">ALSA</a> API,
- * 8- and 16- bit stereo and mono are supported, with any sample rate (within
- * the limits that ALSA can deal with.)
+ * @b Model.  mainloop() implements a select loop awaiting commands from the
+ * main server, new connections to the speaker socket, and audio data on those
+ * connections.  Each connection starts with a queue ID (with a 32-bit
+ * native-endian length word), allowing it to be referred to in commands from
+ * the server.
+ *
+ * Data read on connections is buffered, up to a limit (currently 1Mbyte per
+ * track).  No attempt is made here to limit the number of tracks, it is
+ * assumed that the main server won't start outrageously many decoders.
+ *
+ * Audio is supplied from this buffer to the uaudio play callback.  Playback is
+ * enabled when a track is to be played and disabled when the its last bytes
+ * have been return by the callback; pause and resume is implemneted the
+ * obvious way.  If the callback finds itself required to play when there is no
+ * playing track it returns dead air.
+ *
+ * To implement gapless playback, the server is notified that a track has
+ * finished slightly early.  @ref SM_PLAY is therefore allowed to arrive while
+ * the previous track is still playing provided an early @ref SM_FINISHED has
+ * been sent for it.
+ *
+ * @b Encodings.  The encodings supported depend entirely on the uaudio backend
+ * chosen.  See @ref uaudio.h, etc.
  *
  * Inbound data is expected to match @c config->sample_format.  In normal use
  * this is arranged by the @c disorder-normalize program (see @ref
  * server/normalize.c).
  *
-7 * @b Garbage @b Collection.  This program deliberately does not use the
+ * @b Garbage @b Collection.  This program deliberately does not use the
  * garbage collector even though it might be convenient to do so.  This is for
  * two reasons.  Firstly some sound APIs use thread threads and we do not want
  * to have to deal with potential interactions between threading and garbage
@@ -63,6 +83,9 @@
 #include <poll.h>
 #include <sys/un.h>
 #include <sys/stat.h>
+#include <pthread.h>
+#include <sys/resource.h>
+#include <gcrypt.h>
 
 #include "configuration.h"
 #include "syscalls.h"
 #include "mem.h"
 #include "speaker-protocol.h"
 #include "user.h"
-#include "speaker.h"
 #include "printf.h"
 #include "version.h"
+#include "uaudio.h"
+
+/** @brief Maximum number of FDs to poll for */
+#define NFDS 1024
+
+/** @brief Number of bytes before end of track to send SM_FINISHED
+ *
+ * Generally set to 1 second.
+ */
+static size_t early_finish;
+
+/** @brief Track structure
+ *
+ * Known tracks are kept in a linked list.  Usually there will be at most two
+ * of these but rearranging the queue can cause there to be more.
+ */
+struct track {
+  /** @brief Next track */
+  struct track *next;
+
+  /** @brief Input file descriptor */
+  int fd;                               /* input FD */
+
+  /** @brief Track ID */
+  char id[24];
+
+  /** @brief Start position of data in buffer */
+  size_t start;
+
+  /** @brief Number of bytes of data in buffer */
+  size_t used;
+
+  /** @brief Set @c fd is at EOF */
+  int eof;
+
+  /** @brief Total number of samples played */
+  unsigned long long played;
+
+  /** @brief Slot in @ref fds */
+  int slot;
+
+  /** @brief Set when playable
+   *
+   * A track becomes playable whenever it fills its buffer or reaches EOF; it
+   * stops being playable when it entirely empties its buffer.  Tracks start
+   * out life not playable.
+   */
+  int playable;
+
+  /** @brief Set when finished
+   *
+   * This is set when we've notified the server that the track is finished.
+   * Once this has happened (typically very late in the track's lifetime) the
+   * track cannot be paused or cancelled.
+   */
+  int finished;
+  
+  /** @brief Input buffer
+   *
+   * 1Mbyte is enough for nearly 6s of 44100Hz 16-bit stereo
+   */
+  char buffer[1048576];
+};
+
+/** @brief Lock protecting data structures
+ *
+ * This lock protects values shared between the main thread and the callback.
+ *
+ * It is held 'all' the time by the main thread, the exceptions being when
+ * called activate/deactivate callbacks and when calling (potentially) slow
+ * system calls (in particular poll(), where in fact the main thread will spend
+ * most of its time blocked).
+ *
+ * The callback holds it when it's running.
+ */
+static pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
 
 /** @brief Linked list of all prepared tracks */
-struct track *tracks;
+static struct track *tracks;
 
-/** @brief Playing track, or NULL */
-struct track *playing;
+/** @brief Playing track, or NULL
+ *
+ * This means the track the speaker process intends to play.  It does not
+ * reflect any other state (e.g. activation of uaudio backend).
+ */
+static struct track *playing;
 
-/** @brief Number of bytes pre frame */
-size_t bpf;
+/** @brief Pending playing track, or NULL
+ *
+ * This means the track the server wants the speaker to play.
+ */
+static struct track *pending_playing;
 
 /** @brief Array of file descriptors for poll() */
-struct pollfd fds[NFDS];
+static struct pollfd fds[NFDS];
 
 /** @brief Next free slot in @ref fds */
-int fdno;
+static int fdno;
 
 /** @brief Listen socket */
 static int listenfd;
 
-static time_t last_report;              /* when we last reported */
-static int paused;                      /* pause status */
+/** @brief Timestamp of last potential report to server */
+static time_t last_report;
 
-/** @brief The current device state */
-enum device_states device_state;
+/** @brief Set when paused */
+static int paused;
 
-/** @brief Set when idled
- *
- * This is set when the sound device is deliberately closed by idle().
- */
-int idled;
+/** @brief Set when back end activated */
+static int activated;
+
+/** @brief Signal pipe back into the poll() loop */
+static int sigpipe[2];
 
 /** @brief Selected backend */
-static const struct speaker_backend *backend;
+static const struct uaudio *backend;
 
 static const struct option options[] = {
   { "help", no_argument, 0, 'h' },
@@ -136,12 +241,11 @@ static void help(void) {
   exit(0);
 }
 
-/** @brief Return the number of bytes per frame in @p format */
-static size_t bytes_per_frame(const struct stream_header *format) {
-  return format->channels * format->bits / 8;
-}
-
-/** @brief Find track @p id, maybe creating it if not found */
+/** @brief Find track @p id, maybe creating it if not found
+ * @param id Track ID to find
+ * @param create If nonzero, create track structure of @p id not found
+ * @return Pointer to track structure or NULL
+ */
 static struct track *findtrack(const char *id, int create) {
   struct track *t;
 
@@ -158,7 +262,10 @@ static struct track *findtrack(const char *id, int create) {
   return t;
 }
 
-/** @brief Remove track @p id (but do not destroy it) */
+/** @brief Remove track @p id (but do not destroy it)
+ * @param id Track ID to remove
+ * @return Track structure or NULL if not found
+ */
 static struct track *removetrack(const char *id) {
   struct track *t, **tt;
 
@@ -170,10 +277,13 @@ static struct track *removetrack(const char *id) {
   return t;
 }
 
-/** @brief Destroy a track */
+/** @brief Destroy a track
+ * @param t Track structure
+ */
 static void destroy(struct track *t) {
   D(("destroy %s", t->id));
-  if(t->fd != -1) xclose(t->fd);
+  if(t->fd != -1)
+    xclose(t->fd);
   free(t);
 }
 
@@ -187,193 +297,89 @@ static void destroy(struct track *t) {
  */
 static int speaker_fill(struct track *t) {
   size_t where, left;
-  int n;
+  int n, rc;
 
   D(("fill %s: eof=%d used=%zu",
      t->id, t->eof, t->used));
-  if(t->eof) return -1;
+  if(t->eof)
+    return -1;
   if(t->used < sizeof t->buffer) {
     /* there is room left in the buffer */
     where = (t->start + t->used) % sizeof t->buffer;
     /* Get as much data as we can */
-    if(where >= t->start) left = (sizeof t->buffer) - where;
-    else left = t->start - where;
+    if(where >= t->start)
+      left = (sizeof t->buffer) - where;
+    else
+      left = t->start - where;
+    pthread_mutex_unlock(&lock);
     do {
       n = read(t->fd, t->buffer + where, left);
     } while(n < 0 && errno == EINTR);
+    pthread_mutex_lock(&lock);
     if(n < 0) {
-      if(errno != EAGAIN) fatal(errno, "error reading sample stream");
-      return 0;
-    }
-    if(n == 0) {
+      if(errno != EAGAIN)
+        fatal(errno, "error reading sample stream");
+      rc = 0;
+    } else if(n == 0) {
       D(("fill %s: eof detected", t->id));
       t->eof = 1;
+      /* A track always becomes playable at EOF; we're not going to see any
+       * more data. */
       t->playable = 1;
-      return -1;
+      rc = -1;
+    } else {
+      t->used += n;
+      /* A track becomes playable when it (first) fills its buffer.  For
+       * 44.1KHz 16-bit stereo this is ~6s of audio data.  The latency will
+       * depend how long that takes to decode (hopefuly not very!) */
+      if(t->used == sizeof t->buffer)
+        t->playable = 1;
+      rc = 0;
     }
-    t->used += n;
-    if(t->used == sizeof t->buffer)
-      t->playable = 1;
   }
-  return 0;
-}
-
-/** @brief Close the sound device
- *
- * This is called to deactivate the output device when pausing, and also by the
- * ALSA backend when changing encoding (in which case the sound device will be
- * immediately reactivated).
- */
-static void idle(void) {
-  D(("idle"));
-  if(backend->deactivate) 
-    backend->deactivate();
-  else
-    device_state = device_closed;
-  idled = 1;
-}
-
-/** @brief Abandon the current track */
-void abandon(void) {
-  struct speaker_message sm;
-
-  D(("abandon"));
-  memset(&sm, 0, sizeof sm);
-  sm.type = SM_FINISHED;
-  strcpy(sm.id, playing->id);
-  speaker_send(1, &sm);
-  removetrack(playing->id);
-  destroy(playing);
-  playing = 0;
-}
-
-/** @brief Enable sound output
- *
- * Makes sure the sound device is open and has the right sample format.  Return
- * 0 on success and -1 on error.
- */
-static void activate(void) {
-  if(backend->activate)
-    backend->activate();
-  else
-    device_state = device_open;
-}
-
-/** @brief Check whether the current track has finished
- *
- * The current track is determined to have finished either if the input stream
- * eded before the format could be determined (i.e. it is malformed) or the
- * input is at end of file and there is less than a frame left unplayed.  (So
- * it copes with decoders that crash mid-frame.)
- */
-static void maybe_finished(void) {
-  if(playing
-     && playing->eof
-     && playing->used < bytes_per_frame(&config->sample_format))
-    abandon();
+  return rc;
 }
 
 /** @brief Return nonzero if we want to play some audio
  *
  * We want to play audio if there is a current track; and it is not paused; and
  * it is playable according to the rules for @ref track::playable.
+ *
+ * We don't allow tracks to be paused if we've already told the server we've
+ * finished them; that would cause such tracks to survive much longer than the
+ * few samples they're supposed to, with report() remaining silent for the
+ * duration.
  */
 static int playable(void) {
   return playing
-         && !paused
+         && (!paused || playing->finished)
          && playing->playable;
 }
 
-/** @brief Play up to @p frames frames of audio
- *
- * It is always safe to call this function.
- * - If @ref playing is 0 then it will just return
- * - If @ref paused is non-0 then it will just return
- * - If @ref device_state != @ref device_open then it will call activate() and
- * return if it it fails.
- * - If there is not enough audio to play then it play what is available.
- *
- * If there are not enough frames to play then whatever is available is played
- * instead.  It is up to mainloop() to ensure that speaker_play() is not called
- * when unreasonably only an small amounts of data is available to play.
- */
-static void speaker_play(size_t frames) {
-  size_t avail_frames, avail_bytes, written_frames;
-  ssize_t written_bytes;
-
-  /* Make sure there's a track to play and it is not paused */
-  if(!playable())
-    return;
-  /* Make sure the output device is open */
-  if(device_state != device_open) {
-    activate(); 
-    if(device_state != device_open)
-      return;
-  }
-  D(("play: play %zu/%zu%s %dHz %db %dc",  frames, playing->used / bpf,
-     playing->eof ? " EOF" : "",
-     config->sample_format.rate,
-     config->sample_format.bits,
-     config->sample_format.channels));
-  /* Figure out how many frames there are available to write */
-  if(playing->start + playing->used > sizeof playing->buffer)
-    /* The ring buffer is currently wrapped, only play up to the wrap point */
-    avail_bytes = (sizeof playing->buffer) - playing->start;
-  else
-    /* The ring buffer is not wrapped, can play the lot */
-    avail_bytes = playing->used;
-  avail_frames = avail_bytes / bpf;
-  /* Only play up to the requested amount */
-  if(avail_frames > frames)
-    avail_frames = frames;
-  if(!avail_frames)
-    return;
-  /* Play it, Sam */
-  written_frames = backend->play(avail_frames);
-  written_bytes = written_frames * bpf;
-  /* written_bytes and written_frames had better both be set and correct by
-   * this point */
-  playing->start += written_bytes;
-  playing->used -= written_bytes;
-  playing->played += written_frames;
-  /* If the pointer is at the end of the buffer (or the buffer is completely
-   * empty) wrap it back to the start. */
-  if(!playing->used || playing->start == (sizeof playing->buffer))
-    playing->start = 0;
-  /* If the buffer emptied out mark the track as unplayably */
-  if(!playing->used && !playing->eof) {
-    error(0, "track buffer emptied");
-    playing->playable = 0;
-  }
-  frames -= written_frames;
-  return;
-}
-
-/* Notify the server what we're up to. */
+/** @brief Notify the server what we're up to */
 static void report(void) {
   struct speaker_message sm;
 
   if(playing) {
+    /* Had better not send a report for a track that the server thinks has
+     * finished, that would be confusing. */
+    if(playing->finished)
+      return;
     memset(&sm, 0, sizeof sm);
     sm.type = paused ? SM_PAUSED : SM_PLAYING;
     strcpy(sm.id, playing->id);
-    sm.data = playing->played / config->sample_format.rate;
+    sm.data = playing->played / (uaudio_rate * uaudio_channels);
     speaker_send(1, &sm);
+    time(&last_report);
   }
-  time(&last_report);
-}
-
-static void reap(int __attribute__((unused)) sig) {
-  pid_t cmdpid;
-  int st;
-
-  do
-    cmdpid = waitpid(-1, &st, WNOHANG);
-  while(cmdpid > 0);
-  signal(SIGCHLD, reap);
 }
 
-int addfd(int fd, int events) {
+/** @brief Add a file descriptor to the set to poll() for
+ * @param fd File descriptor
+ * @param events Events to wait for e.g. @c POLLIN
+ * @return Slot number
+ */
+static int addfd(int fd, int events) {
   if(fdno < NFDS) {
     fds[fdno].fd = fd;
     fds[fdno].events = events;
@@ -382,33 +388,81 @@ int addfd(int fd, int events) {
     return -1;
 }
 
-/** @brief Table of speaker backends */
-static const struct speaker_backend *backends[] = {
-#if HAVE_ALSA_ASOUNDLIB_H
-  &alsa_backend,
-#endif
-  &command_backend,
-  &network_backend,
-#if HAVE_COREAUDIO_AUDIOHARDWARE_H
-  &coreaudio_backend,
-#endif
-#if HAVE_SYS_SOUNDCARD_H
-  &oss_backend,
-#endif
-  0
-};
+/** @brief Callback to return some sampled data
+ * @param buffer Where to put sample data
+ * @param max_samples How many samples to return
+ * @param userdata User data
+ * @return Number of samples written
+ *
+ * See uaudio_callback().
+ */
+static size_t speaker_callback(void *buffer,
+                               size_t max_samples,
+                               void attribute((unused)) *userdata) {
+  const size_t max_bytes = max_samples * uaudio_sample_size;
+  size_t provided_samples = 0;
+
+  pthread_mutex_lock(&lock);
+  /* TODO perhaps we should immediately go silent if we've been asked to pause
+   * or cancel the playing track (maybe block in the cancel case and see what
+   * else turns up?) */
+  if(playing) {
+    if(playing->used > 0) {
+      size_t bytes;
+      /* Compute size of largest contiguous chunk.  We get called as often as
+       * necessary so there's no need for cleverness here. */
+      if(playing->start + playing->used > sizeof playing->buffer)
+        bytes = sizeof playing->buffer - playing->start;
+      else
+        bytes = playing->used;
+      /* Limit to what we were asked for */
+      if(bytes > max_bytes)
+        bytes = max_bytes;
+      /* Provide it */
+      memcpy(buffer, playing->buffer + playing->start, bytes);
+      playing->start += bytes;
+      playing->used -= bytes;
+      /* Wrap around to start of buffer */
+      if(playing->start == sizeof playing->buffer)
+        playing->start = 0;
+      /* See if we've reached the end of the track */
+      if(playing->used == 0 && playing->eof) {
+        int ignored = write(sigpipe[1], "", 1);
+        (void) ignored;
+      }
+      provided_samples = bytes / uaudio_sample_size;
+      playing->played += provided_samples;
+    }
+  }
+  /* If we couldn't provide anything at all, play dead air */
+  /* TODO maybe it would be better to block, in some cases? */
+  if(!provided_samples) {
+    memset(buffer, 0, max_bytes);
+    provided_samples = max_samples;
+    if(playing)
+      info("%zu samples silence, playing->used=%zu", provided_samples, playing->used);
+    else
+      info("%zu samples silence, playing=NULL", provided_samples);
+  }
+  pthread_mutex_unlock(&lock);
+  return provided_samples;
+}
 
 /** @brief Main event loop */
 static void mainloop(void) {
   struct track *t;
   struct speaker_message sm;
-  int n, fd, stdin_slot, timeout, listen_slot;
+  int n, fd, stdin_slot, timeout, listen_slot, sigpipe_slot;
 
+  /* Keep going while our parent process is alive */
+  pthread_mutex_lock(&lock);
   while(getppid() != 1) {
+    int force_report = 0;
+
     fdno = 0;
-    /* By default we will wait up to a second before thinking about current
-     * state. */
-    timeout = 1000;
+    /* By default we will wait up to half a second before thinking about
+     * current state. */
+    timeout = 500;
     /* Always ready for commands from the main server. */
     stdin_slot = addfd(0, POLLIN);
     /* Also always ready for inbound connections */
@@ -422,18 +476,6 @@ static void mainloop(void) {
       playing->slot = addfd(playing->fd, POLLIN);
     else if(playing)
       playing->slot = -1;
-    if(playable()) {
-      /* We want to play some audio.  If the device is closed then we attempt
-       * to open it. */
-      if(device_state == device_closed)
-        activate();
-      /* If the device is (now) open then we will wait up until it is ready for
-       * more.  If something went wrong then we should have device_error
-       * instead, but the post-poll code will cope even if it's
-       * device_closed. */
-      if(device_state == device_open)
-        backend->beforepoll(&timeout);
-    }
     /* If any other tracks don't have a full buffer, try to read sample data
      * from them.  We do this last of all, so that if we run out of slots,
      * nothing important can't be monitored. */
@@ -446,28 +488,15 @@ static void mainloop(void) {
         } else
           t->slot = -1;
       }
+    sigpipe_slot = addfd(sigpipe[0], POLLIN);
     /* Wait for something interesting to happen */
+    pthread_mutex_unlock(&lock);
     n = poll(fds, fdno, timeout);
+    pthread_mutex_lock(&lock);
     if(n < 0) {
       if(errno == EINTR) continue;
       fatal(errno, "error calling poll");
     }
-    /* Play some sound before doing anything else */
-    if(playable()) {
-      /* We want to play some audio */
-      if(device_state == device_open) {
-        if(backend->ready())
-          speaker_play(3 * FRAMES);
-      } else {
-        /* We must be in _closed or _error, and it should be the latter, but we
-         * cope with either.
-         *
-         * We most likely timed out, so now is a good time to retry.
-         * speaker_play() knows to re-activate the device if necessary.
-         */
-        speaker_play(3 * FRAMES);
-      }
-    }
     /* Perhaps a connection has arrived */
     if(fds[listen_slot].revents & POLLIN) {
       struct sockaddr_un addr;
@@ -509,45 +538,64 @@ static void mainloop(void) {
        * this won't be the case, so we don't bother looping around to pick them
        * all up. */ 
       n = speaker_recv(0, &sm);
-      /* TODO */
       if(n > 0)
+        /* As a rule we don't send success replies to most commands - we just
+         * force the regular status update to be sent immediately rather than
+         * on schedule. */
        switch(sm.type) {
        case SM_PLAY:
-          if(playing) fatal(0, "got SM_PLAY but already playing something");
+          /* SM_PLAY is only allowed if the server reasonably believes that
+           * nothing is playing */
+          if(playing) {
+            /* If finished isn't set then the server can't believe that this
+             * track has finished */
+            if(!playing->finished)
+              fatal(0, "got SM_PLAY but already playing something");
+            /* If pending_playing is set then the server must believe that that
+             * is playing */
+            if(pending_playing)
+              fatal(0, "got SM_PLAY but have a pending playing track");
+          }
          t = findtrack(sm.id, 1);
           D(("SM_PLAY %s fd %d", t->id, t->fd));
           if(t->fd == -1)
             error(0, "cannot play track because no connection arrived");
-          playing = t;
-          /* We attempt to play straight away rather than going round the loop.
-           * speaker_play() is clever enough to perform any activation that is
-           * required. */
-          speaker_play(3 * FRAMES);
-          report();
+          /* TODO as things stand we often report this error message but then
+           * appear to proceed successfully.  Understanding why requires a look
+           * at play.c: we call prepare() which makes the connection in a child
+           * process, and then sends the SM_PLAY in the parent process.  The
+           * latter may well be faster.  As it happens this is harmless; we'll
+           * just sit around sending silence until the decoder connects and
+           * starts sending some sample data.  But is is annoying and ought to
+           * be fixed. */
+          pending_playing = t;
+          /* If nothing is currently playing then we'll switch to the pending
+           * track below so there's no point distinguishing the situations
+           * here. */
          break;
        case SM_PAUSE:
           D(("SM_PAUSE"));
          paused = 1;
-          report();
+          force_report = 1;
           break;
        case SM_RESUME:
           D(("SM_RESUME"));
-          if(paused) {
-            paused = 0;
-            /* As for SM_PLAY we attempt to play straight away. */
-            if(playing)
-              speaker_play(3 * FRAMES);
-          }
-          report();
+          paused = 0;
+          force_report = 1;
          break;
        case SM_CANCEL:
           D(("SM_CANCEL %s", sm.id));
          t = removetrack(sm.id);
          if(t) {
-           if(t == playing) {
-              /* scratching the playing track */
+           if(t == playing || t == pending_playing) {
+              /* Scratching the track that the server believes is playing,
+               * which might either be the actual playing track or a pending
+               * playing track */
               sm.type = SM_FINISHED;
-             playing = 0;
+              if(t == playing)
+                playing = 0;
+              else
+                pending_playing = 0;
             } else {
               /* Could be scratching the playing track before it's quite got
                * going, or could be just removing a track from the queue.  We
@@ -566,11 +614,12 @@ static void mainloop(void) {
            error(0, "SM_CANCEL for unknown track %s", sm.id);
           }
           speaker_send(1, &sm);
-          report();
+          force_report = 1;
          break;
        case SM_RELOAD:
           D(("SM_RELOAD"));
-         if(config_read(1)) error(0, "cannot read configuration");
+         if(config_read(1, NULL))
+            error(0, "cannot read configuration");
           info("reloaded configuration");
          break;
        default:
@@ -583,14 +632,59 @@ static void mainloop(void) {
          && t->slot != -1
          && (fds[t->slot].revents & (POLLIN | POLLHUP)))
          speaker_fill(t);
-    /* Maybe we finished playing a track somewhere in the above */
-    maybe_finished();
-    /* If we don't need the sound device for now then close it for the benefit
-     * of anyone else who wants it. */
-    if((!playing || paused) && device_state == device_open)
-      idle();
-    /* If we've not reported out state for a second do so now. */
-    if(time(0) > last_report)
+    /* Drain the signal pipe.  We don't care about its contents, merely that it
+     * interrupted poll(). */
+    if(fds[sigpipe_slot].revents & POLLIN) {
+      char buffer[64];
+      int ignored; (void)ignored;
+
+      ignored = read(sigpipe[0], buffer, sizeof buffer);
+    }
+    /* Send SM_FINISHED when we're near the end of the track.
+     *
+     * This is how we implement gapless play; we hope that the SM_PLAY from the
+     * server arrives before the remaining bytes of the track play out.
+     */
+    if(playing
+       && playing->eof
+       && !playing->finished
+       && playing->used <= early_finish) {
+      memset(&sm, 0, sizeof sm);
+      sm.type = SM_FINISHED;
+      strcpy(sm.id, playing->id);
+      speaker_send(1, &sm);
+      playing->finished = 1;
+    }
+    /* When the track is actually finished, deconfigure it */
+    if(playing && playing->eof && !playing->used) {
+      removetrack(playing->id);
+      destroy(playing);
+      playing = 0;
+    }
+    /* Act on the pending SM_PLAY */
+    if(!playing && pending_playing) {
+      playing = pending_playing;
+      pending_playing = 0;
+      force_report = 1;
+    }
+    /* Impose any state change required by the above */
+    if(playable()) {
+      if(!activated) {
+        activated = 1;
+        pthread_mutex_unlock(&lock);
+        backend->activate();
+        pthread_mutex_lock(&lock);
+      }
+    } else {
+      if(activated) {
+        activated = 0;
+        pthread_mutex_unlock(&lock);
+        backend->deactivate();
+        pthread_mutex_lock(&lock);
+      }
+    }
+    /* If we've not reported our state for a second do so now. */
+    if(force_report || time(0) > last_report)
       report();
   }
 }
@@ -602,6 +696,7 @@ int main(int argc, char **argv) {
   struct speaker_message sm;
   const char *d;
   char *dir;
+  struct rlimit rl[1];
 
   set_progname(argv);
   if(!setlocale(LC_CTYPE, "")) fatal(errno, "error calling setlocale");
@@ -622,27 +717,49 @@ int main(int argc, char **argv) {
     openlog(progname, LOG_PID, LOG_DAEMON);
     log_default = &log_syslog;
   }
-  if(config_read(1)) fatal(0, "cannot read configuration");
-  bpf = bytes_per_frame(&config->sample_format);
+  config_uaudio_apis = uaudio_apis;
+  if(config_read(1, NULL)) fatal(0, "cannot read configuration");
   /* ignore SIGPIPE */
   signal(SIGPIPE, SIG_IGN);
-  /* reap kids */
-  signal(SIGCHLD, reap);
   /* set nice value */
   xnice(config->nice_speaker);
   /* change user */
   become_mortal();
   /* make sure we're not root, whatever the config says */
-  if(getuid() == 0 || geteuid() == 0) fatal(0, "do not run as root");
-  /* identify the backend used to play */
-  for(n = 0; backends[n]; ++n)
-    if(backends[n]->backend == config->api)
-      break;
-  if(!backends[n])
-    fatal(0, "unsupported api %d", config->api);
-  backend = backends[n];
+  if(getuid() == 0 || geteuid() == 0)
+    fatal(0, "do not run as root");
+  /* Make sure we can't have more than NFDS files open (it would bust our
+   * poll() array) */
+  if(getrlimit(RLIMIT_NOFILE, rl) < 0)
+    fatal(errno, "getrlimit RLIMIT_NOFILE");
+  if(rl->rlim_cur > NFDS) {
+    rl->rlim_cur = NFDS;
+    if(setrlimit(RLIMIT_NOFILE, rl) < 0)
+      fatal(errno, "setrlimit to reduce RLIMIT_NOFILE to %lu",
+            (unsigned long)rl->rlim_cur);
+    info("set RLIM_NOFILE to %lu", (unsigned long)rl->rlim_cur);
+  } else
+    info("RLIM_NOFILE is %lu", (unsigned long)rl->rlim_cur);
+  /* gcrypt initialization */
+  if(!gcry_check_version(NULL))
+    disorder_fatal(0, "gcry_check_version failed");
+  gcry_control(GCRYCTL_INIT_SECMEM, 0);
+  gcry_control (GCRYCTL_INITIALIZATION_FINISHED, 0);
+  /* create a pipe between the backend callback and the poll() loop */
+  xpipe(sigpipe);
+  nonblock(sigpipe[0]);
+  /* set up audio backend */
+  uaudio_set_format(config->sample_format.rate,
+                    config->sample_format.channels,
+                    config->sample_format.bits,
+                    config->sample_format.bits != 8);
+  early_finish = uaudio_sample_size * uaudio_channels * uaudio_rate;
+  /* TODO other parameters! */
+  backend = uaudio_find(config->api);
   /* backend-specific initialization */
-  backend->init();
+  if(backend->configure)
+    backend->configure();
+  backend->start(speaker_callback, NULL);
   /* create the socket directory */
   byte_xasprintf(&dir, "%s/speaker", config->home);
   unlink(dir);                          /* might be a leftover socket */
diff --git a/server/speaker.h b/server/speaker.h
deleted file mode 100644 (file)
index 0cc0cb8..0000000
+++ /dev/null
@@ -1,250 +0,0 @@
-/*
- * This file is part of DisOrder
- * Copyright (C) 2005-2008 Richard Kettlewell
- *
- * 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 3 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, see <http://www.gnu.org/licenses/>.
- */
-/** @file server/speaker.h
- * @brief Speaker process
- */
-#ifndef SPEAKER_H
-#define SPEAKER_H
-
-#ifdef WORDS_BIGENDIAN
-# define MACHINE_AO_FMT AO_FMT_BIG
-#else
-# define MACHINE_AO_FMT AO_FMT_LITTLE
-#endif
-
-/** @brief Minimum number of frames to try to play at once
- *
- * The main loop will only attempt to play any audio when this many
- * frames are available (or the current track has reached the end).
- * The actual number of frames it attempts to play will often be
- * larger than this (up to three times).
- *
- * For ALSA we request a buffer of three times this size and set the low
- * watermark to this amount.  The goal is then to keep between 1 and 3 times
- * this many frames in play.
- *
- * For other we attempt to play up to three times this many frames per
- * shot.  In practice we will often only send much less than this.
- */
-#define FRAMES 4096
-
-/** @brief Bytes to send per network packet
- *
- * This is the maximum number of bytes we pass to write(2); to determine actual
- * packet sizes, add a UDP header and an IP header (and a link layer header if
- * it's the link layer size you care about).
- *
- * Don't make this too big or arithmetic will start to overflow.
- */
-#define NETWORK_BYTES (1500-8/*UDP*/-40/*IP*/-8/*conservatism*/)
-
-/** @brief Maximum number of FDs to poll for */
-#define NFDS 256
-
-/** @brief Track structure
- *
- * Known tracks are kept in a linked list.  Usually there will be at most two
- * of these but rearranging the queue can cause there to be more.
- */
-struct track {
-  /** @brief Next track */
-  struct track *next;
-
-  /** @brief Input file descriptor */
-  int fd;                               /* input FD */
-
-  /** @brief Track ID */
-  char id[24];
-
-  /** @brief Start position of data in buffer */
-  size_t start;
-
-  /** @brief Number of bytes of data in buffer */
-  size_t used;
-
-  /** @brief Set @c fd is at EOF */
-  int eof;
-
-  /** @brief Total number of frames played */
-  unsigned long long played;
-
-  /** @brief Slot in @ref fds */
-  int slot;
-
-  /** @brief Set when playable
-   *
-   * A track becomes playable whenever it fills its buffer or reaches EOF; it
-   * stops being playable when it entirely empties its buffer.  Tracks start
-   * out life not playable.
-   */
-  int playable;
-  
-  /** @brief Input buffer
-   *
-   * 1Mbyte is enough for nearly 6s of 44100Hz 16-bit stereo
-   */
-  char buffer[1048576];
-};
-
-/** @brief Structure of a backend */
-struct speaker_backend {
-  /** @brief Which backend this is
-   *
-   * @c -1 terminates the list.
-   */
-  int backend;
-
-  /** @brief Flags
-   *
-   * This field is currently not used and must be 0.
-   */
-  unsigned flags;
-  
-  /** @brief Initialization
-   *
-   * Called once at startup.  This is responsible for one-time setup
-   * operations, for instance opening a network socket to transmit to.
-   *
-   * When writing to a native sound API this might @b not imply opening the
-   * native sound device - that might be done by @c activate below.
-   */
-  void (*init)(void);
-
-  /** @brief Activation
-   * @return 0 on success, non-0 on error
-   *
-   * Called to activate the output device.
-   *
-   * On input @ref device_state may be anything.  If it is @ref
-   * device_open then the device is already open but might be using
-   * the wrong sample format.  The device should be reconfigured to
-   * use the right sample format.
-   *
-   * If it is @ref device_error then a retry is underway and an
-   * attempt to recover or re-open the device (with the right sample
-   * format) should be made.
-   *
-   * If it is @ref device_closed then the device should be opened with
-   * the right sample format.
-   *
-   * Some devices are effectively always open and have no error state, in which
-   * case this callback can be NULL.  Note that @ref device_state still
-   * switches between @ref device_open and @ref device_closed in this case.
-   */
-  void (*activate)(void);
-
-  /** @brief Play sound
-   * @param frames Number of frames to play
-   * @return Number of frames actually played
-   *
-   * If an error occurs (and it is not immediately recovered) this
-   * should set @ref device_state to @ref device_error.
-   */
-  size_t (*play)(size_t frames);
-  
-  /** @brief Deactivation
-   *
-   * Called to deactivate the sound device.  This is the inverse of @c
-   * activate above.
-   *
-   * For sound devices that are open all the time and have no error
-   * state, this callback can be NULL.  Note that @ref device_state
-   * still switches between @ref device_open and @ref device_closed in
-   * this case.
-   */
-  void (*deactivate)(void);
-
-  /** @brief Called before poll()
-   * @param timeoutp Pointer to timeout
-   *
-   * Called before the call to poll().
-   *
-   * If desirable, should call addfd() to update the FD array and stash the
-   * slot number somewhere safe.  This will only be called if @ref device_state
-   * is @ref device_open.
-   *
-   * @p timeoutp points to the poll timeout value in milliseconds.  It may be
-   * reduced, but never increased.
-   *
-   * NB you can NOT assume that @c beforepoll is always called before @c play.
-   */
-  void (*beforepoll)(int *timeoutp);
-
-  /** @brief Called after poll()
-   * @return 1 if output device ready for play, 0 otherwise
-   *
-   * Called after the call to poll().  This will only be called if
-   * @ref device_state = @ref device_open.
-   *
-   * The return value should be 1 if the device was ready to play, or
-   * 0 if it was not.
-   */
-  int (*ready)(void);
-};
-
-/** @brief Possible device states */
-enum device_states {
-  /** @brief The device is closed */
-  device_closed,
-
-  /** @brief The device is open and ready to receive sound
-   *
-   * The current device sample format is potentially part of this state.
-   */
-  device_open,
-  
-  /** @brief An error has occurred on the device
-   *
-   * This state is used to ensure that a small interval is left
-   * between retrying the device.  If errors just set @ref
-   * device_closed then the main loop would busy-wait on broken output
-   * devices.
-   *
-   * The current device sample format is potentially part of this state.
-   */
-  device_error
-};
-
-extern enum device_states device_state;
-extern struct track *tracks;
-extern struct track *playing;
-
-extern const struct speaker_backend network_backend;
-extern const struct speaker_backend alsa_backend;
-extern const struct speaker_backend command_backend;
-extern const struct speaker_backend coreaudio_backend;
-extern const struct speaker_backend oss_backend;
-
-extern struct pollfd fds[NFDS];
-extern int fdno;
-extern size_t bpf;
-extern int idled;
-
-int addfd(int fd, int events);
-void abandon(void);
-
-#endif /* SPEAKER_H */
-
-/*
-Local Variables:
-c-basic-offset:2
-comment-column:40
-fill-column:79
-indent-tabs-mode:nil
-End:
-*/
index a99474e..bd74b14 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * This file is part of DisOrder.
- * Copyright (C) 2004, 2005, 2007, 2008 Richard Kettlewell
+ * Copyright (C) 2004, 2005, 2007-2009 Richard Kettlewell
  *
  * 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
  */
 #include "disorder-server.h"
 
+/** @brief Current AF_UNIX socket path */
 static const char *current_unix;
+
+/** @brief Current AF_UNIX socket */
 static int current_unix_fd;
 
-static struct addrinfo *current_listen_addrinfo;
-static int current_listen_fd;
+/** @brief TCP listener definition */
+struct listener {
+  /** @brief Next listener */
+  struct listener *next;
+
+  /** @brief Local socket address */
+  struct sockaddr *sa;
+
+  /** @brief File descriptor */
+  int fd;
+};
 
+/** @brief Current listeners */
+static struct listener *listeners;
+
+/** @brief Current audio API */
+const struct uaudio *api;
+
+/** @brief Quit DisOrder */
 void quit(ev_source *ev) {
   info("shutting down...");
   quitting(ev);
@@ -35,18 +54,19 @@ void quit(ev_source *ev) {
   exit(0);
 }
 
-static void reset_socket(ev_source *ev) {
+/** @brief Create a copy of an @c addrinfo structure */
+static struct sockaddr *copy_sockaddr(const struct addrinfo *addr) {
+  struct sockaddr *sa = xmalloc_noptr(addr->ai_addrlen);
+  memcpy(sa, addr->ai_addr, addr->ai_addrlen);
+  return sa;
+}
+
+/** @brief Create and destroy sockets to set current configuration */
+void reset_sockets(ev_source *ev) {
   const char *new_unix;
-  struct addrinfo *res;
+  struct addrinfo *res, *r;
+  struct listener *l, **ll;
   struct sockaddr_un sun;
-  char *name;
-  
-  static const struct addrinfo pref = {
-    .ai_flags = AI_PASSIVE,
-    .ai_family = PF_INET,
-    .ai_socktype = SOCK_STREAM,
-    .ai_protocol = IPPROTO_TCP,
-  };
 
   /* unix first */
   new_unix = config_get_file("socket");
@@ -77,29 +97,45 @@ static void reset_socket(ev_source *ev) {
   }
 
   /* get the new listen config */
-  if(config->listen.n)
-    res = get_address(&config->listen, &pref, &name);
+  if(config->listen.af != -1)
+    res = netaddress_resolve(&config->listen, 1, IPPROTO_TCP);
   else
     res = 0;
 
-  if((res && !current_listen_addrinfo)
-     || (current_listen_addrinfo
-        && (!res
-            || addrinfocmp(res, current_listen_addrinfo)))) {
-    /* something has to change */
-    if(current_listen_addrinfo) {
-      /* delete the old listener */
-      server_stop(ev, current_listen_fd);
-      freeaddrinfo(current_listen_addrinfo);
-      current_listen_addrinfo = 0;
+  /* Close any current listeners that aren't required any more */
+  ll = &listeners;
+  while((l = *ll)) {
+    for(r = res; r; r = r->ai_next)
+      if(!sockaddrcmp(r->ai_addr, l->sa))
+       break;
+    if(!r) {
+      /* Didn't find a match, remove this one */
+      server_stop(ev, l->fd);
+      *ll = l->next;
+    } else {
+      /* This address is still wanted */
+      ll = &l->next;
     }
-    if(res) {
-      /* start the new listener */
-      if((current_listen_fd = server_start(ev, res->ai_family, res->ai_addrlen,
-                                          res->ai_addr, name)) >= 0) {
-       current_listen_addrinfo = res;
-       res = 0;
+  }
+
+  /* Open any new listeners that are required */
+  for(r = res; r; r = r->ai_next) {
+    for(l = listeners; l; l = l->next)
+      if(!sockaddrcmp(r->ai_addr, l->sa))
+       break;
+    if(!l) {
+      /* Didn't find a match, need a new listener */
+      int fd = server_start(ev, r->ai_family, r->ai_addrlen, r->ai_addr,
+                           format_sockaddr(r->ai_addr));
+      if(fd >= 0) {
+       l = xmalloc(sizeof *l);
+       l->next = listeners;
+       l->sa = copy_sockaddr(r);
+       l->fd = fd;
+       listeners = l;
       }
+      /* We ignore any failures (though server_start() will have
+       * logged them). */
     }
   }
   /* if res is still set it needs freeing */
@@ -107,33 +143,46 @@ static void reset_socket(ev_source *ev) {
     freeaddrinfo(res);
 }
 
-int reconfigure(ev_source *ev, int reload) {
+/** @brief Reconfigure the server
+ * @param flags Flags
+ * @return As config_read(); 0 on success, -1 if could not (re-)read config
+ */
+int reconfigure(ev_source *ev, unsigned flags) {
   int need_another_rescan = 0;
   int ret = 0;
 
-  D(("reconfigure(%d)", reload));
-  if(reload) {
+  D(("reconfigure(%x)", flags));
+  /* Deconfigure the old audio API if there is one */
+  if(api) {
+    if(api->close_mixer)
+      api->close_mixer();
+    api = NULL;
+  }
+  if(flags & RECONFIGURE_RELOADING) {
+    /* If there's a rescan in progress, cancel it but remember to start a fresh
+     * one after the reload. */
     need_another_rescan = trackdb_rescan_cancel();
-    trackdb_close();
-    if(config_read(1))
+    /* (Re-)read the configuration */
+    if(config_read(1/*server*/, config))
       ret = -1;
     else {
       /* Tell the speaker it needs to reload its config too. */
       speaker_reload();
       info("%s: installed new configuration", configfile);
     }
-    trackdb_open(TRACKDB_NO_UPGRADE);
-  } else
-    /* We only allow for upgrade at startup */
-    trackdb_open(TRACKDB_CAN_UPGRADE);
+  }
+  /* New audio API */
+  api = uaudio_find(config->api);
+  if(api->configure)
+    api->configure();
+  if(api->open_mixer)
+    api->open_mixer();
+  /* If we interrupted a rescan of all the tracks, start a new one */
   if(need_another_rescan)
     trackdb_rescan(ev, 1/*check*/, 0, 0);
-  /* Arrange timeouts for schedule actions */
-  schedule_init(ev);
-  if(!ret) {
-    queue_read();
-    recent_read();
-    reset_socket(ev);
+  if(!ret && !(flags & RECONFIGURE_FIRST)) {
+    /* Open/close sockets */
+    reset_sockets(ev);
   }
   return ret;
 }
@@ -142,5 +191,7 @@ int reconfigure(ev_source *ev, int reload) {
 Local Variables:
 c-basic-offset:2
 comment-column:40
+fill-column:79
+indent-tabs-mode:nil
 End:
 */
index 81c92f4..ad35cb8 100644 (file)
@@ -74,7 +74,7 @@ int main(int argc, char **argv) {
     openlog(progname, LOG_PID, LOG_DAEMON);
     log_default = &log_syslog;
   }
-  if(config_read(0))
+  if(config_read(0, NULL))
     fatal(0, "cannot read configuration");
   trackdb_init(TRACKDB_NO_RECOVER);
   trackdb_open(TRACKDB_NO_UPGRADE);
index ec84f68..b661e0c 100644 (file)
@@ -57,7 +57,7 @@ int main(int argc, char **argv) {
   }
   if(argc - optind < 3) fatal(0, "not enough arguments");
   if(argc - optind > 3) fatal(0, "too many arguments");
-  if(config_read(0)) fatal(0, "cannot read configuration");
+  if(config_read(0, NULL)) fatal(0, "cannot read configuration");
   s = trackname_part(argv[optind], argv[optind+1], argv[optind+2]);
   if(!s) fatal(0, "trackname_part returned NULL");
   xprintf("%s\n", nullcheck(utf82mb(s)));
index df6c5a9..f91d194 100644 (file)
@@ -1,6 +1,6 @@
 #
 # This file is part of DisOrder.
-# Copyright (C) 2004, 2007, 2008 Richard Kettlewell
+# Copyright (C) 2004, 2007-2009 Richard Kettlewell
 #
 # 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
 #
 
 pkgdata_DATA=slap.ogg scratch.ogg
-noinst_DATA=long.ogg
 
 EXTRA_DIST=${pkgdata_DATA}
 
+check: long.ogg
+
 %.raw: %.ogg
        oggdec -b16 -R -o $@ $<
 
index b769eaf..1f93947 100644 (file)
@@ -1,6 +1,6 @@
 #
 # This file is part of DisOrder.
-# Copyright (C) 2004-2008 Richard Kettlewell
+# Copyright (C) 2004-2009 Richard Kettlewell
 #
 # 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
@@ -17,7 +17,7 @@
 #
 
 pkgdata_DATA=about.tmpl choose.tmpl playing.tmpl recent.tmpl           \
-            about.tmpl prefs.tmpl help.tmpl error.tmpl                 \
+            prefs.tmpl help.tmpl error.tmpl                    \
             new.tmpl login.tmpl macros.tmpl                            \
             options options.labels                                     \
             options.columns
index 1d63f61..76d954d 100644 (file)
@@ -1,7 +1,7 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
 <!--
 This file is part of DisOrder.
-Copyright (C) 2004-2008 Richard Kettlewell
+Copyright (C) 2004-2009 Richard Kettlewell
 
 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
@@ -61,7 +61,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
   <div class=section>
 
-   <p>Copyright &copy; 2003-2008 <a
+   <p>Copyright &copy; 2003-2009 <a
    href="http://www.greenend.org.uk/rjk/">Richard Kettlewell</a><br>
 
    Portions copyright &copy; 2007 <a
index 320e688..c83fd35 100644 (file)
@@ -1,5 +1,5 @@
 This file is part of DisOrder.
-Copyright (C) 2008 Richard Kettlewell
+Copyright (C) 2008, 2009 Richard Kettlewell
 
 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
@@ -117,7 +117,7 @@ and then redefine macros as desired.
   <a href="http://www.greenend.org.uk/rjk/disorder/"
      title="DisOrder web site">DisOrder
      version @version</a>
-  &copy; 2003-2008 Richard Kettlewell et al
+  &copy; 2003-2009 Richard Kettlewell et al
 </p>}
 
 @# Expand to the time that @id will be played
index be3d73b..5563f7f 100644 (file)
@@ -1,6 +1,6 @@
 #
 # This file is part of DisOrder.
-# Copyright (C) 2004, 2005, 2007, 2008 Richard Kettlewell
+# Copyright (C) 2004, 2005, 2007-2009 Richard Kettlewell
 #
 # 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
@@ -26,12 +26,12 @@ disorder_udplog_DEPENDENCIES=../lib/libdisorder.a
 
 TESTS=cookie.py dbversion.py dump.py files.py play.py queue.py \
        recode.py search.py user-upgrade.py user.py aliases.py  \
-       schedule.py playlists.py
+       schedule.py hashes.py playlists.py
 
 TESTS_ENVIRONMENT=${PYTHON} -u
 
 clean-local:
        rm -rf testroot *.log *.pyc
 
-EXTRA_DIST=dtest.py ${TESTS}
+EXTRA_DIST=dtest.py ${TESTS} fail.py
 CLEANFILES=*.gcda *.gcov *.gcno *.c.html index.html
index 1c62dc5..8a4644a 100644 (file)
@@ -1,7 +1,7 @@
 #-*-python-*-
 #
 # This file is part of DisOrder.
-# Copyright (C) 2007, 2008 Richard Kettlewell
+# Copyright (C) 2007-2009 Richard Kettlewell
 #
 # 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
@@ -19,7 +19,7 @@
 
 """Utility module used by tests"""
 
-import os,os.path,subprocess,sys,re,time,unicodedata,random,socket
+import os,os.path,subprocess,sys,re,time,unicodedata,random,socket,traceback
 
 def fatal(s):
     """Write an error message and exit"""
@@ -190,7 +190,7 @@ tracklength *.mp3 disorder-tracklength
 tracklength *.ogg disorder-tracklength
 tracklength *.wav disorder-tracklength
 tracklength *.flac disorder-tracklength
-api network
+api rtp
 broadcast 127.0.0.1 %d
 broadcast_from 127.0.0.1 %d
 mail_sender no.such.user.sorry@greenend.org.uk
@@ -202,10 +202,10 @@ def common_setup():
     os.mkdir(testroot)
     # Choose a port
     global port
-    port = random.randint(49152, 65535)
+    port = random.randint(49152, 65530)
     while not bindable(port + 1):
         print "port %d is not bindable, trying another" % (port + 1)
-        port = random.randint(49152, 65535)
+        port = random.randint(49152, 65530)
     # Log anything sent to that port
     packetlog = "%s/packetlog" % testroot
     subprocess.Popen(["disorder-udplog",
@@ -230,10 +230,8 @@ Start the daemon."""
     print " starting daemon"
     # remove the socket if it exists
     socket = "%s/home/socket" % testroot
-    try:
+    if os.path.exists(socket):
         os.remove(socket)
-    except:
-        pass
     daemon = subprocess.Popen(["disorderd",
                                "--foreground",
                                "--config", "%s/config" % testroot],
@@ -254,6 +252,10 @@ Start the daemon."""
         time.sleep(1)
     if waited > 0:
         print "  took about %ds for socket to appear" % waited
+    # Wait for root user to be created
+    command(["disorder",
+             "--config", disorder._configfile, "--no-per-user-config",
+             "--wait-for-root"])
 
 def create_user(username="fred", password="fredpass"):
     """create_user(USERNAME, PASSWORD)
@@ -285,10 +287,10 @@ Stop the daemon if it has not stopped already"""
     rc = daemon.poll()
     if rc == None:
         print " stopping daemon"
-        disorder.client().shutdown()
+        os.kill(daemon.pid, 15)
         print "  waiting for daemon"
         rc = daemon.wait()
-        print "  daemon has stopped"
+        print "  daemon has stopped (rc=%d)" % rc
     else:
         print "  daemon already stopped"
     daemon = None
@@ -300,7 +302,7 @@ def run(module=None, report=True):
 
     Run the test in MODULE.  This can be a string (in which case the module
     will be imported) or a module object."""
-    global tests
+    global tests, failures
     tests += 1
     # Locate the test module
     if module is None:
@@ -331,8 +333,10 @@ def run(module=None, report=True):
     stdtracks()
     try:
         module.test()
-    finally:
-        stop_daemon()
+    except:
+        traceback.print_exc(None, sys.stderr)
+        failures += 1
+    stop_daemon()
     if report:
         if failures:
             print " FAILED"
diff --git a/tests/fail.py b/tests/fail.py
new file mode 100755 (executable)
index 0000000..9d7f081
--- /dev/null
@@ -0,0 +1,28 @@
+#! /usr/bin/env python
+#
+# This file is part of DisOrder.
+# Copyright (C) 2009 Richard Kettlewell
+#
+# 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 3 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, see <http://www.gnu.org/licenses/>.
+#
+import dtest
+
+def test():
+    """Create a daemon and fail"""
+    dtest.start_daemon()
+    dtest.create_user()
+    assert True == False, "forcing failure"
+
+if __name__ == '__main__':
+    dtest.run()
diff --git a/tests/hashes.py b/tests/hashes.py
new file mode 100755 (executable)
index 0000000..813951b
--- /dev/null
@@ -0,0 +1,50 @@
+#! /usr/bin/env python
+#
+# This file is part of DisOrder.
+# Copyright (C) 2009 Richard Kettlewell
+#
+# 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 3 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, see <http://www.gnu.org/licenses/>.
+#
+import dtest,disorder,re
+
+def set_auth_algo(h):
+    configpath = "%s/config" % dtest.testroot
+    config = open(configpath, "r").readlines()
+    config = filter(lambda l: not re.match('authorization_algorithm', l),
+                    config)
+    config.append('authorization_algorithm %s\n' % h)
+    open(configpath, "w").write("".join(config))
+
+def test():
+    """Authentication hash tests"""
+    created = False
+    for h in ['sha1', 'SHA1', 'sha256', 'SHA256',
+              'sha384', 'SHA384', 'sha512', "SHA512" ]:
+        print " setting authorization hash to %s" % h
+        set_auth_algo(h)
+        dtest.start_daemon()
+        if not created:
+            dtest.create_user()
+            created = True
+        print " exercising C implementation"
+        dtest.command(["disorder",
+                       "--config", disorder._configfile, "--no-per-user-config",
+                       "--user", "root", "version"])
+        print " exercising Python implementation"
+        c = disorder.client()
+        c.version()
+        dtest.stop_daemon()
+
+if __name__ == '__main__':
+    dtest.run()
index b0ae1fa..25db56d 100755 (executable)
@@ -1,7 +1,7 @@
 #! /usr/bin/env python
 #
 # This file is part of DisOrder.
-# Copyright (C) 2008 Richard Kettlewell
+# Copyright (C) 2008, 2009 Richard Kettlewell
 #
 # 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
@@ -66,6 +66,7 @@ def test():
                                      "schedule-list"]), ""),
     p = next_playing(c)
     assert p["track"] == track, "checking right track played"
+    print " when=%d expected at least %d" % (int(p["when"]), when)
     assert int(p["when"]) >= when, "checking track played at right time"
     assert c.schedule_list() == [], "checking schedule is empty"
     wait_idle(c)